Greasy Fork is available in English.
芯位蜜线/教育 自动播放,自动刷作业
// ==UserScript== // @name 芯位助手-Beeline Helper // @namespace https://github.com/poi-yee/51xinweiauto // @version 0.8.2 // @author PoiYee,Code-dogcreatior // @description 芯位蜜线/教育 自动播放,自动刷作业 // @icon data:image/png;base64,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 // @match *://*.beeline-ai.com/* // @require https://cdn.jsdelivr.net/npm/[email protected]/dist/system.min.js // @require https://cdn.jsdelivr.net/npm/[email protected]/dist/extras/named-register.min.js // @require data:application/javascript,%3B(typeof%20System!%3D'undefined')%26%26(System%3Dnew%20System.constructor())%3B // @grant GM_addStyle // @grant GM_deleteValue // @grant GM_getValue // @grant GM_setValue // ==/UserScript== (e=>{if(typeof GM_addStyle=="function"){GM_addStyle(e);return}const a=document.createElement("style");a.textContent=e,document.head.append(a)})(' .floating-window[data-v-1f178cdb]{position:fixed;bottom:20px;right:20px;width:320px;height:360px;background:#fff;border-radius:12px;box-shadow:0 4px 16px #00000026;overflow:hidden;display:flex;flex-direction:column;z-index:1000;transition:opacity .3s ease,transform .3s ease,width .3s ease,height .3s ease}.floating-window.auto-answer-mode[data-v-1f178cdb]{height:800px;width:400px}.floating-window.window-hidden[data-v-1f178cdb]{opacity:0;transform:scale(.8);pointer-events:none}.window-header[data-v-1f178cdb]{display:flex;justify-content:space-between;align-items:center;padding:16px;background:linear-gradient(135deg,#667eea,#764ba2);color:#fff;border-radius:12px 12px 0 0;cursor:move;user-select:none}.back-btn[data-v-1f178cdb]{background:none;border:none;color:#fff;font-size:18px;cursor:pointer;width:24px;height:24px;display:flex;align-items:center;justify-content:center;border-radius:50%;transition:background-color .2s}.back-btn[data-v-1f178cdb]:hover{background:#fff3}.window-header h3[data-v-1f178cdb]{margin:0;font-size:16px;font-weight:600}.close-btn[data-v-1f178cdb]{background:none;border:none;color:#fff;font-size:20px;cursor:pointer;width:24px;height:24px;display:flex;align-items:center;justify-content:center;border-radius:50%;transition:background-color .2s}.close-btn[data-v-1f178cdb]:hover{background:#fff3}.window-content[data-v-1f178cdb]{flex:1;padding:20px;overflow:hidden;display:flex;flex-direction:column}.status-window[data-v-99aa1d36]{position:fixed;left:20px;bottom:80px;width:280px;max-height:270px;background:#fff;border-radius:8px;box-shadow:0 4px 15px #0003;border:1px solid #e0e0e0;z-index:9998;pointer-events:auto;overflow:hidden}.status-header[data-v-99aa1d36]{padding:9px 16px;background:linear-gradient(135deg,#667eea,#764ba2);color:#fff;font-size:14px;font-weight:600}.status-content[data-v-99aa1d36]{padding:12px 16px;max-height:240px;overflow-y:auto}.current-status[data-v-99aa1d36]{margin-bottom:12px;padding-bottom:12px;border-bottom:1px solid #f0f0f0}.status-label[data-v-99aa1d36]{font-size:12px;color:#666;margin-right:8px}.status-value[data-v-99aa1d36]{font-size:12px;font-weight:600}.status-detecting[data-v-99aa1d36]{color:#ff9800}.status-waiting[data-v-99aa1d36]{color:#2196f3}.status-success[data-v-99aa1d36]{color:#4caf50}.status-no-button[data-v-99aa1d36]{color:#f44336}.status-stopped[data-v-99aa1d36]{color:#9e9e9e}.operation-history[data-v-99aa1d36]{margin-top:8px}.history-title[data-v-99aa1d36]{font-size:12px;color:#666;margin-bottom:8px;font-weight:600}.history-list[data-v-99aa1d36]{max-height:150px;overflow-y:auto}.history-item[data-v-99aa1d36]{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:6px;padding:4px 0;font-size:11px;line-height:1.3}.history-time[data-v-99aa1d36]{color:#999;min-width:45px;margin-right:8px}.history-message[data-v-99aa1d36]{color:#333;flex:1}.no-history[data-v-99aa1d36]{font-size:11px;color:#999;text-align:center;padding:8px 0}.control-button[data-v-29767e33]{position:fixed;left:20px;bottom:20px;width:50px;height:50px;background:linear-gradient(135deg,#667eea,#764ba2);border-radius:50%;display:flex;align-items:center;justify-content:center;cursor:pointer;box-shadow:0 4px 15px #667eea66;transition:all .3s ease;z-index:9999;pointer-events:auto}.control-button[data-v-29767e33]:hover{transform:scale(1.1);box-shadow:0 6px 20px #667eea99}.control-button.button-hidden[data-v-29767e33]{opacity:.7;transform:scale(.9)}.button-icon[data-v-29767e33]{font-size:20px;color:#fff}.features[data-v-fb2a58e0]{display:flex;flex-direction:column;gap:8px;margin-top:16px}.feature-btn[data-v-fb2a58e0]{padding:10px 16px;background:#f5f5f5;border:1px solid #ddd;border-radius:6px;cursor:pointer;transition:all .2s;font-size:14px}.feature-btn[data-v-fb2a58e0]:hover{background:#e9e9e9;border-color:#ccc}.toggle-features[data-v-3bb0b416]{display:flex;flex-direction:column;gap:16px;margin-top:16px}.toggle-item[data-v-3bb0b416]{display:flex;justify-content:space-between;align-items:center;padding:12px 0;border-bottom:1px solid #f0f0f0}.toggle-label[data-v-3bb0b416]{font-size:14px;color:#333;font-weight:500}.toggle-label.FxxK-xin-wei[data-v-3bb0b416]{color:red;font-weight:700}.feature-description[data-v-3bb0b416]{font-size:12px;color:#666;margin-top:4px;font-weight:400}.toggle-switch[data-v-3bb0b416]{position:relative;display:inline-block;width:44px;height:24px}.toggle-switch input[data-v-3bb0b416]{opacity:0;width:0;height:0}.toggle-slider[data-v-3bb0b416]{position:absolute;cursor:pointer;inset:0;background-color:#ccc;transition:.4s;border-radius:24px}.toggle-slider[data-v-3bb0b416]:before{position:absolute;content:"";height:18px;width:18px;left:3px;bottom:3px;background-color:#fff;transition:.4s;border-radius:50%}.toggle-switch input:checked+.toggle-slider[data-v-3bb0b416]{background-color:#667eea}.toggle-switch input:disabled+.toggle-slider[data-v-3bb0b416]{background-color:#ccc;cursor:not-allowed}.toggle-switch input:disabled+.toggle-slider[data-v-3bb0b416]:before{background-color:#f5f5f5}.toggle-switch input:checked+.toggle-slider[data-v-3bb0b416]:before{transform:translate(20px)}.answer-settings-page[data-v-f212f24f]{height:100%;display:flex;flex-direction:column;overflow-y:auto;padding-right:4px}.answer-settings-page[data-v-f212f24f]::-webkit-scrollbar{width:6px}.answer-settings-page[data-v-f212f24f]::-webkit-scrollbar-track{background:#f1f1f1;border-radius:3px}.answer-settings-page[data-v-f212f24f]::-webkit-scrollbar-thumb{background:#c1c1c1;border-radius:3px}.answer-settings-page[data-v-f212f24f]::-webkit-scrollbar-thumb:hover{background:#a8a8a8}.settings-section[data-v-f212f24f]{flex:1;display:flex;flex-direction:column;gap:20px}.settings-section h3[data-v-f212f24f]{margin-bottom:12px;font-size:16px;color:#333;font-weight:600}.token-section[data-v-f212f24f]{background:#f9fafc;border:1px solid #e3e7eb;padding:16px;border-radius:12px;transition:box-shadow .2s}.token-section[data-v-f212f24f]:hover{box-shadow:0 2px 8px #0000000f}.token-link[data-v-f212f24f]{display:inline-block;margin-bottom:12px;color:#007bff;text-decoration:none;font-weight:500;font-size:14px}.token-link[data-v-f212f24f]:hover{text-decoration:underline}.token-input-box[data-v-f212f24f]{display:flex;flex-direction:column;gap:6px;margin-bottom:12px}.token-input-box[data-v-f212f24f]:last-child{margin-bottom:0}.token-input-box label[data-v-f212f24f]{font-size:13px;color:#495057;font-weight:500}.token-input[data-v-f212f24f]{padding:10px;border:1px solid #ccc;border-radius:8px;font-size:14px;outline:none;transition:border-color .2s,box-shadow .2s}.token-input[data-v-f212f24f]:focus{border-color:#007bff;box-shadow:0 0 0 2px #007bff26}.ai-settings-section[data-v-f212f24f]{background:#f0f8ff;border:1px solid #b8daff;padding:16px;border-radius:12px;margin-top:16px}.ai-settings-section h4[data-v-f212f24f]{margin-bottom:12px;font-size:14px;color:#004085;font-weight:600}.toggle-item[data-v-f212f24f]{margin-bottom:8px}.toggle-label[data-v-f212f24f]{display:flex;align-items:center;gap:8px;cursor:pointer;font-size:14px;color:#495057}.toggle-label input[type=checkbox][data-v-f212f24f]{display:none}.toggle-slider[data-v-f212f24f]{position:relative;width:40px;height:20px;background:#ced4da;border-radius:20px;transition:all .3s}.toggle-slider[data-v-f212f24f]:before{content:"";position:absolute;width:16px;height:16px;background:#fff;border-radius:50%;top:2px;left:2px;transition:all .3s}.toggle-label input[type=checkbox]:checked+.toggle-slider[data-v-f212f24f]{background:#007bff}.toggle-label input[type=checkbox]:checked+.toggle-slider[data-v-f212f24f]:before{transform:translate(20px)}.advanced-section[data-v-f212f24f]{background:#fff3cd;border:1px solid #ffeaa7;padding:16px;border-radius:12px;margin-top:16px}.advanced-section h4[data-v-f212f24f]{margin-bottom:8px;font-size:14px;color:#856404;font-weight:600}.warning-text[data-v-f212f24f]{font-size:12px;color:#856404;margin-bottom:12px;font-style:italic}.textarea-input[data-v-f212f24f]{resize:vertical;min-height:60px}.settings-info[data-v-f212f24f]{background:#e8f4fd;border:1px solid #b8daff;padding:16px;border-radius:8px}.info-text[data-v-f212f24f]{font-size:14px;color:#004085;margin-bottom:8px}.info-list[data-v-f212f24f]{margin:0;padding-left:20px;font-size:13px;color:#004085;line-height:1.5}.info-list li[data-v-f212f24f]{margin-bottom:4px}.status-section[data-v-f212f24f]{text-align:center}.status-message[data-v-f212f24f]{padding:8px 16px;border-radius:4px;font-size:14px}.status-message.success[data-v-f212f24f]{background:#d4edda;color:#155724;border:1px solid #c3e6cb}.status-message.error[data-v-f212f24f]{background:#f8d7da;color:#721c24;border:1px solid #f5c6cb}.auto-answer-page[data-v-c8c99884]{height:100%;display:flex;flex-direction:column;overflow:auto;position:relative}.overlay-blocker[data-v-c8c99884]{position:absolute;inset:0;background:#282828d9;backdrop-filter:blur(2px);-webkit-backdrop-filter:blur(8px);border-radius:8px;display:flex;align-items:center;justify-content:center;z-index:9999;overflow:hidden}.overlay-blocker[data-v-c8c99884]:before{content:"";position:absolute;inset:0;background:radial-gradient(circle at center,#000c,#0009 50%,#0003 80%,#0000);pointer-events:none}.overlay-content[data-v-c8c99884]{text-align:center;background:linear-gradient(135deg,#fff,#f8f9fa);padding:28px 24px;border-radius:16px;max-width:280px;border:1px solid rgba(255,255,255,.8);backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);animation:fadeInScale-c8c99884 .4s ease-out}@keyframes fadeInScale-c8c99884{0%{opacity:0;transform:scale(.9)}to{opacity:1;transform:scale(1)}}.warning-icon[data-v-c8c99884]{font-size:56px;margin-bottom:20px;filter:drop-shadow(0 2px 4px rgba(0,0,0,.1))}.icon-text[data-v-c8c99884]{display:block}.warning-text[data-v-c8c99884]{font-size:16px;font-weight:600;color:#d93025;line-height:1.4;text-shadow:0 1px 2px rgba(0,0,0,.1)}.navigation-section[data-v-c8c99884]{display:flex;gap:8px;margin-bottom:16px}.nav-btn[data-v-c8c99884]{flex:1;padding:8px 12px;border:1px solid #ced4da;border-radius:6px;background:#fff;color:#495057;font-size:12px;cursor:pointer;transition:all .2s}.nav-btn[data-v-c8c99884]:hover{background:#f8f9fa}.nav-btn.active[data-v-c8c99884]{background:#007bff;color:#fff;border-color:#007bff}.subpage-content[data-v-c8c99884]{flex:1;display:flex;flex-direction:column;overflow:auto}.config-section[data-v-c8c99884],.actions-section[data-v-c8c99884],.progress-section[data-v-c8c99884],.status-section[data-v-c8c99884]{margin-bottom:20px}.results-section[data-v-c8c99884]{flex:1;display:flex;flex-direction:column;overflow:hidden;margin-bottom:20px}.config-section h3[data-v-c8c99884],.actions-section h3[data-v-c8c99884],.progress-section h3[data-v-c8c99884],.results-section h3[data-v-c8c99884]{margin-bottom:12px;font-size:16px;color:#333}.config-item[data-v-c8c99884]{display:flex;flex-direction:column;gap:8px}.config-item label[data-v-c8c99884]{font-size:14px;color:#495057}.toggle-with-actions[data-v-c8c99884]{display:flex;align-items:center;gap:16px}.toggle-label[data-v-c8c99884]{display:flex;align-items:center;gap:8px;cursor:pointer;font-size:14px;color:#495057;white-space:nowrap}.toggle-label input[type=checkbox][data-v-c8c99884]{display:none}.toggle-slider[data-v-c8c99884]{position:relative;width:40px;height:20px;background:#ced4da;border-radius:20px;transition:all .3s}.toggle-slider[data-v-c8c99884]:before{content:"";position:absolute;width:16px;height:16px;background:#fff;border-radius:50%;top:2px;left:2px;transition:all .3s}.toggle-label input[type=checkbox]:checked+.toggle-slider[data-v-c8c99884]{background:#007bff}.toggle-label input[type=checkbox]:checked+.toggle-slider[data-v-c8c99884]:before{transform:translate(20px)}.token-input[data-v-c8c99884]{padding:8px 12px;border:1px solid #ced4da;border-radius:4px;font-size:14px}.token-input[data-v-c8c99884]:focus{outline:none;border-color:#007bff;box-shadow:0 0 0 2px #007bff40}.action-buttons[data-v-c8c99884]{display:flex;flex-direction:row;gap:8px;width:100%}.action-btn[data-v-c8c99884]{padding:8px 12px;border:none;border-radius:6px;font-size:12px;cursor:pointer;transition:all .2s;white-space:nowrap}.action-btn[data-v-c8c99884]:disabled{opacity:.6;cursor:not-allowed}.action-btn.primary[data-v-c8c99884]{background:#007bff;color:#fff}.action-btn.primary[data-v-c8c99884]:hover:not(:disabled){background:#0056b3}.action-btn.secondary[data-v-c8c99884]{background:#6c757d;color:#fff}.action-btn.secondary[data-v-c8c99884]:hover:not(:disabled){background:#545b62}.action-btn.danger[data-v-c8c99884]{background:#dc3545;color:#fff}.action-btn.danger[data-v-c8c99884]:hover:not(:disabled){background:#c82333}.single-result[data-v-c8c99884]{margin-bottom:16px}.batch-results[data-v-c8c99884]{margin-top:16px}.filter-buttons[data-v-c8c99884]{display:flex;gap:8px;margin-bottom:12px}.filter-btn[data-v-c8c99884]{padding:6px 12px;border:1px solid #ced4da;border-radius:4px;background:#fff;color:#495057;font-size:12px;cursor:pointer;transition:all .2s}.filter-btn[data-v-c8c99884]:hover{background:#f8f9fa}.filter-btn.active[data-v-c8c99884]{background:#007bff;color:#fff;border-color:#007bff}.filter-btn.ai-filter.active[data-v-c8c99884]{background:#ffc107;color:#212529;border-color:#ffc107}.results-list[data-v-c8c99884]{flex:1;overflow-y:auto;min-height:0;max-height:300px;padding-right:4px}.results-list[data-v-c8c99884]::-webkit-scrollbar{width:6px}.results-list[data-v-c8c99884]::-webkit-scrollbar-track{background:#f1f1f1;border-radius:3px}.results-list[data-v-c8c99884]::-webkit-scrollbar-thumb{background:#c1c1c1;border-radius:3px}.results-list[data-v-c8c99884]::-webkit-scrollbar-thumb:hover{background:#a8a8a8}.result-item[data-v-c8c99884]{padding:12px;margin-bottom:8px;border-radius:6px;border-left:4px solid #6c757d}.result-item.success[data-v-c8c99884]{background:#d4edda;border-left-color:#28a745}.result-item.error[data-v-c8c99884]{background:#f8d7da;border-left-color:#dc3545}.result-item.ai-assisted[data-v-c8c99884]{background:#fff3cd;border-left-color:#ffc107}.ai-indicator[data-v-c8c99884]{background:#ffc107;color:#212529;padding:2px 6px;border-radius:12px;font-size:10px;margin-left:8px;font-weight:700}.result-header[data-v-c8c99884]{display:flex;justify-content:space-between;align-items:center;margin-bottom:8px}.result-type[data-v-c8c99884]{font-size:14px;font-weight:700;color:#495057}.result-status[data-v-c8c99884]{font-size:12px;padding:2px 8px;border-radius:12px;color:#fff}.result-status.success[data-v-c8c99884]{background:#28a745}.result-status.error[data-v-c8c99884]{background:#dc3545}.result-message[data-v-c8c99884]{font-size:14px;color:#495057;margin-bottom:4px}.result-question[data-v-c8c99884],.result-answer[data-v-c8c99884],.result-options[data-v-c8c99884]{font-size:12px;color:#6c757d;margin-bottom:2px}.progress-section[data-v-c8c99884]{background:#e9ecef;padding:12px;border-radius:6px;border-left:4px solid #007bff}.progress-info[data-v-c8c99884]{display:flex;flex-direction:column;gap:4px}.progress-text[data-v-c8c99884]{font-size:14px;font-weight:700;color:#495057}.progress-status[data-v-c8c99884]{font-size:12px;color:#6c757d}.status-section[data-v-c8c99884]{text-align:center}.status-message[data-v-c8c99884]{padding:8px 16px;border-radius:4px;font-size:14px}.status-message.success[data-v-c8c99884]{background:#d4edda;color:#155724;border:1px solid #c3e6cb}.status-message.error[data-v-c8c99884]{background:#f8d7da;color:#721c24;border:1px solid #f5c6cb}.toggle-features[data-v-cd8b7e2c]{display:flex;flex-direction:column;gap:16px;margin-top:16px}.toggle-item[data-v-cd8b7e2c]{display:flex;justify-content:space-between;align-items:center;padding:12px 0;border-bottom:1px solid #f0f0f0}.toggle-label-container[data-v-cd8b7e2c]{display:flex;align-items:center;gap:8px}.toggle-label[data-v-cd8b7e2c]{font-size:14px;color:#333;font-weight:500}.settings-icon[data-v-cd8b7e2c]{background:none;border:none;cursor:pointer;padding:4px;border-radius:4px;color:#666;transition:all .2s}.settings-icon[data-v-cd8b7e2c]:hover{background:#f0f0f0;color:#333}.toggle-switch[data-v-cd8b7e2c]{position:relative;display:inline-block;width:44px;height:24px}.toggle-switch input[data-v-cd8b7e2c]{opacity:0;width:0;height:0}.toggle-slider[data-v-cd8b7e2c]{position:absolute;cursor:pointer;inset:0;background-color:#ccc;transition:.4s;border-radius:24px}.toggle-slider[data-v-cd8b7e2c]:before{position:absolute;content:"";height:18px;width:18px;left:3px;bottom:3px;background-color:#fff;transition:.4s;border-radius:50%}.toggle-switch input:checked+.toggle-slider[data-v-cd8b7e2c]{background-color:#667eea}.toggle-switch input:disabled+.toggle-slider[data-v-cd8b7e2c]{background-color:#ccc;cursor:not-allowed}.toggle-switch input:disabled+.toggle-slider[data-v-cd8b7e2c]:before{background-color:#f5f5f5}.toggle-switch input:checked+.toggle-slider[data-v-cd8b7e2c]:before{transform:translate(20px)}.rainbow-toggle[data-v-cd8b7e2c]{background:linear-gradient(90deg,red,#f90,#ff0,#3c3,#39f,#93c,#f39,red);background-size:200% 100%;animation:rainbow-scroll-cd8b7e2c 1.5s linear infinite}@keyframes rainbow-scroll-cd8b7e2c{0%{background-position:0% 0%}to{background-position:200% 0%}}.modal-overlay[data-v-cd8b7e2c]{position:fixed;inset:0;background:#00000080;display:flex;align-items:center;justify-content:center;z-index:1000}.modal-content[data-v-cd8b7e2c]{background:#fff;border-radius:12px;width:90%;max-width:500px;max-height:80vh;overflow-y:auto;box-shadow:0 10px 30px #0000004d}.modal-header[data-v-cd8b7e2c]{display:flex;justify-content:space-between;align-items:center;padding:20px 24px;border-bottom:1px solid #f0f0f0}.modal-header h4[data-v-cd8b7e2c]{margin:0;font-size:18px;color:#333}.close-btn[data-v-cd8b7e2c]{background:none;border:none;font-size:24px;cursor:pointer;color:#999;padding:0;width:30px;height:30px;display:flex;align-items:center;justify-content:center;border-radius:4px}.close-btn[data-v-cd8b7e2c]:hover{background:#f5f5f5;color:#333}.modal-body[data-v-cd8b7e2c]{padding:24px}.setting-group[data-v-cd8b7e2c]{margin-bottom:24px}.setting-label[data-v-cd8b7e2c]{display:block;margin-bottom:8px;font-size:14px;color:#333;font-weight:500}.image-input-group[data-v-cd8b7e2c]{display:flex;gap:8px}.url-input[data-v-cd8b7e2c]{flex:1;padding:8px 12px;border:1px solid #ddd;border-radius:6px;font-size:14px}.upload-btn[data-v-cd8b7e2c]{padding:8px 16px;background:#f5f5f5;border:1px solid #ddd;border-radius:6px;cursor:pointer;font-size:14px;transition:all .2s}.upload-btn[data-v-cd8b7e2c]:hover{background:#e9e9e9}.slider-group[data-v-cd8b7e2c]{display:flex;align-items:center;gap:12px}.slider[data-v-cd8b7e2c]{flex:1;height:6px;background:#ddd;border-radius:3px;outline:none;-webkit-appearance:none}.slider[data-v-cd8b7e2c]::-webkit-slider-thumb{-webkit-appearance:none;width:18px;height:18px;background:#667eea;border-radius:50%;cursor:pointer}.slider[data-v-cd8b7e2c]::-moz-range-thumb{width:18px;height:18px;background:#667eea;border-radius:50%;cursor:pointer;border:none}.slider-value[data-v-cd8b7e2c]{min-width:40px;font-size:14px;color:#666;text-align:right}.preview-section[data-v-cd8b7e2c]{margin-top:24px;padding-top:16px;border-top:1px solid #f0f0f0}.preview-section h5[data-v-cd8b7e2c]{margin:0 0 12px;font-size:14px;color:#333}.preview-box[data-v-cd8b7e2c]{width:100%;height:120px;border-radius:8px;border:1px solid #ddd;position:relative;overflow:hidden}.preview-overlay[data-v-cd8b7e2c]{position:absolute;top:0;left:0;width:100%;height:100%;background-color:#00000080;transition:opacity .3s ease}.preview-glass[data-v-cd8b7e2c]{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);background:#fff3;padding:8px 16px;border-radius:6px;color:#333;font-size:14px;font-weight:500;backdrop-filter:blur(12px);z-index:1}.modal-footer[data-v-cd8b7e2c]{padding:20px 24px;border-top:1px solid #f0f0f0;display:flex;gap:12px;justify-content:flex-end}.save-btn[data-v-cd8b7e2c]{padding:8px 20px;background:#667eea;color:#fff;border:none;border-radius:6px;cursor:pointer;font-size:14px;transition:background .2s}.save-btn[data-v-cd8b7e2c]:hover{background:#5a6fd8}.cancel-btn[data-v-cd8b7e2c]{padding:8px 20px;background:#f5f5f5;border:1px solid #ddd;border-radius:6px;cursor:pointer;font-size:14px;transition:all .2s}.cancel-btn[data-v-cd8b7e2c]:hover{background:#e9e9e9}.back-btn-container[data-v-cd8b7e2c]{margin-top:20px;text-align:center}.back-btn[data-v-cd8b7e2c]{padding:8px 16px;background:#f5f5f5;border:1px solid #ddd;border-radius:6px;cursor:pointer;font-size:14px;transition:all .2s}.back-btn[data-v-cd8b7e2c]:hover{background:#e9e9e9;border-color:#ccc}h3[data-v-cd8b7e2c]{margin:0 0 16px;font-size:16px;color:#333;text-align:center}.about-page[data-v-30e112b7]{height:100%;background:linear-gradient(135deg,#f5f7fa,#e4ebf5);display:flex;flex-wrap:wrap;box-sizing:border-box;overflow-y:auto;opacity:1;transform:scale(1);transition:all .3s ease-in-out}.about-page.closing[data-v-30e112b7]{opacity:0;transform:scale(.9)}.left-panel[data-v-30e112b7],.right-panel[data-v-30e112b7]{flex:1;min-width:320px;padding:40px;box-sizing:border-box}.left-panel[data-v-30e112b7]{background:linear-gradient(135deg,#eef2f3,#dfe9f3);display:flex;flex-direction:column;align-items:center;justify-content:center}.title[data-v-30e112b7]{font-size:22px;font-weight:600;text-align:center;margin-bottom:16px}.gradient-text[data-v-30e112b7]{background:linear-gradient(90deg,#007bff,#00c6ff);-webkit-background-clip:text;background-clip:text;color:transparent}.image-box[data-v-30e112b7]{text-align:center;margin:20px 0;padding:10px;background:#fff;border-radius:12px;box-shadow:0 4px 12px #00000014}.pay-image[data-v-30e112b7]{width:590px;height:auto;border-radius:10px;object-fit:contain}.subtitle[data-v-30e112b7]{color:#555;text-align:center;font-size:15px;margin-top:12px}.right-panel .content[data-v-30e112b7]{line-height:1.6;color:#333;font-size:15px;margin-bottom:15px}.main-title[data-v-30e112b7]{font-size:24px;background:linear-gradient(45deg,#2b3a55,#ce7777);-webkit-background-clip:text;background-clip:text;color:transparent;margin-bottom:24px}.section-title[data-v-30e112b7]{font-size:18px;color:#2b3a55;margin-bottom:12px;font-weight:600}.info-block[data-v-30e112b7]{background:#fff;padding:16px;border-radius:8px;margin-bottom:16px;box-shadow:0 2px 8px #0000000d}.info-block p[data-v-30e112b7]{margin:8px 0;line-height:1.6;font-size:14px;color:#4a4a4a}.highlight[data-v-30e112b7]{color:#ce7777!important;font-size:16px!important}.warning[data-v-30e112b7]{color:#d93025;font-weight:600;background:#d930250d;padding:8px 12px;border-radius:6px;border-left:4px solid #d93025}.guide-link[data-v-30e112b7]{text-align:center;margin:12px 0!important}.guide-link a[data-v-30e112b7]{display:inline-block;padding:10px 20px;background:#f8f9fa;border:1px solid #e9ecef;border-radius:6px;color:#2b3a55;text-decoration:none;font-weight:500;transition:all .2s ease}.guide-link a[data-v-30e112b7]:hover{background:#e9ecef;transform:translateY(-2px);box-shadow:0 2px 4px #0000000d}.guide-link-inline[data-v-30e112b7]{margin-left:16px;text-decoration:none;color:#007bff;font-size:15px;font-weight:500;padding:4px 10px;background:#007bff1a;border-radius:6px;transition:all .2s ease;display:inline-flex;align-items:center;border:1px solid rgba(0,123,255,.2)}.guide-link-inline[data-v-30e112b7]:hover{color:#0056b3;background:#007bff26;transform:translateY(-1px);box-shadow:0 2px 4px #007bff1a}.token-section[data-v-30e112b7]{background:#f9fafc;border:1px solid #e3e7eb;padding:14px;border-radius:12px;margin:20px 0;transition:box-shadow .2s}.token-section[data-v-30e112b7]:hover{box-shadow:0 2px 8px #0000000f}.token-link[data-v-30e112b7]{display:inline-block;margin-bottom:8px;color:#007bff;text-decoration:none;font-weight:500}.token-link[data-v-30e112b7]:hover{text-decoration:underline}.token-info[data-v-30e112b7]{font-size:14px;color:#666;margin-bottom:8px;line-height:1.4}.token-info strong[data-v-30e112b7]{color:#007bff}.token-input[data-v-30e112b7]{padding:10px;border:1px solid #ccc;border-radius:8px;font-size:14px;outline:none;transition:border-color .2s,box-shadow .2s}.token-input[data-v-30e112b7]:focus{border-color:#007bff;box-shadow:0 0 0 2px #007bff26}.feedback[data-v-30e112b7]{font-size:14px;color:#666}.feedback a[data-v-30e112b7]{color:#007bff;text-decoration:none}.feedback a[data-v-30e112b7]:hover{text-decoration:underline}.agree-label[data-v-30e112b7]{font-size:15px;color:#666;display:flex;align-items:center;gap:8px;margin-top:12px;cursor:pointer;user-select:none;font-weight:500}.agree-label input[type=checkbox][data-v-30e112b7]{width:16px;height:16px;cursor:pointer;appearance:none;-webkit-appearance:none;background-color:#fff;border:2px solid #007bff;border-radius:4px;display:inline-block;position:relative;transition:all .2s ease}.agree-label input[type=checkbox][data-v-30e112b7]:checked{background-color:#007bff;border-color:#007bff}.agree-label input[type=checkbox][data-v-30e112b7]:checked:after{content:"";position:absolute;left:4px;top:1px;width:4px;height:8px;border:solid white;border-width:0 2px 2px 0;transform:rotate(45deg)}.agree-label input[type=checkbox][data-v-30e112b7]:disabled{background-color:#e9ecef;border-color:#ced4da;cursor:not-allowed;opacity:.7}.close-btn[data-v-30e112b7]{display:block;width:100%;margin-top:24px;padding:12px;background:linear-gradient(90deg,#007bff,#0af);color:#fff;border:none;border-radius:10px;font-size:16px;font-weight:500;cursor:pointer;transition:all .25s ease}.close-btn[data-v-30e112b7]:hover{background:linear-gradient(90deg,#0056b3,#0080ff);transform:translateY(-2px)}.beeline-helper[data-v-5fcc6ae2]{pointer-events:auto}.page-container[data-v-5fcc6ae2]{position:relative;height:100%;overflow:hidden}.page-wrapper[data-v-5fcc6ae2]{position:absolute;top:0;left:0;width:100%;height:100%;overflow:hidden}.page-fade-enter-active[data-v-5fcc6ae2],.page-fade-leave-active[data-v-5fcc6ae2]{transition:opacity .3s ease}.page-fade-enter-from[data-v-5fcc6ae2],.page-fade-leave-to[data-v-5fcc6ae2]{opacity:0}.page-fade-enter-to[data-v-5fcc6ae2],.page-fade-leave-from[data-v-5fcc6ae2]{opacity:1}.about-overlay[data-v-5fcc6ae2]{position:fixed;inset:0;background:#0000008c;backdrop-filter:blur(4px);z-index:9999;display:flex;align-items:center;justify-content:center}.about-container[data-v-5fcc6ae2]{width:80%;height:80%;max-width:1400px;max-height:770px;background:#fff;border-radius:16px;box-shadow:0 8px 30px #0003;overflow:auto;animation:fadeIn-5fcc6ae2 .3s ease}@keyframes fadeIn-5fcc6ae2{0%{transform:scale(.95);opacity:0}to{transform:scale(1);opacity:1}}.about-fade-scale-enter-active[data-v-5fcc6ae2],.about-fade-scale-leave-active[data-v-5fcc6ae2]{transition:all .3s cubic-bezier(.4,0,.2,1)}.about-fade-scale-enter-from[data-v-5fcc6ae2],.about-fade-scale-leave-to[data-v-5fcc6ae2]{opacity:0;transform:scale(.95)}.about-fade-scale-enter-to[data-v-5fcc6ae2],.about-fade-scale-leave-from[data-v-5fcc6ae2]{opacity:1;transform:scale(1)}.status-fade-slide-enter-active[data-v-5fcc6ae2]{transition:opacity .3s ease-out,transform .3s ease-out}.status-fade-slide-leave-active[data-v-5fcc6ae2]{transition:opacity .3s ease-in,transform .3s ease-in}.status-fade-slide-enter-from[data-v-5fcc6ae2],.status-fade-slide-leave-to[data-v-5fcc6ae2]{opacity:0;transform:translate(-20px)}.status-fade-slide-enter-to[data-v-5fcc6ae2],.status-fade-slide-leave-from[data-v-5fcc6ae2]{opacity:1;transform:translate(0)} '); System.register("./__entry.js", ['./__monkey.entry-D8JmPXXX.js'], (function (exports, module) { 'use strict'; return { setters: [null], execute: (function () { }) }; })); System.register("./__monkey.entry-D8JmPXXX.js", [], (function (exports, module) { 'use strict'; return { execute: (function () { exports({ e: extractQuestionContent, g: getStorageValue$1, p: parseAnswer, q: queryAnswer }); /** * @vue/shared v3.5.22 * (c) 2018-present Yuxi (Evan) You and Vue contributors * @license MIT **/ // @__NO_SIDE_EFFECTS__ function makeMap(str) { const map = /* @__PURE__ */ Object.create(null); for (const key of str.split(",")) map[key] = 1; return (val) => val in map; } const EMPTY_OBJ = {}; const EMPTY_ARR = []; const NOOP = () => { }; const NO = () => false; const isOn = (key) => key.charCodeAt(0) === 111 && key.charCodeAt(1) === 110 && // uppercase letter (key.charCodeAt(2) > 122 || key.charCodeAt(2) < 97); const isModelListener = (key) => key.startsWith("onUpdate:"); const extend = Object.assign; const remove = (arr, el) => { const i = arr.indexOf(el); if (i > -1) { arr.splice(i, 1); } }; const hasOwnProperty$1 = Object.prototype.hasOwnProperty; const hasOwn = (val, key) => hasOwnProperty$1.call(val, key); const isArray = Array.isArray; const isMap = (val) => toTypeString(val) === "[object Map]"; const isSet = (val) => toTypeString(val) === "[object Set]"; const isDate = (val) => toTypeString(val) === "[object Date]"; const isFunction = (val) => typeof val === "function"; const isString = (val) => typeof val === "string"; const isSymbol = (val) => typeof val === "symbol"; const isObject = (val) => val !== null && typeof val === "object"; const isPromise = (val) => { return (isObject(val) || isFunction(val)) && isFunction(val.then) && isFunction(val.catch); }; const objectToString = Object.prototype.toString; const toTypeString = (value) => objectToString.call(value); const toRawType = (value) => { return toTypeString(value).slice(8, -1); }; const isPlainObject = (val) => toTypeString(val) === "[object Object]"; const isIntegerKey = (key) => isString(key) && key !== "NaN" && key[0] !== "-" && "" + parseInt(key, 10) === key; const isReservedProp = /* @__PURE__ */ makeMap( // the leading comma is intentional so empty string "" is also included ",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted" ); const cacheStringFunction = (fn) => { const cache = /* @__PURE__ */ Object.create(null); return (str) => { const hit = cache[str]; return hit || (cache[str] = fn(str)); }; }; const camelizeRE = /-\w/g; const camelize = cacheStringFunction( (str) => { return str.replace(camelizeRE, (c) => c.slice(1).toUpperCase()); } ); const hyphenateRE = /\B([A-Z])/g; const hyphenate = cacheStringFunction( (str) => str.replace(hyphenateRE, "-$1").toLowerCase() ); const capitalize = cacheStringFunction((str) => { return str.charAt(0).toUpperCase() + str.slice(1); }); const toHandlerKey = cacheStringFunction( (str) => { const s = str ? `on${capitalize(str)}` : ``; return s; } ); const hasChanged = (value, oldValue) => !Object.is(value, oldValue); const invokeArrayFns = (fns, ...arg) => { for (let i = 0; i < fns.length; i++) { fns[i](...arg); } }; const def = (obj, key, value, writable = false) => { Object.defineProperty(obj, key, { configurable: true, enumerable: false, writable, value }); }; const looseToNumber = (val) => { const n = parseFloat(val); return isNaN(n) ? val : n; }; const toNumber = (val) => { const n = isString(val) ? Number(val) : NaN; return isNaN(n) ? val : n; }; let _globalThis; const getGlobalThis = () => { return _globalThis || (_globalThis = typeof globalThis !== "undefined" ? globalThis : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : typeof global !== "undefined" ? global : {}); }; function normalizeStyle(value) { if (isArray(value)) { const res = {}; for (let i = 0; i < value.length; i++) { const item = value[i]; const normalized = isString(item) ? parseStringStyle(item) : normalizeStyle(item); if (normalized) { for (const key in normalized) { res[key] = normalized[key]; } } } return res; } else if (isString(value) || isObject(value)) { return value; } } const listDelimiterRE = /;(?![^(]*\))/g; const propertyDelimiterRE = /:([^]+)/; const styleCommentRE = /\/\*[^]*?\*\//g; function parseStringStyle(cssText) { const ret = {}; cssText.replace(styleCommentRE, "").split(listDelimiterRE).forEach((item) => { if (item) { const tmp = item.split(propertyDelimiterRE); tmp.length > 1 && (ret[tmp[0].trim()] = tmp[1].trim()); } }); return ret; } function normalizeClass(value) { let res = ""; if (isString(value)) { res = value; } else if (isArray(value)) { for (let i = 0; i < value.length; i++) { const normalized = normalizeClass(value[i]); if (normalized) { res += normalized + " "; } } } else if (isObject(value)) { for (const name in value) { if (value[name]) { res += name + " "; } } } return res.trim(); } const specialBooleanAttrs = `itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly`; const isSpecialBooleanAttr = /* @__PURE__ */ makeMap(specialBooleanAttrs); function includeBooleanAttr(value) { return !!value || value === ""; } function looseCompareArrays(a, b) { if (a.length !== b.length) return false; let equal = true; for (let i = 0; equal && i < a.length; i++) { equal = looseEqual(a[i], b[i]); } return equal; } function looseEqual(a, b) { if (a === b) return true; let aValidType = isDate(a); let bValidType = isDate(b); if (aValidType || bValidType) { return aValidType && bValidType ? a.getTime() === b.getTime() : false; } aValidType = isSymbol(a); bValidType = isSymbol(b); if (aValidType || bValidType) { return a === b; } aValidType = isArray(a); bValidType = isArray(b); if (aValidType || bValidType) { return aValidType && bValidType ? looseCompareArrays(a, b) : false; } aValidType = isObject(a); bValidType = isObject(b); if (aValidType || bValidType) { if (!aValidType || !bValidType) { return false; } const aKeysCount = Object.keys(a).length; const bKeysCount = Object.keys(b).length; if (aKeysCount !== bKeysCount) { return false; } for (const key in a) { const aHasKey = a.hasOwnProperty(key); const bHasKey = b.hasOwnProperty(key); if (aHasKey && !bHasKey || !aHasKey && bHasKey || !looseEqual(a[key], b[key])) { return false; } } } return String(a) === String(b); } function looseIndexOf(arr, val) { return arr.findIndex((item) => looseEqual(item, val)); } const isRef$1 = (val) => { return !!(val && val["__v_isRef"] === true); }; const toDisplayString = (val) => { return isString(val) ? val : val == null ? "" : isArray(val) || isObject(val) && (val.toString === objectToString || !isFunction(val.toString)) ? isRef$1(val) ? toDisplayString(val.value) : JSON.stringify(val, replacer, 2) : String(val); }; const replacer = (_key, val) => { if (isRef$1(val)) { return replacer(_key, val.value); } else if (isMap(val)) { return { [`Map(${val.size})`]: [...val.entries()].reduce( (entries, [key, val2], i) => { entries[stringifySymbol(key, i) + " =>"] = val2; return entries; }, {} ) }; } else if (isSet(val)) { return { [`Set(${val.size})`]: [...val.values()].map((v) => stringifySymbol(v)) }; } else if (isSymbol(val)) { return stringifySymbol(val); } else if (isObject(val) && !isArray(val) && !isPlainObject(val)) { return String(val); } return val; }; const stringifySymbol = (v, i = "") => { var _a; return ( // Symbol.description in es2019+ so we need to cast here to pass // the lib: es2016 check isSymbol(v) ? `Symbol(${(_a = v.description) != null ? _a : i})` : v ); }; /** * @vue/reactivity v3.5.22 * (c) 2018-present Yuxi (Evan) You and Vue contributors * @license MIT **/ let activeEffectScope; class EffectScope { constructor(detached = false) { this.detached = detached; this._active = true; this._on = 0; this.effects = []; this.cleanups = []; this._isPaused = false; this.parent = activeEffectScope; if (!detached && activeEffectScope) { this.index = (activeEffectScope.scopes || (activeEffectScope.scopes = [])).push( this ) - 1; } } get active() { return this._active; } pause() { if (this._active) { this._isPaused = true; let i, l; if (this.scopes) { for (i = 0, l = this.scopes.length; i < l; i++) { this.scopes[i].pause(); } } for (i = 0, l = this.effects.length; i < l; i++) { this.effects[i].pause(); } } } /** * Resumes the effect scope, including all child scopes and effects. */ resume() { if (this._active) { if (this._isPaused) { this._isPaused = false; let i, l; if (this.scopes) { for (i = 0, l = this.scopes.length; i < l; i++) { this.scopes[i].resume(); } } for (i = 0, l = this.effects.length; i < l; i++) { this.effects[i].resume(); } } } } run(fn) { if (this._active) { const currentEffectScope = activeEffectScope; try { activeEffectScope = this; return fn(); } finally { activeEffectScope = currentEffectScope; } } } /** * This should only be called on non-detached scopes * @internal */ on() { if (++this._on === 1) { this.prevScope = activeEffectScope; activeEffectScope = this; } } /** * This should only be called on non-detached scopes * @internal */ off() { if (this._on > 0 && --this._on === 0) { activeEffectScope = this.prevScope; this.prevScope = void 0; } } stop(fromParent) { if (this._active) { this._active = false; let i, l; for (i = 0, l = this.effects.length; i < l; i++) { this.effects[i].stop(); } this.effects.length = 0; for (i = 0, l = this.cleanups.length; i < l; i++) { this.cleanups[i](); } this.cleanups.length = 0; if (this.scopes) { for (i = 0, l = this.scopes.length; i < l; i++) { this.scopes[i].stop(true); } this.scopes.length = 0; } if (!this.detached && this.parent && !fromParent) { const last = this.parent.scopes.pop(); if (last && last !== this) { this.parent.scopes[this.index] = last; last.index = this.index; } } this.parent = void 0; } } } function getCurrentScope() { return activeEffectScope; } let activeSub; const pausedQueueEffects = /* @__PURE__ */ new WeakSet(); class ReactiveEffect { constructor(fn) { this.fn = fn; this.deps = void 0; this.depsTail = void 0; this.flags = 1 | 4; this.next = void 0; this.cleanup = void 0; this.scheduler = void 0; if (activeEffectScope && activeEffectScope.active) { activeEffectScope.effects.push(this); } } pause() { this.flags |= 64; } resume() { if (this.flags & 64) { this.flags &= -65; if (pausedQueueEffects.has(this)) { pausedQueueEffects.delete(this); this.trigger(); } } } /** * @internal */ notify() { if (this.flags & 2 && !(this.flags & 32)) { return; } if (!(this.flags & 8)) { batch(this); } } run() { if (!(this.flags & 1)) { return this.fn(); } this.flags |= 2; cleanupEffect(this); prepareDeps(this); const prevEffect = activeSub; const prevShouldTrack = shouldTrack; activeSub = this; shouldTrack = true; try { return this.fn(); } finally { cleanupDeps(this); activeSub = prevEffect; shouldTrack = prevShouldTrack; this.flags &= -3; } } stop() { if (this.flags & 1) { for (let link = this.deps; link; link = link.nextDep) { removeSub(link); } this.deps = this.depsTail = void 0; cleanupEffect(this); this.onStop && this.onStop(); this.flags &= -2; } } trigger() { if (this.flags & 64) { pausedQueueEffects.add(this); } else if (this.scheduler) { this.scheduler(); } else { this.runIfDirty(); } } /** * @internal */ runIfDirty() { if (isDirty(this)) { this.run(); } } get dirty() { return isDirty(this); } } let batchDepth = 0; let batchedSub; let batchedComputed; function batch(sub, isComputed = false) { sub.flags |= 8; if (isComputed) { sub.next = batchedComputed; batchedComputed = sub; return; } sub.next = batchedSub; batchedSub = sub; } function startBatch() { batchDepth++; } function endBatch() { if (--batchDepth > 0) { return; } if (batchedComputed) { let e = batchedComputed; batchedComputed = void 0; while (e) { const next = e.next; e.next = void 0; e.flags &= -9; e = next; } } let error; while (batchedSub) { let e = batchedSub; batchedSub = void 0; while (e) { const next = e.next; e.next = void 0; e.flags &= -9; if (e.flags & 1) { try { ; e.trigger(); } catch (err) { if (!error) error = err; } } e = next; } } if (error) throw error; } function prepareDeps(sub) { for (let link = sub.deps; link; link = link.nextDep) { link.version = -1; link.prevActiveLink = link.dep.activeLink; link.dep.activeLink = link; } } function cleanupDeps(sub) { let head; let tail = sub.depsTail; let link = tail; while (link) { const prev = link.prevDep; if (link.version === -1) { if (link === tail) tail = prev; removeSub(link); removeDep(link); } else { head = link; } link.dep.activeLink = link.prevActiveLink; link.prevActiveLink = void 0; link = prev; } sub.deps = head; sub.depsTail = tail; } function isDirty(sub) { for (let link = sub.deps; link; link = link.nextDep) { if (link.dep.version !== link.version || link.dep.computed && (refreshComputed(link.dep.computed) || link.dep.version !== link.version)) { return true; } } if (sub._dirty) { return true; } return false; } function refreshComputed(computed2) { if (computed2.flags & 4 && !(computed2.flags & 16)) { return; } computed2.flags &= -17; if (computed2.globalVersion === globalVersion) { return; } computed2.globalVersion = globalVersion; if (!computed2.isSSR && computed2.flags & 128 && (!computed2.deps && !computed2._dirty || !isDirty(computed2))) { return; } computed2.flags |= 2; const dep = computed2.dep; const prevSub = activeSub; const prevShouldTrack = shouldTrack; activeSub = computed2; shouldTrack = true; try { prepareDeps(computed2); const value = computed2.fn(computed2._value); if (dep.version === 0 || hasChanged(value, computed2._value)) { computed2.flags |= 128; computed2._value = value; dep.version++; } } catch (err) { dep.version++; throw err; } finally { activeSub = prevSub; shouldTrack = prevShouldTrack; cleanupDeps(computed2); computed2.flags &= -3; } } function removeSub(link, soft = false) { const { dep, prevSub, nextSub } = link; if (prevSub) { prevSub.nextSub = nextSub; link.prevSub = void 0; } if (nextSub) { nextSub.prevSub = prevSub; link.nextSub = void 0; } if (dep.subs === link) { dep.subs = prevSub; if (!prevSub && dep.computed) { dep.computed.flags &= -5; for (let l = dep.computed.deps; l; l = l.nextDep) { removeSub(l, true); } } } if (!soft && !--dep.sc && dep.map) { dep.map.delete(dep.key); } } function removeDep(link) { const { prevDep, nextDep } = link; if (prevDep) { prevDep.nextDep = nextDep; link.prevDep = void 0; } if (nextDep) { nextDep.prevDep = prevDep; link.nextDep = void 0; } } let shouldTrack = true; const trackStack = []; function pauseTracking() { trackStack.push(shouldTrack); shouldTrack = false; } function resetTracking() { const last = trackStack.pop(); shouldTrack = last === void 0 ? true : last; } function cleanupEffect(e) { const { cleanup } = e; e.cleanup = void 0; if (cleanup) { const prevSub = activeSub; activeSub = void 0; try { cleanup(); } finally { activeSub = prevSub; } } } let globalVersion = 0; class Link { constructor(sub, dep) { this.sub = sub; this.dep = dep; this.version = dep.version; this.nextDep = this.prevDep = this.nextSub = this.prevSub = this.prevActiveLink = void 0; } } class Dep { // TODO isolatedDeclarations "__v_skip" constructor(computed2) { this.computed = computed2; this.version = 0; this.activeLink = void 0; this.subs = void 0; this.map = void 0; this.key = void 0; this.sc = 0; this.__v_skip = true; } track(debugInfo) { if (!activeSub || !shouldTrack || activeSub === this.computed) { return; } let link = this.activeLink; if (link === void 0 || link.sub !== activeSub) { link = this.activeLink = new Link(activeSub, this); if (!activeSub.deps) { activeSub.deps = activeSub.depsTail = link; } else { link.prevDep = activeSub.depsTail; activeSub.depsTail.nextDep = link; activeSub.depsTail = link; } addSub(link); } else if (link.version === -1) { link.version = this.version; if (link.nextDep) { const next = link.nextDep; next.prevDep = link.prevDep; if (link.prevDep) { link.prevDep.nextDep = next; } link.prevDep = activeSub.depsTail; link.nextDep = void 0; activeSub.depsTail.nextDep = link; activeSub.depsTail = link; if (activeSub.deps === link) { activeSub.deps = next; } } } return link; } trigger(debugInfo) { this.version++; globalVersion++; this.notify(debugInfo); } notify(debugInfo) { startBatch(); try { if (false) ; for (let link = this.subs; link; link = link.prevSub) { if (link.sub.notify()) { ; link.sub.dep.notify(); } } } finally { endBatch(); } } } function addSub(link) { link.dep.sc++; if (link.sub.flags & 4) { const computed2 = link.dep.computed; if (computed2 && !link.dep.subs) { computed2.flags |= 4 | 16; for (let l = computed2.deps; l; l = l.nextDep) { addSub(l); } } const currentTail = link.dep.subs; if (currentTail !== link) { link.prevSub = currentTail; if (currentTail) currentTail.nextSub = link; } link.dep.subs = link; } } const targetMap = /* @__PURE__ */ new WeakMap(); const ITERATE_KEY = Symbol( "" ); const MAP_KEY_ITERATE_KEY = Symbol( "" ); const ARRAY_ITERATE_KEY = Symbol( "" ); function track(target, type, key) { if (shouldTrack && activeSub) { let depsMap = targetMap.get(target); if (!depsMap) { targetMap.set(target, depsMap = /* @__PURE__ */ new Map()); } let dep = depsMap.get(key); if (!dep) { depsMap.set(key, dep = new Dep()); dep.map = depsMap; dep.key = key; } { dep.track(); } } } function trigger(target, type, key, newValue, oldValue, oldTarget) { const depsMap = targetMap.get(target); if (!depsMap) { globalVersion++; return; } const run = (dep) => { if (dep) { { dep.trigger(); } } }; startBatch(); if (type === "clear") { depsMap.forEach(run); } else { const targetIsArray = isArray(target); const isArrayIndex = targetIsArray && isIntegerKey(key); if (targetIsArray && key === "length") { const newLength = Number(newValue); depsMap.forEach((dep, key2) => { if (key2 === "length" || key2 === ARRAY_ITERATE_KEY || !isSymbol(key2) && key2 >= newLength) { run(dep); } }); } else { if (key !== void 0 || depsMap.has(void 0)) { run(depsMap.get(key)); } if (isArrayIndex) { run(depsMap.get(ARRAY_ITERATE_KEY)); } switch (type) { case "add": if (!targetIsArray) { run(depsMap.get(ITERATE_KEY)); if (isMap(target)) { run(depsMap.get(MAP_KEY_ITERATE_KEY)); } } else if (isArrayIndex) { run(depsMap.get("length")); } break; case "delete": if (!targetIsArray) { run(depsMap.get(ITERATE_KEY)); if (isMap(target)) { run(depsMap.get(MAP_KEY_ITERATE_KEY)); } } break; case "set": if (isMap(target)) { run(depsMap.get(ITERATE_KEY)); } break; } } } endBatch(); } function reactiveReadArray(array) { const raw = toRaw(array); if (raw === array) return raw; track(raw, "iterate", ARRAY_ITERATE_KEY); return isShallow(array) ? raw : raw.map(toReactive); } function shallowReadArray(arr) { track(arr = toRaw(arr), "iterate", ARRAY_ITERATE_KEY); return arr; } const arrayInstrumentations = { __proto__: null, [Symbol.iterator]() { return iterator(this, Symbol.iterator, toReactive); }, concat(...args) { return reactiveReadArray(this).concat( ...args.map((x) => isArray(x) ? reactiveReadArray(x) : x) ); }, entries() { return iterator(this, "entries", (value) => { value[1] = toReactive(value[1]); return value; }); }, every(fn, thisArg) { return apply(this, "every", fn, thisArg, void 0, arguments); }, filter(fn, thisArg) { return apply(this, "filter", fn, thisArg, (v) => v.map(toReactive), arguments); }, find(fn, thisArg) { return apply(this, "find", fn, thisArg, toReactive, arguments); }, findIndex(fn, thisArg) { return apply(this, "findIndex", fn, thisArg, void 0, arguments); }, findLast(fn, thisArg) { return apply(this, "findLast", fn, thisArg, toReactive, arguments); }, findLastIndex(fn, thisArg) { return apply(this, "findLastIndex", fn, thisArg, void 0, arguments); }, // flat, flatMap could benefit from ARRAY_ITERATE but are not straight-forward to implement forEach(fn, thisArg) { return apply(this, "forEach", fn, thisArg, void 0, arguments); }, includes(...args) { return searchProxy(this, "includes", args); }, indexOf(...args) { return searchProxy(this, "indexOf", args); }, join(separator) { return reactiveReadArray(this).join(separator); }, // keys() iterator only reads `length`, no optimization required lastIndexOf(...args) { return searchProxy(this, "lastIndexOf", args); }, map(fn, thisArg) { return apply(this, "map", fn, thisArg, void 0, arguments); }, pop() { return noTracking(this, "pop"); }, push(...args) { return noTracking(this, "push", args); }, reduce(fn, ...args) { return reduce(this, "reduce", fn, args); }, reduceRight(fn, ...args) { return reduce(this, "reduceRight", fn, args); }, shift() { return noTracking(this, "shift"); }, // slice could use ARRAY_ITERATE but also seems to beg for range tracking some(fn, thisArg) { return apply(this, "some", fn, thisArg, void 0, arguments); }, splice(...args) { return noTracking(this, "splice", args); }, toReversed() { return reactiveReadArray(this).toReversed(); }, toSorted(comparer) { return reactiveReadArray(this).toSorted(comparer); }, toSpliced(...args) { return reactiveReadArray(this).toSpliced(...args); }, unshift(...args) { return noTracking(this, "unshift", args); }, values() { return iterator(this, "values", toReactive); } }; function iterator(self, method, wrapValue) { const arr = shallowReadArray(self); const iter = arr[method](); if (arr !== self && !isShallow(self)) { iter._next = iter.next; iter.next = () => { const result = iter._next(); if (!result.done) { result.value = wrapValue(result.value); } return result; }; } return iter; } const arrayProto = Array.prototype; function apply(self, method, fn, thisArg, wrappedRetFn, args) { const arr = shallowReadArray(self); const needsWrap = arr !== self && !isShallow(self); const methodFn = arr[method]; if (methodFn !== arrayProto[method]) { const result2 = methodFn.apply(self, args); return needsWrap ? toReactive(result2) : result2; } let wrappedFn = fn; if (arr !== self) { if (needsWrap) { wrappedFn = function(item, index) { return fn.call(this, toReactive(item), index, self); }; } else if (fn.length > 2) { wrappedFn = function(item, index) { return fn.call(this, item, index, self); }; } } const result = methodFn.call(arr, wrappedFn, thisArg); return needsWrap && wrappedRetFn ? wrappedRetFn(result) : result; } function reduce(self, method, fn, args) { const arr = shallowReadArray(self); let wrappedFn = fn; if (arr !== self) { if (!isShallow(self)) { wrappedFn = function(acc, item, index) { return fn.call(this, acc, toReactive(item), index, self); }; } else if (fn.length > 3) { wrappedFn = function(acc, item, index) { return fn.call(this, acc, item, index, self); }; } } return arr[method](wrappedFn, ...args); } function searchProxy(self, method, args) { const arr = toRaw(self); track(arr, "iterate", ARRAY_ITERATE_KEY); const res = arr[method](...args); if ((res === -1 || res === false) && isProxy(args[0])) { args[0] = toRaw(args[0]); return arr[method](...args); } return res; } function noTracking(self, method, args = []) { pauseTracking(); startBatch(); const res = toRaw(self)[method].apply(self, args); endBatch(); resetTracking(); return res; } const isNonTrackableKeys = /* @__PURE__ */ makeMap(`__proto__,__v_isRef,__isVue`); const builtInSymbols = new Set( /* @__PURE__ */ Object.getOwnPropertyNames(Symbol).filter((key) => key !== "arguments" && key !== "caller").map((key) => Symbol[key]).filter(isSymbol) ); function hasOwnProperty(key) { if (!isSymbol(key)) key = String(key); const obj = toRaw(this); track(obj, "has", key); return obj.hasOwnProperty(key); } class BaseReactiveHandler { constructor(_isReadonly = false, _isShallow = false) { this._isReadonly = _isReadonly; this._isShallow = _isShallow; } get(target, key, receiver) { if (key === "__v_skip") return target["__v_skip"]; const isReadonly2 = this._isReadonly, isShallow2 = this._isShallow; if (key === "__v_isReactive") { return !isReadonly2; } else if (key === "__v_isReadonly") { return isReadonly2; } else if (key === "__v_isShallow") { return isShallow2; } else if (key === "__v_raw") { if (receiver === (isReadonly2 ? isShallow2 ? shallowReadonlyMap : readonlyMap : isShallow2 ? shallowReactiveMap : reactiveMap).get(target) || // receiver is not the reactive proxy, but has the same prototype // this means the receiver is a user proxy of the reactive proxy Object.getPrototypeOf(target) === Object.getPrototypeOf(receiver)) { return target; } return; } const targetIsArray = isArray(target); if (!isReadonly2) { let fn; if (targetIsArray && (fn = arrayInstrumentations[key])) { return fn; } if (key === "hasOwnProperty") { return hasOwnProperty; } } const res = Reflect.get( target, key, // if this is a proxy wrapping a ref, return methods using the raw ref // as receiver so that we don't have to call `toRaw` on the ref in all // its class methods isRef(target) ? target : receiver ); if (isSymbol(key) ? builtInSymbols.has(key) : isNonTrackableKeys(key)) { return res; } if (!isReadonly2) { track(target, "get", key); } if (isShallow2) { return res; } if (isRef(res)) { const value = targetIsArray && isIntegerKey(key) ? res : res.value; return isReadonly2 && isObject(value) ? readonly(value) : value; } if (isObject(res)) { return isReadonly2 ? readonly(res) : reactive(res); } return res; } } class MutableReactiveHandler extends BaseReactiveHandler { constructor(isShallow2 = false) { super(false, isShallow2); } set(target, key, value, receiver) { let oldValue = target[key]; if (!this._isShallow) { const isOldValueReadonly = isReadonly(oldValue); if (!isShallow(value) && !isReadonly(value)) { oldValue = toRaw(oldValue); value = toRaw(value); } if (!isArray(target) && isRef(oldValue) && !isRef(value)) { if (isOldValueReadonly) { return true; } else { oldValue.value = value; return true; } } } const hadKey = isArray(target) && isIntegerKey(key) ? Number(key) < target.length : hasOwn(target, key); const result = Reflect.set( target, key, value, isRef(target) ? target : receiver ); if (target === toRaw(receiver)) { if (!hadKey) { trigger(target, "add", key, value); } else if (hasChanged(value, oldValue)) { trigger(target, "set", key, value); } } return result; } deleteProperty(target, key) { const hadKey = hasOwn(target, key); target[key]; const result = Reflect.deleteProperty(target, key); if (result && hadKey) { trigger(target, "delete", key, void 0); } return result; } has(target, key) { const result = Reflect.has(target, key); if (!isSymbol(key) || !builtInSymbols.has(key)) { track(target, "has", key); } return result; } ownKeys(target) { track( target, "iterate", isArray(target) ? "length" : ITERATE_KEY ); return Reflect.ownKeys(target); } } class ReadonlyReactiveHandler extends BaseReactiveHandler { constructor(isShallow2 = false) { super(true, isShallow2); } set(target, key) { return true; } deleteProperty(target, key) { return true; } } const mutableHandlers = /* @__PURE__ */ new MutableReactiveHandler(); const readonlyHandlers = /* @__PURE__ */ new ReadonlyReactiveHandler(); const shallowReactiveHandlers = /* @__PURE__ */ new MutableReactiveHandler(true); const shallowReadonlyHandlers = /* @__PURE__ */ new ReadonlyReactiveHandler(true); const toShallow = (value) => value; const getProto = (v) => Reflect.getPrototypeOf(v); function createIterableMethod(method, isReadonly2, isShallow2) { return function(...args) { const target = this["__v_raw"]; const rawTarget = toRaw(target); const targetIsMap = isMap(rawTarget); const isPair = method === "entries" || method === Symbol.iterator && targetIsMap; const isKeyOnly = method === "keys" && targetIsMap; const innerIterator = target[method](...args); const wrap = isShallow2 ? toShallow : isReadonly2 ? toReadonly : toReactive; !isReadonly2 && track( rawTarget, "iterate", isKeyOnly ? MAP_KEY_ITERATE_KEY : ITERATE_KEY ); return { // iterator protocol next() { const { value, done } = innerIterator.next(); return done ? { value, done } : { value: isPair ? [wrap(value[0]), wrap(value[1])] : wrap(value), done }; }, // iterable protocol [Symbol.iterator]() { return this; } }; }; } function createReadonlyMethod(type) { return function(...args) { return type === "delete" ? false : type === "clear" ? void 0 : this; }; } function createInstrumentations(readonly2, shallow) { const instrumentations = { get(key) { const target = this["__v_raw"]; const rawTarget = toRaw(target); const rawKey = toRaw(key); if (!readonly2) { if (hasChanged(key, rawKey)) { track(rawTarget, "get", key); } track(rawTarget, "get", rawKey); } const { has } = getProto(rawTarget); const wrap = shallow ? toShallow : readonly2 ? toReadonly : toReactive; if (has.call(rawTarget, key)) { return wrap(target.get(key)); } else if (has.call(rawTarget, rawKey)) { return wrap(target.get(rawKey)); } else if (target !== rawTarget) { target.get(key); } }, get size() { const target = this["__v_raw"]; !readonly2 && track(toRaw(target), "iterate", ITERATE_KEY); return target.size; }, has(key) { const target = this["__v_raw"]; const rawTarget = toRaw(target); const rawKey = toRaw(key); if (!readonly2) { if (hasChanged(key, rawKey)) { track(rawTarget, "has", key); } track(rawTarget, "has", rawKey); } return key === rawKey ? target.has(key) : target.has(key) || target.has(rawKey); }, forEach(callback, thisArg) { const observed = this; const target = observed["__v_raw"]; const rawTarget = toRaw(target); const wrap = shallow ? toShallow : readonly2 ? toReadonly : toReactive; !readonly2 && track(rawTarget, "iterate", ITERATE_KEY); return target.forEach((value, key) => { return callback.call(thisArg, wrap(value), wrap(key), observed); }); } }; extend( instrumentations, readonly2 ? { add: createReadonlyMethod("add"), set: createReadonlyMethod("set"), delete: createReadonlyMethod("delete"), clear: createReadonlyMethod("clear") } : { add(value) { if (!shallow && !isShallow(value) && !isReadonly(value)) { value = toRaw(value); } const target = toRaw(this); const proto = getProto(target); const hadKey = proto.has.call(target, value); if (!hadKey) { target.add(value); trigger(target, "add", value, value); } return this; }, set(key, value) { if (!shallow && !isShallow(value) && !isReadonly(value)) { value = toRaw(value); } const target = toRaw(this); const { has, get } = getProto(target); let hadKey = has.call(target, key); if (!hadKey) { key = toRaw(key); hadKey = has.call(target, key); } const oldValue = get.call(target, key); target.set(key, value); if (!hadKey) { trigger(target, "add", key, value); } else if (hasChanged(value, oldValue)) { trigger(target, "set", key, value); } return this; }, delete(key) { const target = toRaw(this); const { has, get } = getProto(target); let hadKey = has.call(target, key); if (!hadKey) { key = toRaw(key); hadKey = has.call(target, key); } get ? get.call(target, key) : void 0; const result = target.delete(key); if (hadKey) { trigger(target, "delete", key, void 0); } return result; }, clear() { const target = toRaw(this); const hadItems = target.size !== 0; const result = target.clear(); if (hadItems) { trigger( target, "clear", void 0, void 0); } return result; } } ); const iteratorMethods = [ "keys", "values", "entries", Symbol.iterator ]; iteratorMethods.forEach((method) => { instrumentations[method] = createIterableMethod(method, readonly2, shallow); }); return instrumentations; } function createInstrumentationGetter(isReadonly2, shallow) { const instrumentations = createInstrumentations(isReadonly2, shallow); return (target, key, receiver) => { if (key === "__v_isReactive") { return !isReadonly2; } else if (key === "__v_isReadonly") { return isReadonly2; } else if (key === "__v_raw") { return target; } return Reflect.get( hasOwn(instrumentations, key) && key in target ? instrumentations : target, key, receiver ); }; } const mutableCollectionHandlers = { get: /* @__PURE__ */ createInstrumentationGetter(false, false) }; const shallowCollectionHandlers = { get: /* @__PURE__ */ createInstrumentationGetter(false, true) }; const readonlyCollectionHandlers = { get: /* @__PURE__ */ createInstrumentationGetter(true, false) }; const shallowReadonlyCollectionHandlers = { get: /* @__PURE__ */ createInstrumentationGetter(true, true) }; const reactiveMap = /* @__PURE__ */ new WeakMap(); const shallowReactiveMap = /* @__PURE__ */ new WeakMap(); const readonlyMap = /* @__PURE__ */ new WeakMap(); const shallowReadonlyMap = /* @__PURE__ */ new WeakMap(); function targetTypeMap(rawType) { switch (rawType) { case "Object": case "Array": return 1; case "Map": case "Set": case "WeakMap": case "WeakSet": return 2; default: return 0; } } function getTargetType(value) { return value["__v_skip"] || !Object.isExtensible(value) ? 0 : targetTypeMap(toRawType(value)); } function reactive(target) { if (isReadonly(target)) { return target; } return createReactiveObject( target, false, mutableHandlers, mutableCollectionHandlers, reactiveMap ); } function shallowReactive(target) { return createReactiveObject( target, false, shallowReactiveHandlers, shallowCollectionHandlers, shallowReactiveMap ); } function readonly(target) { return createReactiveObject( target, true, readonlyHandlers, readonlyCollectionHandlers, readonlyMap ); } function shallowReadonly(target) { return createReactiveObject( target, true, shallowReadonlyHandlers, shallowReadonlyCollectionHandlers, shallowReadonlyMap ); } function createReactiveObject(target, isReadonly2, baseHandlers, collectionHandlers, proxyMap) { if (!isObject(target)) { return target; } if (target["__v_raw"] && !(isReadonly2 && target["__v_isReactive"])) { return target; } const targetType = getTargetType(target); if (targetType === 0) { return target; } const existingProxy = proxyMap.get(target); if (existingProxy) { return existingProxy; } const proxy = new Proxy( target, targetType === 2 ? collectionHandlers : baseHandlers ); proxyMap.set(target, proxy); return proxy; } function isReactive(value) { if (isReadonly(value)) { return isReactive(value["__v_raw"]); } return !!(value && value["__v_isReactive"]); } function isReadonly(value) { return !!(value && value["__v_isReadonly"]); } function isShallow(value) { return !!(value && value["__v_isShallow"]); } function isProxy(value) { return value ? !!value["__v_raw"] : false; } function toRaw(observed) { const raw = observed && observed["__v_raw"]; return raw ? toRaw(raw) : observed; } function markRaw(value) { if (!hasOwn(value, "__v_skip") && Object.isExtensible(value)) { def(value, "__v_skip", true); } return value; } const toReactive = (value) => isObject(value) ? reactive(value) : value; const toReadonly = (value) => isObject(value) ? readonly(value) : value; function isRef(r) { return r ? r["__v_isRef"] === true : false; } function ref(value) { return createRef(value, false); } function createRef(rawValue, shallow) { if (isRef(rawValue)) { return rawValue; } return new RefImpl(rawValue, shallow); } class RefImpl { constructor(value, isShallow2) { this.dep = new Dep(); this["__v_isRef"] = true; this["__v_isShallow"] = false; this._rawValue = isShallow2 ? value : toRaw(value); this._value = isShallow2 ? value : toReactive(value); this["__v_isShallow"] = isShallow2; } get value() { { this.dep.track(); } return this._value; } set value(newValue) { const oldValue = this._rawValue; const useDirectValue = this["__v_isShallow"] || isShallow(newValue) || isReadonly(newValue); newValue = useDirectValue ? newValue : toRaw(newValue); if (hasChanged(newValue, oldValue)) { this._rawValue = newValue; this._value = useDirectValue ? newValue : toReactive(newValue); { this.dep.trigger(); } } } } function unref(ref2) { return isRef(ref2) ? ref2.value : ref2; } const shallowUnwrapHandlers = { get: (target, key, receiver) => key === "__v_raw" ? target : unref(Reflect.get(target, key, receiver)), set: (target, key, value, receiver) => { const oldValue = target[key]; if (isRef(oldValue) && !isRef(value)) { oldValue.value = value; return true; } else { return Reflect.set(target, key, value, receiver); } } }; function proxyRefs(objectWithRefs) { return isReactive(objectWithRefs) ? objectWithRefs : new Proxy(objectWithRefs, shallowUnwrapHandlers); } class ComputedRefImpl { constructor(fn, setter, isSSR) { this.fn = fn; this.setter = setter; this._value = void 0; this.dep = new Dep(this); this.__v_isRef = true; this.deps = void 0; this.depsTail = void 0; this.flags = 16; this.globalVersion = globalVersion - 1; this.next = void 0; this.effect = this; this["__v_isReadonly"] = !setter; this.isSSR = isSSR; } /** * @internal */ notify() { this.flags |= 16; if (!(this.flags & 8) && // avoid infinite self recursion activeSub !== this) { batch(this, true); return true; } } get value() { const link = this.dep.track(); refreshComputed(this); if (link) { link.version = this.dep.version; } return this._value; } set value(newValue) { if (this.setter) { this.setter(newValue); } } } function computed$1(getterOrOptions, debugOptions, isSSR = false) { let getter; let setter; if (isFunction(getterOrOptions)) { getter = getterOrOptions; } else { getter = getterOrOptions.get; setter = getterOrOptions.set; } const cRef = new ComputedRefImpl(getter, setter, isSSR); return cRef; } const INITIAL_WATCHER_VALUE = {}; const cleanupMap = /* @__PURE__ */ new WeakMap(); let activeWatcher = void 0; function onWatcherCleanup(cleanupFn, failSilently = false, owner = activeWatcher) { if (owner) { let cleanups = cleanupMap.get(owner); if (!cleanups) cleanupMap.set(owner, cleanups = []); cleanups.push(cleanupFn); } } function watch$1(source, cb, options = EMPTY_OBJ) { const { immediate, deep, once, scheduler, augmentJob, call } = options; const reactiveGetter = (source2) => { if (deep) return source2; if (isShallow(source2) || deep === false || deep === 0) return traverse(source2, 1); return traverse(source2); }; let effect2; let getter; let cleanup; let boundCleanup; let forceTrigger = false; let isMultiSource = false; if (isRef(source)) { getter = () => source.value; forceTrigger = isShallow(source); } else if (isReactive(source)) { getter = () => reactiveGetter(source); forceTrigger = true; } else if (isArray(source)) { isMultiSource = true; forceTrigger = source.some((s) => isReactive(s) || isShallow(s)); getter = () => source.map((s) => { if (isRef(s)) { return s.value; } else if (isReactive(s)) { return reactiveGetter(s); } else if (isFunction(s)) { return call ? call(s, 2) : s(); } else ; }); } else if (isFunction(source)) { if (cb) { getter = call ? () => call(source, 2) : source; } else { getter = () => { if (cleanup) { pauseTracking(); try { cleanup(); } finally { resetTracking(); } } const currentEffect = activeWatcher; activeWatcher = effect2; try { return call ? call(source, 3, [boundCleanup]) : source(boundCleanup); } finally { activeWatcher = currentEffect; } }; } } else { getter = NOOP; } if (cb && deep) { const baseGetter = getter; const depth = deep === true ? Infinity : deep; getter = () => traverse(baseGetter(), depth); } const scope = getCurrentScope(); const watchHandle = () => { effect2.stop(); if (scope && scope.active) { remove(scope.effects, effect2); } }; if (once && cb) { const _cb = cb; cb = (...args) => { _cb(...args); watchHandle(); }; } let oldValue = isMultiSource ? new Array(source.length).fill(INITIAL_WATCHER_VALUE) : INITIAL_WATCHER_VALUE; const job = (immediateFirstRun) => { if (!(effect2.flags & 1) || !effect2.dirty && !immediateFirstRun) { return; } if (cb) { const newValue = effect2.run(); if (deep || forceTrigger || (isMultiSource ? newValue.some((v, i) => hasChanged(v, oldValue[i])) : hasChanged(newValue, oldValue))) { if (cleanup) { cleanup(); } const currentWatcher = activeWatcher; activeWatcher = effect2; try { const args = [ newValue, // pass undefined as the old value when it's changed for the first time oldValue === INITIAL_WATCHER_VALUE ? void 0 : isMultiSource && oldValue[0] === INITIAL_WATCHER_VALUE ? [] : oldValue, boundCleanup ]; oldValue = newValue; call ? call(cb, 3, args) : ( // @ts-expect-error cb(...args) ); } finally { activeWatcher = currentWatcher; } } } else { effect2.run(); } }; if (augmentJob) { augmentJob(job); } effect2 = new ReactiveEffect(getter); effect2.scheduler = scheduler ? () => scheduler(job, false) : job; boundCleanup = (fn) => onWatcherCleanup(fn, false, effect2); cleanup = effect2.onStop = () => { const cleanups = cleanupMap.get(effect2); if (cleanups) { if (call) { call(cleanups, 4); } else { for (const cleanup2 of cleanups) cleanup2(); } cleanupMap.delete(effect2); } }; if (cb) { if (immediate) { job(true); } else { oldValue = effect2.run(); } } else if (scheduler) { scheduler(job.bind(null, true), true); } else { effect2.run(); } watchHandle.pause = effect2.pause.bind(effect2); watchHandle.resume = effect2.resume.bind(effect2); watchHandle.stop = watchHandle; return watchHandle; } function traverse(value, depth = Infinity, seen) { if (depth <= 0 || !isObject(value) || value["__v_skip"]) { return value; } seen = seen || /* @__PURE__ */ new Map(); if ((seen.get(value) || 0) >= depth) { return value; } seen.set(value, depth); depth--; if (isRef(value)) { traverse(value.value, depth, seen); } else if (isArray(value)) { for (let i = 0; i < value.length; i++) { traverse(value[i], depth, seen); } } else if (isSet(value) || isMap(value)) { value.forEach((v) => { traverse(v, depth, seen); }); } else if (isPlainObject(value)) { for (const key in value) { traverse(value[key], depth, seen); } for (const key of Object.getOwnPropertySymbols(value)) { if (Object.prototype.propertyIsEnumerable.call(value, key)) { traverse(value[key], depth, seen); } } } return value; } /** * @vue/runtime-core v3.5.22 * (c) 2018-present Yuxi (Evan) You and Vue contributors * @license MIT **/ const stack = []; let isWarning = false; function warn$1(msg, ...args) { if (isWarning) return; isWarning = true; pauseTracking(); const instance = stack.length ? stack[stack.length - 1].component : null; const appWarnHandler = instance && instance.appContext.config.warnHandler; const trace = getComponentTrace(); if (appWarnHandler) { callWithErrorHandling( appWarnHandler, instance, 11, [ // eslint-disable-next-line no-restricted-syntax msg + args.map((a) => { var _a, _b; return (_b = (_a = a.toString) == null ? void 0 : _a.call(a)) != null ? _b : JSON.stringify(a); }).join(""), instance && instance.proxy, trace.map( ({ vnode }) => `at <${formatComponentName(instance, vnode.type)}>` ).join("\n"), trace ] ); } else { const warnArgs = [`[Vue warn]: ${msg}`, ...args]; if (trace.length && // avoid spamming console during tests true) { warnArgs.push(` `, ...formatTrace(trace)); } console.warn(...warnArgs); } resetTracking(); isWarning = false; } function getComponentTrace() { let currentVNode = stack[stack.length - 1]; if (!currentVNode) { return []; } const normalizedStack = []; while (currentVNode) { const last = normalizedStack[0]; if (last && last.vnode === currentVNode) { last.recurseCount++; } else { normalizedStack.push({ vnode: currentVNode, recurseCount: 0 }); } const parentInstance = currentVNode.component && currentVNode.component.parent; currentVNode = parentInstance && parentInstance.vnode; } return normalizedStack; } function formatTrace(trace) { const logs = []; trace.forEach((entry, i) => { logs.push(...i === 0 ? [] : [` `], ...formatTraceEntry(entry)); }); return logs; } function formatTraceEntry({ vnode, recurseCount }) { const postfix = recurseCount > 0 ? `... (${recurseCount} recursive calls)` : ``; const isRoot = vnode.component ? vnode.component.parent == null : false; const open = ` at <${formatComponentName( vnode.component, vnode.type, isRoot )}`; const close = `>` + postfix; return vnode.props ? [open, ...formatProps(vnode.props), close] : [open + close]; } function formatProps(props) { const res = []; const keys = Object.keys(props); keys.slice(0, 3).forEach((key) => { res.push(...formatProp(key, props[key])); }); if (keys.length > 3) { res.push(` ...`); } return res; } function formatProp(key, value, raw) { if (isString(value)) { value = JSON.stringify(value); return raw ? value : [`${key}=${value}`]; } else if (typeof value === "number" || typeof value === "boolean" || value == null) { return raw ? value : [`${key}=${value}`]; } else if (isRef(value)) { value = formatProp(key, toRaw(value.value), true); return raw ? value : [`${key}=Ref<`, value, `>`]; } else if (isFunction(value)) { return [`${key}=fn${value.name ? `<${value.name}>` : ``}`]; } else { value = toRaw(value); return raw ? value : [`${key}=`, value]; } } function callWithErrorHandling(fn, instance, type, args) { try { return args ? fn(...args) : fn(); } catch (err) { handleError(err, instance, type); } } function callWithAsyncErrorHandling(fn, instance, type, args) { if (isFunction(fn)) { const res = callWithErrorHandling(fn, instance, type, args); if (res && isPromise(res)) { res.catch((err) => { handleError(err, instance, type); }); } return res; } if (isArray(fn)) { const values = []; for (let i = 0; i < fn.length; i++) { values.push(callWithAsyncErrorHandling(fn[i], instance, type, args)); } return values; } } function handleError(err, instance, type, throwInDev = true) { const contextVNode = instance ? instance.vnode : null; const { errorHandler, throwUnhandledErrorInProduction } = instance && instance.appContext.config || EMPTY_OBJ; if (instance) { let cur = instance.parent; const exposedInstance = instance.proxy; const errorInfo = `https://vuejs.org/error-reference/#runtime-${type}`; while (cur) { const errorCapturedHooks = cur.ec; if (errorCapturedHooks) { for (let i = 0; i < errorCapturedHooks.length; i++) { if (errorCapturedHooks[i](err, exposedInstance, errorInfo) === false) { return; } } } cur = cur.parent; } if (errorHandler) { pauseTracking(); callWithErrorHandling(errorHandler, null, 10, [ err, exposedInstance, errorInfo ]); resetTracking(); return; } } logError(err, type, contextVNode, throwInDev, throwUnhandledErrorInProduction); } function logError(err, type, contextVNode, throwInDev = true, throwInProd = false) { if (throwInProd) { throw err; } else { console.error(err); } } const queue = []; let flushIndex = -1; const pendingPostFlushCbs = []; let activePostFlushCbs = null; let postFlushIndex = 0; const resolvedPromise = /* @__PURE__ */ Promise.resolve(); let currentFlushPromise = null; function nextTick(fn) { const p = currentFlushPromise || resolvedPromise; return fn ? p.then(this ? fn.bind(this) : fn) : p; } function findInsertionIndex(id) { let start = flushIndex + 1; let end = queue.length; while (start < end) { const middle = start + end >>> 1; const middleJob = queue[middle]; const middleJobId = getId(middleJob); if (middleJobId < id || middleJobId === id && middleJob.flags & 2) { start = middle + 1; } else { end = middle; } } return start; } function queueJob(job) { if (!(job.flags & 1)) { const jobId = getId(job); const lastJob = queue[queue.length - 1]; if (!lastJob || // fast path when the job id is larger than the tail !(job.flags & 2) && jobId >= getId(lastJob)) { queue.push(job); } else { queue.splice(findInsertionIndex(jobId), 0, job); } job.flags |= 1; queueFlush(); } } function queueFlush() { if (!currentFlushPromise) { currentFlushPromise = resolvedPromise.then(flushJobs); } } function queuePostFlushCb(cb) { if (!isArray(cb)) { if (activePostFlushCbs && cb.id === -1) { activePostFlushCbs.splice(postFlushIndex + 1, 0, cb); } else if (!(cb.flags & 1)) { pendingPostFlushCbs.push(cb); cb.flags |= 1; } } else { pendingPostFlushCbs.push(...cb); } queueFlush(); } function flushPreFlushCbs(instance, seen, i = flushIndex + 1) { for (; i < queue.length; i++) { const cb = queue[i]; if (cb && cb.flags & 2) { if (instance && cb.id !== instance.uid) { continue; } queue.splice(i, 1); i--; if (cb.flags & 4) { cb.flags &= -2; } cb(); if (!(cb.flags & 4)) { cb.flags &= -2; } } } } function flushPostFlushCbs(seen) { if (pendingPostFlushCbs.length) { const deduped = [...new Set(pendingPostFlushCbs)].sort( (a, b) => getId(a) - getId(b) ); pendingPostFlushCbs.length = 0; if (activePostFlushCbs) { activePostFlushCbs.push(...deduped); return; } activePostFlushCbs = deduped; for (postFlushIndex = 0; postFlushIndex < activePostFlushCbs.length; postFlushIndex++) { const cb = activePostFlushCbs[postFlushIndex]; if (cb.flags & 4) { cb.flags &= -2; } if (!(cb.flags & 8)) cb(); cb.flags &= -2; } activePostFlushCbs = null; postFlushIndex = 0; } } const getId = (job) => job.id == null ? job.flags & 2 ? -1 : Infinity : job.id; function flushJobs(seen) { try { for (flushIndex = 0; flushIndex < queue.length; flushIndex++) { const job = queue[flushIndex]; if (job && !(job.flags & 8)) { if (false) ; if (job.flags & 4) { job.flags &= ~1; } callWithErrorHandling( job, job.i, job.i ? 15 : 14 ); if (!(job.flags & 4)) { job.flags &= ~1; } } } } finally { for (; flushIndex < queue.length; flushIndex++) { const job = queue[flushIndex]; if (job) { job.flags &= -2; } } flushIndex = -1; queue.length = 0; flushPostFlushCbs(); currentFlushPromise = null; if (queue.length || pendingPostFlushCbs.length) { flushJobs(); } } } let currentRenderingInstance = null; let currentScopeId = null; function setCurrentRenderingInstance(instance) { const prev = currentRenderingInstance; currentRenderingInstance = instance; currentScopeId = instance && instance.type.__scopeId || null; return prev; } function withCtx(fn, ctx = currentRenderingInstance, isNonScopedSlot) { if (!ctx) return fn; if (fn._n) { return fn; } const renderFnWithContext = (...args) => { if (renderFnWithContext._d) { setBlockTracking(-1); } const prevInstance = setCurrentRenderingInstance(ctx); let res; try { res = fn(...args); } finally { setCurrentRenderingInstance(prevInstance); if (renderFnWithContext._d) { setBlockTracking(1); } } return res; }; renderFnWithContext._n = true; renderFnWithContext._c = true; renderFnWithContext._d = true; return renderFnWithContext; } function withDirectives(vnode, directives) { if (currentRenderingInstance === null) { return vnode; } const instance = getComponentPublicInstance(currentRenderingInstance); const bindings = vnode.dirs || (vnode.dirs = []); for (let i = 0; i < directives.length; i++) { let [dir, value, arg, modifiers = EMPTY_OBJ] = directives[i]; if (dir) { if (isFunction(dir)) { dir = { mounted: dir, updated: dir }; } if (dir.deep) { traverse(value); } bindings.push({ dir, instance, value, oldValue: void 0, arg, modifiers }); } } return vnode; } function invokeDirectiveHook(vnode, prevVNode, instance, name) { const bindings = vnode.dirs; const oldBindings = prevVNode && prevVNode.dirs; for (let i = 0; i < bindings.length; i++) { const binding = bindings[i]; if (oldBindings) { binding.oldValue = oldBindings[i].value; } let hook = binding.dir[name]; if (hook) { pauseTracking(); callWithAsyncErrorHandling(hook, instance, 8, [ vnode.el, binding, vnode, prevVNode ]); resetTracking(); } } } const TeleportEndKey = Symbol("_vte"); const isTeleport = (type) => type.__isTeleport; const leaveCbKey = Symbol("_leaveCb"); const enterCbKey = Symbol("_enterCb"); function useTransitionState() { const state = { isMounted: false, isLeaving: false, isUnmounting: false, leavingVNodes: /* @__PURE__ */ new Map() }; onMounted(() => { state.isMounted = true; }); onBeforeUnmount(() => { state.isUnmounting = true; }); return state; } const TransitionHookValidator = [Function, Array]; const BaseTransitionPropsValidators = { mode: String, appear: Boolean, persisted: Boolean, // enter onBeforeEnter: TransitionHookValidator, onEnter: TransitionHookValidator, onAfterEnter: TransitionHookValidator, onEnterCancelled: TransitionHookValidator, // leave onBeforeLeave: TransitionHookValidator, onLeave: TransitionHookValidator, onAfterLeave: TransitionHookValidator, onLeaveCancelled: TransitionHookValidator, // appear onBeforeAppear: TransitionHookValidator, onAppear: TransitionHookValidator, onAfterAppear: TransitionHookValidator, onAppearCancelled: TransitionHookValidator }; const recursiveGetSubtree = (instance) => { const subTree = instance.subTree; return subTree.component ? recursiveGetSubtree(subTree.component) : subTree; }; const BaseTransitionImpl = { name: `BaseTransition`, props: BaseTransitionPropsValidators, setup(props, { slots }) { const instance = getCurrentInstance(); const state = useTransitionState(); return () => { const children = slots.default && getTransitionRawChildren(slots.default(), true); if (!children || !children.length) { return; } const child = findNonCommentChild(children); const rawProps = toRaw(props); const { mode } = rawProps; if (state.isLeaving) { return emptyPlaceholder(child); } const innerChild = getInnerChild$1(child); if (!innerChild) { return emptyPlaceholder(child); } let enterHooks = resolveTransitionHooks( innerChild, rawProps, state, instance, // #11061, ensure enterHooks is fresh after clone (hooks) => enterHooks = hooks ); if (innerChild.type !== Comment) { setTransitionHooks(innerChild, enterHooks); } let oldInnerChild = instance.subTree && getInnerChild$1(instance.subTree); if (oldInnerChild && oldInnerChild.type !== Comment && !isSameVNodeType(oldInnerChild, innerChild) && recursiveGetSubtree(instance).type !== Comment) { let leavingHooks = resolveTransitionHooks( oldInnerChild, rawProps, state, instance ); setTransitionHooks(oldInnerChild, leavingHooks); if (mode === "out-in" && innerChild.type !== Comment) { state.isLeaving = true; leavingHooks.afterLeave = () => { state.isLeaving = false; if (!(instance.job.flags & 8)) { instance.update(); } delete leavingHooks.afterLeave; oldInnerChild = void 0; }; return emptyPlaceholder(child); } else if (mode === "in-out" && innerChild.type !== Comment) { leavingHooks.delayLeave = (el, earlyRemove, delayedLeave) => { const leavingVNodesCache = getLeavingNodesForType( state, oldInnerChild ); leavingVNodesCache[String(oldInnerChild.key)] = oldInnerChild; el[leaveCbKey] = () => { earlyRemove(); el[leaveCbKey] = void 0; delete enterHooks.delayedLeave; oldInnerChild = void 0; }; enterHooks.delayedLeave = () => { delayedLeave(); delete enterHooks.delayedLeave; oldInnerChild = void 0; }; }; } else { oldInnerChild = void 0; } } else if (oldInnerChild) { oldInnerChild = void 0; } return child; }; } }; function findNonCommentChild(children) { let child = children[0]; if (children.length > 1) { for (const c of children) { if (c.type !== Comment) { child = c; break; } } } return child; } const BaseTransition = BaseTransitionImpl; function getLeavingNodesForType(state, vnode) { const { leavingVNodes } = state; let leavingVNodesCache = leavingVNodes.get(vnode.type); if (!leavingVNodesCache) { leavingVNodesCache = /* @__PURE__ */ Object.create(null); leavingVNodes.set(vnode.type, leavingVNodesCache); } return leavingVNodesCache; } function resolveTransitionHooks(vnode, props, state, instance, postClone) { const { appear, mode, persisted = false, onBeforeEnter, onEnter, onAfterEnter, onEnterCancelled, onBeforeLeave, onLeave, onAfterLeave, onLeaveCancelled, onBeforeAppear, onAppear, onAfterAppear, onAppearCancelled } = props; const key = String(vnode.key); const leavingVNodesCache = getLeavingNodesForType(state, vnode); const callHook2 = (hook, args) => { hook && callWithAsyncErrorHandling( hook, instance, 9, args ); }; const callAsyncHook = (hook, args) => { const done = args[1]; callHook2(hook, args); if (isArray(hook)) { if (hook.every((hook2) => hook2.length <= 1)) done(); } else if (hook.length <= 1) { done(); } }; const hooks = { mode, persisted, beforeEnter(el) { let hook = onBeforeEnter; if (!state.isMounted) { if (appear) { hook = onBeforeAppear || onBeforeEnter; } else { return; } } if (el[leaveCbKey]) { el[leaveCbKey]( true /* cancelled */ ); } const leavingVNode = leavingVNodesCache[key]; if (leavingVNode && isSameVNodeType(vnode, leavingVNode) && leavingVNode.el[leaveCbKey]) { leavingVNode.el[leaveCbKey](); } callHook2(hook, [el]); }, enter(el) { let hook = onEnter; let afterHook = onAfterEnter; let cancelHook = onEnterCancelled; if (!state.isMounted) { if (appear) { hook = onAppear || onEnter; afterHook = onAfterAppear || onAfterEnter; cancelHook = onAppearCancelled || onEnterCancelled; } else { return; } } let called = false; const done = el[enterCbKey] = (cancelled) => { if (called) return; called = true; if (cancelled) { callHook2(cancelHook, [el]); } else { callHook2(afterHook, [el]); } if (hooks.delayedLeave) { hooks.delayedLeave(); } el[enterCbKey] = void 0; }; if (hook) { callAsyncHook(hook, [el, done]); } else { done(); } }, leave(el, remove2) { const key2 = String(vnode.key); if (el[enterCbKey]) { el[enterCbKey]( true /* cancelled */ ); } if (state.isUnmounting) { return remove2(); } callHook2(onBeforeLeave, [el]); let called = false; const done = el[leaveCbKey] = (cancelled) => { if (called) return; called = true; remove2(); if (cancelled) { callHook2(onLeaveCancelled, [el]); } else { callHook2(onAfterLeave, [el]); } el[leaveCbKey] = void 0; if (leavingVNodesCache[key2] === vnode) { delete leavingVNodesCache[key2]; } }; leavingVNodesCache[key2] = vnode; if (onLeave) { callAsyncHook(onLeave, [el, done]); } else { done(); } }, clone(vnode2) { const hooks2 = resolveTransitionHooks( vnode2, props, state, instance, postClone ); if (postClone) postClone(hooks2); return hooks2; } }; return hooks; } function emptyPlaceholder(vnode) { if (isKeepAlive(vnode)) { vnode = cloneVNode(vnode); vnode.children = null; return vnode; } } function getInnerChild$1(vnode) { if (!isKeepAlive(vnode)) { if (isTeleport(vnode.type) && vnode.children) { return findNonCommentChild(vnode.children); } return vnode; } if (vnode.component) { return vnode.component.subTree; } const { shapeFlag, children } = vnode; if (children) { if (shapeFlag & 16) { return children[0]; } if (shapeFlag & 32 && isFunction(children.default)) { return children.default(); } } } function setTransitionHooks(vnode, hooks) { if (vnode.shapeFlag & 6 && vnode.component) { vnode.transition = hooks; setTransitionHooks(vnode.component.subTree, hooks); } else if (vnode.shapeFlag & 128) { vnode.ssContent.transition = hooks.clone(vnode.ssContent); vnode.ssFallback.transition = hooks.clone(vnode.ssFallback); } else { vnode.transition = hooks; } } function getTransitionRawChildren(children, keepComment = false, parentKey) { let ret = []; let keyedFragmentCount = 0; for (let i = 0; i < children.length; i++) { let child = children[i]; const key = parentKey == null ? child.key : String(parentKey) + String(child.key != null ? child.key : i); if (child.type === Fragment) { if (child.patchFlag & 128) keyedFragmentCount++; ret = ret.concat( getTransitionRawChildren(child.children, keepComment, key) ); } else if (keepComment || child.type !== Comment) { ret.push(key != null ? cloneVNode(child, { key }) : child); } } if (keyedFragmentCount > 1) { for (let i = 0; i < ret.length; i++) { ret[i].patchFlag = -2; } } return ret; } function markAsyncBoundary(instance) { instance.ids = [instance.ids[0] + instance.ids[2]++ + "-", 0, 0]; } const pendingSetRefMap = /* @__PURE__ */ new WeakMap(); function setRef(rawRef, oldRawRef, parentSuspense, vnode, isUnmount = false) { if (isArray(rawRef)) { rawRef.forEach( (r, i) => setRef( r, oldRawRef && (isArray(oldRawRef) ? oldRawRef[i] : oldRawRef), parentSuspense, vnode, isUnmount ) ); return; } if (isAsyncWrapper(vnode) && !isUnmount) { if (vnode.shapeFlag & 512 && vnode.type.__asyncResolved && vnode.component.subTree.component) { setRef(rawRef, oldRawRef, parentSuspense, vnode.component.subTree); } return; } const refValue = vnode.shapeFlag & 4 ? getComponentPublicInstance(vnode.component) : vnode.el; const value = isUnmount ? null : refValue; const { i: owner, r: ref3 } = rawRef; const oldRef = oldRawRef && oldRawRef.r; const refs = owner.refs === EMPTY_OBJ ? owner.refs = {} : owner.refs; const setupState = owner.setupState; const rawSetupState = toRaw(setupState); const canSetSetupRef = setupState === EMPTY_OBJ ? NO : (key) => { return hasOwn(rawSetupState, key); }; if (oldRef != null && oldRef !== ref3) { invalidatePendingSetRef(oldRawRef); if (isString(oldRef)) { refs[oldRef] = null; if (canSetSetupRef(oldRef)) { setupState[oldRef] = null; } } else if (isRef(oldRef)) { { oldRef.value = null; } const oldRawRefAtom = oldRawRef; if (oldRawRefAtom.k) refs[oldRawRefAtom.k] = null; } } if (isFunction(ref3)) { callWithErrorHandling(ref3, owner, 12, [value, refs]); } else { const _isString = isString(ref3); const _isRef = isRef(ref3); if (_isString || _isRef) { const doSet = () => { if (rawRef.f) { const existing = _isString ? canSetSetupRef(ref3) ? setupState[ref3] : refs[ref3] : ref3.value ; if (isUnmount) { isArray(existing) && remove(existing, refValue); } else { if (!isArray(existing)) { if (_isString) { refs[ref3] = [refValue]; if (canSetSetupRef(ref3)) { setupState[ref3] = refs[ref3]; } } else { const newVal = [refValue]; { ref3.value = newVal; } if (rawRef.k) refs[rawRef.k] = newVal; } } else if (!existing.includes(refValue)) { existing.push(refValue); } } } else if (_isString) { refs[ref3] = value; if (canSetSetupRef(ref3)) { setupState[ref3] = value; } } else if (_isRef) { { ref3.value = value; } if (rawRef.k) refs[rawRef.k] = value; } else ; }; if (value) { const job = () => { doSet(); pendingSetRefMap.delete(rawRef); }; job.id = -1; pendingSetRefMap.set(rawRef, job); queuePostRenderEffect(job, parentSuspense); } else { invalidatePendingSetRef(rawRef); doSet(); } } } } function invalidatePendingSetRef(rawRef) { const pendingSetRef = pendingSetRefMap.get(rawRef); if (pendingSetRef) { pendingSetRef.flags |= 8; pendingSetRefMap.delete(rawRef); } } getGlobalThis().requestIdleCallback || ((cb) => setTimeout(cb, 1)); getGlobalThis().cancelIdleCallback || ((id) => clearTimeout(id)); const isAsyncWrapper = (i) => !!i.type.__asyncLoader; const isKeepAlive = (vnode) => vnode.type.__isKeepAlive; function onActivated(hook, target) { registerKeepAliveHook(hook, "a", target); } function onDeactivated(hook, target) { registerKeepAliveHook(hook, "da", target); } function registerKeepAliveHook(hook, type, target = currentInstance) { const wrappedHook = hook.__wdc || (hook.__wdc = () => { let current = target; while (current) { if (current.isDeactivated) { return; } current = current.parent; } return hook(); }); injectHook(type, wrappedHook, target); if (target) { let current = target.parent; while (current && current.parent) { if (isKeepAlive(current.parent.vnode)) { injectToKeepAliveRoot(wrappedHook, type, target, current); } current = current.parent; } } } function injectToKeepAliveRoot(hook, type, target, keepAliveRoot) { const injected = injectHook( type, hook, keepAliveRoot, true /* prepend */ ); onUnmounted(() => { remove(keepAliveRoot[type], injected); }, target); } function injectHook(type, hook, target = currentInstance, prepend = false) { if (target) { const hooks = target[type] || (target[type] = []); const wrappedHook = hook.__weh || (hook.__weh = (...args) => { pauseTracking(); const reset = setCurrentInstance(target); const res = callWithAsyncErrorHandling(hook, target, type, args); reset(); resetTracking(); return res; }); if (prepend) { hooks.unshift(wrappedHook); } else { hooks.push(wrappedHook); } return wrappedHook; } } const createHook = (lifecycle) => (hook, target = currentInstance) => { if (!isInSSRComponentSetup || lifecycle === "sp") { injectHook(lifecycle, (...args) => hook(...args), target); } }; const onBeforeMount = createHook("bm"); const onMounted = createHook("m"); const onBeforeUpdate = createHook( "bu" ); const onUpdated = createHook("u"); const onBeforeUnmount = createHook( "bum" ); const onUnmounted = createHook("um"); const onServerPrefetch = createHook( "sp" ); const onRenderTriggered = createHook("rtg"); const onRenderTracked = createHook("rtc"); function onErrorCaptured(hook, target = currentInstance) { injectHook("ec", hook, target); } const NULL_DYNAMIC_COMPONENT = Symbol.for("v-ndc"); function renderList(source, renderItem, cache, index) { let ret; const cached = cache; const sourceIsArray = isArray(source); if (sourceIsArray || isString(source)) { const sourceIsReactiveArray = sourceIsArray && isReactive(source); let needsWrap = false; let isReadonlySource = false; if (sourceIsReactiveArray) { needsWrap = !isShallow(source); isReadonlySource = isReadonly(source); source = shallowReadArray(source); } ret = new Array(source.length); for (let i = 0, l = source.length; i < l; i++) { ret[i] = renderItem( needsWrap ? isReadonlySource ? toReadonly(toReactive(source[i])) : toReactive(source[i]) : source[i], i, void 0, cached ); } } else if (typeof source === "number") { ret = new Array(source); for (let i = 0; i < source; i++) { ret[i] = renderItem(i + 1, i, void 0, cached); } } else if (isObject(source)) { if (source[Symbol.iterator]) { ret = Array.from( source, (item, i) => renderItem(item, i, void 0, cached) ); } else { const keys = Object.keys(source); ret = new Array(keys.length); for (let i = 0, l = keys.length; i < l; i++) { const key = keys[i]; ret[i] = renderItem(source[key], key, i, cached); } } } else { ret = []; } return ret; } function renderSlot(slots, name, props = {}, fallback, noSlotted) { if (currentRenderingInstance.ce || currentRenderingInstance.parent && isAsyncWrapper(currentRenderingInstance.parent) && currentRenderingInstance.parent.ce) { const hasProps = Object.keys(props).length > 0; return openBlock(), createBlock( Fragment, null, [createVNode("slot", props, fallback)], hasProps ? -2 : 64 ); } let slot = slots[name]; if (slot && slot._c) { slot._d = false; } openBlock(); const validSlotContent = slot && ensureValidVNode(slot(props)); const slotKey = props.key || // slot content array of a dynamic conditional slot may have a branch // key attached in the `createSlots` helper, respect that validSlotContent && validSlotContent.key; const rendered = createBlock( Fragment, { key: (slotKey && !isSymbol(slotKey) ? slotKey : `_${name}`) + // #7256 force differentiate fallback content from actual content (!validSlotContent && fallback ? "_fb" : "") }, validSlotContent || ([]), validSlotContent && slots._ === 1 ? 64 : -2 ); if (slot && slot._c) { slot._d = true; } return rendered; } function ensureValidVNode(vnodes) { return vnodes.some((child) => { if (!isVNode(child)) return true; if (child.type === Comment) return false; if (child.type === Fragment && !ensureValidVNode(child.children)) return false; return true; }) ? vnodes : null; } const getPublicInstance = (i) => { if (!i) return null; if (isStatefulComponent(i)) return getComponentPublicInstance(i); return getPublicInstance(i.parent); }; const publicPropertiesMap = ( // Move PURE marker to new line to workaround compiler discarding it // due to type annotation /* @__PURE__ */ extend(/* @__PURE__ */ Object.create(null), { $: (i) => i, $el: (i) => i.vnode.el, $data: (i) => i.data, $props: (i) => i.props, $attrs: (i) => i.attrs, $slots: (i) => i.slots, $refs: (i) => i.refs, $parent: (i) => getPublicInstance(i.parent), $root: (i) => getPublicInstance(i.root), $host: (i) => i.ce, $emit: (i) => i.emit, $options: (i) => resolveMergedOptions(i) , $forceUpdate: (i) => i.f || (i.f = () => { queueJob(i.update); }), $nextTick: (i) => i.n || (i.n = nextTick.bind(i.proxy)), $watch: (i) => instanceWatch.bind(i) }) ); const hasSetupBinding = (state, key) => state !== EMPTY_OBJ && !state.__isScriptSetup && hasOwn(state, key); const PublicInstanceProxyHandlers = { get({ _: instance }, key) { if (key === "__v_skip") { return true; } const { ctx, setupState, data, props, accessCache, type, appContext } = instance; let normalizedProps; if (key[0] !== "$") { const n = accessCache[key]; if (n !== void 0) { switch (n) { case 1: return setupState[key]; case 2: return data[key]; case 4: return ctx[key]; case 3: return props[key]; } } else if (hasSetupBinding(setupState, key)) { accessCache[key] = 1; return setupState[key]; } else if (data !== EMPTY_OBJ && hasOwn(data, key)) { accessCache[key] = 2; return data[key]; } else if ( // only cache other properties when instance has declared (thus stable) // props (normalizedProps = instance.propsOptions[0]) && hasOwn(normalizedProps, key) ) { accessCache[key] = 3; return props[key]; } else if (ctx !== EMPTY_OBJ && hasOwn(ctx, key)) { accessCache[key] = 4; return ctx[key]; } else if (shouldCacheAccess) { accessCache[key] = 0; } } const publicGetter = publicPropertiesMap[key]; let cssModule, globalProperties; if (publicGetter) { if (key === "$attrs") { track(instance.attrs, "get", ""); } return publicGetter(instance); } else if ( // css module (injected by vue-loader) (cssModule = type.__cssModules) && (cssModule = cssModule[key]) ) { return cssModule; } else if (ctx !== EMPTY_OBJ && hasOwn(ctx, key)) { accessCache[key] = 4; return ctx[key]; } else if ( // global properties globalProperties = appContext.config.globalProperties, hasOwn(globalProperties, key) ) { { return globalProperties[key]; } } else ; }, set({ _: instance }, key, value) { const { data, setupState, ctx } = instance; if (hasSetupBinding(setupState, key)) { setupState[key] = value; return true; } else if (data !== EMPTY_OBJ && hasOwn(data, key)) { data[key] = value; return true; } else if (hasOwn(instance.props, key)) { return false; } if (key[0] === "$" && key.slice(1) in instance) { return false; } else { { ctx[key] = value; } } return true; }, has({ _: { data, setupState, accessCache, ctx, appContext, propsOptions, type } }, key) { let normalizedProps, cssModules; return !!(accessCache[key] || data !== EMPTY_OBJ && key[0] !== "$" && hasOwn(data, key) || hasSetupBinding(setupState, key) || (normalizedProps = propsOptions[0]) && hasOwn(normalizedProps, key) || hasOwn(ctx, key) || hasOwn(publicPropertiesMap, key) || hasOwn(appContext.config.globalProperties, key) || (cssModules = type.__cssModules) && cssModules[key]); }, defineProperty(target, key, descriptor) { if (descriptor.get != null) { target._.accessCache[key] = 0; } else if (hasOwn(descriptor, "value")) { this.set(target, key, descriptor.value, null); } return Reflect.defineProperty(target, key, descriptor); } }; function normalizePropsOrEmits(props) { return isArray(props) ? props.reduce( (normalized, p) => (normalized[p] = null, normalized), {} ) : props; } let shouldCacheAccess = true; function applyOptions(instance) { const options = resolveMergedOptions(instance); const publicThis = instance.proxy; const ctx = instance.ctx; shouldCacheAccess = false; if (options.beforeCreate) { callHook$1(options.beforeCreate, instance, "bc"); } const { // state data: dataOptions, computed: computedOptions, methods, watch: watchOptions, provide: provideOptions, inject: injectOptions, // lifecycle created, beforeMount, mounted, beforeUpdate, updated, activated, deactivated, beforeDestroy, beforeUnmount, destroyed, unmounted, render, renderTracked, renderTriggered, errorCaptured, serverPrefetch, // public API expose, inheritAttrs, // assets components, directives, filters } = options; const checkDuplicateProperties = null; if (injectOptions) { resolveInjections(injectOptions, ctx, checkDuplicateProperties); } if (methods) { for (const key in methods) { const methodHandler = methods[key]; if (isFunction(methodHandler)) { { ctx[key] = methodHandler.bind(publicThis); } } } } if (dataOptions) { const data = dataOptions.call(publicThis, publicThis); if (!isObject(data)) ; else { instance.data = reactive(data); } } shouldCacheAccess = true; if (computedOptions) { for (const key in computedOptions) { const opt = computedOptions[key]; const get = isFunction(opt) ? opt.bind(publicThis, publicThis) : isFunction(opt.get) ? opt.get.bind(publicThis, publicThis) : NOOP; const set = !isFunction(opt) && isFunction(opt.set) ? opt.set.bind(publicThis) : NOOP; const c = computed({ get, set }); Object.defineProperty(ctx, key, { enumerable: true, configurable: true, get: () => c.value, set: (v) => c.value = v }); } } if (watchOptions) { for (const key in watchOptions) { createWatcher(watchOptions[key], ctx, publicThis, key); } } if (provideOptions) { const provides = isFunction(provideOptions) ? provideOptions.call(publicThis) : provideOptions; Reflect.ownKeys(provides).forEach((key) => { provide(key, provides[key]); }); } if (created) { callHook$1(created, instance, "c"); } function registerLifecycleHook(register, hook) { if (isArray(hook)) { hook.forEach((_hook) => register(_hook.bind(publicThis))); } else if (hook) { register(hook.bind(publicThis)); } } registerLifecycleHook(onBeforeMount, beforeMount); registerLifecycleHook(onMounted, mounted); registerLifecycleHook(onBeforeUpdate, beforeUpdate); registerLifecycleHook(onUpdated, updated); registerLifecycleHook(onActivated, activated); registerLifecycleHook(onDeactivated, deactivated); registerLifecycleHook(onErrorCaptured, errorCaptured); registerLifecycleHook(onRenderTracked, renderTracked); registerLifecycleHook(onRenderTriggered, renderTriggered); registerLifecycleHook(onBeforeUnmount, beforeUnmount); registerLifecycleHook(onUnmounted, unmounted); registerLifecycleHook(onServerPrefetch, serverPrefetch); if (isArray(expose)) { if (expose.length) { const exposed = instance.exposed || (instance.exposed = {}); expose.forEach((key) => { Object.defineProperty(exposed, key, { get: () => publicThis[key], set: (val) => publicThis[key] = val, enumerable: true }); }); } else if (!instance.exposed) { instance.exposed = {}; } } if (render && instance.render === NOOP) { instance.render = render; } if (inheritAttrs != null) { instance.inheritAttrs = inheritAttrs; } if (components) instance.components = components; if (directives) instance.directives = directives; if (serverPrefetch) { markAsyncBoundary(instance); } } function resolveInjections(injectOptions, ctx, checkDuplicateProperties = NOOP) { if (isArray(injectOptions)) { injectOptions = normalizeInject(injectOptions); } for (const key in injectOptions) { const opt = injectOptions[key]; let injected; if (isObject(opt)) { if ("default" in opt) { injected = inject( opt.from || key, opt.default, true ); } else { injected = inject(opt.from || key); } } else { injected = inject(opt); } if (isRef(injected)) { Object.defineProperty(ctx, key, { enumerable: true, configurable: true, get: () => injected.value, set: (v) => injected.value = v }); } else { ctx[key] = injected; } } } function callHook$1(hook, instance, type) { callWithAsyncErrorHandling( isArray(hook) ? hook.map((h2) => h2.bind(instance.proxy)) : hook.bind(instance.proxy), instance, type ); } function createWatcher(raw, ctx, publicThis, key) { let getter = key.includes(".") ? createPathGetter(publicThis, key) : () => publicThis[key]; if (isString(raw)) { const handler = ctx[raw]; if (isFunction(handler)) { { watch(getter, handler); } } } else if (isFunction(raw)) { { watch(getter, raw.bind(publicThis)); } } else if (isObject(raw)) { if (isArray(raw)) { raw.forEach((r) => createWatcher(r, ctx, publicThis, key)); } else { const handler = isFunction(raw.handler) ? raw.handler.bind(publicThis) : ctx[raw.handler]; if (isFunction(handler)) { watch(getter, handler, raw); } } } else ; } function resolveMergedOptions(instance) { const base = instance.type; const { mixins, extends: extendsOptions } = base; const { mixins: globalMixins, optionsCache: cache, config: { optionMergeStrategies } } = instance.appContext; const cached = cache.get(base); let resolved; if (cached) { resolved = cached; } else if (!globalMixins.length && !mixins && !extendsOptions) { { resolved = base; } } else { resolved = {}; if (globalMixins.length) { globalMixins.forEach( (m) => mergeOptions(resolved, m, optionMergeStrategies, true) ); } mergeOptions(resolved, base, optionMergeStrategies); } if (isObject(base)) { cache.set(base, resolved); } return resolved; } function mergeOptions(to, from, strats, asMixin = false) { const { mixins, extends: extendsOptions } = from; if (extendsOptions) { mergeOptions(to, extendsOptions, strats, true); } if (mixins) { mixins.forEach( (m) => mergeOptions(to, m, strats, true) ); } for (const key in from) { if (asMixin && key === "expose") ; else { const strat = internalOptionMergeStrats[key] || strats && strats[key]; to[key] = strat ? strat(to[key], from[key]) : from[key]; } } return to; } const internalOptionMergeStrats = { data: mergeDataFn, props: mergeEmitsOrPropsOptions, emits: mergeEmitsOrPropsOptions, // objects methods: mergeObjectOptions, computed: mergeObjectOptions, // lifecycle beforeCreate: mergeAsArray, created: mergeAsArray, beforeMount: mergeAsArray, mounted: mergeAsArray, beforeUpdate: mergeAsArray, updated: mergeAsArray, beforeDestroy: mergeAsArray, beforeUnmount: mergeAsArray, destroyed: mergeAsArray, unmounted: mergeAsArray, activated: mergeAsArray, deactivated: mergeAsArray, errorCaptured: mergeAsArray, serverPrefetch: mergeAsArray, // assets components: mergeObjectOptions, directives: mergeObjectOptions, // watch watch: mergeWatchOptions, // provide / inject provide: mergeDataFn, inject: mergeInject }; function mergeDataFn(to, from) { if (!from) { return to; } if (!to) { return from; } return function mergedDataFn() { return extend( isFunction(to) ? to.call(this, this) : to, isFunction(from) ? from.call(this, this) : from ); }; } function mergeInject(to, from) { return mergeObjectOptions(normalizeInject(to), normalizeInject(from)); } function normalizeInject(raw) { if (isArray(raw)) { const res = {}; for (let i = 0; i < raw.length; i++) { res[raw[i]] = raw[i]; } return res; } return raw; } function mergeAsArray(to, from) { return to ? [...new Set([].concat(to, from))] : from; } function mergeObjectOptions(to, from) { return to ? extend(/* @__PURE__ */ Object.create(null), to, from) : from; } function mergeEmitsOrPropsOptions(to, from) { if (to) { if (isArray(to) && isArray(from)) { return [.../* @__PURE__ */ new Set([...to, ...from])]; } return extend( /* @__PURE__ */ Object.create(null), normalizePropsOrEmits(to), normalizePropsOrEmits(from != null ? from : {}) ); } else { return from; } } function mergeWatchOptions(to, from) { if (!to) return from; if (!from) return to; const merged = extend(/* @__PURE__ */ Object.create(null), to); for (const key in from) { merged[key] = mergeAsArray(to[key], from[key]); } return merged; } function createAppContext() { return { app: null, config: { isNativeTag: NO, performance: false, globalProperties: {}, optionMergeStrategies: {}, errorHandler: void 0, warnHandler: void 0, compilerOptions: {} }, mixins: [], components: {}, directives: {}, provides: /* @__PURE__ */ Object.create(null), optionsCache: /* @__PURE__ */ new WeakMap(), propsCache: /* @__PURE__ */ new WeakMap(), emitsCache: /* @__PURE__ */ new WeakMap() }; } let uid$1 = 0; function createAppAPI(render, hydrate) { return function createApp(rootComponent, rootProps = null) { if (!isFunction(rootComponent)) { rootComponent = extend({}, rootComponent); } if (rootProps != null && !isObject(rootProps)) { rootProps = null; } const context = createAppContext(); const installedPlugins = /* @__PURE__ */ new WeakSet(); const pluginCleanupFns = []; let isMounted = false; const app = context.app = { _uid: uid$1++, _component: rootComponent, _props: rootProps, _container: null, _context: context, _instance: null, version, get config() { return context.config; }, set config(v) { }, use(plugin, ...options) { if (installedPlugins.has(plugin)) ; else if (plugin && isFunction(plugin.install)) { installedPlugins.add(plugin); plugin.install(app, ...options); } else if (isFunction(plugin)) { installedPlugins.add(plugin); plugin(app, ...options); } else ; return app; }, mixin(mixin) { { if (!context.mixins.includes(mixin)) { context.mixins.push(mixin); } } return app; }, component(name, component) { if (!component) { return context.components[name]; } context.components[name] = component; return app; }, directive(name, directive) { if (!directive) { return context.directives[name]; } context.directives[name] = directive; return app; }, mount(rootContainer, isHydrate, namespace) { if (!isMounted) { const vnode = app._ceVNode || createVNode(rootComponent, rootProps); vnode.appContext = context; if (namespace === true) { namespace = "svg"; } else if (namespace === false) { namespace = void 0; } { render(vnode, rootContainer, namespace); } isMounted = true; app._container = rootContainer; rootContainer.__vue_app__ = app; return getComponentPublicInstance(vnode.component); } }, onUnmount(cleanupFn) { pluginCleanupFns.push(cleanupFn); }, unmount() { if (isMounted) { callWithAsyncErrorHandling( pluginCleanupFns, app._instance, 16 ); render(null, app._container); delete app._container.__vue_app__; } }, provide(key, value) { context.provides[key] = value; return app; }, runWithContext(fn) { const lastApp = currentApp; currentApp = app; try { return fn(); } finally { currentApp = lastApp; } } }; return app; }; } let currentApp = null; function provide(key, value) { if (!currentInstance) ; else { let provides = currentInstance.provides; const parentProvides = currentInstance.parent && currentInstance.parent.provides; if (parentProvides === provides) { provides = currentInstance.provides = Object.create(parentProvides); } provides[key] = value; } } function inject(key, defaultValue, treatDefaultAsFactory = false) { const instance = getCurrentInstance(); if (instance || currentApp) { let provides = currentApp ? currentApp._context.provides : instance ? instance.parent == null || instance.ce ? instance.vnode.appContext && instance.vnode.appContext.provides : instance.parent.provides : void 0; if (provides && key in provides) { return provides[key]; } else if (arguments.length > 1) { return treatDefaultAsFactory && isFunction(defaultValue) ? defaultValue.call(instance && instance.proxy) : defaultValue; } else ; } } const internalObjectProto = {}; const createInternalObject = () => Object.create(internalObjectProto); const isInternalObject = (obj) => Object.getPrototypeOf(obj) === internalObjectProto; function initProps(instance, rawProps, isStateful, isSSR = false) { const props = {}; const attrs = createInternalObject(); instance.propsDefaults = /* @__PURE__ */ Object.create(null); setFullProps(instance, rawProps, props, attrs); for (const key in instance.propsOptions[0]) { if (!(key in props)) { props[key] = void 0; } } if (isStateful) { instance.props = isSSR ? props : shallowReactive(props); } else { if (!instance.type.props) { instance.props = attrs; } else { instance.props = props; } } instance.attrs = attrs; } function updateProps(instance, rawProps, rawPrevProps, optimized) { const { props, attrs, vnode: { patchFlag } } = instance; const rawCurrentProps = toRaw(props); const [options] = instance.propsOptions; let hasAttrsChanged = false; if ( // always force full diff in dev // - #1942 if hmr is enabled with sfc component // - vite#872 non-sfc component used by sfc component (optimized || patchFlag > 0) && !(patchFlag & 16) ) { if (patchFlag & 8) { const propsToUpdate = instance.vnode.dynamicProps; for (let i = 0; i < propsToUpdate.length; i++) { let key = propsToUpdate[i]; if (isEmitListener(instance.emitsOptions, key)) { continue; } const value = rawProps[key]; if (options) { if (hasOwn(attrs, key)) { if (value !== attrs[key]) { attrs[key] = value; hasAttrsChanged = true; } } else { const camelizedKey = camelize(key); props[camelizedKey] = resolvePropValue( options, rawCurrentProps, camelizedKey, value, instance, false ); } } else { if (value !== attrs[key]) { attrs[key] = value; hasAttrsChanged = true; } } } } } else { if (setFullProps(instance, rawProps, props, attrs)) { hasAttrsChanged = true; } let kebabKey; for (const key in rawCurrentProps) { if (!rawProps || // for camelCase !hasOwn(rawProps, key) && // it's possible the original props was passed in as kebab-case // and converted to camelCase (#955) ((kebabKey = hyphenate(key)) === key || !hasOwn(rawProps, kebabKey))) { if (options) { if (rawPrevProps && // for camelCase (rawPrevProps[key] !== void 0 || // for kebab-case rawPrevProps[kebabKey] !== void 0)) { props[key] = resolvePropValue( options, rawCurrentProps, key, void 0, instance, true ); } } else { delete props[key]; } } } if (attrs !== rawCurrentProps) { for (const key in attrs) { if (!rawProps || !hasOwn(rawProps, key) && true) { delete attrs[key]; hasAttrsChanged = true; } } } } if (hasAttrsChanged) { trigger(instance.attrs, "set", ""); } } function setFullProps(instance, rawProps, props, attrs) { const [options, needCastKeys] = instance.propsOptions; let hasAttrsChanged = false; let rawCastValues; if (rawProps) { for (let key in rawProps) { if (isReservedProp(key)) { continue; } const value = rawProps[key]; let camelKey; if (options && hasOwn(options, camelKey = camelize(key))) { if (!needCastKeys || !needCastKeys.includes(camelKey)) { props[camelKey] = value; } else { (rawCastValues || (rawCastValues = {}))[camelKey] = value; } } else if (!isEmitListener(instance.emitsOptions, key)) { if (!(key in attrs) || value !== attrs[key]) { attrs[key] = value; hasAttrsChanged = true; } } } } if (needCastKeys) { const rawCurrentProps = toRaw(props); const castValues = rawCastValues || EMPTY_OBJ; for (let i = 0; i < needCastKeys.length; i++) { const key = needCastKeys[i]; props[key] = resolvePropValue( options, rawCurrentProps, key, castValues[key], instance, !hasOwn(castValues, key) ); } } return hasAttrsChanged; } function resolvePropValue(options, props, key, value, instance, isAbsent) { const opt = options[key]; if (opt != null) { const hasDefault = hasOwn(opt, "default"); if (hasDefault && value === void 0) { const defaultValue = opt.default; if (opt.type !== Function && !opt.skipFactory && isFunction(defaultValue)) { const { propsDefaults } = instance; if (key in propsDefaults) { value = propsDefaults[key]; } else { const reset = setCurrentInstance(instance); value = propsDefaults[key] = defaultValue.call( null, props ); reset(); } } else { value = defaultValue; } if (instance.ce) { instance.ce._setProp(key, value); } } if (opt[ 0 /* shouldCast */ ]) { if (isAbsent && !hasDefault) { value = false; } else if (opt[ 1 /* shouldCastTrue */ ] && (value === "" || value === hyphenate(key))) { value = true; } } } return value; } const mixinPropsCache = /* @__PURE__ */ new WeakMap(); function normalizePropsOptions(comp, appContext, asMixin = false) { const cache = asMixin ? mixinPropsCache : appContext.propsCache; const cached = cache.get(comp); if (cached) { return cached; } const raw = comp.props; const normalized = {}; const needCastKeys = []; let hasExtends = false; if (!isFunction(comp)) { const extendProps = (raw2) => { hasExtends = true; const [props, keys] = normalizePropsOptions(raw2, appContext, true); extend(normalized, props); if (keys) needCastKeys.push(...keys); }; if (!asMixin && appContext.mixins.length) { appContext.mixins.forEach(extendProps); } if (comp.extends) { extendProps(comp.extends); } if (comp.mixins) { comp.mixins.forEach(extendProps); } } if (!raw && !hasExtends) { if (isObject(comp)) { cache.set(comp, EMPTY_ARR); } return EMPTY_ARR; } if (isArray(raw)) { for (let i = 0; i < raw.length; i++) { const normalizedKey = camelize(raw[i]); if (validatePropName(normalizedKey)) { normalized[normalizedKey] = EMPTY_OBJ; } } } else if (raw) { for (const key in raw) { const normalizedKey = camelize(key); if (validatePropName(normalizedKey)) { const opt = raw[key]; const prop = normalized[normalizedKey] = isArray(opt) || isFunction(opt) ? { type: opt } : extend({}, opt); const propType = prop.type; let shouldCast = false; let shouldCastTrue = true; if (isArray(propType)) { for (let index = 0; index < propType.length; ++index) { const type = propType[index]; const typeName = isFunction(type) && type.name; if (typeName === "Boolean") { shouldCast = true; break; } else if (typeName === "String") { shouldCastTrue = false; } } } else { shouldCast = isFunction(propType) && propType.name === "Boolean"; } prop[ 0 /* shouldCast */ ] = shouldCast; prop[ 1 /* shouldCastTrue */ ] = shouldCastTrue; if (shouldCast || hasOwn(prop, "default")) { needCastKeys.push(normalizedKey); } } } } const res = [normalized, needCastKeys]; if (isObject(comp)) { cache.set(comp, res); } return res; } function validatePropName(key) { if (key[0] !== "$" && !isReservedProp(key)) { return true; } return false; } const isInternalKey = (key) => key === "_" || key === "_ctx" || key === "$stable"; const normalizeSlotValue = (value) => isArray(value) ? value.map(normalizeVNode) : [normalizeVNode(value)]; const normalizeSlot = (key, rawSlot, ctx) => { if (rawSlot._n) { return rawSlot; } const normalized = withCtx((...args) => { if (false) ; return normalizeSlotValue(rawSlot(...args)); }, ctx); normalized._c = false; return normalized; }; const normalizeObjectSlots = (rawSlots, slots, instance) => { const ctx = rawSlots._ctx; for (const key in rawSlots) { if (isInternalKey(key)) continue; const value = rawSlots[key]; if (isFunction(value)) { slots[key] = normalizeSlot(key, value, ctx); } else if (value != null) { const normalized = normalizeSlotValue(value); slots[key] = () => normalized; } } }; const normalizeVNodeSlots = (instance, children) => { const normalized = normalizeSlotValue(children); instance.slots.default = () => normalized; }; const assignSlots = (slots, children, optimized) => { for (const key in children) { if (optimized || !isInternalKey(key)) { slots[key] = children[key]; } } }; const initSlots = (instance, children, optimized) => { const slots = instance.slots = createInternalObject(); if (instance.vnode.shapeFlag & 32) { const type = children._; if (type) { assignSlots(slots, children, optimized); if (optimized) { def(slots, "_", type, true); } } else { normalizeObjectSlots(children, slots); } } else if (children) { normalizeVNodeSlots(instance, children); } }; const updateSlots = (instance, children, optimized) => { const { vnode, slots } = instance; let needDeletionCheck = true; let deletionComparisonTarget = EMPTY_OBJ; if (vnode.shapeFlag & 32) { const type = children._; if (type) { if (optimized && type === 1) { needDeletionCheck = false; } else { assignSlots(slots, children, optimized); } } else { needDeletionCheck = !children.$stable; normalizeObjectSlots(children, slots); } deletionComparisonTarget = children; } else if (children) { normalizeVNodeSlots(instance, children); deletionComparisonTarget = { default: 1 }; } if (needDeletionCheck) { for (const key in slots) { if (!isInternalKey(key) && deletionComparisonTarget[key] == null) { delete slots[key]; } } } }; const queuePostRenderEffect = queueEffectWithSuspense; function createRenderer(options) { return baseCreateRenderer(options); } function baseCreateRenderer(options, createHydrationFns) { const target = getGlobalThis(); target.__VUE__ = true; const { insert: hostInsert, remove: hostRemove, patchProp: hostPatchProp, createElement: hostCreateElement, createText: hostCreateText, createComment: hostCreateComment, setText: hostSetText, setElementText: hostSetElementText, parentNode: hostParentNode, nextSibling: hostNextSibling, setScopeId: hostSetScopeId = NOOP, insertStaticContent: hostInsertStaticContent } = options; const patch = (n1, n2, container, anchor = null, parentComponent = null, parentSuspense = null, namespace = void 0, slotScopeIds = null, optimized = !!n2.dynamicChildren) => { if (n1 === n2) { return; } if (n1 && !isSameVNodeType(n1, n2)) { anchor = getNextHostNode(n1); unmount(n1, parentComponent, parentSuspense, true); n1 = null; } if (n2.patchFlag === -2) { optimized = false; n2.dynamicChildren = null; } const { type, ref: ref3, shapeFlag } = n2; switch (type) { case Text: processText(n1, n2, container, anchor); break; case Comment: processCommentNode(n1, n2, container, anchor); break; case Static: if (n1 == null) { mountStaticNode(n2, container, anchor, namespace); } break; case Fragment: processFragment( n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized ); break; default: if (shapeFlag & 1) { processElement( n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized ); } else if (shapeFlag & 6) { processComponent( n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized ); } else if (shapeFlag & 64) { type.process( n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized, internals ); } else if (shapeFlag & 128) { type.process( n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized, internals ); } else ; } if (ref3 != null && parentComponent) { setRef(ref3, n1 && n1.ref, parentSuspense, n2 || n1, !n2); } else if (ref3 == null && n1 && n1.ref != null) { setRef(n1.ref, null, parentSuspense, n1, true); } }; const processText = (n1, n2, container, anchor) => { if (n1 == null) { hostInsert( n2.el = hostCreateText(n2.children), container, anchor ); } else { const el = n2.el = n1.el; if (n2.children !== n1.children) { hostSetText(el, n2.children); } } }; const processCommentNode = (n1, n2, container, anchor) => { if (n1 == null) { hostInsert( n2.el = hostCreateComment(n2.children || ""), container, anchor ); } else { n2.el = n1.el; } }; const mountStaticNode = (n2, container, anchor, namespace) => { [n2.el, n2.anchor] = hostInsertStaticContent( n2.children, container, anchor, namespace, n2.el, n2.anchor ); }; const moveStaticNode = ({ el, anchor }, container, nextSibling) => { let next; while (el && el !== anchor) { next = hostNextSibling(el); hostInsert(el, container, nextSibling); el = next; } hostInsert(anchor, container, nextSibling); }; const removeStaticNode = ({ el, anchor }) => { let next; while (el && el !== anchor) { next = hostNextSibling(el); hostRemove(el); el = next; } hostRemove(anchor); }; const processElement = (n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => { if (n2.type === "svg") { namespace = "svg"; } else if (n2.type === "math") { namespace = "mathml"; } if (n1 == null) { mountElement( n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized ); } else { patchElement( n1, n2, parentComponent, parentSuspense, namespace, slotScopeIds, optimized ); } }; const mountElement = (vnode, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => { let el; let vnodeHook; const { props, shapeFlag, transition, dirs } = vnode; el = vnode.el = hostCreateElement( vnode.type, namespace, props && props.is, props ); if (shapeFlag & 8) { hostSetElementText(el, vnode.children); } else if (shapeFlag & 16) { mountChildren( vnode.children, el, null, parentComponent, parentSuspense, resolveChildrenNamespace(vnode, namespace), slotScopeIds, optimized ); } if (dirs) { invokeDirectiveHook(vnode, null, parentComponent, "created"); } setScopeId(el, vnode, vnode.scopeId, slotScopeIds, parentComponent); if (props) { for (const key in props) { if (key !== "value" && !isReservedProp(key)) { hostPatchProp(el, key, null, props[key], namespace, parentComponent); } } if ("value" in props) { hostPatchProp(el, "value", null, props.value, namespace); } if (vnodeHook = props.onVnodeBeforeMount) { invokeVNodeHook(vnodeHook, parentComponent, vnode); } } if (dirs) { invokeDirectiveHook(vnode, null, parentComponent, "beforeMount"); } const needCallTransitionHooks = needTransition(parentSuspense, transition); if (needCallTransitionHooks) { transition.beforeEnter(el); } hostInsert(el, container, anchor); if ((vnodeHook = props && props.onVnodeMounted) || needCallTransitionHooks || dirs) { queuePostRenderEffect(() => { vnodeHook && invokeVNodeHook(vnodeHook, parentComponent, vnode); needCallTransitionHooks && transition.enter(el); dirs && invokeDirectiveHook(vnode, null, parentComponent, "mounted"); }, parentSuspense); } }; const setScopeId = (el, vnode, scopeId, slotScopeIds, parentComponent) => { if (scopeId) { hostSetScopeId(el, scopeId); } if (slotScopeIds) { for (let i = 0; i < slotScopeIds.length; i++) { hostSetScopeId(el, slotScopeIds[i]); } } if (parentComponent) { let subTree = parentComponent.subTree; if (vnode === subTree || isSuspense(subTree.type) && (subTree.ssContent === vnode || subTree.ssFallback === vnode)) { const parentVNode = parentComponent.vnode; setScopeId( el, parentVNode, parentVNode.scopeId, parentVNode.slotScopeIds, parentComponent.parent ); } } }; const mountChildren = (children, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized, start = 0) => { for (let i = start; i < children.length; i++) { const child = children[i] = optimized ? cloneIfMounted(children[i]) : normalizeVNode(children[i]); patch( null, child, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized ); } }; const patchElement = (n1, n2, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => { const el = n2.el = n1.el; let { patchFlag, dynamicChildren, dirs } = n2; patchFlag |= n1.patchFlag & 16; const oldProps = n1.props || EMPTY_OBJ; const newProps = n2.props || EMPTY_OBJ; let vnodeHook; parentComponent && toggleRecurse(parentComponent, false); if (vnodeHook = newProps.onVnodeBeforeUpdate) { invokeVNodeHook(vnodeHook, parentComponent, n2, n1); } if (dirs) { invokeDirectiveHook(n2, n1, parentComponent, "beforeUpdate"); } parentComponent && toggleRecurse(parentComponent, true); if (oldProps.innerHTML && newProps.innerHTML == null || oldProps.textContent && newProps.textContent == null) { hostSetElementText(el, ""); } if (dynamicChildren) { patchBlockChildren( n1.dynamicChildren, dynamicChildren, el, parentComponent, parentSuspense, resolveChildrenNamespace(n2, namespace), slotScopeIds ); } else if (!optimized) { patchChildren( n1, n2, el, null, parentComponent, parentSuspense, resolveChildrenNamespace(n2, namespace), slotScopeIds, false ); } if (patchFlag > 0) { if (patchFlag & 16) { patchProps(el, oldProps, newProps, parentComponent, namespace); } else { if (patchFlag & 2) { if (oldProps.class !== newProps.class) { hostPatchProp(el, "class", null, newProps.class, namespace); } } if (patchFlag & 4) { hostPatchProp(el, "style", oldProps.style, newProps.style, namespace); } if (patchFlag & 8) { const propsToUpdate = n2.dynamicProps; for (let i = 0; i < propsToUpdate.length; i++) { const key = propsToUpdate[i]; const prev = oldProps[key]; const next = newProps[key]; if (next !== prev || key === "value") { hostPatchProp(el, key, prev, next, namespace, parentComponent); } } } } if (patchFlag & 1) { if (n1.children !== n2.children) { hostSetElementText(el, n2.children); } } } else if (!optimized && dynamicChildren == null) { patchProps(el, oldProps, newProps, parentComponent, namespace); } if ((vnodeHook = newProps.onVnodeUpdated) || dirs) { queuePostRenderEffect(() => { vnodeHook && invokeVNodeHook(vnodeHook, parentComponent, n2, n1); dirs && invokeDirectiveHook(n2, n1, parentComponent, "updated"); }, parentSuspense); } }; const patchBlockChildren = (oldChildren, newChildren, fallbackContainer, parentComponent, parentSuspense, namespace, slotScopeIds) => { for (let i = 0; i < newChildren.length; i++) { const oldVNode = oldChildren[i]; const newVNode = newChildren[i]; const container = ( // oldVNode may be an errored async setup() component inside Suspense // which will not have a mounted element oldVNode.el && // - In the case of a Fragment, we need to provide the actual parent // of the Fragment itself so it can move its children. (oldVNode.type === Fragment || // - In the case of different nodes, there is going to be a replacement // which also requires the correct parent container !isSameVNodeType(oldVNode, newVNode) || // - In the case of a component, it could contain anything. oldVNode.shapeFlag & (6 | 64 | 128)) ? hostParentNode(oldVNode.el) : ( // In other cases, the parent container is not actually used so we // just pass the block element here to avoid a DOM parentNode call. fallbackContainer ) ); patch( oldVNode, newVNode, container, null, parentComponent, parentSuspense, namespace, slotScopeIds, true ); } }; const patchProps = (el, oldProps, newProps, parentComponent, namespace) => { if (oldProps !== newProps) { if (oldProps !== EMPTY_OBJ) { for (const key in oldProps) { if (!isReservedProp(key) && !(key in newProps)) { hostPatchProp( el, key, oldProps[key], null, namespace, parentComponent ); } } } for (const key in newProps) { if (isReservedProp(key)) continue; const next = newProps[key]; const prev = oldProps[key]; if (next !== prev && key !== "value") { hostPatchProp(el, key, prev, next, namespace, parentComponent); } } if ("value" in newProps) { hostPatchProp(el, "value", oldProps.value, newProps.value, namespace); } } }; const processFragment = (n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => { const fragmentStartAnchor = n2.el = n1 ? n1.el : hostCreateText(""); const fragmentEndAnchor = n2.anchor = n1 ? n1.anchor : hostCreateText(""); let { patchFlag, dynamicChildren, slotScopeIds: fragmentSlotScopeIds } = n2; if (fragmentSlotScopeIds) { slotScopeIds = slotScopeIds ? slotScopeIds.concat(fragmentSlotScopeIds) : fragmentSlotScopeIds; } if (n1 == null) { hostInsert(fragmentStartAnchor, container, anchor); hostInsert(fragmentEndAnchor, container, anchor); mountChildren( // #10007 // such fragment like `<></>` will be compiled into // a fragment which doesn't have a children. // In this case fallback to an empty array n2.children || [], container, fragmentEndAnchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized ); } else { if (patchFlag > 0 && patchFlag & 64 && dynamicChildren && // #2715 the previous fragment could've been a BAILed one as a result // of renderSlot() with no valid children n1.dynamicChildren) { patchBlockChildren( n1.dynamicChildren, dynamicChildren, container, parentComponent, parentSuspense, namespace, slotScopeIds ); if ( // #2080 if the stable fragment has a key, it's a <template v-for> that may // get moved around. Make sure all root level vnodes inherit el. // #2134 or if it's a component root, it may also get moved around // as the component is being moved. n2.key != null || parentComponent && n2 === parentComponent.subTree ) { traverseStaticChildren( n1, n2, true /* shallow */ ); } } else { patchChildren( n1, n2, container, fragmentEndAnchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized ); } } }; const processComponent = (n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => { n2.slotScopeIds = slotScopeIds; if (n1 == null) { if (n2.shapeFlag & 512) { parentComponent.ctx.activate( n2, container, anchor, namespace, optimized ); } else { mountComponent( n2, container, anchor, parentComponent, parentSuspense, namespace, optimized ); } } else { updateComponent(n1, n2, optimized); } }; const mountComponent = (initialVNode, container, anchor, parentComponent, parentSuspense, namespace, optimized) => { const instance = initialVNode.component = createComponentInstance( initialVNode, parentComponent, parentSuspense ); if (isKeepAlive(initialVNode)) { instance.ctx.renderer = internals; } { setupComponent(instance, false, optimized); } if (instance.asyncDep) { parentSuspense && parentSuspense.registerDep(instance, setupRenderEffect, optimized); if (!initialVNode.el) { const placeholder = instance.subTree = createVNode(Comment); processCommentNode(null, placeholder, container, anchor); initialVNode.placeholder = placeholder.el; } } else { setupRenderEffect( instance, initialVNode, container, anchor, parentSuspense, namespace, optimized ); } }; const updateComponent = (n1, n2, optimized) => { const instance = n2.component = n1.component; if (shouldUpdateComponent(n1, n2, optimized)) { if (instance.asyncDep && !instance.asyncResolved) { updateComponentPreRender(instance, n2, optimized); return; } else { instance.next = n2; instance.update(); } } else { n2.el = n1.el; instance.vnode = n2; } }; const setupRenderEffect = (instance, initialVNode, container, anchor, parentSuspense, namespace, optimized) => { const componentUpdateFn = () => { if (!instance.isMounted) { let vnodeHook; const { el, props } = initialVNode; const { bm, m, parent, root, type } = instance; const isAsyncWrapperVNode = isAsyncWrapper(initialVNode); toggleRecurse(instance, false); if (bm) { invokeArrayFns(bm); } if (!isAsyncWrapperVNode && (vnodeHook = props && props.onVnodeBeforeMount)) { invokeVNodeHook(vnodeHook, parent, initialVNode); } toggleRecurse(instance, true); { if (root.ce && // @ts-expect-error _def is private root.ce._def.shadowRoot !== false) { root.ce._injectChildStyle(type); } const subTree = instance.subTree = renderComponentRoot(instance); patch( null, subTree, container, anchor, instance, parentSuspense, namespace ); initialVNode.el = subTree.el; } if (m) { queuePostRenderEffect(m, parentSuspense); } if (!isAsyncWrapperVNode && (vnodeHook = props && props.onVnodeMounted)) { const scopedInitialVNode = initialVNode; queuePostRenderEffect( () => invokeVNodeHook(vnodeHook, parent, scopedInitialVNode), parentSuspense ); } if (initialVNode.shapeFlag & 256 || parent && isAsyncWrapper(parent.vnode) && parent.vnode.shapeFlag & 256) { instance.a && queuePostRenderEffect(instance.a, parentSuspense); } instance.isMounted = true; initialVNode = container = anchor = null; } else { let { next, bu, u, parent, vnode } = instance; { const nonHydratedAsyncRoot = locateNonHydratedAsyncRoot(instance); if (nonHydratedAsyncRoot) { if (next) { next.el = vnode.el; updateComponentPreRender(instance, next, optimized); } nonHydratedAsyncRoot.asyncDep.then(() => { if (!instance.isUnmounted) { componentUpdateFn(); } }); return; } } let originNext = next; let vnodeHook; toggleRecurse(instance, false); if (next) { next.el = vnode.el; updateComponentPreRender(instance, next, optimized); } else { next = vnode; } if (bu) { invokeArrayFns(bu); } if (vnodeHook = next.props && next.props.onVnodeBeforeUpdate) { invokeVNodeHook(vnodeHook, parent, next, vnode); } toggleRecurse(instance, true); const nextTree = renderComponentRoot(instance); const prevTree = instance.subTree; instance.subTree = nextTree; patch( prevTree, nextTree, // parent may have changed if it's in a teleport hostParentNode(prevTree.el), // anchor may have changed if it's in a fragment getNextHostNode(prevTree), instance, parentSuspense, namespace ); next.el = nextTree.el; if (originNext === null) { updateHOCHostEl(instance, nextTree.el); } if (u) { queuePostRenderEffect(u, parentSuspense); } if (vnodeHook = next.props && next.props.onVnodeUpdated) { queuePostRenderEffect( () => invokeVNodeHook(vnodeHook, parent, next, vnode), parentSuspense ); } } }; instance.scope.on(); const effect2 = instance.effect = new ReactiveEffect(componentUpdateFn); instance.scope.off(); const update = instance.update = effect2.run.bind(effect2); const job = instance.job = effect2.runIfDirty.bind(effect2); job.i = instance; job.id = instance.uid; effect2.scheduler = () => queueJob(job); toggleRecurse(instance, true); update(); }; const updateComponentPreRender = (instance, nextVNode, optimized) => { nextVNode.component = instance; const prevProps = instance.vnode.props; instance.vnode = nextVNode; instance.next = null; updateProps(instance, nextVNode.props, prevProps, optimized); updateSlots(instance, nextVNode.children, optimized); pauseTracking(); flushPreFlushCbs(instance); resetTracking(); }; const patchChildren = (n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized = false) => { const c1 = n1 && n1.children; const prevShapeFlag = n1 ? n1.shapeFlag : 0; const c2 = n2.children; const { patchFlag, shapeFlag } = n2; if (patchFlag > 0) { if (patchFlag & 128) { patchKeyedChildren( c1, c2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized ); return; } else if (patchFlag & 256) { patchUnkeyedChildren( c1, c2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized ); return; } } if (shapeFlag & 8) { if (prevShapeFlag & 16) { unmountChildren(c1, parentComponent, parentSuspense); } if (c2 !== c1) { hostSetElementText(container, c2); } } else { if (prevShapeFlag & 16) { if (shapeFlag & 16) { patchKeyedChildren( c1, c2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized ); } else { unmountChildren(c1, parentComponent, parentSuspense, true); } } else { if (prevShapeFlag & 8) { hostSetElementText(container, ""); } if (shapeFlag & 16) { mountChildren( c2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized ); } } } }; const patchUnkeyedChildren = (c1, c2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => { c1 = c1 || EMPTY_ARR; c2 = c2 || EMPTY_ARR; const oldLength = c1.length; const newLength = c2.length; const commonLength = Math.min(oldLength, newLength); let i; for (i = 0; i < commonLength; i++) { const nextChild = c2[i] = optimized ? cloneIfMounted(c2[i]) : normalizeVNode(c2[i]); patch( c1[i], nextChild, container, null, parentComponent, parentSuspense, namespace, slotScopeIds, optimized ); } if (oldLength > newLength) { unmountChildren( c1, parentComponent, parentSuspense, true, false, commonLength ); } else { mountChildren( c2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized, commonLength ); } }; const patchKeyedChildren = (c1, c2, container, parentAnchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => { let i = 0; const l2 = c2.length; let e1 = c1.length - 1; let e2 = l2 - 1; while (i <= e1 && i <= e2) { const n1 = c1[i]; const n2 = c2[i] = optimized ? cloneIfMounted(c2[i]) : normalizeVNode(c2[i]); if (isSameVNodeType(n1, n2)) { patch( n1, n2, container, null, parentComponent, parentSuspense, namespace, slotScopeIds, optimized ); } else { break; } i++; } while (i <= e1 && i <= e2) { const n1 = c1[e1]; const n2 = c2[e2] = optimized ? cloneIfMounted(c2[e2]) : normalizeVNode(c2[e2]); if (isSameVNodeType(n1, n2)) { patch( n1, n2, container, null, parentComponent, parentSuspense, namespace, slotScopeIds, optimized ); } else { break; } e1--; e2--; } if (i > e1) { if (i <= e2) { const nextPos = e2 + 1; const anchor = nextPos < l2 ? c2[nextPos].el : parentAnchor; while (i <= e2) { patch( null, c2[i] = optimized ? cloneIfMounted(c2[i]) : normalizeVNode(c2[i]), container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized ); i++; } } } else if (i > e2) { while (i <= e1) { unmount(c1[i], parentComponent, parentSuspense, true); i++; } } else { const s1 = i; const s2 = i; const keyToNewIndexMap = /* @__PURE__ */ new Map(); for (i = s2; i <= e2; i++) { const nextChild = c2[i] = optimized ? cloneIfMounted(c2[i]) : normalizeVNode(c2[i]); if (nextChild.key != null) { keyToNewIndexMap.set(nextChild.key, i); } } let j; let patched = 0; const toBePatched = e2 - s2 + 1; let moved = false; let maxNewIndexSoFar = 0; const newIndexToOldIndexMap = new Array(toBePatched); for (i = 0; i < toBePatched; i++) newIndexToOldIndexMap[i] = 0; for (i = s1; i <= e1; i++) { const prevChild = c1[i]; if (patched >= toBePatched) { unmount(prevChild, parentComponent, parentSuspense, true); continue; } let newIndex; if (prevChild.key != null) { newIndex = keyToNewIndexMap.get(prevChild.key); } else { for (j = s2; j <= e2; j++) { if (newIndexToOldIndexMap[j - s2] === 0 && isSameVNodeType(prevChild, c2[j])) { newIndex = j; break; } } } if (newIndex === void 0) { unmount(prevChild, parentComponent, parentSuspense, true); } else { newIndexToOldIndexMap[newIndex - s2] = i + 1; if (newIndex >= maxNewIndexSoFar) { maxNewIndexSoFar = newIndex; } else { moved = true; } patch( prevChild, c2[newIndex], container, null, parentComponent, parentSuspense, namespace, slotScopeIds, optimized ); patched++; } } const increasingNewIndexSequence = moved ? getSequence(newIndexToOldIndexMap) : EMPTY_ARR; j = increasingNewIndexSequence.length - 1; for (i = toBePatched - 1; i >= 0; i--) { const nextIndex = s2 + i; const nextChild = c2[nextIndex]; const anchorVNode = c2[nextIndex + 1]; const anchor = nextIndex + 1 < l2 ? ( // #13559, fallback to el placeholder for unresolved async component anchorVNode.el || anchorVNode.placeholder ) : parentAnchor; if (newIndexToOldIndexMap[i] === 0) { patch( null, nextChild, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized ); } else if (moved) { if (j < 0 || i !== increasingNewIndexSequence[j]) { move(nextChild, container, anchor, 2); } else { j--; } } } } }; const move = (vnode, container, anchor, moveType, parentSuspense = null) => { const { el, type, transition, children, shapeFlag } = vnode; if (shapeFlag & 6) { move(vnode.component.subTree, container, anchor, moveType); return; } if (shapeFlag & 128) { vnode.suspense.move(container, anchor, moveType); return; } if (shapeFlag & 64) { type.move(vnode, container, anchor, internals); return; } if (type === Fragment) { hostInsert(el, container, anchor); for (let i = 0; i < children.length; i++) { move(children[i], container, anchor, moveType); } hostInsert(vnode.anchor, container, anchor); return; } if (type === Static) { moveStaticNode(vnode, container, anchor); return; } const needTransition2 = moveType !== 2 && shapeFlag & 1 && transition; if (needTransition2) { if (moveType === 0) { transition.beforeEnter(el); hostInsert(el, container, anchor); queuePostRenderEffect(() => transition.enter(el), parentSuspense); } else { const { leave, delayLeave, afterLeave } = transition; const remove22 = () => { if (vnode.ctx.isUnmounted) { hostRemove(el); } else { hostInsert(el, container, anchor); } }; const performLeave = () => { if (el._isLeaving) { el[leaveCbKey]( true /* cancelled */ ); } leave(el, () => { remove22(); afterLeave && afterLeave(); }); }; if (delayLeave) { delayLeave(el, remove22, performLeave); } else { performLeave(); } } } else { hostInsert(el, container, anchor); } }; const unmount = (vnode, parentComponent, parentSuspense, doRemove = false, optimized = false) => { const { type, props, ref: ref3, children, dynamicChildren, shapeFlag, patchFlag, dirs, cacheIndex } = vnode; if (patchFlag === -2) { optimized = false; } if (ref3 != null) { pauseTracking(); setRef(ref3, null, parentSuspense, vnode, true); resetTracking(); } if (cacheIndex != null) { parentComponent.renderCache[cacheIndex] = void 0; } if (shapeFlag & 256) { parentComponent.ctx.deactivate(vnode); return; } const shouldInvokeDirs = shapeFlag & 1 && dirs; const shouldInvokeVnodeHook = !isAsyncWrapper(vnode); let vnodeHook; if (shouldInvokeVnodeHook && (vnodeHook = props && props.onVnodeBeforeUnmount)) { invokeVNodeHook(vnodeHook, parentComponent, vnode); } if (shapeFlag & 6) { unmountComponent(vnode.component, parentSuspense, doRemove); } else { if (shapeFlag & 128) { vnode.suspense.unmount(parentSuspense, doRemove); return; } if (shouldInvokeDirs) { invokeDirectiveHook(vnode, null, parentComponent, "beforeUnmount"); } if (shapeFlag & 64) { vnode.type.remove( vnode, parentComponent, parentSuspense, internals, doRemove ); } else if (dynamicChildren && // #5154 // when v-once is used inside a block, setBlockTracking(-1) marks the // parent block with hasOnce: true // so that it doesn't take the fast path during unmount - otherwise // components nested in v-once are never unmounted. !dynamicChildren.hasOnce && // #1153: fast path should not be taken for non-stable (v-for) fragments (type !== Fragment || patchFlag > 0 && patchFlag & 64)) { unmountChildren( dynamicChildren, parentComponent, parentSuspense, false, true ); } else if (type === Fragment && patchFlag & (128 | 256) || !optimized && shapeFlag & 16) { unmountChildren(children, parentComponent, parentSuspense); } if (doRemove) { remove2(vnode); } } if (shouldInvokeVnodeHook && (vnodeHook = props && props.onVnodeUnmounted) || shouldInvokeDirs) { queuePostRenderEffect(() => { vnodeHook && invokeVNodeHook(vnodeHook, parentComponent, vnode); shouldInvokeDirs && invokeDirectiveHook(vnode, null, parentComponent, "unmounted"); }, parentSuspense); } }; const remove2 = (vnode) => { const { type, el, anchor, transition } = vnode; if (type === Fragment) { { removeFragment(el, anchor); } return; } if (type === Static) { removeStaticNode(vnode); return; } const performRemove = () => { hostRemove(el); if (transition && !transition.persisted && transition.afterLeave) { transition.afterLeave(); } }; if (vnode.shapeFlag & 1 && transition && !transition.persisted) { const { leave, delayLeave } = transition; const performLeave = () => leave(el, performRemove); if (delayLeave) { delayLeave(vnode.el, performRemove, performLeave); } else { performLeave(); } } else { performRemove(); } }; const removeFragment = (cur, end) => { let next; while (cur !== end) { next = hostNextSibling(cur); hostRemove(cur); cur = next; } hostRemove(end); }; const unmountComponent = (instance, parentSuspense, doRemove) => { const { bum, scope, job, subTree, um, m, a } = instance; invalidateMount(m); invalidateMount(a); if (bum) { invokeArrayFns(bum); } scope.stop(); if (job) { job.flags |= 8; unmount(subTree, instance, parentSuspense, doRemove); } if (um) { queuePostRenderEffect(um, parentSuspense); } queuePostRenderEffect(() => { instance.isUnmounted = true; }, parentSuspense); }; const unmountChildren = (children, parentComponent, parentSuspense, doRemove = false, optimized = false, start = 0) => { for (let i = start; i < children.length; i++) { unmount(children[i], parentComponent, parentSuspense, doRemove, optimized); } }; const getNextHostNode = (vnode) => { if (vnode.shapeFlag & 6) { return getNextHostNode(vnode.component.subTree); } if (vnode.shapeFlag & 128) { return vnode.suspense.next(); } const el = hostNextSibling(vnode.anchor || vnode.el); const teleportEnd = el && el[TeleportEndKey]; return teleportEnd ? hostNextSibling(teleportEnd) : el; }; let isFlushing = false; const render = (vnode, container, namespace) => { if (vnode == null) { if (container._vnode) { unmount(container._vnode, null, null, true); } } else { patch( container._vnode || null, vnode, container, null, null, null, namespace ); } container._vnode = vnode; if (!isFlushing) { isFlushing = true; flushPreFlushCbs(); flushPostFlushCbs(); isFlushing = false; } }; const internals = { p: patch, um: unmount, m: move, r: remove2, mt: mountComponent, mc: mountChildren, pc: patchChildren, pbc: patchBlockChildren, n: getNextHostNode, o: options }; let hydrate; return { render, hydrate, createApp: createAppAPI(render) }; } function resolveChildrenNamespace({ type, props }, currentNamespace) { return currentNamespace === "svg" && type === "foreignObject" || currentNamespace === "mathml" && type === "annotation-xml" && props && props.encoding && props.encoding.includes("html") ? void 0 : currentNamespace; } function toggleRecurse({ effect: effect2, job }, allowed) { if (allowed) { effect2.flags |= 32; job.flags |= 4; } else { effect2.flags &= -33; job.flags &= -5; } } function needTransition(parentSuspense, transition) { return (!parentSuspense || parentSuspense && !parentSuspense.pendingBranch) && transition && !transition.persisted; } function traverseStaticChildren(n1, n2, shallow = false) { const ch1 = n1.children; const ch2 = n2.children; if (isArray(ch1) && isArray(ch2)) { for (let i = 0; i < ch1.length; i++) { const c1 = ch1[i]; let c2 = ch2[i]; if (c2.shapeFlag & 1 && !c2.dynamicChildren) { if (c2.patchFlag <= 0 || c2.patchFlag === 32) { c2 = ch2[i] = cloneIfMounted(ch2[i]); c2.el = c1.el; } if (!shallow && c2.patchFlag !== -2) traverseStaticChildren(c1, c2); } if (c2.type === Text && // avoid cached text nodes retaining detached dom nodes c2.patchFlag !== -1) { c2.el = c1.el; } if (c2.type === Comment && !c2.el) { c2.el = c1.el; } } } } function getSequence(arr) { const p = arr.slice(); const result = [0]; let i, j, u, v, c; const len = arr.length; for (i = 0; i < len; i++) { const arrI = arr[i]; if (arrI !== 0) { j = result[result.length - 1]; if (arr[j] < arrI) { p[i] = j; result.push(i); continue; } u = 0; v = result.length - 1; while (u < v) { c = u + v >> 1; if (arr[result[c]] < arrI) { u = c + 1; } else { v = c; } } if (arrI < arr[result[u]]) { if (u > 0) { p[i] = result[u - 1]; } result[u] = i; } } } u = result.length; v = result[u - 1]; while (u-- > 0) { result[u] = v; v = p[v]; } return result; } function locateNonHydratedAsyncRoot(instance) { const subComponent = instance.subTree.component; if (subComponent) { if (subComponent.asyncDep && !subComponent.asyncResolved) { return subComponent; } else { return locateNonHydratedAsyncRoot(subComponent); } } } function invalidateMount(hooks) { if (hooks) { for (let i = 0; i < hooks.length; i++) hooks[i].flags |= 8; } } const ssrContextKey = Symbol.for("v-scx"); const useSSRContext = () => { { const ctx = inject(ssrContextKey); return ctx; } }; function watch(source, cb, options) { return doWatch(source, cb, options); } function doWatch(source, cb, options = EMPTY_OBJ) { const { immediate, deep, flush, once } = options; const baseWatchOptions = extend({}, options); const runsImmediately = cb && immediate || !cb && flush !== "post"; let ssrCleanup; if (isInSSRComponentSetup) { if (flush === "sync") { const ctx = useSSRContext(); ssrCleanup = ctx.__watcherHandles || (ctx.__watcherHandles = []); } else if (!runsImmediately) { const watchStopHandle = () => { }; watchStopHandle.stop = NOOP; watchStopHandle.resume = NOOP; watchStopHandle.pause = NOOP; return watchStopHandle; } } const instance = currentInstance; baseWatchOptions.call = (fn, type, args) => callWithAsyncErrorHandling(fn, instance, type, args); let isPre = false; if (flush === "post") { baseWatchOptions.scheduler = (job) => { queuePostRenderEffect(job, instance && instance.suspense); }; } else if (flush !== "sync") { isPre = true; baseWatchOptions.scheduler = (job, isFirstRun) => { if (isFirstRun) { job(); } else { queueJob(job); } }; } baseWatchOptions.augmentJob = (job) => { if (cb) { job.flags |= 4; } if (isPre) { job.flags |= 2; if (instance) { job.id = instance.uid; job.i = instance; } } }; const watchHandle = watch$1(source, cb, baseWatchOptions); if (isInSSRComponentSetup) { if (ssrCleanup) { ssrCleanup.push(watchHandle); } else if (runsImmediately) { watchHandle(); } } return watchHandle; } function instanceWatch(source, value, options) { const publicThis = this.proxy; const getter = isString(source) ? source.includes(".") ? createPathGetter(publicThis, source) : () => publicThis[source] : source.bind(publicThis, publicThis); let cb; if (isFunction(value)) { cb = value; } else { cb = value.handler; options = value; } const reset = setCurrentInstance(this); const res = doWatch(getter, cb.bind(publicThis), options); reset(); return res; } function createPathGetter(ctx, path) { const segments = path.split("."); return () => { let cur = ctx; for (let i = 0; i < segments.length && cur; i++) { cur = cur[segments[i]]; } return cur; }; } const getModelModifiers = (props, modelName) => { return modelName === "modelValue" || modelName === "model-value" ? props.modelModifiers : props[`${modelName}Modifiers`] || props[`${camelize(modelName)}Modifiers`] || props[`${hyphenate(modelName)}Modifiers`]; }; function emit(instance, event, ...rawArgs) { if (instance.isUnmounted) return; const props = instance.vnode.props || EMPTY_OBJ; let args = rawArgs; const isModelListener2 = event.startsWith("update:"); const modifiers = isModelListener2 && getModelModifiers(props, event.slice(7)); if (modifiers) { if (modifiers.trim) { args = rawArgs.map((a) => isString(a) ? a.trim() : a); } if (modifiers.number) { args = rawArgs.map(looseToNumber); } } let handlerName; let handler = props[handlerName = toHandlerKey(event)] || // also try camelCase event handler (#2249) props[handlerName = toHandlerKey(camelize(event))]; if (!handler && isModelListener2) { handler = props[handlerName = toHandlerKey(hyphenate(event))]; } if (handler) { callWithAsyncErrorHandling( handler, instance, 6, args ); } const onceHandler = props[handlerName + `Once`]; if (onceHandler) { if (!instance.emitted) { instance.emitted = {}; } else if (instance.emitted[handlerName]) { return; } instance.emitted[handlerName] = true; callWithAsyncErrorHandling( onceHandler, instance, 6, args ); } } const mixinEmitsCache = /* @__PURE__ */ new WeakMap(); function normalizeEmitsOptions(comp, appContext, asMixin = false) { const cache = asMixin ? mixinEmitsCache : appContext.emitsCache; const cached = cache.get(comp); if (cached !== void 0) { return cached; } const raw = comp.emits; let normalized = {}; let hasExtends = false; if (!isFunction(comp)) { const extendEmits = (raw2) => { const normalizedFromExtend = normalizeEmitsOptions(raw2, appContext, true); if (normalizedFromExtend) { hasExtends = true; extend(normalized, normalizedFromExtend); } }; if (!asMixin && appContext.mixins.length) { appContext.mixins.forEach(extendEmits); } if (comp.extends) { extendEmits(comp.extends); } if (comp.mixins) { comp.mixins.forEach(extendEmits); } } if (!raw && !hasExtends) { if (isObject(comp)) { cache.set(comp, null); } return null; } if (isArray(raw)) { raw.forEach((key) => normalized[key] = null); } else { extend(normalized, raw); } if (isObject(comp)) { cache.set(comp, normalized); } return normalized; } function isEmitListener(options, key) { if (!options || !isOn(key)) { return false; } key = key.slice(2).replace(/Once$/, ""); return hasOwn(options, key[0].toLowerCase() + key.slice(1)) || hasOwn(options, hyphenate(key)) || hasOwn(options, key); } function markAttrsAccessed() { } function renderComponentRoot(instance) { const { type: Component, vnode, proxy, withProxy, propsOptions: [propsOptions], slots, attrs, emit: emit2, render, renderCache, props, data, setupState, ctx, inheritAttrs } = instance; const prev = setCurrentRenderingInstance(instance); let result; let fallthroughAttrs; try { if (vnode.shapeFlag & 4) { const proxyToUse = withProxy || proxy; const thisProxy = false ? new Proxy(proxyToUse, { get(target, key, receiver) { warn$1( `Property '${String( key )}' was accessed via 'this'. Avoid using 'this' in templates.` ); return Reflect.get(target, key, receiver); } }) : proxyToUse; result = normalizeVNode( render.call( thisProxy, proxyToUse, renderCache, false ? shallowReadonly(props) : props, setupState, data, ctx ) ); fallthroughAttrs = attrs; } else { const render2 = Component; if (false) ; result = normalizeVNode( render2.length > 1 ? render2( false ? shallowReadonly(props) : props, false ? { get attrs() { markAttrsAccessed(); return shallowReadonly(attrs); }, slots, emit: emit2 } : { attrs, slots, emit: emit2 } ) : render2( false ? shallowReadonly(props) : props, null ) ); fallthroughAttrs = Component.props ? attrs : getFunctionalFallthrough(attrs); } } catch (err) { blockStack.length = 0; handleError(err, instance, 1); result = createVNode(Comment); } let root = result; if (fallthroughAttrs && inheritAttrs !== false) { const keys = Object.keys(fallthroughAttrs); const { shapeFlag } = root; if (keys.length) { if (shapeFlag & (1 | 6)) { if (propsOptions && keys.some(isModelListener)) { fallthroughAttrs = filterModelListeners( fallthroughAttrs, propsOptions ); } root = cloneVNode(root, fallthroughAttrs, false, true); } } } if (vnode.dirs) { root = cloneVNode(root, null, false, true); root.dirs = root.dirs ? root.dirs.concat(vnode.dirs) : vnode.dirs; } if (vnode.transition) { setTransitionHooks(root, vnode.transition); } { result = root; } setCurrentRenderingInstance(prev); return result; } const getFunctionalFallthrough = (attrs) => { let res; for (const key in attrs) { if (key === "class" || key === "style" || isOn(key)) { (res || (res = {}))[key] = attrs[key]; } } return res; }; const filterModelListeners = (attrs, props) => { const res = {}; for (const key in attrs) { if (!isModelListener(key) || !(key.slice(9) in props)) { res[key] = attrs[key]; } } return res; }; function shouldUpdateComponent(prevVNode, nextVNode, optimized) { const { props: prevProps, children: prevChildren, component } = prevVNode; const { props: nextProps, children: nextChildren, patchFlag } = nextVNode; const emits = component.emitsOptions; if (nextVNode.dirs || nextVNode.transition) { return true; } if (optimized && patchFlag >= 0) { if (patchFlag & 1024) { return true; } if (patchFlag & 16) { if (!prevProps) { return !!nextProps; } return hasPropsChanged(prevProps, nextProps, emits); } else if (patchFlag & 8) { const dynamicProps = nextVNode.dynamicProps; for (let i = 0; i < dynamicProps.length; i++) { const key = dynamicProps[i]; if (nextProps[key] !== prevProps[key] && !isEmitListener(emits, key)) { return true; } } } } else { if (prevChildren || nextChildren) { if (!nextChildren || !nextChildren.$stable) { return true; } } if (prevProps === nextProps) { return false; } if (!prevProps) { return !!nextProps; } if (!nextProps) { return true; } return hasPropsChanged(prevProps, nextProps, emits); } return false; } function hasPropsChanged(prevProps, nextProps, emitsOptions) { const nextKeys = Object.keys(nextProps); if (nextKeys.length !== Object.keys(prevProps).length) { return true; } for (let i = 0; i < nextKeys.length; i++) { const key = nextKeys[i]; if (nextProps[key] !== prevProps[key] && !isEmitListener(emitsOptions, key)) { return true; } } return false; } function updateHOCHostEl({ vnode, parent }, el) { while (parent) { const root = parent.subTree; if (root.suspense && root.suspense.activeBranch === vnode) { root.el = vnode.el; } if (root === vnode) { (vnode = parent.vnode).el = el; parent = parent.parent; } else { break; } } } const isSuspense = (type) => type.__isSuspense; function queueEffectWithSuspense(fn, suspense) { if (suspense && suspense.pendingBranch) { if (isArray(fn)) { suspense.effects.push(...fn); } else { suspense.effects.push(fn); } } else { queuePostFlushCb(fn); } } const Fragment = Symbol.for("v-fgt"); const Text = Symbol.for("v-txt"); const Comment = Symbol.for("v-cmt"); const Static = Symbol.for("v-stc"); const blockStack = []; let currentBlock = null; function openBlock(disableTracking = false) { blockStack.push(currentBlock = disableTracking ? null : []); } function closeBlock() { blockStack.pop(); currentBlock = blockStack[blockStack.length - 1] || null; } let isBlockTreeEnabled = 1; function setBlockTracking(value, inVOnce = false) { isBlockTreeEnabled += value; if (value < 0 && currentBlock && inVOnce) { currentBlock.hasOnce = true; } } function setupBlock(vnode) { vnode.dynamicChildren = isBlockTreeEnabled > 0 ? currentBlock || EMPTY_ARR : null; closeBlock(); if (isBlockTreeEnabled > 0 && currentBlock) { currentBlock.push(vnode); } return vnode; } function createElementBlock(type, props, children, patchFlag, dynamicProps, shapeFlag) { return setupBlock( createBaseVNode( type, props, children, patchFlag, dynamicProps, shapeFlag, true ) ); } function createBlock(type, props, children, patchFlag, dynamicProps) { return setupBlock( createVNode( type, props, children, patchFlag, dynamicProps, true ) ); } function isVNode(value) { return value ? value.__v_isVNode === true : false; } function isSameVNodeType(n1, n2) { return n1.type === n2.type && n1.key === n2.key; } const normalizeKey = ({ key }) => key != null ? key : null; const normalizeRef = ({ ref: ref3, ref_key, ref_for }) => { if (typeof ref3 === "number") { ref3 = "" + ref3; } return ref3 != null ? isString(ref3) || isRef(ref3) || isFunction(ref3) ? { i: currentRenderingInstance, r: ref3, k: ref_key, f: !!ref_for } : ref3 : null; }; function createBaseVNode(type, props = null, children = null, patchFlag = 0, dynamicProps = null, shapeFlag = type === Fragment ? 0 : 1, isBlockNode = false, needFullChildrenNormalization = false) { const vnode = { __v_isVNode: true, __v_skip: true, type, props, key: props && normalizeKey(props), ref: props && normalizeRef(props), scopeId: currentScopeId, slotScopeIds: null, children, component: null, suspense: null, ssContent: null, ssFallback: null, dirs: null, transition: null, el: null, anchor: null, target: null, targetStart: null, targetAnchor: null, staticCount: 0, shapeFlag, patchFlag, dynamicProps, dynamicChildren: null, appContext: null, ctx: currentRenderingInstance }; if (needFullChildrenNormalization) { normalizeChildren(vnode, children); if (shapeFlag & 128) { type.normalize(vnode); } } else if (children) { vnode.shapeFlag |= isString(children) ? 8 : 16; } if (isBlockTreeEnabled > 0 && // avoid a block node from tracking itself !isBlockNode && // has current parent block currentBlock && // presence of a patch flag indicates this node needs patching on updates. // component nodes also should always be patched, because even if the // component doesn't need to update, it needs to persist the instance on to // the next vnode so that it can be properly unmounted later. (vnode.patchFlag > 0 || shapeFlag & 6) && // the EVENTS flag is only for hydration and if it is the only flag, the // vnode should not be considered dynamic due to handler caching. vnode.patchFlag !== 32) { currentBlock.push(vnode); } return vnode; } const createVNode = _createVNode; function _createVNode(type, props = null, children = null, patchFlag = 0, dynamicProps = null, isBlockNode = false) { if (!type || type === NULL_DYNAMIC_COMPONENT) { type = Comment; } if (isVNode(type)) { const cloned = cloneVNode( type, props, true /* mergeRef: true */ ); if (children) { normalizeChildren(cloned, children); } if (isBlockTreeEnabled > 0 && !isBlockNode && currentBlock) { if (cloned.shapeFlag & 6) { currentBlock[currentBlock.indexOf(type)] = cloned; } else { currentBlock.push(cloned); } } cloned.patchFlag = -2; return cloned; } if (isClassComponent(type)) { type = type.__vccOpts; } if (props) { props = guardReactiveProps(props); let { class: klass, style } = props; if (klass && !isString(klass)) { props.class = normalizeClass(klass); } if (isObject(style)) { if (isProxy(style) && !isArray(style)) { style = extend({}, style); } props.style = normalizeStyle(style); } } const shapeFlag = isString(type) ? 1 : isSuspense(type) ? 128 : isTeleport(type) ? 64 : isObject(type) ? 4 : isFunction(type) ? 2 : 0; return createBaseVNode( type, props, children, patchFlag, dynamicProps, shapeFlag, isBlockNode, true ); } function guardReactiveProps(props) { if (!props) return null; return isProxy(props) || isInternalObject(props) ? extend({}, props) : props; } function cloneVNode(vnode, extraProps, mergeRef = false, cloneTransition = false) { const { props, ref: ref3, patchFlag, children, transition } = vnode; const mergedProps = extraProps ? mergeProps(props || {}, extraProps) : props; const cloned = { __v_isVNode: true, __v_skip: true, type: vnode.type, props: mergedProps, key: mergedProps && normalizeKey(mergedProps), ref: extraProps && extraProps.ref ? ( // #2078 in the case of <component :is="vnode" ref="extra"/> // if the vnode itself already has a ref, cloneVNode will need to merge // the refs so the single vnode can be set on multiple refs mergeRef && ref3 ? isArray(ref3) ? ref3.concat(normalizeRef(extraProps)) : [ref3, normalizeRef(extraProps)] : normalizeRef(extraProps) ) : ref3, scopeId: vnode.scopeId, slotScopeIds: vnode.slotScopeIds, children: children, target: vnode.target, targetStart: vnode.targetStart, targetAnchor: vnode.targetAnchor, staticCount: vnode.staticCount, shapeFlag: vnode.shapeFlag, // if the vnode is cloned with extra props, we can no longer assume its // existing patch flag to be reliable and need to add the FULL_PROPS flag. // note: preserve flag for fragments since they use the flag for children // fast paths only. patchFlag: extraProps && vnode.type !== Fragment ? patchFlag === -1 ? 16 : patchFlag | 16 : patchFlag, dynamicProps: vnode.dynamicProps, dynamicChildren: vnode.dynamicChildren, appContext: vnode.appContext, dirs: vnode.dirs, transition, // These should technically only be non-null on mounted VNodes. However, // they *should* be copied for kept-alive vnodes. So we just always copy // them since them being non-null during a mount doesn't affect the logic as // they will simply be overwritten. component: vnode.component, suspense: vnode.suspense, ssContent: vnode.ssContent && cloneVNode(vnode.ssContent), ssFallback: vnode.ssFallback && cloneVNode(vnode.ssFallback), placeholder: vnode.placeholder, el: vnode.el, anchor: vnode.anchor, ctx: vnode.ctx, ce: vnode.ce }; if (transition && cloneTransition) { setTransitionHooks( cloned, transition.clone(cloned) ); } return cloned; } function createTextVNode(text = " ", flag = 0) { return createVNode(Text, null, text, flag); } function createStaticVNode(content, numberOfNodes) { const vnode = createVNode(Static, null, content); vnode.staticCount = numberOfNodes; return vnode; } function createCommentVNode(text = "", asBlock = false) { return asBlock ? (openBlock(), createBlock(Comment, null, text)) : createVNode(Comment, null, text); } function normalizeVNode(child) { if (child == null || typeof child === "boolean") { return createVNode(Comment); } else if (isArray(child)) { return createVNode( Fragment, null, // #3666, avoid reference pollution when reusing vnode child.slice() ); } else if (isVNode(child)) { return cloneIfMounted(child); } else { return createVNode(Text, null, String(child)); } } function cloneIfMounted(child) { return child.el === null && child.patchFlag !== -1 || child.memo ? child : cloneVNode(child); } function normalizeChildren(vnode, children) { let type = 0; const { shapeFlag } = vnode; if (children == null) { children = null; } else if (isArray(children)) { type = 16; } else if (typeof children === "object") { if (shapeFlag & (1 | 64)) { const slot = children.default; if (slot) { slot._c && (slot._d = false); normalizeChildren(vnode, slot()); slot._c && (slot._d = true); } return; } else { type = 32; const slotFlag = children._; if (!slotFlag && !isInternalObject(children)) { children._ctx = currentRenderingInstance; } else if (slotFlag === 3 && currentRenderingInstance) { if (currentRenderingInstance.slots._ === 1) { children._ = 1; } else { children._ = 2; vnode.patchFlag |= 1024; } } } } else if (isFunction(children)) { children = { default: children, _ctx: currentRenderingInstance }; type = 32; } else { children = String(children); if (shapeFlag & 64) { type = 16; children = [createTextVNode(children)]; } else { type = 8; } } vnode.children = children; vnode.shapeFlag |= type; } function mergeProps(...args) { const ret = {}; for (let i = 0; i < args.length; i++) { const toMerge = args[i]; for (const key in toMerge) { if (key === "class") { if (ret.class !== toMerge.class) { ret.class = normalizeClass([ret.class, toMerge.class]); } } else if (key === "style") { ret.style = normalizeStyle([ret.style, toMerge.style]); } else if (isOn(key)) { const existing = ret[key]; const incoming = toMerge[key]; if (incoming && existing !== incoming && !(isArray(existing) && existing.includes(incoming))) { ret[key] = existing ? [].concat(existing, incoming) : incoming; } } else if (key !== "") { ret[key] = toMerge[key]; } } } return ret; } function invokeVNodeHook(hook, instance, vnode, prevVNode = null) { callWithAsyncErrorHandling(hook, instance, 7, [ vnode, prevVNode ]); } const emptyAppContext = createAppContext(); let uid = 0; function createComponentInstance(vnode, parent, suspense) { const type = vnode.type; const appContext = (parent ? parent.appContext : vnode.appContext) || emptyAppContext; const instance = { uid: uid++, vnode, type, parent, appContext, root: null, // to be immediately set next: null, subTree: null, // will be set synchronously right after creation effect: null, update: null, // will be set synchronously right after creation job: null, scope: new EffectScope( true /* detached */ ), render: null, proxy: null, exposed: null, exposeProxy: null, withProxy: null, provides: parent ? parent.provides : Object.create(appContext.provides), ids: parent ? parent.ids : ["", 0, 0], accessCache: null, renderCache: [], // local resolved assets components: null, directives: null, // resolved props and emits options propsOptions: normalizePropsOptions(type, appContext), emitsOptions: normalizeEmitsOptions(type, appContext), // emit emit: null, // to be set immediately emitted: null, // props default value propsDefaults: EMPTY_OBJ, // inheritAttrs inheritAttrs: type.inheritAttrs, // state ctx: EMPTY_OBJ, data: EMPTY_OBJ, props: EMPTY_OBJ, attrs: EMPTY_OBJ, slots: EMPTY_OBJ, refs: EMPTY_OBJ, setupState: EMPTY_OBJ, setupContext: null, // suspense related suspense, suspenseId: suspense ? suspense.pendingId : 0, asyncDep: null, asyncResolved: false, // lifecycle hooks // not using enums here because it results in computed properties isMounted: false, isUnmounted: false, isDeactivated: false, bc: null, c: null, bm: null, m: null, bu: null, u: null, um: null, bum: null, da: null, a: null, rtg: null, rtc: null, ec: null, sp: null }; { instance.ctx = { _: instance }; } instance.root = parent ? parent.root : instance; instance.emit = emit.bind(null, instance); if (vnode.ce) { vnode.ce(instance); } return instance; } let currentInstance = null; const getCurrentInstance = () => currentInstance || currentRenderingInstance; let internalSetCurrentInstance; let setInSSRSetupState; { const g = getGlobalThis(); const registerGlobalSetter = (key, setter) => { let setters; if (!(setters = g[key])) setters = g[key] = []; setters.push(setter); return (v) => { if (setters.length > 1) setters.forEach((set) => set(v)); else setters[0](v); }; }; internalSetCurrentInstance = registerGlobalSetter( `__VUE_INSTANCE_SETTERS__`, (v) => currentInstance = v ); setInSSRSetupState = registerGlobalSetter( `__VUE_SSR_SETTERS__`, (v) => isInSSRComponentSetup = v ); } const setCurrentInstance = (instance) => { const prev = currentInstance; internalSetCurrentInstance(instance); instance.scope.on(); return () => { instance.scope.off(); internalSetCurrentInstance(prev); }; }; const unsetCurrentInstance = () => { currentInstance && currentInstance.scope.off(); internalSetCurrentInstance(null); }; function isStatefulComponent(instance) { return instance.vnode.shapeFlag & 4; } let isInSSRComponentSetup = false; function setupComponent(instance, isSSR = false, optimized = false) { isSSR && setInSSRSetupState(isSSR); const { props, children } = instance.vnode; const isStateful = isStatefulComponent(instance); initProps(instance, props, isStateful, isSSR); initSlots(instance, children, optimized || isSSR); const setupResult = isStateful ? setupStatefulComponent(instance, isSSR) : void 0; isSSR && setInSSRSetupState(false); return setupResult; } function setupStatefulComponent(instance, isSSR) { const Component = instance.type; instance.accessCache = /* @__PURE__ */ Object.create(null); instance.proxy = new Proxy(instance.ctx, PublicInstanceProxyHandlers); const { setup } = Component; if (setup) { pauseTracking(); const setupContext = instance.setupContext = setup.length > 1 ? createSetupContext(instance) : null; const reset = setCurrentInstance(instance); const setupResult = callWithErrorHandling( setup, instance, 0, [ instance.props, setupContext ] ); const isAsyncSetup = isPromise(setupResult); resetTracking(); reset(); if ((isAsyncSetup || instance.sp) && !isAsyncWrapper(instance)) { markAsyncBoundary(instance); } if (isAsyncSetup) { setupResult.then(unsetCurrentInstance, unsetCurrentInstance); if (isSSR) { return setupResult.then((resolvedResult) => { handleSetupResult(instance, resolvedResult); }).catch((e) => { handleError(e, instance, 0); }); } else { instance.asyncDep = setupResult; } } else { handleSetupResult(instance, setupResult); } } else { finishComponentSetup(instance); } } function handleSetupResult(instance, setupResult, isSSR) { if (isFunction(setupResult)) { if (instance.type.__ssrInlineRender) { instance.ssrRender = setupResult; } else { instance.render = setupResult; } } else if (isObject(setupResult)) { instance.setupState = proxyRefs(setupResult); } else ; finishComponentSetup(instance); } function finishComponentSetup(instance, isSSR, skipOptions) { const Component = instance.type; if (!instance.render) { instance.render = Component.render || NOOP; } { const reset = setCurrentInstance(instance); pauseTracking(); try { applyOptions(instance); } finally { resetTracking(); reset(); } } } const attrsProxyHandlers = { get(target, key) { track(target, "get", ""); return target[key]; } }; function createSetupContext(instance) { const expose = (exposed) => { instance.exposed = exposed || {}; }; { return { attrs: new Proxy(instance.attrs, attrsProxyHandlers), slots: instance.slots, emit: instance.emit, expose }; } } function getComponentPublicInstance(instance) { if (instance.exposed) { return instance.exposeProxy || (instance.exposeProxy = new Proxy(proxyRefs(markRaw(instance.exposed)), { get(target, key) { if (key in target) { return target[key]; } else if (key in publicPropertiesMap) { return publicPropertiesMap[key](instance); } }, has(target, key) { return key in target || key in publicPropertiesMap; } })); } else { return instance.proxy; } } const classifyRE = /(?:^|[-_])\w/g; const classify = (str) => str.replace(classifyRE, (c) => c.toUpperCase()).replace(/[-_]/g, ""); function getComponentName(Component, includeInferred = true) { return isFunction(Component) ? Component.displayName || Component.name : Component.name || includeInferred && Component.__name; } function formatComponentName(instance, Component, isRoot = false) { let name = getComponentName(Component); if (!name && Component.__file) { const match = Component.__file.match(/([^/\\]+)\.\w+$/); if (match) { name = match[1]; } } if (!name && instance && instance.parent) { const inferFromRegistry = (registry) => { for (const key in registry) { if (registry[key] === Component) { return key; } } }; name = inferFromRegistry( instance.components || instance.parent.type.components ) || inferFromRegistry(instance.appContext.components); } return name ? classify(name) : isRoot ? `App` : `Anonymous`; } function isClassComponent(value) { return isFunction(value) && "__vccOpts" in value; } const computed = (getterOrOptions, debugOptions) => { const c = computed$1(getterOrOptions, debugOptions, isInSSRComponentSetup); return c; }; function h(type, propsOrChildren, children) { try { setBlockTracking(-1); const l = arguments.length; if (l === 2) { if (isObject(propsOrChildren) && !isArray(propsOrChildren)) { if (isVNode(propsOrChildren)) { return createVNode(type, null, [propsOrChildren]); } return createVNode(type, propsOrChildren); } else { return createVNode(type, null, propsOrChildren); } } else { if (l > 3) { children = Array.prototype.slice.call(arguments, 2); } else if (l === 3 && isVNode(children)) { children = [children]; } return createVNode(type, propsOrChildren, children); } } finally { setBlockTracking(1); } } const version = "3.5.22"; /** * @vue/runtime-dom v3.5.22 * (c) 2018-present Yuxi (Evan) You and Vue contributors * @license MIT **/ let policy = void 0; const tt = typeof window !== "undefined" && window.trustedTypes; if (tt) { try { policy = /* @__PURE__ */ tt.createPolicy("vue", { createHTML: (val) => val }); } catch (e) { } } const unsafeToTrustedHTML = policy ? (val) => policy.createHTML(val) : (val) => val; const svgNS = "http://www.w3.org/2000/svg"; const mathmlNS = "http://www.w3.org/1998/Math/MathML"; const doc = typeof document !== "undefined" ? document : null; const templateContainer = doc && /* @__PURE__ */ doc.createElement("template"); const nodeOps = { insert: (child, parent, anchor) => { parent.insertBefore(child, anchor || null); }, remove: (child) => { const parent = child.parentNode; if (parent) { parent.removeChild(child); } }, createElement: (tag, namespace, is, props) => { const el = namespace === "svg" ? doc.createElementNS(svgNS, tag) : namespace === "mathml" ? doc.createElementNS(mathmlNS, tag) : is ? doc.createElement(tag, { is }) : doc.createElement(tag); if (tag === "select" && props && props.multiple != null) { el.setAttribute("multiple", props.multiple); } return el; }, createText: (text) => doc.createTextNode(text), createComment: (text) => doc.createComment(text), setText: (node, text) => { node.nodeValue = text; }, setElementText: (el, text) => { el.textContent = text; }, parentNode: (node) => node.parentNode, nextSibling: (node) => node.nextSibling, querySelector: (selector) => doc.querySelector(selector), setScopeId(el, id) { el.setAttribute(id, ""); }, // __UNSAFE__ // Reason: innerHTML. // Static content here can only come from compiled templates. // As long as the user only uses trusted templates, this is safe. insertStaticContent(content, parent, anchor, namespace, start, end) { const before = anchor ? anchor.previousSibling : parent.lastChild; if (start && (start === end || start.nextSibling)) { while (true) { parent.insertBefore(start.cloneNode(true), anchor); if (start === end || !(start = start.nextSibling)) break; } } else { templateContainer.innerHTML = unsafeToTrustedHTML( namespace === "svg" ? `<svg>${content}</svg>` : namespace === "mathml" ? `<math>${content}</math>` : content ); const template = templateContainer.content; if (namespace === "svg" || namespace === "mathml") { const wrapper = template.firstChild; while (wrapper.firstChild) { template.appendChild(wrapper.firstChild); } template.removeChild(wrapper); } parent.insertBefore(template, anchor); } return [ // first before ? before.nextSibling : parent.firstChild, // last anchor ? anchor.previousSibling : parent.lastChild ]; } }; const TRANSITION = "transition"; const ANIMATION = "animation"; const vtcKey = Symbol("_vtc"); const DOMTransitionPropsValidators = { name: String, type: String, css: { type: Boolean, default: true }, duration: [String, Number, Object], enterFromClass: String, enterActiveClass: String, enterToClass: String, appearFromClass: String, appearActiveClass: String, appearToClass: String, leaveFromClass: String, leaveActiveClass: String, leaveToClass: String }; const TransitionPropsValidators = /* @__PURE__ */ extend( {}, BaseTransitionPropsValidators, DOMTransitionPropsValidators ); const decorate$1 = (t) => { t.displayName = "Transition"; t.props = TransitionPropsValidators; return t; }; const Transition = /* @__PURE__ */ decorate$1( (props, { slots }) => h(BaseTransition, resolveTransitionProps(props), slots) ); const callHook = (hook, args = []) => { if (isArray(hook)) { hook.forEach((h2) => h2(...args)); } else if (hook) { hook(...args); } }; const hasExplicitCallback = (hook) => { return hook ? isArray(hook) ? hook.some((h2) => h2.length > 1) : hook.length > 1 : false; }; function resolveTransitionProps(rawProps) { const baseProps = {}; for (const key in rawProps) { if (!(key in DOMTransitionPropsValidators)) { baseProps[key] = rawProps[key]; } } if (rawProps.css === false) { return baseProps; } const { name = "v", type, duration, enterFromClass = `${name}-enter-from`, enterActiveClass = `${name}-enter-active`, enterToClass = `${name}-enter-to`, appearFromClass = enterFromClass, appearActiveClass = enterActiveClass, appearToClass = enterToClass, leaveFromClass = `${name}-leave-from`, leaveActiveClass = `${name}-leave-active`, leaveToClass = `${name}-leave-to` } = rawProps; const durations = normalizeDuration(duration); const enterDuration = durations && durations[0]; const leaveDuration = durations && durations[1]; const { onBeforeEnter, onEnter, onEnterCancelled, onLeave, onLeaveCancelled, onBeforeAppear = onBeforeEnter, onAppear = onEnter, onAppearCancelled = onEnterCancelled } = baseProps; const finishEnter = (el, isAppear, done, isCancelled) => { el._enterCancelled = isCancelled; removeTransitionClass(el, isAppear ? appearToClass : enterToClass); removeTransitionClass(el, isAppear ? appearActiveClass : enterActiveClass); done && done(); }; const finishLeave = (el, done) => { el._isLeaving = false; removeTransitionClass(el, leaveFromClass); removeTransitionClass(el, leaveToClass); removeTransitionClass(el, leaveActiveClass); done && done(); }; const makeEnterHook = (isAppear) => { return (el, done) => { const hook = isAppear ? onAppear : onEnter; const resolve = () => finishEnter(el, isAppear, done); callHook(hook, [el, resolve]); nextFrame(() => { removeTransitionClass(el, isAppear ? appearFromClass : enterFromClass); addTransitionClass(el, isAppear ? appearToClass : enterToClass); if (!hasExplicitCallback(hook)) { whenTransitionEnds(el, type, enterDuration, resolve); } }); }; }; return extend(baseProps, { onBeforeEnter(el) { callHook(onBeforeEnter, [el]); addTransitionClass(el, enterFromClass); addTransitionClass(el, enterActiveClass); }, onBeforeAppear(el) { callHook(onBeforeAppear, [el]); addTransitionClass(el, appearFromClass); addTransitionClass(el, appearActiveClass); }, onEnter: makeEnterHook(false), onAppear: makeEnterHook(true), onLeave(el, done) { el._isLeaving = true; const resolve = () => finishLeave(el, done); addTransitionClass(el, leaveFromClass); if (!el._enterCancelled) { forceReflow(el); addTransitionClass(el, leaveActiveClass); } else { addTransitionClass(el, leaveActiveClass); forceReflow(el); } nextFrame(() => { if (!el._isLeaving) { return; } removeTransitionClass(el, leaveFromClass); addTransitionClass(el, leaveToClass); if (!hasExplicitCallback(onLeave)) { whenTransitionEnds(el, type, leaveDuration, resolve); } }); callHook(onLeave, [el, resolve]); }, onEnterCancelled(el) { finishEnter(el, false, void 0, true); callHook(onEnterCancelled, [el]); }, onAppearCancelled(el) { finishEnter(el, true, void 0, true); callHook(onAppearCancelled, [el]); }, onLeaveCancelled(el) { finishLeave(el); callHook(onLeaveCancelled, [el]); } }); } function normalizeDuration(duration) { if (duration == null) { return null; } else if (isObject(duration)) { return [NumberOf(duration.enter), NumberOf(duration.leave)]; } else { const n = NumberOf(duration); return [n, n]; } } function NumberOf(val) { const res = toNumber(val); return res; } function addTransitionClass(el, cls) { cls.split(/\s+/).forEach((c) => c && el.classList.add(c)); (el[vtcKey] || (el[vtcKey] = /* @__PURE__ */ new Set())).add(cls); } function removeTransitionClass(el, cls) { cls.split(/\s+/).forEach((c) => c && el.classList.remove(c)); const _vtc = el[vtcKey]; if (_vtc) { _vtc.delete(cls); if (!_vtc.size) { el[vtcKey] = void 0; } } } function nextFrame(cb) { requestAnimationFrame(() => { requestAnimationFrame(cb); }); } let endId = 0; function whenTransitionEnds(el, expectedType, explicitTimeout, resolve) { const id = el._endId = ++endId; const resolveIfNotStale = () => { if (id === el._endId) { resolve(); } }; if (explicitTimeout != null) { return setTimeout(resolveIfNotStale, explicitTimeout); } const { type, timeout, propCount } = getTransitionInfo(el, expectedType); if (!type) { return resolve(); } const endEvent = type + "end"; let ended = 0; const end = () => { el.removeEventListener(endEvent, onEnd); resolveIfNotStale(); }; const onEnd = (e) => { if (e.target === el && ++ended >= propCount) { end(); } }; setTimeout(() => { if (ended < propCount) { end(); } }, timeout + 1); el.addEventListener(endEvent, onEnd); } function getTransitionInfo(el, expectedType) { const styles = window.getComputedStyle(el); const getStyleProperties = (key) => (styles[key] || "").split(", "); const transitionDelays = getStyleProperties(`${TRANSITION}Delay`); const transitionDurations = getStyleProperties(`${TRANSITION}Duration`); const transitionTimeout = getTimeout(transitionDelays, transitionDurations); const animationDelays = getStyleProperties(`${ANIMATION}Delay`); const animationDurations = getStyleProperties(`${ANIMATION}Duration`); const animationTimeout = getTimeout(animationDelays, animationDurations); let type = null; let timeout = 0; let propCount = 0; if (expectedType === TRANSITION) { if (transitionTimeout > 0) { type = TRANSITION; timeout = transitionTimeout; propCount = transitionDurations.length; } } else if (expectedType === ANIMATION) { if (animationTimeout > 0) { type = ANIMATION; timeout = animationTimeout; propCount = animationDurations.length; } } else { timeout = Math.max(transitionTimeout, animationTimeout); type = timeout > 0 ? transitionTimeout > animationTimeout ? TRANSITION : ANIMATION : null; propCount = type ? type === TRANSITION ? transitionDurations.length : animationDurations.length : 0; } const hasTransform = type === TRANSITION && /\b(?:transform|all)(?:,|$)/.test( getStyleProperties(`${TRANSITION}Property`).toString() ); return { type, timeout, propCount, hasTransform }; } function getTimeout(delays, durations) { while (delays.length < durations.length) { delays = delays.concat(delays); } return Math.max(...durations.map((d, i) => toMs(d) + toMs(delays[i]))); } function toMs(s) { if (s === "auto") return 0; return Number(s.slice(0, -1).replace(",", ".")) * 1e3; } function forceReflow(el) { const targetDocument = el ? el.ownerDocument : document; return targetDocument.body.offsetHeight; } function patchClass(el, value, isSVG) { const transitionClasses = el[vtcKey]; if (transitionClasses) { value = (value ? [value, ...transitionClasses] : [...transitionClasses]).join(" "); } if (value == null) { el.removeAttribute("class"); } else if (isSVG) { el.setAttribute("class", value); } else { el.className = value; } } const vShowOriginalDisplay = Symbol("_vod"); const vShowHidden = Symbol("_vsh"); const CSS_VAR_TEXT = Symbol(""); const displayRE = /(?:^|;)\s*display\s*:/; function patchStyle(el, prev, next) { const style = el.style; const isCssString = isString(next); let hasControlledDisplay = false; if (next && !isCssString) { if (prev) { if (!isString(prev)) { for (const key in prev) { if (next[key] == null) { setStyle(style, key, ""); } } } else { for (const prevStyle of prev.split(";")) { const key = prevStyle.slice(0, prevStyle.indexOf(":")).trim(); if (next[key] == null) { setStyle(style, key, ""); } } } } for (const key in next) { if (key === "display") { hasControlledDisplay = true; } setStyle(style, key, next[key]); } } else { if (isCssString) { if (prev !== next) { const cssVarText = style[CSS_VAR_TEXT]; if (cssVarText) { next += ";" + cssVarText; } style.cssText = next; hasControlledDisplay = displayRE.test(next); } } else if (prev) { el.removeAttribute("style"); } } if (vShowOriginalDisplay in el) { el[vShowOriginalDisplay] = hasControlledDisplay ? style.display : ""; if (el[vShowHidden]) { style.display = "none"; } } } const importantRE = /\s*!important$/; function setStyle(style, name, val) { if (isArray(val)) { val.forEach((v) => setStyle(style, name, v)); } else { if (val == null) val = ""; if (name.startsWith("--")) { style.setProperty(name, val); } else { const prefixed = autoPrefix(style, name); if (importantRE.test(val)) { style.setProperty( hyphenate(prefixed), val.replace(importantRE, ""), "important" ); } else { style[prefixed] = val; } } } } const prefixes = ["Webkit", "Moz", "ms"]; const prefixCache = {}; function autoPrefix(style, rawName) { const cached = prefixCache[rawName]; if (cached) { return cached; } let name = camelize(rawName); if (name !== "filter" && name in style) { return prefixCache[rawName] = name; } name = capitalize(name); for (let i = 0; i < prefixes.length; i++) { const prefixed = prefixes[i] + name; if (prefixed in style) { return prefixCache[rawName] = prefixed; } } return rawName; } const xlinkNS = "http://www.w3.org/1999/xlink"; function patchAttr(el, key, value, isSVG, instance, isBoolean = isSpecialBooleanAttr(key)) { if (isSVG && key.startsWith("xlink:")) { if (value == null) { el.removeAttributeNS(xlinkNS, key.slice(6, key.length)); } else { el.setAttributeNS(xlinkNS, key, value); } } else { if (value == null || isBoolean && !includeBooleanAttr(value)) { el.removeAttribute(key); } else { el.setAttribute( key, isBoolean ? "" : isSymbol(value) ? String(value) : value ); } } } function patchDOMProp(el, key, value, parentComponent, attrName) { if (key === "innerHTML" || key === "textContent") { if (value != null) { el[key] = key === "innerHTML" ? unsafeToTrustedHTML(value) : value; } return; } const tag = el.tagName; if (key === "value" && tag !== "PROGRESS" && // custom elements may use _value internally !tag.includes("-")) { const oldValue = tag === "OPTION" ? el.getAttribute("value") || "" : el.value; const newValue = value == null ? ( // #11647: value should be set as empty string for null and undefined, // but <input type="checkbox"> should be set as 'on'. el.type === "checkbox" ? "on" : "" ) : String(value); if (oldValue !== newValue || !("_value" in el)) { el.value = newValue; } if (value == null) { el.removeAttribute(key); } el._value = value; return; } let needRemove = false; if (value === "" || value == null) { const type = typeof el[key]; if (type === "boolean") { value = includeBooleanAttr(value); } else if (value == null && type === "string") { value = ""; needRemove = true; } else if (type === "number") { value = 0; needRemove = true; } } try { el[key] = value; } catch (e) { } needRemove && el.removeAttribute(attrName || key); } function addEventListener(el, event, handler, options) { el.addEventListener(event, handler, options); } function removeEventListener(el, event, handler, options) { el.removeEventListener(event, handler, options); } const veiKey = Symbol("_vei"); function patchEvent(el, rawName, prevValue, nextValue, instance = null) { const invokers = el[veiKey] || (el[veiKey] = {}); const existingInvoker = invokers[rawName]; if (nextValue && existingInvoker) { existingInvoker.value = nextValue; } else { const [name, options] = parseName(rawName); if (nextValue) { const invoker = invokers[rawName] = createInvoker( nextValue, instance ); addEventListener(el, name, invoker, options); } else if (existingInvoker) { removeEventListener(el, name, existingInvoker, options); invokers[rawName] = void 0; } } } const optionsModifierRE = /(?:Once|Passive|Capture)$/; function parseName(name) { let options; if (optionsModifierRE.test(name)) { options = {}; let m; while (m = name.match(optionsModifierRE)) { name = name.slice(0, name.length - m[0].length); options[m[0].toLowerCase()] = true; } } const event = name[2] === ":" ? name.slice(3) : hyphenate(name.slice(2)); return [event, options]; } let cachedNow = 0; const p = /* @__PURE__ */ Promise.resolve(); const getNow = () => cachedNow || (p.then(() => cachedNow = 0), cachedNow = Date.now()); function createInvoker(initialValue, instance) { const invoker = (e) => { if (!e._vts) { e._vts = Date.now(); } else if (e._vts <= invoker.attached) { return; } callWithAsyncErrorHandling( patchStopImmediatePropagation(e, invoker.value), instance, 5, [e] ); }; invoker.value = initialValue; invoker.attached = getNow(); return invoker; } function patchStopImmediatePropagation(e, value) { if (isArray(value)) { const originalStop = e.stopImmediatePropagation; e.stopImmediatePropagation = () => { originalStop.call(e); e._stopped = true; }; return value.map( (fn) => (e2) => !e2._stopped && fn && fn(e2) ); } else { return value; } } const isNativeOn = (key) => key.charCodeAt(0) === 111 && key.charCodeAt(1) === 110 && // lowercase letter key.charCodeAt(2) > 96 && key.charCodeAt(2) < 123; const patchProp = (el, key, prevValue, nextValue, namespace, parentComponent) => { const isSVG = namespace === "svg"; if (key === "class") { patchClass(el, nextValue, isSVG); } else if (key === "style") { patchStyle(el, prevValue, nextValue); } else if (isOn(key)) { if (!isModelListener(key)) { patchEvent(el, key, prevValue, nextValue, parentComponent); } } else if (key[0] === "." ? (key = key.slice(1), true) : key[0] === "^" ? (key = key.slice(1), false) : shouldSetAsProp(el, key, nextValue, isSVG)) { patchDOMProp(el, key, nextValue); if (!el.tagName.includes("-") && (key === "value" || key === "checked" || key === "selected")) { patchAttr(el, key, nextValue, isSVG, parentComponent, key !== "value"); } } else if ( // #11081 force set props for possible async custom element el._isVueCE && (/[A-Z]/.test(key) || !isString(nextValue)) ) { patchDOMProp(el, camelize(key), nextValue, parentComponent, key); } else { if (key === "true-value") { el._trueValue = nextValue; } else if (key === "false-value") { el._falseValue = nextValue; } patchAttr(el, key, nextValue, isSVG); } }; function shouldSetAsProp(el, key, value, isSVG) { if (isSVG) { if (key === "innerHTML" || key === "textContent") { return true; } if (key in el && isNativeOn(key) && isFunction(value)) { return true; } return false; } if (key === "spellcheck" || key === "draggable" || key === "translate" || key === "autocorrect") { return false; } if (key === "form") { return false; } if (key === "list" && el.tagName === "INPUT") { return false; } if (key === "type" && el.tagName === "TEXTAREA") { return false; } if (key === "width" || key === "height") { const tag = el.tagName; if (tag === "IMG" || tag === "VIDEO" || tag === "CANVAS" || tag === "SOURCE") { return false; } } if (isNativeOn(key) && isString(value)) { return false; } return key in el; } const getModelAssigner = (vnode) => { const fn = vnode.props["onUpdate:modelValue"] || false; return isArray(fn) ? (value) => invokeArrayFns(fn, value) : fn; }; function onCompositionStart(e) { e.target.composing = true; } function onCompositionEnd(e) { const target = e.target; if (target.composing) { target.composing = false; target.dispatchEvent(new Event("input")); } } const assignKey = Symbol("_assign"); const vModelText = { created(el, { modifiers: { lazy, trim, number } }, vnode) { el[assignKey] = getModelAssigner(vnode); const castToNumber = number || vnode.props && vnode.props.type === "number"; addEventListener(el, lazy ? "change" : "input", (e) => { if (e.target.composing) return; let domValue = el.value; if (trim) { domValue = domValue.trim(); } if (castToNumber) { domValue = looseToNumber(domValue); } el[assignKey](domValue); }); if (trim) { addEventListener(el, "change", () => { el.value = el.value.trim(); }); } if (!lazy) { addEventListener(el, "compositionstart", onCompositionStart); addEventListener(el, "compositionend", onCompositionEnd); addEventListener(el, "change", onCompositionEnd); } }, // set value on mounted so it's after min/max for type="range" mounted(el, { value }) { el.value = value == null ? "" : value; }, beforeUpdate(el, { value, oldValue, modifiers: { lazy, trim, number } }, vnode) { el[assignKey] = getModelAssigner(vnode); if (el.composing) return; const elValue = (number || el.type === "number") && !/^0\d/.test(el.value) ? looseToNumber(el.value) : el.value; const newValue = value == null ? "" : value; if (elValue === newValue) { return; } if (document.activeElement === el && el.type !== "range") { if (lazy && value === oldValue) { return; } if (trim && el.value.trim() === newValue) { return; } } el.value = newValue; } }; const vModelCheckbox = { // #4096 array checkboxes need to be deep traversed deep: true, created(el, _, vnode) { el[assignKey] = getModelAssigner(vnode); addEventListener(el, "change", () => { const modelValue = el._modelValue; const elementValue = getValue(el); const checked = el.checked; const assign = el[assignKey]; if (isArray(modelValue)) { const index = looseIndexOf(modelValue, elementValue); const found = index !== -1; if (checked && !found) { assign(modelValue.concat(elementValue)); } else if (!checked && found) { const filtered = [...modelValue]; filtered.splice(index, 1); assign(filtered); } } else if (isSet(modelValue)) { const cloned = new Set(modelValue); if (checked) { cloned.add(elementValue); } else { cloned.delete(elementValue); } assign(cloned); } else { assign(getCheckboxValue(el, checked)); } }); }, // set initial checked on mount to wait for true-value/false-value mounted: setChecked, beforeUpdate(el, binding, vnode) { el[assignKey] = getModelAssigner(vnode); setChecked(el, binding, vnode); } }; function setChecked(el, { value, oldValue }, vnode) { el._modelValue = value; let checked; if (isArray(value)) { checked = looseIndexOf(value, vnode.props.value) > -1; } else if (isSet(value)) { checked = value.has(vnode.props.value); } else { if (value === oldValue) return; checked = looseEqual(value, getCheckboxValue(el, true)); } if (el.checked !== checked) { el.checked = checked; } } function getValue(el) { return "_value" in el ? el._value : el.value; } function getCheckboxValue(el, checked) { const key = checked ? "_trueValue" : "_falseValue"; return key in el ? el[key] : checked; } const systemModifiers = ["ctrl", "shift", "alt", "meta"]; const modifierGuards = { stop: (e) => e.stopPropagation(), prevent: (e) => e.preventDefault(), self: (e) => e.target !== e.currentTarget, ctrl: (e) => !e.ctrlKey, shift: (e) => !e.shiftKey, alt: (e) => !e.altKey, meta: (e) => !e.metaKey, left: (e) => "button" in e && e.button !== 0, middle: (e) => "button" in e && e.button !== 1, right: (e) => "button" in e && e.button !== 2, exact: (e, modifiers) => systemModifiers.some((m) => e[`${m}Key`] && !modifiers.includes(m)) }; const withModifiers = (fn, modifiers) => { const cache = fn._withMods || (fn._withMods = {}); const cacheKey = modifiers.join("."); return cache[cacheKey] || (cache[cacheKey] = (event, ...args) => { for (let i = 0; i < modifiers.length; i++) { const guard = modifierGuards[modifiers[i]]; if (guard && guard(event, modifiers)) return; } return fn(event, ...args); }); }; const rendererOptions = /* @__PURE__ */ extend({ patchProp }, nodeOps); let renderer; function ensureRenderer() { return renderer || (renderer = createRenderer(rendererOptions)); } const createApp = (...args) => { const app = ensureRenderer().createApp(...args); const { mount } = app; app.mount = (containerOrSelector) => { const container = normalizeContainer(containerOrSelector); if (!container) return; const component = app._component; if (!isFunction(component) && !component.render && !component.template) { component.template = container.innerHTML; } if (container.nodeType === 1) { container.textContent = ""; } const proxy = mount(container, false, resolveRootNamespace(container)); if (container instanceof Element) { container.removeAttribute("v-cloak"); container.setAttribute("data-v-app", ""); } return proxy; }; return app; }; function resolveRootNamespace(container) { if (container instanceof SVGElement) { return "svg"; } if (typeof MathMLElement === "function" && container instanceof MathMLElement) { return "mathml"; } } function normalizeContainer(container) { if (isString(container)) { const res = document.querySelector(container); return res; } return container; } const _export_sfc = (sfc, props) => { const target = sfc.__vccOpts || sfc; for (const [key, val] of props) { target[key] = val; } return target; }; const _hoisted_1$8 = { class: "window-content" }; const _sfc_main$9 = { __name: 'FloatingWindow', props: { isVisible: { type: Boolean, default: false }, title: { type: String, default: 'Beeline Helper' }, showBackButton: { type: Boolean, default: false }, autoAnswerMode: { type: Boolean, default: false }, initialPosition: { type: Object, default: () => ({ top: window.innerHeight / 2 - 150, left: 20 // 移动到屏幕左侧 }) } }, emits: ['close', 'back'], setup(__props, { emit: __emit }) { const floatingWindow = ref(null); const isDragging = ref(false); const dragOffset = reactive({ x: 0, y: 0 }); const position = reactive({ top: 20, // 固定在顶部 left: 20 // 固定在左侧 }); const startDrag = (e) => { isDragging.value = true; const rect = floatingWindow.value.getBoundingClientRect(); if (e.type === 'mousedown') { dragOffset.x = e.clientX - rect.left; dragOffset.y = e.clientY - rect.top; } else if (e.type === 'touchstart') { const touch = e.touches[0]; dragOffset.x = touch.clientX - rect.left; dragOffset.y = touch.clientY - rect.top; } e.preventDefault(); }; const onDrag = (e) => { if (!isDragging.value) return let clientX, clientY; if (e.type === 'mousemove') { clientX = e.clientX; clientY = e.clientY; } else if (e.type === 'touchmove') { const touch = e.touches[0]; clientX = touch.clientX; clientY = touch.clientY; } const newLeft = clientX - dragOffset.x; const newTop = clientY - dragOffset.y; const windowWidth = floatingWindow.value.offsetWidth; const windowHeight = floatingWindow.value.offsetHeight; // 使用requestAnimationFrame优化性能 requestAnimationFrame(() => { position.left = Math.max(0, Math.min(newLeft, window.innerWidth - windowWidth)); position.top = Math.max(0, Math.min(newTop, window.innerHeight - windowHeight)); }); e.preventDefault(); }; const stopDrag = () => { isDragging.value = false; }; onMounted(() => { document.addEventListener('mousemove', onDrag); document.addEventListener('mouseup', stopDrag); document.addEventListener('touchmove', onDrag, { passive: false }); document.addEventListener('touchend', stopDrag); }); onUnmounted(() => { document.removeEventListener('mousemove', onDrag); document.removeEventListener('mouseup', stopDrag); document.removeEventListener('touchmove', onDrag); document.removeEventListener('touchend', stopDrag); }); return (_ctx, _cache) => { return (__props.isVisible) ? (openBlock(), createElementBlock("div", { key: 0, ref_key: "floatingWindow", ref: floatingWindow, class: normalizeClass(["floating-window", { 'window-hidden': !__props.isVisible, 'auto-answer-mode': __props.autoAnswerMode }]), style: normalizeStyle({ top: position.top + 'px', left: position.left + 'px', transform: 'none', willChange: isDragging.value ? 'transform' : 'auto' }) }, [ createBaseVNode("div", { class: "window-header", onMousedown: startDrag, onTouchstart: startDrag }, [ (__props.showBackButton) ? (openBlock(), createElementBlock("button", { key: 0, class: "back-btn", onClick: _cache[0] || (_cache[0] = $event => (_ctx.$emit('back'))) }, "←")) : createCommentVNode("", true), createBaseVNode("h3", null, toDisplayString(__props.title), 1), createBaseVNode("button", { class: "close-btn", onClick: _cache[1] || (_cache[1] = $event => (_ctx.$emit('close'))) }, "×") ], 32), createBaseVNode("div", _hoisted_1$8, [ renderSlot(_ctx.$slots, "default", {}, undefined) ]) ], 6)) : createCommentVNode("", true) } } }; const FloatingWindow = /*#__PURE__*/_export_sfc(_sfc_main$9, [['__scopeId',"data-v-1f178cdb"]]); const _hoisted_1$7 = { class: "status-window" }; const _hoisted_2$6 = { class: "status-content" }; const _hoisted_3$6 = { class: "current-status" }; const _hoisted_4$6 = { class: "operation-history" }; const _hoisted_5$6 = { class: "history-list" }; const _hoisted_6$5 = { class: "history-time" }; const _hoisted_7$5 = { class: "history-message" }; const _hoisted_8$5 = { key: 0, class: "no-history" }; const _sfc_main$8 = { __name: 'StatusWindow', props: { currentStatus: { type: String, default: '未启动' }, operationHistory: { type: Array, default: () => [] } }, setup(__props) { const getStatusClass = (status) => { const statusClasses = { '检测中...': 'status-detecting', '检测到按钮,等待点击...': 'status-waiting', '已点击完成按钮': 'status-success', '未检测到按钮': 'status-no-button', '已停止': 'status-stopped' }; return statusClasses[status] || '' }; return (_ctx, _cache) => { return (openBlock(), createElementBlock("div", _hoisted_1$7, [ _cache[2] || (_cache[2] = createBaseVNode("div", { class: "status-header" }, [ createBaseVNode("span", { class: "status-title" }, "操作日志") ], -1)), createBaseVNode("div", _hoisted_2$6, [ createBaseVNode("div", _hoisted_3$6, [ _cache[0] || (_cache[0] = createBaseVNode("span", { class: "status-label" }, "当前状态:", -1)), createBaseVNode("span", { class: normalizeClass(["status-value", getStatusClass(__props.currentStatus)]) }, toDisplayString(__props.currentStatus), 3) ]), createBaseVNode("div", _hoisted_4$6, [ _cache[1] || (_cache[1] = createBaseVNode("div", { class: "history-title" }, "操作历史", -1)), createBaseVNode("div", _hoisted_5$6, [ (openBlock(true), createElementBlock(Fragment, null, renderList(__props.operationHistory, (item, index) => { return (openBlock(), createElementBlock("div", { key: index, class: "history-item" }, [ createBaseVNode("span", _hoisted_6$5, toDisplayString(item.time), 1), createBaseVNode("span", _hoisted_7$5, toDisplayString(item.message), 1) ])) }), 128)), (__props.operationHistory.length === 0) ? (openBlock(), createElementBlock("div", _hoisted_8$5, " 暂无操作记录 ")) : createCommentVNode("", true) ]) ]) ]) ])) } } }; const StatusWindow = /*#__PURE__*/_export_sfc(_sfc_main$8, [['__scopeId',"data-v-99aa1d36"]]); const _sfc_main$7 = { __name: 'ControlButton', props: { isWindowVisible: { type: Boolean, default: false } }, emits: ['click'], setup(__props) { return (_ctx, _cache) => { return (openBlock(), createElementBlock("div", { class: normalizeClass(["control-button", { 'button-hidden': __props.isWindowVisible }]), onClick: _cache[0] || (_cache[0] = $event => (_ctx.$emit('click'))) }, [...(_cache[1] || (_cache[1] = [ createBaseVNode("span", { class: "button-icon" }, "🔧", -1) ]))], 2)) } } }; const ControlButton = /*#__PURE__*/_export_sfc(_sfc_main$7, [['__scopeId',"data-v-29767e33"]]); const _hoisted_1$6 = { class: "features" }; const _sfc_main$6 = { __name: 'MainPage', emits: ['navigate', 'open-about'], setup(__props) { return (_ctx, _cache) => { return (openBlock(), createElementBlock("div", null, [ _cache[4] || (_cache[4] = createBaseVNode("p", null, "欢迎使用 Beeline Helper!", -1)), createBaseVNode("div", _hoisted_1$6, [ createBaseVNode("button", { class: "feature-btn", onClick: _cache[0] || (_cache[0] = $event => (_ctx.$emit('navigate', 'auto-course'))) }, "全自动刷课配置"), createBaseVNode("button", { class: "feature-btn", onClick: _cache[1] || (_cache[1] = $event => (_ctx.$emit('navigate', 'auto-answer'))) }, "自动答题"), createBaseVNode("button", { class: "feature-btn", onClick: _cache[2] || (_cache[2] = $event => (_ctx.$emit('navigate', 'advanced-settings'))) }, "高级设置"), createBaseVNode("button", { class: "feature-btn", onClick: _cache[3] || (_cache[3] = $event => (_ctx.$emit('open-about'))) }, "关于") ]) ])) } } }; const MainPage = /*#__PURE__*/_export_sfc(_sfc_main$6, [['__scopeId',"data-v-fb2a58e0"]]); const _hoisted_1$5 = { class: "toggle-features" }; const _hoisted_2$5 = { class: "toggle-item" }; const _hoisted_3$5 = { class: "toggle-switch" }; const _hoisted_4$5 = ["checked"]; const _hoisted_5$5 = { class: "toggle-item" }; const _hoisted_6$4 = { class: "toggle-switch" }; const _hoisted_7$4 = ["checked"]; const _hoisted_8$4 = { class: "toggle-item" }; const _hoisted_9$3 = { class: "toggle-switch" }; const _hoisted_10$3 = ["checked"]; const _sfc_main$5 = { __name: 'AutoCoursePage', props: { autoCompleteEnabled: { type: Boolean, default: false }, autoMuteEnabled: { type: Boolean, default: false }, FxxKXinWeiEnabled: { type: Boolean, default: false } }, emits: ['toggle-auto-complete', 'toggle-auto-mute', 'toggle-FxxK-xin-wei'], setup(__props) { const props = __props; return (_ctx, _cache) => { return (openBlock(), createElementBlock("div", null, [ createBaseVNode("div", _hoisted_1$5, [ createBaseVNode("div", _hoisted_2$5, [ _cache[4] || (_cache[4] = createBaseVNode("span", { class: "toggle-label" }, "自动点击下一集", -1)), createBaseVNode("label", _hoisted_3$5, [ createBaseVNode("input", { type: "checkbox", checked: props.autoCompleteEnabled, onChange: _cache[0] || (_cache[0] = $event => (_ctx.$emit('toggle-auto-complete', !props.autoCompleteEnabled))) }, null, 40, _hoisted_4$5), _cache[3] || (_cache[3] = createBaseVNode("span", { class: "toggle-slider" }, null, -1)) ]) ]), createBaseVNode("div", _hoisted_5$5, [ _cache[6] || (_cache[6] = createBaseVNode("span", { class: "toggle-label" }, "自动静音", -1)), createBaseVNode("label", _hoisted_6$4, [ createBaseVNode("input", { type: "checkbox", checked: props.autoMuteEnabled, onChange: _cache[1] || (_cache[1] = $event => (_ctx.$emit('toggle-auto-mute', !props.autoMuteEnabled))) }, null, 40, _hoisted_7$4), _cache[5] || (_cache[5] = createBaseVNode("span", { class: "toggle-slider" }, null, -1)) ]) ]), createBaseVNode("div", _hoisted_8$4, [ _cache[8] || (_cache[8] = createBaseVNode("span", { class: "toggle-label FxxK-xin-wei" }, "FxxK XinWei", -1)), createBaseVNode("label", _hoisted_9$3, [ createBaseVNode("input", { type: "checkbox", checked: props.FxxKXinWeiEnabled, onChange: _cache[2] || (_cache[2] = $event => (_ctx.$emit('toggle-FxxK-xin-wei', !props.FxxKXinWeiEnabled))) }, null, 40, _hoisted_10$3), _cache[7] || (_cache[7] = createBaseVNode("span", { class: "toggle-slider" }, null, -1)) ]) ]) ]) ])) } } }; const AutoCoursePage = /*#__PURE__*/_export_sfc(_sfc_main$5, [['__scopeId',"data-v-3bb0b416"]]); const _imports_0$1 = "data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='95'%20height='88'%20fill='none'%3e%3cpath%20fill='%23FFD21E'%20d='M47.21%2076.5a34.75%2034.75%200%201%200%200-69.5%2034.75%2034.75%200%200%200%200%2069.5Z'%20/%3e%3cpath%20fill='%23FF9D0B'%20d='M81.96%2041.75a34.75%2034.75%200%201%200-69.5%200%2034.75%2034.75%200%200%200%2069.5%200Zm-73.5%200a38.75%2038.75%200%201%201%2077.5%200%2038.75%2038.75%200%200%201-77.5%200Z'%20/%3e%3cpath%20fill='%233A3B45'%20d='M58.5%2032.3c1.28.44%201.78%203.06%203.07%202.38a5%205%200%201%200-6.76-2.07c.61%201.15%202.55-.72%203.7-.32ZM34.95%2032.3c-1.28.44-1.79%203.06-3.07%202.38a5%205%200%201%201%206.76-2.07c-.61%201.15-2.56-.72-3.7-.32Z'%20/%3e%3cpath%20fill='%23FF323D'%20d='M46.96%2056.29c9.83%200%2013-8.76%2013-13.26%200-2.34-1.57-1.6-4.09-.36-2.33%201.15-5.46%202.74-8.9%202.74-7.19%200-13-6.88-13-2.38s3.16%2013.26%2013%2013.26Z'%20/%3e%3cpath%20fill='%233A3B45'%20fill-rule='evenodd'%20d='M39.43%2054a8.7%208.7%200%200%201%205.3-4.49c.4-.12.81.57%201.24%201.28.4.68.82%201.37%201.24%201.37.45%200%20.9-.68%201.33-1.35.45-.7.89-1.38%201.32-1.25a8.61%208.61%200%200%201%205%204.17c3.73-2.94%205.1-7.74%205.1-10.7%200-2.34-1.57-1.6-4.09-.36l-.14.07c-2.31%201.15-5.39%202.67-8.77%202.67s-6.45-1.52-8.77-2.67c-2.6-1.29-4.23-2.1-4.23.29%200%203.05%201.46%208.06%205.47%2010.97Z'%20clip-rule='evenodd'%20/%3e%3cpath%20fill='%23FF9D0B'%20d='M70.71%2037a3.25%203.25%200%201%200%200-6.5%203.25%203.25%200%200%200%200%206.5ZM24.21%2037a3.25%203.25%200%201%200%200-6.5%203.25%203.25%200%200%200%200%206.5ZM17.52%2048c-1.62%200-3.06.66-4.07%201.87a5.97%205.97%200%200%200-1.33%203.76%207.1%207.1%200%200%200-1.94-.3c-1.55%200-2.95.59-3.94%201.66a5.8%205.8%200%200%200-.8%207%205.3%205.3%200%200%200-1.79%202.82c-.24.9-.48%202.8.8%204.74a5.22%205.22%200%200%200-.37%205.02c1.02%202.32%203.57%204.14%208.52%206.1%203.07%201.22%205.89%202%205.91%202.01a44.33%2044.33%200%200%200%2010.93%201.6c5.86%200%2010.05-1.8%2012.46-5.34%203.88-5.69%203.33-10.9-1.7-15.92-2.77-2.78-4.62-6.87-5-7.77-.78-2.66-2.84-5.62-6.25-5.62a5.7%205.7%200%200%200-4.6%202.46c-1-1.26-1.98-2.25-2.86-2.82A7.4%207.4%200%200%200%2017.52%2048Zm0%204c.51%200%201.14.22%201.82.65%202.14%201.36%206.25%208.43%207.76%2011.18.5.92%201.37%201.31%202.14%201.31%201.55%200%202.75-1.53.15-3.48-3.92-2.93-2.55-7.72-.68-8.01.08-.02.17-.02.24-.02%201.7%200%202.45%202.93%202.45%202.93s2.2%205.52%205.98%209.3c3.77%203.77%203.97%206.8%201.22%2010.83-1.88%202.75-5.47%203.58-9.16%203.58-3.81%200-7.73-.9-9.92-1.46-.11-.03-13.45-3.8-11.76-7%20.28-.54.75-.76%201.34-.76%202.38%200%206.7%203.54%208.57%203.54.41%200%20.7-.17.83-.6.79-2.85-12.06-4.05-10.98-8.17.2-.73.71-1.02%201.44-1.02%203.14%200%2010.2%205.53%2011.68%205.53.11%200%20.2-.03.24-.1.74-1.2.33-2.04-4.9-5.2-5.21-3.16-8.88-5.06-6.8-7.33.24-.26.58-.38%201-.38%203.17%200%2010.66%206.82%2010.66%206.82s2.02%202.1%203.25%202.1c.28%200%20.52-.1.68-.38.86-1.46-8.06-8.22-8.56-11.01-.34-1.9.24-2.85%201.31-2.85Z'%20/%3e%3cpath%20fill='%23FFD21E'%20d='M38.6%2076.69c2.75-4.04%202.55-7.07-1.22-10.84-3.78-3.77-5.98-9.3-5.98-9.3s-.82-3.2-2.69-2.9c-1.87.3-3.24%205.08.68%208.01%203.91%202.93-.78%204.92-2.29%202.17-1.5-2.75-5.62-9.82-7.76-11.18-2.13-1.35-3.63-.6-3.13%202.2.5%202.79%209.43%209.55%208.56%2011-.87%201.47-3.93-1.71-3.93-1.71s-9.57-8.71-11.66-6.44c-2.08%202.27%201.59%204.17%206.8%207.33%205.23%203.16%205.64%204%204.9%205.2-.75%201.2-12.28-8.53-13.36-4.4-1.08%204.11%2011.77%205.3%2010.98%208.15-.8%202.85-9.06-5.38-10.74-2.18-1.7%203.21%2011.65%206.98%2011.76%207.01%204.3%201.12%2015.25%203.49%2019.08-2.12Z'%20/%3e%3cpath%20fill='%23FF9D0B'%20d='M77.4%2048c1.62%200%203.07.66%204.07%201.87a5.97%205.97%200%200%201%201.33%203.76%207.1%207.1%200%200%201%201.95-.3c1.55%200%202.95.59%203.94%201.66a5.8%205.8%200%200%201%20.8%207%205.3%205.3%200%200%201%201.78%202.82c.24.9.48%202.8-.8%204.74a5.22%205.22%200%200%201%20.37%205.02c-1.02%202.32-3.57%204.14-8.51%206.1-3.08%201.22-5.9%202-5.92%202.01a44.33%2044.33%200%200%201-10.93%201.6c-5.86%200-10.05-1.8-12.46-5.34-3.88-5.69-3.33-10.9%201.7-15.92%202.78-2.78%204.63-6.87%205.01-7.77.78-2.66%202.83-5.62%206.24-5.62a5.7%205.7%200%200%201%204.6%202.46c1-1.26%201.98-2.25%202.87-2.82A7.4%207.4%200%200%201%2077.4%2048Zm0%204c-.51%200-1.13.22-1.82.65-2.13%201.36-6.25%208.43-7.76%2011.18a2.43%202.43%200%200%201-2.14%201.31c-1.54%200-2.75-1.53-.14-3.48%203.91-2.93%202.54-7.72.67-8.01a1.54%201.54%200%200%200-.24-.02c-1.7%200-2.45%202.93-2.45%202.93s-2.2%205.52-5.97%209.3c-3.78%203.77-3.98%206.8-1.22%2010.83%201.87%202.75%205.47%203.58%209.15%203.58%203.82%200%207.73-.9%209.93-1.46.1-.03%2013.45-3.8%2011.76-7-.29-.54-.75-.76-1.34-.76-2.38%200-6.71%203.54-8.57%203.54-.42%200-.71-.17-.83-.6-.8-2.85%2012.05-4.05%2010.97-8.17-.19-.73-.7-1.02-1.44-1.02-3.14%200-10.2%205.53-11.68%205.53-.1%200-.19-.03-.23-.1-.74-1.2-.34-2.04%204.88-5.2%205.23-3.16%208.9-5.06%206.8-7.33-.23-.26-.57-.38-.98-.38-3.18%200-10.67%206.82-10.67%206.82s-2.02%202.1-3.24%202.1a.74.74%200%200%201-.68-.38c-.87-1.46%208.05-8.22%208.55-11.01.34-1.9-.24-2.85-1.31-2.85Z'%20/%3e%3cpath%20fill='%23FFD21E'%20d='M56.33%2076.69c-2.75-4.04-2.56-7.07%201.22-10.84%203.77-3.77%205.97-9.3%205.97-9.3s.82-3.2%202.7-2.9c1.86.3%203.23%205.08-.68%208.01-3.92%202.93.78%204.92%202.28%202.17%201.51-2.75%205.63-9.82%207.76-11.18%202.13-1.35%203.64-.6%203.13%202.2-.5%202.79-9.42%209.55-8.55%2011%20.86%201.47%203.92-1.71%203.92-1.71s9.58-8.71%2011.66-6.44c2.08%202.27-1.58%204.17-6.8%207.33-5.23%203.16-5.63%204-4.9%205.2.75%201.2%2012.28-8.53%2013.36-4.4%201.08%204.11-11.76%205.3-10.97%208.15.8%202.85%209.05-5.38%2010.74-2.18%201.69%203.21-11.65%206.98-11.76%207.01-4.31%201.12-15.26%203.49-19.08-2.12Z'%20/%3e%3c/svg%3e"; // src/native/alias.ts var _GM_getValue = /* @__PURE__ */ (() => typeof GM_getValue != "undefined" ? GM_getValue : void 0)(); var _GM_setValue = /* @__PURE__ */ (() => typeof GM_setValue != "undefined" ? GM_setValue : void 0)(); /** * 获取存储的值 * @param {string} key 存储键名 * @param {any} defaultValue 默认值 * @returns {Promise<any>} */ async function getStorageValue$1(key, defaultValue = null) { try { const value = await _GM_getValue(key, defaultValue); // 如果是字符串,尝试解析为 JSON if (typeof value === 'string') { try { return JSON.parse(value) } catch { return value } } return value } catch (error) { console.warn(`Failed to get storage value for key "${key}":`, error); return defaultValue } } /** * 设置存储的值 * @param {string} key 存储键名 * @param {any} value 要存储的值 * @returns {Promise<void>} */ async function setStorageValue(key, value) { try { // 如果是对象或数组,转换为 JSON 字符串 const storageValue = typeof value === 'object' || Array.isArray(value) ? JSON.stringify(value) : value; await _GM_setValue(key, storageValue); } catch (error) { console.warn(`Failed to set storage value for key "${key}":`, error); } } const scriptRel = (function detectScriptRel() { const relList = typeof document !== "undefined" && document.createElement("link").relList; return relList && relList.supports && relList.supports("modulepreload") ? "modulepreload" : "preload"; })();const assetsURL = function(dep) { return "/"+dep };const seen = {};const __vitePreload = function preload(baseModule, deps, importerUrl) { let promise = Promise.resolve(); if (deps && deps.length > 0) { document.getElementsByTagName("link"); const cspNonceMeta = document.querySelector( "meta[property=csp-nonce]" ); const cspNonce = cspNonceMeta?.nonce || cspNonceMeta?.getAttribute("nonce"); promise = Promise.allSettled( deps.map((dep) => { dep = assetsURL(dep); if (dep in seen) return; seen[dep] = true; const isCss = dep.endsWith(".css"); const cssSelector = isCss ? '[rel="stylesheet"]' : ""; if (document.querySelector(`link[href="${dep}"]${cssSelector}`)) { return; } const link = document.createElement("link"); link.rel = isCss ? "stylesheet" : scriptRel; if (!isCss) { link.as = "script"; } link.crossOrigin = ""; link.href = dep; if (cspNonce) { link.setAttribute("nonce", cspNonce); } document.head.appendChild(link); if (isCss) { return new Promise((res, rej) => { link.addEventListener("load", res); link.addEventListener( "error", () => rej(new Error(`Unable to preload CSS for ${dep}`)) ); }); } }) ); } function handlePreloadError(err) { const e = new Event("vite:preloadError", { cancelable: true }); e.payload = err; window.dispatchEvent(e); if (!e.defaultPrevented) { throw err; } } return promise.then((res) => { for (const item of res || []) { if (item.status !== "rejected") continue; handlePreloadError(item.reason); } return baseModule().catch(handlePreloadError); }); }; /** * 题目检测工具类 * 用于检测题目类型、提取题目内容、获取选项等 */ /** * 检测题目类型 * @returns {string} 题目类型 'single' | 'multiple' | 'judgement' | 'completion' | 'subjective' | 'unknown' */ function detectQuestionType() { const typeElement = document.querySelector('span.tag.el-tooltip__trigger'); if (!typeElement) return 'unknown'; const typeText = typeElement.textContent.trim(); const questionType = (() => { switch (typeText) { case '单选题': return 'single'; case '多选题': return 'multiple'; case '判断题': return 'judgement'; case '填空题': return 'completion'; case '主观题': return 'subjective'; default: return 'unknown'; } })(); console.log('[BeelineHelper] detectQuestionType result:', typeText, '->', questionType); return questionType; } /** * 提取题目内容 * @param {string} questionType 题目类型 * @returns {object} 题目信息 { question: string, options: string[] } */ function extractQuestionContent(questionType) { let question = ''; let options = []; switch (questionType) { case 'single': case 'multiple': // 单选题和多选题 - 使用更通用的选择器 const questionElement = document.querySelector('.question'); if (questionElement) { // 提取题目 const titleElement = questionElement.querySelector('.topic-title'); if (titleElement) { question = titleElement.textContent.trim(); } // 提取选项 const optionElements = questionElement.querySelectorAll('.el-radio, .el-checkbox'); options = Array.from(optionElements).map(option => { const labelElement = option.querySelector('.label'); return labelElement ? labelElement.textContent.trim() : ''; }).filter(text => text); } break; case 'judgement': // 判断题 - 使用更通用的选择器 const judgementElement = document.querySelector('.topic-title'); if (judgementElement) { question = judgementElement.textContent.trim(); options = ['正确', '错误']; } break; case 'completion': // 填空题 - 提取题目内容 const completionElement = document.querySelector('.topic-title'); if (completionElement) { question = completionElement.textContent.trim(); } break; case 'subjective': // 主观题 - 提取题目内容 let subjectiveElement = document.querySelector('.homework-question-editor .content span'); if (!subjectiveElement) { // 尝试新的路径 subjectiveElement = document.querySelector('#LayoutTeaching .homework-question-editor .content p'); } if (subjectiveElement) { question = subjectiveElement.textContent.trim(); } break; } return { question, options }; } /** * 获取选项对应的DOM元素 * @param {string} questionType 题目类型 * @param {string} option 选项标识 (A, B, C, D 等) * @returns {HTMLElement|null} 选项DOM元素 */ function getOptionElement(questionType, option) { const optionIndex = option.charCodeAt(0) - 65; // A=0, B=1, C=2, D=3 switch (questionType) { case 'single': // 使用更通用的选择器 const radioGroup = document.querySelector('.el-radio-group'); if (radioGroup) { const radioLabels = radioGroup.querySelectorAll('label'); if (radioLabels.length > optionIndex) { return radioLabels[optionIndex].querySelector('.el-radio__input span'); } } break; case 'multiple': // 使用更通用的选择器 const checkboxGroup = document.querySelector('.el-checkbox-group'); if (checkboxGroup) { const checkboxLabels = checkboxGroup.querySelectorAll('label'); if (checkboxLabels.length > optionIndex) { return checkboxLabels[optionIndex].querySelector('.el-checkbox__input span'); } } break; case 'judgement': // 判断题 const judgementGroup = document.querySelector('.el-radio-group'); if (judgementGroup) { const judgementLabels = judgementGroup.querySelectorAll('label'); if (option === 'A' && judgementLabels.length > 0) { return judgementLabels[0].querySelector('.el-radio__input span'); } else if (option === 'B' && judgementLabels.length > 1) { return judgementLabels[1].querySelector('.el-radio__input span'); } } break; } return null; } /** * 点击选项 * @param {string} questionType 题目类型 * @param {string} option 选项标识 * @returns {boolean} 是否成功点击 */ async function clickOption(questionType, option) { const element = getOptionElement(questionType, option); if (element) { // 对于多选题,使用轮询式点击 if (questionType === 'multiple') { const checkboxInput = element.closest('.el-checkbox__input'); if (checkboxInput) { const input = checkboxInput.querySelector('input[type="checkbox"]'); if (input) { // 轮询式点击:先点击一次,然后检查状态,如果没选中再点击 let clickCount = 0; const maxClicks = 3; // 最多尝试3次 while (clickCount < maxClicks && !input.checked) { element.click(); clickCount++; // 短暂延迟让DOM更新 await new Promise(resolve => setTimeout(resolve, 100)); } return input.checked; } } } else { // 单选题和判断题直接点击 element.click(); return true; } } return false; } /** * 检查题目是否已有选择 * @param {string} questionType 题目类型 * @returns {boolean} 是否已有选择 */ async function hasExistingSelection(questionType) { switch (questionType) { case 'single': case 'judgement': // 检查单选题和判断题是否已有选中项 const radioInputs = document.querySelectorAll('.el-radio__input input[type="radio"]'); for (const input of radioInputs) { if (input.checked) { return true; } } break; case 'multiple': // 检查多选题是否已有选中项 const checkboxInputs = document.querySelectorAll('.el-checkbox__input input[type="checkbox"]'); for (const input of checkboxInputs) { if (input.checked) { return true; } } break; case 'completion': // 填空题已有内容检查在 completionAnswer.js 中处理 return false; case 'subjective': // 主观题已有内容检查在 subjectiveAnswer.js 中处理 return false; } return false; } /** * Converts a detected question type to a standardized format for the question bank API. * @param {string} type The detected question type (e.g., '单选题', '多选题', '判断题', '填空题', '主观题'). * @returns {string} The standardized question type (e.g., 'single', 'multiple', 'judgment', 'completion', 'subjective'). Returns 'unknown' if not recognized. */ function convertQuestionType(type) { switch (type) { case '单选题': return 'single'; case '多选题': return 'multiple'; case '判断题': return 'judgement'; case '填空题': return 'completion'; case '主观题': return 'subjective'; default: return 'unknown'; } } const API_BASE_URL = 'https://tk.enncy.cn/query'; /** * 查询题目答案 * @param {string} question 题目内容 * @param {string[]} options 选项数组 * @param {string} questionType 题目类型 * @param {string} token API token * @returns {Promise<object>} 查询结果 */ async function queryAnswer(question, options = [], questionType = 'unknown', token = '') { if (!question.trim()) { return { success: false, message: '题目内容为空' }; } try { const apiToken = token || getStorageValue('beelineHelper_apiToken', ''); // Use passed token or retrieve from storage if (!apiToken) { return { success: false, message: '请在答题设置中配置题库 Token' }; } const params = new URLSearchParams({ title: question, type: convertQuestionType(questionType), ...(apiToken && { token: apiToken }) }); // 如果有选项,添加到参数中 if (options.length > 0) { params.append('options', options.join('\n')); } const response = await fetch(`${API_BASE_URL}?${params.toString()}`); if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); } const data = await response.json(); if (data.code === 1) { return { success: true, question: data.data.question, answer: data.data.answer, times: data.data.times, message: data.message }; } else { return { success: false, question: data.data?.question || '未找到答案', answer: data.data?.answer || '很抱歉,题目搜索不到', times: data.data?.times || 0, message: data.message }; } } catch (error) { console.error('题库API查询失败:', error); return { success: false, message: `查询失败: ${error.message}` }; } } /** * 解析答案文本 * @param {string} answerText 答案文本 * @param {string} questionType 题目类型 * @param {string[]} options 选项内容数组 * @returns {string[]} 解析后的选项数组 */ function parseAnswer(answerText, questionType, options = []) { if (!answerText) return []; // 去除标点符号和空格 const cleanAnswer = answerText.replace(/[\s\p{P}]/gu, ''); switch (questionType) { case 'single': // 方法1: 尝试匹配选项字母 const letterMatch = cleanAnswer.match(/[A-D]/i); if (letterMatch) { return [letterMatch[0].toUpperCase()]; } // 方法2: 根据答案内容匹配选项 if (options.length > 0) { for (let i = 0; i < options.length; i++) { const optionText = options[i].replace(/[\s\p{P}]/gu, ''); if (cleanAnswer.includes(optionText) || optionText.includes(cleanAnswer)) { return [String.fromCharCode(65 + i)]; // A, B, C, D } } } // 方法3: 根据常见答案模式匹配 if (cleanAnswer.includes('正确') || cleanAnswer.includes('对') || cleanAnswer.includes('是')) { return ['A']; } else if (cleanAnswer.includes('错误') || cleanAnswer.includes('错') || cleanAnswer.includes('否')) { return ['B']; } return []; case 'multiple': // 多选题答案通常是多个字母 const multipleMatch = cleanAnswer.match(/[A-D]/gi); if (multipleMatch) { return [...new Set(multipleMatch.map(m => m.toUpperCase()))]; } // 如果没有找到字母,尝试根据内容匹配 if (options.length > 0) { const matchedOptions = []; for (let i = 0; i < options.length; i++) { const optionText = options[i].replace(/[\s\p{P}]/gu, ''); // 检查答案是否包含选项的关键词 const optionKeywords = optionText.split('、').map(k => k.trim()).filter(k => k); const hasMatch = optionKeywords.some(keyword => cleanAnswer.includes(keyword) || keyword.includes(cleanAnswer) ); if (hasMatch) { matchedOptions.push(String.fromCharCode(65 + i)); } } return matchedOptions; } return []; case 'judgement': // 判断题答案 if (cleanAnswer.includes('正确') || cleanAnswer.includes('对') || cleanAnswer.includes('是')) { return ['A']; } else if (cleanAnswer.includes('错误') || cleanAnswer.includes('错') || cleanAnswer.includes('否')) { return ['B']; } return []; default: return []; } } /** * 获取下一题按钮元素 * @returns {HTMLElement|null} 下一题按钮 */ function getNextQuestionButton() { return document.querySelector("#LayoutTeaching > main > div > div > div > div.content-area > div.content > div.toggle-box > button:nth-child(2)"); } /** * 检查下一题按钮是否可用 * @returns {boolean} 是否可用 */ function isNextButtonEnabled() { const button = getNextQuestionButton(); if (!button) return false; // 检查按钮是否禁用 return !button.disabled && !button.classList.contains('is-disabled'); } /** * 点击下一题按钮 * @returns {boolean} 是否成功点击 */ function clickNextQuestion() { const button = getNextQuestionButton(); if (button && isNextButtonEnabled()) { button.click(); return true; } return false; } /** * 回答当前题目并返回结果 * @param {string} token API token * @returns {Promise<object>} 答题结果 */ async function answerCurrentQuestion(token = '') { try { console.log('[DEBUG] 顺序答题 - answerCurrentQuestion 开始执行'); // 检测题目类型 const questionType = detectQuestionType(); console.log('[DEBUG] 顺序答题 - 检测到的题目类型:', questionType); if (questionType === 'unknown') { return { success: false, message: '无法检测到题目类型' }; } // 处理填空题 if (questionType === 'completion') { const { question } = extractQuestionContent(questionType); if (!question) { return { success: false, message: '无法提取填空题题目内容', type: questionType }; } try { // 导入填空题回答功能 const { autoAnswerCompletionQuestion } = await __vitePreload(async () => { const { autoAnswerCompletionQuestion } = await module.import('./completionAnswer-CVrFId9r-DN1v1V8X.js');return { autoAnswerCompletionQuestion }},true?void 0:void 0); const result = await autoAnswerCompletionQuestion(token); return { ...result, type: questionType }; } catch (error) { return { success: false, message: `填空题回答失败: ${error.message}`, question: question, type: questionType }; } } // 处理主观题 if (questionType === 'subjective') { const { question } = extractQuestionContent(questionType); if (!question) { return { success: false, message: '无法提取主观题题目内容', type: questionType }; } try { console.log('[DEBUG] 顺序答题 - 开始处理主观题'); // 导入主观题回答功能 const { streamAnswerSubjectiveQuestion, checkSubjectiveAnswerConfig } = await __vitePreload(async () => { const { streamAnswerSubjectiveQuestion, checkSubjectiveAnswerConfig } = await module.import('./subjectiveAnswer-OT4AhdTl-CfTgHXfC.js');return { streamAnswerSubjectiveQuestion, checkSubjectiveAnswerConfig }},true?void 0:void 0); // 检查主观题回答配置 console.log('[DEBUG] 顺序答题 - 检查主观题配置'); const configCheck = await checkSubjectiveAnswerConfig(); console.log('[DEBUG] 顺序答题 - 配置检查结果:', configCheck); if (!configCheck.valid) { console.log('[DEBUG] 顺序答题 - 配置检查失败:', configCheck.message); return { success: false, message: configCheck.message, type: questionType }; } console.log('[DEBUG] 顺序答题 - 开始调用主观题回答函数'); const result = await streamAnswerSubjectiveQuestion(question); console.log('[DEBUG] 顺序答题 - 主观题回答结果:', result); return { ...result, type: questionType }; } catch (error) { console.error('[DEBUG] 顺序答题 - 主观题回答过程中出错:', error); console.error('[DEBUG] 顺序答题 - 错误堆栈:', error.stack); return { success: false, message: `主观题回答失败: ${error.message}`, question: question, type: questionType }; } } // 提取题目内容 const { question, options } = extractQuestionContent(questionType); if (!question) { return { success: false, message: '无法提取题目内容' }; } console.log('检测到题目:', question); console.log('选项:', options); // 检查是否已有选择(跳过逻辑) if (await hasExistingSelection(questionType)) { console.log('题目已有选择,跳过自动答题'); return { success: false, message: '题目已有选择,跳过自动答题', question: question, type: questionType }; } // 查询题库 const apiResult = await queryAnswer(question, options, questionType, token); if (!apiResult.success) { return { success: false, message: apiResult.message, question: question, answer: apiResult.answer, type: questionType }; } console.log('题库查询结果:', apiResult); // 解析答案 const answerOptions = parseAnswer(apiResult.answer, questionType, options); if (answerOptions.length === 0) { return { success: false, message: '无法解析答案', question: apiResult.question, answer: apiResult.answer, type: questionType }; } console.log('解析后的答案选项:', answerOptions); // 点击选项 let clickedCount = 0; for (const option of answerOptions) { if (await clickOption(questionType, option)) { clickedCount++; console.log(`已选择选项: ${option}`); } } return { success: clickedCount > 0, message: clickedCount > 0 ? `成功选择 ${clickedCount} 个选项` : '选择选项失败', question: apiResult.question, answer: apiResult.answer, selectedOptions: answerOptions, times: apiResult.times, type: questionType }; } catch (error) { console.error('[DEBUG] 顺序答题 - 回答当前题目失败:', error); console.error('[DEBUG] 顺序答题 - 错误堆栈:', error.stack); return { success: false, message: `回答当前题目失败: ${error.message}` }; } } /** * 获取当前题目编号 * @returns {number} 题目编号,如果无法获取则返回0 */ function getCurrentQuestionNumber() { try { // 使用XPath获取题目编号元素 const xpathResult = document.evaluate( '//*[@id="LayoutTeaching"]/main/div/div/div/div[2]/div[2]/div[2]/div/div/div[1]/span', document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null ); const questionElement = xpathResult.singleNodeValue; if (questionElement && questionElement.textContent) { // 提取题目编号,格式为 "1.(10 分)",只需要数字部分 const text = questionElement.textContent.trim(); const match = text.match(/^(\d+)\./); if (match && match[1]) { return parseInt(match[1], 10); } } } catch (error) { console.warn('获取题目编号失败:', error); } return 0; } // 全局变量用于控制自动答题终止 let shouldStopSequentialAnswering = false; /** * 顺序回答所有题目 * @param {string} token API token * @param {function} onProgress 进度回调函数 * @returns {Promise<object>} 批量答题结果 */ async function sequentialAnswerAllQuestions(token = '', onProgress = null) { const results = []; let questionCount = 0; let successCount = 0; shouldStopSequentialAnswering = false; try { console.log('开始顺序答题...'); // 循环回答题目,直到没有下一题或被终止 while (true) { // 检查是否应该停止答题 - 在每个循环开始时检查 if (shouldStopSequentialAnswering) { console.log('自动答题已被终止'); break; } questionCount++; // 获取当前题目编号 const currentQuestionNumber = getCurrentQuestionNumber(); const displayNumber = currentQuestionNumber > 0 ? currentQuestionNumber : questionCount; // 报告进度 if (onProgress) { onProgress({ current: displayNumber, status: '正在回答第 ' + displayNumber + ' 题...' }); } console.log(`正在回答第 ${displayNumber} 题...`); // 检查是否应该停止答题 - 在回答题目前再次检查 if (shouldStopSequentialAnswering) { console.log('自动答题已被终止'); break; } // 回答当前题目 console.log(`[DEBUG] 顺序答题 - 开始回答第 ${displayNumber} 题`); const result = await answerCurrentQuestion(token); // 记录结果 results.push({ questionNumber: displayNumber, ...result }); if (result.success) { successCount++; console.log(`第 ${displayNumber} 题回答成功`); } else { console.log(`第 ${displayNumber} 题回答失败: ${result.message}`); console.log(`[DEBUG] 顺序答题 - 详细失败信息:`, result); } // 检查是否应该停止答题 - 在等待前检查 if (shouldStopSequentialAnswering) { console.log('自动答题已被终止'); break; } // 等待选项点击生效 await new Promise(resolve => setTimeout(resolve, 1000)); // 检查是否应该停止答题 - 在检查下一题前检查 if (shouldStopSequentialAnswering) { console.log('自动答题已被终止'); break; } // 检查是否有下一题 if (!isNextButtonEnabled()) { console.log('没有下一题,答题完成'); break; } // 检查是否应该停止答题 - 在点击下一题前检查 if (shouldStopSequentialAnswering) { console.log('自动答题已被终止'); break; } // 点击下一题 console.log('点击下一题...'); const nextClicked = clickNextQuestion(); if (!nextClicked) { console.log('无法点击下一题,答题完成'); break; } // 检查是否应该停止答题 - 在等待下一题加载前检查 if (shouldStopSequentialAnswering) { console.log('自动答题已被终止'); break; } // 等待下一题加载 await new Promise(resolve => setTimeout(resolve, 1500)); // 检查是否应该停止答题 - 在检查页面状态前检查 if (shouldStopSequentialAnswering) { console.log('自动答题已被终止'); break; } // 检查是否还在答题页面(防止意外跳转) const stillOnQuestionPage = detectQuestionType() !== 'unknown'; if (!stillOnQuestionPage) { console.log('已离开答题页面,答题完成'); break; } // 检查是否应该停止答题 - 在最终延迟前检查 if (shouldStopSequentialAnswering) { console.log('自动答题已被终止'); break; } // 添加延迟避免频繁请求 await new Promise(resolve => setTimeout(resolve, 500)); } // 答题完成后弹出提示框 setTimeout(() => { alert('答题完成,请务必检查答案结果!'); }, 1000); return { success: successCount > 0, message: `答题完成: 成功 ${successCount}/${questionCount} 题`, totalQuestions: questionCount, successCount: successCount, results: results }; } catch (error) { console.error('顺序答题失败:', error); return { success: false, message: `顺序答题失败: ${error.message}`, totalQuestions: questionCount, successCount: successCount, results: results }; } } /** * 停止顺序答题 * @returns {boolean} 是否成功停止 */ function stopSequentialAnswering() { shouldStopSequentialAnswering = true; console.log('停止顺序答题'); return true; } // 主观题回答功能使用动态导入 /** * 自动回答单个题目 * @param {string} token API token * @returns {Promise<object>} 答题结果 */ async function autoAnswerSingleQuestion(token = '') { try { console.log('[DEBUG] autoAnswerSingleQuestion 开始执行'); // 检测题目类型 const questionType = detectQuestionType(); console.log('[DEBUG] 检测到的题目类型:', questionType); if (questionType === 'unknown') { return { success: false, message: '无法检测到题目类型' }; } // 处理主观题 if (questionType === 'subjective') { console.log('[DEBUG] 开始处理主观题'); const { question } = extractQuestionContent(questionType); console.log('[DEBUG] 提取的主观题内容:', question); if (!question) { console.log('[DEBUG] 无法提取主观题题目内容'); return { success: false, message: '无法提取主观题题目内容' }; } try { console.log('[DEBUG] 开始动态导入主观题模块'); // 动态导入主观题回答功能 const { streamAnswerSubjectiveQuestion, checkSubjectiveAnswerConfig } = await __vitePreload(async () => { const { streamAnswerSubjectiveQuestion, checkSubjectiveAnswerConfig } = await module.import('./subjectiveAnswer-OT4AhdTl-CfTgHXfC.js');return { streamAnswerSubjectiveQuestion, checkSubjectiveAnswerConfig }},true?void 0:void 0); console.log('[DEBUG] 主观题模块导入成功'); // 检查主观题回答配置 console.log('[DEBUG] 开始检查主观题配置'); const configCheck = await checkSubjectiveAnswerConfig(); console.log('[DEBUG] 配置检查结果:', configCheck); if (!configCheck.valid) { console.log('[DEBUG] 配置检查失败:', configCheck.message); return { success: false, message: configCheck.message }; } console.log('[DEBUG] 开始调用主观题回答函数'); const result = await streamAnswerSubjectiveQuestion(question); console.log('[DEBUG] 主观题回答结果:', result); return { ...result, type: 'subjective' }; } catch (error) { console.error('主观题回答过程中出错:', error); return { success: false, message: `主观题回答失败: ${error.message}`, question: question }; } } // 处理填空题 if (questionType === 'completion') { const { question } = extractQuestionContent(questionType); if (!question) { return { success: false, message: '无法提取填空题题目内容' }; } try { // 动态导入填空题回答功能 const { autoAnswerCompletionQuestion } = await __vitePreload(async () => { const { autoAnswerCompletionQuestion } = await module.import('./completionAnswer-CVrFId9r-DN1v1V8X.js');return { autoAnswerCompletionQuestion }},true?void 0:void 0); const result = await autoAnswerCompletionQuestion(token); return { ...result, type: 'completion' }; } catch (error) { return { success: false, message: `填空题回答失败: ${error.message}`, question: question }; } } // 提取题目内容 const { question, options } = extractQuestionContent(questionType); if (!question) { return { success: false, message: '无法提取题目内容' }; } console.log('检测到题目:', question); console.log('选项:', options); // 检查是否已有选择(跳过逻辑) if (await hasExistingSelection(questionType)) { console.log('题目已有选择,跳过自动答题'); return { success: false, message: '题目已有选择,跳过自动答题', question: question, type: questionType }; } // 查询题库 const apiResult = await queryAnswer(question, options, questionType, token); if (!apiResult.success) { return { success: false, message: apiResult.message, question: question, answer: apiResult.answer }; } console.log('题库查询结果:', apiResult); // 解析答案 const answerOptions = parseAnswer(apiResult.answer, questionType, options); if (answerOptions.length === 0) { return { success: false, message: '无法解析答案', question: apiResult.question, answer: apiResult.answer }; } console.log('解析后的答案选项:', answerOptions); // 点击选项 let clickedCount = 0; for (const option of answerOptions) { if (await clickOption(questionType, option)) { clickedCount++; console.log(`已选择选项: ${option}`); } } return { success: clickedCount > 0, message: clickedCount > 0 ? `成功选择 ${clickedCount} 个选项` : '选择选项失败', question: apiResult.question, answer: apiResult.answer, selectedOptions: answerOptions, times: apiResult.times }; } catch (error) { console.error('[DEBUG] 自动答题失败:', error); console.error('[DEBUG] 错误堆栈:', error.stack); return { success: false, message: `自动答题失败: ${error.message}` }; } } /** * 自动回答当前页面所有题目(使用顺序答题方式) * @param {string} token API token * @param {function} onProgress 进度回调函数 * @returns {Promise<object>} 批量答题结果 */ async function autoAnswerAllQuestions(token = '', onProgress = null) { return await sequentialAnswerAllQuestions(token, onProgress); } const _hoisted_1$4 = { class: "answer-settings-page" }; const _hoisted_2$4 = { class: "settings-section" }; const _hoisted_3$4 = { class: "token-section" }; const _hoisted_4$4 = { class: "token-input-box" }; const _hoisted_5$4 = { class: "token-input-box" }; const _hoisted_6$3 = { class: "ai-settings-section" }; const _hoisted_7$3 = { class: "toggle-item" }; const _hoisted_8$3 = { class: "toggle-label" }; const _hoisted_9$2 = { class: "advanced-section" }; const _hoisted_10$2 = { class: "token-input-box" }; const _hoisted_11$2 = { class: "token-input-box" }; const _hoisted_12$2 = { class: "token-input-box" }; const _hoisted_13$2 = { key: 0, class: "status-section" }; const _sfc_main$4 = { __name: "AnswerSettingsPage", setup(__props) { const apiToken = ref(""); const aiToken = ref(""); const baseUrl = ref(""); const modelName = ref(""); const systemPrompt = ref(""); const aiAssistedEnabled = ref(false); const statusMessage = ref(""); const isSuccess = ref(false); const loadApiToken = async () => { const saved = await getStorageValue$1("beelineHelper_apiToken"); if (saved) apiToken.value = saved; }; const saveApiToken = async () => { if (apiToken.value) { await setStorageValue("beelineHelper_apiToken", apiToken.value); showStatus("题库 Token 已保存", true); } }; const loadAiToken = async () => { const saved = await getStorageValue$1("beelineHelper_aiToken"); if (saved) aiToken.value = saved; }; const saveAiToken = async () => { if (aiToken.value) { await setStorageValue("beelineHelper_aiToken", aiToken.value); showStatus("AI Token 已保存", true); } }; const loadBaseUrl = async () => { const saved = await getStorageValue$1("beelineHelper_baseUrl"); baseUrl.value = saved || "https://api.siliconflow.cn/v1"; }; const saveBaseUrl = async () => { await setStorageValue("beelineHelper_baseUrl", baseUrl.value); showStatus("BASE_URL 已保存", true); }; const loadModelName = async () => { const saved = await getStorageValue$1("beelineHelper_modelName"); modelName.value = saved || "THUDM/GLM-4.1V-9B-Thinking"; }; const saveModelName = async () => { await setStorageValue("beelineHelper_modelName", modelName.value); showStatus("MODEL_NAME 已保存", true); }; const loadSystemPrompt = async () => { const saved = await getStorageValue$1("beelineHelper_systemPrompt"); systemPrompt.value = saved || "你是一个专业全能的助手。请清晰、准确地回答问题,提供简明而准确的信息。使用正式、专业的语气。在适当情况下解释你的推理或提供背景信息,但避免不必要的冗长。始终确保答案可靠、易于理解。"; }; const saveSystemPrompt = async () => { await setStorageValue("beelineHelper_systemPrompt", systemPrompt.value); showStatus("SYSTEM_PROMPT 已保存", true); }; const loadAIAssisted = async () => { const saved = await getStorageValue$1("beelineHelper_aiAssistedEnabled"); aiAssistedEnabled.value = saved === "true" || saved === true; }; const toggleAIAssisted = async () => { await setStorageValue("beelineHelper_aiAssistedEnabled", aiAssistedEnabled.value); if (aiAssistedEnabled.value) { showStatus("AI辅助答题已启用", true); } else { showStatus("AI辅助答题已禁用", false); } }; const showStatus = (message, success) => { statusMessage.value = message; isSuccess.value = success; setTimeout(() => { statusMessage.value = ""; }, 3e3); }; onMounted(async () => { await loadApiToken(); await loadAiToken(); await loadBaseUrl(); await loadModelName(); await loadSystemPrompt(); await loadAIAssisted(); }); return (_ctx, _cache) => { return openBlock(), createElementBlock("div", _hoisted_1$4, [ createBaseVNode("div", _hoisted_2$4, [ _cache[18] || (_cache[18] = createBaseVNode("h3", null, "API Token 设置", -1)), createBaseVNode("div", _hoisted_3$4, [ _cache[8] || (_cache[8] = createBaseVNode("a", { href: "https://tk.enncy.cn", target: "_blank", class: "token-link" }, " 📖 获取 Token(言溪题库) ", -1)), createBaseVNode("div", _hoisted_4$4, [ _cache[6] || (_cache[6] = createBaseVNode("label", { for: "tokenInput" }, "用户凭证 (Token/密钥):", -1)), withDirectives(createBaseVNode("input", { id: "tokenInput", "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => apiToken.value = $event), onInput: saveApiToken, placeholder: "请输入题库 API Token", class: "token-input" }, null, 544), [ [vModelText, apiToken.value] ]) ]), _cache[9] || (_cache[9] = createBaseVNode("a", { href: "https://siliconflow.cn/", target: "_blank", class: "token-link" }, " 获取 Token(硅基流动) ", -1)), createBaseVNode("div", _hoisted_5$4, [ _cache[7] || (_cache[7] = createBaseVNode("label", { for: "aiTokenInput" }, "AI Token:", -1)), withDirectives(createBaseVNode("input", { id: "aiTokenInput", "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => aiToken.value = $event), onInput: saveAiToken, placeholder: "请输入 AI Token", class: "token-input" }, null, 544), [ [vModelText, aiToken.value] ]) ]) ]), createBaseVNode("div", _hoisted_6$3, [ _cache[12] || (_cache[12] = createBaseVNode("h4", null, "AI 辅助设置(这个还没做,别用)", -1)), createBaseVNode("div", _hoisted_7$3, [ createBaseVNode("label", _hoisted_8$3, [ withDirectives(createBaseVNode("input", { type: "checkbox", "onUpdate:modelValue": _cache[2] || (_cache[2] = ($event) => aiAssistedEnabled.value = $event), onChange: toggleAIAssisted }, null, 544), [ [vModelCheckbox, aiAssistedEnabled.value] ]), _cache[10] || (_cache[10] = createBaseVNode("span", { class: "toggle-slider" }, null, -1)), _cache[11] || (_cache[11] = createTextVNode(" AI辅助回答选择判断题 ", -1)) ]) ]) ]), createBaseVNode("div", _hoisted_9$2, [ _cache[16] || (_cache[16] = createBaseVNode("h4", null, "高级设置", -1)), _cache[17] || (_cache[17] = createBaseVNode("p", { class: "warning-text" }, "⚠️ 一般情况下请不要修改以下设置", -1)), createBaseVNode("div", _hoisted_10$2, [ _cache[13] || (_cache[13] = createBaseVNode("label", { for: "baseUrlInput" }, "BASE_URL:", -1)), withDirectives(createBaseVNode("input", { id: "baseUrlInput", "onUpdate:modelValue": _cache[3] || (_cache[3] = ($event) => baseUrl.value = $event), onInput: saveBaseUrl, placeholder: "请输入 API 基础地址", class: "token-input" }, null, 544), [ [vModelText, baseUrl.value] ]) ]), createBaseVNode("div", _hoisted_11$2, [ _cache[14] || (_cache[14] = createBaseVNode("label", { for: "modelNameInput" }, "MODEL_NAME:", -1)), withDirectives(createBaseVNode("input", { id: "modelNameInput", "onUpdate:modelValue": _cache[4] || (_cache[4] = ($event) => modelName.value = $event), onInput: saveModelName, placeholder: "请输入模型名称", class: "token-input" }, null, 544), [ [vModelText, modelName.value] ]) ]), createBaseVNode("div", _hoisted_12$2, [ _cache[15] || (_cache[15] = createBaseVNode("label", { for: "systemPromptInput" }, "SYSTEM_PROMPT:", -1)), withDirectives(createBaseVNode("textarea", { id: "systemPromptInput", "onUpdate:modelValue": _cache[5] || (_cache[5] = ($event) => systemPrompt.value = $event), onInput: saveSystemPrompt, placeholder: "请输入系统提示词", class: "token-input textarea-input", rows: "3" }, null, 544), [ [vModelText, systemPrompt.value] ]) ]) ]), _cache[19] || (_cache[19] = createBaseVNode("div", { class: "settings-info" }, [ createBaseVNode("p", { class: "info-text" }, [ createBaseVNode("strong", null, "使用说明:") ]), createBaseVNode("ul", { class: "info-list" }, [ createBaseVNode("li", null, "题库 Token 用于查询题目答案"), createBaseVNode("li", null, "AI Token 用于生成式回答(如需要)"), createBaseVNode("li", null, "请确保输入的 Token 正确有效"), createBaseVNode("li", null, "Token 会安全保存在本地浏览器中"), createBaseVNode("li", null, "高级设置仅供高级用户使用,一般情况请保持默认") ]) ], -1)) ]), statusMessage.value ? (openBlock(), createElementBlock("div", _hoisted_13$2, [ createBaseVNode("div", { class: normalizeClass(["status-message", { success: isSuccess.value, error: !isSuccess.value }]) }, toDisplayString(statusMessage.value), 3) ])) : createCommentVNode("", true) ]); }; } }; const AnswerSettingsPage = /* @__PURE__ */ _export_sfc(_sfc_main$4, [["__scopeId", "data-v-f212f24f"]]); const _hoisted_1$3 = { class: "auto-answer-page" }; const _hoisted_2$3 = { key: 0, class: "overlay-blocker" }; const _hoisted_3$3 = { class: "navigation-section" }; const _hoisted_4$3 = { key: 1, class: "subpage-content" }; const _hoisted_5$3 = { class: "config-section" }; const _hoisted_6$2 = { class: "config-item" }; const _hoisted_7$2 = { class: "toggle-with-actions" }; const _hoisted_8$2 = { class: "action-buttons" }; const _hoisted_9$1 = ["disabled"]; const _hoisted_10$1 = ["disabled"]; const _hoisted_11$1 = { class: "results-section" }; const _hoisted_12$1 = { key: 0 }; const _hoisted_13$1 = { key: 1, class: "single-result" }; const _hoisted_14$1 = { class: "result-header" }; const _hoisted_15$1 = { class: "result-type" }; const _hoisted_16$1 = { class: "result-message" }; const _hoisted_17$1 = { key: 0, class: "result-question" }; const _hoisted_18$1 = { key: 1, class: "result-answer" }; const _hoisted_19 = { key: 2, class: "result-options" }; const _hoisted_20 = { key: 2, class: "batch-results" }; const _hoisted_21 = { class: "filter-buttons" }; const _hoisted_22 = { class: "results-list" }; const _hoisted_23 = { class: "result-header" }; const _hoisted_24 = { class: "result-type" }; const _hoisted_25 = { key: 0, class: "ai-indicator" }; const _hoisted_26 = { class: "result-message" }; const _hoisted_27 = { key: 0, class: "result-question" }; const _hoisted_28 = { key: 1, class: "result-answer" }; const _hoisted_29 = { key: 2, class: "result-options" }; const _hoisted_30 = { key: 0, class: "progress-section" }; const _hoisted_31 = { class: "progress-info" }; const _hoisted_32 = { class: "progress-text" }; const _hoisted_33 = { class: "progress-status" }; const _hoisted_34 = { key: 2, class: "subpage-content" }; const _hoisted_35 = { key: 3, class: "status-section" }; const _sfc_main$3 = { __name: 'AutoAnswerPage', setup(__props) { const isAnswering = ref(false); const singleResult = ref(null); const batchResults = ref([]); const statusMessage = ref(''); const isSuccess = ref(false); const progressInfo = ref(null); const currentFilter = ref('all'); const isAgreementChecked = ref(false); const currentSubpage = ref('main'); // 当前子页面:main, settings // 从存储获取API Token const getApiToken = async () => { return await getStorageValue$1('beelineHelper_apiToken', '') || '' }; // 回答当前题目 const answerCurrentQuestion = async () => { const token = await getApiToken(); if (!token) { showStatus('请先在答题设置页面设置API Token', false); return } isAnswering.value = true; showStatus('正在查询答案...', true); try { const result = await autoAnswerSingleQuestion(token); // 单题结果直接覆盖,不保留历史 singleResult.value = { type: 'single', ...result, timestamp: new Date().toLocaleTimeString() }; if (result.success) { showStatus('答题成功!', true); } else { showStatus(`答题失败: ${result.message}`, false); } } catch (error) { showStatus(`答题失败: ${error.message}`, false); } finally { isAnswering.value = false; } }; // 回答所有题目 const answerAllQuestions = async () => { const token = await getApiToken(); if (!token) { showStatus('请先在答题设置页面设置API Token', false); return } isAnswering.value = true; progressInfo.value = null; showStatus('开始顺序答题...', true); try { const result = await autoAnswerAllQuestions(token, (progress) => { progressInfo.value = progress; showStatus(progress.status, true); }); if (result.success) { showStatus(`顺序答题完成: ${result.message}`, true); } else { showStatus(`顺序答题失败: ${result.message}`, false); } // 批量结果存储到独立的数组中 if (result.results && result.results.length > 0) { batchResults.value = result.results.map((item) => ({ questionNumber: item.questionNumber, ...item, timestamp: new Date().toLocaleTimeString() })); } } catch (error) { showStatus(`顺序答题失败: ${error.message}`, false); } finally { isAnswering.value = false; progressInfo.value = null; } }; // 显示状态消息 const showStatus = (message, success) => { statusMessage.value = message; isSuccess.value = success; // 3秒后清除状态消息 setTimeout(() => { statusMessage.value = ''; }, 3000); }; // 获取题型文本 const getTypeText = (type) => { const typeMap = { 'single': '单选题', 'multiple': '多选题', 'judgement': '判断题', 'completion': '填空题', 'subjective': '主观题', 'batch': '批量答题' }; return typeMap[type] || type }; // 计算筛选后的批量结果 const filteredBatchResults = computed(() => { if (currentFilter.value === 'all') { return batchResults.value } else if (currentFilter.value === 'abnormal') { return batchResults.value.filter(result => !result.success) } else if (currentFilter.value === 'ai') { return batchResults.value.filter(result => result.aiAssisted) } return batchResults.value }); // 终止自动答题 const terminateAutoAnswer = () => { stopSequentialAnswering(); isAnswering.value = false; progressInfo.value = null; showStatus('已终止自动答题', true); }; // 检查同意状态 const checkAgreementState = async () => { const savedState = await getStorageValue$1('beelineHelper_agreeState'); if (savedState !== null) { isAgreementChecked.value = savedState; } }; // 页面加载时初始化 onMounted(async () => { // 检查同意状态 await checkAgreementState(); // 监听localStorage变化 window.addEventListener('storage', checkAgreementState); }); onUnmounted(() => { // 清理工作 window.removeEventListener('storage', checkAgreementState); }); return (_ctx, _cache) => { return (openBlock(), createElementBlock("div", _hoisted_1$3, [ (!isAgreementChecked.value) ? (openBlock(), createElementBlock("div", _hoisted_2$3, [...(_cache[5] || (_cache[5] = [ createBaseVNode("div", { class: "overlay-content" }, [ createBaseVNode("div", { class: "warning-icon" }, [ createBaseVNode("img", { src: _imports_0$1, alt: "提示图标", class: "icon-img" }) ]), createBaseVNode("div", { class: "warning-text" }, "如要使用此功能请先阅读关于中的内容") ], -1) ]))])) : createCommentVNode("", true), createBaseVNode("div", _hoisted_3$3, [ createBaseVNode("button", { class: normalizeClass(["nav-btn", { active: currentSubpage.value === 'main' }]), onClick: _cache[0] || (_cache[0] = $event => (currentSubpage.value = 'main')) }, " 自动答题 ", 2), createBaseVNode("button", { class: normalizeClass(["nav-btn", { active: currentSubpage.value === 'settings' }]), onClick: _cache[1] || (_cache[1] = $event => (currentSubpage.value = 'settings')) }, " 答题设置 ", 2) ]), (currentSubpage.value === 'main') ? (openBlock(), createElementBlock("div", _hoisted_4$3, [ createBaseVNode("div", _hoisted_5$3, [ createBaseVNode("div", _hoisted_6$2, [ createBaseVNode("div", _hoisted_7$2, [ createBaseVNode("div", _hoisted_8$2, [ createBaseVNode("button", { class: "action-btn primary", onClick: answerCurrentQuestion, disabled: isAnswering.value }, toDisplayString(isAnswering.value ? '答题中...' : '回答当前题目'), 9, _hoisted_9$1), createBaseVNode("button", { class: "action-btn secondary", onClick: answerAllQuestions, disabled: isAnswering.value }, toDisplayString(isAnswering.value ? '答题中...' : '回答所有题目'), 9, _hoisted_10$1), createBaseVNode("button", { class: "action-btn danger", onClick: terminateAutoAnswer }, " 终止自动答题 ") ]) ]) ]) ]), createBaseVNode("div", _hoisted_11$1, [ (singleResult.value) ? (openBlock(), createElementBlock("h3", _hoisted_12$1, "单次答题结果")) : createCommentVNode("", true), (singleResult.value) ? (openBlock(), createElementBlock("div", _hoisted_13$1, [ createBaseVNode("div", { class: normalizeClass(["result-item", { success: singleResult.value.success, error: !singleResult.value.success }]) }, [ createBaseVNode("div", _hoisted_14$1, [ createBaseVNode("span", _hoisted_15$1, toDisplayString(getTypeText(singleResult.value.type)), 1), createBaseVNode("span", { class: normalizeClass(["result-status", { success: singleResult.value.success, error: !singleResult.value.success }]) }, toDisplayString(singleResult.value.success ? '成功' : '失败'), 3) ]), createBaseVNode("div", _hoisted_16$1, toDisplayString(singleResult.value.message), 1), (singleResult.value.question) ? (openBlock(), createElementBlock("div", _hoisted_17$1, "题目: " + toDisplayString(singleResult.value.question), 1)) : createCommentVNode("", true), (singleResult.value.answer) ? (openBlock(), createElementBlock("div", _hoisted_18$1, "答案: " + toDisplayString(singleResult.value.answer), 1)) : createCommentVNode("", true), (singleResult.value.selectedOptions && singleResult.value.selectedOptions.length > 0) ? (openBlock(), createElementBlock("div", _hoisted_19, " 选择: " + toDisplayString(singleResult.value.selectedOptions.join(', ')), 1)) : createCommentVNode("", true) ], 2) ])) : createCommentVNode("", true), (batchResults.value.length > 0) ? (openBlock(), createElementBlock("div", _hoisted_20, [ createBaseVNode("div", _hoisted_21, [ createBaseVNode("button", { class: normalizeClass(["filter-btn", { active: currentFilter.value === 'all' }]), onClick: _cache[2] || (_cache[2] = $event => (currentFilter.value = 'all')) }, " 全部 ", 2), createBaseVNode("button", { class: normalizeClass(["filter-btn", { active: currentFilter.value === 'abnormal' }]), onClick: _cache[3] || (_cache[3] = $event => (currentFilter.value = 'abnormal')) }, " 异常 ", 2), createBaseVNode("button", { class: normalizeClass(["filter-btn ai-filter", { active: currentFilter.value === 'ai' }]), onClick: _cache[4] || (_cache[4] = $event => (currentFilter.value = 'ai')) }, " AI辅助 ", 2) ]), createBaseVNode("div", _hoisted_22, [ (openBlock(true), createElementBlock(Fragment, null, renderList(filteredBatchResults.value, (result, index) => { return (openBlock(), createElementBlock("div", { key: index, class: normalizeClass(["result-item", { success: result.success, error: !result.success, 'ai-assisted': result.aiAssisted }]) }, [ createBaseVNode("div", _hoisted_23, [ createBaseVNode("span", _hoisted_24, [ createTextVNode(" 第" + toDisplayString(result.questionNumber) + "题 ", 1), (result.aiAssisted) ? (openBlock(), createElementBlock("span", _hoisted_25, "AI辅助")) : createCommentVNode("", true) ]), createBaseVNode("span", { class: normalizeClass(["result-status", { success: result.success, error: !result.success }]) }, toDisplayString(result.success ? '成功' : '失败'), 3) ]), createBaseVNode("div", _hoisted_26, toDisplayString(result.message), 1), (result.question) ? (openBlock(), createElementBlock("div", _hoisted_27, "题目: " + toDisplayString(result.question), 1)) : createCommentVNode("", true), (result.answer) ? (openBlock(), createElementBlock("div", _hoisted_28, "答案: " + toDisplayString(result.answer), 1)) : createCommentVNode("", true), (result.selectedOptions && result.selectedOptions.length > 0) ? (openBlock(), createElementBlock("div", _hoisted_29, " 选择: " + toDisplayString(result.selectedOptions.join(', ')), 1)) : createCommentVNode("", true) ], 2)) }), 128)) ]) ])) : createCommentVNode("", true) ]), (progressInfo.value) ? (openBlock(), createElementBlock("div", _hoisted_30, [ _cache[6] || (_cache[6] = createBaseVNode("h3", null, "答题进度", -1)), createBaseVNode("div", _hoisted_31, [ createBaseVNode("div", _hoisted_32, "正在回答第 " + toDisplayString(progressInfo.value.current) + " 题...", 1), createBaseVNode("div", _hoisted_33, toDisplayString(progressInfo.value.status), 1) ]) ])) : createCommentVNode("", true) ])) : createCommentVNode("", true), (currentSubpage.value === 'settings') ? (openBlock(), createElementBlock("div", _hoisted_34, [ createVNode(AnswerSettingsPage) ])) : createCommentVNode("", true), (statusMessage.value) ? (openBlock(), createElementBlock("div", _hoisted_35, [ createBaseVNode("div", { class: normalizeClass(["status-message", { success: isSuccess.value, error: !isSuccess.value }]) }, toDisplayString(statusMessage.value), 3) ])) : createCommentVNode("", true) ])) } } }; const AutoAnswerPage = /*#__PURE__*/_export_sfc(_sfc_main$3, [['__scopeId',"data-v-c8c99884"]]); const _hoisted_1$2 = { class: "toggle-features" }; const _hoisted_2$2 = { class: "toggle-item" }; const _hoisted_3$2 = { class: "toggle-switch" }; const _hoisted_4$2 = ["checked"]; const _hoisted_5$2 = { class: "toggle-item" }; const _hoisted_6$1 = { class: "toggle-switch" }; const _hoisted_7$1 = ["checked"]; const _hoisted_8$1 = { class: "modal-body" }; const _hoisted_9 = { class: "setting-group" }; const _hoisted_10 = { class: "image-input-group" }; const _hoisted_11 = { class: "setting-group" }; const _hoisted_12 = { class: "slider-group" }; const _hoisted_13 = { class: "slider-value" }; const _hoisted_14 = { class: "setting-group" }; const _hoisted_15 = { class: "slider-group" }; const _hoisted_16 = { class: "slider-value" }; const _hoisted_17 = { class: "preview-section" }; const _hoisted_18 = { class: "back-btn-container" }; const _sfc_main$2 = { __name: 'AdvancedSettingsPage', emits: ['navigate'], setup(__props, { emit: __emit }) { const operationLogEnabled = ref(true); // 当前显示状态 const userOperationLogPref = ref(true); // 用户操作日志偏好,默认开启 const showRainbowModal = ref(false); const fileInput = ref(null); // 使用全局Rainbow状态 const rainbowEnabled = ref(false); const rainbowSettings = ref({ backgroundUrl: 'https://images.unsplash.com/photo-1593642532973-d31b6557fa68?auto=format&fit=crop&w=1920&q=80', backgroundOpacity: 0.9, glassEffectIntensity: 15 }); // 预览样式 const previewStyle = computed(() => ({ backgroundImage: `url(${rainbowSettings.value.backgroundUrl})`, backgroundSize: 'cover', backgroundPosition: 'center', opacity: 1 // 背景图片始终保持完全不透明 })); const previewGlassStyle = computed(() => ({ backdropFilter: `blur(${rainbowSettings.value.glassEffectIntensity}px)` })); onMounted(async () => { // 同步全局Rainbow状态 if (window.beelineHelperApp) { // 同步Rainbow启用状态 if (window.beelineHelperApp.rainbowEnabled && typeof window.beelineHelperApp.rainbowEnabled === 'object' && 'value' in window.beelineHelperApp.rainbowEnabled) { rainbowEnabled.value = window.beelineHelperApp.rainbowEnabled.value; } else if (window.beelineHelperApp.rainbowEnabled !== undefined) { rainbowEnabled.value = window.beelineHelperApp.rainbowEnabled; } // 同步Rainbow设置 if (window.beelineHelperApp.rainbowSettings && typeof window.beelineHelperApp.rainbowSettings === 'object' && 'value' in window.beelineHelperApp.rainbowSettings) { rainbowSettings.value = { ...rainbowSettings.value, ...window.beelineHelperApp.rainbowSettings.value }; } else if (window.beelineHelperApp.rainbowSettings) { rainbowSettings.value = { ...rainbowSettings.value, ...window.beelineHelperApp.rainbowSettings }; } } // 初始化用户偏好 if (window.beelineHelperApp) { if (window.beelineHelperApp.userOperationLogPref && typeof window.beelineHelperApp.userOperationLogPref === 'object' && 'value' in window.beelineHelperApp.userOperationLogPref) { userOperationLogPref.value = window.beelineHelperApp.userOperationLogPref.value; } else if (window.beelineHelperApp.userOperationLogPref !== undefined) { userOperationLogPref.value = window.beelineHelperApp.userOperationLogPref; } // 显示状态完全由用户偏好决定 operationLogEnabled.value = !!userOperationLogPref.value; } else { operationLogEnabled.value = userOperationLogPref.value; } }); const handleOperationLogToggle = async () => { // 切换用户偏好(持久化的开关),而不是直接切换 transient 的显示状态 userOperationLogPref.value = !userOperationLogPref.value; try { console.log(`操作日志偏好已设置为: ${userOperationLogPref.value ? '开启' : '关闭'}`); // 同步主应用中的偏好与显示状态 if (window.beelineHelperApp) { if (window.beelineHelperApp.userOperationLogPref && typeof window.beelineHelperApp.userOperationLogPref === 'object' && 'value' in window.beelineHelperApp.userOperationLogPref) { window.beelineHelperApp.userOperationLogPref.value = userOperationLogPref.value; } else { window.beelineHelperApp.userOperationLogPref = userOperationLogPref.value; } // 显示状态完全由用户偏好决定 operationLogEnabled.value = !!userOperationLogPref.value; // 直接更新主应用中的操作日志状态 if (window.beelineHelperApp.operationLogEnabled && typeof window.beelineHelperApp.operationLogEnabled === 'object' && 'value' in window.beelineHelperApp.operationLogEnabled) { window.beelineHelperApp.operationLogEnabled.value = operationLogEnabled.value; } else { window.beelineHelperApp.operationLogEnabled = operationLogEnabled.value; } // 使用统一保存函数(如果可用)保证一致性 if (typeof window.beelineHelperApp.saveFeatureStates === 'function') { try { await window.beelineHelperApp.saveFeatureStates(); console.log('操作日志偏好已保存到存储'); } catch (e) { console.warn('saveFeatureStates failed:', e); } } else { console.warn('saveFeatureStates 函数不可用'); } } } catch (e) { console.warn('handleOperationLogToggle 出错:', e); } }; const handleRainbowToggle = async () => { rainbowEnabled.value = !rainbowEnabled.value; console.log('切换Rainbow状态:', rainbowEnabled.value); try { console.log(`Rainbow已${rainbowEnabled.value ? '开启' : '关闭'}`, rainbowEnabled.value); // 更新主应用中的Rainbow状态(支持 ref 或原始布尔) if (window.beelineHelperApp) { if (window.beelineHelperApp.rainbowEnabled && typeof window.beelineHelperApp.rainbowEnabled === 'object' && 'value' in window.beelineHelperApp.rainbowEnabled) { window.beelineHelperApp.rainbowEnabled.value = rainbowEnabled.value; } else { window.beelineHelperApp.rainbowEnabled = rainbowEnabled.value; } // 如果开启Rainbow,应用样式 if (rainbowEnabled.value) { if (window.beelineHelperApp.applyRainbowStyles) { setTimeout(() => { window.beelineHelperApp.applyRainbowStyles(); }, 100); } } else { if (window.beelineHelperApp.removeRainbowStyles) { window.beelineHelperApp.removeRainbowStyles(); } } // 保存设置 if (typeof window.beelineHelperApp.saveFeatureStates === 'function') { try { window.beelineHelperApp.saveFeatureStates(); } catch (e) { console.warn('saveFeatureStates failed:', e); } } } } catch (e) { console.warn('handleRainbowToggle 出错:', e); } }; const showRainbowSettings = () => { showRainbowModal.value = true; }; const closeRainbowModal = () => { showRainbowModal.value = false; }; const triggerFileInput = () => { fileInput.value?.click(); }; const handleFileUpload = (event) => { const file = event.target.files[0]; if (file) { const reader = new FileReader(); reader.onload = (e) => { rainbowSettings.value.backgroundUrl = e.target.result; }; reader.readAsDataURL(file); } }; const saveRainbowSettings = async () => { try { console.log('保存Rainbow设置:', rainbowSettings.value); // 验证背景URL if (!rainbowSettings.value.backgroundUrl) { alert('请设置背景图片URL或选择本地图片'); return } // 更新主应用中的Rainbow设置 if (window.beelineHelperApp) { if (window.beelineHelperApp.rainbowSettings && typeof window.beelineHelperApp.rainbowSettings === 'object' && 'value' in window.beelineHelperApp.rainbowSettings) { window.beelineHelperApp.rainbowSettings.value = { ...rainbowSettings.value }; } else { window.beelineHelperApp.rainbowSettings = { ...rainbowSettings.value }; } console.log('Rainbow设置已保存'); closeRainbowModal(); // 如果Rainbow已开启,重新应用样式 if (rainbowEnabled.value) { if (window.beelineHelperApp.applyRainbowStyles) { setTimeout(() => { window.beelineHelperApp.applyRainbowStyles(); }, 100); } } // 保存设置 if (typeof window.beelineHelperApp.saveFeatureStates === 'function') { try { window.beelineHelperApp.saveFeatureStates(); } catch (e) { console.warn('saveFeatureStates failed:', e); } } } } catch (error) { console.error('保存Rainbow设置失败:', error); if (error.name === 'QuotaExceededError') { alert('存储空间不足,无法保存设置。请选择较小的背景图片或使用URL链接。'); } else { alert('保存设置失败,请重试。'); } } }; return (_ctx, _cache) => { return (openBlock(), createElementBlock("div", null, [ _cache[15] || (_cache[15] = createBaseVNode("h3", null, "高级设置", -1)), createBaseVNode("div", _hoisted_1$2, [ createBaseVNode("div", _hoisted_2$2, [ _cache[6] || (_cache[6] = createBaseVNode("span", { class: "toggle-label" }, "操作日志", -1)), createBaseVNode("label", _hoisted_3$2, [ createBaseVNode("input", { type: "checkbox", checked: operationLogEnabled.value, onChange: handleOperationLogToggle }, null, 40, _hoisted_4$2), _cache[5] || (_cache[5] = createBaseVNode("span", { class: "toggle-slider" }, null, -1)) ]) ]), createBaseVNode("div", _hoisted_5$2, [ createBaseVNode("div", { class: "toggle-label-container" }, [ _cache[8] || (_cache[8] = createBaseVNode("span", { class: "toggle-label" }, "?Rainbow", -1)), createBaseVNode("button", { class: "settings-icon", onClick: showRainbowSettings, title: "Rainbow设置" }, [...(_cache[7] || (_cache[7] = [ createBaseVNode("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", "stroke-width": "2" }, [ createBaseVNode("path", { d: "M12 15a3 3 0 1 0 0-6 3 3 0 0 0 0 6Z" }), createBaseVNode("path", { d: "M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1Z" }) ], -1) ]))]) ]), createBaseVNode("label", _hoisted_6$1, [ createBaseVNode("input", { type: "checkbox", checked: rainbowEnabled.value, onChange: handleRainbowToggle }, null, 40, _hoisted_7$1), _cache[9] || (_cache[9] = createBaseVNode("span", { class: "toggle-slider rainbow-toggle" }, null, -1)) ]) ]) ]), (showRainbowModal.value) ? (openBlock(), createElementBlock("div", { key: 0, class: "modal-overlay", onClick: closeRainbowModal }, [ createBaseVNode("div", { class: "modal-content", onClick: _cache[3] || (_cache[3] = withModifiers(() => {}, ["stop"])) }, [ createBaseVNode("div", { class: "modal-header" }, [ _cache[10] || (_cache[10] = createBaseVNode("h4", null, "Rainbow设置", -1)), createBaseVNode("button", { class: "close-btn", onClick: closeRainbowModal }, "×") ]), createBaseVNode("div", _hoisted_8$1, [ createBaseVNode("div", _hoisted_9, [ _cache[11] || (_cache[11] = createBaseVNode("label", { class: "setting-label" }, "背景图片", -1)), createBaseVNode("div", _hoisted_10, [ withDirectives(createBaseVNode("input", { type: "text", "onUpdate:modelValue": _cache[0] || (_cache[0] = $event => ((rainbowSettings.value.backgroundUrl) = $event)), placeholder: "输入图片URL或选择本地图片", class: "url-input" }, null, 512), [ [vModelText, rainbowSettings.value.backgroundUrl] ]), createBaseVNode("input", { type: "file", ref_key: "fileInput", ref: fileInput, accept: "image/*", onChange: handleFileUpload, class: "file-input", style: {"display":"none"} }, null, 544), createBaseVNode("button", { class: "upload-btn", onClick: triggerFileInput }, "选择图片") ]) ]), createBaseVNode("div", _hoisted_11, [ _cache[12] || (_cache[12] = createBaseVNode("label", { class: "setting-label" }, "背景透明度", -1)), createBaseVNode("div", _hoisted_12, [ withDirectives(createBaseVNode("input", { type: "range", "onUpdate:modelValue": _cache[1] || (_cache[1] = $event => ((rainbowSettings.value.backgroundOpacity) = $event)), min: "0.1", max: "1", step: "0.05", class: "slider" }, null, 512), [ [vModelText, rainbowSettings.value.backgroundOpacity] ]), createBaseVNode("span", _hoisted_13, toDisplayString((rainbowSettings.value.backgroundOpacity * 100).toFixed(0)) + "%", 1) ]) ]), createBaseVNode("div", _hoisted_14, [ _cache[13] || (_cache[13] = createBaseVNode("label", { class: "setting-label" }, "毛玻璃效果强度", -1)), createBaseVNode("div", _hoisted_15, [ withDirectives(createBaseVNode("input", { type: "range", "onUpdate:modelValue": _cache[2] || (_cache[2] = $event => ((rainbowSettings.value.glassEffectIntensity) = $event)), min: "0", max: "40", step: "1", class: "slider" }, null, 512), [ [vModelText, rainbowSettings.value.glassEffectIntensity] ]), createBaseVNode("span", _hoisted_16, toDisplayString(rainbowSettings.value.glassEffectIntensity) + "px", 1) ]) ]), createBaseVNode("div", _hoisted_17, [ _cache[14] || (_cache[14] = createBaseVNode("h5", null, "预览", -1)), createBaseVNode("div", { class: "preview-box", style: normalizeStyle(previewStyle.value) }, [ createBaseVNode("div", { class: "preview-overlay", style: normalizeStyle({ opacity: 1 - rainbowSettings.value.backgroundOpacity }) }, null, 4), createBaseVNode("div", { class: "preview-glass", style: normalizeStyle(previewGlassStyle.value) }, " 毛玻璃效果预览 ", 4) ], 4) ]) ]), createBaseVNode("div", { class: "modal-footer" }, [ createBaseVNode("button", { class: "save-btn", onClick: saveRainbowSettings }, "保存设置"), createBaseVNode("button", { class: "cancel-btn", onClick: closeRainbowModal }, "取消") ]) ]) ])) : createCommentVNode("", true), createBaseVNode("div", _hoisted_18, [ createBaseVNode("button", { class: "back-btn", onClick: _cache[4] || (_cache[4] = $event => (_ctx.$emit('navigate', 'main'))) }, "返回") ]) ])) } } }; const AdvancedSettingsPage = /*#__PURE__*/_export_sfc(_sfc_main$2, [['__scopeId',"data-v-cd8b7e2c"]]); const _imports_0 = "data:image/jpeg;base64,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"; const _hoisted_1$1 = { class: "right-panel" }; const _hoisted_2$1 = { class: "agree-label" }; const _hoisted_3$1 = ["disabled"]; const _hoisted_4$1 = { key: 0 }; const _hoisted_5$1 = { key: 1 }; const _sfc_main$1 = { __name: 'AboutPage', emits: ["close"], setup(__props, { emit: __emit }) { const agreeChecked = ref(false); const countdown = ref(15); const countdownActive = ref(true); const isClosing = ref(false); // 加载/保存同意状态 const loadAgreeState = async () => { const saved = await getStorageValue$1("beelineHelper_agreeState"); if (saved !== null) agreeChecked.value = saved; }; const saveAgreeState = async () => { await setStorageValue("beelineHelper_agreeState", agreeChecked.value); }; // 倒计时逻辑 const startCountdown = () => { // 如果已经同意,直接跳过倒计时 if (agreeChecked.value) { countdownActive.value = false; return; } const timer = setInterval(() => { if (countdown.value > 0) { countdown.value--; } else { clearInterval(timer); countdownActive.value = false; } }, 1000); }; // 改为 emit 事件 const emit = __emit; // 关闭页面动画 const handleClose = () => { isClosing.value = true; setTimeout(() => { emit("close"); }, 300); // 动画持续时间 }; onMounted(async () => { await loadAgreeState(); startCountdown(); }); return (_ctx, _cache) => { return (openBlock(), createElementBlock("div", { class: normalizeClass(["about-page", { 'closing': isClosing.value }]) }, [ _cache[3] || (_cache[3] = createStaticVNode("<div class=\"left-panel\" data-v-30e112b7><h2 class=\"title gradient-text\" data-v-30e112b7>💰 支持项目 ¥6.6</h2><div class=\"image-box\" data-v-30e112b7><img src=\"" + _imports_0 + "\" class=\"pay-image\" data-v-30e112b7></div><p class=\"subtitle\" data-v-30e112b7>扫码支付,支持开发 ❤️</p></div>", 1)), createBaseVNode("div", _hoisted_1$1, [ _cache[2] || (_cache[2] = createStaticVNode("<h2 class=\"title main-title\" data-v-30e112b7>无人看守的诚信小卖铺</h2><div class=\"content\" data-v-30e112b7><div class=\"info-block\" data-v-30e112b7><h3 class=\"section-title\" data-v-30e112b7>功能说明</h3><p data-v-30e112b7>视频相关的全部功能———永久免费</p><p data-v-30e112b7>刷题目前已支持主观题,视频内题目和填空题暂不支持!</p><p data-v-30e112b7>考试答题暂未测试,谨慎使用</p><p class=\"highlight\" data-v-30e112b7><b data-v-30e112b7>自动答题 ¥6.6/人 永久使用</b>,感谢支持 😋</p></div><div class=\"info-block\" data-v-30e112b7><h3 class=\"section-title\" data-v-30e112b7>注意事项</h3><p data-v-30e112b7>自动答题请手动开始,避免Token浪费</p><p class=\"warning\" data-v-30e112b7>❗请务必确认答案正确且多选题已选中并正确选中后再提交❗</p><p data-v-30e112b7>题库并非本人维护,请自行判断。AI生成内容务必检查!</p><p class=\"highlight\" data-v-30e112b7><b data-v-30e112b7>本脚本仅供个人学习与测试使用,禁止用于任何商业用途,作者不承担由此产生的任何责任</b></p></div></div><p class=\"feedback\" data-v-30e112b7> 反馈与下载请到 <a href=\"https://scriptcat.org/zh-CN/script-show-page/4463\" target=\"_blank\" data-v-30e112b7>脚本猫</a> 或 <a href=\"http://greasyfork.icu/zh-CN/scripts/490485\" target=\"_blank\" data-v-30e112b7>GreasyFork</a> 或 发送邮件到[email protected] </p>", 3)), createBaseVNode("label", _hoisted_2$1, [ withDirectives(createBaseVNode("input", { type: "checkbox", "onUpdate:modelValue": _cache[0] || (_cache[0] = $event => ((agreeChecked).value = $event)), disabled: countdownActive.value, onChange: saveAgreeState }, null, 40, _hoisted_3$1), [ [vModelCheckbox, agreeChecked.value] ]), (countdownActive.value) ? (openBlock(), createElementBlock("span", _hoisted_4$1, " 我已诚信付款并认真阅读上述文字 (" + toDisplayString(countdown.value) + "秒) ", 1)) : (openBlock(), createElementBlock("span", _hoisted_5$1, [...(_cache[1] || (_cache[1] = [ createTextVNode(" 我已诚信付款并认真阅读上述文字 ", -1), createBaseVNode("a", { href: "https://www.yuque.com/u25901777/kb/wc92tttd0f8dw67f?singleDoc#", target: "_blank", class: "guide-link-inline" }, " 📖 使用说明 ", -1) ]))])) ]), createBaseVNode("button", { onClick: handleClose, class: "close-btn" }, "关闭") ]) ], 2)) } } }; const AboutPage = /*#__PURE__*/_export_sfc(_sfc_main$1, [['__scopeId',"data-v-30e112b7"]]); const _hoisted_1 = { class: "beeline-helper" }; const _hoisted_2 = { class: "page-container" }; const _hoisted_3 = { key: 0, class: "page-wrapper" }; const _hoisted_4 = { key: 0, class: "page-wrapper" }; const _hoisted_5 = { key: 0, class: "page-wrapper" }; const _hoisted_6 = { key: 0, class: "page-wrapper" }; const _hoisted_7 = { key: 0, class: "about-overlay" }; const _hoisted_8 = { class: "about-container" }; const _sfc_main = { __name: 'App', setup(__props) { const isWindowVisible = ref(false); const currentPage = ref('main'); // 当前页面:main, auto-course (操作日志) const autoCompleteEnabled = ref(false); // 自动点击完成按钮开关状态 const autoMuteEnabled = ref(false); // 自动静音开关状态 const FxxKXinWeiEnabled = ref(false); // FxxKXinWei功能开关状态 const operationLogEnabled = ref(true); // 操作日志开关状态 const rainbowEnabled = ref(false); // Rainbow效果开关状态 const rainbowSettings = ref({ backgroundUrl: 'https://bing.img.run/rand.php', backgroundOpacity: 1.0, glassEffectIntensity: 15 }); // Rainbow设置 const autoCompleteInterval = ref(null); // 自动检测定时器 const stateExceptionInterval = ref(null); // 状态异常检测定时器 const operationHistory = ref([]); // 操作历史记录 const currentStatus = ref('未启动'); // 当前工作状态 const isCoursePage = ref(false); // 是否在课程页面 const showAboutPage = ref(false); // 是否显示关于页面 const noVideoPlaybackTimer = ref(null); // 无视频播放计时器 const lastVideoPlaybackTime = ref(null); // 最后视频播放时间戳 // 计算页面标题 const pageTitle = computed(() => { const titles = { 'main': 'Beeline Helper', 'auto-course': '全自动刷课配置', 'auto-answer': '自动答题', 'advanced-settings': '高级设置' }; return titles[currentPage.value] || 'Beeline Helper' }); const toggleWindow = () => { isWindowVisible.value = !isWindowVisible.value; }; const closeWindow = () => { isWindowVisible.value = false; // 关闭窗口时回到主页面 currentPage.value = 'main'; }; // 页面导航 const navigateTo = (page) => { currentPage.value = page; }; // 返回上一页 const goBack = () => { currentPage.value = 'main'; }; // 存储功能开关状态 const saveFeatureStates = async () => { const states = { autoCompleteEnabled: autoCompleteEnabled.value, autoMuteEnabled: autoMuteEnabled.value, FxxKXinWeiEnabled: FxxKXinWeiEnabled.value, operationLogEnabled: operationLogEnabled.value, // This is the state that controls visibility rainbowEnabled: rainbowEnabled.value, rainbowSettings: rainbowSettings.value }; console.log('保存功能状态到存储:', states); await setStorageValue('beelineHelper_featureStates', states); }; // 加载功能开关状态 const loadFeatureStates = async () => { const states = await getStorageValue$1('beelineHelper_featureStates'); console.log('从存储加载功能状态:', states); if (states) { try { autoCompleteEnabled.value = states.autoCompleteEnabled || false; autoMuteEnabled.value = states.autoMuteEnabled || false; FxxKXinWeiEnabled.value = states.FxxKXinWeiEnabled || false; operationLogEnabled.value = states.operationLogEnabled !== undefined ? states.operationLogEnabled : true; // Explicitly set based on loaded state rainbowEnabled.value = states.rainbowEnabled || false; // The userOperationLogPref is now a direct reference to operationLogEnabled. // So no need to separately load it here. // 加载Rainbow设置 if (states.rainbowSettings) { rainbowSettings.value = { backgroundUrl: states.rainbowSettings.backgroundUrl || 'https://images.unsplash.com/photo-1593642532973-d31b6557fa68?auto=format&fit=crop&w=1920&q=80', backgroundOpacity: states.rainbowSettings.backgroundOpacity || 0.9, glassEffectIntensity: states.rainbowSettings.glassEffectIntensity || 15 }; } // 根据加载的状态启动相应的功能 if (autoCompleteEnabled.value) { startAutoCompleteDetection(); } if (autoMuteEnabled.value) { startAutoMute(); } if (FxxKXinWeiEnabled.value) { startFxxKXinWei(); } if (rainbowEnabled.value) { // 延迟应用Rainbow样式,确保DOM已加载 setTimeout(() => { applyRainbowStyles(); }, 100); } } catch (e) { console.warn('Failed to load feature states:', e); } } // Removed redundant check for 'beeline-helper-operation-log' as all states are under 'beelineHelper_featureStates' }; // 自动点击完成按钮开关处理 const handleAutoCompleteToggle = (enabled) => { autoCompleteEnabled.value = enabled; if (enabled) { startAutoCompleteDetection(); } else { stopAutoCompleteDetection(); } saveFeatureStates(); }; // 自动静音开关处理 const handleAutoMuteToggle = (enabled) => { autoMuteEnabled.value = enabled; if (enabled) { startAutoMute(); } else { stopAutoMute(); } saveFeatureStates(); }; // FxxKXinWei功能开关处理 const handleFxxKXinWeiToggle = (enabled) => { FxxKXinWeiEnabled.value = enabled; console.log('FxxKXinWei功能开关状态:', enabled ? '开启' : '关闭'); if (enabled) { startFxxKXinWei(); } else { stopFxxKXinWei(); } saveFeatureStates(); }; // 检查是否在作业页面 const checkIsHomeworkPage = () => { const currentUrl = window.location.href.toLowerCase(); // 检查是否是题目页面(包含homeworkPaperId) const isQuestionPage = currentUrl.includes('homeworkpaperid'); // 如果是题目页面,自动打开自动答题页面 if (isQuestionPage && currentPage.value !== 'auto-answer') { currentPage.value = 'auto-answer'; isWindowVisible.value = true; } return isQuestionPage }; // 检查是否在课程页面 const checkIsCoursePage = () => { const currentUrl = window.location.href.toLowerCase(); // 检查是否是课程页面(包含/courseInfo/learn/courseWare/和/video/) const isCoursePage = currentUrl.includes('/courseinfo/learn/courseware/') && currentUrl.includes('/video/'); // 检查页面是否包含视频播放器相关元素 const hasVideoElements = document.querySelectorAll('video').length > 0; const hasVideoPlayer = document.querySelector('.video-player, [class*="video"], [class*="player"]'); return isCoursePage && (hasVideoElements || hasVideoPlayer) }; // 拦截网络请求检测题目页面 const setupNetworkMonitoring = () => { if (window.beelineHelperNetworkMonitoringEnabled) return // 避免重复设置 window.beelineHelperNetworkMonitoringEnabled = true; // 保存原始的fetch函数 window.originalFetch = window.fetch; window.fetch = async function(...args) { const url = args[0]; // 检查是否是题目页面请求 if (typeof url === 'string' && url.includes('/api/learning-service/admin/studentLearning/getHomeworkPaperDetail/')) { console.log('检测到题目页面请求:', url); // 如果是题目页面,自动打开自动答题页面并重置位置 if (currentPage.value !== 'auto-answer') { currentPage.value = 'auto-answer'; isWindowVisible.value = true; // 重置浮窗位置到屏幕最左侧 setTimeout(() => { const floatingWindow = document.querySelector('.floating-window'); if (floatingWindow) { floatingWindow.style.left = '20px'; floatingWindow.style.top = '20px'; } }, 100); } } return window.originalFetch(...args) }; // 拦截XMLHttpRequest if (!window.originalXMLHttpRequest) { window.originalXMLHttpRequest = window.XMLHttpRequest; window.XMLHttpRequest = function() { const xhr = new window.originalXMLHttpRequest(); const originalOpen = xhr.open; const originalSend = xhr.send; xhr.open = function(method, url, ...rest) { this._url = url; return originalOpen.call(this, method, url, ...rest) }; xhr.send = function(data) { // 检查是否是题目页面请求 if (this._url && this._url.includes('/api/learning-service/admin/studentLearning/getHomeworkPaperDetail/')) { console.log('检测到题目页面请求(XHR):', this._url); // 如果是题目页面,自动打开自动答题页面并重置位置 if (currentPage.value !== 'auto-answer') { currentPage.value = 'auto-answer'; isWindowVisible.value = true; // 重置浮窗位置到屏幕最左侧 setTimeout(() => { const floatingWindow = document.querySelector('.floating-window'); if (floatingWindow) { floatingWindow.style.left = '20px'; floatingWindow.style.top = '20px'; } }, 100); } } return originalSend.call(this, data) }; return xhr }; } }; // 停止网络监控 const stopNetworkMonitoring = () => { if (!window.beelineHelperNetworkMonitoringEnabled) return window.beelineHelperNetworkMonitoringEnabled = false; // 恢复原始fetch函数 if (window.originalFetch) { window.fetch = window.originalFetch; delete window.originalFetch; } // 恢复原始XMLHttpRequest if (window.originalXMLHttpRequest) { window.XMLHttpRequest = window.originalXMLHttpRequest; delete window.originalXMLHttpRequest; } console.log('网络监控已停止'); }; // 启动自动检测 const startAutoCompleteDetection = () => { currentStatus.value = '检测中...'; addToHistory('开始自动检测刷课按钮'); // 每3秒检测一次 autoCompleteInterval.value = setInterval(autoCompleteCourse, 3000); // 立即执行一次检测 autoCompleteCourse(); }; // 停止自动检测 const stopAutoCompleteDetection = () => { if (autoCompleteInterval.value) { clearInterval(autoCompleteInterval.value); autoCompleteInterval.value = null; } currentStatus.value = '已停止'; addToHistory('停止自动检测'); }; // 自动刷课功能 const autoCompleteCourse = () => { const buttonSelector = "#videoLayer > div > div > div.button-box > div.left"; // 检查按钮是否存在 const button = document.querySelector(buttonSelector); if (button) { // 显示状态信息 console.log('检测到刷课按钮,3秒后自动点击...'); currentStatus.value = '检测到按钮,等待点击...'; addToHistory('检测到刷课按钮'); // 延迟3秒后点击 setTimeout(() => { button.click(); console.log('已自动点击刷课按钮'); currentStatus.value = '已点击完成按钮'; addToHistory('已点击刷课按钮'); }, 3000); } else { currentStatus.value = '未检测到按钮'; } }; // 自动静音功能 const startAutoMute = () => { addToHistory('开始自动静音检测'); // 查找视频元素并静音 const videoElements = document.querySelectorAll('video'); if (videoElements.length > 0) { videoElements.forEach((video, index) => { video.muted = true; console.log(`已静音视频 ${index + 1}`); }); addToHistory(`已静音 ${videoElements.length} 个视频`); } else { addToHistory('未找到视频元素'); } // 监听新视频元素的创建 const observer = new MutationObserver((mutations) => { mutations.forEach((mutation) => { mutation.addedNodes.forEach((node) => { if (node.nodeType === 1) { // Element node // 检查新增节点中的视频元素 const videos = node.querySelectorAll ? node.querySelectorAll('video') : []; videos.forEach((video) => { video.muted = true; console.log('检测到新视频,已自动静音'); addToHistory('检测到新视频,已自动静音'); }); // 如果节点本身就是视频元素 if (node.tagName === 'VIDEO') { node.muted = true; console.log('检测到新视频,已自动静音'); addToHistory('检测到新视频,已自动静音'); } } }); }); }); // 开始观察DOM变化 observer.observe(document.body, { childList: true, subtree: true }); // 保存observer以便后续停止 window.beelineHelperMuteObserver = observer; }; // 停止自动静音 const stopAutoMute = () => { // 停止观察DOM变化 if (window.beelineHelperMuteObserver) { window.beelineHelperMuteObserver.disconnect(); window.beelineHelperMuteObserver = null; } // 恢复视频音量 const videoElements = document.querySelectorAll('video'); videoElements.forEach((video, index) => { video.muted = false; console.log(`已恢复视频 ${index + 1} 音量`); }); addToHistory('已停止自动静音'); }; // 启动FxxKXinWei功能 const startFxxKXinWei = () => { addToHistory('开始FxxKXinWei功能'); currentStatus.value = '监控学习状态...'; // 设置网络请求监控 setupStateExceptionMonitoring(); // 启动防挂机守护机制 startAntiIdleProtection(); }; // 停止FxxKXinWei功能 const stopFxxKXinWei = () => { // 停止DOM状态检测定时器 if (stateExceptionInterval.value) { clearInterval(stateExceptionInterval.value); stateExceptionInterval.value = null; } // 停止防挂机守护机制 stopAntiIdleProtection(); // 停止课程页面无视频播放检测 stopCoursePageDetection(); // 停止状态异常网络监控 stopStateExceptionMonitoring(); currentStatus.value = '已停止'; addToHistory('停止FxxKXinWei功能'); }; // 设置状态异常监控(FxxKXinWei功能) const setupStateExceptionMonitoring = () => { // 每2秒检测一次DOM状态、课程页面视频状态和视频播放错误 stateExceptionInterval.value = setInterval(() => { const messageElement = document.querySelector('.el-message-box__container > div > p'); if (messageElement) { const messageText = messageElement.textContent.trim(); // 检测状态异常消息 if (messageText === '当前视频不允许倍速播放' || messageText === '系统检测到你的学习状态异常,请刷新后继续学习' || messageText === '播放位置不合法') { console.log(`检测到状态异常消息: "${messageText}",自动刷新页面...`); addToHistory(`检测到状态异常消息: "${messageText}",自动刷新页面`); // 延迟2秒后刷新页面 setTimeout(() => { window.location.reload(); }, 2000); } } // 延迟检测视频播放错误,避免过早介入 setTimeout(() => { const videoError = checkVideoError(); if (videoError) { console.log(`检测到视频播放错误: "${videoError}",自动刷新页面...`); addToHistory(`检测到视频播放错误: "${videoError}",自动刷新页面`); // 延迟2秒后刷新页面 setTimeout(() => { window.location.reload(); }, 2000); } }, 5000); // 延迟5秒检测视频错误 // 同时检测课程页面无视频播放状态 checkCoursePageVideoStatus(); }, 2000); }; // 停止状态异常监控 const stopStateExceptionMonitoring = () => { // 状态异常监控与DOM状态检测使用同一个定时器,已在stopFxxKXinWei中处理 console.log('状态异常监控已停止'); }; // 检测是否有视频正在播放 const checkVideoPlaying = () => { const videoElements = document.querySelectorAll('video'); let isAnyVideoPlaying = false; if (videoElements.length > 0) { videoElements.forEach((video) => { // 检查视频是否正在播放 if (video.readyState >= 1 && !video.paused && !video.ended) { isAnyVideoPlaying = true; lastVideoPlaybackTime.value = Date.now(); } }); } return isAnyVideoPlaying }; // 停止课程页面无视频播放检测 const stopCoursePageDetection = () => { // 清除无视频播放计时器 if (noVideoPlaybackTimer.value) { clearTimeout(noVideoPlaybackTimer.value); noVideoPlaybackTimer.value = null; } // 重置状态 lastVideoPlaybackTime.value = null; isCoursePage.value = false; console.log('课程页面无视频播放检测已停止'); }; // 检查课程页面视频状态 const checkCoursePageVideoStatus = () => { const wasOnCoursePage = isCoursePage.value; isCoursePage.value = checkIsCoursePage(); if (isCoursePage.value) { console.log('检测到课程页面,开始监控视频播放状态'); const isVideoPlaying = checkVideoPlaying(); if (isVideoPlaying) { // 有视频在播放,重置计时器 if (noVideoPlaybackTimer.value) { clearTimeout(noVideoPlaybackTimer.value); noVideoPlaybackTimer.value = null; console.log('检测到视频播放,重置无视频播放计时器'); } } else { // 没有视频在播放,启动或继续计时 if (!noVideoPlaybackTimer.value) { console.log('检测到无视频播放,启动1分钟计时器'); noVideoPlaybackTimer.value = setTimeout(() => { console.log('课程页面超过1分钟无视频播放,自动刷新页面...'); addToHistory('课程页面超过1分钟无视频播放,自动刷新页面'); // 延迟2秒后刷新页面 setTimeout(() => { window.location.reload(); }, 2000); }, 60000); // 1分钟 } } } else { // 不在课程页面,清除计时器 if (noVideoPlaybackTimer.value) { clearTimeout(noVideoPlaybackTimer.value); noVideoPlaybackTimer.value = null; console.log('离开课程页面,清除无视频播放计时器'); } // 如果刚从课程页面离开,记录状态变化 if (wasOnCoursePage) { console.log('离开课程页面'); } } }; // 检测视频播放错误 const checkVideoError = () => { // 检测错误对话框元素是否存在且有实际内容 const errorDialog = document.querySelector("#videoDomId > div.vjs-error-display.vjs-modal-dialog > div"); console.log('🔍 视频错误检测 - 选择器结果:', errorDialog); if (errorDialog) { // 错误对话框本身已经是内容元素,不需要再查询子元素 const contentText = errorDialog.textContent.trim(); console.log('🔍 检测到视频错误对话框,内容:', contentText || '(空)'); console.log('🔍 错误对话框完整HTML:', errorDialog.outerHTML); console.log('🔍 错误对话框本身:', errorDialog); // 检查所有可能的文本内容 console.log('🔍 innerText:', errorDialog.innerText); console.log('🔍 textContent:', errorDialog.textContent); console.log('🔍 innerHTML:', errorDialog.innerHTML); console.log('🔍 children:', errorDialog.children); if (contentText !== '') { console.warn('❌ 检测到视频播放错误对话框,内容:', contentText); return '视频播放错误' } else { console.log('✅ 错误对话框内容为空,跳过'); } } else { console.log('✅ 未检测到视频错误对话框'); // 调试:检查是否存在其他可能的错误元素 const allErrorDialogs = document.querySelectorAll('div.vjs-error-display'); console.log('🔍 所有可能的错误对话框:', allErrorDialogs.length); allErrorDialogs.forEach((dialog, index) => { console.log(`🔍 错误对话框 ${index + 1}:`, dialog); console.log(`🔍 错误对话框 ${index + 1} 父级:`, dialog.parentElement); }); } return null }; // 防挂机守护机制 const startAntiIdleProtection = () => { addToHistory('启动防挂机守护机制'); console.log('⚡ 芯位蜜线防挂机守护已加载完毕'); /***************************************************** * 🎬 自动播放守护机制 *****************************************************/ const tryPlayAll = () => { const videos = document.querySelectorAll('video'); if (videos.length === 0) return; videos.forEach(v => { if (v.paused || v.readyState < 2) { v.muted = true; const playPromise = v.play(); if (playPromise) { playPromise.catch(err => console.warn('⚠️ 自动播放失败:', err)); } } }); }; // 定时器防守循环(防止脚本强制暂停) const antiIdleInterval = setInterval(tryPlayAll, 3000); /***************************************************** * 👁️ DOM 监控机制 * 检测页面中 video 元素变化,自动重新挂载播放守护 *****************************************************/ const observer = new MutationObserver(mutations => { for (const m of mutations) { if (m.addedNodes.length) { for (const node of m.addedNodes) { if (node.tagName === 'VIDEO' || (node.querySelector && node.querySelector('video'))) { console.log('🎥 检测到新视频节点,自动播放守护启动'); tryPlayAll(); } } } } }); const domObserver = new MutationObserver(() => { if (document.readyState === 'complete') { observer.observe(document.body, { childList: true, subtree: true }); tryPlayAll(); } }).observe(document.documentElement, { childList: true, subtree: true }); // 立即启动一次 tryPlayAll(); // 多重重试确保成功 setTimeout(tryPlayAll, 1000); setTimeout(tryPlayAll, 3000); // 保存定时器和观察器以便后续停止 window.beelineHelperAntiIdleInterval = antiIdleInterval; window.beelineHelperAntiIdleObserver = observer; window.beelineHelperAntiIdleDomObserver = domObserver; console.log('✅ 防挂机守护机制完全启动'); }; // 停止防挂机守护机制 const stopAntiIdleProtection = () => { // 清除定时器 if (window.beelineHelperAntiIdleInterval) { clearInterval(window.beelineHelperAntiIdleInterval); window.beelineHelperAntiIdleInterval = null; } // 停止观察器 if (window.beelineHelperAntiIdleObserver) { window.beelineHelperAntiIdleObserver.disconnect(); window.beelineHelperAntiIdleObserver = null; } if (window.beelineHelperAntiIdleDomObserver) { window.beelineHelperAntiIdleDomObserver.disconnect(); window.beelineHelperAntiIdleDomObserver = null; } console.log('🔍 防挂机守护机制已完全停止'); addToHistory('停止防挂机守护机制'); }; // 添加操作历史 const addToHistory = (message) => { if (!operationLogEnabled.value) return const timestamp = new Date().toLocaleTimeString(); operationHistory.value.unshift({ time: timestamp, message: message }); // 只保留最近10条记录 if (operationHistory.value.length > 10) { operationHistory.value = operationHistory.value.slice(0, 10); } }; // 监听页面变化 const handlePageChange = () => { checkIsHomeworkPage(); // 如果启用了FxxKXinWei功能,检查课程页面视频状态 if (FxxKXinWeiEnabled.value) { checkCoursePageVideoStatus(); } }; // 应用Rainbow样式 const applyRainbowStyles = () => { console.log('应用Rainbow样式', rainbowSettings.value); // 创建或更新背景层 let bgLayer = document.getElementById('beeline-bg-layer'); if (!bgLayer) { bgLayer = document.createElement('div'); bgLayer.id = 'beeline-bg-layer'; Object.assign(bgLayer.style, { position: 'fixed', top: 0, left: 0, width: '100vw', height: '100vh', zIndex: '-1', pointerEvents: 'none', backgroundSize: 'cover', backgroundPosition: 'center', filter: 'brightness(0.95)', transition: 'opacity 0.5s ease-in-out', opacity: '0' // 初始透明 }); document.body.appendChild(bgLayer); } // 创建或更新黑色叠加层 let overlayLayer = document.getElementById('beeline-overlay-layer'); if (!overlayLayer) { overlayLayer = document.createElement('div'); overlayLayer.id = 'beeline-overlay-layer'; Object.assign(overlayLayer.style, { position: 'fixed', top: 0, left: 0, width: '100vw', height: '100vh', zIndex: '-1', pointerEvents: 'none', backgroundColor: 'rgba(0, 0, 0, 0.5)', transition: 'opacity 0.5s ease-in-out', opacity: '0' // 初始透明 }); document.body.appendChild(overlayLayer); } // 立即设置背景图片(即使还没加载完成) bgLayer.style.backgroundImage = `url(${rainbowSettings.value.backgroundUrl})`; // 添加加载指示器 const removeLoader = addLoadingEffect(); // 预加载背景图片 preloadBackgroundImage(rainbowSettings.value.backgroundUrl) .then(() => { // 图片加载完成后淡入背景 setTimeout(() => { // 设置背景层完全不透明,黑色叠加层使用用户设置的透明度 bgLayer.style.opacity = '1'; overlayLayer.style.opacity = (1 - rainbowSettings.value.backgroundOpacity).toString(); // 设置页面背景为透明 document.documentElement.style.setProperty('background-color', 'transparent', 'important'); document.body.style.setProperty('background-color', 'transparent', 'important'); // 应用毛玻璃效果到特定元素 applyGlassEffects(); // 设置透明层 applyTransparentLayers(); // 启动DOM观察器来处理动态内容 startDOMObserver(); // 移除加载指示器 setTimeout(removeLoader, 500); // 初始删除已存在的元素 setTimeout(() => { removeCourseIntroduceTabElements(); }, 200); }, 100); }) .catch((error) => { console.error('背景图片加载失败:', error); // 即使图片加载失败,仍然应用其他样式 setTimeout(() => { // 设置背景层完全不透明,黑色叠加层使用用户设置的透明度 bgLayer.style.opacity = '1'; overlayLayer.style.opacity = (1 - rainbowSettings.value.backgroundOpacity).toString(); document.documentElement.style.setProperty('background-color', 'transparent', 'important'); document.body.style.setProperty('background-color', 'transparent', 'important'); applyGlassEffects(); applyTransparentLayers(); startDOMObserver(); // 移除加载指示器 setTimeout(removeLoader, 500); // 初始删除已存在的元素 setTimeout(() => { removeCourseIntroduceTabElements(); }, 200); }, 100); }); }; // 应用毛玻璃效果 const applyGlassEffects = () => { const glassConfigs = [ { selectors: [ ".el-header", ".card", ".popup", "#chatLayout > div.chatIndex-sidebar.noCollapsed", "#chatLayout > div.chatIndex-sidebar.collapsed", "#LayoutTeaching > main > div > div" ], config: { bgColor: 'rgba(255, 255, 255, 0.18)', blur: `${rainbowSettings.value.glassEffectIntensity}px`, radius: '12px', exclude: ['.el-menu', '.el-menu-item', '.el-sub-menu'] } }, { selectors: [ "#chatLayout > main > div > div.chat-content-inner.chat-content-inner--full > div.teacher-bank-main > ul > li", ".el-menu-item", ".el-sub-menu" ], config: { bgColor: 'rgba(255, 255, 255, 0.12)', blur: `${Math.max(rainbowSettings.value.glassEffectIntensity - 4, 0)}px`, radius: '10px' } }, { selectors: [ "#LayoutTeaching > main > div > div > div.tabs", "#LayoutTeaching > main > div > div > div.tab-pane > div:nth-child(1) > div.header", ".homework-list[data-v-b27e416b]" ], config: { bgColor: 'rgba(255, 255, 255, 0.1)', blur: `${Math.max(rainbowSettings.value.glassEffectIntensity - 2, 0)}px`, radius: '12px', border: '1px solid rgba(255,255,255,0.1)' } } ]; glassConfigs.forEach(effect => { effect.selectors.forEach(selector => { try { const elements = document.querySelectorAll(selector); elements.forEach(el => { if (effect.config.exclude && effect.config.exclude.some(ex => el.matches(ex))) return el.style.setProperty('background-color', effect.config.bgColor, 'important'); el.style.setProperty('backdrop-filter', `blur(${effect.config.blur})`, 'important'); el.style.setProperty('border-radius', effect.config.radius, 'important'); el.style.setProperty('transition', 'all 0.3s ease', 'important'); if (effect.config.border) { el.style.setProperty('border', effect.config.border, 'important'); } el.style.backgroundImage = 'none'; }); } catch (e) { console.error(`Invalid selector: ${selector}`, e); } }); }); }; // 应用透明层 const applyTransparentLayers = () => { const transparentSelectors = [ "#LayoutTeaching > main > div", "#LayoutTeaching > main > div > div > div.tab-pane > div:nth-child(1) > div.loading-container > div", "#chatLayout > main > div > div:nth-child(2) > div:nth-child(2) > ul", "#app", ".el-main[data-v-6b17b855]", "#LayoutTeaching > main > div > div > div.course-introduce-tab", "#LayoutTeaching > main > div > div > div.course-courseWare__body" ]; transparentSelectors.forEach(selector => { try { const elements = document.querySelectorAll(selector); elements.forEach(el => { el.style.setProperty('background-color', 'transparent', 'important'); el.style.backgroundImage = 'none'; }); } catch (e) { console.error(`Invalid selector: ${selector}`, e); } }); }; // 移除Rainbow样式 const removeRainbowStyles = () => { console.log('移除Rainbow样式'); // 移除背景层 const bgLayer = document.getElementById('beeline-bg-layer'); if (bgLayer) { bgLayer.remove(); } // 移除黑色叠加层 const overlayLayer = document.getElementById('beeline-overlay-layer'); if (overlayLayer) { overlayLayer.remove(); } // 恢复页面背景 document.documentElement.style.removeProperty('background-color'); document.body.style.removeProperty('background-color'); // 移除所有毛玻璃效果 const elementsWithGlass = document.querySelectorAll('[style*="backdrop-filter"]'); elementsWithGlass.forEach(el => { el.style.removeProperty('backdrop-filter'); el.style.removeProperty('background-color'); el.style.removeProperty('border-radius'); el.style.removeProperty('border'); el.style.removeProperty('transition'); }); // 恢复透明层 const transparentSelectors = [ "#LayoutTeaching > main > div", "#LayoutTeaching > main > div > div > div.tab-pane > div:nth-child(1) > div.loading-container > div", "#chatLayout > main > div > div:nth-child(2) > div:nth-child(2) > ul", "#app", ".el-main[data-v-6b17b855]", "#LayoutTeaching > main > div > div > div.course-introduce-tab" ]; transparentSelectors.forEach(selector => { try { const elements = document.querySelectorAll(selector); elements.forEach(el => { el.style.removeProperty('background-color'); el.style.removeProperty('background-image'); }); } catch (e) { console.error(`Invalid selector: ${selector}`, e); } }); // 停止DOM观察器 stopDOMObserver(); }; // DOM观察器处理动态内容 let mutationObserver = null; const startDOMObserver = () => { if (mutationObserver) { return // 观察器已经在运行 } mutationObserver = new MutationObserver((mutations) => { let shouldReapply = false; let shouldRemoveElements = false; mutations.forEach(mutation => { if (mutation.addedNodes.length > 0) { shouldReapply = true; // 检查新增节点中是否包含需要删除的元素 mutation.addedNodes.forEach(node => { if (node.nodeType === 1) { // Element node if (node.classList && node.classList.contains('course-introduce-tab__content')) { shouldRemoveElements = true; } // 检查子元素 if (node.querySelectorAll) { const contentElements = node.querySelectorAll('.course-introduce-tab__content'); const tabElement = node.querySelector("#LayoutTeaching > main > div > div > div.course-introduce-tab"); if (contentElements.length > 0 || tabElement) { shouldRemoveElements = true; } } } }); } }); if (shouldRemoveElements) { // 延迟删除,确保元素已完全加载 setTimeout(() => { removeCourseIntroduceTabElements(); }, 50); } if (shouldReapply) { // 延迟重新应用样式,确保新元素已完全加载 setTimeout(() => { applyGlassEffects(); applyTransparentLayers(); }, 100); } }); // 开始观察DOM变化 mutationObserver.observe(document.body, { childList: true, subtree: true, attributes: true }); console.log('DOM观察器已启动'); }; const stopDOMObserver = () => { if (mutationObserver) { mutationObserver.disconnect(); mutationObserver = null; console.log('DOM观察器已停止'); } }; // 预加载背景图片 const preloadBackgroundImage = (url) => { return new Promise((resolve, reject) => { // 如果是data URL,直接解析 if (url.startsWith('data:')) { resolve(); return } const img = new Image(); img.onload = () => { console.log('背景图片预加载成功'); resolve(); }; img.onerror = () => { console.warn('背景图片预加载失败,将使用异步加载'); reject(new Error('图片加载失败')); }; // 设置超时时间 const timeout = setTimeout(() => { console.warn('背景图片加载超时,将使用异步加载'); reject(new Error('图片加载超时')); }, 3000); // 3秒超时 img.onload = () => { clearTimeout(timeout); console.log('背景图片预加载成功'); resolve(); }; img.onerror = () => { clearTimeout(timeout); console.warn('背景图片预加载失败,将使用异步加载'); reject(new Error('图片加载失败')); }; img.src = url; }) }; // 删除 course-introduce-tab 相关元素 const removeCourseIntroduceTabElements = () => { // 删除 class="course-introduce-tab__content" 的元素 const contentElements = document.querySelectorAll('.course-introduce-tab__content'); contentElements.forEach(element => { element.remove(); console.log('已删除 course-introduce-tab__content 元素'); }); // 删除特定路径的 course-introduce-tab 元素 const tabElement = document.querySelector("#LayoutTeaching > main > div > div > div.course-introduce-tab"); if (tabElement) { tabElement.remove(); console.log('已删除特定 course-introduce-tab 元素'); } if (contentElements.length > 0 || tabElement) { console.log(`已删除 ${contentElements.length} 个 course-introduce-tab__content 元素和 ${tabElement ? 1 : 0} 个特定 course-introduce-tab 元素`); } }; // 添加渐进式加载效果 const addLoadingEffect = (bgLayer) => { // 创建加载指示器 const loader = document.createElement('div'); loader.id = 'beeline-bg-loader'; Object.assign(loader.style, { position: 'fixed', top: '50%', left: '50%', transform: 'translate(-50%, -50%)', width: '40px', height: '40px', border: '3px solid rgba(255,255,255,0.3)', borderTop: '3px solid #667eea', borderRadius: '50%', animation: 'spin 1s linear infinite', zIndex: '9999', pointerEvents: 'none' }); // 添加旋转动画 const style = document.createElement('style'); style.textContent = ` @keyframes spin { 0% { transform: translate(-50%, -50%) rotate(0deg); } 100% { transform: translate(-50%, -50%) rotate(360deg); } } `; document.head.appendChild(style); document.body.appendChild(loader); // 返回移除函数 return () => { if (loader.parentNode) { loader.remove(); } if (style.parentNode) { style.remove(); } } }; // 添加事件监听器 onMounted(async () => { // 监听页面变化 window.addEventListener('popstate', handlePageChange); window.addEventListener('hashchange', handlePageChange); // 设置网络请求监控 setupNetworkMonitoring(); // 加载存储的功能开关状态 await loadFeatureStates(); // 暴露应用实例以便其他组件访问 window.beelineHelperApp = { operationLogEnabled, userOperationLogPref: operationLogEnabled, // 将 operationLogEnabled 直接暴露为用户操作日志偏好 rainbowEnabled, rainbowSettings, applyRainbowStyles, removeRainbowStyles, saveFeatureStates, checkIsHomeworkPage }; }); onUnmounted(() => { // 移除页面变化监听器 window.removeEventListener('popstate', handlePageChange); window.removeEventListener('hashchange', handlePageChange); // 停止所有正在运行的功能 stopAutoCompleteDetection(); stopAutoMute(); stopFxxKXinWei(); stopNetworkMonitoring(); }); return (_ctx, _cache) => { return (openBlock(), createElementBlock("div", _hoisted_1, [ createVNode(FloatingWindow, { "is-visible": isWindowVisible.value, title: pageTitle.value, "show-back-button": currentPage.value !== 'main', "auto-answer-mode": currentPage.value === 'auto-answer', onClose: closeWindow, onBack: goBack }, { default: withCtx(() => [ createBaseVNode("div", _hoisted_2, [ createVNode(Transition, { name: "page-fade", mode: "out-in" }, { default: withCtx(() => [ (currentPage.value === 'main') ? (openBlock(), createElementBlock("div", _hoisted_3, [ createVNode(MainPage, { onNavigate: navigateTo, onOpenAbout: _cache[0] || (_cache[0] = $event => (showAboutPage.value = true)) }) ])) : createCommentVNode("", true) ]), _: 1 }), createVNode(Transition, { name: "page-fade", mode: "out-in" }, { default: withCtx(() => [ (currentPage.value === 'auto-course') ? (openBlock(), createElementBlock("div", _hoisted_4, [ createVNode(AutoCoursePage, { "auto-complete-enabled": autoCompleteEnabled.value, "auto-mute-enabled": autoMuteEnabled.value, "FxxK-xin-wei-enabled": FxxKXinWeiEnabled.value, onToggleAutoComplete: handleAutoCompleteToggle, onToggleAutoMute: handleAutoMuteToggle, onToggleFxxKXinWei: handleFxxKXinWeiToggle }, null, 8, ["auto-complete-enabled", "auto-mute-enabled", "FxxK-xin-wei-enabled"]) ])) : createCommentVNode("", true) ]), _: 1 }), createVNode(Transition, { name: "page-fade", mode: "out-in" }, { default: withCtx(() => [ (currentPage.value === 'auto-answer') ? (openBlock(), createElementBlock("div", _hoisted_5, [ createVNode(AutoAnswerPage) ])) : createCommentVNode("", true) ]), _: 1 }), createVNode(Transition, { name: "page-fade", mode: "out-in" }, { default: withCtx(() => [ (currentPage.value === 'advanced-settings') ? (openBlock(), createElementBlock("div", _hoisted_6, [ createVNode(AdvancedSettingsPage, { onNavigate: navigateTo }) ])) : createCommentVNode("", true) ]), _: 1 }) ]) ]), _: 1 }, 8, ["is-visible", "title", "show-back-button", "auto-answer-mode"]), createVNode(Transition, { name: "status-fade-slide" }, { default: withCtx(() => [ (operationLogEnabled.value && currentPage.value !== 'auto-answer') ? (openBlock(), createBlock(StatusWindow, { key: 0, "current-status": currentStatus.value, "operation-history": operationHistory.value }, null, 8, ["current-status", "operation-history"])) : createCommentVNode("", true) ]), _: 1 }), createVNode(ControlButton, { "is-window-visible": isWindowVisible.value, onClick: toggleWindow }, null, 8, ["is-window-visible"]), createVNode(Transition, { name: "about-fade-scale" }, { default: withCtx(() => [ (showAboutPage.value) ? (openBlock(), createElementBlock("div", _hoisted_7, [ createBaseVNode("div", _hoisted_8, [ createVNode(AboutPage, { onClose: _cache[1] || (_cache[1] = $event => (showAboutPage.value = false)) }) ]) ])) : createCommentVNode("", true) ]), _: 1 }) ])) } } }; const App = /*#__PURE__*/_export_sfc(_sfc_main, [['__scopeId',"data-v-5fcc6ae2"]]); // 创建并挂载Vue应用到页面 function initApp() { // 检查是否已经存在我们的应用 if (document.getElementById('beeline-helper-app')) { return } // 创建应用容器 const appContainer = document.createElement('div'); appContainer.id = 'beeline-helper-app'; appContainer.style.cssText = ` position: fixed; top: 0; left: 0; width: 100vw; height: 100vh; pointer-events: none; z-index: 9999; `; document.body.appendChild(appContainer); // 创建Vue应用 createApp(App).mount(appContainer); } // 等待页面加载完成后初始化应用 if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', initApp); } else { initApp(); } }) }; })); System.register("./completionAnswer-CVrFId9r-DN1v1V8X.js", ['./__monkey.entry-D8JmPXXX.js'], (function (exports, module) { 'use strict'; var extractQuestionContent, queryAnswer, parseAnswer; return { setters: [module => { extractQuestionContent = module.e; queryAnswer = module.q; parseAnswer = module.p; }], execute: (function () { exports("autoAnswerCompletionQuestion", autoAnswerCompletionQuestion); /** * 填空题回答工具类 * 处理填空题的检测和回答逻辑 */ /** * 查找填空题输入框 * @returns {HTMLElement[]} 输入框元素数组 */ function findCompletionInputs() { // 查找填空题输入框 - 尝试多种选择器 const inputs = []; // 查找所有可能的输入框 const possibleSelectors = [ 'input[type="text"]', 'input[placeholder*="填空"]', 'input[placeholder*="答案"]', '.el-input__inner', '.el-input input' ]; possibleSelectors.forEach(selector => { const elements = document.querySelectorAll(selector); elements.forEach(element => { // 检查元素是否在填空题区域 const questionContainer = element.closest("div[class*='homework-']"); if (questionContainer) { const typeElement = questionContainer.querySelector('span.tag.el-tooltip__trigger'); if (typeElement && typeElement.textContent.trim() === '填空题') { inputs.push(element); } } }); }); return inputs; } /** * 检查输入框是否已有内容 * @param {HTMLElement} input 输入框元素 * @returns {boolean} 是否已有内容 */ function hasExistingContent(input) { if (input.tagName === 'INPUT' || input.tagName === 'TEXTAREA') { return input.value.trim().length > 0; } else { return input.textContent.trim().length > 0; } } /** * 自动回答填空题 * @param {string} token API token * @returns {Promise<object>} 答题结果 */ async function autoAnswerCompletionQuestion(token = '') { try { const inputs = findCompletionInputs(); if (inputs.length === 0) { return { success: false, message: '未找到填空题输入框' }; } console.log(`找到 ${inputs.length} 个填空题输入框`); // 检查是否有输入框已有内容 const filledInputs = inputs.filter(input => hasExistingContent(input)); if (filledInputs.length > 0) { console.log(`发现 ${filledInputs.length} 个输入框已有内容,跳过自动答题`); return { success: false, message: `发现 ${filledInputs.length} 个输入框已有内容,跳过自动答题` }; } // 提取题目内容 const { question } = extractQuestionContent('completion'); if (!question) { return { success: false, message: '无法提取填空题题目内容' }; } console.log('检测到填空题:', question); // 查询题库 const apiResult = await queryAnswer(question, [], 'completion', token); if (!apiResult.success) { return { success: false, message: apiResult.message, question: question, answer: apiResult.answer }; } console.log('题库查询结果:', apiResult); // 解析答案 const answer = parseAnswer(apiResult.answer, 'completion', []); if (!answer) { return { success: false, message: '无法解析答案', question: apiResult.question, answer: apiResult.answer }; } console.log('解析后的答案:', answer); // 将答案填充到第一个输入框 if (inputs.length > 0) { const firstInput = inputs[0]; // 聚焦并清空输入框 firstInput.focus(); firstInput.value = ''; // 输入答案 firstInput.value = answer; // 触发输入事件 const inputEvent = new Event('input', { bubbles: true }); firstInput.dispatchEvent(inputEvent); const changeEvent = new Event('change', { bubbles: true }); firstInput.dispatchEvent(changeEvent); console.log('填空题答案已填充'); return { success: true, message: '填空题答案已填充', question: apiResult.question, answer: apiResult.answer, times: apiResult.times }; } return { success: false, message: '无法填充答案' }; } catch (error) { console.error('填空题回答失败:', error); return { success: false, message: `填空题回答失败: ${error.message}` }; } } }) }; })); System.register("./subjectiveAnswer-OT4AhdTl-CfTgHXfC.js", ['./__monkey.entry-D8JmPXXX.js'], (function (exports, module) { 'use strict'; var getStorageValue$1; return { setters: [module => { getStorageValue$1 = module.g; }], execute: (function () { exports({ checkSubjectiveAnswerConfig: checkSubjectiveAnswerConfig, streamAnswerSubjectiveQuestion: streamAnswerSubjectiveQuestion }); function isElementType(element, tag, props) { if (element.namespaceURI && element.namespaceURI !== 'http://www.w3.org/1999/xhtml') { return false; } tag = Array.isArray(tag) ? tag : [ tag ]; // tagName is uppercase in HTMLDocument and lowercase in XMLDocument if (!tag.includes(element.tagName.toLowerCase())) { return false; } if (props) { return Object.entries(props).every(([k, v])=>element[k] === v); } return true; } function getWindow(node) { var _node_ownerDocument; if (isDocument$1(node) && node.defaultView) { return node.defaultView; } else if ((_node_ownerDocument = node.ownerDocument) === null || _node_ownerDocument === undefined ? undefined : _node_ownerDocument.defaultView) { return node.ownerDocument.defaultView; } throw new Error(`Could not determine window of node. Node was ${describe(node)}`); } function isDocument$1(node) { return node.nodeType === 9; } function describe(val) { return typeof val === 'function' ? `function ${val.name}` : val === null ? 'null' : String(val); } // jsdom does not implement Blob.text() function readBlobText(blob, FileReader) { return new Promise((res, rej)=>{ const fr = new FileReader(); fr.onerror = rej; fr.onabort = rej; fr.onload = ()=>{ res(String(fr.result)); }; fr.readAsText(blob); }); } // FileList can not be created per constructor. function createFileList(window, files) { const list = { ...files, length: files.length, item: (index)=>list[index], [Symbol.iterator]: function* nextFile() { for(let i = 0; i < list.length; i++){ yield list[i]; } } }; list.constructor = window.FileList; // guard for environments without FileList /* istanbul ignore else */ if (window.FileList) { Object.setPrototypeOf(list, window.FileList.prototype); } Object.freeze(list); return list; } function _define_property$8(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } // DataTransfer is not implemented in jsdom. // DataTransfer with FileList is being created by the browser on certain events. class DataTransferItemStub { getAsFile() { return this.file; } getAsString(callback) { if (typeof this.data === 'string') { callback(this.data); } } /* istanbul ignore next */ webkitGetAsEntry() { throw new Error('not implemented'); } constructor(dataOrFile, type){ _define_property$8(this, "kind", undefined); _define_property$8(this, "type", undefined); _define_property$8(this, "file", null); _define_property$8(this, "data", undefined); if (typeof dataOrFile === 'string') { this.kind = 'string'; this.type = String(type); this.data = dataOrFile; } else { this.kind = 'file'; this.type = dataOrFile.type; this.file = dataOrFile; } } } class DataTransferItemListStub extends Array { add(...args) { const item = new DataTransferItemStub(args[0], args[1]); this.push(item); return item; } clear() { this.splice(0, this.length); } remove(index) { this.splice(index, 1); } } function getTypeMatcher(type, exact) { const [group, sub] = type.split('/'); const isGroup = !sub || sub === '*'; return (item)=>{ return exact ? item.type === (isGroup ? group : type) : isGroup ? item.type.startsWith(`${group}/`) : item.type === group; }; } function createDataTransferStub(window) { return new class DataTransferStub { getData(format) { var _this_items_find; const match = (_this_items_find = this.items.find(getTypeMatcher(format, true))) !== null && _this_items_find !== undefined ? _this_items_find : this.items.find(getTypeMatcher(format, false)); let text = ''; match === null || match === undefined ? undefined : match.getAsString((t)=>{ text = t; }); return text; } setData(format, data) { const matchIndex = this.items.findIndex(getTypeMatcher(format, true)); const item = new DataTransferItemStub(data, format); if (matchIndex >= 0) { this.items.splice(matchIndex, 1, item); } else { this.items.push(item); } } clearData(format) { if (format) { const matchIndex = this.items.findIndex(getTypeMatcher(format, true)); if (matchIndex >= 0) { this.items.remove(matchIndex); } } else { this.items.clear(); } } get types() { const t = []; if (this.files.length) { t.push('Files'); } this.items.forEach((i)=>t.push(i.type)); Object.freeze(t); return t; } /* istanbul ignore next */ setDragImage() {} constructor(){ _define_property$8(this, "dropEffect", 'none'); _define_property$8(this, "effectAllowed", 'uninitialized'); _define_property$8(this, "items", new DataTransferItemListStub()); _define_property$8(this, "files", createFileList(window, [])); } }(); } function createDataTransfer(window, files = []) { // Use real DataTransfer if available const dt = typeof window.DataTransfer === 'undefined' ? createDataTransferStub(window) : /* istanbul ignore next */ new window.DataTransfer(); Object.defineProperty(dt, 'files', { get: ()=>createFileList(window, files) }); return dt; } async function getBlobFromDataTransferItem(window, item) { if (item.kind === 'file') { return item.getAsFile(); } return new window.Blob([ await new Promise((r)=>item.getAsString(r)) ], { type: item.type }); } // Clipboard is not available in jsdom function _define_property$7(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } // MDN lists string|Blob|Promise<Blob|string> as possible types in ClipboardItemData // lib.dom.d.ts lists only Promise<Blob|string> // https://developer.mozilla.org/en-US/docs/Web/API/ClipboardItem/ClipboardItem#syntax function createClipboardItem(window, ...blobs) { const dataMap = Object.fromEntries(blobs.map((b)=>[ typeof b === 'string' ? 'text/plain' : b.type, Promise.resolve(b) ])); // use real ClipboardItem if available /* istanbul ignore if */ if (typeof window.ClipboardItem !== 'undefined') { return new window.ClipboardItem(dataMap); } return new class ClipboardItem { get types() { return Array.from(Object.keys(this.data)); } async getType(type) { const value = await this.data[type]; if (!value) { throw new Error(`${type} is not one of the available MIME types on this item.`); } return value instanceof window.Blob ? value : new window.Blob([ value ], { type }); } constructor(d){ _define_property$7(this, "data", undefined); this.data = d; } }(dataMap); } const ClipboardStubControl = Symbol('Manage ClipboardSub'); function createClipboardStub(window, control) { return Object.assign(new class Clipboard extends window.EventTarget { async read() { return Array.from(this.items); } async readText() { let text = ''; for (const item of this.items){ const type = item.types.includes('text/plain') ? 'text/plain' : item.types.find((t)=>t.startsWith('text/')); if (type) { text += await item.getType(type).then((b)=>readBlobText(b, window.FileReader)); } } return text; } async write(data) { this.items = data; } async writeText(text) { this.items = [ createClipboardItem(window, text) ]; } constructor(...args){ super(...args), _define_property$7(this, "items", []); } }(), { [ClipboardStubControl]: control }); } function isClipboardStub(clipboard) { return !!(clipboard === null || clipboard === undefined ? undefined : clipboard[ClipboardStubControl]); } function attachClipboardStubToView(window) { if (isClipboardStub(window.navigator.clipboard)) { return window.navigator.clipboard[ClipboardStubControl]; } const realClipboard = Object.getOwnPropertyDescriptor(window.navigator, 'clipboard'); let stub; const control = { resetClipboardStub: ()=>{ stub = createClipboardStub(window, control); }, detachClipboardStub: ()=>{ /* istanbul ignore if */ if (realClipboard) { Object.defineProperty(window.navigator, 'clipboard', realClipboard); } else { Object.defineProperty(window.navigator, 'clipboard', { value: undefined, configurable: true }); } } }; stub = createClipboardStub(window, control); Object.defineProperty(window.navigator, 'clipboard', { get: ()=>stub, configurable: true }); return stub[ClipboardStubControl]; } function resetClipboardStubOnView(window) { if (isClipboardStub(window.navigator.clipboard)) { window.navigator.clipboard[ClipboardStubControl].resetClipboardStub(); } } function detachClipboardStubFromView(window) { if (isClipboardStub(window.navigator.clipboard)) { window.navigator.clipboard[ClipboardStubControl].detachClipboardStub(); } } async function readDataTransferFromClipboard(document) { const window = document.defaultView; const clipboard = window === null || window === undefined ? undefined : window.navigator.clipboard; const items = clipboard && await clipboard.read(); if (!items) { throw new Error('The Clipboard API is unavailable.'); } const dt = createDataTransfer(window); for (const item of items){ for (const type of item.types){ dt.setData(type, await item.getType(type).then((b)=>readBlobText(b, window.FileReader))); } } return dt; } async function writeDataTransferToClipboard(document, clipboardData) { const window = getWindow(document); const clipboard = window.navigator.clipboard; const items = []; for(let i = 0; i < clipboardData.items.length; i++){ const dtItem = clipboardData.items[i]; const blob = await getBlobFromDataTransferItem(window, dtItem); items.push(createClipboardItem(window, blob)); } const written = clipboard && await clipboard.write(items).then(()=>true, // Can happen with other implementations that e.g. require permissions /* istanbul ignore next */ ()=>false); if (!written) { throw new Error('The Clipboard API is unavailable.'); } } const g$1 = globalThis; /* istanbul ignore else */ if (typeof g$1.afterEach === 'function') { g$1.afterEach(()=>resetClipboardStubOnView(globalThis.window)); } /* istanbul ignore else */ if (typeof g$1.afterAll === 'function') { g$1.afterAll(()=>detachClipboardStubFromView(globalThis.window)); } const FOCUSABLE_SELECTOR = [ 'input:not([type=hidden]):not([disabled])', 'button:not([disabled])', 'select:not([disabled])', 'textarea:not([disabled])', '[contenteditable=""]', '[contenteditable="true"]', 'a[href]', '[tabindex]:not([disabled])' ].join(', '); function isFocusable(element) { return element.matches(FOCUSABLE_SELECTOR); } function cloneEvent(event) { return new event.constructor(event.type, event); } // This should probably just rely on the :disabled pseudo-class, but JSDOM doesn't implement it properly. function isDisabled(element) { for(let el = element; el; el = el.parentElement){ if (isElementType(el, [ 'button', 'input', 'select', 'textarea', 'optgroup', 'option' ])) { if (el.hasAttribute('disabled')) { return true; } } else if (isElementType(el, 'fieldset')) { var _el_querySelector; if (el.hasAttribute('disabled') && !((_el_querySelector = el.querySelector(':scope > legend')) === null || _el_querySelector === undefined ? undefined : _el_querySelector.contains(element))) { return true; } } else if (el.tagName.includes('-')) { if (el.constructor.formAssociated && el.hasAttribute('disabled')) { return true; } } } return false; } function getActiveElement(document) { const activeElement = document.activeElement; if (activeElement === null || activeElement === undefined ? undefined : activeElement.shadowRoot) { return getActiveElement(activeElement.shadowRoot); } else { // Browser does not yield disabled elements as document.activeElement - jsdom does if (isDisabled(activeElement)) { return document.ownerDocument ? /* istanbul ignore next */ document.ownerDocument.body : document.body; } return activeElement; } } function getActiveElementOrBody(document) { var _getActiveElement; return (_getActiveElement = getActiveElement(document)) !== null && _getActiveElement !== undefined ? _getActiveElement : /* istanbul ignore next */ document.body; } function findClosest(element, callback) { let el = element; do { if (callback(el)) { return el; } el = el.parentElement; }while (el && el !== element.ownerDocument.body) return undefined; } //jsdom is not supporting isContentEditable function isContentEditable(element) { return element.hasAttribute('contenteditable') && (element.getAttribute('contenteditable') == 'true' || element.getAttribute('contenteditable') == ''); } /** * If a node is a contenteditable or inside one, return that element. */ function getContentEditable(node) { const element = getElement$1(node); return element && (element.closest('[contenteditable=""]') || element.closest('[contenteditable="true"]')); } function getElement$1(node) { return node.nodeType === 1 ? node : node.parentElement; } var clickableInputTypes = /*#__PURE__*/ function(clickableInputTypes) { clickableInputTypes["button"] = "button"; clickableInputTypes["color"] = "color"; clickableInputTypes["file"] = "file"; clickableInputTypes["image"] = "image"; clickableInputTypes["reset"] = "reset"; clickableInputTypes["submit"] = "submit"; clickableInputTypes["checkbox"] = "checkbox"; clickableInputTypes["radio"] = "radio"; return clickableInputTypes; }(clickableInputTypes || {}); function isClickableInput(element) { return isElementType(element, 'button') || isElementType(element, 'input') && element.type in clickableInputTypes; } function isEditable(element) { return isEditableInputOrTextArea(element) && !element.readOnly || isContentEditable(element); } var editableInputTypes = /*#__PURE__*/ function(editableInputTypes) { editableInputTypes["text"] = "text"; editableInputTypes["date"] = "date"; editableInputTypes["datetime-local"] = "datetime-local"; editableInputTypes["email"] = "email"; editableInputTypes["month"] = "month"; editableInputTypes["number"] = "number"; editableInputTypes["password"] = "password"; editableInputTypes["search"] = "search"; editableInputTypes["tel"] = "tel"; editableInputTypes["time"] = "time"; editableInputTypes["url"] = "url"; editableInputTypes["week"] = "week"; return editableInputTypes; }(editableInputTypes || {}); function isEditableInputOrTextArea(element) { return isElementType(element, 'textarea') || isElementType(element, 'input') && element.type in editableInputTypes; } /** * Determine if the element has its own selection implementation * and does not interact with the Document Selection API. */ function hasOwnSelection(node) { return isElement$2(node) && isEditableInputOrTextArea(node); } function hasNoSelection(node) { return isElement$2(node) && isClickableInput(node); } function isElement$2(node) { return node.nodeType === 1; } // The browser implementation seems to have changed. // When focus is inside <input type="text"/>, // Chrome updates Selection to be collapsed at the position of the input element. // TODO: update implementation to match that of current browsers /** * Reset the Document Selection when moving focus into an element * with own selection implementation. */ function updateSelectionOnFocus(element) { const selection = element.ownerDocument.getSelection(); /* istanbul ignore if */ if (!(selection === null || selection === undefined ? undefined : selection.focusNode)) { return; } // If the focus moves inside an element with own selection implementation, // the document selection will be this element. // But if the focused element is inside a contenteditable, // 1) a collapsed selection will be retained. // 2) other selections will be replaced by a cursor // 2.a) at the start of the first child if it is a text node // 2.b) at the start of the contenteditable. if (hasOwnSelection(element)) { const contenteditable = getContentEditable(selection.focusNode); if (contenteditable) { if (!selection.isCollapsed) { var _contenteditable_firstChild; const focusNode = ((_contenteditable_firstChild = contenteditable.firstChild) === null || _contenteditable_firstChild === undefined ? undefined : _contenteditable_firstChild.nodeType) === 3 ? contenteditable.firstChild : contenteditable; selection.setBaseAndExtent(focusNode, 0, focusNode, 0); } } else { selection.setBaseAndExtent(element, 0, element, 0); } } } function getDefaultExportFromCjs (x) { return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x; } var build$1 = {}; var ansiStyles = {exports: {}}; ansiStyles.exports; (function (module) { const ANSI_BACKGROUND_OFFSET = 10; const wrapAnsi256 = (offset = 0) => code => `\u001B[${38 + offset};5;${code}m`; const wrapAnsi16m = (offset = 0) => (red, green, blue) => `\u001B[${38 + offset};2;${red};${green};${blue}m`; function assembleStyles() { const codes = new Map(); const styles = { modifier: { reset: [0, 0], // 21 isn't widely supported and 22 does the same thing bold: [1, 22], dim: [2, 22], italic: [3, 23], underline: [4, 24], overline: [53, 55], inverse: [7, 27], hidden: [8, 28], strikethrough: [9, 29] }, color: { black: [30, 39], red: [31, 39], green: [32, 39], yellow: [33, 39], blue: [34, 39], magenta: [35, 39], cyan: [36, 39], white: [37, 39], // Bright color blackBright: [90, 39], redBright: [91, 39], greenBright: [92, 39], yellowBright: [93, 39], blueBright: [94, 39], magentaBright: [95, 39], cyanBright: [96, 39], whiteBright: [97, 39] }, bgColor: { bgBlack: [40, 49], bgRed: [41, 49], bgGreen: [42, 49], bgYellow: [43, 49], bgBlue: [44, 49], bgMagenta: [45, 49], bgCyan: [46, 49], bgWhite: [47, 49], // Bright color bgBlackBright: [100, 49], bgRedBright: [101, 49], bgGreenBright: [102, 49], bgYellowBright: [103, 49], bgBlueBright: [104, 49], bgMagentaBright: [105, 49], bgCyanBright: [106, 49], bgWhiteBright: [107, 49] } }; // Alias bright black as gray (and grey) styles.color.gray = styles.color.blackBright; styles.bgColor.bgGray = styles.bgColor.bgBlackBright; styles.color.grey = styles.color.blackBright; styles.bgColor.bgGrey = styles.bgColor.bgBlackBright; for (const [groupName, group] of Object.entries(styles)) { for (const [styleName, style] of Object.entries(group)) { styles[styleName] = { open: `\u001B[${style[0]}m`, close: `\u001B[${style[1]}m` }; group[styleName] = styles[styleName]; codes.set(style[0], style[1]); } Object.defineProperty(styles, groupName, { value: group, enumerable: false }); } Object.defineProperty(styles, 'codes', { value: codes, enumerable: false }); styles.color.close = '\u001B[39m'; styles.bgColor.close = '\u001B[49m'; styles.color.ansi256 = wrapAnsi256(); styles.color.ansi16m = wrapAnsi16m(); styles.bgColor.ansi256 = wrapAnsi256(ANSI_BACKGROUND_OFFSET); styles.bgColor.ansi16m = wrapAnsi16m(ANSI_BACKGROUND_OFFSET); // From https://github.com/Qix-/color-convert/blob/3f0e0d4e92e235796ccb17f6e85c72094a651f49/conversions.js Object.defineProperties(styles, { rgbToAnsi256: { value: (red, green, blue) => { // We use the extended greyscale palette here, with the exception of // black and white. normal palette only has 4 greyscale shades. if (red === green && green === blue) { if (red < 8) { return 16; } if (red > 248) { return 231; } return Math.round(((red - 8) / 247) * 24) + 232; } return 16 + (36 * Math.round(red / 255 * 5)) + (6 * Math.round(green / 255 * 5)) + Math.round(blue / 255 * 5); }, enumerable: false }, hexToRgb: { value: hex => { const matches = /(?<colorString>[a-f\d]{6}|[a-f\d]{3})/i.exec(hex.toString(16)); if (!matches) { return [0, 0, 0]; } let {colorString} = matches.groups; if (colorString.length === 3) { colorString = colorString.split('').map(character => character + character).join(''); } const integer = Number.parseInt(colorString, 16); return [ (integer >> 16) & 0xFF, (integer >> 8) & 0xFF, integer & 0xFF ]; }, enumerable: false }, hexToAnsi256: { value: hex => styles.rgbToAnsi256(...styles.hexToRgb(hex)), enumerable: false } }); return styles; } // Make the export immutable Object.defineProperty(module, 'exports', { enumerable: true, get: assembleStyles }); } (ansiStyles)); var ansiStylesExports = ansiStyles.exports; var collections = {}; Object.defineProperty(collections, '__esModule', { value: true }); collections.printIteratorEntries = printIteratorEntries; collections.printIteratorValues = printIteratorValues; collections.printListItems = printListItems; collections.printObjectProperties = printObjectProperties; /** * Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * */ const getKeysOfEnumerableProperties = (object, compareKeys) => { const keys = Object.keys(object).sort(compareKeys); if (Object.getOwnPropertySymbols) { Object.getOwnPropertySymbols(object).forEach(symbol => { if (Object.getOwnPropertyDescriptor(object, symbol).enumerable) { keys.push(symbol); } }); } return keys; }; /** * Return entries (for example, of a map) * with spacing, indentation, and comma * without surrounding punctuation (for example, braces) */ function printIteratorEntries( iterator, config, indentation, depth, refs, printer, // Too bad, so sad that separator for ECMAScript Map has been ' => ' // What a distracting diff if you change a data structure to/from // ECMAScript Object or Immutable.Map/OrderedMap which use the default. separator = ': ' ) { let result = ''; let current = iterator.next(); if (!current.done) { result += config.spacingOuter; const indentationNext = indentation + config.indent; while (!current.done) { const name = printer( current.value[0], config, indentationNext, depth, refs ); const value = printer( current.value[1], config, indentationNext, depth, refs ); result += indentationNext + name + separator + value; current = iterator.next(); if (!current.done) { result += ',' + config.spacingInner; } else if (!config.min) { result += ','; } } result += config.spacingOuter + indentation; } return result; } /** * Return values (for example, of a set) * with spacing, indentation, and comma * without surrounding punctuation (braces or brackets) */ function printIteratorValues( iterator, config, indentation, depth, refs, printer ) { let result = ''; let current = iterator.next(); if (!current.done) { result += config.spacingOuter; const indentationNext = indentation + config.indent; while (!current.done) { result += indentationNext + printer(current.value, config, indentationNext, depth, refs); current = iterator.next(); if (!current.done) { result += ',' + config.spacingInner; } else if (!config.min) { result += ','; } } result += config.spacingOuter + indentation; } return result; } /** * Return items (for example, of an array) * with spacing, indentation, and comma * without surrounding punctuation (for example, brackets) **/ function printListItems(list, config, indentation, depth, refs, printer) { let result = ''; if (list.length) { result += config.spacingOuter; const indentationNext = indentation + config.indent; for (let i = 0; i < list.length; i++) { result += indentationNext; if (i in list) { result += printer(list[i], config, indentationNext, depth, refs); } if (i < list.length - 1) { result += ',' + config.spacingInner; } else if (!config.min) { result += ','; } } result += config.spacingOuter + indentation; } return result; } /** * Return properties of an object * with spacing, indentation, and comma * without surrounding punctuation (for example, braces) */ function printObjectProperties(val, config, indentation, depth, refs, printer) { let result = ''; const keys = getKeysOfEnumerableProperties(val, config.compareKeys); if (keys.length) { result += config.spacingOuter; const indentationNext = indentation + config.indent; for (let i = 0; i < keys.length; i++) { const key = keys[i]; const name = printer(key, config, indentationNext, depth, refs); const value = printer(val[key], config, indentationNext, depth, refs); result += indentationNext + name + ': ' + value; if (i < keys.length - 1) { result += ',' + config.spacingInner; } else if (!config.min) { result += ','; } } result += config.spacingOuter + indentation; } return result; } var AsymmetricMatcher = {}; Object.defineProperty(AsymmetricMatcher, '__esModule', { value: true }); AsymmetricMatcher.test = AsymmetricMatcher.serialize = AsymmetricMatcher.default = void 0; var _collections$3 = collections; var global$2 = (function () { if (typeof globalThis !== 'undefined') { return globalThis; } else if (typeof global$2 !== 'undefined') { return global$2; } else if (typeof self !== 'undefined') { return self; } else if (typeof window !== 'undefined') { return window; } else { return Function('return this')(); } })(); var Symbol$2 = global$2['jest-symbol-do-not-touch'] || global$2.Symbol; const asymmetricMatcher = typeof Symbol$2 === 'function' && Symbol$2.for ? Symbol$2.for('jest.asymmetricMatcher') : 0x1357a5; const SPACE$2 = ' '; const serialize$6 = (val, config, indentation, depth, refs, printer) => { const stringedValue = val.toString(); if ( stringedValue === 'ArrayContaining' || stringedValue === 'ArrayNotContaining' ) { if (++depth > config.maxDepth) { return '[' + stringedValue + ']'; } return ( stringedValue + SPACE$2 + '[' + (0, _collections$3.printListItems)( val.sample, config, indentation, depth, refs, printer ) + ']' ); } if ( stringedValue === 'ObjectContaining' || stringedValue === 'ObjectNotContaining' ) { if (++depth > config.maxDepth) { return '[' + stringedValue + ']'; } return ( stringedValue + SPACE$2 + '{' + (0, _collections$3.printObjectProperties)( val.sample, config, indentation, depth, refs, printer ) + '}' ); } if ( stringedValue === 'StringMatching' || stringedValue === 'StringNotMatching' ) { return ( stringedValue + SPACE$2 + printer(val.sample, config, indentation, depth, refs) ); } if ( stringedValue === 'StringContaining' || stringedValue === 'StringNotContaining' ) { return ( stringedValue + SPACE$2 + printer(val.sample, config, indentation, depth, refs) ); } return val.toAsymmetricMatcher(); }; AsymmetricMatcher.serialize = serialize$6; const test$6 = val => val && val.$$typeof === asymmetricMatcher; AsymmetricMatcher.test = test$6; const plugin$6 = { serialize: serialize$6, test: test$6 }; var _default$2q = plugin$6; AsymmetricMatcher.default = _default$2q; var ConvertAnsi = {}; var ansiRegex = ({onlyFirst = false} = {}) => { const pattern = [ '[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)', '(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))' ].join('|'); return new RegExp(pattern, onlyFirst ? undefined : 'g'); }; Object.defineProperty(ConvertAnsi, '__esModule', { value: true }); ConvertAnsi.test = ConvertAnsi.serialize = ConvertAnsi.default = void 0; var _ansiRegex = _interopRequireDefault$d(ansiRegex); var _ansiStyles$1 = _interopRequireDefault$d(ansiStylesExports); function _interopRequireDefault$d(obj) { return obj && obj.__esModule ? obj : {default: obj}; } /** * Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ const toHumanReadableAnsi = text => text.replace((0, _ansiRegex.default)(), match => { switch (match) { case _ansiStyles$1.default.red.close: case _ansiStyles$1.default.green.close: case _ansiStyles$1.default.cyan.close: case _ansiStyles$1.default.gray.close: case _ansiStyles$1.default.white.close: case _ansiStyles$1.default.yellow.close: case _ansiStyles$1.default.bgRed.close: case _ansiStyles$1.default.bgGreen.close: case _ansiStyles$1.default.bgYellow.close: case _ansiStyles$1.default.inverse.close: case _ansiStyles$1.default.dim.close: case _ansiStyles$1.default.bold.close: case _ansiStyles$1.default.reset.open: case _ansiStyles$1.default.reset.close: return '</>'; case _ansiStyles$1.default.red.open: return '<red>'; case _ansiStyles$1.default.green.open: return '<green>'; case _ansiStyles$1.default.cyan.open: return '<cyan>'; case _ansiStyles$1.default.gray.open: return '<gray>'; case _ansiStyles$1.default.white.open: return '<white>'; case _ansiStyles$1.default.yellow.open: return '<yellow>'; case _ansiStyles$1.default.bgRed.open: return '<bgRed>'; case _ansiStyles$1.default.bgGreen.open: return '<bgGreen>'; case _ansiStyles$1.default.bgYellow.open: return '<bgYellow>'; case _ansiStyles$1.default.inverse.open: return '<inverse>'; case _ansiStyles$1.default.dim.open: return '<dim>'; case _ansiStyles$1.default.bold.open: return '<bold>'; default: return ''; } }); const test$5 = val => typeof val === 'string' && !!val.match((0, _ansiRegex.default)()); ConvertAnsi.test = test$5; const serialize$5 = (val, config, indentation, depth, refs, printer) => printer(toHumanReadableAnsi(val), config, indentation, depth, refs); ConvertAnsi.serialize = serialize$5; const plugin$5 = { serialize: serialize$5, test: test$5 }; var _default$2p = plugin$5; ConvertAnsi.default = _default$2p; var DOMCollection$1 = {}; Object.defineProperty(DOMCollection$1, '__esModule', { value: true }); DOMCollection$1.test = DOMCollection$1.serialize = DOMCollection$1.default = void 0; var _collections$2 = collections; /** * Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ /* eslint-disable local/ban-types-eventually */ const SPACE$1 = ' '; const OBJECT_NAMES = ['DOMStringMap', 'NamedNodeMap']; const ARRAY_REGEXP = /^(HTML\w*Collection|NodeList)$/; const testName = name => OBJECT_NAMES.indexOf(name) !== -1 || ARRAY_REGEXP.test(name); const test$4 = val => val && val.constructor && !!val.constructor.name && testName(val.constructor.name); DOMCollection$1.test = test$4; const isNamedNodeMap = collection => collection.constructor.name === 'NamedNodeMap'; const serialize$4 = (collection, config, indentation, depth, refs, printer) => { const name = collection.constructor.name; if (++depth > config.maxDepth) { return '[' + name + ']'; } return ( (config.min ? '' : name + SPACE$1) + (OBJECT_NAMES.indexOf(name) !== -1 ? '{' + (0, _collections$2.printObjectProperties)( isNamedNodeMap(collection) ? Array.from(collection).reduce((props, attribute) => { props[attribute.name] = attribute.value; return props; }, {}) : {...collection}, config, indentation, depth, refs, printer ) + '}' : '[' + (0, _collections$2.printListItems)( Array.from(collection), config, indentation, depth, refs, printer ) + ']') ); }; DOMCollection$1.serialize = serialize$4; const plugin$4 = { serialize: serialize$4, test: test$4 }; var _default$2o = plugin$4; DOMCollection$1.default = _default$2o; var DOMElement = {}; var markup = {}; var escapeHTML$2 = {}; Object.defineProperty(escapeHTML$2, '__esModule', { value: true }); escapeHTML$2.default = escapeHTML$1; /** * Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ function escapeHTML$1(str) { return str.replace(/</g, '<').replace(/>/g, '>'); } Object.defineProperty(markup, '__esModule', { value: true }); markup.printText = markup.printProps = markup.printElementAsLeaf = markup.printElement = markup.printComment = markup.printChildren = void 0; var _escapeHTML = _interopRequireDefault$c(escapeHTML$2); function _interopRequireDefault$c(obj) { return obj && obj.__esModule ? obj : {default: obj}; } /** * Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // Return empty string if keys is empty. const printProps$1 = (keys, props, config, indentation, depth, refs, printer) => { const indentationNext = indentation + config.indent; const colors = config.colors; return keys .map(key => { const value = props[key]; let printed = printer(value, config, indentationNext, depth, refs); if (typeof value !== 'string') { if (printed.indexOf('\n') !== -1) { printed = config.spacingOuter + indentationNext + printed + config.spacingOuter + indentation; } printed = '{' + printed + '}'; } return ( config.spacingInner + indentation + colors.prop.open + key + colors.prop.close + '=' + colors.value.open + printed + colors.value.close ); }) .join(''); }; // Return empty string if children is empty. markup.printProps = printProps$1; const printChildren$1 = (children, config, indentation, depth, refs, printer) => children .map( child => config.spacingOuter + indentation + (typeof child === 'string' ? printText$1(child, config) : printer(child, config, indentation, depth, refs)) ) .join(''); markup.printChildren = printChildren$1; const printText$1 = (text, config) => { const contentColor = config.colors.content; return ( contentColor.open + (0, _escapeHTML.default)(text) + contentColor.close ); }; markup.printText = printText$1; const printComment$1 = (comment, config) => { const commentColor = config.colors.comment; return ( commentColor.open + '<!--' + (0, _escapeHTML.default)(comment) + '-->' + commentColor.close ); }; // Separate the functions to format props, children, and element, // so a plugin could override a particular function, if needed. // Too bad, so sad: the traditional (but unnecessary) space // in a self-closing tagColor requires a second test of printedProps. markup.printComment = printComment$1; const printElement$1 = ( type, printedProps, printedChildren, config, indentation ) => { const tagColor = config.colors.tag; return ( tagColor.open + '<' + type + (printedProps && tagColor.close + printedProps + config.spacingOuter + indentation + tagColor.open) + (printedChildren ? '>' + tagColor.close + printedChildren + config.spacingOuter + indentation + tagColor.open + '</' + type : (printedProps && !config.min ? '' : ' ') + '/') + '>' + tagColor.close ); }; markup.printElement = printElement$1; const printElementAsLeaf$1 = (type, config) => { const tagColor = config.colors.tag; return ( tagColor.open + '<' + type + tagColor.close + ' …' + tagColor.open + ' />' + tagColor.close ); }; markup.printElementAsLeaf = printElementAsLeaf$1; Object.defineProperty(DOMElement, '__esModule', { value: true }); DOMElement.test = DOMElement.serialize = DOMElement.default = void 0; var _markup$2 = markup; /** * Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ const ELEMENT_NODE$2 = 1; const TEXT_NODE$2 = 3; const COMMENT_NODE$2 = 8; const FRAGMENT_NODE$1 = 11; const ELEMENT_REGEXP$1 = /^((HTML|SVG)\w*)?Element$/; const testHasAttribute = val => { try { return typeof val.hasAttribute === 'function' && val.hasAttribute('is'); } catch { return false; } }; const testNode$1 = val => { const constructorName = val.constructor.name; const {nodeType, tagName} = val; const isCustomElement = (typeof tagName === 'string' && tagName.includes('-')) || testHasAttribute(val); return ( (nodeType === ELEMENT_NODE$2 && (ELEMENT_REGEXP$1.test(constructorName) || isCustomElement)) || (nodeType === TEXT_NODE$2 && constructorName === 'Text') || (nodeType === COMMENT_NODE$2 && constructorName === 'Comment') || (nodeType === FRAGMENT_NODE$1 && constructorName === 'DocumentFragment') ); }; const test$3 = val => { var _val$constructor; return ( (val === null || val === void 0 ? void 0 : (_val$constructor = val.constructor) === null || _val$constructor === void 0 ? void 0 : _val$constructor.name) && testNode$1(val) ); }; DOMElement.test = test$3; function nodeIsText$1(node) { return node.nodeType === TEXT_NODE$2; } function nodeIsComment$1(node) { return node.nodeType === COMMENT_NODE$2; } function nodeIsFragment$1(node) { return node.nodeType === FRAGMENT_NODE$1; } const serialize$3 = (node, config, indentation, depth, refs, printer) => { if (nodeIsText$1(node)) { return (0, _markup$2.printText)(node.data, config); } if (nodeIsComment$1(node)) { return (0, _markup$2.printComment)(node.data, config); } const type = nodeIsFragment$1(node) ? 'DocumentFragment' : node.tagName.toLowerCase(); if (++depth > config.maxDepth) { return (0, _markup$2.printElementAsLeaf)(type, config); } return (0, _markup$2.printElement)( type, (0, _markup$2.printProps)( nodeIsFragment$1(node) ? [] : Array.from(node.attributes) .map(attr => attr.name) .sort(), nodeIsFragment$1(node) ? {} : Array.from(node.attributes).reduce((props, attribute) => { props[attribute.name] = attribute.value; return props; }, {}), config, indentation + config.indent, depth, refs, printer ), (0, _markup$2.printChildren)( Array.prototype.slice.call(node.childNodes || node.children), config, indentation + config.indent, depth, refs, printer ), config, indentation ); }; DOMElement.serialize = serialize$3; const plugin$3 = { serialize: serialize$3, test: test$3 }; var _default$2n = plugin$3; DOMElement.default = _default$2n; var Immutable = {}; Object.defineProperty(Immutable, '__esModule', { value: true }); Immutable.test = Immutable.serialize = Immutable.default = void 0; var _collections$1 = collections; /** * Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // SENTINEL constants are from https://github.com/facebook/immutable-js const IS_ITERABLE_SENTINEL = '@@__IMMUTABLE_ITERABLE__@@'; const IS_LIST_SENTINEL = '@@__IMMUTABLE_LIST__@@'; const IS_KEYED_SENTINEL = '@@__IMMUTABLE_KEYED__@@'; const IS_MAP_SENTINEL = '@@__IMMUTABLE_MAP__@@'; const IS_ORDERED_SENTINEL = '@@__IMMUTABLE_ORDERED__@@'; const IS_RECORD_SENTINEL = '@@__IMMUTABLE_RECORD__@@'; // immutable v4 const IS_SEQ_SENTINEL = '@@__IMMUTABLE_SEQ__@@'; const IS_SET_SENTINEL = '@@__IMMUTABLE_SET__@@'; const IS_STACK_SENTINEL = '@@__IMMUTABLE_STACK__@@'; const getImmutableName = name => 'Immutable.' + name; const printAsLeaf = name => '[' + name + ']'; const SPACE = ' '; const LAZY = '…'; // Seq is lazy if it calls a method like filter const printImmutableEntries = ( val, config, indentation, depth, refs, printer, type ) => ++depth > config.maxDepth ? printAsLeaf(getImmutableName(type)) : getImmutableName(type) + SPACE + '{' + (0, _collections$1.printIteratorEntries)( val.entries(), config, indentation, depth, refs, printer ) + '}'; // Record has an entries method because it is a collection in immutable v3. // Return an iterator for Immutable Record from version v3 or v4. function getRecordEntries(val) { let i = 0; return { next() { if (i < val._keys.length) { const key = val._keys[i++]; return { done: false, value: [key, val.get(key)] }; } return { done: true, value: undefined }; } }; } const printImmutableRecord = ( val, config, indentation, depth, refs, printer ) => { // _name property is defined only for an Immutable Record instance // which was constructed with a second optional descriptive name arg const name = getImmutableName(val._name || 'Record'); return ++depth > config.maxDepth ? printAsLeaf(name) : name + SPACE + '{' + (0, _collections$1.printIteratorEntries)( getRecordEntries(val), config, indentation, depth, refs, printer ) + '}'; }; const printImmutableSeq = (val, config, indentation, depth, refs, printer) => { const name = getImmutableName('Seq'); if (++depth > config.maxDepth) { return printAsLeaf(name); } if (val[IS_KEYED_SENTINEL]) { return ( name + SPACE + '{' + // from Immutable collection of entries or from ECMAScript object (val._iter || val._object ? (0, _collections$1.printIteratorEntries)( val.entries(), config, indentation, depth, refs, printer ) : LAZY) + '}' ); } return ( name + SPACE + '[' + (val._iter || // from Immutable collection of values val._array || // from ECMAScript array val._collection || // from ECMAScript collection in immutable v4 val._iterable // from ECMAScript collection in immutable v3 ? (0, _collections$1.printIteratorValues)( val.values(), config, indentation, depth, refs, printer ) : LAZY) + ']' ); }; const printImmutableValues = ( val, config, indentation, depth, refs, printer, type ) => ++depth > config.maxDepth ? printAsLeaf(getImmutableName(type)) : getImmutableName(type) + SPACE + '[' + (0, _collections$1.printIteratorValues)( val.values(), config, indentation, depth, refs, printer ) + ']'; const serialize$2 = (val, config, indentation, depth, refs, printer) => { if (val[IS_MAP_SENTINEL]) { return printImmutableEntries( val, config, indentation, depth, refs, printer, val[IS_ORDERED_SENTINEL] ? 'OrderedMap' : 'Map' ); } if (val[IS_LIST_SENTINEL]) { return printImmutableValues( val, config, indentation, depth, refs, printer, 'List' ); } if (val[IS_SET_SENTINEL]) { return printImmutableValues( val, config, indentation, depth, refs, printer, val[IS_ORDERED_SENTINEL] ? 'OrderedSet' : 'Set' ); } if (val[IS_STACK_SENTINEL]) { return printImmutableValues( val, config, indentation, depth, refs, printer, 'Stack' ); } if (val[IS_SEQ_SENTINEL]) { return printImmutableSeq(val, config, indentation, depth, refs, printer); } // For compatibility with immutable v3 and v4, let record be the default. return printImmutableRecord(val, config, indentation, depth, refs, printer); }; // Explicitly comparing sentinel properties to true avoids false positive // when mock identity-obj-proxy returns the key as the value for any key. Immutable.serialize = serialize$2; const test$2 = val => val && (val[IS_ITERABLE_SENTINEL] === true || val[IS_RECORD_SENTINEL] === true); Immutable.test = test$2; const plugin$2 = { serialize: serialize$2, test: test$2 }; var _default$2m = plugin$2; Immutable.default = _default$2m; var ReactElement = {}; var reactIs = {exports: {}}; var reactIs_production_min = {}; /** @license React v17.0.2 * react-is.production.min.js * * Copyright (c) Facebook, Inc. and its affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ var b=60103,c=60106,d=60107,e=60108,f=60114,g=60109,h=60110,k$2=60112,l=60113,m=60120,n=60115,p=60116,q=60121,r=60122,u=60117,v=60129,w=60131; if("function"===typeof Symbol&&Symbol.for){var x=Symbol.for;b=x("react.element");c=x("react.portal");d=x("react.fragment");e=x("react.strict_mode");f=x("react.profiler");g=x("react.provider");h=x("react.context");k$2=x("react.forward_ref");l=x("react.suspense");m=x("react.suspense_list");n=x("react.memo");p=x("react.lazy");q=x("react.block");r=x("react.server.block");u=x("react.fundamental");v=x("react.debug_trace_mode");w=x("react.legacy_hidden");} function y(a){if("object"===typeof a&&null!==a){var t=a.$$typeof;switch(t){case b:switch(a=a.type,a){case d:case f:case e:case l:case m:return a;default:switch(a=a&&a.$$typeof,a){case h:case k$2:case p:case n:case g:return a;default:return t}}case c:return t}}}var z=g,A=b,B=k$2,C=d,D=p,E=n,F=c,G=f,H=e,I=l;reactIs_production_min.ContextConsumer=h;reactIs_production_min.ContextProvider=z;reactIs_production_min.Element=A;reactIs_production_min.ForwardRef=B;reactIs_production_min.Fragment=C;reactIs_production_min.Lazy=D;reactIs_production_min.Memo=E;reactIs_production_min.Portal=F;reactIs_production_min.Profiler=G;reactIs_production_min.StrictMode=H; reactIs_production_min.Suspense=I;reactIs_production_min.isAsyncMode=function(){return false};reactIs_production_min.isConcurrentMode=function(){return false};reactIs_production_min.isContextConsumer=function(a){return y(a)===h};reactIs_production_min.isContextProvider=function(a){return y(a)===g};reactIs_production_min.isElement=function(a){return "object"===typeof a&&null!==a&&a.$$typeof===b};reactIs_production_min.isForwardRef=function(a){return y(a)===k$2};reactIs_production_min.isFragment=function(a){return y(a)===d};reactIs_production_min.isLazy=function(a){return y(a)===p};reactIs_production_min.isMemo=function(a){return y(a)===n}; reactIs_production_min.isPortal=function(a){return y(a)===c};reactIs_production_min.isProfiler=function(a){return y(a)===f};reactIs_production_min.isStrictMode=function(a){return y(a)===e};reactIs_production_min.isSuspense=function(a){return y(a)===l};reactIs_production_min.isValidElementType=function(a){return "string"===typeof a||"function"===typeof a||a===d||a===f||a===v||a===e||a===l||a===m||a===w||"object"===typeof a&&null!==a&&(a.$$typeof===p||a.$$typeof===n||a.$$typeof===g||a.$$typeof===h||a.$$typeof===k$2||a.$$typeof===u||a.$$typeof===q||a[0]===r)?true:false}; reactIs_production_min.typeOf=y; { reactIs.exports = reactIs_production_min; } var reactIsExports = reactIs.exports; Object.defineProperty(ReactElement, '__esModule', { value: true }); ReactElement.test = ReactElement.serialize = ReactElement.default = void 0; var ReactIs = _interopRequireWildcard(reactIsExports); var _markup$1 = markup; function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== 'function') return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (obj && obj.__esModule) { return obj; } if (obj === null || (typeof obj !== 'object' && typeof obj !== 'function')) { return {default: obj}; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== 'default' && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } /** * Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // Given element.props.children, or subtree during recursive traversal, // return flattened array of children. const getChildren = (arg, children = []) => { if (Array.isArray(arg)) { arg.forEach(item => { getChildren(item, children); }); } else if (arg != null && arg !== false) { children.push(arg); } return children; }; const getType = element => { const type = element.type; if (typeof type === 'string') { return type; } if (typeof type === 'function') { return type.displayName || type.name || 'Unknown'; } if (ReactIs.isFragment(element)) { return 'React.Fragment'; } if (ReactIs.isSuspense(element)) { return 'React.Suspense'; } if (typeof type === 'object' && type !== null) { if (ReactIs.isContextProvider(element)) { return 'Context.Provider'; } if (ReactIs.isContextConsumer(element)) { return 'Context.Consumer'; } if (ReactIs.isForwardRef(element)) { if (type.displayName) { return type.displayName; } const functionName = type.render.displayName || type.render.name || ''; return functionName !== '' ? 'ForwardRef(' + functionName + ')' : 'ForwardRef'; } if (ReactIs.isMemo(element)) { const functionName = type.displayName || type.type.displayName || type.type.name || ''; return functionName !== '' ? 'Memo(' + functionName + ')' : 'Memo'; } } return 'UNDEFINED'; }; const getPropKeys$1 = element => { const {props} = element; return Object.keys(props) .filter(key => key !== 'children' && props[key] !== undefined) .sort(); }; const serialize$1 = (element, config, indentation, depth, refs, printer) => ++depth > config.maxDepth ? (0, _markup$1.printElementAsLeaf)(getType(element), config) : (0, _markup$1.printElement)( getType(element), (0, _markup$1.printProps)( getPropKeys$1(element), element.props, config, indentation + config.indent, depth, refs, printer ), (0, _markup$1.printChildren)( getChildren(element.props.children), config, indentation + config.indent, depth, refs, printer ), config, indentation ); ReactElement.serialize = serialize$1; const test$1 = val => val != null && ReactIs.isElement(val); ReactElement.test = test$1; const plugin$1 = { serialize: serialize$1, test: test$1 }; var _default$2l = plugin$1; ReactElement.default = _default$2l; var ReactTestComponent = {}; Object.defineProperty(ReactTestComponent, '__esModule', { value: true }); ReactTestComponent.test = ReactTestComponent.serialize = ReactTestComponent.default = void 0; var _markup = markup; var global$1 = (function () { if (typeof globalThis !== 'undefined') { return globalThis; } else if (typeof global$1 !== 'undefined') { return global$1; } else if (typeof self !== 'undefined') { return self; } else if (typeof window !== 'undefined') { return window; } else { return Function('return this')(); } })(); var Symbol$1 = global$1['jest-symbol-do-not-touch'] || global$1.Symbol; const testSymbol = typeof Symbol$1 === 'function' && Symbol$1.for ? Symbol$1.for('react.test.json') : 0xea71357; const getPropKeys = object => { const {props} = object; return props ? Object.keys(props) .filter(key => props[key] !== undefined) .sort() : []; }; const serialize = (object, config, indentation, depth, refs, printer) => ++depth > config.maxDepth ? (0, _markup.printElementAsLeaf)(object.type, config) : (0, _markup.printElement)( object.type, object.props ? (0, _markup.printProps)( getPropKeys(object), object.props, config, indentation + config.indent, depth, refs, printer ) : '', object.children ? (0, _markup.printChildren)( object.children, config, indentation + config.indent, depth, refs, printer ) : '', config, indentation ); ReactTestComponent.serialize = serialize; const test = val => val && val.$$typeof === testSymbol; ReactTestComponent.test = test; const plugin = { serialize, test }; var _default$2k = plugin; ReactTestComponent.default = _default$2k; Object.defineProperty(build$1, '__esModule', { value: true }); build$1.default = build$1.DEFAULT_OPTIONS = void 0; var format_1 = build$1.format = format; var plugins_1 = build$1.plugins = void 0; var _ansiStyles = _interopRequireDefault$b(ansiStylesExports); var _collections = collections; var _AsymmetricMatcher = _interopRequireDefault$b( AsymmetricMatcher ); var _ConvertAnsi = _interopRequireDefault$b(ConvertAnsi); var _DOMCollection = _interopRequireDefault$b(DOMCollection$1); var _DOMElement = _interopRequireDefault$b(DOMElement); var _Immutable = _interopRequireDefault$b(Immutable); var _ReactElement = _interopRequireDefault$b(ReactElement); var _ReactTestComponent = _interopRequireDefault$b( ReactTestComponent ); function _interopRequireDefault$b(obj) { return obj && obj.__esModule ? obj : {default: obj}; } /** * Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ /* eslint-disable local/ban-types-eventually */ const toString = Object.prototype.toString; const toISOString = Date.prototype.toISOString; const errorToString = Error.prototype.toString; const regExpToString = RegExp.prototype.toString; /** * Explicitly comparing typeof constructor to function avoids undefined as name * when mock identity-obj-proxy returns the key as the value for any key. */ const getConstructorName = val => (typeof val.constructor === 'function' && val.constructor.name) || 'Object'; /* global window */ /** Is val is equal to global window object? Works even if it does not exist :) */ const isWindow = val => typeof window !== 'undefined' && val === window; const SYMBOL_REGEXP = /^Symbol\((.*)\)(.*)$/; const NEWLINE_REGEXP = /\n/gi; class PrettyFormatPluginError extends Error { constructor(message, stack) { super(message); this.stack = stack; this.name = this.constructor.name; } } function isToStringedArrayType(toStringed) { return ( toStringed === '[object Array]' || toStringed === '[object ArrayBuffer]' || toStringed === '[object DataView]' || toStringed === '[object Float32Array]' || toStringed === '[object Float64Array]' || toStringed === '[object Int8Array]' || toStringed === '[object Int16Array]' || toStringed === '[object Int32Array]' || toStringed === '[object Uint8Array]' || toStringed === '[object Uint8ClampedArray]' || toStringed === '[object Uint16Array]' || toStringed === '[object Uint32Array]' ); } function printNumber(val) { return Object.is(val, -0) ? '-0' : String(val); } function printBigInt(val) { return String(`${val}n`); } function printFunction(val, printFunctionName) { if (!printFunctionName) { return '[Function]'; } return '[Function ' + (val.name || 'anonymous') + ']'; } function printSymbol(val) { return String(val).replace(SYMBOL_REGEXP, 'Symbol($1)'); } function printError(val) { return '[' + errorToString.call(val) + ']'; } /** * The first port of call for printing an object, handles most of the * data-types in JS. */ function printBasicValue(val, printFunctionName, escapeRegex, escapeString) { if (val === true || val === false) { return '' + val; } if (val === undefined) { return 'undefined'; } if (val === null) { return 'null'; } const typeOf = typeof val; if (typeOf === 'number') { return printNumber(val); } if (typeOf === 'bigint') { return printBigInt(val); } if (typeOf === 'string') { if (escapeString) { return '"' + val.replace(/"|\\/g, '\\$&') + '"'; } return '"' + val + '"'; } if (typeOf === 'function') { return printFunction(val, printFunctionName); } if (typeOf === 'symbol') { return printSymbol(val); } const toStringed = toString.call(val); if (toStringed === '[object WeakMap]') { return 'WeakMap {}'; } if (toStringed === '[object WeakSet]') { return 'WeakSet {}'; } if ( toStringed === '[object Function]' || toStringed === '[object GeneratorFunction]' ) { return printFunction(val, printFunctionName); } if (toStringed === '[object Symbol]') { return printSymbol(val); } if (toStringed === '[object Date]') { return isNaN(+val) ? 'Date { NaN }' : toISOString.call(val); } if (toStringed === '[object Error]') { return printError(val); } if (toStringed === '[object RegExp]') { if (escapeRegex) { // https://github.com/benjamingr/RegExp.escape/blob/main/polyfill.js return regExpToString.call(val).replace(/[\\^$*+?.()|[\]{}]/g, '\\$&'); } return regExpToString.call(val); } if (val instanceof Error) { return printError(val); } return null; } /** * Handles more complex objects ( such as objects with circular references. * maps and sets etc ) */ function printComplexValue( val, config, indentation, depth, refs, hasCalledToJSON ) { if (refs.indexOf(val) !== -1) { return '[Circular]'; } refs = refs.slice(); refs.push(val); const hitMaxDepth = ++depth > config.maxDepth; const min = config.min; if ( config.callToJSON && !hitMaxDepth && val.toJSON && typeof val.toJSON === 'function' && !hasCalledToJSON ) { return printer(val.toJSON(), config, indentation, depth, refs, true); } const toStringed = toString.call(val); if (toStringed === '[object Arguments]') { return hitMaxDepth ? '[Arguments]' : (min ? '' : 'Arguments ') + '[' + (0, _collections.printListItems)( val, config, indentation, depth, refs, printer ) + ']'; } if (isToStringedArrayType(toStringed)) { return hitMaxDepth ? '[' + val.constructor.name + ']' : (min ? '' : !config.printBasicPrototype && val.constructor.name === 'Array' ? '' : val.constructor.name + ' ') + '[' + (0, _collections.printListItems)( val, config, indentation, depth, refs, printer ) + ']'; } if (toStringed === '[object Map]') { return hitMaxDepth ? '[Map]' : 'Map {' + (0, _collections.printIteratorEntries)( val.entries(), config, indentation, depth, refs, printer, ' => ' ) + '}'; } if (toStringed === '[object Set]') { return hitMaxDepth ? '[Set]' : 'Set {' + (0, _collections.printIteratorValues)( val.values(), config, indentation, depth, refs, printer ) + '}'; } // Avoid failure to serialize global window object in jsdom test environment. // For example, not even relevant if window is prop of React element. return hitMaxDepth || isWindow(val) ? '[' + getConstructorName(val) + ']' : (min ? '' : !config.printBasicPrototype && getConstructorName(val) === 'Object' ? '' : getConstructorName(val) + ' ') + '{' + (0, _collections.printObjectProperties)( val, config, indentation, depth, refs, printer ) + '}'; } function isNewPlugin(plugin) { return plugin.serialize != null; } function printPlugin(plugin, val, config, indentation, depth, refs) { let printed; try { printed = isNewPlugin(plugin) ? plugin.serialize(val, config, indentation, depth, refs, printer) : plugin.print( val, valChild => printer(valChild, config, indentation, depth, refs), str => { const indentationNext = indentation + config.indent; return ( indentationNext + str.replace(NEWLINE_REGEXP, '\n' + indentationNext) ); }, { edgeSpacing: config.spacingOuter, min: config.min, spacing: config.spacingInner }, config.colors ); } catch (error) { throw new PrettyFormatPluginError(error.message, error.stack); } if (typeof printed !== 'string') { throw new Error( `pretty-format: Plugin must return type "string" but instead returned "${typeof printed}".` ); } return printed; } function findPlugin(plugins, val) { for (let p = 0; p < plugins.length; p++) { try { if (plugins[p].test(val)) { return plugins[p]; } } catch (error) { throw new PrettyFormatPluginError(error.message, error.stack); } } return null; } function printer(val, config, indentation, depth, refs, hasCalledToJSON) { const plugin = findPlugin(config.plugins, val); if (plugin !== null) { return printPlugin(plugin, val, config, indentation, depth, refs); } const basicResult = printBasicValue( val, config.printFunctionName, config.escapeRegex, config.escapeString ); if (basicResult !== null) { return basicResult; } return printComplexValue( val, config, indentation, depth, refs, hasCalledToJSON ); } const DEFAULT_THEME = { comment: 'gray', content: 'reset', prop: 'yellow', tag: 'cyan', value: 'green' }; const DEFAULT_THEME_KEYS = Object.keys(DEFAULT_THEME); const DEFAULT_OPTIONS = { callToJSON: true, compareKeys: undefined, escapeRegex: false, escapeString: true, highlight: false, indent: 2, maxDepth: Infinity, min: false, plugins: [], printBasicPrototype: true, printFunctionName: true, theme: DEFAULT_THEME }; build$1.DEFAULT_OPTIONS = DEFAULT_OPTIONS; function validateOptions(options) { Object.keys(options).forEach(key => { if (!DEFAULT_OPTIONS.hasOwnProperty(key)) { throw new Error(`pretty-format: Unknown option "${key}".`); } }); if (options.min && options.indent !== undefined && options.indent !== 0) { throw new Error( 'pretty-format: Options "min" and "indent" cannot be used together.' ); } if (options.theme !== undefined) { if (options.theme === null) { throw new Error('pretty-format: Option "theme" must not be null.'); } if (typeof options.theme !== 'object') { throw new Error( `pretty-format: Option "theme" must be of type "object" but instead received "${typeof options.theme}".` ); } } } const getColorsHighlight = options => DEFAULT_THEME_KEYS.reduce((colors, key) => { const value = options.theme && options.theme[key] !== undefined ? options.theme[key] : DEFAULT_THEME[key]; const color = value && _ansiStyles.default[value]; if ( color && typeof color.close === 'string' && typeof color.open === 'string' ) { colors[key] = color; } else { throw new Error( `pretty-format: Option "theme" has a key "${key}" whose value "${value}" is undefined in ansi-styles.` ); } return colors; }, Object.create(null)); const getColorsEmpty = () => DEFAULT_THEME_KEYS.reduce((colors, key) => { colors[key] = { close: '', open: '' }; return colors; }, Object.create(null)); const getPrintFunctionName = options => options && options.printFunctionName !== undefined ? options.printFunctionName : DEFAULT_OPTIONS.printFunctionName; const getEscapeRegex = options => options && options.escapeRegex !== undefined ? options.escapeRegex : DEFAULT_OPTIONS.escapeRegex; const getEscapeString = options => options && options.escapeString !== undefined ? options.escapeString : DEFAULT_OPTIONS.escapeString; const getConfig$1 = options => { var _options$printBasicPr; return { callToJSON: options && options.callToJSON !== undefined ? options.callToJSON : DEFAULT_OPTIONS.callToJSON, colors: options && options.highlight ? getColorsHighlight(options) : getColorsEmpty(), compareKeys: options && typeof options.compareKeys === 'function' ? options.compareKeys : DEFAULT_OPTIONS.compareKeys, escapeRegex: getEscapeRegex(options), escapeString: getEscapeString(options), indent: options && options.min ? '' : createIndent( options && options.indent !== undefined ? options.indent : DEFAULT_OPTIONS.indent ), maxDepth: options && options.maxDepth !== undefined ? options.maxDepth : DEFAULT_OPTIONS.maxDepth, min: options && options.min !== undefined ? options.min : DEFAULT_OPTIONS.min, plugins: options && options.plugins !== undefined ? options.plugins : DEFAULT_OPTIONS.plugins, printBasicPrototype: (_options$printBasicPr = options === null || options === void 0 ? void 0 : options.printBasicPrototype) !== null && _options$printBasicPr !== void 0 ? _options$printBasicPr : true, printFunctionName: getPrintFunctionName(options), spacingInner: options && options.min ? ' ' : '\n', spacingOuter: options && options.min ? '' : '\n' }; }; function createIndent(indent) { return new Array(indent + 1).join(' '); } /** * Returns a presentation string of your `val` object * @param val any potential JavaScript object * @param options Custom settings */ function format(val, options) { if (options) { validateOptions(options); if (options.plugins) { const plugin = findPlugin(options.plugins, val); if (plugin !== null) { return printPlugin(plugin, val, getConfig$1(options), '', 0, []); } } } const basicResult = printBasicValue( val, getPrintFunctionName(options), getEscapeRegex(options), getEscapeString(options) ); if (basicResult !== null) { return basicResult; } return printComplexValue(val, getConfig$1(options), '', 0, []); } const plugins = { AsymmetricMatcher: _AsymmetricMatcher.default, ConvertAnsi: _ConvertAnsi.default, DOMCollection: _DOMCollection.default, DOMElement: _DOMElement.default, Immutable: _Immutable.default, ReactElement: _ReactElement.default, ReactTestComponent: _ReactTestComponent.default }; plugins_1 = build$1.plugins = plugins; var _default$2j = format; build$1.default = _default$2j; /** * @source {https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/from#Polyfill} * but without thisArg (too hard to type, no need to `this`) */ var toStr = Object.prototype.toString; function isCallable(fn) { return typeof fn === "function" || toStr.call(fn) === "[object Function]"; } function toInteger(value) { var number = Number(value); if (isNaN(number)) { return 0; } if (number === 0 || !isFinite(number)) { return number; } return (number > 0 ? 1 : -1) * Math.floor(Math.abs(number)); } var maxSafeInteger = Math.pow(2, 53) - 1; function toLength(value) { var len = toInteger(value); return Math.min(Math.max(len, 0), maxSafeInteger); } /** * Creates an array from an iterable object. * @param iterable An iterable object to convert to an array. */ /** * Creates an array from an iterable object. * @param iterable An iterable object to convert to an array. * @param mapfn A mapping function to call on every element of the array. * @param thisArg Value of 'this' used to invoke the mapfn. */ function arrayFrom(arrayLike, mapFn) { // 1. Let C be the this value. // edit(@eps1lon): we're not calling it as Array.from var C = Array; // 2. Let items be ToObject(arrayLike). var items = Object(arrayLike); // 3. ReturnIfAbrupt(items). if (arrayLike == null) { throw new TypeError("Array.from requires an array-like object - not null or undefined"); } // 10. Let lenValue be Get(items, "length"). // 11. Let len be ToLength(lenValue). var len = toLength(items.length); // 13. If IsConstructor(C) is true, then // 13. a. Let A be the result of calling the [[Construct]] internal method // of C with an argument list containing the single item len. // 14. a. Else, Let A be ArrayCreate(len). var A = isCallable(C) ? Object(new C(len)) : new Array(len); // 16. Let k be 0. var k = 0; // 17. Repeat, while k < len… (also steps a - h) var kValue; while (k < len) { kValue = items[k]; { A[k] = kValue; } k += 1; } // 18. Let putStatus be Put(A, "length", len, true). A.length = len; // 20. Return A. return A; } function _typeof$2(obj) { "@babel/helpers - typeof"; return _typeof$2 = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof$2(obj); } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey$1(descriptor.key), descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } function _defineProperty$2(obj, key, value) { key = _toPropertyKey$1(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _toPropertyKey$1(arg) { var key = _toPrimitive$1(arg, "string"); return _typeof$2(key) === "symbol" ? key : String(key); } function _toPrimitive$1(input, hint) { if (_typeof$2(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint); if (_typeof$2(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); } // for environments without Set we fallback to arrays with unique members var SetLike = /*#__PURE__*/function () { function SetLike() { var items = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; _classCallCheck(this, SetLike); _defineProperty$2(this, "items", void 0); this.items = items; } _createClass(SetLike, [{ key: "add", value: function add(value) { if (this.has(value) === false) { this.items.push(value); } return this; } }, { key: "clear", value: function clear() { this.items = []; } }, { key: "delete", value: function _delete(value) { var previousLength = this.items.length; this.items = this.items.filter(function (item) { return item !== value; }); return previousLength !== this.items.length; } }, { key: "forEach", value: function forEach(callbackfn) { var _this = this; this.items.forEach(function (item) { callbackfn(item, item, _this); }); } }, { key: "has", value: function has(value) { return this.items.indexOf(value) !== -1; } }, { key: "size", get: function get() { return this.items.length; } }]); return SetLike; }(); const SetLike$1 = typeof Set === "undefined" ? Set : SetLike; // https://w3c.github.io/html-aria/#document-conformance-requirements-for-use-of-aria-attributes-in-html /** * Safe Element.localName for all supported environments * @param element */ function getLocalName(element) { var _element$localName; return (// eslint-disable-next-line no-restricted-properties -- actual guard for environments without localName (_element$localName = element.localName) !== null && _element$localName !== void 0 ? _element$localName : // eslint-disable-next-line no-restricted-properties -- required for the fallback element.tagName.toLowerCase() ); } var localNameToRoleMappings = { article: "article", aside: "complementary", button: "button", datalist: "listbox", dd: "definition", details: "group", dialog: "dialog", dt: "term", fieldset: "group", figure: "figure", // WARNING: Only with an accessible name form: "form", footer: "contentinfo", h1: "heading", h2: "heading", h3: "heading", h4: "heading", h5: "heading", h6: "heading", header: "banner", hr: "separator", html: "document", legend: "legend", li: "listitem", math: "math", main: "main", menu: "list", nav: "navigation", ol: "list", optgroup: "group", // WARNING: Only in certain context option: "option", output: "status", progress: "progressbar", // WARNING: Only with an accessible name section: "region", summary: "button", table: "table", tbody: "rowgroup", textarea: "textbox", tfoot: "rowgroup", // WARNING: Only in certain context td: "cell", th: "columnheader", thead: "rowgroup", tr: "row", ul: "list" }; var prohibitedAttributes = { caption: new Set(["aria-label", "aria-labelledby"]), code: new Set(["aria-label", "aria-labelledby"]), deletion: new Set(["aria-label", "aria-labelledby"]), emphasis: new Set(["aria-label", "aria-labelledby"]), generic: new Set(["aria-label", "aria-labelledby", "aria-roledescription"]), insertion: new Set(["aria-label", "aria-labelledby"]), paragraph: new Set(["aria-label", "aria-labelledby"]), presentation: new Set(["aria-label", "aria-labelledby"]), strong: new Set(["aria-label", "aria-labelledby"]), subscript: new Set(["aria-label", "aria-labelledby"]), superscript: new Set(["aria-label", "aria-labelledby"]) }; /** * * @param element * @param role The role used for this element. This is specified to control whether you want to use the implicit or explicit role. */ function hasGlobalAriaAttributes(element, role) { // https://rawgit.com/w3c/aria/stable/#global_states // commented attributes are deprecated return ["aria-atomic", "aria-busy", "aria-controls", "aria-current", "aria-describedby", "aria-details", // "disabled", "aria-dropeffect", // "errormessage", "aria-flowto", "aria-grabbed", // "haspopup", "aria-hidden", // "invalid", "aria-keyshortcuts", "aria-label", "aria-labelledby", "aria-live", "aria-owns", "aria-relevant", "aria-roledescription"].some(function (attributeName) { var _prohibitedAttributes; return element.hasAttribute(attributeName) && !((_prohibitedAttributes = prohibitedAttributes[role]) !== null && _prohibitedAttributes !== void 0 && _prohibitedAttributes.has(attributeName)); }); } function ignorePresentationalRole(element, implicitRole) { // https://rawgit.com/w3c/aria/stable/#conflict_resolution_presentation_none return hasGlobalAriaAttributes(element, implicitRole); } function getRole(element) { var explicitRole = getExplicitRole(element); if (explicitRole === null || explicitRole === "presentation") { var implicitRole = getImplicitRole(element); if (explicitRole !== "presentation" || ignorePresentationalRole(element, implicitRole || "")) { return implicitRole; } } return explicitRole; } function getImplicitRole(element) { var mappedByTag = localNameToRoleMappings[getLocalName(element)]; if (mappedByTag !== undefined) { return mappedByTag; } switch (getLocalName(element)) { case "a": case "area": case "link": if (element.hasAttribute("href")) { return "link"; } break; case "img": if (element.getAttribute("alt") === "" && !ignorePresentationalRole(element, "img")) { return "presentation"; } return "img"; case "input": { var _ref = element, type = _ref.type; switch (type) { case "button": case "image": case "reset": case "submit": return "button"; case "checkbox": case "radio": return type; case "range": return "slider"; case "email": case "tel": case "text": case "url": if (element.hasAttribute("list")) { return "combobox"; } return "textbox"; case "search": if (element.hasAttribute("list")) { return "combobox"; } return "searchbox"; case "number": return "spinbutton"; default: return null; } } case "select": if (element.hasAttribute("multiple") || element.size > 1) { return "listbox"; } return "combobox"; } return null; } function getExplicitRole(element) { var role = element.getAttribute("role"); if (role !== null) { var explicitRole = role.trim().split(" ")[0]; // String.prototype.split(sep, limit) will always return an array with at least one member // as long as limit is either undefined or > 0 if (explicitRole.length > 0) { return explicitRole; } } return null; } function isElement$1(node) { return node !== null && node.nodeType === node.ELEMENT_NODE; } function isHTMLTableCaptionElement(node) { return isElement$1(node) && getLocalName(node) === "caption"; } function isHTMLInputElement(node) { return isElement$1(node) && getLocalName(node) === "input"; } function isHTMLOptGroupElement(node) { return isElement$1(node) && getLocalName(node) === "optgroup"; } function isHTMLSelectElement(node) { return isElement$1(node) && getLocalName(node) === "select"; } function isHTMLTableElement(node) { return isElement$1(node) && getLocalName(node) === "table"; } function isHTMLTextAreaElement(node) { return isElement$1(node) && getLocalName(node) === "textarea"; } function safeWindow(node) { var _ref = node.ownerDocument === null ? node : node.ownerDocument, defaultView = _ref.defaultView; if (defaultView === null) { throw new TypeError("no window available"); } return defaultView; } function isHTMLFieldSetElement(node) { return isElement$1(node) && getLocalName(node) === "fieldset"; } function isHTMLLegendElement(node) { return isElement$1(node) && getLocalName(node) === "legend"; } function isHTMLSlotElement(node) { return isElement$1(node) && getLocalName(node) === "slot"; } function isSVGElement(node) { return isElement$1(node) && node.ownerSVGElement !== undefined; } function isSVGSVGElement(node) { return isElement$1(node) && getLocalName(node) === "svg"; } function isSVGTitleElement(node) { return isSVGElement(node) && getLocalName(node) === "title"; } /** * * @param {Node} node - * @param {string} attributeName - * @returns {Element[]} - */ function queryIdRefs(node, attributeName) { if (isElement$1(node) && node.hasAttribute(attributeName)) { // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- safe due to hasAttribute check var ids = node.getAttribute(attributeName).split(" "); // Browsers that don't support shadow DOM won't have getRootNode var root = node.getRootNode ? node.getRootNode() : node.ownerDocument; return ids.map(function (id) { return root.getElementById(id); }).filter(function (element) { return element !== null; } // TODO: why does this not narrow? ); } return []; } function hasAnyConcreteRoles(node, roles) { if (isElement$1(node)) { return roles.indexOf(getRole(node)) !== -1; } return false; } /** * implements https://w3c.github.io/accname/ */ /** * A string of characters where all carriage returns, newlines, tabs, and form-feeds are replaced with a single space, and multiple spaces are reduced to a single space. The string contains only character data; it does not contain any markup. */ /** * * @param {string} string - * @returns {FlatString} - */ function asFlatString(s) { return s.trim().replace(/\s\s+/g, " "); } /** * * @param node - * @param options - These are not optional to prevent accidentally calling it without options in `computeAccessibleName` * @returns {boolean} - */ function isHidden(node, getComputedStyleImplementation) { if (!isElement$1(node)) { return false; } if (node.hasAttribute("hidden") || node.getAttribute("aria-hidden") === "true") { return true; } var style = getComputedStyleImplementation(node); return style.getPropertyValue("display") === "none" || style.getPropertyValue("visibility") === "hidden"; } /** * @param {Node} node - * @returns {boolean} - As defined in step 2E of https://w3c.github.io/accname/#mapping_additional_nd_te */ function isControl(node) { return hasAnyConcreteRoles(node, ["button", "combobox", "listbox", "textbox"]) || hasAbstractRole(node, "range"); } function hasAbstractRole(node, role) { if (!isElement$1(node)) { return false; } switch (role) { case "range": return hasAnyConcreteRoles(node, ["meter", "progressbar", "scrollbar", "slider", "spinbutton"]); default: throw new TypeError("No knowledge about abstract role '".concat(role, "'. This is likely a bug :(")); } } /** * element.querySelectorAll but also considers owned tree * @param element * @param selectors */ function querySelectorAllSubtree(element, selectors) { var elements = arrayFrom(element.querySelectorAll(selectors)); queryIdRefs(element, "aria-owns").forEach(function (root) { // babel transpiles this assuming an iterator elements.push.apply(elements, arrayFrom(root.querySelectorAll(selectors))); }); return elements; } function querySelectedOptions(listbox) { if (isHTMLSelectElement(listbox)) { // IE11 polyfill return listbox.selectedOptions || querySelectorAllSubtree(listbox, "[selected]"); } return querySelectorAllSubtree(listbox, '[aria-selected="true"]'); } function isMarkedPresentational(node) { return hasAnyConcreteRoles(node, ["none", "presentation"]); } /** * Elements specifically listed in html-aam * * We don't need this for `label` or `legend` elements. * Their implicit roles already allow "naming from content". * * sources: * * - https://w3c.github.io/html-aam/#table-element */ function isNativeHostLanguageTextAlternativeElement(node) { return isHTMLTableCaptionElement(node); } /** * https://w3c.github.io/aria/#namefromcontent */ function allowsNameFromContent(node) { return hasAnyConcreteRoles(node, ["button", "cell", "checkbox", "columnheader", "gridcell", "heading", "label", "legend", "link", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "row", "rowheader", "switch", "tab", "tooltip", "treeitem"]); } /** * TODO https://github.com/eps1lon/dom-accessibility-api/issues/100 */ function isDescendantOfNativeHostLanguageTextAlternativeElement( // eslint-disable-next-line @typescript-eslint/no-unused-vars -- not implemented yet node) { return false; } function getValueOfTextbox(element) { if (isHTMLInputElement(element) || isHTMLTextAreaElement(element)) { return element.value; } // https://github.com/eps1lon/dom-accessibility-api/issues/4 return element.textContent || ""; } function getTextualContent(declaration) { var content = declaration.getPropertyValue("content"); if (/^["'].*["']$/.test(content)) { return content.slice(1, -1); } return ""; } /** * https://html.spec.whatwg.org/multipage/forms.html#category-label * TODO: form-associated custom elements * @param element */ function isLabelableElement(element) { var localName = getLocalName(element); return localName === "button" || localName === "input" && element.getAttribute("type") !== "hidden" || localName === "meter" || localName === "output" || localName === "progress" || localName === "select" || localName === "textarea"; } /** * > [...], then the first such descendant in tree order is the label element's labeled control. * -- https://html.spec.whatwg.org/multipage/forms.html#labeled-control * @param element */ function findLabelableElement(element) { if (isLabelableElement(element)) { return element; } var labelableElement = null; element.childNodes.forEach(function (childNode) { if (labelableElement === null && isElement$1(childNode)) { var descendantLabelableElement = findLabelableElement(childNode); if (descendantLabelableElement !== null) { labelableElement = descendantLabelableElement; } } }); return labelableElement; } /** * Polyfill of HTMLLabelElement.control * https://html.spec.whatwg.org/multipage/forms.html#labeled-control * @param label */ function getControlOfLabel(label) { if (label.control !== undefined) { return label.control; } var htmlFor = label.getAttribute("for"); if (htmlFor !== null) { return label.ownerDocument.getElementById(htmlFor); } return findLabelableElement(label); } /** * Polyfill of HTMLInputElement.labels * https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/labels * @param element */ function getLabels$1(element) { var labelsProperty = element.labels; if (labelsProperty === null) { return labelsProperty; } if (labelsProperty !== undefined) { return arrayFrom(labelsProperty); } // polyfill if (!isLabelableElement(element)) { return null; } var document = element.ownerDocument; return arrayFrom(document.querySelectorAll("label")).filter(function (label) { return getControlOfLabel(label) === element; }); } /** * Gets the contents of a slot used for computing the accname * @param slot */ function getSlotContents(slot) { // Computing the accessible name for elements containing slots is not // currently defined in the spec. This implementation reflects the // behavior of NVDA 2020.2/Firefox 81 and iOS VoiceOver/Safari 13.6. var assignedNodes = slot.assignedNodes(); if (assignedNodes.length === 0) { // if no nodes are assigned to the slot, it displays the default content return arrayFrom(slot.childNodes); } return assignedNodes; } /** * implements https://w3c.github.io/accname/#mapping_additional_nd_te * @param root * @param options * @returns */ function computeTextAlternative(root) { var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; var consultedNodes = new SetLike$1(); var window = safeWindow(root); var _options$compute = options.compute, compute = _options$compute === void 0 ? "name" : _options$compute, _options$computedStyl = options.computedStyleSupportsPseudoElements, computedStyleSupportsPseudoElements = _options$computedStyl === void 0 ? options.getComputedStyle !== undefined : _options$computedStyl, _options$getComputedS = options.getComputedStyle, getComputedStyle = _options$getComputedS === void 0 ? window.getComputedStyle.bind(window) : _options$getComputedS, _options$hidden = options.hidden, hidden = _options$hidden === void 0 ? false : _options$hidden; // 2F.i function computeMiscTextAlternative(node, context) { var accumulatedText = ""; if (isElement$1(node) && computedStyleSupportsPseudoElements) { var pseudoBefore = getComputedStyle(node, "::before"); var beforeContent = getTextualContent(pseudoBefore); accumulatedText = "".concat(beforeContent, " ").concat(accumulatedText); } // FIXME: Including aria-owns is not defined in the spec // But it is required in the web-platform-test var childNodes = isHTMLSlotElement(node) ? getSlotContents(node) : arrayFrom(node.childNodes).concat(queryIdRefs(node, "aria-owns")); childNodes.forEach(function (child) { var result = computeTextAlternative(child, { isEmbeddedInLabel: context.isEmbeddedInLabel, isReferenced: false, recursion: true }); // TODO: Unclear why display affects delimiter // see https://github.com/w3c/accname/issues/3 var display = isElement$1(child) ? getComputedStyle(child).getPropertyValue("display") : "inline"; var separator = display !== "inline" ? " " : ""; // trailing separator for wpt tests accumulatedText += "".concat(separator).concat(result).concat(separator); }); if (isElement$1(node) && computedStyleSupportsPseudoElements) { var pseudoAfter = getComputedStyle(node, "::after"); var afterContent = getTextualContent(pseudoAfter); accumulatedText = "".concat(accumulatedText, " ").concat(afterContent); } return accumulatedText.trim(); } /** * * @param element * @param attributeName * @returns A string non-empty string or `null` */ function useAttribute(element, attributeName) { var attribute = element.getAttributeNode(attributeName); if (attribute !== null && !consultedNodes.has(attribute) && attribute.value.trim() !== "") { consultedNodes.add(attribute); return attribute.value; } return null; } function computeTooltipAttributeValue(node) { if (!isElement$1(node)) { return null; } return useAttribute(node, "title"); } function computeElementTextAlternative(node) { if (!isElement$1(node)) { return null; } // https://w3c.github.io/html-aam/#fieldset-and-legend-elements if (isHTMLFieldSetElement(node)) { consultedNodes.add(node); var children = arrayFrom(node.childNodes); for (var i = 0; i < children.length; i += 1) { var child = children[i]; if (isHTMLLegendElement(child)) { return computeTextAlternative(child, { isEmbeddedInLabel: false, isReferenced: false, recursion: false }); } } } else if (isHTMLTableElement(node)) { // https://w3c.github.io/html-aam/#table-element consultedNodes.add(node); var _children = arrayFrom(node.childNodes); for (var _i = 0; _i < _children.length; _i += 1) { var _child = _children[_i]; if (isHTMLTableCaptionElement(_child)) { return computeTextAlternative(_child, { isEmbeddedInLabel: false, isReferenced: false, recursion: false }); } } } else if (isSVGSVGElement(node)) { // https://www.w3.org/TR/svg-aam-1.0/ consultedNodes.add(node); var _children2 = arrayFrom(node.childNodes); for (var _i2 = 0; _i2 < _children2.length; _i2 += 1) { var _child2 = _children2[_i2]; if (isSVGTitleElement(_child2)) { return _child2.textContent; } } return null; } else if (getLocalName(node) === "img" || getLocalName(node) === "area") { // https://w3c.github.io/html-aam/#area-element // https://w3c.github.io/html-aam/#img-element var nameFromAlt = useAttribute(node, "alt"); if (nameFromAlt !== null) { return nameFromAlt; } } else if (isHTMLOptGroupElement(node)) { var nameFromLabel = useAttribute(node, "label"); if (nameFromLabel !== null) { return nameFromLabel; } } if (isHTMLInputElement(node) && (node.type === "button" || node.type === "submit" || node.type === "reset")) { // https://w3c.github.io/html-aam/#input-type-text-input-type-password-input-type-search-input-type-tel-input-type-email-input-type-url-and-textarea-element-accessible-description-computation var nameFromValue = useAttribute(node, "value"); if (nameFromValue !== null) { return nameFromValue; } // TODO: l10n if (node.type === "submit") { return "Submit"; } // TODO: l10n if (node.type === "reset") { return "Reset"; } } var labels = getLabels$1(node); if (labels !== null && labels.length !== 0) { consultedNodes.add(node); return arrayFrom(labels).map(function (element) { return computeTextAlternative(element, { isEmbeddedInLabel: true, isReferenced: false, recursion: true }); }).filter(function (label) { return label.length > 0; }).join(" "); } // https://w3c.github.io/html-aam/#input-type-image-accessible-name-computation // TODO: wpt test consider label elements but html-aam does not mention them // We follow existing implementations over spec if (isHTMLInputElement(node) && node.type === "image") { var _nameFromAlt = useAttribute(node, "alt"); if (_nameFromAlt !== null) { return _nameFromAlt; } var nameFromTitle = useAttribute(node, "title"); if (nameFromTitle !== null) { return nameFromTitle; } // TODO: l10n return "Submit Query"; } if (hasAnyConcreteRoles(node, ["button"])) { // https://www.w3.org/TR/html-aam-1.0/#button-element var nameFromSubTree = computeMiscTextAlternative(node, { isEmbeddedInLabel: false}); if (nameFromSubTree !== "") { return nameFromSubTree; } } return null; } function computeTextAlternative(current, context) { if (consultedNodes.has(current)) { return ""; } // 2A if (!hidden && isHidden(current, getComputedStyle) && !context.isReferenced) { consultedNodes.add(current); return ""; } // 2B var labelAttributeNode = isElement$1(current) ? current.getAttributeNode("aria-labelledby") : null; // TODO: Do we generally need to block query IdRefs of attributes we have already consulted? var labelElements = labelAttributeNode !== null && !consultedNodes.has(labelAttributeNode) ? queryIdRefs(current, "aria-labelledby") : []; if (compute === "name" && !context.isReferenced && labelElements.length > 0) { // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- Can't be null here otherwise labelElements would be empty consultedNodes.add(labelAttributeNode); return labelElements.map(function (element) { // TODO: Chrome will consider repeated values i.e. use a node multiple times while we'll bail out in computeTextAlternative. return computeTextAlternative(element, { isEmbeddedInLabel: context.isEmbeddedInLabel, isReferenced: true, // this isn't recursion as specified, otherwise we would skip // `aria-label` in // <input id="myself" aria-label="foo" aria-labelledby="myself" recursion: false }); }).join(" "); } // 2C // Changed from the spec in anticipation of https://github.com/w3c/accname/issues/64 // spec says we should only consider skipping if we have a non-empty label var skipToStep2E = context.recursion && isControl(current) && compute === "name"; if (!skipToStep2E) { var ariaLabel = (isElement$1(current) && current.getAttribute("aria-label") || "").trim(); if (ariaLabel !== "" && compute === "name") { consultedNodes.add(current); return ariaLabel; } // 2D if (!isMarkedPresentational(current)) { var elementTextAlternative = computeElementTextAlternative(current); if (elementTextAlternative !== null) { consultedNodes.add(current); return elementTextAlternative; } } } // special casing, cheating to make tests pass // https://github.com/w3c/accname/issues/67 if (hasAnyConcreteRoles(current, ["menu"])) { consultedNodes.add(current); return ""; } // 2E if (skipToStep2E || context.isEmbeddedInLabel || context.isReferenced) { if (hasAnyConcreteRoles(current, ["combobox", "listbox"])) { consultedNodes.add(current); var selectedOptions = querySelectedOptions(current); if (selectedOptions.length === 0) { // defined per test `name_heading_combobox` return isHTMLInputElement(current) ? current.value : ""; } return arrayFrom(selectedOptions).map(function (selectedOption) { return computeTextAlternative(selectedOption, { isEmbeddedInLabel: context.isEmbeddedInLabel, isReferenced: false, recursion: true }); }).join(" "); } if (hasAbstractRole(current, "range")) { consultedNodes.add(current); if (current.hasAttribute("aria-valuetext")) { // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- safe due to hasAttribute guard return current.getAttribute("aria-valuetext"); } if (current.hasAttribute("aria-valuenow")) { // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- safe due to hasAttribute guard return current.getAttribute("aria-valuenow"); } // Otherwise, use the value as specified by a host language attribute. return current.getAttribute("value") || ""; } if (hasAnyConcreteRoles(current, ["textbox"])) { consultedNodes.add(current); return getValueOfTextbox(current); } } // 2F: https://w3c.github.io/accname/#step2F if (allowsNameFromContent(current) || isElement$1(current) && context.isReferenced || isNativeHostLanguageTextAlternativeElement(current) || isDescendantOfNativeHostLanguageTextAlternativeElement()) { var accumulatedText2F = computeMiscTextAlternative(current, { isEmbeddedInLabel: context.isEmbeddedInLabel}); if (accumulatedText2F !== "") { consultedNodes.add(current); return accumulatedText2F; } } if (current.nodeType === current.TEXT_NODE) { consultedNodes.add(current); return current.textContent || ""; } if (context.recursion) { consultedNodes.add(current); return computeMiscTextAlternative(current, { isEmbeddedInLabel: context.isEmbeddedInLabel}); } var tooltipAttributeValue = computeTooltipAttributeValue(current); if (tooltipAttributeValue !== null) { consultedNodes.add(current); return tooltipAttributeValue; } // TODO should this be reachable? consultedNodes.add(current); return ""; } return asFlatString(computeTextAlternative(root, { isEmbeddedInLabel: false, // by spec computeAccessibleDescription starts with the referenced elements as roots isReferenced: compute === "description", recursion: false })); } function _typeof$1(obj) { "@babel/helpers - typeof"; return _typeof$1 = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof$1(obj); } function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), true).forEach(function (key) { _defineProperty$1(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } function _defineProperty$1(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof$1(key) === "symbol" ? key : String(key); } function _toPrimitive(input, hint) { if (_typeof$1(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint); if (_typeof$1(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); } /** * @param root * @param options * @returns */ function computeAccessibleDescription(root) { var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; var description = queryIdRefs(root, "aria-describedby").map(function (element) { return computeTextAlternative(element, _objectSpread(_objectSpread({}, options), {}, { compute: "description" })); }).join(" "); // TODO: Technically we need to make sure that node wasn't used for the accessible name // This causes `description_1.0_combobox-focusable-manual` to fail // // https://www.w3.org/TR/html-aam-1.0/#accessible-name-and-description-computation // says for so many elements to use the `title` that we assume all elements are considered if (description === "") { var title = root.getAttribute("title"); description = title === null ? "" : title; } return description; } /** * https://w3c.github.io/aria/#namefromprohibited */ function prohibitsNaming(node) { return hasAnyConcreteRoles(node, ["caption", "code", "deletion", "emphasis", "generic", "insertion", "paragraph", "presentation", "strong", "subscript", "superscript"]); } /** * implements https://w3c.github.io/accname/#mapping_additional_nd_name * @param root * @param options * @returns */ function computeAccessibleName(root) { var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; if (prohibitsNaming(root)) { return ""; } return computeTextAlternative(root, options); } var lib = {}; var ariaPropsMap$1 = {}; var iterationDecorator$1 = {}; var iteratorProxy$1 = {}; Object.defineProperty(iteratorProxy$1, "__esModule", { value: true }); iteratorProxy$1.default = void 0; // eslint-disable-next-line no-unused-vars function iteratorProxy() { var values = this; var index = 0; var iter = { '@@iterator': function iterator() { return iter; }, next: function next() { if (index < values.length) { var value = values[index]; index = index + 1; return { done: false, value: value }; } else { return { done: true }; } } }; return iter; } var _default$2i = iteratorProxy; iteratorProxy$1.default = _default$2i; Object.defineProperty(iterationDecorator$1, "__esModule", { value: true }); iterationDecorator$1.default = iterationDecorator; var _iteratorProxy = _interopRequireDefault$a(iteratorProxy$1); function _interopRequireDefault$a(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); } function iterationDecorator(collection, entries) { if (typeof Symbol === 'function' && _typeof(Symbol.iterator) === 'symbol') { Object.defineProperty(collection, Symbol.iterator, { value: _iteratorProxy.default.bind(entries) }); } return collection; } Object.defineProperty(ariaPropsMap$1, "__esModule", { value: true }); ariaPropsMap$1.default = void 0; var _iterationDecorator$4 = _interopRequireDefault$9(iterationDecorator$1); function _interopRequireDefault$9(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _slicedToArray$4(arr, i) { return _arrayWithHoles$4(arr) || _iterableToArrayLimit$4(arr, i) || _unsupportedIterableToArray$4(arr, i) || _nonIterableRest$4(); } function _nonIterableRest$4() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _iterableToArrayLimit$4(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } function _arrayWithHoles$4(arr) { if (Array.isArray(arr)) return arr; } function _createForOfIteratorHelper$4(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray$4(o)) || allowArrayLike) { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e2) { throw _e2; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e3) { didErr = true; err = _e3; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; } function _unsupportedIterableToArray$4(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$4(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray$4(o, minLen); } function _arrayLikeToArray$4(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } var properties = [['aria-activedescendant', { 'type': 'id' }], ['aria-atomic', { 'type': 'boolean' }], ['aria-autocomplete', { 'type': 'token', 'values': ['inline', 'list', 'both', 'none'] }], ['aria-braillelabel', { 'type': 'string' }], ['aria-brailleroledescription', { 'type': 'string' }], ['aria-busy', { 'type': 'boolean' }], ['aria-checked', { 'type': 'tristate' }], ['aria-colcount', { type: 'integer' }], ['aria-colindex', { type: 'integer' }], ['aria-colspan', { type: 'integer' }], ['aria-controls', { 'type': 'idlist' }], ['aria-current', { type: 'token', values: ['page', 'step', 'location', 'date', 'time', true, false] }], ['aria-describedby', { 'type': 'idlist' }], ['aria-description', { 'type': 'string' }], ['aria-details', { 'type': 'id' }], ['aria-disabled', { 'type': 'boolean' }], ['aria-dropeffect', { 'type': 'tokenlist', 'values': ['copy', 'execute', 'link', 'move', 'none', 'popup'] }], ['aria-errormessage', { 'type': 'id' }], ['aria-expanded', { 'type': 'boolean', 'allowundefined': true }], ['aria-flowto', { 'type': 'idlist' }], ['aria-grabbed', { 'type': 'boolean', 'allowundefined': true }], ['aria-haspopup', { 'type': 'token', 'values': [false, true, 'menu', 'listbox', 'tree', 'grid', 'dialog'] }], ['aria-hidden', { 'type': 'boolean', 'allowundefined': true }], ['aria-invalid', { 'type': 'token', 'values': ['grammar', false, 'spelling', true] }], ['aria-keyshortcuts', { type: 'string' }], ['aria-label', { 'type': 'string' }], ['aria-labelledby', { 'type': 'idlist' }], ['aria-level', { 'type': 'integer' }], ['aria-live', { 'type': 'token', 'values': ['assertive', 'off', 'polite'] }], ['aria-modal', { type: 'boolean' }], ['aria-multiline', { 'type': 'boolean' }], ['aria-multiselectable', { 'type': 'boolean' }], ['aria-orientation', { 'type': 'token', 'values': ['vertical', 'undefined', 'horizontal'] }], ['aria-owns', { 'type': 'idlist' }], ['aria-placeholder', { type: 'string' }], ['aria-posinset', { 'type': 'integer' }], ['aria-pressed', { 'type': 'tristate' }], ['aria-readonly', { 'type': 'boolean' }], ['aria-relevant', { 'type': 'tokenlist', 'values': ['additions', 'all', 'removals', 'text'] }], ['aria-required', { 'type': 'boolean' }], ['aria-roledescription', { type: 'string' }], ['aria-rowcount', { type: 'integer' }], ['aria-rowindex', { type: 'integer' }], ['aria-rowspan', { type: 'integer' }], ['aria-selected', { 'type': 'boolean', 'allowundefined': true }], ['aria-setsize', { 'type': 'integer' }], ['aria-sort', { 'type': 'token', 'values': ['ascending', 'descending', 'none', 'other'] }], ['aria-valuemax', { 'type': 'number' }], ['aria-valuemin', { 'type': 'number' }], ['aria-valuenow', { 'type': 'number' }], ['aria-valuetext', { 'type': 'string' }]]; var ariaPropsMap = { entries: function entries() { return properties; }, forEach: function forEach(fn) { var thisArg = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; var _iterator = _createForOfIteratorHelper$4(properties), _step; try { for (_iterator.s(); !(_step = _iterator.n()).done;) { var _step$value = _slicedToArray$4(_step.value, 2), key = _step$value[0], values = _step$value[1]; fn.call(thisArg, values, key, properties); } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } }, get: function get(key) { var item = properties.find(function (tuple) { return tuple[0] === key ? true : false; }); return item && item[1]; }, has: function has(key) { return !!ariaPropsMap.get(key); }, keys: function keys() { return properties.map(function (_ref) { var _ref2 = _slicedToArray$4(_ref, 1), key = _ref2[0]; return key; }); }, values: function values() { return properties.map(function (_ref3) { var _ref4 = _slicedToArray$4(_ref3, 2), values = _ref4[1]; return values; }); } }; var _default$2h = (0, _iterationDecorator$4.default)(ariaPropsMap, ariaPropsMap.entries()); ariaPropsMap$1.default = _default$2h; var domMap$1 = {}; Object.defineProperty(domMap$1, "__esModule", { value: true }); domMap$1.default = void 0; var _iterationDecorator$3 = _interopRequireDefault$8(iterationDecorator$1); function _interopRequireDefault$8(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _slicedToArray$3(arr, i) { return _arrayWithHoles$3(arr) || _iterableToArrayLimit$3(arr, i) || _unsupportedIterableToArray$3(arr, i) || _nonIterableRest$3(); } function _nonIterableRest$3() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _iterableToArrayLimit$3(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } function _arrayWithHoles$3(arr) { if (Array.isArray(arr)) return arr; } function _createForOfIteratorHelper$3(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray$3(o)) || allowArrayLike) { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e2) { throw _e2; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e3) { didErr = true; err = _e3; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; } function _unsupportedIterableToArray$3(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$3(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray$3(o, minLen); } function _arrayLikeToArray$3(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } var dom$1 = [['a', { reserved: false }], ['abbr', { reserved: false }], ['acronym', { reserved: false }], ['address', { reserved: false }], ['applet', { reserved: false }], ['area', { reserved: false }], ['article', { reserved: false }], ['aside', { reserved: false }], ['audio', { reserved: false }], ['b', { reserved: false }], ['base', { reserved: true }], ['bdi', { reserved: false }], ['bdo', { reserved: false }], ['big', { reserved: false }], ['blink', { reserved: false }], ['blockquote', { reserved: false }], ['body', { reserved: false }], ['br', { reserved: false }], ['button', { reserved: false }], ['canvas', { reserved: false }], ['caption', { reserved: false }], ['center', { reserved: false }], ['cite', { reserved: false }], ['code', { reserved: false }], ['col', { reserved: true }], ['colgroup', { reserved: true }], ['content', { reserved: false }], ['data', { reserved: false }], ['datalist', { reserved: false }], ['dd', { reserved: false }], ['del', { reserved: false }], ['details', { reserved: false }], ['dfn', { reserved: false }], ['dialog', { reserved: false }], ['dir', { reserved: false }], ['div', { reserved: false }], ['dl', { reserved: false }], ['dt', { reserved: false }], ['em', { reserved: false }], ['embed', { reserved: false }], ['fieldset', { reserved: false }], ['figcaption', { reserved: false }], ['figure', { reserved: false }], ['font', { reserved: false }], ['footer', { reserved: false }], ['form', { reserved: false }], ['frame', { reserved: false }], ['frameset', { reserved: false }], ['h1', { reserved: false }], ['h2', { reserved: false }], ['h3', { reserved: false }], ['h4', { reserved: false }], ['h5', { reserved: false }], ['h6', { reserved: false }], ['head', { reserved: true }], ['header', { reserved: false }], ['hgroup', { reserved: false }], ['hr', { reserved: false }], ['html', { reserved: true }], ['i', { reserved: false }], ['iframe', { reserved: false }], ['img', { reserved: false }], ['input', { reserved: false }], ['ins', { reserved: false }], ['kbd', { reserved: false }], ['keygen', { reserved: false }], ['label', { reserved: false }], ['legend', { reserved: false }], ['li', { reserved: false }], ['link', { reserved: true }], ['main', { reserved: false }], ['map', { reserved: false }], ['mark', { reserved: false }], ['marquee', { reserved: false }], ['menu', { reserved: false }], ['menuitem', { reserved: false }], ['meta', { reserved: true }], ['meter', { reserved: false }], ['nav', { reserved: false }], ['noembed', { reserved: true }], ['noscript', { reserved: true }], ['object', { reserved: false }], ['ol', { reserved: false }], ['optgroup', { reserved: false }], ['option', { reserved: false }], ['output', { reserved: false }], ['p', { reserved: false }], ['param', { reserved: true }], ['picture', { reserved: true }], ['pre', { reserved: false }], ['progress', { reserved: false }], ['q', { reserved: false }], ['rp', { reserved: false }], ['rt', { reserved: false }], ['rtc', { reserved: false }], ['ruby', { reserved: false }], ['s', { reserved: false }], ['samp', { reserved: false }], ['script', { reserved: true }], ['section', { reserved: false }], ['select', { reserved: false }], ['small', { reserved: false }], ['source', { reserved: true }], ['spacer', { reserved: false }], ['span', { reserved: false }], ['strike', { reserved: false }], ['strong', { reserved: false }], ['style', { reserved: true }], ['sub', { reserved: false }], ['summary', { reserved: false }], ['sup', { reserved: false }], ['table', { reserved: false }], ['tbody', { reserved: false }], ['td', { reserved: false }], ['textarea', { reserved: false }], ['tfoot', { reserved: false }], ['th', { reserved: false }], ['thead', { reserved: false }], ['time', { reserved: false }], ['title', { reserved: true }], ['tr', { reserved: false }], ['track', { reserved: true }], ['tt', { reserved: false }], ['u', { reserved: false }], ['ul', { reserved: false }], ['var', { reserved: false }], ['video', { reserved: false }], ['wbr', { reserved: false }], ['xmp', { reserved: false }]]; var domMap = { entries: function entries() { return dom$1; }, forEach: function forEach(fn) { var thisArg = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; var _iterator = _createForOfIteratorHelper$3(dom$1), _step; try { for (_iterator.s(); !(_step = _iterator.n()).done;) { var _step$value = _slicedToArray$3(_step.value, 2), key = _step$value[0], values = _step$value[1]; fn.call(thisArg, values, key, dom$1); } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } }, get: function get(key) { var item = dom$1.find(function (tuple) { return tuple[0] === key ? true : false; }); return item && item[1]; }, has: function has(key) { return !!domMap.get(key); }, keys: function keys() { return dom$1.map(function (_ref) { var _ref2 = _slicedToArray$3(_ref, 1), key = _ref2[0]; return key; }); }, values: function values() { return dom$1.map(function (_ref3) { var _ref4 = _slicedToArray$3(_ref3, 2), values = _ref4[1]; return values; }); } }; var _default$2g = (0, _iterationDecorator$3.default)(domMap, domMap.entries()); domMap$1.default = _default$2g; var rolesMap$1 = {}; var ariaAbstractRoles$1 = {}; var commandRole$1 = {}; Object.defineProperty(commandRole$1, "__esModule", { value: true }); commandRole$1.default = void 0; var commandRole = { abstract: true, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: ['author'], prohibitedProps: [], props: {}, relatedConcepts: [], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'widget']] }; var _default$2f = commandRole; commandRole$1.default = _default$2f; var compositeRole$1 = {}; Object.defineProperty(compositeRole$1, "__esModule", { value: true }); compositeRole$1.default = void 0; var compositeRole = { abstract: true, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: ['author'], prohibitedProps: [], props: { 'aria-activedescendant': null, 'aria-disabled': null }, relatedConcepts: [], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'widget']] }; var _default$2e = compositeRole; compositeRole$1.default = _default$2e; var inputRole$1 = {}; Object.defineProperty(inputRole$1, "__esModule", { value: true }); inputRole$1.default = void 0; var inputRole = { abstract: true, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: ['author'], prohibitedProps: [], props: { 'aria-disabled': null }, relatedConcepts: [{ concept: { name: 'input' }, module: 'XForms' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'widget']] }; var _default$2d = inputRole; inputRole$1.default = _default$2d; var landmarkRole$1 = {}; Object.defineProperty(landmarkRole$1, "__esModule", { value: true }); landmarkRole$1.default = void 0; var landmarkRole = { abstract: true, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: ['author'], prohibitedProps: [], props: {}, relatedConcepts: [], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'structure', 'section']] }; var _default$2c = landmarkRole; landmarkRole$1.default = _default$2c; var rangeRole$1 = {}; Object.defineProperty(rangeRole$1, "__esModule", { value: true }); rangeRole$1.default = void 0; var rangeRole = { abstract: true, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: ['author'], prohibitedProps: [], props: { 'aria-valuemax': null, 'aria-valuemin': null, 'aria-valuenow': null }, relatedConcepts: [], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'structure']] }; var _default$2b = rangeRole; rangeRole$1.default = _default$2b; var roletypeRole$1 = {}; Object.defineProperty(roletypeRole$1, "__esModule", { value: true }); roletypeRole$1.default = void 0; var roletypeRole = { abstract: true, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: [], prohibitedProps: [], props: { 'aria-atomic': null, 'aria-busy': null, 'aria-controls': null, 'aria-current': null, 'aria-describedby': null, 'aria-details': null, 'aria-dropeffect': null, 'aria-flowto': null, 'aria-grabbed': null, 'aria-hidden': null, 'aria-keyshortcuts': null, 'aria-label': null, 'aria-labelledby': null, 'aria-live': null, 'aria-owns': null, 'aria-relevant': null, 'aria-roledescription': null }, relatedConcepts: [{ concept: { name: 'role' }, module: 'XHTML' }, { concept: { name: 'type' }, module: 'Dublin Core' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [] }; var _default$2a = roletypeRole; roletypeRole$1.default = _default$2a; var sectionRole$1 = {}; Object.defineProperty(sectionRole$1, "__esModule", { value: true }); sectionRole$1.default = void 0; var sectionRole = { abstract: true, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: [], prohibitedProps: [], props: {}, relatedConcepts: [{ concept: { name: 'frontmatter' }, module: 'DTB' }, { concept: { name: 'level' }, module: 'DTB' }, { concept: { name: 'level' }, module: 'SMIL' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'structure']] }; var _default$29 = sectionRole; sectionRole$1.default = _default$29; var sectionheadRole$1 = {}; Object.defineProperty(sectionheadRole$1, "__esModule", { value: true }); sectionheadRole$1.default = void 0; var sectionheadRole = { abstract: true, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: ['author', 'contents'], prohibitedProps: [], props: {}, relatedConcepts: [], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'structure']] }; var _default$28 = sectionheadRole; sectionheadRole$1.default = _default$28; var selectRole$1 = {}; Object.defineProperty(selectRole$1, "__esModule", { value: true }); selectRole$1.default = void 0; var selectRole = { abstract: true, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: ['author'], prohibitedProps: [], props: { 'aria-orientation': null }, relatedConcepts: [], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'widget', 'composite'], ['roletype', 'structure', 'section', 'group']] }; var _default$27 = selectRole; selectRole$1.default = _default$27; var structureRole$1 = {}; Object.defineProperty(structureRole$1, "__esModule", { value: true }); structureRole$1.default = void 0; var structureRole = { abstract: true, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: [], prohibitedProps: [], props: {}, relatedConcepts: [], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype']] }; var _default$26 = structureRole; structureRole$1.default = _default$26; var widgetRole$1 = {}; Object.defineProperty(widgetRole$1, "__esModule", { value: true }); widgetRole$1.default = void 0; var widgetRole = { abstract: true, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: [], prohibitedProps: [], props: {}, relatedConcepts: [], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype']] }; var _default$25 = widgetRole; widgetRole$1.default = _default$25; var windowRole$1 = {}; Object.defineProperty(windowRole$1, "__esModule", { value: true }); windowRole$1.default = void 0; var windowRole = { abstract: true, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: ['author'], prohibitedProps: [], props: { 'aria-modal': null }, relatedConcepts: [], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype']] }; var _default$24 = windowRole; windowRole$1.default = _default$24; Object.defineProperty(ariaAbstractRoles$1, "__esModule", { value: true }); ariaAbstractRoles$1.default = void 0; var _commandRole = _interopRequireDefault$7(commandRole$1); var _compositeRole = _interopRequireDefault$7(compositeRole$1); var _inputRole = _interopRequireDefault$7(inputRole$1); var _landmarkRole = _interopRequireDefault$7(landmarkRole$1); var _rangeRole = _interopRequireDefault$7(rangeRole$1); var _roletypeRole = _interopRequireDefault$7(roletypeRole$1); var _sectionRole = _interopRequireDefault$7(sectionRole$1); var _sectionheadRole = _interopRequireDefault$7(sectionheadRole$1); var _selectRole = _interopRequireDefault$7(selectRole$1); var _structureRole = _interopRequireDefault$7(structureRole$1); var _widgetRole = _interopRequireDefault$7(widgetRole$1); var _windowRole = _interopRequireDefault$7(windowRole$1); function _interopRequireDefault$7(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var ariaAbstractRoles = [['command', _commandRole.default], ['composite', _compositeRole.default], ['input', _inputRole.default], ['landmark', _landmarkRole.default], ['range', _rangeRole.default], ['roletype', _roletypeRole.default], ['section', _sectionRole.default], ['sectionhead', _sectionheadRole.default], ['select', _selectRole.default], ['structure', _structureRole.default], ['widget', _widgetRole.default], ['window', _windowRole.default]]; var _default$23 = ariaAbstractRoles; ariaAbstractRoles$1.default = _default$23; var ariaLiteralRoles$1 = {}; var alertRole$1 = {}; Object.defineProperty(alertRole$1, "__esModule", { value: true }); alertRole$1.default = void 0; var alertRole = { abstract: false, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: ['author'], prohibitedProps: [], props: { 'aria-atomic': 'true', 'aria-live': 'assertive' }, relatedConcepts: [{ concept: { name: 'alert' }, module: 'XForms' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'structure', 'section']] }; var _default$22 = alertRole; alertRole$1.default = _default$22; var alertdialogRole$1 = {}; Object.defineProperty(alertdialogRole$1, "__esModule", { value: true }); alertdialogRole$1.default = void 0; var alertdialogRole = { abstract: false, accessibleNameRequired: true, baseConcepts: [], childrenPresentational: false, nameFrom: ['author'], prohibitedProps: [], props: {}, relatedConcepts: [{ concept: { name: 'alert' }, module: 'XForms' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'structure', 'section', 'alert'], ['roletype', 'window', 'dialog']] }; var _default$21 = alertdialogRole; alertdialogRole$1.default = _default$21; var applicationRole$1 = {}; Object.defineProperty(applicationRole$1, "__esModule", { value: true }); applicationRole$1.default = void 0; var applicationRole = { abstract: false, accessibleNameRequired: true, baseConcepts: [], childrenPresentational: false, nameFrom: ['author'], prohibitedProps: [], props: { 'aria-activedescendant': null, 'aria-disabled': null, 'aria-errormessage': null, 'aria-expanded': null, 'aria-haspopup': null, 'aria-invalid': null }, relatedConcepts: [{ concept: { name: 'Device Independence Delivery Unit' } }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'structure']] }; var _default$20 = applicationRole; applicationRole$1.default = _default$20; var articleRole$1 = {}; Object.defineProperty(articleRole$1, "__esModule", { value: true }); articleRole$1.default = void 0; var articleRole = { abstract: false, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: ['author'], prohibitedProps: [], props: { 'aria-posinset': null, 'aria-setsize': null }, relatedConcepts: [{ concept: { name: 'article' }, module: 'HTML' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'structure', 'document']] }; var _default$1$ = articleRole; articleRole$1.default = _default$1$; var bannerRole$1 = {}; Object.defineProperty(bannerRole$1, "__esModule", { value: true }); bannerRole$1.default = void 0; var bannerRole = { abstract: false, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: ['author'], prohibitedProps: [], props: {}, relatedConcepts: [{ concept: { constraints: ['scoped to the body element'], name: 'header' }, module: 'HTML' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'structure', 'section', 'landmark']] }; var _default$1_ = bannerRole; bannerRole$1.default = _default$1_; var blockquoteRole$1 = {}; Object.defineProperty(blockquoteRole$1, "__esModule", { value: true }); blockquoteRole$1.default = void 0; var blockquoteRole = { abstract: false, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: ['author'], prohibitedProps: [], props: {}, relatedConcepts: [{ concept: { name: 'blockquote' }, module: 'HTML' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'structure', 'section']] }; var _default$1Z = blockquoteRole; blockquoteRole$1.default = _default$1Z; var buttonRole$1 = {}; Object.defineProperty(buttonRole$1, "__esModule", { value: true }); buttonRole$1.default = void 0; var buttonRole = { abstract: false, accessibleNameRequired: true, baseConcepts: [], childrenPresentational: true, nameFrom: ['author', 'contents'], prohibitedProps: [], props: { 'aria-disabled': null, 'aria-expanded': null, 'aria-haspopup': null, 'aria-pressed': null }, relatedConcepts: [{ concept: { attributes: [{ name: 'type', value: 'button' }], name: 'input' }, module: 'HTML' }, { concept: { attributes: [{ name: 'type', value: 'image' }], name: 'input' }, module: 'HTML' }, { concept: { attributes: [{ name: 'type', value: 'reset' }], name: 'input' }, module: 'HTML' }, { concept: { attributes: [{ name: 'type', value: 'submit' }], name: 'input' }, module: 'HTML' }, { concept: { name: 'button' }, module: 'HTML' }, { concept: { name: 'trigger' }, module: 'XForms' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'widget', 'command']] }; var _default$1Y = buttonRole; buttonRole$1.default = _default$1Y; var captionRole$1 = {}; Object.defineProperty(captionRole$1, "__esModule", { value: true }); captionRole$1.default = void 0; var captionRole = { abstract: false, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: ['prohibited'], prohibitedProps: ['aria-label', 'aria-labelledby'], props: {}, relatedConcepts: [{ concept: { name: 'caption' }, module: 'HTML' }], requireContextRole: ['figure', 'grid', 'table'], requiredContextRole: ['figure', 'grid', 'table'], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'structure', 'section']] }; var _default$1X = captionRole; captionRole$1.default = _default$1X; var cellRole$1 = {}; Object.defineProperty(cellRole$1, "__esModule", { value: true }); cellRole$1.default = void 0; var cellRole = { abstract: false, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: ['author', 'contents'], prohibitedProps: [], props: { 'aria-colindex': null, 'aria-colspan': null, 'aria-rowindex': null, 'aria-rowspan': null }, relatedConcepts: [{ concept: { constraints: ['ancestor table element has table role'], name: 'td' }, module: 'HTML' }], requireContextRole: ['row'], requiredContextRole: ['row'], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'structure', 'section']] }; var _default$1W = cellRole; cellRole$1.default = _default$1W; var checkboxRole$1 = {}; Object.defineProperty(checkboxRole$1, "__esModule", { value: true }); checkboxRole$1.default = void 0; var checkboxRole = { abstract: false, accessibleNameRequired: true, baseConcepts: [], childrenPresentational: true, nameFrom: ['author', 'contents'], prohibitedProps: [], props: { 'aria-checked': null, 'aria-errormessage': null, 'aria-expanded': null, 'aria-invalid': null, 'aria-readonly': null, 'aria-required': null }, relatedConcepts: [{ concept: { attributes: [{ name: 'type', value: 'checkbox' }], name: 'input' }, module: 'HTML' }, { concept: { name: 'option' }, module: 'ARIA' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: { 'aria-checked': null }, superClass: [['roletype', 'widget', 'input']] }; var _default$1V = checkboxRole; checkboxRole$1.default = _default$1V; var codeRole$1 = {}; Object.defineProperty(codeRole$1, "__esModule", { value: true }); codeRole$1.default = void 0; var codeRole = { abstract: false, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: ['prohibited'], prohibitedProps: ['aria-label', 'aria-labelledby'], props: {}, relatedConcepts: [{ concept: { name: 'code' }, module: 'HTML' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'structure', 'section']] }; var _default$1U = codeRole; codeRole$1.default = _default$1U; var columnheaderRole$1 = {}; Object.defineProperty(columnheaderRole$1, "__esModule", { value: true }); columnheaderRole$1.default = void 0; var columnheaderRole = { abstract: false, accessibleNameRequired: true, baseConcepts: [], childrenPresentational: false, nameFrom: ['author', 'contents'], prohibitedProps: [], props: { 'aria-sort': null }, relatedConcepts: [{ concept: { name: 'th' }, module: 'HTML' }, { concept: { attributes: [{ name: 'scope', value: 'col' }], name: 'th' }, module: 'HTML' }, { concept: { attributes: [{ name: 'scope', value: 'colgroup' }], name: 'th' }, module: 'HTML' }], requireContextRole: ['row'], requiredContextRole: ['row'], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'structure', 'section', 'cell'], ['roletype', 'structure', 'section', 'cell', 'gridcell'], ['roletype', 'widget', 'gridcell'], ['roletype', 'structure', 'sectionhead']] }; var _default$1T = columnheaderRole; columnheaderRole$1.default = _default$1T; var comboboxRole$1 = {}; Object.defineProperty(comboboxRole$1, "__esModule", { value: true }); comboboxRole$1.default = void 0; var comboboxRole = { abstract: false, accessibleNameRequired: true, baseConcepts: [], childrenPresentational: false, nameFrom: ['author'], prohibitedProps: [], props: { 'aria-activedescendant': null, 'aria-autocomplete': null, 'aria-errormessage': null, 'aria-invalid': null, 'aria-readonly': null, 'aria-required': null, 'aria-expanded': 'false', 'aria-haspopup': 'listbox' }, relatedConcepts: [{ concept: { attributes: [{ constraints: ['set'], name: 'list' }, { name: 'type', value: 'email' }], name: 'input' }, module: 'HTML' }, { concept: { attributes: [{ constraints: ['set'], name: 'list' }, { name: 'type', value: 'search' }], name: 'input' }, module: 'HTML' }, { concept: { attributes: [{ constraints: ['set'], name: 'list' }, { name: 'type', value: 'tel' }], name: 'input' }, module: 'HTML' }, { concept: { attributes: [{ constraints: ['set'], name: 'list' }, { name: 'type', value: 'text' }], name: 'input' }, module: 'HTML' }, { concept: { attributes: [{ constraints: ['set'], name: 'list' }, { name: 'type', value: 'url' }], name: 'input' }, module: 'HTML' }, { concept: { attributes: [{ constraints: ['set'], name: 'list' }, { name: 'type', value: 'url' }], name: 'input' }, module: 'HTML' }, { concept: { attributes: [{ constraints: ['undefined'], name: 'multiple' }, { constraints: ['undefined'], name: 'size' }], constraints: ['the multiple attribute is not set and the size attribute does not have a value greater than 1'], name: 'select' }, module: 'HTML' }, { concept: { name: 'select' }, module: 'XForms' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: { 'aria-controls': null, 'aria-expanded': 'false' }, superClass: [['roletype', 'widget', 'input']] }; var _default$1S = comboboxRole; comboboxRole$1.default = _default$1S; var complementaryRole$1 = {}; Object.defineProperty(complementaryRole$1, "__esModule", { value: true }); complementaryRole$1.default = void 0; var complementaryRole = { abstract: false, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: ['author'], prohibitedProps: [], props: {}, relatedConcepts: [{ concept: { name: 'aside' }, module: 'HTML' }, { concept: { attributes: [{ constraints: ['set'], name: 'aria-label' }], constraints: ['scoped to a sectioning content element', 'scoped to a sectioning root element other than body'], name: 'aside' }, module: 'HTML' }, { concept: { attributes: [{ constraints: ['set'], name: 'aria-labelledby' }], constraints: ['scoped to a sectioning content element', 'scoped to a sectioning root element other than body'], name: 'aside' }, module: 'HTML' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'structure', 'section', 'landmark']] }; var _default$1R = complementaryRole; complementaryRole$1.default = _default$1R; var contentinfoRole$1 = {}; Object.defineProperty(contentinfoRole$1, "__esModule", { value: true }); contentinfoRole$1.default = void 0; var contentinfoRole = { abstract: false, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: ['author'], prohibitedProps: [], props: {}, relatedConcepts: [{ concept: { constraints: ['scoped to the body element'], name: 'footer' }, module: 'HTML' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'structure', 'section', 'landmark']] }; var _default$1Q = contentinfoRole; contentinfoRole$1.default = _default$1Q; var definitionRole$1 = {}; Object.defineProperty(definitionRole$1, "__esModule", { value: true }); definitionRole$1.default = void 0; var definitionRole = { abstract: false, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: ['author'], prohibitedProps: [], props: {}, relatedConcepts: [{ concept: { name: 'dd' }, module: 'HTML' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'structure', 'section']] }; var _default$1P = definitionRole; definitionRole$1.default = _default$1P; var deletionRole$1 = {}; Object.defineProperty(deletionRole$1, "__esModule", { value: true }); deletionRole$1.default = void 0; var deletionRole = { abstract: false, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: ['prohibited'], prohibitedProps: ['aria-label', 'aria-labelledby'], props: {}, relatedConcepts: [{ concept: { name: 'del' }, module: 'HTML' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'structure', 'section']] }; var _default$1O = deletionRole; deletionRole$1.default = _default$1O; var dialogRole$1 = {}; Object.defineProperty(dialogRole$1, "__esModule", { value: true }); dialogRole$1.default = void 0; var dialogRole = { abstract: false, accessibleNameRequired: true, baseConcepts: [], childrenPresentational: false, nameFrom: ['author'], prohibitedProps: [], props: {}, relatedConcepts: [{ concept: { name: 'dialog' }, module: 'HTML' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'window']] }; var _default$1N = dialogRole; dialogRole$1.default = _default$1N; var directoryRole$1 = {}; Object.defineProperty(directoryRole$1, "__esModule", { value: true }); directoryRole$1.default = void 0; var directoryRole = { abstract: false, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: ['author'], prohibitedProps: [], props: {}, relatedConcepts: [{ module: 'DAISY Guide' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'structure', 'section', 'list']] }; var _default$1M = directoryRole; directoryRole$1.default = _default$1M; var documentRole$1 = {}; Object.defineProperty(documentRole$1, "__esModule", { value: true }); documentRole$1.default = void 0; var documentRole = { abstract: false, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: ['author'], prohibitedProps: [], props: {}, relatedConcepts: [{ concept: { name: 'Device Independence Delivery Unit' } }, { concept: { name: 'html' }, module: 'HTML' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'structure']] }; var _default$1L = documentRole; documentRole$1.default = _default$1L; var emphasisRole$1 = {}; Object.defineProperty(emphasisRole$1, "__esModule", { value: true }); emphasisRole$1.default = void 0; var emphasisRole = { abstract: false, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: ['prohibited'], prohibitedProps: ['aria-label', 'aria-labelledby'], props: {}, relatedConcepts: [{ concept: { name: 'em' }, module: 'HTML' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'structure', 'section']] }; var _default$1K = emphasisRole; emphasisRole$1.default = _default$1K; var feedRole$1 = {}; Object.defineProperty(feedRole$1, "__esModule", { value: true }); feedRole$1.default = void 0; var feedRole = { abstract: false, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: ['author'], prohibitedProps: [], props: {}, relatedConcepts: [], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [['article']], requiredProps: {}, superClass: [['roletype', 'structure', 'section', 'list']] }; var _default$1J = feedRole; feedRole$1.default = _default$1J; var figureRole$1 = {}; Object.defineProperty(figureRole$1, "__esModule", { value: true }); figureRole$1.default = void 0; var figureRole = { abstract: false, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: ['author'], prohibitedProps: [], props: {}, relatedConcepts: [{ concept: { name: 'figure' }, module: 'HTML' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'structure', 'section']] }; var _default$1I = figureRole; figureRole$1.default = _default$1I; var formRole$1 = {}; Object.defineProperty(formRole$1, "__esModule", { value: true }); formRole$1.default = void 0; var formRole = { abstract: false, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: ['author'], prohibitedProps: [], props: {}, relatedConcepts: [{ concept: { attributes: [{ constraints: ['set'], name: 'aria-label' }], name: 'form' }, module: 'HTML' }, { concept: { attributes: [{ constraints: ['set'], name: 'aria-labelledby' }], name: 'form' }, module: 'HTML' }, { concept: { attributes: [{ constraints: ['set'], name: 'name' }], name: 'form' }, module: 'HTML' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'structure', 'section', 'landmark']] }; var _default$1H = formRole; formRole$1.default = _default$1H; var genericRole$1 = {}; Object.defineProperty(genericRole$1, "__esModule", { value: true }); genericRole$1.default = void 0; var genericRole = { abstract: false, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: ['prohibited'], prohibitedProps: ['aria-label', 'aria-labelledby'], props: {}, relatedConcepts: [{ concept: { name: 'a' }, module: 'HTML' }, { concept: { name: 'area' }, module: 'HTML' }, { concept: { name: 'aside' }, module: 'HTML' }, { concept: { name: 'b' }, module: 'HTML' }, { concept: { name: 'bdo' }, module: 'HTML' }, { concept: { name: 'body' }, module: 'HTML' }, { concept: { name: 'data' }, module: 'HTML' }, { concept: { name: 'div' }, module: 'HTML' }, { concept: { constraints: ['scoped to the main element', 'scoped to a sectioning content element', 'scoped to a sectioning root element other than body'], name: 'footer' }, module: 'HTML' }, { concept: { constraints: ['scoped to the main element', 'scoped to a sectioning content element', 'scoped to a sectioning root element other than body'], name: 'header' }, module: 'HTML' }, { concept: { name: 'hgroup' }, module: 'HTML' }, { concept: { name: 'i' }, module: 'HTML' }, { concept: { name: 'pre' }, module: 'HTML' }, { concept: { name: 'q' }, module: 'HTML' }, { concept: { name: 'samp' }, module: 'HTML' }, { concept: { name: 'section' }, module: 'HTML' }, { concept: { name: 'small' }, module: 'HTML' }, { concept: { name: 'span' }, module: 'HTML' }, { concept: { name: 'u' }, module: 'HTML' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'structure']] }; var _default$1G = genericRole; genericRole$1.default = _default$1G; var gridRole$1 = {}; Object.defineProperty(gridRole$1, "__esModule", { value: true }); gridRole$1.default = void 0; var gridRole = { abstract: false, accessibleNameRequired: true, baseConcepts: [], childrenPresentational: false, nameFrom: ['author'], prohibitedProps: [], props: { 'aria-multiselectable': null, 'aria-readonly': null }, relatedConcepts: [], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [['row'], ['row', 'rowgroup']], requiredProps: {}, superClass: [['roletype', 'widget', 'composite'], ['roletype', 'structure', 'section', 'table']] }; var _default$1F = gridRole; gridRole$1.default = _default$1F; var gridcellRole$1 = {}; Object.defineProperty(gridcellRole$1, "__esModule", { value: true }); gridcellRole$1.default = void 0; var gridcellRole = { abstract: false, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: ['author', 'contents'], prohibitedProps: [], props: { 'aria-disabled': null, 'aria-errormessage': null, 'aria-expanded': null, 'aria-haspopup': null, 'aria-invalid': null, 'aria-readonly': null, 'aria-required': null, 'aria-selected': null }, relatedConcepts: [{ concept: { constraints: ['ancestor table element has grid role', 'ancestor table element has treegrid role'], name: 'td' }, module: 'HTML' }], requireContextRole: ['row'], requiredContextRole: ['row'], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'structure', 'section', 'cell'], ['roletype', 'widget']] }; var _default$1E = gridcellRole; gridcellRole$1.default = _default$1E; var groupRole$1 = {}; Object.defineProperty(groupRole$1, "__esModule", { value: true }); groupRole$1.default = void 0; var groupRole = { abstract: false, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: ['author'], prohibitedProps: [], props: { 'aria-activedescendant': null, 'aria-disabled': null }, relatedConcepts: [{ concept: { name: 'details' }, module: 'HTML' }, { concept: { name: 'fieldset' }, module: 'HTML' }, { concept: { name: 'optgroup' }, module: 'HTML' }, { concept: { name: 'address' }, module: 'HTML' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'structure', 'section']] }; var _default$1D = groupRole; groupRole$1.default = _default$1D; var headingRole$1 = {}; Object.defineProperty(headingRole$1, "__esModule", { value: true }); headingRole$1.default = void 0; var headingRole = { abstract: false, accessibleNameRequired: true, baseConcepts: [], childrenPresentational: false, nameFrom: ['author', 'contents'], prohibitedProps: [], props: { 'aria-level': '2' }, relatedConcepts: [{ concept: { name: 'h1' }, module: 'HTML' }, { concept: { name: 'h2' }, module: 'HTML' }, { concept: { name: 'h3' }, module: 'HTML' }, { concept: { name: 'h4' }, module: 'HTML' }, { concept: { name: 'h5' }, module: 'HTML' }, { concept: { name: 'h6' }, module: 'HTML' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: { 'aria-level': '2' }, superClass: [['roletype', 'structure', 'sectionhead']] }; var _default$1C = headingRole; headingRole$1.default = _default$1C; var imgRole$1 = {}; Object.defineProperty(imgRole$1, "__esModule", { value: true }); imgRole$1.default = void 0; var imgRole = { abstract: false, accessibleNameRequired: true, baseConcepts: [], childrenPresentational: true, nameFrom: ['author'], prohibitedProps: [], props: {}, relatedConcepts: [{ concept: { attributes: [{ constraints: ['set'], name: 'alt' }], name: 'img' }, module: 'HTML' }, { concept: { attributes: [{ constraints: ['undefined'], name: 'alt' }], name: 'img' }, module: 'HTML' }, { concept: { name: 'imggroup' }, module: 'DTB' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'structure', 'section']] }; var _default$1B = imgRole; imgRole$1.default = _default$1B; var insertionRole$1 = {}; Object.defineProperty(insertionRole$1, "__esModule", { value: true }); insertionRole$1.default = void 0; var insertionRole = { abstract: false, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: ['prohibited'], prohibitedProps: ['aria-label', 'aria-labelledby'], props: {}, relatedConcepts: [{ concept: { name: 'ins' }, module: 'HTML' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'structure', 'section']] }; var _default$1A = insertionRole; insertionRole$1.default = _default$1A; var linkRole$1 = {}; Object.defineProperty(linkRole$1, "__esModule", { value: true }); linkRole$1.default = void 0; var linkRole = { abstract: false, accessibleNameRequired: true, baseConcepts: [], childrenPresentational: false, nameFrom: ['author', 'contents'], prohibitedProps: [], props: { 'aria-disabled': null, 'aria-expanded': null, 'aria-haspopup': null }, relatedConcepts: [{ concept: { attributes: [{ constraints: ['set'], name: 'href' }], name: 'a' }, module: 'HTML' }, { concept: { attributes: [{ constraints: ['set'], name: 'href' }], name: 'area' }, module: 'HTML' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'widget', 'command']] }; var _default$1z = linkRole; linkRole$1.default = _default$1z; var listRole$1 = {}; Object.defineProperty(listRole$1, "__esModule", { value: true }); listRole$1.default = void 0; var listRole = { abstract: false, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: ['author'], prohibitedProps: [], props: {}, relatedConcepts: [{ concept: { name: 'menu' }, module: 'HTML' }, { concept: { name: 'ol' }, module: 'HTML' }, { concept: { name: 'ul' }, module: 'HTML' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [['listitem']], requiredProps: {}, superClass: [['roletype', 'structure', 'section']] }; var _default$1y = listRole; listRole$1.default = _default$1y; var listboxRole$1 = {}; Object.defineProperty(listboxRole$1, "__esModule", { value: true }); listboxRole$1.default = void 0; var listboxRole = { abstract: false, accessibleNameRequired: true, baseConcepts: [], childrenPresentational: false, nameFrom: ['author'], prohibitedProps: [], props: { 'aria-errormessage': null, 'aria-expanded': null, 'aria-invalid': null, 'aria-multiselectable': null, 'aria-readonly': null, 'aria-required': null, 'aria-orientation': 'vertical' }, relatedConcepts: [{ concept: { attributes: [{ constraints: ['>1'], name: 'size' }], constraints: ['the size attribute value is greater than 1'], name: 'select' }, module: 'HTML' }, { concept: { attributes: [{ name: 'multiple' }], name: 'select' }, module: 'HTML' }, { concept: { name: 'datalist' }, module: 'HTML' }, { concept: { name: 'list' }, module: 'ARIA' }, { concept: { name: 'select' }, module: 'XForms' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [['option', 'group'], ['option']], requiredProps: {}, superClass: [['roletype', 'widget', 'composite', 'select'], ['roletype', 'structure', 'section', 'group', 'select']] }; var _default$1x = listboxRole; listboxRole$1.default = _default$1x; var listitemRole$1 = {}; Object.defineProperty(listitemRole$1, "__esModule", { value: true }); listitemRole$1.default = void 0; var listitemRole = { abstract: false, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: ['author'], prohibitedProps: [], props: { 'aria-level': null, 'aria-posinset': null, 'aria-setsize': null }, relatedConcepts: [{ concept: { constraints: ['direct descendant of ol', 'direct descendant of ul', 'direct descendant of menu'], name: 'li' }, module: 'HTML' }, { concept: { name: 'item' }, module: 'XForms' }], requireContextRole: ['directory', 'list'], requiredContextRole: ['directory', 'list'], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'structure', 'section']] }; var _default$1w = listitemRole; listitemRole$1.default = _default$1w; var logRole$1 = {}; Object.defineProperty(logRole$1, "__esModule", { value: true }); logRole$1.default = void 0; var logRole = { abstract: false, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: ['author'], prohibitedProps: [], props: { 'aria-live': 'polite' }, relatedConcepts: [], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'structure', 'section']] }; var _default$1v = logRole; logRole$1.default = _default$1v; var mainRole$1 = {}; Object.defineProperty(mainRole$1, "__esModule", { value: true }); mainRole$1.default = void 0; var mainRole = { abstract: false, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: ['author'], prohibitedProps: [], props: {}, relatedConcepts: [{ concept: { name: 'main' }, module: 'HTML' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'structure', 'section', 'landmark']] }; var _default$1u = mainRole; mainRole$1.default = _default$1u; var markRole$1 = {}; Object.defineProperty(markRole$1, "__esModule", { value: true }); markRole$1.default = void 0; var markRole = { abstract: false, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: ['prohibited'], prohibitedProps: [], props: { 'aria-braillelabel': null, 'aria-brailleroledescription': null, 'aria-description': null }, relatedConcepts: [{ concept: { name: 'mark' }, module: 'HTML' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'structure', 'section']] }; var _default$1t = markRole; markRole$1.default = _default$1t; var marqueeRole$1 = {}; Object.defineProperty(marqueeRole$1, "__esModule", { value: true }); marqueeRole$1.default = void 0; var marqueeRole = { abstract: false, accessibleNameRequired: true, baseConcepts: [], childrenPresentational: false, nameFrom: ['author'], prohibitedProps: [], props: {}, relatedConcepts: [], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'structure', 'section']] }; var _default$1s = marqueeRole; marqueeRole$1.default = _default$1s; var mathRole$1 = {}; Object.defineProperty(mathRole$1, "__esModule", { value: true }); mathRole$1.default = void 0; var mathRole = { abstract: false, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: ['author'], prohibitedProps: [], props: {}, relatedConcepts: [{ concept: { name: 'math' }, module: 'HTML' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'structure', 'section']] }; var _default$1r = mathRole; mathRole$1.default = _default$1r; var menuRole$1 = {}; Object.defineProperty(menuRole$1, "__esModule", { value: true }); menuRole$1.default = void 0; var menuRole = { abstract: false, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: ['author'], prohibitedProps: [], props: { 'aria-orientation': 'vertical' }, relatedConcepts: [{ concept: { name: 'MENU' }, module: 'JAPI' }, { concept: { name: 'list' }, module: 'ARIA' }, { concept: { name: 'select' }, module: 'XForms' }, { concept: { name: 'sidebar' }, module: 'DTB' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [['menuitem', 'group'], ['menuitemradio', 'group'], ['menuitemcheckbox', 'group'], ['menuitem'], ['menuitemcheckbox'], ['menuitemradio']], requiredProps: {}, superClass: [['roletype', 'widget', 'composite', 'select'], ['roletype', 'structure', 'section', 'group', 'select']] }; var _default$1q = menuRole; menuRole$1.default = _default$1q; var menubarRole$1 = {}; Object.defineProperty(menubarRole$1, "__esModule", { value: true }); menubarRole$1.default = void 0; var menubarRole = { abstract: false, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: ['author'], prohibitedProps: [], props: { 'aria-orientation': 'horizontal' }, relatedConcepts: [{ concept: { name: 'toolbar' }, module: 'ARIA' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [['menuitem', 'group'], ['menuitemradio', 'group'], ['menuitemcheckbox', 'group'], ['menuitem'], ['menuitemcheckbox'], ['menuitemradio']], requiredProps: {}, superClass: [['roletype', 'widget', 'composite', 'select', 'menu'], ['roletype', 'structure', 'section', 'group', 'select', 'menu']] }; var _default$1p = menubarRole; menubarRole$1.default = _default$1p; var menuitemRole$1 = {}; Object.defineProperty(menuitemRole$1, "__esModule", { value: true }); menuitemRole$1.default = void 0; var menuitemRole = { abstract: false, accessibleNameRequired: true, baseConcepts: [], childrenPresentational: false, nameFrom: ['author', 'contents'], prohibitedProps: [], props: { 'aria-disabled': null, 'aria-expanded': null, 'aria-haspopup': null, 'aria-posinset': null, 'aria-setsize': null }, relatedConcepts: [{ concept: { name: 'MENU_ITEM' }, module: 'JAPI' }, { concept: { name: 'listitem' }, module: 'ARIA' }, { concept: { name: 'option' }, module: 'ARIA' }], requireContextRole: ['group', 'menu', 'menubar'], requiredContextRole: ['group', 'menu', 'menubar'], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'widget', 'command']] }; var _default$1o = menuitemRole; menuitemRole$1.default = _default$1o; var menuitemcheckboxRole$1 = {}; Object.defineProperty(menuitemcheckboxRole$1, "__esModule", { value: true }); menuitemcheckboxRole$1.default = void 0; var menuitemcheckboxRole = { abstract: false, accessibleNameRequired: true, baseConcepts: [], childrenPresentational: true, nameFrom: ['author', 'contents'], prohibitedProps: [], props: {}, relatedConcepts: [{ concept: { name: 'menuitem' }, module: 'ARIA' }], requireContextRole: ['group', 'menu', 'menubar'], requiredContextRole: ['group', 'menu', 'menubar'], requiredOwnedElements: [], requiredProps: { 'aria-checked': null }, superClass: [['roletype', 'widget', 'input', 'checkbox'], ['roletype', 'widget', 'command', 'menuitem']] }; var _default$1n = menuitemcheckboxRole; menuitemcheckboxRole$1.default = _default$1n; var menuitemradioRole$1 = {}; Object.defineProperty(menuitemradioRole$1, "__esModule", { value: true }); menuitemradioRole$1.default = void 0; var menuitemradioRole = { abstract: false, accessibleNameRequired: true, baseConcepts: [], childrenPresentational: true, nameFrom: ['author', 'contents'], prohibitedProps: [], props: {}, relatedConcepts: [{ concept: { name: 'menuitem' }, module: 'ARIA' }], requireContextRole: ['group', 'menu', 'menubar'], requiredContextRole: ['group', 'menu', 'menubar'], requiredOwnedElements: [], requiredProps: { 'aria-checked': null }, superClass: [['roletype', 'widget', 'input', 'checkbox', 'menuitemcheckbox'], ['roletype', 'widget', 'command', 'menuitem', 'menuitemcheckbox'], ['roletype', 'widget', 'input', 'radio']] }; var _default$1m = menuitemradioRole; menuitemradioRole$1.default = _default$1m; var meterRole$1 = {}; Object.defineProperty(meterRole$1, "__esModule", { value: true }); meterRole$1.default = void 0; var meterRole = { abstract: false, accessibleNameRequired: true, baseConcepts: [], childrenPresentational: true, nameFrom: ['author'], prohibitedProps: [], props: { 'aria-valuetext': null, 'aria-valuemax': '100', 'aria-valuemin': '0' }, relatedConcepts: [{ concept: { name: 'meter' }, module: 'HTML' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: { 'aria-valuenow': null }, superClass: [['roletype', 'structure', 'range']] }; var _default$1l = meterRole; meterRole$1.default = _default$1l; var navigationRole$1 = {}; Object.defineProperty(navigationRole$1, "__esModule", { value: true }); navigationRole$1.default = void 0; var navigationRole = { abstract: false, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: ['author'], prohibitedProps: [], props: {}, relatedConcepts: [{ concept: { name: 'nav' }, module: 'HTML' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'structure', 'section', 'landmark']] }; var _default$1k = navigationRole; navigationRole$1.default = _default$1k; var noneRole$1 = {}; Object.defineProperty(noneRole$1, "__esModule", { value: true }); noneRole$1.default = void 0; var noneRole = { abstract: false, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: [], prohibitedProps: [], props: {}, relatedConcepts: [], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [] }; var _default$1j = noneRole; noneRole$1.default = _default$1j; var noteRole$1 = {}; Object.defineProperty(noteRole$1, "__esModule", { value: true }); noteRole$1.default = void 0; var noteRole = { abstract: false, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: ['author'], prohibitedProps: [], props: {}, relatedConcepts: [], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'structure', 'section']] }; var _default$1i = noteRole; noteRole$1.default = _default$1i; var optionRole$1 = {}; Object.defineProperty(optionRole$1, "__esModule", { value: true }); optionRole$1.default = void 0; var optionRole = { abstract: false, accessibleNameRequired: true, baseConcepts: [], childrenPresentational: true, nameFrom: ['author', 'contents'], prohibitedProps: [], props: { 'aria-checked': null, 'aria-posinset': null, 'aria-setsize': null, 'aria-selected': 'false' }, relatedConcepts: [{ concept: { name: 'item' }, module: 'XForms' }, { concept: { name: 'listitem' }, module: 'ARIA' }, { concept: { name: 'option' }, module: 'HTML' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: { 'aria-selected': 'false' }, superClass: [['roletype', 'widget', 'input']] }; var _default$1h = optionRole; optionRole$1.default = _default$1h; var paragraphRole$1 = {}; Object.defineProperty(paragraphRole$1, "__esModule", { value: true }); paragraphRole$1.default = void 0; var paragraphRole = { abstract: false, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: ['prohibited'], prohibitedProps: ['aria-label', 'aria-labelledby'], props: {}, relatedConcepts: [{ concept: { name: 'p' }, module: 'HTML' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'structure', 'section']] }; var _default$1g = paragraphRole; paragraphRole$1.default = _default$1g; var presentationRole$1 = {}; Object.defineProperty(presentationRole$1, "__esModule", { value: true }); presentationRole$1.default = void 0; var presentationRole = { abstract: false, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: ['prohibited'], prohibitedProps: ['aria-label', 'aria-labelledby'], props: {}, relatedConcepts: [{ concept: { attributes: [{ name: 'alt', value: '' }], name: 'img' }, module: 'HTML' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'structure']] }; var _default$1f = presentationRole; presentationRole$1.default = _default$1f; var progressbarRole$1 = {}; Object.defineProperty(progressbarRole$1, "__esModule", { value: true }); progressbarRole$1.default = void 0; var progressbarRole = { abstract: false, accessibleNameRequired: true, baseConcepts: [], childrenPresentational: true, nameFrom: ['author'], prohibitedProps: [], props: { 'aria-valuetext': null }, relatedConcepts: [{ concept: { name: 'progress' }, module: 'HTML' }, { concept: { name: 'status' }, module: 'ARIA' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'structure', 'range'], ['roletype', 'widget']] }; var _default$1e = progressbarRole; progressbarRole$1.default = _default$1e; var radioRole$1 = {}; Object.defineProperty(radioRole$1, "__esModule", { value: true }); radioRole$1.default = void 0; var radioRole = { abstract: false, accessibleNameRequired: true, baseConcepts: [], childrenPresentational: true, nameFrom: ['author', 'contents'], prohibitedProps: [], props: { 'aria-checked': null, 'aria-posinset': null, 'aria-setsize': null }, relatedConcepts: [{ concept: { attributes: [{ name: 'type', value: 'radio' }], name: 'input' }, module: 'HTML' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: { 'aria-checked': null }, superClass: [['roletype', 'widget', 'input']] }; var _default$1d = radioRole; radioRole$1.default = _default$1d; var radiogroupRole$1 = {}; Object.defineProperty(radiogroupRole$1, "__esModule", { value: true }); radiogroupRole$1.default = void 0; var radiogroupRole = { abstract: false, accessibleNameRequired: true, baseConcepts: [], childrenPresentational: false, nameFrom: ['author'], prohibitedProps: [], props: { 'aria-errormessage': null, 'aria-invalid': null, 'aria-readonly': null, 'aria-required': null }, relatedConcepts: [{ concept: { name: 'list' }, module: 'ARIA' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [['radio']], requiredProps: {}, superClass: [['roletype', 'widget', 'composite', 'select'], ['roletype', 'structure', 'section', 'group', 'select']] }; var _default$1c = radiogroupRole; radiogroupRole$1.default = _default$1c; var regionRole$1 = {}; Object.defineProperty(regionRole$1, "__esModule", { value: true }); regionRole$1.default = void 0; var regionRole = { abstract: false, accessibleNameRequired: true, baseConcepts: [], childrenPresentational: false, nameFrom: ['author'], prohibitedProps: [], props: {}, relatedConcepts: [{ concept: { attributes: [{ constraints: ['set'], name: 'aria-label' }], name: 'section' }, module: 'HTML' }, { concept: { attributes: [{ constraints: ['set'], name: 'aria-labelledby' }], name: 'section' }, module: 'HTML' }, { concept: { name: 'Device Independence Glossart perceivable unit' } }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'structure', 'section', 'landmark']] }; var _default$1b = regionRole; regionRole$1.default = _default$1b; var rowRole$1 = {}; Object.defineProperty(rowRole$1, "__esModule", { value: true }); rowRole$1.default = void 0; var rowRole = { abstract: false, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: ['author', 'contents'], prohibitedProps: [], props: { 'aria-colindex': null, 'aria-expanded': null, 'aria-level': null, 'aria-posinset': null, 'aria-rowindex': null, 'aria-selected': null, 'aria-setsize': null }, relatedConcepts: [{ concept: { name: 'tr' }, module: 'HTML' }], requireContextRole: ['grid', 'rowgroup', 'table', 'treegrid'], requiredContextRole: ['grid', 'rowgroup', 'table', 'treegrid'], requiredOwnedElements: [['cell'], ['columnheader'], ['gridcell'], ['rowheader']], requiredProps: {}, superClass: [['roletype', 'structure', 'section', 'group'], ['roletype', 'widget']] }; var _default$1a = rowRole; rowRole$1.default = _default$1a; var rowgroupRole$1 = {}; Object.defineProperty(rowgroupRole$1, "__esModule", { value: true }); rowgroupRole$1.default = void 0; var rowgroupRole = { abstract: false, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: ['author', 'contents'], prohibitedProps: [], props: {}, relatedConcepts: [{ concept: { name: 'tbody' }, module: 'HTML' }, { concept: { name: 'tfoot' }, module: 'HTML' }, { concept: { name: 'thead' }, module: 'HTML' }], requireContextRole: ['grid', 'table', 'treegrid'], requiredContextRole: ['grid', 'table', 'treegrid'], requiredOwnedElements: [['row']], requiredProps: {}, superClass: [['roletype', 'structure']] }; var _default$19 = rowgroupRole; rowgroupRole$1.default = _default$19; var rowheaderRole$1 = {}; Object.defineProperty(rowheaderRole$1, "__esModule", { value: true }); rowheaderRole$1.default = void 0; var rowheaderRole = { abstract: false, accessibleNameRequired: true, baseConcepts: [], childrenPresentational: false, nameFrom: ['author', 'contents'], prohibitedProps: [], props: { 'aria-sort': null }, relatedConcepts: [{ concept: { attributes: [{ name: 'scope', value: 'row' }], name: 'th' }, module: 'HTML' }, { concept: { attributes: [{ name: 'scope', value: 'rowgroup' }], name: 'th' }, module: 'HTML' }], requireContextRole: ['row', 'rowgroup'], requiredContextRole: ['row', 'rowgroup'], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'structure', 'section', 'cell'], ['roletype', 'structure', 'section', 'cell', 'gridcell'], ['roletype', 'widget', 'gridcell'], ['roletype', 'structure', 'sectionhead']] }; var _default$18 = rowheaderRole; rowheaderRole$1.default = _default$18; var scrollbarRole$1 = {}; Object.defineProperty(scrollbarRole$1, "__esModule", { value: true }); scrollbarRole$1.default = void 0; var scrollbarRole = { abstract: false, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: true, nameFrom: ['author'], prohibitedProps: [], props: { 'aria-disabled': null, 'aria-valuetext': null, 'aria-orientation': 'vertical', 'aria-valuemax': '100', 'aria-valuemin': '0' }, relatedConcepts: [], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: { 'aria-controls': null, 'aria-valuenow': null }, superClass: [['roletype', 'structure', 'range'], ['roletype', 'widget']] }; var _default$17 = scrollbarRole; scrollbarRole$1.default = _default$17; var searchRole$1 = {}; Object.defineProperty(searchRole$1, "__esModule", { value: true }); searchRole$1.default = void 0; var searchRole = { abstract: false, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: ['author'], prohibitedProps: [], props: {}, relatedConcepts: [], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'structure', 'section', 'landmark']] }; var _default$16 = searchRole; searchRole$1.default = _default$16; var searchboxRole$1 = {}; Object.defineProperty(searchboxRole$1, "__esModule", { value: true }); searchboxRole$1.default = void 0; var searchboxRole = { abstract: false, accessibleNameRequired: true, baseConcepts: [], childrenPresentational: false, nameFrom: ['author'], prohibitedProps: [], props: {}, relatedConcepts: [{ concept: { attributes: [{ constraints: ['undefined'], name: 'list' }, { name: 'type', value: 'search' }], constraints: ['the list attribute is not set'], name: 'input' }, module: 'HTML' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'widget', 'input', 'textbox']] }; var _default$15 = searchboxRole; searchboxRole$1.default = _default$15; var separatorRole$1 = {}; Object.defineProperty(separatorRole$1, "__esModule", { value: true }); separatorRole$1.default = void 0; var separatorRole = { abstract: false, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: true, nameFrom: ['author'], prohibitedProps: [], props: { 'aria-disabled': null, 'aria-orientation': 'horizontal', 'aria-valuemax': '100', 'aria-valuemin': '0', 'aria-valuenow': null, 'aria-valuetext': null }, relatedConcepts: [{ concept: { name: 'hr' }, module: 'HTML' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'structure']] }; var _default$14 = separatorRole; separatorRole$1.default = _default$14; var sliderRole$1 = {}; Object.defineProperty(sliderRole$1, "__esModule", { value: true }); sliderRole$1.default = void 0; var sliderRole = { abstract: false, accessibleNameRequired: true, baseConcepts: [], childrenPresentational: true, nameFrom: ['author'], prohibitedProps: [], props: { 'aria-errormessage': null, 'aria-haspopup': null, 'aria-invalid': null, 'aria-readonly': null, 'aria-valuetext': null, 'aria-orientation': 'horizontal', 'aria-valuemax': '100', 'aria-valuemin': '0' }, relatedConcepts: [{ concept: { attributes: [{ name: 'type', value: 'range' }], name: 'input' }, module: 'HTML' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: { 'aria-valuenow': null }, superClass: [['roletype', 'widget', 'input'], ['roletype', 'structure', 'range']] }; var _default$13 = sliderRole; sliderRole$1.default = _default$13; var spinbuttonRole$1 = {}; Object.defineProperty(spinbuttonRole$1, "__esModule", { value: true }); spinbuttonRole$1.default = void 0; var spinbuttonRole = { abstract: false, accessibleNameRequired: true, baseConcepts: [], childrenPresentational: false, nameFrom: ['author'], prohibitedProps: [], props: { 'aria-errormessage': null, 'aria-invalid': null, 'aria-readonly': null, 'aria-required': null, 'aria-valuetext': null, 'aria-valuenow': '0' }, relatedConcepts: [{ concept: { attributes: [{ name: 'type', value: 'number' }], name: 'input' }, module: 'HTML' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'widget', 'composite'], ['roletype', 'widget', 'input'], ['roletype', 'structure', 'range']] }; var _default$12 = spinbuttonRole; spinbuttonRole$1.default = _default$12; var statusRole$1 = {}; Object.defineProperty(statusRole$1, "__esModule", { value: true }); statusRole$1.default = void 0; var statusRole = { abstract: false, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: ['author'], prohibitedProps: [], props: { 'aria-atomic': 'true', 'aria-live': 'polite' }, relatedConcepts: [{ concept: { name: 'output' }, module: 'HTML' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'structure', 'section']] }; var _default$11 = statusRole; statusRole$1.default = _default$11; var strongRole$1 = {}; Object.defineProperty(strongRole$1, "__esModule", { value: true }); strongRole$1.default = void 0; var strongRole = { abstract: false, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: ['prohibited'], prohibitedProps: ['aria-label', 'aria-labelledby'], props: {}, relatedConcepts: [{ concept: { name: 'strong' }, module: 'HTML' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'structure', 'section']] }; var _default$10 = strongRole; strongRole$1.default = _default$10; var subscriptRole$1 = {}; Object.defineProperty(subscriptRole$1, "__esModule", { value: true }); subscriptRole$1.default = void 0; var subscriptRole = { abstract: false, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: ['prohibited'], prohibitedProps: ['aria-label', 'aria-labelledby'], props: {}, relatedConcepts: [{ concept: { name: 'sub' }, module: 'HTML' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'structure', 'section']] }; var _default$$ = subscriptRole; subscriptRole$1.default = _default$$; var superscriptRole$1 = {}; Object.defineProperty(superscriptRole$1, "__esModule", { value: true }); superscriptRole$1.default = void 0; var superscriptRole = { abstract: false, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: ['prohibited'], prohibitedProps: ['aria-label', 'aria-labelledby'], props: {}, relatedConcepts: [{ concept: { name: 'sup' }, module: 'HTML' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'structure', 'section']] }; var _default$_ = superscriptRole; superscriptRole$1.default = _default$_; var switchRole$1 = {}; Object.defineProperty(switchRole$1, "__esModule", { value: true }); switchRole$1.default = void 0; var switchRole = { abstract: false, accessibleNameRequired: true, baseConcepts: [], childrenPresentational: true, nameFrom: ['author', 'contents'], prohibitedProps: [], props: {}, relatedConcepts: [{ concept: { name: 'button' }, module: 'ARIA' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: { 'aria-checked': null }, superClass: [['roletype', 'widget', 'input', 'checkbox']] }; var _default$Z = switchRole; switchRole$1.default = _default$Z; var tabRole$1 = {}; Object.defineProperty(tabRole$1, "__esModule", { value: true }); tabRole$1.default = void 0; var tabRole = { abstract: false, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: true, nameFrom: ['author', 'contents'], prohibitedProps: [], props: { 'aria-disabled': null, 'aria-expanded': null, 'aria-haspopup': null, 'aria-posinset': null, 'aria-setsize': null, 'aria-selected': 'false' }, relatedConcepts: [], requireContextRole: ['tablist'], requiredContextRole: ['tablist'], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'structure', 'sectionhead'], ['roletype', 'widget']] }; var _default$Y = tabRole; tabRole$1.default = _default$Y; var tableRole$1 = {}; Object.defineProperty(tableRole$1, "__esModule", { value: true }); tableRole$1.default = void 0; var tableRole = { abstract: false, accessibleNameRequired: true, baseConcepts: [], childrenPresentational: false, nameFrom: ['author'], prohibitedProps: [], props: { 'aria-colcount': null, 'aria-rowcount': null }, relatedConcepts: [{ concept: { name: 'table' }, module: 'HTML' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [['row'], ['row', 'rowgroup']], requiredProps: {}, superClass: [['roletype', 'structure', 'section']] }; var _default$X = tableRole; tableRole$1.default = _default$X; var tablistRole$1 = {}; Object.defineProperty(tablistRole$1, "__esModule", { value: true }); tablistRole$1.default = void 0; var tablistRole = { abstract: false, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: ['author'], prohibitedProps: [], props: { 'aria-level': null, 'aria-multiselectable': null, 'aria-orientation': 'horizontal' }, relatedConcepts: [{ module: 'DAISY', concept: { name: 'guide' } }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [['tab']], requiredProps: {}, superClass: [['roletype', 'widget', 'composite']] }; var _default$W = tablistRole; tablistRole$1.default = _default$W; var tabpanelRole$1 = {}; Object.defineProperty(tabpanelRole$1, "__esModule", { value: true }); tabpanelRole$1.default = void 0; var tabpanelRole = { abstract: false, accessibleNameRequired: true, baseConcepts: [], childrenPresentational: false, nameFrom: ['author'], prohibitedProps: [], props: {}, relatedConcepts: [], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'structure', 'section']] }; var _default$V = tabpanelRole; tabpanelRole$1.default = _default$V; var termRole$1 = {}; Object.defineProperty(termRole$1, "__esModule", { value: true }); termRole$1.default = void 0; var termRole = { abstract: false, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: ['author'], prohibitedProps: [], props: {}, relatedConcepts: [{ concept: { name: 'dfn' }, module: 'HTML' }, { concept: { name: 'dt' }, module: 'HTML' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'structure', 'section']] }; var _default$U = termRole; termRole$1.default = _default$U; var textboxRole$1 = {}; Object.defineProperty(textboxRole$1, "__esModule", { value: true }); textboxRole$1.default = void 0; var textboxRole = { abstract: false, accessibleNameRequired: true, baseConcepts: [], childrenPresentational: false, nameFrom: ['author'], prohibitedProps: [], props: { 'aria-activedescendant': null, 'aria-autocomplete': null, 'aria-errormessage': null, 'aria-haspopup': null, 'aria-invalid': null, 'aria-multiline': null, 'aria-placeholder': null, 'aria-readonly': null, 'aria-required': null }, relatedConcepts: [{ concept: { attributes: [{ constraints: ['undefined'], name: 'type' }, { constraints: ['undefined'], name: 'list' }], constraints: ['the list attribute is not set'], name: 'input' }, module: 'HTML' }, { concept: { attributes: [{ constraints: ['undefined'], name: 'list' }, { name: 'type', value: 'email' }], constraints: ['the list attribute is not set'], name: 'input' }, module: 'HTML' }, { concept: { attributes: [{ constraints: ['undefined'], name: 'list' }, { name: 'type', value: 'tel' }], constraints: ['the list attribute is not set'], name: 'input' }, module: 'HTML' }, { concept: { attributes: [{ constraints: ['undefined'], name: 'list' }, { name: 'type', value: 'text' }], constraints: ['the list attribute is not set'], name: 'input' }, module: 'HTML' }, { concept: { attributes: [{ constraints: ['undefined'], name: 'list' }, { name: 'type', value: 'url' }], constraints: ['the list attribute is not set'], name: 'input' }, module: 'HTML' }, { concept: { name: 'input' }, module: 'XForms' }, { concept: { name: 'textarea' }, module: 'HTML' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'widget', 'input']] }; var _default$T = textboxRole; textboxRole$1.default = _default$T; var timeRole$1 = {}; Object.defineProperty(timeRole$1, "__esModule", { value: true }); timeRole$1.default = void 0; var timeRole = { abstract: false, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: ['author'], prohibitedProps: [], props: {}, relatedConcepts: [{ concept: { name: 'time' }, module: 'HTML' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'structure', 'section']] }; var _default$S = timeRole; timeRole$1.default = _default$S; var timerRole$1 = {}; Object.defineProperty(timerRole$1, "__esModule", { value: true }); timerRole$1.default = void 0; var timerRole = { abstract: false, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: ['author'], prohibitedProps: [], props: {}, relatedConcepts: [], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'structure', 'section', 'status']] }; var _default$R = timerRole; timerRole$1.default = _default$R; var toolbarRole$1 = {}; Object.defineProperty(toolbarRole$1, "__esModule", { value: true }); toolbarRole$1.default = void 0; var toolbarRole = { abstract: false, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: ['author'], prohibitedProps: [], props: { 'aria-orientation': 'horizontal' }, relatedConcepts: [{ concept: { name: 'menubar' }, module: 'ARIA' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'structure', 'section', 'group']] }; var _default$Q = toolbarRole; toolbarRole$1.default = _default$Q; var tooltipRole$1 = {}; Object.defineProperty(tooltipRole$1, "__esModule", { value: true }); tooltipRole$1.default = void 0; var tooltipRole = { abstract: false, accessibleNameRequired: true, baseConcepts: [], childrenPresentational: false, nameFrom: ['author', 'contents'], prohibitedProps: [], props: {}, relatedConcepts: [], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'structure', 'section']] }; var _default$P = tooltipRole; tooltipRole$1.default = _default$P; var treeRole$1 = {}; Object.defineProperty(treeRole$1, "__esModule", { value: true }); treeRole$1.default = void 0; var treeRole = { abstract: false, accessibleNameRequired: true, baseConcepts: [], childrenPresentational: false, nameFrom: ['author'], prohibitedProps: [], props: { 'aria-errormessage': null, 'aria-invalid': null, 'aria-multiselectable': null, 'aria-required': null, 'aria-orientation': 'vertical' }, relatedConcepts: [], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [['treeitem', 'group'], ['treeitem']], requiredProps: {}, superClass: [['roletype', 'widget', 'composite', 'select'], ['roletype', 'structure', 'section', 'group', 'select']] }; var _default$O = treeRole; treeRole$1.default = _default$O; var treegridRole$1 = {}; Object.defineProperty(treegridRole$1, "__esModule", { value: true }); treegridRole$1.default = void 0; var treegridRole = { abstract: false, accessibleNameRequired: true, baseConcepts: [], childrenPresentational: false, nameFrom: ['author'], prohibitedProps: [], props: {}, relatedConcepts: [], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [['row'], ['row', 'rowgroup']], requiredProps: {}, superClass: [['roletype', 'widget', 'composite', 'grid'], ['roletype', 'structure', 'section', 'table', 'grid'], ['roletype', 'widget', 'composite', 'select', 'tree'], ['roletype', 'structure', 'section', 'group', 'select', 'tree']] }; var _default$N = treegridRole; treegridRole$1.default = _default$N; var treeitemRole$1 = {}; Object.defineProperty(treeitemRole$1, "__esModule", { value: true }); treeitemRole$1.default = void 0; var treeitemRole = { abstract: false, accessibleNameRequired: true, baseConcepts: [], childrenPresentational: false, nameFrom: ['author', 'contents'], prohibitedProps: [], props: { 'aria-expanded': null, 'aria-haspopup': null }, relatedConcepts: [], requireContextRole: ['group', 'tree'], requiredContextRole: ['group', 'tree'], requiredOwnedElements: [], requiredProps: { 'aria-selected': null }, superClass: [['roletype', 'structure', 'section', 'listitem'], ['roletype', 'widget', 'input', 'option']] }; var _default$M = treeitemRole; treeitemRole$1.default = _default$M; Object.defineProperty(ariaLiteralRoles$1, "__esModule", { value: true }); ariaLiteralRoles$1.default = void 0; var _alertRole = _interopRequireDefault$6(alertRole$1); var _alertdialogRole = _interopRequireDefault$6(alertdialogRole$1); var _applicationRole = _interopRequireDefault$6(applicationRole$1); var _articleRole = _interopRequireDefault$6(articleRole$1); var _bannerRole = _interopRequireDefault$6(bannerRole$1); var _blockquoteRole = _interopRequireDefault$6(blockquoteRole$1); var _buttonRole = _interopRequireDefault$6(buttonRole$1); var _captionRole = _interopRequireDefault$6(captionRole$1); var _cellRole = _interopRequireDefault$6(cellRole$1); var _checkboxRole = _interopRequireDefault$6(checkboxRole$1); var _codeRole = _interopRequireDefault$6(codeRole$1); var _columnheaderRole = _interopRequireDefault$6(columnheaderRole$1); var _comboboxRole = _interopRequireDefault$6(comboboxRole$1); var _complementaryRole = _interopRequireDefault$6(complementaryRole$1); var _contentinfoRole = _interopRequireDefault$6(contentinfoRole$1); var _definitionRole = _interopRequireDefault$6(definitionRole$1); var _deletionRole = _interopRequireDefault$6(deletionRole$1); var _dialogRole = _interopRequireDefault$6(dialogRole$1); var _directoryRole = _interopRequireDefault$6(directoryRole$1); var _documentRole = _interopRequireDefault$6(documentRole$1); var _emphasisRole = _interopRequireDefault$6(emphasisRole$1); var _feedRole = _interopRequireDefault$6(feedRole$1); var _figureRole = _interopRequireDefault$6(figureRole$1); var _formRole = _interopRequireDefault$6(formRole$1); var _genericRole = _interopRequireDefault$6(genericRole$1); var _gridRole = _interopRequireDefault$6(gridRole$1); var _gridcellRole = _interopRequireDefault$6(gridcellRole$1); var _groupRole = _interopRequireDefault$6(groupRole$1); var _headingRole = _interopRequireDefault$6(headingRole$1); var _imgRole = _interopRequireDefault$6(imgRole$1); var _insertionRole = _interopRequireDefault$6(insertionRole$1); var _linkRole = _interopRequireDefault$6(linkRole$1); var _listRole = _interopRequireDefault$6(listRole$1); var _listboxRole = _interopRequireDefault$6(listboxRole$1); var _listitemRole = _interopRequireDefault$6(listitemRole$1); var _logRole = _interopRequireDefault$6(logRole$1); var _mainRole = _interopRequireDefault$6(mainRole$1); var _markRole = _interopRequireDefault$6(markRole$1); var _marqueeRole = _interopRequireDefault$6(marqueeRole$1); var _mathRole = _interopRequireDefault$6(mathRole$1); var _menuRole = _interopRequireDefault$6(menuRole$1); var _menubarRole = _interopRequireDefault$6(menubarRole$1); var _menuitemRole = _interopRequireDefault$6(menuitemRole$1); var _menuitemcheckboxRole = _interopRequireDefault$6(menuitemcheckboxRole$1); var _menuitemradioRole = _interopRequireDefault$6(menuitemradioRole$1); var _meterRole = _interopRequireDefault$6(meterRole$1); var _navigationRole = _interopRequireDefault$6(navigationRole$1); var _noneRole = _interopRequireDefault$6(noneRole$1); var _noteRole = _interopRequireDefault$6(noteRole$1); var _optionRole = _interopRequireDefault$6(optionRole$1); var _paragraphRole = _interopRequireDefault$6(paragraphRole$1); var _presentationRole = _interopRequireDefault$6(presentationRole$1); var _progressbarRole = _interopRequireDefault$6(progressbarRole$1); var _radioRole = _interopRequireDefault$6(radioRole$1); var _radiogroupRole = _interopRequireDefault$6(radiogroupRole$1); var _regionRole = _interopRequireDefault$6(regionRole$1); var _rowRole = _interopRequireDefault$6(rowRole$1); var _rowgroupRole = _interopRequireDefault$6(rowgroupRole$1); var _rowheaderRole = _interopRequireDefault$6(rowheaderRole$1); var _scrollbarRole = _interopRequireDefault$6(scrollbarRole$1); var _searchRole = _interopRequireDefault$6(searchRole$1); var _searchboxRole = _interopRequireDefault$6(searchboxRole$1); var _separatorRole = _interopRequireDefault$6(separatorRole$1); var _sliderRole = _interopRequireDefault$6(sliderRole$1); var _spinbuttonRole = _interopRequireDefault$6(spinbuttonRole$1); var _statusRole = _interopRequireDefault$6(statusRole$1); var _strongRole = _interopRequireDefault$6(strongRole$1); var _subscriptRole = _interopRequireDefault$6(subscriptRole$1); var _superscriptRole = _interopRequireDefault$6(superscriptRole$1); var _switchRole = _interopRequireDefault$6(switchRole$1); var _tabRole = _interopRequireDefault$6(tabRole$1); var _tableRole = _interopRequireDefault$6(tableRole$1); var _tablistRole = _interopRequireDefault$6(tablistRole$1); var _tabpanelRole = _interopRequireDefault$6(tabpanelRole$1); var _termRole = _interopRequireDefault$6(termRole$1); var _textboxRole = _interopRequireDefault$6(textboxRole$1); var _timeRole = _interopRequireDefault$6(timeRole$1); var _timerRole = _interopRequireDefault$6(timerRole$1); var _toolbarRole = _interopRequireDefault$6(toolbarRole$1); var _tooltipRole = _interopRequireDefault$6(tooltipRole$1); var _treeRole = _interopRequireDefault$6(treeRole$1); var _treegridRole = _interopRequireDefault$6(treegridRole$1); var _treeitemRole = _interopRequireDefault$6(treeitemRole$1); function _interopRequireDefault$6(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var ariaLiteralRoles = [['alert', _alertRole.default], ['alertdialog', _alertdialogRole.default], ['application', _applicationRole.default], ['article', _articleRole.default], ['banner', _bannerRole.default], ['blockquote', _blockquoteRole.default], ['button', _buttonRole.default], ['caption', _captionRole.default], ['cell', _cellRole.default], ['checkbox', _checkboxRole.default], ['code', _codeRole.default], ['columnheader', _columnheaderRole.default], ['combobox', _comboboxRole.default], ['complementary', _complementaryRole.default], ['contentinfo', _contentinfoRole.default], ['definition', _definitionRole.default], ['deletion', _deletionRole.default], ['dialog', _dialogRole.default], ['directory', _directoryRole.default], ['document', _documentRole.default], ['emphasis', _emphasisRole.default], ['feed', _feedRole.default], ['figure', _figureRole.default], ['form', _formRole.default], ['generic', _genericRole.default], ['grid', _gridRole.default], ['gridcell', _gridcellRole.default], ['group', _groupRole.default], ['heading', _headingRole.default], ['img', _imgRole.default], ['insertion', _insertionRole.default], ['link', _linkRole.default], ['list', _listRole.default], ['listbox', _listboxRole.default], ['listitem', _listitemRole.default], ['log', _logRole.default], ['main', _mainRole.default], ['mark', _markRole.default], ['marquee', _marqueeRole.default], ['math', _mathRole.default], ['menu', _menuRole.default], ['menubar', _menubarRole.default], ['menuitem', _menuitemRole.default], ['menuitemcheckbox', _menuitemcheckboxRole.default], ['menuitemradio', _menuitemradioRole.default], ['meter', _meterRole.default], ['navigation', _navigationRole.default], ['none', _noneRole.default], ['note', _noteRole.default], ['option', _optionRole.default], ['paragraph', _paragraphRole.default], ['presentation', _presentationRole.default], ['progressbar', _progressbarRole.default], ['radio', _radioRole.default], ['radiogroup', _radiogroupRole.default], ['region', _regionRole.default], ['row', _rowRole.default], ['rowgroup', _rowgroupRole.default], ['rowheader', _rowheaderRole.default], ['scrollbar', _scrollbarRole.default], ['search', _searchRole.default], ['searchbox', _searchboxRole.default], ['separator', _separatorRole.default], ['slider', _sliderRole.default], ['spinbutton', _spinbuttonRole.default], ['status', _statusRole.default], ['strong', _strongRole.default], ['subscript', _subscriptRole.default], ['superscript', _superscriptRole.default], ['switch', _switchRole.default], ['tab', _tabRole.default], ['table', _tableRole.default], ['tablist', _tablistRole.default], ['tabpanel', _tabpanelRole.default], ['term', _termRole.default], ['textbox', _textboxRole.default], ['time', _timeRole.default], ['timer', _timerRole.default], ['toolbar', _toolbarRole.default], ['tooltip', _tooltipRole.default], ['tree', _treeRole.default], ['treegrid', _treegridRole.default], ['treeitem', _treeitemRole.default]]; var _default$L = ariaLiteralRoles; ariaLiteralRoles$1.default = _default$L; var ariaDpubRoles$1 = {}; var docAbstractRole$1 = {}; Object.defineProperty(docAbstractRole$1, "__esModule", { value: true }); docAbstractRole$1.default = void 0; var docAbstractRole = { abstract: false, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: ['author'], prohibitedProps: [], props: { 'aria-disabled': null, 'aria-errormessage': null, 'aria-expanded': null, 'aria-haspopup': null, 'aria-invalid': null }, relatedConcepts: [{ concept: { name: 'abstract [EPUB-SSV]' }, module: 'EPUB' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'structure', 'section']] }; var _default$K = docAbstractRole; docAbstractRole$1.default = _default$K; var docAcknowledgmentsRole$1 = {}; Object.defineProperty(docAcknowledgmentsRole$1, "__esModule", { value: true }); docAcknowledgmentsRole$1.default = void 0; var docAcknowledgmentsRole = { abstract: false, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: ['author'], prohibitedProps: [], props: { 'aria-disabled': null, 'aria-errormessage': null, 'aria-expanded': null, 'aria-haspopup': null, 'aria-invalid': null }, relatedConcepts: [{ concept: { name: 'acknowledgments [EPUB-SSV]' }, module: 'EPUB' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'structure', 'section', 'landmark']] }; var _default$J = docAcknowledgmentsRole; docAcknowledgmentsRole$1.default = _default$J; var docAfterwordRole$1 = {}; Object.defineProperty(docAfterwordRole$1, "__esModule", { value: true }); docAfterwordRole$1.default = void 0; var docAfterwordRole = { abstract: false, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: ['author'], prohibitedProps: [], props: { 'aria-disabled': null, 'aria-errormessage': null, 'aria-expanded': null, 'aria-haspopup': null, 'aria-invalid': null }, relatedConcepts: [{ concept: { name: 'afterword [EPUB-SSV]' }, module: 'EPUB' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'structure', 'section', 'landmark']] }; var _default$I = docAfterwordRole; docAfterwordRole$1.default = _default$I; var docAppendixRole$1 = {}; Object.defineProperty(docAppendixRole$1, "__esModule", { value: true }); docAppendixRole$1.default = void 0; var docAppendixRole = { abstract: false, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: ['author'], prohibitedProps: [], props: { 'aria-disabled': null, 'aria-errormessage': null, 'aria-expanded': null, 'aria-haspopup': null, 'aria-invalid': null }, relatedConcepts: [{ concept: { name: 'appendix [EPUB-SSV]' }, module: 'EPUB' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'structure', 'section', 'landmark']] }; var _default$H = docAppendixRole; docAppendixRole$1.default = _default$H; var docBacklinkRole$1 = {}; Object.defineProperty(docBacklinkRole$1, "__esModule", { value: true }); docBacklinkRole$1.default = void 0; var docBacklinkRole = { abstract: false, accessibleNameRequired: true, baseConcepts: [], childrenPresentational: false, nameFrom: ['author', 'contents'], prohibitedProps: [], props: { 'aria-errormessage': null, 'aria-invalid': null }, relatedConcepts: [{ concept: { name: 'referrer [EPUB-SSV]' }, module: 'EPUB' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'widget', 'command', 'link']] }; var _default$G = docBacklinkRole; docBacklinkRole$1.default = _default$G; var docBiblioentryRole$1 = {}; Object.defineProperty(docBiblioentryRole$1, "__esModule", { value: true }); docBiblioentryRole$1.default = void 0; var docBiblioentryRole = { abstract: false, accessibleNameRequired: true, baseConcepts: [], childrenPresentational: false, nameFrom: ['author'], prohibitedProps: [], props: { 'aria-disabled': null, 'aria-errormessage': null, 'aria-expanded': null, 'aria-haspopup': null, 'aria-invalid': null }, relatedConcepts: [{ concept: { name: 'EPUB biblioentry [EPUB-SSV]' }, module: 'EPUB' }], requireContextRole: ['doc-bibliography'], requiredContextRole: ['doc-bibliography'], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'structure', 'section', 'listitem']] }; var _default$F = docBiblioentryRole; docBiblioentryRole$1.default = _default$F; var docBibliographyRole$1 = {}; Object.defineProperty(docBibliographyRole$1, "__esModule", { value: true }); docBibliographyRole$1.default = void 0; var docBibliographyRole = { abstract: false, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: ['author'], prohibitedProps: [], props: { 'aria-disabled': null, 'aria-errormessage': null, 'aria-expanded': null, 'aria-haspopup': null, 'aria-invalid': null }, relatedConcepts: [{ concept: { name: 'bibliography [EPUB-SSV]' }, module: 'EPUB' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [['doc-biblioentry']], requiredProps: {}, superClass: [['roletype', 'structure', 'section', 'landmark']] }; var _default$E = docBibliographyRole; docBibliographyRole$1.default = _default$E; var docBibliorefRole$1 = {}; Object.defineProperty(docBibliorefRole$1, "__esModule", { value: true }); docBibliorefRole$1.default = void 0; var docBibliorefRole = { abstract: false, accessibleNameRequired: true, baseConcepts: [], childrenPresentational: false, nameFrom: ['author', 'contents'], prohibitedProps: [], props: { 'aria-errormessage': null, 'aria-invalid': null }, relatedConcepts: [{ concept: { name: 'biblioref [EPUB-SSV]' }, module: 'EPUB' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'widget', 'command', 'link']] }; var _default$D = docBibliorefRole; docBibliorefRole$1.default = _default$D; var docChapterRole$1 = {}; Object.defineProperty(docChapterRole$1, "__esModule", { value: true }); docChapterRole$1.default = void 0; var docChapterRole = { abstract: false, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: ['author'], prohibitedProps: [], props: { 'aria-disabled': null, 'aria-errormessage': null, 'aria-expanded': null, 'aria-haspopup': null, 'aria-invalid': null }, relatedConcepts: [{ concept: { name: 'chapter [EPUB-SSV]' }, module: 'EPUB' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'structure', 'section', 'landmark']] }; var _default$C = docChapterRole; docChapterRole$1.default = _default$C; var docColophonRole$1 = {}; Object.defineProperty(docColophonRole$1, "__esModule", { value: true }); docColophonRole$1.default = void 0; var docColophonRole = { abstract: false, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: ['author'], prohibitedProps: [], props: { 'aria-disabled': null, 'aria-errormessage': null, 'aria-expanded': null, 'aria-haspopup': null, 'aria-invalid': null }, relatedConcepts: [{ concept: { name: 'colophon [EPUB-SSV]' }, module: 'EPUB' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'structure', 'section']] }; var _default$B = docColophonRole; docColophonRole$1.default = _default$B; var docConclusionRole$1 = {}; Object.defineProperty(docConclusionRole$1, "__esModule", { value: true }); docConclusionRole$1.default = void 0; var docConclusionRole = { abstract: false, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: ['author'], prohibitedProps: [], props: { 'aria-disabled': null, 'aria-errormessage': null, 'aria-expanded': null, 'aria-haspopup': null, 'aria-invalid': null }, relatedConcepts: [{ concept: { name: 'conclusion [EPUB-SSV]' }, module: 'EPUB' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'structure', 'section', 'landmark']] }; var _default$A = docConclusionRole; docConclusionRole$1.default = _default$A; var docCoverRole$1 = {}; Object.defineProperty(docCoverRole$1, "__esModule", { value: true }); docCoverRole$1.default = void 0; var docCoverRole = { abstract: false, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: ['author'], prohibitedProps: [], props: { 'aria-disabled': null, 'aria-errormessage': null, 'aria-expanded': null, 'aria-haspopup': null, 'aria-invalid': null }, relatedConcepts: [{ concept: { name: 'cover [EPUB-SSV]' }, module: 'EPUB' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'structure', 'section', 'img']] }; var _default$z = docCoverRole; docCoverRole$1.default = _default$z; var docCreditRole$1 = {}; Object.defineProperty(docCreditRole$1, "__esModule", { value: true }); docCreditRole$1.default = void 0; var docCreditRole = { abstract: false, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: ['author'], prohibitedProps: [], props: { 'aria-disabled': null, 'aria-errormessage': null, 'aria-expanded': null, 'aria-haspopup': null, 'aria-invalid': null }, relatedConcepts: [{ concept: { name: 'credit [EPUB-SSV]' }, module: 'EPUB' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'structure', 'section']] }; var _default$y = docCreditRole; docCreditRole$1.default = _default$y; var docCreditsRole$1 = {}; Object.defineProperty(docCreditsRole$1, "__esModule", { value: true }); docCreditsRole$1.default = void 0; var docCreditsRole = { abstract: false, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: ['author'], prohibitedProps: [], props: { 'aria-disabled': null, 'aria-errormessage': null, 'aria-expanded': null, 'aria-haspopup': null, 'aria-invalid': null }, relatedConcepts: [{ concept: { name: 'credits [EPUB-SSV]' }, module: 'EPUB' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'structure', 'section', 'landmark']] }; var _default$x = docCreditsRole; docCreditsRole$1.default = _default$x; var docDedicationRole$1 = {}; Object.defineProperty(docDedicationRole$1, "__esModule", { value: true }); docDedicationRole$1.default = void 0; var docDedicationRole = { abstract: false, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: ['author'], prohibitedProps: [], props: { 'aria-disabled': null, 'aria-errormessage': null, 'aria-expanded': null, 'aria-haspopup': null, 'aria-invalid': null }, relatedConcepts: [{ concept: { name: 'dedication [EPUB-SSV]' }, module: 'EPUB' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'structure', 'section']] }; var _default$w = docDedicationRole; docDedicationRole$1.default = _default$w; var docEndnoteRole$1 = {}; Object.defineProperty(docEndnoteRole$1, "__esModule", { value: true }); docEndnoteRole$1.default = void 0; var docEndnoteRole = { abstract: false, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: ['author'], prohibitedProps: [], props: { 'aria-disabled': null, 'aria-errormessage': null, 'aria-expanded': null, 'aria-haspopup': null, 'aria-invalid': null }, relatedConcepts: [{ concept: { name: 'rearnote [EPUB-SSV]' }, module: 'EPUB' }], requireContextRole: ['doc-endnotes'], requiredContextRole: ['doc-endnotes'], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'structure', 'section', 'listitem']] }; var _default$v = docEndnoteRole; docEndnoteRole$1.default = _default$v; var docEndnotesRole$1 = {}; Object.defineProperty(docEndnotesRole$1, "__esModule", { value: true }); docEndnotesRole$1.default = void 0; var docEndnotesRole = { abstract: false, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: ['author'], prohibitedProps: [], props: { 'aria-disabled': null, 'aria-errormessage': null, 'aria-expanded': null, 'aria-haspopup': null, 'aria-invalid': null }, relatedConcepts: [{ concept: { name: 'rearnotes [EPUB-SSV]' }, module: 'EPUB' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [['doc-endnote']], requiredProps: {}, superClass: [['roletype', 'structure', 'section', 'landmark']] }; var _default$u = docEndnotesRole; docEndnotesRole$1.default = _default$u; var docEpigraphRole$1 = {}; Object.defineProperty(docEpigraphRole$1, "__esModule", { value: true }); docEpigraphRole$1.default = void 0; var docEpigraphRole = { abstract: false, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: ['author'], prohibitedProps: [], props: { 'aria-disabled': null, 'aria-errormessage': null, 'aria-expanded': null, 'aria-haspopup': null, 'aria-invalid': null }, relatedConcepts: [{ concept: { name: 'epigraph [EPUB-SSV]' }, module: 'EPUB' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'structure', 'section']] }; var _default$t = docEpigraphRole; docEpigraphRole$1.default = _default$t; var docEpilogueRole$1 = {}; Object.defineProperty(docEpilogueRole$1, "__esModule", { value: true }); docEpilogueRole$1.default = void 0; var docEpilogueRole = { abstract: false, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: ['author'], prohibitedProps: [], props: { 'aria-disabled': null, 'aria-errormessage': null, 'aria-expanded': null, 'aria-haspopup': null, 'aria-invalid': null }, relatedConcepts: [{ concept: { name: 'epilogue [EPUB-SSV]' }, module: 'EPUB' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'structure', 'section', 'landmark']] }; var _default$s = docEpilogueRole; docEpilogueRole$1.default = _default$s; var docErrataRole$1 = {}; Object.defineProperty(docErrataRole$1, "__esModule", { value: true }); docErrataRole$1.default = void 0; var docErrataRole = { abstract: false, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: ['author'], prohibitedProps: [], props: { 'aria-disabled': null, 'aria-errormessage': null, 'aria-expanded': null, 'aria-haspopup': null, 'aria-invalid': null }, relatedConcepts: [{ concept: { name: 'errata [EPUB-SSV]' }, module: 'EPUB' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'structure', 'section', 'landmark']] }; var _default$r = docErrataRole; docErrataRole$1.default = _default$r; var docExampleRole$1 = {}; Object.defineProperty(docExampleRole$1, "__esModule", { value: true }); docExampleRole$1.default = void 0; var docExampleRole = { abstract: false, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: ['author'], prohibitedProps: [], props: { 'aria-disabled': null, 'aria-errormessage': null, 'aria-expanded': null, 'aria-haspopup': null, 'aria-invalid': null }, relatedConcepts: [], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'structure', 'section']] }; var _default$q = docExampleRole; docExampleRole$1.default = _default$q; var docFootnoteRole$1 = {}; Object.defineProperty(docFootnoteRole$1, "__esModule", { value: true }); docFootnoteRole$1.default = void 0; var docFootnoteRole = { abstract: false, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: ['author'], prohibitedProps: [], props: { 'aria-disabled': null, 'aria-errormessage': null, 'aria-expanded': null, 'aria-haspopup': null, 'aria-invalid': null }, relatedConcepts: [{ concept: { name: 'footnote [EPUB-SSV]' }, module: 'EPUB' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'structure', 'section']] }; var _default$p = docFootnoteRole; docFootnoteRole$1.default = _default$p; var docForewordRole$1 = {}; Object.defineProperty(docForewordRole$1, "__esModule", { value: true }); docForewordRole$1.default = void 0; var docForewordRole = { abstract: false, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: ['author'], prohibitedProps: [], props: { 'aria-disabled': null, 'aria-errormessage': null, 'aria-expanded': null, 'aria-haspopup': null, 'aria-invalid': null }, relatedConcepts: [{ concept: { name: 'foreword [EPUB-SSV]' }, module: 'EPUB' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'structure', 'section', 'landmark']] }; var _default$o = docForewordRole; docForewordRole$1.default = _default$o; var docGlossaryRole$1 = {}; Object.defineProperty(docGlossaryRole$1, "__esModule", { value: true }); docGlossaryRole$1.default = void 0; var docGlossaryRole = { abstract: false, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: ['author'], prohibitedProps: [], props: { 'aria-disabled': null, 'aria-errormessage': null, 'aria-expanded': null, 'aria-haspopup': null, 'aria-invalid': null }, relatedConcepts: [{ concept: { name: 'glossary [EPUB-SSV]' }, module: 'EPUB' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [['definition'], ['term']], requiredProps: {}, superClass: [['roletype', 'structure', 'section', 'landmark']] }; var _default$n = docGlossaryRole; docGlossaryRole$1.default = _default$n; var docGlossrefRole$1 = {}; Object.defineProperty(docGlossrefRole$1, "__esModule", { value: true }); docGlossrefRole$1.default = void 0; var docGlossrefRole = { abstract: false, accessibleNameRequired: true, baseConcepts: [], childrenPresentational: false, nameFrom: ['author', 'contents'], prohibitedProps: [], props: { 'aria-errormessage': null, 'aria-invalid': null }, relatedConcepts: [{ concept: { name: 'glossref [EPUB-SSV]' }, module: 'EPUB' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'widget', 'command', 'link']] }; var _default$m = docGlossrefRole; docGlossrefRole$1.default = _default$m; var docIndexRole$1 = {}; Object.defineProperty(docIndexRole$1, "__esModule", { value: true }); docIndexRole$1.default = void 0; var docIndexRole = { abstract: false, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: ['author'], prohibitedProps: [], props: { 'aria-disabled': null, 'aria-errormessage': null, 'aria-expanded': null, 'aria-haspopup': null, 'aria-invalid': null }, relatedConcepts: [{ concept: { name: 'index [EPUB-SSV]' }, module: 'EPUB' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'structure', 'section', 'landmark', 'navigation']] }; var _default$l = docIndexRole; docIndexRole$1.default = _default$l; var docIntroductionRole$1 = {}; Object.defineProperty(docIntroductionRole$1, "__esModule", { value: true }); docIntroductionRole$1.default = void 0; var docIntroductionRole = { abstract: false, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: ['author'], prohibitedProps: [], props: { 'aria-disabled': null, 'aria-errormessage': null, 'aria-expanded': null, 'aria-haspopup': null, 'aria-invalid': null }, relatedConcepts: [{ concept: { name: 'introduction [EPUB-SSV]' }, module: 'EPUB' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'structure', 'section', 'landmark']] }; var _default$k = docIntroductionRole; docIntroductionRole$1.default = _default$k; var docNoterefRole$1 = {}; Object.defineProperty(docNoterefRole$1, "__esModule", { value: true }); docNoterefRole$1.default = void 0; var docNoterefRole = { abstract: false, accessibleNameRequired: true, baseConcepts: [], childrenPresentational: false, nameFrom: ['author', 'contents'], prohibitedProps: [], props: { 'aria-errormessage': null, 'aria-invalid': null }, relatedConcepts: [{ concept: { name: 'noteref [EPUB-SSV]' }, module: 'EPUB' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'widget', 'command', 'link']] }; var _default$j = docNoterefRole; docNoterefRole$1.default = _default$j; var docNoticeRole$1 = {}; Object.defineProperty(docNoticeRole$1, "__esModule", { value: true }); docNoticeRole$1.default = void 0; var docNoticeRole = { abstract: false, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: ['author'], prohibitedProps: [], props: { 'aria-disabled': null, 'aria-errormessage': null, 'aria-expanded': null, 'aria-haspopup': null, 'aria-invalid': null }, relatedConcepts: [{ concept: { name: 'notice [EPUB-SSV]' }, module: 'EPUB' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'structure', 'section', 'note']] }; var _default$i = docNoticeRole; docNoticeRole$1.default = _default$i; var docPagebreakRole$1 = {}; Object.defineProperty(docPagebreakRole$1, "__esModule", { value: true }); docPagebreakRole$1.default = void 0; var docPagebreakRole = { abstract: false, accessibleNameRequired: true, baseConcepts: [], childrenPresentational: true, nameFrom: ['author'], prohibitedProps: [], props: { 'aria-errormessage': null, 'aria-expanded': null, 'aria-haspopup': null, 'aria-invalid': null }, relatedConcepts: [{ concept: { name: 'pagebreak [EPUB-SSV]' }, module: 'EPUB' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'structure', 'separator']] }; var _default$h = docPagebreakRole; docPagebreakRole$1.default = _default$h; var docPagelistRole$1 = {}; Object.defineProperty(docPagelistRole$1, "__esModule", { value: true }); docPagelistRole$1.default = void 0; var docPagelistRole = { abstract: false, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: ['author'], prohibitedProps: [], props: { 'aria-disabled': null, 'aria-errormessage': null, 'aria-expanded': null, 'aria-haspopup': null, 'aria-invalid': null }, relatedConcepts: [{ concept: { name: 'page-list [EPUB-SSV]' }, module: 'EPUB' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'structure', 'section', 'landmark', 'navigation']] }; var _default$g = docPagelistRole; docPagelistRole$1.default = _default$g; var docPartRole$1 = {}; Object.defineProperty(docPartRole$1, "__esModule", { value: true }); docPartRole$1.default = void 0; var docPartRole = { abstract: false, accessibleNameRequired: true, baseConcepts: [], childrenPresentational: false, nameFrom: ['author'], prohibitedProps: [], props: { 'aria-disabled': null, 'aria-errormessage': null, 'aria-expanded': null, 'aria-haspopup': null, 'aria-invalid': null }, relatedConcepts: [{ concept: { name: 'part [EPUB-SSV]' }, module: 'EPUB' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'structure', 'section', 'landmark']] }; var _default$f = docPartRole; docPartRole$1.default = _default$f; var docPrefaceRole$1 = {}; Object.defineProperty(docPrefaceRole$1, "__esModule", { value: true }); docPrefaceRole$1.default = void 0; var docPrefaceRole = { abstract: false, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: ['author'], prohibitedProps: [], props: { 'aria-disabled': null, 'aria-errormessage': null, 'aria-expanded': null, 'aria-haspopup': null, 'aria-invalid': null }, relatedConcepts: [{ concept: { name: 'preface [EPUB-SSV]' }, module: 'EPUB' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'structure', 'section', 'landmark']] }; var _default$e = docPrefaceRole; docPrefaceRole$1.default = _default$e; var docPrologueRole$1 = {}; Object.defineProperty(docPrologueRole$1, "__esModule", { value: true }); docPrologueRole$1.default = void 0; var docPrologueRole = { abstract: false, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: ['author'], prohibitedProps: [], props: { 'aria-disabled': null, 'aria-errormessage': null, 'aria-expanded': null, 'aria-haspopup': null, 'aria-invalid': null }, relatedConcepts: [{ concept: { name: 'prologue [EPUB-SSV]' }, module: 'EPUB' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'structure', 'section', 'landmark']] }; var _default$d = docPrologueRole; docPrologueRole$1.default = _default$d; var docPullquoteRole$1 = {}; Object.defineProperty(docPullquoteRole$1, "__esModule", { value: true }); docPullquoteRole$1.default = void 0; var docPullquoteRole = { abstract: false, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: ['author'], prohibitedProps: [], props: {}, relatedConcepts: [{ concept: { name: 'pullquote [EPUB-SSV]' }, module: 'EPUB' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['none']] }; var _default$c = docPullquoteRole; docPullquoteRole$1.default = _default$c; var docQnaRole$1 = {}; Object.defineProperty(docQnaRole$1, "__esModule", { value: true }); docQnaRole$1.default = void 0; var docQnaRole = { abstract: false, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: ['author'], prohibitedProps: [], props: { 'aria-disabled': null, 'aria-errormessage': null, 'aria-expanded': null, 'aria-haspopup': null, 'aria-invalid': null }, relatedConcepts: [{ concept: { name: 'qna [EPUB-SSV]' }, module: 'EPUB' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'structure', 'section']] }; var _default$b = docQnaRole; docQnaRole$1.default = _default$b; var docSubtitleRole$1 = {}; Object.defineProperty(docSubtitleRole$1, "__esModule", { value: true }); docSubtitleRole$1.default = void 0; var docSubtitleRole = { abstract: false, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: ['author'], prohibitedProps: [], props: { 'aria-disabled': null, 'aria-errormessage': null, 'aria-expanded': null, 'aria-haspopup': null, 'aria-invalid': null }, relatedConcepts: [{ concept: { name: 'subtitle [EPUB-SSV]' }, module: 'EPUB' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'structure', 'sectionhead']] }; var _default$a = docSubtitleRole; docSubtitleRole$1.default = _default$a; var docTipRole$1 = {}; Object.defineProperty(docTipRole$1, "__esModule", { value: true }); docTipRole$1.default = void 0; var docTipRole = { abstract: false, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: ['author'], prohibitedProps: [], props: { 'aria-disabled': null, 'aria-errormessage': null, 'aria-expanded': null, 'aria-haspopup': null, 'aria-invalid': null }, relatedConcepts: [{ concept: { name: 'help [EPUB-SSV]' }, module: 'EPUB' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'structure', 'section', 'note']] }; var _default$9 = docTipRole; docTipRole$1.default = _default$9; var docTocRole$1 = {}; Object.defineProperty(docTocRole$1, "__esModule", { value: true }); docTocRole$1.default = void 0; var docTocRole = { abstract: false, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: ['author'], prohibitedProps: [], props: { 'aria-disabled': null, 'aria-errormessage': null, 'aria-expanded': null, 'aria-haspopup': null, 'aria-invalid': null }, relatedConcepts: [{ concept: { name: 'toc [EPUB-SSV]' }, module: 'EPUB' }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'structure', 'section', 'landmark', 'navigation']] }; var _default$8 = docTocRole; docTocRole$1.default = _default$8; Object.defineProperty(ariaDpubRoles$1, "__esModule", { value: true }); ariaDpubRoles$1.default = void 0; var _docAbstractRole = _interopRequireDefault$5(docAbstractRole$1); var _docAcknowledgmentsRole = _interopRequireDefault$5(docAcknowledgmentsRole$1); var _docAfterwordRole = _interopRequireDefault$5(docAfterwordRole$1); var _docAppendixRole = _interopRequireDefault$5(docAppendixRole$1); var _docBacklinkRole = _interopRequireDefault$5(docBacklinkRole$1); var _docBiblioentryRole = _interopRequireDefault$5(docBiblioentryRole$1); var _docBibliographyRole = _interopRequireDefault$5(docBibliographyRole$1); var _docBibliorefRole = _interopRequireDefault$5(docBibliorefRole$1); var _docChapterRole = _interopRequireDefault$5(docChapterRole$1); var _docColophonRole = _interopRequireDefault$5(docColophonRole$1); var _docConclusionRole = _interopRequireDefault$5(docConclusionRole$1); var _docCoverRole = _interopRequireDefault$5(docCoverRole$1); var _docCreditRole = _interopRequireDefault$5(docCreditRole$1); var _docCreditsRole = _interopRequireDefault$5(docCreditsRole$1); var _docDedicationRole = _interopRequireDefault$5(docDedicationRole$1); var _docEndnoteRole = _interopRequireDefault$5(docEndnoteRole$1); var _docEndnotesRole = _interopRequireDefault$5(docEndnotesRole$1); var _docEpigraphRole = _interopRequireDefault$5(docEpigraphRole$1); var _docEpilogueRole = _interopRequireDefault$5(docEpilogueRole$1); var _docErrataRole = _interopRequireDefault$5(docErrataRole$1); var _docExampleRole = _interopRequireDefault$5(docExampleRole$1); var _docFootnoteRole = _interopRequireDefault$5(docFootnoteRole$1); var _docForewordRole = _interopRequireDefault$5(docForewordRole$1); var _docGlossaryRole = _interopRequireDefault$5(docGlossaryRole$1); var _docGlossrefRole = _interopRequireDefault$5(docGlossrefRole$1); var _docIndexRole = _interopRequireDefault$5(docIndexRole$1); var _docIntroductionRole = _interopRequireDefault$5(docIntroductionRole$1); var _docNoterefRole = _interopRequireDefault$5(docNoterefRole$1); var _docNoticeRole = _interopRequireDefault$5(docNoticeRole$1); var _docPagebreakRole = _interopRequireDefault$5(docPagebreakRole$1); var _docPagelistRole = _interopRequireDefault$5(docPagelistRole$1); var _docPartRole = _interopRequireDefault$5(docPartRole$1); var _docPrefaceRole = _interopRequireDefault$5(docPrefaceRole$1); var _docPrologueRole = _interopRequireDefault$5(docPrologueRole$1); var _docPullquoteRole = _interopRequireDefault$5(docPullquoteRole$1); var _docQnaRole = _interopRequireDefault$5(docQnaRole$1); var _docSubtitleRole = _interopRequireDefault$5(docSubtitleRole$1); var _docTipRole = _interopRequireDefault$5(docTipRole$1); var _docTocRole = _interopRequireDefault$5(docTocRole$1); function _interopRequireDefault$5(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var ariaDpubRoles = [['doc-abstract', _docAbstractRole.default], ['doc-acknowledgments', _docAcknowledgmentsRole.default], ['doc-afterword', _docAfterwordRole.default], ['doc-appendix', _docAppendixRole.default], ['doc-backlink', _docBacklinkRole.default], ['doc-biblioentry', _docBiblioentryRole.default], ['doc-bibliography', _docBibliographyRole.default], ['doc-biblioref', _docBibliorefRole.default], ['doc-chapter', _docChapterRole.default], ['doc-colophon', _docColophonRole.default], ['doc-conclusion', _docConclusionRole.default], ['doc-cover', _docCoverRole.default], ['doc-credit', _docCreditRole.default], ['doc-credits', _docCreditsRole.default], ['doc-dedication', _docDedicationRole.default], ['doc-endnote', _docEndnoteRole.default], ['doc-endnotes', _docEndnotesRole.default], ['doc-epigraph', _docEpigraphRole.default], ['doc-epilogue', _docEpilogueRole.default], ['doc-errata', _docErrataRole.default], ['doc-example', _docExampleRole.default], ['doc-footnote', _docFootnoteRole.default], ['doc-foreword', _docForewordRole.default], ['doc-glossary', _docGlossaryRole.default], ['doc-glossref', _docGlossrefRole.default], ['doc-index', _docIndexRole.default], ['doc-introduction', _docIntroductionRole.default], ['doc-noteref', _docNoterefRole.default], ['doc-notice', _docNoticeRole.default], ['doc-pagebreak', _docPagebreakRole.default], ['doc-pagelist', _docPagelistRole.default], ['doc-part', _docPartRole.default], ['doc-preface', _docPrefaceRole.default], ['doc-prologue', _docPrologueRole.default], ['doc-pullquote', _docPullquoteRole.default], ['doc-qna', _docQnaRole.default], ['doc-subtitle', _docSubtitleRole.default], ['doc-tip', _docTipRole.default], ['doc-toc', _docTocRole.default]]; var _default$7 = ariaDpubRoles; ariaDpubRoles$1.default = _default$7; var ariaGraphicsRoles$1 = {}; var graphicsDocumentRole$1 = {}; Object.defineProperty(graphicsDocumentRole$1, "__esModule", { value: true }); graphicsDocumentRole$1.default = void 0; var graphicsDocumentRole = { abstract: false, accessibleNameRequired: true, baseConcepts: [], childrenPresentational: false, nameFrom: ['author'], prohibitedProps: [], props: { 'aria-disabled': null, 'aria-errormessage': null, 'aria-expanded': null, 'aria-haspopup': null, 'aria-invalid': null }, relatedConcepts: [{ module: 'GRAPHICS', concept: { name: 'graphics-object' } }, { module: 'ARIA', concept: { name: 'img' } }, { module: 'ARIA', concept: { name: 'article' } }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'structure', 'document']] }; var _default$6 = graphicsDocumentRole; graphicsDocumentRole$1.default = _default$6; var graphicsObjectRole$1 = {}; Object.defineProperty(graphicsObjectRole$1, "__esModule", { value: true }); graphicsObjectRole$1.default = void 0; var graphicsObjectRole = { abstract: false, accessibleNameRequired: false, baseConcepts: [], childrenPresentational: false, nameFrom: ['author', 'contents'], prohibitedProps: [], props: { 'aria-errormessage': null, 'aria-expanded': null, 'aria-haspopup': null, 'aria-invalid': null }, relatedConcepts: [{ module: 'GRAPHICS', concept: { name: 'graphics-document' } }, { module: 'ARIA', concept: { name: 'group' } }, { module: 'ARIA', concept: { name: 'img' } }, { module: 'GRAPHICS', concept: { name: 'graphics-symbol' } }], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'structure', 'section', 'group']] }; var _default$5 = graphicsObjectRole; graphicsObjectRole$1.default = _default$5; var graphicsSymbolRole$1 = {}; Object.defineProperty(graphicsSymbolRole$1, "__esModule", { value: true }); graphicsSymbolRole$1.default = void 0; var graphicsSymbolRole = { abstract: false, accessibleNameRequired: true, baseConcepts: [], childrenPresentational: true, nameFrom: ['author'], prohibitedProps: [], props: { 'aria-disabled': null, 'aria-errormessage': null, 'aria-expanded': null, 'aria-haspopup': null, 'aria-invalid': null }, relatedConcepts: [], requireContextRole: [], requiredContextRole: [], requiredOwnedElements: [], requiredProps: {}, superClass: [['roletype', 'structure', 'section', 'img']] }; var _default$4 = graphicsSymbolRole; graphicsSymbolRole$1.default = _default$4; Object.defineProperty(ariaGraphicsRoles$1, "__esModule", { value: true }); ariaGraphicsRoles$1.default = void 0; var _graphicsDocumentRole = _interopRequireDefault$4(graphicsDocumentRole$1); var _graphicsObjectRole = _interopRequireDefault$4(graphicsObjectRole$1); var _graphicsSymbolRole = _interopRequireDefault$4(graphicsSymbolRole$1); function _interopRequireDefault$4(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var ariaGraphicsRoles = [['graphics-document', _graphicsDocumentRole.default], ['graphics-object', _graphicsObjectRole.default], ['graphics-symbol', _graphicsSymbolRole.default]]; var _default$3 = ariaGraphicsRoles; ariaGraphicsRoles$1.default = _default$3; Object.defineProperty(rolesMap$1, "__esModule", { value: true }); rolesMap$1.default = void 0; var _ariaAbstractRoles = _interopRequireDefault$3(ariaAbstractRoles$1); var _ariaLiteralRoles = _interopRequireDefault$3(ariaLiteralRoles$1); var _ariaDpubRoles = _interopRequireDefault$3(ariaDpubRoles$1); var _ariaGraphicsRoles = _interopRequireDefault$3(ariaGraphicsRoles$1); var _iterationDecorator$2 = _interopRequireDefault$3(iterationDecorator$1); function _interopRequireDefault$3(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _createForOfIteratorHelper$2(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray$2(o)) || allowArrayLike) { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e2) { throw _e2; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e3) { didErr = true; err = _e3; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; } function _slicedToArray$2(arr, i) { return _arrayWithHoles$2(arr) || _iterableToArrayLimit$2(arr, i) || _unsupportedIterableToArray$2(arr, i) || _nonIterableRest$2(); } function _nonIterableRest$2() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _unsupportedIterableToArray$2(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$2(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray$2(o, minLen); } function _arrayLikeToArray$2(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } function _iterableToArrayLimit$2(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } function _arrayWithHoles$2(arr) { if (Array.isArray(arr)) return arr; } var roles$1 = [].concat(_ariaAbstractRoles.default, _ariaLiteralRoles.default, _ariaDpubRoles.default, _ariaGraphicsRoles.default); roles$1.forEach(function (_ref) { var _ref2 = _slicedToArray$2(_ref, 2), roleDefinition = _ref2[1]; // Conglomerate the properties var _iterator = _createForOfIteratorHelper$2(roleDefinition.superClass), _step; try { for (_iterator.s(); !(_step = _iterator.n()).done;) { var superClassIter = _step.value; var _iterator2 = _createForOfIteratorHelper$2(superClassIter), _step2; try { var _loop = function _loop() { var superClassName = _step2.value; var superClassRoleTuple = roles$1.find(function (_ref3) { var _ref4 = _slicedToArray$2(_ref3, 1), name = _ref4[0]; return name === superClassName; }); if (superClassRoleTuple) { var superClassDefinition = superClassRoleTuple[1]; for (var _i2 = 0, _Object$keys = Object.keys(superClassDefinition.props); _i2 < _Object$keys.length; _i2++) { var prop = _Object$keys[_i2]; if ( // $FlowIssue Accessing the hasOwnProperty on the Object prototype is fine. !Object.prototype.hasOwnProperty.call(roleDefinition.props, prop)) { Object.assign(roleDefinition.props, _defineProperty({}, prop, superClassDefinition.props[prop])); } } } }; for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) { _loop(); } } catch (err) { _iterator2.e(err); } finally { _iterator2.f(); } } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } }); var rolesMap = { entries: function entries() { return roles$1; }, forEach: function forEach(fn) { var thisArg = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; var _iterator3 = _createForOfIteratorHelper$2(roles$1), _step3; try { for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) { var _step3$value = _slicedToArray$2(_step3.value, 2), key = _step3$value[0], values = _step3$value[1]; fn.call(thisArg, values, key, roles$1); } } catch (err) { _iterator3.e(err); } finally { _iterator3.f(); } }, get: function get(key) { var item = roles$1.find(function (tuple) { return tuple[0] === key ? true : false; }); return item && item[1]; }, has: function has(key) { return !!rolesMap.get(key); }, keys: function keys() { return roles$1.map(function (_ref5) { var _ref6 = _slicedToArray$2(_ref5, 1), key = _ref6[0]; return key; }); }, values: function values() { return roles$1.map(function (_ref7) { var _ref8 = _slicedToArray$2(_ref7, 2), values = _ref8[1]; return values; }); } }; var _default$2 = (0, _iterationDecorator$2.default)(rolesMap, rolesMap.entries()); rolesMap$1.default = _default$2; var elementRoleMap$1 = {}; var lite = {}; var has = Object.prototype.hasOwnProperty; function dequal(foo, bar) { var ctor, len; if (foo === bar) return true; if (foo && bar && (ctor=foo.constructor) === bar.constructor) { if (ctor === Date) return foo.getTime() === bar.getTime(); if (ctor === RegExp) return foo.toString() === bar.toString(); if (ctor === Array) { if ((len=foo.length) === bar.length) { while (len-- && dequal(foo[len], bar[len])); } return len === -1; } if (!ctor || typeof foo === 'object') { len = 0; for (ctor in foo) { if (has.call(foo, ctor) && ++len && !has.call(bar, ctor)) return false; if (!(ctor in bar) || !dequal(foo[ctor], bar[ctor])) return false; } return Object.keys(bar).length === len; } } return foo !== foo && bar !== bar; } lite.dequal = dequal; Object.defineProperty(elementRoleMap$1, "__esModule", { value: true }); elementRoleMap$1.default = void 0; var _lite = lite; var _iterationDecorator$1 = _interopRequireDefault$2(iterationDecorator$1); var _rolesMap$2 = _interopRequireDefault$2(rolesMap$1); function _interopRequireDefault$2(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _slicedToArray$1(arr, i) { return _arrayWithHoles$1(arr) || _iterableToArrayLimit$1(arr, i) || _unsupportedIterableToArray$1(arr, i) || _nonIterableRest$1(); } function _nonIterableRest$1() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _iterableToArrayLimit$1(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } function _arrayWithHoles$1(arr) { if (Array.isArray(arr)) return arr; } function _createForOfIteratorHelper$1(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray$1(o)) || allowArrayLike) { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e2) { throw _e2; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e3) { didErr = true; err = _e3; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; } function _unsupportedIterableToArray$1(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray$1(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray$1(o, minLen); } function _arrayLikeToArray$1(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } var elementRoles$1 = []; var keys$1 = _rolesMap$2.default.keys(); for (var i$1 = 0; i$1 < keys$1.length; i$1++) { var key$1 = keys$1[i$1]; var role$1 = _rolesMap$2.default.get(key$1); if (role$1) { var concepts$1 = [].concat(role$1.baseConcepts, role$1.relatedConcepts); for (var k$1 = 0; k$1 < concepts$1.length; k$1++) { var relation$1 = concepts$1[k$1]; if (relation$1.module === 'HTML') { (function () { var concept = relation$1.concept; if (concept) { var elementRoleRelation = elementRoles$1.find(function (relation) { return (0, _lite.dequal)(relation, concept); }); var roles; if (elementRoleRelation) { roles = elementRoleRelation[1]; } else { roles = []; } var isUnique = true; for (var _i = 0; _i < roles.length; _i++) { if (roles[_i] === key$1) { isUnique = false; break; } } if (isUnique) { roles.push(key$1); } elementRoles$1.push([concept, roles]); } })(); } } } } var elementRoleMap = { entries: function entries() { return elementRoles$1; }, forEach: function forEach(fn) { var thisArg = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; var _iterator = _createForOfIteratorHelper$1(elementRoles$1), _step; try { for (_iterator.s(); !(_step = _iterator.n()).done;) { var _step$value = _slicedToArray$1(_step.value, 2), _key = _step$value[0], values = _step$value[1]; fn.call(thisArg, values, _key, elementRoles$1); } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } }, get: function get(key) { var item = elementRoles$1.find(function (tuple) { return key.name === tuple[0].name && (0, _lite.dequal)(key.attributes, tuple[0].attributes); }); return item && item[1]; }, has: function has(key) { return !!elementRoleMap.get(key); }, keys: function keys() { return elementRoles$1.map(function (_ref) { var _ref2 = _slicedToArray$1(_ref, 1), key = _ref2[0]; return key; }); }, values: function values() { return elementRoles$1.map(function (_ref3) { var _ref4 = _slicedToArray$1(_ref3, 2), values = _ref4[1]; return values; }); } }; var _default$1 = (0, _iterationDecorator$1.default)(elementRoleMap, elementRoleMap.entries()); elementRoleMap$1.default = _default$1; var roleElementMap$1 = {}; Object.defineProperty(roleElementMap$1, "__esModule", { value: true }); roleElementMap$1.default = void 0; var _iterationDecorator = _interopRequireDefault$1(iterationDecorator$1); var _rolesMap$1 = _interopRequireDefault$1(rolesMap$1); function _interopRequireDefault$1(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike) { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e2) { throw _e2; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e3) { didErr = true; err = _e3; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } var roleElement = []; var keys = _rolesMap$1.default.keys(); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var role = _rolesMap$1.default.get(key); var relationConcepts = []; if (role) { var concepts = [].concat(role.baseConcepts, role.relatedConcepts); for (var k = 0; k < concepts.length; k++) { var relation = concepts[k]; if (relation.module === 'HTML') { var concept = relation.concept; if (concept != null) { relationConcepts.push(concept); } } } if (relationConcepts.length > 0) { roleElement.push([key, relationConcepts]); } } } var roleElementMap = { entries: function entries() { return roleElement; }, forEach: function forEach(fn) { var thisArg = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; var _iterator = _createForOfIteratorHelper(roleElement), _step; try { for (_iterator.s(); !(_step = _iterator.n()).done;) { var _step$value = _slicedToArray(_step.value, 2), _key = _step$value[0], values = _step$value[1]; fn.call(thisArg, values, _key, roleElement); } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } }, get: function get(key) { var item = roleElement.find(function (tuple) { return tuple[0] === key ? true : false; }); return item && item[1]; }, has: function has(key) { return !!roleElementMap.get(key); }, keys: function keys() { return roleElement.map(function (_ref) { var _ref2 = _slicedToArray(_ref, 1), key = _ref2[0]; return key; }); }, values: function values() { return roleElement.map(function (_ref3) { var _ref4 = _slicedToArray(_ref3, 2), values = _ref4[1]; return values; }); } }; var _default = (0, _iterationDecorator.default)(roleElementMap, roleElementMap.entries()); roleElementMap$1.default = _default; Object.defineProperty(lib, "__esModule", { value: true }); var roles_1 = lib.roles = roleElements_1 = lib.roleElements = elementRoles_1 = lib.elementRoles = lib.dom = lib.aria = void 0; var _ariaPropsMap = _interopRequireDefault(ariaPropsMap$1); var _domMap = _interopRequireDefault(domMap$1); var _rolesMap = _interopRequireDefault(rolesMap$1); var _elementRoleMap = _interopRequireDefault(elementRoleMap$1); var _roleElementMap = _interopRequireDefault(roleElementMap$1); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var aria = _ariaPropsMap.default; lib.aria = aria; var dom = _domMap.default; lib.dom = dom; var roles = _rolesMap.default; roles_1 = lib.roles = roles; var elementRoles = _elementRoleMap.default; var elementRoles_1 = lib.elementRoles = elementRoles; var roleElements = _roleElementMap.default; var roleElements_1 = lib.roleElements = roleElements; var lzString$1 = {exports: {}}; (function (module) { // Copyright (c) 2013 Pieroxy <[email protected]> // This work is free. You can redistribute it and/or modify it // under the terms of the WTFPL, Version 2 // For more information see LICENSE.txt or http://www.wtfpl.net/ // // For more information, the home page: // http://pieroxy.net/blog/pages/lz-string/testing.html // // LZ-based compression algorithm, version 1.4.5 var LZString = (function() { // private property var f = String.fromCharCode; var keyStrBase64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; var keyStrUriSafe = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-$"; var baseReverseDic = {}; function getBaseValue(alphabet, character) { if (!baseReverseDic[alphabet]) { baseReverseDic[alphabet] = {}; for (var i=0 ; i<alphabet.length ; i++) { baseReverseDic[alphabet][alphabet.charAt(i)] = i; } } return baseReverseDic[alphabet][character]; } var LZString = { compressToBase64 : function (input) { if (input == null) return ""; var res = LZString._compress(input, 6, function(a){return keyStrBase64.charAt(a);}); switch (res.length % 4) { // To produce valid Base64 default: // When could this happen ? case 0 : return res; case 1 : return res+"==="; case 2 : return res+"=="; case 3 : return res+"="; } }, decompressFromBase64 : function (input) { if (input == null) return ""; if (input == "") return null; return LZString._decompress(input.length, 32, function(index) { return getBaseValue(keyStrBase64, input.charAt(index)); }); }, compressToUTF16 : function (input) { if (input == null) return ""; return LZString._compress(input, 15, function(a){return f(a+32);}) + " "; }, decompressFromUTF16: function (compressed) { if (compressed == null) return ""; if (compressed == "") return null; return LZString._decompress(compressed.length, 16384, function(index) { return compressed.charCodeAt(index) - 32; }); }, //compress into uint8array (UCS-2 big endian format) compressToUint8Array: function (uncompressed) { var compressed = LZString.compress(uncompressed); var buf=new Uint8Array(compressed.length*2); // 2 bytes per character for (var i=0, TotalLen=compressed.length; i<TotalLen; i++) { var current_value = compressed.charCodeAt(i); buf[i*2] = current_value >>> 8; buf[i*2+1] = current_value % 256; } return buf; }, //decompress from uint8array (UCS-2 big endian format) decompressFromUint8Array:function (compressed) { if (compressed===null || compressed===undefined){ return LZString.decompress(compressed); } else { var buf=new Array(compressed.length/2); // 2 bytes per character for (var i=0, TotalLen=buf.length; i<TotalLen; i++) { buf[i]=compressed[i*2]*256+compressed[i*2+1]; } var result = []; buf.forEach(function (c) { result.push(f(c)); }); return LZString.decompress(result.join('')); } }, //compress into a string that is already URI encoded compressToEncodedURIComponent: function (input) { if (input == null) return ""; return LZString._compress(input, 6, function(a){return keyStrUriSafe.charAt(a);}); }, //decompress from an output of compressToEncodedURIComponent decompressFromEncodedURIComponent:function (input) { if (input == null) return ""; if (input == "") return null; input = input.replace(/ /g, "+"); return LZString._decompress(input.length, 32, function(index) { return getBaseValue(keyStrUriSafe, input.charAt(index)); }); }, compress: function (uncompressed) { return LZString._compress(uncompressed, 16, function(a){return f(a);}); }, _compress: function (uncompressed, bitsPerChar, getCharFromInt) { if (uncompressed == null) return ""; var i, value, context_dictionary= {}, context_dictionaryToCreate= {}, context_c="", context_wc="", context_w="", context_enlargeIn= 2, // Compensate for the first entry which should not count context_dictSize= 3, context_numBits= 2, context_data=[], context_data_val=0, context_data_position=0, ii; for (ii = 0; ii < uncompressed.length; ii += 1) { context_c = uncompressed.charAt(ii); if (!Object.prototype.hasOwnProperty.call(context_dictionary,context_c)) { context_dictionary[context_c] = context_dictSize++; context_dictionaryToCreate[context_c] = true; } context_wc = context_w + context_c; if (Object.prototype.hasOwnProperty.call(context_dictionary,context_wc)) { context_w = context_wc; } else { if (Object.prototype.hasOwnProperty.call(context_dictionaryToCreate,context_w)) { if (context_w.charCodeAt(0)<256) { for (i=0 ; i<context_numBits ; i++) { context_data_val = (context_data_val << 1); if (context_data_position == bitsPerChar-1) { context_data_position = 0; context_data.push(getCharFromInt(context_data_val)); context_data_val = 0; } else { context_data_position++; } } value = context_w.charCodeAt(0); for (i=0 ; i<8 ; i++) { context_data_val = (context_data_val << 1) | (value&1); if (context_data_position == bitsPerChar-1) { context_data_position = 0; context_data.push(getCharFromInt(context_data_val)); context_data_val = 0; } else { context_data_position++; } value = value >> 1; } } else { value = 1; for (i=0 ; i<context_numBits ; i++) { context_data_val = (context_data_val << 1) | value; if (context_data_position ==bitsPerChar-1) { context_data_position = 0; context_data.push(getCharFromInt(context_data_val)); context_data_val = 0; } else { context_data_position++; } value = 0; } value = context_w.charCodeAt(0); for (i=0 ; i<16 ; i++) { context_data_val = (context_data_val << 1) | (value&1); if (context_data_position == bitsPerChar-1) { context_data_position = 0; context_data.push(getCharFromInt(context_data_val)); context_data_val = 0; } else { context_data_position++; } value = value >> 1; } } context_enlargeIn--; if (context_enlargeIn == 0) { context_enlargeIn = Math.pow(2, context_numBits); context_numBits++; } delete context_dictionaryToCreate[context_w]; } else { value = context_dictionary[context_w]; for (i=0 ; i<context_numBits ; i++) { context_data_val = (context_data_val << 1) | (value&1); if (context_data_position == bitsPerChar-1) { context_data_position = 0; context_data.push(getCharFromInt(context_data_val)); context_data_val = 0; } else { context_data_position++; } value = value >> 1; } } context_enlargeIn--; if (context_enlargeIn == 0) { context_enlargeIn = Math.pow(2, context_numBits); context_numBits++; } // Add wc to the dictionary. context_dictionary[context_wc] = context_dictSize++; context_w = String(context_c); } } // Output the code for w. if (context_w !== "") { if (Object.prototype.hasOwnProperty.call(context_dictionaryToCreate,context_w)) { if (context_w.charCodeAt(0)<256) { for (i=0 ; i<context_numBits ; i++) { context_data_val = (context_data_val << 1); if (context_data_position == bitsPerChar-1) { context_data_position = 0; context_data.push(getCharFromInt(context_data_val)); context_data_val = 0; } else { context_data_position++; } } value = context_w.charCodeAt(0); for (i=0 ; i<8 ; i++) { context_data_val = (context_data_val << 1) | (value&1); if (context_data_position == bitsPerChar-1) { context_data_position = 0; context_data.push(getCharFromInt(context_data_val)); context_data_val = 0; } else { context_data_position++; } value = value >> 1; } } else { value = 1; for (i=0 ; i<context_numBits ; i++) { context_data_val = (context_data_val << 1) | value; if (context_data_position == bitsPerChar-1) { context_data_position = 0; context_data.push(getCharFromInt(context_data_val)); context_data_val = 0; } else { context_data_position++; } value = 0; } value = context_w.charCodeAt(0); for (i=0 ; i<16 ; i++) { context_data_val = (context_data_val << 1) | (value&1); if (context_data_position == bitsPerChar-1) { context_data_position = 0; context_data.push(getCharFromInt(context_data_val)); context_data_val = 0; } else { context_data_position++; } value = value >> 1; } } context_enlargeIn--; if (context_enlargeIn == 0) { context_enlargeIn = Math.pow(2, context_numBits); context_numBits++; } delete context_dictionaryToCreate[context_w]; } else { value = context_dictionary[context_w]; for (i=0 ; i<context_numBits ; i++) { context_data_val = (context_data_val << 1) | (value&1); if (context_data_position == bitsPerChar-1) { context_data_position = 0; context_data.push(getCharFromInt(context_data_val)); context_data_val = 0; } else { context_data_position++; } value = value >> 1; } } context_enlargeIn--; if (context_enlargeIn == 0) { context_enlargeIn = Math.pow(2, context_numBits); context_numBits++; } } // Mark the end of the stream value = 2; for (i=0 ; i<context_numBits ; i++) { context_data_val = (context_data_val << 1) | (value&1); if (context_data_position == bitsPerChar-1) { context_data_position = 0; context_data.push(getCharFromInt(context_data_val)); context_data_val = 0; } else { context_data_position++; } value = value >> 1; } // Flush the last char while (true) { context_data_val = (context_data_val << 1); if (context_data_position == bitsPerChar-1) { context_data.push(getCharFromInt(context_data_val)); break; } else context_data_position++; } return context_data.join(''); }, decompress: function (compressed) { if (compressed == null) return ""; if (compressed == "") return null; return LZString._decompress(compressed.length, 32768, function(index) { return compressed.charCodeAt(index); }); }, _decompress: function (length, resetValue, getNextValue) { var dictionary = [], enlargeIn = 4, dictSize = 4, numBits = 3, entry = "", result = [], i, w, bits, resb, maxpower, power, c, data = {val:getNextValue(0), position:resetValue, index:1}; for (i = 0; i < 3; i += 1) { dictionary[i] = i; } bits = 0; maxpower = Math.pow(2,2); power=1; while (power!=maxpower) { resb = data.val & data.position; data.position >>= 1; if (data.position == 0) { data.position = resetValue; data.val = getNextValue(data.index++); } bits |= (resb>0 ? 1 : 0) * power; power <<= 1; } switch (bits) { case 0: bits = 0; maxpower = Math.pow(2,8); power=1; while (power!=maxpower) { resb = data.val & data.position; data.position >>= 1; if (data.position == 0) { data.position = resetValue; data.val = getNextValue(data.index++); } bits |= (resb>0 ? 1 : 0) * power; power <<= 1; } c = f(bits); break; case 1: bits = 0; maxpower = Math.pow(2,16); power=1; while (power!=maxpower) { resb = data.val & data.position; data.position >>= 1; if (data.position == 0) { data.position = resetValue; data.val = getNextValue(data.index++); } bits |= (resb>0 ? 1 : 0) * power; power <<= 1; } c = f(bits); break; case 2: return ""; } dictionary[3] = c; w = c; result.push(c); while (true) { if (data.index > length) { return ""; } bits = 0; maxpower = Math.pow(2,numBits); power=1; while (power!=maxpower) { resb = data.val & data.position; data.position >>= 1; if (data.position == 0) { data.position = resetValue; data.val = getNextValue(data.index++); } bits |= (resb>0 ? 1 : 0) * power; power <<= 1; } switch (c = bits) { case 0: bits = 0; maxpower = Math.pow(2,8); power=1; while (power!=maxpower) { resb = data.val & data.position; data.position >>= 1; if (data.position == 0) { data.position = resetValue; data.val = getNextValue(data.index++); } bits |= (resb>0 ? 1 : 0) * power; power <<= 1; } dictionary[dictSize++] = f(bits); c = dictSize-1; enlargeIn--; break; case 1: bits = 0; maxpower = Math.pow(2,16); power=1; while (power!=maxpower) { resb = data.val & data.position; data.position >>= 1; if (data.position == 0) { data.position = resetValue; data.val = getNextValue(data.index++); } bits |= (resb>0 ? 1 : 0) * power; power <<= 1; } dictionary[dictSize++] = f(bits); c = dictSize-1; enlargeIn--; break; case 2: return result.join(''); } if (enlargeIn == 0) { enlargeIn = Math.pow(2, numBits); numBits++; } if (dictionary[c]) { entry = dictionary[c]; } else { if (c === dictSize) { entry = w + w.charAt(0); } else { return null; } } result.push(entry); // Add w+entry[0] to the dictionary. dictionary[dictSize++] = w + entry.charAt(0); enlargeIn--; w = entry; if (enlargeIn == 0) { enlargeIn = Math.pow(2, numBits); numBits++; } } } }; return LZString; })(); if( module != null ) { module.exports = LZString; } else if( typeof angular !== 'undefined' && angular != null ) { angular.module('LZString', []) .factory('LZString', function () { return LZString; }); } } (lzString$1)); var lzStringExports = lzString$1.exports; const lzString = /*@__PURE__*/getDefaultExportFromCjs(lzStringExports); var define_process_env_default = {}; function escapeHTML(str) { return str.replace(/</g, "<").replace(/>/g, ">"); } const printProps = (keys, props, config2, indentation, depth, refs, printer) => { const indentationNext = indentation + config2.indent; const colors = config2.colors; return keys.map((key) => { const value = props[key]; let printed = printer(value, config2, indentationNext, depth, refs); if (typeof value !== "string") { if (printed.indexOf("\n") !== -1) { printed = config2.spacingOuter + indentationNext + printed + config2.spacingOuter + indentation; } printed = "{" + printed + "}"; } return config2.spacingInner + indentation + colors.prop.open + key + colors.prop.close + "=" + colors.value.open + printed + colors.value.close; }).join(""); }; const NodeTypeTextNode = 3; const printChildren = (children, config2, indentation, depth, refs, printer) => children.map((child) => { const printedChild = typeof child === "string" ? printText(child, config2) : printer(child, config2, indentation, depth, refs); if (printedChild === "" && typeof child === "object" && child !== null && child.nodeType !== NodeTypeTextNode) { return ""; } return config2.spacingOuter + indentation + printedChild; }).join(""); const printText = (text, config2) => { const contentColor = config2.colors.content; return contentColor.open + escapeHTML(text) + contentColor.close; }; const printComment = (comment, config2) => { const commentColor = config2.colors.comment; return commentColor.open + "<!--" + escapeHTML(comment) + "-->" + commentColor.close; }; const printElement = (type, printedProps, printedChildren, config2, indentation) => { const tagColor = config2.colors.tag; return tagColor.open + "<" + type + (printedProps && tagColor.close + printedProps + config2.spacingOuter + indentation + tagColor.open) + (printedChildren ? ">" + tagColor.close + printedChildren + config2.spacingOuter + indentation + tagColor.open + "</" + type : (printedProps && !config2.min ? "" : " ") + "/") + ">" + tagColor.close; }; const printElementAsLeaf = (type, config2) => { const tagColor = config2.colors.tag; return tagColor.open + "<" + type + tagColor.close + " …" + tagColor.open + " />" + tagColor.close; }; const ELEMENT_NODE$1 = 1; const TEXT_NODE$1 = 3; const COMMENT_NODE$1 = 8; const FRAGMENT_NODE = 11; const ELEMENT_REGEXP = /^((HTML|SVG)\w*)?Element$/; const isCustomElement = (val) => { const { tagName } = val; return Boolean(typeof tagName === "string" && tagName.includes("-") || typeof val.hasAttribute === "function" && val.hasAttribute("is")); }; const testNode = (val) => { const constructorName = val.constructor.name; const { nodeType } = val; return nodeType === ELEMENT_NODE$1 && (ELEMENT_REGEXP.test(constructorName) || isCustomElement(val)) || nodeType === TEXT_NODE$1 && constructorName === "Text" || nodeType === COMMENT_NODE$1 && constructorName === "Comment" || nodeType === FRAGMENT_NODE && constructorName === "DocumentFragment"; }; function nodeIsText(node) { return node.nodeType === TEXT_NODE$1; } function nodeIsComment(node) { return node.nodeType === COMMENT_NODE$1; } function nodeIsFragment(node) { return node.nodeType === FRAGMENT_NODE; } function createDOMElementFilter(filterNode) { return { test: (val) => { var _val$constructor2; return ((val == null || (_val$constructor2 = val.constructor) == null ? void 0 : _val$constructor2.name) || isCustomElement(val)) && testNode(val); }, serialize: (node, config2, indentation, depth, refs, printer) => { if (nodeIsText(node)) { return printText(node.data, config2); } if (nodeIsComment(node)) { return printComment(node.data, config2); } const type = nodeIsFragment(node) ? "DocumentFragment" : node.tagName.toLowerCase(); if (++depth > config2.maxDepth) { return printElementAsLeaf(type, config2); } return printElement(type, printProps(nodeIsFragment(node) ? [] : Array.from(node.attributes).map((attr) => attr.name).sort(), nodeIsFragment(node) ? {} : Array.from(node.attributes).reduce((props, attribute) => { props[attribute.name] = attribute.value; return props; }, {}), config2, indentation + config2.indent, depth, refs, printer), printChildren(Array.prototype.slice.call(node.childNodes || node.children).filter(filterNode), config2, indentation + config2.indent, depth, refs, printer), config2, indentation); } }; } let picocolors = null; let readFileSync = null; let codeFrameColumns = null; try { const nodeRequire = module && module.require; readFileSync = nodeRequire.call(module, "fs").readFileSync; codeFrameColumns = nodeRequire.call(module, "@babel/code-frame").codeFrameColumns; picocolors = nodeRequire.call(module, "picocolors"); } catch { } function getCodeFrame(frame) { const locationStart = frame.indexOf("(") + 1; const locationEnd = frame.indexOf(")"); const frameLocation = frame.slice(locationStart, locationEnd); const frameLocationElements = frameLocation.split(":"); const [filename, line, column] = [frameLocationElements[0], parseInt(frameLocationElements[1], 10), parseInt(frameLocationElements[2], 10)]; let rawFileContents = ""; try { rawFileContents = readFileSync(filename, "utf-8"); } catch { return ""; } const codeFrame = codeFrameColumns(rawFileContents, { start: { line, column } }, { highlightCode: true, linesBelow: 0 }); return picocolors.dim(frameLocation) + "\n" + codeFrame + "\n"; } function getUserCodeFrame() { if (!readFileSync || !codeFrameColumns) { return ""; } const err = new Error(); const firstClientCodeFrame = err.stack.split("\n").slice(1).find((frame) => !frame.includes("node_modules/")); return getCodeFrame(firstClientCodeFrame); } const TEXT_NODE = 3; function jestFakeTimersAreEnabled() { if (typeof jest !== "undefined" && jest !== null) { return ( // legacy timers setTimeout._isMockFunction === true || // modern timers // eslint-disable-next-line prefer-object-has-own -- not supported by our support matrix Object.prototype.hasOwnProperty.call(setTimeout, "clock") ); } return false; } function getDocument$1() { if (typeof window === "undefined") { throw new Error("Could not find default container"); } return window.document; } function getWindowFromNode(node) { if (node.defaultView) { return node.defaultView; } else if (node.ownerDocument && node.ownerDocument.defaultView) { return node.ownerDocument.defaultView; } else if (node.window) { return node.window; } else if (node.ownerDocument && node.ownerDocument.defaultView === null) { throw new Error("It looks like the window object is not available for the provided node."); } else if (node.then instanceof Function) { throw new Error("It looks like you passed a Promise object instead of a DOM node. Did you do something like `fireEvent.click(screen.findBy...` when you meant to use a `getBy` query `fireEvent.click(screen.getBy...`, or await the findBy query `fireEvent.click(await screen.findBy...`?"); } else if (Array.isArray(node)) { throw new Error("It looks like you passed an Array instead of a DOM node. Did you do something like `fireEvent.click(screen.getAllBy...` when you meant to use a `getBy` query `fireEvent.click(screen.getBy...`?"); } else if (typeof node.debug === "function" && typeof node.logTestingPlaygroundURL === "function") { throw new Error("It looks like you passed a `screen` object. Did you do something like `fireEvent.click(screen, ...` when you meant to use a query, e.g. `fireEvent.click(screen.getBy..., `?"); } else { throw new Error("The given node is not an Element, the node type is: " + typeof node + "."); } } function checkContainerType(container) { if (!container || !(typeof container.querySelector === "function") || !(typeof container.querySelectorAll === "function")) { throw new TypeError("Expected container to be an Element, a Document or a DocumentFragment but got " + getTypeName(container) + "."); } function getTypeName(object) { if (typeof object === "object") { return object === null ? "null" : object.constructor.name; } return typeof object; } } const shouldHighlight = () => { if (typeof process === "undefined") { return false; } let colors; try { var _process$env; const colorsJSON = (_process$env = define_process_env_default) == null ? void 0 : _process$env.COLORS; if (colorsJSON) { colors = JSON.parse(colorsJSON); } } catch { } if (typeof colors === "boolean") { return colors; } else { return process.versions !== void 0 && process.versions.node !== void 0; } }; const { DOMCollection } = plugins_1; const ELEMENT_NODE = 1; const COMMENT_NODE = 8; function filterCommentsAndDefaultIgnoreTagsTags(value) { return value.nodeType !== COMMENT_NODE && (value.nodeType !== ELEMENT_NODE || !value.matches(getConfig().defaultIgnore)); } function prettyDOM(dom, maxLength, options) { if (options === void 0) { options = {}; } if (!dom) { dom = getDocument$1().body; } if (typeof maxLength !== "number") { maxLength = typeof process !== "undefined" && typeof define_process_env_default !== "undefined" && define_process_env_default.DEBUG_PRINT_LIMIT || 7e3; } if (maxLength === 0) { return ""; } if (dom.documentElement) { dom = dom.documentElement; } let domTypeName = typeof dom; if (domTypeName === "object") { domTypeName = dom.constructor.name; } else { dom = {}; } if (!("outerHTML" in dom)) { throw new TypeError("Expected an element or document but got " + domTypeName); } const { filterNode = filterCommentsAndDefaultIgnoreTagsTags, ...prettyFormatOptions } = options; const debugContent = format_1(dom, { plugins: [createDOMElementFilter(filterNode), DOMCollection], printFunctionName: false, highlight: shouldHighlight(), ...prettyFormatOptions }); return maxLength !== void 0 && dom.outerHTML.length > maxLength ? debugContent.slice(0, maxLength) + "..." : debugContent; } const logDOM = function() { const userCodeFrame = getUserCodeFrame(); if (userCodeFrame) { console.log(prettyDOM(...arguments) + "\n\n" + userCodeFrame); } else { console.log(prettyDOM(...arguments)); } }; let config = { testIdAttribute: "data-testid", asyncUtilTimeout: 1e3, // asyncWrapper and advanceTimersWrapper is to support React's async `act` function. // forcing react-testing-library to wrap all async functions would've been // a total nightmare (consider wrapping every findBy* query and then also // updating `within` so those would be wrapped too. Total nightmare). // so we have this config option that's really only intended for // react-testing-library to use. For that reason, this feature will remain // undocumented. asyncWrapper: (cb) => cb(), unstable_advanceTimersWrapper: (cb) => cb(), eventWrapper: (cb) => cb(), // default value for the `hidden` option in `ByRole` queries defaultHidden: false, // default value for the `ignore` option in `ByText` queries defaultIgnore: "script, style", // showOriginalStackTrace flag to show the full error stack traces for async errors showOriginalStackTrace: false, // throw errors w/ suggestions for better queries. Opt in so off by default. throwSuggestions: false, // called when getBy* queries fail. (message, container) => Error getElementError(message, container) { const prettifiedDOM = prettyDOM(container); const error = new Error([message, "Ignored nodes: comments, " + config.defaultIgnore + "\n" + prettifiedDOM].filter(Boolean).join("\n\n")); error.name = "TestingLibraryElementError"; return error; }, _disableExpensiveErrorDiagnostics: false, computedStyleSupportsPseudoElements: false }; function runWithExpensiveErrorDiagnosticsDisabled(callback) { try { config._disableExpensiveErrorDiagnostics = true; return callback(); } finally { config._disableExpensiveErrorDiagnostics = false; } } function getConfig() { return config; } const labelledNodeNames = ["button", "meter", "output", "progress", "select", "textarea", "input"]; function getTextContent(node) { if (labelledNodeNames.includes(node.nodeName.toLowerCase())) { return ""; } if (node.nodeType === TEXT_NODE) return node.textContent; return Array.from(node.childNodes).map((childNode) => getTextContent(childNode)).join(""); } function getLabelContent(element) { let textContent; if (element.tagName.toLowerCase() === "label") { textContent = getTextContent(element); } else { textContent = element.value || element.textContent; } return textContent; } function getRealLabels(element) { if (element.labels !== void 0) { var _labels; return (_labels = element.labels) != null ? _labels : []; } if (!isLabelable(element)) return []; const labels = element.ownerDocument.querySelectorAll("label"); return Array.from(labels).filter((label) => label.control === element); } function isLabelable(element) { return /BUTTON|METER|OUTPUT|PROGRESS|SELECT|TEXTAREA/.test(element.tagName) || element.tagName === "INPUT" && element.getAttribute("type") !== "hidden"; } function getLabels(container, element, _temp) { let { selector = "*" } = _temp === void 0 ? {} : _temp; const ariaLabelledBy = element.getAttribute("aria-labelledby"); const labelsId = ariaLabelledBy ? ariaLabelledBy.split(" ") : []; return labelsId.length ? labelsId.map((labelId) => { const labellingElement = container.querySelector('[id="' + labelId + '"]'); return labellingElement ? { content: getLabelContent(labellingElement), formControl: null } : { content: "", formControl: null }; }) : Array.from(getRealLabels(element)).map((label) => { const textToMatch = getLabelContent(label); const formControlSelector = "button, input, meter, output, progress, select, textarea"; const labelledFormControl = Array.from(label.querySelectorAll(formControlSelector)).filter((formControlElement) => formControlElement.matches(selector))[0]; return { content: textToMatch, formControl: labelledFormControl }; }); } function assertNotNullOrUndefined(matcher) { if (matcher === null || matcher === void 0) { throw new Error( // eslint-disable-next-line @typescript-eslint/restrict-template-expressions -- implicitly converting `T` to `string` "It looks like " + matcher + " was passed instead of a matcher. Did you do something like getByText(" + matcher + ")?" ); } } function fuzzyMatches(textToMatch, node, matcher, normalizer) { if (typeof textToMatch !== "string") { return false; } assertNotNullOrUndefined(matcher); const normalizedText = normalizer(textToMatch); if (typeof matcher === "string" || typeof matcher === "number") { return normalizedText.toLowerCase().includes(matcher.toString().toLowerCase()); } else if (typeof matcher === "function") { return matcher(normalizedText, node); } else { return matchRegExp(matcher, normalizedText); } } function matches(textToMatch, node, matcher, normalizer) { if (typeof textToMatch !== "string") { return false; } assertNotNullOrUndefined(matcher); const normalizedText = normalizer(textToMatch); if (matcher instanceof Function) { return matcher(normalizedText, node); } else if (matcher instanceof RegExp) { return matchRegExp(matcher, normalizedText); } else { return normalizedText === String(matcher); } } function getDefaultNormalizer(_temp) { let { trim = true, collapseWhitespace = true } = _temp === void 0 ? {} : _temp; return (text) => { let normalizedText = text; normalizedText = trim ? normalizedText.trim() : normalizedText; normalizedText = collapseWhitespace ? normalizedText.replace(/\s+/g, " ") : normalizedText; return normalizedText; }; } function makeNormalizer(_ref) { let { trim, collapseWhitespace, normalizer } = _ref; if (!normalizer) { return getDefaultNormalizer({ trim, collapseWhitespace }); } if (typeof trim !== "undefined" || typeof collapseWhitespace !== "undefined") { throw new Error('trim and collapseWhitespace are not supported with a normalizer. If you want to use the default trim and collapseWhitespace logic in your normalizer, use "getDefaultNormalizer({trim, collapseWhitespace})" and compose that into your normalizer'); } return normalizer; } function matchRegExp(matcher, text) { const match = matcher.test(text); if (matcher.global && matcher.lastIndex !== 0) { console.warn("To match all elements we had to reset the lastIndex of the RegExp because the global flag is enabled. We encourage to remove the global flag from the RegExp."); matcher.lastIndex = 0; } return match; } function getNodeText(node) { if (node.matches("input[type=submit], input[type=button], input[type=reset]")) { return node.value; } return Array.from(node.childNodes).filter((child) => child.nodeType === TEXT_NODE && Boolean(child.textContent)).map((c) => c.textContent).join(""); } const elementRoleList = buildElementRoleList(elementRoles_1); function isSubtreeInaccessible(element) { if (element.hidden === true) { return true; } if (element.getAttribute("aria-hidden") === "true") { return true; } const window2 = element.ownerDocument.defaultView; if (window2.getComputedStyle(element).display === "none") { return true; } return false; } function isInaccessible(element, options) { if (options === void 0) { options = {}; } const { isSubtreeInaccessible: isSubtreeInaccessibleImpl = isSubtreeInaccessible } = options; const window2 = element.ownerDocument.defaultView; if (window2.getComputedStyle(element).visibility === "hidden") { return true; } let currentElement = element; while (currentElement) { if (isSubtreeInaccessibleImpl(currentElement)) { return true; } currentElement = currentElement.parentElement; } return false; } function getImplicitAriaRoles(currentNode) { for (const { match, roles: roles2 } of elementRoleList) { if (match(currentNode)) { return [...roles2]; } } return []; } function buildElementRoleList(elementRolesMap) { function makeElementSelector(_ref) { let { name, attributes } = _ref; return "" + name + attributes.map((_ref2) => { let { name: attributeName, value, constraints = [] } = _ref2; const shouldNotExist = constraints.indexOf("undefined") !== -1; const shouldBeNonEmpty = constraints.indexOf("set") !== -1; const hasExplicitValue = typeof value !== "undefined"; if (hasExplicitValue) { return "[" + attributeName + '="' + value + '"]'; } else if (shouldNotExist) { return ":not([" + attributeName + "])"; } else if (shouldBeNonEmpty) { return "[" + attributeName + "]:not([" + attributeName + '=""])'; } return "[" + attributeName + "]"; }).join(""); } function getSelectorSpecificity(_ref3) { let { attributes = [] } = _ref3; return attributes.length; } function bySelectorSpecificity(_ref4, _ref5) { let { specificity: leftSpecificity } = _ref4; let { specificity: rightSpecificity } = _ref5; return rightSpecificity - leftSpecificity; } function match(element) { let { attributes = [] } = element; const typeTextIndex = attributes.findIndex((attribute) => attribute.value && attribute.name === "type" && attribute.value === "text"); if (typeTextIndex >= 0) { attributes = [...attributes.slice(0, typeTextIndex), ...attributes.slice(typeTextIndex + 1)]; } const selector = makeElementSelector({ ...element, attributes }); return (node) => { if (typeTextIndex >= 0 && node.type !== "text") { return false; } return node.matches(selector); }; } let result = []; for (const [element, roles2] of elementRolesMap.entries()) { result = [...result, { match: match(element), roles: Array.from(roles2), specificity: getSelectorSpecificity(element) }]; } return result.sort(bySelectorSpecificity); } function getRoles(container, _temp) { let { hidden = false } = _temp === void 0 ? {} : _temp; function flattenDOM(node) { return [node, ...Array.from(node.children).reduce((acc, child) => [...acc, ...flattenDOM(child)], [])]; } return flattenDOM(container).filter((element) => { return hidden === false ? isInaccessible(element) === false : true; }).reduce((acc, node) => { let roles2 = []; if (node.hasAttribute("role")) { roles2 = node.getAttribute("role").split(" ").slice(0, 1); } else { roles2 = getImplicitAriaRoles(node); } return roles2.reduce((rolesAcc, role) => Array.isArray(rolesAcc[role]) ? { ...rolesAcc, [role]: [...rolesAcc[role], node] } : { ...rolesAcc, [role]: [node] }, acc); }, {}); } function prettyRoles(dom, _ref6) { let { hidden, includeDescription } = _ref6; const roles2 = getRoles(dom, { hidden }); return Object.entries(roles2).filter((_ref7) => { let [role] = _ref7; return role !== "generic"; }).map((_ref8) => { let [role, elements] = _ref8; const delimiterBar = "-".repeat(50); const elementsString = elements.map((el) => { const nameString = 'Name "' + computeAccessibleName(el, { computedStyleSupportsPseudoElements: getConfig().computedStyleSupportsPseudoElements }) + '":\n'; const domString = prettyDOM(el.cloneNode(false)); if (includeDescription) { const descriptionString = 'Description "' + computeAccessibleDescription(el, { computedStyleSupportsPseudoElements: getConfig().computedStyleSupportsPseudoElements }) + '":\n'; return "" + nameString + descriptionString + domString; } return "" + nameString + domString; }).join("\n\n"); return role + ":\n\n" + elementsString + "\n\n" + delimiterBar; }).join("\n"); } function computeAriaSelected(element) { if (element.tagName === "OPTION") { return element.selected; } return checkBooleanAttribute(element, "aria-selected"); } function computeAriaBusy(element) { return element.getAttribute("aria-busy") === "true"; } function computeAriaChecked(element) { if ("indeterminate" in element && element.indeterminate) { return void 0; } if ("checked" in element) { return element.checked; } return checkBooleanAttribute(element, "aria-checked"); } function computeAriaPressed(element) { return checkBooleanAttribute(element, "aria-pressed"); } function computeAriaCurrent(element) { var _ref9, _checkBooleanAttribut; return (_ref9 = (_checkBooleanAttribut = checkBooleanAttribute(element, "aria-current")) != null ? _checkBooleanAttribut : element.getAttribute("aria-current")) != null ? _ref9 : false; } function computeAriaExpanded(element) { return checkBooleanAttribute(element, "aria-expanded"); } function checkBooleanAttribute(element, attribute) { const attributeValue = element.getAttribute(attribute); if (attributeValue === "true") { return true; } if (attributeValue === "false") { return false; } return void 0; } function computeHeadingLevel(element) { const implicitHeadingLevels = { H1: 1, H2: 2, H3: 3, H4: 4, H5: 5, H6: 6 }; const ariaLevelAttribute = element.getAttribute("aria-level") && Number(element.getAttribute("aria-level")); return ariaLevelAttribute || implicitHeadingLevels[element.tagName]; } function computeAriaValueNow(element) { const valueNow = element.getAttribute("aria-valuenow"); return valueNow === null ? void 0 : +valueNow; } function computeAriaValueMax(element) { const valueMax = element.getAttribute("aria-valuemax"); return valueMax === null ? void 0 : +valueMax; } function computeAriaValueMin(element) { const valueMin = element.getAttribute("aria-valuemin"); return valueMin === null ? void 0 : +valueMin; } function computeAriaValueText(element) { const valueText = element.getAttribute("aria-valuetext"); return valueText === null ? void 0 : valueText; } const normalize$1 = getDefaultNormalizer(); function escapeRegExp(string) { return string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); } function getRegExpMatcher(string) { return new RegExp(escapeRegExp(string.toLowerCase()), "i"); } function makeSuggestion(queryName, element, content, _ref) { let { variant, name } = _ref; let warning = ""; const queryOptions = {}; const queryArgs = [["Role", "TestId"].includes(queryName) ? content : getRegExpMatcher(content)]; if (name) { queryOptions.name = getRegExpMatcher(name); } if (queryName === "Role" && isInaccessible(element)) { queryOptions.hidden = true; warning = "Element is inaccessible. This means that the element and all its children are invisible to screen readers.\n If you are using the aria-hidden prop, make sure this is the right choice for your case.\n "; } if (Object.keys(queryOptions).length > 0) { queryArgs.push(queryOptions); } const queryMethod = variant + "By" + queryName; return { queryName, queryMethod, queryArgs, variant, warning, toString() { if (warning) { console.warn(warning); } let [text, options] = queryArgs; text = typeof text === "string" ? "'" + text + "'" : text; options = options ? ", { " + Object.entries(options).map((_ref2) => { let [k, v] = _ref2; return k + ": " + v; }).join(", ") + " }" : ""; return queryMethod + "(" + text + options + ")"; } }; } function canSuggest(currentMethod, requestedMethod, data) { return data && (true); } function getSuggestedQuery(element, variant, method) { var _element$getAttribute, _getImplicitAriaRoles; if (variant === void 0) { variant = "get"; } if (element.matches(getConfig().defaultIgnore)) { return void 0; } const role = (_element$getAttribute = element.getAttribute("role")) != null ? _element$getAttribute : (_getImplicitAriaRoles = getImplicitAriaRoles(element)) == null ? void 0 : _getImplicitAriaRoles[0]; if (role !== "generic" && canSuggest("Role", method, role)) { return makeSuggestion("Role", element, role, { variant, name: computeAccessibleName(element, { computedStyleSupportsPseudoElements: getConfig().computedStyleSupportsPseudoElements }) }); } const labelText = getLabels(document, element).map((label) => label.content).join(" "); if (canSuggest("LabelText", method, labelText)) { return makeSuggestion("LabelText", element, labelText, { variant }); } const placeholderText = element.getAttribute("placeholder"); if (canSuggest("PlaceholderText", method, placeholderText)) { return makeSuggestion("PlaceholderText", element, placeholderText, { variant }); } const textContent = normalize$1(getNodeText(element)); if (canSuggest("Text", method, textContent)) { return makeSuggestion("Text", element, textContent, { variant }); } if (canSuggest("DisplayValue", method, element.value)) { return makeSuggestion("DisplayValue", element, normalize$1(element.value), { variant }); } const alt = element.getAttribute("alt"); if (canSuggest("AltText", method, alt)) { return makeSuggestion("AltText", element, alt, { variant }); } const title = element.getAttribute("title"); if (canSuggest("Title", method, title)) { return makeSuggestion("Title", element, title, { variant }); } const testId = element.getAttribute(getConfig().testIdAttribute); if (canSuggest("TestId", method, testId)) { return makeSuggestion("TestId", element, testId, { variant }); } return void 0; } function copyStackTrace(target, source) { target.stack = source.stack.replace(source.message, target.message); } function waitFor(callback, _ref) { let { container = getDocument$1(), timeout = getConfig().asyncUtilTimeout, showOriginalStackTrace = getConfig().showOriginalStackTrace, stackTraceError, interval = 50, onTimeout = (error) => { Object.defineProperty(error, "message", { value: getConfig().getElementError(error.message, container).message }); return error; }, mutationObserverOptions = { subtree: true, childList: true, attributes: true, characterData: true } } = _ref; if (typeof callback !== "function") { throw new TypeError("Received `callback` arg must be a function"); } return new Promise(async (resolve, reject) => { let lastError, intervalId, observer; let finished = false; let promiseStatus = "idle"; const overallTimeoutTimer = setTimeout(handleTimeout, timeout); const usingJestFakeTimers = jestFakeTimersAreEnabled(); if (usingJestFakeTimers) { const { unstable_advanceTimersWrapper: advanceTimersWrapper } = getConfig(); checkCallback(); while (!finished) { if (!jestFakeTimersAreEnabled()) { const error = new Error("Changed from using fake timers to real timers while using waitFor. This is not allowed and will result in very strange behavior. Please ensure you're awaiting all async things your test is doing before changing to real timers. For more info, please go to https://github.com/testing-library/dom-testing-library/issues/830"); if (!showOriginalStackTrace) copyStackTrace(error, stackTraceError); reject(error); return; } await advanceTimersWrapper(async () => { jest.advanceTimersByTime(interval); }); if (finished) { break; } checkCallback(); } } else { try { checkContainerType(container); } catch (e) { reject(e); return; } intervalId = setInterval(checkRealTimersCallback, interval); const { MutationObserver } = getWindowFromNode(container); observer = new MutationObserver(checkRealTimersCallback); observer.observe(container, mutationObserverOptions); checkCallback(); } function onDone(error, result) { finished = true; clearTimeout(overallTimeoutTimer); if (!usingJestFakeTimers) { clearInterval(intervalId); observer.disconnect(); } if (error) { reject(error); } else { resolve(result); } } function checkRealTimersCallback() { if (jestFakeTimersAreEnabled()) { const error = new Error("Changed from using real timers to fake timers while using waitFor. This is not allowed and will result in very strange behavior. Please ensure you're awaiting all async things your test is doing before changing to fake timers. For more info, please go to https://github.com/testing-library/dom-testing-library/issues/830"); if (!showOriginalStackTrace) copyStackTrace(error, stackTraceError); return reject(error); } else { return checkCallback(); } } function checkCallback() { if (promiseStatus === "pending") return; try { const result = runWithExpensiveErrorDiagnosticsDisabled(callback); if (typeof (result == null ? void 0 : result.then) === "function") { promiseStatus = "pending"; result.then((resolvedValue) => { promiseStatus = "resolved"; onDone(null, resolvedValue); }, (rejectedValue) => { promiseStatus = "rejected"; lastError = rejectedValue; }); } else { onDone(null, result); } } catch (error) { lastError = error; } } function handleTimeout() { let error; if (lastError) { error = lastError; if (!showOriginalStackTrace && error.name === "TestingLibraryElementError") { copyStackTrace(error, stackTraceError); } } else { error = new Error("Timed out in waitFor."); if (!showOriginalStackTrace) { copyStackTrace(error, stackTraceError); } } onDone(onTimeout(error), null); } }); } function waitForWrapper(callback, options) { const stackTraceError = new Error("STACK_TRACE_MESSAGE"); return getConfig().asyncWrapper(() => waitFor(callback, { stackTraceError, ...options })); } function getElementError(message, container) { return getConfig().getElementError(message, container); } function getMultipleElementsFoundError(message, container) { return getElementError(message + "\n\n(If this is intentional, then use the `*AllBy*` variant of the query (like `queryAllByText`, `getAllByText`, or `findAllByText`)).", container); } function queryAllByAttribute(attribute, container, text, _temp) { let { exact = true, collapseWhitespace, trim, normalizer } = _temp === void 0 ? {} : _temp; const matcher = exact ? matches : fuzzyMatches; const matchNormalizer = makeNormalizer({ collapseWhitespace, trim, normalizer }); return Array.from(container.querySelectorAll("[" + attribute + "]")).filter((node) => matcher(node.getAttribute(attribute), node, text, matchNormalizer)); } function makeSingleQuery(allQuery, getMultipleError2) { return function(container) { for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { args[_key - 1] = arguments[_key]; } const els = allQuery(container, ...args); if (els.length > 1) { const elementStrings = els.map((element) => getElementError(null, element).message).join("\n\n"); throw getMultipleElementsFoundError(getMultipleError2(container, ...args) + "\n\nHere are the matching elements:\n\n" + elementStrings, container); } return els[0] || null; }; } function getSuggestionError(suggestion, container) { return getConfig().getElementError("A better query is available, try this:\n" + suggestion.toString() + "\n", container); } function makeGetAllQuery(allQuery, getMissingError2) { return function(container) { for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { args[_key2 - 1] = arguments[_key2]; } const els = allQuery(container, ...args); if (!els.length) { throw getConfig().getElementError(getMissingError2(container, ...args), container); } return els; }; } function makeFindQuery(getter) { return (container, text, options, waitForOptions) => { return waitForWrapper(() => { return getter(container, text, options); }, { container, ...waitForOptions }); }; } const wrapSingleQueryWithSuggestion = (query, queryAllByName, variant) => function(container) { for (var _len3 = arguments.length, args = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) { args[_key3 - 1] = arguments[_key3]; } const element = query(container, ...args); const [{ suggest = getConfig().throwSuggestions } = {}] = args.slice(-1); if (element && suggest) { const suggestion = getSuggestedQuery(element, variant); if (suggestion && !queryAllByName.endsWith(suggestion.queryName)) { throw getSuggestionError(suggestion.toString(), container); } } return element; }; const wrapAllByQueryWithSuggestion = (query, queryAllByName, variant) => function(container) { for (var _len4 = arguments.length, args = new Array(_len4 > 1 ? _len4 - 1 : 0), _key4 = 1; _key4 < _len4; _key4++) { args[_key4 - 1] = arguments[_key4]; } const els = query(container, ...args); const [{ suggest = getConfig().throwSuggestions } = {}] = args.slice(-1); if (els.length && suggest) { const uniqueSuggestionMessages = [...new Set(els.map((element) => { var _getSuggestedQuery; return (_getSuggestedQuery = getSuggestedQuery(element, variant)) == null ? void 0 : _getSuggestedQuery.toString(); }))]; if ( // only want to suggest if all the els have the same suggestion. uniqueSuggestionMessages.length === 1 && !queryAllByName.endsWith( // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- TODO: Can this be null at runtime? getSuggestedQuery(els[0], variant).queryName ) ) { throw getSuggestionError(uniqueSuggestionMessages[0], container); } } return els; }; function buildQueries(queryAllBy, getMultipleError2, getMissingError2) { const queryBy = wrapSingleQueryWithSuggestion(makeSingleQuery(queryAllBy, getMultipleError2), queryAllBy.name, "query"); const getAllBy = makeGetAllQuery(queryAllBy, getMissingError2); const getBy = makeSingleQuery(getAllBy, getMultipleError2); const getByWithSuggestions = wrapSingleQueryWithSuggestion(getBy, queryAllBy.name, "get"); const getAllWithSuggestions = wrapAllByQueryWithSuggestion(getAllBy, queryAllBy.name.replace("query", "get"), "getAll"); const findAllBy = makeFindQuery(wrapAllByQueryWithSuggestion(getAllBy, queryAllBy.name, "findAll")); const findBy = makeFindQuery(wrapSingleQueryWithSuggestion(getBy, queryAllBy.name, "find")); return [queryBy, getAllWithSuggestions, getByWithSuggestions, findAllBy, findBy]; } function queryAllLabels(container) { return Array.from(container.querySelectorAll("label,input")).map((node) => { return { node, textToMatch: getLabelContent(node) }; }).filter((_ref) => { let { textToMatch } = _ref; return textToMatch !== null; }); } const queryAllLabelsByText = function(container, text, _temp) { let { exact = true, trim, collapseWhitespace, normalizer } = _temp === void 0 ? {} : _temp; const matcher = exact ? matches : fuzzyMatches; const matchNormalizer = makeNormalizer({ collapseWhitespace, trim, normalizer }); const textToMatchByLabels = queryAllLabels(container); return textToMatchByLabels.filter((_ref2) => { let { node, textToMatch } = _ref2; return matcher(textToMatch, node, text, matchNormalizer); }).map((_ref3) => { let { node } = _ref3; return node; }); }; const queryAllByLabelText = function(container, text, _temp2) { let { selector = "*", exact = true, collapseWhitespace, trim, normalizer } = _temp2 === void 0 ? {} : _temp2; checkContainerType(container); const matcher = exact ? matches : fuzzyMatches; const matchNormalizer = makeNormalizer({ collapseWhitespace, trim, normalizer }); const matchingLabelledElements = Array.from(container.querySelectorAll("*")).filter((element) => { return getRealLabels(element).length || element.hasAttribute("aria-labelledby"); }).reduce((labelledElements, labelledElement) => { const labelList = getLabels(container, labelledElement, { selector }); labelList.filter((label) => Boolean(label.formControl)).forEach((label) => { if (matcher(label.content, label.formControl, text, matchNormalizer) && label.formControl) { labelledElements.push(label.formControl); } }); const labelsValue = labelList.filter((label) => Boolean(label.content)).map((label) => label.content); if (matcher(labelsValue.join(" "), labelledElement, text, matchNormalizer)) { labelledElements.push(labelledElement); } if (labelsValue.length > 1) { labelsValue.forEach((labelValue, index) => { if (matcher(labelValue, labelledElement, text, matchNormalizer)) { labelledElements.push(labelledElement); } const labelsFiltered = [...labelsValue]; labelsFiltered.splice(index, 1); if (labelsFiltered.length > 1) { if (matcher(labelsFiltered.join(" "), labelledElement, text, matchNormalizer)) { labelledElements.push(labelledElement); } } }); } return labelledElements; }, []).concat(queryAllByAttribute("aria-label", container, text, { exact, normalizer: matchNormalizer })); return Array.from(new Set(matchingLabelledElements)).filter((element) => element.matches(selector)); }; const getAllByLabelText = function(container, text) { for (var _len = arguments.length, rest = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { rest[_key - 2] = arguments[_key]; } const els = queryAllByLabelText(container, text, ...rest); if (!els.length) { const labels = queryAllLabelsByText(container, text, ...rest); if (labels.length) { const tagNames = labels.map((label) => getTagNameOfElementAssociatedWithLabelViaFor(container, label)).filter((tagName) => !!tagName); if (tagNames.length) { throw getConfig().getElementError(tagNames.map((tagName) => "Found a label with the text of: " + text + ", however the element associated with this label (<" + tagName + " />) is non-labellable [https://html.spec.whatwg.org/multipage/forms.html#category-label]. If you really need to label a <" + tagName + " />, you can use aria-label or aria-labelledby instead.").join("\n\n"), container); } else { throw getConfig().getElementError("Found a label with the text of: " + text + `, however no form control was found associated to that label. Make sure you're using the "for" attribute or "aria-labelledby" attribute correctly.`, container); } } else { throw getConfig().getElementError("Unable to find a label with the text of: " + text, container); } } return els; }; function getTagNameOfElementAssociatedWithLabelViaFor(container, label) { const htmlFor = label.getAttribute("for"); if (!htmlFor) { return null; } const element = container.querySelector('[id="' + htmlFor + '"]'); return element ? element.tagName.toLowerCase() : null; } const getMultipleError$7 = (c, text) => "Found multiple elements with the text of: " + text; const queryByLabelText = wrapSingleQueryWithSuggestion(makeSingleQuery(queryAllByLabelText, getMultipleError$7), queryAllByLabelText.name, "query"); const getByLabelText = makeSingleQuery(getAllByLabelText, getMultipleError$7); const findAllByLabelText = makeFindQuery(wrapAllByQueryWithSuggestion(getAllByLabelText, getAllByLabelText.name, "findAll")); const findByLabelText = makeFindQuery(wrapSingleQueryWithSuggestion(getByLabelText, getAllByLabelText.name, "find")); const getAllByLabelTextWithSuggestions = wrapAllByQueryWithSuggestion(getAllByLabelText, getAllByLabelText.name, "getAll"); const getByLabelTextWithSuggestions = wrapSingleQueryWithSuggestion(getByLabelText, getAllByLabelText.name, "get"); const queryAllByLabelTextWithSuggestions = wrapAllByQueryWithSuggestion(queryAllByLabelText, queryAllByLabelText.name, "queryAll"); const queryAllByPlaceholderText = function() { for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } checkContainerType(args[0]); return queryAllByAttribute("placeholder", ...args); }; const getMultipleError$6 = (c, text) => "Found multiple elements with the placeholder text of: " + text; const getMissingError$6 = (c, text) => "Unable to find an element with the placeholder text of: " + text; const queryAllByPlaceholderTextWithSuggestions = wrapAllByQueryWithSuggestion(queryAllByPlaceholderText, queryAllByPlaceholderText.name, "queryAll"); const [queryByPlaceholderText, getAllByPlaceholderText, getByPlaceholderText, findAllByPlaceholderText, findByPlaceholderText] = buildQueries(queryAllByPlaceholderText, getMultipleError$6, getMissingError$6); const queryAllByText = function(container, text, _temp) { let { selector = "*", exact = true, collapseWhitespace, trim, ignore = getConfig().defaultIgnore, normalizer } = _temp === void 0 ? {} : _temp; checkContainerType(container); const matcher = exact ? matches : fuzzyMatches; const matchNormalizer = makeNormalizer({ collapseWhitespace, trim, normalizer }); let baseArray = []; if (typeof container.matches === "function" && container.matches(selector)) { baseArray = [container]; } return [...baseArray, ...Array.from(container.querySelectorAll(selector))].filter((node) => !ignore || !node.matches(ignore)).filter((node) => matcher(getNodeText(node), node, text, matchNormalizer)); }; const getMultipleError$5 = (c, text) => "Found multiple elements with the text: " + text; const getMissingError$5 = function(c, text, options) { if (options === void 0) { options = {}; } const { collapseWhitespace, trim, normalizer, selector } = options; const matchNormalizer = makeNormalizer({ collapseWhitespace, trim, normalizer }); const normalizedText = matchNormalizer(text.toString()); const isNormalizedDifferent = normalizedText !== text.toString(); const isCustomSelector = (selector != null ? selector : "*") !== "*"; return "Unable to find an element with the text: " + (isNormalizedDifferent ? normalizedText + " (normalized from '" + text + "')" : text) + (isCustomSelector ? ", which matches selector '" + selector + "'" : "") + ". This could be because the text is broken up by multiple elements. In this case, you can provide a function for your text matcher to make your matcher more flexible."; }; const queryAllByTextWithSuggestions = wrapAllByQueryWithSuggestion(queryAllByText, queryAllByText.name, "queryAll"); const [queryByText, getAllByText, getByText, findAllByText, findByText] = buildQueries(queryAllByText, getMultipleError$5, getMissingError$5); const queryAllByDisplayValue = function(container, value, _temp) { let { exact = true, collapseWhitespace, trim, normalizer } = _temp === void 0 ? {} : _temp; checkContainerType(container); const matcher = exact ? matches : fuzzyMatches; const matchNormalizer = makeNormalizer({ collapseWhitespace, trim, normalizer }); return Array.from(container.querySelectorAll("input,textarea,select")).filter((node) => { if (node.tagName === "SELECT") { const selectedOptions = Array.from(node.options).filter((option) => option.selected); return selectedOptions.some((optionNode) => matcher(getNodeText(optionNode), optionNode, value, matchNormalizer)); } else { return matcher(node.value, node, value, matchNormalizer); } }); }; const getMultipleError$4 = (c, value) => "Found multiple elements with the display value: " + value + "."; const getMissingError$4 = (c, value) => "Unable to find an element with the display value: " + value + "."; const queryAllByDisplayValueWithSuggestions = wrapAllByQueryWithSuggestion(queryAllByDisplayValue, queryAllByDisplayValue.name, "queryAll"); const [queryByDisplayValue, getAllByDisplayValue, getByDisplayValue, findAllByDisplayValue, findByDisplayValue] = buildQueries(queryAllByDisplayValue, getMultipleError$4, getMissingError$4); const VALID_TAG_REGEXP = /^(img|input|area|.+-.+)$/i; const queryAllByAltText = function(container, alt, options) { if (options === void 0) { options = {}; } checkContainerType(container); return queryAllByAttribute("alt", container, alt, options).filter((node) => VALID_TAG_REGEXP.test(node.tagName)); }; const getMultipleError$3 = (c, alt) => "Found multiple elements with the alt text: " + alt; const getMissingError$3 = (c, alt) => "Unable to find an element with the alt text: " + alt; const queryAllByAltTextWithSuggestions = wrapAllByQueryWithSuggestion(queryAllByAltText, queryAllByAltText.name, "queryAll"); const [queryByAltText, getAllByAltText, getByAltText, findAllByAltText, findByAltText] = buildQueries(queryAllByAltText, getMultipleError$3, getMissingError$3); const isSvgTitle = (node) => { var _node$parentElement; return node.tagName.toLowerCase() === "title" && ((_node$parentElement = node.parentElement) == null ? void 0 : _node$parentElement.tagName.toLowerCase()) === "svg"; }; const queryAllByTitle = function(container, text, _temp) { let { exact = true, collapseWhitespace, trim, normalizer } = _temp === void 0 ? {} : _temp; checkContainerType(container); const matcher = exact ? matches : fuzzyMatches; const matchNormalizer = makeNormalizer({ collapseWhitespace, trim, normalizer }); return Array.from(container.querySelectorAll("[title], svg > title")).filter((node) => matcher(node.getAttribute("title"), node, text, matchNormalizer) || isSvgTitle(node) && matcher(getNodeText(node), node, text, matchNormalizer)); }; const getMultipleError$2 = (c, title) => "Found multiple elements with the title: " + title + "."; const getMissingError$2 = (c, title) => "Unable to find an element with the title: " + title + "."; const queryAllByTitleWithSuggestions = wrapAllByQueryWithSuggestion(queryAllByTitle, queryAllByTitle.name, "queryAll"); const [queryByTitle, getAllByTitle, getByTitle, findAllByTitle, findByTitle] = buildQueries(queryAllByTitle, getMultipleError$2, getMissingError$2); const queryAllByRole = function(container, role, _temp) { let { hidden = getConfig().defaultHidden, name, description, queryFallbacks = false, selected, busy, checked, pressed, current, level, expanded, value: { now: valueNow, min: valueMin, max: valueMax, text: valueText } = {} } = _temp === void 0 ? {} : _temp; checkContainerType(container); if (selected !== void 0) { var _allRoles$get; if (((_allRoles$get = roles_1.get(role)) == null ? void 0 : _allRoles$get.props["aria-selected"]) === void 0) { throw new Error('"aria-selected" is not supported on role "' + role + '".'); } } if (busy !== void 0) { var _allRoles$get2; if (((_allRoles$get2 = roles_1.get(role)) == null ? void 0 : _allRoles$get2.props["aria-busy"]) === void 0) { throw new Error('"aria-busy" is not supported on role "' + role + '".'); } } if (checked !== void 0) { var _allRoles$get3; if (((_allRoles$get3 = roles_1.get(role)) == null ? void 0 : _allRoles$get3.props["aria-checked"]) === void 0) { throw new Error('"aria-checked" is not supported on role "' + role + '".'); } } if (pressed !== void 0) { var _allRoles$get4; if (((_allRoles$get4 = roles_1.get(role)) == null ? void 0 : _allRoles$get4.props["aria-pressed"]) === void 0) { throw new Error('"aria-pressed" is not supported on role "' + role + '".'); } } if (current !== void 0) { var _allRoles$get5; if (((_allRoles$get5 = roles_1.get(role)) == null ? void 0 : _allRoles$get5.props["aria-current"]) === void 0) { throw new Error('"aria-current" is not supported on role "' + role + '".'); } } if (level !== void 0) { if (role !== "heading") { throw new Error('Role "' + role + '" cannot have "level" property.'); } } if (valueNow !== void 0) { var _allRoles$get6; if (((_allRoles$get6 = roles_1.get(role)) == null ? void 0 : _allRoles$get6.props["aria-valuenow"]) === void 0) { throw new Error('"aria-valuenow" is not supported on role "' + role + '".'); } } if (valueMax !== void 0) { var _allRoles$get7; if (((_allRoles$get7 = roles_1.get(role)) == null ? void 0 : _allRoles$get7.props["aria-valuemax"]) === void 0) { throw new Error('"aria-valuemax" is not supported on role "' + role + '".'); } } if (valueMin !== void 0) { var _allRoles$get8; if (((_allRoles$get8 = roles_1.get(role)) == null ? void 0 : _allRoles$get8.props["aria-valuemin"]) === void 0) { throw new Error('"aria-valuemin" is not supported on role "' + role + '".'); } } if (valueText !== void 0) { var _allRoles$get9; if (((_allRoles$get9 = roles_1.get(role)) == null ? void 0 : _allRoles$get9.props["aria-valuetext"]) === void 0) { throw new Error('"aria-valuetext" is not supported on role "' + role + '".'); } } if (expanded !== void 0) { var _allRoles$get0; if (((_allRoles$get0 = roles_1.get(role)) == null ? void 0 : _allRoles$get0.props["aria-expanded"]) === void 0) { throw new Error('"aria-expanded" is not supported on role "' + role + '".'); } } const subtreeIsInaccessibleCache = /* @__PURE__ */ new WeakMap(); function cachedIsSubtreeInaccessible(element) { if (!subtreeIsInaccessibleCache.has(element)) { subtreeIsInaccessibleCache.set(element, isSubtreeInaccessible(element)); } return subtreeIsInaccessibleCache.get(element); } return Array.from(container.querySelectorAll( // Only query elements that can be matched by the following filters makeRoleSelector(role) )).filter((node) => { const isRoleSpecifiedExplicitly = node.hasAttribute("role"); if (isRoleSpecifiedExplicitly) { const roleValue = node.getAttribute("role"); if (queryFallbacks) { return roleValue.split(" ").filter(Boolean).some((roleAttributeToken) => roleAttributeToken === role); } const [firstRoleAttributeToken] = roleValue.split(" "); return firstRoleAttributeToken === role; } const implicitRoles = getImplicitAriaRoles(node); return implicitRoles.some((implicitRole) => { return implicitRole === role; }); }).filter((element) => { if (selected !== void 0) { return selected === computeAriaSelected(element); } if (busy !== void 0) { return busy === computeAriaBusy(element); } if (checked !== void 0) { return checked === computeAriaChecked(element); } if (pressed !== void 0) { return pressed === computeAriaPressed(element); } if (current !== void 0) { return current === computeAriaCurrent(element); } if (expanded !== void 0) { return expanded === computeAriaExpanded(element); } if (level !== void 0) { return level === computeHeadingLevel(element); } if (valueNow !== void 0 || valueMax !== void 0 || valueMin !== void 0 || valueText !== void 0) { let valueMatches = true; if (valueNow !== void 0) { valueMatches && (valueMatches = valueNow === computeAriaValueNow(element)); } if (valueMax !== void 0) { valueMatches && (valueMatches = valueMax === computeAriaValueMax(element)); } if (valueMin !== void 0) { valueMatches && (valueMatches = valueMin === computeAriaValueMin(element)); } if (valueText !== void 0) { var _computeAriaValueText; valueMatches && (valueMatches = matches((_computeAriaValueText = computeAriaValueText(element)) != null ? _computeAriaValueText : null, element, valueText, (text) => text)); } return valueMatches; } return true; }).filter((element) => { if (name === void 0) { return true; } return matches(computeAccessibleName(element, { computedStyleSupportsPseudoElements: getConfig().computedStyleSupportsPseudoElements }), element, name, (text) => text); }).filter((element) => { if (description === void 0) { return true; } return matches(computeAccessibleDescription(element, { computedStyleSupportsPseudoElements: getConfig().computedStyleSupportsPseudoElements }), element, description, (text) => text); }).filter((element) => { return hidden === false ? isInaccessible(element, { isSubtreeInaccessible: cachedIsSubtreeInaccessible }) === false : true; }); }; function makeRoleSelector(role) { var _roleElements$get; const explicitRoleSelector = '*[role~="' + role + '"]'; const roleRelations = (_roleElements$get = roleElements_1.get(role)) != null ? _roleElements$get : /* @__PURE__ */ new Set(); const implicitRoleSelectors = new Set(Array.from(roleRelations).map((_ref) => { let { name } = _ref; return name; })); return [explicitRoleSelector].concat(Array.from(implicitRoleSelectors)).join(","); } const getNameHint = (name) => { let nameHint = ""; if (name === void 0) { nameHint = ""; } else if (typeof name === "string") { nameHint = ' and name "' + name + '"'; } else { nameHint = " and name `" + name + "`"; } return nameHint; }; const getMultipleError$1 = function(c, role, _temp2) { let { name } = _temp2 === void 0 ? {} : _temp2; return 'Found multiple elements with the role "' + role + '"' + getNameHint(name); }; const getMissingError$1 = function(container, role, _temp3) { let { hidden = getConfig().defaultHidden, name, description } = _temp3 === void 0 ? {} : _temp3; if (getConfig()._disableExpensiveErrorDiagnostics) { return 'Unable to find role="' + role + '"' + getNameHint(name); } let roles2 = ""; Array.from(container.children).forEach((childElement) => { roles2 += prettyRoles(childElement, { hidden, includeDescription: description !== void 0 }); }); let roleMessage; if (roles2.length === 0) { if (hidden === false) { roleMessage = "There are no accessible roles. But there might be some inaccessible roles. If you wish to access them, then set the `hidden` option to `true`. Learn more about this here: https://testing-library.com/docs/dom-testing-library/api-queries#byrole"; } else { roleMessage = "There are no available roles."; } } else { roleMessage = ("\nHere are the " + (hidden === false ? "accessible" : "available") + " roles:\n\n " + roles2.replace(/\n/g, "\n ").replace(/\n\s\s\n/g, "\n\n") + "\n").trim(); } let nameHint = ""; if (name === void 0) { nameHint = ""; } else if (typeof name === "string") { nameHint = ' and name "' + name + '"'; } else { nameHint = " and name `" + name + "`"; } let descriptionHint = ""; if (description === void 0) { descriptionHint = ""; } else if (typeof description === "string") { descriptionHint = ' and description "' + description + '"'; } else { descriptionHint = " and description `" + description + "`"; } return ("\nUnable to find an " + (hidden === false ? "accessible " : "") + 'element with the role "' + role + '"' + nameHint + descriptionHint + "\n\n" + roleMessage).trim(); }; const queryAllByRoleWithSuggestions = wrapAllByQueryWithSuggestion(queryAllByRole, queryAllByRole.name, "queryAll"); const [queryByRole, getAllByRole, getByRole, findAllByRole, findByRole] = buildQueries(queryAllByRole, getMultipleError$1, getMissingError$1); const getTestIdAttribute = () => getConfig().testIdAttribute; const queryAllByTestId = function() { for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } checkContainerType(args[0]); return queryAllByAttribute(getTestIdAttribute(), ...args); }; const getMultipleError = (c, id) => "Found multiple elements by: [" + getTestIdAttribute() + '="' + id + '"]'; const getMissingError = (c, id) => "Unable to find an element by: [" + getTestIdAttribute() + '="' + id + '"]'; const queryAllByTestIdWithSuggestions = wrapAllByQueryWithSuggestion(queryAllByTestId, queryAllByTestId.name, "queryAll"); const [queryByTestId, getAllByTestId, getByTestId, findAllByTestId, findByTestId] = buildQueries(queryAllByTestId, getMultipleError, getMissingError); var queries = /* @__PURE__ */ Object.freeze({ __proto__: null, queryAllByLabelText: queryAllByLabelTextWithSuggestions, queryByLabelText, getAllByLabelText: getAllByLabelTextWithSuggestions, getByLabelText: getByLabelTextWithSuggestions, findAllByLabelText, findByLabelText, queryByPlaceholderText, queryAllByPlaceholderText: queryAllByPlaceholderTextWithSuggestions, getByPlaceholderText, getAllByPlaceholderText, findAllByPlaceholderText, findByPlaceholderText, queryByText, queryAllByText: queryAllByTextWithSuggestions, getByText, getAllByText, findAllByText, findByText, queryByDisplayValue, queryAllByDisplayValue: queryAllByDisplayValueWithSuggestions, getByDisplayValue, getAllByDisplayValue, findAllByDisplayValue, findByDisplayValue, queryByAltText, queryAllByAltText: queryAllByAltTextWithSuggestions, getByAltText, getAllByAltText, findAllByAltText, findByAltText, queryByTitle, queryAllByTitle: queryAllByTitleWithSuggestions, getByTitle, getAllByTitle, findAllByTitle, findByTitle, queryByRole, queryAllByRole: queryAllByRoleWithSuggestions, getAllByRole, getByRole, findAllByRole, findByRole, queryByTestId, queryAllByTestId: queryAllByTestIdWithSuggestions, getByTestId, getAllByTestId, findAllByTestId, findByTestId }); function getQueriesForElement(element, queries$1, initialValue2) { if (queries$1 === void 0) { queries$1 = queries; } if (initialValue2 === void 0) { initialValue2 = {}; } return Object.keys(queries$1).reduce((helpers, key) => { const fn = queries$1[key]; helpers[key] = fn.bind(null, element); return helpers; }, initialValue2); } const eventMap$1 = { // Clipboard Events copy: { EventType: "ClipboardEvent", defaultInit: { bubbles: true, cancelable: true, composed: true } }, cut: { EventType: "ClipboardEvent", defaultInit: { bubbles: true, cancelable: true, composed: true } }, paste: { EventType: "ClipboardEvent", defaultInit: { bubbles: true, cancelable: true, composed: true } }, // Composition Events compositionEnd: { EventType: "CompositionEvent", defaultInit: { bubbles: true, cancelable: true, composed: true } }, compositionStart: { EventType: "CompositionEvent", defaultInit: { bubbles: true, cancelable: true, composed: true } }, compositionUpdate: { EventType: "CompositionEvent", defaultInit: { bubbles: true, cancelable: true, composed: true } }, // Keyboard Events keyDown: { EventType: "KeyboardEvent", defaultInit: { bubbles: true, cancelable: true, charCode: 0, composed: true } }, keyPress: { EventType: "KeyboardEvent", defaultInit: { bubbles: true, cancelable: true, charCode: 0, composed: true } }, keyUp: { EventType: "KeyboardEvent", defaultInit: { bubbles: true, cancelable: true, charCode: 0, composed: true } }, // Focus Events focus: { EventType: "FocusEvent", defaultInit: { bubbles: false, cancelable: false, composed: true } }, blur: { EventType: "FocusEvent", defaultInit: { bubbles: false, cancelable: false, composed: true } }, focusIn: { EventType: "FocusEvent", defaultInit: { bubbles: true, cancelable: false, composed: true } }, focusOut: { EventType: "FocusEvent", defaultInit: { bubbles: true, cancelable: false, composed: true } }, // Form Events change: { EventType: "Event", defaultInit: { bubbles: true, cancelable: false } }, input: { EventType: "InputEvent", defaultInit: { bubbles: true, cancelable: false, composed: true } }, invalid: { EventType: "Event", defaultInit: { bubbles: false, cancelable: true } }, submit: { EventType: "Event", defaultInit: { bubbles: true, cancelable: true } }, reset: { EventType: "Event", defaultInit: { bubbles: true, cancelable: true } }, // Mouse Events click: { EventType: "MouseEvent", defaultInit: { bubbles: true, cancelable: true, button: 0, composed: true } }, contextMenu: { EventType: "MouseEvent", defaultInit: { bubbles: true, cancelable: true, composed: true } }, dblClick: { EventType: "MouseEvent", defaultInit: { bubbles: true, cancelable: true, composed: true } }, drag: { EventType: "DragEvent", defaultInit: { bubbles: true, cancelable: true, composed: true } }, dragEnd: { EventType: "DragEvent", defaultInit: { bubbles: true, cancelable: false, composed: true } }, dragEnter: { EventType: "DragEvent", defaultInit: { bubbles: true, cancelable: true, composed: true } }, dragExit: { EventType: "DragEvent", defaultInit: { bubbles: true, cancelable: false, composed: true } }, dragLeave: { EventType: "DragEvent", defaultInit: { bubbles: true, cancelable: false, composed: true } }, dragOver: { EventType: "DragEvent", defaultInit: { bubbles: true, cancelable: true, composed: true } }, dragStart: { EventType: "DragEvent", defaultInit: { bubbles: true, cancelable: true, composed: true } }, drop: { EventType: "DragEvent", defaultInit: { bubbles: true, cancelable: true, composed: true } }, mouseDown: { EventType: "MouseEvent", defaultInit: { bubbles: true, cancelable: true, composed: true } }, mouseEnter: { EventType: "MouseEvent", defaultInit: { bubbles: false, cancelable: false, composed: true } }, mouseLeave: { EventType: "MouseEvent", defaultInit: { bubbles: false, cancelable: false, composed: true } }, mouseMove: { EventType: "MouseEvent", defaultInit: { bubbles: true, cancelable: true, composed: true } }, mouseOut: { EventType: "MouseEvent", defaultInit: { bubbles: true, cancelable: true, composed: true } }, mouseOver: { EventType: "MouseEvent", defaultInit: { bubbles: true, cancelable: true, composed: true } }, mouseUp: { EventType: "MouseEvent", defaultInit: { bubbles: true, cancelable: true, composed: true } }, // Selection Events select: { EventType: "Event", defaultInit: { bubbles: true, cancelable: false } }, // Touch Events touchCancel: { EventType: "TouchEvent", defaultInit: { bubbles: true, cancelable: false, composed: true } }, touchEnd: { EventType: "TouchEvent", defaultInit: { bubbles: true, cancelable: true, composed: true } }, touchMove: { EventType: "TouchEvent", defaultInit: { bubbles: true, cancelable: true, composed: true } }, touchStart: { EventType: "TouchEvent", defaultInit: { bubbles: true, cancelable: true, composed: true } }, // UI Events resize: { EventType: "UIEvent", defaultInit: { bubbles: false, cancelable: false } }, scroll: { EventType: "UIEvent", defaultInit: { bubbles: false, cancelable: false } }, // Wheel Events wheel: { EventType: "WheelEvent", defaultInit: { bubbles: true, cancelable: true, composed: true } }, // Media Events abort: { EventType: "Event", defaultInit: { bubbles: false, cancelable: false } }, canPlay: { EventType: "Event", defaultInit: { bubbles: false, cancelable: false } }, canPlayThrough: { EventType: "Event", defaultInit: { bubbles: false, cancelable: false } }, durationChange: { EventType: "Event", defaultInit: { bubbles: false, cancelable: false } }, emptied: { EventType: "Event", defaultInit: { bubbles: false, cancelable: false } }, encrypted: { EventType: "Event", defaultInit: { bubbles: false, cancelable: false } }, ended: { EventType: "Event", defaultInit: { bubbles: false, cancelable: false } }, loadedData: { EventType: "Event", defaultInit: { bubbles: false, cancelable: false } }, loadedMetadata: { EventType: "Event", defaultInit: { bubbles: false, cancelable: false } }, loadStart: { EventType: "ProgressEvent", defaultInit: { bubbles: false, cancelable: false } }, pause: { EventType: "Event", defaultInit: { bubbles: false, cancelable: false } }, play: { EventType: "Event", defaultInit: { bubbles: false, cancelable: false } }, playing: { EventType: "Event", defaultInit: { bubbles: false, cancelable: false } }, progress: { EventType: "ProgressEvent", defaultInit: { bubbles: false, cancelable: false } }, rateChange: { EventType: "Event", defaultInit: { bubbles: false, cancelable: false } }, seeked: { EventType: "Event", defaultInit: { bubbles: false, cancelable: false } }, seeking: { EventType: "Event", defaultInit: { bubbles: false, cancelable: false } }, stalled: { EventType: "Event", defaultInit: { bubbles: false, cancelable: false } }, suspend: { EventType: "Event", defaultInit: { bubbles: false, cancelable: false } }, timeUpdate: { EventType: "Event", defaultInit: { bubbles: false, cancelable: false } }, volumeChange: { EventType: "Event", defaultInit: { bubbles: false, cancelable: false } }, waiting: { EventType: "Event", defaultInit: { bubbles: false, cancelable: false } }, // Events load: { // TODO: load events can be UIEvent or Event depending on what generated them // This is where this abstraction breaks down. // But the common targets are <img />, <script /> and window. // Neither of these targets receive a UIEvent EventType: "Event", defaultInit: { bubbles: false, cancelable: false } }, error: { EventType: "Event", defaultInit: { bubbles: false, cancelable: false } }, // Animation Events animationStart: { EventType: "AnimationEvent", defaultInit: { bubbles: true, cancelable: false } }, animationEnd: { EventType: "AnimationEvent", defaultInit: { bubbles: true, cancelable: false } }, animationIteration: { EventType: "AnimationEvent", defaultInit: { bubbles: true, cancelable: false } }, // Transition Events transitionCancel: { EventType: "TransitionEvent", defaultInit: { bubbles: true, cancelable: false } }, transitionEnd: { EventType: "TransitionEvent", defaultInit: { bubbles: true, cancelable: true } }, transitionRun: { EventType: "TransitionEvent", defaultInit: { bubbles: true, cancelable: false } }, transitionStart: { EventType: "TransitionEvent", defaultInit: { bubbles: true, cancelable: false } }, // pointer events pointerOver: { EventType: "PointerEvent", defaultInit: { bubbles: true, cancelable: true, composed: true } }, pointerEnter: { EventType: "PointerEvent", defaultInit: { bubbles: false, cancelable: false } }, pointerDown: { EventType: "PointerEvent", defaultInit: { bubbles: true, cancelable: true, composed: true } }, pointerMove: { EventType: "PointerEvent", defaultInit: { bubbles: true, cancelable: true, composed: true } }, pointerUp: { EventType: "PointerEvent", defaultInit: { bubbles: true, cancelable: true, composed: true } }, pointerCancel: { EventType: "PointerEvent", defaultInit: { bubbles: true, cancelable: false, composed: true } }, pointerOut: { EventType: "PointerEvent", defaultInit: { bubbles: true, cancelable: true, composed: true } }, pointerLeave: { EventType: "PointerEvent", defaultInit: { bubbles: false, cancelable: false } }, gotPointerCapture: { EventType: "PointerEvent", defaultInit: { bubbles: true, cancelable: false, composed: true } }, lostPointerCapture: { EventType: "PointerEvent", defaultInit: { bubbles: true, cancelable: false, composed: true } }, // history events popState: { EventType: "PopStateEvent", defaultInit: { bubbles: true, cancelable: false } }, // window events offline: { EventType: "Event", defaultInit: { bubbles: false, cancelable: false } }, online: { EventType: "Event", defaultInit: { bubbles: false, cancelable: false } }, pageHide: { EventType: "PageTransitionEvent", defaultInit: { bubbles: true, cancelable: true } }, pageShow: { EventType: "PageTransitionEvent", defaultInit: { bubbles: true, cancelable: true } } }; const eventAliasMap = { doubleClick: "dblClick" }; Object.keys(eventMap$1).forEach((key) => { const { EventType, defaultInit } = eventMap$1[key]; key.toLowerCase(); }); Object.keys(eventAliasMap).forEach((aliasKey) => { }); function unindent(string) { return string.replace(/[ \t]*[\n][ \t]*/g, "\n"); } function encode(value) { return lzString.compressToEncodedURIComponent(unindent(value)); } function getPlaygroundUrl(markup) { return "https://testing-playground.com/#markup=" + encode(markup); } const debug = (element, maxLength, options) => Array.isArray(element) ? element.forEach((el) => logDOM(el, maxLength, options)) : logDOM(element, maxLength, options); const logTestingPlaygroundURL = function(element) { if (element === void 0) { element = getDocument$1().body; } if (!element || !("innerHTML" in element)) { console.log("The element you're providing isn't a valid DOM element."); return; } if (!element.innerHTML) { console.log("The provided element doesn't have any children."); return; } const playgroundUrl = getPlaygroundUrl(element.innerHTML); console.log("Open this URL in your browser\n\n" + playgroundUrl); return playgroundUrl; }; const initialValue = { debug, logTestingPlaygroundURL }; typeof document !== "undefined" && document.body ? getQueriesForElement(document.body, queries, initialValue) : Object.keys(queries).reduce((helpers, key) => { helpers[key] = () => { throw new TypeError("For queries bound to document.body a global document has to be available... Learn more: https://testing-library.com/s/screen-global-error"); }; return helpers; }, initialValue); function wrapEvent(cb, _element) { return getConfig().eventWrapper(cb); } // Browsers do not dispatch FocusEvent if the document does not have focus. // TODO: simulate FocusEvent in browsers /** * Focus closest focusable element. */ function focusElement(element) { const target = findClosest(element, isFocusable); const activeElement = getActiveElement(element.ownerDocument); if ((target !== null && target !== undefined ? target : element.ownerDocument.body) === activeElement) { return; } else if (target) { wrapEvent(()=>target.focus()); } else { wrapEvent(()=>activeElement === null || activeElement === undefined ? undefined : activeElement.blur()); } updateSelectionOnFocus(target !== null && target !== undefined ? target : element.ownerDocument.body); } function blurElement(element) { if (!isFocusable(element)) return; const wasActive = getActiveElement(element.ownerDocument) === element; if (!wasActive) return; wrapEvent(()=>element.blur()); } const behavior = {}; behavior.click = (event, target, instance)=>{ const context = target.closest('button,input,label,select,textarea'); const control = context && isElementType(context, 'label') && context.control; if (control && control !== target) { return ()=>{ if (isFocusable(control)) { focusElement(control); instance.dispatchEvent(control, cloneEvent(event)); } }; } else if (isElementType(target, 'input', { type: 'file' })) { return ()=>{ // blur fires when the file selector pops up blurElement(target); target.dispatchEvent(new (getWindow(target)).Event('fileDialog')); // focus fires after the file selector has been closed focusElement(target); }; } }; const UIValue = Symbol('Displayed value in UI'); const UISelection = Symbol('Displayed selection in UI'); const InitialValue = Symbol('Initial value to compare on blur'); function isUIValue(value) { return typeof value === 'object' && UIValue in value; } function isUISelectionStart(start) { return !!start && typeof start === 'object' && UISelection in start; } function setUIValue(element, value) { if (element[InitialValue] === undefined) { element[InitialValue] = element.value; } element[UIValue] = value; // eslint-disable-next-line no-new-wrappers element.value = Object.assign(new String(value), { [UIValue]: true }); } function getUIValue(element) { return element[UIValue] === undefined ? element.value : String(element[UIValue]); } /** Flag the IDL value as clean. This does not change the value.*/ function setUIValueClean(element) { element[UIValue] = undefined; } function clearInitialValue(element) { element[InitialValue] = undefined; } function getInitialValue(element) { return element[InitialValue]; } function setUISelectionRaw(element, selection) { element[UISelection] = selection; } function setUISelection(element, { focusOffset: focusOffsetParam, anchorOffset: anchorOffsetParam = focusOffsetParam }, mode = 'replace') { const valueLength = getUIValue(element).length; const sanitizeOffset = (o)=>Math.max(0, Math.min(valueLength, o)); const anchorOffset = mode === 'replace' || element[UISelection] === undefined ? sanitizeOffset(anchorOffsetParam) : element[UISelection].anchorOffset; const focusOffset = sanitizeOffset(focusOffsetParam); const startOffset = Math.min(anchorOffset, focusOffset); const endOffset = Math.max(anchorOffset, focusOffset); element[UISelection] = { anchorOffset, focusOffset }; if (element.selectionStart === startOffset && element.selectionEnd === endOffset) { return; } // eslint-disable-next-line no-new-wrappers const startObj = Object.assign(new Number(startOffset), { [UISelection]: true }); try { element.setSelectionRange(startObj, endOffset); } catch { // DOMException for invalid state is expected when calling this // on an element without support for setSelectionRange } } function getUISelection(element) { var _element_selectionStart, _element_selectionEnd, _element_UISelection; const sel = (_element_UISelection = element[UISelection]) !== null && _element_UISelection !== undefined ? _element_UISelection : { anchorOffset: (_element_selectionStart = element.selectionStart) !== null && _element_selectionStart !== undefined ? _element_selectionStart : 0, focusOffset: (_element_selectionEnd = element.selectionEnd) !== null && _element_selectionEnd !== undefined ? _element_selectionEnd : 0 }; return { ...sel, startOffset: Math.min(sel.anchorOffset, sel.focusOffset), endOffset: Math.max(sel.anchorOffset, sel.focusOffset) }; } function hasUISelection(element) { return !!element[UISelection]; } /** Flag the IDL selection as clean. This does not change the selection. */ function setUISelectionClean(element) { element[UISelection] = undefined; } const parseInt$1 = globalThis.parseInt; function buildTimeValue(value) { const onlyDigitsValue = value.replace(/\D/g, ''); if (onlyDigitsValue.length < 2) { return value; } const firstDigit = parseInt$1(onlyDigitsValue[0], 10); const secondDigit = parseInt$1(onlyDigitsValue[1], 10); if (firstDigit >= 3 || firstDigit === 2 && secondDigit >= 4) { let index; if (firstDigit >= 3) { index = 1; } else { index = 2; } return build(onlyDigitsValue, index); } if (value.length === 2) { return value; } return build(onlyDigitsValue, 2); } function build(onlyDigitsValue, index) { const hours = onlyDigitsValue.slice(0, index); const validHours = Math.min(parseInt$1(hours, 10), 23); const minuteCharacters = onlyDigitsValue.slice(index); const parsedMinutes = parseInt$1(minuteCharacters, 10); const validMinutes = Math.min(parsedMinutes, 59); return `${validHours.toString().padStart(2, '0')}:${validMinutes.toString().padStart(2, '0')}`; } function isValidDateOrTimeValue(element, value) { const clone = element.cloneNode(); clone.value = value; return clone.value === value; } var maxLengthSupportedTypes = /*#__PURE__*/ function(maxLengthSupportedTypes) { maxLengthSupportedTypes["email"] = "email"; maxLengthSupportedTypes["password"] = "password"; maxLengthSupportedTypes["search"] = "search"; maxLengthSupportedTypes["telephone"] = "telephone"; maxLengthSupportedTypes["text"] = "text"; maxLengthSupportedTypes["url"] = "url"; return maxLengthSupportedTypes; }(maxLengthSupportedTypes || {}); // can't use .maxLength property because of a jsdom bug: // https://github.com/jsdom/jsdom/issues/2927 function getMaxLength(element) { var _element_getAttribute; const attr = (_element_getAttribute = element.getAttribute('maxlength')) !== null && _element_getAttribute !== undefined ? _element_getAttribute : ''; return /^\d+$/.test(attr) && Number(attr) >= 0 ? Number(attr) : undefined; } function supportsMaxLength(element) { return isElementType(element, 'textarea') || isElementType(element, 'input') && element.type in maxLengthSupportedTypes; } function getNextCursorPosition(node, offset, direction, inputType) { // The behavior at text node zero offset is inconsistent. // When walking backwards: // Firefox always moves to zero offset and jumps over last offset. // Chrome jumps over zero offset per default but over last offset when Shift is pressed. // The cursor always moves to zero offset if the focus area (contenteditable or body) ends there. // When walking forward both ignore zero offset. // When walking over input elements the cursor moves before or after that element. // When walking over line breaks the cursor moves inside any following text node. if (isTextNode(node) && offset + direction >= 0 && offset + direction <= node.nodeValue.length) { return { node, offset: offset + direction }; } const nextNode = getNextCharacterContentNode(node, offset, direction); if (nextNode) { if (isTextNode(nextNode)) { return { node: nextNode, offset: direction > 0 ? Math.min(1, nextNode.nodeValue.length) : Math.max(nextNode.nodeValue.length - 1, 0) }; } else if (isElementType(nextNode, 'br')) { const nextPlusOne = getNextCharacterContentNode(nextNode, undefined, direction); if (!nextPlusOne) { // The behavior when there is no possible cursor position beyond the line break is inconsistent. // In Chrome outside of contenteditable moving before a leading line break is possible. // A leading line break can still be removed per deleteContentBackward. // A trailing line break on the other hand is not removed by deleteContentForward. if (direction < 0 && inputType === 'deleteContentBackward') { return { node: nextNode.parentNode, offset: getOffset(nextNode) }; } return undefined; } else if (isTextNode(nextPlusOne)) { return { node: nextPlusOne, offset: direction > 0 ? 0 : nextPlusOne.nodeValue.length }; } else if (direction < 0 && isElementType(nextPlusOne, 'br')) { return { node: nextNode.parentNode, offset: getOffset(nextNode) }; } else { return { node: nextPlusOne.parentNode, offset: getOffset(nextPlusOne) + (direction > 0 ? 0 : 1) }; } } else { return { node: nextNode.parentNode, offset: getOffset(nextNode) + (direction > 0 ? 1 : 0) }; } } } function getNextCharacterContentNode(node, offset, direction) { const nextOffset = Number(offset) + (direction < 0 ? -1 : 0); if (offset !== undefined && isElement(node) && nextOffset >= 0 && nextOffset < node.children.length) { node = node.children[nextOffset]; } return walkNodes(node, direction === 1 ? 'next' : 'previous', isTreatedAsCharacterContent); } function isTreatedAsCharacterContent(node) { if (isTextNode(node)) { return true; } if (isElement(node)) { if (isElementType(node, [ 'input', 'textarea' ])) { return node.type !== 'hidden'; } else if (isElementType(node, 'br')) { return true; } } return false; } function getOffset(node) { let i = 0; while(node.previousSibling){ i++; node = node.previousSibling; } return i; } function isElement(node) { return node.nodeType === 1; } function isTextNode(node) { return node.nodeType === 3; } function walkNodes(node, direction, callback) { for(;;){ var _node_ownerDocument; const sibling = node[`${direction}Sibling`]; if (sibling) { node = getDescendant(sibling, direction === 'next' ? 'first' : 'last'); if (callback(node)) { return node; } } else if (node.parentNode && (!isElement(node.parentNode) || !isContentEditable(node.parentNode) && node.parentNode !== ((_node_ownerDocument = node.ownerDocument) === null || _node_ownerDocument === undefined ? undefined : _node_ownerDocument.body))) { node = node.parentNode; } else { break; } } } function getDescendant(node, direction) { while(node.hasChildNodes()){ node = node[`${direction}Child`]; } return node; } const TrackChanges = Symbol('Track programmatic changes for React workaround'); // When the input event happens in the browser, React executes all event handlers // and if they change state of a controlled value, nothing happens. // But when we trigger the event handlers in test environment with React@17, // the changes are rolled back before the state update is applied. // This results in a reset cursor. // There might be a better way to work around if we figure out // why the batched update is executed differently in our test environment. function isReact17Element(element) { return Object.getOwnPropertyNames(element).some((k)=>k.startsWith('__react')) && getWindow(element).REACT_VERSION === 17; } function startTrackValue(element) { if (!isReact17Element(element)) { return; } element[TrackChanges] = { previousValue: String(element.value), tracked: [] }; } function trackOrSetValue(element, v) { var _element_TrackChanges_tracked, _element_TrackChanges; (_element_TrackChanges = element[TrackChanges]) === null || _element_TrackChanges === undefined ? undefined : (_element_TrackChanges_tracked = _element_TrackChanges.tracked) === null || _element_TrackChanges_tracked === undefined ? undefined : _element_TrackChanges_tracked.push(v); if (!element[TrackChanges]) { setUIValueClean(element); setUISelection(element, { focusOffset: v.length }); } } function commitValueAfterInput(element, cursorOffset) { var _changes_tracked; const changes = element[TrackChanges]; element[TrackChanges] = undefined; if (!(changes === null || changes === undefined ? undefined : (_changes_tracked = changes.tracked) === null || _changes_tracked === undefined ? undefined : _changes_tracked.length)) { return; } const isJustReactStateUpdate = changes.tracked.length === 2 && changes.tracked[0] === changes.previousValue && changes.tracked[1] === element.value; if (!isJustReactStateUpdate) { setUIValueClean(element); } if (hasUISelection(element)) { setUISelection(element, { focusOffset: isJustReactStateUpdate ? cursorOffset : element.value.length }); } } /** * Determine which selection logic and selection ranges to consider. */ function getTargetTypeAndSelection(node) { const element = getElement(node); if (element && hasOwnSelection(element)) { return { type: 'input', selection: getUISelection(element) }; } const selection = element === null || element === undefined ? undefined : element.ownerDocument.getSelection(); // It is possible to extend a single-range selection into a contenteditable. // This results in the range acting like a range outside of contenteditable. const isCE = getContentEditable(node) && (selection === null || selection === undefined ? undefined : selection.anchorNode) && getContentEditable(selection.anchorNode); return { type: isCE ? 'contenteditable' : 'default', selection }; } function getElement(node) { return node.nodeType === 1 ? node : node.parentElement; } /** * Get the range that would be overwritten by input. */ function getInputRange(focusNode) { const typeAndSelection = getTargetTypeAndSelection(focusNode); if (typeAndSelection.type === 'input') { return typeAndSelection.selection; } else if (typeAndSelection.type === 'contenteditable') { var _typeAndSelection_selection; // Multi-range on contenteditable edits the first selection instead of the last return (_typeAndSelection_selection = typeAndSelection.selection) === null || _typeAndSelection_selection === undefined ? undefined : _typeAndSelection_selection.getRangeAt(0); } } /** * Set the selection */ function setSelection({ focusNode, focusOffset, anchorNode = focusNode, anchorOffset = focusOffset }) { var _anchorNode_ownerDocument_getSelection, _anchorNode_ownerDocument; const typeAndSelection = getTargetTypeAndSelection(focusNode); if (typeAndSelection.type === 'input') { return setUISelection(focusNode, { anchorOffset, focusOffset }); } (_anchorNode_ownerDocument = anchorNode.ownerDocument) === null || _anchorNode_ownerDocument === undefined ? undefined : (_anchorNode_ownerDocument_getSelection = _anchorNode_ownerDocument.getSelection()) === null || _anchorNode_ownerDocument_getSelection === undefined ? undefined : _anchorNode_ownerDocument_getSelection.setBaseAndExtent(anchorNode, anchorOffset, focusNode, focusOffset); } function isDateOrTime(element) { return isElementType(element, 'input') && [ 'date', 'time' ].includes(element.type); } function input(instance, element, data, inputType = 'insertText') { const inputRange = getInputRange(element); /* istanbul ignore if */ if (!inputRange) { return; } // There is no `beforeinput` event on `date` and `time` input if (!isDateOrTime(element)) { const unprevented = instance.dispatchUIEvent(element, 'beforeinput', { inputType, data }); if (!unprevented) { return; } } if ('startContainer' in inputRange) { editContenteditable(instance, element, inputRange, data, inputType); } else { editInputElement(instance, element, inputRange, data, inputType); } } function editContenteditable(instance, element, inputRange, data, inputType) { let del = false; if (!inputRange.collapsed) { del = true; inputRange.deleteContents(); } else if ([ 'deleteContentBackward', 'deleteContentForward' ].includes(inputType)) { const nextPosition = getNextCursorPosition(inputRange.startContainer, inputRange.startOffset, inputType === 'deleteContentBackward' ? -1 : 1, inputType); if (nextPosition) { del = true; const delRange = inputRange.cloneRange(); if (delRange.comparePoint(nextPosition.node, nextPosition.offset) < 0) { delRange.setStart(nextPosition.node, nextPosition.offset); } else { delRange.setEnd(nextPosition.node, nextPosition.offset); } delRange.deleteContents(); } } if (data) { if (inputRange.endContainer.nodeType === 3) { const offset = inputRange.endOffset; inputRange.endContainer.insertData(offset, data); inputRange.setStart(inputRange.endContainer, offset + data.length); inputRange.setEnd(inputRange.endContainer, offset + data.length); } else { const text = element.ownerDocument.createTextNode(data); inputRange.insertNode(text); inputRange.setStart(text, data.length); inputRange.setEnd(text, data.length); } } if (del || data) { instance.dispatchUIEvent(element, 'input', { inputType }); } } function editInputElement(instance, element, inputRange, data, inputType) { let dataToInsert = data; if (supportsMaxLength(element)) { const maxLength = getMaxLength(element); if (maxLength !== undefined && data.length > 0) { const spaceUntilMaxLength = maxLength - element.value.length; if (spaceUntilMaxLength > 0) { dataToInsert = data.substring(0, spaceUntilMaxLength); } else { return; } } } const { newValue, newOffset, oldValue } = calculateNewValue(dataToInsert, element, inputRange, inputType); if (newValue === oldValue && newOffset === inputRange.startOffset && newOffset === inputRange.endOffset) { return; } if (isElementType(element, 'input', { type: 'number' }) && !isValidNumberInput(newValue)) { return; } setUIValue(element, newValue); setSelection({ focusNode: element, anchorOffset: newOffset, focusOffset: newOffset }); if (isDateOrTime(element)) { if (isValidDateOrTimeValue(element, newValue)) { commitInput(instance, element, newOffset, {}); instance.dispatchUIEvent(element, 'change'); clearInitialValue(element); } } else { commitInput(instance, element, newOffset, { data, inputType }); } } function calculateNewValue(inputData, node, { startOffset, endOffset }, inputType) { const value = getUIValue(node); const prologEnd = Math.max(0, startOffset === endOffset && inputType === 'deleteContentBackward' ? startOffset - 1 : startOffset); const prolog = value.substring(0, prologEnd); const epilogStart = Math.min(value.length, startOffset === endOffset && inputType === 'deleteContentForward' ? startOffset + 1 : endOffset); const epilog = value.substring(epilogStart, value.length); let newValue = `${prolog}${inputData}${epilog}`; let newOffset = prologEnd + inputData.length; if (isElementType(node, 'input', { type: 'time' })) { const builtValue = buildTimeValue(newValue); if (builtValue !== '' && isValidDateOrTimeValue(node, builtValue)) { newValue = builtValue; newOffset = builtValue.length; } } return { oldValue: value, newValue, newOffset }; } function commitInput(instance, element, newOffset, inputInit) { instance.dispatchUIEvent(element, 'input', inputInit); commitValueAfterInput(element, newOffset); } function isValidNumberInput(value) { var _value_match, _value_match1; // the browser allows some invalid input but not others // it allows up to two '-' at any place before any 'e' or one directly following 'e' // it allows one '.' at any place before e const valueParts = value.split('e', 2); return !(/[^\d.\-e]/.test(value) || Number((_value_match = value.match(/-/g)) === null || _value_match === undefined ? undefined : _value_match.length) > 2 || Number((_value_match1 = value.match(/\./g)) === null || _value_match1 === undefined ? undefined : _value_match1.length) > 1 || valueParts[1] && !/^-?\d*$/.test(valueParts[1])); } behavior.cut = (event, target, instance)=>{ return ()=>{ if (isEditable(target)) { input(instance, target, '', 'deleteByCut'); } }; }; function getValueOrTextContent(element) { // istanbul ignore if if (!element) { return null; } if (isContentEditable(element)) { return element.textContent; } return getUIValue(element); } function isVisible(element) { const window = getWindow(element); for(let el = element; el === null || el === undefined ? undefined : el.ownerDocument; el = el.parentElement){ const { display, visibility } = window.getComputedStyle(el); if (display === 'none') { return false; } if (visibility === 'hidden') { return false; } } return true; } function getTabDestination(activeElement, shift) { const document = activeElement.ownerDocument; const focusableElements = document.querySelectorAll(FOCUSABLE_SELECTOR); const enabledElements = Array.from(focusableElements).filter((el)=>el === activeElement || !(Number(el.getAttribute('tabindex')) < 0 || isDisabled(el))); // tabindex has no effect if the active element has negative tabindex if (Number(activeElement.getAttribute('tabindex')) >= 0) { enabledElements.sort((a, b)=>{ const i = Number(a.getAttribute('tabindex')); const j = Number(b.getAttribute('tabindex')); if (i === j) { return 0; } else if (i === 0) { return 1; } else if (j === 0) { return -1; } return i - j; }); } const checkedRadio = {}; let prunedElements = [ document.body ]; const activeRadioGroup = isElementType(activeElement, 'input', { type: 'radio' }) ? activeElement.name : undefined; enabledElements.forEach((currentElement)=>{ const el = currentElement; // For radio groups keep only the active radio // If there is no active radio, keep only the checked radio // If there is no checked radio, treat like everything else if (isElementType(el, 'input', { type: 'radio' }) && el.name) { // If the active element is part of the group, add only that if (el === activeElement) { prunedElements.push(el); return; } else if (el.name === activeRadioGroup) { return; } // If we stumble upon a checked radio, remove the others if (el.checked) { prunedElements = prunedElements.filter((e)=>!isElementType(e, 'input', { type: 'radio', name: el.name })); prunedElements.push(el); checkedRadio[el.name] = el; return; } // If we already found the checked one, skip if (typeof checkedRadio[el.name] !== 'undefined') { return; } } prunedElements.push(el); }); for(let index = prunedElements.findIndex((el)=>el === activeElement);;){ index += shift ? -1 : 1; // loop at overflow if (index === prunedElements.length) { index = 0; } else if (index === -1) { index = prunedElements.length - 1; } if (prunedElements[index] === activeElement || prunedElements[index] === document.body || isVisible(prunedElements[index])) { return prunedElements[index]; } } } /** * Move the selection */ function moveSelection(node, direction) { // TODO: implement shift if (hasOwnSelection(node)) { const selection = getUISelection(node); setSelection({ focusNode: node, focusOffset: selection.startOffset === selection.endOffset ? selection.focusOffset + direction : direction < 0 ? selection.startOffset : selection.endOffset }); } else { const selection = node.ownerDocument.getSelection(); if (!(selection === null || selection === undefined ? undefined : selection.focusNode)) { return; } if (selection.isCollapsed) { const nextPosition = getNextCursorPosition(selection.focusNode, selection.focusOffset, direction); if (nextPosition) { setSelection({ focusNode: nextPosition.node, focusOffset: nextPosition.offset }); } } else { selection[direction < 0 ? 'collapseToStart' : 'collapseToEnd'](); } } } /** * Expand a selection like the browser does when pressing Ctrl+A. */ function selectAll(target) { if (hasOwnSelection(target)) { return setSelection({ focusNode: target, anchorOffset: 0, focusOffset: getUIValue(target).length }); } var _getContentEditable; const focusNode = (_getContentEditable = getContentEditable(target)) !== null && _getContentEditable !== undefined ? _getContentEditable : target.ownerDocument.body; setSelection({ focusNode, anchorOffset: 0, focusOffset: focusNode.childNodes.length }); } function isAllSelected(target) { if (hasOwnSelection(target)) { return getUISelection(target).startOffset === 0 && getUISelection(target).endOffset === getUIValue(target).length; } var _getContentEditable; const focusNode = (_getContentEditable = getContentEditable(target)) !== null && _getContentEditable !== undefined ? _getContentEditable : target.ownerDocument.body; const selection = target.ownerDocument.getSelection(); return (selection === null || selection === undefined ? undefined : selection.anchorNode) === focusNode && selection.focusNode === focusNode && selection.anchorOffset === 0 && selection.focusOffset === focusNode.childNodes.length; } /** * Backward-compatible selection. * * Handles input elements and contenteditable if it only contains a single text node. */ function setSelectionRange(element, anchorOffset, focusOffset) { var _element_firstChild; if (hasOwnSelection(element)) { return setSelection({ focusNode: element, anchorOffset, focusOffset }); } /* istanbul ignore else */ if (isContentEditable(element) && ((_element_firstChild = element.firstChild) === null || _element_firstChild === undefined ? undefined : _element_firstChild.nodeType) === 3) { return setSelection({ focusNode: element.firstChild, anchorOffset, focusOffset }); } /* istanbul ignore next */ throw new Error('Not implemented. The result of this interaction is unreliable.'); } function walkRadio(instance, el, direction) { const window = getWindow(el); const group = Array.from(el.ownerDocument.querySelectorAll(el.name ? `input[type="radio"][name="${window.CSS.escape(el.name)}"]` : `input[type="radio"][name=""], input[type="radio"]:not([name])`)); for(let i = group.findIndex((e)=>e === el) + direction;; i += direction){ if (!group[i]) { i = direction > 0 ? 0 : group.length - 1; } if (group[i] === el) { return; } if (isDisabled(group[i])) { continue; } focusElement(group[i]); instance.dispatchUIEvent(group[i], 'click'); return; } } behavior.keydown = (event, target, instance)=>{ var _keydownBehavior_event_key; var _keydownBehavior_event_key1; return (_keydownBehavior_event_key1 = (_keydownBehavior_event_key = keydownBehavior[event.key]) === null || _keydownBehavior_event_key === undefined ? undefined : _keydownBehavior_event_key.call(keydownBehavior, event, target, instance)) !== null && _keydownBehavior_event_key1 !== undefined ? _keydownBehavior_event_key1 : combinationBehavior(event, target, instance); }; const keydownBehavior = { ArrowDown: (event, target, instance)=>{ /* istanbul ignore else */ if (isElementType(target, 'input', { type: 'radio' })) { return ()=>walkRadio(instance, target, 1); } }, ArrowLeft: (event, target, instance)=>{ if (isElementType(target, 'input', { type: 'radio' })) { return ()=>walkRadio(instance, target, -1); } return ()=>moveSelection(target, -1); }, ArrowRight: (event, target, instance)=>{ if (isElementType(target, 'input', { type: 'radio' })) { return ()=>walkRadio(instance, target, 1); } return ()=>moveSelection(target, 1); }, ArrowUp: (event, target, instance)=>{ /* istanbul ignore else */ if (isElementType(target, 'input', { type: 'radio' })) { return ()=>walkRadio(instance, target, -1); } }, Backspace: (event, target, instance)=>{ if (isEditable(target)) { return ()=>{ input(instance, target, '', 'deleteContentBackward'); }; } }, Delete: (event, target, instance)=>{ if (isEditable(target)) { return ()=>{ input(instance, target, '', 'deleteContentForward'); }; } }, End: (event, target)=>{ if (isElementType(target, [ 'input', 'textarea' ]) || isContentEditable(target)) { return ()=>{ var _getValueOrTextContent; var _getValueOrTextContent_length; const newPos = (_getValueOrTextContent_length = (_getValueOrTextContent = getValueOrTextContent(target)) === null || _getValueOrTextContent === undefined ? undefined : _getValueOrTextContent.length) !== null && _getValueOrTextContent_length !== undefined ? _getValueOrTextContent_length : /* istanbul ignore next */ 0; setSelectionRange(target, newPos, newPos); }; } }, Home: (event, target)=>{ if (isElementType(target, [ 'input', 'textarea' ]) || isContentEditable(target)) { return ()=>{ setSelectionRange(target, 0, 0); }; } }, PageDown: (event, target)=>{ if (isElementType(target, [ 'input' ])) { return ()=>{ const newPos = getUIValue(target).length; setSelectionRange(target, newPos, newPos); }; } }, PageUp: (event, target)=>{ if (isElementType(target, [ 'input' ])) { return ()=>{ setSelectionRange(target, 0, 0); }; } }, Tab: (event, target, instance)=>{ return ()=>{ const dest = getTabDestination(target, instance.system.keyboard.modifiers.Shift); focusElement(dest); if (hasOwnSelection(dest)) { setUISelection(dest, { anchorOffset: 0, focusOffset: dest.value.length }); } }; } }; const combinationBehavior = (event, target, instance)=>{ if (event.code === 'KeyA' && instance.system.keyboard.modifiers.Control) { return ()=>selectAll(target); } }; behavior.keypress = (event, target, instance)=>{ if (event.key === 'Enter') { if (isElementType(target, 'button') || isElementType(target, 'input') && ClickInputOnEnter.includes(target.type) || isElementType(target, 'a') && Boolean(target.href)) { return ()=>{ instance.dispatchUIEvent(target, 'click'); }; } else if (isElementType(target, 'input')) { const form = target.form; const submit = form === null || form === undefined ? undefined : form.querySelector('input[type="submit"], button:not([type]), button[type="submit"]'); if (submit) { return ()=>instance.dispatchUIEvent(submit, 'click'); } else if (form && SubmitSingleInputOnEnter.includes(target.type) && form.querySelectorAll('input').length === 1) { return ()=>instance.dispatchUIEvent(form, 'submit'); } else { return; } } } if (isEditable(target)) { const inputType = event.key === 'Enter' ? isContentEditable(target) && !instance.system.keyboard.modifiers.Shift ? 'insertParagraph' : 'insertLineBreak' : 'insertText'; const inputData = event.key === 'Enter' ? '\n' : event.key; return ()=>input(instance, target, inputData, inputType); } }; const ClickInputOnEnter = [ 'button', 'color', 'file', 'image', 'reset', 'submit' ]; const SubmitSingleInputOnEnter = [ 'email', 'month', 'password', 'search', 'tel', 'text', 'url', 'week' ]; behavior.keyup = (event, target, instance)=>{ var _keyupBehavior_event_key; return (_keyupBehavior_event_key = keyupBehavior[event.key]) === null || _keyupBehavior_event_key === undefined ? undefined : _keyupBehavior_event_key.call(keyupBehavior, event, target, instance); }; const keyupBehavior = { ' ': (event, target, instance)=>{ if (isClickableInput(target)) { return ()=>instance.dispatchUIEvent(target, 'click'); } } }; behavior.paste = (event, target, instance)=>{ if (isEditable(target)) { return ()=>{ var _event_clipboardData; const insertData = (_event_clipboardData = event.clipboardData) === null || _event_clipboardData === undefined ? undefined : _event_clipboardData.getData('text'); if (insertData) { input(instance, target, insertData, 'insertFromPaste'); } }; } }; const eventMap = { auxclick: { EventType: 'PointerEvent', defaultInit: { bubbles: true, cancelable: true, composed: true } }, beforeinput: { EventType: 'InputEvent', defaultInit: { bubbles: true, cancelable: true, composed: true } }, blur: { EventType: 'FocusEvent', defaultInit: { bubbles: false, cancelable: false, composed: true } }, click: { EventType: 'PointerEvent', defaultInit: { bubbles: true, cancelable: true, composed: true } }, contextmenu: { EventType: 'PointerEvent', defaultInit: { bubbles: true, cancelable: true, composed: true } }, copy: { EventType: 'ClipboardEvent', defaultInit: { bubbles: true, cancelable: true, composed: true } }, change: { EventType: 'Event', defaultInit: { bubbles: true, cancelable: false } }, cut: { EventType: 'ClipboardEvent', defaultInit: { bubbles: true, cancelable: true, composed: true } }, dblclick: { EventType: 'MouseEvent', defaultInit: { bubbles: true, cancelable: true, composed: true } }, focus: { EventType: 'FocusEvent', defaultInit: { bubbles: false, cancelable: false, composed: true } }, focusin: { EventType: 'FocusEvent', defaultInit: { bubbles: true, cancelable: false, composed: true } }, focusout: { EventType: 'FocusEvent', defaultInit: { bubbles: true, cancelable: false, composed: true } }, keydown: { EventType: 'KeyboardEvent', defaultInit: { bubbles: true, cancelable: true, composed: true } }, keypress: { EventType: 'KeyboardEvent', defaultInit: { bubbles: true, cancelable: true, composed: true } }, keyup: { EventType: 'KeyboardEvent', defaultInit: { bubbles: true, cancelable: true, composed: true } }, paste: { EventType: 'ClipboardEvent', defaultInit: { bubbles: true, cancelable: true, composed: true } }, input: { EventType: 'InputEvent', defaultInit: { bubbles: true, cancelable: false, composed: true } }, mousedown: { EventType: 'MouseEvent', defaultInit: { bubbles: true, cancelable: true, composed: true } }, mouseenter: { EventType: 'MouseEvent', defaultInit: { bubbles: false, cancelable: false, composed: true } }, mouseleave: { EventType: 'MouseEvent', defaultInit: { bubbles: false, cancelable: false, composed: true } }, mousemove: { EventType: 'MouseEvent', defaultInit: { bubbles: true, cancelable: true, composed: true } }, mouseout: { EventType: 'MouseEvent', defaultInit: { bubbles: true, cancelable: true, composed: true } }, mouseover: { EventType: 'MouseEvent', defaultInit: { bubbles: true, cancelable: true, composed: true } }, mouseup: { EventType: 'MouseEvent', defaultInit: { bubbles: true, cancelable: true, composed: true } }, pointerover: { EventType: 'PointerEvent', defaultInit: { bubbles: true, cancelable: true, composed: true } }, pointerenter: { EventType: 'PointerEvent', defaultInit: { bubbles: false, cancelable: false } }, pointerdown: { EventType: 'PointerEvent', defaultInit: { bubbles: true, cancelable: true, composed: true } }, pointermove: { EventType: 'PointerEvent', defaultInit: { bubbles: true, cancelable: true, composed: true } }, pointerup: { EventType: 'PointerEvent', defaultInit: { bubbles: true, cancelable: true, composed: true } }, pointercancel: { EventType: 'PointerEvent', defaultInit: { bubbles: true, cancelable: false, composed: true } }, pointerout: { EventType: 'PointerEvent', defaultInit: { bubbles: true, cancelable: true, composed: true } }, pointerleave: { EventType: 'PointerEvent', defaultInit: { bubbles: false, cancelable: false } }, submit: { EventType: 'Event', defaultInit: { bubbles: true, cancelable: true } } }; function getEventClass(type) { return eventMap[type].EventType; } const mouseEvents = [ 'MouseEvent', 'PointerEvent' ]; function isMouseEvent(type) { return mouseEvents.includes(getEventClass(type)); } function isKeyboardEvent(type) { return getEventClass(type) === 'KeyboardEvent'; } const eventInitializer = { ClipboardEvent: [ initClipboardEvent ], Event: [], FocusEvent: [ initUIEvent, initFocusEvent ], InputEvent: [ initUIEvent, initInputEvent ], MouseEvent: [ initUIEvent, initUIEventModifiers, initMouseEvent ], PointerEvent: [ initUIEvent, initUIEventModifiers, initMouseEvent, initPointerEvent ], KeyboardEvent: [ initUIEvent, initUIEventModifiers, initKeyboardEvent ] }; function createEvent(type, target, init) { const window = getWindow(target); const { EventType, defaultInit } = eventMap[type]; const event = new (getEventConstructors(window))[EventType](type, defaultInit); eventInitializer[EventType].forEach((f)=>f(event, init !== null && init !== undefined ? init : {})); return event; } /* istanbul ignore next */ function getEventConstructors(window) { var _window_Event; /* eslint-disable @typescript-eslint/no-unnecessary-condition, @typescript-eslint/no-extraneous-class */ const Event = (_window_Event = window.Event) !== null && _window_Event !== undefined ? _window_Event : class Event { }; var _window_AnimationEvent; const AnimationEvent = (_window_AnimationEvent = window.AnimationEvent) !== null && _window_AnimationEvent !== undefined ? _window_AnimationEvent : class AnimationEvent extends Event { }; var _window_ClipboardEvent; const ClipboardEvent = (_window_ClipboardEvent = window.ClipboardEvent) !== null && _window_ClipboardEvent !== undefined ? _window_ClipboardEvent : class ClipboardEvent extends Event { }; var _window_PopStateEvent; const PopStateEvent = (_window_PopStateEvent = window.PopStateEvent) !== null && _window_PopStateEvent !== undefined ? _window_PopStateEvent : class PopStateEvent extends Event { }; var _window_ProgressEvent; const ProgressEvent = (_window_ProgressEvent = window.ProgressEvent) !== null && _window_ProgressEvent !== undefined ? _window_ProgressEvent : class ProgressEvent extends Event { }; var _window_TransitionEvent; const TransitionEvent = (_window_TransitionEvent = window.TransitionEvent) !== null && _window_TransitionEvent !== undefined ? _window_TransitionEvent : class TransitionEvent extends Event { }; var _window_UIEvent; const UIEvent = (_window_UIEvent = window.UIEvent) !== null && _window_UIEvent !== undefined ? _window_UIEvent : class UIEvent extends Event { }; var _window_CompositionEvent; const CompositionEvent = (_window_CompositionEvent = window.CompositionEvent) !== null && _window_CompositionEvent !== undefined ? _window_CompositionEvent : class CompositionEvent extends UIEvent { }; var _window_FocusEvent; const FocusEvent = (_window_FocusEvent = window.FocusEvent) !== null && _window_FocusEvent !== undefined ? _window_FocusEvent : class FocusEvent extends UIEvent { }; var _window_InputEvent; const InputEvent = (_window_InputEvent = window.InputEvent) !== null && _window_InputEvent !== undefined ? _window_InputEvent : class InputEvent extends UIEvent { }; var _window_KeyboardEvent; const KeyboardEvent = (_window_KeyboardEvent = window.KeyboardEvent) !== null && _window_KeyboardEvent !== undefined ? _window_KeyboardEvent : class KeyboardEvent extends UIEvent { }; var _window_MouseEvent; const MouseEvent = (_window_MouseEvent = window.MouseEvent) !== null && _window_MouseEvent !== undefined ? _window_MouseEvent : class MouseEvent extends UIEvent { }; var _window_DragEvent; const DragEvent = (_window_DragEvent = window.DragEvent) !== null && _window_DragEvent !== undefined ? _window_DragEvent : class DragEvent extends MouseEvent { }; var _window_PointerEvent; const PointerEvent = (_window_PointerEvent = window.PointerEvent) !== null && _window_PointerEvent !== undefined ? _window_PointerEvent : class PointerEvent extends MouseEvent { }; var _window_TouchEvent; const TouchEvent = (_window_TouchEvent = window.TouchEvent) !== null && _window_TouchEvent !== undefined ? _window_TouchEvent : class TouchEvent extends UIEvent { }; /* eslint-enable @typescript-eslint/no-unnecessary-condition, @typescript-eslint/no-extraneous-class */ return { Event, AnimationEvent, ClipboardEvent, PopStateEvent, ProgressEvent, TransitionEvent, UIEvent, CompositionEvent, FocusEvent, InputEvent, KeyboardEvent, MouseEvent, DragEvent, PointerEvent, TouchEvent }; } function assignProps(obj, props) { for (const [key, value] of Object.entries(props)){ Object.defineProperty(obj, key, { get: ()=>value !== null && value !== undefined ? value : null }); } } function sanitizeNumber(n) { return Number(n !== null && n !== undefined ? n : 0); } function initClipboardEvent(event, { clipboardData }) { assignProps(event, { clipboardData }); } function initFocusEvent(event, { relatedTarget }) { assignProps(event, { relatedTarget }); } function initInputEvent(event, { data, inputType, isComposing }) { assignProps(event, { data, isComposing: Boolean(isComposing), inputType: String(inputType) }); } function initUIEvent(event, { view, detail }) { assignProps(event, { view, detail: sanitizeNumber(detail !== null && detail !== undefined ? detail : 0) }); } function initUIEventModifiers(event, { altKey, ctrlKey, metaKey, shiftKey, modifierAltGraph, modifierCapsLock, modifierFn, modifierFnLock, modifierNumLock, modifierScrollLock, modifierSymbol, modifierSymbolLock }) { assignProps(event, { altKey: Boolean(altKey), ctrlKey: Boolean(ctrlKey), metaKey: Boolean(metaKey), shiftKey: Boolean(shiftKey), getModifierState (k) { return Boolean({ Alt: altKey, AltGraph: modifierAltGraph, CapsLock: modifierCapsLock, Control: ctrlKey, Fn: modifierFn, FnLock: modifierFnLock, Meta: metaKey, NumLock: modifierNumLock, ScrollLock: modifierScrollLock, Shift: shiftKey, Symbol: modifierSymbol, SymbolLock: modifierSymbolLock }[k]); } }); } function initKeyboardEvent(event, { key, code, location, repeat, isComposing, charCode }) { assignProps(event, { key: String(key), code: String(code), location: sanitizeNumber(location), repeat: Boolean(repeat), isComposing: Boolean(isComposing), charCode }); } function initMouseEvent(event, { x, y, screenX, screenY, clientX = x, clientY = y, button, buttons, relatedTarget, offsetX, offsetY, pageX, pageY }) { assignProps(event, { screenX: sanitizeNumber(screenX), screenY: sanitizeNumber(screenY), clientX: sanitizeNumber(clientX), x: sanitizeNumber(clientX), clientY: sanitizeNumber(clientY), y: sanitizeNumber(clientY), button: sanitizeNumber(button), buttons: sanitizeNumber(buttons), relatedTarget, offsetX: sanitizeNumber(offsetX), offsetY: sanitizeNumber(offsetY), pageX: sanitizeNumber(pageX), pageY: sanitizeNumber(pageY) }); } function initPointerEvent(event, { pointerId, width, height, pressure, tangentialPressure, tiltX, tiltY, twist, pointerType, isPrimary }) { assignProps(event, { pointerId: sanitizeNumber(pointerId), width: sanitizeNumber(width !== null && width !== undefined ? width : 1), height: sanitizeNumber(height !== null && height !== undefined ? height : 1), pressure: sanitizeNumber(pressure), tangentialPressure: sanitizeNumber(tangentialPressure), tiltX: sanitizeNumber(tiltX), tiltY: sanitizeNumber(tiltY), twist: sanitizeNumber(twist), pointerType: String(pointerType), isPrimary: Boolean(isPrimary) }); } function dispatchUIEvent(target, type, init, preventDefault = false) { if (isMouseEvent(type) || isKeyboardEvent(type)) { init = { ...init, ...this.system.getUIEventModifiers() }; } const event = createEvent(type, target, init); return dispatchEvent.call(this, target, event, preventDefault); } function dispatchEvent(target, event, preventDefault = false) { var _behavior_type; const type = event.type; const behaviorImplementation = preventDefault ? ()=>{} : (_behavior_type = behavior[type]) === null || _behavior_type === undefined ? undefined : _behavior_type.call(behavior, event, target, this); if (behaviorImplementation) { event.preventDefault(); let defaultPrevented = false; Object.defineProperty(event, 'defaultPrevented', { get: ()=>defaultPrevented }); Object.defineProperty(event, 'preventDefault', { value: ()=>{ defaultPrevented = event.cancelable; } }); wrapEvent(()=>target.dispatchEvent(event)); if (!defaultPrevented) { behaviorImplementation(); } return !defaultPrevented; } return wrapEvent(()=>target.dispatchEvent(event)); } function dispatchDOMEvent(target, type, init) { const event = createEvent(type, target, init); wrapEvent(()=>target.dispatchEvent(event)); } const patched = Symbol('patched focus/blur methods'); function patchFocus(HTMLElement) { if (HTMLElement.prototype[patched]) { return; } // eslint-disable-next-line @typescript-eslint/unbound-method const { focus, blur } = HTMLElement.prototype; Object.defineProperties(HTMLElement.prototype, { focus: { configurable: true, get: ()=>patchedFocus }, blur: { configurable: true, get: ()=>patchedBlur }, [patched]: { configurable: true, get: ()=>({ focus, blur }) } }); let activeCall; function patchedFocus(options) { if (this.ownerDocument.visibilityState !== 'hidden') { return focus.call(this, options); } const blurred = getActiveTarget(this.ownerDocument); if (blurred === this) { return; } const thisCall = Symbol('focus call'); activeCall = thisCall; if (blurred) { blur.call(blurred); dispatchDOMEvent(blurred, 'blur', { relatedTarget: this }); dispatchDOMEvent(blurred, 'focusout', { relatedTarget: activeCall === thisCall ? this : null }); } if (activeCall === thisCall) { focus.call(this, options); dispatchDOMEvent(this, 'focus', { relatedTarget: blurred }); } if (activeCall === thisCall) { dispatchDOMEvent(this, 'focusin', { relatedTarget: blurred }); } } function patchedBlur() { if (this.ownerDocument.visibilityState !== 'hidden') { return blur.call(this); } const blurred = getActiveTarget(this.ownerDocument); if (blurred !== this) { return; } const thisCall = Symbol('blur call'); activeCall = thisCall; blur.call(this); dispatchDOMEvent(blurred, 'blur', { relatedTarget: null }); dispatchDOMEvent(blurred, 'focusout', { relatedTarget: null }); } } function getActiveTarget(document) { const active = getActiveElement(document); return (active === null || active === undefined ? undefined : active.tagName) === 'BODY' ? null : active; } const Interceptor = Symbol('Interceptor for programmatical calls'); function prepareInterceptor(element, propName, interceptorImpl) { const prototypeDescriptor = Object.getOwnPropertyDescriptor(element.constructor.prototype, propName); const objectDescriptor = Object.getOwnPropertyDescriptor(element, propName); const target = (prototypeDescriptor === null || prototypeDescriptor === undefined ? undefined : prototypeDescriptor.set) ? 'set' : 'value'; /* istanbul ignore if */ if (typeof (prototypeDescriptor === null || prototypeDescriptor === undefined ? undefined : prototypeDescriptor[target]) !== 'function' || prototypeDescriptor[target][Interceptor]) { throw new Error(`Element ${element.tagName} does not implement "${String(propName)}".`); } function intercept(...args) { const { applyNative = false, realArgs, then } = interceptorImpl.call(this, ...args); const realFunc = (!applyNative && objectDescriptor || prototypeDescriptor)[target]; if (target === 'set') { realFunc.call(this, realArgs); } else { realFunc.call(this, ...realArgs); } then === null || then === undefined ? undefined : then(); } intercept[Interceptor] = Interceptor; Object.defineProperty(element, propName, { ...objectDescriptor !== null && objectDescriptor !== undefined ? objectDescriptor : prototypeDescriptor, [target]: intercept }); } function prepareValueInterceptor(element) { prepareInterceptor(element, 'value', function interceptorImpl(v) { const isUI = isUIValue(v); if (isUI) { startTrackValue(this); } return { applyNative: !!isUI, realArgs: sanitizeValue(this, v), then: isUI ? undefined : ()=>trackOrSetValue(this, String(v)) }; }); } function sanitizeValue(element, v) { // Workaround for JSDOM if (isElementType(element, 'input', { type: 'number' }) && String(v) !== '' && !Number.isNaN(Number(v))) { // Setting value to "1." results in `null` in JSDOM return String(Number(v)); } return String(v); } function prepareSelectionInterceptor(element) { prepareInterceptor(element, 'setSelectionRange', function interceptorImpl(start, ...others) { const isUI = isUISelectionStart(start); return { applyNative: !!isUI, realArgs: [ Number(start), ...others ], then: ()=>isUI ? undefined : setUISelectionClean(element) }; }); prepareInterceptor(element, 'selectionStart', function interceptorImpl(v) { return { realArgs: v, then: ()=>setUISelectionClean(element) }; }); prepareInterceptor(element, 'selectionEnd', function interceptorImpl(v) { return { realArgs: v, then: ()=>setUISelectionClean(element) }; }); prepareInterceptor(element, 'select', function interceptorImpl() { return { realArgs: [], then: ()=>setUISelectionRaw(element, { anchorOffset: 0, focusOffset: getUIValue(element).length }) }; }); } function prepareRangeTextInterceptor(element) { prepareInterceptor(element, 'setRangeText', function interceptorImpl(...realArgs) { return { realArgs, then: ()=>{ setUIValueClean(element); setUISelectionClean(element); } }; }); } const isPrepared = Symbol('Node prepared with document state workarounds'); function prepareDocument(document) { if (document[isPrepared]) { return; } document.addEventListener('focus', (e)=>{ const el = e.target; prepareElement(el); }, { capture: true, passive: true }); // Our test environment defaults to `document.body` as `activeElement`. // In other environments this might be `null` when preparing. // istanbul ignore else if (document.activeElement) { prepareElement(document.activeElement); } document.addEventListener('blur', (e)=>{ const el = e.target; const initialValue = getInitialValue(el); if (initialValue !== undefined) { if (el.value !== initialValue) { dispatchDOMEvent(el, 'change'); } clearInitialValue(el); } }, { capture: true, passive: true }); document[isPrepared] = isPrepared; } function prepareElement(el) { if (el[isPrepared]) { return; } if (isElementType(el, [ 'input', 'textarea' ])) { prepareValueInterceptor(el); prepareSelectionInterceptor(el); prepareRangeTextInterceptor(el); } el[isPrepared] = isPrepared; } function getDocumentFromNode(el) { return isDocument(el) ? el : el.ownerDocument; } function isDocument(node) { return node.nodeType === 9; } var ApiLevel = /*#__PURE__*/ function(ApiLevel) { ApiLevel[ApiLevel["Trigger"] = 2] = "Trigger"; ApiLevel[ApiLevel["Call"] = 1] = "Call"; return ApiLevel; }({}); function setLevelRef(instance, level) { instance.levelRefs[level] = {}; } function getLevelRef(instance, level) { return instance.levelRefs[level]; } function wait(config) { const delay = config.delay; if (typeof delay !== 'number') { return; } return Promise.all([ new Promise((resolve)=>globalThis.setTimeout(()=>resolve(), delay)), config.advanceTimers(delay) ]); } var PointerEventsCheckLevel = /*#__PURE__*/ function(PointerEventsCheckLevel) { /** * Check pointer events on every user interaction that triggers a bunch of events. * E.g. once for releasing a mouse button even though this triggers `pointerup`, `mouseup`, `click`, etc... */ PointerEventsCheckLevel[PointerEventsCheckLevel["EachTrigger"] = 4] = "EachTrigger"; /** Check each target once per call to pointer (related) API */ PointerEventsCheckLevel[PointerEventsCheckLevel["EachApiCall"] = 2] = "EachApiCall"; /** Check each event target once */ PointerEventsCheckLevel[PointerEventsCheckLevel["EachTarget"] = 1] = "EachTarget"; /** No pointer events check */ PointerEventsCheckLevel[PointerEventsCheckLevel["Never"] = 0] = "Never"; return PointerEventsCheckLevel; }({}); function _define_property$6(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } var DOM_KEY_LOCATION = /*#__PURE__*/ function(DOM_KEY_LOCATION) { DOM_KEY_LOCATION[DOM_KEY_LOCATION["STANDARD"] = 0] = "STANDARD"; DOM_KEY_LOCATION[DOM_KEY_LOCATION["LEFT"] = 1] = "LEFT"; DOM_KEY_LOCATION[DOM_KEY_LOCATION["RIGHT"] = 2] = "RIGHT"; DOM_KEY_LOCATION[DOM_KEY_LOCATION["NUMPAD"] = 3] = "NUMPAD"; return DOM_KEY_LOCATION; }({}); const modifierKeys = [ 'Alt', 'AltGraph', 'Control', 'Fn', 'Meta', 'Shift', 'Symbol' ]; function isModifierKey(key) { return modifierKeys.includes(key); } const modifierLocks = [ 'CapsLock', 'FnLock', 'NumLock', 'ScrollLock', 'SymbolLock' ]; function isModifierLock(key) { return modifierLocks.includes(key); } class KeyboardHost { isKeyPressed(keyDef) { return this.pressed.has(String(keyDef.code)); } getPressedKeys() { return this.pressed.values().map((p)=>p.keyDef); } /** Press a key */ async keydown(instance, keyDef) { const key = String(keyDef.key); const code = String(keyDef.code); const target = getActiveElementOrBody(instance.config.document); this.setKeydownTarget(target); this.pressed.add(code, keyDef); if (isModifierKey(key)) { this.modifiers[key] = true; } const unprevented = instance.dispatchUIEvent(target, 'keydown', { key, code }); if (isModifierLock(key) && !this.modifiers[key]) { this.modifiers[key] = true; this.modifierLockStart[key] = true; } if (unprevented) { this.pressed.setUnprevented(code); } if (unprevented && this.hasKeyPress(key)) { instance.dispatchUIEvent(getActiveElementOrBody(instance.config.document), 'keypress', { key, code, charCode: keyDef.key === 'Enter' ? 13 : String(keyDef.key).charCodeAt(0) }); } } /** Release a key */ async keyup(instance, keyDef) { const key = String(keyDef.key); const code = String(keyDef.code); const unprevented = this.pressed.isUnprevented(code); this.pressed.delete(code); if (isModifierKey(key) && !this.pressed.values().find((p)=>p.keyDef.key === key)) { this.modifiers[key] = false; } instance.dispatchUIEvent(getActiveElementOrBody(instance.config.document), 'keyup', { key, code }, !unprevented); if (isModifierLock(key) && this.modifiers[key]) { if (this.modifierLockStart[key]) { this.modifierLockStart[key] = false; } else { this.modifiers[key] = false; } } } setKeydownTarget(target) { if (target !== this.lastKeydownTarget) { this.carryChar = ''; } this.lastKeydownTarget = target; } hasKeyPress(key) { return (key.length === 1 || key === 'Enter') && !this.modifiers.Control && !this.modifiers.Alt; } constructor(system){ _define_property$6(this, "system", undefined); _define_property$6(this, "modifiers", { Alt: false, AltGraph: false, CapsLock: false, Control: false, Fn: false, FnLock: false, Meta: false, NumLock: false, ScrollLock: false, Shift: false, Symbol: false, SymbolLock: false }); _define_property$6(this, "pressed", new class { add(code, keyDef) { var _this_registry, _code; var _; (_ = (_this_registry = this.registry)[_code = code]) !== null && _ !== undefined ? _ : _this_registry[_code] = { keyDef, unpreventedDefault: false }; } has(code) { return !!this.registry[code]; } setUnprevented(code) { const o = this.registry[code]; if (o) { o.unpreventedDefault = true; } } isUnprevented(code) { var _this_registry_code; return !!((_this_registry_code = this.registry[code]) === null || _this_registry_code === undefined ? undefined : _this_registry_code.unpreventedDefault); } delete(code) { // eslint-disable-next-line @typescript-eslint/no-dynamic-delete delete this.registry[code]; } values() { return Object.values(this.registry); } constructor(){ _define_property$6(this, "registry", {}); } }()); _define_property$6(this, "carryChar", ''); _define_property$6(this, "lastKeydownTarget", undefined); _define_property$6(this, "modifierLockStart", {}); this.system = system; } } /** * Mapping for a default US-104-QWERTY keyboard */ const defaultKeyMap$1 = [ // alphanumeric block - writing system ...'0123456789'.split('').map((c)=>({ code: `Digit${c}`, key: c })), ...')!@#$%^&*('.split('').map((c, i)=>({ code: `Digit${i}`, key: c, shiftKey: true })), ...'abcdefghijklmnopqrstuvwxyz'.split('').map((c)=>({ code: `Key${c.toUpperCase()}`, key: c })), ...'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.split('').map((c)=>({ code: `Key${c}`, key: c, shiftKey: true })), { code: 'BracketLeft', key: '[' }, { code: 'BracketLeft', key: '{', shiftKey: true }, { code: 'BracketRight', key: ']' }, { code: 'BracketRight', key: '}', shiftKey: true }, // alphanumeric block - functional { code: 'Space', key: ' ' }, { code: 'AltLeft', key: 'Alt', location: DOM_KEY_LOCATION.LEFT }, { code: 'AltRight', key: 'Alt', location: DOM_KEY_LOCATION.RIGHT }, { code: 'ShiftLeft', key: 'Shift', location: DOM_KEY_LOCATION.LEFT }, { code: 'ShiftRight', key: 'Shift', location: DOM_KEY_LOCATION.RIGHT }, { code: 'ControlLeft', key: 'Control', location: DOM_KEY_LOCATION.LEFT }, { code: 'ControlRight', key: 'Control', location: DOM_KEY_LOCATION.RIGHT }, { code: 'MetaLeft', key: 'Meta', location: DOM_KEY_LOCATION.LEFT }, { code: 'MetaRight', key: 'Meta', location: DOM_KEY_LOCATION.RIGHT }, { code: 'OSLeft', key: 'OS', location: DOM_KEY_LOCATION.LEFT }, { code: 'OSRight', key: 'OS', location: DOM_KEY_LOCATION.RIGHT }, { code: 'ContextMenu', key: 'ContextMenu' }, { code: 'Tab', key: 'Tab' }, { code: 'CapsLock', key: 'CapsLock' }, { code: 'Backspace', key: 'Backspace' }, { code: 'Enter', key: 'Enter' }, // function { code: 'Escape', key: 'Escape' }, // arrows { code: 'ArrowUp', key: 'ArrowUp' }, { code: 'ArrowDown', key: 'ArrowDown' }, { code: 'ArrowLeft', key: 'ArrowLeft' }, { code: 'ArrowRight', key: 'ArrowRight' }, // control pad { code: 'Home', key: 'Home' }, { code: 'End', key: 'End' }, { code: 'Delete', key: 'Delete' }, { code: 'PageUp', key: 'PageUp' }, { code: 'PageDown', key: 'PageDown' }, // Special keys that are not part of a default US-layout but included for specific behavior { code: 'Fn', key: 'Fn' }, { code: 'Symbol', key: 'Symbol' }, { code: 'AltRight', key: 'AltGraph' } ]; const defaultKeyMap = [ { name: 'MouseLeft', pointerType: 'mouse', button: 'primary' }, { name: 'MouseRight', pointerType: 'mouse', button: 'secondary' }, { name: 'MouseMiddle', pointerType: 'mouse', button: 'auxiliary' }, { name: 'TouchA', pointerType: 'touch' }, { name: 'TouchB', pointerType: 'touch' }, { name: 'TouchC', pointerType: 'touch' } ]; function _define_property$5(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } class Buttons { getButtons() { let v = 0; for (const button of Object.keys(this.pressed)){ // eslint-disable-next-line no-bitwise v |= 2 ** Number(button); } return v; } down(keyDef) { const button = getMouseButtonId(keyDef.button); if (button in this.pressed) { this.pressed[button].push(keyDef); return undefined; } this.pressed[button] = [ keyDef ]; return button; } up(keyDef) { const button = getMouseButtonId(keyDef.button); if (button in this.pressed) { this.pressed[button] = this.pressed[button].filter((k)=>k.name !== keyDef.name); if (this.pressed[button].length === 0) { // eslint-disable-next-line @typescript-eslint/no-dynamic-delete delete this.pressed[button]; return button; } } return undefined; } constructor(){ _define_property$5(this, "pressed", {}); } } const MouseButton = { primary: 0, secondary: 1, auxiliary: 2, back: 3, X1: 3, forward: 4, X2: 4 }; function getMouseButtonId(button = 0) { if (button in MouseButton) { return MouseButton[button]; } return Number(button); } // On the `MouseEvent.button` property auxiliary and secondary button are flipped compared to `MouseEvent.buttons`. const MouseButtonFlip = { 1: 2, 2: 1 }; function getMouseEventButton(button) { button = getMouseButtonId(button); if (button in MouseButtonFlip) { return MouseButtonFlip[button]; } return button; } function _define_property$4(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } class Device { get countPressed() { return this.pressedKeys.size; } isPressed(keyDef) { return this.pressedKeys.has(keyDef.name); } addPressed(keyDef) { return this.pressedKeys.add(keyDef.name); } removePressed(keyDef) { return this.pressedKeys.delete(keyDef.name); } constructor(){ _define_property$4(this, "pressedKeys", new Set()); } } function getTreeDiff(a, b) { const treeA = []; for(let el = a; el; el = el.parentElement){ treeA.push(el); } const treeB = []; for(let el = b; el; el = el.parentElement){ treeB.push(el); } let i = 0; for(;; i++){ if (i >= treeA.length || i >= treeB.length || treeA[treeA.length - 1 - i] !== treeB[treeB.length - 1 - i]) { break; } } return [ treeA.slice(0, treeA.length - i), treeB.slice(0, treeB.length - i), treeB.slice(treeB.length - i) ]; } function resolveCaretPosition({ target, node, offset }) { if (hasOwnSelection(target)) { return { node: target, offset: offset !== null && offset !== undefined ? offset : getUIValue(target).length }; } else if (node) { return { node, offset: offset !== null && offset !== undefined ? offset : node.nodeType === 3 ? node.nodeValue.length : node.childNodes.length }; } return findNodeAtTextOffset(target, offset); } function findNodeAtTextOffset(node, offset, isRoot = true) { // When clicking after the content the browser behavior can be complicated: // 1. If there is textContent after the last element child, // the cursor is moved there. // 2. If there is textContent in the last element child, // the browser moves the cursor to the last non-empty text node inside this element. // 3. Otherwise the cursor is moved to the end of the target. let i = offset === undefined ? node.childNodes.length - 1 : 0; const step = offset === undefined ? -1 : 1; while(offset === undefined ? i >= (isRoot ? Math.max(node.childNodes.length - 1, 0) : 0) : i <= node.childNodes.length){ if (offset && i === node.childNodes.length) { throw new Error('The given offset is out of bounds.'); } const c = node.childNodes.item(i); const text = String(c.textContent); if (text.length) { if (offset !== undefined && text.length < offset) { offset -= text.length; } else if (c.nodeType === 1) { return findNodeAtTextOffset(c, offset, false); } else { // The pre-commit hooks keeps changing this // See https://github.com/kentcdodds/kcd-scripts/issues/218 /* istanbul ignore else */ // eslint-disable-next-line no-lonely-if if (c.nodeType === 3) { return { node: c, offset: offset !== null && offset !== undefined ? offset : c.nodeValue.length }; } } } i += step; } return { node, offset: node.childNodes.length }; } function setSelectionPerMouseDown({ document, target, clickCount, node, offset }) { if (hasNoSelection(target)) { return; } const targetHasOwnSelection = hasOwnSelection(target); // On non-input elements the text selection per multiple click // can extend beyond the target boundaries. // The exact mechanism what is considered in the same line is unclear. // Looks it might be every inline element. // TODO: Check what might be considered part of the same line of text. const text = String(targetHasOwnSelection ? getUIValue(target) : target.textContent); const [start, end] = node ? // which elements might be considered in the same line of text. // TODO: support expanding initial range on multiple clicks if node is given [ offset, offset ] : getTextRange(text, offset, clickCount); // TODO: implement modifying selection per shift/ctrl+mouse if (targetHasOwnSelection) { setUISelection(target, { anchorOffset: start !== null && start !== undefined ? start : text.length, focusOffset: end !== null && end !== undefined ? end : text.length }); return { node: target, start: start !== null && start !== undefined ? start : 0, end: end !== null && end !== undefined ? end : text.length }; } else { const { node: startNode, offset: startOffset } = resolveCaretPosition({ target, node, offset: start }); const { node: endNode, offset: endOffset } = resolveCaretPosition({ target, node, offset: end }); const range = target.ownerDocument.createRange(); try { range.setStart(startNode, startOffset); range.setEnd(endNode, endOffset); } catch (e) { throw new Error('The given offset is out of bounds.'); } const selection = document.getSelection(); selection === null || selection === undefined ? undefined : selection.removeAllRanges(); selection === null || selection === undefined ? undefined : selection.addRange(range.cloneRange()); return range; } } function getTextRange(text, pos, clickCount) { if (clickCount % 3 === 1 || text.length === 0) { return [ pos, pos ]; } const textPos = pos !== null && pos !== undefined ? pos : text.length; if (clickCount % 3 === 2) { return [ textPos - text.substr(0, pos).match(/(\w+|\s+|\W)?$/)[0].length, pos === undefined ? pos : pos + text.substr(pos).match(/^(\w+|\s+|\W)?/)[0].length ]; } // triple click return [ textPos - text.substr(0, pos).match(/[^\r\n]*$/)[0].length, pos === undefined ? pos : pos + text.substr(pos).match(/^[^\r\n]*/)[0].length ]; } function modifySelectionPerMouseMove(selectionRange, { document, target, node, offset }) { const selectionFocus = resolveCaretPosition({ target, node, offset }); if ('node' in selectionRange) { // When the mouse is dragged outside of an input/textarea, // the selection is extended to the beginning or end of the input // depending on pointer position. // TODO: extend selection according to pointer position /* istanbul ignore else */ if (selectionFocus.node === selectionRange.node) { const anchorOffset = selectionFocus.offset < selectionRange.start ? selectionRange.end : selectionRange.start; const focusOffset = selectionFocus.offset > selectionRange.end || selectionFocus.offset < selectionRange.start ? selectionFocus.offset : selectionRange.end; setUISelection(selectionRange.node, { anchorOffset, focusOffset }); } } else { const range = selectionRange.cloneRange(); const cmp = range.comparePoint(selectionFocus.node, selectionFocus.offset); if (cmp < 0) { range.setStart(selectionFocus.node, selectionFocus.offset); } else if (cmp > 0) { range.setEnd(selectionFocus.node, selectionFocus.offset); } const selection = document.getSelection(); selection === null || selection === undefined ? undefined : selection.removeAllRanges(); selection === null || selection === undefined ? undefined : selection.addRange(range.cloneRange()); } } function isDifferentPointerPosition(positionA, positionB) { var _positionA_coords, _positionB_coords, _positionA_coords1, _positionB_coords1, _positionA_coords2, _positionB_coords2, _positionA_coords3, _positionB_coords3, _positionA_coords4, _positionB_coords4, _positionA_coords5, _positionB_coords5, _positionA_coords6, _positionB_coords6, _positionA_coords7, _positionB_coords7, _positionA_coords8, _positionB_coords8, _positionA_coords9, _positionB_coords9, _positionA_caret, _positionB_caret, _positionA_caret1, _positionB_caret1; return positionA.target !== positionB.target || ((_positionA_coords = positionA.coords) === null || _positionA_coords === undefined ? undefined : _positionA_coords.x) !== ((_positionB_coords = positionB.coords) === null || _positionB_coords === undefined ? undefined : _positionB_coords.x) || ((_positionA_coords1 = positionA.coords) === null || _positionA_coords1 === undefined ? undefined : _positionA_coords1.y) !== ((_positionB_coords1 = positionB.coords) === null || _positionB_coords1 === undefined ? undefined : _positionB_coords1.y) || ((_positionA_coords2 = positionA.coords) === null || _positionA_coords2 === undefined ? undefined : _positionA_coords2.clientX) !== ((_positionB_coords2 = positionB.coords) === null || _positionB_coords2 === undefined ? undefined : _positionB_coords2.clientX) || ((_positionA_coords3 = positionA.coords) === null || _positionA_coords3 === undefined ? undefined : _positionA_coords3.clientY) !== ((_positionB_coords3 = positionB.coords) === null || _positionB_coords3 === undefined ? undefined : _positionB_coords3.clientY) || ((_positionA_coords4 = positionA.coords) === null || _positionA_coords4 === undefined ? undefined : _positionA_coords4.offsetX) !== ((_positionB_coords4 = positionB.coords) === null || _positionB_coords4 === undefined ? undefined : _positionB_coords4.offsetX) || ((_positionA_coords5 = positionA.coords) === null || _positionA_coords5 === undefined ? undefined : _positionA_coords5.offsetY) !== ((_positionB_coords5 = positionB.coords) === null || _positionB_coords5 === undefined ? undefined : _positionB_coords5.offsetY) || ((_positionA_coords6 = positionA.coords) === null || _positionA_coords6 === undefined ? undefined : _positionA_coords6.pageX) !== ((_positionB_coords6 = positionB.coords) === null || _positionB_coords6 === undefined ? undefined : _positionB_coords6.pageX) || ((_positionA_coords7 = positionA.coords) === null || _positionA_coords7 === undefined ? undefined : _positionA_coords7.pageY) !== ((_positionB_coords7 = positionB.coords) === null || _positionB_coords7 === undefined ? undefined : _positionB_coords7.pageY) || ((_positionA_coords8 = positionA.coords) === null || _positionA_coords8 === undefined ? undefined : _positionA_coords8.screenX) !== ((_positionB_coords8 = positionB.coords) === null || _positionB_coords8 === undefined ? undefined : _positionB_coords8.screenX) || ((_positionA_coords9 = positionA.coords) === null || _positionA_coords9 === undefined ? undefined : _positionA_coords9.screenY) !== ((_positionB_coords9 = positionB.coords) === null || _positionB_coords9 === undefined ? undefined : _positionB_coords9.screenY) || ((_positionA_caret = positionA.caret) === null || _positionA_caret === undefined ? undefined : _positionA_caret.node) !== ((_positionB_caret = positionB.caret) === null || _positionB_caret === undefined ? undefined : _positionB_caret.node) || ((_positionA_caret1 = positionA.caret) === null || _positionA_caret1 === undefined ? undefined : _positionA_caret1.offset) !== ((_positionB_caret1 = positionB.caret) === null || _positionB_caret1 === undefined ? undefined : _positionB_caret1.offset); } function _define_property$3(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /** * This object is the single "virtual" mouse that might be controlled by multiple different pointer devices. */ class Mouse { move(instance, position, /** Whether `preventDefault()` has been called on the `pointerdown` event */ isPrevented) { const prevPosition = this.position; const prevTarget = this.getTarget(instance); this.position = position; if (!isDifferentPointerPosition(prevPosition, position)) { return; } const nextTarget = this.getTarget(instance); const init = this.getEventInit('mousemove'); const [leave, enter] = getTreeDiff(prevTarget, nextTarget); return { leave: ()=>{ if (prevTarget !== nextTarget) { instance.dispatchUIEvent(prevTarget, 'mouseout', init); leave.forEach((el)=>instance.dispatchUIEvent(el, 'mouseleave', init)); } }, enter: ()=>{ if (prevTarget !== nextTarget) { instance.dispatchUIEvent(nextTarget, 'mouseover', init); enter.forEach((el)=>instance.dispatchUIEvent(el, 'mouseenter', init)); } }, move: ()=>{ if (isPrevented) { return; } instance.dispatchUIEvent(nextTarget, 'mousemove', init); this.modifySelecting(instance); } }; } down(instance, keyDef, /** Whether `preventDefault()` has been called on the `pointerdown` event */ isPrevented) { const button = this.buttons.down(keyDef); if (button === undefined) { return; } const target = this.getTarget(instance); this.buttonDownTarget[button] = target; const init = this.getEventInit('mousedown', keyDef.button); const disabled = isDisabled(target); if (!isPrevented && (disabled || instance.dispatchUIEvent(target, 'mousedown', init))) { this.startSelecting(instance, init.detail); focusElement(target); } if (!disabled && getMouseEventButton(keyDef.button) === 2) { instance.dispatchUIEvent(target, 'contextmenu', this.getEventInit('contextmenu', keyDef.button)); } } up(instance, keyDef, /** Whether `preventDefault()` has been called on the `pointerdown` event */ isPrevented) { const button = this.buttons.up(keyDef); if (button === undefined) { return; } const target = this.getTarget(instance); if (!isDisabled(target)) { if (!isPrevented) { const mouseUpInit = this.getEventInit('mouseup', keyDef.button); instance.dispatchUIEvent(target, 'mouseup', mouseUpInit); this.endSelecting(); } const clickTarget = getTreeDiff(this.buttonDownTarget[button], target)[2][0]; if (clickTarget) { const init = this.getEventInit('click', keyDef.button); if (init.detail) { instance.dispatchUIEvent(clickTarget, init.button === 0 ? 'click' : 'auxclick', init); if (init.button === 0 && init.detail === 2) { instance.dispatchUIEvent(clickTarget, 'dblclick', { ...this.getEventInit('dblclick', keyDef.button), detail: init.detail }); } } } } } resetClickCount() { this.clickCount.reset(); } getEventInit(type, button) { const init = { ...this.position.coords }; init.button = getMouseEventButton(button); init.buttons = this.buttons.getButtons(); if (type === 'mousedown') { init.detail = this.clickCount.getOnDown(init.button); } else if (type === 'mouseup') { init.detail = this.clickCount.getOnUp(init.button); } else if (type === 'click' || type === 'auxclick') { init.detail = this.clickCount.incOnClick(init.button); } return init; } getTarget(instance) { var _this_position_target; return (_this_position_target = this.position.target) !== null && _this_position_target !== undefined ? _this_position_target : instance.config.document.body; } startSelecting(instance, clickCount) { var _this_position_caret, _this_position_caret1; // TODO: support extending range (shift) this.selecting = setSelectionPerMouseDown({ document: instance.config.document, target: this.getTarget(instance), node: (_this_position_caret = this.position.caret) === null || _this_position_caret === undefined ? undefined : _this_position_caret.node, offset: (_this_position_caret1 = this.position.caret) === null || _this_position_caret1 === undefined ? undefined : _this_position_caret1.offset, clickCount }); } modifySelecting(instance) { var _this_position_caret, _this_position_caret1; if (!this.selecting) { return; } modifySelectionPerMouseMove(this.selecting, { document: instance.config.document, target: this.getTarget(instance), node: (_this_position_caret = this.position.caret) === null || _this_position_caret === undefined ? undefined : _this_position_caret.node, offset: (_this_position_caret1 = this.position.caret) === null || _this_position_caret1 === undefined ? undefined : _this_position_caret1.offset }); } endSelecting() { this.selecting = undefined; } constructor(){ _define_property$3(this, "position", {}); _define_property$3(this, "buttons", new Buttons()); _define_property$3(this, "selecting", undefined); _define_property$3(this, "buttonDownTarget", {}); // According to spec the `detail` on click events should be the number // of *consecutive* clicks with a specific button. // On `mousedown` and `mouseup` it should be this number increased by one. // But the browsers don't implement it this way. // If another button is pressed, // in Webkit: the `mouseup` on the previously pressed button has `detail: 0` and no `click`/`auxclick`. // in Gecko: the `mouseup` and click events have the same detail as the `mousedown`. // If there is a delay while a button is pressed, // the `mouseup` and `click` are normal, but a following `mousedown` starts a new click count. // We'll follow the minimal implementation of Webkit. _define_property$3(this, "clickCount", new class { incOnClick(button) { const current = this.down[button] === undefined ? undefined : Number(this.down[button]) + 1; this.count = this.count[button] === undefined ? {} : { [button]: Number(this.count[button]) + 1 }; return current; } getOnDown(button) { var _this_count_button; this.down = { [button]: (_this_count_button = this.count[button]) !== null && _this_count_button !== undefined ? _this_count_button : 0 }; var _this_count_button1; this.count = { [button]: (_this_count_button1 = this.count[button]) !== null && _this_count_button1 !== undefined ? _this_count_button1 : 0 }; return Number(this.count[button]) + 1; } getOnUp(button) { return this.down[button] === undefined ? undefined : Number(this.down[button]) + 1; } reset() { this.count = {}; } constructor(){ _define_property$3(this, "down", {}); _define_property$3(this, "count", {}); } }()); } } function hasPointerEvents(instance, element) { var _checkPointerEvents; return ((_checkPointerEvents = checkPointerEvents(instance, element)) === null || _checkPointerEvents === undefined ? undefined : _checkPointerEvents.pointerEvents) !== 'none'; } function closestPointerEventsDeclaration(element) { const window = getWindow(element); for(let el = element, tree = []; el === null || el === undefined ? undefined : el.ownerDocument; el = el.parentElement){ tree.push(el); const pointerEvents = window.getComputedStyle(el).pointerEvents; if (pointerEvents && ![ 'inherit', 'unset' ].includes(pointerEvents)) { return { pointerEvents, tree }; } } return undefined; } const PointerEventsCheck = Symbol('Last check for pointer-events'); function checkPointerEvents(instance, element) { const lastCheck = element[PointerEventsCheck]; const needsCheck = instance.config.pointerEventsCheck !== PointerEventsCheckLevel.Never && (!lastCheck || hasBitFlag(instance.config.pointerEventsCheck, PointerEventsCheckLevel.EachApiCall) && lastCheck[ApiLevel.Call] !== getLevelRef(instance, ApiLevel.Call) || hasBitFlag(instance.config.pointerEventsCheck, PointerEventsCheckLevel.EachTrigger) && lastCheck[ApiLevel.Trigger] !== getLevelRef(instance, ApiLevel.Trigger)); if (!needsCheck) { return lastCheck === null || lastCheck === undefined ? undefined : lastCheck.result; } const declaration = closestPointerEventsDeclaration(element); element[PointerEventsCheck] = { [ApiLevel.Call]: getLevelRef(instance, ApiLevel.Call), [ApiLevel.Trigger]: getLevelRef(instance, ApiLevel.Trigger), result: declaration }; return declaration; } function assertPointerEvents(instance, element) { const declaration = checkPointerEvents(instance, element); if ((declaration === null || declaration === undefined ? undefined : declaration.pointerEvents) === 'none') { throw new Error([ `Unable to perform pointer interaction as the element ${declaration.tree.length > 1 ? 'inherits' : 'has'} \`pointer-events: none\`:`, '', printTree(declaration.tree) ].join('\n')); } } function printTree(tree) { return tree.reverse().map((el, i)=>[ ''.padEnd(i), el.tagName, el.id && `#${el.id}`, el.hasAttribute('data-testid') && `(testId=${el.getAttribute('data-testid')})`, getLabelDescr(el), tree.length > 1 && i === 0 && ' <-- This element declared `pointer-events: none`', tree.length > 1 && i === tree.length - 1 && ' <-- Asserted pointer events here' ].filter(Boolean).join('')).join('\n'); } function getLabelDescr(element) { var _element_labels; let label; if (element.hasAttribute('aria-label')) { label = element.getAttribute('aria-label'); } else if (element.hasAttribute('aria-labelledby')) { var _element_ownerDocument_getElementById_textContent, _element_ownerDocument_getElementById; label = (_element_ownerDocument_getElementById = element.ownerDocument.getElementById(element.getAttribute('aria-labelledby'))) === null || _element_ownerDocument_getElementById === undefined ? undefined : (_element_ownerDocument_getElementById_textContent = _element_ownerDocument_getElementById.textContent) === null || _element_ownerDocument_getElementById_textContent === undefined ? undefined : _element_ownerDocument_getElementById_textContent.trim(); } else if (isElementType(element, [ 'button', 'input', 'meter', 'output', 'progress', 'select', 'textarea' ]) && ((_element_labels = element.labels) === null || _element_labels === undefined ? undefined : _element_labels.length)) { label = Array.from(element.labels).map((el)=>{ var _el_textContent; return (_el_textContent = el.textContent) === null || _el_textContent === undefined ? undefined : _el_textContent.trim(); }).join('|'); } else if (isElementType(element, 'button')) { var _element_textContent; label = (_element_textContent = element.textContent) === null || _element_textContent === undefined ? undefined : _element_textContent.trim(); } label = label === null || label === undefined ? undefined : label.replace(/\n/g, ' '); if (Number(label === null || label === undefined ? undefined : label.length) > 30) { label = `${label === null || label === undefined ? undefined : label.substring(0, 29)}…`; } return label ? `(label=${label})` : ''; } // With the eslint rule and prettier the bitwise operation isn't nice to read function hasBitFlag(conf, flag) { // eslint-disable-next-line no-bitwise return (conf & flag) > 0; } function _define_property$2(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } class Pointer { init(instance) { const target = this.getTarget(instance); const [, enter] = getTreeDiff(null, target); const init = this.getEventInit(); assertPointerEvents(instance, target); instance.dispatchUIEvent(target, 'pointerover', init); enter.forEach((el)=>instance.dispatchUIEvent(el, 'pointerenter', init)); return this; } move(instance, position) { const prevPosition = this.position; const prevTarget = this.getTarget(instance); this.position = position; if (!isDifferentPointerPosition(prevPosition, position)) { return; } const nextTarget = this.getTarget(instance); const init = this.getEventInit(-1); const [leave, enter] = getTreeDiff(prevTarget, nextTarget); return { leave: ()=>{ if (hasPointerEvents(instance, prevTarget)) { if (prevTarget !== nextTarget) { instance.dispatchUIEvent(prevTarget, 'pointerout', init); leave.forEach((el)=>instance.dispatchUIEvent(el, 'pointerleave', init)); } } }, enter: ()=>{ assertPointerEvents(instance, nextTarget); if (prevTarget !== nextTarget) { instance.dispatchUIEvent(nextTarget, 'pointerover', init); enter.forEach((el)=>instance.dispatchUIEvent(el, 'pointerenter', init)); } }, move: ()=>{ instance.dispatchUIEvent(nextTarget, 'pointermove', init); } }; } down(instance, button = 0) { if (this.isDown) { return; } const target = this.getTarget(instance); assertPointerEvents(instance, target); this.isDown = true; this.isPrevented = !instance.dispatchUIEvent(target, 'pointerdown', this.getEventInit(button)); } up(instance, button = 0) { if (!this.isDown) { return; } const target = this.getTarget(instance); assertPointerEvents(instance, target); this.isPrevented = false; this.isDown = false; instance.dispatchUIEvent(target, 'pointerup', this.getEventInit(button)); } release(instance) { const target = this.getTarget(instance); const [leave] = getTreeDiff(target, null); const init = this.getEventInit(); // Currently there is no PointerEventsCheckLevel that would // make this check not use the *asserted* cached value from `up`. /* istanbul ignore else */ if (hasPointerEvents(instance, target)) { instance.dispatchUIEvent(target, 'pointerout', init); leave.forEach((el)=>instance.dispatchUIEvent(el, 'pointerleave', init)); } this.isCancelled = true; } getTarget(instance) { var _this_position_target; return (_this_position_target = this.position.target) !== null && _this_position_target !== undefined ? _this_position_target : instance.config.document.body; } getEventInit(/** * The `button` that caused the event. * * This should be `-1` if the event is not caused by a button or touch/pen contact, * e.g. a moving pointer. */ button) { return { ...this.position.coords, pointerId: this.pointerId, pointerType: this.pointerType, isPrimary: this.isPrimary, button: getMouseEventButton(button), buttons: this.buttons.getButtons() }; } constructor({ pointerId, pointerType, isPrimary }, buttons){ _define_property$2(this, "pointerId", undefined); _define_property$2(this, "pointerType", undefined); _define_property$2(this, "isPrimary", undefined); _define_property$2(this, "buttons", undefined); _define_property$2(this, "isMultitouch", false); _define_property$2(this, "isCancelled", false); _define_property$2(this, "isDown", false); _define_property$2(this, "isPrevented", false); _define_property$2(this, "position", {}); this.pointerId = pointerId; this.pointerType = pointerType; this.isPrimary = isPrimary; this.isMultitouch = !isPrimary; this.buttons = buttons; } } function _define_property$1(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } class PointerHost { isKeyPressed(keyDef) { return this.devices.get(keyDef.pointerType).isPressed(keyDef); } async press(instance, keyDef, position) { this.devices.get(keyDef.pointerType).addPressed(keyDef); this.buttons.down(keyDef); const pointerName = this.getPointerName(keyDef); const pointer = keyDef.pointerType === 'touch' ? this.pointers.new(pointerName, keyDef.pointerType, this.buttons) : this.pointers.get(pointerName); // TODO: deprecate the following implicit setting of position pointer.position = position; if (pointer.pointerType !== 'touch') { this.mouse.position = position; } if (pointer.pointerType === 'touch') { pointer.init(instance); } pointer.down(instance, keyDef.button); if (pointer.pointerType !== 'touch') { this.mouse.down(instance, keyDef, pointer.isPrevented); } } async move(instance, pointerName, position) { const pointer = this.pointers.get(pointerName); // In (some?) browsers this order of events can be observed. // This interweaving of events is probably unnecessary. // While the order of mouse (or pointer) events is defined per spec, // the order in which they interweave/follow on a user interaction depends on the implementation. const pointermove = pointer.move(instance, position); const mousemove = pointer.pointerType === 'touch' ? undefined : this.mouse.move(instance, position, pointer.isPrevented); pointermove === null || pointermove === undefined ? undefined : pointermove.leave(); mousemove === null || mousemove === undefined ? undefined : mousemove.leave(); pointermove === null || pointermove === undefined ? undefined : pointermove.enter(); mousemove === null || mousemove === undefined ? undefined : mousemove.enter(); pointermove === null || pointermove === undefined ? undefined : pointermove.move(); mousemove === null || mousemove === undefined ? undefined : mousemove.move(); } async release(instance, keyDef, position) { const device = this.devices.get(keyDef.pointerType); device.removePressed(keyDef); this.buttons.up(keyDef); const pointer = this.pointers.get(this.getPointerName(keyDef)); const isPrevented = pointer.isPrevented; // TODO: deprecate the following implicit setting of position pointer.position = position; if (pointer.pointerType !== 'touch') { this.mouse.position = position; } if (device.countPressed === 0) { pointer.up(instance, keyDef.button); } if (pointer.pointerType === 'touch') { pointer.release(instance); } if (pointer.pointerType === 'touch' && !pointer.isMultitouch) { const mousemove = this.mouse.move(instance, position, isPrevented); mousemove === null || mousemove === undefined ? undefined : mousemove.leave(); mousemove === null || mousemove === undefined ? undefined : mousemove.enter(); mousemove === null || mousemove === undefined ? undefined : mousemove.move(); this.mouse.down(instance, keyDef, isPrevented); } if (!pointer.isMultitouch) { const mousemove = this.mouse.move(instance, position, isPrevented); mousemove === null || mousemove === undefined ? undefined : mousemove.leave(); mousemove === null || mousemove === undefined ? undefined : mousemove.enter(); mousemove === null || mousemove === undefined ? undefined : mousemove.move(); this.mouse.up(instance, keyDef, isPrevented); } } getPointerName(keyDef) { return keyDef.pointerType === 'touch' ? keyDef.name : keyDef.pointerType; } getPreviousPosition(pointerName) { return this.pointers.has(pointerName) ? this.pointers.get(pointerName).position : undefined; } resetClickCount() { this.mouse.resetClickCount(); } getMouseTarget(instance) { var _this_mouse_position_target; return (_this_mouse_position_target = this.mouse.position.target) !== null && _this_mouse_position_target !== undefined ? _this_mouse_position_target : instance.config.document.body; } setMousePosition(position) { this.mouse.position = position; this.pointers.get('mouse').position = position; } constructor(system){ _define_property$1(this, "system", undefined); _define_property$1(this, "mouse", undefined); _define_property$1(this, "buttons", undefined); _define_property$1(this, "devices", new class { get(k) { var _this_registry, _k; var _; return (_ = (_this_registry = this.registry)[_k = k]) !== null && _ !== undefined ? _ : _this_registry[_k] = new Device(); } constructor(){ _define_property$1(this, "registry", {}); } }()); _define_property$1(this, "pointers", new class { new(pointerName, pointerType, buttons) { const isPrimary = pointerType !== 'touch' || !Object.values(this.registry).some((p)=>p.pointerType === 'touch' && !p.isCancelled); if (!isPrimary) { Object.values(this.registry).forEach((p)=>{ if (p.pointerType === pointerType && !p.isCancelled) { p.isMultitouch = true; } }); } this.registry[pointerName] = new Pointer({ pointerId: this.nextId++, pointerType, isPrimary }, buttons); return this.registry[pointerName]; } get(pointerName) { if (!this.has(pointerName)) { throw new Error(`Trying to access pointer "${pointerName}" which does not exist.`); } return this.registry[pointerName]; } has(pointerName) { return pointerName in this.registry; } constructor(){ _define_property$1(this, "registry", {}); _define_property$1(this, "nextId", 1); } }()); this.system = system; this.buttons = new Buttons(); this.mouse = new Mouse(); this.pointers.new('mouse', 'mouse', this.buttons); } } function _define_property(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /** * @internal Do not create/alter this by yourself as this type might be subject to changes. */ class System { getUIEventModifiers() { return { altKey: this.keyboard.modifiers.Alt, ctrlKey: this.keyboard.modifiers.Control, metaKey: this.keyboard.modifiers.Meta, shiftKey: this.keyboard.modifiers.Shift, modifierAltGraph: this.keyboard.modifiers.AltGraph, modifierCapsLock: this.keyboard.modifiers.CapsLock, modifierFn: this.keyboard.modifiers.Fn, modifierFnLock: this.keyboard.modifiers.FnLock, modifierNumLock: this.keyboard.modifiers.NumLock, modifierScrollLock: this.keyboard.modifiers.ScrollLock, modifierSymbol: this.keyboard.modifiers.Symbol, modifierSymbolLock: this.keyboard.modifiers.SymbolLock }; } constructor(){ _define_property(this, "keyboard", new KeyboardHost(this)); _define_property(this, "pointer", new PointerHost(this)); } } async function click$1(element) { const pointerIn = []; if (!this.config.skipHover) { pointerIn.push({ target: element }); } pointerIn.push({ keys: '[MouseLeft]', target: element }); return this.pointer(pointerIn); } async function dblClick$1(element) { return this.pointer([ { target: element }, '[MouseLeft][MouseLeft]' ]); } async function tripleClick$1(element) { return this.pointer([ { target: element }, '[MouseLeft][MouseLeft][MouseLeft]' ]); } async function hover$1(element) { return this.pointer({ target: element }); } async function unhover$1(element) { assertPointerEvents(this, this.system.pointer.getMouseTarget(this)); return this.pointer({ target: element.ownerDocument.body }); } async function tab$1({ shift } = {}) { return this.keyboard(shift === true ? '{Shift>}{Tab}{/Shift}' : shift === false ? '[/ShiftLeft][/ShiftRight]{Tab}' : '{Tab}'); } var bracketDict = /*#__PURE__*/ function(bracketDict) { bracketDict["{"] = "}"; bracketDict["["] = "]"; return bracketDict; }(bracketDict || {}); /** * Read the next key definition from user input * * Describe key per `{descriptor}` or `[descriptor]`. * Everything else will be interpreted as a single character as descriptor - e.g. `a`. * Brackets `{` and `[` can be escaped by doubling - e.g. `foo[[bar` translates to `foo[bar`. * A previously pressed key can be released per `{/descriptor}`. * Keeping the key pressed can be written as `{descriptor>}`. * When keeping the key pressed you can choose how long the key is pressed `{descriptor>3}`. * You can then release the key per `{descriptor>3/}` or keep it pressed and continue with the next key. */ function readNextDescriptor(text, context) { let pos = 0; const startBracket = text[pos] in bracketDict ? text[pos] : ''; pos += startBracket.length; const isEscapedChar = new RegExp(`^\\${startBracket}{2}`).test(text); const type = isEscapedChar ? '' : startBracket; return { type, ...type === '' ? readPrintableChar(text, pos, context) : readTag(text, pos, type, context) }; } function readPrintableChar(text, pos, context) { const descriptor = text[pos]; assertDescriptor(descriptor, text, pos, context); pos += descriptor.length; return { consumedLength: pos, descriptor, releasePrevious: false, releaseSelf: true, repeat: 1 }; } function readTag(text, pos, startBracket, context) { var _text_slice_match, _text_slice_match1; const releasePreviousModifier = text[pos] === '/' ? '/' : ''; pos += releasePreviousModifier.length; const escapedDescriptor = startBracket === '{' && text[pos] === '\\'; pos += Number(escapedDescriptor); const descriptor = escapedDescriptor ? text[pos] : (_text_slice_match = text.slice(pos).match(startBracket === '{' ? /^\w+|^[^}>/]/ : /^\w+/)) === null || _text_slice_match === undefined ? undefined : _text_slice_match[0]; assertDescriptor(descriptor, text, pos, context); pos += descriptor.length; var _text_slice_match_; const repeatModifier = (_text_slice_match_ = (_text_slice_match1 = text.slice(pos).match(/^>\d+/)) === null || _text_slice_match1 === undefined ? undefined : _text_slice_match1[0]) !== null && _text_slice_match_ !== undefined ? _text_slice_match_ : ''; pos += repeatModifier.length; const releaseSelfModifier = text[pos] === '/' || !repeatModifier && text[pos] === '>' ? text[pos] : ''; pos += releaseSelfModifier.length; const expectedEndBracket = bracketDict[startBracket]; const endBracket = text[pos] === expectedEndBracket ? expectedEndBracket : ''; if (!endBracket) { throw new Error(getErrorMessage([ !repeatModifier && 'repeat modifier', !releaseSelfModifier && 'release modifier', `"${expectedEndBracket}"` ].filter(Boolean).join(' or '), text[pos], text, context)); } pos += endBracket.length; return { consumedLength: pos, descriptor, releasePrevious: !!releasePreviousModifier, repeat: repeatModifier ? Math.max(Number(repeatModifier.substr(1)), 1) : 1, releaseSelf: hasReleaseSelf(releaseSelfModifier, repeatModifier) }; } function assertDescriptor(descriptor, text, pos, context) { if (!descriptor) { throw new Error(getErrorMessage('key descriptor', text[pos], text, context)); } } function hasReleaseSelf(releaseSelfModifier, repeatModifier) { if (releaseSelfModifier) { return releaseSelfModifier === '/'; } if (repeatModifier) { return false; } } function getErrorMessage(expected, found, text, context) { return `Expected ${expected} but found "${found !== null && found !== undefined ? found : ''}" in "${text}" See ${context === 'pointer' ? `https://testing-library.com/docs/user-event/pointer#pressing-a-button-or-touching-the-screen` : `https://testing-library.com/docs/user-event/keyboard`} for more information about how userEvent parses your input.`; } /** * Parse key definitions per `keyboardMap` * * Keys can be referenced by `{key}` or `{special}` as well as physical locations per `[code]`. * Everything else will be interpreted as a typed character - e.g. `a`. * Brackets `{` and `[` can be escaped by doubling - e.g. `foo[[bar` translates to `foo[bar`. * Keeping the key pressed can be written as `{key>}`. * When keeping the key pressed you can choose how long (how many keydown and keypress) the key is pressed `{key>3}`. * You can then release the key per `{key>3/}` or keep it pressed and continue with the next key. */ function parseKeyDef$1(keyboardMap, text) { const defs = []; do { const { type, descriptor, consumedLength, releasePrevious, releaseSelf = true, repeat } = readNextDescriptor(text, 'keyboard'); var _keyboardMap_find; const keyDef = (_keyboardMap_find = keyboardMap.find((def)=>{ if (type === '[') { var _def_code; return ((_def_code = def.code) === null || _def_code === undefined ? undefined : _def_code.toLowerCase()) === descriptor.toLowerCase(); } else if (type === '{') { var _def_key; return ((_def_key = def.key) === null || _def_key === undefined ? undefined : _def_key.toLowerCase()) === descriptor.toLowerCase(); } return def.key === descriptor; })) !== null && _keyboardMap_find !== undefined ? _keyboardMap_find : { key: 'Unknown', code: 'Unknown', [type === '[' ? 'code' : 'key']: descriptor }; defs.push({ keyDef, releasePrevious, releaseSelf, repeat }); text = text.slice(consumedLength); }while (text) return defs; } async function keyboard$1(text) { const actions = parseKeyDef$1(this.config.keyboardMap, text); for(let i = 0; i < actions.length; i++){ await wait(this.config); await keyboardAction(this, actions[i]); } } async function keyboardAction(instance, { keyDef, releasePrevious, releaseSelf, repeat }) { const { system } = instance; // Release the key automatically if it was pressed before. if (system.keyboard.isKeyPressed(keyDef)) { await system.keyboard.keyup(instance, keyDef); } if (!releasePrevious) { for(let i = 1; i <= repeat; i++){ await system.keyboard.keydown(instance, keyDef); if (i < repeat) { await wait(instance.config); } } // Release the key only on the last iteration on `state.repeatKey`. if (releaseSelf) { await system.keyboard.keyup(instance, keyDef); } } } async function releaseAllKeys(instance) { for (const k of instance.system.keyboard.getPressedKeys()){ await instance.system.keyboard.keyup(instance, k); } } function copySelection(target) { const data = hasOwnSelection(target) ? { 'text/plain': readSelectedValueFromInput(target) } : { 'text/plain': String(target.ownerDocument.getSelection()) }; const dt = createDataTransfer(getWindow(target)); for(const type in data){ if (data[type]) { dt.setData(type, data[type]); } } return dt; } function readSelectedValueFromInput(target) { const sel = getUISelection(target); const val = getUIValue(target); return val.substring(sel.startOffset, sel.endOffset); } async function copy$1() { const doc = this.config.document; var _doc_activeElement; const target = (_doc_activeElement = doc.activeElement) !== null && _doc_activeElement !== undefined ? _doc_activeElement : /* istanbul ignore next */ doc.body; const clipboardData = copySelection(target); if (clipboardData.items.length === 0) { return; } if (this.dispatchUIEvent(target, 'copy', { clipboardData }) && this.config.writeToClipboard) { await writeDataTransferToClipboard(doc, clipboardData); } return clipboardData; } async function cut$1() { const doc = this.config.document; var _doc_activeElement; const target = (_doc_activeElement = doc.activeElement) !== null && _doc_activeElement !== undefined ? _doc_activeElement : /* istanbul ignore next */ doc.body; const clipboardData = copySelection(target); if (clipboardData.items.length === 0) { return; } if (this.dispatchUIEvent(target, 'cut', { clipboardData }) && this.config.writeToClipboard) { await writeDataTransferToClipboard(target.ownerDocument, clipboardData); } return clipboardData; } async function paste$1(clipboardData) { const doc = this.config.document; var _doc_activeElement; const target = (_doc_activeElement = doc.activeElement) !== null && _doc_activeElement !== undefined ? _doc_activeElement : /* istanbul ignore next */ doc.body; var _ref; const dataTransfer = (_ref = typeof clipboardData === 'string' ? getClipboardDataFromString(doc, clipboardData) : clipboardData) !== null && _ref !== undefined ? _ref : await readDataTransferFromClipboard(doc).catch(()=>{ throw new Error('`userEvent.paste()` without `clipboardData` requires the `ClipboardAPI` to be available.'); }); this.dispatchUIEvent(target, 'paste', { clipboardData: dataTransfer }); } function getClipboardDataFromString(doc, text) { const dt = createDataTransfer(getWindow(doc)); dt.setData('text', text); return dt; } function parseKeyDef(pointerMap, keys) { const defs = []; do { const { descriptor, consumedLength, releasePrevious, releaseSelf = true } = readNextDescriptor(keys, 'pointer'); const keyDef = pointerMap.find((p)=>p.name === descriptor); if (keyDef) { defs.push({ keyDef, releasePrevious, releaseSelf }); } keys = keys.slice(consumedLength); }while (keys) return defs; } async function pointer$1(input) { const { pointerMap } = this.config; const actions = []; (Array.isArray(input) ? input : [ input ]).forEach((actionInput)=>{ if (typeof actionInput === 'string') { actions.push(...parseKeyDef(pointerMap, actionInput)); } else if ('keys' in actionInput) { actions.push(...parseKeyDef(pointerMap, actionInput.keys).map((i)=>({ ...actionInput, ...i }))); } else { actions.push(actionInput); } }); for(let i = 0; i < actions.length; i++){ await wait(this.config); await pointerAction(this, actions[i]); } this.system.pointer.resetClickCount(); } async function pointerAction(instance, action) { var _previousPosition_caret, _previousPosition_caret1; const pointerName = 'pointerName' in action && action.pointerName ? action.pointerName : 'keyDef' in action ? instance.system.pointer.getPointerName(action.keyDef) : 'mouse'; const previousPosition = instance.system.pointer.getPreviousPosition(pointerName); var _action_target, _action_coords, _action_node, _action_offset; const position = { target: (_action_target = action.target) !== null && _action_target !== undefined ? _action_target : getPrevTarget(instance, previousPosition), coords: (_action_coords = action.coords) !== null && _action_coords !== undefined ? _action_coords : previousPosition === null || previousPosition === undefined ? undefined : previousPosition.coords, caret: { node: (_action_node = action.node) !== null && _action_node !== undefined ? _action_node : hasCaretPosition(action) ? undefined : previousPosition === null || previousPosition === undefined ? undefined : (_previousPosition_caret = previousPosition.caret) === null || _previousPosition_caret === undefined ? undefined : _previousPosition_caret.node, offset: (_action_offset = action.offset) !== null && _action_offset !== undefined ? _action_offset : hasCaretPosition(action) ? undefined : previousPosition === null || previousPosition === undefined ? undefined : (_previousPosition_caret1 = previousPosition.caret) === null || _previousPosition_caret1 === undefined ? undefined : _previousPosition_caret1.offset } }; if ('keyDef' in action) { if (instance.system.pointer.isKeyPressed(action.keyDef)) { setLevelRef(instance, ApiLevel.Trigger); await instance.system.pointer.release(instance, action.keyDef, position); } if (!action.releasePrevious) { setLevelRef(instance, ApiLevel.Trigger); await instance.system.pointer.press(instance, action.keyDef, position); if (action.releaseSelf) { setLevelRef(instance, ApiLevel.Trigger); await instance.system.pointer.release(instance, action.keyDef, position); } } } else { setLevelRef(instance, ApiLevel.Trigger); await instance.system.pointer.move(instance, pointerName, position); } } function hasCaretPosition(action) { var _action_target, _ref; return !!((_ref = (_action_target = action.target) !== null && _action_target !== undefined ? _action_target : action.node) !== null && _ref !== undefined ? _ref : action.offset !== undefined); } function getPrevTarget(instance, position) { if (!position) { throw new Error('This pointer has no previous position. Provide a target property!'); } var _position_target; return (_position_target = position.target) !== null && _position_target !== undefined ? _position_target : instance.config.document.body; } async function clear$1(element) { if (!isEditable(element) || isDisabled(element)) { throw new Error('clear()` is only supported on editable elements.'); } focusElement(element); if (element.ownerDocument.activeElement !== element) { throw new Error('The element to be cleared could not be focused.'); } selectAll(element); if (!isAllSelected(element)) { throw new Error('The element content to be cleared could not be selected.'); } input(this, element, '', 'deleteContentBackward'); } async function selectOptions$1(select, values) { return selectOptionsBase.call(this, true, select, values); } async function deselectOptions$1(select, values) { return selectOptionsBase.call(this, false, select, values); } async function selectOptionsBase(newValue, select, values) { if (!newValue && !select.multiple) { throw getConfig().getElementError(`Unable to deselect an option in a non-multiple select. Use selectOptions to change the selection instead.`, select); } const valArray = Array.isArray(values) ? values : [ values ]; const allOptions = Array.from(select.querySelectorAll('option, [role="option"]')); const selectedOptions = valArray.map((val)=>{ if (typeof val !== 'string' && allOptions.includes(val)) { return val; } else { const matchingOption = allOptions.find((o)=>o.value === val || o.innerHTML === val); if (matchingOption) { return matchingOption; } else { throw getConfig().getElementError(`Value "${String(val)}" not found in options`, select); } } }).filter((option)=>!isDisabled(option)); if (isDisabled(select) || !selectedOptions.length) return; const selectOption = (option)=>{ option.selected = newValue; this.dispatchUIEvent(select, 'input', { bubbles: true, cancelable: false, composed: true }); this.dispatchUIEvent(select, 'change'); }; if (isElementType(select, 'select')) { if (select.multiple) { for (const option of selectedOptions){ const withPointerEvents = this.config.pointerEventsCheck === 0 ? true : hasPointerEvents(this, option); // events fired for multiple select are weird. Can't use hover... if (withPointerEvents) { this.dispatchUIEvent(option, 'pointerover'); this.dispatchUIEvent(select, 'pointerenter'); this.dispatchUIEvent(option, 'mouseover'); this.dispatchUIEvent(select, 'mouseenter'); this.dispatchUIEvent(option, 'pointermove'); this.dispatchUIEvent(option, 'mousemove'); this.dispatchUIEvent(option, 'pointerdown'); this.dispatchUIEvent(option, 'mousedown'); } focusElement(select); if (withPointerEvents) { this.dispatchUIEvent(option, 'pointerup'); this.dispatchUIEvent(option, 'mouseup'); } selectOption(option); if (withPointerEvents) { this.dispatchUIEvent(option, 'click'); } await wait(this.config); } } else if (selectedOptions.length === 1) { const withPointerEvents = this.config.pointerEventsCheck === 0 ? true : hasPointerEvents(this, select); // the click to open the select options if (withPointerEvents) { await this.click(select); } else { focusElement(select); } selectOption(selectedOptions[0]); if (withPointerEvents) { // the browser triggers another click event on the select for the click on the option // this second click has no 'down' phase this.dispatchUIEvent(select, 'pointerover'); this.dispatchUIEvent(select, 'pointerenter'); this.dispatchUIEvent(select, 'mouseover'); this.dispatchUIEvent(select, 'mouseenter'); this.dispatchUIEvent(select, 'pointerup'); this.dispatchUIEvent(select, 'mouseup'); this.dispatchUIEvent(select, 'click'); } await wait(this.config); } else { throw getConfig().getElementError(`Cannot select multiple options on a non-multiple select`, select); } } else if (select.getAttribute('role') === 'listbox') { for (const option of selectedOptions){ await this.click(option); await this.unhover(option); } } else { throw getConfig().getElementError(`Cannot select options on elements that are neither select nor listbox elements`, select); } } async function type$1(element, text, { skipClick = this.config.skipClick, skipAutoClose = this.config.skipAutoClose, initialSelectionStart, initialSelectionEnd } = {}) { // TODO: properly type guard // we use this workaround for now to prevent changing behavior if (element.disabled) return; if (!skipClick) { await this.click(element); } if (initialSelectionStart !== undefined) { setSelectionRange(element, initialSelectionStart, initialSelectionEnd !== null && initialSelectionEnd !== undefined ? initialSelectionEnd : initialSelectionStart); } await this.keyboard(text); if (!skipAutoClose) { await releaseAllKeys(this); } } // It is not possible to create a real FileList programmatically. // Therefore assigning `files` property with a programmatically created FileList results in an error. // Just assigning the property (as per fireEvent) breaks the interweaving with the `value` property. const fakeFiles = Symbol('files and value properties are mocked'); function restoreProperty(obj, prop, descriptor) { if (descriptor) { Object.defineProperty(obj, prop, descriptor); } else { // eslint-disable-next-line @typescript-eslint/no-dynamic-delete delete obj[prop]; } } function setFiles(el, files) { var _el_fakeFiles; (_el_fakeFiles = el[fakeFiles]) === null || _el_fakeFiles === undefined ? undefined : _el_fakeFiles.restore(); const typeDescr = Object.getOwnPropertyDescriptor(el, 'type'); const valueDescr = Object.getOwnPropertyDescriptor(el, 'value'); const filesDescr = Object.getOwnPropertyDescriptor(el, 'files'); function restore() { restoreProperty(el, 'type', typeDescr); restoreProperty(el, 'value', valueDescr); restoreProperty(el, 'files', filesDescr); } el[fakeFiles] = { restore }; Object.defineProperties(el, { files: { configurable: true, get: ()=>files }, value: { configurable: true, get: ()=>files.length ? `C:\\fakepath\\${files[0].name}` : '', set (v) { if (v === '') { restore(); } else { var _valueDescr_set; valueDescr === null || valueDescr === undefined ? undefined : (_valueDescr_set = valueDescr.set) === null || _valueDescr_set === undefined ? undefined : _valueDescr_set.call(el, v); } } }, type: { configurable: true, get: ()=>'file', set (v) { if (v !== 'file') { restore(); el.type = v; } } } }); } async function upload$1(element, fileOrFiles) { const input = isElementType(element, 'label') ? element.control : element; if (!input || !isElementType(input, 'input', { type: 'file' })) { throw new TypeError(`The ${input === element ? 'given' : 'associated'} ${input === null || input === undefined ? undefined : input.tagName} element does not accept file uploads`); } if (isDisabled(element)) return; const files = (Array.isArray(fileOrFiles) ? fileOrFiles : [ fileOrFiles ]).filter((file)=>!this.config.applyAccept || isAcceptableFile(file, input.accept)).slice(0, input.multiple ? undefined : 1); const fileDialog = ()=>{ var _input_files; // do not fire an input event if the file selection does not change if (files.length === ((_input_files = input.files) === null || _input_files === undefined ? undefined : _input_files.length) && files.every((f, i)=>{ var _input_files; return f === ((_input_files = input.files) === null || _input_files === undefined ? undefined : _input_files.item(i)); })) { return; } setFiles(input, createFileList(getWindow(element), files)); this.dispatchUIEvent(input, 'input'); this.dispatchUIEvent(input, 'change'); }; input.addEventListener('fileDialog', fileDialog); await this.click(element); input.removeEventListener('fileDialog', fileDialog); } // When matching files, browsers ignore case and consider jpeg/jpg interchangeable. function normalize(nameOrType) { return nameOrType.toLowerCase().replace(/(\.|\/)jpg\b/g, '$1jpeg'); } function isAcceptableFile(file, accept) { if (!accept) { return true; } const wildcards = [ 'audio/*', 'image/*', 'video/*' ]; return normalize(accept).trim().split(/\s*,\s*/).some((acceptToken)=>{ // tokens starting with a dot represent a file extension if (acceptToken.startsWith('.')) { return normalize(file.name).endsWith(acceptToken); } else if (wildcards.includes(acceptToken)) { return normalize(file.type).startsWith(acceptToken.replace('*', '')); } return normalize(file.type) === acceptToken; }); } const userEventApi = { click: click$1, dblClick: dblClick$1, tripleClick: tripleClick$1, hover: hover$1, unhover: unhover$1, tab: tab$1, keyboard: keyboard$1, copy: copy$1, cut: cut$1, paste: paste$1, pointer: pointer$1, clear: clear$1, deselectOptions: deselectOptions$1, selectOptions: selectOptions$1, type: type$1, upload: upload$1 }; /** * Wrap an internal Promise */ function wrapAsync(implementation) { return getConfig().asyncWrapper(implementation); } /** * Default options applied when API is called per `userEvent.anyApi()` */ const defaultOptionsDirect = { applyAccept: true, autoModify: true, delay: 0, document: globalThis.document, keyboardMap: defaultKeyMap$1, pointerMap: defaultKeyMap, pointerEventsCheck: PointerEventsCheckLevel.EachApiCall, skipAutoClose: false, skipClick: false, skipHover: false, writeToClipboard: false, advanceTimers: ()=>Promise.resolve() }; /** * Default options applied when API is called per `userEvent().anyApi()` */ const defaultOptionsSetup = { ...defaultOptionsDirect, writeToClipboard: true }; function createConfig(options = {}, defaults = defaultOptionsSetup, node) { const document = getDocument(options, node, defaults); return { ...defaults, ...options, document }; } /** * Start a "session" with userEvent. * All APIs returned by this function share an input device state and a default configuration. */ function setupMain(options = {}) { const config = createConfig(options); prepareDocument(config.document); patchFocus(getWindow(config.document).HTMLElement); var _config_document_defaultView; const view = (_config_document_defaultView = config.document.defaultView) !== null && _config_document_defaultView !== undefined ? _config_document_defaultView : /* istanbul ignore next */ globalThis.window; attachClipboardStubToView(view); return createInstance(config).api; } /** * Setup in direct call per `userEvent.anyApi()` */ function setupDirect({ keyboardState, pointerState, ...options } = {}, node) { const config = createConfig(options, defaultOptionsDirect, node); prepareDocument(config.document); patchFocus(getWindow(config.document).HTMLElement); var _ref; const system = (_ref = pointerState !== null && pointerState !== undefined ? pointerState : keyboardState) !== null && _ref !== undefined ? _ref : new System(); return { api: createInstance(config, system).api, system }; } /** * Create a set of callbacks with different default settings but the same state. */ function setupSub(options) { return createInstance({ ...this.config, ...options }, this.system).api; } function wrapAndBindImpl(instance, impl) { function method(...args) { setLevelRef(instance, ApiLevel.Call); return wrapAsync(()=>impl.apply(instance, args).then(async (ret)=>{ await wait(instance.config); return ret; })); } Object.defineProperty(method, 'name', { get: ()=>impl.name }); return method; } function createInstance(config, system = new System()) { const instance = {}; Object.assign(instance, { config, dispatchEvent: dispatchEvent.bind(instance), dispatchUIEvent: dispatchUIEvent.bind(instance), system, levelRefs: {}, ...userEventApi }); return { instance, api: { ...Object.fromEntries(Object.entries(userEventApi).map(([name, api])=>[ name, wrapAndBindImpl(instance, api) ])), setup: setupSub.bind(instance) } }; } function getDocument(options, node, defaults) { var _options_document, _ref; return (_ref = (_options_document = options.document) !== null && _options_document !== undefined ? _options_document : node && getDocumentFromNode(node)) !== null && _ref !== undefined ? _ref : defaults.document; } function clear(element) { return setupDirect().api.clear(element); } function click(element, options = {}) { return setupDirect(options, element).api.click(element); } function copy(options = {}) { return setupDirect(options).api.copy(); } function cut(options = {}) { return setupDirect(options).api.cut(); } function dblClick(element, options = {}) { return setupDirect(options).api.dblClick(element); } function deselectOptions(select, values, options = {}) { return setupDirect(options).api.deselectOptions(select, values); } function hover(element, options = {}) { return setupDirect(options).api.hover(element); } async function keyboard(text, options = {}) { const { api, system } = setupDirect(options); return api.keyboard(text).then(()=>system); } async function pointer(input, options = {}) { const { api, system } = setupDirect(options); return api.pointer(input).then(()=>system); } function paste(clipboardData, options) { return setupDirect(options).api.paste(clipboardData); } function selectOptions(select, values, options = {}) { return setupDirect(options).api.selectOptions(select, values); } function tripleClick(element, options = {}) { return setupDirect(options).api.tripleClick(element); } function type(element, text, options = {}) { return setupDirect(options, element).api.type(element, text, options); } function unhover(element, options = {}) { const { api, system } = setupDirect(options); system.pointer.setMousePosition({ target: element }); return api.unhover(element); } function upload(element, fileOrFiles, options = {}) { return setupDirect(options).api.upload(element, fileOrFiles); } function tab(options = {}) { return setupDirect().api.tab(options); } const directApi = /*#__PURE__*/Object.freeze(/*#__PURE__*/Object.defineProperty({ __proto__: null, clear, click, copy, cut, dblClick, deselectOptions, hover, keyboard, paste, pointer, selectOptions, tab, tripleClick, type, unhover, upload }, Symbol.toStringTag, { value: 'Module' })); const userEvent = { ...directApi, setup: setupMain }; /** * 主观题回答工具类 * 使用 OpenAI 兼容的 API 进行流式回答 */ const DEFAULT_BASE_URL = 'https://api.siliconflow.cn/v1'; const DEFAULT_MODEL_NAME = 'THUDM/GLM-4.1V-9B-Thinking'; const DEFAULT_SYSTEM_PROMPT = '你是一个专业全能的助手。请清晰、准确地回答问题,提供简明而准确的信息。使用正式、专业的语气。在适当情况下解释你的推理或提供背景信息,但避免不必要的冗长。始终确保答案可靠、易于理解。'; /** * 获取主观题回答配置 * @returns {Promise<object>} 配置对象 */ async function getSubjectiveAnswerConfig() { const apiKey = await getStorageValue$1('beelineHelper_aiToken', '') || ''; const baseUrl = await getStorageValue$1('beelineHelper_baseUrl', '') || DEFAULT_BASE_URL; const modelName = await getStorageValue$1('beelineHelper_modelName', '') || DEFAULT_MODEL_NAME; const systemPrompt = await getStorageValue$1('beelineHelper_systemPrompt', '') || DEFAULT_SYSTEM_PROMPT; return { apiKey, baseUrl, modelName, systemPrompt }; } /** * 流式回答主观题 * @param {string} question 题目内容 * @param {function} onChunk 流式输出回调函数 * @param {function} onComplete 完成回调函数 * @returns {Promise<object>} 回答结果 */ async function streamAnswerSubjectiveQuestion(question, onChunk = null, onComplete = null) { const config = await getSubjectiveAnswerConfig(); if (!config.apiKey) { throw new Error('请先在答题设置中设置 AI Token'); } if (!question.trim()) { throw new Error('题目内容为空'); } // 验证 BASE_URL if (!config.baseUrl || typeof config.baseUrl !== 'string') { throw new Error('BASE_URL 配置无效,请在答题设置中检查 BASE_URL 设置'); } // 清理 BASE_URL,移除末尾的斜杠 const cleanBaseUrl = config.baseUrl.replace(/\/$/, ''); // 提前查找并检查输入框 const textarea = await findTextarea(); if (textarea) { // 检查输入框是否已有内容,如果有内容则跳过自动答题 if (hasExistingContent(textarea)) { console.log('输入框已有内容,跳过自动答题'); return { success: false, message: '输入框已有内容,跳过自动答题', question: question, aiAssisted: true }; } } try { const requestUrl = `${cleanBaseUrl}/chat/completions`; console.log('主观题 API 请求 URL:', requestUrl); console.log('API Key 存在:', !!config.apiKey); console.log('模型名称:', config.modelName); const response = await fetch(requestUrl, { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${config.apiKey}` }, body: JSON.stringify({ model: config.modelName, messages: [ { role: 'system', content: config.systemPrompt }, { role: 'user', content: question } ], stream: true, temperature: 0.7, max_tokens: 2000 }) }); if (!response.ok) { console.error('API 响应状态:', response.status, response.statusText); const errorData = await response.json().catch(() => ({})); console.error('API 错误数据:', errorData); throw new Error(`API 请求失败: ${response.status} - ${errorData.error?.message || response.statusText}`); } const reader = response.body.getReader(); const decoder = new TextDecoder(); let fullAnswer = ''; // 清空输入框并聚焦 if (textarea) { await clearAndFocusTextarea(textarea); } while (true) { const { done, value } = await reader.read(); if (done) { break; } const chunk = decoder.decode(value, { stream: true }); const lines = chunk.split('\n').filter(line => line.trim()); for (const line of lines) { if (line.startsWith('data: ')) { const data = line.slice(6); if (data === '[DONE]') { break; } try { const parsed = JSON.parse(data); const content = parsed.choices?.[0]?.delta?.content; if (content) { fullAnswer += content; // 实时将内容输入到输入框 if (textarea) { await appendToTextarea(textarea, content); } // 调用流式输出回调 if (onChunk && typeof onChunk === 'function') { onChunk(content, fullAnswer); } } } catch (e) { console.warn('解析流式数据失败:', e); } } } } // 调用完成回调 if (onComplete && typeof onComplete === 'function') { onComplete(fullAnswer); } return { success: true, answer: fullAnswer, question: question, aiAssisted: true }; } catch (error) { console.error('主观题回答失败:', error); return { success: false, message: `回答失败: ${error.message}`, question: question, aiAssisted: true }; } } /** * 查找输入框 * @returns {Promise<HTMLElement|null>} 输入框元素 */ async function findTextarea() { // 查找主观题输入框 - 尝试多种选择器 let textarea = document.querySelector("[id^='w-e-textarea-']"); if (!textarea) { // 尝试其他可能的选择器 textarea = document.querySelector('.w-e-textarea'); } if (!textarea) { // 尝试查找富文本编辑器的内容区域 textarea = document.querySelector('.w-e-text'); } if (!textarea) { // 尝试查找任何包含contenteditable属性的元素 textarea = document.querySelector('[contenteditable="true"]'); } if (textarea) { console.log('找到输入框:', textarea); console.log('输入框类型:', textarea.tagName); console.log('输入框属性:', { id: textarea.id, className: textarea.className, contenteditable: textarea.getAttribute('contenteditable') }); } return textarea; } /** * 检查输入框是否已有内容 * @param {HTMLElement} textarea 输入框元素 * @returns {boolean} 是否已有内容 */ function hasExistingContent(textarea) { if (textarea.tagName === 'TEXTAREA') { return textarea.value.trim().length > 0; } else { return textarea.textContent.trim().length > 0; } } /** * 清空输入框并聚焦 * @param {HTMLElement} textarea 输入框元素 */ async function clearAndFocusTextarea(textarea) { try { const user = userEvent.setup(); // 聚焦到输入框 await user.click(textarea); // 清空现有内容 await user.clear(textarea); console.log('输入框已清空并聚焦'); } catch (error) { console.warn('user-event清空输入框失败,使用备用方法:', error); // 备用方法 textarea.focus(); if (textarea.tagName === 'TEXTAREA') { textarea.value = ''; } else { textarea.textContent = ''; } } } /** * 向输入框追加内容 * @param {HTMLElement} textarea 输入框元素 * @param {string} content 要追加的内容 */ async function appendToTextarea(textarea, content) { try { const user = userEvent.setup(); // 使用user-event输入内容 await user.type(textarea, content, { delay: 0 }); console.log('实时输入内容:', content); } catch (error) { console.warn('user-event实时输入失败,使用备用方法:', error); // 备用方法 if (textarea.tagName === 'TEXTAREA') { textarea.value += content; // 触发输入事件 const inputEvent = new Event('input', { bubbles: true }); textarea.dispatchEvent(inputEvent); } else { // 对于contenteditable元素,使用execCommand try { document.execCommand('insertText', false, content); } catch (e) { // 如果execCommand失败,直接追加 textarea.textContent += content; } } } } /** * 检查主观题回答配置是否完整 * @returns {Promise<object>} 检查结果 */ async function checkSubjectiveAnswerConfig() { const config = await getSubjectiveAnswerConfig(); if (!config.apiKey) { return { valid: false, message: '请先在答题设置中设置 AI Token' }; } // 验证 BASE_URL if (!config.baseUrl || typeof config.baseUrl !== 'string') { return { valid: false, message: 'BASE_URL 配置无效,请在答题设置中检查 BASE_URL 设置' }; } return { valid: true, message: '配置完整' }; } }) }; })); System.import("./__entry.js", "./");