您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Pixiv | Danbooru | Rule34 | Yande. 一键下载各页面原图。批量下载画师作品,按作品标签下载。转换动图格式:Gif | Apng | Webp | Webm | MP4。自定义图片文件名,保存路径。保留 / 导出下载历史。
当前为
// ==UserScript== // @name Pixiv Downloader // @namespace https://greasyfork.org/zh-CN/scripts/432150 // @version 1.3.1 // @author ruaruarua // @description Pixiv | Danbooru | Rule34 | Yande. 一键下载各页面原图。批量下载画师作品,按作品标签下载。转换动图格式:Gif | Apng | Webp | Webm | MP4。自定义图片文件名,保存路径。保留 / 导出下载历史。 // @description:zh-TW Pixiv | Danbooru | Rule34 | Yande. 一鍵下載各頁面原圖。批次下載畫師作品,按作品標籤下載。轉換動圖格式:Gif | Apng | Webp | Webm | MP4。自定義圖片檔名,儲存路徑。保留 / 匯出下載歷史。 // @description:en Pixiv | Danbooru | Rule34 | Yande. Download artworks with one click. Batch download artworks or download by tags. Convert ugoira formats: Gif | Apng | Webp | Webm | MP4. Customize image file name, save path. Save / export download history. // @license MIT // @icon https://www.pixiv.net/favicon.ico // @supportURL https://github.com/drunkg00se/Pixiv-Downloader/issues // @match https://www.pixiv.net/* // @match https://rule34.xxx/* // @match https://danbooru.donmai.us/* // @match https://yande.re/* // @match https://booru.allthefallen.moe/* // @require https://unpkg.com/[email protected]/dist/dexie.min.js // @require https://unpkg.com/[email protected]/dist/jszip.min.js // @require https://unpkg.com/[email protected]/dist/gif.js // @require https://unpkg.com/[email protected]/dayjs.min.js // @resource ../wasm/toWebpWorker?raw https://update.greasyfork.org/scripts/500281/1409041/libwebp_wasm.js // @resource gif.js/dist/gif.worker?raw https://unpkg.com/[email protected]/dist/gif.worker.js // @resource pako/dist/pako.js?raw https://unpkg.com/[email protected]/dist/pako.min.js // @resource upng-js?raw https://unpkg.com/[email protected]/UPNG.js // @connect i.pximg.net // @connect source.pixiv.net // @connect rule34.xxx // @connect donmai.us // @connect yande.re // @connect allthefallen.moe // @grant GM_download // @grant GM_getResourceText // @grant GM_info // @grant GM_registerMenuCommand // @grant GM_xmlhttpRequest // @grant unsafeWindow // @noframes // ==/UserScript== (t=>{const r=new CSSStyleSheet;r.replaceSync(t),window._pdlShadowStyle=r})(` .anim-indeterminate.svelte-12wvf64{transform-origin:0% 50%;animation:svelte-12wvf64-anim-indeterminate 2s infinite linear}@keyframes svelte-12wvf64-anim-indeterminate{0%{transform:translate(0) scaleX(0)}40%{transform:translate(0) scaleX(.4)}to{transform:translate(100%) scaleX(.5)}}*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}:host [data-theme=skeleton],:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}:host [data-theme=skeleton]{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h3{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}dl,dd,h1,h3,hr,figure,p{margin:0}fieldset{margin:0;padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]{display:none}[type=text],input:where(:not([type])),[type=email],[type=url],[type=password],[type=number],[type=date],[type=datetime-local],[type=month],[type=search],[type=tel],[type=time],[type=week],[multiple],textarea,select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;border-color:#6b7280;border-width:1px;border-radius:0;padding:8px 12px;font-size:16px;line-height:24px;--tw-shadow: 0 0 #0000}[type=text]:focus,input:where(:not([type])):focus,[type=email]:focus,[type=url]:focus,[type=password]:focus,[type=number]:focus,[type=date]:focus,[type=datetime-local]:focus,[type=month]:focus,[type=search]:focus,[type=tel]:focus,[type=time]:focus,[type=week]:focus,[multiple]:focus,textarea:focus,select:focus{outline:2px solid transparent;outline-offset:2px;--tw-ring-inset: var(--tw-empty, );--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: #2563eb;--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);border-color:#2563eb}input::-moz-placeholder,textarea::-moz-placeholder{color:#6b7280;opacity:1}input::placeholder,textarea::placeholder{color:#6b7280;opacity:1}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-date-and-time-value{min-height:1.5em;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit,::-webkit-datetime-edit-year-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute-field,::-webkit-datetime-edit-second-field,::-webkit-datetime-edit-millisecond-field,::-webkit-datetime-edit-meridiem-field{padding-top:0;padding-bottom:0}select{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/%3e%3c/svg%3e");background-position:right 8px center;background-repeat:no-repeat;background-size:1.5em 1.5em;padding-right:40px;-webkit-print-color-adjust:exact;print-color-adjust:exact}[multiple],[size]:where(select:not([size="1"])){background-image:initial;background-position:initial;background-repeat:unset;background-size:initial;padding-right:12px;-webkit-print-color-adjust:unset;print-color-adjust:unset}[type=checkbox],[type=radio]{-webkit-appearance:none;-moz-appearance:none;appearance:none;padding:0;-webkit-print-color-adjust:exact;print-color-adjust:exact;display:inline-block;vertical-align:middle;background-origin:border-box;-webkit-user-select:none;-moz-user-select:none;user-select:none;flex-shrink:0;height:16px;width:16px;color:#2563eb;background-color:#fff;border-color:#6b7280;border-width:1px;--tw-shadow: 0 0 #0000}[type=checkbox]{border-radius:0}[type=radio]{border-radius:100%}[type=checkbox]:focus,[type=radio]:focus{outline:2px solid transparent;outline-offset:2px;--tw-ring-inset: var(--tw-empty, );--tw-ring-offset-width: 2px;--tw-ring-offset-color: #fff;--tw-ring-color: #2563eb;--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}[type=checkbox]:checked,[type=radio]:checked{border-color:transparent;background-color:currentColor;background-size:100% 100%;background-position:center;background-repeat:no-repeat}[type=checkbox]:checked{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M12.207 4.793a1 1 0 010 1.414l-5 5a1 1 0 01-1.414 0l-2-2a1 1 0 011.414-1.414L6.5 9.086l4.293-4.293a1 1 0 011.414 0z'/%3e%3c/svg%3e")}@media (forced-colors: active){[type=checkbox]:checked{-webkit-appearance:auto;-moz-appearance:auto;appearance:auto}}[type=radio]:checked{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3ccircle cx='8' cy='8' r='3'/%3e%3c/svg%3e")}@media (forced-colors: active){[type=radio]:checked{-webkit-appearance:auto;-moz-appearance:auto;appearance:auto}}[type=checkbox]:checked:hover,[type=checkbox]:checked:focus,[type=radio]:checked:hover,[type=radio]:checked:focus{border-color:transparent;background-color:currentColor}[type=checkbox]:indeterminate{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 16'%3e%3cpath stroke='white' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8h8'/%3e%3c/svg%3e");border-color:transparent;background-color:currentColor;background-size:100% 100%;background-position:center;background-repeat:no-repeat}@media (forced-colors: active){[type=checkbox]:indeterminate{-webkit-appearance:auto;-moz-appearance:auto;appearance:auto}}[type=checkbox]:indeterminate:hover,[type=checkbox]:indeterminate:focus{border-color:transparent;background-color:currentColor}[type=file]{background:unset;border-color:inherit;border-width:0;border-radius:0;padding:0;font-size:unset;line-height:inherit}[type=file]:focus{outline:1px solid ButtonText;outline:1px auto -webkit-focus-ring-color}:host [data-theme=skeleton]{background-color:rgb(var(--color-surface-50));font-size:16px;line-height:24px;font-family:var(--theme-font-family-base);color:rgba(var(--theme-font-color-base))}:host .dark [data-theme=skeleton]{background-color:rgb(var(--color-surface-900));color:rgba(var(--theme-font-color-dark))}::-moz-selection{background-color:rgb(var(--color-primary-500) / .3)}::selection{background-color:rgb(var(--color-primary-500) / .3)}:host [data-theme=skeleton]{-webkit-tap-highlight-color:rgba(128,128,128,.5);scrollbar-color:rgba(0,0,0,.2) rgba(255,255,255,.05)}:host [data-theme=skeleton]{scrollbar-color:rgba(128,128,128,.5) rgba(0,0,0,.1);scrollbar-width:thin}:host.dark{scrollbar-color:rgba(255,255,255,.1) rgba(0,0,0,.05)}hr:not(.divider){display:block;border-top-width:1px;border-style:solid;border-color:rgb(var(--color-surface-300))}.dark hr:not(.divider){border-color:rgb(var(--color-surface-600))}fieldset,label{display:block}::-moz-placeholder{color:rgb(var(--color-surface-500))}::placeholder{color:rgb(var(--color-surface-500))}.dark ::-moz-placeholder{color:rgb(var(--color-surface-400))}.dark ::placeholder{color:rgb(var(--color-surface-400))}:is(.dark input::-webkit-calendar-picker-indicator){--tw-invert: invert(100%);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}input[type=search]::-webkit-search-cancel-button{-webkit-appearance:none;background:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3E%3Cpath d='M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm121.6 313.1c4.7 4.7 4.7 12.3 0 17L338 377.6c-4.7 4.7-12.3 4.7-17 0L256 312l-65.1 65.6c-4.7 4.7-12.3 4.7-17 0L134.4 338c-4.7-4.7-4.7-12.3 0-17l65.6-65-65.6-65.1c-4.7-4.7-4.7-12.3 0-17l39.6-39.6c4.7-4.7 12.3-4.7 17 0l65 65.7 65.1-65.6c4.7-4.7 12.3-4.7 17 0l39.6 39.6c4.7 4.7 4.7 12.3 0 17L312 256l65.6 65.1z'/%3E%3C/svg%3E") no-repeat 50% 50%;pointer-events:none;height:16px;width:16px;border-radius:9999px;background-size:contain;opacity:0}input[type=search]:focus::-webkit-search-cancel-button{pointer-events:auto;opacity:1}:is(.dark input[type=search]::-webkit-search-cancel-button){--tw-invert: invert(100%);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}progress{webkit-appearance:none;-moz-appearance:none;-webkit-appearance:none;appearance:none;height:8px;width:100%;overflow:hidden;border-radius:var(--theme-rounded-base);background-color:rgb(var(--color-surface-400))}.dark progress{background-color:rgb(var(--color-surface-500))}progress::-webkit-progress-bar{background-color:rgb(var(--color-surface-400))}.dark progress::-webkit-progress-bar{background-color:rgb(var(--color-surface-500))}progress::-webkit-progress-value{background-color:rgb(var(--color-surface-900))}.dark progress::-webkit-progress-value{background-color:rgb(var(--color-surface-50))}::-moz-progress-bar{background-color:rgb(var(--color-surface-900))}.dark ::-moz-progress-bar{background-color:rgb(var(--color-surface-50))}:indeterminate::-moz-progress-bar{width:0}input[type=file]:not(.file-dropzone-input)::file-selector-button:disabled{cursor:not-allowed;opacity:.5}input[type=file]:not(.file-dropzone-input)::file-selector-button:disabled:hover{--tw-brightness: brightness(1);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}input[type=file]:not(.file-dropzone-input)::file-selector-button:disabled:active{--tw-scale-x: 1;--tw-scale-y: 1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}input[type=file]:not(.file-dropzone-input)::file-selector-button{font-size:14px;line-height:20px;padding:6px 12px;white-space:nowrap;text-align:center;display:inline-flex;align-items:center;justify-content:center;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;border-radius:var(--theme-rounded-base);background-color:rgb(var(--color-surface-900));color:rgb(var(--color-surface-50));margin-right:8px;border-width:0px}input[type=file]:not(.file-dropzone-input)::file-selector-button>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(8px * var(--tw-space-x-reverse));margin-left:calc(8px * calc(1 - var(--tw-space-x-reverse)))}input[type=file]:not(.file-dropzone-input)::file-selector-button:hover{--tw-brightness: brightness(1.15);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}input[type=file]:not(.file-dropzone-input)::file-selector-button:active{--tw-scale-x: 95%;--tw-scale-y: 95%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-brightness: brightness(.9);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.dark input[type=file]:not(.file-dropzone-input)::file-selector-button{background-color:rgb(var(--color-surface-50));color:rgb(var(--color-surface-900))}[type=range]{width:100%;accent-color:rgb(var(--color-surface-900) / 1)}:is(.dark [type=range]){accent-color:rgb(var(--color-surface-50) / 1)}[data-sort]{cursor:pointer}[data-sort]:hover:hover,.dark [data-sort]:hover:hover{background-color:rgb(var(--color-primary-500) / .1)}[data-sort]:after{margin-left:8px!important;opacity:0;--tw-content: "\u2193" !important;content:var(--tw-content)!important}[data-popup]{position:absolute;top:0;left:0;display:none;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}:host [data-theme=skeleton]{--theme-font-family-base: system-ui;--theme-font-family-heading: system-ui;--theme-font-color-base: 0 0 0;--theme-font-color-dark: 255 255 255;--theme-rounded-base: 9999px;--theme-rounded-container: 8px;--theme-border-base: 1px;--on-primary: 0 0 0;--on-secondary: 255 255 255;--on-tertiary: 0 0 0;--on-success: 0 0 0;--on-warning: 0 0 0;--on-error: 255 255 255;--on-surface: 255 255 255;--color-primary-50: 219 245 236;--color-primary-100: 207 241 230;--color-primary-200: 195 238 224;--color-primary-300: 159 227 205;--color-primary-400: 87 207 167;--color-primary-500: 15 186 129;--color-primary-600: 14 167 116;--color-primary-700: 11 140 97;--color-primary-800: 9 112 77;--color-primary-900: 7 91 63;--color-secondary-50: 229 227 251;--color-secondary-100: 220 218 250;--color-secondary-200: 211 209 249;--color-secondary-300: 185 181 245;--color-secondary-400: 132 126 237;--color-secondary-500: 79 70 229;--color-secondary-600: 71 63 206;--color-secondary-700: 59 53 172;--color-secondary-800: 47 42 137;--color-secondary-900: 39 34 112;--color-tertiary-50: 219 242 252;--color-tertiary-100: 207 237 251;--color-tertiary-200: 195 233 250;--color-tertiary-300: 159 219 246;--color-tertiary-400: 86 192 240;--color-tertiary-500: 14 165 233;--color-tertiary-600: 13 149 210;--color-tertiary-700: 11 124 175;--color-tertiary-800: 8 99 140;--color-tertiary-900: 7 81 114;--color-success-50: 237 247 220;--color-success-100: 230 245 208;--color-success-200: 224 242 197;--color-success-300: 206 235 162;--color-success-400: 169 219 92;--color-success-500: 132 204 22;--color-success-600: 119 184 20;--color-success-700: 99 153 17;--color-success-800: 79 122 13;--color-success-900: 65 100 11;--color-warning-50: 252 244 218;--color-warning-100: 251 240 206;--color-warning-200: 250 236 193;--color-warning-300: 247 225 156;--color-warning-400: 240 202 82;--color-warning-500: 234 179 8;--color-warning-600: 211 161 7;--color-warning-700: 176 134 6;--color-warning-800: 140 107 5;--color-warning-900: 115 88 4;--color-error-50: 249 221 234;--color-error-100: 246 209 228;--color-error-200: 244 198 221;--color-error-300: 238 163 200;--color-error-400: 225 94 159;--color-error-500: 212 25 118;--color-error-600: 191 23 106;--color-error-700: 159 19 89;--color-error-800: 127 15 71;--color-error-900: 104 12 58;--color-surface-50: 228 230 238;--color-surface-100: 219 222 233;--color-surface-200: 210 214 227;--color-surface-300: 182 189 210;--color-surface-400: 128 140 177;--color-surface-500: 73 90 143;--color-surface-600: 66 81 129;--color-surface-700: 55 68 107;--color-surface-800: 44 54 86;--color-surface-900: 36 44 70}[data-theme=skeleton] h1,[data-theme=skeleton] h3{font-weight:700}[data-theme=skeleton]{background-image:radial-gradient(at 0% 0%,rgba(var(--color-secondary-500) / .33) 0px,transparent 50%),radial-gradient(at 98% 1%,rgba(var(--color-error-500) / .33) 0px,transparent 50%);background-attachment:fixed;background-position:center;background-repeat:no-repeat;background-size:cover}*{scrollbar-color:initial;scrollbar-width:initial}*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }.container{width:100%}@media (min-width: 640px){.container{max-width:640px}}@media (min-width: 768px){.container{max-width:768px}}@media (min-width: 1024px){.container{max-width:1024px}}@media (min-width: 1280px){.container{max-width:1280px}}@media (min-width: 1536px){.container{max-width:1536px}}.hide-scrollbar::-webkit-scrollbar{display:none}.hide-scrollbar{-ms-overflow-style:none;scrollbar-width:none}.h3{font-size:20px;line-height:28px;font-family:var(--theme-font-family-heading)}.anchor{--tw-text-opacity: 1;color:rgb(var(--color-primary-700) / var(--tw-text-opacity));text-decoration-line:underline}.anchor:hover{--tw-brightness: brightness(1.1);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}:is(.dark .anchor){--tw-text-opacity: 1;color:rgb(var(--color-primary-500) / var(--tw-text-opacity))}.time{font-size:14px;line-height:20px;--tw-text-opacity: 1;color:rgb(var(--color-surface-500) / var(--tw-text-opacity))}:is(.dark .time){--tw-text-opacity: 1;color:rgb(var(--color-surface-400) / var(--tw-text-opacity))}.code{white-space:nowrap;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:12px;line-height:16px;--tw-text-opacity: 1;color:rgb(var(--color-primary-700) / var(--tw-text-opacity));background-color:rgb(var(--color-primary-500) / .3);border-radius:4px;padding:2px 4px}:is(.dark .code){--tw-text-opacity: 1;color:rgb(var(--color-primary-400) / var(--tw-text-opacity));background-color:rgb(var(--color-primary-500) / .2)}.del{position:relative;display:block;padding:2px 2px 2px 20px;text-decoration:none}.del:before{position:absolute;left:4px;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.del:before{content:"\u2212"}.del{--tw-bg-opacity: 1;background-color:rgb(var(--color-error-500) / var(--tw-bg-opacity));font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;color:rgb(var(--on-error))}.alert{display:flex;flex-direction:column;align-items:flex-start;padding:16px;color:rgb(var(--color-surface-900));border-radius:var(--theme-rounded-container)}.alert>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(16px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(16px * var(--tw-space-y-reverse))}.dark .alert{color:rgb(var(--color-surface-50))}.\\!btn:disabled{cursor:not-allowed!important;opacity:.5!important}.btn:disabled,.btn-icon:disabled,.btn-group>*:disabled{cursor:not-allowed!important;opacity:.5!important}.\\!btn:disabled:hover{--tw-brightness: brightness(1) !important;filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)!important}.btn:disabled:hover,.btn-icon:disabled:hover,.btn-group>*:disabled:hover{--tw-brightness: brightness(1);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.\\!btn:disabled:active{--tw-scale-x: 1 !important;--tw-scale-y: 1 !important;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.btn:disabled:active,.btn-icon:disabled:active,.btn-group>*:disabled:active{--tw-scale-x: 1;--tw-scale-y: 1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.\\!btn{font-size:16px!important;line-height:24px!important;padding:9px 20px!important;white-space:nowrap!important;text-align:center!important;display:inline-flex!important;align-items:center!important;justify-content:center!important;transition-property:all!important;transition-timing-function:cubic-bezier(.4,0,.2,1)!important;transition-duration:.15s!important;border-radius:var(--theme-rounded-base)!important}.btn{font-size:16px;line-height:24px;padding:9px 20px;white-space:nowrap;text-align:center;display:inline-flex;align-items:center;justify-content:center;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;border-radius:var(--theme-rounded-base)}.\\!btn>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0 !important;margin-right:calc(8px * var(--tw-space-x-reverse))!important;margin-left:calc(8px * calc(1 - var(--tw-space-x-reverse)))!important}.btn>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(8px * var(--tw-space-x-reverse));margin-left:calc(8px * calc(1 - var(--tw-space-x-reverse)))}.\\!btn:hover{--tw-brightness: brightness(1.15) !important;filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)!important}.btn:hover{--tw-brightness: brightness(1.15);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.\\!btn:active{--tw-scale-x: 95% !important;--tw-scale-y: 95% !important;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important;--tw-brightness: brightness(.9) !important;filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)!important}.btn:active{--tw-scale-x: 95%;--tw-scale-y: 95%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-brightness: brightness(.9);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.btn-sm{padding:6px 12px;font-size:14px;line-height:20px}.btn-icon{font-size:16px;line-height:24px;white-space:nowrap;text-align:center;display:inline-flex;align-items:center;justify-content:center;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;padding:0;aspect-ratio:1 / 1;width:43px;border-radius:9999px}.btn-icon>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(8px * var(--tw-space-x-reverse));margin-left:calc(8px * calc(1 - var(--tw-space-x-reverse)))}.btn-icon:hover{--tw-brightness: brightness(1.15);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.btn-icon:active{--tw-scale-x: 95%;--tw-scale-y: 95%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-brightness: brightness(.9);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.btn-icon-sm{aspect-ratio:1 / 1;width:33px;font-size:14px;line-height:20px}.btn-group{display:inline-flex;flex-direction:row;overflow:hidden;border-radius:var(--theme-rounded-base);isolation:isolate}.btn-group>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(0px * var(--tw-space-x-reverse));margin-left:calc(0px * calc(1 - var(--tw-space-x-reverse)))}.btn-group button,.btn-group a{font-size:16px;line-height:24px;padding:9px 20px;white-space:nowrap;text-align:center;display:inline-flex;align-items:center;justify-content:center;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;color:inherit!important;text-decoration-line:none!important}.btn-group button>:not([hidden])~:not([hidden]),.btn-group a>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(8px * var(--tw-space-x-reverse));margin-left:calc(8px * calc(1 - var(--tw-space-x-reverse)))}.btn-group button:hover,.btn-group a:hover{--tw-brightness: brightness(1.15);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);background-color:rgb(var(--color-surface-50) / 3%)}.btn-group button:active,.btn-group a:active{background-color:rgb(var(--color-surface-900) / 3%)}.btn-group>*+*{border-top-width:0px;border-left-width:1px;border-color:rgb(var(--color-surface-500) / .2)}.card{background-color:rgb(var(--color-surface-100));--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000);--tw-ring-inset: inset;--tw-ring-color: rgb(23 23 23 / .05);border-radius:var(--theme-rounded-container)}.dark .card{background-color:rgb(var(--color-surface-800));--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000);--tw-ring-inset: inset;--tw-ring-color: rgb(250 250 250 / .05)}a.card{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}a.card:hover{--tw-brightness: brightness(1.05);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.\\!chip{cursor:pointer!important;white-space:nowrap!important;padding:6px 12px!important;text-align:center!important;font-size:12px!important;line-height:16px!important;border-radius:4px!important;display:inline-flex!important;align-items:center!important;justify-content:center!important;transition-property:all!important;transition-timing-function:cubic-bezier(.4,0,.2,1)!important;transition-duration:.15s!important}.chip{cursor:pointer;white-space:nowrap;padding:6px 12px;text-align:center;font-size:12px;line-height:16px;border-radius:4px;display:inline-flex;align-items:center;justify-content:center;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.\\!chip>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0 !important;margin-right:calc(8px * var(--tw-space-x-reverse))!important;margin-left:calc(8px * calc(1 - var(--tw-space-x-reverse)))!important}.chip>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(8px * var(--tw-space-x-reverse));margin-left:calc(8px * calc(1 - var(--tw-space-x-reverse)))}a.chip:hover,button.chip:hover{--tw-brightness: brightness(1.15);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}a.\\!chip:hover,button.\\!chip:hover{--tw-brightness: brightness(1.15) !important;filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)!important}.\\!chip:disabled{cursor:not-allowed!important;opacity:.5!important}.chip:disabled{cursor:not-allowed!important;opacity:.5!important}.\\!chip:disabled:active{--tw-scale-x: 1 !important;--tw-scale-y: 1 !important;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))!important}.chip:disabled:active{--tw-scale-x: 1;--tw-scale-y: 1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.label>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(4px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(4px * var(--tw-space-y-reverse))}.\\!input{width:100%!important;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter!important;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter!important;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter!important;transition-timing-function:cubic-bezier(.4,0,.2,1)!important;transition-duration:.2s!important;background-color:rgb(var(--color-surface-200))!important;--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color) !important;--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color) !important;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)!important;border-width:var(--theme-border-base)!important;border-color:rgb(var(--color-surface-400))!important}.input,.textarea,.select,.input-group{width:100%;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.2s;background-color:rgb(var(--color-surface-200));--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color) !important;--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color) !important;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)!important;border-width:var(--theme-border-base);border-color:rgb(var(--color-surface-400))}.dark .input,.dark .textarea,.dark .select,.dark .input-group{background-color:rgb(var(--color-surface-700));border-color:rgb(var(--color-surface-500))}.dark .\\!input{background-color:rgb(var(--color-surface-700))!important;border-color:rgb(var(--color-surface-500))!important}.\\!input:hover{--tw-brightness: brightness(1.05) !important;filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)!important}.input:hover,.textarea:hover,.select:hover,.input-group:hover{--tw-brightness: brightness(1.05);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.\\!input:focus{--tw-brightness: brightness(1.05) !important;filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)!important}.input:focus,.textarea:focus,.select:focus,.input-group:focus{--tw-brightness: brightness(1.05);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.\\!input:focus-within{--tw-border-opacity: 1 !important;border-color:rgb(var(--color-primary-500) / var(--tw-border-opacity))!important}.input:focus-within,.textarea:focus-within,.select:focus-within,.input-group:focus-within{--tw-border-opacity: 1;border-color:rgb(var(--color-primary-500) / var(--tw-border-opacity))}.\\!input{border-radius:var(--theme-rounded-base)!important}.input,.input-group{border-radius:var(--theme-rounded-base)}.textarea,.select{border-radius:var(--theme-rounded-container)}.select>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(4px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(4px * var(--tw-space-y-reverse))}.select{padding:8px 32px 8px 8px}.select[size]{background-image:none}.select optgroup>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(4px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(4px * var(--tw-space-y-reverse))}.select optgroup{font-weight:700}.select optgroup option{margin-left:0;padding-left:0}.select optgroup option:first-of-type{margin-top:12px}.select optgroup option:last-child{margin-bottom:12px!important}.select option{cursor:pointer;padding:8px 16px;background-color:rgb(var(--color-surface-200));border-radius:var(--theme-rounded-base)}.dark .select option{background-color:rgb(var(--color-surface-700))}.select option:checked{background:rgb(var(--color-primary-500)) linear-gradient(0deg,rgb(var(--color-primary-500)),rgb(var(--color-primary-500)));color:rgb(var(--on-primary))}.checkbox,.radio{height:20px;width:20px;cursor:pointer;border-radius:4px;--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color) !important;--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color) !important;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)!important;background-color:rgb(var(--color-surface-200));border-width:var(--theme-border-base);border-color:rgb(var(--color-surface-400))}.dark .checkbox,.dark .radio{background-color:rgb(var(--color-surface-700));border-color:rgb(var(--color-surface-500))}.checkbox:hover,.radio:hover{--tw-brightness: brightness(1.05);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.checkbox:focus,.radio:focus{--tw-brightness: brightness(1.05);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);--tw-border-opacity: 1;border-color:rgb(var(--color-primary-500) / var(--tw-border-opacity))}.checkbox:checked,.checkbox:indeterminate,.radio:checked{--tw-bg-opacity: 1;background-color:rgb(var(--color-primary-500) / var(--tw-bg-opacity))}.checkbox:checked:hover,.checkbox:indeterminate:hover,.radio:checked:hover{--tw-bg-opacity: 1;background-color:rgb(var(--color-primary-500) / var(--tw-bg-opacity))}.checkbox:checked:focus,.checkbox:indeterminate:focus,.radio:checked:focus{--tw-bg-opacity: 1;background-color:rgb(var(--color-primary-500) / var(--tw-bg-opacity));--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.radio{border-radius:var(--theme-rounded-base)}.\\!input[type=file]{padding:4px!important}.input[type=file]{padding:4px}.\\!input[type=color]{height:40px!important;width:40px!important;cursor:pointer!important;overflow:hidden!important;border-style:none!important;border-radius:var(--theme-rounded-base)!important;-webkit-appearance:none!important}.input[type=color]{height:40px;width:40px;cursor:pointer;overflow:hidden;border-style:none;border-radius:var(--theme-rounded-base);-webkit-appearance:none}.\\!input[type=color]::-webkit-color-swatch-wrapper{padding:0!important}.input[type=color]::-webkit-color-swatch-wrapper{padding:0}.\\!input[type=color]::-webkit-color-swatch{border-style:none!important}.input[type=color]::-webkit-color-swatch{border-style:none}.\\!input[type=color]::-webkit-color-swatch:hover{--tw-brightness: brightness(1.1) !important;filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)!important}.input[type=color]::-webkit-color-swatch:hover{--tw-brightness: brightness(1.1);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.\\!input[type=color]::-moz-color-swatch{border-style:none!important}.input[type=color]::-moz-color-swatch{border-style:none}.\\!input:disabled{cursor:not-allowed!important;opacity:.5!important}.input:disabled,.textarea:disabled,.select:disabled,.input-group>input:disabled,.input-group>textarea:disabled,.input-group>select:disabled{cursor:not-allowed!important;opacity:.5!important}.\\!input:disabled:hover{--tw-brightness: brightness(1) !important;filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)!important}.input:disabled:hover,.textarea:disabled:hover,.select:disabled:hover,.input-group>input:disabled:hover,.input-group>textarea:disabled:hover,.input-group>select:disabled:hover{--tw-brightness: brightness(1) !important;filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)!important}.\\!input[readonly],.input[readonly],.textarea[readonly],.select[readonly]{cursor:not-allowed!important;border-color:transparent!important}.\\!input[readonly]:hover,.input[readonly]:hover,.textarea[readonly]:hover,.select[readonly]:hover{--tw-brightness: brightness(1) !important;filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)!important}.input-group{display:grid;overflow:hidden}.input-group input,.input-group select{border-width:0px;background-color:transparent;--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color) !important;--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color) !important;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)!important}.input-group select option{background-color:rgb(var(--color-surface-200))}.dark .input-group select option{background-color:rgb(var(--color-surface-700))}.input-group div,.input-group a,.input-group button{display:flex;align-items:center;justify-content:space-between;padding-left:16px;padding-right:16px}.input-group-divider input,.input-group-divider select,.input-group-divider div,.input-group-divider a{border-left-width:1px;border-color:rgb(var(--color-surface-400));--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color) !important;--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color) !important;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)!important;min-width:-moz-fit-content!important;min-width:fit-content!important}.dark .input-group-divider input,.dark .input-group-divider select,.dark .input-group-divider div,.dark .input-group-divider a{border-color:rgb(var(--color-surface-500))}.input-group-divider input:focus,.input-group-divider select:focus,.input-group-divider div:focus,.input-group-divider a:focus{border-color:rgb(var(--color-surface-400))}.dark .input-group-divider input:focus,.dark .input-group-divider select:focus,.dark .input-group-divider div:focus,.dark .input-group-divider a:focus{border-color:rgb(var(--color-surface-500))}.input-group-divider *:first-child{border-left-width:0px!important}.input-group-shim{background-color:rgb(var(--color-surface-400) / .1);color:rgb(var(--color-surface-600))}.dark .input-group-shim{color:rgb(var(--color-surface-300))}.input-error{--tw-border-opacity: 1;border-color:rgb(var(--color-error-500) / var(--tw-border-opacity));--tw-bg-opacity: 1;background-color:rgb(var(--color-error-200) / var(--tw-bg-opacity));--tw-text-opacity: 1;color:rgb(var(--color-error-500) / var(--tw-text-opacity))}:is(.dark .input-error){--tw-border-opacity: 1;border-color:rgb(var(--color-error-500) / var(--tw-border-opacity));--tw-bg-opacity: 1;background-color:rgb(var(--color-error-200) / var(--tw-bg-opacity));--tw-text-opacity: 1;color:rgb(var(--color-error-500) / var(--tw-text-opacity))}.input-error::-moz-placeholder{--tw-text-opacity: 1;color:rgb(var(--color-error-500) / var(--tw-text-opacity))}.input-error::placeholder{--tw-text-opacity: 1;color:rgb(var(--color-error-500) / var(--tw-text-opacity))}.list{list-style-type:none}.list>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(4px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(4px * var(--tw-space-y-reverse))}.list li{display:flex;align-items:center;border-radius:var(--theme-rounded-base)}.list li>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(16px * var(--tw-space-x-reverse));margin-left:calc(16px * calc(1 - var(--tw-space-x-reverse)))}.placeholder{height:20px;background-color:rgb(var(--color-surface-300));border-radius:var(--theme-rounded-base)}.dark .placeholder{background-color:rgb(var(--color-surface-600))}.w-modal{width:100%;max-width:640px}.modal *:focus:not([tabindex="-1"]):not(.input):not(.textarea):not(.select):not(.input-group):not(.input-group input){outline-style:auto;outline-color:-webkit-focus-ring-color}.variant-filled{background-color:rgb(var(--color-surface-900));color:rgb(var(--color-surface-50))}.dark .variant-filled{background-color:rgb(var(--color-surface-50));color:rgb(var(--color-surface-900))}.\\!variant-filled-primary{--tw-bg-opacity: 1 !important;background-color:rgb(var(--color-primary-500) / var(--tw-bg-opacity))!important;color:rgb(var(--on-primary))!important}.variant-filled-primary{--tw-bg-opacity: 1;background-color:rgb(var(--color-primary-500) / var(--tw-bg-opacity));color:rgb(var(--on-primary))}:is(.dark .variant-filled-primary){--tw-bg-opacity: 1;background-color:rgb(var(--color-primary-500) / var(--tw-bg-opacity));color:rgb(var(--on-primary))}:is(.dark .\\!variant-filled-primary){--tw-bg-opacity: 1 !important;background-color:rgb(var(--color-primary-500) / var(--tw-bg-opacity))!important;color:rgb(var(--on-primary))!important}.variant-ghost-surface{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000);--tw-ring-inset: inset;--tw-ring-opacity: 1;--tw-ring-color: rgb(var(--color-surface-500) / var(--tw-ring-opacity));background-color:rgb(var(--color-surface-500) / .2)}:is(.dark .variant-ghost-surface){--tw-ring-opacity: 1;--tw-ring-color: rgb(var(--color-surface-500) / var(--tw-ring-opacity));background-color:rgb(var(--color-surface-500) / .2)}.variant-soft,.variant-soft-surface{background-color:rgb(var(--color-surface-400) / .2);--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color) !important;--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color) !important;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)!important;color:rgb(var(--color-surface-700))}.dark .variant-soft,.dark .variant-soft-surface{color:rgb(var(--color-surface-200))}:is(.dark .variant-soft),:is(.dark .variant-soft-surface){background-color:rgb(var(--color-surface-500) / .2)}@media (min-width: 768px){.h3{font-size:24px;line-height:32px}}@media (min-width: 1024px){.alert{flex-direction:row;align-items:center}.alert>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(0px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px * var(--tw-space-y-reverse));--tw-space-x-reverse: 0;margin-right:calc(16px * var(--tw-space-x-reverse));margin-left:calc(16px * calc(1 - var(--tw-space-x-reverse)))}}.modal *:focus:not([tabindex="-1"]):not(.input):not(.textarea):not(.select):not(.input-group):not(.input-group input){outline-width:0px!important}.visible{visibility:visible}.static{position:static}.fixed{position:fixed}.\\!absolute{position:absolute!important}.absolute{position:absolute}.relative{position:relative}.bottom-0{bottom:0}.bottom-24{bottom:96px}.left-0{left:0}.left-1\\/2{left:50%}.right-0{right:0}.right-2{right:8px}.right-20{right:80px}.right-4{right:16px}.top-0{top:0}.top-1\\/2{top:50%}.top-2{top:8px}.top-36{top:144px}.-z-10{z-index:-10}.z-\\[999\\]{z-index:999}.row-span-2{grid-row:span 2 / span 2}.row-start-1{grid-row-start:1}.\\!m-0{margin:0!important}.m-auto{margin:auto}.mx-2{margin-left:8px;margin-right:8px}.my-4{margin-top:16px;margin-bottom:16px}.my-\\[1px\\]{margin-top:1px;margin-bottom:1px}.ml-1{margin-left:4px}.ml-3{margin-left:12px}.ml-4{margin-left:16px}.mr-2{margin-right:8px}.mr-6{margin-right:24px}.mt-2{margin-top:8px}.mt-4{margin-top:16px}.block{display:block}.inline-block{display:inline-block}.flex{display:flex}.inline-flex{display:inline-flex}.grid{display:grid}.contents{display:contents}.hidden{display:none}.size-14{width:56px;height:56px}.size-full{width:100%;height:100%}.h-0{height:0px}.h-10{height:40px}.h-2{height:8px}.h-4{height:16px}.h-48{height:192px}.h-6{height:24px}.h-8{height:32px}.h-\\[38px\\]{height:38px}.h-auto{height:auto}.h-fit{height:-moz-fit-content;height:fit-content}.h-full{height:100%}.h-screen{height:100vh}.max-h-\\[200px\\]{max-height:200px}.min-h-0{min-height:0px}.min-h-full{min-height:100%}.w-0{width:0px}.w-12{width:48px}.w-16{width:64px}.w-20{width:80px}.w-32{width:128px}.w-36{width:144px}.w-48{width:192px}.w-5{width:20px}.w-6{width:24px}.w-8{width:32px}.w-\\[140px\\]{width:140px}.w-\\[38px\\]{width:38px}.w-\\[50\\%\\]{width:50%}.w-\\[600px\\]{width:600px}.w-full{width:100%}.w-screen{width:100vw}.max-w-full{max-width:100%}.flex-1{flex:1 1 0%}.flex-auto{flex:1 1 auto}.flex-none{flex:none}.shrink-0{flex-shrink:0}.flex-grow{flex-grow:1}.basis-0{flex-basis:0px}.origin-\\[50\\%_50\\%\\]{transform-origin:50% 50%}.-translate-x-1\\/2{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-x-full{--tw-translate-x: -100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1\\/2{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-0{--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-\\[calc\\(100\\%-44px\\)\\]{--tw-translate-x: calc(100% - 44px) ;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-full{--tw-translate-x: 100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-rotate-90{--tw-rotate: -90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-\\[0\\.8\\]{--tw-scale-x: .8;--tw-scale-y: .8;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.\\!transform-none{transform:none!important}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.\\!cursor-default{cursor:default!important}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.list-inside{list-style-position:inside}.list-disc{list-style-type:disc}.grid-cols-\\[0px_1fr\\]{grid-template-columns:0px 1fr}.grid-cols-\\[140px_1fr\\]{grid-template-columns:140px 1fr}.grid-cols-\\[auto_1fr_auto\\]{grid-template-columns:auto 1fr auto}.grid-cols-\\[auto_1fr_auto_auto\\]{grid-template-columns:auto 1fr auto auto}.grid-rows-\\[0fr\\]{grid-template-rows:0fr}.grid-rows-\\[1fr\\]{grid-template-rows:1fr}.grid-rows-\\[auto_1fr\\]{grid-template-rows:auto 1fr}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.\\!items-stretch{align-items:stretch!important}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.justify-evenly{justify-content:space-evenly}.gap-1{gap:4px}.gap-14{gap:56px}.gap-2{gap:8px}.gap-3{gap:12px}.gap-4{gap:16px}.gap-6{gap:24px}.space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(8px * var(--tw-space-x-reverse));margin-left:calc(8px * calc(1 - var(--tw-space-x-reverse)))}.space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(16px * var(--tw-space-x-reverse));margin-left:calc(16px * calc(1 - var(--tw-space-x-reverse)))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(4px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(4px * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(8px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(8px * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(16px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(16px * var(--tw-space-y-reverse))}.divide-y-\\[1px\\]>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}.self-start{align-self:flex-start}.self-stretch{align-self:stretch}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overflow-y-hidden{overflow-y:hidden}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.break-words{overflow-wrap:break-word}.rounded{border-radius:4px}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:8px}.rounded-md{border-radius:6px}.rounded-none{border-radius:0}.rounded-e-\\[4px\\]{border-start-end-radius:4px;border-end-end-radius:4px}.rounded-s-full{border-start-start-radius:9999px;border-end-start-radius:9999px}.border{border-width:1px}.border-0{border-width:0px}.\\!border-t-0{border-top-width:0px!important}.border-b{border-bottom-width:1px}.border-b-2{border-bottom-width:2px}.border-l{border-left-width:1px}.\\!border-surface-700{--tw-border-opacity: 1 !important;border-color:rgb(var(--color-surface-700) / var(--tw-border-opacity))!important}.border-surface-400\\/20{border-color:rgb(var(--color-surface-400) / .2)}.bg-primary-500{--tw-bg-opacity: 1;background-color:rgb(var(--color-primary-500) / var(--tw-bg-opacity))}.bg-primary-500\\/30{background-color:rgb(var(--color-primary-500) / .3)}.bg-surface-400{--tw-bg-opacity: 1;background-color:rgb(var(--color-surface-400) / var(--tw-bg-opacity))}.bg-surface-400\\/20{background-color:rgb(var(--color-surface-400) / .2)}.bg-surface-900{--tw-bg-opacity: 1;background-color:rgb(var(--color-surface-900) / var(--tw-bg-opacity))}.bg-transparent{background-color:transparent}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity))}.bg-white\\/30{background-color:#ffffff4d}.bg-white\\/75{background-color:#ffffffbf}.bg-scroll{background-attachment:scroll}.fill-current{fill:currentColor}.fill-primary-500{fill:rgb(var(--color-primary-500) / 1)}.fill-slate-700{fill:#334155}.fill-transparent{fill:transparent}.stroke-primary-500{stroke:rgb(var(--color-primary-500) / 1)}.stroke-primary-500\\/30{stroke:rgb(var(--color-primary-500) / .3)}.stroke-surface-500\\/30{stroke:rgb(var(--color-surface-500) / .3)}.stroke-surface-900{stroke:rgb(var(--color-surface-900) / 1)}.object-cover{-o-object-fit:cover;object-fit:cover}.object-center{-o-object-position:center;object-position:center}.\\!p-0{padding:0!important}.p-0{padding:0}.p-1{padding:4px}.p-2{padding:8px}.p-4{padding:16px}.\\!px-1{padding-left:4px!important;padding-right:4px!important}.\\!py-2{padding-top:8px!important;padding-bottom:8px!important}.\\!py-\\[7px\\]{padding-top:7px!important;padding-bottom:7px!important}.px-3{padding-left:12px;padding-right:12px}.px-4{padding-left:16px;padding-right:16px}.px-8{padding-left:32px;padding-right:32px}.py-1{padding-top:4px;padding-bottom:4px}.py-2{padding-top:8px;padding-bottom:8px}.py-6{padding-top:24px;padding-bottom:24px}.pb-6{padding-bottom:24px}.pl-6{padding-left:24px}.pr-0{padding-right:0}.pr-2{padding-right:8px}.pr-4{padding-right:16px}.pr-6{padding-right:24px}.pt-4{padding-top:16px}.text-center{text-align:center}.text-2xl{font-size:24px;line-height:32px}.text-\\[12px\\]{font-size:12px}.text-base{font-size:16px;line-height:24px}.text-sm{font-size:14px;line-height:20px}.text-xs{font-size:12px;line-height:16px}.font-bold{font-weight:700}.italic{font-style:italic}.leading-\\[14px\\]{line-height:14px}.leading-loose{line-height:2}.\\!text-error-500{--tw-text-opacity: 1 !important;color:rgb(var(--color-error-500) / var(--tw-text-opacity))!important}.text-error-500{--tw-text-opacity: 1;color:rgb(var(--color-error-500) / var(--tw-text-opacity))}.text-surface-400{--tw-text-opacity: 1;color:rgb(var(--color-surface-400) / var(--tw-text-opacity))}.underline-offset-2{text-underline-offset:2px}.accent-surface-900{accent-color:rgb(var(--color-surface-900) / 1)}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-70{opacity:.7}.mix-blend-hard-light{mix-blend-mode:hard-light}.shadow{--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1);--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-xl{--tw-shadow: 0 20px 25px -5px rgb(0 0 0 / .1), 0 8px 10px -6px rgb(0 0 0 / .1);--tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.-outline-offset-\\[3px\\]{outline-offset:-3px}.\\!ring-0{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color) !important;--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color) !important;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)!important}.blur{--tw-blur: blur(8px);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.blur-\\[1px\\]{--tw-blur: blur(1px);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.drop-shadow-xl{--tw-drop-shadow: drop-shadow(0 20px 13px rgb(0 0 0 / .03)) drop-shadow(0 8px 5px rgb(0 0 0 / .08));filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur-sm{--tw-backdrop-blur: blur(4px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\\[grid-template-columns\\]{transition-property:grid-template-columns;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\\[grid-template-rows\\]{transition-property:grid-template-rows;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\\[stroke-dashoffset\\]{transition-property:stroke-dashoffset;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\\[transform\\]{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\\[width\\]{transition-property:width;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.delay-100{transition-delay:.1s}.duration-100{transition-duration:.1s}.duration-\\[200ms\\]{transition-duration:.2s}.duration-\\[250ms\\]{transition-duration:.25s}.duration-\\[400ms\\]{transition-duration:.4s}.bg-surface-backdrop-token{background-color:rgb(var(--color-surface-400) / .7)}.dark .bg-surface-backdrop-token{background-color:rgb(var(--color-surface-900) / .7)}.bg-surface-100-800-token{background-color:rgb(var(--color-surface-100))}.dark .bg-surface-100-800-token{background-color:rgb(var(--color-surface-800))}.bg-surface-200-700-token{background-color:rgb(var(--color-surface-200))}.dark .bg-surface-200-700-token{background-color:rgb(var(--color-surface-700))}.bg-surface-900-50-token{background-color:rgb(var(--color-surface-900))}.dark .bg-surface-900-50-token{background-color:rgb(var(--color-surface-50))}.border-token{border-width:var(--theme-border-base)}.border-surface-400-500-token{border-color:rgb(var(--color-surface-400))}.dark .border-surface-400-500-token{border-color:rgb(var(--color-surface-500))}.border-surface-900-50-token{border-color:rgb(var(--color-surface-900))}.dark .border-surface-900-50-token{border-color:rgb(var(--color-surface-50))}.border-surface-800-100-token{border-color:rgb(var(--color-surface-800))}.dark .border-surface-800-100-token{border-color:rgb(var(--color-surface-100))}.rounded-token{border-radius:var(--theme-rounded-base)}.rounded-container-token{border-radius:var(--theme-rounded-container)}.rounded-tl-container-token{border-top-left-radius:var(--theme-rounded-container)}.rounded-tr-container-token{border-top-right-radius:var(--theme-rounded-container)}.fill-token{fill:rgba(var(--theme-font-color-base))}.dark .fill-token{fill:rgba(var(--theme-font-color-dark))}.text-surface-700-200-token{color:rgb(var(--color-surface-700))}.dark .text-surface-700-200-token{color:rgb(var(--color-surface-200))}.scrollbar-thin::-webkit-scrollbar-track{background-color:var(--scrollbar-track);border-radius:var(--scrollbar-track-radius)}.scrollbar-thin::-webkit-scrollbar-track:hover{background-color:var(--scrollbar-track-hover, var(--scrollbar-track))}.scrollbar-thin::-webkit-scrollbar-track:active{background-color:var(--scrollbar-track-active, var(--scrollbar-track-hover, var(--scrollbar-track)))}.scrollbar-thin::-webkit-scrollbar-thumb{background-color:var(--scrollbar-thumb);border-radius:var(--scrollbar-thumb-radius)}.scrollbar-thin::-webkit-scrollbar-thumb:hover{background-color:var(--scrollbar-thumb-hover, var(--scrollbar-thumb))}.scrollbar-thin::-webkit-scrollbar-thumb:active{background-color:var(--scrollbar-thumb-active, var(--scrollbar-thumb-hover, var(--scrollbar-thumb)))}.scrollbar-thin::-webkit-scrollbar-corner{background-color:var(--scrollbar-corner);border-radius:var(--scrollbar-corner-radius)}.scrollbar-thin::-webkit-scrollbar-corner:hover{background-color:var(--scrollbar-corner-hover, var(--scrollbar-corner))}.scrollbar-thin::-webkit-scrollbar-corner:active{background-color:var(--scrollbar-corner-active, var(--scrollbar-corner-hover, var(--scrollbar-corner)))}.scrollbar-thin{scrollbar-width:thin;scrollbar-color:var(--scrollbar-thumb, initial) var(--scrollbar-track, initial)}.scrollbar-thin::-webkit-scrollbar{display:block;width:8px;height:8px}.scrollbar-track-transparent{--scrollbar-track: transparent !important}.scrollbar-thumb-slate-400\\/50{--scrollbar-thumb: rgb(148 163 184 / .5) !important}.scrollbar-corner-transparent{--scrollbar-corner: transparent !important}.has-\\[\\:checked\\]\\:\\!variant-filled-primary:has(:checked){--tw-bg-opacity: 1 !important;background-color:rgb(var(--color-primary-500) / var(--tw-bg-opacity))!important;color:rgb(var(--on-primary))!important}:is(.dark .has-\\[\\:checked\\]\\:\\!variant-filled-primary:has(:checked)){--tw-bg-opacity: 1 !important;background-color:rgb(var(--color-primary-500) / var(--tw-bg-opacity))!important;color:rgb(var(--on-primary))!important}.hover\\:variant-filled:hover{background-color:rgb(var(--color-surface-900));color:rgb(var(--color-surface-50))}.dark .hover\\:variant-filled:hover{background-color:rgb(var(--color-surface-50));color:rgb(var(--color-surface-900))}.hover\\:variant-soft:hover,.hover\\:variant-soft-surface:hover{background-color:rgb(var(--color-surface-400) / .2);--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color) !important;--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color) !important;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)!important;color:rgb(var(--color-surface-700))}.dark .hover\\:variant-soft:hover,.dark .hover\\:variant-soft-surface:hover{color:rgb(var(--color-surface-200))}:is(.dark .hover\\:variant-soft:hover){background-color:rgb(var(--color-surface-500) / .2)}:is(.dark .hover\\:variant-soft-surface:hover){background-color:rgb(var(--color-surface-500) / .2)}.\\[\\&\\:not\\(\\[disabled\\]\\)\\]\\:variant-soft-primary:not([disabled]){background-color:rgb(var(--color-primary-400) / .2);--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color) !important;--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color) !important;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)!important;color:rgb(var(--color-primary-700))}.dark .\\[\\&\\:not\\(\\[disabled\\]\\)\\]\\:variant-soft-primary:not([disabled]){color:rgb(var(--color-primary-200))}:is(.dark .\\[\\&\\:not\\(\\[disabled\\]\\)\\]\\:variant-soft-primary:not([disabled])){background-color:rgb(var(--color-primary-500) / .2)}.\\*\\:\\!m-0>*{margin:0!important}.\\*\\:items-center>*{align-items:center}.\\*\\:\\!rounded-none>*{border-radius:0!important}.\\*\\:py-4>*{padding-top:16px;padding-bottom:16px}.\\*\\:text-sm>*{font-size:14px;line-height:20px}.\\*\\:border-surface-300-600-token>*{border-color:rgb(var(--color-surface-300))}.dark .\\*\\:border-surface-300-600-token>*{border-color:rgb(var(--color-surface-600))}.hover\\:translate-x-0:hover{--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\\:text-xl:hover{font-size:20px;line-height:28px}.hover\\:opacity-100:hover{opacity:1}.hover\\:brightness-110:hover{--tw-brightness: brightness(1.1);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.hover\\:brightness-\\[105\\%\\]:hover{--tw-brightness: brightness(105%);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.focus\\:decoration-wavy:focus{text-decoration-style:wavy}.focus\\:\\!outline-none:focus{outline:2px solid transparent!important;outline-offset:2px!important}.disabled\\:cursor-wait:disabled{cursor:wait}.disabled\\:opacity-70:disabled{opacity:.7}.dark\\:\\!border-surface-200:is(.dark *){--tw-border-opacity: 1 !important;border-color:rgb(var(--color-surface-200) / var(--tw-border-opacity))!important}.dark\\:border-surface-500\\/20:is(.dark *){border-color:rgb(var(--color-surface-500) / .2)}.dark\\:bg-black\\/15:is(.dark *){background-color:#00000026}.dark\\:bg-surface-300:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(var(--color-surface-300) / var(--tw-bg-opacity))}.dark\\:bg-surface-500\\/20:is(.dark *){background-color:rgb(var(--color-surface-500) / .2)}.dark\\:bg-surface-700:is(.dark *){--tw-bg-opacity: 1;background-color:rgb(var(--color-surface-700) / var(--tw-bg-opacity))}.dark\\:fill-slate-200:is(.dark *){fill:#e2e8f0}.dark\\:stroke-surface-50:is(.dark *){stroke:rgb(var(--color-surface-50) / 1)}.dark\\:accent-surface-50:is(.dark *){accent-color:rgb(var(--color-surface-50) / 1)}.dark\\:hover\\:brightness-110:hover:is(.dark *){--tw-brightness: brightness(1.1);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}@media (min-width: 768px){.md\\:h-\\[600px\\]{height:600px}.md\\:max-w-screen-md{max-width:768px}.md\\:max-w-screen-sm{max-width:640px}.md\\:flex-row{flex-direction:row}.md\\:\\!items-baseline{align-items:baseline!important}}@media (min-width: 1024px){.lg\\:max-w-screen-md{max-width:768px}}@media (min-width: 1280px){.xl\\:max-w-screen-lg{max-width:1024px}}.\\[\\&\\:last-child\\]\\:\\*\\:pt-4>*:last-child{padding-top:16px}.\\[\\&\\:not\\(\\:last-child\\)\\]\\:\\*\\:py-4>*:not(:last-child){padding-top:16px;padding-bottom:16px}.\\[\\&\\:not\\(\\[disabled\\]\\)\\]\\:hover\\:bg-slate-400\\/30:hover:not([disabled]){background-color:#94a3b84d}.\\[\\&\\>input\\]\\:\\!min-w-0>input{min-width:0px!important}.\\[\\&\\>input\\]\\:\\!border-transparent>input{border-color:transparent!important} `); (function (Dexie, dayjs, JSZip, GIF) { 'use strict'; var __defProp = Object.defineProperty; var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value); var _GM_download = /* @__PURE__ */ (() => typeof GM_download != "undefined" ? GM_download : void 0)(); var _GM_info = /* @__PURE__ */ (() => typeof GM_info != "undefined" ? GM_info : void 0)(); var _GM_registerMenuCommand = /* @__PURE__ */ (() => typeof GM_registerMenuCommand != "undefined" ? GM_registerMenuCommand : void 0)(); var _GM_xmlhttpRequest = /* @__PURE__ */ (() => typeof GM_xmlhttpRequest != "undefined" ? GM_xmlhttpRequest : void 0)(); var _unsafeWindow = /* @__PURE__ */ (() => typeof unsafeWindow != "undefined" ? unsafeWindow : void 0)(); function getLogger() { const methods = ["info", "warn", "error"]; const style = ["color: green;", "color: orange;", "color: red;"]; const logLevel = 2; const namePrefix = "[Pixiv Downlaoder] "; function log(level, args) { if (logLevel <= level) console[methods[level]]("%c[Pixiv Downloader]", style[level], ...args); } return { info(...args) { log(0, args); }, warn(...args) { log(1, args); }, error(...args) { log(2, args); }, time(label) { console.time(namePrefix + label); }, timeLog(label) { console.timeLog(namePrefix + label); }, timeEnd(label) { console.timeEnd(namePrefix + label); }, throw(msg, Err) { if (Err) { throw new Err(`${namePrefix}${msg}`); } else { throw new Error(`${namePrefix}${msg}`); } } }; } const logger = getLogger(); function sleep(delay) { return new Promise((resolve) => { setTimeout(resolve, delay); }); } function replaceInvalidChar(str) { if (typeof str !== "string") throw new TypeError("expect string but got " + typeof str); if (!str) return ""; return str.replace(new RegExp("\\p{C}", "gu"), "").replace(/\\/g, "\").replace(/\//g, "/").replace(/:/g, ":").replace(/\*/g, "*").replace(/\?/g, "?").replace(/\|/g, "|").replace(/"/g, """).replace(/</g, "﹤").replace(/>/g, "﹥").replace(/~/g, "~").trim().replace(/^\.|\.$/g, "."); } function unescapeHtml(str) { if (typeof str !== "string") throw new TypeError("expect string but got " + typeof str); if (!str) return ""; const el = document.createElement("p"); el.innerHTML = str; return el.innerText; } function generateCsv(sheetData) { const sheetStr = sheetData.map((row) => { return row.map((cell) => { return '"' + cell.replace(/"/g, '""') + '"'; }).join(","); }).join("\r\n"); return new Blob(["\uFEFF" + sheetStr], { type: "text/csv" }); } function evalScript(script) { const el = document.createElement("script"); el.text = script; document.head.appendChild(el).parentNode.removeChild(el); } function readBlobAsDataUrl(blob) { return new Promise((resolve) => { const reader = new FileReader(); reader.onload = () => { resolve(reader.result); }; reader.readAsDataURL(blob); }); } async function addStyleToShadow(shadowRoot) { { shadowRoot.adoptedStyleSheets = [window._pdlShadowStyle]; } } function getElementText(el) { el.normalize(); if (el.childNodes.length === 0) return ""; const blockNode = [ "ADDRESS", "ARTICLE", "ASIDE", "BLOCKQUOTE", "DD", "DIV", "DL", "DT", "FIELDSET", "FIGCAPTION", "FIGURE", "FOOTER", "FORM", "H1", "H2", "H3", "H4", "H5", "H6", "HEADER", "HR", "LI", "MAIN", "NAV", "OL", "P", "PRE", "SECTION", "TABLE", "UL" ]; let str = ""; for (let i = 0; i < el.childNodes.length; i++) { const node = el.childNodes[i]; if (node.nodeType === Node.TEXT_NODE) { const val = node.nodeValue; (val == null ? void 0 : val.trim()) && (str += val); } else if (node.nodeType === Node.ELEMENT_NODE) { if (node.nodeName === "BR") { str += "\n"; continue; } if (!blockNode.includes(node.nodeName)) { const childText = getElementText(node); childText && (str += childText); } else { const childText = getElementText(node); if (childText) { str ? str += "\n" + childText : str += childText; } } } } return str; } function aDownload$1(blob, filename) { const el = document.createElement("a"); el.href = URL.createObjectURL(blob); el.download = filename; el.click(); URL.revokeObjectURL(el.href); } class RequestError extends Error { constructor(url2, status) { super(status + " " + url2); __publicField(this, "url"); __publicField(this, "status"); this.name = "RequestError"; this.url = url2; this.status = status; } } class CancelError extends Error { constructor() { super("User aborted."); this.name = "CancelError"; } } class JsonDataError extends Error { constructor(msg) { super(msg); this.name = "JsonDataError"; } } const env = { isFirefox() { return navigator.userAgent.includes("Firefox"); }, isViolentmonkey() { return _GM_info.scriptHandler === "Violentmonkey"; }, isTampermonkey() { return _GM_info.scriptHandler === "Tampermonkey"; }, isBlobDlAvaliable() { return !this.isFirefox() || this.isFirefox() && this.isTampermonkey() && parseFloat(_GM_info.version ?? "") < 4.18; }, // firefox使用tampermonkey,downloadmod为默认时也支持子目录,但GM_info显示为原生的“native”,而“原生”不支持子目录 isSupportSubpath() { return this.isBrowserDownloadMode(); }, isBrowserDownloadMode() { return _GM_info.downloadMode === "browser"; }, isConflictActionEnable() { return this.isTampermonkey() && parseFloat(_GM_info.version ?? "") >= 4.18 && this.isBrowserDownloadMode(); }, isConflictActionPromptEnable() { return !this.isFirefox() && this.isConflictActionEnable(); }, isFileSystemAccessAvaliable() { return typeof _unsafeWindow.showDirectoryPicker === "function" && typeof _unsafeWindow.showSaveFilePicker === "function"; }, videoFrameSupported() { return typeof _unsafeWindow.VideoFrame === "function"; }, isPixiv() { return location.hostname === "www.pixiv.net"; }, isYande() { return location.hostname === "yande.re"; } }; class FileSystemAccessHandler { constructor(channelName) { __publicField(this, "filenameConflictAction", "uniquify"); __publicField(this, "updateDirHandleChannel"); __publicField(this, "dirHandle"); __publicField(this, "dirHandleStatus", 0); __publicField(this, "cachedTasks", []); __publicField(this, "duplicateFilenameCached", {}); this.updateDirHandleChannel = new BroadcastChannel(channelName); this.updateDirHandleChannel.onmessage = (evt) => { const data = evt.data; switch (data.kind) { case 1: this.dirHandleStatus = 1; logger.info("正在选择目录"); break; case 0: logger.warn("取消更新dirHandle"); if (this.dirHandle) { this.dirHandleStatus = 2; this.processCachedTasks(); } else { this.dirHandleStatus = 0; this.rejectCachedTasks(); } break; case 2: this.dirHandleStatus = 2; this.dirHandle = data.handle; logger.info("更新dirHandle", this.dirHandle); this.processCachedTasks(); break; case "request": if (this.dirHandle) { this.updateDirHandleChannel.postMessage({ kind: "response", handle: this.dirHandle }); logger.info("响应请求dirHandle"); } break; case "response": if (!this.dirHandle) { if (this.dirHandleStatus === 0) this.dirHandleStatus = 2; this.dirHandle = data.handle; logger.info("首次获取dirHandle", this.dirHandle); } break; default: throw new Error("Invalid data kind."); } }; this.updateDirHandleChannel.postMessage({ kind: "request" }); } async getDirHandleRecursive(dirs) { if (!this.dirHandle) throw new Error("未选择保存文件夹"); let handler = this.dirHandle; if (typeof dirs === "string") { if (dirs.indexOf("/") === -1) return await handler.getDirectoryHandle(dirs, { create: true }); dirs = dirs.split("/").filter((dir) => !!dir); } for await (const dir of dirs) { handler = await handler.getDirectoryHandle(dir, { create: true }); } return handler; } processCachedTasks() { const { length } = this.cachedTasks; for (let i = 0; i < length; i++) { const [blob, downloadMeta, onSaveFullfilled, onSaveRejected] = this.cachedTasks[i]; this.saveFile(blob, downloadMeta).then(onSaveFullfilled, onSaveRejected); } logger.info(`执行${length}个缓存任务`); if (this.cachedTasks.length > length) { this.cachedTasks = this.cachedTasks.slice(length); } else { this.cachedTasks.length = 0; } } rejectCachedTasks() { this.cachedTasks.forEach(([, , , onSaveRejected]) => onSaveRejected(new CancelError())); this.cachedTasks.length = 0; logger.info(`取消${this.cachedTasks.length}个缓存任务`); } async getFilenameHandle(dirHandle, filename) { if (this.filenameConflictAction === "overwrite") return await dirHandle.getFileHandle(filename, { create: true }); if (!(filename in this.duplicateFilenameCached)) { this.duplicateFilenameCached[filename] = []; try { await dirHandle.getFileHandle(filename); logger.warn("存在同名文件", filename); } catch (error) { return await dirHandle.getFileHandle(filename, { create: true }); } } const extIndex = filename.lastIndexOf("."); const ext = filename.slice(extIndex + 1); const name = filename.slice(0, extIndex); if (this.filenameConflictAction === "prompt") { return await _unsafeWindow.showSaveFilePicker({ suggestedName: filename, // eslint-disable-next-line @typescript-eslint/ban-ts-comment //@ts-ignore types: [{ description: "Image file", accept: { ["image/" + ext]: ["." + ext] } }] }); } else { for (let suffix = 1; suffix < 1e3; suffix++) { const newName = `${name} (${suffix}).${ext}`; try { await dirHandle.getFileHandle(newName); } catch (error) { if (this.duplicateFilenameCached[filename].includes(newName)) { continue; } else { this.duplicateFilenameCached[filename].push(newName); } logger.info("使用文件名:", newName); return await dirHandle.getFileHandle(newName, { create: true }); } } throw new RangeError("Oops, you have too many duplicate files."); } } clearFilenameCached(duplicateName, actualName) { if (!(duplicateName in this.duplicateFilenameCached)) return; const usedNameArr = this.duplicateFilenameCached[duplicateName]; logger.info("清理重名文件名", usedNameArr, actualName); if (usedNameArr.length === 0) { delete this.duplicateFilenameCached[duplicateName]; return; } const index = usedNameArr.indexOf(actualName); if (index === -1) return; usedNameArr.splice(index, 1); if (usedNameArr.length === 0) delete this.duplicateFilenameCached[duplicateName]; } async updateDirHandle() { try { this.dirHandleStatus = 1; this.updateDirHandleChannel.postMessage({ kind: 1 /* picking */ }); this.dirHandle = await _unsafeWindow.showDirectoryPicker({ id: "pdl", mode: "readwrite" }); logger.info("更新dirHandle", this.dirHandle); this.dirHandleStatus = 2; this.updateDirHandleChannel.postMessage({ kind: 2, handle: this.dirHandle }); this.processCachedTasks(); return true; } catch (error) { logger.warn(error); this.updateDirHandleChannel.postMessage({ kind: 0 /* unpick */ }); if (this.dirHandle) { this.dirHandleStatus = 2; this.processCachedTasks(); } else { this.dirHandleStatus = 0; this.rejectCachedTasks(); } return false; } } getCurrentDirName() { var _a; return ((_a = this.dirHandle) == null ? void 0 : _a.name) ?? ""; } isDirHandleNotSet() { return this.dirHandleStatus === 0; } setFilenameConflictAction(action) { this.filenameConflictAction = action; } async saveFile(blob, downloadMeta) { if (downloadMeta.isAborted) throw new CancelError(); if (this.dirHandleStatus === 1) { let onSaveFullfilled; let onSaveRejected; const promiseExcutor = new Promise((resolve, reject) => { onSaveFullfilled = resolve; onSaveRejected = reject; }); this.cachedTasks.push([blob, downloadMeta, onSaveFullfilled, onSaveRejected]); return promiseExcutor; } if (this.dirHandleStatus === 0) { const isSuccess = await this.updateDirHandle(); if (!isSuccess) throw new TypeError("Failed to get dir handle."); } let currenDirHandle; let filename; const path = downloadMeta.config.path; const index = path.lastIndexOf("/"); if (index === -1) { filename = path; currenDirHandle = this.dirHandle; } else { filename = path.slice(index + 1); currenDirHandle = await this.getDirHandleRecursive(path.slice(0, index)); } if (downloadMeta.isAborted) throw new CancelError(); const fileHandle = await this.getFilenameHandle(currenDirHandle, filename); const writableStream = await fileHandle.createWritable(); await writableStream.write(blob); await writableStream.close(); this.clearFilenameCached(filename, fileHandle.name); } } const fsaHandler = new FileSystemAccessHandler("update_dir_channel"); function gmDownload(blob, downloadMeta) { return new Promise((resolve, reject) => { if (downloadMeta.isAborted) return reject(new CancelError()); const imgUrl = URL.createObjectURL(blob); const request = { url: URL.createObjectURL(blob), name: downloadMeta.config.path, onerror: (error) => { URL.revokeObjectURL(imgUrl); if (downloadMeta.isAborted) { resolve(); } else { console.error(error); reject(new Error(`FileSave error: ${downloadMeta.config.path}`)); } }, onload: () => { URL.revokeObjectURL(imgUrl); resolve(); } }; downloadMeta.abort = _GM_download(request).abort; }); } function aDownload(blob, downloadMeta) { if (downloadMeta.isAborted) return Promise.reject(new CancelError()); let path = downloadMeta.config.path; const separaterIndex = path.lastIndexOf("/"); if (separaterIndex !== -1) path = path.slice(separaterIndex + 1); const dlEle = document.createElement("a"); dlEle.href = URL.createObjectURL(blob); dlEle.download = path; dlEle.click(); URL.revokeObjectURL(dlEle.href); return Promise.resolve(); } var UgoiraFormat = /* @__PURE__ */ ((UgoiraFormat2) => { UgoiraFormat2["ZIP"] = "zip"; UgoiraFormat2["GIF"] = "gif"; UgoiraFormat2["WEBP"] = "webp"; UgoiraFormat2["PNG"] = "png"; UgoiraFormat2["WEBM"] = "webm"; UgoiraFormat2["MP4"] = "mp4"; return UgoiraFormat2; })(UgoiraFormat || {}); var FilenameConfigAction = /* @__PURE__ */ ((FilenameConfigAction2) => { FilenameConfigAction2["UNIQUIFY"] = "uniquify"; FilenameConfigAction2["OVERWRITE"] = "overwrite"; FilenameConfigAction2["PROMPT"] = "prompt"; return FilenameConfigAction2; })(FilenameConfigAction || {}); var TagLanguage = /* @__PURE__ */ ((TagLanguage2) => { TagLanguage2["JAPANESE"] = "ja"; TagLanguage2["CHINESE"] = "zh"; TagLanguage2["TRADITIONAL_CHINESE"] = "zh_tw"; TagLanguage2["ENGLISH"] = "en"; return TagLanguage2; })(TagLanguage || {}); var HistoryBackupInterval = /* @__PURE__ */ ((HistoryBackupInterval2) => { HistoryBackupInterval2[HistoryBackupInterval2["NEVER"] = 0] = "NEVER"; HistoryBackupInterval2[HistoryBackupInterval2["EVERY_DAY"] = 86400] = "EVERY_DAY"; HistoryBackupInterval2[HistoryBackupInterval2["EVERY_7_DAY"] = 604800] = "EVERY_7_DAY"; HistoryBackupInterval2[HistoryBackupInterval2["EVERY_30_DAY"] = 2592e3] = "EVERY_30_DAY"; return HistoryBackupInterval2; })(HistoryBackupInterval || {}); let config; function loadConfig(customConfig = {}) { if (config) throw new Error("`config` has already been defined."); const defaultConfig = Object.freeze({ version: "1.3.1", ugoiraFormat: "zip", folderPattern: "", filenamePattern: "{id}", tagLang: "ja", showMsg: true, mixEffect: false, bundleIllusts: false, bundleManga: false, addBookmark: false, addBookmarkWithTags: false, privateR18: false, useFileSystemAccess: false, fileSystemFilenameConflictAction: "uniquify", showPopupButton: true, gifQuality: 10, webmQuality: 95, mp4Bitrate: 20, losslessWebp: false, webpQuality: 95, webpMehtod: 4, pngColor: 256, historyBackupInterval: 0, lastHistoryBackup: 0, "pdl-btn-self-bookmark-left": 100, "pdl-btn-self-bookmark-top": 76, "pdl-btn-left": 0, "pdl-btn-top": 100, ...customConfig }); let configData; if (!localStorage.pdlSetting) { configData = Object.assign({}, defaultConfig); } else { try { configData = JSON.parse(localStorage.pdlSetting); } catch (error) { logger.error("Use default config because: ", error); configData = Object.assign({}, defaultConfig); } } if (configData.version !== defaultConfig.version) { configData = { ...defaultConfig, ...configData, version: defaultConfig.version, showMsg: true }; localStorage.pdlSetting = JSON.stringify(configData); } return config = { get(key) { return configData[key] ?? defaultConfig[key]; }, set(key, value) { if (configData[key] !== value) { configData[key] = value; localStorage.pdlSetting = JSON.stringify(configData); logger.info("Config set:", key, value); } }, getAll() { return { ...configData }; }, update(newConfig) { configData = { ...newConfig }; localStorage.pdlSetting = JSON.stringify(configData); } }; } function gmDownloadDataUrl(blob, downloadMeta) { return readBlobAsDataUrl(blob).then((dataUrl) => { return new Promise((resolve, reject) => { if (downloadMeta.isAborted) return reject(new CancelError()); const request = { url: dataUrl, name: downloadMeta.config.path, onerror: (error) => { if (downloadMeta.isAborted) { resolve(); } else { console.error(error); reject(new Error(`FileSave error: ${downloadMeta.config.path}`)); } }, onload: () => { resolve(); } }; downloadMeta.abort = _GM_download(request).abort; }); }); } let saveFile; const blobAvaliable = env.isBlobDlAvaliable(); const subPathAvaliable = env.isSupportSubpath(); if (subPathAvaliable) { if (!blobAvaliable) { saveFile = gmDownloadDataUrl; } else { saveFile = gmDownload; } } else { saveFile = aDownload; logger.warn("Download function is not fully supported:", _GM_info.scriptHandler, _GM_info.version); } const fileSaveAdapters = { getAdapter() { if (this.isFileSystemAccessEnable()) { fsaHandler.setFilenameConflictAction(config.get("fileSystemFilenameConflictAction")); return fsaHandler.saveFile.bind(fsaHandler); } else { return saveFile; } }, isFileSystemAccessEnable() { return env.isFileSystemAccessAvaliable() && config.get("useFileSystemAccess"); }, dirHandleCheck() { if (this.isFileSystemAccessEnable() && fsaHandler.isDirHandleNotSet()) fsaHandler.updateDirHandle(); }, async updateDirHandle() { if (this.isFileSystemAccessEnable()) { await fsaHandler.updateDirHandle(); return fsaHandler.getCurrentDirName(); } return ""; }, getFsaDirName() { if (this.isFileSystemAccessEnable()) { return fsaHandler.getCurrentDirName(); } else { return ""; } } }; function createDownloader() { const MAX_DOWNLOAD = 5; const MAX_RETRY = 3; const DOWNLOAD_INTERVAL = 500; let queue = []; let active2 = []; const cleanAndStartNext = (removeMeta, nextMeta) => { sleep(DOWNLOAD_INTERVAL).then(() => { active2.splice(active2.indexOf(removeMeta), 1); if (nextMeta) { active2.push(nextMeta); dispatchDownload(nextMeta); } else if (queue.length) { const meta = queue.shift(); active2.push(meta); dispatchDownload(meta); } }); }; const xhr = (downloadMeta) => { const { taskId, config: config2, timeout } = downloadMeta; const saveFile2 = fileSaveAdapters.getAdapter(); return _GM_xmlhttpRequest({ url: config2.src, timeout, method: "GET", headers: config2.headers, responseType: "blob", ontimeout() { var _a; const { taskId: taskId2, config: config22, isAborted } = downloadMeta; if (isAborted) return; downloadMeta.retry++; logger.warn("Download timeout", downloadMeta.retry, ":", config22.src); if (downloadMeta.retry > MAX_RETRY) { const err = new Error(`Download timout. ${taskId2} | ${config22.src}`); (_a = config22.onError) == null ? void 0 : _a.call(config22, err, config22); downloadMeta.reject(err); cleanAndStartNext(downloadMeta); } else { logger.info("Retry download:", downloadMeta.retry, config22.src); cleanAndStartNext(downloadMeta, downloadMeta); } }, onerror(error) { var _a; const { taskId: taskId2, config: config22, isAborted } = downloadMeta; if (isAborted) return; let err; if (error.status === 429) { err = new RequestError(config22.src, error.status); } else { err = new Error(`Download failed. ID: ${taskId2}.`); logger.error(error); } (_a = config22.onError) == null ? void 0 : _a.call(config22, err, config22); downloadMeta.reject(err); cleanAndStartNext(downloadMeta); }, onprogress: (res) => { var _a; if (res.loaded > 0 && res.total > 0) { const progress = Math.floor(res.loaded / res.total * 100); (_a = config2.onProgress) == null ? void 0 : _a.call(config2, progress, config2); } }, onload: async (e) => { var _a, _b, _c, _d; logger.info("Xhr complete:", config2.src); cleanAndStartNext(downloadMeta); if (downloadMeta.isAborted) return logger.warn("Download was canceled.", taskId, config2.path); (_a = config2.onXhrLoaded) == null ? void 0 : _a.call(config2, config2); try { let modRes; if (typeof config2.beforeFileSave === "function") { modRes = await config2.beforeFileSave(e.response, config2); if (modRes && !downloadMeta.isAborted) { await saveFile2(modRes, downloadMeta); (_b = config2.onFileSaved) == null ? void 0 : _b.call(config2, config2); logger.info("Download complete:", config2.path); } } else { await saveFile2(e.response, downloadMeta); (_c = config2.onFileSaved) == null ? void 0 : _c.call(config2, config2); logger.info("Download complete:", config2.path); } downloadMeta.resolve(downloadMeta.taskId); } catch (error) { (_d = config2.onError) == null ? void 0 : _d.call(config2, error, config2); downloadMeta.reject(error); } } }); }; const dispatchDownload = (downloadMeta) => { logger.info("Start download:", downloadMeta.config.src); const abortObj = xhr(downloadMeta); downloadMeta.abort = abortObj.abort; }; return { get fileSystemAccessEnabled() { return fileSaveAdapters.isFileSystemAccessEnable(); }, /** * 下载触发后应该先弹窗选择文件保存位置,避免下载/转换用时过长导致错误 * Must be handling a user gesture to show a file picker. * https://bugs.chromium.org/p/chromium/issues/detail?id=1193489 */ dirHandleCheck() { fileSaveAdapters.dirHandleCheck(); }, updateDirHandle() { return fileSaveAdapters.updateDirHandle(); }, getCurrentFsaDirName() { return fileSaveAdapters.getFsaDirName(); }, async download(configs) { logger.info("Downloader add:", configs); if (!Array.isArray(configs)) configs = [configs]; if (configs.length < 1) return Promise.resolve([]); const promises = []; configs.forEach((config2) => { promises.push( new Promise((resolve, reject) => { const downloadMeta = { taskId: config2.taskId, config: config2, isAborted: false, retry: 0, timeout: config2.timeout, resolve, reject }; queue.push(downloadMeta); }) ); }); while (active2.length < MAX_DOWNLOAD && queue.length) { const meta = queue.shift(); active2.push(meta); dispatchDownload(meta); } const results = await Promise.allSettled(promises); const resultIds = []; for (let i = 0; i < results.length; i++) { const result = results[i]; if (result.status === "rejected") throw result.reason; resultIds.push(result.value); } return resultIds; }, abort(taskIds) { if (typeof taskIds === "string") taskIds = [taskIds]; if (!taskIds.length) return; logger.info("Downloader delete, active:", active2.length, "queue", queue.length); active2 = active2.filter((downloadMeta) => { var _a, _b, _c; if (taskIds.includes(downloadMeta.taskId) && !downloadMeta.isAborted) { downloadMeta.isAborted = true; (_a = downloadMeta.abort) == null ? void 0 : _a.call(downloadMeta); (_c = (_b = downloadMeta.config).onAbort) == null ? void 0 : _c.call(_b, downloadMeta.config); downloadMeta.reject(new CancelError()); logger.warn("Download aborted:", downloadMeta.config.path); } else { return true; } }); queue = queue.filter((downloadMeta) => !taskIds.includes(downloadMeta.taskId)); while (active2.length < MAX_DOWNLOAD && queue.length) { const meta = queue.shift(); active2.push(meta); dispatchDownload(meta); } } }; } const downloader = createDownloader(); class HistoryDb extends Dexie { constructor() { super("PdlHistory"); __publicField(this, "history"); __publicField(this, "imageEffect"); this.version(3).stores({ history: "pid, userId, user, title, *tags", imageEffect: "id" }); } throwIfInvalidNumber(num) { if (typeof num === "string") { if (num !== "") { num = +num; } else { return logger.throw('Invalid argument: can not be "".', RangeError); } } if (num < 0 || !Number.isSafeInteger(num)) { logger.throw(`Invalid number: ${num}, must be a non-negative integer.`, RangeError); } return num; } async add(historyData) { const { pid, page } = historyData; return this.transaction("rw", this.history, async () => { if (page !== void 0) { this.throwIfInvalidNumber(page); const historyItem = await this.get(pid); if (historyItem && historyItem.page === void 0) { delete historyData.page; this.history.put(historyData); } else { const u8arr = HistoryDb.updatePageData(page, historyItem == null ? void 0 : historyItem.page); this.history.put({ ...historyData, page: u8arr }); } } else { this.history.put(historyData); } }); } import(objArr) { const historyItems = objArr.map((historyObj) => { if (historyObj.page) { return { ...historyObj, page: new Uint8Array(Object.values(historyObj.page)) }; } else { return historyObj; } }); return this.history.bulkPut(historyItems); } async has(pid, page) { if (page === void 0) { return !!await this.get(pid); } else { this.throwIfInvalidNumber(page); const historyItem = await this.get(pid); if (!historyItem) return false; if (!historyItem.page) return true; return HistoryDb.isPageInData(page, historyItem.page); } } get(pid) { pid = this.throwIfInvalidNumber(pid); return this.history.get(pid); } getAll() { return this.history.toArray(); } generateCsv() { return this.getAll().then((datas) => { const csvData = datas.map((historyData) => { const { pid, userId = "", user = "", title = "", tags = "", comment = "" } = historyData; return [String(pid), String(userId), user, title, comment, tags ? tags.join(",") : tags]; }); csvData.unshift(["id", "userId", "user", "title", "comment", "tags"]); return generateCsv(csvData); }); } clear() { return this.history.clear(); } // Firefox does not support storing `ImageData`, so it will always return `undefined`. async getImageEffect(effectId) { const item = await this.imageEffect.get(effectId); if (!item) return item; return item; } addImageEffect(effectData) { return this.imageEffect.put(effectData); } static updatePageData(page, pageData) { const byteIndex = Math.floor(page / 8); const bitIndex = page % 8; if (!pageData) { const newArr = new Uint8Array(byteIndex + 1); newArr[byteIndex] |= 1 << bitIndex; return newArr; } else if (byteIndex > pageData.length - 1) { const newArr = new Uint8Array(byteIndex + 1); newArr.set(pageData); newArr[byteIndex] |= 1 << bitIndex; return newArr; } else { pageData[byteIndex] |= 1 << bitIndex; return pageData; } } static isPageInData(page, pageData) { const byteIndex = Math.floor(page / 8); const bitIndex = page % 8; return !(byteIndex > pageData.length - 1) && (pageData[byteIndex] & 1 << bitIndex) !== 0; } } class CachedHistoryDb extends HistoryDb { constructor() { super(); __publicField(this, "cache", /* @__PURE__ */ new Map()); __publicField(this, "initCachePromise"); __publicField(this, "channel"); this.initCachePromise = this.initCache(); this.channel = this.initChannel(); } async initCache() { logger.time("loadDb"); const historyItems = await this.getAll(); let historyItem; for (let i = 0; historyItem = historyItems[i++]; ) { const { pid, page = null } = historyItem; this.cache.set(pid, page); } logger.timeEnd("loadDb"); } initChannel() { const CHANNEL_NAME = "pdl_sync-cache"; const channel = new BroadcastChannel(CHANNEL_NAME); channel.addEventListener("message", (evt) => { const { data } = evt; if (data === void 0) { this.cache.clear(); logger.info("clear database cache"); return; } if (Array.isArray(data)) { data.forEach((item) => { this.cache.set(item.pid, item.page); }); logger.info("Sync database cache:", data.length); } else { this.cache.set(data.pid, data.page); } }); return channel; } syncCacheViaChannel(item) { this.channel.postMessage(item); } updateCache(item) { if (Array.isArray(item)) { item.forEach((cache) => { this.cache.set(cache.pid, cache.page); }); } else { this.cache.set(item.pid, item.page); } this.syncCacheViaChannel(item); } clearCache() { this.cache.clear(); this.syncCacheViaChannel(); } async getCache(pid) { pid = this.throwIfInvalidNumber(pid); await this.initCachePromise; return this.cache.get(pid); } async add(historyData) { const { pid, page } = historyData; if (page === void 0) { !await this.has(pid) && this.updateCache({ pid, page: null }); } else { this.throwIfInvalidNumber(page); const pageData = await this.getCache(pid); if (pageData !== null) { this.updateCache({ pid, page: HistoryDb.updatePageData(page, pageData) }); } else { this.updateCache({ pid, page: null }); } } return super.add(historyData); } import(objArr) { const cacheItems = objArr.map((historyObj) => { return { pid: historyObj.pid, page: historyObj.page ? new Uint8Array(Object.values(historyObj.page)) : null }; }); this.updateCache(cacheItems); return super.import(objArr); } async has(pid, page) { pid = this.throwIfInvalidNumber(pid); await this.initCachePromise; if (page === void 0) { return this.cache.has(pid); } else { this.throwIfInvalidNumber(page); const cachesData = await this.getCache(pid); if (cachesData === void 0) return false; if (cachesData === null) return true; return HistoryDb.isPageInData(page, cachesData); } } clear() { this.clearCache(); return super.clear(); } } class ReadableHistoryDb extends CachedHistoryDb { constructor() { super(...arguments); __publicField(this, "subscribers", /* @__PURE__ */ new Set()); } runSubscription() { logger.info("runSubscription", this.subscribers.size); this.subscribers.forEach((subscription) => { subscription(this.cache); }); } async initCache() { await super.initCache(); this.runSubscription(); } initChannel() { const channel = super.initChannel(); channel.addEventListener("message", () => { this.runSubscription(); }); return channel; } updateCache(item) { super.updateCache(item); this.runSubscription(); } clearCache() { super.clearCache(); this.runSubscription(); } subscribe(subscription) { this.subscribers.add(subscription); subscription(this.cache); return () => { this.subscribers.delete(subscription); }; } } const historyDb = new ReadableHistoryDb(); const rule34Parser = { async parse(id) { var _a, _b, _c, _d, _e, _f; const res = await fetch("index.php?page=post&s=view&id=" + id); if (!res.ok) throw new RequestError(res.url, res.status); const html = await res.text(); const doc = new DOMParser().parseFromString(html, "text/html"); const src = ((_a = doc.querySelector("#gelcomVideoPlayer > source")) == null ? void 0 : _a.src) || doc.querySelector('meta[property="og:image"]').getAttribute("content"); const imageNameMatch = new RegExp("(?<=\\/)\\w+\\.\\w+(?=\\?)").exec(src); if (!imageNameMatch) throw new Error("Can not parse image name from src."); const imageName = imageNameMatch[0]; const [title, extendName] = imageName.split("."); const artists = []; const characters = []; const tags = []; const tagEls = doc.querySelectorAll('li[class*="tag-type"]'); tagEls.forEach((tagEl) => { var _a2; const tagTypeMatch = new RegExp("(?<=tag-type-)\\w+").exec(tagEl.className); if (!tagTypeMatch) throw new Error("Unknown tag: " + tagEl.className); const tagType = tagTypeMatch[0]; const tag = ((_a2 = tagEl.querySelector('a[href*="page=post"]')) == null ? void 0 : _a2.textContent) || ""; if (tagType === "artist") { artists.push(tag); } else if (tagType === "character") { characters.push(tag); } tags.push(tagType + ":" + tag); }); const uploaderEl = doc.querySelector('a[href*="page=account&s=profile"]'); const postDateStr = (_c = (_b = uploaderEl == null ? void 0 : uploaderEl.parentElement) == null ? void 0 : _b.firstChild) == null ? void 0 : _c.nodeValue; const postDate = postDateStr ? postDateStr.split(": ")[1] : ""; const sourceEl = (_e = (_d = uploaderEl == null ? void 0 : uploaderEl.parentElement) == null ? void 0 : _d.nextElementSibling) == null ? void 0 : _e.nextElementSibling; if (sourceEl && ((_f = sourceEl.textContent) == null ? void 0 : _f.toLowerCase().includes("source"))) { const sourceLink = sourceEl.querySelector("a"); if (sourceLink) { tags.push("source:" + sourceLink.href); } else { tags.push("source:" + sourceEl.textContent.replace("Source: ", "")); } } return { id, src, extendName, artist: artists.join(",") || "UnknownArtist", character: characters.join(",") || "UnknownCharacter", title, tags, createDate: postDate }; } }; const btnStyle = ".pdl-thumbnail{position:absolute;display:flex;justify-content:center;align-items:center;margin:0;padding:0;height:32px;width:32px;top:calc((100% - 32px) * var(--pdl-btn-top) / 100);left:calc((100% - 32px) * var(--pdl-btn-left) / 100);border:none;border-radius:4px;overflow:hidden;white-space:nowrap;-webkit-user-select:none;-moz-user-select:none;user-select:none;font-family:system-ui;font-size:13px;font-weight:700;color:#262626;background-color:#ffffff80;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);z-index:1;cursor:pointer}.pdl-thumbnail:disabled{cursor:default}.pdl-thumbnail>svg{position:absolute;width:85%;height:85%;fill:currentColor;stroke:currentColor}.pdl-thumbnail>span{opacity:0;transition:opacity .2s}.pdl-thumbnail>span.show{opacity:1}:host([data-type=gallery]) .pdl-thumbnail{position:sticky;top:40px;left:0}:host([data-type=pixiv-my-bookmark]) .pdl-thumbnail{top:calc((100% - 32px) * var(--pdl-btn-self-bookmark-top) / 100);left:calc((100% - 32px) * var(--pdl-btn-self-bookmark-left) / 100)}:host([data-type=pixiv-history]) .pdl-thumbnail{z-index:auto}:host([data-type=pixiv-presentation]) .pdl-thumbnail{position:fixed;top:50px;right:20px;left:auto}:host([data-type=pixiv-toolbar]) .pdl-thumbnail{position:relative;top:auto;left:auto;color:inherit;background-color:transparent}:host([data-type=pixiv-manga-viewer]) .pdl-thumbnail{top:80%;right:4px;left:auto}:host([data-type=yande-browse]) .pdl-thumbnail{top:320px;right:4px;left:auto}:host([data-status]) .pdl-thumbnail{color:#16a34a}:host([data-status=error]) .pdl-thumbnail{color:#ef4444}"; const svgGroup = `<svg xmlns="http://www.w3.org/2000/svg" style="display: none"> <symbol id="pdl-download" viewBox="0 0 512 512"> <path d="M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm0 448c-110.5 0-200-89.5-200-200S145.5 56 256 56s200 89.5 200 200-89.5 200-200 200zm-32-316v116h-67c-10.7 0-16 12.9-8.5 20.5l99 99c4.7 4.7 12.3 4.7 17 0l99-99c7.6-7.6 2.2-20.5-8.5-20.5h-67V140c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12z" ></path> </symbol> <symbol id="pdl-loading" viewBox="0 0 512 512"> <style> @keyframes pdl-loading { 0% { transform: rotate3d(0, 0, 1, -90deg) rotate3d(1, 0, 0, 0deg); stroke-dashoffset: 1407.43; } 49.99% { transform: rotate3d(0, 0, 1, 90deg) rotate3d(1, 0, 0, 0deg); } 50% { transform: rotate3d(0, 0, 1, 90deg) rotate3d(1, 0, 0, 180deg); stroke-dashoffset: 0; } 100% { transform: rotate3d(0, 0, 1, 270deg) rotate3d(1, 0, 0, 180deg); stroke-dashoffset: 1407.43; } } circle.rotate { transform-origin: 50% 50%; animation: 2.5s infinite ease-in-out pdl-loading; } </style> <circle class="rotate" cx="256" cy="256" r="224" stroke-width="48" fill="none" stroke-dasharray="1407.43" stroke-dashoffset="1055.57" stroke-linecap="round" ></circle> </symbol> <symbol id="pdl-progress" viewBox="0 0 512 512"> <style> circle.progress { transition: stroke-dashoffset 0.2s ease; } </style> <circle class="progress" cx="256" cy="256" r="224" stroke-width="48" fill="none" stroke-dasharray="1407.43" stroke-linecap="round" transform="rotate(-90 256 256)" ></circle> </symbol> <symbol id="pdl-error" viewBox="0 0 512 512"> <path d="M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm0 448c-110.5 0-200-89.5-200-200S145.5 56 256 56s200 89.5 200 200-89.5 200-200 200zm101.8-262.2L295.6 256l62.2 62.2c4.7 4.7 4.7 12.3 0 17l-22.6 22.6c-4.7 4.7-12.3 4.7-17 0L256 295.6l-62.2 62.2c-4.7 4.7-12.3 4.7-17 0l-22.6-22.6c-4.7-4.7-4.7-12.3 0-17l62.2-62.2-62.2-62.2c-4.7-4.7-4.7-12.3 0-17l22.6-22.6c4.7-4.7 12.3-4.7 17 0l62.2 62.2 62.2-62.2c4.7-4.7 12.3-4.7 17 0l22.6 22.6c4.7 4.7 4.7 12.3 0 17z" ></path> </symbol> <symbol id="pdl-complete" viewBox="0 0 512 512"> <path d="M256 8C119.033 8 8 119.033 8 256s111.033 248 248 248 248-111.033 248-248S392.967 8 256 8zm0 48c110.532 0 200 89.451 200 200 0 110.532-89.451 200-200 200-110.532 0-200-89.451-200-200 0-110.532 89.451-200 200-200m140.204 130.267l-22.536-22.718c-4.667-4.705-12.265-4.736-16.97-.068L215.346 303.697l-59.792-60.277c-4.667-4.705-12.265-4.736-16.97-.069l-22.719 22.536c-4.705 4.667-4.736 12.265-.068 16.971l90.781 91.516c4.667 4.705 12.265 4.736 16.97.068l172.589-171.204c4.704-4.668 4.734-12.266.067-16.971z" ></path> </symbol> </svg> `; const iconTypeMap = { init: "#pdl-download", loading: "#pdl-loading", progress: "#pdl-progress", complete: "#pdl-complete", error: "#pdl-error" }; var ThumbnailBtnStatus = /* @__PURE__ */ ((ThumbnailBtnStatus2) => { ThumbnailBtnStatus2["Init"] = "init"; ThumbnailBtnStatus2["Loading"] = "loading"; ThumbnailBtnStatus2["Progress"] = "progress"; ThumbnailBtnStatus2["Complete"] = "complete"; ThumbnailBtnStatus2["Error"] = "error"; return ThumbnailBtnStatus2; })(ThumbnailBtnStatus || {}); var ThumbnailBtnType = /* @__PURE__ */ ((ThumbnailBtnType2) => { ThumbnailBtnType2["Gallery"] = "gallery"; ThumbnailBtnType2["PixivMyBookmark"] = "pixiv-my-bookmark"; ThumbnailBtnType2["PixivHistory"] = "pixiv-history"; ThumbnailBtnType2["PixivPresentation"] = "pixiv-presentation"; ThumbnailBtnType2["PixivToolbar"] = "pixiv-toolbar"; ThumbnailBtnType2["PixivMangaViewer"] = "pixiv-manga-viewer"; ThumbnailBtnType2["DanbooruPool"] = "danbooru-pool"; ThumbnailBtnType2["YandeBrowse"] = "yande-browse"; return ThumbnailBtnType2; })(ThumbnailBtnType || {}); class ThumbnailButton extends HTMLElement { constructor(props) { super(); __publicField(this, "status"); __publicField(this, "mediaId"); __publicField(this, "page"); __publicField(this, "type"); __publicField(this, "onClick"); __publicField(this, "btn"); __publicField(this, "unsubscriber"); __publicField(this, "connectedFlag", false); this.dispatchDownload = this.dispatchDownload.bind(this); this.status = "init"; this.mediaId = this.checkNumberValidity(props.id); props.page !== void 0 && (this.page = this.checkNumberValidity(props.page)); this.type = props.type; this.onClick = props.onClick; this.render(); this.btn = this.shadowRoot.querySelector("button"); } checkNumberValidity(num) { if (typeof num === "string") { if (num !== "") { num = +num; } else { return logger.throw('Invalid argument: can not be "".', RangeError); } } if (num < 0 || !Number.isSafeInteger(num)) { return logger.throw(`Invalid number: ${num}, must be a non-negative integer.`, RangeError); } return num; } static get observedAttributes() { return ["data-id", "data-status", "data-page", "data-type", "disabled"]; } attributeChangedCallback(name, oldValue, newValue) { switch (name) { case "data-id": this.updateId(newValue); break; case "data-status": this.updateIcon(newValue); break; case "data-page": this.updatePage(newValue); break; case "data-type": this.resetType(newValue); break; case "disabled": this.updateDisableStatus(newValue); break; } } resetType(newVal) { if (newVal === null && this.type === void 0) return; if (newVal !== this.type) { if (this.type === void 0) { delete this.dataset.type; } else { this.dataset.type = this.type; } logger.error('Changes to "data-type" is not allowed.'); } } updateId(id) { try { if (id === null) throw new Error('Attribute "data-id" is required.'); this.mediaId = this.checkNumberValidity(id); this.connectedFlag && this.observerDb()(); } catch (error) { logger.error(error); this.dataset.id = String(this.mediaId); } } updateDisableStatus(val) { const btn2 = this.shadowRoot.querySelector("button"); if (typeof val === "string") { btn2.setAttribute("disabled", ""); } else { btn2.removeAttribute("disabled"); } } updatePage(page) { try { if (page === null) { this.page = void 0; } else { this.page = this.checkNumberValidity(page); } this.connectedFlag && this.observerDb()(); } catch (error) { logger.error(error); if (this.page === void 0) { delete this.dataset.page; } else { this.dataset.page = String(this.page); } } } updateIcon(status) { if (status === null) { status = "init"; } else if (status === "init") { delete this.dataset.status; return; } else if (!(status in iconTypeMap)) { this.dataset.status = this.status; return; } const useEl = this.shadowRoot.querySelector("use"); this.status = status; useEl.setAttribute("xlink:href", iconTypeMap[status]); useEl.animate( [ { opacity: 0.5 }, { opactiy: 1 } ], { duration: 200 } ); } render() { const shadowRoot = this.attachShadow({ mode: "open" }); shadowRoot.innerHTML = ` <style>${btnStyle}</style>${svgGroup}<button class="pdl-thumbnail"> <svg xmlns="http://www.w3.org/2000/svg" class="pdl-icon"> <use xlink:href="#pdl-download"></use> </svg> <span></span> </button>`; this.dataset.id = String(this.mediaId); this.type && (this.dataset.type = this.type); this.page !== void 0 && (this.dataset.page = String(this.page)); } dispatchDownload(evt) { evt == null ? void 0 : evt.preventDefault(); evt == null ? void 0 : evt.stopPropagation(); this.setAttribute("disabled", ""); this.setStatus( "loading" /* Loading */ ); Promise.resolve(this.onClick(this)).then( () => { this.setStatus( "complete" /* Complete */ ); }, (err) => { if (err) logger.error(err); this.setStatus( "error" /* Error */ ); } ).finally(() => { this.removeAttribute("disabled"); }); } observerDb() { return historyDb.subscribe(async () => { if (this.type === "danbooru-pool") return; const downloaded = await historyDb.has(this.mediaId, this.page); if (this.status === "complete") { !downloaded && this.setStatus( "init" /* Init */ ); } else { downloaded && this.setStatus( "complete" /* Complete */ ); } }); } connectedCallback() { this.connectedFlag = true; this.btn.addEventListener("click", this.dispatchDownload); this.unsubscriber = this.observerDb(); } disconnectedCallback() { var _a; this.connectedFlag = false; this.btn.removeEventListener("click", this.dispatchDownload); (_a = this.unsubscriber) == null ? void 0 : _a.call(this); } setProgress(progress, updateProgressbar = true) { if (progress < 0 || progress > 100) throw new RangeError('Value "progress" must between 0-100'); const shadowRoot = this.shadowRoot; const span = shadowRoot.querySelector("span"); if (this.status !== "progress") { this.dataset.status = "progress"; span.classList.toggle("show"); } span.textContent = String(Math.floor(progress)); if (!updateProgressbar) return; const svg = shadowRoot.querySelector("svg.pdl-icon"); const radius = 224; const circumference = 2 * Math.PI * radius; const offset = circumference - progress / 100 * circumference; svg.style.strokeDashoffset = String(offset); } removeProgress() { const shadowRoot = this.shadowRoot; const span = shadowRoot.querySelector("span"); const svg = shadowRoot.querySelector("svg.pdl-icon"); span.classList.toggle("show"); span.addEventListener( "transitionend", () => { span.textContent = ""; }, { once: true } ); svg.style.removeProperty("stroke-dashoffset"); if (this.status === "progress") this.dataset.status = "init"; } setStatus(status) { if (status !== this.status) { if (status === "init") { delete this.dataset.status; return; } if (status === "progress") { this.setProgress(0); return; } if (this.status === "progress") { this.removeProgress(); } this.dataset.status = status; } } } customElements.define("pdl-button", ThumbnailButton); class DownloadConfigBuilder { constructor(meta) { this.meta = meta; } normalizeString(str) { return replaceInvalidChar(unescapeHtml(str)); } getFolderPattern() { return config.get("folderPattern"); } getFilenamePattern() { return config.get("filenamePattern"); } getFullpathPattern() { const folder = this.getFolderPattern(); const filename = this.getFilenamePattern() + "." + this.meta.extendName; return folder ? folder + "/" + filename : filename; } isBrowserApi() { return env.isBrowserDownloadMode(); } isFsaEnable() { return downloader.fileSystemAccessEnabled; } supportSubpath() { return this.isBrowserApi() || this.isFsaEnable(); } isImage() { return /bmp|jp(e)?g|png|tif|gif|exif|svg|webp/i.test(this.meta.extendName); } buildFilePath() { const path = this.getFullpathPattern(); const { id, createDate } = this.meta; let { artist, title, tags } = this.meta; artist = this.normalizeString(artist); title = this.normalizeString(title); tags = tags.map((tag) => this.normalizeString(tag)); const replaceDate = (_, p1) => { const format = p1 || "YYYY-MM-DD"; return dayjs(createDate).format(format); }; return path.replaceAll(/\{date\((.*?)\)\}|\{date\}/g, replaceDate).replaceAll("{artist}", artist).replaceAll("{title}", title).replaceAll("{tags}", tags.join("_")).replaceAll("{id}", id); } } function artworkProgressFactory$1(btn2) { if (!btn2) return; return function onArtworkProgress(progress) { btn2.setProgress(progress); }; } class Rule34DownloadConfig extends DownloadConfigBuilder { constructor(meta) { super(meta); this.meta = meta; } getDownloadConfig(btn2) { return { taskId: Math.random().toString(36).slice(2), src: this.meta.src, path: this.buildFilePath(), source: this.meta, timeout: this.isImage() ? 6e4 : void 0, onProgress: artworkProgressFactory$1(btn2) }; } buildFilePath() { const path = super.buildFilePath(); return path.replaceAll("{character}", this.normalizeString(this.meta.character)); } } function addBookmark$2(id) { _unsafeWindow.addFav(id); } async function downloadArtwork$3(btn2) { downloader.dirHandleCheck(); const id = btn2.dataset.id; const mediaMeta = await rule34Parser.parse(id); const { tags, artist, title } = mediaMeta; const downloadConfigs = new Rule34DownloadConfig(mediaMeta).getDownloadConfig(btn2); config.get("addBookmark") && addBookmark$2(id); await downloader.download(downloadConfigs); const historyData = { pid: Number(id), user: artist, title, tags }; historyDb.add(historyData); } const zh = { setting: { save_to: { title: "保存至", label: { directory: "保存位置", filename: "文件名" }, options: { use_fsa: "使用FileSystemAccess API", fsa_directory: "选择保存文件夹", fsa_filename_conflict: "当文件名重复时", tag_language: "使用的标签语言", tag_language_tips: "无翻译的标签仍可能是其他语言" }, button: { choose_fsa_directory: "浏览" }, radio: { filename_conflict_option_uniquify: "重命名", filename_conflict_option_overwrite: "覆盖", filename_conflict_option_prompt: "提示" }, placeholder: { sub_directory_unused: "如不需要保存到子目录,此行留空即可", vm_not_supported: "Violentmonkey不支持", need_browser_api: '请将下载模式设置为"Browser Api"', filename_requried: "必填" } }, ugoira: { title: "动图转换", label: { format: "动图格式", quality: "动图质量" }, options: { select_format: "将动图转换到所选格式", gif_tips: "数值越低颜色越好,但处理速度显著减慢", webm_tips: "0最差,99最好", webp_lossy: "无损转换", webp_quality: "图片质量", webp_quality_tips: "有损:0表示文件最小,100表示文件最大。无损:0最快,但文件较大,100最慢,但质量最好。", webp_method: "压缩方法", webp_method_tips: "0=快,6=慢但效果更好", png_tips: "颜色数量。0:所有颜色(无损PNG)" } }, history: { title: "下载历史", label: { scheduled_backups: "定期备份", export: "导出", import: "导入", clear: "清理" }, options: { scheduled_backups: "以选定的时间间隔自动备份下载历史", export_as_json: "将下载历史导出为JSON文件", export_as_csv: "将下载历史导出为CSV文件", import_json: "导入JSON格式下载历史", clear_history: "清除下载历史" }, button: { export: "导出记录", import: "导入记录", clear: "清除记录" }, select: { backup_interval_never: "不备份", backup_interval_every_day: "每天", backup_interval_every_7_day: "每7天", backup_interval_every_30_day: "每30天" }, text: { confirm_clear_history: "真的要清除历史记录吗?" } }, button_position: { title: "按钮位置", label: { common: "通用", my_bookmark: "我的收藏" }, options: { horizon_position: "水平位置", vertical_position: "垂直位置" } }, others: { title: "其它", options: { show_setting_button: "显示设置按钮", bundle_multipage_illust: "将多页插图打包为zip压缩包", bundle_manga: "将漫画作品打包为zip压缩包", add_bookmark_when_download: "下载单个作品时收藏作品", add_bookmark_with_tags: "收藏时添加作品标签", add_bookmark_private_r18: "将R-18作品收藏到不公开类别" } }, feedback: { title: "反馈 / 赞赏", label: { feedback: "反馈", donate: "赞赏" }, text: { feedback_desc: `如果你在使用中发现了问题或有改进建议,欢迎到<a href="https://github.com/drunkg00se/Pixiv-Downloader/issues" target="_blank" class="anchor">此链接</a>反馈。`, give_me_a_star: '如果脚本有帮助到你,<a href="https://github.com/drunkg00se/Pixiv-Downloader" target="_blank" class="anchor">欢迎点此在GitHub中给我一个 ⭐Star。</a>', donate_desc: "或者,扫码请我喝杯可乐 ^_^" } } }, downloader: { category: { tab_name: "类别", filter: { exclude_downloaded: "排除已下载", download_all_pages: "下载所有页", download_selected_pages: "自定义页数", pixiv_illust: "插画", pixiv_manga: "漫画", pixiv_ugoira: "动图" } }, tag_filter: { tab_name: "标签", placeholder: { blacklist_tag: "黑名单,将排除含有以下标签的作品。", whitelist_tag: "白名单,只下载包含以下标签的作品。" } }, others: { tab_name: "其它", options: { retry_failed: "对首次下载失败的图片进行重试" } }, download_type: { stop: "停止", pixiv_works: "作品", pixiv_bookmark: "收藏", pixiv_bookmark_public: "公开收藏", pixiv_bookmark_private: "不公开收藏", pixiv_follow_latest_all: "全部", pixiv_follow_latest_r18: "R-18" } }, button: { setting: "设置" }, changelog: { feedback: "有问题or想建议?这里反馈", credit: "脚本还行?请点这里支持我!", give_me_a_star: "在GitHub中给我一个 ⭐Star,", buy_me_a_drink: "或者,扫码请我喝杯香草味冰可乐。^_^" } }; const en = { setting: { save_to: { title: "Save To", label: { directory: "Save Path", filename: "Filename" }, options: { use_fsa: "Use FileSystemAccess API", fsa_directory: "Select directory", fsa_filename_conflict: "When filename conflicts", tag_language: "Tag Language", tag_language_tips: "Tags without translation may still be in another language" }, button: { choose_fsa_directory: "Browse" }, radio: { filename_conflict_option_uniquify: "Uniquify", filename_conflict_option_overwrite: "Overwrite", filename_conflict_option_prompt: "Prompt" }, placeholder: { sub_directory_unused: "Leave folder name blank if not saving to a subdirectory", vm_not_supported: "Not supported by Violentmonkey", need_browser_api: "Browser API required", filename_requried: "Required" } }, ugoira: { title: "Ugoira", label: { format: "Ugoira Format", quality: "Ugoira Quality" }, options: { select_format: "Convert Ugoira to selected format", gif_tips: "Lower values produce better colors, but slow processing significantly", webm_tips: "0 (worst) to 99 (best)", webp_lossy: "Lossless Webp", webp_quality: "Image Quality", webp_quality_tips: "For lossy, 0 gives the smallest size and 100 the largest. For lossless, 0 is the fastest but gives larger files compared to the slowest, but best, 100.", webp_method: "Compression Method", webp_method_tips: "Quality/speed trade-off (0=fast, 6=slower-better)", png_tips: "Number of colors in the result; 0: all colors (lossless PNG)" } }, history: { title: "History", label: { scheduled_backups: "Scheduled Backups", export: "Export", import: "Import", clear: "Clear" }, options: { scheduled_backups: "Automatically back up download history at selected intervals.", export_as_json: "Export download history as JSON file", export_as_csv: "Export download history as CSV file", import_json: "Import JSON format download history", clear_history: "Clear download history" }, button: { export: "Export", import: "Import", clear: "Clear" }, select: { backup_interval_never: "Never", backup_interval_every_day: "Every day", backup_interval_every_7_day: "7 days", backup_interval_every_30_day: "30 days" }, text: { confirm_clear_history: "Do you really want to clear history?" } }, button_position: { title: "Button", label: { common: "Common", my_bookmark: "My Bookmark" }, options: { horizon_position: "Horizontal Position", vertical_position: "Vertical Position" } }, others: { title: "Others", options: { show_setting_button: "Show Setting Button", bundle_multipage_illust: "Bundle multipage illustrations into a zip file", bundle_manga: "Bundle manga into a zip file", add_bookmark_when_download: "Bookmark artwork when downloading", add_bookmark_with_tags: "Add tags when bookmarking", add_bookmark_private_r18: "Bookmark R-18 artwork as private" } }, feedback: { title: "Feedback", label: { feedback: "Feedback", donate: "Donate" }, text: { feedback_desc: 'If you encounter any issues or have suggestions for improvements, feel free to provide feedback <a href="https://github.com/drunkg00se/Pixiv-Downloader/issues" target="_blank" class=" anchor">here.</a>', give_me_a_star: 'If the script is helpful to you, please <a href="https://github.com/drunkg00se/Pixiv-Downloader" target="_blank" class="anchor">click here and give me a ⭐Star on GitHub.</a>', donate_desc: "Or, buy me a cola. ^_^" } } }, downloader: { category: { tab_name: "Category", filter: { exclude_downloaded: "Exclude Downloaded", download_all_pages: "All Pages", download_selected_pages: "Custom Pages", pixiv_illust: "Illustration", pixiv_manga: "Manga", pixiv_ugoira: "Ugoira" } }, tag_filter: { tab_name: "Tags", placeholder: { blacklist_tag: "Blacklist: Exclude works with these tags.", whitelist_tag: "Whitelist: Only download works with these tags." } }, others: { tab_name: "others", options: { retry_failed: "Retry failed image downloads." } }, download_type: { stop: "Stop", pixiv_works: "Works", pixiv_bookmark: "Bookmarks", pixiv_bookmark_public: "Public", pixiv_bookmark_private: "Private", pixiv_follow_latest_all: "All", pixiv_follow_latest_r18: "R-18" } }, button: { setting: "Setting" }, changelog: { feedback: "Feedback / Report an issue", credit: "Click here to support me!", give_me_a_star: "Give me a ⭐Star on GitHub.", buy_me_a_drink: "Or, buy me a vanilla-flavored iced cola. ^_^" } }; const messages = { "zh-cn": zh, "zh-tw": zh, zh, en }; const curLang = navigator.language.toLowerCase(); const lang = curLang in messages ? curLang : "en"; function t(key) { const paths = key.split("."); let last2 = messages[lang]; for (let i = 0; i < paths.length; i++) { const value = last2[paths[i]]; if (value === void 0 || value === null) return null; last2 = value; } return last2; } function noop() { } const identity = (x) => x; function assign(tar, src) { for (const k in src) tar[k] = src[k]; return ( /** @type {T & S} */ tar ); } function is_promise(value) { return !!value && (typeof value === "object" || typeof value === "function") && typeof /** @type {any} */ value.then === "function"; } function run(fn) { return fn(); } function blank_object() { return /* @__PURE__ */ Object.create(null); } function run_all(fns) { fns.forEach(run); } function is_function(thing) { return typeof thing === "function"; } function safe_not_equal(a, b) { return a != a ? b == b : a !== b || a && typeof a === "object" || typeof a === "function"; } let src_url_equal_anchor; function src_url_equal(element_src, url2) { if (element_src === url2) return true; if (!src_url_equal_anchor) { src_url_equal_anchor = document.createElement("a"); } src_url_equal_anchor.href = url2; return element_src === src_url_equal_anchor.href; } function is_empty(obj) { return Object.keys(obj).length === 0; } function subscribe(store, ...callbacks) { if (store == null) { for (const callback of callbacks) { callback(void 0); } return noop; } const unsub = store.subscribe(...callbacks); return unsub.unsubscribe ? () => unsub.unsubscribe() : unsub; } function get_store_value(store) { let value; subscribe(store, (_) => value = _)(); return value; } function component_subscribe(component, store, callback) { component.$$.on_destroy.push(subscribe(store, callback)); } function create_slot(definition, ctx, $$scope, fn) { if (definition) { const slot_ctx = get_slot_context(definition, ctx, $$scope, fn); return definition[0](slot_ctx); } } function get_slot_context(definition, ctx, $$scope, fn) { return definition[1] && fn ? assign($$scope.ctx.slice(), definition[1](fn(ctx))) : $$scope.ctx; } function get_slot_changes(definition, $$scope, dirty, fn) { if (definition[2] && fn) { const lets = definition[2](fn(dirty)); if ($$scope.dirty === void 0) { return lets; } if (typeof lets === "object") { const merged = []; const len = Math.max($$scope.dirty.length, lets.length); for (let i = 0; i < len; i += 1) { merged[i] = $$scope.dirty[i] | lets[i]; } return merged; } return $$scope.dirty | lets; } return $$scope.dirty; } function update_slot_base(slot, slot_definition, ctx, $$scope, slot_changes, get_slot_context_fn) { if (slot_changes) { const slot_context = get_slot_context(slot_definition, ctx, $$scope, get_slot_context_fn); slot.p(slot_context, slot_changes); } } function get_all_dirty_from_scope($$scope) { if ($$scope.ctx.length > 32) { const dirty = []; const length = $$scope.ctx.length / 32; for (let i = 0; i < length; i++) { dirty[i] = -1; } return dirty; } return -1; } function exclude_internal_props(props) { const result = {}; for (const k in props) if (k[0] !== "$") result[k] = props[k]; return result; } function compute_rest_props(props, keys) { const rest = {}; keys = new Set(keys); for (const k in props) if (!keys.has(k) && k[0] !== "$") rest[k] = props[k]; return rest; } function compute_slots(slots) { const result = {}; for (const key in slots) { result[key] = true; } return result; } function set_store_value(store, ret, value) { store.set(value); return ret; } function action_destroyer(action_result) { return action_result && is_function(action_result.destroy) ? action_result.destroy : noop; } function split_css_unit(value) { const split = typeof value === "string" && value.match(/^\s*(-?[\d.]+)([^\s]*)\s*$/); return split ? [parseFloat(split[1]), split[2] || "px"] : [ /** @type {number} */ value, "px" ]; } const is_client = typeof window !== "undefined"; let now = is_client ? () => window.performance.now() : () => Date.now(); let raf = is_client ? (cb) => requestAnimationFrame(cb) : noop; const tasks = /* @__PURE__ */ new Set(); function run_tasks(now2) { tasks.forEach((task) => { if (!task.c(now2)) { tasks.delete(task); task.f(); } }); if (tasks.size !== 0) raf(run_tasks); } function loop(callback) { let task; if (tasks.size === 0) raf(run_tasks); return { promise: new Promise((fulfill) => { tasks.add(task = { c: callback, f: fulfill }); }), abort() { tasks.delete(task); } }; } function append(target, node) { target.appendChild(node); } function get_root_for_style(node) { if (!node) return document; const root = node.getRootNode ? node.getRootNode() : node.ownerDocument; if (root && /** @type {ShadowRoot} */ root.host) { return ( /** @type {ShadowRoot} */ root ); } return node.ownerDocument; } function append_empty_stylesheet(node) { const style_element = element("style"); style_element.textContent = "/* empty */"; append_stylesheet(get_root_for_style(node), style_element); return style_element.sheet; } function append_stylesheet(node, style) { append( /** @type {Document} */ node.head || node, style ); return style.sheet; } function insert(target, node, anchor) { target.insertBefore(node, anchor || null); } function detach(node) { if (node.parentNode) { node.parentNode.removeChild(node); } } function destroy_each(iterations, detaching) { for (let i = 0; i < iterations.length; i += 1) { if (iterations[i]) iterations[i].d(detaching); } } function element(name) { return document.createElement(name); } function svg_element(name) { return document.createElementNS("http://www.w3.org/2000/svg", name); } function text(data) { return document.createTextNode(data); } function space() { return text(" "); } function empty() { return text(""); } function listen(node, event, handler, options) { node.addEventListener(event, handler, options); return () => node.removeEventListener(event, handler, options); } function stop_propagation(fn) { return function(event) { event.stopPropagation(); return fn.call(this, event); }; } function attr(node, attribute, value) { if (value == null) node.removeAttribute(attribute); else if (node.getAttribute(attribute) !== value) node.setAttribute(attribute, value); } const always_set_through_set_attribute = ["width", "height"]; function set_attributes(node, attributes) { const descriptors = Object.getOwnPropertyDescriptors(node.__proto__); for (const key in attributes) { if (attributes[key] == null) { node.removeAttribute(key); } else if (key === "style") { node.style.cssText = attributes[key]; } else if (key === "__value") { node.value = node[key] = attributes[key]; } else if (descriptors[key] && descriptors[key].set && always_set_through_set_attribute.indexOf(key) === -1) { node[key] = attributes[key]; } else { attr(node, key, attributes[key]); } } } function get_binding_group_value(group, __value, checked) { const value = /* @__PURE__ */ new Set(); for (let i = 0; i < group.length; i += 1) { if (group[i].checked) value.add(group[i].__value); } if (!checked) { value.delete(__value); } return Array.from(value); } function init_binding_group(group) { let _inputs; return { /* push */ p(...inputs) { _inputs = inputs; _inputs.forEach((input) => group.push(input)); }, /* remove */ r() { _inputs.forEach((input) => group.splice(group.indexOf(input), 1)); } }; } function to_number(value) { return value === "" ? null : +value; } function children(element2) { return Array.from(element2.childNodes); } function set_data(text2, data) { data = "" + data; if (text2.data === data) return; text2.data = /** @type {string} */ data; } function set_input_value(input, value) { input.value = value == null ? "" : value; } function set_style(node, key, value, important) { if (value == null) { node.style.removeProperty(key); } else { node.style.setProperty(key, value, ""); } } function select_option(select, value, mounting) { for (let i = 0; i < select.options.length; i += 1) { const option = select.options[i]; if (option.__value === value) { option.selected = true; return; } } if (!mounting || value !== void 0) { select.selectedIndex = -1; } } function select_options(select, value) { for (let i = 0; i < select.options.length; i += 1) { const option = select.options[i]; option.selected = ~value.indexOf(option.__value); } } function select_value(select) { const selected_option = select.querySelector(":checked"); return selected_option && selected_option.__value; } function select_multiple_value(select) { return [].map.call(select.querySelectorAll(":checked"), (option) => option.__value); } function toggle_class(element2, name, toggle) { element2.classList.toggle(name, !!toggle); } function custom_event(type, detail, { bubbles = false, cancelable = false } = {}) { return new CustomEvent(type, { detail, bubbles, cancelable }); } class HtmlTag { constructor(is_svg = false) { /** * @private * @default false */ __publicField(this, "is_svg", false); /** parent for creating node */ __publicField(this, "e"); /** html tag nodes */ __publicField(this, "n"); /** target */ __publicField(this, "t"); /** anchor */ __publicField(this, "a"); this.is_svg = is_svg; this.e = this.n = null; } /** * @param {string} html * @returns {void} */ c(html) { this.h(html); } /** * @param {string} html * @param {HTMLElement | SVGElement} target * @param {HTMLElement | SVGElement} anchor * @returns {void} */ m(html, target, anchor = null) { if (!this.e) { if (this.is_svg) this.e = svg_element( /** @type {keyof SVGElementTagNameMap} */ target.nodeName ); else this.e = element( /** @type {keyof HTMLElementTagNameMap} */ target.nodeType === 11 ? "TEMPLATE" : target.nodeName ); this.t = target.tagName !== "TEMPLATE" ? target : ( /** @type {HTMLTemplateElement} */ target.content ); this.c(html); } this.i(anchor); } /** * @param {string} html * @returns {void} */ h(html) { this.e.innerHTML = html; this.n = Array.from( this.e.nodeName === "TEMPLATE" ? this.e.content.childNodes : this.e.childNodes ); } /** * @returns {void} */ i(anchor) { for (let i = 0; i < this.n.length; i += 1) { insert(this.t, this.n[i], anchor); } } /** * @param {string} html * @returns {void} */ p(html) { this.d(); this.h(html); this.i(this.a); } /** * @returns {void} */ d() { this.n.forEach(detach); } } function get_custom_elements_slots(element2) { const result = {}; element2.childNodes.forEach( /** @param {Element} node */ (node) => { result[node.slot || "default"] = true; } ); return result; } function construct_svelte_component(component, props) { return new component(props); } const managed_styles = /* @__PURE__ */ new Map(); let active = 0; function hash(str) { let hash2 = 5381; let i = str.length; while (i--) hash2 = (hash2 << 5) - hash2 ^ str.charCodeAt(i); return hash2 >>> 0; } function create_style_information(doc, node) { const info = { stylesheet: append_empty_stylesheet(node), rules: {} }; managed_styles.set(doc, info); return info; } function create_rule(node, a, b, duration, delay, ease, fn, uid = 0) { const step2 = 16.666 / duration; let keyframes = "{\n"; for (let p = 0; p <= 1; p += step2) { const t2 = a + (b - a) * ease(p); keyframes += p * 100 + `%{${fn(t2, 1 - t2)}} `; } const rule = keyframes + `100% {${fn(b, 1 - b)}} }`; const name = `__svelte_${hash(rule)}_${uid}`; const doc = get_root_for_style(node); const { stylesheet, rules } = managed_styles.get(doc) || create_style_information(doc, node); if (!rules[name]) { rules[name] = true; stylesheet.insertRule(`@keyframes ${name} ${rule}`, stylesheet.cssRules.length); } const animation = node.style.animation || ""; node.style.animation = `${animation ? `${animation}, ` : ""}${name} ${duration}ms linear ${delay}ms 1 both`; active += 1; return name; } function delete_rule(node, name) { const previous = (node.style.animation || "").split(", "); const next = previous.filter( name ? (anim) => anim.indexOf(name) < 0 : (anim) => anim.indexOf("__svelte") === -1 // remove all Svelte animations ); const deleted = previous.length - next.length; if (deleted) { node.style.animation = next.join(", "); active -= deleted; if (!active) clear_rules(); } } function clear_rules() { raf(() => { if (active) return; managed_styles.forEach((info) => { const { ownerNode } = info.stylesheet; if (ownerNode) detach(ownerNode); }); managed_styles.clear(); }); } function create_animation(node, from, fn, params) { if (!from) return noop; const to = node.getBoundingClientRect(); if (from.left === to.left && from.right === to.right && from.top === to.top && from.bottom === to.bottom) return noop; const { delay = 0, duration = 300, easing = identity, // @ts-ignore todo: should this be separated from destructuring? Or start/end added to public api and documentation? start: start_time = now() + delay, // @ts-ignore todo: end = start_time + duration, tick: tick2 = noop, css } = fn(node, { from, to }, params); let running = true; let started = false; let name; function start() { if (css) { name = create_rule(node, 0, 1, duration, delay, easing, css); } if (!delay) { started = true; } } function stop() { if (css) delete_rule(node, name); running = false; } loop((now2) => { if (!started && now2 >= start_time) { started = true; } if (started && now2 >= end) { tick2(1, 0); stop(); } if (!running) { return false; } if (started) { const p = now2 - start_time; const t2 = 0 + 1 * easing(p / duration); tick2(t2, 1 - t2); } return true; }); start(); tick2(0, 1); return stop; } function fix_position(node) { const style = getComputedStyle(node); if (style.position !== "absolute" && style.position !== "fixed") { const { width, height } = style; const a = node.getBoundingClientRect(); node.style.position = "absolute"; node.style.width = width; node.style.height = height; add_transform(node, a); } } function add_transform(node, a) { const b = node.getBoundingClientRect(); if (a.left !== b.left || a.top !== b.top) { const style = getComputedStyle(node); const transform = style.transform === "none" ? "" : style.transform; node.style.transform = `${transform} translate(${a.left - b.left}px, ${a.top - b.top}px)`; } } let current_component; function set_current_component(component) { current_component = component; } function get_current_component() { if (!current_component) throw new Error("Function called outside component initialization"); return current_component; } function onMount(fn) { get_current_component().$$.on_mount.push(fn); } function afterUpdate(fn) { get_current_component().$$.after_update.push(fn); } function createEventDispatcher() { const component = get_current_component(); return (type, detail, { cancelable = false } = {}) => { const callbacks = component.$$.callbacks[type]; if (callbacks) { const event = custom_event( /** @type {string} */ type, detail, { cancelable } ); callbacks.slice().forEach((fn) => { fn.call(component, event); }); return !event.defaultPrevented; } return true; }; } function setContext(key, context) { get_current_component().$$.context.set(key, context); return context; } function getContext(key) { return get_current_component().$$.context.get(key); } function bubble(component, event) { const callbacks = component.$$.callbacks[event.type]; if (callbacks) { callbacks.slice().forEach((fn) => fn.call(this, event)); } } const dirty_components = []; const binding_callbacks = []; let render_callbacks = []; const flush_callbacks = []; const resolved_promise = /* @__PURE__ */ Promise.resolve(); let update_scheduled = false; function schedule_update() { if (!update_scheduled) { update_scheduled = true; resolved_promise.then(flush); } } function tick() { schedule_update(); return resolved_promise; } function add_render_callback(fn) { render_callbacks.push(fn); } function add_flush_callback(fn) { flush_callbacks.push(fn); } const seen_callbacks = /* @__PURE__ */ new Set(); let flushidx = 0; function flush() { if (flushidx !== 0) { return; } const saved_component = current_component; do { try { while (flushidx < dirty_components.length) { const component = dirty_components[flushidx]; flushidx++; set_current_component(component); update(component.$$); } } catch (e) { dirty_components.length = 0; flushidx = 0; throw e; } set_current_component(null); dirty_components.length = 0; flushidx = 0; while (binding_callbacks.length) binding_callbacks.pop()(); for (let i = 0; i < render_callbacks.length; i += 1) { const callback = render_callbacks[i]; if (!seen_callbacks.has(callback)) { seen_callbacks.add(callback); callback(); } } render_callbacks.length = 0; } while (dirty_components.length); while (flush_callbacks.length) { flush_callbacks.pop()(); } update_scheduled = false; seen_callbacks.clear(); set_current_component(saved_component); } function update($$) { if ($$.fragment !== null) { $$.update(); run_all($$.before_update); const dirty = $$.dirty; $$.dirty = [-1]; $$.fragment && $$.fragment.p($$.ctx, dirty); $$.after_update.forEach(add_render_callback); } } function flush_render_callbacks(fns) { const filtered = []; const targets = []; render_callbacks.forEach((c) => fns.indexOf(c) === -1 ? filtered.push(c) : targets.push(c)); targets.forEach((c) => c()); render_callbacks = filtered; } let promise; function wait() { if (!promise) { promise = Promise.resolve(); promise.then(() => { promise = null; }); } return promise; } function dispatch(node, direction, kind) { node.dispatchEvent(custom_event(`${direction ? "intro" : "outro"}${kind}`)); } const outroing = /* @__PURE__ */ new Set(); let outros; function group_outros() { outros = { r: 0, c: [], p: outros // parent group }; } function check_outros() { if (!outros.r) { run_all(outros.c); } outros = outros.p; } function transition_in(block, local) { if (block && block.i) { outroing.delete(block); block.i(local); } } function transition_out(block, local, detach2, callback) { if (block && block.o) { if (outroing.has(block)) return; outroing.add(block); outros.c.push(() => { outroing.delete(block); if (callback) { if (detach2) block.d(1); callback(); } }); block.o(local); } else if (callback) { callback(); } } const null_transition = { duration: 0 }; function create_in_transition(node, fn, params) { const options = { direction: "in" }; let config2 = fn(node, params, options); let running = false; let animation_name; let task; let uid = 0; function cleanup() { if (animation_name) delete_rule(node, animation_name); } function go() { const { delay = 0, duration = 300, easing = identity, tick: tick2 = noop, css } = config2 || null_transition; if (css) animation_name = create_rule(node, 0, 1, duration, delay, easing, css, uid++); tick2(0, 1); const start_time = now() + delay; const end_time = start_time + duration; if (task) task.abort(); running = true; add_render_callback(() => dispatch(node, true, "start")); task = loop((now2) => { if (running) { if (now2 >= end_time) { tick2(1, 0); dispatch(node, true, "end"); cleanup(); return running = false; } if (now2 >= start_time) { const t2 = easing((now2 - start_time) / duration); tick2(t2, 1 - t2); } } return running; }); } let started = false; return { start() { if (started) return; started = true; delete_rule(node); if (is_function(config2)) { config2 = config2(options); wait().then(go); } else { go(); } }, invalidate() { started = false; }, end() { if (running) { cleanup(); running = false; } } }; } function create_out_transition(node, fn, params) { const options = { direction: "out" }; let config2 = fn(node, params, options); let running = true; let animation_name; const group = outros; group.r += 1; let original_inert_value; function go() { const { delay = 0, duration = 300, easing = identity, tick: tick2 = noop, css } = config2 || null_transition; if (css) animation_name = create_rule(node, 1, 0, duration, delay, easing, css); const start_time = now() + delay; const end_time = start_time + duration; add_render_callback(() => dispatch(node, false, "start")); if ("inert" in node) { original_inert_value = /** @type {HTMLElement} */ node.inert; node.inert = true; } loop((now2) => { if (running) { if (now2 >= end_time) { tick2(0, 1); dispatch(node, false, "end"); if (!--group.r) { run_all(group.c); } return false; } if (now2 >= start_time) { const t2 = easing((now2 - start_time) / duration); tick2(1 - t2, t2); } } return running; }); } if (is_function(config2)) { wait().then(() => { config2 = config2(options); go(); }); } else { go(); } return { end(reset) { if (reset && "inert" in node) { node.inert = original_inert_value; } if (reset && config2.tick) { config2.tick(1, 0); } if (running) { if (animation_name) delete_rule(node, animation_name); running = false; } } }; } function create_bidirectional_transition(node, fn, params, intro) { const options = { direction: "both" }; let config2 = fn(node, params, options); let t2 = intro ? 0 : 1; let running_program = null; let pending_program = null; let animation_name = null; let original_inert_value; function clear_animation() { if (animation_name) delete_rule(node, animation_name); } function init2(program, duration) { const d = ( /** @type {Program['d']} */ program.b - t2 ); duration *= Math.abs(d); return { a: t2, b: program.b, d, duration, start: program.start, end: program.start + duration, group: program.group }; } function go(b) { const { delay = 0, duration = 300, easing = identity, tick: tick2 = noop, css } = config2 || null_transition; const program = { start: now() + delay, b }; if (!b) { program.group = outros; outros.r += 1; } if ("inert" in node) { if (b) { if (original_inert_value !== void 0) { node.inert = original_inert_value; } } else { original_inert_value = /** @type {HTMLElement} */ node.inert; node.inert = true; } } if (running_program || pending_program) { pending_program = program; } else { if (css) { clear_animation(); animation_name = create_rule(node, t2, b, duration, delay, easing, css); } if (b) tick2(0, 1); running_program = init2(program, duration); add_render_callback(() => dispatch(node, b, "start")); loop((now2) => { if (pending_program && now2 > pending_program.start) { running_program = init2(pending_program, duration); pending_program = null; dispatch(node, running_program.b, "start"); if (css) { clear_animation(); animation_name = create_rule( node, t2, running_program.b, running_program.duration, 0, easing, config2.css ); } } if (running_program) { if (now2 >= running_program.end) { tick2(t2 = running_program.b, 1 - t2); dispatch(node, running_program.b, "end"); if (!pending_program) { if (running_program.b) { clear_animation(); } else { if (!--running_program.group.r) run_all(running_program.group.c); } } running_program = null; } else if (now2 >= running_program.start) { const p = now2 - running_program.start; t2 = running_program.a + running_program.d * easing(p / running_program.duration); tick2(t2, 1 - t2); } } return !!(running_program || pending_program); }); } } return { run(b) { if (is_function(config2)) { wait().then(() => { const opts = { direction: b ? "in" : "out" }; config2 = config2(opts); go(b); }); } else { go(b); } }, end() { clear_animation(); running_program = pending_program = null; } }; } function handle_promise(promise2, info) { const token = info.token = {}; function update2(type, index, key, value) { if (info.token !== token) return; info.resolved = value; let child_ctx = info.ctx; if (key !== void 0) { child_ctx = child_ctx.slice(); child_ctx[key] = value; } const block = type && (info.current = type)(child_ctx); let needs_flush = false; if (info.block) { if (info.blocks) { info.blocks.forEach((block2, i) => { if (i !== index && block2) { group_outros(); transition_out(block2, 1, 1, () => { if (info.blocks[i] === block2) { info.blocks[i] = null; } }); check_outros(); } }); } else { info.block.d(1); } block.c(); transition_in(block, 1); block.m(info.mount(), info.anchor); needs_flush = true; } info.block = block; if (info.blocks) info.blocks[index] = block; if (needs_flush) { flush(); } } if (is_promise(promise2)) { const current_component2 = get_current_component(); promise2.then( (value) => { set_current_component(current_component2); update2(info.then, 1, info.value, value); set_current_component(null); }, (error) => { set_current_component(current_component2); update2(info.catch, 2, info.error, error); set_current_component(null); if (!info.hasCatch) { throw error; } } ); if (info.current !== info.pending) { update2(info.pending, 0); return true; } } else { if (info.current !== info.then) { update2(info.then, 1, info.value, promise2); return true; } info.resolved = /** @type {T} */ promise2; } } function update_await_block_branch(info, ctx, dirty) { const child_ctx = ctx.slice(); const { resolved } = info; if (info.current === info.then) { child_ctx[info.value] = resolved; } if (info.current === info.catch) { child_ctx[info.error] = resolved; } info.block.p(child_ctx, dirty); } function ensure_array_like(array_like_or_iterator) { return (array_like_or_iterator == null ? void 0 : array_like_or_iterator.length) !== void 0 ? array_like_or_iterator : Array.from(array_like_or_iterator); } function outro_and_destroy_block(block, lookup) { transition_out(block, 1, 1, () => { lookup.delete(block.key); }); } function fix_and_outro_and_destroy_block(block, lookup) { block.f(); outro_and_destroy_block(block, lookup); } function update_keyed_each(old_blocks, dirty, get_key, dynamic, ctx, list, lookup, node, destroy, create_each_block2, next, get_context) { let o = old_blocks.length; let n = list.length; let i = o; const old_indexes = {}; while (i--) old_indexes[old_blocks[i].key] = i; const new_blocks = []; const new_lookup = /* @__PURE__ */ new Map(); const deltas = /* @__PURE__ */ new Map(); const updates = []; i = n; while (i--) { const child_ctx = get_context(ctx, list, i); const key = get_key(child_ctx); let block = lookup.get(key); if (!block) { block = create_each_block2(key, child_ctx); block.c(); } else { updates.push(() => block.p(child_ctx, dirty)); } new_lookup.set(key, new_blocks[i] = block); if (key in old_indexes) deltas.set(key, Math.abs(i - old_indexes[key])); } const will_move = /* @__PURE__ */ new Set(); const did_move = /* @__PURE__ */ new Set(); function insert2(block) { transition_in(block, 1); block.m(node, next); lookup.set(block.key, block); next = block.first; n--; } while (o && n) { const new_block = new_blocks[n - 1]; const old_block = old_blocks[o - 1]; const new_key = new_block.key; const old_key = old_block.key; if (new_block === old_block) { next = new_block.first; o--; n--; } else if (!new_lookup.has(old_key)) { destroy(old_block, lookup); o--; } else if (!lookup.has(new_key) || will_move.has(new_key)) { insert2(new_block); } else if (did_move.has(old_key)) { o--; } else if (deltas.get(new_key) > deltas.get(old_key)) { did_move.add(new_key); insert2(new_block); } else { will_move.add(old_key); o--; } } while (o--) { const old_block = old_blocks[o]; if (!new_lookup.has(old_block.key)) destroy(old_block, lookup); } while (n) insert2(new_blocks[n - 1]); run_all(updates); return new_blocks; } function get_spread_update(levels, updates) { const update2 = {}; const to_null_out = {}; const accounted_for = { $$scope: 1 }; let i = levels.length; while (i--) { const o = levels[i]; const n = updates[i]; if (n) { for (const key in o) { if (!(key in n)) to_null_out[key] = 1; } for (const key in n) { if (!accounted_for[key]) { update2[key] = n[key]; accounted_for[key] = 1; } } levels[i] = n; } else { for (const key in o) { accounted_for[key] = 1; } } } for (const key in to_null_out) { if (!(key in update2)) update2[key] = void 0; } return update2; } function get_spread_object(spread_props) { return typeof spread_props === "object" && spread_props !== null ? spread_props : {}; } function bind(component, name, callback) { const index = component.$$.props[name]; if (index !== void 0) { component.$$.bound[index] = callback; callback(component.$$.ctx[index]); } } function create_component(block) { block && block.c(); } function mount_component(component, target, anchor) { const { fragment, after_update } = component.$$; fragment && fragment.m(target, anchor); add_render_callback(() => { const new_on_destroy = component.$$.on_mount.map(run).filter(is_function); if (component.$$.on_destroy) { component.$$.on_destroy.push(...new_on_destroy); } else { run_all(new_on_destroy); } component.$$.on_mount = []; }); after_update.forEach(add_render_callback); } function destroy_component(component, detaching) { const $$ = component.$$; if ($$.fragment !== null) { flush_render_callbacks($$.after_update); run_all($$.on_destroy); $$.fragment && $$.fragment.d(detaching); $$.on_destroy = $$.fragment = null; $$.ctx = []; } } function make_dirty(component, i) { if (component.$$.dirty[0] === -1) { dirty_components.push(component); schedule_update(); component.$$.dirty.fill(0); } component.$$.dirty[i / 31 | 0] |= 1 << i % 31; } function init(component, options, instance2, create_fragment2, not_equal, props, append_styles = null, dirty = [-1]) { const parent_component = current_component; set_current_component(component); const $$ = component.$$ = { fragment: null, ctx: [], // state props, update: noop, not_equal, bound: blank_object(), // lifecycle on_mount: [], on_destroy: [], on_disconnect: [], before_update: [], after_update: [], context: new Map(options.context || (parent_component ? parent_component.$$.context : [])), // everything else callbacks: blank_object(), dirty, skip_bound: false, root: options.target || parent_component.$$.root }; append_styles && append_styles($$.root); let ready = false; $$.ctx = instance2 ? instance2(component, options.props || {}, (i, ret, ...rest) => { const value = rest.length ? rest[0] : ret; if ($$.ctx && not_equal($$.ctx[i], $$.ctx[i] = value)) { if (!$$.skip_bound && $$.bound[i]) $$.bound[i](value); if (ready) make_dirty(component, i); } return ret; }) : []; $$.update(); ready = true; run_all($$.before_update); $$.fragment = create_fragment2 ? create_fragment2($$.ctx) : false; if (options.target) { if (options.hydrate) { const nodes = children(options.target); $$.fragment && $$.fragment.l(nodes); nodes.forEach(detach); } else { $$.fragment && $$.fragment.c(); } if (options.intro) transition_in(component.$$.fragment); mount_component(component, options.target, options.anchor); flush(); } set_current_component(parent_component); } let SvelteElement; if (typeof HTMLElement === "function") { SvelteElement = class extends HTMLElement { constructor($$componentCtor, $$slots, use_shadow_dom) { super(); /** The Svelte component constructor */ __publicField(this, "$$ctor"); /** Slots */ __publicField(this, "$$s"); /** The Svelte component instance */ __publicField(this, "$$c"); /** Whether or not the custom element is connected */ __publicField(this, "$$cn", false); /** Component props data */ __publicField(this, "$$d", {}); /** `true` if currently in the process of reflecting component props back to attributes */ __publicField(this, "$$r", false); /** @type {Record<string, CustomElementPropDefinition>} Props definition (name, reflected, type etc) */ __publicField(this, "$$p_d", {}); /** @type {Record<string, Function[]>} Event listeners */ __publicField(this, "$$l", {}); /** @type {Map<Function, Function>} Event listener unsubscribe functions */ __publicField(this, "$$l_u", /* @__PURE__ */ new Map()); this.$$ctor = $$componentCtor; this.$$s = $$slots; if (use_shadow_dom) { this.attachShadow({ mode: "open" }); } } addEventListener(type, listener, options) { this.$$l[type] = this.$$l[type] || []; this.$$l[type].push(listener); if (this.$$c) { const unsub = this.$$c.$on(type, listener); this.$$l_u.set(listener, unsub); } super.addEventListener(type, listener, options); } removeEventListener(type, listener, options) { super.removeEventListener(type, listener, options); if (this.$$c) { const unsub = this.$$l_u.get(listener); if (unsub) { unsub(); this.$$l_u.delete(listener); } } } async connectedCallback() { this.$$cn = true; if (!this.$$c) { let create_slot2 = function(name) { return () => { let node; const obj = { c: function create() { node = element("slot"); if (name !== "default") { attr(node, "name", name); } }, /** * @param {HTMLElement} target * @param {HTMLElement} [anchor] */ m: function mount(target, anchor) { insert(target, node, anchor); }, d: function destroy(detaching) { if (detaching) { detach(node); } } }; return obj; }; }; await Promise.resolve(); if (!this.$$cn || this.$$c) { return; } const $$slots = {}; const existing_slots = get_custom_elements_slots(this); for (const name of this.$$s) { if (name in existing_slots) { $$slots[name] = [create_slot2(name)]; } } for (const attribute of this.attributes) { const name = this.$$g_p(attribute.name); if (!(name in this.$$d)) { this.$$d[name] = get_custom_element_value(name, attribute.value, this.$$p_d, "toProp"); } } for (const key in this.$$p_d) { if (!(key in this.$$d) && this[key] !== void 0) { this.$$d[key] = this[key]; delete this[key]; } } this.$$c = new this.$$ctor({ target: this.shadowRoot || this, props: { ...this.$$d, $$slots, $$scope: { ctx: [] } } }); const reflect_attributes = () => { this.$$r = true; for (const key in this.$$p_d) { this.$$d[key] = this.$$c.$$.ctx[this.$$c.$$.props[key]]; if (this.$$p_d[key].reflect) { const attribute_value = get_custom_element_value( key, this.$$d[key], this.$$p_d, "toAttribute" ); if (attribute_value == null) { this.removeAttribute(this.$$p_d[key].attribute || key); } else { this.setAttribute(this.$$p_d[key].attribute || key, attribute_value); } } } this.$$r = false; }; this.$$c.$$.after_update.push(reflect_attributes); reflect_attributes(); for (const type in this.$$l) { for (const listener of this.$$l[type]) { const unsub = this.$$c.$on(type, listener); this.$$l_u.set(listener, unsub); } } this.$$l = {}; } } // We don't need this when working within Svelte code, but for compatibility of people using this outside of Svelte // and setting attributes through setAttribute etc, this is helpful attributeChangedCallback(attr2, _oldValue, newValue) { var _a; if (this.$$r) return; attr2 = this.$$g_p(attr2); this.$$d[attr2] = get_custom_element_value(attr2, newValue, this.$$p_d, "toProp"); (_a = this.$$c) == null ? void 0 : _a.$set({ [attr2]: this.$$d[attr2] }); } disconnectedCallback() { this.$$cn = false; Promise.resolve().then(() => { if (!this.$$cn && this.$$c) { this.$$c.$destroy(); this.$$c = void 0; } }); } $$g_p(attribute_name) { return Object.keys(this.$$p_d).find( (key) => this.$$p_d[key].attribute === attribute_name || !this.$$p_d[key].attribute && key.toLowerCase() === attribute_name ) || attribute_name; } }; } function get_custom_element_value(prop, value, props_definition, transform) { var _a; const type = (_a = props_definition[prop]) == null ? void 0 : _a.type; value = type === "Boolean" && typeof value !== "boolean" ? value != null : value; if (!transform || !props_definition[prop]) { return value; } else if (transform === "toAttribute") { switch (type) { case "Object": case "Array": return value == null ? null : JSON.stringify(value); case "Boolean": return value ? "" : null; case "Number": return value == null ? null : value; default: return value; } } else { switch (type) { case "Object": case "Array": return value && JSON.parse(value); case "Boolean": return value; case "Number": return value != null ? +value : value; default: return value; } } } function create_custom_element(Component, props_definition, slots, accessors, use_shadow_dom, extend) { let Class = class extends SvelteElement { constructor() { super(Component, slots, use_shadow_dom); this.$$p_d = props_definition; } static get observedAttributes() { return Object.keys(props_definition).map( (key) => (props_definition[key].attribute || key).toLowerCase() ); } }; Object.keys(props_definition).forEach((prop) => { Object.defineProperty(Class.prototype, prop, { get() { return this.$$c && prop in this.$$c ? this.$$c[prop] : this.$$d[prop]; }, set(value) { var _a; value = get_custom_element_value(prop, value, props_definition); this.$$d[prop] = value; (_a = this.$$c) == null ? void 0 : _a.$set({ [prop]: value }); } }); }); accessors.forEach((accessor) => { Object.defineProperty(Class.prototype, accessor, { get() { var _a; return (_a = this.$$c) == null ? void 0 : _a[accessor]; } }); }); if (extend) { Class = extend(Class); } Component.element = /** @type {any} */ Class; return Class; } class SvelteComponent { constructor() { /** * ### PRIVATE API * * Do not use, may change at any time * * @type {any} */ __publicField(this, "$$"); /** * ### PRIVATE API * * Do not use, may change at any time * * @type {any} */ __publicField(this, "$$set"); } /** @returns {void} */ $destroy() { destroy_component(this, 1); this.$destroy = noop; } /** * @template {Extract<keyof Events, string>} K * @param {K} type * @param {((e: Events[K]) => void) | null | undefined} callback * @returns {() => void} */ $on(type, callback) { if (!is_function(callback)) { return noop; } const callbacks = this.$$.callbacks[type] || (this.$$.callbacks[type] = []); callbacks.push(callback); return () => { const index = callbacks.indexOf(callback); if (index !== -1) callbacks.splice(index, 1); }; } /** * @param {Partial<Props>} props * @returns {void} */ $set(props) { if (this.$$set && !is_empty(props)) { this.$$.skip_bound = true; this.$$set(props); this.$$.skip_bound = false; } } } const PUBLIC_VERSION = "4"; const subscriber_queue = []; function readable(value, start) { return { subscribe: writable(value, start).subscribe }; } function writable(value, start = noop) { let stop; const subscribers = /* @__PURE__ */ new Set(); function set(new_value) { if (safe_not_equal(value, new_value)) { value = new_value; if (stop) { const run_queue = !subscriber_queue.length; for (const subscriber of subscribers) { subscriber[1](); subscriber_queue.push(subscriber, value); } if (run_queue) { for (let i = 0; i < subscriber_queue.length; i += 2) { subscriber_queue[i][0](subscriber_queue[i + 1]); } subscriber_queue.length = 0; } } } } function update2(fn) { set(fn(value)); } function subscribe2(run2, invalidate = noop) { const subscriber = [run2, invalidate]; subscribers.add(subscriber); if (subscribers.size === 1) { stop = start(set, update2) || noop; } run2(value); return () => { subscribers.delete(subscriber); if (subscribers.size === 0 && stop) { stop(); stop = null; } }; } return { set, update: update2, subscribe: subscribe2 }; } function derived(stores2, fn, initial_value) { const single = !Array.isArray(stores2); const stores_array = single ? [stores2] : stores2; if (!stores_array.every(Boolean)) { throw new Error("derived() expects stores as input, got a falsy value"); } const auto = fn.length < 2; return readable(initial_value, (set, update2) => { let started = false; const values = []; let pending = 0; let cleanup = noop; const sync = () => { if (pending) { return; } cleanup(); const result = fn(single ? values[0] : values, set, update2); if (auto) { set(result); } else { cleanup = is_function(result) ? result : noop; } }; const unsubscribers = stores_array.map( (store, i) => subscribe( store, (value) => { values[i] = value; pending &= ~(1 << i); if (started) { sync(); } }, () => { pending |= 1 << i; } ) ); started = true; sync(); return function stop() { run_all(unsubscribers); cleanup(); started = false; }; }); } function readonly(store) { return { subscribe: store.subscribe.bind(store) }; } const defaultData = { selectedFilters: null, blacklistTag: [], whitelistTag: [], downloadAllPages: true, pageStart: 1, pageEnd: 1, retryFailed: false }; const STORAGE_KEY = "pdl-downloader_option"; const saveData = localStorage.getItem(STORAGE_KEY); const storeData = saveData ? JSON.parse(saveData) : defaultData; function storeBuilder(data) { const obj = {}; for (const key in defaultData) { if (!(key in data)) { obj[key] = writable(defaultData[key]); } else { obj[key] = writable(data[key]); } } return obj; } const optionStore = storeBuilder(storeData); const watchStoreData = derived(Object.values(optionStore), (data) => { const obj = {}; Object.keys(optionStore).forEach((key, idx) => { obj[key] = data[idx]; }); return obj; }); watchStoreData.subscribe((val) => { localStorage.setItem(STORAGE_KEY, JSON.stringify(val)); }); function useChannel() { const CHANNEL_NAME = "pdl_batch-download"; const TAB_ID = String(Math.random()); const channel = new BroadcastChannel(CHANNEL_NAME); const queue = []; let downloading = false; let pending = false; let onFullfilled; let onRejected; channel.addEventListener("message", (evt) => { const { data } = evt; switch (data.type) { case 5: logger.info("channel receive: QUERY"); downloading && channel.postMessage({ type: 0, value: null }); break; case 0: logger.info("channel receive: SET_PENDING"); !pending && (pending = true); break; case 1: logger.info("channel receive: SET_IDLE"); pending && (pending = false); break; case 2: logger.info("channel receive: ADD_QUEUE"); downloading && queue.push(data.value); break; case 3: logger.info("channel receive: REMOVE_QUEUE"); if (downloading) { const idx = queue.findIndex((id) => id === data.value); idx !== -1 && queue.splice(idx, 1); } break; case 4: logger.info("channel receive: PROCESS_NEXT", TAB_ID, data.value); if (data.value[0] !== TAB_ID) return; queue.push(...data.value.slice(1)); pending = false; downloading = true; onFullfilled(); break; } }); window.addEventListener("unload", () => { if (pending) { channel.postMessage({ type: 3, value: TAB_ID }); return; } if (downloading) { queue.length ? channel.postMessage({ type: 4, value: queue }) : channel.postMessage({ type: 1, value: null }); } }); channel.postMessage({ type: 5, value: null }); return { async requestDownload() { if (!pending) { downloading = true; channel.postMessage({ type: 0, value: null }); logger.info("channel post: SET_PENDING"); return; } const waitUntilIdle = new Promise((resolve, reject) => { onFullfilled = resolve; onRejected = reject; }); channel.postMessage({ type: 2, value: TAB_ID }); logger.info("channel post: ADD_QUEUE", TAB_ID); return waitUntilIdle; }, cancelDownloadRequest(reason) { if (!pending) return; channel.postMessage({ type: 3, value: TAB_ID }); logger.info("channel post: REMOVE_QUEUE", TAB_ID); onRejected(reason); }, processNextDownload() { if (!downloading) return; downloading = false; if (queue.length) { pending = true; channel.postMessage({ type: 4, value: queue }); queue.length = 0; logger.info("channel post: PROCESS_NEXT"); } else { channel.postMessage({ type: 1, value: null }); logger.info("channel post: SET_IDLE"); } } }; } let useBatchDownload = () => { throw new Error("You need to call `defineBatchDownload` before using `useBatchDownload`."); }; const ERROR_MASKED = "Masked."; function defineBatchDownload(downloaderConfig) { const artworkCount = writable(0); const successd = writable([]); const failed = writable([]); const excluded = writable([]); const downloading = writable(false); const log = writable(); const { requestDownload, cancelDownloadRequest, processNextDownload } = useChannel(); const tasks2 = []; const failedTasks = []; const unavaliableTasks = []; let controller; let downloadCompleted; let downloadAbort; const readonlyStore = { artworkCount: readonly(artworkCount), successd: readonly(successd), failed: readonly(failed), excluded: readonly(excluded), downloading: readonly(downloading), log: readonly(log) }; let $pageStart; let $pageEnd; let $downloadAllPages; let $blacklistTag = []; let $whitelistTag = []; let $retryFailed = false; const includeFilters = []; const excludeFilters = []; const { selectedFilters, blacklistTag, whitelistTag, downloadAllPages, pageStart, pageEnd, retryFailed } = optionStore; const watchPageRange = derived([downloadAllPages, pageStart, pageEnd], (data) => data); watchPageRange.subscribe(([downloadAllPages2, pageStart2, pageEnd2]) => { $downloadAllPages = downloadAllPages2; $pageStart = pageStart2; $pageEnd = pageEnd2; }); selectedFilters.subscribe((selected) => { if (!selected) return; includeFilters.length = 0; excludeFilters.length = 0; selected.forEach((id) => { const filter = downloaderConfig.filterOption.filters.find((filter2) => filter2.id === id); if (filter) { if (filter.type === "include") { includeFilters.push(filter.fn); } else { excludeFilters.push(filter.fn); } } }); }); blacklistTag.subscribe((val) => { $blacklistTag = [...val]; }); whitelistTag.subscribe((val) => { $whitelistTag = [...val]; }); retryFailed.subscribe((val) => { $retryFailed = val; }); const checkIfDownloadCompleted = derived( [artworkCount, successd, failed, excluded], ([$artworkCount, $successd, $failed, $excluded]) => $artworkCount === $successd.length + $failed.length + $excluded.length ); checkIfDownloadCompleted.subscribe((isDone) => { isDone && (downloadCompleted == null ? void 0 : downloadCompleted()); }); function reset() { artworkCount.set(0); successd.set([]); failed.set([]); excluded.set([]); tasks2.length = 0; failedTasks.length = 0; unavaliableTasks.length = 0; controller = null; downloadCompleted = () => { }; downloadAbort = () => { }; writeLog("Info", "Reset store."); } function setDownloading(isDownloading) { downloading.update((val) => { if (val && isDownloading) throw new Error("Already downloading."); return isDownloading; }); } function setArtworkCount(num) { artworkCount.set(num); } function addSuccessd(id) { successd.update((val) => { if (Array.isArray(id)) { val.push(...id); writeLog("Complete", id[id.length - 1]); } else { val.push(id); writeLog("Complete", id); } return val; }); } function addFailed(item) { failed.update((val) => { let id; let reason; if (Array.isArray(item)) { val.push(...item); const lastItem = item[item.length - 1]; id = lastItem.id; reason = lastItem.reason; } else { val.push(item); id = item.id; reason = item.reason; } if (reason instanceof Error || typeof reason === "string") { writeLog("Fail", id, reason); } return val; }); } function addExcluded(id) { excluded.update((val) => { if (Array.isArray(id)) { val.push(...id); writeLog("Info", `${id.length} was excluded...`); } else { val.push(id); writeLog("Info", `${id} was excluded...`); } return val; }); } function writeLog(type, arg, error) { const item = { type, message: "" }; switch (type) { case "Error": if (!(arg instanceof Error)) throw new TypeError("error` is expected to be error, but got " + typeof arg); item.message = `[${arg.name}] ${arg.message}`; break; case "Fail": if (typeof arg !== "string") throw new TypeError("`id` is expected to be string, but got " + typeof arg); typeof error === "string" ? item.message = `[Fail] ${arg}...${error}` : item.message = `[Fail] ${arg}...${error ? error.name + ":" + error.message : ""}`; break; default: item.message = `[${type}] ${arg}`; break; } log.set(item); } function filterTag(partialMeta) { if (!("tags" in partialMeta) || !Array.isArray(partialMeta.tags)) return true; if ($whitelistTag.length) { return $whitelistTag.some((tag) => partialMeta.tags.includes(tag)); } if ($blacklistTag.length) { return !$blacklistTag.some((tag) => partialMeta.tags.includes(tag)); } return true; } async function checkValidity(partialMeta) { try { const { enableTagFilter } = downloaderConfig.filterOption; if (enableTagFilter && !filterTag(partialMeta)) return false; if (!includeFilters.length) return false; for (let i = 0; i < excludeFilters.length; i++) { const fn = excludeFilters[i]; const isExcluded = await fn(partialMeta); if (isExcluded) return false; } for (let i = 0; i < includeFilters.length; i++) { const fn = includeFilters[i]; const isValid = await fn(partialMeta); if (isValid) return true; } } catch (error) { console.error(error); } return false; } async function batchDownload(fnId, ...restArgs) { setDownloading(true); writeLog("Info", "Start download..."); reset(); controller = new AbortController(); const signal = controller.signal; signal.addEventListener( "abort", () => { cancelDownloadRequest(signal.reason); downloadAbort == null ? void 0 : downloadAbort(signal.reason); downloaderConfig.onDownloadAbort(tasks2); }, { once: true } ); let generator; try { generator = getGenerator(fnId, ...restArgs); writeLog("Info", "Waiting for other downloads to finish..."); await requestDownload(); await dispatchDownload(generator, signal); if ($retryFailed && failedTasks.length) { writeLog("Info", "Retry..."); generator = retryGenerator( get_store_value(artworkCount), failedTasks.slice(), unavaliableTasks.slice() ); failedTasks.length = 0; unavaliableTasks.length = 0; failed.set([]); await dispatchDownload(generator, signal); } writeLog("Info", "Download complete."); } catch (error) { logger.error(error); generator == null ? void 0 : generator.return(); if (!signal.aborted) { controller.abort(error); } if (error instanceof Error) { writeLog("Error", error); } } setDownloading(false); processNextDownload(); } function getGenerator(fnId, ...restArgs) { let genFn; let generator; const pageConfig = downloaderConfig.pageMatch.find((pageItem) => { const { genPageId } = pageItem; if (Array.isArray(genPageId)) { const item = genPageId.find((item2) => item2.id === fnId); if (item) { genFn = item.fn; return true; } } else { if (genPageId.id === fnId) { genFn = genPageId.fn; return true; } } return false; }); if (!pageConfig || !genFn) throw new Error("Invalid generator id: " + fnId); if (!$downloadAllPages && $pageEnd < $pageStart) throw new Error("End page must not be less than the start page."); const pageRange = $downloadAllPages ? null : [$pageStart, $pageEnd]; const { filterWhenGenerateIngPage } = downloaderConfig.filterOption; if (filterWhenGenerateIngPage) { generator = genFn(pageRange, checkValidity, ...restArgs); } else { generator = genFn(pageRange, ...restArgs); } return generator; } function* retryGenerator(total, failedArtworks, unavaliableTasks2) { yield { total, page: 0, avaliable: failedArtworks, invalid: [], unavaliable: unavaliableTasks2 }; } async function dispatchDownload(generator, signal) { signal.throwIfAborted(); const waitUntilDownloadComplete = new Promise((resolve, reject) => { downloadCompleted = resolve; downloadAbort = reject; }); const THRESHOLD = 5; const { parseMetaByArtworkId, downloadByArtworkId } = downloaderConfig; const { filterWhenGenerateIngPage } = downloaderConfig.filterOption; const dlPromise = []; let result; let status429 = false; const failedHanlderFactory = (id) => { return (reason) => { if (signal.aborted) return; addFailed({ id, reason }); reason && logger.error(reason); reason !== ERROR_MASKED && failedTasks.push(id); if (reason instanceof RequestError && reason.status === 429) { status429 = true; } }; }; while ((result = await Promise.race([generator.next(), waitUntilDownloadComplete])) && !result.done) { const { total, avaliable, invalid, unavaliable } = result.value; logger.info(total, avaliable, invalid, unavaliable); signal.throwIfAborted(); setArtworkCount(total); invalid.length && addExcluded(invalid); if (unavaliable.length) { addFailed(unavaliable.map((id) => ({ id, reason: ERROR_MASKED }))); unavaliableTasks.push(...unavaliable); } if (!avaliable.length) await Promise.race([sleep(1500), waitUntilDownloadComplete]); for (const id of avaliable) { if (status429) { writeLog("Error", new Error("Http status: 429, wait for 30 seconds.")); await Promise.race([sleep(3e4), waitUntilDownloadComplete]); status429 = false; } const artworkMeta = await parseMetaByArtworkId(id).catch(failedHanlderFactory(id)); signal.throwIfAborted(); if (!artworkMeta) continue; if (!filterWhenGenerateIngPage) { const isValid = await checkValidity(artworkMeta); if (!isValid) { addExcluded(id); continue; } } writeLog("Add", id); const taskId = generateTaskID(id); const processDownload = downloadByArtworkId(artworkMeta, taskId).then(function handleSucccess() { !signal.aborted && addSuccessd(id); }, failedHanlderFactory(id)).finally(function removeTask() { const idx = tasks2.findIndex((storeId) => storeId === id); idx !== -1 && tasks2.splice(idx, 1); }); tasks2.push(taskId); dlPromise.push(processDownload); if (dlPromise.length >= THRESHOLD) { await Promise.race([...dlPromise, waitUntilDownloadComplete]); dlPromise.length = 0; } else { await Promise.race([sleep(1e3), waitUntilDownloadComplete]); } } } return waitUntilDownloadComplete; } function abort() { controller && controller.abort(new CancelError()); } function generateTaskID(id) { return id + "_" + Math.random().toString(36).slice(2); } useBatchDownload = () => { return { ...readonlyStore, batchDownload, abort }; }; } if (typeof window !== "undefined") (window.__svelte || (window.__svelte = { v: /* @__PURE__ */ new Set() })).v.add(PUBLIC_VERSION); const DRAWER_STORE_KEY = "drawerStore"; function initializeDrawerStore() { const drawerStore = drawerService(); return setContext(DRAWER_STORE_KEY, drawerStore); } function drawerService() { const { subscribe: subscribe2, set, update: update2 } = writable({}); return { subscribe: subscribe2, set, update: update2, /** Open the drawer. */ open: (newSettings) => update2(() => { return { open: true, ...newSettings }; }), /** Close the drawer. */ close: () => update2((d) => { d.open = false; return d; }) }; } const MODAL_STORE_KEY = "modalStore"; function getModalStore() { const modalStore = getContext(MODAL_STORE_KEY); if (!modalStore) throw new Error("modalStore is not initialized. Please ensure that `initializeStores()` is invoked in the root layout file of this app!"); return modalStore; } function initializeModalStore() { const modalStore = modalService(); return setContext(MODAL_STORE_KEY, modalStore); } function modalService() { const { subscribe: subscribe2, set, update: update2 } = writable([]); return { subscribe: subscribe2, set, update: update2, /** Append to end of queue. */ trigger: (modal) => update2((mStore) => { mStore.push(modal); return mStore; }), /** Remove first item in queue. */ close: () => update2((mStore) => { if (mStore.length > 0) mStore.shift(); return mStore; }), /** Remove all items from queue. */ clear: () => set([]) }; } const toastDefaults = { message: "Missing Toast Message", autohide: true, timeout: 5e3 }; const TOAST_STORE_KEY = "toastStore"; function initializeToastStore() { const toastStore = toastService(); return setContext(TOAST_STORE_KEY, toastStore); } function randomUUID() { const random = Math.random(); return Number(random).toString(32); } function toastService() { const { subscribe: subscribe2, set, update: update2 } = writable([]); const close = (id) => update2((tStore) => { if (tStore.length > 0) { const index = tStore.findIndex((t2) => t2.id === id); const selectedToast = tStore[index]; if (selectedToast) { if (selectedToast.callback) selectedToast.callback({ id, status: "closed" }); if (selectedToast.timeoutId) clearTimeout(selectedToast.timeoutId); tStore.splice(index, 1); } } return tStore; }); function handleAutoHide(toast) { if (toast.autohide === true) { return setTimeout(() => { close(toast.id); }, toast.timeout); } } return { subscribe: subscribe2, close, /** Add a new toast to the queue. */ trigger: (toast) => { const id = randomUUID(); update2((tStore) => { if (toast && toast.callback) toast.callback({ id, status: "queued" }); if (toast.hideDismiss) toast.autohide = true; const tMerged = { ...toastDefaults, ...toast, id }; tMerged.timeoutId = handleAutoHide(tMerged); tStore.push(tMerged); return tStore; }); return id; }, /** Remain visible on hover */ freeze: (index) => update2((tStore) => { if (tStore.length > 0) clearTimeout(tStore[index].timeoutId); return tStore; }), /** Cancel remain visible on leave */ unfreeze: (index) => update2((tStore) => { if (tStore.length > 0) tStore[index].timeoutId = handleAutoHide(tStore[index]); return tStore; }), /** Remove all toasts from queue */ clear: () => set([]) }; } function initializeStores() { initializeModalStore(); initializeToastStore(); initializeDrawerStore(); } const stores = {}; function getStorage(type) { return type === "local" ? localStorage : sessionStorage; } function localStorageStore(key, initialValue, options) { const serializer = JSON; const storageType = "local"; function updateStorage(key2, value) { getStorage(storageType).setItem(key2, serializer.stringify(value)); } if (!stores[key]) { const store = writable(initialValue, (set2) => { const json = getStorage(storageType).getItem(key); if (json) { set2(serializer.parse(json)); } { const handleStorage = (event) => { if (event.key === key) set2(event.newValue ? serializer.parse(event.newValue) : null); }; window.addEventListener("storage", handleStorage); return () => window.removeEventListener("storage", handleStorage); } }); const { subscribe: subscribe2, set } = store; stores[key] = { set(value) { updateStorage(key, value); set(value); }, update(updater) { const value = updater(get_store_value(store)); updateStorage(key, value); set(value); }, subscribe: subscribe2 }; } return stores[key]; } localStorageStore("modeOsPrefers", false); localStorageStore("modeUserPrefers", void 0); localStorageStore("modeCurrent", false); const reducedMotionQuery = "(prefers-reduced-motion: reduce)"; function prefersReducedMotion() { return window.matchMedia(reducedMotionQuery).matches; } const prefersReducedMotionStore = readable(prefersReducedMotion(), (set) => { { const setReducedMotion = (event) => { set(event.matches); }; const mediaQueryList = window.matchMedia(reducedMotionQuery); mediaQueryList.addEventListener("change", setReducedMotion); return () => { mediaQueryList.removeEventListener("change", setReducedMotion); }; } }); function focusTrap(node, enabled) { const elemWhitelist = 'a[href]:not([tabindex="-1"]), button:not([tabindex="-1"]), input:not([tabindex="-1"]), textarea:not([tabindex="-1"]), select:not([tabindex="-1"]), details:not([tabindex="-1"]), [tabindex]:not([tabindex="-1"])'; let elemFirst; let elemLast; function onFirstElemKeydown(e) { if (e.shiftKey && e.code === "Tab") { e.preventDefault(); elemLast.focus(); } } function onLastElemKeydown(e) { if (!e.shiftKey && e.code === "Tab") { e.preventDefault(); elemFirst.focus(); } } const sortByTabIndex = (focusableElems) => { return focusableElems.filter((elem) => elem.tabIndex >= 0).sort((a, b) => { if (a.tabIndex === 0 && b.tabIndex > 0) return 1; else if (a.tabIndex > 0 && b.tabIndex === 0) return -1; else return a.tabIndex - b.tabIndex; }); }; const getFocusTrapTarget = (elemFirst2) => { const focusindexElements = [...node.querySelectorAll("[data-focusindex]")]; if (!focusindexElements || focusindexElements.length === 0) return elemFirst2; return focusindexElements.sort((a, b) => { return +a.dataset.focusindex - +b.dataset.focusindex; })[0] || elemFirst2; }; const onScanElements = (fromObserver) => { if (enabled === false) return; const focusableElems = sortByTabIndex(Array.from(node.querySelectorAll(elemWhitelist))); if (focusableElems.length) { elemFirst = focusableElems[0]; elemLast = focusableElems[focusableElems.length - 1]; if (!fromObserver) getFocusTrapTarget(elemFirst).focus(); elemFirst.addEventListener("keydown", onFirstElemKeydown); elemLast.addEventListener("keydown", onLastElemKeydown); } }; onScanElements(false); function onCleanUp() { if (elemFirst) elemFirst.removeEventListener("keydown", onFirstElemKeydown); if (elemLast) elemLast.removeEventListener("keydown", onLastElemKeydown); } const onObservationChange = (mutationRecords, observer3) => { if (mutationRecords.length) { onCleanUp(); onScanElements(true); } return observer3; }; const observer2 = new MutationObserver(onObservationChange); observer2.observe(node, { childList: true, subtree: true }); return { update(newArgs) { enabled = newArgs; newArgs ? onScanElements(false) : onCleanUp(); }, destroy() { onCleanUp(); observer2.disconnect(); } }; } function cubicOut(t2) { const f = t2 - 1; return f * f * f + 1; } function fade(node, { delay = 0, duration = 400, easing = identity } = {}) { const o = +getComputedStyle(node).opacity; return { delay, duration, easing, css: (t2) => `opacity: ${t2 * o}` }; } function fly(node, { delay = 0, duration = 400, easing = cubicOut, x = 0, y = 0, opacity = 0 } = {}) { const style = getComputedStyle(node); const target_opacity = +style.opacity; const transform = style.transform === "none" ? "" : style.transform; const od = target_opacity * (1 - opacity); const [xValue, xUnit] = split_css_unit(x); const [yValue, yUnit] = split_css_unit(y); return { delay, duration, easing, css: (t2, u) => ` transform: ${transform} translate(${(1 - t2) * xValue}${xUnit}, ${(1 - t2) * yValue}${yUnit}); opacity: ${target_opacity - od * u}` }; } function slide(node, { delay = 0, duration = 400, easing = cubicOut, axis = "y" } = {}) { const style = getComputedStyle(node); const opacity = +style.opacity; const primary_property = axis === "y" ? "height" : "width"; const primary_property_value = parseFloat(style[primary_property]); const secondary_properties = axis === "y" ? ["top", "bottom"] : ["left", "right"]; const capitalized_secondary_properties = secondary_properties.map( (e) => `${e[0].toUpperCase()}${e.slice(1)}` ); const padding_start_value = parseFloat(style[`padding${capitalized_secondary_properties[0]}`]); const padding_end_value = parseFloat(style[`padding${capitalized_secondary_properties[1]}`]); const margin_start_value = parseFloat(style[`margin${capitalized_secondary_properties[0]}`]); const margin_end_value = parseFloat(style[`margin${capitalized_secondary_properties[1]}`]); const border_width_start_value = parseFloat( style[`border${capitalized_secondary_properties[0]}Width`] ); const border_width_end_value = parseFloat( style[`border${capitalized_secondary_properties[1]}Width`] ); return { delay, duration, easing, css: (t2) => `overflow: hidden;opacity: ${Math.min(t2 * 20, 1) * opacity};${primary_property}: ${t2 * primary_property_value}px;padding-${secondary_properties[0]}: ${t2 * padding_start_value}px;padding-${secondary_properties[1]}: ${t2 * padding_end_value}px;margin-${secondary_properties[0]}: ${t2 * margin_start_value}px;margin-${secondary_properties[1]}: ${t2 * margin_end_value}px;border-${secondary_properties[0]}-width: ${t2 * border_width_start_value}px;border-${secondary_properties[1]}-width: ${t2 * border_width_end_value}px;` }; } function scale(node, { delay = 0, duration = 400, easing = cubicOut, start = 0, opacity = 0 } = {}) { const style = getComputedStyle(node); const target_opacity = +style.opacity; const transform = style.transform === "none" ? "" : style.transform; const sd = 1 - start; const od = target_opacity * (1 - opacity); return { delay, duration, easing, css: (_t, u) => ` transform: ${transform} scale(${1 - sd * u}); opacity: ${target_opacity - od * u} ` }; } function dynamicTransition(node, dynParams) { const { transition, params, enabled } = dynParams; if (enabled) return transition(node, params); if ("duration" in params) return transition(node, { duration: 0 }); return { duration: 0 }; } const get_headline_slot_changes = (dirty) => ({}); const get_headline_slot_context = (ctx) => ({}); const get_trail_slot_changes$2 = (dirty) => ({}); const get_trail_slot_context$2 = (ctx) => ({}); const get_lead_slot_changes$2 = (dirty) => ({}); const get_lead_slot_context$2 = (ctx) => ({}); function create_if_block_2$7(ctx) { let div; let div_class_value; let current; const lead_slot_template = ( /*#slots*/ ctx[22].lead ); const lead_slot = create_slot( lead_slot_template, ctx, /*$$scope*/ ctx[21], get_lead_slot_context$2 ); return { c() { div = element("div"); if (lead_slot) lead_slot.c(); attr(div, "class", div_class_value = "app-bar-slot-lead " + /*classesSlotLead*/ ctx[4]); }, m(target, anchor) { insert(target, div, anchor); if (lead_slot) { lead_slot.m(div, null); } current = true; }, p(ctx2, dirty) { if (lead_slot) { if (lead_slot.p && (!current || dirty & /*$$scope*/ 2097152)) { update_slot_base( lead_slot, lead_slot_template, ctx2, /*$$scope*/ ctx2[21], !current ? get_all_dirty_from_scope( /*$$scope*/ ctx2[21] ) : get_slot_changes( lead_slot_template, /*$$scope*/ ctx2[21], dirty, get_lead_slot_changes$2 ), get_lead_slot_context$2 ); } } if (!current || dirty & /*classesSlotLead*/ 16 && div_class_value !== (div_class_value = "app-bar-slot-lead " + /*classesSlotLead*/ ctx2[4])) { attr(div, "class", div_class_value); } }, i(local) { if (current) return; transition_in(lead_slot, local); current = true; }, o(local) { transition_out(lead_slot, local); current = false; }, d(detaching) { if (detaching) { detach(div); } if (lead_slot) lead_slot.d(detaching); } }; } function create_if_block_1$9(ctx) { let div; let div_class_value; let current; const trail_slot_template = ( /*#slots*/ ctx[22].trail ); const trail_slot = create_slot( trail_slot_template, ctx, /*$$scope*/ ctx[21], get_trail_slot_context$2 ); return { c() { div = element("div"); if (trail_slot) trail_slot.c(); attr(div, "class", div_class_value = "app-bar-slot-trail " + /*classesSlotTrail*/ ctx[2]); }, m(target, anchor) { insert(target, div, anchor); if (trail_slot) { trail_slot.m(div, null); } current = true; }, p(ctx2, dirty) { if (trail_slot) { if (trail_slot.p && (!current || dirty & /*$$scope*/ 2097152)) { update_slot_base( trail_slot, trail_slot_template, ctx2, /*$$scope*/ ctx2[21], !current ? get_all_dirty_from_scope( /*$$scope*/ ctx2[21] ) : get_slot_changes( trail_slot_template, /*$$scope*/ ctx2[21], dirty, get_trail_slot_changes$2 ), get_trail_slot_context$2 ); } } if (!current || dirty & /*classesSlotTrail*/ 4 && div_class_value !== (div_class_value = "app-bar-slot-trail " + /*classesSlotTrail*/ ctx2[2])) { attr(div, "class", div_class_value); } }, i(local) { if (current) return; transition_in(trail_slot, local); current = true; }, o(local) { transition_out(trail_slot, local); current = false; }, d(detaching) { if (detaching) { detach(div); } if (trail_slot) trail_slot.d(detaching); } }; } function create_if_block$g(ctx) { let div; let div_class_value; let current; const headline_slot_template = ( /*#slots*/ ctx[22].headline ); const headline_slot = create_slot( headline_slot_template, ctx, /*$$scope*/ ctx[21], get_headline_slot_context ); return { c() { div = element("div"); if (headline_slot) headline_slot.c(); attr(div, "class", div_class_value = "app-bar-row-headline " + /*classesRowHeadline*/ ctx[5]); }, m(target, anchor) { insert(target, div, anchor); if (headline_slot) { headline_slot.m(div, null); } current = true; }, p(ctx2, dirty) { if (headline_slot) { if (headline_slot.p && (!current || dirty & /*$$scope*/ 2097152)) { update_slot_base( headline_slot, headline_slot_template, ctx2, /*$$scope*/ ctx2[21], !current ? get_all_dirty_from_scope( /*$$scope*/ ctx2[21] ) : get_slot_changes( headline_slot_template, /*$$scope*/ ctx2[21], dirty, get_headline_slot_changes ), get_headline_slot_context ); } } if (!current || dirty & /*classesRowHeadline*/ 32 && div_class_value !== (div_class_value = "app-bar-row-headline " + /*classesRowHeadline*/ ctx2[5])) { attr(div, "class", div_class_value); } }, i(local) { if (current) return; transition_in(headline_slot, local); current = true; }, o(local) { transition_out(headline_slot, local); current = false; }, d(detaching) { if (detaching) { detach(div); } if (headline_slot) headline_slot.d(detaching); } }; } function create_fragment$o(ctx) { let div2; let div1; let t0; let div0; let div0_class_value; let t1; let div1_class_value; let t2; let div2_class_value; let current; let if_block0 = ( /*$$slots*/ ctx[8].lead && create_if_block_2$7(ctx) ); const default_slot_template = ( /*#slots*/ ctx[22].default ); const default_slot = create_slot( default_slot_template, ctx, /*$$scope*/ ctx[21], null ); let if_block1 = ( /*$$slots*/ ctx[8].trail && create_if_block_1$9(ctx) ); let if_block2 = ( /*$$slots*/ ctx[8].headline && create_if_block$g(ctx) ); return { c() { div2 = element("div"); div1 = element("div"); if (if_block0) if_block0.c(); t0 = space(); div0 = element("div"); if (default_slot) default_slot.c(); t1 = space(); if (if_block1) if_block1.c(); t2 = space(); if (if_block2) if_block2.c(); attr(div0, "class", div0_class_value = "app-bar-slot-default " + /*classesSlotDefault*/ ctx[3]); attr(div1, "class", div1_class_value = "app-bar-row-main " + /*classesRowMain*/ ctx[6]); attr(div2, "class", div2_class_value = "app-bar " + /*classesBase*/ ctx[7]); attr(div2, "data-testid", "app-bar"); attr(div2, "role", "toolbar"); attr( div2, "aria-label", /*label*/ ctx[0] ); attr( div2, "aria-labelledby", /*labelledby*/ ctx[1] ); }, m(target, anchor) { insert(target, div2, anchor); append(div2, div1); if (if_block0) if_block0.m(div1, null); append(div1, t0); append(div1, div0); if (default_slot) { default_slot.m(div0, null); } append(div1, t1); if (if_block1) if_block1.m(div1, null); append(div2, t2); if (if_block2) if_block2.m(div2, null); current = true; }, p(ctx2, [dirty]) { if ( /*$$slots*/ ctx2[8].lead ) { if (if_block0) { if_block0.p(ctx2, dirty); if (dirty & /*$$slots*/ 256) { transition_in(if_block0, 1); } } else { if_block0 = create_if_block_2$7(ctx2); if_block0.c(); transition_in(if_block0, 1); if_block0.m(div1, t0); } } else if (if_block0) { group_outros(); transition_out(if_block0, 1, 1, () => { if_block0 = null; }); check_outros(); } if (default_slot) { if (default_slot.p && (!current || dirty & /*$$scope*/ 2097152)) { update_slot_base( default_slot, default_slot_template, ctx2, /*$$scope*/ ctx2[21], !current ? get_all_dirty_from_scope( /*$$scope*/ ctx2[21] ) : get_slot_changes( default_slot_template, /*$$scope*/ ctx2[21], dirty, null ), null ); } } if (!current || dirty & /*classesSlotDefault*/ 8 && div0_class_value !== (div0_class_value = "app-bar-slot-default " + /*classesSlotDefault*/ ctx2[3])) { attr(div0, "class", div0_class_value); } if ( /*$$slots*/ ctx2[8].trail ) { if (if_block1) { if_block1.p(ctx2, dirty); if (dirty & /*$$slots*/ 256) { transition_in(if_block1, 1); } } else { if_block1 = create_if_block_1$9(ctx2); if_block1.c(); transition_in(if_block1, 1); if_block1.m(div1, null); } } else if (if_block1) { group_outros(); transition_out(if_block1, 1, 1, () => { if_block1 = null; }); check_outros(); } if (!current || dirty & /*classesRowMain*/ 64 && div1_class_value !== (div1_class_value = "app-bar-row-main " + /*classesRowMain*/ ctx2[6])) { attr(div1, "class", div1_class_value); } if ( /*$$slots*/ ctx2[8].headline ) { if (if_block2) { if_block2.p(ctx2, dirty); if (dirty & /*$$slots*/ 256) { transition_in(if_block2, 1); } } else { if_block2 = create_if_block$g(ctx2); if_block2.c(); transition_in(if_block2, 1); if_block2.m(div2, null); } } else if (if_block2) { group_outros(); transition_out(if_block2, 1, 1, () => { if_block2 = null; }); check_outros(); } if (!current || dirty & /*classesBase*/ 128 && div2_class_value !== (div2_class_value = "app-bar " + /*classesBase*/ ctx2[7])) { attr(div2, "class", div2_class_value); } if (!current || dirty & /*label*/ 1) { attr( div2, "aria-label", /*label*/ ctx2[0] ); } if (!current || dirty & /*labelledby*/ 2) { attr( div2, "aria-labelledby", /*labelledby*/ ctx2[1] ); } }, i(local) { if (current) return; transition_in(if_block0); transition_in(default_slot, local); transition_in(if_block1); transition_in(if_block2); current = true; }, o(local) { transition_out(if_block0); transition_out(default_slot, local); transition_out(if_block1); transition_out(if_block2); current = false; }, d(detaching) { if (detaching) { detach(div2); } if (if_block0) if_block0.d(); if (default_slot) default_slot.d(detaching); if (if_block1) if_block1.d(); if (if_block2) if_block2.d(); } }; } const cBase$a = "flex flex-col"; const cRowMain = "grid items-center"; const cRowHeadline = ""; const cSlotLead = "flex-none flex justify-between items-center"; const cSlotDefault = "flex-auto"; const cSlotTrail = "flex-none flex items-center space-x-4"; function instance$o($$self, $$props, $$invalidate) { let classesBase; let classesRowMain; let classesRowHeadline; let classesSlotLead; let classesSlotDefault; let classesSlotTrail; let { $$slots: slots = {}, $$scope } = $$props; const $$slots = compute_slots(slots); let { background = "bg-surface-100-800-token" } = $$props; let { border = "" } = $$props; let { padding = "p-4" } = $$props; let { shadow = "" } = $$props; let { spacing = "space-y-4" } = $$props; let { gridColumns = "grid-cols-[auto_1fr_auto]" } = $$props; let { gap = "gap-4" } = $$props; let { regionRowMain = "" } = $$props; let { regionRowHeadline = "" } = $$props; let { slotLead = "" } = $$props; let { slotDefault = "" } = $$props; let { slotTrail = "" } = $$props; let { label = "" } = $$props; let { labelledby = "" } = $$props; $$self.$$set = ($$new_props) => { $$invalidate(23, $$props = assign(assign({}, $$props), exclude_internal_props($$new_props))); if ("background" in $$new_props) $$invalidate(9, background = $$new_props.background); if ("border" in $$new_props) $$invalidate(10, border = $$new_props.border); if ("padding" in $$new_props) $$invalidate(11, padding = $$new_props.padding); if ("shadow" in $$new_props) $$invalidate(12, shadow = $$new_props.shadow); if ("spacing" in $$new_props) $$invalidate(13, spacing = $$new_props.spacing); if ("gridColumns" in $$new_props) $$invalidate(14, gridColumns = $$new_props.gridColumns); if ("gap" in $$new_props) $$invalidate(15, gap = $$new_props.gap); if ("regionRowMain" in $$new_props) $$invalidate(16, regionRowMain = $$new_props.regionRowMain); if ("regionRowHeadline" in $$new_props) $$invalidate(17, regionRowHeadline = $$new_props.regionRowHeadline); if ("slotLead" in $$new_props) $$invalidate(18, slotLead = $$new_props.slotLead); if ("slotDefault" in $$new_props) $$invalidate(19, slotDefault = $$new_props.slotDefault); if ("slotTrail" in $$new_props) $$invalidate(20, slotTrail = $$new_props.slotTrail); if ("label" in $$new_props) $$invalidate(0, label = $$new_props.label); if ("labelledby" in $$new_props) $$invalidate(1, labelledby = $$new_props.labelledby); if ("$$scope" in $$new_props) $$invalidate(21, $$scope = $$new_props.$$scope); }; $$self.$$.update = () => { $$invalidate(7, classesBase = `${cBase$a} ${background} ${border} ${spacing} ${padding} ${shadow} ${$$props.class ?? ""}`); if ($$self.$$.dirty & /*gridColumns, gap, regionRowMain*/ 114688) { $$invalidate(6, classesRowMain = `${cRowMain} ${gridColumns} ${gap} ${regionRowMain}`); } if ($$self.$$.dirty & /*regionRowHeadline*/ 131072) { $$invalidate(5, classesRowHeadline = `${cRowHeadline} ${regionRowHeadline}`); } if ($$self.$$.dirty & /*slotLead*/ 262144) { $$invalidate(4, classesSlotLead = `${cSlotLead} ${slotLead}`); } if ($$self.$$.dirty & /*slotDefault*/ 524288) { $$invalidate(3, classesSlotDefault = `${cSlotDefault} ${slotDefault}`); } if ($$self.$$.dirty & /*slotTrail*/ 1048576) { $$invalidate(2, classesSlotTrail = `${cSlotTrail} ${slotTrail}`); } }; $$props = exclude_internal_props($$props); return [ label, labelledby, classesSlotTrail, classesSlotDefault, classesSlotLead, classesRowHeadline, classesRowMain, classesBase, $$slots, background, border, padding, shadow, spacing, gridColumns, gap, regionRowMain, regionRowHeadline, slotLead, slotDefault, slotTrail, $$scope, slots ]; } class AppBar extends SvelteComponent { constructor(options) { super(); init(this, options, instance$o, create_fragment$o, safe_not_equal, { background: 9, border: 10, padding: 11, shadow: 12, spacing: 13, gridColumns: 14, gap: 15, regionRowMain: 16, regionRowHeadline: 17, slotLead: 18, slotDefault: 19, slotTrail: 20, label: 0, labelledby: 1 }); } } function fallback_block(ctx) { let t2; return { c() { t2 = text("Select a File"); }, m(target, anchor) { insert(target, t2, anchor); }, d(detaching) { if (detaching) { detach(t2); } } }; } function create_fragment$n(ctx) { let div1; let div0; let input; let t2; let button_1; let button_1_class_value; let button_1_disabled_value; let div1_class_value; let current; let mounted; let dispose; let input_levels = [ { type: "file" }, { name: ( /*name*/ ctx[2] ) }, /*prunedRestProps*/ ctx[6]() ]; let input_data = {}; for (let i = 0; i < input_levels.length; i += 1) { input_data = assign(input_data, input_levels[i]); } const default_slot_template = ( /*#slots*/ ctx[11].default ); const default_slot = create_slot( default_slot_template, ctx, /*$$scope*/ ctx[10], null ); const default_slot_or_fallback = default_slot || fallback_block(); return { c() { div1 = element("div"); div0 = element("div"); input = element("input"); t2 = space(); button_1 = element("button"); if (default_slot_or_fallback) default_slot_or_fallback.c(); set_attributes(input, input_data); attr(div0, "class", "w-0 h-0 overflow-hidden"); attr(button_1, "type", "button"); attr(button_1, "class", button_1_class_value = "file-button-btn " + /*classesButton*/ ctx[3]); button_1.disabled = button_1_disabled_value = /*$$restProps*/ ctx[7].disabled; attr(div1, "class", div1_class_value = "file-button " + /*classesBase*/ ctx[4]); attr(div1, "data-testid", "file-button"); }, m(target, anchor) { insert(target, div1, anchor); append(div1, div0); append(div0, input); if (input.autofocus) input.focus(); ctx[16](input); append(div1, t2); append(div1, button_1); if (default_slot_or_fallback) { default_slot_or_fallback.m(button_1, null); } current = true; if (!mounted) { dispose = [ listen( input, "change", /*input_change_handler*/ ctx[17] ), listen( input, "change", /*change_handler*/ ctx[15] ), listen( button_1, "click", /*onButtonClick*/ ctx[5] ), listen( button_1, "keydown", /*keydown_handler*/ ctx[12] ), listen( button_1, "keyup", /*keyup_handler*/ ctx[13] ), listen( button_1, "keypress", /*keypress_handler*/ ctx[14] ) ]; mounted = true; } }, p(ctx2, [dirty]) { set_attributes(input, input_data = get_spread_update(input_levels, [ { type: "file" }, (!current || dirty & /*name*/ 4) && { name: ( /*name*/ ctx2[2] ) }, /*prunedRestProps*/ ctx2[6]() ])); if (default_slot) { if (default_slot.p && (!current || dirty & /*$$scope*/ 1024)) { update_slot_base( default_slot, default_slot_template, ctx2, /*$$scope*/ ctx2[10], !current ? get_all_dirty_from_scope( /*$$scope*/ ctx2[10] ) : get_slot_changes( default_slot_template, /*$$scope*/ ctx2[10], dirty, null ), null ); } } if (!current || dirty & /*classesButton*/ 8 && button_1_class_value !== (button_1_class_value = "file-button-btn " + /*classesButton*/ ctx2[3])) { attr(button_1, "class", button_1_class_value); } if (!current || dirty & /*$$restProps*/ 128 && button_1_disabled_value !== (button_1_disabled_value = /*$$restProps*/ ctx2[7].disabled)) { button_1.disabled = button_1_disabled_value; } if (!current || dirty & /*classesBase*/ 16 && div1_class_value !== (div1_class_value = "file-button " + /*classesBase*/ ctx2[4])) { attr(div1, "class", div1_class_value); } }, i(local) { if (current) return; transition_in(default_slot_or_fallback, local); current = true; }, o(local) { transition_out(default_slot_or_fallback, local); current = false; }, d(detaching) { if (detaching) { detach(div1); } ctx[16](null); if (default_slot_or_fallback) default_slot_or_fallback.d(detaching); mounted = false; run_all(dispose); } }; } function instance$n($$self, $$props, $$invalidate) { let classesBase; let classesButton; const omit_props_names = ["files", "fileInput", "name", "width", "button"]; let $$restProps = compute_rest_props($$props, omit_props_names); let { $$slots: slots = {}, $$scope } = $$props; let { files = void 0 } = $$props; let { fileInput = void 0 } = $$props; let { name } = $$props; let { width = "" } = $$props; let { button = "btn variant-filled" } = $$props; function onButtonClick() { if (fileInput) fileInput.click(); } function prunedRestProps() { delete $$restProps.class; return $$restProps; } function keydown_handler(event) { bubble.call(this, $$self, event); } function keyup_handler(event) { bubble.call(this, $$self, event); } function keypress_handler(event) { bubble.call(this, $$self, event); } function change_handler(event) { bubble.call(this, $$self, event); } function input_binding($$value) { binding_callbacks[$$value ? "unshift" : "push"](() => { fileInput = $$value; $$invalidate(1, fileInput); }); } function input_change_handler() { files = this.files; $$invalidate(0, files); } $$self.$$set = ($$new_props) => { $$invalidate(18, $$props = assign(assign({}, $$props), exclude_internal_props($$new_props))); $$invalidate(7, $$restProps = compute_rest_props($$props, omit_props_names)); if ("files" in $$new_props) $$invalidate(0, files = $$new_props.files); if ("fileInput" in $$new_props) $$invalidate(1, fileInput = $$new_props.fileInput); if ("name" in $$new_props) $$invalidate(2, name = $$new_props.name); if ("width" in $$new_props) $$invalidate(8, width = $$new_props.width); if ("button" in $$new_props) $$invalidate(9, button = $$new_props.button); if ("$$scope" in $$new_props) $$invalidate(10, $$scope = $$new_props.$$scope); }; $$self.$$.update = () => { $$invalidate(4, classesBase = `${$$props.class ?? ""}`); if ($$self.$$.dirty & /*button, width*/ 768) { $$invalidate(3, classesButton = `${button} ${width}`); } }; $$props = exclude_internal_props($$props); return [ files, fileInput, name, classesButton, classesBase, onButtonClick, prunedRestProps, $$restProps, width, button, $$scope, slots, keydown_handler, keyup_handler, keypress_handler, change_handler, input_binding, input_change_handler ]; } class FileButton extends SvelteComponent { constructor(options) { super(); init(this, options, instance$n, create_fragment$n, safe_not_equal, { files: 0, fileInput: 1, name: 2, width: 8, button: 9 }); } } function flip(node, { from, to }, params = {}) { const style = getComputedStyle(node); const transform = style.transform === "none" ? "" : style.transform; const [ox, oy] = style.transformOrigin.split(" ").map(parseFloat); const dx = from.left + from.width * ox / to.width - (to.left + ox); const dy = from.top + from.height * oy / to.height - (to.top + oy); const { delay = 0, duration = (d) => Math.sqrt(d) * 120, easing = cubicOut } = params; return { delay, duration: is_function(duration) ? duration(Math.sqrt(dx * dx + dy * dy)) : duration, easing, css: (t2, u) => { const x = u * dx; const y = u * dy; const sx = t2 + u * from.width / to.width; const sy = t2 + u * from.height / to.height; return `transform: ${transform} translate(${x}px, ${y}px) scale(${sx}, ${sy});`; } }; } function get_each_context$5(ctx, list, i) { const child_ctx = ctx.slice(); child_ctx[65] = list[i].id; child_ctx[66] = list[i].val; child_ctx[68] = i; return child_ctx; } function get_each_context_1$3(ctx, list, i) { const child_ctx = ctx.slice(); child_ctx[69] = list[i]; return child_ctx; } function create_each_block_1$3(ctx) { let option_1; let t_value = ( /*option*/ ctx[69] + "" ); let t2; let option_1_value_value; return { c() { option_1 = element("option"); t2 = text(t_value); option_1.__value = option_1_value_value = /*option*/ ctx[69]; set_input_value(option_1, option_1.__value); }, m(target, anchor) { insert(target, option_1, anchor); append(option_1, t2); }, p(ctx2, dirty) { if (dirty[0] & /*value*/ 1 && t_value !== (t_value = /*option*/ ctx2[69] + "")) set_data(t2, t_value); if (dirty[0] & /*value*/ 1 && option_1_value_value !== (option_1_value_value = /*option*/ ctx2[69])) { option_1.__value = option_1_value_value; set_input_value(option_1, option_1.__value); } }, d(detaching) { if (detaching) { detach(option_1); } } }; } function create_if_block$f(ctx) { let div; let each_blocks = []; let each_1_lookup = /* @__PURE__ */ new Map(); let div_class_value; let div_intro; let div_outro; let current; let each_value = ensure_array_like( /*chipValues*/ ctx[16] ); const get_key = (ctx2) => ( /*id*/ ctx2[65] ); for (let i = 0; i < each_value.length; i += 1) { let child_ctx = get_each_context$5(ctx, each_value, i); let key = get_key(child_ctx); each_1_lookup.set(key, each_blocks[i] = create_each_block$5(key, child_ctx)); } return { c() { div = element("div"); for (let i = 0; i < each_blocks.length; i += 1) { each_blocks[i].c(); } attr(div, "class", div_class_value = "input-chip-list " + /*classesChipList*/ ctx[19]); }, m(target, anchor) { insert(target, div, anchor); for (let i = 0; i < each_blocks.length; i += 1) { if (each_blocks[i]) { each_blocks[i].m(div, null); } } current = true; }, p(new_ctx, dirty) { ctx = new_ctx; if (dirty[0] & /*chips, chipTransitionOut, chipTransitionOutParams, transitions, removeChipInternally, chipValues*/ 8503456) { each_value = ensure_array_like( /*chipValues*/ ctx[16] ); group_outros(); for (let i = 0; i < each_blocks.length; i += 1) each_blocks[i].r(); each_blocks = update_keyed_each(each_blocks, dirty, get_key, 1, ctx, each_value, each_1_lookup, div, fix_and_outro_and_destroy_block, create_each_block$5, null, get_each_context$5); for (let i = 0; i < each_blocks.length; i += 1) each_blocks[i].a(); check_outros(); } if (!current || dirty[0] & /*classesChipList*/ 524288 && div_class_value !== (div_class_value = "input-chip-list " + /*classesChipList*/ ctx[19])) { attr(div, "class", div_class_value); } }, i(local) { if (current) return; for (let i = 0; i < each_value.length; i += 1) { transition_in(each_blocks[i]); } if (local) { add_render_callback(() => { if (!current) return; if (div_outro) div_outro.end(1); div_intro = create_in_transition(div, dynamicTransition, { transition: ( /*listTransitionIn*/ ctx[8] ), params: ( /*listTransitionInParams*/ ctx[9] ), enabled: ( /*transitions*/ ctx[7] ) }); div_intro.start(); }); } current = true; }, o(local) { for (let i = 0; i < each_blocks.length; i += 1) { transition_out(each_blocks[i]); } if (div_intro) div_intro.invalidate(); if (local) { div_outro = create_out_transition(div, dynamicTransition, { transition: ( /*listTransitionOut*/ ctx[10] ), params: ( /*listTransitionOutParams*/ ctx[11] ), enabled: ( /*transitions*/ ctx[7] ) }); } current = false; }, d(detaching) { if (detaching) { detach(div); } for (let i = 0; i < each_blocks.length; i += 1) { each_blocks[i].d(); } if (detaching && div_outro) div_outro.end(); } }; } function create_each_block$5(key_1, ctx) { let div; let button; let span0; let t0_value = ( /*val*/ ctx[66] + "" ); let t0; let t1; let span1; let button_class_value; let button_intro; let button_outro; let t3; let rect; let stop_animation = noop; let current; let mounted; let dispose; function click_handler_1(...args) { return ( /*click_handler_1*/ ctx[52]( /*i*/ ctx[68], /*val*/ ctx[66], ...args ) ); } return { key: key_1, first: null, c() { div = element("div"); button = element("button"); span0 = element("span"); t0 = text(t0_value); t1 = space(); span1 = element("span"); span1.textContent = "✕"; t3 = space(); attr(button, "type", "button"); attr(button, "class", button_class_value = "chip " + /*chips*/ ctx[5]); this.first = div; }, m(target, anchor) { insert(target, div, anchor); append(div, button); append(button, span0); append(span0, t0); append(button, t1); append(button, span1); append(div, t3); current = true; if (!mounted) { dispose = [ listen(button, "click", click_handler_1), listen( button, "click", /*click_handler*/ ctx[42] ), listen( button, "keypress", /*keypress_handler*/ ctx[43] ), listen( button, "keydown", /*keydown_handler*/ ctx[44] ), listen( button, "keyup", /*keyup_handler*/ ctx[45] ) ]; mounted = true; } }, p(new_ctx, dirty) { ctx = new_ctx; if ((!current || dirty[0] & /*chipValues*/ 65536) && t0_value !== (t0_value = /*val*/ ctx[66] + "")) set_data(t0, t0_value); if (!current || dirty[0] & /*chips*/ 32 && button_class_value !== (button_class_value = "chip " + /*chips*/ ctx[5])) { attr(button, "class", button_class_value); } }, r() { rect = div.getBoundingClientRect(); }, f() { fix_position(div); stop_animation(); }, a() { stop_animation(); stop_animation = create_animation(div, rect, flip, { duration: ( /*duration*/ ctx[3] ) }); }, i(local) { if (current) return; if (local) { add_render_callback(() => { if (!current) return; if (button_outro) button_outro.end(1); button_intro = create_in_transition(button, dynamicTransition, { transition: ( /*chipTransitionIn*/ ctx[12] ), params: ( /*chipTransitionInParams*/ ctx[13] ), enabled: ( /*transitions*/ ctx[7] ) }); button_intro.start(); }); } current = true; }, o(local) { if (button_intro) button_intro.invalidate(); if (local) { button_outro = create_out_transition(button, dynamicTransition, { transition: ( /*chipTransitionOut*/ ctx[14] ), params: ( /*chipTransitionOutParams*/ ctx[15] ), enabled: ( /*transitions*/ ctx[7] ) }); } current = false; }, d(detaching) { if (detaching) { detach(div); } if (detaching && button_outro) button_outro.end(); mounted = false; run_all(dispose); } }; } function create_fragment$m(ctx) { let div2; let div0; let select; let t0; let div1; let input_1; let input_1_placeholder_value; let input_1_class_value; let input_1_disabled_value; let t1; let div1_class_value; let div2_class_value; let current; let mounted; let dispose; let each_value_1 = ensure_array_like( /*value*/ ctx[0] ); let each_blocks = []; for (let i = 0; i < each_value_1.length; i += 1) { each_blocks[i] = create_each_block_1$3(get_each_context_1$3(ctx, each_value_1, i)); } let if_block = ( /*chipValues*/ ctx[16].length && create_if_block$f(ctx) ); return { c() { div2 = element("div"); div0 = element("div"); select = element("select"); for (let i = 0; i < each_blocks.length; i += 1) { each_blocks[i].c(); } t0 = space(); div1 = element("div"); input_1 = element("input"); t1 = space(); if (if_block) if_block.c(); attr( select, "name", /*name*/ ctx[2] ); select.multiple = true; select.required = /*required*/ ctx[4]; attr( select, "aria-label", /*label*/ ctx[6] ); attr(select, "tabindex", "-1"); if ( /*value*/ ctx[0] === void 0 ) add_render_callback(() => ( /*select_change_handler*/ ctx[50].call(select) )); attr(div0, "class", "h-0 overflow-hidden"); attr(input_1, "type", "text"); attr(input_1, "placeholder", input_1_placeholder_value = /*$$restProps*/ ctx[24].placeholder ?? "Enter values..."); attr(input_1, "class", input_1_class_value = "input-chip-field " + /*classesInput*/ ctx[18]); input_1.disabled = input_1_disabled_value = /*$$restProps*/ ctx[24].disabled; attr(div1, "class", div1_class_value = "input-chip-wrapper " + /*classesChipWrapper*/ ctx[20]); attr(div2, "class", div2_class_value = "input-chip " + /*classesBase*/ ctx[21]); toggle_class( div2, "opacity-50", /*$$restProps*/ ctx[24].disabled ); }, m(target, anchor) { insert(target, div2, anchor); append(div2, div0); append(div0, select); for (let i = 0; i < each_blocks.length; i += 1) { if (each_blocks[i]) { each_blocks[i].m(select, null); } } ctx[49](select); select_options( select, /*value*/ ctx[0] ); append(div2, t0); append(div2, div1); append(div1, input_1); set_input_value( input_1, /*input*/ ctx[1] ); append(div1, t1); if (if_block) if_block.m(div1, null); current = true; if (!mounted) { dispose = [ listen( select, "change", /*select_change_handler*/ ctx[50] ), listen( input_1, "input", /*input_1_input_handler*/ ctx[51] ), listen( input_1, "keydown", /*onKeyHandler*/ ctx[22] ), listen( input_1, "input", /*input_handler*/ ctx[46] ), listen( input_1, "focus", /*focus_handler*/ ctx[47] ), listen( input_1, "blur", /*blur_handler*/ ctx[48] ) ]; mounted = true; } }, p(ctx2, dirty) { if (dirty[0] & /*value*/ 1) { each_value_1 = ensure_array_like( /*value*/ ctx2[0] ); let i; for (i = 0; i < each_value_1.length; i += 1) { const child_ctx = get_each_context_1$3(ctx2, each_value_1, i); if (each_blocks[i]) { each_blocks[i].p(child_ctx, dirty); } else { each_blocks[i] = create_each_block_1$3(child_ctx); each_blocks[i].c(); each_blocks[i].m(select, null); } } for (; i < each_blocks.length; i += 1) { each_blocks[i].d(1); } each_blocks.length = each_value_1.length; } if (!current || dirty[0] & /*name*/ 4) { attr( select, "name", /*name*/ ctx2[2] ); } if (!current || dirty[0] & /*required*/ 16) { select.required = /*required*/ ctx2[4]; } if (!current || dirty[0] & /*label*/ 64) { attr( select, "aria-label", /*label*/ ctx2[6] ); } if (dirty[0] & /*value*/ 1) { select_options( select, /*value*/ ctx2[0] ); } if (!current || dirty[0] & /*$$restProps*/ 16777216 && input_1_placeholder_value !== (input_1_placeholder_value = /*$$restProps*/ ctx2[24].placeholder ?? "Enter values...")) { attr(input_1, "placeholder", input_1_placeholder_value); } if (!current || dirty[0] & /*classesInput*/ 262144 && input_1_class_value !== (input_1_class_value = "input-chip-field " + /*classesInput*/ ctx2[18])) { attr(input_1, "class", input_1_class_value); } if (!current || dirty[0] & /*$$restProps*/ 16777216 && input_1_disabled_value !== (input_1_disabled_value = /*$$restProps*/ ctx2[24].disabled)) { input_1.disabled = input_1_disabled_value; } if (dirty[0] & /*input*/ 2 && input_1.value !== /*input*/ ctx2[1]) { set_input_value( input_1, /*input*/ ctx2[1] ); } if ( /*chipValues*/ ctx2[16].length ) { if (if_block) { if_block.p(ctx2, dirty); if (dirty[0] & /*chipValues*/ 65536) { transition_in(if_block, 1); } } else { if_block = create_if_block$f(ctx2); if_block.c(); transition_in(if_block, 1); if_block.m(div1, null); } } else if (if_block) { group_outros(); transition_out(if_block, 1, 1, () => { if_block = null; }); check_outros(); } if (!current || dirty[0] & /*classesChipWrapper*/ 1048576 && div1_class_value !== (div1_class_value = "input-chip-wrapper " + /*classesChipWrapper*/ ctx2[20])) { attr(div1, "class", div1_class_value); } if (!current || dirty[0] & /*classesBase*/ 2097152 && div2_class_value !== (div2_class_value = "input-chip " + /*classesBase*/ ctx2[21])) { attr(div2, "class", div2_class_value); } if (!current || dirty[0] & /*classesBase, $$restProps*/ 18874368) { toggle_class( div2, "opacity-50", /*$$restProps*/ ctx2[24].disabled ); } }, i(local) { if (current) return; transition_in(if_block); current = true; }, o(local) { transition_out(if_block); current = false; }, d(detaching) { if (detaching) { detach(div2); } destroy_each(each_blocks, detaching); ctx[49](null); if (if_block) if_block.d(); mounted = false; run_all(dispose); } }; } const cBase$9 = "textarea cursor-pointer"; const cChipWrapper = "space-y-4"; const cChipList = "flex flex-wrap gap-2"; const cInputField = "unstyled bg-transparent border-0 !ring-0 p-0 w-full"; function instance$m($$self, $$props, $$invalidate) { let classesInvalid; let classesBase; let classesChipWrapper; let classesChipList; let classesInput; const omit_props_names = [ "input", "name", "value", "whitelist", "max", "minlength", "maxlength", "allowUpperCase", "allowDuplicates", "validation", "duration", "required", "chips", "invalid", "padding", "rounded", "regionChipWrapper", "regionChipList", "regionInput", "label", "transitions", "listTransitionIn", "listTransitionInParams", "listTransitionOut", "listTransitionOutParams", "chipTransitionIn", "chipTransitionInParams", "chipTransitionOut", "chipTransitionOutParams", "addChip", "removeChip" ]; let $$restProps = compute_rest_props($$props, omit_props_names); let $prefersReducedMotionStore; component_subscribe($$self, prefersReducedMotionStore, ($$value) => $$invalidate(53, $prefersReducedMotionStore = $$value)); const dispatch2 = createEventDispatcher(); let { input = "" } = $$props; let { name } = $$props; let { value = [] } = $$props; let { whitelist = [] } = $$props; let { max: max2 = -1 } = $$props; let { minlength = -1 } = $$props; let { maxlength = -1 } = $$props; let { allowUpperCase = false } = $$props; let { allowDuplicates = false } = $$props; let { validation = () => true } = $$props; let { duration = 150 } = $$props; let { required = false } = $$props; let { chips = "variant-filled" } = $$props; let { invalid = "input-error" } = $$props; let { padding = "p-2" } = $$props; let { rounded = "rounded-container-token" } = $$props; let { regionChipWrapper = "" } = $$props; let { regionChipList = "" } = $$props; let { regionInput = "" } = $$props; let { label = "Chips select" } = $$props; let { transitions = !$prefersReducedMotionStore } = $$props; let { listTransitionIn = fly } = $$props; let { listTransitionInParams = { duration: 150, opacity: 0, y: -20 } } = $$props; let { listTransitionOut = fly } = $$props; let { listTransitionOutParams = { duration: 150, opacity: 0, y: -20 } } = $$props; let { chipTransitionIn = scale } = $$props; let { chipTransitionInParams = { duration: 150, opacity: 0 } } = $$props; let { chipTransitionOut = scale } = $$props; let { chipTransitionOutParams = { duration: 150, opacity: 0 } } = $$props; let inputValid = true; let chipValues = (value == null ? void 0 : value.map((val) => { return { val, id: Math.random() }; })) || []; function resetFormHandler() { $$invalidate(0, value = []); } let selectElement; onMount(() => { if (!selectElement.form) return; const externalForm = selectElement.form; externalForm.addEventListener("reset", resetFormHandler); return () => { externalForm.removeEventListener("reset", resetFormHandler); }; }); function validateCustom(chip) { return validation === void 0 || validation(chip); } function validateCount() { return max2 === -1 || value.length < max2; } function validateLength(chip) { return (minlength === -1 || chip.length >= minlength) && (maxlength === -1 || chip.length <= maxlength); } function validateWhiteList(chip) { return whitelist.length === 0 || whitelist.includes(chip); } function validateDuplicates(chip) { return allowDuplicates || !value.includes(chip); } function validate(chip = "") { if (!chip && !input) return false; chip = chip !== "" ? chip.trim() : input.trim(); return validateCustom(chip) && validateCount() && validateLength(chip) && validateWhiteList(chip) && validateDuplicates(chip); } function addChipCommon(chip) { chip = allowUpperCase ? chip : chip.toLowerCase(); value.push(chip); $$invalidate(0, value); chipValues.push({ val: chip, id: Math.random() }); $$invalidate(16, chipValues), $$invalidate(0, value); } function removeChipCommon(chip) { let chipIndex = value.indexOf(chip); value.splice(chipIndex, 1); $$invalidate(0, value); chipValues.splice(chipIndex, 1); $$invalidate(16, chipValues), $$invalidate(0, value); } function onKeyHandler(event) { if (event.key !== "Enter") return; event.preventDefault(); $$invalidate(40, inputValid = validate()); if (inputValid === false) { dispatch2("invalid", { event, input }); return; } addChipCommon(input); dispatch2("add", { event, chipIndex: value.length - 1, chipValue: input }); $$invalidate(1, input = ""); } function removeChipInternally(event, chipIndex, chipValue) { if ($$restProps.disabled) return; removeChipCommon(chipValue); dispatch2("remove", { event, chipIndex, chipValue }); } function addChip(chip) { $$invalidate(40, inputValid = validate(chip)); if (inputValid === false) { dispatch2("invalidManually", { input: chip }); return; } addChipCommon(chip); dispatch2("addManually", { chipIndex: value.length - 1, chipValue: chip }); } function removeChip(chip) { if ($$restProps.disabled) return; removeChipCommon(chip); dispatch2("removeManually", { chipValue: chip }); } function click_handler(event) { bubble.call(this, $$self, event); } function keypress_handler(event) { bubble.call(this, $$self, event); } function keydown_handler(event) { bubble.call(this, $$self, event); } function keyup_handler(event) { bubble.call(this, $$self, event); } function input_handler(event) { bubble.call(this, $$self, event); } function focus_handler(event) { bubble.call(this, $$self, event); } function blur_handler(event) { bubble.call(this, $$self, event); } function select_binding($$value) { binding_callbacks[$$value ? "unshift" : "push"](() => { selectElement = $$value; $$invalidate(17, selectElement); }); } function select_change_handler() { value = select_multiple_value(this); $$invalidate(0, value); } function input_1_input_handler() { input = this.value; $$invalidate(1, input); } const click_handler_1 = (i, val, e) => removeChipInternally(e, i, val); $$self.$$set = ($$new_props) => { $$invalidate(64, $$props = assign(assign({}, $$props), exclude_internal_props($$new_props))); $$invalidate(24, $$restProps = compute_rest_props($$props, omit_props_names)); if ("input" in $$new_props) $$invalidate(1, input = $$new_props.input); if ("name" in $$new_props) $$invalidate(2, name = $$new_props.name); if ("value" in $$new_props) $$invalidate(0, value = $$new_props.value); if ("whitelist" in $$new_props) $$invalidate(25, whitelist = $$new_props.whitelist); if ("max" in $$new_props) $$invalidate(26, max2 = $$new_props.max); if ("minlength" in $$new_props) $$invalidate(27, minlength = $$new_props.minlength); if ("maxlength" in $$new_props) $$invalidate(28, maxlength = $$new_props.maxlength); if ("allowUpperCase" in $$new_props) $$invalidate(29, allowUpperCase = $$new_props.allowUpperCase); if ("allowDuplicates" in $$new_props) $$invalidate(30, allowDuplicates = $$new_props.allowDuplicates); if ("validation" in $$new_props) $$invalidate(31, validation = $$new_props.validation); if ("duration" in $$new_props) $$invalidate(3, duration = $$new_props.duration); if ("required" in $$new_props) $$invalidate(4, required = $$new_props.required); if ("chips" in $$new_props) $$invalidate(5, chips = $$new_props.chips); if ("invalid" in $$new_props) $$invalidate(32, invalid = $$new_props.invalid); if ("padding" in $$new_props) $$invalidate(33, padding = $$new_props.padding); if ("rounded" in $$new_props) $$invalidate(34, rounded = $$new_props.rounded); if ("regionChipWrapper" in $$new_props) $$invalidate(35, regionChipWrapper = $$new_props.regionChipWrapper); if ("regionChipList" in $$new_props) $$invalidate(36, regionChipList = $$new_props.regionChipList); if ("regionInput" in $$new_props) $$invalidate(37, regionInput = $$new_props.regionInput); if ("label" in $$new_props) $$invalidate(6, label = $$new_props.label); if ("transitions" in $$new_props) $$invalidate(7, transitions = $$new_props.transitions); if ("listTransitionIn" in $$new_props) $$invalidate(8, listTransitionIn = $$new_props.listTransitionIn); if ("listTransitionInParams" in $$new_props) $$invalidate(9, listTransitionInParams = $$new_props.listTransitionInParams); if ("listTransitionOut" in $$new_props) $$invalidate(10, listTransitionOut = $$new_props.listTransitionOut); if ("listTransitionOutParams" in $$new_props) $$invalidate(11, listTransitionOutParams = $$new_props.listTransitionOutParams); if ("chipTransitionIn" in $$new_props) $$invalidate(12, chipTransitionIn = $$new_props.chipTransitionIn); if ("chipTransitionInParams" in $$new_props) $$invalidate(13, chipTransitionInParams = $$new_props.chipTransitionInParams); if ("chipTransitionOut" in $$new_props) $$invalidate(14, chipTransitionOut = $$new_props.chipTransitionOut); if ("chipTransitionOutParams" in $$new_props) $$invalidate(15, chipTransitionOutParams = $$new_props.chipTransitionOutParams); }; $$self.$$.update = () => { if ($$self.$$.dirty[1] & /*inputValid, invalid*/ 514) { $$invalidate(41, classesInvalid = inputValid === false ? invalid : ""); } $$invalidate(21, classesBase = `${cBase$9} ${padding} ${rounded} ${$$props.class ?? ""} ${classesInvalid}`); if ($$self.$$.dirty[1] & /*regionChipWrapper*/ 16) { $$invalidate(20, classesChipWrapper = `${cChipWrapper} ${regionChipWrapper}`); } if ($$self.$$.dirty[1] & /*regionChipList*/ 32) { $$invalidate(19, classesChipList = `${cChipList} ${regionChipList}`); } if ($$self.$$.dirty[1] & /*regionInput*/ 64) { $$invalidate(18, classesInput = `${cInputField} ${regionInput}`); } if ($$self.$$.dirty[0] & /*value, chipValues*/ 65537) { $$invalidate(16, chipValues = (value == null ? void 0 : value.map((val, i) => { var _a; if (((_a = chipValues[i]) == null ? void 0 : _a.val) === val) return chipValues[i]; return { id: Math.random(), val }; })) || []); } }; $$props = exclude_internal_props($$props); return [ value, input, name, duration, required, chips, label, transitions, listTransitionIn, listTransitionInParams, listTransitionOut, listTransitionOutParams, chipTransitionIn, chipTransitionInParams, chipTransitionOut, chipTransitionOutParams, chipValues, selectElement, classesInput, classesChipList, classesChipWrapper, classesBase, onKeyHandler, removeChipInternally, $$restProps, whitelist, max2, minlength, maxlength, allowUpperCase, allowDuplicates, validation, invalid, padding, rounded, regionChipWrapper, regionChipList, regionInput, addChip, removeChip, inputValid, classesInvalid, click_handler, keypress_handler, keydown_handler, keyup_handler, input_handler, focus_handler, blur_handler, select_binding, select_change_handler, input_1_input_handler, click_handler_1 ]; } class InputChip extends SvelteComponent { constructor(options) { super(); init( this, options, instance$m, create_fragment$m, safe_not_equal, { input: 1, name: 2, value: 0, whitelist: 25, max: 26, minlength: 27, maxlength: 28, allowUpperCase: 29, allowDuplicates: 30, validation: 31, duration: 3, required: 4, chips: 5, invalid: 32, padding: 33, rounded: 34, regionChipWrapper: 35, regionChipList: 36, regionInput: 37, label: 6, transitions: 7, listTransitionIn: 8, listTransitionInParams: 9, listTransitionOut: 10, listTransitionOutParams: 11, chipTransitionIn: 12, chipTransitionInParams: 13, chipTransitionOut: 14, chipTransitionOutParams: 15, addChip: 38, removeChip: 39 }, null, [-1, -1, -1] ); } get addChip() { return this.$$.ctx[38]; } get removeChip() { return this.$$.ctx[39]; } } function create_fragment$l(ctx) { let div; let div_class_value; let current; const default_slot_template = ( /*#slots*/ ctx[13].default ); const default_slot = create_slot( default_slot_template, ctx, /*$$scope*/ ctx[12], null ); return { c() { div = element("div"); if (default_slot) default_slot.c(); attr(div, "class", div_class_value = "listbox " + /*classesBase*/ ctx[1]); attr(div, "role", "listbox"); attr( div, "aria-labelledby", /*labelledby*/ ctx[0] ); attr(div, "data-testid", "listbox"); }, m(target, anchor) { insert(target, div, anchor); if (default_slot) { default_slot.m(div, null); } current = true; }, p(ctx2, [dirty]) { if (default_slot) { if (default_slot.p && (!current || dirty & /*$$scope*/ 4096)) { update_slot_base( default_slot, default_slot_template, ctx2, /*$$scope*/ ctx2[12], !current ? get_all_dirty_from_scope( /*$$scope*/ ctx2[12] ) : get_slot_changes( default_slot_template, /*$$scope*/ ctx2[12], dirty, null ), null ); } } if (!current || dirty & /*classesBase*/ 2 && div_class_value !== (div_class_value = "listbox " + /*classesBase*/ ctx2[1])) { attr(div, "class", div_class_value); } if (!current || dirty & /*labelledby*/ 1) { attr( div, "aria-labelledby", /*labelledby*/ ctx2[0] ); } }, i(local) { if (current) return; transition_in(default_slot, local); current = true; }, o(local) { transition_out(default_slot, local); current = false; }, d(detaching) { if (detaching) { detach(div); } if (default_slot) default_slot.d(detaching); } }; } const cBase$8 = ""; function instance$l($$self, $$props, $$invalidate) { let classesBase; let { $$slots: slots = {}, $$scope } = $$props; let { multiple = false } = $$props; let { disabled = false } = $$props; let { spacing = "space-y-1" } = $$props; let { rounded = "rounded-token" } = $$props; let { active: active2 = "variant-filled" } = $$props; let { hover = "hover:variant-soft" } = $$props; let { padding = "px-4 py-2" } = $$props; let { regionLead = "" } = $$props; let { regionDefault = "" } = $$props; let { regionTrail = "" } = $$props; let { labelledby = "" } = $$props; setContext("disabled", disabled); setContext("multiple", multiple); setContext("rounded", rounded); setContext("active", active2); setContext("hover", hover); setContext("padding", padding); setContext("regionLead", regionLead); setContext("regionDefault", regionDefault); setContext("regionTrail", regionTrail); $$self.$$set = ($$new_props) => { $$invalidate(14, $$props = assign(assign({}, $$props), exclude_internal_props($$new_props))); if ("multiple" in $$new_props) $$invalidate(2, multiple = $$new_props.multiple); if ("disabled" in $$new_props) $$invalidate(3, disabled = $$new_props.disabled); if ("spacing" in $$new_props) $$invalidate(4, spacing = $$new_props.spacing); if ("rounded" in $$new_props) $$invalidate(5, rounded = $$new_props.rounded); if ("active" in $$new_props) $$invalidate(6, active2 = $$new_props.active); if ("hover" in $$new_props) $$invalidate(7, hover = $$new_props.hover); if ("padding" in $$new_props) $$invalidate(8, padding = $$new_props.padding); if ("regionLead" in $$new_props) $$invalidate(9, regionLead = $$new_props.regionLead); if ("regionDefault" in $$new_props) $$invalidate(10, regionDefault = $$new_props.regionDefault); if ("regionTrail" in $$new_props) $$invalidate(11, regionTrail = $$new_props.regionTrail); if ("labelledby" in $$new_props) $$invalidate(0, labelledby = $$new_props.labelledby); if ("$$scope" in $$new_props) $$invalidate(12, $$scope = $$new_props.$$scope); }; $$self.$$.update = () => { $$invalidate(1, classesBase = `${cBase$8} ${spacing} ${rounded} ${$$props.class ?? ""}`); }; $$props = exclude_internal_props($$props); return [ labelledby, classesBase, multiple, disabled, spacing, rounded, active2, hover, padding, regionLead, regionDefault, regionTrail, $$scope, slots ]; } class ListBox extends SvelteComponent { constructor(options) { super(); init(this, options, instance$l, create_fragment$l, safe_not_equal, { multiple: 2, disabled: 3, spacing: 4, rounded: 5, active: 6, hover: 7, padding: 8, regionLead: 9, regionDefault: 10, regionTrail: 11, labelledby: 0 }); } } const get_trail_slot_changes$1 = (dirty) => ({}); const get_trail_slot_context$1 = (ctx) => ({}); const get_lead_slot_changes$1 = (dirty) => ({}); const get_lead_slot_context$1 = (ctx) => ({}); function create_else_block$4(ctx) { let input; let value_has_changed = false; let binding_group; let mounted; let dispose; binding_group = init_binding_group( /*$$binding_groups*/ ctx[37][0] ); return { c() { input = element("input"); input.disabled = /*disabled*/ ctx[3]; attr(input, "type", "radio"); attr( input, "name", /*name*/ ctx[1] ); input.__value = /*value*/ ctx[2]; set_input_value(input, input.__value); attr(input, "tabindex", "-1"); binding_group.p(input); }, m(target, anchor) { insert(target, input, anchor); ctx[35](input); input.checked = input.__value === /*group*/ ctx[0]; if (!mounted) { dispose = [ listen( input, "change", /*input_change_handler_1*/ ctx[36] ), listen( input, "click", /*click_handler_1*/ ctx[31] ), listen( input, "change", /*change_handler_1*/ ctx[32] ) ]; mounted = true; } }, p(ctx2, dirty) { if (dirty[0] & /*disabled*/ 8) { input.disabled = /*disabled*/ ctx2[3]; } if (dirty[0] & /*name*/ 2) { attr( input, "name", /*name*/ ctx2[1] ); } if (dirty[0] & /*value*/ 4) { input.__value = /*value*/ ctx2[2]; set_input_value(input, input.__value); value_has_changed = true; } if (value_has_changed || dirty[0] & /*group*/ 1) { input.checked = input.__value === /*group*/ ctx2[0]; } }, d(detaching) { if (detaching) { detach(input); } ctx[35](null); binding_group.r(); mounted = false; run_all(dispose); } }; } function create_if_block_2$6(ctx) { let input; let mounted; let dispose; return { c() { input = element("input"); input.disabled = /*disabled*/ ctx[3]; attr(input, "type", "checkbox"); attr( input, "name", /*name*/ ctx[1] ); input.__value = /*value*/ ctx[2]; set_input_value(input, input.__value); attr(input, "tabindex", "-1"); }, m(target, anchor) { insert(target, input, anchor); ctx[33](input); input.checked = /*checked*/ ctx[5]; if (!mounted) { dispose = [ listen( input, "change", /*input_change_handler*/ ctx[34] ), listen( input, "click", /*click_handler*/ ctx[29] ), listen( input, "change", /*change_handler*/ ctx[30] ) ]; mounted = true; } }, p(ctx2, dirty) { if (dirty[0] & /*disabled*/ 8) { input.disabled = /*disabled*/ ctx2[3]; } if (dirty[0] & /*name*/ 2) { attr( input, "name", /*name*/ ctx2[1] ); } if (dirty[0] & /*value*/ 4) { input.__value = /*value*/ ctx2[2]; set_input_value(input, input.__value); } if (dirty[0] & /*checked*/ 32) { input.checked = /*checked*/ ctx2[5]; } }, d(detaching) { if (detaching) { detach(input); } ctx[33](null); mounted = false; run_all(dispose); } }; } function create_if_block_1$8(ctx) { let div; let div_class_value; let current; const lead_slot_template = ( /*#slots*/ ctx[25].lead ); const lead_slot = create_slot( lead_slot_template, ctx, /*$$scope*/ ctx[24], get_lead_slot_context$1 ); return { c() { div = element("div"); if (lead_slot) lead_slot.c(); attr(div, "class", div_class_value = "listbox-label-lead " + /*classesRegionLead*/ ctx[10]); }, m(target, anchor) { insert(target, div, anchor); if (lead_slot) { lead_slot.m(div, null); } current = true; }, p(ctx2, dirty) { if (lead_slot) { if (lead_slot.p && (!current || dirty[0] & /*$$scope*/ 16777216)) { update_slot_base( lead_slot, lead_slot_template, ctx2, /*$$scope*/ ctx2[24], !current ? get_all_dirty_from_scope( /*$$scope*/ ctx2[24] ) : get_slot_changes( lead_slot_template, /*$$scope*/ ctx2[24], dirty, get_lead_slot_changes$1 ), get_lead_slot_context$1 ); } } if (!current || dirty[0] & /*classesRegionLead*/ 1024 && div_class_value !== (div_class_value = "listbox-label-lead " + /*classesRegionLead*/ ctx2[10])) { attr(div, "class", div_class_value); } }, i(local) { if (current) return; transition_in(lead_slot, local); current = true; }, o(local) { transition_out(lead_slot, local); current = false; }, d(detaching) { if (detaching) { detach(div); } if (lead_slot) lead_slot.d(detaching); } }; } function create_if_block$e(ctx) { let div; let div_class_value; let current; const trail_slot_template = ( /*#slots*/ ctx[25].trail ); const trail_slot = create_slot( trail_slot_template, ctx, /*$$scope*/ ctx[24], get_trail_slot_context$1 ); return { c() { div = element("div"); if (trail_slot) trail_slot.c(); attr(div, "class", div_class_value = "listbox-label-trail " + /*classesRegionTrail*/ ctx[8]); }, m(target, anchor) { insert(target, div, anchor); if (trail_slot) { trail_slot.m(div, null); } current = true; }, p(ctx2, dirty) { if (trail_slot) { if (trail_slot.p && (!current || dirty[0] & /*$$scope*/ 16777216)) { update_slot_base( trail_slot, trail_slot_template, ctx2, /*$$scope*/ ctx2[24], !current ? get_all_dirty_from_scope( /*$$scope*/ ctx2[24] ) : get_slot_changes( trail_slot_template, /*$$scope*/ ctx2[24], dirty, get_trail_slot_changes$1 ), get_trail_slot_context$1 ); } } if (!current || dirty[0] & /*classesRegionTrail*/ 256 && div_class_value !== (div_class_value = "listbox-label-trail " + /*classesRegionTrail*/ ctx2[8])) { attr(div, "class", div_class_value); } }, i(local) { if (current) return; transition_in(trail_slot, local); current = true; }, o(local) { transition_out(trail_slot, local); current = false; }, d(detaching) { if (detaching) { detach(div); } if (trail_slot) trail_slot.d(detaching); } }; } function create_fragment$k(ctx) { let label; let div3; let div0; let t0; let div2; let t1; let div1; let div1_class_value; let t2; let div2_class_value; let div3_class_value; let current; let mounted; let dispose; function select_block_type(ctx2, dirty) { if ( /*multiple*/ ctx2[4] ) return create_if_block_2$6; return create_else_block$4; } let current_block_type = select_block_type(ctx); let if_block0 = current_block_type(ctx); let if_block1 = ( /*$$slots*/ ctx[14].lead && create_if_block_1$8(ctx) ); const default_slot_template = ( /*#slots*/ ctx[25].default ); const default_slot = create_slot( default_slot_template, ctx, /*$$scope*/ ctx[24], null ); let if_block2 = ( /*$$slots*/ ctx[14].trail && create_if_block$e(ctx) ); return { c() { label = element("label"); div3 = element("div"); div0 = element("div"); if_block0.c(); t0 = space(); div2 = element("div"); if (if_block1) if_block1.c(); t1 = space(); div1 = element("div"); if (default_slot) default_slot.c(); t2 = space(); if (if_block2) if_block2.c(); attr(div0, "class", "h-0 w-0 overflow-hidden"); attr(div1, "class", div1_class_value = "listbox-label-content " + /*classesRegionDefault*/ ctx[9]); attr(div2, "class", div2_class_value = "listbox-label " + /*classesLabel*/ ctx[11]); attr(div3, "class", div3_class_value = "listbox-item " + /*classesBase*/ ctx[12]); attr(div3, "data-testid", "listbox-item"); attr(div3, "role", "option"); attr( div3, "aria-selected", /*selected*/ ctx[6] ); attr(div3, "tabindex", "0"); }, m(target, anchor) { insert(target, label, anchor); append(label, div3); append(div3, div0); if_block0.m(div0, null); append(div3, t0); append(div3, div2); if (if_block1) if_block1.m(div2, null); append(div2, t1); append(div2, div1); if (default_slot) { default_slot.m(div1, null); } append(div2, t2); if (if_block2) if_block2.m(div2, null); current = true; if (!mounted) { dispose = [ listen( div3, "keydown", /*onKeyDown*/ ctx[13] ), listen( div3, "keydown", /*keydown_handler*/ ctx[26] ), listen( div3, "keyup", /*keyup_handler*/ ctx[27] ), listen( div3, "keypress", /*keypress_handler*/ ctx[28] ) ]; mounted = true; } }, p(ctx2, dirty) { if (current_block_type === (current_block_type = select_block_type(ctx2)) && if_block0) { if_block0.p(ctx2, dirty); } else { if_block0.d(1); if_block0 = current_block_type(ctx2); if (if_block0) { if_block0.c(); if_block0.m(div0, null); } } if ( /*$$slots*/ ctx2[14].lead ) { if (if_block1) { if_block1.p(ctx2, dirty); if (dirty[0] & /*$$slots*/ 16384) { transition_in(if_block1, 1); } } else { if_block1 = create_if_block_1$8(ctx2); if_block1.c(); transition_in(if_block1, 1); if_block1.m(div2, t1); } } else if (if_block1) { group_outros(); transition_out(if_block1, 1, 1, () => { if_block1 = null; }); check_outros(); } if (default_slot) { if (default_slot.p && (!current || dirty[0] & /*$$scope*/ 16777216)) { update_slot_base( default_slot, default_slot_template, ctx2, /*$$scope*/ ctx2[24], !current ? get_all_dirty_from_scope( /*$$scope*/ ctx2[24] ) : get_slot_changes( default_slot_template, /*$$scope*/ ctx2[24], dirty, null ), null ); } } if (!current || dirty[0] & /*classesRegionDefault*/ 512 && div1_class_value !== (div1_class_value = "listbox-label-content " + /*classesRegionDefault*/ ctx2[9])) { attr(div1, "class", div1_class_value); } if ( /*$$slots*/ ctx2[14].trail ) { if (if_block2) { if_block2.p(ctx2, dirty); if (dirty[0] & /*$$slots*/ 16384) { transition_in(if_block2, 1); } } else { if_block2 = create_if_block$e(ctx2); if_block2.c(); transition_in(if_block2, 1); if_block2.m(div2, null); } } else if (if_block2) { group_outros(); transition_out(if_block2, 1, 1, () => { if_block2 = null; }); check_outros(); } if (!current || dirty[0] & /*classesLabel*/ 2048 && div2_class_value !== (div2_class_value = "listbox-label " + /*classesLabel*/ ctx2[11])) { attr(div2, "class", div2_class_value); } if (!current || dirty[0] & /*classesBase*/ 4096 && div3_class_value !== (div3_class_value = "listbox-item " + /*classesBase*/ ctx2[12])) { attr(div3, "class", div3_class_value); } if (!current || dirty[0] & /*selected*/ 64) { attr( div3, "aria-selected", /*selected*/ ctx2[6] ); } }, i(local) { if (current) return; transition_in(if_block1); transition_in(default_slot, local); transition_in(if_block2); current = true; }, o(local) { transition_out(if_block1); transition_out(default_slot, local); transition_out(if_block2); current = false; }, d(detaching) { if (detaching) { detach(label); } if_block0.d(); if (if_block1) if_block1.d(); if (default_slot) default_slot.d(detaching); if (if_block2) if_block2.d(); mounted = false; run_all(dispose); } }; } const cBase$7 = "cursor-pointer -outline-offset-[3px]"; const cDisabled$1 = "opacity-50 !cursor-default"; const cLabel$1 = "flex items-center space-x-4"; const cRegionLead = ""; const cRegionDefault = "flex-1"; const cRegionTrail = ""; function areDeeplyEqual(param1, param2) { if (param1 === param2) return true; if (!(param1 instanceof Object) || !(param2 instanceof Object)) return false; const keys1 = Object.keys(param1); const keys2 = Object.keys(param2); if (keys1.length !== keys2.length) return false; for (const key of keys1) { const value1 = param1[key]; const value2 = param2[key]; if (!areDeeplyEqual(value1, value2)) return false; } return true; } function instance$k($$self, $$props, $$invalidate) { let selected; let classesActive; let classesDisabled; let classesBase; let classesLabel; let classesRegionLead; let classesRegionDefault; let classesRegionTrail; let { $$slots: slots = {}, $$scope } = $$props; const $$slots = compute_slots(slots); let { group } = $$props; let { name } = $$props; let { value } = $$props; let { disabled = getContext("disabled") } = $$props; let { multiple = getContext("multiple") } = $$props; let { rounded = getContext("rounded") } = $$props; let { active: active2 = getContext("active") } = $$props; let { hover = getContext("hover") } = $$props; let { padding = getContext("padding") } = $$props; let { regionLead = getContext("regionLead") } = $$props; let { regionDefault = getContext("regionDefault") } = $$props; let { regionTrail = getContext("regionTrail") } = $$props; let checked; let elemInput; function updateCheckbox(group2) { $$invalidate(5, checked = group2.indexOf(value) >= 0); } function updateGroup(checked2) { const index = group.indexOf(value); if (checked2) { if (index < 0) { group.push(value); $$invalidate(0, group); } } else { if (index >= 0) { group.splice(index, 1); $$invalidate(0, group); } } } function onKeyDown(event) { if (["Enter", "Space"].includes(event.code)) { event.preventDefault(); elemInput.click(); } } const $$binding_groups = [[]]; function keydown_handler(event) { bubble.call(this, $$self, event); } function keyup_handler(event) { bubble.call(this, $$self, event); } function keypress_handler(event) { bubble.call(this, $$self, event); } function click_handler(event) { bubble.call(this, $$self, event); } function change_handler(event) { bubble.call(this, $$self, event); } function click_handler_1(event) { bubble.call(this, $$self, event); } function change_handler_1(event) { bubble.call(this, $$self, event); } function input_binding($$value) { binding_callbacks[$$value ? "unshift" : "push"](() => { elemInput = $$value; $$invalidate(7, elemInput); }); } function input_change_handler() { checked = this.checked; $$invalidate(5, checked); } function input_binding_1($$value) { binding_callbacks[$$value ? "unshift" : "push"](() => { elemInput = $$value; $$invalidate(7, elemInput); }); } function input_change_handler_1() { group = this.__value; $$invalidate(0, group); } $$self.$$set = ($$new_props) => { $$invalidate(40, $$props = assign(assign({}, $$props), exclude_internal_props($$new_props))); if ("group" in $$new_props) $$invalidate(0, group = $$new_props.group); if ("name" in $$new_props) $$invalidate(1, name = $$new_props.name); if ("value" in $$new_props) $$invalidate(2, value = $$new_props.value); if ("disabled" in $$new_props) $$invalidate(3, disabled = $$new_props.disabled); if ("multiple" in $$new_props) $$invalidate(4, multiple = $$new_props.multiple); if ("rounded" in $$new_props) $$invalidate(15, rounded = $$new_props.rounded); if ("active" in $$new_props) $$invalidate(16, active2 = $$new_props.active); if ("hover" in $$new_props) $$invalidate(17, hover = $$new_props.hover); if ("padding" in $$new_props) $$invalidate(18, padding = $$new_props.padding); if ("regionLead" in $$new_props) $$invalidate(19, regionLead = $$new_props.regionLead); if ("regionDefault" in $$new_props) $$invalidate(20, regionDefault = $$new_props.regionDefault); if ("regionTrail" in $$new_props) $$invalidate(21, regionTrail = $$new_props.regionTrail); if ("$$scope" in $$new_props) $$invalidate(24, $$scope = $$new_props.$$scope); }; $$self.$$.update = () => { if ($$self.$$.dirty[0] & /*multiple, group*/ 17) { if (multiple) updateCheckbox(group); } if ($$self.$$.dirty[0] & /*multiple, checked*/ 48) { if (multiple) updateGroup(checked); } if ($$self.$$.dirty[0] & /*multiple, group, value*/ 21) { $$invalidate(6, selected = multiple ? group.some((groupVal) => areDeeplyEqual(value, groupVal)) : areDeeplyEqual(group, value)); } if ($$self.$$.dirty[0] & /*selected, active, disabled, hover*/ 196680) { $$invalidate(22, classesActive = selected ? active2 : !disabled ? hover : ""); } if ($$self.$$.dirty[0] & /*disabled*/ 8) { $$invalidate(23, classesDisabled = disabled ? cDisabled$1 : ""); } $$invalidate(12, classesBase = `${cBase$7} ${classesDisabled} ${rounded} ${padding} ${classesActive} ${$$props.class ?? ""}`); if ($$self.$$.dirty[0] & /*regionLead*/ 524288) { $$invalidate(10, classesRegionLead = `${cRegionLead} ${regionLead}`); } if ($$self.$$.dirty[0] & /*regionDefault*/ 1048576) { $$invalidate(9, classesRegionDefault = `${cRegionDefault} ${regionDefault}`); } if ($$self.$$.dirty[0] & /*regionTrail*/ 2097152) { $$invalidate(8, classesRegionTrail = `${cRegionTrail} ${regionTrail}`); } }; $$invalidate(11, classesLabel = `${cLabel$1}`); $$props = exclude_internal_props($$props); return [ group, name, value, disabled, multiple, checked, selected, elemInput, classesRegionTrail, classesRegionDefault, classesRegionLead, classesLabel, classesBase, onKeyDown, $$slots, rounded, active2, hover, padding, regionLead, regionDefault, regionTrail, classesActive, classesDisabled, $$scope, slots, keydown_handler, keyup_handler, keypress_handler, click_handler, change_handler, click_handler_1, change_handler_1, input_binding, input_change_handler, input_binding_1, input_change_handler_1, $$binding_groups ]; } class ListBoxItem extends SvelteComponent { constructor(options) { super(); init( this, options, instance$k, create_fragment$k, safe_not_equal, { group: 0, name: 1, value: 2, disabled: 3, multiple: 4, rounded: 15, active: 16, hover: 17, padding: 18, regionLead: 19, regionDefault: 20, regionTrail: 21 }, null, [-1, -1] ); } } function create_fragment$j(ctx) { let div1; let div0; let div0_class_value; let style_width = `${/*indeterminate*/ ctx[4] ? 100 : ( /*fillPercent*/ ctx[7] )}%`; let div1_class_value; let div1_aria_valuemax_value; return { c() { div1 = element("div"); div0 = element("div"); attr(div0, "class", div0_class_value = "progress-bar-meter " + /*classesMeter*/ ctx[5] + " svelte-12wvf64"); set_style(div0, "width", style_width); attr(div1, "class", div1_class_value = "progress-bar " + /*classesTrack*/ ctx[6] + " svelte-12wvf64"); attr(div1, "data-testid", "progress-bar"); attr(div1, "role", "progressbar"); attr( div1, "aria-labelledby", /*labelledby*/ ctx[3] ); attr( div1, "aria-valuenow", /*value*/ ctx[0] ); attr( div1, "aria-valuemin", /*min*/ ctx[1] ); attr(div1, "aria-valuemax", div1_aria_valuemax_value = /*max*/ ctx[2] - /*min*/ ctx[1]); }, m(target, anchor) { insert(target, div1, anchor); append(div1, div0); }, p(ctx2, [dirty]) { if (dirty & /*classesMeter*/ 32 && div0_class_value !== (div0_class_value = "progress-bar-meter " + /*classesMeter*/ ctx2[5] + " svelte-12wvf64")) { attr(div0, "class", div0_class_value); } if (dirty & /*indeterminate, fillPercent*/ 144 && style_width !== (style_width = `${/*indeterminate*/ ctx2[4] ? 100 : ( /*fillPercent*/ ctx2[7] )}%`)) { set_style(div0, "width", style_width); } if (dirty & /*classesTrack*/ 64 && div1_class_value !== (div1_class_value = "progress-bar " + /*classesTrack*/ ctx2[6] + " svelte-12wvf64")) { attr(div1, "class", div1_class_value); } if (dirty & /*labelledby*/ 8) { attr( div1, "aria-labelledby", /*labelledby*/ ctx2[3] ); } if (dirty & /*value*/ 1) { attr( div1, "aria-valuenow", /*value*/ ctx2[0] ); } if (dirty & /*min*/ 2) { attr( div1, "aria-valuemin", /*min*/ ctx2[1] ); } if (dirty & /*max, min*/ 6 && div1_aria_valuemax_value !== (div1_aria_valuemax_value = /*max*/ ctx2[2] - /*min*/ ctx2[1])) { attr(div1, "aria-valuemax", div1_aria_valuemax_value); } }, i: noop, o: noop, d(detaching) { if (detaching) { detach(div1); } } }; } const cTrack$1 = "w-full overflow-hidden"; const cMeter = "h-full"; function instance$j($$self, $$props, $$invalidate) { let fillPercent; let indeterminate; let classesIndeterminate; let classesTrack; let classesMeter; let { value = void 0 } = $$props; let { min = 0 } = $$props; let { max: max2 = 100 } = $$props; let { height = "h-2" } = $$props; let { rounded = "rounded-token" } = $$props; let { transition = "transition-[width]" } = $$props; let { animIndeterminate = "anim-indeterminate" } = $$props; let { meter = "bg-surface-900-50-token" } = $$props; let { track = "bg-surface-200-700-token" } = $$props; let { labelledby = "" } = $$props; $$self.$$set = ($$new_props) => { $$invalidate(15, $$props = assign(assign({}, $$props), exclude_internal_props($$new_props))); if ("value" in $$new_props) $$invalidate(0, value = $$new_props.value); if ("min" in $$new_props) $$invalidate(1, min = $$new_props.min); if ("max" in $$new_props) $$invalidate(2, max2 = $$new_props.max); if ("height" in $$new_props) $$invalidate(8, height = $$new_props.height); if ("rounded" in $$new_props) $$invalidate(9, rounded = $$new_props.rounded); if ("transition" in $$new_props) $$invalidate(10, transition = $$new_props.transition); if ("animIndeterminate" in $$new_props) $$invalidate(11, animIndeterminate = $$new_props.animIndeterminate); if ("meter" in $$new_props) $$invalidate(12, meter = $$new_props.meter); if ("track" in $$new_props) $$invalidate(13, track = $$new_props.track); if ("labelledby" in $$new_props) $$invalidate(3, labelledby = $$new_props.labelledby); }; $$self.$$.update = () => { if ($$self.$$.dirty & /*value, min, max*/ 7) { $$invalidate(7, fillPercent = value ? 100 * (value - min) / (max2 - min) : 0); } if ($$self.$$.dirty & /*value*/ 1) { $$invalidate(4, indeterminate = value === void 0 || value < 0); } if ($$self.$$.dirty & /*indeterminate, animIndeterminate*/ 2064) { $$invalidate(14, classesIndeterminate = indeterminate ? animIndeterminate : ""); } $$invalidate(6, classesTrack = `${cTrack$1} ${track} ${height} ${rounded} ${$$props.class ?? ""}`); if ($$self.$$.dirty & /*meter, rounded, classesIndeterminate, transition*/ 22016) { $$invalidate(5, classesMeter = `${cMeter} ${meter} ${rounded} ${classesIndeterminate} ${transition}`); } }; $$props = exclude_internal_props($$props); return [ value, min, max2, labelledby, indeterminate, classesMeter, classesTrack, fillPercent, height, rounded, transition, animIndeterminate, meter, track, classesIndeterminate ]; } class ProgressBar extends SvelteComponent { constructor(options) { super(); init(this, options, instance$j, create_fragment$j, safe_not_equal, { value: 0, min: 1, max: 2, height: 8, rounded: 9, transition: 10, animIndeterminate: 11, meter: 12, track: 13, labelledby: 3 }); } } function create_if_block$d(ctx) { let text_1; let text_1_class_value; let current; const default_slot_template = ( /*#slots*/ ctx[16].default ); const default_slot = create_slot( default_slot_template, ctx, /*$$scope*/ ctx[15], null ); return { c() { text_1 = svg_element("text"); if (default_slot) default_slot.c(); attr(text_1, "x", "50%"); attr(text_1, "y", "50%"); attr(text_1, "text-anchor", "middle"); attr(text_1, "dominant-baseline", "middle"); attr(text_1, "font-weight", "bold"); attr( text_1, "font-size", /*font*/ ctx[2] ); attr(text_1, "class", text_1_class_value = "progress-radial-text " + /*fill*/ ctx[7]); }, m(target, anchor) { insert(target, text_1, anchor); if (default_slot) { default_slot.m(text_1, null); } current = true; }, p(ctx2, dirty) { if (default_slot) { if (default_slot.p && (!current || dirty & /*$$scope*/ 32768)) { update_slot_base( default_slot, default_slot_template, ctx2, /*$$scope*/ ctx2[15], !current ? get_all_dirty_from_scope( /*$$scope*/ ctx2[15] ) : get_slot_changes( default_slot_template, /*$$scope*/ ctx2[15], dirty, null ), null ); } } if (!current || dirty & /*font*/ 4) { attr( text_1, "font-size", /*font*/ ctx2[2] ); } if (!current || dirty & /*fill*/ 128 && text_1_class_value !== (text_1_class_value = "progress-radial-text " + /*fill*/ ctx2[7])) { attr(text_1, "class", text_1_class_value); } }, i(local) { if (current) return; transition_in(default_slot, local); current = true; }, o(local) { transition_out(default_slot, local); current = false; }, d(detaching) { if (detaching) { detach(text_1); } if (default_slot) default_slot.d(detaching); } }; } function create_fragment$i(ctx) { let figure; let svg; let circle0; let circle0_class_value; let circle1; let circle1_class_value; let style_stroke_dasharray = `${/*circumference*/ ctx[9]} ${/*circumference*/ ctx[9]}`; let figure_class_value; let figure_aria_valuenow_value; let figure_aria_valuetext_value; let current; let if_block = ( /*value*/ ctx[0] != void 0 && /*value*/ ctx[0] >= 0 && /*$$slots*/ ctx[13].default && create_if_block$d(ctx) ); return { c() { figure = element("figure"); svg = svg_element("svg"); circle0 = svg_element("circle"); circle1 = svg_element("circle"); if (if_block) if_block.c(); attr(circle0, "class", circle0_class_value = "progress-radial-track " + cBaseTrack + " " + /*track*/ ctx[6]); attr( circle0, "stroke-width", /*stroke*/ ctx[1] ); attr( circle0, "r", /*radius*/ ctx[12] ); attr(circle0, "cx", "50%"); attr(circle0, "cy", "50%"); attr(circle1, "class", circle1_class_value = "progress-radial-meter " + cBaseMeter + " " + /*meter*/ ctx[5] + " " + /*transition*/ ctx[4]); attr( circle1, "stroke-width", /*stroke*/ ctx[1] ); attr( circle1, "r", /*radius*/ ctx[12] ); attr(circle1, "cx", "50%"); attr(circle1, "cy", "50%"); attr( circle1, "stroke-linecap", /*strokeLinecap*/ ctx[3] ); set_style(circle1, "stroke-dasharray", style_stroke_dasharray); set_style( circle1, "stroke-dashoffset", /*dashoffset*/ ctx[10] ); attr(svg, "viewBox", "0 0 " + baseSize + " " + baseSize); attr(svg, "class", "rounded-full"); toggle_class( svg, "animate-spin", /*value*/ ctx[0] === void 0 ); attr(figure, "class", figure_class_value = "progress-radial " + /*classesBase*/ ctx[11]); attr(figure, "data-testid", "progress-radial"); attr(figure, "role", "meter"); attr( figure, "aria-labelledby", /*labelledby*/ ctx[8] ); attr(figure, "aria-valuenow", figure_aria_valuenow_value = /*value*/ ctx[0] || 0); attr(figure, "aria-valuetext", figure_aria_valuetext_value = /*value*/ ctx[0] ? `${/*value*/ ctx[0]}%` : "Indeterminate Spinner"); attr(figure, "aria-valuemin", 0); attr(figure, "aria-valuemax", 100); }, m(target, anchor) { insert(target, figure, anchor); append(figure, svg); append(svg, circle0); append(svg, circle1); if (if_block) if_block.m(svg, null); current = true; }, p(ctx2, [dirty]) { if (!current || dirty & /*track*/ 64 && circle0_class_value !== (circle0_class_value = "progress-radial-track " + cBaseTrack + " " + /*track*/ ctx2[6])) { attr(circle0, "class", circle0_class_value); } if (!current || dirty & /*stroke*/ 2) { attr( circle0, "stroke-width", /*stroke*/ ctx2[1] ); } if (!current || dirty & /*meter, transition*/ 48 && circle1_class_value !== (circle1_class_value = "progress-radial-meter " + cBaseMeter + " " + /*meter*/ ctx2[5] + " " + /*transition*/ ctx2[4])) { attr(circle1, "class", circle1_class_value); } if (!current || dirty & /*stroke*/ 2) { attr( circle1, "stroke-width", /*stroke*/ ctx2[1] ); } if (!current || dirty & /*strokeLinecap*/ 8) { attr( circle1, "stroke-linecap", /*strokeLinecap*/ ctx2[3] ); } if (dirty & /*circumference*/ 512 && style_stroke_dasharray !== (style_stroke_dasharray = `${/*circumference*/ ctx2[9]} ${/*circumference*/ ctx2[9]}`)) { set_style(circle1, "stroke-dasharray", style_stroke_dasharray); } if (dirty & /*dashoffset*/ 1024) { set_style( circle1, "stroke-dashoffset", /*dashoffset*/ ctx2[10] ); } if ( /*value*/ ctx2[0] != void 0 && /*value*/ ctx2[0] >= 0 && /*$$slots*/ ctx2[13].default ) { if (if_block) { if_block.p(ctx2, dirty); if (dirty & /*value, $$slots*/ 8193) { transition_in(if_block, 1); } } else { if_block = create_if_block$d(ctx2); if_block.c(); transition_in(if_block, 1); if_block.m(svg, null); } } else if (if_block) { group_outros(); transition_out(if_block, 1, 1, () => { if_block = null; }); check_outros(); } if (!current || dirty & /*value, undefined*/ 1) { toggle_class( svg, "animate-spin", /*value*/ ctx2[0] === void 0 ); } if (!current || dirty & /*classesBase*/ 2048 && figure_class_value !== (figure_class_value = "progress-radial " + /*classesBase*/ ctx2[11])) { attr(figure, "class", figure_class_value); } if (!current || dirty & /*labelledby*/ 256) { attr( figure, "aria-labelledby", /*labelledby*/ ctx2[8] ); } if (!current || dirty & /*value*/ 1 && figure_aria_valuenow_value !== (figure_aria_valuenow_value = /*value*/ ctx2[0] || 0)) { attr(figure, "aria-valuenow", figure_aria_valuenow_value); } if (!current || dirty & /*value*/ 1 && figure_aria_valuetext_value !== (figure_aria_valuetext_value = /*value*/ ctx2[0] ? `${/*value*/ ctx2[0]}%` : "Indeterminate Spinner")) { attr(figure, "aria-valuetext", figure_aria_valuetext_value); } }, i(local) { if (current) return; transition_in(if_block); current = true; }, o(local) { transition_out(if_block); current = false; }, d(detaching) { if (detaching) { detach(figure); } if (if_block) if_block.d(); } }; } const cBase$6 = "progress-radial relative overflow-hidden"; const cBaseTrack = "fill-transparent"; const cBaseMeter = "fill-transparent -rotate-90 origin-[50%_50%]"; const baseSize = 512; function instance$i($$self, $$props, $$invalidate) { let classesBase; let { $$slots: slots = {}, $$scope } = $$props; const $$slots = compute_slots(slots); let { value = void 0 } = $$props; let { stroke = 40 } = $$props; let { font = 56 } = $$props; let { strokeLinecap = "butt" } = $$props; let { transition = "transition-[stroke-dashoffset]" } = $$props; let { width = "w-36" } = $$props; let { meter = "stroke-surface-900 dark:stroke-surface-50" } = $$props; let { track = "stroke-surface-500/30" } = $$props; let { fill = "fill-token" } = $$props; let { labelledby = "" } = $$props; const radius = baseSize / 2 - stroke / 2; let circumference = radius; let dashoffset; function setProgress(percent) { $$invalidate(9, circumference = radius * 2 * Math.PI); $$invalidate(10, dashoffset = circumference - percent / 100 * circumference); } setProgress(0); afterUpdate(() => { setProgress(value === void 0 ? 25 : value); }); $$self.$$set = ($$new_props) => { $$invalidate(18, $$props = assign(assign({}, $$props), exclude_internal_props($$new_props))); if ("value" in $$new_props) $$invalidate(0, value = $$new_props.value); if ("stroke" in $$new_props) $$invalidate(1, stroke = $$new_props.stroke); if ("font" in $$new_props) $$invalidate(2, font = $$new_props.font); if ("strokeLinecap" in $$new_props) $$invalidate(3, strokeLinecap = $$new_props.strokeLinecap); if ("transition" in $$new_props) $$invalidate(4, transition = $$new_props.transition); if ("width" in $$new_props) $$invalidate(14, width = $$new_props.width); if ("meter" in $$new_props) $$invalidate(5, meter = $$new_props.meter); if ("track" in $$new_props) $$invalidate(6, track = $$new_props.track); if ("fill" in $$new_props) $$invalidate(7, fill = $$new_props.fill); if ("labelledby" in $$new_props) $$invalidate(8, labelledby = $$new_props.labelledby); if ("$$scope" in $$new_props) $$invalidate(15, $$scope = $$new_props.$$scope); }; $$self.$$.update = () => { $$invalidate(11, classesBase = `${cBase$6} ${width} ${$$props.class ?? ""}`); }; $$props = exclude_internal_props($$props); return [ value, stroke, font, strokeLinecap, transition, meter, track, fill, labelledby, circumference, dashoffset, classesBase, radius, $$slots, width, $$scope, slots ]; } class ProgressRadial extends SvelteComponent { constructor(options) { super(); init(this, options, instance$i, create_fragment$i, safe_not_equal, { value: 0, stroke: 1, font: 2, strokeLinecap: 3, transition: 4, width: 14, meter: 5, track: 6, fill: 7, labelledby: 8 }); } } function create_fragment$h(ctx) { let div; let div_class_value; let current; const default_slot_template = ( /*#slots*/ ctx[15].default ); const default_slot = create_slot( default_slot_template, ctx, /*$$scope*/ ctx[14], null ); return { c() { div = element("div"); if (default_slot) default_slot.c(); attr(div, "class", div_class_value = "radio-group " + /*classesBase*/ ctx[1]); attr(div, "data-testid", "radio-group"); attr(div, "role", "radiogroup"); attr( div, "aria-labelledby", /*labelledby*/ ctx[0] ); }, m(target, anchor) { insert(target, div, anchor); if (default_slot) { default_slot.m(div, null); } current = true; }, p(ctx2, [dirty]) { if (default_slot) { if (default_slot.p && (!current || dirty & /*$$scope*/ 16384)) { update_slot_base( default_slot, default_slot_template, ctx2, /*$$scope*/ ctx2[14], !current ? get_all_dirty_from_scope( /*$$scope*/ ctx2[14] ) : get_slot_changes( default_slot_template, /*$$scope*/ ctx2[14], dirty, null ), null ); } } if (!current || dirty & /*classesBase*/ 2 && div_class_value !== (div_class_value = "radio-group " + /*classesBase*/ ctx2[1])) { attr(div, "class", div_class_value); } if (!current || dirty & /*labelledby*/ 1) { attr( div, "aria-labelledby", /*labelledby*/ ctx2[0] ); } }, i(local) { if (current) return; transition_in(default_slot, local); current = true; }, o(local) { transition_out(default_slot, local); current = false; }, d(detaching) { if (detaching) { detach(div); } if (default_slot) default_slot.d(detaching); } }; } const cBase$5 = "p-1"; function instance$h($$self, $$props, $$invalidate) { let classesBase; let { $$slots: slots = {}, $$scope } = $$props; let { display = "inline-flex" } = $$props; let { flexDirection = "flex-row" } = $$props; let { gap = "gap-1" } = $$props; let { background = "bg-surface-200-700-token" } = $$props; let { border = "border-token border-surface-400-500-token" } = $$props; let { rounded = "rounded-token" } = $$props; let { padding = "px-4 py-1" } = $$props; let { active: active2 = "variant-filled" } = $$props; let { hover = "hover:variant-soft" } = $$props; let { color = "" } = $$props; let { fill = "" } = $$props; let { regionLabel = "" } = $$props; let { labelledby = "" } = $$props; setContext("rounded", rounded); setContext("padding", padding); setContext("active", active2); setContext("hover", hover); setContext("color", color); setContext("fill", fill); setContext("regionLabel", regionLabel); $$self.$$set = ($$new_props) => { $$invalidate(16, $$props = assign(assign({}, $$props), exclude_internal_props($$new_props))); if ("display" in $$new_props) $$invalidate(2, display = $$new_props.display); if ("flexDirection" in $$new_props) $$invalidate(3, flexDirection = $$new_props.flexDirection); if ("gap" in $$new_props) $$invalidate(4, gap = $$new_props.gap); if ("background" in $$new_props) $$invalidate(5, background = $$new_props.background); if ("border" in $$new_props) $$invalidate(6, border = $$new_props.border); if ("rounded" in $$new_props) $$invalidate(7, rounded = $$new_props.rounded); if ("padding" in $$new_props) $$invalidate(8, padding = $$new_props.padding); if ("active" in $$new_props) $$invalidate(9, active2 = $$new_props.active); if ("hover" in $$new_props) $$invalidate(10, hover = $$new_props.hover); if ("color" in $$new_props) $$invalidate(11, color = $$new_props.color); if ("fill" in $$new_props) $$invalidate(12, fill = $$new_props.fill); if ("regionLabel" in $$new_props) $$invalidate(13, regionLabel = $$new_props.regionLabel); if ("labelledby" in $$new_props) $$invalidate(0, labelledby = $$new_props.labelledby); if ("$$scope" in $$new_props) $$invalidate(14, $$scope = $$new_props.$$scope); }; $$self.$$.update = () => { $$invalidate(1, classesBase = `${cBase$5} ${display} ${flexDirection} ${gap} ${background} ${border} ${rounded} ${$$props.class ?? ""}`); }; $$props = exclude_internal_props($$props); return [ labelledby, classesBase, display, flexDirection, gap, background, border, rounded, padding, active2, hover, color, fill, regionLabel, $$scope, slots ]; } class RadioGroup extends SvelteComponent { constructor(options) { super(); init(this, options, instance$h, create_fragment$h, safe_not_equal, { display: 2, flexDirection: 3, gap: 4, background: 5, border: 6, rounded: 7, padding: 8, active: 9, hover: 10, color: 11, fill: 12, regionLabel: 13, labelledby: 0 }); } } function create_fragment$g(ctx) { let label_1; let div1; let div0; let input; let t2; let div1_class_value; let label_1_class_value; let current; let binding_group; let mounted; let dispose; let input_levels = [ { type: "radio" }, { name: ( /*name*/ ctx[1] ) }, { __value: ( /*value*/ ctx[2] ) }, /*prunedRestProps*/ ctx[11](), { tabindex: "-1" } ]; let input_data = {}; for (let i = 0; i < input_levels.length; i += 1) { input_data = assign(input_data, input_levels[i]); } const default_slot_template = ( /*#slots*/ ctx[21].default ); const default_slot = create_slot( default_slot_template, ctx, /*$$scope*/ ctx[20], null ); binding_group = init_binding_group( /*$$binding_groups*/ ctx[29][0] ); return { c() { label_1 = element("label"); div1 = element("div"); div0 = element("div"); input = element("input"); t2 = space(); if (default_slot) default_slot.c(); set_attributes(input, input_data); attr(div0, "class", "h-0 w-0 overflow-hidden"); attr(div1, "class", div1_class_value = "radio-item " + /*classesWrapper*/ ctx[8]); attr(div1, "data-testid", "radio-item"); attr(div1, "role", "radio"); attr( div1, "aria-checked", /*checked*/ ctx[6] ); attr( div1, "aria-label", /*label*/ ctx[4] ); attr(div1, "tabindex", "0"); attr( div1, "title", /*title*/ ctx[3] ); attr(label_1, "class", label_1_class_value = "radio-label " + /*classsBase*/ ctx[9] + " " + /*regionLabel*/ ctx[5]); binding_group.p(input); }, m(target, anchor) { insert(target, label_1, anchor); append(label_1, div1); append(div1, div0); append(div0, input); if (input.autofocus) input.focus(); ctx[27](input); input.checked = input.__value === /*group*/ ctx[0]; append(div1, t2); if (default_slot) { default_slot.m(div1, null); } current = true; if (!mounted) { dispose = [ listen( input, "change", /*input_change_handler*/ ctx[28] ), listen( input, "click", /*click_handler*/ ctx[25] ), listen( input, "change", /*change_handler*/ ctx[26] ), listen( div1, "keydown", /*onKeyDown*/ ctx[10] ), listen( div1, "keydown", /*keydown_handler*/ ctx[22] ), listen( div1, "keyup", /*keyup_handler*/ ctx[23] ), listen( div1, "keypress", /*keypress_handler*/ ctx[24] ) ]; mounted = true; } }, p(ctx2, dirty) { set_attributes(input, input_data = get_spread_update(input_levels, [ { type: "radio" }, (!current || dirty[0] & /*name*/ 2) && { name: ( /*name*/ ctx2[1] ) }, (!current || dirty[0] & /*value*/ 4) && { __value: ( /*value*/ ctx2[2] ) }, /*prunedRestProps*/ ctx2[11](), { tabindex: "-1" } ])); if (dirty[0] & /*group*/ 1) { input.checked = input.__value === /*group*/ ctx2[0]; } if (default_slot) { if (default_slot.p && (!current || dirty[0] & /*$$scope*/ 1048576)) { update_slot_base( default_slot, default_slot_template, ctx2, /*$$scope*/ ctx2[20], !current ? get_all_dirty_from_scope( /*$$scope*/ ctx2[20] ) : get_slot_changes( default_slot_template, /*$$scope*/ ctx2[20], dirty, null ), null ); } } if (!current || dirty[0] & /*classesWrapper*/ 256 && div1_class_value !== (div1_class_value = "radio-item " + /*classesWrapper*/ ctx2[8])) { attr(div1, "class", div1_class_value); } if (!current || dirty[0] & /*checked*/ 64) { attr( div1, "aria-checked", /*checked*/ ctx2[6] ); } if (!current || dirty[0] & /*label*/ 16) { attr( div1, "aria-label", /*label*/ ctx2[4] ); } if (!current || dirty[0] & /*title*/ 8) { attr( div1, "title", /*title*/ ctx2[3] ); } if (!current || dirty[0] & /*classsBase, regionLabel*/ 544 && label_1_class_value !== (label_1_class_value = "radio-label " + /*classsBase*/ ctx2[9] + " " + /*regionLabel*/ ctx2[5])) { attr(label_1, "class", label_1_class_value); } }, i(local) { if (current) return; transition_in(default_slot, local); current = true; }, o(local) { transition_out(default_slot, local); current = false; }, d(detaching) { if (detaching) { detach(label_1); } ctx[27](null); if (default_slot) default_slot.d(detaching); binding_group.r(); mounted = false; run_all(dispose); } }; } const cBase$4 = "flex-auto"; const cWrapper = "text-base text-center cursor-pointer"; const cDisabled = "opacity-50 cursor-not-allowed"; function instance$g($$self, $$props, $$invalidate) { let checked; let classesActive; let classesDisabled; let classsBase; let classesWrapper; const omit_props_names = [ "group", "name", "value", "title", "label", "rounded", "padding", "active", "hover", "color", "fill", "regionLabel" ]; let $$restProps = compute_rest_props($$props, omit_props_names); let { $$slots: slots = {}, $$scope } = $$props; let { group } = $$props; let { name } = $$props; let { value } = $$props; let { title = "" } = $$props; let { label = "" } = $$props; let { rounded = getContext("rounded") } = $$props; let { padding = getContext("padding") } = $$props; let { active: active2 = getContext("active") } = $$props; let { hover = getContext("hover") } = $$props; let { color = getContext("color") } = $$props; let { fill = getContext("fill") } = $$props; let { regionLabel = getContext("regionLabel") } = $$props; let elemInput; function onKeyDown(event) { if (["Enter", "Space"].includes(event.code)) { event.preventDefault(); elemInput.click(); } } function prunedRestProps() { delete $$restProps.class; return $$restProps; } const $$binding_groups = [[]]; function keydown_handler(event) { bubble.call(this, $$self, event); } function keyup_handler(event) { bubble.call(this, $$self, event); } function keypress_handler(event) { bubble.call(this, $$self, event); } function click_handler(event) { bubble.call(this, $$self, event); } function change_handler(event) { bubble.call(this, $$self, event); } function input_binding($$value) { binding_callbacks[$$value ? "unshift" : "push"](() => { elemInput = $$value; $$invalidate(7, elemInput); }); } function input_change_handler() { group = this.__value; $$invalidate(0, group); } $$self.$$set = ($$new_props) => { $$invalidate(31, $$props = assign(assign({}, $$props), exclude_internal_props($$new_props))); $$invalidate(30, $$restProps = compute_rest_props($$props, omit_props_names)); if ("group" in $$new_props) $$invalidate(0, group = $$new_props.group); if ("name" in $$new_props) $$invalidate(1, name = $$new_props.name); if ("value" in $$new_props) $$invalidate(2, value = $$new_props.value); if ("title" in $$new_props) $$invalidate(3, title = $$new_props.title); if ("label" in $$new_props) $$invalidate(4, label = $$new_props.label); if ("rounded" in $$new_props) $$invalidate(12, rounded = $$new_props.rounded); if ("padding" in $$new_props) $$invalidate(13, padding = $$new_props.padding); if ("active" in $$new_props) $$invalidate(14, active2 = $$new_props.active); if ("hover" in $$new_props) $$invalidate(15, hover = $$new_props.hover); if ("color" in $$new_props) $$invalidate(16, color = $$new_props.color); if ("fill" in $$new_props) $$invalidate(17, fill = $$new_props.fill); if ("regionLabel" in $$new_props) $$invalidate(5, regionLabel = $$new_props.regionLabel); if ("$$scope" in $$new_props) $$invalidate(20, $$scope = $$new_props.$$scope); }; $$self.$$.update = () => { if ($$self.$$.dirty[0] & /*value, group*/ 5) { $$invalidate(6, checked = value === group); } if ($$self.$$.dirty[0] & /*checked, active, color, fill, hover*/ 245824) { $$invalidate(19, classesActive = checked ? `${active2} ${color} ${fill}` : hover); } $$invalidate(18, classesDisabled = $$props.disabled ? cDisabled : ""); $$invalidate(8, classesWrapper = `${cWrapper} ${padding} ${rounded} ${classesActive} ${classesDisabled} ${$$props.class ?? ""}`); }; $$invalidate(9, classsBase = `${cBase$4}`); $$props = exclude_internal_props($$props); return [ group, name, value, title, label, regionLabel, checked, elemInput, classesWrapper, classsBase, onKeyDown, prunedRestProps, rounded, padding, active2, hover, color, fill, classesDisabled, classesActive, $$scope, slots, keydown_handler, keyup_handler, keypress_handler, click_handler, change_handler, input_binding, input_change_handler, $$binding_groups ]; } class RadioItem extends SvelteComponent { constructor(options) { super(); init( this, options, instance$g, create_fragment$g, safe_not_equal, { group: 0, name: 1, value: 2, title: 3, label: 4, rounded: 12, padding: 13, active: 14, hover: 15, color: 16, fill: 17, regionLabel: 5 }, null, [-1, -1] ); } } const get_trail_slot_changes = (dirty) => ({}); const get_trail_slot_context = (ctx) => ({}); function get_each_context$4(ctx, list, i) { const child_ctx = ctx.slice(); child_ctx[23] = list[i]; return child_ctx; } function create_if_block_2$5(ctx) { let label_1; let current; const default_slot_template = ( /*#slots*/ ctx[15].default ); const default_slot = create_slot( default_slot_template, ctx, /*$$scope*/ ctx[14], null ); return { c() { label_1 = element("label"); if (default_slot) default_slot.c(); attr(label_1, "class", "range-slider-label " + cBaseLabel); attr( label_1, "for", /*id*/ ctx[2] ); }, m(target, anchor) { insert(target, label_1, anchor); if (default_slot) { default_slot.m(label_1, null); } current = true; }, p(ctx2, dirty) { if (default_slot) { if (default_slot.p && (!current || dirty & /*$$scope*/ 16384)) { update_slot_base( default_slot, default_slot_template, ctx2, /*$$scope*/ ctx2[14], !current ? get_all_dirty_from_scope( /*$$scope*/ ctx2[14] ) : get_slot_changes( default_slot_template, /*$$scope*/ ctx2[14], dirty, null ), null ); } } if (!current || dirty & /*id*/ 4) { attr( label_1, "for", /*id*/ ctx2[2] ); } }, i(local) { if (current) return; transition_in(default_slot, local); current = true; }, o(local) { transition_out(default_slot, local); current = false; }, d(detaching) { if (detaching) { detach(label_1); } if (default_slot) default_slot.d(detaching); } }; } function create_if_block_1$7(ctx) { let datalist; let datalist_id_value; let each_value = ensure_array_like( /*tickmarks*/ ctx[8] ); let each_blocks = []; for (let i = 0; i < each_value.length; i += 1) { each_blocks[i] = create_each_block$4(get_each_context$4(ctx, each_value, i)); } return { c() { datalist = element("datalist"); for (let i = 0; i < each_blocks.length; i += 1) { each_blocks[i].c(); } attr(datalist, "id", datalist_id_value = "tickmarks-" + /*id*/ ctx[2]); attr(datalist, "class", "range-slider-ticks"); }, m(target, anchor) { insert(target, datalist, anchor); for (let i = 0; i < each_blocks.length; i += 1) { if (each_blocks[i]) { each_blocks[i].m(datalist, null); } } }, p(ctx2, dirty) { if (dirty & /*tickmarks*/ 256) { each_value = ensure_array_like( /*tickmarks*/ ctx2[8] ); let i; for (i = 0; i < each_value.length; i += 1) { const child_ctx = get_each_context$4(ctx2, each_value, i); if (each_blocks[i]) { each_blocks[i].p(child_ctx, dirty); } else { each_blocks[i] = create_each_block$4(child_ctx); each_blocks[i].c(); each_blocks[i].m(datalist, null); } } for (; i < each_blocks.length; i += 1) { each_blocks[i].d(1); } each_blocks.length = each_value.length; } if (dirty & /*id*/ 4 && datalist_id_value !== (datalist_id_value = "tickmarks-" + /*id*/ ctx2[2])) { attr(datalist, "id", datalist_id_value); } }, d(detaching) { if (detaching) { detach(datalist); } destroy_each(each_blocks, detaching); } }; } function create_each_block$4(ctx) { let option; let option_value_value; let option_label_value; return { c() { option = element("option"); option.__value = option_value_value = /*tm*/ ctx[23]; set_input_value(option, option.__value); attr(option, "label", option_label_value = /*tm*/ ctx[23]); }, m(target, anchor) { insert(target, option, anchor); }, p(ctx2, dirty) { if (dirty & /*tickmarks*/ 256 && option_value_value !== (option_value_value = /*tm*/ ctx2[23])) { option.__value = option_value_value; set_input_value(option, option.__value); } if (dirty & /*tickmarks*/ 256 && option_label_value !== (option_label_value = /*tm*/ ctx2[23])) { attr(option, "label", option_label_value); } }, d(detaching) { if (detaching) { detach(option); } } }; } function create_if_block$c(ctx) { let div; let current; const trail_slot_template = ( /*#slots*/ ctx[15].trail ); const trail_slot = create_slot( trail_slot_template, ctx, /*$$scope*/ ctx[14], get_trail_slot_context ); return { c() { div = element("div"); if (trail_slot) trail_slot.c(); attr(div, "class", "range-slider-trail"); }, m(target, anchor) { insert(target, div, anchor); if (trail_slot) { trail_slot.m(div, null); } current = true; }, p(ctx2, dirty) { if (trail_slot) { if (trail_slot.p && (!current || dirty & /*$$scope*/ 16384)) { update_slot_base( trail_slot, trail_slot_template, ctx2, /*$$scope*/ ctx2[14], !current ? get_all_dirty_from_scope( /*$$scope*/ ctx2[14] ) : get_slot_changes( trail_slot_template, /*$$scope*/ ctx2[14], dirty, get_trail_slot_changes ), get_trail_slot_context ); } } }, i(local) { if (current) return; transition_in(trail_slot, local); current = true; }, o(local) { transition_out(trail_slot, local); current = false; }, d(detaching) { if (detaching) { detach(div); } if (trail_slot) trail_slot.d(detaching); } }; } function create_fragment$f(ctx) { let div1; let t0; let div0; let input; let input_class_value; let input_list_value; let t1; let t2; let div1_class_value; let current; let mounted; let dispose; let if_block0 = ( /*$$slots*/ ctx[12].default && create_if_block_2$5(ctx) ); let input_levels = [ { type: "range" }, { id: ( /*id*/ ctx[2] ) }, { name: ( /*name*/ ctx[1] ) }, { class: input_class_value = "range-slider-input " + /*classesInput*/ ctx[9] }, { list: input_list_value = "tickmarks-" + /*id*/ ctx[2] }, { "aria-label": ( /*label*/ ctx[7] ) }, { min: ( /*min*/ ctx[3] ) }, { max: ( /*max*/ ctx[4] ) }, { step: ( /*step*/ ctx[5] ) }, /*prunedRestProps*/ ctx[11]() ]; let input_data = {}; for (let i = 0; i < input_levels.length; i += 1) { input_data = assign(input_data, input_levels[i]); } let if_block1 = ( /*ticked*/ ctx[6] && /*tickmarks*/ ctx[8] && /*tickmarks*/ ctx[8].length && create_if_block_1$7(ctx) ); let if_block2 = ( /*$$slots*/ ctx[12].trail && create_if_block$c(ctx) ); return { c() { div1 = element("div"); if (if_block0) if_block0.c(); t0 = space(); div0 = element("div"); input = element("input"); t1 = space(); if (if_block1) if_block1.c(); t2 = space(); if (if_block2) if_block2.c(); set_attributes(input, input_data); attr(div0, "class", "range-content " + cBaseContent); attr(div1, "class", div1_class_value = "range-slider " + /*classesBase*/ ctx[10]); attr(div1, "data-testid", "range-slider"); }, m(target, anchor) { insert(target, div1, anchor); if (if_block0) if_block0.m(div1, null); append(div1, t0); append(div1, div0); append(div0, input); if (input.autofocus) input.focus(); set_input_value( input, /*value*/ ctx[0] ); append(div0, t1); if (if_block1) if_block1.m(div0, null); append(div1, t2); if (if_block2) if_block2.m(div1, null); current = true; if (!mounted) { dispose = [ listen( input, "change", /*input_change_input_handler*/ ctx[19] ), listen( input, "input", /*input_change_input_handler*/ ctx[19] ), listen( input, "click", /*click_handler*/ ctx[16] ), listen( input, "change", /*change_handler*/ ctx[17] ), listen( input, "blur", /*blur_handler*/ ctx[18] ) ]; mounted = true; } }, p(ctx2, [dirty]) { if ( /*$$slots*/ ctx2[12].default ) { if (if_block0) { if_block0.p(ctx2, dirty); if (dirty & /*$$slots*/ 4096) { transition_in(if_block0, 1); } } else { if_block0 = create_if_block_2$5(ctx2); if_block0.c(); transition_in(if_block0, 1); if_block0.m(div1, t0); } } else if (if_block0) { group_outros(); transition_out(if_block0, 1, 1, () => { if_block0 = null; }); check_outros(); } set_attributes(input, input_data = get_spread_update(input_levels, [ { type: "range" }, (!current || dirty & /*id*/ 4) && { id: ( /*id*/ ctx2[2] ) }, (!current || dirty & /*name*/ 2) && { name: ( /*name*/ ctx2[1] ) }, (!current || dirty & /*classesInput*/ 512 && input_class_value !== (input_class_value = "range-slider-input " + /*classesInput*/ ctx2[9])) && { class: input_class_value }, (!current || dirty & /*id*/ 4 && input_list_value !== (input_list_value = "tickmarks-" + /*id*/ ctx2[2])) && { list: input_list_value }, (!current || dirty & /*label*/ 128) && { "aria-label": ( /*label*/ ctx2[7] ) }, (!current || dirty & /*min*/ 8) && { min: ( /*min*/ ctx2[3] ) }, (!current || dirty & /*max*/ 16) && { max: ( /*max*/ ctx2[4] ) }, (!current || dirty & /*step*/ 32) && { step: ( /*step*/ ctx2[5] ) }, /*prunedRestProps*/ ctx2[11]() ])); if (dirty & /*value*/ 1) { set_input_value( input, /*value*/ ctx2[0] ); } if ( /*ticked*/ ctx2[6] && /*tickmarks*/ ctx2[8] && /*tickmarks*/ ctx2[8].length ) { if (if_block1) { if_block1.p(ctx2, dirty); } else { if_block1 = create_if_block_1$7(ctx2); if_block1.c(); if_block1.m(div0, null); } } else if (if_block1) { if_block1.d(1); if_block1 = null; } if ( /*$$slots*/ ctx2[12].trail ) { if (if_block2) { if_block2.p(ctx2, dirty); if (dirty & /*$$slots*/ 4096) { transition_in(if_block2, 1); } } else { if_block2 = create_if_block$c(ctx2); if_block2.c(); transition_in(if_block2, 1); if_block2.m(div1, null); } } else if (if_block2) { group_outros(); transition_out(if_block2, 1, 1, () => { if_block2 = null; }); check_outros(); } if (!current || dirty & /*classesBase*/ 1024 && div1_class_value !== (div1_class_value = "range-slider " + /*classesBase*/ ctx2[10])) { attr(div1, "class", div1_class_value); } }, i(local) { if (current) return; transition_in(if_block0); transition_in(if_block2); current = true; }, o(local) { transition_out(if_block0); transition_out(if_block2); current = false; }, d(detaching) { if (detaching) { detach(div1); } if (if_block0) if_block0.d(); if (if_block1) if_block1.d(); if (if_block2) if_block2.d(); mounted = false; run_all(dispose); } }; } const cBase$3 = "space-y-2"; const cBaseLabel = ""; const cBaseContent = "flex justify-center py-2"; const cBaseInput = "w-full h-2"; function instance$f($$self, $$props, $$invalidate) { let classesBase; let classesInput; const omit_props_names = ["name", "id", "value", "min", "max", "step", "ticked", "accent", "label"]; let $$restProps = compute_rest_props($$props, omit_props_names); let { $$slots: slots = {}, $$scope } = $$props; const $$slots = compute_slots(slots); let { name } = $$props; let { id = String(Math.random()) } = $$props; let { value = 0 } = $$props; let { min = 0 } = $$props; let { max: max2 = 100 } = $$props; let { step: step2 = 1 } = $$props; let { ticked = false } = $$props; let { accent = "accent-surface-900 dark:accent-surface-50" } = $$props; let { label = "" } = $$props; let tickmarks; function setTicks() { if (ticked == false) return; $$invalidate(8, tickmarks = Array.from({ length: max2 - min + 1 }, (_, i) => i + min)); } if (ticked) setTicks(); afterUpdate(() => { setTicks(); }); function prunedRestProps() { delete $$restProps.class; return $$restProps; } function click_handler(event) { bubble.call(this, $$self, event); } function change_handler(event) { bubble.call(this, $$self, event); } function blur_handler(event) { bubble.call(this, $$self, event); } function input_change_input_handler() { value = to_number(this.value); $$invalidate(0, value); } $$self.$$set = ($$new_props) => { $$invalidate(22, $$props = assign(assign({}, $$props), exclude_internal_props($$new_props))); $$invalidate(21, $$restProps = compute_rest_props($$props, omit_props_names)); if ("name" in $$new_props) $$invalidate(1, name = $$new_props.name); if ("id" in $$new_props) $$invalidate(2, id = $$new_props.id); if ("value" in $$new_props) $$invalidate(0, value = $$new_props.value); if ("min" in $$new_props) $$invalidate(3, min = $$new_props.min); if ("max" in $$new_props) $$invalidate(4, max2 = $$new_props.max); if ("step" in $$new_props) $$invalidate(5, step2 = $$new_props.step); if ("ticked" in $$new_props) $$invalidate(6, ticked = $$new_props.ticked); if ("accent" in $$new_props) $$invalidate(13, accent = $$new_props.accent); if ("label" in $$new_props) $$invalidate(7, label = $$new_props.label); if ("$$scope" in $$new_props) $$invalidate(14, $$scope = $$new_props.$$scope); }; $$self.$$.update = () => { $$invalidate(10, classesBase = `${cBase$3} ${$$props.class ?? ""}`); if ($$self.$$.dirty & /*accent*/ 8192) { $$invalidate(9, classesInput = `${cBaseInput} ${accent}`); } }; $$props = exclude_internal_props($$props); return [ value, name, id, min, max2, step2, ticked, label, tickmarks, classesInput, classesBase, prunedRestProps, $$slots, accent, $$scope, slots, click_handler, change_handler, blur_handler, input_change_input_handler ]; } class RangeSlider extends SvelteComponent { constructor(options) { super(); init(this, options, instance$f, create_fragment$f, safe_not_equal, { name: 1, id: 2, value: 0, min: 3, max: 4, step: 5, ticked: 6, accent: 13, label: 7 }); } } function create_if_block$b(ctx) { let div; let current; const default_slot_template = ( /*#slots*/ ctx[22].default ); const default_slot = create_slot( default_slot_template, ctx, /*$$scope*/ ctx[21], null ); return { c() { div = element("div"); if (default_slot) default_slot.c(); attr(div, "class", "slide-toggle-text ml-3"); }, m(target, anchor) { insert(target, div, anchor); if (default_slot) { default_slot.m(div, null); } current = true; }, p(ctx2, dirty) { if (default_slot) { if (default_slot.p && (!current || dirty[0] & /*$$scope*/ 2097152)) { update_slot_base( default_slot, default_slot_template, ctx2, /*$$scope*/ ctx2[21], !current ? get_all_dirty_from_scope( /*$$scope*/ ctx2[21] ) : get_slot_changes( default_slot_template, /*$$scope*/ ctx2[21], dirty, null ), null ); } } }, i(local) { if (current) return; transition_in(default_slot, local); current = true; }, o(local) { transition_out(default_slot, local); current = false; }, d(detaching) { if (detaching) { detach(div); } if (default_slot) default_slot.d(detaching); } }; } function create_fragment$e(ctx) { let div2; let label_1; let input; let input_disabled_value; let t0; let div1; let div0; let div0_class_value; let div1_class_value; let t1; let label_1_class_value; let div2_class_value; let current; let mounted; let dispose; let input_levels = [ { type: "checkbox" }, { class: "slide-toggle-input hidden" }, { name: ( /*name*/ ctx[1] ) }, /*prunedRestProps*/ ctx[8](), { disabled: input_disabled_value = /*$$props*/ ctx[9].disabled } ]; let input_data = {}; for (let i = 0; i < input_levels.length; i += 1) { input_data = assign(input_data, input_levels[i]); } let if_block = ( /*$$slots*/ ctx[10].default && create_if_block$b(ctx) ); return { c() { div2 = element("div"); label_1 = element("label"); input = element("input"); t0 = space(); div1 = element("div"); div0 = element("div"); t1 = space(); if (if_block) if_block.c(); set_attributes(input, input_data); attr(div0, "class", div0_class_value = "slide-toggle-thumb " + /*classesThumb*/ ctx[3]); toggle_class( div0, "cursor-not-allowed", /*$$props*/ ctx[9].disabled ); attr(div1, "class", div1_class_value = "slide-toggle-track " + /*classesTrack*/ ctx[4]); toggle_class( div1, "cursor-not-allowed", /*$$props*/ ctx[9].disabled ); attr(label_1, "class", label_1_class_value = "slide-toggle-label " + /*classesLabel*/ ctx[5]); attr( div2, "id", /*label*/ ctx[2] ); attr(div2, "class", div2_class_value = "slide-toggle " + /*classesBase*/ ctx[6]); attr(div2, "data-testid", "slide-toggle"); attr(div2, "role", "switch"); attr( div2, "aria-label", /*label*/ ctx[2] ); attr( div2, "aria-checked", /*checked*/ ctx[0] ); attr(div2, "tabindex", "0"); }, m(target, anchor) { insert(target, div2, anchor); append(div2, label_1); append(label_1, input); if (input.autofocus) input.focus(); input.checked = /*checked*/ ctx[0]; append(label_1, t0); append(label_1, div1); append(div1, div0); append(label_1, t1); if (if_block) if_block.m(label_1, null); current = true; if (!mounted) { dispose = [ listen( input, "change", /*input_change_handler*/ ctx[31] ), listen( input, "click", /*click_handler*/ ctx[23] ), listen( input, "keydown", /*keydown_handler*/ ctx[24] ), listen( input, "keyup", /*keyup_handler*/ ctx[25] ), listen( input, "keypress", /*keypress_handler*/ ctx[26] ), listen( input, "mouseover", /*mouseover_handler*/ ctx[27] ), listen( input, "change", /*change_handler*/ ctx[28] ), listen( input, "focus", /*focus_handler*/ ctx[29] ), listen( input, "blur", /*blur_handler*/ ctx[30] ), listen( div2, "keydown", /*onKeyDown*/ ctx[7] ) ]; mounted = true; } }, p(ctx2, dirty) { set_attributes(input, input_data = get_spread_update(input_levels, [ { type: "checkbox" }, { class: "slide-toggle-input hidden" }, (!current || dirty[0] & /*name*/ 2) && { name: ( /*name*/ ctx2[1] ) }, /*prunedRestProps*/ ctx2[8](), (!current || dirty[0] & /*$$props*/ 512 && input_disabled_value !== (input_disabled_value = /*$$props*/ ctx2[9].disabled)) && { disabled: input_disabled_value } ])); if (dirty[0] & /*checked*/ 1) { input.checked = /*checked*/ ctx2[0]; } if (!current || dirty[0] & /*classesThumb*/ 8 && div0_class_value !== (div0_class_value = "slide-toggle-thumb " + /*classesThumb*/ ctx2[3])) { attr(div0, "class", div0_class_value); } if (!current || dirty[0] & /*classesThumb, $$props*/ 520) { toggle_class( div0, "cursor-not-allowed", /*$$props*/ ctx2[9].disabled ); } if (!current || dirty[0] & /*classesTrack*/ 16 && div1_class_value !== (div1_class_value = "slide-toggle-track " + /*classesTrack*/ ctx2[4])) { attr(div1, "class", div1_class_value); } if (!current || dirty[0] & /*classesTrack, $$props*/ 528) { toggle_class( div1, "cursor-not-allowed", /*$$props*/ ctx2[9].disabled ); } if ( /*$$slots*/ ctx2[10].default ) { if (if_block) { if_block.p(ctx2, dirty); if (dirty[0] & /*$$slots*/ 1024) { transition_in(if_block, 1); } } else { if_block = create_if_block$b(ctx2); if_block.c(); transition_in(if_block, 1); if_block.m(label_1, null); } } else if (if_block) { group_outros(); transition_out(if_block, 1, 1, () => { if_block = null; }); check_outros(); } if (!current || dirty[0] & /*classesLabel*/ 32 && label_1_class_value !== (label_1_class_value = "slide-toggle-label " + /*classesLabel*/ ctx2[5])) { attr(label_1, "class", label_1_class_value); } if (!current || dirty[0] & /*label*/ 4) { attr( div2, "id", /*label*/ ctx2[2] ); } if (!current || dirty[0] & /*classesBase*/ 64 && div2_class_value !== (div2_class_value = "slide-toggle " + /*classesBase*/ ctx2[6])) { attr(div2, "class", div2_class_value); } if (!current || dirty[0] & /*label*/ 4) { attr( div2, "aria-label", /*label*/ ctx2[2] ); } if (!current || dirty[0] & /*checked*/ 1) { attr( div2, "aria-checked", /*checked*/ ctx2[0] ); } }, i(local) { if (current) return; transition_in(if_block); current = true; }, o(local) { transition_out(if_block); current = false; }, d(detaching) { if (detaching) { detach(div2); } if (if_block) if_block.d(); mounted = false; run_all(dispose); } }; } const cBase$2 = "inline-block"; const cLabel = "unstyled flex items-center"; const cTrack = "flex transition-all duration-[200ms] cursor-pointer"; const cThumb = "w-[50%] h-full scale-[0.8] transition-all duration-[200ms] shadow"; function instance$e($$self, $$props, $$invalidate) { let cTrackActive; let cThumbBackground; let cThumbPos; let classesDisabled; let classesBase; let classesLabel; let classesTrack; let classesThumb; const omit_props_names = ["name", "checked", "size", "background", "active", "border", "rounded", "label"]; let $$restProps = compute_rest_props($$props, omit_props_names); let { $$slots: slots = {}, $$scope } = $$props; const $$slots = compute_slots(slots); const dispatch2 = createEventDispatcher(); let { name } = $$props; let { checked = false } = $$props; let { size = "md" } = $$props; let { background = "bg-surface-400 dark:bg-surface-700" } = $$props; let { active: active2 = "bg-surface-900 dark:bg-surface-300" } = $$props; let { border = "" } = $$props; let { rounded = "rounded-full" } = $$props; let { label = "" } = $$props; let trackSize; switch (size) { case "sm": trackSize = "w-12 h-6"; break; case "lg": trackSize = "w-20 h-10"; break; default: trackSize = "w-16 h-8"; } function onKeyDown(event) { if (["Enter", "Space"].includes(event.code)) { event.preventDefault(); dispatch2("keyup", event); const inputElem = event.currentTarget.firstChild; inputElem.click(); } } function prunedRestProps() { delete $$restProps.class; return $$restProps; } function click_handler(event) { bubble.call(this, $$self, event); } function keydown_handler(event) { bubble.call(this, $$self, event); } function keyup_handler(event) { bubble.call(this, $$self, event); } function keypress_handler(event) { bubble.call(this, $$self, event); } function mouseover_handler(event) { bubble.call(this, $$self, event); } function change_handler(event) { bubble.call(this, $$self, event); } function focus_handler(event) { bubble.call(this, $$self, event); } function blur_handler(event) { bubble.call(this, $$self, event); } function input_change_handler() { checked = this.checked; $$invalidate(0, checked); } $$self.$$set = ($$new_props) => { $$invalidate(9, $$props = assign(assign({}, $$props), exclude_internal_props($$new_props))); $$invalidate(33, $$restProps = compute_rest_props($$props, omit_props_names)); if ("name" in $$new_props) $$invalidate(1, name = $$new_props.name); if ("checked" in $$new_props) $$invalidate(0, checked = $$new_props.checked); if ("size" in $$new_props) $$invalidate(11, size = $$new_props.size); if ("background" in $$new_props) $$invalidate(12, background = $$new_props.background); if ("active" in $$new_props) $$invalidate(13, active2 = $$new_props.active); if ("border" in $$new_props) $$invalidate(14, border = $$new_props.border); if ("rounded" in $$new_props) $$invalidate(15, rounded = $$new_props.rounded); if ("label" in $$new_props) $$invalidate(2, label = $$new_props.label); if ("$$scope" in $$new_props) $$invalidate(21, $$scope = $$new_props.$$scope); }; $$self.$$.update = () => { if ($$self.$$.dirty[0] & /*checked, active, background*/ 12289) { $$invalidate(19, cTrackActive = checked ? active2 : `${background} cursor-pointer`); } if ($$self.$$.dirty[0] & /*checked*/ 1) { $$invalidate(18, cThumbBackground = checked ? "bg-white/75" : "bg-white"); } if ($$self.$$.dirty[0] & /*checked*/ 1) { $$invalidate(17, cThumbPos = checked ? "translate-x-full" : ""); } $$invalidate(20, classesDisabled = $$props.disabled === true ? "opacity-50" : "hover:brightness-[105%] dark:hover:brightness-110 cursor-pointer"); $$invalidate(6, classesBase = `${cBase$2} ${rounded} ${classesDisabled} ${$$props.class ?? ""}`); if ($$self.$$.dirty[0] & /*border, rounded, trackSize, cTrackActive*/ 638976) { $$invalidate(4, classesTrack = `${cTrack} ${border} ${rounded} ${trackSize} ${cTrackActive}`); } if ($$self.$$.dirty[0] & /*rounded, cThumbBackground, cThumbPos*/ 425984) { $$invalidate(3, classesThumb = `${cThumb} ${rounded} ${cThumbBackground} ${cThumbPos}`); } }; $$invalidate(5, classesLabel = `${cLabel}`); $$props = exclude_internal_props($$props); return [ checked, name, label, classesThumb, classesTrack, classesLabel, classesBase, onKeyDown, prunedRestProps, $$props, $$slots, size, background, active2, border, rounded, trackSize, cThumbPos, cThumbBackground, cTrackActive, classesDisabled, $$scope, slots, click_handler, keydown_handler, keyup_handler, keypress_handler, mouseover_handler, change_handler, focus_handler, blur_handler, input_change_handler ]; } class SlideToggle extends SvelteComponent { constructor(options) { super(); init( this, options, instance$e, create_fragment$e, safe_not_equal, { name: 1, checked: 0, size: 11, background: 12, active: 13, border: 14, rounded: 15, label: 2 }, null, [-1, -1] ); } } const get_panel_slot_changes = (dirty) => ({}); const get_panel_slot_context = (ctx) => ({}); function create_if_block$a(ctx) { let div; let div_class_value; let current; const panel_slot_template = ( /*#slots*/ ctx[17].panel ); const panel_slot = create_slot( panel_slot_template, ctx, /*$$scope*/ ctx[16], get_panel_slot_context ); return { c() { div = element("div"); if (panel_slot) panel_slot.c(); attr(div, "class", div_class_value = "tab-panel " + /*classesPanel*/ ctx[2]); attr(div, "role", "tabpanel"); attr( div, "aria-labelledby", /*panel*/ ctx[1] ); attr(div, "tabindex", "0"); }, m(target, anchor) { insert(target, div, anchor); if (panel_slot) { panel_slot.m(div, null); } current = true; }, p(ctx2, dirty) { if (panel_slot) { if (panel_slot.p && (!current || dirty & /*$$scope*/ 65536)) { update_slot_base( panel_slot, panel_slot_template, ctx2, /*$$scope*/ ctx2[16], !current ? get_all_dirty_from_scope( /*$$scope*/ ctx2[16] ) : get_slot_changes( panel_slot_template, /*$$scope*/ ctx2[16], dirty, get_panel_slot_changes ), get_panel_slot_context ); } } if (!current || dirty & /*classesPanel*/ 4 && div_class_value !== (div_class_value = "tab-panel " + /*classesPanel*/ ctx2[2])) { attr(div, "class", div_class_value); } if (!current || dirty & /*panel*/ 2) { attr( div, "aria-labelledby", /*panel*/ ctx2[1] ); } }, i(local) { if (current) return; transition_in(panel_slot, local); current = true; }, o(local) { transition_out(panel_slot, local); current = false; }, d(detaching) { if (detaching) { detach(div); } if (panel_slot) panel_slot.d(detaching); } }; } function create_fragment$d(ctx) { let div1; let div0; let div0_class_value; let t2; let div1_class_value; let current; const default_slot_template = ( /*#slots*/ ctx[17].default ); const default_slot = create_slot( default_slot_template, ctx, /*$$scope*/ ctx[16], null ); let if_block = ( /*$$slots*/ ctx[5].panel && create_if_block$a(ctx) ); return { c() { div1 = element("div"); div0 = element("div"); if (default_slot) default_slot.c(); t2 = space(); if (if_block) if_block.c(); attr(div0, "class", div0_class_value = "tab-list " + /*classesList*/ ctx[3]); attr(div0, "role", "tablist"); attr( div0, "aria-labelledby", /*labelledby*/ ctx[0] ); attr(div1, "class", div1_class_value = "tab-group " + /*classesBase*/ ctx[4]); attr(div1, "data-testid", "tab-group"); }, m(target, anchor) { insert(target, div1, anchor); append(div1, div0); if (default_slot) { default_slot.m(div0, null); } append(div1, t2); if (if_block) if_block.m(div1, null); current = true; }, p(ctx2, [dirty]) { if (default_slot) { if (default_slot.p && (!current || dirty & /*$$scope*/ 65536)) { update_slot_base( default_slot, default_slot_template, ctx2, /*$$scope*/ ctx2[16], !current ? get_all_dirty_from_scope( /*$$scope*/ ctx2[16] ) : get_slot_changes( default_slot_template, /*$$scope*/ ctx2[16], dirty, null ), null ); } } if (!current || dirty & /*classesList*/ 8 && div0_class_value !== (div0_class_value = "tab-list " + /*classesList*/ ctx2[3])) { attr(div0, "class", div0_class_value); } if (!current || dirty & /*labelledby*/ 1) { attr( div0, "aria-labelledby", /*labelledby*/ ctx2[0] ); } if ( /*$$slots*/ ctx2[5].panel ) { if (if_block) { if_block.p(ctx2, dirty); if (dirty & /*$$slots*/ 32) { transition_in(if_block, 1); } } else { if_block = create_if_block$a(ctx2); if_block.c(); transition_in(if_block, 1); if_block.m(div1, null); } } else if (if_block) { group_outros(); transition_out(if_block, 1, 1, () => { if_block = null; }); check_outros(); } if (!current || dirty & /*classesBase*/ 16 && div1_class_value !== (div1_class_value = "tab-group " + /*classesBase*/ ctx2[4])) { attr(div1, "class", div1_class_value); } }, i(local) { if (current) return; transition_in(default_slot, local); transition_in(if_block); current = true; }, o(local) { transition_out(default_slot, local); transition_out(if_block); current = false; }, d(detaching) { if (detaching) { detach(div1); } if (default_slot) default_slot.d(detaching); if (if_block) if_block.d(); } }; } const cBase$1 = "space-y-4"; const cList = "flex overflow-x-auto hide-scrollbar"; const cPanel = ""; function instance$d($$self, $$props, $$invalidate) { let classesBase; let classesList; let classesPanel; let { $$slots: slots = {}, $$scope } = $$props; const $$slots = compute_slots(slots); let { justify = "justify-start" } = $$props; let { border = "border-b border-surface-400-500-token" } = $$props; let { active: active2 = "border-b-2 border-surface-900-50-token" } = $$props; let { hover = "hover:variant-soft" } = $$props; let { flex = "flex-none" } = $$props; let { padding = "px-4 py-2" } = $$props; let { rounded = "rounded-tl-container-token rounded-tr-container-token" } = $$props; let { spacing = "space-y-1" } = $$props; let { regionList = "" } = $$props; let { regionPanel = "" } = $$props; let { labelledby = "" } = $$props; let { panel = "" } = $$props; setContext("active", active2); setContext("hover", hover); setContext("flex", flex); setContext("padding", padding); setContext("rounded", rounded); setContext("spacing", spacing); $$self.$$set = ($$new_props) => { $$invalidate(18, $$props = assign(assign({}, $$props), exclude_internal_props($$new_props))); if ("justify" in $$new_props) $$invalidate(6, justify = $$new_props.justify); if ("border" in $$new_props) $$invalidate(7, border = $$new_props.border); if ("active" in $$new_props) $$invalidate(8, active2 = $$new_props.active); if ("hover" in $$new_props) $$invalidate(9, hover = $$new_props.hover); if ("flex" in $$new_props) $$invalidate(10, flex = $$new_props.flex); if ("padding" in $$new_props) $$invalidate(11, padding = $$new_props.padding); if ("rounded" in $$new_props) $$invalidate(12, rounded = $$new_props.rounded); if ("spacing" in $$new_props) $$invalidate(13, spacing = $$new_props.spacing); if ("regionList" in $$new_props) $$invalidate(14, regionList = $$new_props.regionList); if ("regionPanel" in $$new_props) $$invalidate(15, regionPanel = $$new_props.regionPanel); if ("labelledby" in $$new_props) $$invalidate(0, labelledby = $$new_props.labelledby); if ("panel" in $$new_props) $$invalidate(1, panel = $$new_props.panel); if ("$$scope" in $$new_props) $$invalidate(16, $$scope = $$new_props.$$scope); }; $$self.$$.update = () => { $$invalidate(4, classesBase = `${cBase$1} ${$$props.class ?? ""}`); if ($$self.$$.dirty & /*justify, border, regionList*/ 16576) { $$invalidate(3, classesList = `${cList} ${justify} ${border} ${regionList}`); } if ($$self.$$.dirty & /*regionPanel*/ 32768) { $$invalidate(2, classesPanel = `${cPanel} ${regionPanel}`); } }; $$props = exclude_internal_props($$props); return [ labelledby, panel, classesPanel, classesList, classesBase, $$slots, justify, border, active2, hover, flex, padding, rounded, spacing, regionList, regionPanel, $$scope, slots ]; } class TabGroup extends SvelteComponent { constructor(options) { super(); init(this, options, instance$d, create_fragment$d, safe_not_equal, { justify: 6, border: 7, active: 8, hover: 9, flex: 10, padding: 11, rounded: 12, spacing: 13, regionList: 14, regionPanel: 15, labelledby: 0, panel: 1 }); } } const get_lead_slot_changes = (dirty) => ({}); const get_lead_slot_context = (ctx) => ({}); function create_if_block$9(ctx) { let div; let current; const lead_slot_template = ( /*#slots*/ ctx[22].lead ); const lead_slot = create_slot( lead_slot_template, ctx, /*$$scope*/ ctx[21], get_lead_slot_context ); return { c() { div = element("div"); if (lead_slot) lead_slot.c(); attr(div, "class", "tab-lead"); }, m(target, anchor) { insert(target, div, anchor); if (lead_slot) { lead_slot.m(div, null); } current = true; }, p(ctx2, dirty) { if (lead_slot) { if (lead_slot.p && (!current || dirty[0] & /*$$scope*/ 2097152)) { update_slot_base( lead_slot, lead_slot_template, ctx2, /*$$scope*/ ctx2[21], !current ? get_all_dirty_from_scope( /*$$scope*/ ctx2[21] ) : get_slot_changes( lead_slot_template, /*$$scope*/ ctx2[21], dirty, get_lead_slot_changes ), get_lead_slot_context ); } } }, i(local) { if (current) return; transition_in(lead_slot, local); current = true; }, o(local) { transition_out(lead_slot, local); current = false; }, d(detaching) { if (detaching) { detach(div); } if (lead_slot) lead_slot.d(detaching); } }; } function create_fragment$c(ctx) { let label; let div3; let div0; let input; let t0; let div2; let t1; let div1; let div2_class_value; let div3_class_value; let div3_tabindex_value; let current; let binding_group; let mounted; let dispose; let input_levels = [ { type: "radio" }, { name: ( /*name*/ ctx[1] ) }, { __value: ( /*value*/ ctx[2] ) }, /*prunedRestProps*/ ctx[11](), { tabindex: "-1" } ]; let input_data = {}; for (let i = 0; i < input_levels.length; i += 1) { input_data = assign(input_data, input_levels[i]); } let if_block = ( /*$$slots*/ ctx[12].lead && create_if_block$9(ctx) ); const default_slot_template = ( /*#slots*/ ctx[22].default ); const default_slot = create_slot( default_slot_template, ctx, /*$$scope*/ ctx[21], null ); binding_group = init_binding_group( /*$$binding_groups*/ ctx[30][0] ); return { c() { label = element("label"); div3 = element("div"); div0 = element("div"); input = element("input"); t0 = space(); div2 = element("div"); if (if_block) if_block.c(); t1 = space(); div1 = element("div"); if (default_slot) default_slot.c(); set_attributes(input, input_data); attr(div0, "class", "h-0 w-0 overflow-hidden"); attr(div1, "class", "tab-label"); attr(div2, "class", div2_class_value = "tab-interface " + /*classesInterface*/ ctx[8]); attr(div3, "class", div3_class_value = "tab " + /*classesTab*/ ctx[7]); attr(div3, "data-testid", "tab"); attr(div3, "role", "tab"); attr( div3, "aria-controls", /*controls*/ ctx[4] ); attr( div3, "aria-selected", /*selected*/ ctx[5] ); attr(div3, "tabindex", div3_tabindex_value = /*selected*/ ctx[5] ? 0 : -1); attr( label, "class", /*classesBase*/ ctx[9] ); attr( label, "title", /*title*/ ctx[3] ); binding_group.p(input); }, m(target, anchor) { insert(target, label, anchor); append(label, div3); append(div3, div0); append(div0, input); if (input.autofocus) input.focus(); ctx[28](input); input.checked = input.__value === /*group*/ ctx[0]; append(div3, t0); append(div3, div2); if (if_block) if_block.m(div2, null); append(div2, t1); append(div2, div1); if (default_slot) { default_slot.m(div1, null); } current = true; if (!mounted) { dispose = [ listen( input, "change", /*input_change_handler*/ ctx[29] ), listen( input, "click", /*click_handler*/ ctx[26] ), listen( input, "change", /*change_handler*/ ctx[27] ), listen( div3, "keydown", /*onKeyDown*/ ctx[10] ), listen( div3, "keydown", /*keydown_handler*/ ctx[23] ), listen( div3, "keyup", /*keyup_handler*/ ctx[24] ), listen( div3, "keypress", /*keypress_handler*/ ctx[25] ) ]; mounted = true; } }, p(ctx2, dirty) { set_attributes(input, input_data = get_spread_update(input_levels, [ { type: "radio" }, (!current || dirty[0] & /*name*/ 2) && { name: ( /*name*/ ctx2[1] ) }, (!current || dirty[0] & /*value*/ 4) && { __value: ( /*value*/ ctx2[2] ) }, /*prunedRestProps*/ ctx2[11](), { tabindex: "-1" } ])); if (dirty[0] & /*group*/ 1) { input.checked = input.__value === /*group*/ ctx2[0]; } if ( /*$$slots*/ ctx2[12].lead ) { if (if_block) { if_block.p(ctx2, dirty); if (dirty[0] & /*$$slots*/ 4096) { transition_in(if_block, 1); } } else { if_block = create_if_block$9(ctx2); if_block.c(); transition_in(if_block, 1); if_block.m(div2, t1); } } else if (if_block) { group_outros(); transition_out(if_block, 1, 1, () => { if_block = null; }); check_outros(); } if (default_slot) { if (default_slot.p && (!current || dirty[0] & /*$$scope*/ 2097152)) { update_slot_base( default_slot, default_slot_template, ctx2, /*$$scope*/ ctx2[21], !current ? get_all_dirty_from_scope( /*$$scope*/ ctx2[21] ) : get_slot_changes( default_slot_template, /*$$scope*/ ctx2[21], dirty, null ), null ); } } if (!current || dirty[0] & /*classesInterface*/ 256 && div2_class_value !== (div2_class_value = "tab-interface " + /*classesInterface*/ ctx2[8])) { attr(div2, "class", div2_class_value); } if (!current || dirty[0] & /*classesTab*/ 128 && div3_class_value !== (div3_class_value = "tab " + /*classesTab*/ ctx2[7])) { attr(div3, "class", div3_class_value); } if (!current || dirty[0] & /*controls*/ 16) { attr( div3, "aria-controls", /*controls*/ ctx2[4] ); } if (!current || dirty[0] & /*selected*/ 32) { attr( div3, "aria-selected", /*selected*/ ctx2[5] ); } if (!current || dirty[0] & /*selected*/ 32 && div3_tabindex_value !== (div3_tabindex_value = /*selected*/ ctx2[5] ? 0 : -1)) { attr(div3, "tabindex", div3_tabindex_value); } if (!current || dirty[0] & /*classesBase*/ 512) { attr( label, "class", /*classesBase*/ ctx2[9] ); } if (!current || dirty[0] & /*title*/ 8) { attr( label, "title", /*title*/ ctx2[3] ); } }, i(local) { if (current) return; transition_in(if_block); transition_in(default_slot, local); current = true; }, o(local) { transition_out(if_block); transition_out(default_slot, local); current = false; }, d(detaching) { if (detaching) { detach(label); } ctx[28](null); if (if_block) if_block.d(); if (default_slot) default_slot.d(detaching); binding_group.r(); mounted = false; run_all(dispose); } }; } const cBase = "text-center cursor-pointer transition-colors duration-100"; const cInterface = ""; function instance$c($$self, $$props, $$invalidate) { let selected; let classesActive; let classesBase; let classesInterface; let classesTab; const omit_props_names = [ "group", "name", "value", "title", "controls", "regionTab", "active", "hover", "flex", "padding", "rounded", "spacing" ]; let $$restProps = compute_rest_props($$props, omit_props_names); let { $$slots: slots = {}, $$scope } = $$props; const $$slots = compute_slots(slots); let { group } = $$props; let { name } = $$props; let { value } = $$props; let { title = "" } = $$props; let { controls = "" } = $$props; let { regionTab = "" } = $$props; let { active: active2 = getContext("active") } = $$props; let { hover = getContext("hover") } = $$props; let { flex = getContext("flex") } = $$props; let { padding = getContext("padding") } = $$props; let { rounded = getContext("rounded") } = $$props; let { spacing = getContext("spacing") } = $$props; let elemInput; function onKeyDown(event) { if (["Enter", "Space"].includes(event.code)) { event.preventDefault(); elemInput.click(); } else if (event.code === "ArrowRight") { const tabList = elemInput.closest(".tab-list"); if (!tabList) return; const tabs = Array.from(tabList.querySelectorAll(".tab")); const currTab = elemInput.closest(".tab"); if (!currTab) return; const currIndex = tabs.indexOf(currTab); const nextIndex = currIndex + 1 >= tabs.length ? 0 : currIndex + 1; const nextTab = tabs[nextIndex]; const nextTabInput = nextTab == null ? void 0 : nextTab.querySelector("input"); if (nextTab && nextTabInput) { nextTabInput.click(); nextTab.focus(); } } else if (event.code === "ArrowLeft") { const tabList = elemInput.closest(".tab-list"); if (!tabList) return; const tabs = Array.from(tabList.querySelectorAll(".tab")); const currTab = elemInput.closest(".tab"); if (!currTab) return; const currIndex = tabs.indexOf(currTab); const nextIndex = currIndex - 1 < 0 ? tabs.length - 1 : currIndex - 1; const nextTab = tabs[nextIndex]; const nextTabInput = nextTab == null ? void 0 : nextTab.querySelector("input"); if (nextTab && nextTabInput) { nextTabInput.click(); nextTab.focus(); } } } function prunedRestProps() { delete $$restProps.class; return $$restProps; } const $$binding_groups = [[]]; function keydown_handler(event) { bubble.call(this, $$self, event); } function keyup_handler(event) { bubble.call(this, $$self, event); } function keypress_handler(event) { bubble.call(this, $$self, event); } function click_handler(event) { bubble.call(this, $$self, event); } function change_handler(event) { bubble.call(this, $$self, event); } function input_binding($$value) { binding_callbacks[$$value ? "unshift" : "push"](() => { elemInput = $$value; $$invalidate(6, elemInput); }); } function input_change_handler() { group = this.__value; $$invalidate(0, group); } $$self.$$set = ($$new_props) => { $$invalidate(32, $$props = assign(assign({}, $$props), exclude_internal_props($$new_props))); $$invalidate(31, $$restProps = compute_rest_props($$props, omit_props_names)); if ("group" in $$new_props) $$invalidate(0, group = $$new_props.group); if ("name" in $$new_props) $$invalidate(1, name = $$new_props.name); if ("value" in $$new_props) $$invalidate(2, value = $$new_props.value); if ("title" in $$new_props) $$invalidate(3, title = $$new_props.title); if ("controls" in $$new_props) $$invalidate(4, controls = $$new_props.controls); if ("regionTab" in $$new_props) $$invalidate(13, regionTab = $$new_props.regionTab); if ("active" in $$new_props) $$invalidate(14, active2 = $$new_props.active); if ("hover" in $$new_props) $$invalidate(15, hover = $$new_props.hover); if ("flex" in $$new_props) $$invalidate(16, flex = $$new_props.flex); if ("padding" in $$new_props) $$invalidate(17, padding = $$new_props.padding); if ("rounded" in $$new_props) $$invalidate(18, rounded = $$new_props.rounded); if ("spacing" in $$new_props) $$invalidate(19, spacing = $$new_props.spacing); if ("$$scope" in $$new_props) $$invalidate(21, $$scope = $$new_props.$$scope); }; $$self.$$.update = () => { if ($$self.$$.dirty[0] & /*value, group*/ 5) { $$invalidate(5, selected = value === group); } if ($$self.$$.dirty[0] & /*selected, active, hover*/ 49184) { $$invalidate(20, classesActive = selected ? active2 : hover); } $$invalidate(9, classesBase = `${cBase} ${flex} ${padding} ${rounded} ${classesActive} ${$$props.class ?? ""}`); if ($$self.$$.dirty[0] & /*spacing*/ 524288) { $$invalidate(8, classesInterface = `${cInterface} ${spacing}`); } if ($$self.$$.dirty[0] & /*regionTab*/ 8192) { $$invalidate(7, classesTab = `${regionTab}`); } }; $$props = exclude_internal_props($$props); return [ group, name, value, title, controls, selected, elemInput, classesTab, classesInterface, classesBase, onKeyDown, prunedRestProps, $$slots, regionTab, active2, hover, flex, padding, rounded, spacing, classesActive, $$scope, slots, keydown_handler, keyup_handler, keypress_handler, click_handler, change_handler, input_binding, input_change_handler, $$binding_groups ]; } class Tab extends SvelteComponent { constructor(options) { super(); init( this, options, instance$c, create_fragment$c, safe_not_equal, { group: 0, name: 1, value: 2, title: 3, controls: 4, regionTab: 13, active: 14, hover: 15, flex: 16, padding: 17, rounded: 18, spacing: 19 }, null, [-1, -1] ); } } function create_if_block$8(ctx) { let previous_key = ( /*$modalStore*/ ctx[14] ); let key_block_anchor; let current; let key_block = create_key_block(ctx); return { c() { key_block.c(); key_block_anchor = empty(); }, m(target, anchor) { key_block.m(target, anchor); insert(target, key_block_anchor, anchor); current = true; }, p(ctx2, dirty) { if (dirty[0] & /*$modalStore*/ 16384 && safe_not_equal(previous_key, previous_key = /*$modalStore*/ ctx2[14])) { group_outros(); transition_out(key_block, 1, 1, noop); check_outros(); key_block = create_key_block(ctx2); key_block.c(); transition_in(key_block, 1); key_block.m(key_block_anchor.parentNode, key_block_anchor); } else { key_block.p(ctx2, dirty); } }, i(local) { if (current) return; transition_in(key_block); current = true; }, o(local) { transition_out(key_block); current = false; }, d(detaching) { if (detaching) { detach(key_block_anchor); } key_block.d(detaching); } }; } function create_else_block$3(ctx) { let div; let current_block_type_index; let if_block; let div_class_value; let div_aria_label_value; let current; const if_block_creators = [create_if_block_8$1, create_else_block_1]; const if_blocks = []; function select_block_type_2(ctx2, dirty) { var _a; if ( /*currentComponent*/ (_a = ctx2[16]) == null ? void 0 : _a.slot ) return 0; return 1; } current_block_type_index = select_block_type_2(ctx); if_block = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx); return { c() { var _a; div = element("div"); if_block.c(); attr(div, "class", div_class_value = "modal contents " + /*$modalStore*/ (((_a = ctx[14][0]) == null ? void 0 : _a.modalClasses) ?? "")); attr(div, "data-testid", "modal-component"); attr(div, "role", "dialog"); attr(div, "aria-modal", "true"); attr(div, "aria-label", div_aria_label_value = /*$modalStore*/ ctx[14][0].title ?? ""); }, m(target, anchor) { insert(target, div, anchor); if_blocks[current_block_type_index].m(div, null); ctx[47](div); current = true; }, p(ctx2, dirty) { var _a; let previous_block_index = current_block_type_index; current_block_type_index = select_block_type_2(ctx2); if (current_block_type_index === previous_block_index) { if_blocks[current_block_type_index].p(ctx2, dirty); } else { group_outros(); transition_out(if_blocks[previous_block_index], 1, 1, () => { if_blocks[previous_block_index] = null; }); check_outros(); if_block = if_blocks[current_block_type_index]; if (!if_block) { if_block = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx2); if_block.c(); } else { if_block.p(ctx2, dirty); } transition_in(if_block, 1); if_block.m(div, null); } if (!current || dirty[0] & /*$modalStore*/ 16384 && div_class_value !== (div_class_value = "modal contents " + /*$modalStore*/ (((_a = ctx2[14][0]) == null ? void 0 : _a.modalClasses) ?? ""))) { attr(div, "class", div_class_value); } if (!current || dirty[0] & /*$modalStore*/ 16384 && div_aria_label_value !== (div_aria_label_value = /*$modalStore*/ ctx2[14][0].title ?? "")) { attr(div, "aria-label", div_aria_label_value); } }, i(local) { if (current) return; transition_in(if_block); current = true; }, o(local) { transition_out(if_block); current = false; }, d(detaching) { if (detaching) { detach(div); } if_blocks[current_block_type_index].d(); ctx[47](null); } }; } function create_if_block_1$6(ctx) { var _a, _b, _c, _d; let div; let t0; let t1; let t2; let div_class_value; let div_aria_label_value; let if_block0 = ( /*$modalStore*/ ((_a = ctx[14][0]) == null ? void 0 : _a.title) && create_if_block_7$1(ctx) ); let if_block1 = ( /*$modalStore*/ ((_b = ctx[14][0]) == null ? void 0 : _b.body) && create_if_block_6$1(ctx) ); let if_block2 = ( /*$modalStore*/ ((_c = ctx[14][0]) == null ? void 0 : _c.image) && typeof /*$modalStore*/ ((_d = ctx[14][0]) == null ? void 0 : _d.image) === "string" && create_if_block_5$1(ctx) ); function select_block_type_1(ctx2, dirty) { if ( /*$modalStore*/ ctx2[14][0].type === "alert" ) return create_if_block_2$4; if ( /*$modalStore*/ ctx2[14][0].type === "confirm" ) return create_if_block_3$3; if ( /*$modalStore*/ ctx2[14][0].type === "prompt" ) return create_if_block_4$1; } let current_block_type = select_block_type_1(ctx); let if_block3 = current_block_type && current_block_type(ctx); return { c() { div = element("div"); if (if_block0) if_block0.c(); t0 = space(); if (if_block1) if_block1.c(); t1 = space(); if (if_block2) if_block2.c(); t2 = space(); if (if_block3) if_block3.c(); attr(div, "class", div_class_value = "modal " + /*classesModal*/ ctx[20]); attr(div, "data-testid", "modal"); attr(div, "role", "dialog"); attr(div, "aria-modal", "true"); attr(div, "aria-label", div_aria_label_value = /*$modalStore*/ ctx[14][0].title ?? ""); }, m(target, anchor) { insert(target, div, anchor); if (if_block0) if_block0.m(div, null); append(div, t0); if (if_block1) if_block1.m(div, null); append(div, t1); if (if_block2) if_block2.m(div, null); append(div, t2); if (if_block3) if_block3.m(div, null); ctx[46](div); }, p(ctx2, dirty) { var _a2, _b2, _c2, _d2; if ( /*$modalStore*/ (_a2 = ctx2[14][0]) == null ? void 0 : _a2.title ) { if (if_block0) { if_block0.p(ctx2, dirty); } else { if_block0 = create_if_block_7$1(ctx2); if_block0.c(); if_block0.m(div, t0); } } else if (if_block0) { if_block0.d(1); if_block0 = null; } if ( /*$modalStore*/ (_b2 = ctx2[14][0]) == null ? void 0 : _b2.body ) { if (if_block1) { if_block1.p(ctx2, dirty); } else { if_block1 = create_if_block_6$1(ctx2); if_block1.c(); if_block1.m(div, t1); } } else if (if_block1) { if_block1.d(1); if_block1 = null; } if ( /*$modalStore*/ ((_c2 = ctx2[14][0]) == null ? void 0 : _c2.image) && typeof /*$modalStore*/ ((_d2 = ctx2[14][0]) == null ? void 0 : _d2.image) === "string" ) { if (if_block2) { if_block2.p(ctx2, dirty); } else { if_block2 = create_if_block_5$1(ctx2); if_block2.c(); if_block2.m(div, t2); } } else if (if_block2) { if_block2.d(1); if_block2 = null; } if (current_block_type === (current_block_type = select_block_type_1(ctx2)) && if_block3) { if_block3.p(ctx2, dirty); } else { if (if_block3) if_block3.d(1); if_block3 = current_block_type && current_block_type(ctx2); if (if_block3) { if_block3.c(); if_block3.m(div, null); } } if (dirty[0] & /*classesModal*/ 1048576 && div_class_value !== (div_class_value = "modal " + /*classesModal*/ ctx2[20])) { attr(div, "class", div_class_value); } if (dirty[0] & /*$modalStore*/ 16384 && div_aria_label_value !== (div_aria_label_value = /*$modalStore*/ ctx2[14][0].title ?? "")) { attr(div, "aria-label", div_aria_label_value); } }, i: noop, o: noop, d(detaching) { if (detaching) { detach(div); } if (if_block0) if_block0.d(); if (if_block1) if_block1.d(); if (if_block2) if_block2.d(); if (if_block3) { if_block3.d(); } ctx[46](null); } }; } function create_else_block_1(ctx) { var _a, _b; let switch_instance; let switch_instance_anchor; let current; const switch_instance_spread_levels = [ /*currentComponent*/ (_a = ctx[16]) == null ? void 0 : _a.props, { parent: ( /*parent*/ ctx[19] ) } ]; var switch_value = ( /*currentComponent*/ (_b = ctx[16]) == null ? void 0 : _b.ref ); function switch_props(ctx2, dirty) { var _a2; let switch_instance_props = {}; for (let i = 0; i < switch_instance_spread_levels.length; i += 1) { switch_instance_props = assign(switch_instance_props, switch_instance_spread_levels[i]); } if (dirty !== void 0 && dirty[0] & /*currentComponent, parent*/ 589824) { switch_instance_props = assign(switch_instance_props, get_spread_update(switch_instance_spread_levels, [ dirty[0] & /*currentComponent*/ 65536 && get_spread_object( /*currentComponent*/ (_a2 = ctx2[16]) == null ? void 0 : _a2.props ), dirty[0] & /*parent*/ 524288 && { parent: ( /*parent*/ ctx2[19] ) } ])); } return { props: switch_instance_props }; } if (switch_value) { switch_instance = construct_svelte_component(switch_value, switch_props(ctx)); } return { c() { if (switch_instance) create_component(switch_instance.$$.fragment); switch_instance_anchor = empty(); }, m(target, anchor) { if (switch_instance) mount_component(switch_instance, target, anchor); insert(target, switch_instance_anchor, anchor); current = true; }, p(ctx2, dirty) { var _a2, _b2; if (dirty[0] & /*currentComponent*/ 65536 && switch_value !== (switch_value = /*currentComponent*/ (_a2 = ctx2[16]) == null ? void 0 : _a2.ref)) { if (switch_instance) { group_outros(); const old_component = switch_instance; transition_out(old_component.$$.fragment, 1, 0, () => { destroy_component(old_component, 1); }); check_outros(); } if (switch_value) { switch_instance = construct_svelte_component(switch_value, switch_props(ctx2, dirty)); create_component(switch_instance.$$.fragment); transition_in(switch_instance.$$.fragment, 1); mount_component(switch_instance, switch_instance_anchor.parentNode, switch_instance_anchor); } else { switch_instance = null; } } else if (switch_value) { const switch_instance_changes = dirty[0] & /*currentComponent, parent*/ 589824 ? get_spread_update(switch_instance_spread_levels, [ dirty[0] & /*currentComponent*/ 65536 && get_spread_object( /*currentComponent*/ (_b2 = ctx2[16]) == null ? void 0 : _b2.props ), dirty[0] & /*parent*/ 524288 && { parent: ( /*parent*/ ctx2[19] ) } ]) : {}; switch_instance.$set(switch_instance_changes); } }, i(local) { if (current) return; if (switch_instance) transition_in(switch_instance.$$.fragment, local); current = true; }, o(local) { if (switch_instance) transition_out(switch_instance.$$.fragment, local); current = false; }, d(detaching) { if (detaching) { detach(switch_instance_anchor); } if (switch_instance) destroy_component(switch_instance, detaching); } }; } function create_if_block_8$1(ctx) { var _a, _b; let switch_instance; let switch_instance_anchor; let current; const switch_instance_spread_levels = [ /*currentComponent*/ (_a = ctx[16]) == null ? void 0 : _a.props, { parent: ( /*parent*/ ctx[19] ) } ]; var switch_value = ( /*currentComponent*/ (_b = ctx[16]) == null ? void 0 : _b.ref ); function switch_props(ctx2, dirty) { var _a2; let switch_instance_props = { $$slots: { default: [create_default_slot$7] }, $$scope: { ctx: ctx2 } }; for (let i = 0; i < switch_instance_spread_levels.length; i += 1) { switch_instance_props = assign(switch_instance_props, switch_instance_spread_levels[i]); } if (dirty !== void 0 && dirty[0] & /*currentComponent, parent*/ 589824) { switch_instance_props = assign(switch_instance_props, get_spread_update(switch_instance_spread_levels, [ dirty[0] & /*currentComponent*/ 65536 && get_spread_object( /*currentComponent*/ (_a2 = ctx2[16]) == null ? void 0 : _a2.props ), dirty[0] & /*parent*/ 524288 && { parent: ( /*parent*/ ctx2[19] ) } ])); } return { props: switch_instance_props }; } if (switch_value) { switch_instance = construct_svelte_component(switch_value, switch_props(ctx)); } return { c() { if (switch_instance) create_component(switch_instance.$$.fragment); switch_instance_anchor = empty(); }, m(target, anchor) { if (switch_instance) mount_component(switch_instance, target, anchor); insert(target, switch_instance_anchor, anchor); current = true; }, p(ctx2, dirty) { var _a2, _b2; if (dirty[0] & /*currentComponent*/ 65536 && switch_value !== (switch_value = /*currentComponent*/ (_a2 = ctx2[16]) == null ? void 0 : _a2.ref)) { if (switch_instance) { group_outros(); const old_component = switch_instance; transition_out(old_component.$$.fragment, 1, 0, () => { destroy_component(old_component, 1); }); check_outros(); } if (switch_value) { switch_instance = construct_svelte_component(switch_value, switch_props(ctx2, dirty)); create_component(switch_instance.$$.fragment); transition_in(switch_instance.$$.fragment, 1); mount_component(switch_instance, switch_instance_anchor.parentNode, switch_instance_anchor); } else { switch_instance = null; } } else if (switch_value) { const switch_instance_changes = dirty[0] & /*currentComponent, parent*/ 589824 ? get_spread_update(switch_instance_spread_levels, [ dirty[0] & /*currentComponent*/ 65536 && get_spread_object( /*currentComponent*/ (_b2 = ctx2[16]) == null ? void 0 : _b2.props ), dirty[0] & /*parent*/ 524288 && { parent: ( /*parent*/ ctx2[19] ) } ]) : {}; if (dirty[0] & /*currentComponent*/ 65536 | dirty[1] & /*$$scope*/ 16777216) { switch_instance_changes.$$scope = { dirty, ctx: ctx2 }; } switch_instance.$set(switch_instance_changes); } }, i(local) { if (current) return; if (switch_instance) transition_in(switch_instance.$$.fragment, local); current = true; }, o(local) { if (switch_instance) transition_out(switch_instance.$$.fragment, local); current = false; }, d(detaching) { if (detaching) { detach(switch_instance_anchor); } if (switch_instance) destroy_component(switch_instance, detaching); } }; } function create_default_slot$7(ctx) { var _a; let html_tag; let raw_value = ( /*currentComponent*/ ((_a = ctx[16]) == null ? void 0 : _a.slot) + "" ); let html_anchor; return { c() { html_tag = new HtmlTag(false); html_anchor = empty(); html_tag.a = html_anchor; }, m(target, anchor) { html_tag.m(raw_value, target, anchor); insert(target, html_anchor, anchor); }, p(ctx2, dirty) { var _a2; if (dirty[0] & /*currentComponent*/ 65536 && raw_value !== (raw_value = /*currentComponent*/ ((_a2 = ctx2[16]) == null ? void 0 : _a2.slot) + "")) html_tag.p(raw_value); }, d(detaching) { if (detaching) { detach(html_anchor); html_tag.d(); } } }; } function create_if_block_7$1(ctx) { let header; let raw_value = ( /*$modalStore*/ ctx[14][0].title + "" ); let header_class_value; return { c() { header = element("header"); attr(header, "class", header_class_value = "modal-header " + /*regionHeader*/ ctx[5]); }, m(target, anchor) { insert(target, header, anchor); header.innerHTML = raw_value; }, p(ctx2, dirty) { if (dirty[0] & /*$modalStore*/ 16384 && raw_value !== (raw_value = /*$modalStore*/ ctx2[14][0].title + "")) header.innerHTML = raw_value; if (dirty[0] & /*regionHeader*/ 32 && header_class_value !== (header_class_value = "modal-header " + /*regionHeader*/ ctx2[5])) { attr(header, "class", header_class_value); } }, d(detaching) { if (detaching) { detach(header); } } }; } function create_if_block_6$1(ctx) { let article; let raw_value = ( /*$modalStore*/ ctx[14][0].body + "" ); let article_class_value; return { c() { article = element("article"); attr(article, "class", article_class_value = "modal-body " + /*regionBody*/ ctx[6]); }, m(target, anchor) { insert(target, article, anchor); article.innerHTML = raw_value; }, p(ctx2, dirty) { if (dirty[0] & /*$modalStore*/ 16384 && raw_value !== (raw_value = /*$modalStore*/ ctx2[14][0].body + "")) article.innerHTML = raw_value; if (dirty[0] & /*regionBody*/ 64 && article_class_value !== (article_class_value = "modal-body " + /*regionBody*/ ctx2[6])) { attr(article, "class", article_class_value); } }, d(detaching) { if (detaching) { detach(article); } } }; } function create_if_block_5$1(ctx) { let img; let img_src_value; return { c() { var _a; img = element("img"); attr(img, "class", "modal-image " + cModalImage); if (!src_url_equal(img.src, img_src_value = /*$modalStore*/ (_a = ctx[14][0]) == null ? void 0 : _a.image)) attr(img, "src", img_src_value); attr(img, "alt", "Modal"); }, m(target, anchor) { insert(target, img, anchor); }, p(ctx2, dirty) { var _a; if (dirty[0] & /*$modalStore*/ 16384 && !src_url_equal(img.src, img_src_value = /*$modalStore*/ (_a = ctx2[14][0]) == null ? void 0 : _a.image)) { attr(img, "src", img_src_value); } }, d(detaching) { if (detaching) { detach(img); } } }; } function create_if_block_4$1(ctx) { let form; let input; let t0; let footer; let button0; let t1; let button0_class_value; let t2; let button1; let t3; let button1_class_value; let footer_class_value; let mounted; let dispose; let input_levels = [ { class: "modal-prompt-input input" }, { name: "prompt" }, { type: "text" }, /*$modalStore*/ ctx[14][0].valueAttr ]; let input_data = {}; for (let i = 0; i < input_levels.length; i += 1) { input_data = assign(input_data, input_levels[i]); } return { c() { form = element("form"); input = element("input"); t0 = space(); footer = element("footer"); button0 = element("button"); t1 = text( /*buttonTextCancel*/ ctx[0] ); t2 = space(); button1 = element("button"); t3 = text( /*buttonTextSubmit*/ ctx[2] ); set_attributes(input, input_data); attr(button0, "type", "button"); attr(button0, "class", button0_class_value = "btn " + /*buttonNeutral*/ ctx[3]); attr(button1, "type", "submit"); attr(button1, "class", button1_class_value = "btn " + /*buttonPositive*/ ctx[4]); attr(footer, "class", footer_class_value = "modal-footer " + /*regionFooter*/ ctx[7]); attr(form, "class", "space-y-4"); }, m(target, anchor) { insert(target, form, anchor); append(form, input); if (input.autofocus) input.focus(); set_input_value( input, /*promptValue*/ ctx[15] ); append(form, t0); append(form, footer); append(footer, button0); append(button0, t1); append(footer, t2); append(footer, button1); append(button1, t3); if (!mounted) { dispose = [ listen( input, "input", /*input_input_handler*/ ctx[45] ), listen( button0, "click", /*onClose*/ ctx[26] ), listen( form, "submit", /*onPromptSubmit*/ ctx[28] ) ]; mounted = true; } }, p(ctx2, dirty) { set_attributes(input, input_data = get_spread_update(input_levels, [ { class: "modal-prompt-input input" }, { name: "prompt" }, { type: "text" }, dirty[0] & /*$modalStore*/ 16384 && /*$modalStore*/ ctx2[14][0].valueAttr ])); if (dirty[0] & /*promptValue*/ 32768 && input.value !== /*promptValue*/ ctx2[15]) { set_input_value( input, /*promptValue*/ ctx2[15] ); } if (dirty[0] & /*buttonTextCancel*/ 1) set_data( t1, /*buttonTextCancel*/ ctx2[0] ); if (dirty[0] & /*buttonNeutral*/ 8 && button0_class_value !== (button0_class_value = "btn " + /*buttonNeutral*/ ctx2[3])) { attr(button0, "class", button0_class_value); } if (dirty[0] & /*buttonTextSubmit*/ 4) set_data( t3, /*buttonTextSubmit*/ ctx2[2] ); if (dirty[0] & /*buttonPositive*/ 16 && button1_class_value !== (button1_class_value = "btn " + /*buttonPositive*/ ctx2[4])) { attr(button1, "class", button1_class_value); } if (dirty[0] & /*regionFooter*/ 128 && footer_class_value !== (footer_class_value = "modal-footer " + /*regionFooter*/ ctx2[7])) { attr(footer, "class", footer_class_value); } }, d(detaching) { if (detaching) { detach(form); } mounted = false; run_all(dispose); } }; } function create_if_block_3$3(ctx) { let footer; let button0; let t0; let button0_class_value; let t1; let button1; let t2; let button1_class_value; let footer_class_value; let mounted; let dispose; return { c() { footer = element("footer"); button0 = element("button"); t0 = text( /*buttonTextCancel*/ ctx[0] ); t1 = space(); button1 = element("button"); t2 = text( /*buttonTextConfirm*/ ctx[1] ); attr(button0, "type", "button"); attr(button0, "class", button0_class_value = "btn " + /*buttonNeutral*/ ctx[3]); attr(button1, "type", "button"); attr(button1, "class", button1_class_value = "btn " + /*buttonPositive*/ ctx[4]); attr(footer, "class", footer_class_value = "modal-footer " + /*regionFooter*/ ctx[7]); }, m(target, anchor) { insert(target, footer, anchor); append(footer, button0); append(button0, t0); append(footer, t1); append(footer, button1); append(button1, t2); if (!mounted) { dispose = [ listen( button0, "click", /*onClose*/ ctx[26] ), listen( button1, "click", /*onConfirm*/ ctx[27] ) ]; mounted = true; } }, p(ctx2, dirty) { if (dirty[0] & /*buttonTextCancel*/ 1) set_data( t0, /*buttonTextCancel*/ ctx2[0] ); if (dirty[0] & /*buttonNeutral*/ 8 && button0_class_value !== (button0_class_value = "btn " + /*buttonNeutral*/ ctx2[3])) { attr(button0, "class", button0_class_value); } if (dirty[0] & /*buttonTextConfirm*/ 2) set_data( t2, /*buttonTextConfirm*/ ctx2[1] ); if (dirty[0] & /*buttonPositive*/ 16 && button1_class_value !== (button1_class_value = "btn " + /*buttonPositive*/ ctx2[4])) { attr(button1, "class", button1_class_value); } if (dirty[0] & /*regionFooter*/ 128 && footer_class_value !== (footer_class_value = "modal-footer " + /*regionFooter*/ ctx2[7])) { attr(footer, "class", footer_class_value); } }, d(detaching) { if (detaching) { detach(footer); } mounted = false; run_all(dispose); } }; } function create_if_block_2$4(ctx) { let footer; let button; let t2; let button_class_value; let footer_class_value; let mounted; let dispose; return { c() { footer = element("footer"); button = element("button"); t2 = text( /*buttonTextCancel*/ ctx[0] ); attr(button, "type", "button"); attr(button, "class", button_class_value = "btn " + /*buttonNeutral*/ ctx[3]); attr(footer, "class", footer_class_value = "modal-footer " + /*regionFooter*/ ctx[7]); }, m(target, anchor) { insert(target, footer, anchor); append(footer, button); append(button, t2); if (!mounted) { dispose = listen( button, "click", /*onClose*/ ctx[26] ); mounted = true; } }, p(ctx2, dirty) { if (dirty[0] & /*buttonTextCancel*/ 1) set_data( t2, /*buttonTextCancel*/ ctx2[0] ); if (dirty[0] & /*buttonNeutral*/ 8 && button_class_value !== (button_class_value = "btn " + /*buttonNeutral*/ ctx2[3])) { attr(button, "class", button_class_value); } if (dirty[0] & /*regionFooter*/ 128 && footer_class_value !== (footer_class_value = "modal-footer " + /*regionFooter*/ ctx2[7])) { attr(footer, "class", footer_class_value); } }, d(detaching) { if (detaching) { detach(footer); } mounted = false; dispose(); } }; } function create_key_block(ctx) { let div1; let div0; let current_block_type_index; let if_block; let div0_class_value; let div0_intro; let div0_outro; let div1_class_value; let div1_transition; let current; let mounted; let dispose; const if_block_creators = [create_if_block_1$6, create_else_block$3]; const if_blocks = []; function select_block_type(ctx2, dirty) { if ( /*$modalStore*/ ctx2[14][0].type !== "component" ) return 0; return 1; } current_block_type_index = select_block_type(ctx); if_block = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx); return { c() { div1 = element("div"); div0 = element("div"); if_block.c(); attr(div0, "class", div0_class_value = "modal-transition " + /*classesTransitionLayer*/ ctx[21]); attr(div1, "class", div1_class_value = "modal-backdrop " + /*classesBackdrop*/ ctx[22] + " " + /*backdropOverflow*/ ctx[18]); attr(div1, "data-testid", "modal-backdrop"); }, m(target, anchor) { insert(target, div1, anchor); append(div1, div0); if_blocks[current_block_type_index].m(div0, null); current = true; if (!mounted) { dispose = [ listen( div1, "mousedown", /*onBackdropInteractionBegin*/ ctx[24] ), listen( div1, "mouseup", /*onBackdropInteractionEnd*/ ctx[25] ), listen( div1, "touchstart", /*touchstart_handler*/ ctx[42], { passive: true } ), listen( div1, "touchend", /*touchend_handler*/ ctx[43], { passive: true } ), action_destroyer(focusTrap.call(null, div1, true)) ]; mounted = true; } }, p(new_ctx, dirty) { ctx = new_ctx; let previous_block_index = current_block_type_index; current_block_type_index = select_block_type(ctx); if (current_block_type_index === previous_block_index) { if_blocks[current_block_type_index].p(ctx, dirty); } else { group_outros(); transition_out(if_blocks[previous_block_index], 1, 1, () => { if_blocks[previous_block_index] = null; }); check_outros(); if_block = if_blocks[current_block_type_index]; if (!if_block) { if_block = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx); if_block.c(); } else { if_block.p(ctx, dirty); } transition_in(if_block, 1); if_block.m(div0, null); } if (!current || dirty[0] & /*classesTransitionLayer*/ 2097152 && div0_class_value !== (div0_class_value = "modal-transition " + /*classesTransitionLayer*/ ctx[21])) { attr(div0, "class", div0_class_value); } if (!current || dirty[0] & /*classesBackdrop, backdropOverflow*/ 4456448 && div1_class_value !== (div1_class_value = "modal-backdrop " + /*classesBackdrop*/ ctx[22] + " " + /*backdropOverflow*/ ctx[18])) { attr(div1, "class", div1_class_value); } }, i(local) { if (current) return; transition_in(if_block); add_render_callback(() => { if (!current) return; if (div0_outro) div0_outro.end(1); div0_intro = create_in_transition(div0, dynamicTransition, { transition: ( /*transitionIn*/ ctx[9] ), params: ( /*transitionInParams*/ ctx[10] ), enabled: ( /*transitions*/ ctx[8] ) }); div0_intro.start(); }); add_render_callback(() => { if (!current) return; if (!div1_transition) div1_transition = create_bidirectional_transition( div1, dynamicTransition, { transition: fade, params: { duration: 150 }, enabled: ( /*transitions*/ ctx[8] ) }, true ); div1_transition.run(1); }); current = true; }, o(local) { transition_out(if_block); if (div0_intro) div0_intro.invalidate(); div0_outro = create_out_transition(div0, dynamicTransition, { transition: ( /*transitionOut*/ ctx[11] ), params: ( /*transitionOutParams*/ ctx[12] ), enabled: ( /*transitions*/ ctx[8] ) }); if (!div1_transition) div1_transition = create_bidirectional_transition( div1, dynamicTransition, { transition: fade, params: { duration: 150 }, enabled: ( /*transitions*/ ctx[8] ) }, false ); div1_transition.run(0); current = false; }, d(detaching) { if (detaching) { detach(div1); } if_blocks[current_block_type_index].d(); if (detaching && div0_outro) div0_outro.end(); if (detaching && div1_transition) div1_transition.end(); mounted = false; run_all(dispose); } }; } function create_fragment$b(ctx) { let if_block_anchor; let current; let mounted; let dispose; add_render_callback( /*onwindowresize*/ ctx[44] ); let if_block = ( /*$modalStore*/ ctx[14].length > 0 && create_if_block$8(ctx) ); return { c() { if (if_block) if_block.c(); if_block_anchor = empty(); }, m(target, anchor) { if (if_block) if_block.m(target, anchor); insert(target, if_block_anchor, anchor); current = true; if (!mounted) { dispose = [ listen( window, "keydown", /*onKeyDown*/ ctx[29] ), listen( window, "resize", /*onwindowresize*/ ctx[44] ) ]; mounted = true; } }, p(ctx2, dirty) { if ( /*$modalStore*/ ctx2[14].length > 0 ) { if (if_block) { if_block.p(ctx2, dirty); if (dirty[0] & /*$modalStore*/ 16384) { transition_in(if_block, 1); } } else { if_block = create_if_block$8(ctx2); if_block.c(); transition_in(if_block, 1); if_block.m(if_block_anchor.parentNode, if_block_anchor); } } else if (if_block) { group_outros(); transition_out(if_block, 1, 1, () => { if_block = null; }); check_outros(); } }, i(local) { if (current) return; transition_in(if_block); current = true; }, o(local) { transition_out(if_block); current = false; }, d(detaching) { if (detaching) { detach(if_block_anchor); } if (if_block) if_block.d(detaching); mounted = false; run_all(dispose); } }; } const cBackdrop = "fixed top-0 left-0 right-0 bottom-0 bg-surface-backdrop-token p-4"; const cTransitionLayer = "w-full h-fit min-h-full overflow-y-auto flex justify-center"; const cModal = "block overflow-y-auto"; const cModalImage = "w-full h-auto"; function instance$b($$self, $$props, $$invalidate) { let cPosition; let classesBackdrop; let classesTransitionLayer; let classesModal; let parent; let $modalStore; let $prefersReducedMotionStore; component_subscribe($$self, prefersReducedMotionStore, ($$value) => $$invalidate(49, $prefersReducedMotionStore = $$value)); const dispatch2 = createEventDispatcher(); let { components = {} } = $$props; let { position = "items-center" } = $$props; let { background = "bg-surface-100-800-token" } = $$props; let { width = "w-modal" } = $$props; let { height = "h-auto" } = $$props; let { padding = "p-4" } = $$props; let { spacing = "space-y-4" } = $$props; let { rounded = "rounded-container-token" } = $$props; let { shadow = "shadow-xl" } = $$props; let { zIndex = "z-[999]" } = $$props; let { buttonNeutral = "variant-ghost-surface" } = $$props; let { buttonPositive = "variant-filled" } = $$props; let { buttonTextCancel = "Cancel" } = $$props; let { buttonTextConfirm = "Confirm" } = $$props; let { buttonTextSubmit = "Submit" } = $$props; let { regionBackdrop = "" } = $$props; let { regionHeader = "text-2xl font-bold" } = $$props; let { regionBody = "max-h-[200px] overflow-hidden" } = $$props; let { regionFooter = "flex justify-end space-x-2" } = $$props; let { transitions = !$prefersReducedMotionStore } = $$props; let { transitionIn = fly } = $$props; let { transitionInParams = { duration: 150, opacity: 0, x: 0, y: 100 } } = $$props; let { transitionOut = fly } = $$props; let { transitionOutParams = { duration: 150, opacity: 0, x: 0, y: 100 } } = $$props; let promptValue; const buttonTextDefaults = { buttonTextCancel, buttonTextConfirm, buttonTextSubmit }; let currentComponent; let registeredInteractionWithBackdrop = false; let modalElement; let windowHeight; let backdropOverflow = "overflow-y-hidden"; const modalStore = getModalStore(); component_subscribe($$self, modalStore, (value) => $$invalidate(14, $modalStore = value)); function handleModals(modals) { if (modals[0].type === "prompt") $$invalidate(15, promptValue = modals[0].value); $$invalidate(0, buttonTextCancel = modals[0].buttonTextCancel || buttonTextDefaults.buttonTextCancel); $$invalidate(1, buttonTextConfirm = modals[0].buttonTextConfirm || buttonTextDefaults.buttonTextConfirm); $$invalidate(2, buttonTextSubmit = modals[0].buttonTextSubmit || buttonTextDefaults.buttonTextSubmit); $$invalidate(16, currentComponent = typeof modals[0].component === "string" ? components[modals[0].component] : modals[0].component); } function onModalHeightChange(modal) { var _a; let modalHeight = modal == null ? void 0 : modal.clientHeight; if (!modalHeight) modalHeight = (_a = modal == null ? void 0 : modal.firstChild) == null ? void 0 : _a.clientHeight; if (!modalHeight) return; if (modalHeight > windowHeight) { $$invalidate(18, backdropOverflow = "overflow-y-auto"); } else { $$invalidate(18, backdropOverflow = "overflow-y-hidden"); } } function onBackdropInteractionBegin(event) { if (!(event.target instanceof Element)) return; const classList = event.target.classList; if (classList.contains("modal-backdrop") || classList.contains("modal-transition")) { registeredInteractionWithBackdrop = true; } } function onBackdropInteractionEnd(event) { if (!(event.target instanceof Element)) return; const classList = event.target.classList; if ((classList.contains("modal-backdrop") || classList.contains("modal-transition")) && registeredInteractionWithBackdrop) { if ($modalStore[0].response) $modalStore[0].response(void 0); modalStore.close(); dispatch2("backdrop", event); } registeredInteractionWithBackdrop = false; } function onClose() { if ($modalStore[0].response) $modalStore[0].response(false); modalStore.close(); } function onConfirm() { if ($modalStore[0].response) $modalStore[0].response(true); modalStore.close(); } function onPromptSubmit(event) { event.preventDefault(); if ($modalStore[0].response) { if ($modalStore[0].valueAttr !== void 0 && "type" in $modalStore[0].valueAttr && $modalStore[0].valueAttr.type === "number") $modalStore[0].response(parseInt(promptValue)); else $modalStore[0].response(promptValue); } modalStore.close(); } function onKeyDown(event) { if (!$modalStore.length) return; if (event.code === "Escape") onClose(); } function touchstart_handler(event) { bubble.call(this, $$self, event); } function touchend_handler(event) { bubble.call(this, $$self, event); } function onwindowresize() { $$invalidate(17, windowHeight = window.innerHeight); } function input_input_handler() { promptValue = this.value; $$invalidate(15, promptValue); } function div_binding($$value) { binding_callbacks[$$value ? "unshift" : "push"](() => { modalElement = $$value; $$invalidate(13, modalElement); }); } function div_binding_1($$value) { binding_callbacks[$$value ? "unshift" : "push"](() => { modalElement = $$value; $$invalidate(13, modalElement); }); } $$self.$$set = ($$new_props) => { $$invalidate(54, $$props = assign(assign({}, $$props), exclude_internal_props($$new_props))); if ("components" in $$new_props) $$invalidate(30, components = $$new_props.components); if ("position" in $$new_props) $$invalidate(31, position = $$new_props.position); if ("background" in $$new_props) $$invalidate(32, background = $$new_props.background); if ("width" in $$new_props) $$invalidate(33, width = $$new_props.width); if ("height" in $$new_props) $$invalidate(34, height = $$new_props.height); if ("padding" in $$new_props) $$invalidate(35, padding = $$new_props.padding); if ("spacing" in $$new_props) $$invalidate(36, spacing = $$new_props.spacing); if ("rounded" in $$new_props) $$invalidate(37, rounded = $$new_props.rounded); if ("shadow" in $$new_props) $$invalidate(38, shadow = $$new_props.shadow); if ("zIndex" in $$new_props) $$invalidate(39, zIndex = $$new_props.zIndex); if ("buttonNeutral" in $$new_props) $$invalidate(3, buttonNeutral = $$new_props.buttonNeutral); if ("buttonPositive" in $$new_props) $$invalidate(4, buttonPositive = $$new_props.buttonPositive); if ("buttonTextCancel" in $$new_props) $$invalidate(0, buttonTextCancel = $$new_props.buttonTextCancel); if ("buttonTextConfirm" in $$new_props) $$invalidate(1, buttonTextConfirm = $$new_props.buttonTextConfirm); if ("buttonTextSubmit" in $$new_props) $$invalidate(2, buttonTextSubmit = $$new_props.buttonTextSubmit); if ("regionBackdrop" in $$new_props) $$invalidate(40, regionBackdrop = $$new_props.regionBackdrop); if ("regionHeader" in $$new_props) $$invalidate(5, regionHeader = $$new_props.regionHeader); if ("regionBody" in $$new_props) $$invalidate(6, regionBody = $$new_props.regionBody); if ("regionFooter" in $$new_props) $$invalidate(7, regionFooter = $$new_props.regionFooter); if ("transitions" in $$new_props) $$invalidate(8, transitions = $$new_props.transitions); if ("transitionIn" in $$new_props) $$invalidate(9, transitionIn = $$new_props.transitionIn); if ("transitionInParams" in $$new_props) $$invalidate(10, transitionInParams = $$new_props.transitionInParams); if ("transitionOut" in $$new_props) $$invalidate(11, transitionOut = $$new_props.transitionOut); if ("transitionOutParams" in $$new_props) $$invalidate(12, transitionOutParams = $$new_props.transitionOutParams); }; $$self.$$.update = () => { var _a, _b, _c; if ($$self.$$.dirty[0] & /*$modalStore*/ 16384) { if ($modalStore.length) handleModals($modalStore); } if ($$self.$$.dirty[0] & /*modalElement*/ 8192) { onModalHeightChange(modalElement); } if ($$self.$$.dirty[0] & /*$modalStore*/ 16384 | $$self.$$.dirty[1] & /*position*/ 1) { $$invalidate(41, cPosition = ((_a = $modalStore[0]) == null ? void 0 : _a.position) ?? position); } $$invalidate(22, classesBackdrop = `${cBackdrop} ${regionBackdrop} ${zIndex} ${$$props.class ?? ""} ${((_b = $modalStore[0]) == null ? void 0 : _b.backdropClasses) ?? ""}`); if ($$self.$$.dirty[1] & /*cPosition*/ 1024) { $$invalidate(21, classesTransitionLayer = `${cTransitionLayer} ${cPosition ?? ""}`); } if ($$self.$$.dirty[0] & /*$modalStore*/ 16384 | $$self.$$.dirty[1] & /*background, width, height, padding, spacing, rounded, shadow*/ 254) { $$invalidate(20, classesModal = `${cModal} ${background} ${width} ${height} ${padding} ${spacing} ${rounded} ${shadow} ${((_c = $modalStore[0]) == null ? void 0 : _c.modalClasses) ?? ""}`); } if ($$self.$$.dirty[0] & /*buttonNeutral, buttonPositive, buttonTextCancel, buttonTextConfirm, buttonTextSubmit, regionHeader, regionBody, regionFooter*/ 255 | $$self.$$.dirty[1] & /*position, background, width, height, padding, spacing, rounded, shadow, regionBackdrop*/ 767) { $$invalidate(19, parent = { position, // --- background, width, height, padding, spacing, rounded, shadow, // --- buttonNeutral, buttonPositive, buttonTextCancel, buttonTextConfirm, buttonTextSubmit, // --- regionBackdrop, regionHeader, regionBody, regionFooter, // --- onClose }); } }; $$props = exclude_internal_props($$props); return [ buttonTextCancel, buttonTextConfirm, buttonTextSubmit, buttonNeutral, buttonPositive, regionHeader, regionBody, regionFooter, transitions, transitionIn, transitionInParams, transitionOut, transitionOutParams, modalElement, $modalStore, promptValue, currentComponent, windowHeight, backdropOverflow, parent, classesModal, classesTransitionLayer, classesBackdrop, modalStore, onBackdropInteractionBegin, onBackdropInteractionEnd, onClose, onConfirm, onPromptSubmit, onKeyDown, components, position, background, width, height, padding, spacing, rounded, shadow, zIndex, regionBackdrop, cPosition, touchstart_handler, touchend_handler, onwindowresize, input_input_handler, div_binding, div_binding_1 ]; } class Modal extends SvelteComponent { constructor(options) { super(); init( this, options, instance$b, create_fragment$b, safe_not_equal, { components: 30, position: 31, background: 32, width: 33, height: 34, padding: 35, spacing: 36, rounded: 37, shadow: 38, zIndex: 39, buttonNeutral: 3, buttonPositive: 4, buttonTextCancel: 0, buttonTextConfirm: 1, buttonTextSubmit: 2, regionBackdrop: 40, regionHeader: 5, regionBody: 6, regionFooter: 7, transitions: 8, transitionIn: 9, transitionInParams: 10, transitionOut: 11, transitionOutParams: 12 }, null, [-1, -1] ); } } const creditCode = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJYAAACWCAYAAAA8AXHiAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAACxMAAAsTAQCanBgAADzWSURBVHhe7Z0HnBRF9sdrMyxZoiCegKCCOZ3xzKcCgp56CoqKohj+6pmznBGMGM+cQDALBgwneuZ4nieGU5KKIoqAIrCEDf1/3zddQ29vd09P2oD++BQzW93TXV316uWqLvhZUCowv8P8+OOP5uOPPzY9evQwvXr1MoWFhe6RYDiOY2bPnm2+/vprs+WWW5p27dq5R37bWCEwNTU1K6WDfvNYvny5M2LECKd58+bOjjvu6Hz77bfukXB88803zuabb+60aNHCueqqq5xVq1a5R+JB+t79tmZBnms5U7IqQWdrHhYvXmymTZvm/hWNlStXmpkzZxohMOVCcK9UKCkpMT/88INZtmyZqa6uNgUFBe6RaHzxxRdm6dKl7l9rJKqieX0Txi+//GKGDh1qhKOYs846y1RVRc+fsrIy0759eyWOyspK2Ll7JBxrr722ef31182ECRPMyJEjTXFxsXskHOeee67p27ev+b//+79Y92iqWGMJCy4yb9481YNeeOGFlBwINbNbt26qV8G94g567969lYDXWmsttyYatIM2iWqLGuLWrnlYYwmrdevWyoHATz/9ZL777jv9HgYIqmPHjqaoqEg5FmIUAsg1xo4dax588EFz/fXXm/Lycrd2zUOTIiy4CDqNKMluTThatmxpNt54YxVPiMXvv/8+JaF07dpVCYvrw1nywVHatm1rDjvsMLU64+hk6G60Jc4zNyY0GcJCPI0ePdoMGjTIiAWmXCUKDNr+++9vNthgA7PeeuupmEs1kB06dFDCgqDgcg0tqrj/zTffbAYPHmzGjRuXUk9sVJDGL5OZ3OghHMfZZpttYDmO6DXOl19+6R4JhwyEI7PdmTNnjn5PhX/9619Oq1at9B4nn3yyuiDiQvrR/ZY7VFRUOMJFtT177723s2TJEvdI44b0xZImw7FQjvv166cc5auvvjJTp05VMREFzu3UqZPp3r27fk8FxJQ9LxXH4t633Xab2XrrrVVfSsVBM0GzZs3MlVdeaf70pz+Z4cOHm+bNm7tHmgCaCscC77//vtOmTRudwZtuuqkjg+8eiQYz/7PPPnNk8N2aYMyePdvp3LmzXn+PPfZwfv31V/dIXcyfP9/Zbrvt9Ny+ffsqV4xC3DYEAU4lhOz+1fjRpDiWtNdstdVWZt9999W/P/30UzNlyhT9ngrXXHON2XHHHdWHFAUh2mRYZtGiRZEcCwcnliOAy6XyYV133XXahlGjRrk18dGiRYuU4aVGh8bAscTaiz0jZ8yYoSEUabrqWmLxuUfCIaJEzxcCcObNm+fW1gXtsHrcH/7wh0iO+MUXXzg9evTQc//4xz86QojukbrgulZXEmPCrQ0HoaFrr73WkYngiBUcW3+jD9PRC/OFRsGx3nvvPXPUUUeZ++67L5aesv7665tjjjlGvwuRmXvuuUe/R0EGXj/Ri15++WX9HgS87zvttJN+h3NFcSFcHzhhgYjPSP1HjAJ1kwARsfoZhaefflq565gxY8xTTz0Vyy1BKOqGG25QVwb6Z4OjoTnWgQce6EjHafD3zTffdGuj8c477ziiaMfiFkBEpiNEo+eLEhzKHeEMIt6cCy+8UC3EKC767rvvOq1bt9ZrCqG7tcE47rjj9DzKs88+69YGg/tvttlmei5t5j5xMHPmTGejjTbSvtxnn30y0uVyhUbBsbB40FGYccOGDdMwTCrgm8IaYyb/73//M//+97/dI8HgfOl09XSjR4VxAOrx2F922WVm1113jeQUePJFIdfv1sMfBvxjOGy32GILs+2227q1wXj44YfNl19+qd+HDBlixEjR76lAG0jd6dmzp+qhcazgvKKhORbWkrDv5Iw++OCDI60xi0cffVR1LazEl156ya0NBj6s//znP8ot0tFZoiDErHqTEIxytygsXLjQefHFF9UqTKVL3nXXXcq9hRidV155Ja22LliwQP176HQNCThWAYQlM7NBg1b//e9/zX777adcoFWrVkaIxuy99956LIxr4IV+5plnVNfBw17fPh70tY8++kitVThFrjgEz/PEE08ohxswYECsjInGBumTpQ3OsZiRzOKLLrrIKSkpUa5Fot3PP//snpFbYOkxo9PhBL8jPcCxGlzHgiPhozn99NONKPJah2ed2GBcEGT+8MMPk7E0eTb99IPcKeJuf//732OnxdQnPvnkkzUnAbChOZYX0qnO3/72N+eBBx5QX04criImv3PEEUeolYjfB+4X9jtSj+WRndLSUmfatGlubV288MILzvHHH+98+umnbk1dfPzxx3rOk08+6dZkDtorBoM+A5xbJpV7JByiPqi1+fLLL6fU2+obcKx6JSzcAjgWGRQGdvr06UlXgZ8Y+NtfFwQcntapKRaRI1aie6QurrvuOj2Pcs0117i1tcEg9evXT88R68qtrYujjz5az0HRZkJkA4wL3CZcb+DAgSmDzfRfly5d9Pw999yzjrGDGuHtZxR6FPv6Qr0RFlzl/vvvVw/4euutp51CWX/99bVu/Pjxah1mAjgbXE6UXC1XXHFF6KIGvPbWn7XTTju5tbUBMW+88cZ6Dt73MO7x8MMPKzFw7ziZE6mAxSgi2nn77bcjORA6IgQv6oOW8847L9lGnnvixIka5yQqYPuZCcfz3n333VlPgjioF8KCqE488UQ1yxmsoIKjcezYsaEEkQrMTBuchtuEKf4MWJ8+ffQ8wjuk4gRh11131XNoc1AICOLDAYkzkxAKf+cCccT/PffcoxOI9jEx4UwAg+Tss89OOm2DCu6ZSy+9NJaozQb1QljEvNBpmF277LKLM2HCBEcUbc1UuOOOO3TWYw3SWRCXv2MhTEQmeVVRIH/KdiDXCcMJJ5yQPI+2BAHvPMchrKBlYLkiJIAYw7cWR0/6/PPP1b9F2+C89957r3vEce68804VyxzDqkZPxdf2wQcf6HnUWW6NHpdPz3zeCeutt97SGSSWn3POOedoqokfyP4zzzxTCYuO8TobETFXX321cpn99tsvMjUFztKtWzftOJTgr7/+2j1SGyjbEDrnocwHEQmDwbH77rsvp0TkB4P717/+VScXYaooMLG22morbTflggsuSIpgOHb79u21HukQxGXh4qNGjdJnp6+feeYZ90jukXfC2n///fVhIYoovxQEs+WWW+q5WHh2MGHvgwYN0npEFwp31ExD3+BcyujRo93a2hCT3llnnXX0HJT+oDgj3AOdLxe6UxQgcjg5bbnkkkvc2mCghNv46IABA2q121q7iPCojAw44/bbb6/nDh48OG8iMa+EhQhBcYT9ouhaYqFDCFs8+OCDSUWSY6eddprOJBL46ACLJ554wmnXrp12BmIgKigL6+/YsaOeS/JdkBjj2tYC6969u5rtuQTPgni76aabnIsvvtj57rvv3CO1AQFsuOGG2g7SoVHao4D+dfvtt2vA25uWzb1IxaHvUC3sZCCdCIMJkYiVafsfAkb1IGAdxtWzhdwrf4SFlcMMo7z66qturePceuutTrNmzVTZJhZmgV4EEdLZX331lVubEBdXXnmlDgAF300YUKSJO8IFYPnoUH7dhQEaMmRIMqMCrmE7PR0Q+8O1EfRbYpLoZ3BZxGmQ/mSfl2fCH5Yqj8rex3+tuXPn6gTmfvjfLCAqng+F3VuP8k99r169Yq0byAQQVt487zbGJ/eBePU7YMMNmV0aE/RuoiEzzf1WG5x7xhlnmIMOOkhz0v/85z+7R+qCHHEbNxQCMo899phmTXjBsvjttttOc684hrc77N5heOihh7Q95JHZLFIvyEiQCaLrFMmqEEJ3jyRApECIT6ML9ANtpu1BIDfrueeeS7bRfy3bz/SxEJ1+B6xMsv3sXUyb7rNmDGlQxhwLvQmrLQhE9FG6mbU4Jr26EfqC15GJrB82bJhyGnSAIH2MGY0Ca2duGGjPzjvvrJyA602ePNk9shrc34pXIdRY2RReYFDAdfEVhek0tCNsYxE4NeKP+2OtBel5cNbLL79cuRoqQFiuGn2HaIcD+732WJFED+gzCmOAcs+YbLHFFrVUDgvOoz+ycajKNTIXhVgiuA8OPfTQ0Ie2IgxHY5QO8c9//jO5iIFdW3i4bADRwu65HjqbX8xgFDCgHIfArC8oLvBfCTdUq9fqNOlg6NChem+K12XgBVaiTWfu1KlTpG6JbsV5iET6Mgy011rOGDpBbcdyx92CQzVu4qUfWREWpisNhCvgUkCx9DeUAcSJx3kQznvvveceWQ3ypNZdd12dcXRgutwjDFhO3Jfr4o32gyxRe/y2225za+MD4s9kAjAhbRYHHC/MMkNXpG2c95e//CVSB+Ma1qpGd33ttdfcI6vB5EHJ55pw2zDnMD5G67o49dRT3dr0kBVhwWZRtLFGaASNxfloRZztdIKkmPc8EIo8pjFugzFjxqgSDavnGGIzlWWUDlCurbd/9913rxN/gwMgEuzABSGKG2XCqRBvpGJzT4jr8ccfd4/UhSUULNco6832M8+DQk5fMtFF/1PuT0HNKC8v1+sxib3KvB+I9iOPPFJVklS+tTBkRVhg1qxZGiuzDkcKK2fGjRuXtF6Q6zg9Ca7C3ex53oJPhZkSZD1lAjobcxuuRUfjR/MTFoNswzvMUL+uRGQAfQQrystVaCOW3imnnJK2CBVFPKlbsbI5ijvDdYh7wtHjgHZBCGJUJCe7vxBj5JxU/YwbKM7qpzBkRVgMHgUWjb6BGLMPwEJOq4Db8xhYTHs8zdtuu62zww476KyaNGmSPgjn5Ar2WiwwIPCK+yLo+taxSPHOYgiJFGk4GlyZkJIFDlbEOoOHcg2BesHAMeH89+OaPDuEznW9ky8I/N5/7ShwPoW+xKuONGAc6OfDDz9cU7m9/qx8Qu6RHcfygswBvOTIcYKhYbpDYwLOQ8tF4by20xkAVrpQj0IM97J46qmnkusa0UHQIy2YONQj+ukPLyBIxBDHcd6y6npNBYSVMz8W6/3YEQWfCxmaIh61njVud955p5HB0r8bAiKOjYgUXYfoxSabbKJ7OwAhnqRPCh8XPighOv2tTBKtB8uWLUtmqLL6hnOA6Fzm1ltv1e8iVutkggrRJffoEp3OiKWs3+sTCxcuNP/4xz/Uh5Z35Ipj2dnuBWwZ5RPFHo97QwGzGW6BCEM8WmAZ2cAuFhoGCeBZTj/9dBV3KL1wKft8N998sz4Pv7nhhhuSSjz6ls08QPx4fXH49KzrAA7pbUN9ggwI2o5Rw8a8+UJOOZboDu631aBOxIYWy8HSBVxERJaZOHFich1fupBO1PWKcBUv58Tzzzo82sl36XSt52/pfOVG1Nl6AAezx+E6lmNNmzZNPd88p+hSetxCLDYjirpywvPOO083XWsIcH/WVvKsoue5tflB3pd/CRfQDTZYrAmBEUZ59dVXVQSxbIpBigJiVPQfHdzJkyfrAtd0wY54hEZE/9Ml9JYYAEvPWGQh5nWtZVxz5swxzz//vIpElqLRdgCBIu7FpDeih2nIBPCMr7zyihIQCza8i1h5ZlQCjrGki9BUQ4BJxZI1Fu1uttlmbm3uIUwr3vKvVOZpOsCRinkv+k2sICieZEx0RBnOxUwR5ndCxIUdoz7o2cPqo67FsVz2Y0PBa6yEQZ41tShkI1Z2BmbZuVeJzRTsBcoMRrn1K7hB2GuvvXRp10svvaTB3UwRxvrhmGHHqPdyN4uw+qhrcSzoN00BGCMywZVzY6RhAAj9uEdDkIpj4c+R0yI3ImM2xgWBz4ceekgDsXGoPwjc77dUGhKkPBET9ubS9+/fP9LHJm1O7cciRIMjU/SNJJvHYUhiHp7hTKLgiIRMO4zf8fvfUmlIEKYTTpskKpyuXr9eECCsSOVdzqmjXFN34oknmrvuukutIPKNjjjiCM0pItcKq8j/m7hAuUXZR/ENe0kS96f8lhAmQul/Xs8iUkDfduE1GDIBfi728kL1wcfHfTFszj//fLUoMaLYyYY8ryjI+GS2dwMhHGKCXMMWUmPI7iQ9OFOwrg6Wy7VZphQketc0jhXnecLAWgF8ZkQCiAJwrTgIO48FL/ju8O15Y4Xki5EqBOLcQ87JzI8Fd3rzzTd11znMboCviN312LFu7ty5WpcuRNQq18JDfvnll5vDDz9clf01DdL37rfa39MFv8WFQDQgHcMKicJvRcetdf+uXbvqGODn8nJJ/rbjHFsaCXVl7HmHeslKIDYIl8FLjXfbG7TFAw21x6F0YnRwPa+iiEwn9cbmI3GdoFm9JpcwcIwsCBZuBGWDekG/UcjiQCE/5JBDNCrCekw7Nnzi3onzSr0oyHVyG4QmDZjovm0oYQNyobAsUy04tWDZFYl5drtECnlchE+4LsXf8WtyCfOLxYEdB0BYiUxTxsOuGqeQiMl9cgm5b+4Iyw66Fyz7ovFYFXGT+LgGnQmns2sKKaxRpJ7j/s7PZeEeQfUNUWhLNoQFcOmMGzdOtx4gXVtEmfYnn7vttlvGyXxRkDHK745+ONZ4Lx8ymh2ACWWgCxBWwAIhrIBcD7N6iBPy9gfOP+WUU3SfdGl3VnpJKnDt2HpEPYD20D/ptgldVcSkZlywU7QQqF6DscDJecIJJ2hMk9hhriFtzv+OfswYrzONhDoi/cweXnvLnlbkKsGJwkAWqkW6HCtzDiS/q1klpTLgWP2WqL4Jw4033phMzabwna2Xpk6dqmIxn5D21rUKpdLMnz/f/St74P9gLZ8Ff2PJENYhAMwbGwjbXHLJJWrdAGmbflqk8ptEISvuY4elnuB/7mxAaAkuxSf7u+KPuuWWW4zoWLFf2ulHUPuQPGR81IEQUpJjsfSH/HCsO5TnkSNHqnwmryqXIJzDEiiyM2Xg7fApJwtaB+hFuhwru8K96u9+Ydw1DFjK+JuCOBpGEH3JHveZ7j0WBO7JIhCW+rM2EQuexReso7SAY9UiLHLD7W52tuAwI7aXa9BAQgM4Re0eBhQWMEShfgmrcRQ/ICYWZrCmkxhuPhRwwBiRwOhVRQjtwXi8NMKCWetABXUIi4dgcQPuAbuAlJJqH/VsgP6FW+L888/XZUreFdJwNlH+nTfeeMOt+Z2wRKSpNUcqEdY240O2az7A/hIiNtUjb4HfUsSr3pdjLGfzv8WjDmF5gVh87rnnMl4NmwvYvUVpvMVvnbDsNpYU0VdVZWGFcz7AUjLuwzI5LyAumE2YbxLCKho1atQFoues1q5dkDFJMHLdddd1a+ofdvHBWWedpQHu+gDKfqYlX/BeG2WcV+rheqFfLr74Yg1A5+P+bCxCYJut0vlusfbaa2tKt82qDcCqenszxbfffmtEXus7cPClACFu/QzrFHxeIir1Aayvi9/Y32UK+2vvXblmJv4iP6Q/3W+5g9fPhwVG/JQ+pF/CEgu94NlEnVCfIT6suOB33A+rPp1+kd8trRfCEr1JXQoEp8l1J/cc5xyvhyOXPc1Ga4kDrht0rpiiUmTAalYf41wyVVmmhSPXO2Ac81/L2w7Meghq+PDhOptzTVxewvKC+8fpO17/izuHxR/k66dDXJlA2rU0uMU5Bg9vBwofGbPniiuu0L2pbMcsWLDAvP322xlnRgTBSwheFDAgvmO0A9FL+8hx+uyzz8z06dM1a4M2UViUAbfgO2/P4DhiyZ5HpCGX8BJvEGzf0Sbe++hdgeSFPY9P+z3fqBeOxQxGDLIRGoslCdEgEh9//HGzzjrraIeMGDHCvPjii7qChNxqVuPwySoZL1J1dqagwy2h3HTTTZpSUlpSagqLCk1hgZRCGRQpYjvo89AGUaz1O8mNJD+i93Tr1i1nHMs+pxXR/G0Jg1VB9BeFkA0hHPqQCetdrgZ4lhdeeEH7mpVIYRwwV5B21o8o9IJOZ3azitgunWLGsWTK/95BiIz3+9FhiE5A59oOzyUYMJZ2jRs3TnfsIwpguaxTzf3kvgWO1BXrM9iBBhDWcccdZ0aOHKmRhVwRloWXEPCe83Ywoha//PKLW5vALrvsom9Es/3aUICw6kUUekEnYeF5Hx69i2X5EBAWjg0BEYRmdQ5rAusDtA2FGEsIwiGURCkpKzGlzcrke4mGQyAerXfbybNQ5yW2fIFkStZlWqKiDeisRx99tK6kykdQORPUO8cKA7McKxCxyMphcq9ZAAo3YJb+0X2vcz45FiutH3roYfPIow+br0WHKi0tc48m2oeIsZmacDPqsFoRfyeddJI54IADIsWMbTf3Sgfea7IqnMxdOD5xP3LQt9lmGyWodA2hfAGOpYQlnKH8wgsvVKUUC4IFEoAAI0vH6RAsJWYlM4TBZmbzcPl8EKwt7m05A+BvO0C5BgM4ZcpzZuzY682cb78xRYWY2QlCIGi+1VZbqdKOmKTO1tNfo0aNUr0xCrbd6faZn1jRr0gVziY4nwq01bYTyYFhw8TjO/dFV7Ppyh988IG59NJL1beF5BFaSaTNkPpLiEAupPtJ4e0lIMrWPgQZOcb+6WzPw65xbMPDjm9kevo9w4AwDd5gPPd4aYVg1WOeCnHPsR7pXBeuzersQYMGO336bKDP2r37OhrL5JlZvY2neyP5m33S+/btp3t6EoTlGUHQdbMpjEOcfkkF0pdYqkcCZdj1OM7e9GzvJJxZ60hAYMdDxp4QDuk3ZKCSDm1jiKSmC7E5a6+9ti6mkesnQjqswmBzLgKadscVHoj9x4XlM80CC7sTB2U+EOPjJrYRNIo1iF6Qo024iMal03GcGzQAuShcm8Ar+6uutVZ7JZ6BA/dTwiI9muwLCIy3aXXp3MVp224tp43UswEbgeGga+aiZAN2BCT2y9oB0cU0yYB9vILAjkAiHXQLBLs9JWEb/vaPPVt9WsIiCG430oOWIKxIHQufDoozPh18NBSheGX/cj3N6kTh9rNqdobBWYj+YYHoxA/Ep9xT91qHhY4ePVp1BsC1zznnHDX7cTNgFaIsH3roocp6Afel5AOwfgrPjIXYv/8AEcPF5pJLLhXrdBszc+YsscgeN7379DEbbriBaVHeQp2OGB/sP+91qoaBtlsRExfe/sVtgO6J8o5IZIwIt+Bm6N69u3vWatAuDCAvcOWQXeoHm6CQWUoYD1eQ3TsMp/H999+fHA+2OmCPLxtB8UOeMX4GKRyMvB5YKWyfV3kwwyl+2MR99ulk91/y1WGvdvbxG1ItpMOU8i14vQnt8hdmnAW/9c/oXBauz7ORUcGMRKwjIsjLYoXLpElP6r5anEtfIO6pz2e7vPCnNdkiBo57Rm3Qv0Igym0JYLM6x/umEC+4F/vCs0rHP66IRmjAC/85FlKfu8UUftAI5DoJYIhLf6NYbEmaLMdsA8moYBWJcLVanebdtI1z/R2f68I9yBVj52UL2g/BkdYDwTHJSKJjEzXOz2e7vDj22GNr9Q3qBmLIvzWlBWPAtpSoHkwExsO2N1+Qa+d3MUVcSFuS4kE6Utk7bgdEJ+IFJ6m1gDiXkm8gfnDYYgnh6uCeDzwwzgwdOkSPsfWkjfJ7258PeEUhHnYWC+M769Kli4on1IZ07p/v9sr169/zni3oFEoYctlpDCjuBfZGwJWAzgjBE/bBKUm2QD4HyMJLWE0BayRh5RLch0HFyBArSTmY6Clmzz33VG5VX+34nbBiQHQVLcx+0VWSn3i0bYHd45wV/UstUbZXJNQD6pOwLMfCInrkkUe0TbRj6NCh5sADD8x4tUu68BIWFiEE3rlzZxWHhJ9wVOJExvNundh84tSuD47qR84JC4Ih/QXPNCID/YTBgDggFnQmvmMm48H1EhMuDM6H0IjG84m+RcHdQGAY1Cdh4WYhc4ClU7SfZyNhEZcJbcLVEie3ifZmM8BewmKRL9EQdE8KBARBEQ0hrMMr9ajjk3DPmWeemdRP6XtcOUQQvBkQjBt9znPlghCThCXfy1NdMFXnQCxnn322+kzgNBAEv5HrJ9NL7Cf1lLi45pprtINAur/NBDznO++8o23Ff0a7AUSF4swxJsbAgQPNzjvvrMTFuUH9Y9uazYB5CYsdeCZMmOD+FQ2IDX2QFHPAPmZPPfWUxjUJ3QEmMz5H6zvEF0Z6DRyR52Iz4HQD2/LMCcKSL+XsEmw38YJImJ1QOE5Lsj+HDBlSi8r9INGMLYzgVn7QqcwuZg7FsmquR6P5zmwh9oiVA3u3qbcoydzfxgvzTVi0FQIitYedlO1sDwJcmb05xdxXCy1f7fISFuNBFqiVAvxtvzNu9L/l+JtvvrmKcUQm4HnQF8lzmzJlitaRgsNLPYPAfSFGlukzTkiWcePGaUYw3JoYKf2FtIF24JI4a6UuQViffPJJOWkX/IAf2xlqgUlNQzbccEO3pi4gyAsuuECzQvHYQiA8ELMAIkHeU4c+YIkKwuFvGkRhhkGA3o70I5+EZbkKxIKLgfYG3cuexycDChfbbbfd9Lks+J09L134fxvVHwBuafVWOBAF4iIqQL9aoJuRZLnrrrsmuRjjduqpp5qPP/44SZzQgAWrqImktGzZUrkfHBqvP4s4GG/G7I477lAOSJYH2RfC6RKed2J7BJrlOoGFhZE416Ig11HnGzEzmcn6nbibNFIdikKssZ1yUedxjGvlo3DtefPm6Tq5uPcBeLL5XdDxTIoQiRb7t0Xc/guDfSY/GCvGl4iKcDR9EwfbphPfxfFq7yuEp0vx8OITcbDXsjsBeoPQyrHkIcqR21A04oiCOQ17t7JWfp/xDEwXzD5mDso+XBRRg9wHtIOSD/B8KOtwUmKZce4DN0HJ5zeIAelP90jmsPe1/W05FvUo7l9++aXp16+fSgPUBrh8fQKOhQSiPbSRlJq7775b9TN0QOFi9e9uSAX0luuvv15zuWUGKatGzrOZLuBh4gx4phg/frym+CJG4tyHQaed6GSIz3xMPq8oRE/C68+EZ7IdfPDBmm/vFcMNDem3+k9NToVZs2bpBvVYXhgU6A1ePSFfgCCw9CBsBi0dwDHgriIa3Jr8gb6gTzAw6CN2NIZjeAGhc05Dot4IC2sFpTIVYO2kZcBW4QBXXXWVZidmg7gcDhYPkaRDyFwbyxGCRAzmg2N5wUZ0p512mvqiSG+BuyKWAAo71nufPn00BMUCj4cffjjQUs838ioK4QDobTgY+cRkJXUV/SAMDBQzEB0LPc8fYOV4XEJJB9yDJWoUcte99wi6n7dNDByWJA5JrN1cty/IKsTFgJqABU4fcQ7EjW7IXvkW9DmWGvlT9jo2Lw5LLx+Q58/Pjn7PPvus7p9ExiLWJlmJ3E8erNY7/jKBtDdpLeWycF32SSUtJl3wW3aBsa/sDbp+NiUuuDdWGTlXZLzS56J76V6wtl2kILEnP3u5X3LJJWoBC6dzr5C95QnkGrlPm2EpN1zJC2YKMwSF+MYbb1Sfj3fG+yFtc7/V5gyAY97juQJtnPTkk+app59WHw/3QCxyf45R+C69ZqTrTZVTY5xqKfwtBb2G/VZ5owN/5xLcG9Am2sD1bV0YSD1ipRN+Jl5/h3iHs7I+EwerF1izOLeJydpzgb2f/YwLOX9p6G4zFuledNKkSeqF5zc4VskEOOqoozSNmbRXYl12kMLAMQpeYgiRB0f3yivkfhXLl5v5IiYYDPQm66y17bFt5rOQIsdsQWzjPIyKTsSFv8+998UdIlxfnZhMAO4dBCYymRh4x23UgmfCIY3IpBB6A+iWOE4J96CmWFUFAwDXBvflemlgVSxRiJMTJ+B0z4sBwoCz7d5779WEfTJCyRDFQZoJeOsUjjc2ZbWQ9tYRFbkqlSKiEQs8byYlX23zYtttt9UFLjLQzuDBg9Wh6T8nCqghQlS6eyNikRU4pC4LMWjhhQQWvKZYJrTuBX/SSSfpixzijKX0Q+3UZDpGFG71wHr1IGS0zETVl0hzzTW4ryiUqqMwQBZ0XIcOHXQZmkW+Bs8W//X52xZvfapjuSxeDBw4UPUmSwiinCtxsHUkfWjbkw7EEHBIw2ZFjxd42e19KBD0+PHj3aMJiAFRZ6WW3L82YYkl5owYMUIVu0cffdStdXQzU3KrcdnbZUG5BB3CggmUfdY1WpDUzxIxOJ9FPgeRyRRU39DFC/Lu77vvPkdUjFqve2N8WOI1evTorF9ZYgE3ZEnXpptuqoyFezzyyCPuUUdz/uGgbKlO+M6iDmFhEYk+ow0dMmSI1jGQFRUVujUgaw75O9dgA1XW6nFf1jdGIZ+E1ViLH0wA4nZMeAZddKAkgYl+qGsfWSic7VjZsSf+i/WImPRakMSQuScLe2FKFvK72ltFEhbAmkBpJeJt37aO8oci7vcpZQIi6Dj5ePk2KTH4UlAMpT2qoLP9ITHK37Ea/j5HYWesyGY97LDDNGcMZRwl3Gbd4mAmxspYZgruy9hjkGBAYdVjAFiQ80/KNpYmhovn2OqtIhlYYNOEbQ5PrsHiR2J/WBy8b5pYFw/A/WV21mp4EDjPtvW3gjDLzwsIi9QX8qvI2uWllVtssUXWjCAMjAHXxoUBkXvHTY7VfxAaz/agQYN0ZrHiONVGGn40NsKyHZwO0v1NHMKygCkwQeEy3CPoPpm0OR3I9es/CE2yIHt9UtIlqsaKdAk900HFz4QD9thjj03uAuQH3IMwDsQYdR8kBqEz4ovptj8OckpYiNE4jUTM4lBcExDGFfIBUonI4iT3Ca7Pe4jQWdMF7RXLUrND2b4qL0AUCjFkDRyivDHhjDPOCLRkcgUsFWsteb83tKsgn/e3IJuTHXBk2LTgzyImi1M6XfTv31+vgaPVe49cQMYlu70bcGby4vF99tkn+bAUNpbIBOxNxbt0uGaYhzcXxNSYCDJO8YINSXBcQhC2v/E74nNKB7zejxeN3nPPPW6No+nVV111lboW6JdMkTVhsSEGr8OwD4iX/IQTTtCQQSYgbMB18M3gOwmClygaY8kHofpBfjoSgk3gbN/jU6Jv4oJz8Ul5f8M7ebgWu9KkWuMQBblm/LfYy/nut9XAB0V+PCBjgb2bSCumPgpcK+h6LEvCl8UqEpTQ3xEMEvv2339/8+ijj2pWAjor+2Clo+txLn3s/Q3LxQBrHGzgOlOkdDfIDNQ0WJyjQQSDQ5WEM6w9sgLiAKLCGmHPd3wuhxxySHITL/6mo8KuFUaUDQ3bJjtQfOaqnVHuBtwLJFTaTdKyBYtXWMZFFoQfrGEkAZPjUVkc8typE/2IgKMw8to3bzwoWxByIHJOO3jNbDqAfTe24hVdYfX+Y0El6LzGAFQTm7zJsrAoHUzanFoUwm6hYkxdZke2kPvqJ9yPBaGAUEE6gBs0tgJXsSWs3n8sqASdFwekFlaLupX4lH6m0gfq7HE+00lHhFPxShrys1B5kGRRSCkKyVVnn1A2wSAXPFXIJQy8fYIYFkRkCYpl2YQEWDyRLeQ5VCQgRjNtY2MGkQry6nnO/v37qxPUC1EQEp+Vy82qioVm1YpfTOWyn0xNNe9rdkxRSUtT2rKDKW3W1hRLKShupr8REtbfpQIOVfxn7FNKuAjdLgzCPOKFdHB8MlhxZ48XNAiud/PNN2vAkpUjOOVyqZzDBdlfgA1Zhw8froFZL3Ghz/GKEN6I4V/ahY6I0xGPNnqkBdz5/fffV+OELEwL6lnXhw7iXxTCwlUIgBid1RFpG/02Y8YM3eOA32QSGGZBMesHuRbxVl4e4MWqigXmp88nm4q575jlC6YbZ+UvcnN4E0LJ5V8Fxaa4RWdTttb6plXPvUz73nuZ4tL0FlTw/KnGDsKKZRVmSlSA1OKTTz5ZB4lBZDdiZl0csHSJVGcIOwoQ77XXXqs7AU+ePLmOyIZw2M8KTzOeaiuOAS9k4hhhEq8Xm5Ut1BMk9656oT1wbgoEZkG2BlYt9exhZe9BvxEfJUUbTsNayUxgNx0hH71lqwQx2FWMi2a9Yr58/Ejz/WuXmyVfv2mcFUuED5WYgsIyEavFUkq0SGNM5dIfzOJZU82cF880s6acZpb+9IWSHYINDpbgfKv7xwvuH5chxCKsdIlKlE/lEOxiwtZGpHMwS1kDx5q4OOv2kOeskeMabLoRBR6W+/DqD5Y5+R+eTSsQxeTQs8DAPg8ZAeTn0z6OzZw5U+sBxIAVBKeBsCyhsOLZ1vMbO0m4PvVMHF6U5CVuFpYSl2PBBZtneAk7LhA977z9jnle9BsbY61e9qOZPfUCM2PS0WbVohmmtEUHU9SstSkoEm4pBAWHqqpxzMqqai1VMi4FUl/SvI0pLW9rfv1qqvl84gFm3gd3moJVdu2hFap1kQ4dxCKsdEGHQxCwbMDCyquvvlo3T4taU+gFsUQWXtCJ5P2kwvHHH69KJcToFTWIJ3bjA+SUsce5BVs1MdgA0WYXbKCYwr0gGnLFEIe2U2mXFbMQkiUsBt6KUjiWl/vRF4haQKoQ7wrKBP027mc2ZzFKQaFZsWSucJxTzC+fPiL6luiVQlAgQbSJUlW5zJS27Wm6/+l8s96frzRt199XdC72KBMCk39l5e1N85JCM+/ta8yc10ebmiomA8+ZHiMJQl4Ii8FEMech2V8AgmKVTtzAM78jsYwVKWyfxMreVMCSYutGv9geM2aMcibAu429m94jmuE0AOK3viAIC0OAdthENwsIzV4fw8MSFsRvX3LAJmb0gQUGBaIWoO8hZjPhWoBfVS5faGZPOdlUfPu+KS5ra5zCZkoo/EMZr5GzqqtXiKgsNt33uMx02vSvpkOfAWa93S4wrXvsaqqEO+lbZrleYbkpKW1tFnw03nzz2hVSw++zR04IC7bP4NnOQuQhkthzi1egkcnIgHMOBIf7goJYsYPu7Wg7cHAQ69nPBIgg+0o6xCQ7oXgBZ4WAADvXWRGNTod4pE2IVa8FBvFCxIBzLGHRZvQrQB2rv71A/4IDcy0v4acLp3ql+fbN64Wo3jMl5WvJjWsPIb3I1WsqV5hW62xjWnfpZ37874Pm8ydHCrdaaTpscqj8pLm00aO3FhSJGG1nFvz7djP/v+NMgXC0bJE1YeGOgIAYNPQqBoOQACyfHWJIb0bn4u2qpLDaRZEsR+c7BIhC7PeLeDvfPxCcm8oIgNjZXAQrDQsNa9QfOfC+CgTl2oLfYsEBfuvV2XCVWMLCt+NtA8q5nQgYEd7JgkVKqgrqwUUXXZQWcSlnSXw1i4Wgfv7iGVPaMvFOxdVHErBXdZwaIbz2xhECWv7jf8yCjx80i6Y/b5p37Guate8hs2eFnGt/K5ar6F7NW3U0c9/9h1m+aLZb6796fGRFWKyoxb+F9YbCyiy1HY34YAAYJNwLI0aMUB0IpRjLCG6FuMCa4hjbB0Ew3sEIA0SK7sW+pGHnoyxjidIe8r/RrfxmvrXQEGPepEMmgrVE+Y03bublOP4kOTis3d3Z7mNlwXVwQ8C54uiMXnifcP7HE02BU2lqCspEZAUTJ+o377wuKipTAnOkD0plclQvX2AKy1qK+GxjatQVsRrco1rEorNqsfl55vNKkNkgY8JC/yEQyrZDDB6ciY6zs9mCWYrLAWWW3WPwN+EW4PfsJINegkhhw1V0jzgzGQJFN2J/TfScIEDoWG4An49dGOIFjj7ENi4HL/F4OZaa9x5OB0ey23AT1/RzTd4LDahHiQ8C4p+Vx8Rg48D2yK/zPjSLv3rVFJag8wnxJKp9gERExxLCKm3dVURnlalZ9av0a6EQS5VwJplcxeWmGiuxcqXUJQiMa2kpKjE/f/mcqVqxOFmXCVIusQ8D3Am2DmfCEhs7dqzOei9hocMMHz5cOxJfFk5SBhnvO6KBQSATEuLgXAaCzAY4TBT4PVYcyjhWpp8Y8WsdeeSRKqpoH2LZq6tZLoOlRgAcz7/3GhAZ+7tjMSLiyRywz8X14KxMKByxPIOXE/KdfqENXAdR7+eUqAhwaYgfP5nfix4EWvzjh3eYiu8+EI7TWgacfxC1o9ZctViANdWr5PsKU7VymSnvurVZZ4dTVdea/5/7jVNVYYqEU7Xtubtp3W1r0w7naMsupmL+Z/qbQghOrojFWbl0vilbq6cp75Sw4DMgrtWrdNyK2GBWw2Gw9EiZCcp8QKdCbMH+2SA1bMN9PPJwP1aZoK8ROojiXBCGHTg/hwRwSPxlnAeBwTWjrucHv0PMwUlps1fH4hhiEg6Mtef3meELQ3fEMoRgibH6l7OhGvAaOODdajwMENVKEWPTHx1qqhfPMUWldgWVcB2x8ApL25jmbbooR0KZb9ahr+m8zfGmebse5vuPJph5b44xJcVFprKmwHTa+gTTfoOBpqxNV1Mo5y+Y8az5+oVzTVmpcMHCRLRg1bIFpnXvP5veg+7Qe6cr1qSPMl9MQYeiEOPNDiIqRNVbb72lyu+wYcOSm4NhhUFkzGq7ERscCJHEzGaRBTHFKEAk3D+IqOAyiFgIAPcBg+gnKtqAbgeXDPLqcz4ikEnjJxyO8UxwQP8xgJ5ldSivn8wLDAWblkKohvOiQOsrF8811UvnSh+tTieCQzXr+kfT+6CJZoMhk80GQ5/Rsu6eo01hcXOxBseZH96+NsExC4pNUYFjfnjrWjN9Yn/zxcRBpmLRLNNxwwNEod9IRPdq46mwuMRULf5Kro+CnxkyJqxUYPAgHNg8+TuWCFD08ekgChhYwGBBXLgk4IRxdv7zA0Ki8JZ3dB9wzDHHqH/KC85BbBOuQcx5wzW5AFYjnIpnwU8GF/brYezGh74JmIBej38YVi37yTiiExV4JhNKeefNDjEt2vcyi2b80/z40QMi9u4zc1670syYNMLMff0qUyzEVFhULM9dJdytwrTrtYtp1WUTs+z7j8yyH7DiRbFvs45cbLUyX4jHvmKRqVq+yK1JH3kjLAsG0gvEAoSErhLE6TIF14TTodgjJhFhiGAbDLZAn8O/hShD1FklPVdgAkE4iGl0MZR02uMFInTkyJHqbIUrxnIcJ/vR8hA+xfIrFq4pX38UPeqbqRebb4WoFk0bb1b+MlvaUmCcQmmHcOUVi380HfodaNr3PcAs/1msYRR4wjhCWMWlLTzXF0hfJqKGtccuHeSNsAhvIBYYSILA1k81ePBgdZpCANZTjTjiHD6Z8Tatht/ce++9mjLL3lreMEkQEKOY+QAL1abaeoFCjw8M0Ea7zXeuwETCALHPQJwziAPDMXnZAr40uHVK1BljKshSTXDDwpLmpqRZay2kyJS139CUdugnivxSU1DWzvQYcJMQ1UHmuzeuFm40XwiyNGEh6jXIwNDLJJG4XSMkLHQQRA3EgTLtFTlYj15LjEAwSi4iA8XX6mN0PLsDIk5wTyBaooDVad0PKO92cL1ARFudho3L0t0h2QJxCyHbCWPBM2HV8vJOgGESJtqxjL2pOlEguFwoCrglpNVI9CH3JUyjnyLWSsrbmV4DbzI9B99lNjjwPrEIW5lZz55sKpctNMUlhICE27WQe4uyj9jzOi/4Pek0q42E9JFXUcgGH3AETHPCHXAlP9Av0LfgIhAC/ixLcKNGjUpuNc3udOhqYcBQsJ50fFaIwSAgduBkED7iyOu/Sge4Ogg833LLLW7NatB+tsmmvbzIyRufzATwjZIWHeS/lkm/U11In2m3FahOtfjr183MZ/9m2v5hB1Mx/1Mz+7nTTM2qJeoDSwi5QlNW3onGCrHNl4/VpFBTXWWKytsLcdXNe4+LvO/dQBAZFwLchsHErwWnwLsNR8LHhIhjluPwxM8FFyAcw443gAF64403dIaHAX8UCYVYaoRTCBuFAQ6C3mM5Y7pAdGAUQPToUxghdjJ4wX1Q4i3xBp0TBxAWsb3Zz55olsx8WdSjRBYGvqv1Btxo2vXc00yfdIxZ8t17ci/inRAOBLPQtOy2uan8VSxK0acKSsqlvsY4K381JW16mt5/ud9Urlxs/vfQX00ZUrEQK9cRQ2Gh6bTdiab7jmfpvdPlPtI/+d+7AecifilCKogg/DZwCrIhIR6ICmIiAwLdBLBjCi8BArgMMMmjiAoQZEanY79TXBdRwFLNlKgABGIzIbDqwkQd98F44PwoorIGDiEm/GdBIFGv7fp7m6qaKiUOMhjcI/o/3MhZschUr1go5WdTI9+LigrNsu/e1+Q+p3q5qVm+wFRjXRaVm7V3OMUUCxec/+G9ouRWqJIPOdaI9VjcqrPpsMEgZYCZTYV64Fh0GoVgMHlRcBXEHtYTSiued+KNWEjUsQc53mosN3532WWXmXPOOSelyMJNAQdBZwlaupRrMAkITdFm9KhU0YJUuP3221Wf5FnZfdn7vJaEqqsqzKcPDFACKSJnXYipx363mTY9djPfvD7aLP/hE9HDiA/S5wmvvCUM5WFCPM3ar286bnygad6ut1k04znz1T/PEQJM+AQ5t7JypWn1hx1Nr33HihGQGVnI/RvmXTpYf8xgxIQfODfPO+887Rx8PXjusx20dMG9QRSX4ZVqcFzENMYHEyNToBbwrBgD6GRwb68rhtZQ4E3ff3iP+f6ta01JaQvjVC0z7Tc/yqy9zfEarllNROFwCPmsWGyWzP1AXRNO5ZIEkeoz18jYrDK99rvFtFtvF/mL/K700WCEFQb0Md63jHhEV8IStEHd+gSZFliicA4SDv1gELAKMUYwTkgTyhZwaJzHcHC4oT++aLFSRNmMycea6oWfmQKx3ETNNq26bqOcKEEcQl7JCSGfLpVRhbW3aslcs2LBdP0slIOFbhiHE6ukrnW/Q0yPva7MmFuBRkVYiBP0MBvxv/zyy9WyAlGcIy4QlXfeeafqPYSY/I5TC9wRiGjcFhAWXno/GMA4bUoMdCLDA2OBuGVYvj/n0kbahVgKAyJt0eyXzcwnjjKlzRPLuKoqlwsnWmUcaRLpMom7EqTWHySBO6KosEh+wz0SmbaJs0TRX77QOCWtzSZHTjGlrbomfpshIKy8K+9xgPebmB5xNR6WiD8pLfrgMQYwDnAL4P4499xzNTkxDOSIQVxYpnwGIW6bOA8LlbRsAs24Qyyx+cG5NocNfTTMIEBrWkuswJ4Db9I3ZJCwV1ZSZsqatzTNm7U0zZq3ksJba/mUv8vlU0oZn/J3aVlz4Ybe9O0asRiXmpK2PUyfg+5XovJ7yjJBoyAsMkhJIRbuqdwCIstGZ/EDSws/lw2thA0uwMqziPKbxQX6E4AD0oagoLcXED3qAItDrA/PCxybkFfHjf5ieg64yRQ0byNGnVh6Ul0jYrFGh7RIzqAUu5+I1UThu8vLDKnKlUu+N2UdN5Jr3Whad95UjwQL4fTQ4IRFh+NasLnvOEtxhuYSrKbBlIegcDNEbaDh9e7HCrWkABEGK3bRo8LcCRbkaBHuIgOEpWpMtrpA3NWYdmIN9trvH6a02w5m+a/zVSRCesKOEp8BJcGpakSB/9WsWlFhWvUbYnrvf5dp0amvHOZYbtDghEX+N555wNvqsQijdAzA4OCURGxZjhAFjAFihABlOyroi1UGMWA0RDlZ44IoAIsoAOnYqTgWDlf0QJ4LhzGTwovE0CeIpLqg0LTovJnpd8gjwnFuMM1If6mGaJaqeMOB6lRWmBopfKeucuVS5Wwt19vZbHjQA6b3vteY4uZrCaHmjqgUKO8ykxsM7FwiFpBuM8n7XeKAjfOF6zjdu3d33n//fbc2HMINdbecPfbYw+HVHmGQvtBP0fV0dzv7d7bgdXX77ruvM2bMmFob8AdB9E1n+PDhKu+Ki4udCRMmuEeiUSP/VlUsdJb+MM354ZOJzjf/GuXMnHKCM+PpEVpmP3+KM+eNK52F059zlv30P6dqZWab48WB9Ft2O/rlAnQkb70QURV7IHfYYYeEoiFl6tSpbm00uI9wLt0iqL7Bc0HcYvW5NdFgr1EmG8/32GOPubXR4Klq5H96sKamyqmuWuFUV1Y41auWJYp8r6mS+0tb9Bz33HwAwmpUfqw4YGUQGRAA0YnvK9NAcrawS+rJkCCclEuQWoT4RjSHuUa8gAot+B4m2PzHciwAFUJb+XnDar6wYMGC5L6bLVu2dN599133SDTGjx+v4qgqiw1b/UCknXzyyc66667rDBs2LON9V4MQl3M3VsCxGoW7IS7Ym8ku6SItJs4+ECQKEvQmP9+mLOcCGAS4BrA22YuBGGeusNrHlAAuEH/eV2NHkyEsnIbE0HCm4uMiiTCVrwsLDG87zkb2SQ1zOmYCnJn2/vjHaFeuITNfExYJGRFDtX64poAmQ1gQCcQlnFY5VZwYIu4Iy+FI7gtbfpYJ0HtI4IO7MOCEY3INuBS+L4iW5WRNiWs1GcLCscmsxStPVgFJg36R4QdZB5ZLkQ4Nl8kVMBggLHxuEFYqx2cm4B7kopFJSygqzr5ijQVNhrAgou22207zs3AipiIqHIzsuAeng7vAsVJZj+hNbBHOmsNUhAJBYQnyybn8Ni6wJmkX3DcVcLCSp8V2lameuTGhSSnv6YDBs555uBvp0KkGhjAKcTrep8jOOamAaIWwEIO4HdCJUsFuNYnul0q0NSVC8mONJSxEoOUicZZ5McjsTkPs0pZUIFMVwoJ4SbuOQ1iIczJPCdfk0phobFhjCQsuxSoaRCB5VamWWaEnseAV8USSIfG6VEDvg6vwG/9eWWFgFRLrKVlX2JR0prQhndFkHKTpQjiCviFfntGtCcfixYud3XffXZ2vOD2nTZvmHgnH66+/7gjX0t/wginCRnGAozdueKcpQvq7aTlI0wUcgRSZOLoKy95JC4ZTbb/99roRbiqwKJVd/BCJrDSKE3oBKP1xz22qaHKxwnwDJRyxGbTQIwzkcEXleP3WIExraYEorVVFYZn7v+N3ZABoCo7FZlS58xz+jt9hTMX/A/eR72+RaQ9jAAAAAElFTkSuQmCC"; const githubMark = `<svg viewBox="0 0 98 96" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M48.854 0C21.839 0 0 22 0 49.217c0 21.756 13.993 40.172 33.405 46.69 2.427.49 3.316-1.059 3.316-2.362 0-1.141-.08-5.052-.08-9.127-13.59 2.934-16.42-5.867-16.42-5.867-2.184-5.704-5.42-7.17-5.42-7.17-4.448-3.015.324-3.015.324-3.015 4.934.326 7.523 5.052 7.523 5.052 4.367 7.496 11.404 5.378 14.235 4.074.404-3.178 1.699-5.378 3.074-6.6-10.839-1.141-22.243-5.378-22.243-24.283 0-5.378 1.94-9.778 5.014-13.2-.485-1.222-2.184-6.275.486-13.038 0 0 4.125-1.304 13.426 5.052a46.97 46.97 0 0 1 12.214-1.63c4.125 0 8.33.571 12.213 1.63 9.302-6.356 13.427-5.052 13.427-5.052 2.67 6.763.97 11.816.485 13.038 3.155 3.422 5.015 7.822 5.015 13.2 0 18.905-11.404 23.06-22.324 24.283 1.78 1.548 3.316 4.481 3.316 9.126 0 6.6-.08 11.897-.08 13.526 0 1.304.89 2.853 3.316 2.364 19.412-6.52 33.405-24.935 33.405-46.691C97.707 22 75.788 0 48.854 0z"/></svg>`; function create_if_block$7(ctx) { let div1; let section; let t0; let div0; let a; let t1; let button; let div1_class_value; let current; let mounted; let dispose; const default_slot_template = ( /*#slots*/ ctx[8].default ); const default_slot = create_slot( default_slot_template, ctx, /*$$scope*/ ctx[7], null ); return { c() { div1 = element("div"); section = element("section"); if (default_slot) default_slot.c(); t0 = space(); div0 = element("div"); a = element("a"); t1 = space(); button = element("button"); button.textContent = "✕"; attr(section, "class", "overflow-hidden h-full"); attr(a, "target", "_blank"); attr(a, "href", "https://github.com/drunkg00se/Pixiv-Downloader"); attr(a, "class", "w-5 fill-current"); attr(button, "class", "btn-icon btn-icon-sm bg-transparent font-bold hover:text-xl"); attr(div0, "class", "absolute top-2 right-2 z-1 select-none flex items-center gap-1"); attr(div1, "data-theme", "skeleton"); attr(div1, "class", div1_class_value = "relative rounded-container-token shadow-xl bg-scroll " + /*classes*/ ctx[1]); }, m(target, anchor) { insert(target, div1, anchor); append(div1, section); if (default_slot) { default_slot.m(section, null); } append(div1, t0); append(div1, div0); append(div0, a); a.innerHTML = githubMark; append(div0, t1); append(div0, button); current = true; if (!mounted) { dispose = listen(button, "click", function() { if (is_function( /*parent*/ ctx[0].onClose )) ctx[0].onClose.apply(this, arguments); }); mounted = true; } }, p(new_ctx, dirty) { ctx = new_ctx; if (default_slot) { if (default_slot.p && (!current || dirty & /*$$scope*/ 128)) { update_slot_base( default_slot, default_slot_template, ctx, /*$$scope*/ ctx[7], !current ? get_all_dirty_from_scope( /*$$scope*/ ctx[7] ) : get_slot_changes( default_slot_template, /*$$scope*/ ctx[7], dirty, null ), null ); } } if (!current || dirty & /*classes*/ 2 && div1_class_value !== (div1_class_value = "relative rounded-container-token shadow-xl bg-scroll " + /*classes*/ ctx[1])) { attr(div1, "class", div1_class_value); } }, i(local) { if (current) return; transition_in(default_slot, local); current = true; }, o(local) { transition_out(default_slot, local); current = false; }, d(detaching) { if (detaching) { detach(div1); } if (default_slot) default_slot.d(detaching); mounted = false; dispose(); } }; } function create_fragment$a(ctx) { let if_block_anchor; let current; let if_block = ( /*$modalStore*/ ctx[2][0] && create_if_block$7(ctx) ); return { c() { if (if_block) if_block.c(); if_block_anchor = empty(); }, m(target, anchor) { if (if_block) if_block.m(target, anchor); insert(target, if_block_anchor, anchor); current = true; }, p(ctx2, [dirty]) { if ( /*$modalStore*/ ctx2[2][0] ) { if (if_block) { if_block.p(ctx2, dirty); if (dirty & /*$modalStore*/ 4) { transition_in(if_block, 1); } } else { if_block = create_if_block$7(ctx2); if_block.c(); transition_in(if_block, 1); if_block.m(if_block_anchor.parentNode, if_block_anchor); } } else if (if_block) { group_outros(); transition_out(if_block, 1, 1, () => { if_block = null; }); check_outros(); } }, i(local) { if (current) return; transition_in(if_block); current = true; }, o(local) { transition_out(if_block); current = false; }, d(detaching) { if (detaching) { detach(if_block_anchor); } if (if_block) if_block.d(detaching); } }; } function instance$a($$self, $$props, $$invalidate) { let classes; let $modalStore; let { $$slots: slots = {}, $$scope } = $$props; let { parent } = $$props; let { padding = "py-6 px-8" } = $$props; let { width = "w-full md:max-w-screen-sm lg:max-w-screen-md xl:max-w-screen-lg" } = $$props; let { height = "" } = $$props; const modalStore = getModalStore(); component_subscribe($$self, modalStore, (value) => $$invalidate(2, $modalStore = value)); $$self.$$set = ($$new_props) => { $$invalidate(9, $$props = assign(assign({}, $$props), exclude_internal_props($$new_props))); if ("parent" in $$new_props) $$invalidate(0, parent = $$new_props.parent); if ("padding" in $$new_props) $$invalidate(4, padding = $$new_props.padding); if ("width" in $$new_props) $$invalidate(5, width = $$new_props.width); if ("height" in $$new_props) $$invalidate(6, height = $$new_props.height); if ("$$scope" in $$new_props) $$invalidate(7, $$scope = $$new_props.$$scope); }; $$self.$$.update = () => { $$invalidate(1, classes = `${padding} ${width} ${height} ${$$props.class ?? ""}`); }; $$props = exclude_internal_props($$props); return [ parent, classes, $modalStore, modalStore, padding, width, height, $$scope, slots ]; } class ModalWrapper extends SvelteComponent { constructor(options) { super(); init(this, options, instance$a, create_fragment$a, safe_not_equal, { parent: 0, padding: 4, width: 5, height: 6 }); } } function create_default_slot$6(ctx) { let header; let t2; let article; let t12; let footer; let div0; let button; let t13_value = t("changelog.credit") + ""; let t13; let t14; let a0; let t15_value = t("changelog.feedback") + ""; let t15; let t16; let div2; let div1; let img; let img_src_value; let t17; let p; let a1; let t19; let span; let div2_class_value; let mounted; let dispose; return { c() { header = element("header"); header.textContent = `Pixiv Downloader ${"1.3.1"}`; t2 = space(); article = element("article"); article.innerHTML = `<ul class="list-disc list-inside leading-loose"><li>New: Add support for all the fallen booru.</li> <li>优化:现在支持多标签页排队进行批量下载。</li> <li>优化:下载按钮现在会响应式更新完成状态。</li> <li>优化:导入,清除历史记录不再刷新页面。</li> <li>修复:Pixiv浏览记录页不显示下载按钮的问题。</li></ul>`; t12 = space(); footer = element("footer"); div0 = element("div"); button = element("button"); t13 = text(t13_value); t14 = space(); a0 = element("a"); t15 = text(t15_value); t16 = space(); div2 = element("div"); div1 = element("div"); img = element("img"); t17 = space(); p = element("p"); a1 = element("a"); a1.textContent = `${t("changelog.give_me_a_star")}`; t19 = space(); span = element("span"); span.textContent = `${t("changelog.buy_me_a_drink")}`; attr(header, "class", "modal-header text-2xl font-bold"); attr(article, "class", "modal-body mt-4"); attr( button, "class", /*anchor*/ ctx[3] ); attr( a0, "class", /*anchor*/ ctx[3] ); attr(a0, "target", "_blank"); attr(a0, "href", "https://github.com/drunkg00se/Pixiv-Downloader/issues"); attr(div0, "class", "flex justify-between items-center text-sm"); if (!src_url_equal(img.src, img_src_value = creditCode)) attr(img, "src", img_src_value); attr(img, "alt", "credit"); attr(img, "class", "rounded-full"); attr(a1, "href", "https://github.com/drunkg00se/Pixiv-Downloader"); attr(a1, "target", "_blank"); attr(a1, "class", "anchor"); attr(p, "class", "flex flex-col h-full justify-evenly"); attr(div1, "class", "flex justify-center items-center min-h-0 gap-14 overflow-hidden"); attr(div2, "class", div2_class_value = "grid transition-[grid-template-rows] duration-[400ms] " + /*gridRows*/ ctx[2]); attr(footer, "class", "modal-footer mt-4"); }, m(target, anchor) { insert(target, header, anchor); insert(target, t2, anchor); insert(target, article, anchor); insert(target, t12, anchor); insert(target, footer, anchor); append(footer, div0); append(div0, button); append(button, t13); append(div0, t14); append(div0, a0); append(a0, t15); append(footer, t16); append(footer, div2); append(div2, div1); append(div1, img); append(div1, t17); append(div1, p); append(p, a1); append(p, t19); append(p, span); if (!mounted) { dispose = listen( button, "click", /*click_handler*/ ctx[4] ); mounted = true; } }, p(ctx2, dirty) { if (dirty & /*gridRows*/ 4 && div2_class_value !== (div2_class_value = "grid transition-[grid-template-rows] duration-[400ms] " + /*gridRows*/ ctx2[2])) { attr(div2, "class", div2_class_value); } }, d(detaching) { if (detaching) { detach(header); detach(t2); detach(article); detach(t12); detach(footer); } mounted = false; dispose(); } }; } function create_fragment$9(ctx) { let modalwrapper; let current; modalwrapper = new ModalWrapper({ props: { parent: ( /*parent*/ ctx[0] ), $$slots: { default: [create_default_slot$6] }, $$scope: { ctx } } }); return { c() { create_component(modalwrapper.$$.fragment); }, m(target, anchor) { mount_component(modalwrapper, target, anchor); current = true; }, p(ctx2, [dirty]) { const modalwrapper_changes = {}; if (dirty & /*parent*/ 1) modalwrapper_changes.parent = /*parent*/ ctx2[0]; if (dirty & /*$$scope, gridRows, showCreditCode*/ 70) { modalwrapper_changes.$$scope = { dirty, ctx: ctx2 }; } modalwrapper.$set(modalwrapper_changes); }, i(local) { if (current) return; transition_in(modalwrapper.$$.fragment, local); current = true; }, o(local) { transition_out(modalwrapper.$$.fragment, local); current = false; }, d(detaching) { destroy_component(modalwrapper, detaching); } }; } function instance$9($$self, $$props, $$invalidate) { let gridRows; const anchorFocus = `focus:!outline-none focus:decoration-wavy`; const anchor = `leading-loose anchor underline-offset-2 ${anchorFocus}`; let { parent } = $$props; let showCreditCode = false; const click_handler = () => $$invalidate(1, showCreditCode = !showCreditCode); $$self.$$set = ($$props2) => { if ("parent" in $$props2) $$invalidate(0, parent = $$props2.parent); }; $$self.$$.update = () => { if ($$self.$$.dirty & /*showCreditCode*/ 2) { $$invalidate(2, gridRows = showCreditCode ? "grid-rows-[1fr] mt-2" : "grid-rows-[0fr]"); } }; return [parent, showCreditCode, gridRows, anchor, click_handler]; } class Changelog extends SvelteComponent { constructor(options) { super(); init(this, options, instance$9, create_fragment$9, safe_not_equal, { parent: 0 }); } } const check = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><title>check</title><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z" /></svg>`; const folderSvg = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M10,4H4C2.89,4 2,4.89 2,6V18A2,2 0 0,0 4,20H20A2,2 0 0,0 22,18V8C22,6.89 21.1,6 20,6H12L10,4Z" /></svg>`; const fileSvg = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13,9V3.5L18.5,9M6,2C4.89,2 4,2.89 4,4V20A2,2 0 0,0 6,22H18A2,2 0 0,0 20,20V8L14,2H6Z" /></svg>`; const configStore = writable(); function initConfigStore() { const data = config.getAll(); configStore.set(data); configStore.subscribe(config.update); return configStore; } function get_each_context$3(ctx, list, i) { const child_ctx = ctx.slice(); child_ctx[40] = list[i]; return child_ctx; } function get_each_context_1$2(ctx, list, i) { const child_ctx = ctx.slice(); child_ctx[40] = list[i]; return child_ctx; } function create_else_block$2(ctx) { let input; return { c() { input = element("input"); attr(input, "type", "text"); input.disabled = true; attr( input, "placeholder", /*directoryPlaceholder*/ ctx[11] ); }, m(target, anchor) { insert(target, input, anchor); }, p(ctx2, dirty) { if (dirty[0] & /*directoryPlaceholder*/ 2048) { attr( input, "placeholder", /*directoryPlaceholder*/ ctx2[11] ); } }, d(detaching) { if (detaching) { detach(input); } } }; } function create_if_block_2$3(ctx) { let input; let mounted; let dispose; return { c() { input = element("input"); attr(input, "type", "text"); attr( input, "placeholder", /*directoryPlaceholder*/ ctx[11] ); }, m(target, anchor) { insert(target, input, anchor); ctx[27](input); set_input_value( input, /*directory*/ ctx[4] ); if (!mounted) { dispose = listen( input, "input", /*input_input_handler*/ ctx[28] ); mounted = true; } }, p(ctx2, dirty) { if (dirty[0] & /*directoryPlaceholder*/ 2048) { attr( input, "placeholder", /*directoryPlaceholder*/ ctx2[11] ); } if (dirty[0] & /*directory*/ 16 && input.value !== /*directory*/ ctx2[4]) { set_input_value( input, /*directory*/ ctx2[4] ); } }, d(detaching) { if (detaching) { detach(input); } ctx[27](null); mounted = false; dispose(); } }; } function create_each_block_1$2(ctx) { let button; let span; let t0_value = ( /*template*/ ctx[40] + "" ); let t0; let t1; let button_disabled_value; let mounted; let dispose; return { c() { button = element("button"); span = element("span"); t0 = text(t0_value); t1 = space(); attr(button, "class", "chip variant-soft hover:variant-filled"); button.disabled = button_disabled_value = !/*subDirectoryAvailable*/ ctx[6]; }, m(target, anchor) { insert(target, button, anchor); append(button, span); append(span, t0); append(button, t1); if (!mounted) { dispose = listen(button, "click", function() { if (is_function( /*insertDirTemplateAtCursor*/ ctx[20]( /*template*/ ctx[40] ) )) ctx[20]( /*template*/ ctx[40] ).apply(this, arguments); }); mounted = true; } }, p(new_ctx, dirty) { ctx = new_ctx; if (dirty[0] & /*templates*/ 8 && t0_value !== (t0_value = /*template*/ ctx[40] + "")) set_data(t0, t0_value); if (dirty[0] & /*subDirectoryAvailable*/ 64 && button_disabled_value !== (button_disabled_value = !/*subDirectoryAvailable*/ ctx[6])) { button.disabled = button_disabled_value; } }, d(detaching) { if (detaching) { detach(button); } mounted = false; dispose(); } }; } function create_if_block_1$5(ctx) { let li0; let p0; let t1; let span; let t2; let t3; let button; let t5; let li1; let p1; let t7; let radiogroup; let current; let mounted; let dispose; radiogroup = new RadioGroup({ props: { class: "shrink-0", $$slots: { default: [create_default_slot_5$2] }, $$scope: { ctx } } }); return { c() { li0 = element("li"); p0 = element("p"); p0.textContent = `${t("setting.save_to.options.fsa_directory")}`; t1 = space(); span = element("span"); t2 = text( /*fsaDirectory*/ ctx[10] ); t3 = space(); button = element("button"); button.textContent = `${t("setting.save_to.button.choose_fsa_directory")}`; t5 = space(); li1 = element("li"); p1 = element("p"); p1.textContent = `${t("setting.save_to.options.fsa_filename_conflict")}`; t7 = space(); create_component(radiogroup.$$.fragment); attr(p0, "class", "flex-auto"); attr(span, "class", "text-sm italic"); attr(button, "class", "btn btn-sm variant-filled"); attr(p1, "class", "flex-auto"); }, m(target, anchor) { insert(target, li0, anchor); append(li0, p0); append(li0, t1); append(li0, span); append(span, t2); append(li0, t3); append(li0, button); insert(target, t5, anchor); insert(target, li1, anchor); append(li1, p1); append(li1, t7); mount_component(radiogroup, li1, null); current = true; if (!mounted) { dispose = listen( button, "click", /*updatefsaDir*/ ctx[19] ); mounted = true; } }, p(ctx2, dirty) { if (!current || dirty[0] & /*fsaDirectory*/ 1024) set_data( t2, /*fsaDirectory*/ ctx2[10] ); const radiogroup_changes = {}; if (dirty[0] & /*$store*/ 128 | dirty[1] & /*$$scope*/ 16384) { radiogroup_changes.$$scope = { dirty, ctx: ctx2 }; } radiogroup.$set(radiogroup_changes); }, i(local) { if (current) return; transition_in(radiogroup.$$.fragment, local); current = true; }, o(local) { transition_out(radiogroup.$$.fragment, local); current = false; }, d(detaching) { if (detaching) { detach(li0); detach(t5); detach(li1); } destroy_component(radiogroup); mounted = false; dispose(); } }; } function create_default_slot_8(ctx) { let t_1_value = t("setting.save_to.radio.filename_conflict_option_uniquify") + ""; let t_1; return { c() { t_1 = text(t_1_value); }, m(target, anchor) { insert(target, t_1, anchor); }, p: noop, d(detaching) { if (detaching) { detach(t_1); } } }; } function create_default_slot_7(ctx) { let t_1_value = t("setting.save_to.radio.filename_conflict_option_overwrite") + ""; let t_1; return { c() { t_1 = text(t_1_value); }, m(target, anchor) { insert(target, t_1, anchor); }, p: noop, d(detaching) { if (detaching) { detach(t_1); } } }; } function create_default_slot_6$2(ctx) { let t_1_value = t("setting.save_to.radio.filename_conflict_option_prompt") + ""; let t_1; return { c() { t_1 = text(t_1_value); }, m(target, anchor) { insert(target, t_1, anchor); }, p: noop, d(detaching) { if (detaching) { detach(t_1); } } }; } function create_default_slot_5$2(ctx) { let radioitem0; let updating_group; let t0; let radioitem1; let updating_group_1; let t1; let radioitem2; let updating_group_2; let current; function radioitem0_group_binding(value) { ctx[30](value); } let radioitem0_props = { name: "filenameConfigAction", class: "text-sm", value: FilenameConfigAction.UNIQUIFY, $$slots: { default: [create_default_slot_8] }, $$scope: { ctx } }; if ( /*$store*/ ctx[7].fileSystemFilenameConflictAction !== void 0 ) { radioitem0_props.group = /*$store*/ ctx[7].fileSystemFilenameConflictAction; } radioitem0 = new RadioItem({ props: radioitem0_props }); binding_callbacks.push(() => bind(radioitem0, "group", radioitem0_group_binding)); function radioitem1_group_binding(value) { ctx[31](value); } let radioitem1_props = { name: "filenameConfigAction", class: "text-sm", value: FilenameConfigAction.OVERWRITE, $$slots: { default: [create_default_slot_7] }, $$scope: { ctx } }; if ( /*$store*/ ctx[7].fileSystemFilenameConflictAction !== void 0 ) { radioitem1_props.group = /*$store*/ ctx[7].fileSystemFilenameConflictAction; } radioitem1 = new RadioItem({ props: radioitem1_props }); binding_callbacks.push(() => bind(radioitem1, "group", radioitem1_group_binding)); function radioitem2_group_binding(value) { ctx[32](value); } let radioitem2_props = { name: "filenameConfigAction", class: "text-sm", value: FilenameConfigAction.PROMPT, $$slots: { default: [create_default_slot_6$2] }, $$scope: { ctx } }; if ( /*$store*/ ctx[7].fileSystemFilenameConflictAction !== void 0 ) { radioitem2_props.group = /*$store*/ ctx[7].fileSystemFilenameConflictAction; } radioitem2 = new RadioItem({ props: radioitem2_props }); binding_callbacks.push(() => bind(radioitem2, "group", radioitem2_group_binding)); return { c() { create_component(radioitem0.$$.fragment); t0 = space(); create_component(radioitem1.$$.fragment); t1 = space(); create_component(radioitem2.$$.fragment); }, m(target, anchor) { mount_component(radioitem0, target, anchor); insert(target, t0, anchor); mount_component(radioitem1, target, anchor); insert(target, t1, anchor); mount_component(radioitem2, target, anchor); current = true; }, p(ctx2, dirty) { const radioitem0_changes = {}; if (dirty[1] & /*$$scope*/ 16384) { radioitem0_changes.$$scope = { dirty, ctx: ctx2 }; } if (!updating_group && dirty[0] & /*$store*/ 128) { updating_group = true; radioitem0_changes.group = /*$store*/ ctx2[7].fileSystemFilenameConflictAction; add_flush_callback(() => updating_group = false); } radioitem0.$set(radioitem0_changes); const radioitem1_changes = {}; if (dirty[1] & /*$$scope*/ 16384) { radioitem1_changes.$$scope = { dirty, ctx: ctx2 }; } if (!updating_group_1 && dirty[0] & /*$store*/ 128) { updating_group_1 = true; radioitem1_changes.group = /*$store*/ ctx2[7].fileSystemFilenameConflictAction; add_flush_callback(() => updating_group_1 = false); } radioitem1.$set(radioitem1_changes); const radioitem2_changes = {}; if (dirty[1] & /*$$scope*/ 16384) { radioitem2_changes.$$scope = { dirty, ctx: ctx2 }; } if (!updating_group_2 && dirty[0] & /*$store*/ 128) { updating_group_2 = true; radioitem2_changes.group = /*$store*/ ctx2[7].fileSystemFilenameConflictAction; add_flush_callback(() => updating_group_2 = false); } radioitem2.$set(radioitem2_changes); }, i(local) { if (current) return; transition_in(radioitem0.$$.fragment, local); transition_in(radioitem1.$$.fragment, local); transition_in(radioitem2.$$.fragment, local); current = true; }, o(local) { transition_out(radioitem0.$$.fragment, local); transition_out(radioitem1.$$.fragment, local); transition_out(radioitem2.$$.fragment, local); current = false; }, d(detaching) { if (detaching) { detach(t0); detach(t1); } destroy_component(radioitem0, detaching); destroy_component(radioitem1, detaching); destroy_component(radioitem2, detaching); } }; } function create_each_block$3(ctx) { let button; let span; let t0_value = ( /*template*/ ctx[40] + "" ); let t0; let t1; let mounted; let dispose; return { c() { button = element("button"); span = element("span"); t0 = text(t0_value); t1 = space(); attr(button, "class", "chip variant-soft hover:variant-filled"); }, m(target, anchor) { insert(target, button, anchor); append(button, span); append(span, t0); append(button, t1); if (!mounted) { dispose = listen(button, "click", function() { if (is_function( /*insertFilenameTemplateAtCursor*/ ctx[21]( /*template*/ ctx[40] ) )) ctx[21]( /*template*/ ctx[40] ).apply(this, arguments); }); mounted = true; } }, p(new_ctx, dirty) { ctx = new_ctx; if (dirty[0] & /*templates*/ 8 && t0_value !== (t0_value = /*template*/ ctx[40] + "")) set_data(t0, t0_value); }, d(detaching) { if (detaching) { detach(button); } mounted = false; dispose(); } }; } function create_if_block$6(ctx) { let li; let div; let p0; let t1; let p1; let t2_value = t("setting.save_to.options.tag_language_tips") + ""; let t2; let t3; let radiogroup; let current; radiogroup = new RadioGroup({ props: { class: " shrink-0", $$slots: { default: [create_default_slot$5] }, $$scope: { ctx } } }); return { c() { li = element("li"); div = element("div"); p0 = element("p"); p0.textContent = `${t("setting.save_to.options.tag_language")}`; t1 = space(); p1 = element("p"); t2 = text(t2_value); t3 = space(); create_component(radiogroup.$$.fragment); attr( p1, "class", /*descritionText*/ ctx[0] ); attr(div, "class", "flex-auto"); }, m(target, anchor) { insert(target, li, anchor); append(li, div); append(div, p0); append(div, t1); append(div, p1); append(p1, t2); append(li, t3); mount_component(radiogroup, li, null); current = true; }, p(ctx2, dirty) { if (!current || dirty[0] & /*descritionText*/ 1) { attr( p1, "class", /*descritionText*/ ctx2[0] ); } const radiogroup_changes = {}; if (dirty[0] & /*$store*/ 128 | dirty[1] & /*$$scope*/ 16384) { radiogroup_changes.$$scope = { dirty, ctx: ctx2 }; } radiogroup.$set(radiogroup_changes); }, i(local) { if (current) return; transition_in(radiogroup.$$.fragment, local); current = true; }, o(local) { transition_out(radiogroup.$$.fragment, local); current = false; }, d(detaching) { if (detaching) { detach(li); } destroy_component(radiogroup); } }; } function create_default_slot_4$2(ctx) { let t_1; return { c() { t_1 = text("日本語"); }, m(target, anchor) { insert(target, t_1, anchor); }, d(detaching) { if (detaching) { detach(t_1); } } }; } function create_default_slot_3$4(ctx) { let t_1; return { c() { t_1 = text("简中"); }, m(target, anchor) { insert(target, t_1, anchor); }, d(detaching) { if (detaching) { detach(t_1); } } }; } function create_default_slot_2$4(ctx) { let t_1; return { c() { t_1 = text("繁中"); }, m(target, anchor) { insert(target, t_1, anchor); }, d(detaching) { if (detaching) { detach(t_1); } } }; } function create_default_slot_1$4(ctx) { let t_1; return { c() { t_1 = text("En"); }, m(target, anchor) { insert(target, t_1, anchor); }, d(detaching) { if (detaching) { detach(t_1); } } }; } function create_default_slot$5(ctx) { let radioitem0; let updating_group; let t0; let radioitem1; let updating_group_1; let t1; let radioitem2; let updating_group_2; let t2; let radioitem3; let updating_group_3; let current; function radioitem0_group_binding_1(value) { ctx[35](value); } let radioitem0_props = { name: "tagLang", class: "text-sm", value: TagLanguage.JAPANESE, $$slots: { default: [create_default_slot_4$2] }, $$scope: { ctx } }; if ( /*$store*/ ctx[7].tagLang !== void 0 ) { radioitem0_props.group = /*$store*/ ctx[7].tagLang; } radioitem0 = new RadioItem({ props: radioitem0_props }); binding_callbacks.push(() => bind(radioitem0, "group", radioitem0_group_binding_1)); function radioitem1_group_binding_1(value) { ctx[36](value); } let radioitem1_props = { name: "tagLang", class: "text-sm", value: TagLanguage.CHINESE, $$slots: { default: [create_default_slot_3$4] }, $$scope: { ctx } }; if ( /*$store*/ ctx[7].tagLang !== void 0 ) { radioitem1_props.group = /*$store*/ ctx[7].tagLang; } radioitem1 = new RadioItem({ props: radioitem1_props }); binding_callbacks.push(() => bind(radioitem1, "group", radioitem1_group_binding_1)); function radioitem2_group_binding_1(value) { ctx[37](value); } let radioitem2_props = { name: "tagLang", class: "text-sm", value: TagLanguage.TRADITIONAL_CHINESE, $$slots: { default: [create_default_slot_2$4] }, $$scope: { ctx } }; if ( /*$store*/ ctx[7].tagLang !== void 0 ) { radioitem2_props.group = /*$store*/ ctx[7].tagLang; } radioitem2 = new RadioItem({ props: radioitem2_props }); binding_callbacks.push(() => bind(radioitem2, "group", radioitem2_group_binding_1)); function radioitem3_group_binding(value) { ctx[38](value); } let radioitem3_props = { name: "tagLang", class: "text-sm", value: TagLanguage.ENGLISH, $$slots: { default: [create_default_slot_1$4] }, $$scope: { ctx } }; if ( /*$store*/ ctx[7].tagLang !== void 0 ) { radioitem3_props.group = /*$store*/ ctx[7].tagLang; } radioitem3 = new RadioItem({ props: radioitem3_props }); binding_callbacks.push(() => bind(radioitem3, "group", radioitem3_group_binding)); return { c() { create_component(radioitem0.$$.fragment); t0 = space(); create_component(radioitem1.$$.fragment); t1 = space(); create_component(radioitem2.$$.fragment); t2 = space(); create_component(radioitem3.$$.fragment); }, m(target, anchor) { mount_component(radioitem0, target, anchor); insert(target, t0, anchor); mount_component(radioitem1, target, anchor); insert(target, t1, anchor); mount_component(radioitem2, target, anchor); insert(target, t2, anchor); mount_component(radioitem3, target, anchor); current = true; }, p(ctx2, dirty) { const radioitem0_changes = {}; if (dirty[1] & /*$$scope*/ 16384) { radioitem0_changes.$$scope = { dirty, ctx: ctx2 }; } if (!updating_group && dirty[0] & /*$store*/ 128) { updating_group = true; radioitem0_changes.group = /*$store*/ ctx2[7].tagLang; add_flush_callback(() => updating_group = false); } radioitem0.$set(radioitem0_changes); const radioitem1_changes = {}; if (dirty[1] & /*$$scope*/ 16384) { radioitem1_changes.$$scope = { dirty, ctx: ctx2 }; } if (!updating_group_1 && dirty[0] & /*$store*/ 128) { updating_group_1 = true; radioitem1_changes.group = /*$store*/ ctx2[7].tagLang; add_flush_callback(() => updating_group_1 = false); } radioitem1.$set(radioitem1_changes); const radioitem2_changes = {}; if (dirty[1] & /*$$scope*/ 16384) { radioitem2_changes.$$scope = { dirty, ctx: ctx2 }; } if (!updating_group_2 && dirty[0] & /*$store*/ 128) { updating_group_2 = true; radioitem2_changes.group = /*$store*/ ctx2[7].tagLang; add_flush_callback(() => updating_group_2 = false); } radioitem2.$set(radioitem2_changes); const radioitem3_changes = {}; if (dirty[1] & /*$$scope*/ 16384) { radioitem3_changes.$$scope = { dirty, ctx: ctx2 }; } if (!updating_group_3 && dirty[0] & /*$store*/ 128) { updating_group_3 = true; radioitem3_changes.group = /*$store*/ ctx2[7].tagLang; add_flush_callback(() => updating_group_3 = false); } radioitem3.$set(radioitem3_changes); }, i(local) { if (current) return; transition_in(radioitem0.$$.fragment, local); transition_in(radioitem1.$$.fragment, local); transition_in(radioitem2.$$.fragment, local); transition_in(radioitem3.$$.fragment, local); current = true; }, o(local) { transition_out(radioitem0.$$.fragment, local); transition_out(radioitem1.$$.fragment, local); transition_out(radioitem2.$$.fragment, local); transition_out(radioitem3.$$.fragment, local); current = false; }, d(detaching) { if (detaching) { detach(t0); detach(t1); detach(t2); } destroy_component(radioitem0, detaching); destroy_component(radioitem1, detaching); destroy_component(radioitem2, detaching); destroy_component(radioitem3, detaching); } }; } function create_fragment$8(ctx) { let div4; let section0; let p0; let t0_value = t("setting.save_to.label.directory") + ""; let t0; let t1; let ul0; let li0; let div0; let button0; let i0; let t2; let t3; let button1; let i1; let t4; let div1; let t5; let li1; let p1; let t7; let slidetoggle; let updating_checked; let t8; let t9; let section1; let p2; let t10_value = t("setting.save_to.label.filename") + ""; let t10; let t11; let ul1; let li2; let div2; let button2; let i2; let t12; let input; let t13; let button3; let i3; let t14; let div3; let t15; let show_if = env.isPixiv(); let current; let mounted; let dispose; function select_block_type(ctx2, dirty) { if ( /*subDirectoryAvailable*/ ctx2[6] ) return create_if_block_2$3; return create_else_block$2; } let current_block_type = select_block_type(ctx); let if_block0 = current_block_type(ctx); let each_value_1 = ensure_array_like( /*templates*/ ctx[3] ); let each_blocks_1 = []; for (let i = 0; i < each_value_1.length; i += 1) { each_blocks_1[i] = create_each_block_1$2(get_each_context_1$2(ctx, each_value_1, i)); } function slidetoggle_checked_binding(value) { ctx[29](value); } let slidetoggle_props = { size: "sm", name: "fsa-enable", disabled: !env.isFileSystemAccessAvaliable() }; if ( /*$store*/ ctx[7].useFileSystemAccess !== void 0 ) { slidetoggle_props.checked = /*$store*/ ctx[7].useFileSystemAccess; } slidetoggle = new SlideToggle({ props: slidetoggle_props }); binding_callbacks.push(() => bind(slidetoggle, "checked", slidetoggle_checked_binding)); let if_block1 = ( /*$store*/ ctx[7].useFileSystemAccess && create_if_block_1$5(ctx) ); let each_value = ensure_array_like( /*templates*/ ctx[3] ); let each_blocks = []; for (let i = 0; i < each_value.length; i += 1) { each_blocks[i] = create_each_block$3(get_each_context$3(ctx, each_value, i)); } let if_block2 = show_if && create_if_block$6(ctx); return { c() { div4 = element("div"); section0 = element("section"); p0 = element("p"); t0 = text(t0_value); t1 = space(); ul0 = element("ul"); li0 = element("li"); div0 = element("div"); button0 = element("button"); i0 = element("i"); t2 = space(); if_block0.c(); t3 = space(); button1 = element("button"); i1 = element("i"); t4 = space(); div1 = element("div"); for (let i = 0; i < each_blocks_1.length; i += 1) { each_blocks_1[i].c(); } t5 = space(); li1 = element("li"); p1 = element("p"); p1.textContent = `${t("setting.save_to.options.use_fsa")}`; t7 = space(); create_component(slidetoggle.$$.fragment); t8 = space(); if (if_block1) if_block1.c(); t9 = space(); section1 = element("section"); p2 = element("p"); t10 = text(t10_value); t11 = space(); ul1 = element("ul"); li2 = element("li"); div2 = element("div"); button2 = element("button"); i2 = element("i"); t12 = space(); input = element("input"); t13 = space(); button3 = element("button"); i3 = element("i"); t14 = space(); div3 = element("div"); for (let i = 0; i < each_blocks.length; i += 1) { each_blocks[i].c(); } t15 = space(); if (if_block2) if_block2.c(); attr( p0, "class", /*sectionTitle*/ ctx[2] ); attr(i0, "class", "w-6 fill-current"); attr(button0, "type", "button"); attr(button0, "class", "[&:not([disabled])]:variant-soft-primary"); button0.disabled = /*folderBtnDisabled*/ ctx[13]; attr(i1, "class", "w-6 fill-current"); attr(button1, "type", "button"); attr(button1, "class", "variant-soft-surface [&:not([disabled])]:variant-soft-primary"); button1.disabled = /*folderBtnDisabled*/ ctx[13]; attr(div0, "class", "input-group input-group-divider grid-cols-[auto_1fr_auto_auto]"); attr(div1, "class", "self-start space-x-2"); attr(li0, "class", "flex-col gap-3"); attr(p1, "class", "flex-auto"); attr( ul0, "class", /*ulClasses*/ ctx[14] ); attr( p2, "class", /*sectionTitle*/ ctx[2] ); attr(i2, "class", "w-6 fill-current"); attr(button2, "type", "button"); attr(button2, "class", "[&:not([disabled])]:variant-soft-primary"); button2.disabled = /*filenameBtnDisabled*/ ctx[12]; attr(input, "type", "text"); input.required = true; attr(input, "placeholder", t("setting.save_to.placeholder.filename_requried")); attr(i3, "class", "w-6 fill-current"); attr(button3, "type", "button"); attr(button3, "class", "variant-soft-surface dark:variant-fill-surface [&:not([disabled])]:variant-soft-primary"); button3.disabled = /*filenameBtnDisabled*/ ctx[12]; attr(div2, "class", "input-group input-group-divider grid-cols-[auto_1fr_auto]"); attr(div3, "class", "self-start space-x-2"); attr(li2, "class", "flex-col gap-3"); attr( ul1, "class", /*ulClasses*/ ctx[14] ); attr( div4, "class", /*sectionSpace*/ ctx[1] ); }, m(target, anchor) { insert(target, div4, anchor); append(div4, section0); append(section0, p0); append(p0, t0); append(section0, t1); append(section0, ul0); append(ul0, li0); append(li0, div0); append(div0, button0); append(button0, i0); i0.innerHTML = folderSvg; append(div0, t2); if_block0.m(div0, null); append(div0, t3); append(div0, button1); append(button1, i1); i1.innerHTML = check; append(li0, t4); append(li0, div1); for (let i = 0; i < each_blocks_1.length; i += 1) { if (each_blocks_1[i]) { each_blocks_1[i].m(div1, null); } } append(ul0, t5); append(ul0, li1); append(li1, p1); append(li1, t7); mount_component(slidetoggle, li1, null); append(ul0, t8); if (if_block1) if_block1.m(ul0, null); append(div4, t9); append(div4, section1); append(section1, p2); append(p2, t10); append(section1, t11); append(section1, ul1); append(ul1, li2); append(li2, div2); append(div2, button2); append(button2, i2); i2.innerHTML = fileSvg; append(div2, t12); append(div2, input); ctx[33](input); set_input_value( input, /*filename*/ ctx[5] ); append(div2, t13); append(div2, button3); append(button3, i3); i3.innerHTML = check; append(li2, t14); append(li2, div3); for (let i = 0; i < each_blocks.length; i += 1) { if (each_blocks[i]) { each_blocks[i].m(div3, null); } } append(ul1, t15); if (if_block2) if_block2.m(ul1, null); current = true; if (!mounted) { dispose = [ listen( button0, "click", /*resetFolder*/ ctx[17] ), listen( button1, "click", /*updateDirectory*/ ctx[15] ), listen( button2, "click", /*resetFilename*/ ctx[18] ), listen( input, "input", /*input_input_handler_1*/ ctx[34] ), listen( button3, "click", /*updateFilename*/ ctx[16] ) ]; mounted = true; } }, p(ctx2, dirty) { if (!current || dirty[0] & /*sectionTitle*/ 4) { attr( p0, "class", /*sectionTitle*/ ctx2[2] ); } if (!current || dirty[0] & /*folderBtnDisabled*/ 8192) { button0.disabled = /*folderBtnDisabled*/ ctx2[13]; } if (current_block_type === (current_block_type = select_block_type(ctx2)) && if_block0) { if_block0.p(ctx2, dirty); } else { if_block0.d(1); if_block0 = current_block_type(ctx2); if (if_block0) { if_block0.c(); if_block0.m(div0, t3); } } if (!current || dirty[0] & /*folderBtnDisabled*/ 8192) { button1.disabled = /*folderBtnDisabled*/ ctx2[13]; } if (dirty[0] & /*subDirectoryAvailable, insertDirTemplateAtCursor, templates*/ 1048648) { each_value_1 = ensure_array_like( /*templates*/ ctx2[3] ); let i; for (i = 0; i < each_value_1.length; i += 1) { const child_ctx = get_each_context_1$2(ctx2, each_value_1, i); if (each_blocks_1[i]) { each_blocks_1[i].p(child_ctx, dirty); } else { each_blocks_1[i] = create_each_block_1$2(child_ctx); each_blocks_1[i].c(); each_blocks_1[i].m(div1, null); } } for (; i < each_blocks_1.length; i += 1) { each_blocks_1[i].d(1); } each_blocks_1.length = each_value_1.length; } const slidetoggle_changes = {}; if (!updating_checked && dirty[0] & /*$store*/ 128) { updating_checked = true; slidetoggle_changes.checked = /*$store*/ ctx2[7].useFileSystemAccess; add_flush_callback(() => updating_checked = false); } slidetoggle.$set(slidetoggle_changes); if ( /*$store*/ ctx2[7].useFileSystemAccess ) { if (if_block1) { if_block1.p(ctx2, dirty); if (dirty[0] & /*$store*/ 128) { transition_in(if_block1, 1); } } else { if_block1 = create_if_block_1$5(ctx2); if_block1.c(); transition_in(if_block1, 1); if_block1.m(ul0, null); } } else if (if_block1) { group_outros(); transition_out(if_block1, 1, 1, () => { if_block1 = null; }); check_outros(); } if (!current || dirty[0] & /*ulClasses*/ 16384) { attr( ul0, "class", /*ulClasses*/ ctx2[14] ); } if (!current || dirty[0] & /*sectionTitle*/ 4) { attr( p2, "class", /*sectionTitle*/ ctx2[2] ); } if (!current || dirty[0] & /*filenameBtnDisabled*/ 4096) { button2.disabled = /*filenameBtnDisabled*/ ctx2[12]; } if (dirty[0] & /*filename*/ 32 && input.value !== /*filename*/ ctx2[5]) { set_input_value( input, /*filename*/ ctx2[5] ); } if (!current || dirty[0] & /*filenameBtnDisabled*/ 4096) { button3.disabled = /*filenameBtnDisabled*/ ctx2[12]; } if (dirty[0] & /*insertFilenameTemplateAtCursor, templates*/ 2097160) { each_value = ensure_array_like( /*templates*/ ctx2[3] ); let i; for (i = 0; i < each_value.length; i += 1) { const child_ctx = get_each_context$3(ctx2, each_value, i); if (each_blocks[i]) { each_blocks[i].p(child_ctx, dirty); } else { each_blocks[i] = create_each_block$3(child_ctx); each_blocks[i].c(); each_blocks[i].m(div3, null); } } for (; i < each_blocks.length; i += 1) { each_blocks[i].d(1); } each_blocks.length = each_value.length; } if (show_if) if_block2.p(ctx2, dirty); if (!current || dirty[0] & /*ulClasses*/ 16384) { attr( ul1, "class", /*ulClasses*/ ctx2[14] ); } if (!current || dirty[0] & /*sectionSpace*/ 2) { attr( div4, "class", /*sectionSpace*/ ctx2[1] ); } }, i(local) { if (current) return; transition_in(slidetoggle.$$.fragment, local); transition_in(if_block1); transition_in(if_block2); current = true; }, o(local) { transition_out(slidetoggle.$$.fragment, local); transition_out(if_block1); transition_out(if_block2); current = false; }, d(detaching) { if (detaching) { detach(div4); } if_block0.d(); destroy_each(each_blocks_1, detaching); destroy_component(slidetoggle); if (if_block1) if_block1.d(); ctx[33](null); destroy_each(each_blocks, detaching); if (if_block2) if_block2.d(); mounted = false; run_all(dispose); } }; } function instance$8($$self, $$props, $$invalidate) { let ulClasses; let subDirectoryAvailable; let folderBtnDisabled; let filenameBtnDisabled; let directoryPlaceholder; let $store; component_subscribe($$self, configStore, ($$value) => $$invalidate(7, $store = $$value)); let { bg = "bg-white/30 dark:bg-black/15" } = $$props; let { border = "divide-y-[1px] *:border-surface-300-600-token" } = $$props; let { padding = "px-4 *:py-4" } = $$props; let { margin = "mt-2 *:!m-0" } = $$props; let { rounded = "rounded-container-token *:!rounded-none" } = $$props; let { descritionText = "text-sm text-surface-400" } = $$props; let { sectionSpace = `space-y-4` } = $$props; let { sectionTitle = "font-bold" } = $$props; let { templates = [] } = $$props; let directoryRef; let filenameRef; let directory = $store.folderPattern; let filename = $store.filenamePattern; let fsaDirectory = downloader.getCurrentFsaDirName(); function updateDirectory() { const newDirectory = directory.split("/").map(replaceInvalidChar).filter((path) => !!path).join("/"); set_store_value(configStore, $store.folderPattern = $$invalidate(4, directory = newDirectory), $store); } function updateFilename() { const newFilename = replaceInvalidChar(filename); if (newFilename === "") { $$invalidate(5, filename = $store.filenamePattern); } else { set_store_value(configStore, $store.filenamePattern = $$invalidate(5, filename = newFilename), $store); } } async function resetFolder() { $$invalidate(4, directory = $store.folderPattern); await tick(); const pos = directory.length; directoryRef.focus(); directoryRef.setSelectionRange(pos, pos); } async function resetFilename() { $$invalidate(5, filename = $store.filenamePattern); await tick(); const pos = filename.length; filenameRef.focus(); filenameRef.setSelectionRange(pos, pos); } async function updatefsaDir() { $$invalidate(10, fsaDirectory = await downloader.updateDirHandle()); console.log(fsaDirectory); } function insertDirTemplateAtCursor(template) { return async () => { const start = directoryRef.selectionStart; const end = directoryRef.selectionEnd; $$invalidate(4, directory = directory.slice(0, start) + template + directory.slice(end)); await tick(); const newStart = start + template.length; directoryRef.focus(); directoryRef.setSelectionRange(newStart, newStart); }; } function insertFilenameTemplateAtCursor(template) { return async () => { const start = filenameRef.selectionStart; const end = filenameRef.selectionEnd; $$invalidate(5, filename = filename.slice(0, start) + template + filename.slice(end)); await tick(); const newStart = start + template.length; filenameRef.focus(); filenameRef.setSelectionRange(newStart, newStart); }; } function input_binding($$value) { binding_callbacks[$$value ? "unshift" : "push"](() => { directoryRef = $$value; $$invalidate(8, directoryRef); }); } function input_input_handler() { directory = this.value; $$invalidate(4, directory); } function slidetoggle_checked_binding(value) { if ($$self.$$.not_equal($store.useFileSystemAccess, value)) { $store.useFileSystemAccess = value; configStore.set($store); } } function radioitem0_group_binding(value) { if ($$self.$$.not_equal($store.fileSystemFilenameConflictAction, value)) { $store.fileSystemFilenameConflictAction = value; configStore.set($store); } } function radioitem1_group_binding(value) { if ($$self.$$.not_equal($store.fileSystemFilenameConflictAction, value)) { $store.fileSystemFilenameConflictAction = value; configStore.set($store); } } function radioitem2_group_binding(value) { if ($$self.$$.not_equal($store.fileSystemFilenameConflictAction, value)) { $store.fileSystemFilenameConflictAction = value; configStore.set($store); } } function input_binding_1($$value) { binding_callbacks[$$value ? "unshift" : "push"](() => { filenameRef = $$value; $$invalidate(9, filenameRef); }); } function input_input_handler_1() { filename = this.value; $$invalidate(5, filename); } function radioitem0_group_binding_1(value) { if ($$self.$$.not_equal($store.tagLang, value)) { $store.tagLang = value; configStore.set($store); } } function radioitem1_group_binding_1(value) { if ($$self.$$.not_equal($store.tagLang, value)) { $store.tagLang = value; configStore.set($store); } } function radioitem2_group_binding_1(value) { if ($$self.$$.not_equal($store.tagLang, value)) { $store.tagLang = value; configStore.set($store); } } function radioitem3_group_binding(value) { if ($$self.$$.not_equal($store.tagLang, value)) { $store.tagLang = value; configStore.set($store); } } $$self.$$set = ($$new_props) => { $$invalidate(39, $$props = assign(assign({}, $$props), exclude_internal_props($$new_props))); if ("bg" in $$new_props) $$invalidate(22, bg = $$new_props.bg); if ("border" in $$new_props) $$invalidate(23, border = $$new_props.border); if ("padding" in $$new_props) $$invalidate(24, padding = $$new_props.padding); if ("margin" in $$new_props) $$invalidate(25, margin = $$new_props.margin); if ("rounded" in $$new_props) $$invalidate(26, rounded = $$new_props.rounded); if ("descritionText" in $$new_props) $$invalidate(0, descritionText = $$new_props.descritionText); if ("sectionSpace" in $$new_props) $$invalidate(1, sectionSpace = $$new_props.sectionSpace); if ("sectionTitle" in $$new_props) $$invalidate(2, sectionTitle = $$new_props.sectionTitle); if ("templates" in $$new_props) $$invalidate(3, templates = $$new_props.templates); }; $$self.$$.update = () => { $$invalidate(14, ulClasses = `list *:items-center ${padding} ${margin} ${border} ${bg} ${rounded} ${$$props.class ?? ""}`); if ($$self.$$.dirty[0] & /*$store*/ 128) { $$invalidate(6, subDirectoryAvailable = $store.useFileSystemAccess || env.isSupportSubpath()); } if ($$self.$$.dirty[0] & /*directory, $store*/ 144) { $$invalidate(13, folderBtnDisabled = directory === $store.folderPattern); } if ($$self.$$.dirty[0] & /*filename, $store*/ 160) { $$invalidate(12, filenameBtnDisabled = filename === $store.filenamePattern); } if ($$self.$$.dirty[0] & /*subDirectoryAvailable*/ 64) { $$invalidate(11, directoryPlaceholder = subDirectoryAvailable ? t("setting.save_to.placeholder.sub_directory_unused") : env.isViolentmonkey() ? t("setting.save_to.placeholder.vm_not_supported") : t("setting.save_to.placeholder.need_browser_api")); } }; $$props = exclude_internal_props($$props); return [ descritionText, sectionSpace, sectionTitle, templates, directory, filename, subDirectoryAvailable, $store, directoryRef, filenameRef, fsaDirectory, directoryPlaceholder, filenameBtnDisabled, folderBtnDisabled, ulClasses, updateDirectory, updateFilename, resetFolder, resetFilename, updatefsaDir, insertDirTemplateAtCursor, insertFilenameTemplateAtCursor, bg, border, padding, margin, rounded, input_binding, input_input_handler, slidetoggle_checked_binding, radioitem0_group_binding, radioitem1_group_binding, radioitem2_group_binding, input_binding_1, input_input_handler_1, radioitem0_group_binding_1, radioitem1_group_binding_1, radioitem2_group_binding_1, radioitem3_group_binding ]; } class SaveTo extends SvelteComponent { constructor(options) { super(); init( this, options, instance$8, create_fragment$8, safe_not_equal, { bg: 22, border: 23, padding: 24, margin: 25, rounded: 26, descritionText: 0, sectionSpace: 1, sectionTitle: 2, templates: 3 }, null, [-1, -1] ); } } const nonNegativeInt = (node, params) => { if (!(node instanceof HTMLInputElement) || node.type !== "number") throw new Error('Node should be an HTMLInputElement with a `type` of "number".'); const updateStore = (newVal) => { if ("key" in params) { const { key, store } = params; store.update((currentVal) => { if (typeof newVal === "number") { return { ...currentVal, [key]: newVal }; } else { return currentVal; } }); } else { params.update((currentVal) => { if (typeof newVal === "number") { return newVal; } else { const nodeVal = node.value === "" ? null : +node.value; nodeVal !== currentVal && (node.value = typeof currentVal === "number" ? "" + currentVal : ""); return currentVal; } }); } }; node.addEventListener("input", (evt) => { const el = evt.currentTarget; const { min, max: max2, value } = el; const minVal = min === "" ? 0 : +min; const maxVal = max2 === "" ? null : +max2; if (!el.checkValidity()) { if (/^[0-9]+$/.test(value)) { const numVal = +value; if (numVal < minVal) { updateStore(minVal); } else if (maxVal && numVal > maxVal) { updateStore(maxVal); } } else { updateStore(); } } }); node.addEventListener("blur", (evt) => { const el = evt.currentTarget; const { min, value } = el; const minVal = min === "" ? 0 : +min; if (value === "") { updateStore(minVal); } }); return {}; }; function get_each_context$2(ctx, list, i) { const child_ctx = ctx.slice(); child_ctx[27] = list[i]; return child_ctx; } function get_each_context_1$1(ctx, list, i) { const child_ctx = ctx.slice(); child_ctx[27] = list[i]; return child_ctx; } function create_default_slot_6$1(ctx) { let t_1; return { c() { t_1 = text("Zip"); }, m(target, anchor) { insert(target, t_1, anchor); }, d(detaching) { if (detaching) { detach(t_1); } } }; } function create_default_slot_5$1(ctx) { let t_1; return { c() { t_1 = text("Webm"); }, m(target, anchor) { insert(target, t_1, anchor); }, d(detaching) { if (detaching) { detach(t_1); } } }; } function create_default_slot_4$1(ctx) { let t_1; return { c() { t_1 = text("Mp4"); }, m(target, anchor) { insert(target, t_1, anchor); }, d(detaching) { if (detaching) { detach(t_1); } } }; } function create_default_slot_3$3(ctx) { let t_1; return { c() { t_1 = text("Webp"); }, m(target, anchor) { insert(target, t_1, anchor); }, d(detaching) { if (detaching) { detach(t_1); } } }; } function create_default_slot_2$3(ctx) { let t_1; return { c() { t_1 = text("Gif"); }, m(target, anchor) { insert(target, t_1, anchor); }, d(detaching) { if (detaching) { detach(t_1); } } }; } function create_default_slot_1$3(ctx) { let t_1; return { c() { t_1 = text("Png"); }, m(target, anchor) { insert(target, t_1, anchor); }, d(detaching) { if (detaching) { detach(t_1); } } }; } function create_default_slot$4(ctx) { let radioitem0; let updating_group; let t0; let radioitem1; let updating_group_1; let t1; let radioitem2; let updating_group_2; let t2; let radioitem3; let updating_group_3; let t3; let radioitem4; let updating_group_4; let t4; let radioitem5; let updating_group_5; let current; function radioitem0_group_binding(value) { ctx[13](value); } let radioitem0_props = { name: "ugoiraFormat", class: "text-sm", value: UgoiraFormat.ZIP, $$slots: { default: [create_default_slot_6$1] }, $$scope: { ctx } }; if ( /*$store*/ ctx[7].ugoiraFormat !== void 0 ) { radioitem0_props.group = /*$store*/ ctx[7].ugoiraFormat; } radioitem0 = new RadioItem({ props: radioitem0_props }); binding_callbacks.push(() => bind(radioitem0, "group", radioitem0_group_binding)); function radioitem1_group_binding(value) { ctx[14](value); } let radioitem1_props = { name: "ugoiraFormat", class: "text-sm", value: UgoiraFormat.WEBM, $$slots: { default: [create_default_slot_5$1] }, $$scope: { ctx } }; if ( /*$store*/ ctx[7].ugoiraFormat !== void 0 ) { radioitem1_props.group = /*$store*/ ctx[7].ugoiraFormat; } radioitem1 = new RadioItem({ props: radioitem1_props }); binding_callbacks.push(() => bind(radioitem1, "group", radioitem1_group_binding)); function radioitem2_group_binding(value) { ctx[15](value); } let radioitem2_props = { disabled: !env.videoFrameSupported(), class: "text-sm", name: "ugoiraFormat", value: UgoiraFormat.MP4, $$slots: { default: [create_default_slot_4$1] }, $$scope: { ctx } }; if ( /*$store*/ ctx[7].ugoiraFormat !== void 0 ) { radioitem2_props.group = /*$store*/ ctx[7].ugoiraFormat; } radioitem2 = new RadioItem({ props: radioitem2_props }); binding_callbacks.push(() => bind(radioitem2, "group", radioitem2_group_binding)); function radioitem3_group_binding(value) { ctx[16](value); } let radioitem3_props = { name: "ugoiraFormat", class: "text-sm", value: UgoiraFormat.WEBP, $$slots: { default: [create_default_slot_3$3] }, $$scope: { ctx } }; if ( /*$store*/ ctx[7].ugoiraFormat !== void 0 ) { radioitem3_props.group = /*$store*/ ctx[7].ugoiraFormat; } radioitem3 = new RadioItem({ props: radioitem3_props }); binding_callbacks.push(() => bind(radioitem3, "group", radioitem3_group_binding)); function radioitem4_group_binding(value) { ctx[17](value); } let radioitem4_props = { name: "ugoiraFormat", class: "text-sm", value: UgoiraFormat.GIF, $$slots: { default: [create_default_slot_2$3] }, $$scope: { ctx } }; if ( /*$store*/ ctx[7].ugoiraFormat !== void 0 ) { radioitem4_props.group = /*$store*/ ctx[7].ugoiraFormat; } radioitem4 = new RadioItem({ props: radioitem4_props }); binding_callbacks.push(() => bind(radioitem4, "group", radioitem4_group_binding)); function radioitem5_group_binding(value) { ctx[18](value); } let radioitem5_props = { name: "ugoiraFormat", class: "text-sm", value: UgoiraFormat.PNG, $$slots: { default: [create_default_slot_1$3] }, $$scope: { ctx } }; if ( /*$store*/ ctx[7].ugoiraFormat !== void 0 ) { radioitem5_props.group = /*$store*/ ctx[7].ugoiraFormat; } radioitem5 = new RadioItem({ props: radioitem5_props }); binding_callbacks.push(() => bind(radioitem5, "group", radioitem5_group_binding)); return { c() { create_component(radioitem0.$$.fragment); t0 = space(); create_component(radioitem1.$$.fragment); t1 = space(); create_component(radioitem2.$$.fragment); t2 = space(); create_component(radioitem3.$$.fragment); t3 = space(); create_component(radioitem4.$$.fragment); t4 = space(); create_component(radioitem5.$$.fragment); }, m(target, anchor) { mount_component(radioitem0, target, anchor); insert(target, t0, anchor); mount_component(radioitem1, target, anchor); insert(target, t1, anchor); mount_component(radioitem2, target, anchor); insert(target, t2, anchor); mount_component(radioitem3, target, anchor); insert(target, t3, anchor); mount_component(radioitem4, target, anchor); insert(target, t4, anchor); mount_component(radioitem5, target, anchor); current = true; }, p(ctx2, dirty) { const radioitem0_changes = {}; if (dirty[1] & /*$$scope*/ 2) { radioitem0_changes.$$scope = { dirty, ctx: ctx2 }; } if (!updating_group && dirty[0] & /*$store*/ 128) { updating_group = true; radioitem0_changes.group = /*$store*/ ctx2[7].ugoiraFormat; add_flush_callback(() => updating_group = false); } radioitem0.$set(radioitem0_changes); const radioitem1_changes = {}; if (dirty[1] & /*$$scope*/ 2) { radioitem1_changes.$$scope = { dirty, ctx: ctx2 }; } if (!updating_group_1 && dirty[0] & /*$store*/ 128) { updating_group_1 = true; radioitem1_changes.group = /*$store*/ ctx2[7].ugoiraFormat; add_flush_callback(() => updating_group_1 = false); } radioitem1.$set(radioitem1_changes); const radioitem2_changes = {}; if (dirty[1] & /*$$scope*/ 2) { radioitem2_changes.$$scope = { dirty, ctx: ctx2 }; } if (!updating_group_2 && dirty[0] & /*$store*/ 128) { updating_group_2 = true; radioitem2_changes.group = /*$store*/ ctx2[7].ugoiraFormat; add_flush_callback(() => updating_group_2 = false); } radioitem2.$set(radioitem2_changes); const radioitem3_changes = {}; if (dirty[1] & /*$$scope*/ 2) { radioitem3_changes.$$scope = { dirty, ctx: ctx2 }; } if (!updating_group_3 && dirty[0] & /*$store*/ 128) { updating_group_3 = true; radioitem3_changes.group = /*$store*/ ctx2[7].ugoiraFormat; add_flush_callback(() => updating_group_3 = false); } radioitem3.$set(radioitem3_changes); const radioitem4_changes = {}; if (dirty[1] & /*$$scope*/ 2) { radioitem4_changes.$$scope = { dirty, ctx: ctx2 }; } if (!updating_group_4 && dirty[0] & /*$store*/ 128) { updating_group_4 = true; radioitem4_changes.group = /*$store*/ ctx2[7].ugoiraFormat; add_flush_callback(() => updating_group_4 = false); } radioitem4.$set(radioitem4_changes); const radioitem5_changes = {}; if (dirty[1] & /*$$scope*/ 2) { radioitem5_changes.$$scope = { dirty, ctx: ctx2 }; } if (!updating_group_5 && dirty[0] & /*$store*/ 128) { updating_group_5 = true; radioitem5_changes.group = /*$store*/ ctx2[7].ugoiraFormat; add_flush_callback(() => updating_group_5 = false); } radioitem5.$set(radioitem5_changes); }, i(local) { if (current) return; transition_in(radioitem0.$$.fragment, local); transition_in(radioitem1.$$.fragment, local); transition_in(radioitem2.$$.fragment, local); transition_in(radioitem3.$$.fragment, local); transition_in(radioitem4.$$.fragment, local); transition_in(radioitem5.$$.fragment, local); current = true; }, o(local) { transition_out(radioitem0.$$.fragment, local); transition_out(radioitem1.$$.fragment, local); transition_out(radioitem2.$$.fragment, local); transition_out(radioitem3.$$.fragment, local); transition_out(radioitem4.$$.fragment, local); transition_out(radioitem5.$$.fragment, local); current = false; }, d(detaching) { if (detaching) { detach(t0); detach(t1); detach(t2); detach(t3); detach(t4); } destroy_component(radioitem0, detaching); destroy_component(radioitem1, detaching); destroy_component(radioitem2, detaching); destroy_component(radioitem3, detaching); destroy_component(radioitem4, detaching); destroy_component(radioitem5, detaching); } }; } function create_each_block_1$1(ctx) { let option; let t_1_value = ( /*quality*/ ctx[27] + "" ); let t_1; return { c() { option = element("option"); t_1 = text(t_1_value); option.__value = /*quality*/ ctx[27]; set_input_value(option, option.__value); }, m(target, anchor) { insert(target, option, anchor); append(option, t_1); }, p: noop, d(detaching) { if (detaching) { detach(option); } } }; } function create_each_block$2(ctx) { let option; let t_1_value = ( /*quality*/ ctx[27] + 1 + "" ); let t_1; return { c() { option = element("option"); t_1 = text(t_1_value); option.__value = /*quality*/ ctx[27] + 1; set_input_value(option, option.__value); }, m(target, anchor) { insert(target, option, anchor); append(option, t_1); }, p: noop, d(detaching) { if (detaching) { detach(option); } } }; } function create_fragment$7(ctx) { let div6; let section0; let p0; let t0_value = t("setting.ugoira.label.format") + ""; let t0; let t1; let ul0; let li0; let p1; let t3; let radiogroup; let t4; let section1; let p2; let t5_value = t("setting.ugoira.label.quality") + ""; let t5; let t6; let ul2; let li1; let div0; let p3; let t8; let p4; let t9_value = t("setting.ugoira.options.webm_tips") + ""; let t9; let t10; let input0; let input0_class_value; let t11; let li2; let div1; let p5; let t13; let p6; let t14; let t15; let input1; let input1_class_value; let t16; let li6; let p7; let t18; let ul1; let li3; let p8; let t20; let slidetoggle; let updating_checked; let t21; let li4; let div2; let p9; let t23; let p10; let t24_value = t("setting.ugoira.options.webp_quality_tips") + ""; let t24; let t25; let input2; let input2_class_value; let t26; let li5; let div3; let p11; let t28; let p12; let t29_value = t("setting.ugoira.options.webp_method_tips") + ""; let t29; let t30; let select0; let select0_class_value; let ul1_class_value; let t31; let li7; let div4; let p13; let t33; let p14; let t34_value = t("setting.ugoira.options.gif_tips") + ""; let t34; let t35; let select1; let select1_class_value; let t36; let li8; let div5; let p15; let t38; let p16; let t39_value = t("setting.ugoira.options.png_tips") + ""; let t39; let t40; let input3; let input3_class_value; let current; let mounted; let dispose; radiogroup = new RadioGroup({ props: { class: "shrink-0", $$slots: { default: [create_default_slot$4] }, $$scope: { ctx } } }); function slidetoggle_checked_binding(value) { ctx[21](value); } let slidetoggle_props = { name: "lossless-webp", size: "sm" }; if ( /*$store*/ ctx[7].losslessWebp !== void 0 ) { slidetoggle_props.checked = /*$store*/ ctx[7].losslessWebp; } slidetoggle = new SlideToggle({ props: slidetoggle_props }); binding_callbacks.push(() => bind(slidetoggle, "checked", slidetoggle_checked_binding)); let each_value_1 = ensure_array_like(Array.from({ length: 7 }, func)); let each_blocks_1 = []; for (let i = 0; i < each_value_1.length; i += 1) { each_blocks_1[i] = create_each_block_1$1(get_each_context_1$1(ctx, each_value_1, i)); } let each_value = ensure_array_like(Array.from({ length: 20 }, func_1)); let each_blocks = []; for (let i = 0; i < each_value.length; i += 1) { each_blocks[i] = create_each_block$2(get_each_context$2(ctx, each_value, i)); } return { c() { div6 = element("div"); section0 = element("section"); p0 = element("p"); t0 = text(t0_value); t1 = space(); ul0 = element("ul"); li0 = element("li"); p1 = element("p"); p1.textContent = `${t("setting.ugoira.options.select_format")}`; t3 = space(); create_component(radiogroup.$$.fragment); t4 = space(); section1 = element("section"); p2 = element("p"); t5 = text(t5_value); t6 = space(); ul2 = element("ul"); li1 = element("li"); div0 = element("div"); p3 = element("p"); p3.textContent = "Webm"; t8 = space(); p4 = element("p"); t9 = text(t9_value); t10 = space(); input0 = element("input"); t11 = space(); li2 = element("li"); div1 = element("div"); p5 = element("p"); p5.textContent = "Mp4"; t13 = space(); p6 = element("p"); t14 = text("Bitrate (Mbps)"); t15 = space(); input1 = element("input"); t16 = space(); li6 = element("li"); p7 = element("p"); p7.textContent = "Webp"; t18 = space(); ul1 = element("ul"); li3 = element("li"); p8 = element("p"); p8.textContent = `${t("setting.ugoira.options.webp_lossy")}`; t20 = space(); create_component(slidetoggle.$$.fragment); t21 = space(); li4 = element("li"); div2 = element("div"); p9 = element("p"); p9.textContent = `${t("setting.ugoira.options.webp_quality")}`; t23 = space(); p10 = element("p"); t24 = text(t24_value); t25 = space(); input2 = element("input"); t26 = space(); li5 = element("li"); div3 = element("div"); p11 = element("p"); p11.textContent = `${t("setting.ugoira.options.webp_method")}`; t28 = space(); p12 = element("p"); t29 = text(t29_value); t30 = space(); select0 = element("select"); for (let i = 0; i < each_blocks_1.length; i += 1) { each_blocks_1[i].c(); } t31 = space(); li7 = element("li"); div4 = element("div"); p13 = element("p"); p13.textContent = "Gif"; t33 = space(); p14 = element("p"); t34 = text(t34_value); t35 = space(); select1 = element("select"); for (let i = 0; i < each_blocks.length; i += 1) { each_blocks[i].c(); } t36 = space(); li8 = element("li"); div5 = element("div"); p15 = element("p"); p15.textContent = "Png"; t38 = space(); p16 = element("p"); t39 = text(t39_value); t40 = space(); input3 = element("input"); attr( p0, "class", /*sectionTitle*/ ctx[4] ); attr(p1, "class", "flex-auto"); attr( ul0, "class", /*ulClasses*/ ctx[6] ); attr( p2, "class", /*sectionTitle*/ ctx[4] ); attr( p4, "class", /*descriptionText*/ ctx[2] ); attr(div0, "class", "flex-auto"); attr(input0, "type", "number"); attr(input0, "class", input0_class_value = "input " + /*inputClasses*/ ctx[5]); attr(input0, "min", "0"); attr(input0, "max", "99"); attr(input0, "step", "1"); attr( p6, "class", /*descriptionText*/ ctx[2] ); attr(div1, "class", "flex-auto"); attr(input1, "type", "number"); attr(input1, "class", input1_class_value = "input " + /*inputClasses*/ ctx[5]); attr(input1, "min", "1"); attr(input1, "max", "99"); attr(input1, "step", "1"); attr(p8, "class", "flex-auto"); attr(li3, "class", "items-center"); attr( p10, "class", /*descriptionText*/ ctx[2] ); attr(div2, "class", "flex-auto"); attr(input2, "type", "number"); attr(input2, "class", input2_class_value = "input " + /*inputClasses*/ ctx[5]); attr(input2, "min", "0"); attr(input2, "max", "100"); attr(input2, "step", "1"); attr(li4, "class", "items-center"); attr( p12, "class", /*descriptionText*/ ctx[2] ); attr(div3, "class", "flex-auto"); attr(select0, "class", select0_class_value = "select " + /*inputClasses*/ ctx[5]); if ( /*$store*/ ctx[7].webpMehtod === void 0 ) add_render_callback(() => ( /*select0_change_handler*/ ctx[23].call(select0) )); attr(li5, "class", "items-center"); attr(ul1, "class", ul1_class_value = "list " + /*border*/ ctx[0] + " " + /*rounded*/ ctx[1] + " [&:not(:last-child)]:*:py-4 [&:last-child]:*:pt-4"); attr(li6, "class", "flex-col !items-stretch"); attr( p14, "class", /*descriptionText*/ ctx[2] ); attr(div4, "class", "flex-auto"); attr(select1, "class", select1_class_value = "select " + /*inputClasses*/ ctx[5]); if ( /*$store*/ ctx[7].gifQuality === void 0 ) add_render_callback(() => ( /*select1_change_handler*/ ctx[24].call(select1) )); attr( p16, "class", /*descriptionText*/ ctx[2] ); attr(div5, "class", "flex-auto"); attr(input3, "type", "number"); attr(input3, "class", input3_class_value = "input " + /*inputClasses*/ ctx[5]); attr(input3, "min", "0"); attr(input3, "max", "256"); attr(input3, "step", "1"); attr( ul2, "class", /*ulClasses*/ ctx[6] ); attr( div6, "class", /*sectionSpace*/ ctx[3] ); }, m(target, anchor) { insert(target, div6, anchor); append(div6, section0); append(section0, p0); append(p0, t0); append(section0, t1); append(section0, ul0); append(ul0, li0); append(li0, p1); append(li0, t3); mount_component(radiogroup, li0, null); append(div6, t4); append(div6, section1); append(section1, p2); append(p2, t5); append(section1, t6); append(section1, ul2); append(ul2, li1); append(li1, div0); append(div0, p3); append(div0, t8); append(div0, p4); append(p4, t9); append(li1, t10); append(li1, input0); set_input_value( input0, /*$store*/ ctx[7].webmQuality ); append(ul2, t11); append(ul2, li2); append(li2, div1); append(div1, p5); append(div1, t13); append(div1, p6); append(p6, t14); append(li2, t15); append(li2, input1); set_input_value( input1, /*$store*/ ctx[7].mp4Bitrate ); append(ul2, t16); append(ul2, li6); append(li6, p7); append(li6, t18); append(li6, ul1); append(ul1, li3); append(li3, p8); append(li3, t20); mount_component(slidetoggle, li3, null); append(ul1, t21); append(ul1, li4); append(li4, div2); append(div2, p9); append(div2, t23); append(div2, p10); append(p10, t24); append(li4, t25); append(li4, input2); set_input_value( input2, /*$store*/ ctx[7].webpQuality ); append(ul1, t26); append(ul1, li5); append(li5, div3); append(div3, p11); append(div3, t28); append(div3, p12); append(p12, t29); append(li5, t30); append(li5, select0); for (let i = 0; i < each_blocks_1.length; i += 1) { if (each_blocks_1[i]) { each_blocks_1[i].m(select0, null); } } select_option( select0, /*$store*/ ctx[7].webpMehtod, true ); append(ul2, t31); append(ul2, li7); append(li7, div4); append(div4, p13); append(div4, t33); append(div4, p14); append(p14, t34); append(li7, t35); append(li7, select1); for (let i = 0; i < each_blocks.length; i += 1) { if (each_blocks[i]) { each_blocks[i].m(select1, null); } } select_option( select1, /*$store*/ ctx[7].gifQuality, true ); append(ul2, t36); append(ul2, li8); append(li8, div5); append(div5, p15); append(div5, t38); append(div5, p16); append(p16, t39); append(li8, t40); append(li8, input3); set_input_value( input3, /*$store*/ ctx[7].pngColor ); current = true; if (!mounted) { dispose = [ action_destroyer(nonNegativeInt.call(null, input0, { store: configStore, key: "webmQuality" })), listen( input0, "input", /*input0_input_handler*/ ctx[19] ), action_destroyer(nonNegativeInt.call(null, input1, { store: configStore, key: "mp4Bitrate" })), listen( input1, "input", /*input1_input_handler*/ ctx[20] ), action_destroyer(nonNegativeInt.call(null, input2, { store: configStore, key: "webpQuality" })), listen( input2, "input", /*input2_input_handler*/ ctx[22] ), listen( select0, "change", /*select0_change_handler*/ ctx[23] ), listen( select1, "change", /*select1_change_handler*/ ctx[24] ), action_destroyer(nonNegativeInt.call(null, input3, { store: configStore, key: "pngColor" })), listen( input3, "input", /*input3_input_handler*/ ctx[25] ) ]; mounted = true; } }, p(ctx2, dirty) { if (!current || dirty[0] & /*sectionTitle*/ 16) { attr( p0, "class", /*sectionTitle*/ ctx2[4] ); } const radiogroup_changes = {}; if (dirty[0] & /*$store*/ 128 | dirty[1] & /*$$scope*/ 2) { radiogroup_changes.$$scope = { dirty, ctx: ctx2 }; } radiogroup.$set(radiogroup_changes); if (!current || dirty[0] & /*ulClasses*/ 64) { attr( ul0, "class", /*ulClasses*/ ctx2[6] ); } if (!current || dirty[0] & /*sectionTitle*/ 16) { attr( p2, "class", /*sectionTitle*/ ctx2[4] ); } if (!current || dirty[0] & /*descriptionText*/ 4) { attr( p4, "class", /*descriptionText*/ ctx2[2] ); } if (!current || dirty[0] & /*inputClasses*/ 32 && input0_class_value !== (input0_class_value = "input " + /*inputClasses*/ ctx2[5])) { attr(input0, "class", input0_class_value); } if (dirty[0] & /*$store*/ 128 && to_number(input0.value) !== /*$store*/ ctx2[7].webmQuality) { set_input_value( input0, /*$store*/ ctx2[7].webmQuality ); } if (!current || dirty[0] & /*descriptionText*/ 4) { attr( p6, "class", /*descriptionText*/ ctx2[2] ); } if (!current || dirty[0] & /*inputClasses*/ 32 && input1_class_value !== (input1_class_value = "input " + /*inputClasses*/ ctx2[5])) { attr(input1, "class", input1_class_value); } if (dirty[0] & /*$store*/ 128 && to_number(input1.value) !== /*$store*/ ctx2[7].mp4Bitrate) { set_input_value( input1, /*$store*/ ctx2[7].mp4Bitrate ); } const slidetoggle_changes = {}; if (!updating_checked && dirty[0] & /*$store*/ 128) { updating_checked = true; slidetoggle_changes.checked = /*$store*/ ctx2[7].losslessWebp; add_flush_callback(() => updating_checked = false); } slidetoggle.$set(slidetoggle_changes); if (!current || dirty[0] & /*descriptionText*/ 4) { attr( p10, "class", /*descriptionText*/ ctx2[2] ); } if (!current || dirty[0] & /*inputClasses*/ 32 && input2_class_value !== (input2_class_value = "input " + /*inputClasses*/ ctx2[5])) { attr(input2, "class", input2_class_value); } if (dirty[0] & /*$store*/ 128 && to_number(input2.value) !== /*$store*/ ctx2[7].webpQuality) { set_input_value( input2, /*$store*/ ctx2[7].webpQuality ); } if (!current || dirty[0] & /*descriptionText*/ 4) { attr( p12, "class", /*descriptionText*/ ctx2[2] ); } if (dirty & /*Array*/ 0) { each_value_1 = ensure_array_like(Array.from({ length: 7 }, func)); let i; for (i = 0; i < each_value_1.length; i += 1) { const child_ctx = get_each_context_1$1(ctx2, each_value_1, i); if (each_blocks_1[i]) { each_blocks_1[i].p(child_ctx, dirty); } else { each_blocks_1[i] = create_each_block_1$1(child_ctx); each_blocks_1[i].c(); each_blocks_1[i].m(select0, null); } } for (; i < each_blocks_1.length; i += 1) { each_blocks_1[i].d(1); } each_blocks_1.length = each_value_1.length; } if (!current || dirty[0] & /*inputClasses*/ 32 && select0_class_value !== (select0_class_value = "select " + /*inputClasses*/ ctx2[5])) { attr(select0, "class", select0_class_value); } if (dirty[0] & /*$store*/ 128) { select_option( select0, /*$store*/ ctx2[7].webpMehtod ); } if (!current || dirty[0] & /*border, rounded*/ 3 && ul1_class_value !== (ul1_class_value = "list " + /*border*/ ctx2[0] + " " + /*rounded*/ ctx2[1] + " [&:not(:last-child)]:*:py-4 [&:last-child]:*:pt-4")) { attr(ul1, "class", ul1_class_value); } if (!current || dirty[0] & /*descriptionText*/ 4) { attr( p14, "class", /*descriptionText*/ ctx2[2] ); } if (dirty & /*Array*/ 0) { each_value = ensure_array_like(Array.from({ length: 20 }, func_1)); let i; for (i = 0; i < each_value.length; i += 1) { const child_ctx = get_each_context$2(ctx2, each_value, i); if (each_blocks[i]) { each_blocks[i].p(child_ctx, dirty); } else { each_blocks[i] = create_each_block$2(child_ctx); each_blocks[i].c(); each_blocks[i].m(select1, null); } } for (; i < each_blocks.length; i += 1) { each_blocks[i].d(1); } each_blocks.length = each_value.length; } if (!current || dirty[0] & /*inputClasses*/ 32 && select1_class_value !== (select1_class_value = "select " + /*inputClasses*/ ctx2[5])) { attr(select1, "class", select1_class_value); } if (dirty[0] & /*$store*/ 128) { select_option( select1, /*$store*/ ctx2[7].gifQuality ); } if (!current || dirty[0] & /*descriptionText*/ 4) { attr( p16, "class", /*descriptionText*/ ctx2[2] ); } if (!current || dirty[0] & /*inputClasses*/ 32 && input3_class_value !== (input3_class_value = "input " + /*inputClasses*/ ctx2[5])) { attr(input3, "class", input3_class_value); } if (dirty[0] & /*$store*/ 128 && to_number(input3.value) !== /*$store*/ ctx2[7].pngColor) { set_input_value( input3, /*$store*/ ctx2[7].pngColor ); } if (!current || dirty[0] & /*ulClasses*/ 64) { attr( ul2, "class", /*ulClasses*/ ctx2[6] ); } if (!current || dirty[0] & /*sectionSpace*/ 8) { attr( div6, "class", /*sectionSpace*/ ctx2[3] ); } }, i(local) { if (current) return; transition_in(radiogroup.$$.fragment, local); transition_in(slidetoggle.$$.fragment, local); current = true; }, o(local) { transition_out(radiogroup.$$.fragment, local); transition_out(slidetoggle.$$.fragment, local); current = false; }, d(detaching) { if (detaching) { detach(div6); } destroy_component(radiogroup); destroy_component(slidetoggle); destroy_each(each_blocks_1, detaching); destroy_each(each_blocks, detaching); mounted = false; run_all(dispose); } }; } const func = (_, idx) => idx; const func_1 = (_, idx) => idx; function instance$7($$self, $$props, $$invalidate) { let ulClasses; let inputClasses; let $store; component_subscribe($$self, configStore, ($$value) => $$invalidate(7, $store = $$value)); let { bg = "bg-white/30 dark:bg-black/15" } = $$props; let { border = "divide-y-[1px] *:border-surface-300-600-token" } = $$props; let { padding = "px-4 *:py-4" } = $$props; let { margin = "mt-2 *:!m-0" } = $$props; let { rounded = "rounded-container-token *:!rounded-none" } = $$props; let { descriptionText = "text-sm text-surface-400" } = $$props; let { inputRounded = "rounded-full" } = $$props; let { inputWidth = "w-32" } = $$props; let { sectionSpace = `space-y-4` } = $$props; let { sectionTitle = "font-bold" } = $$props; function radioitem0_group_binding(value) { if ($$self.$$.not_equal($store.ugoiraFormat, value)) { $store.ugoiraFormat = value; configStore.set($store); } } function radioitem1_group_binding(value) { if ($$self.$$.not_equal($store.ugoiraFormat, value)) { $store.ugoiraFormat = value; configStore.set($store); } } function radioitem2_group_binding(value) { if ($$self.$$.not_equal($store.ugoiraFormat, value)) { $store.ugoiraFormat = value; configStore.set($store); } } function radioitem3_group_binding(value) { if ($$self.$$.not_equal($store.ugoiraFormat, value)) { $store.ugoiraFormat = value; configStore.set($store); } } function radioitem4_group_binding(value) { if ($$self.$$.not_equal($store.ugoiraFormat, value)) { $store.ugoiraFormat = value; configStore.set($store); } } function radioitem5_group_binding(value) { if ($$self.$$.not_equal($store.ugoiraFormat, value)) { $store.ugoiraFormat = value; configStore.set($store); } } function input0_input_handler() { $store.webmQuality = to_number(this.value); configStore.set($store); } function input1_input_handler() { $store.mp4Bitrate = to_number(this.value); configStore.set($store); } function slidetoggle_checked_binding(value) { if ($$self.$$.not_equal($store.losslessWebp, value)) { $store.losslessWebp = value; configStore.set($store); } } function input2_input_handler() { $store.webpQuality = to_number(this.value); configStore.set($store); } function select0_change_handler() { $store.webpMehtod = select_value(this); configStore.set($store); } function select1_change_handler() { $store.gifQuality = select_value(this); configStore.set($store); } function input3_input_handler() { $store.pngColor = to_number(this.value); configStore.set($store); } $$self.$$set = ($$new_props) => { $$invalidate(26, $$props = assign(assign({}, $$props), exclude_internal_props($$new_props))); if ("bg" in $$new_props) $$invalidate(8, bg = $$new_props.bg); if ("border" in $$new_props) $$invalidate(0, border = $$new_props.border); if ("padding" in $$new_props) $$invalidate(9, padding = $$new_props.padding); if ("margin" in $$new_props) $$invalidate(10, margin = $$new_props.margin); if ("rounded" in $$new_props) $$invalidate(1, rounded = $$new_props.rounded); if ("descriptionText" in $$new_props) $$invalidate(2, descriptionText = $$new_props.descriptionText); if ("inputRounded" in $$new_props) $$invalidate(11, inputRounded = $$new_props.inputRounded); if ("inputWidth" in $$new_props) $$invalidate(12, inputWidth = $$new_props.inputWidth); if ("sectionSpace" in $$new_props) $$invalidate(3, sectionSpace = $$new_props.sectionSpace); if ("sectionTitle" in $$new_props) $$invalidate(4, sectionTitle = $$new_props.sectionTitle); }; $$self.$$.update = () => { $$invalidate(6, ulClasses = `list *:items-center ${padding} ${margin} ${border} ${bg} ${rounded} ${$$props.class ?? ""}`); if ($$self.$$.dirty[0] & /*inputWidth, inputRounded*/ 6144) { $$invalidate(5, inputClasses = `${inputWidth} ${inputRounded} shrink-0`); } }; $$props = exclude_internal_props($$props); return [ border, rounded, descriptionText, sectionSpace, sectionTitle, inputClasses, ulClasses, $store, bg, padding, margin, inputRounded, inputWidth, radioitem0_group_binding, radioitem1_group_binding, radioitem2_group_binding, radioitem3_group_binding, radioitem4_group_binding, radioitem5_group_binding, input0_input_handler, input1_input_handler, slidetoggle_checked_binding, input2_input_handler, select0_change_handler, select1_change_handler, input3_input_handler ]; } class UgoiraConvert extends SvelteComponent { constructor(options) { super(); init( this, options, instance$7, create_fragment$7, safe_not_equal, { bg: 8, border: 0, padding: 9, margin: 10, rounded: 1, descriptionText: 2, inputRounded: 11, inputWidth: 12, sectionSpace: 3, sectionTitle: 4 }, null, [-1, -1] ); } } function readHistoryFile(type, file) { return new Promise((resolve) => { if (file.type !== type) throw new Error("Invalid file"); const reader = new FileReader(); reader.readAsText(file); reader.onload = (readEvt) => { var _a; const text2 = (_a = readEvt.target) == null ? void 0 : _a.result; if (typeof text2 !== "string") throw new Error("Invalid file"); const history2 = JSON.parse(text2); if (!(history2 instanceof Array)) throw new Error("Invalid file"); resolve(history2); }; }); } function importJSON(file) { return readHistoryFile("application/json", file).then((data) => historyDb.import(data)); } function exportAsJSON() { return historyDb.getAll().then((datas) => { const str = JSON.stringify(datas); const blob = new Blob([str], { type: "application/json" }); const filename = `Pixiv Downloader_${location.hostname}_${(/* @__PURE__ */ new Date()).toLocaleString()}.json`; aDownload$1(blob, filename); }); } function exportAsCSV() { return historyDb.generateCsv().then((csv) => { const filename = `Pixiv Downloader_${location.hostname}_${(/* @__PURE__ */ new Date()).toLocaleString()}.csv`; aDownload$1(csv, filename); }); } function scheduleBackup() { const interval = config.get("historyBackupInterval"); if (interval === HistoryBackupInterval.NEVER) return; const lastTimestamp = config.get("lastHistoryBackup"); const timestamp = (/* @__PURE__ */ new Date()).getTime(); if (!lastTimestamp || lastTimestamp + interval * 1e3 < timestamp) { exportAsJSON(); config.set("lastHistoryBackup", timestamp); } } function useHistoryBackup() { return { importJSON, exportAsJSON, exportAsCSV, scheduleBackup }; } function create_if_block_3$2(ctx) { let progressradial; let current; progressradial = new ProgressRadial({ props: { stroke: 80, width: "w-5", meter: "stroke-primary-500", track: "stroke-primary-500/30" } }); return { c() { create_component(progressradial.$$.fragment); }, m(target, anchor) { mount_component(progressradial, target, anchor); current = true; }, i(local) { if (current) return; transition_in(progressradial.$$.fragment, local); current = true; }, o(local) { transition_out(progressradial.$$.fragment, local); current = false; }, d(detaching) { destroy_component(progressradial, detaching); } }; } function create_if_block_2$2(ctx) { let progressradial; let current; progressradial = new ProgressRadial({ props: { stroke: 80, width: "w-5", meter: "stroke-primary-500", track: "stroke-primary-500/30" } }); return { c() { create_component(progressradial.$$.fragment); }, m(target, anchor) { mount_component(progressradial, target, anchor); current = true; }, i(local) { if (current) return; transition_in(progressradial.$$.fragment, local); current = true; }, o(local) { transition_out(progressradial.$$.fragment, local); current = false; }, d(detaching) { destroy_component(progressradial, detaching); } }; } function create_if_block_1$4(ctx) { let progressradial; let current; progressradial = new ProgressRadial({ props: { stroke: 80, width: "w-5", meter: "stroke-primary-500", track: "stroke-primary-500/30" } }); return { c() { create_component(progressradial.$$.fragment); }, m(target, anchor) { mount_component(progressradial, target, anchor); current = true; }, i(local) { if (current) return; transition_in(progressradial.$$.fragment, local); current = true; }, o(local) { transition_out(progressradial.$$.fragment, local); current = false; }, d(detaching) { destroy_component(progressradial, detaching); } }; } function create_default_slot$3(ctx) { let t0; let span; let current; let if_block = ( /*$importPending*/ ctx[7] && create_if_block_1$4() ); return { c() { if (if_block) if_block.c(); t0 = space(); span = element("span"); span.textContent = `${t("setting.history.button.import")}`; }, m(target, anchor) { if (if_block) if_block.m(target, anchor); insert(target, t0, anchor); insert(target, span, anchor); current = true; }, p(ctx2, dirty) { if ( /*$importPending*/ ctx2[7] ) { if (if_block) { if (dirty[0] & /*$importPending*/ 128) { transition_in(if_block, 1); } } else { if_block = create_if_block_1$4(); if_block.c(); transition_in(if_block, 1); if_block.m(t0.parentNode, t0); } } else if (if_block) { group_outros(); transition_out(if_block, 1, 1, () => { if_block = null; }); check_outros(); } }, i(local) { if (current) return; transition_in(if_block); current = true; }, o(local) { transition_out(if_block); current = false; }, d(detaching) { if (detaching) { detach(t0); detach(span); } if (if_block) if_block.d(detaching); } }; } function create_if_block$5(ctx) { let progressradial; let current; progressradial = new ProgressRadial({ props: { stroke: 80, width: "w-5", meter: "stroke-primary-500", track: "stroke-primary-500/30" } }); return { c() { create_component(progressradial.$$.fragment); }, m(target, anchor) { mount_component(progressradial, target, anchor); current = true; }, i(local) { if (current) return; transition_in(progressradial.$$.fragment, local); current = true; }, o(local) { transition_out(progressradial.$$.fragment, local); current = false; }, d(detaching) { destroy_component(progressradial, detaching); } }; } function create_fragment$6(ctx) { let div; let section0; let p0; let t0_value = t("setting.history.label.scheduled_backups") + ""; let t0; let t1; let ul0; let li0; let p1; let t3; let select; let option0; let option1; let option2; let option3; let select_class_value; let t8; let section1; let p2; let t9_value = t("setting.history.label.export") + ""; let t9; let t10; let ul1; let li1; let p3; let t12; let button0; let t13; let span0; let t15; let li2; let p4; let t17; let button1; let t18; let span1; let t20; let section2; let p5; let t21_value = t("setting.history.label.import") + ""; let t21; let t22; let ul2; let li3; let p6; let t24; let filebutton; let updating_disabled; let t25; let section3; let p7; let t26_value = t("setting.history.label.clear") + ""; let t26; let t27; let ul3; let li4; let p8; let t29; let button2; let t30; let span2; let current; let mounted; let dispose; let if_block0 = ( /*$exportJsonPending*/ ctx[5] && create_if_block_3$2() ); let if_block1 = ( /*$exportCsvPending*/ ctx[6] && create_if_block_2$2() ); function filebutton_disabled_binding(value) { ctx[25](value); } let filebutton_props = { name: "import-file", accept: ".json", $$slots: { default: [create_default_slot$3] }, $$scope: { ctx } }; if ( /*$importPending*/ ctx[7] !== void 0 ) { filebutton_props.disabled = /*$importPending*/ ctx[7]; } filebutton = new FileButton({ props: filebutton_props }); binding_callbacks.push(() => bind(filebutton, "disabled", filebutton_disabled_binding)); filebutton.$on( "change", /*wrapImportFromJSON*/ ctx[10] ); let if_block2 = ( /*$clearPending*/ ctx[8] && create_if_block$5() ); return { c() { div = element("div"); section0 = element("section"); p0 = element("p"); t0 = text(t0_value); t1 = space(); ul0 = element("ul"); li0 = element("li"); p1 = element("p"); p1.textContent = `${t("setting.history.options.scheduled_backups")}`; t3 = space(); select = element("select"); option0 = element("option"); option0.textContent = `${t("setting.history.select.backup_interval_never")}`; option1 = element("option"); option1.textContent = `${t("setting.history.select.backup_interval_every_day")}`; option2 = element("option"); option2.textContent = `${t("setting.history.select.backup_interval_every_7_day")}`; option3 = element("option"); option3.textContent = `${t("setting.history.select.backup_interval_every_30_day")}`; t8 = space(); section1 = element("section"); p2 = element("p"); t9 = text(t9_value); t10 = space(); ul1 = element("ul"); li1 = element("li"); p3 = element("p"); p3.textContent = `${t("setting.history.options.export_as_json")}`; t12 = space(); button0 = element("button"); if (if_block0) if_block0.c(); t13 = space(); span0 = element("span"); span0.textContent = `${t("setting.history.button.export")}`; t15 = space(); li2 = element("li"); p4 = element("p"); p4.textContent = `${t("setting.history.options.export_as_csv")}`; t17 = space(); button1 = element("button"); if (if_block1) if_block1.c(); t18 = space(); span1 = element("span"); span1.textContent = `${t("setting.history.button.export")}`; t20 = space(); section2 = element("section"); p5 = element("p"); t21 = text(t21_value); t22 = space(); ul2 = element("ul"); li3 = element("li"); p6 = element("p"); p6.textContent = `${t("setting.history.options.import_json")}`; t24 = space(); create_component(filebutton.$$.fragment); t25 = space(); section3 = element("section"); p7 = element("p"); t26 = text(t26_value); t27 = space(); ul3 = element("ul"); li4 = element("li"); p8 = element("p"); p8.textContent = `${t("setting.history.options.clear_history")}`; t29 = space(); button2 = element("button"); if (if_block2) if_block2.c(); t30 = space(); span2 = element("span"); span2.textContent = `${t("setting.history.button.clear")}`; attr( p0, "class", /*sectionTitle*/ ctx[1] ); attr(p1, "class", "flex-auto"); option0.__value = HistoryBackupInterval.NEVER; set_input_value(option0, option0.__value); option1.__value = HistoryBackupInterval.EVERY_DAY; set_input_value(option1, option1.__value); option2.__value = HistoryBackupInterval.EVERY_7_DAY; set_input_value(option2, option2.__value); option3.__value = HistoryBackupInterval.EVERY_30_DAY; set_input_value(option3, option3.__value); attr(select, "class", select_class_value = "select " + /*inputClasses*/ ctx[2]); if ( /*$configStore*/ ctx[4].historyBackupInterval === void 0 ) add_render_callback(() => ( /*select_change_handler*/ ctx[24].call(select) )); attr( ul0, "class", /*ulClasses*/ ctx[3] ); attr( p2, "class", /*sectionTitle*/ ctx[1] ); attr(p3, "class", "flex-auto"); button0.disabled = /*$exportJsonPending*/ ctx[5]; attr(button0, "class", "btn variant-filled"); attr(p4, "class", "flex-auto"); button1.disabled = /*$exportCsvPending*/ ctx[6]; attr(button1, "class", "btn variant-filled"); attr( ul1, "class", /*ulClasses*/ ctx[3] ); attr( p5, "class", /*sectionTitle*/ ctx[1] ); attr(p6, "class", "flex-auto"); attr( ul2, "class", /*ulClasses*/ ctx[3] ); attr( p7, "class", /*sectionTitle*/ ctx[1] ); attr(p8, "class", "flex-auto"); button2.disabled = /*$clearPending*/ ctx[8]; attr(button2, "class", "btn variant-filled"); attr( ul3, "class", /*ulClasses*/ ctx[3] ); attr( div, "class", /*sectionSpace*/ ctx[0] ); }, m(target, anchor) { insert(target, div, anchor); append(div, section0); append(section0, p0); append(p0, t0); append(section0, t1); append(section0, ul0); append(ul0, li0); append(li0, p1); append(li0, t3); append(li0, select); append(select, option0); append(select, option1); append(select, option2); append(select, option3); select_option( select, /*$configStore*/ ctx[4].historyBackupInterval, true ); append(div, t8); append(div, section1); append(section1, p2); append(p2, t9); append(section1, t10); append(section1, ul1); append(ul1, li1); append(li1, p3); append(li1, t12); append(li1, button0); if (if_block0) if_block0.m(button0, null); append(button0, t13); append(button0, span0); append(ul1, t15); append(ul1, li2); append(li2, p4); append(li2, t17); append(li2, button1); if (if_block1) if_block1.m(button1, null); append(button1, t18); append(button1, span1); append(div, t20); append(div, section2); append(section2, p5); append(p5, t21); append(section2, t22); append(section2, ul2); append(ul2, li3); append(li3, p6); append(li3, t24); mount_component(filebutton, li3, null); append(div, t25); append(div, section3); append(section3, p7); append(p7, t26); append(section3, t27); append(section3, ul3); append(ul3, li4); append(li4, p8); append(li4, t29); append(li4, button2); if (if_block2) if_block2.m(button2, null); append(button2, t30); append(button2, span2); current = true; if (!mounted) { dispose = [ listen( select, "change", /*select_change_handler*/ ctx[24] ), listen( button0, "click", /*wrapExportAsJSON*/ ctx[14] ), listen( button1, "click", /*wrapExportAsCSV*/ ctx[16] ), listen( button2, "click", /*wrapClearDb*/ ctx[12] ) ]; mounted = true; } }, p(ctx2, dirty) { if (!current || dirty[0] & /*sectionTitle*/ 2) { attr( p0, "class", /*sectionTitle*/ ctx2[1] ); } if (!current || dirty[0] & /*inputClasses*/ 4 && select_class_value !== (select_class_value = "select " + /*inputClasses*/ ctx2[2])) { attr(select, "class", select_class_value); } if (dirty[0] & /*$configStore*/ 16) { select_option( select, /*$configStore*/ ctx2[4].historyBackupInterval ); } if (!current || dirty[0] & /*ulClasses*/ 8) { attr( ul0, "class", /*ulClasses*/ ctx2[3] ); } if (!current || dirty[0] & /*sectionTitle*/ 2) { attr( p2, "class", /*sectionTitle*/ ctx2[1] ); } if ( /*$exportJsonPending*/ ctx2[5] ) { if (if_block0) { if (dirty[0] & /*$exportJsonPending*/ 32) { transition_in(if_block0, 1); } } else { if_block0 = create_if_block_3$2(); if_block0.c(); transition_in(if_block0, 1); if_block0.m(button0, t13); } } else if (if_block0) { group_outros(); transition_out(if_block0, 1, 1, () => { if_block0 = null; }); check_outros(); } if (!current || dirty[0] & /*$exportJsonPending*/ 32) { button0.disabled = /*$exportJsonPending*/ ctx2[5]; } if ( /*$exportCsvPending*/ ctx2[6] ) { if (if_block1) { if (dirty[0] & /*$exportCsvPending*/ 64) { transition_in(if_block1, 1); } } else { if_block1 = create_if_block_2$2(); if_block1.c(); transition_in(if_block1, 1); if_block1.m(button1, t18); } } else if (if_block1) { group_outros(); transition_out(if_block1, 1, 1, () => { if_block1 = null; }); check_outros(); } if (!current || dirty[0] & /*$exportCsvPending*/ 64) { button1.disabled = /*$exportCsvPending*/ ctx2[6]; } if (!current || dirty[0] & /*ulClasses*/ 8) { attr( ul1, "class", /*ulClasses*/ ctx2[3] ); } if (!current || dirty[0] & /*sectionTitle*/ 2) { attr( p5, "class", /*sectionTitle*/ ctx2[1] ); } const filebutton_changes = {}; if (dirty[0] & /*$importPending*/ 128 | dirty[1] & /*$$scope*/ 4) { filebutton_changes.$$scope = { dirty, ctx: ctx2 }; } if (!updating_disabled && dirty[0] & /*$importPending*/ 128) { updating_disabled = true; filebutton_changes.disabled = /*$importPending*/ ctx2[7]; add_flush_callback(() => updating_disabled = false); } filebutton.$set(filebutton_changes); if (!current || dirty[0] & /*ulClasses*/ 8) { attr( ul2, "class", /*ulClasses*/ ctx2[3] ); } if (!current || dirty[0] & /*sectionTitle*/ 2) { attr( p7, "class", /*sectionTitle*/ ctx2[1] ); } if ( /*$clearPending*/ ctx2[8] ) { if (if_block2) { if (dirty[0] & /*$clearPending*/ 256) { transition_in(if_block2, 1); } } else { if_block2 = create_if_block$5(); if_block2.c(); transition_in(if_block2, 1); if_block2.m(button2, t30); } } else if (if_block2) { group_outros(); transition_out(if_block2, 1, 1, () => { if_block2 = null; }); check_outros(); } if (!current || dirty[0] & /*$clearPending*/ 256) { button2.disabled = /*$clearPending*/ ctx2[8]; } if (!current || dirty[0] & /*ulClasses*/ 8) { attr( ul3, "class", /*ulClasses*/ ctx2[3] ); } if (!current || dirty[0] & /*sectionSpace*/ 1) { attr( div, "class", /*sectionSpace*/ ctx2[0] ); } }, i(local) { if (current) return; transition_in(if_block0); transition_in(if_block1); transition_in(filebutton.$$.fragment, local); transition_in(if_block2); current = true; }, o(local) { transition_out(if_block0); transition_out(if_block1); transition_out(filebutton.$$.fragment, local); transition_out(if_block2); current = false; }, d(detaching) { if (detaching) { detach(div); } if (if_block0) if_block0.d(); if (if_block1) if_block1.d(); destroy_component(filebutton); if (if_block2) if_block2.d(); mounted = false; run_all(dispose); } }; } function instance$6($$self, $$props, $$invalidate) { let ulClasses; let inputClasses; let $configStore; let $exportJsonPending; let $exportCsvPending; let $importPending; let $clearPending; component_subscribe($$self, configStore, ($$value) => $$invalidate(4, $configStore = $$value)); let { bg = "bg-white/30 dark:bg-black/15" } = $$props; let { border = "divide-y-[1px] *:border-surface-300-600-token" } = $$props; let { padding = "px-4 *:py-4" } = $$props; let { margin = "mt-2 *:!m-0" } = $$props; let { rounded = "rounded-container-token *:!rounded-none" } = $$props; let { inputRounded = "rounded-full" } = $$props; let { inputWidth = "w-32" } = $$props; let { sectionSpace = `space-y-4` } = $$props; let { sectionTitle = "font-bold" } = $$props; function usePendingButton(fn) { const store = writable(false); const wrapFn = async (...args) => { store.set(true); const result = await fn(...args); store.set(false); return result; }; return { store, wrapFn }; } async function importFromJSON(evt) { var _a; const file = (_a = evt.currentTarget.files) == null ? void 0 : _a[0]; if (!file) return; try { await importJSON2(file); } catch (error) { logger.error(error); alert(error); } } function clearDb() { const isConfirm = confirm(t("setting.history.text.confirm_clear_history")); if (!isConfirm) return; return historyDb.clear(); } const { importJSON: importJSON2, exportAsJSON: exportAsJSON2, exportAsCSV: exportAsCSV2 } = useHistoryBackup(); const { store: importPending, wrapFn: wrapImportFromJSON } = usePendingButton(importFromJSON); component_subscribe($$self, importPending, (value) => $$invalidate(7, $importPending = value)); const { store: clearPending, wrapFn: wrapClearDb } = usePendingButton(clearDb); component_subscribe($$self, clearPending, (value) => $$invalidate(8, $clearPending = value)); const { store: exportJsonPending, wrapFn: wrapExportAsJSON } = usePendingButton(exportAsJSON2); component_subscribe($$self, exportJsonPending, (value) => $$invalidate(5, $exportJsonPending = value)); const { store: exportCsvPending, wrapFn: wrapExportAsCSV } = usePendingButton(exportAsCSV2); component_subscribe($$self, exportCsvPending, (value) => $$invalidate(6, $exportCsvPending = value)); function select_change_handler() { $configStore.historyBackupInterval = select_value(this); configStore.set($configStore); } function filebutton_disabled_binding(value) { $importPending = value; importPending.set($importPending); } $$self.$$set = ($$new_props) => { $$invalidate(32, $$props = assign(assign({}, $$props), exclude_internal_props($$new_props))); if ("bg" in $$new_props) $$invalidate(17, bg = $$new_props.bg); if ("border" in $$new_props) $$invalidate(18, border = $$new_props.border); if ("padding" in $$new_props) $$invalidate(19, padding = $$new_props.padding); if ("margin" in $$new_props) $$invalidate(20, margin = $$new_props.margin); if ("rounded" in $$new_props) $$invalidate(21, rounded = $$new_props.rounded); if ("inputRounded" in $$new_props) $$invalidate(22, inputRounded = $$new_props.inputRounded); if ("inputWidth" in $$new_props) $$invalidate(23, inputWidth = $$new_props.inputWidth); if ("sectionSpace" in $$new_props) $$invalidate(0, sectionSpace = $$new_props.sectionSpace); if ("sectionTitle" in $$new_props) $$invalidate(1, sectionTitle = $$new_props.sectionTitle); }; $$self.$$.update = () => { $$invalidate(3, ulClasses = `list *:items-center ${padding} ${margin} ${border} ${bg} ${rounded} ${$$props.class ?? ""}`); if ($$self.$$.dirty[0] & /*inputWidth, inputRounded*/ 12582912) { $$invalidate(2, inputClasses = `${inputWidth} ${inputRounded} shrink-0`); } }; $$props = exclude_internal_props($$props); return [ sectionSpace, sectionTitle, inputClasses, ulClasses, $configStore, $exportJsonPending, $exportCsvPending, $importPending, $clearPending, importPending, wrapImportFromJSON, clearPending, wrapClearDb, exportJsonPending, wrapExportAsJSON, exportCsvPending, wrapExportAsCSV, bg, border, padding, margin, rounded, inputRounded, inputWidth, select_change_handler, filebutton_disabled_binding ]; } class DownloadHistory extends SvelteComponent { constructor(options) { super(); init( this, options, instance$6, create_fragment$6, safe_not_equal, { bg: 17, border: 18, padding: 19, margin: 20, rounded: 21, inputRounded: 22, inputWidth: 23, sectionSpace: 0, sectionTitle: 1 }, null, [-1, -1] ); } } function create_default_slot_3$2(ctx) { let div1; let p; let t1; let div0; let t2; let t3; let t4; return { c() { div1 = element("div"); p = element("p"); p.textContent = `${t("setting.button_position.options.horizon_position")}`; t1 = space(); div0 = element("div"); t2 = text( /*btnLeft*/ ctx[3] ); t3 = text(" / "); t4 = text(max); attr(div0, "class", "text-xs"); attr(div1, "class", "flex justify-between items-center"); }, m(target, anchor) { insert(target, div1, anchor); append(div1, p); append(div1, t1); append(div1, div0); append(div0, t2); append(div0, t3); append(div0, t4); }, p(ctx2, dirty) { if (dirty & /*btnLeft*/ 8) set_data( t2, /*btnLeft*/ ctx2[3] ); }, d(detaching) { if (detaching) { detach(div1); } } }; } function create_default_slot_2$2(ctx) { let div1; let p; let t1; let div0; let t2; let t3; let t4; return { c() { div1 = element("div"); p = element("p"); p.textContent = `${t("setting.button_position.options.vertical_position")}`; t1 = space(); div0 = element("div"); t2 = text( /*btnTop*/ ctx[4] ); t3 = text(" / "); t4 = text(max); attr(div0, "class", "text-xs"); attr(div1, "class", "flex justify-between items-center"); }, m(target, anchor) { insert(target, div1, anchor); append(div1, p); append(div1, t1); append(div1, div0); append(div0, t2); append(div0, t3); append(div0, t4); }, p(ctx2, dirty) { if (dirty & /*btnTop*/ 16) set_data( t2, /*btnTop*/ ctx2[4] ); }, d(detaching) { if (detaching) { detach(div1); } } }; } function create_if_block$4(ctx) { let section; let p; let t0_value = t("setting.button_position.label.my_bookmark") + ""; let t0; let t1; let ul; let li; let rangeslider0; let updating_value; let t2; let rangeslider1; let updating_value_1; let current; function rangeslider0_value_binding_1(value) { ctx[19](value); } let rangeslider0_props = { name: "pdl-bookmark-btn-left", step, max, ticked: true, class: "flex-grow", $$slots: { default: [create_default_slot_1$2] }, $$scope: { ctx } }; if ( /*bookmarkBtnLeft*/ ctx[5] !== void 0 ) { rangeslider0_props.value = /*bookmarkBtnLeft*/ ctx[5]; } rangeslider0 = new RangeSlider({ props: rangeslider0_props }); binding_callbacks.push(() => bind(rangeslider0, "value", rangeslider0_value_binding_1)); rangeslider0.$on( "change", /*change_handler_2*/ ctx[20] ); function rangeslider1_value_binding_1(value) { ctx[21](value); } let rangeslider1_props = { name: "pdl-bookmark-btn-top", step, max, ticked: true, class: "flex-grow", $$slots: { default: [create_default_slot$2] }, $$scope: { ctx } }; if ( /*bookmarkBtnTop*/ ctx[6] !== void 0 ) { rangeslider1_props.value = /*bookmarkBtnTop*/ ctx[6]; } rangeslider1 = new RangeSlider({ props: rangeslider1_props }); binding_callbacks.push(() => bind(rangeslider1, "value", rangeslider1_value_binding_1)); rangeslider1.$on( "change", /*change_handler_3*/ ctx[22] ); return { c() { section = element("section"); p = element("p"); t0 = text(t0_value); t1 = space(); ul = element("ul"); li = element("li"); create_component(rangeslider0.$$.fragment); t2 = space(); create_component(rangeslider1.$$.fragment); attr( p, "class", /*sectionTitle*/ ctx[2] ); attr(li, "class", "flex-col !items-stretch md:flex-row md:!items-baseline gap-4 *:!m-0"); attr( ul, "class", /*ulClasses*/ ctx[8] ); }, m(target, anchor) { insert(target, section, anchor); append(section, p); append(p, t0); append(section, t1); append(section, ul); append(ul, li); mount_component(rangeslider0, li, null); append(li, t2); mount_component(rangeslider1, li, null); current = true; }, p(ctx2, dirty) { if (!current || dirty & /*sectionTitle*/ 4) { attr( p, "class", /*sectionTitle*/ ctx2[2] ); } const rangeslider0_changes = {}; if (dirty & /*$$scope, bookmarkBtnLeft*/ 33554464) { rangeslider0_changes.$$scope = { dirty, ctx: ctx2 }; } if (!updating_value && dirty & /*bookmarkBtnLeft*/ 32) { updating_value = true; rangeslider0_changes.value = /*bookmarkBtnLeft*/ ctx2[5]; add_flush_callback(() => updating_value = false); } rangeslider0.$set(rangeslider0_changes); const rangeslider1_changes = {}; if (dirty & /*$$scope, bookmarkBtnTop*/ 33554496) { rangeslider1_changes.$$scope = { dirty, ctx: ctx2 }; } if (!updating_value_1 && dirty & /*bookmarkBtnTop*/ 64) { updating_value_1 = true; rangeslider1_changes.value = /*bookmarkBtnTop*/ ctx2[6]; add_flush_callback(() => updating_value_1 = false); } rangeslider1.$set(rangeslider1_changes); if (!current || dirty & /*ulClasses*/ 256) { attr( ul, "class", /*ulClasses*/ ctx2[8] ); } }, i(local) { if (current) return; transition_in(rangeslider0.$$.fragment, local); transition_in(rangeslider1.$$.fragment, local); current = true; }, o(local) { transition_out(rangeslider0.$$.fragment, local); transition_out(rangeslider1.$$.fragment, local); current = false; }, d(detaching) { if (detaching) { detach(section); } destroy_component(rangeslider0); destroy_component(rangeslider1); } }; } function create_default_slot_1$2(ctx) { let div1; let p; let t1; let div0; let t2; let t3; let t4; return { c() { div1 = element("div"); p = element("p"); p.textContent = `${t("setting.button_position.options.horizon_position")}`; t1 = space(); div0 = element("div"); t2 = text( /*bookmarkBtnLeft*/ ctx[5] ); t3 = text(" / "); t4 = text(max); attr(div0, "class", "text-xs"); attr(div1, "class", "flex justify-between items-center"); }, m(target, anchor) { insert(target, div1, anchor); append(div1, p); append(div1, t1); append(div1, div0); append(div0, t2); append(div0, t3); append(div0, t4); }, p(ctx2, dirty) { if (dirty & /*bookmarkBtnLeft*/ 32) set_data( t2, /*bookmarkBtnLeft*/ ctx2[5] ); }, d(detaching) { if (detaching) { detach(div1); } } }; } function create_default_slot$2(ctx) { let div1; let p; let t1; let div0; let t2; let t3; let t4; return { c() { div1 = element("div"); p = element("p"); p.textContent = `${t("setting.button_position.options.vertical_position")}`; t1 = space(); div0 = element("div"); t2 = text( /*bookmarkBtnTop*/ ctx[6] ); t3 = text(" / "); t4 = text(max); attr(div0, "class", "text-xs"); attr(div1, "class", "flex justify-between items-center"); }, m(target, anchor) { insert(target, div1, anchor); append(div1, p); append(div1, t1); append(div1, div0); append(div0, t2); append(div0, t3); append(div0, t4); }, p(ctx2, dirty) { if (dirty & /*bookmarkBtnTop*/ 64) set_data( t2, /*bookmarkBtnTop*/ ctx2[6] ); }, d(detaching) { if (detaching) { detach(div1); } } }; } function create_fragment$5(ctx) { let div2; let div1; let div0; let div0_class_value; let t0; let section; let p; let t1_value = t("setting.button_position.label.common") + ""; let t1; let t2; let ul; let li; let rangeslider0; let updating_value; let t3; let rangeslider1; let updating_value_1; let t4; let show_if = env.isPixiv(); let current; function rangeslider0_value_binding(value) { ctx[15](value); } let rangeslider0_props = { name: "pdl-btn-left", step, max, ticked: true, class: "flex-grow", $$slots: { default: [create_default_slot_3$2] }, $$scope: { ctx } }; if ( /*btnLeft*/ ctx[3] !== void 0 ) { rangeslider0_props.value = /*btnLeft*/ ctx[3]; } rangeslider0 = new RangeSlider({ props: rangeslider0_props }); binding_callbacks.push(() => bind(rangeslider0, "value", rangeslider0_value_binding)); rangeslider0.$on( "change", /*change_handler*/ ctx[16] ); function rangeslider1_value_binding(value) { ctx[17](value); } let rangeslider1_props = { name: "pdl-btn-top", step, max, ticked: true, class: "flex-grow", $$slots: { default: [create_default_slot_2$2] }, $$scope: { ctx } }; if ( /*btnTop*/ ctx[4] !== void 0 ) { rangeslider1_props.value = /*btnTop*/ ctx[4]; } rangeslider1 = new RangeSlider({ props: rangeslider1_props }); binding_callbacks.push(() => bind(rangeslider1, "value", rangeslider1_value_binding)); rangeslider1.$on( "change", /*change_handler_1*/ ctx[18] ); let if_block = show_if && create_if_block$4(ctx); return { c() { div2 = element("div"); div1 = element("div"); div0 = element("div"); t0 = space(); section = element("section"); p = element("p"); t1 = text(t1_value); t2 = space(); ul = element("ul"); li = element("li"); create_component(rangeslider0.$$.fragment); t3 = space(); create_component(rangeslider1.$$.fragment); t4 = space(); if (if_block) if_block.c(); attr(div0, "class", div0_class_value = "w-48 h-48 backdrop-blur-sm rounded-lg relative " + /*bg*/ ctx[0]); attr(div1, "class", "flex items-center justify-center"); attr( p, "class", /*sectionTitle*/ ctx[2] ); attr(li, "class", "flex-col !items-stretch md:flex-row md:!items-baseline gap-4 *:!m-0"); attr( ul, "class", /*ulClasses*/ ctx[8] ); attr( div2, "class", /*sectionSpace*/ ctx[1] ); }, m(target, anchor) { insert(target, div2, anchor); append(div2, div1); append(div1, div0); ctx[14](div0); append(div2, t0); append(div2, section); append(section, p); append(p, t1); append(section, t2); append(section, ul); append(ul, li); mount_component(rangeslider0, li, null); append(li, t3); mount_component(rangeslider1, li, null); append(div2, t4); if (if_block) if_block.m(div2, null); current = true; }, p(ctx2, [dirty]) { if (!current || dirty & /*bg*/ 1 && div0_class_value !== (div0_class_value = "w-48 h-48 backdrop-blur-sm rounded-lg relative " + /*bg*/ ctx2[0])) { attr(div0, "class", div0_class_value); } if (!current || dirty & /*sectionTitle*/ 4) { attr( p, "class", /*sectionTitle*/ ctx2[2] ); } const rangeslider0_changes = {}; if (dirty & /*$$scope, btnLeft*/ 33554440) { rangeslider0_changes.$$scope = { dirty, ctx: ctx2 }; } if (!updating_value && dirty & /*btnLeft*/ 8) { updating_value = true; rangeslider0_changes.value = /*btnLeft*/ ctx2[3]; add_flush_callback(() => updating_value = false); } rangeslider0.$set(rangeslider0_changes); const rangeslider1_changes = {}; if (dirty & /*$$scope, btnTop*/ 33554448) { rangeslider1_changes.$$scope = { dirty, ctx: ctx2 }; } if (!updating_value_1 && dirty & /*btnTop*/ 16) { updating_value_1 = true; rangeslider1_changes.value = /*btnTop*/ ctx2[4]; add_flush_callback(() => updating_value_1 = false); } rangeslider1.$set(rangeslider1_changes); if (!current || dirty & /*ulClasses*/ 256) { attr( ul, "class", /*ulClasses*/ ctx2[8] ); } if (show_if) if_block.p(ctx2, dirty); if (!current || dirty & /*sectionSpace*/ 2) { attr( div2, "class", /*sectionSpace*/ ctx2[1] ); } }, i(local) { if (current) return; transition_in(rangeslider0.$$.fragment, local); transition_in(rangeslider1.$$.fragment, local); transition_in(if_block); current = true; }, o(local) { transition_out(rangeslider0.$$.fragment, local); transition_out(rangeslider1.$$.fragment, local); transition_out(if_block); current = false; }, d(detaching) { if (detaching) { detach(div2); } ctx[14](null); destroy_component(rangeslider0); destroy_component(rangeslider1); if (if_block) if_block.d(); } }; } const max = 100; const step = 4; function changeCssProp(key, value) { document.documentElement.style.setProperty(key, String(value)); } function instance$5($$self, $$props, $$invalidate) { let ulClasses; let $store; component_subscribe($$self, configStore, ($$value) => $$invalidate(23, $store = $$value)); let { bg = "bg-white/30 dark:bg-black/15" } = $$props; let { border = "divide-y-[1px] *:border-surface-300-600-token" } = $$props; let { padding = "px-4 *:py-4" } = $$props; let { margin = "mt-2 *:!m-0" } = $$props; let { rounded = "rounded-container-token *:!rounded-none" } = $$props; let { sectionSpace = `space-y-4` } = $$props; let { sectionTitle = "font-bold" } = $$props; let btnLeft = $store["pdl-btn-left"]; let btnTop = $store["pdl-btn-top"]; let bookmarkBtnLeft = $store["pdl-btn-self-bookmark-left"]; let bookmarkBtnTop = $store["pdl-btn-self-bookmark-top"]; function updateBtnPosConfig(key, val) { set_store_value(configStore, $store[key] = val, $store); } let buttonContainer; onMount(() => { const sampleBtn = new ThumbnailButton({ id: "0", onClick: () => void 0 }); sampleBtn.setAttribute("disabled", ""); buttonContainer.appendChild(sampleBtn); if (!env.isPixiv()) return; const sampleBookmarkBtn = new ThumbnailButton({ id: "0", type: ThumbnailBtnType.PixivMyBookmark, onClick: () => void 0 }); sampleBookmarkBtn.setAttribute("disabled", ""); buttonContainer.appendChild(sampleBookmarkBtn); }); function div0_binding($$value) { binding_callbacks[$$value ? "unshift" : "push"](() => { buttonContainer = $$value; $$invalidate(7, buttonContainer); }); } function rangeslider0_value_binding(value) { btnLeft = value; $$invalidate(3, btnLeft); } const change_handler = () => updateBtnPosConfig("pdl-btn-left", btnLeft); function rangeslider1_value_binding(value) { btnTop = value; $$invalidate(4, btnTop); } const change_handler_1 = () => updateBtnPosConfig("pdl-btn-top", btnTop); function rangeslider0_value_binding_1(value) { bookmarkBtnLeft = value; $$invalidate(5, bookmarkBtnLeft); } const change_handler_2 = () => updateBtnPosConfig("pdl-btn-self-bookmark-left", bookmarkBtnLeft); function rangeslider1_value_binding_1(value) { bookmarkBtnTop = value; $$invalidate(6, bookmarkBtnTop); } const change_handler_3 = () => updateBtnPosConfig("pdl-btn-self-bookmark-top", bookmarkBtnTop); $$self.$$set = ($$new_props) => { $$invalidate(24, $$props = assign(assign({}, $$props), exclude_internal_props($$new_props))); if ("bg" in $$new_props) $$invalidate(0, bg = $$new_props.bg); if ("border" in $$new_props) $$invalidate(10, border = $$new_props.border); if ("padding" in $$new_props) $$invalidate(11, padding = $$new_props.padding); if ("margin" in $$new_props) $$invalidate(12, margin = $$new_props.margin); if ("rounded" in $$new_props) $$invalidate(13, rounded = $$new_props.rounded); if ("sectionSpace" in $$new_props) $$invalidate(1, sectionSpace = $$new_props.sectionSpace); if ("sectionTitle" in $$new_props) $$invalidate(2, sectionTitle = $$new_props.sectionTitle); }; $$self.$$.update = () => { $$invalidate(8, ulClasses = `list *:items-center ${padding} ${margin} ${border} ${bg} ${rounded} ${$$props.class ?? ""}`); if ($$self.$$.dirty & /*btnLeft*/ 8) { changeCssProp("--pdl-btn-left", btnLeft); } if ($$self.$$.dirty & /*btnTop*/ 16) { changeCssProp("--pdl-btn-top", btnTop); } if ($$self.$$.dirty & /*bookmarkBtnLeft*/ 32) { changeCssProp("--pdl-btn-self-bookmark-left", bookmarkBtnLeft); } if ($$self.$$.dirty & /*bookmarkBtnTop*/ 64) { changeCssProp("--pdl-btn-self-bookmark-top", bookmarkBtnTop); } }; $$props = exclude_internal_props($$props); return [ bg, sectionSpace, sectionTitle, btnLeft, btnTop, bookmarkBtnLeft, bookmarkBtnTop, buttonContainer, ulClasses, updateBtnPosConfig, border, padding, margin, rounded, div0_binding, rangeslider0_value_binding, change_handler, rangeslider1_value_binding, change_handler_1, rangeslider0_value_binding_1, change_handler_2, rangeslider1_value_binding_1, change_handler_3 ]; } class BtnPosition extends SvelteComponent { constructor(options) { super(); init(this, options, instance$5, create_fragment$5, safe_not_equal, { bg: 0, border: 10, padding: 11, margin: 12, rounded: 13, sectionSpace: 1, sectionTitle: 2 }); } } function create_if_block_3$1(ctx) { let li0; let p0; let t1; let slidetoggle0; let updating_checked; let t2; let li1; let p1; let t4; let slidetoggle1; let updating_checked_1; let current; function slidetoggle0_checked_binding(value) { ctx[11](value); } let slidetoggle0_props = { name: "bundle-illusts", size: "sm" }; if ( /*$store*/ ctx[6].bundleIllusts !== void 0 ) { slidetoggle0_props.checked = /*$store*/ ctx[6].bundleIllusts; } slidetoggle0 = new SlideToggle({ props: slidetoggle0_props }); binding_callbacks.push(() => bind(slidetoggle0, "checked", slidetoggle0_checked_binding)); function slidetoggle1_checked_binding(value) { ctx[12](value); } let slidetoggle1_props = { name: "bundle-manga", size: "sm" }; if ( /*$store*/ ctx[6].bundleManga !== void 0 ) { slidetoggle1_props.checked = /*$store*/ ctx[6].bundleManga; } slidetoggle1 = new SlideToggle({ props: slidetoggle1_props }); binding_callbacks.push(() => bind(slidetoggle1, "checked", slidetoggle1_checked_binding)); return { c() { li0 = element("li"); p0 = element("p"); p0.textContent = `${t("setting.others.options.bundle_multipage_illust")}`; t1 = space(); create_component(slidetoggle0.$$.fragment); t2 = space(); li1 = element("li"); p1 = element("p"); p1.textContent = `${t("setting.others.options.bundle_manga")}`; t4 = space(); create_component(slidetoggle1.$$.fragment); attr(p0, "class", "flex-auto"); attr(p1, "class", "flex-auto"); }, m(target, anchor) { insert(target, li0, anchor); append(li0, p0); append(li0, t1); mount_component(slidetoggle0, li0, null); insert(target, t2, anchor); insert(target, li1, anchor); append(li1, p1); append(li1, t4); mount_component(slidetoggle1, li1, null); current = true; }, p(ctx2, dirty) { const slidetoggle0_changes = {}; if (!updating_checked && dirty & /*$store*/ 64) { updating_checked = true; slidetoggle0_changes.checked = /*$store*/ ctx2[6].bundleIllusts; add_flush_callback(() => updating_checked = false); } slidetoggle0.$set(slidetoggle0_changes); const slidetoggle1_changes = {}; if (!updating_checked_1 && dirty & /*$store*/ 64) { updating_checked_1 = true; slidetoggle1_changes.checked = /*$store*/ ctx2[6].bundleManga; add_flush_callback(() => updating_checked_1 = false); } slidetoggle1.$set(slidetoggle1_changes); }, i(local) { if (current) return; transition_in(slidetoggle0.$$.fragment, local); transition_in(slidetoggle1.$$.fragment, local); current = true; }, o(local) { transition_out(slidetoggle0.$$.fragment, local); transition_out(slidetoggle1.$$.fragment, local); current = false; }, d(detaching) { if (detaching) { detach(li0); detach(t2); detach(li1); } destroy_component(slidetoggle0); destroy_component(slidetoggle1); } }; } function create_if_block_1$3(ctx) { let li; let div; let p; let t1; let slidetoggle; let updating_checked; let t2; let show_if = ( /*$store*/ ctx[6].addBookmark && env.isPixiv() ); let current; function slidetoggle_checked_binding_1(value) { ctx[13](value); } let slidetoggle_props = { name: "fsa-enable", size: "sm" }; if ( /*$store*/ ctx[6].addBookmark !== void 0 ) { slidetoggle_props.checked = /*$store*/ ctx[6].addBookmark; } slidetoggle = new SlideToggle({ props: slidetoggle_props }); binding_callbacks.push(() => bind(slidetoggle, "checked", slidetoggle_checked_binding_1)); let if_block = show_if && create_if_block_2$1(ctx); return { c() { li = element("li"); div = element("div"); p = element("p"); p.textContent = `${t("setting.others.options.add_bookmark_when_download")}`; t1 = space(); create_component(slidetoggle.$$.fragment); t2 = space(); if (if_block) if_block.c(); attr(p, "class", "flex-auto"); attr(div, "class", "flex items-center"); attr(li, "class", "flex-col !items-stretch"); }, m(target, anchor) { insert(target, li, anchor); append(li, div); append(div, p); append(div, t1); mount_component(slidetoggle, div, null); append(li, t2); if (if_block) if_block.m(li, null); current = true; }, p(ctx2, dirty) { const slidetoggle_changes = {}; if (!updating_checked && dirty & /*$store*/ 64) { updating_checked = true; slidetoggle_changes.checked = /*$store*/ ctx2[6].addBookmark; add_flush_callback(() => updating_checked = false); } slidetoggle.$set(slidetoggle_changes); if (dirty & /*$store*/ 64) show_if = /*$store*/ ctx2[6].addBookmark && env.isPixiv(); if (show_if) { if (if_block) { if_block.p(ctx2, dirty); if (dirty & /*$store*/ 64) { transition_in(if_block, 1); } } else { if_block = create_if_block_2$1(ctx2); if_block.c(); transition_in(if_block, 1); if_block.m(li, null); } } else if (if_block) { group_outros(); transition_out(if_block, 1, 1, () => { if_block = null; }); check_outros(); } }, i(local) { if (current) return; transition_in(slidetoggle.$$.fragment, local); transition_in(if_block); current = true; }, o(local) { transition_out(slidetoggle.$$.fragment, local); transition_out(if_block); current = false; }, d(detaching) { if (detaching) { detach(li); } destroy_component(slidetoggle); if (if_block) if_block.d(); } }; } function create_if_block_2$1(ctx) { let ul; let li0; let label0; let p0; let t1; let slidetoggle0; let updating_checked; let t2; let li1; let label1; let p1; let t4; let slidetoggle1; let updating_checked_1; let ul_class_value; let current; function slidetoggle0_checked_binding_1(value) { ctx[14](value); } let slidetoggle0_props = { name: "fsa-enable", size: "sm" }; if ( /*$store*/ ctx[6].addBookmarkWithTags !== void 0 ) { slidetoggle0_props.checked = /*$store*/ ctx[6].addBookmarkWithTags; } slidetoggle0 = new SlideToggle({ props: slidetoggle0_props }); binding_callbacks.push(() => bind(slidetoggle0, "checked", slidetoggle0_checked_binding_1)); function slidetoggle1_checked_binding_1(value) { ctx[15](value); } let slidetoggle1_props = { name: "fsa-enable", size: "sm" }; if ( /*$store*/ ctx[6].privateR18 !== void 0 ) { slidetoggle1_props.checked = /*$store*/ ctx[6].privateR18; } slidetoggle1 = new SlideToggle({ props: slidetoggle1_props }); binding_callbacks.push(() => bind(slidetoggle1, "checked", slidetoggle1_checked_binding_1)); return { c() { ul = element("ul"); li0 = element("li"); label0 = element("label"); p0 = element("p"); p0.textContent = `${t("setting.others.options.add_bookmark_with_tags")}`; t1 = space(); create_component(slidetoggle0.$$.fragment); t2 = space(); li1 = element("li"); label1 = element("label"); p1 = element("p"); p1.textContent = `${t("setting.others.options.add_bookmark_private_r18")}`; t4 = space(); create_component(slidetoggle1.$$.fragment); attr(p0, "class", "flex-auto"); attr(label0, "class", "label flex flex-grow items-center justify-center"); attr(p1, "class", "flex-auto"); attr(label1, "class", "label flex flex-grow items-center justify-center"); attr(ul, "class", ul_class_value = "list " + /*border*/ ctx[0] + " " + /*rounded*/ ctx[1] + " [&:not(:last-child)]:*:py-4 [&:last-child]:*:pt-4"); }, m(target, anchor) { insert(target, ul, anchor); append(ul, li0); append(li0, label0); append(label0, p0); append(label0, t1); mount_component(slidetoggle0, label0, null); append(ul, t2); append(ul, li1); append(li1, label1); append(label1, p1); append(label1, t4); mount_component(slidetoggle1, label1, null); current = true; }, p(ctx2, dirty) { const slidetoggle0_changes = {}; if (!updating_checked && dirty & /*$store*/ 64) { updating_checked = true; slidetoggle0_changes.checked = /*$store*/ ctx2[6].addBookmarkWithTags; add_flush_callback(() => updating_checked = false); } slidetoggle0.$set(slidetoggle0_changes); const slidetoggle1_changes = {}; if (!updating_checked_1 && dirty & /*$store*/ 64) { updating_checked_1 = true; slidetoggle1_changes.checked = /*$store*/ ctx2[6].privateR18; add_flush_callback(() => updating_checked_1 = false); } slidetoggle1.$set(slidetoggle1_changes); if (!current || dirty & /*border, rounded*/ 3 && ul_class_value !== (ul_class_value = "list " + /*border*/ ctx2[0] + " " + /*rounded*/ ctx2[1] + " [&:not(:last-child)]:*:py-4 [&:last-child]:*:pt-4")) { attr(ul, "class", ul_class_value); } }, i(local) { if (current) return; transition_in(slidetoggle0.$$.fragment, local); transition_in(slidetoggle1.$$.fragment, local); current = true; }, o(local) { transition_out(slidetoggle0.$$.fragment, local); transition_out(slidetoggle1.$$.fragment, local); current = false; }, d(detaching) { if (detaching) { detach(ul); } destroy_component(slidetoggle0); destroy_component(slidetoggle1); } }; } function create_if_block$3(ctx) { let section; let p0; let t0; let t1; let ul; let li; let div; let p1; let t3; let p2; let t4; let p2_class_value; let t5; let slidetoggle; let updating_checked; let current; function slidetoggle_checked_binding_2(value) { ctx[16](value); } let slidetoggle_props = { name: "mix-effect", size: "sm" }; if ( /*$store*/ ctx[6].mixEffect !== void 0 ) { slidetoggle_props.checked = /*$store*/ ctx[6].mixEffect; } slidetoggle = new SlideToggle({ props: slidetoggle_props }); binding_callbacks.push(() => bind(slidetoggle, "checked", slidetoggle_checked_binding_2)); return { c() { section = element("section"); p0 = element("p"); t0 = text("实验性功能"); t1 = space(); ul = element("ul"); li = element("li"); div = element("div"); p1 = element("p"); p1.textContent = "为单页插图增加 #pixivGlow2024 效果"; t3 = space(); p2 = element("p"); t4 = text("* 转换至动图格式。如果插图尺寸过大,可能占用大量内存 / 转换失败"); t5 = space(); create_component(slidetoggle.$$.fragment); attr( p0, "class", /*sectionTitle*/ ctx[4] ); attr(p2, "class", p2_class_value = /*descritionText*/ ctx[2] + " !text-error-500"); attr(div, "class", "flex-auto"); attr( ul, "class", /*ulClasses*/ ctx[5] ); }, m(target, anchor) { insert(target, section, anchor); append(section, p0); append(p0, t0); append(section, t1); append(section, ul); append(ul, li); append(li, div); append(div, p1); append(div, t3); append(div, p2); append(p2, t4); append(li, t5); mount_component(slidetoggle, li, null); current = true; }, p(ctx2, dirty) { if (!current || dirty & /*sectionTitle*/ 16) { attr( p0, "class", /*sectionTitle*/ ctx2[4] ); } if (!current || dirty & /*descritionText*/ 4 && p2_class_value !== (p2_class_value = /*descritionText*/ ctx2[2] + " !text-error-500")) { attr(p2, "class", p2_class_value); } const slidetoggle_changes = {}; if (!updating_checked && dirty & /*$store*/ 64) { updating_checked = true; slidetoggle_changes.checked = /*$store*/ ctx2[6].mixEffect; add_flush_callback(() => updating_checked = false); } slidetoggle.$set(slidetoggle_changes); if (!current || dirty & /*ulClasses*/ 32) { attr( ul, "class", /*ulClasses*/ ctx2[5] ); } }, i(local) { if (current) return; transition_in(slidetoggle.$$.fragment, local); current = true; }, o(local) { transition_out(slidetoggle.$$.fragment, local); current = false; }, d(detaching) { if (detaching) { detach(section); } destroy_component(slidetoggle); } }; } function create_fragment$4(ctx) { let div; let ul; let li; let p; let t1; let slidetoggle; let updating_checked; let t2; let show_if_2 = env.isPixiv(); let t3; let show_if_1 = !env.isYande(); let t4; let show_if = env.isPixiv(); let current; function slidetoggle_checked_binding(value) { ctx[10](value); } let slidetoggle_props = { name: "show-popup-button", size: "sm" }; if ( /*$store*/ ctx[6].showPopupButton !== void 0 ) { slidetoggle_props.checked = /*$store*/ ctx[6].showPopupButton; } slidetoggle = new SlideToggle({ props: slidetoggle_props }); binding_callbacks.push(() => bind(slidetoggle, "checked", slidetoggle_checked_binding)); let if_block0 = show_if_2 && create_if_block_3$1(ctx); let if_block1 = show_if_1 && create_if_block_1$3(ctx); let if_block2 = show_if && create_if_block$3(ctx); return { c() { div = element("div"); ul = element("ul"); li = element("li"); p = element("p"); p.textContent = `${t("setting.others.options.show_setting_button")}`; t1 = space(); create_component(slidetoggle.$$.fragment); t2 = space(); if (if_block0) if_block0.c(); t3 = space(); if (if_block1) if_block1.c(); t4 = space(); if (if_block2) if_block2.c(); attr(p, "class", "flex-auto"); attr( ul, "class", /*ulClasses*/ ctx[5] ); attr( div, "class", /*sectionSpace*/ ctx[3] ); }, m(target, anchor) { insert(target, div, anchor); append(div, ul); append(ul, li); append(li, p); append(li, t1); mount_component(slidetoggle, li, null); append(ul, t2); if (if_block0) if_block0.m(ul, null); append(ul, t3); if (if_block1) if_block1.m(ul, null); append(div, t4); if (if_block2) if_block2.m(div, null); current = true; }, p(ctx2, [dirty]) { const slidetoggle_changes = {}; if (!updating_checked && dirty & /*$store*/ 64) { updating_checked = true; slidetoggle_changes.checked = /*$store*/ ctx2[6].showPopupButton; add_flush_callback(() => updating_checked = false); } slidetoggle.$set(slidetoggle_changes); if (show_if_2) if_block0.p(ctx2, dirty); if (show_if_1) if_block1.p(ctx2, dirty); if (!current || dirty & /*ulClasses*/ 32) { attr( ul, "class", /*ulClasses*/ ctx2[5] ); } if (show_if) if_block2.p(ctx2, dirty); if (!current || dirty & /*sectionSpace*/ 8) { attr( div, "class", /*sectionSpace*/ ctx2[3] ); } }, i(local) { if (current) return; transition_in(slidetoggle.$$.fragment, local); transition_in(if_block0); transition_in(if_block1); transition_in(if_block2); current = true; }, o(local) { transition_out(slidetoggle.$$.fragment, local); transition_out(if_block0); transition_out(if_block1); transition_out(if_block2); current = false; }, d(detaching) { if (detaching) { detach(div); } destroy_component(slidetoggle); if (if_block0) if_block0.d(); if (if_block1) if_block1.d(); if (if_block2) if_block2.d(); } }; } function instance$4($$self, $$props, $$invalidate) { let ulClasses; let $store; component_subscribe($$self, configStore, ($$value) => $$invalidate(6, $store = $$value)); let { bg = "bg-white/30 dark:bg-black/15" } = $$props; let { border = "divide-y-[1px] *:border-surface-300-600-token" } = $$props; let { padding = "px-4 *:py-4" } = $$props; let { margin = "mt-2 *:!m-0" } = $$props; let { rounded = "rounded-container-token *:!rounded-none" } = $$props; let { descritionText = "text-sm text-surface-400" } = $$props; let { sectionSpace = `space-y-4` } = $$props; let { sectionTitle = "font-bold" } = $$props; function slidetoggle_checked_binding(value) { if ($$self.$$.not_equal($store.showPopupButton, value)) { $store.showPopupButton = value; configStore.set($store); } } function slidetoggle0_checked_binding(value) { if ($$self.$$.not_equal($store.bundleIllusts, value)) { $store.bundleIllusts = value; configStore.set($store); } } function slidetoggle1_checked_binding(value) { if ($$self.$$.not_equal($store.bundleManga, value)) { $store.bundleManga = value; configStore.set($store); } } function slidetoggle_checked_binding_1(value) { if ($$self.$$.not_equal($store.addBookmark, value)) { $store.addBookmark = value; configStore.set($store); } } function slidetoggle0_checked_binding_1(value) { if ($$self.$$.not_equal($store.addBookmarkWithTags, value)) { $store.addBookmarkWithTags = value; configStore.set($store); } } function slidetoggle1_checked_binding_1(value) { if ($$self.$$.not_equal($store.privateR18, value)) { $store.privateR18 = value; configStore.set($store); } } function slidetoggle_checked_binding_2(value) { if ($$self.$$.not_equal($store.mixEffect, value)) { $store.mixEffect = value; configStore.set($store); } } $$self.$$set = ($$new_props) => { $$invalidate(17, $$props = assign(assign({}, $$props), exclude_internal_props($$new_props))); if ("bg" in $$new_props) $$invalidate(7, bg = $$new_props.bg); if ("border" in $$new_props) $$invalidate(0, border = $$new_props.border); if ("padding" in $$new_props) $$invalidate(8, padding = $$new_props.padding); if ("margin" in $$new_props) $$invalidate(9, margin = $$new_props.margin); if ("rounded" in $$new_props) $$invalidate(1, rounded = $$new_props.rounded); if ("descritionText" in $$new_props) $$invalidate(2, descritionText = $$new_props.descritionText); if ("sectionSpace" in $$new_props) $$invalidate(3, sectionSpace = $$new_props.sectionSpace); if ("sectionTitle" in $$new_props) $$invalidate(4, sectionTitle = $$new_props.sectionTitle); }; $$self.$$.update = () => { $$invalidate(5, ulClasses = `list *:items-center ${padding} ${margin} ${border} ${bg} ${rounded} ${$$props.class ?? ""}`); }; $$props = exclude_internal_props($$props); return [ border, rounded, descritionText, sectionSpace, sectionTitle, ulClasses, $store, bg, padding, margin, slidetoggle_checked_binding, slidetoggle0_checked_binding, slidetoggle1_checked_binding, slidetoggle_checked_binding_1, slidetoggle0_checked_binding_1, slidetoggle1_checked_binding_1, slidetoggle_checked_binding_2 ]; } class Others extends SvelteComponent { constructor(options) { super(); init(this, options, instance$4, create_fragment$4, safe_not_equal, { bg: 7, border: 0, padding: 8, margin: 9, rounded: 1, descritionText: 2, sectionSpace: 3, sectionTitle: 4 }); } } function create_fragment$3(ctx) { let div; let section0; let p0; let t0_value = t("setting.feedback.label.feedback") + ""; let t0; let t1; let ul0; let li0; let span; let raw0_value = t("setting.feedback.text.feedback_desc") + ""; let t2; let section1; let p1; let t3_value = t("setting.feedback.label.donate") + ""; let t3; let t4; let ul1; let li1; let p2; let raw1_value = t("setting.feedback.text.give_me_a_star") + ""; let t5; let li2; let figure; let img; let img_src_value; let t6; let figcaption; return { c() { div = element("div"); section0 = element("section"); p0 = element("p"); t0 = text(t0_value); t1 = space(); ul0 = element("ul"); li0 = element("li"); span = element("span"); t2 = space(); section1 = element("section"); p1 = element("p"); t3 = text(t3_value); t4 = space(); ul1 = element("ul"); li1 = element("li"); p2 = element("p"); t5 = space(); li2 = element("li"); figure = element("figure"); img = element("img"); t6 = space(); figcaption = element("figcaption"); figcaption.textContent = `${t("setting.feedback.text.donate_desc")}`; attr( p0, "class", /*sectionTitle*/ ctx[1] ); attr( ul0, "class", /*ulClasses*/ ctx[2] ); attr( p1, "class", /*sectionTitle*/ ctx[1] ); if (!src_url_equal(img.src, img_src_value = creditCode)) attr(img, "src", img_src_value); attr(img, "alt", "credit"); attr(img, "class", "rounded-full m-auto"); attr(figcaption, "class", "mt-4"); attr(li2, "class", "justify-center"); attr( ul1, "class", /*ulClasses*/ ctx[2] ); attr( div, "class", /*sectionSpace*/ ctx[0] ); }, m(target, anchor) { insert(target, div, anchor); append(div, section0); append(section0, p0); append(p0, t0); append(section0, t1); append(section0, ul0); append(ul0, li0); append(li0, span); span.innerHTML = raw0_value; append(div, t2); append(div, section1); append(section1, p1); append(p1, t3); append(section1, t4); append(section1, ul1); append(ul1, li1); append(li1, p2); p2.innerHTML = raw1_value; append(ul1, t5); append(ul1, li2); append(li2, figure); append(figure, img); append(figure, t6); append(figure, figcaption); }, p(ctx2, [dirty]) { if (dirty & /*sectionTitle*/ 2) { attr( p0, "class", /*sectionTitle*/ ctx2[1] ); } if (dirty & /*ulClasses*/ 4) { attr( ul0, "class", /*ulClasses*/ ctx2[2] ); } if (dirty & /*sectionTitle*/ 2) { attr( p1, "class", /*sectionTitle*/ ctx2[1] ); } if (dirty & /*ulClasses*/ 4) { attr( ul1, "class", /*ulClasses*/ ctx2[2] ); } if (dirty & /*sectionSpace*/ 1) { attr( div, "class", /*sectionSpace*/ ctx2[0] ); } }, i: noop, o: noop, d(detaching) { if (detaching) { detach(div); } } }; } function instance$3($$self, $$props, $$invalidate) { let ulClasses; let { bg = "bg-white/30 dark:bg-black/15" } = $$props; let { border = "divide-y-[1px] *:border-surface-300-600-token" } = $$props; let { padding = "px-4 *:py-4" } = $$props; let { margin = "mt-2 *:!m-0" } = $$props; let { rounded = "rounded-container-token *:!rounded-none" } = $$props; let { sectionSpace = `space-y-4` } = $$props; let { sectionTitle = "font-bold" } = $$props; $$self.$$set = ($$new_props) => { $$invalidate(8, $$props = assign(assign({}, $$props), exclude_internal_props($$new_props))); if ("bg" in $$new_props) $$invalidate(3, bg = $$new_props.bg); if ("border" in $$new_props) $$invalidate(4, border = $$new_props.border); if ("padding" in $$new_props) $$invalidate(5, padding = $$new_props.padding); if ("margin" in $$new_props) $$invalidate(6, margin = $$new_props.margin); if ("rounded" in $$new_props) $$invalidate(7, rounded = $$new_props.rounded); if ("sectionSpace" in $$new_props) $$invalidate(0, sectionSpace = $$new_props.sectionSpace); if ("sectionTitle" in $$new_props) $$invalidate(1, sectionTitle = $$new_props.sectionTitle); }; $$self.$$.update = () => { $$invalidate(2, ulClasses = `list *:items-center ${padding} ${margin} ${border} ${bg} ${rounded} ${$$props.class ?? ""}`); }; $$props = exclude_internal_props($$props); return [sectionSpace, sectionTitle, ulClasses, bg, border, padding, margin, rounded]; } class FeedBack extends SvelteComponent { constructor(options) { super(); init(this, options, instance$3, create_fragment$3, safe_not_equal, { bg: 3, border: 4, padding: 5, margin: 6, rounded: 7, sectionSpace: 0, sectionTitle: 1 }); } } const menuOpen = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M21,15.61L19.59,17L14.58,12L19.59,7L21,8.39L17.44,12L21,15.61M3,6H16V8H3V6M3,13V11H13V13H3M3,18V16H16V18H3Z" /></svg>`; const menuClose = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6H13V8H3V6M3 16H13V18H3V16M3 11H15V13H3V11M16 7L14.58 8.39L18.14 12L14.58 15.61L16 17L21 12L16 7Z" /></svg>`; function get_each_context$1(ctx, list, i) { const child_ctx = ctx.slice(); child_ctx[9] = list[i]; child_ctx[11] = i; return child_ctx; } function create_if_block_1$2(ctx) { let listboxitem; let updating_group; let current; function listboxitem_group_binding(value) { ctx[6](value); } let listboxitem_props = { name: "option", value: ( /*idx*/ ctx[11] ), class: "rounded-token", $$slots: { default: [create_default_slot_3$1] }, $$scope: { ctx } }; if ( /*slected*/ ctx[2] !== void 0 ) { listboxitem_props.group = /*slected*/ ctx[2]; } listboxitem = new ListBoxItem({ props: listboxitem_props }); binding_callbacks.push(() => bind(listboxitem, "group", listboxitem_group_binding)); return { c() { create_component(listboxitem.$$.fragment); }, m(target, anchor) { mount_component(listboxitem, target, anchor); current = true; }, p(ctx2, dirty) { const listboxitem_changes = {}; if (dirty & /*$$scope*/ 4096) { listboxitem_changes.$$scope = { dirty, ctx: ctx2 }; } if (!updating_group && dirty & /*slected*/ 4) { updating_group = true; listboxitem_changes.group = /*slected*/ ctx2[2]; add_flush_callback(() => updating_group = false); } listboxitem.$set(listboxitem_changes); }, i(local) { if (current) return; transition_in(listboxitem.$$.fragment, local); current = true; }, o(local) { transition_out(listboxitem.$$.fragment, local); current = false; }, d(detaching) { destroy_component(listboxitem, detaching); } }; } function create_default_slot_3$1(ctx) { let t_1_value = ( /*option*/ ctx[9].name + "" ); let t_1; return { c() { t_1 = text(t_1_value); }, m(target, anchor) { insert(target, t_1, anchor); }, p: noop, d(detaching) { if (detaching) { detach(t_1); } } }; } function create_each_block$1(ctx) { let if_block_anchor; let current; let if_block = (!("show" in /*option*/ ctx[9]) || /*option*/ ctx[9].show) && create_if_block_1$2(ctx); return { c() { if (if_block) if_block.c(); if_block_anchor = empty(); }, m(target, anchor) { if (if_block) if_block.m(target, anchor); insert(target, if_block_anchor, anchor); current = true; }, p(ctx2, dirty) { if (!("show" in /*option*/ ctx2[9]) || /*option*/ ctx2[9].show) if_block.p(ctx2, dirty); }, i(local) { if (current) return; transition_in(if_block); current = true; }, o(local) { transition_out(if_block); current = false; }, d(detaching) { if (detaching) { detach(if_block_anchor); } if (if_block) if_block.d(detaching); } }; } function create_default_slot_2$1(ctx) { let each_1_anchor; let current; let each_value = ensure_array_like( /*optionList*/ ctx[5] ); let each_blocks = []; for (let i = 0; i < each_value.length; i += 1) { each_blocks[i] = create_each_block$1(get_each_context$1(ctx, each_value, i)); } const out = (i) => transition_out(each_blocks[i], 1, 1, () => { each_blocks[i] = null; }); return { c() { for (let i = 0; i < each_blocks.length; i += 1) { each_blocks[i].c(); } each_1_anchor = empty(); }, m(target, anchor) { for (let i = 0; i < each_blocks.length; i += 1) { if (each_blocks[i]) { each_blocks[i].m(target, anchor); } } insert(target, each_1_anchor, anchor); current = true; }, p(ctx2, dirty) { if (dirty & /*slected, optionList*/ 36) { each_value = ensure_array_like( /*optionList*/ ctx2[5] ); let i; for (i = 0; i < each_value.length; i += 1) { const child_ctx = get_each_context$1(ctx2, each_value, i); if (each_blocks[i]) { each_blocks[i].p(child_ctx, dirty); transition_in(each_blocks[i], 1); } else { each_blocks[i] = create_each_block$1(child_ctx); each_blocks[i].c(); transition_in(each_blocks[i], 1); each_blocks[i].m(each_1_anchor.parentNode, each_1_anchor); } } group_outros(); for (i = each_value.length; i < each_blocks.length; i += 1) { out(i); } check_outros(); } }, i(local) { if (current) return; for (let i = 0; i < each_value.length; i += 1) { transition_in(each_blocks[i]); } current = true; }, o(local) { each_blocks = each_blocks.filter(Boolean); for (let i = 0; i < each_blocks.length; i += 1) { transition_out(each_blocks[i]); } current = false; }, d(detaching) { if (detaching) { detach(each_1_anchor); } destroy_each(each_blocks, detaching); } }; } function create_default_slot_1$1(ctx) { let h3; let t_1_value = ( /*optionList*/ (ctx[5][ /*slected*/ ctx[2] ].name || "设置") + "" ); let t_1; return { c() { h3 = element("h3"); t_1 = text(t_1_value); attr(h3, "class", "h3"); }, m(target, anchor) { insert(target, h3, anchor); append(h3, t_1); }, p(ctx2, dirty) { if (dirty & /*slected*/ 4 && t_1_value !== (t_1_value = /*optionList*/ (ctx2[5][ /*slected*/ ctx2[2] ].name || "设置") + "")) set_data(t_1, t_1_value); }, d(detaching) { if (detaching) { detach(h3); } } }; } function create_else_block$1(ctx) { let html_tag; let html_anchor; return { c() { html_tag = new HtmlTag(false); html_anchor = empty(); html_tag.a = html_anchor; }, m(target, anchor) { html_tag.m(menuOpen, target, anchor); insert(target, html_anchor, anchor); }, d(detaching) { if (detaching) { detach(html_anchor); html_tag.d(); } } }; } function create_if_block$2(ctx) { let html_tag; let html_anchor; return { c() { html_tag = new HtmlTag(false); html_anchor = empty(); html_tag.a = html_anchor; }, m(target, anchor) { html_tag.m(menuClose, target, anchor); insert(target, html_anchor, anchor); }, d(detaching) { if (detaching) { detach(html_anchor); html_tag.d(); } } }; } function create_lead_slot(ctx) { let button; let i; let mounted; let dispose; function select_block_type(ctx2, dirty) { if ( /*showListbox*/ ctx2[1] ) return create_if_block$2; return create_else_block$1; } let current_block_type = select_block_type(ctx); let if_block = current_block_type(ctx); return { c() { button = element("button"); i = element("i"); if_block.c(); attr(i, "class", "w-8 fill-current"); attr(button, "type", "button"); attr(button, "class", "btn-icon hover:variant-soft-surface ml-1"); }, m(target, anchor) { insert(target, button, anchor); append(button, i); if_block.m(i, null); if (!mounted) { dispose = listen( button, "click", /*click_handler*/ ctx[7] ); mounted = true; } }, p(ctx2, dirty) { if (current_block_type !== (current_block_type = select_block_type(ctx2))) { if_block.d(1); if_block = current_block_type(ctx2); if (if_block) { if_block.c(); if_block.m(i, null); } } }, d(detaching) { if (detaching) { detach(button); } if_block.d(); mounted = false; dispose(); } }; } function create_default_slot$1(ctx) { let div1; let listbox; let t0; let appbar; let t1; let div0; let switch_instance; let div1_class_value; let current; listbox = new ListBox({ props: { class: "pt-4 pr-6 row-start-1 row-span-2 " + sidebarWidth + " transition-[transform] " + /*transform*/ ctx[3], $$slots: { default: [create_default_slot_2$1] }, $$scope: { ctx } } }); appbar = new AppBar({ props: { padding: "py-2", background: "bg-transparent", class: "mr-6 border-b border-surface-800-100-token", $$slots: { lead: [create_lead_slot], default: [create_default_slot_1$1] }, $$scope: { ctx } } }); const switch_instance_spread_levels = [ /*optionList*/ ctx[5][ /*slected*/ ctx[2] ].props, { bg: "bg-white/30 dark:bg-surface-500/20 backdrop-blur-sm" } ]; var switch_value = ( /*optionList*/ ctx[5][ /*slected*/ ctx[2] ].component ); function switch_props(ctx2, dirty) { let switch_instance_props = {}; for (let i = 0; i < switch_instance_spread_levels.length; i += 1) { switch_instance_props = assign(switch_instance_props, switch_instance_spread_levels[i]); } if (dirty !== void 0 && dirty & /*optionList, slected*/ 36) { switch_instance_props = assign(switch_instance_props, get_spread_update(switch_instance_spread_levels, [ get_spread_object( /*optionList*/ ctx2[5][ /*slected*/ ctx2[2] ].props ), switch_instance_spread_levels[1] ])); } return { props: switch_instance_props }; } if (switch_value) { switch_instance = construct_svelte_component(switch_value, switch_props(ctx)); } return { c() { div1 = element("div"); create_component(listbox.$$.fragment); t0 = space(); create_component(appbar.$$.fragment); t1 = space(); div0 = element("div"); if (switch_instance) create_component(switch_instance.$$.fragment); attr(div0, "class", "mt-4 pr-4 scrollbar-track-transparent scrollbar-thumb-slate-400/50 scrollbar-corner-transparent scrollbar-thin overflow-y-auto"); set_style(div0, "scrollbar-gutter", "stable"); attr(div1, "class", div1_class_value = "h-full pt-4 pb-6 pl-6 grid grid-rows-[auto_1fr] transition-[grid-template-columns] " + /*gridCol*/ ctx[4]); }, m(target, anchor) { insert(target, div1, anchor); mount_component(listbox, div1, null); append(div1, t0); mount_component(appbar, div1, null); append(div1, t1); append(div1, div0); if (switch_instance) mount_component(switch_instance, div0, null); current = true; }, p(ctx2, dirty) { const listbox_changes = {}; if (dirty & /*transform*/ 8) listbox_changes.class = "pt-4 pr-6 row-start-1 row-span-2 " + sidebarWidth + " transition-[transform] " + /*transform*/ ctx2[3]; if (dirty & /*$$scope, slected*/ 4100) { listbox_changes.$$scope = { dirty, ctx: ctx2 }; } listbox.$set(listbox_changes); const appbar_changes = {}; if (dirty & /*$$scope, showListbox, slected*/ 4102) { appbar_changes.$$scope = { dirty, ctx: ctx2 }; } appbar.$set(appbar_changes); if (dirty & /*slected*/ 4 && switch_value !== (switch_value = /*optionList*/ ctx2[5][ /*slected*/ ctx2[2] ].component)) { if (switch_instance) { group_outros(); const old_component = switch_instance; transition_out(old_component.$$.fragment, 1, 0, () => { destroy_component(old_component, 1); }); check_outros(); } if (switch_value) { switch_instance = construct_svelte_component(switch_value, switch_props(ctx2, dirty)); create_component(switch_instance.$$.fragment); transition_in(switch_instance.$$.fragment, 1); mount_component(switch_instance, div0, null); } else { switch_instance = null; } } else if (switch_value) { const switch_instance_changes = dirty & /*optionList, slected*/ 36 ? get_spread_update(switch_instance_spread_levels, [ get_spread_object( /*optionList*/ ctx2[5][ /*slected*/ ctx2[2] ].props ), switch_instance_spread_levels[1] ]) : {}; switch_instance.$set(switch_instance_changes); } if (!current || dirty & /*gridCol*/ 16 && div1_class_value !== (div1_class_value = "h-full pt-4 pb-6 pl-6 grid grid-rows-[auto_1fr] transition-[grid-template-columns] " + /*gridCol*/ ctx2[4])) { attr(div1, "class", div1_class_value); } }, i(local) { if (current) return; transition_in(listbox.$$.fragment, local); transition_in(appbar.$$.fragment, local); if (switch_instance) transition_in(switch_instance.$$.fragment, local); current = true; }, o(local) { transition_out(listbox.$$.fragment, local); transition_out(appbar.$$.fragment, local); if (switch_instance) transition_out(switch_instance.$$.fragment, local); current = false; }, d(detaching) { if (detaching) { detach(div1); } destroy_component(listbox); destroy_component(appbar); if (switch_instance) destroy_component(switch_instance); } }; } function create_fragment$2(ctx) { let modalwrapper; let current; modalwrapper = new ModalWrapper({ props: { parent: ( /*parent*/ ctx[0] ), height: "h-screen md:h-[600px]", width: "w-screen md:max-w-screen-md xl:max-w-screen-lg", padding: "", $$slots: { default: [create_default_slot$1] }, $$scope: { ctx } } }); return { c() { create_component(modalwrapper.$$.fragment); }, m(target, anchor) { mount_component(modalwrapper, target, anchor); current = true; }, p(ctx2, [dirty]) { const modalwrapper_changes = {}; if (dirty & /*parent*/ 1) modalwrapper_changes.parent = /*parent*/ ctx2[0]; if (dirty & /*$$scope, gridCol, slected, showListbox, transform*/ 4126) { modalwrapper_changes.$$scope = { dirty, ctx: ctx2 }; } modalwrapper.$set(modalwrapper_changes); }, i(local) { if (current) return; transition_in(modalwrapper.$$.fragment, local); current = true; }, o(local) { transition_out(modalwrapper.$$.fragment, local); current = false; }, d(detaching) { destroy_component(modalwrapper, detaching); } }; } const sidebarWidth = "w-[140px]"; function instance$2($$self, $$props, $$invalidate) { let gridCol; let transform; let { parent } = $$props; const templates = env.isPixiv() ? ["{artist}", "{artistID}", "{title}", "{id}", "{page}", "{tags}", "{date}"] : ["{artist}", "{character}", "{id}", "{date}"]; let slected = 0; const optionList = [ { name: t("setting.save_to.title"), component: SaveTo, props: { templates } }, { name: t("setting.ugoira.title"), component: UgoiraConvert, show: env.isPixiv() }, { name: t("setting.history.title"), component: DownloadHistory }, { name: t("setting.button_position.title"), component: BtnPosition }, { name: t("setting.others.title"), component: Others }, { name: t("setting.feedback.title"), component: FeedBack } ]; let showListbox = true; function listboxitem_group_binding(value) { slected = value; $$invalidate(2, slected); } const click_handler = () => $$invalidate(1, showListbox = !showListbox); $$self.$$set = ($$props2) => { if ("parent" in $$props2) $$invalidate(0, parent = $$props2.parent); }; $$self.$$.update = () => { if ($$self.$$.dirty & /*showListbox*/ 2) { $$invalidate(4, gridCol = showListbox ? "grid-cols-[140px_1fr]" : "grid-cols-[0px_1fr]"); } if ($$self.$$.dirty & /*showListbox*/ 2) { $$invalidate(3, transform = showListbox ? "translate-x-0" : "-translate-x-full"); } }; return [ parent, showListbox, slected, transform, gridCol, optionList, listboxitem_group_binding, click_handler ]; } class Config extends SvelteComponent { constructor(options) { super(); init(this, options, instance$2, create_fragment$2, safe_not_equal, { parent: 0 }); } } const downloadSvg = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path d="M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm0 448c-110.5 0-200-89.5-200-200S145.5 56 256 56s200 89.5 200 200-89.5 200-200 200zm-32-316v116h-67c-10.7 0-16 12.9-8.5 20.5l99 99c4.7 4.7 12.3 4.7 17 0l99-99c7.6-7.6 2.2-20.5-8.5-20.5h-67V140c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12z"></path></svg>`; const stopSvg = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path d="M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm0 448c-110.5 0-200-89.5-200-200S145.5 56 256 56s200 89.5 200 200-89.5 200-200 200zm101.8-262.2L295.6 256l62.2 62.2c4.7 4.7 4.7 12.3 0 17l-22.6 22.6c-4.7 4.7-12.3 4.7-17 0L256 295.6l-62.2 62.2c-4.7 4.7-12.3 4.7-17 0l-22.6-22.6c-4.7-4.7-4.7-12.3 0-17l62.2-62.2-62.2-62.2c-4.7-4.7-4.7-12.3 0-17l22.6-22.6c4.7-4.7 12.3-4.7 17 0l62.2 62.2 62.2-62.2c4.7-4.7 12.3-4.7 17 0l22.6 22.6c4.7 4.7 4.7 12.3 0 17z"></path></svg> `; const playSvg = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12,20C7.59,20 4,16.41 4,12C4,7.59 7.59,4 12,4C16.41,4 20,7.59 20,12C20,16.41 16.41,20 12,20M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2M10,16.5L16,12L10,7.5V16.5Z" /></svg>`; const stopOutLineSvg = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2M12,4C16.41,4 20,7.59 20,12C20,16.41 16.41,20 12,20C7.59,20 4,16.41 4,12C4,7.59 7.59,4 12,4M9,9V15H15V9" /></svg>`; const downloadMultipleSvg = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9,1V7H5L12,14L19,7H15V1H9M5,16V18H19V16H5M5,20V22H19V20H5Z" /></svg>`; function get_each_context(ctx, list, i) { const child_ctx = ctx.slice(); child_ctx[79] = list[i].name; child_ctx[80] = list[i].id; return child_ctx; } function get_each_context_1(ctx, list, i) { const child_ctx = ctx.slice(); child_ctx[80] = list[i].id; child_ctx[79] = list[i].name; return child_ctx; } function create_if_block_5(ctx) { let div1; let t_1; let div0; let current_block_type_index; let if_block1; let div1_transition; let current; let if_block0 = !/*$downloading*/ ctx[5] && create_if_block_9(ctx); const if_block_creators = [create_if_block_6, create_else_block]; const if_blocks = []; function select_block_type_1(ctx2, dirty) { if (!/*$downloading*/ ctx2[5]) return 0; return 1; } current_block_type_index = select_block_type_1(ctx); if_block1 = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx); return { c() { div1 = element("div"); if (if_block0) if_block0.c(); t_1 = space(); div0 = element("div"); if_block1.c(); attr(div0, "class", "flex relative my-4"); attr(div1, "data-theme", "skeleton"); attr(div1, "class", "card px-4 fixed right-20 top-36 w-[600px] *:text-sm shadow-xl bg-scroll"); }, m(target, anchor) { insert(target, div1, anchor); if (if_block0) if_block0.m(div1, null); append(div1, t_1); append(div1, div0); if_blocks[current_block_type_index].m(div0, null); current = true; }, p(ctx2, dirty) { if (!/*$downloading*/ ctx2[5]) { if (if_block0) { if_block0.p(ctx2, dirty); if (dirty[0] & /*$downloading*/ 32) { transition_in(if_block0, 1); } } else { if_block0 = create_if_block_9(ctx2); if_block0.c(); transition_in(if_block0, 1); if_block0.m(div1, t_1); } } else if (if_block0) { group_outros(); transition_out(if_block0, 1, 1, () => { if_block0 = null; }); check_outros(); } let previous_block_index = current_block_type_index; current_block_type_index = select_block_type_1(ctx2); if (current_block_type_index === previous_block_index) { if_blocks[current_block_type_index].p(ctx2, dirty); } else { group_outros(); transition_out(if_blocks[previous_block_index], 1, 1, () => { if_blocks[previous_block_index] = null; }); check_outros(); if_block1 = if_blocks[current_block_type_index]; if (!if_block1) { if_block1 = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx2); if_block1.c(); } else { if_block1.p(ctx2, dirty); } transition_in(if_block1, 1); if_block1.m(div0, null); } }, i(local) { if (current) return; transition_in(if_block0); transition_in(if_block1); if (local) { add_render_callback(() => { if (!current) return; if (!div1_transition) div1_transition = create_bidirectional_transition(div1, fly, { x: 50, opacity: 0 }, true); div1_transition.run(1); }); } current = true; }, o(local) { transition_out(if_block0); transition_out(if_block1); if (local) { if (!div1_transition) div1_transition = create_bidirectional_transition(div1, fly, { x: 50, opacity: 0 }, false); div1_transition.run(0); } current = false; }, d(detaching) { if (detaching) { detach(div1); } if (if_block0) if_block0.d(); if_blocks[current_block_type_index].d(); if (detaching && div1_transition) div1_transition.end(); } }; } function create_if_block_9(ctx) { let div; let tabgroup; let t_1; let hr; let div_transition; let current; tabgroup = new TabGroup({ props: { regionList: "text-surface-700-200-token", class: "text-sm", $$slots: { panel: [create_panel_slot], default: [create_default_slot_3] }, $$scope: { ctx } } }); return { c() { div = element("div"); create_component(tabgroup.$$.fragment); t_1 = space(); hr = element("hr"); attr(hr, "class", "!border-t-1 my-4"); attr(div, "class", "downloader-filter"); }, m(target, anchor) { insert(target, div, anchor); mount_component(tabgroup, div, null); append(div, t_1); append(div, hr); current = true; }, p(ctx2, dirty) { const tabgroup_changes = {}; if (dirty[0] & /*$downloadAllPages, $pageEnd, $pageStart, downloaderConfig, $selectedFilters, tabSet, $whitelistTag, $blacklistTag, $retryFailed*/ 8327169 | dirty[2] & /*$$scope*/ 8388608) { tabgroup_changes.$$scope = { dirty, ctx: ctx2 }; } tabgroup.$set(tabgroup_changes); }, i(local) { if (current) return; transition_in(tabgroup.$$.fragment, local); if (local) { add_render_callback(() => { if (!current) return; if (!div_transition) div_transition = create_bidirectional_transition(div, slide, {}, true); div_transition.run(1); }); } current = true; }, o(local) { transition_out(tabgroup.$$.fragment, local); if (local) { if (!div_transition) div_transition = create_bidirectional_transition(div, slide, {}, false); div_transition.run(0); } current = false; }, d(detaching) { if (detaching) { detach(div); } destroy_component(tabgroup); if (detaching && div_transition) div_transition.end(); } }; } function create_default_slot_6(ctx) { let t_1_value = t("downloader.category.tab_name") + ""; let t_1; return { c() { t_1 = text(t_1_value); }, m(target, anchor) { insert(target, t_1, anchor); }, p: noop, d(detaching) { if (detaching) { detach(t_1); } } }; } function create_default_slot_5(ctx) { let t_1_value = t("downloader.tag_filter.tab_name") + ""; let t_1; return { c() { t_1 = text(t_1_value); }, m(target, anchor) { insert(target, t_1, anchor); }, p: noop, d(detaching) { if (detaching) { detach(t_1); } } }; } function create_default_slot_4(ctx) { let t_1_value = t("downloader.others.tab_name") + ""; let t_1; return { c() { t_1 = text(t_1_value); }, m(target, anchor) { insert(target, t_1, anchor); }, p: noop, d(detaching) { if (detaching) { detach(t_1); } } }; } function create_default_slot_3(ctx) { let tab0; let updating_group; let t0; let tab1; let updating_group_1; let t1; let tab2; let updating_group_2; let current; function tab0_group_binding(value) { ctx[51](value); } let tab0_props = { name: "category", value: 0, $$slots: { default: [create_default_slot_6] }, $$scope: { ctx } }; if ( /*tabSet*/ ctx[12] !== void 0 ) { tab0_props.group = /*tabSet*/ ctx[12]; } tab0 = new Tab({ props: tab0_props }); binding_callbacks.push(() => bind(tab0, "group", tab0_group_binding)); function tab1_group_binding(value) { ctx[52](value); } let tab1_props = { name: "tag_filter", value: 1, $$slots: { default: [create_default_slot_5] }, $$scope: { ctx } }; if ( /*tabSet*/ ctx[12] !== void 0 ) { tab1_props.group = /*tabSet*/ ctx[12]; } tab1 = new Tab({ props: tab1_props }); binding_callbacks.push(() => bind(tab1, "group", tab1_group_binding)); function tab2_group_binding(value) { ctx[53](value); } let tab2_props = { name: "tag_filter", value: 2, $$slots: { default: [create_default_slot_4] }, $$scope: { ctx } }; if ( /*tabSet*/ ctx[12] !== void 0 ) { tab2_props.group = /*tabSet*/ ctx[12]; } tab2 = new Tab({ props: tab2_props }); binding_callbacks.push(() => bind(tab2, "group", tab2_group_binding)); return { c() { create_component(tab0.$$.fragment); t0 = space(); create_component(tab1.$$.fragment); t1 = space(); create_component(tab2.$$.fragment); }, m(target, anchor) { mount_component(tab0, target, anchor); insert(target, t0, anchor); mount_component(tab1, target, anchor); insert(target, t1, anchor); mount_component(tab2, target, anchor); current = true; }, p(ctx2, dirty) { const tab0_changes = {}; if (dirty[2] & /*$$scope*/ 8388608) { tab0_changes.$$scope = { dirty, ctx: ctx2 }; } if (!updating_group && dirty[0] & /*tabSet*/ 4096) { updating_group = true; tab0_changes.group = /*tabSet*/ ctx2[12]; add_flush_callback(() => updating_group = false); } tab0.$set(tab0_changes); const tab1_changes = {}; if (dirty[2] & /*$$scope*/ 8388608) { tab1_changes.$$scope = { dirty, ctx: ctx2 }; } if (!updating_group_1 && dirty[0] & /*tabSet*/ 4096) { updating_group_1 = true; tab1_changes.group = /*tabSet*/ ctx2[12]; add_flush_callback(() => updating_group_1 = false); } tab1.$set(tab1_changes); const tab2_changes = {}; if (dirty[2] & /*$$scope*/ 8388608) { tab2_changes.$$scope = { dirty, ctx: ctx2 }; } if (!updating_group_2 && dirty[0] & /*tabSet*/ 4096) { updating_group_2 = true; tab2_changes.group = /*tabSet*/ ctx2[12]; add_flush_callback(() => updating_group_2 = false); } tab2.$set(tab2_changes); }, i(local) { if (current) return; transition_in(tab0.$$.fragment, local); transition_in(tab1.$$.fragment, local); transition_in(tab2.$$.fragment, local); current = true; }, o(local) { transition_out(tab0.$$.fragment, local); transition_out(tab1.$$.fragment, local); transition_out(tab2.$$.fragment, local); current = false; }, d(detaching) { if (detaching) { detach(t0); detach(t1); } destroy_component(tab0, detaching); destroy_component(tab1, detaching); destroy_component(tab2, detaching); } }; } function create_if_block_12(ctx) { let div; let p; let t1; let slidetoggle; let updating_checked; let current; function slidetoggle_checked_binding(value) { ctx[50](value); } let slidetoggle_props = { size: "sm", name: "download-retry" }; if ( /*$retryFailed*/ ctx[22] !== void 0 ) { slidetoggle_props.checked = /*$retryFailed*/ ctx[22]; } slidetoggle = new SlideToggle({ props: slidetoggle_props }); binding_callbacks.push(() => bind(slidetoggle, "checked", slidetoggle_checked_binding)); return { c() { div = element("div"); p = element("p"); p.textContent = `${t("downloader.others.options.retry_failed")}`; t1 = space(); create_component(slidetoggle.$$.fragment); attr(div, "class", "flex justify-between items-center text-base text-surface-700-200-token"); }, m(target, anchor) { insert(target, div, anchor); append(div, p); append(div, t1); mount_component(slidetoggle, div, null); current = true; }, p(ctx2, dirty) { const slidetoggle_changes = {}; if (!updating_checked && dirty[0] & /*$retryFailed*/ 4194304) { updating_checked = true; slidetoggle_changes.checked = /*$retryFailed*/ ctx2[22]; add_flush_callback(() => updating_checked = false); } slidetoggle.$set(slidetoggle_changes); }, i(local) { if (current) return; transition_in(slidetoggle.$$.fragment, local); current = true; }, o(local) { transition_out(slidetoggle.$$.fragment, local); current = false; }, d(detaching) { if (detaching) { detach(div); } destroy_component(slidetoggle); } }; } function create_if_block_11(ctx) { let inputchip0; let updating_value; let t_1; let inputchip1; let updating_value_1; let current; function inputchip0_value_binding(value) { ctx[48](value); } let inputchip0_props = { allowUpperCase: true, name: "blacklist", chips: "variant-filled-primary", placeholder: t("downloader.tag_filter.placeholder.blacklist_tag") }; if ( /*$blacklistTag*/ ctx[20] !== void 0 ) { inputchip0_props.value = /*$blacklistTag*/ ctx[20]; } inputchip0 = new InputChip({ props: inputchip0_props }); binding_callbacks.push(() => bind(inputchip0, "value", inputchip0_value_binding)); function inputchip1_value_binding(value) { ctx[49](value); } let inputchip1_props = { allowUpperCase: true, name: "whitelist", chips: "variant-filled-primary", placeholder: t("downloader.tag_filter.placeholder.whitelist_tag"), class: "my-4" }; if ( /*$whitelistTag*/ ctx[21] !== void 0 ) { inputchip1_props.value = /*$whitelistTag*/ ctx[21]; } inputchip1 = new InputChip({ props: inputchip1_props }); binding_callbacks.push(() => bind(inputchip1, "value", inputchip1_value_binding)); return { c() { create_component(inputchip0.$$.fragment); t_1 = space(); create_component(inputchip1.$$.fragment); }, m(target, anchor) { mount_component(inputchip0, target, anchor); insert(target, t_1, anchor); mount_component(inputchip1, target, anchor); current = true; }, p(ctx2, dirty) { const inputchip0_changes = {}; if (!updating_value && dirty[0] & /*$blacklistTag*/ 1048576) { updating_value = true; inputchip0_changes.value = /*$blacklistTag*/ ctx2[20]; add_flush_callback(() => updating_value = false); } inputchip0.$set(inputchip0_changes); const inputchip1_changes = {}; if (!updating_value_1 && dirty[0] & /*$whitelistTag*/ 2097152) { updating_value_1 = true; inputchip1_changes.value = /*$whitelistTag*/ ctx2[21]; add_flush_callback(() => updating_value_1 = false); } inputchip1.$set(inputchip1_changes); }, i(local) { if (current) return; transition_in(inputchip0.$$.fragment, local); transition_in(inputchip1.$$.fragment, local); current = true; }, o(local) { transition_out(inputchip0.$$.fragment, local); transition_out(inputchip1.$$.fragment, local); current = false; }, d(detaching) { if (detaching) { detach(t_1); } destroy_component(inputchip0, detaching); destroy_component(inputchip1, detaching); } }; } function create_if_block_10(ctx) { let div1; let div0; let t0; let div6; let div2; let radiogroup; let t1; let div5; let label0; let div3; let i0; let t2; let input0; let t3; let label1; let div4; let i1; let t4; let input1; let current; let mounted; let dispose; let each_value_1 = ensure_array_like( /*downloaderConfig*/ ctx[0].filterOption.filters ); let each_blocks = []; for (let i = 0; i < each_value_1.length; i += 1) { each_blocks[i] = create_each_block_1(get_each_context_1(ctx, each_value_1, i)); } radiogroup = new RadioGroup({ props: { regionLabel: "text-surface-700-200-token", active: "variant-filled-primary", background: "bg-surface-400/20 dark:bg-surface-500/20", border: "", display: "flex", $$slots: { default: [create_default_slot] }, $$scope: { ctx } } }); return { c() { div1 = element("div"); div0 = element("div"); for (let i = 0; i < each_blocks.length; i += 1) { each_blocks[i].c(); } t0 = space(); div6 = element("div"); div2 = element("div"); create_component(radiogroup.$$.fragment); t1 = space(); div5 = element("div"); label0 = element("label"); div3 = element("div"); i0 = element("i"); t2 = space(); input0 = element("input"); t3 = space(); label1 = element("label"); div4 = element("div"); i1 = element("i"); t4 = space(); input1 = element("input"); attr(div0, "class", "btn-group w-full"); attr(div1, "class", "flex justify-end items-center my-4"); attr(div2, "class", "flex-grow w-full"); attr(i0, "class", "w-6 fill-current"); attr(div3, "class", "input-group-shim !px-1 flex-none"); attr(input0, "class", "w-20 pr-0 text-surface-700-200-token text-sm"); attr(input0, "type", "number"); attr(input0, "min", 1); attr(input0, "step", "1"); input0.disabled = /*$downloadAllPages*/ ctx[17]; attr(label0, "class", "input-group input-group-divider flex [&>input]:!min-w-0 [&>input]:!border-transparent border-surface-400/20 dark:border-surface-500/20 bg-surface-400/20 dark:bg-surface-500/20"); attr(i1, "class", "w-6 fill-current"); attr(div4, "class", "input-group-shim !px-1 flex-none"); attr(input1, "class", "w-20 pr-0 text-surface-700-200-token text-sm"); attr(input1, "type", "number"); attr(input1, "min", "1"); attr(input1, "step", "1"); input1.disabled = /*$downloadAllPages*/ ctx[17]; attr(label1, "class", "input-group input-group-divider flex [&>input]:!min-w-0 [&>input]:!border-transparent border-surface-400/20 dark:border-surface-500/20 bg-surface-400/20 dark:bg-surface-500/20"); attr(div5, "class", "flex justify-between items-center gap-4 w-full"); attr(div6, "class", "flex justify-between items-center my-4 gap-4"); }, m(target, anchor) { insert(target, div1, anchor); append(div1, div0); for (let i = 0; i < each_blocks.length; i += 1) { if (each_blocks[i]) { each_blocks[i].m(div0, null); } } insert(target, t0, anchor); insert(target, div6, anchor); append(div6, div2); mount_component(radiogroup, div2, null); append(div6, t1); append(div6, div5); append(div5, label0); append(label0, div3); append(div3, i0); i0.innerHTML = playSvg; append(label0, t2); append(label0, input0); set_input_value( input0, /*$pageStart*/ ctx[18] ); append(div5, t3); append(div5, label1); append(label1, div4); append(div4, i1); i1.innerHTML = stopOutLineSvg; append(label1, t4); append(label1, input1); set_input_value( input1, /*$pageEnd*/ ctx[19] ); current = true; if (!mounted) { dispose = [ action_destroyer(nonNegativeInt.call( null, input0, /*pageStart*/ ctx[29] )), listen( input0, "input", /*input0_input_handler*/ ctx[46] ), action_destroyer(nonNegativeInt.call( null, input1, /*pageEnd*/ ctx[30] )), listen( input1, "input", /*input1_input_handler*/ ctx[47] ) ]; mounted = true; } }, p(ctx2, dirty) { if (dirty[0] & /*downloaderConfig, $selectedFilters*/ 65537) { each_value_1 = ensure_array_like( /*downloaderConfig*/ ctx2[0].filterOption.filters ); let i; for (i = 0; i < each_value_1.length; i += 1) { const child_ctx = get_each_context_1(ctx2, each_value_1, i); if (each_blocks[i]) { each_blocks[i].p(child_ctx, dirty); } else { each_blocks[i] = create_each_block_1(child_ctx); each_blocks[i].c(); each_blocks[i].m(div0, null); } } for (; i < each_blocks.length; i += 1) { each_blocks[i].d(1); } each_blocks.length = each_value_1.length; } const radiogroup_changes = {}; if (dirty[0] & /*$downloadAllPages*/ 131072 | dirty[2] & /*$$scope*/ 8388608) { radiogroup_changes.$$scope = { dirty, ctx: ctx2 }; } radiogroup.$set(radiogroup_changes); if (!current || dirty[0] & /*$downloadAllPages*/ 131072) { input0.disabled = /*$downloadAllPages*/ ctx2[17]; } if (dirty[0] & /*$pageStart*/ 262144 && to_number(input0.value) !== /*$pageStart*/ ctx2[18]) { set_input_value( input0, /*$pageStart*/ ctx2[18] ); } if (!current || dirty[0] & /*$downloadAllPages*/ 131072) { input1.disabled = /*$downloadAllPages*/ ctx2[17]; } if (dirty[0] & /*$pageEnd*/ 524288 && to_number(input1.value) !== /*$pageEnd*/ ctx2[19]) { set_input_value( input1, /*$pageEnd*/ ctx2[19] ); } }, i(local) { if (current) return; transition_in(radiogroup.$$.fragment, local); current = true; }, o(local) { transition_out(radiogroup.$$.fragment, local); current = false; }, d(detaching) { if (detaching) { detach(div1); detach(t0); detach(div6); } destroy_each(each_blocks, detaching); destroy_component(radiogroup); mounted = false; run_all(dispose); } }; } function create_each_block_1(ctx) { let label; let div0; let input; let input_value_value; let value_has_changed = false; let t0; let div1; let t1_value = ( /*name*/ ctx[79] + "" ); let t1; let t2; let binding_group; let mounted; let dispose; binding_group = init_binding_group( /*$$binding_groups*/ ctx[43][0] ); return { c() { label = element("label"); div0 = element("div"); input = element("input"); t0 = space(); div1 = element("div"); t1 = text(t1_value); t2 = space(); attr(input, "type", "checkbox"); input.__value = input_value_value = /*id*/ ctx[80]; set_input_value(input, input.__value); attr(div0, "class", "w-0 h-0 overflow-hidden hidden"); attr(div1, "class", "!m-0"); attr(label, "class", "btn !py-2 rounded-none !transform-none cursor-pointer variant-soft-surface has-[:checked]:!variant-filled-primary text-sm w-full"); binding_group.p(input); }, m(target, anchor) { insert(target, label, anchor); append(label, div0); append(div0, input); input.checked = ~/*$selectedFilters*/ (ctx[16] || []).indexOf(input.__value); append(label, t0); append(label, div1); append(div1, t1); append(label, t2); if (!mounted) { dispose = listen( input, "change", /*input_change_handler*/ ctx[42] ); mounted = true; } }, p(ctx2, dirty) { if (dirty[0] & /*downloaderConfig*/ 1 && input_value_value !== (input_value_value = /*id*/ ctx2[80])) { input.__value = input_value_value; set_input_value(input, input.__value); value_has_changed = true; } if (value_has_changed || dirty[0] & /*$selectedFilters, downloaderConfig*/ 65537) { input.checked = ~/*$selectedFilters*/ (ctx2[16] || []).indexOf(input.__value); } if (dirty[0] & /*downloaderConfig*/ 1 && t1_value !== (t1_value = /*name*/ ctx2[79] + "")) set_data(t1, t1_value); }, d(detaching) { if (detaching) { detach(label); } binding_group.r(); mounted = false; dispose(); } }; } function create_default_slot_2(ctx) { let t_1_value = t("downloader.category.filter.download_all_pages") + ""; let t_1; return { c() { t_1 = text(t_1_value); }, m(target, anchor) { insert(target, t_1, anchor); }, p: noop, d(detaching) { if (detaching) { detach(t_1); } } }; } function create_default_slot_1(ctx) { let t_1_value = t("downloader.category.filter.download_selected_pages") + ""; let t_1; return { c() { t_1 = text(t_1_value); }, m(target, anchor) { insert(target, t_1, anchor); }, p: noop, d(detaching) { if (detaching) { detach(t_1); } } }; } function create_default_slot(ctx) { let radioitem0; let updating_group; let t_1; let radioitem1; let updating_group_1; let current; function radioitem0_group_binding(value) { ctx[44](value); } let radioitem0_props = { class: "text-sm !py-[7px]", name: "justify", value: true, $$slots: { default: [create_default_slot_2] }, $$scope: { ctx } }; if ( /*$downloadAllPages*/ ctx[17] !== void 0 ) { radioitem0_props.group = /*$downloadAllPages*/ ctx[17]; } radioitem0 = new RadioItem({ props: radioitem0_props }); binding_callbacks.push(() => bind(radioitem0, "group", radioitem0_group_binding)); function radioitem1_group_binding(value) { ctx[45](value); } let radioitem1_props = { class: "text-sm !py-[7px]", name: "justify", value: false, $$slots: { default: [create_default_slot_1] }, $$scope: { ctx } }; if ( /*$downloadAllPages*/ ctx[17] !== void 0 ) { radioitem1_props.group = /*$downloadAllPages*/ ctx[17]; } radioitem1 = new RadioItem({ props: radioitem1_props }); binding_callbacks.push(() => bind(radioitem1, "group", radioitem1_group_binding)); return { c() { create_component(radioitem0.$$.fragment); t_1 = space(); create_component(radioitem1.$$.fragment); }, m(target, anchor) { mount_component(radioitem0, target, anchor); insert(target, t_1, anchor); mount_component(radioitem1, target, anchor); current = true; }, p(ctx2, dirty) { const radioitem0_changes = {}; if (dirty[2] & /*$$scope*/ 8388608) { radioitem0_changes.$$scope = { dirty, ctx: ctx2 }; } if (!updating_group && dirty[0] & /*$downloadAllPages*/ 131072) { updating_group = true; radioitem0_changes.group = /*$downloadAllPages*/ ctx2[17]; add_flush_callback(() => updating_group = false); } radioitem0.$set(radioitem0_changes); const radioitem1_changes = {}; if (dirty[2] & /*$$scope*/ 8388608) { radioitem1_changes.$$scope = { dirty, ctx: ctx2 }; } if (!updating_group_1 && dirty[0] & /*$downloadAllPages*/ 131072) { updating_group_1 = true; radioitem1_changes.group = /*$downloadAllPages*/ ctx2[17]; add_flush_callback(() => updating_group_1 = false); } radioitem1.$set(radioitem1_changes); }, i(local) { if (current) return; transition_in(radioitem0.$$.fragment, local); transition_in(radioitem1.$$.fragment, local); current = true; }, o(local) { transition_out(radioitem0.$$.fragment, local); transition_out(radioitem1.$$.fragment, local); current = false; }, d(detaching) { if (detaching) { detach(t_1); } destroy_component(radioitem0, detaching); destroy_component(radioitem1, detaching); } }; } function create_panel_slot(ctx) { let current_block_type_index; let if_block; let if_block_anchor; let current; const if_block_creators = [create_if_block_10, create_if_block_11, create_if_block_12]; const if_blocks = []; function select_block_type(ctx2, dirty) { if ( /*tabSet*/ ctx2[12] === 0 ) return 0; if ( /*tabSet*/ ctx2[12] === 1 ) return 1; if ( /*tabSet*/ ctx2[12] === 2 ) return 2; return -1; } if (~(current_block_type_index = select_block_type(ctx))) { if_block = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx); } return { c() { if (if_block) if_block.c(); if_block_anchor = empty(); }, m(target, anchor) { if (~current_block_type_index) { if_blocks[current_block_type_index].m(target, anchor); } insert(target, if_block_anchor, anchor); current = true; }, p(ctx2, dirty) { let previous_block_index = current_block_type_index; current_block_type_index = select_block_type(ctx2); if (current_block_type_index === previous_block_index) { if (~current_block_type_index) { if_blocks[current_block_type_index].p(ctx2, dirty); } } else { if (if_block) { group_outros(); transition_out(if_blocks[previous_block_index], 1, 1, () => { if_blocks[previous_block_index] = null; }); check_outros(); } if (~current_block_type_index) { if_block = if_blocks[current_block_type_index]; if (!if_block) { if_block = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx2); if_block.c(); } else { if_block.p(ctx2, dirty); } transition_in(if_block, 1); if_block.m(if_block_anchor.parentNode, if_block_anchor); } else { if_block = null; } } }, i(local) { if (current) return; transition_in(if_block); current = true; }, o(local) { transition_out(if_block); current = false; }, d(detaching) { if (detaching) { detach(if_block_anchor); } if (~current_block_type_index) { if_blocks[current_block_type_index].d(detaching); } } }; } function create_else_block(ctx) { var _a; let div2; let div1; let progressbar; let t0; let div0; let p0; let t1_value = ( /*$log*/ (((_a = ctx[23]) == null ? void 0 : _a.message) ?? "") + "" ); let t1; let t2; let p1; let t3_value = ( /*$artworkCount*/ ctx[4] ? `${/*processed*/ ctx[2]} / ${/*$artworkCount*/ ctx[4]}` : "" ); let t3; let t4; let button; let i; let t5; let span; let div2_transition; let current; let mounted; let dispose; progressbar = new ProgressBar({ props: { height: "h-4", rounded: "rounded-md", meter: "bg-primary-500", track: "bg-primary-500/30", max: 100, value: ( /*downloadProgress*/ ctx[15] ) } }); return { c() { var _a2; div2 = element("div"); div1 = element("div"); create_component(progressbar.$$.fragment); t0 = space(); div0 = element("div"); p0 = element("p"); t1 = text(t1_value); t2 = space(); p1 = element("p"); t3 = text(t3_value); t4 = space(); button = element("button"); i = element("i"); t5 = space(); span = element("span"); span.textContent = `${t("downloader.download_type.stop")}`; attr(p0, "class", "truncate"); toggle_class( p0, "text-error-500", /*$log*/ ((_a2 = ctx[23]) == null ? void 0 : _a2.type) === "Error" ); attr(p1, "class", "flex-none"); attr(div0, "class", "flex items-center justify-between gap-4 basis-0 text-surface-700-200-token"); attr(div1, "class", "flex flex-grow flex-col justify-between h-full overflow-hidden"); attr(i, "class", "w-5"); attr(button, "class", "btn variant-filled-primary"); attr(div2, "class", "flex flex-grow w-full gap-6 items-center"); }, m(target, anchor) { insert(target, div2, anchor); append(div2, div1); mount_component(progressbar, div1, null); append(div1, t0); append(div1, div0); append(div0, p0); append(p0, t1); append(div0, t2); append(div0, p1); append(p1, t3); append(div2, t4); append(div2, button); append(button, i); i.innerHTML = stopSvg; append(button, t5); append(button, span); ctx[60](div2); current = true; if (!mounted) { dispose = [ listen( button, "click", /*click_handler_2*/ ctx[59] ), listen( div2, "introstart", /*introstart_handler_1*/ ctx[61] ), listen( div2, "outrostart", /*outrostart_handler_1*/ ctx[62] ) ]; mounted = true; } }, p(ctx2, dirty) { var _a2, _b; const progressbar_changes = {}; if (dirty[0] & /*downloadProgress*/ 32768) progressbar_changes.value = /*downloadProgress*/ ctx2[15]; progressbar.$set(progressbar_changes); if ((!current || dirty[0] & /*$log*/ 8388608) && t1_value !== (t1_value = /*$log*/ (((_a2 = ctx2[23]) == null ? void 0 : _a2.message) ?? "") + "")) set_data(t1, t1_value); if (!current || dirty[0] & /*$log*/ 8388608) { toggle_class( p0, "text-error-500", /*$log*/ ((_b = ctx2[23]) == null ? void 0 : _b.type) === "Error" ); } if ((!current || dirty[0] & /*$artworkCount, processed*/ 20) && t3_value !== (t3_value = /*$artworkCount*/ ctx2[4] ? `${/*processed*/ ctx2[2]} / ${/*$artworkCount*/ ctx2[4]}` : "")) set_data(t3, t3_value); }, i(local) { if (current) return; transition_in(progressbar.$$.fragment, local); if (local) { add_render_callback(() => { if (!current) return; if (!div2_transition) div2_transition = create_bidirectional_transition(div2, fade, { duration: 250 }, true); div2_transition.run(1); }); } current = true; }, o(local) { transition_out(progressbar.$$.fragment, local); if (local) { if (!div2_transition) div2_transition = create_bidirectional_transition(div2, fade, { duration: 250 }, false); div2_transition.run(0); } current = false; }, d(detaching) { if (detaching) { detach(div2); } destroy_component(progressbar); ctx[60](null); if (detaching && div2_transition) div2_transition.end(); mounted = false; run_all(dispose); } }; } function create_if_block_6(ctx) { var _a; let div1; let div0; let p0; let t0; let t1; let p1; let t2_value = ( /*$log*/ (((_a = ctx[23]) == null ? void 0 : _a.message) ?? "") + "" ); let t2; let t3; let show_if; let show_if_1; let div1_transition; let current; let mounted; let dispose; function select_block_type_2(ctx2, dirty) { if (dirty[0] & /*pageConfig*/ 2) show_if = null; if (dirty[0] & /*pageConfig*/ 2) show_if_1 = null; if (show_if == null) show_if = !!/*pageConfig*/ (ctx2[1] && Array.isArray( /*pageConfig*/ ctx2[1].genPageId )); if (show_if) return create_if_block_7; if (show_if_1 == null) show_if_1 = !!/*pageConfig*/ (ctx2[1] && !Array.isArray( /*pageConfig*/ ctx2[1].genPageId )); if (show_if_1) return create_if_block_8; } let current_block_type = select_block_type_2(ctx, [-1, -1, -1]); let if_block = current_block_type && current_block_type(ctx); return { c() { var _a2; div1 = element("div"); div0 = element("div"); p0 = element("p"); t0 = text( /*downloadResult*/ ctx[14] ); t1 = space(); p1 = element("p"); t2 = text(t2_value); t3 = space(); if (if_block) if_block.c(); attr(p0, "class", "truncate"); attr(p1, "class", "break-words"); toggle_class( p1, "text-error-500", /*$log*/ ((_a2 = ctx[23]) == null ? void 0 : _a2.type) === "Error" ); attr(div0, "class", "flex flex-grow flex-col justify-between overflow-hidden text-surface-700-200-token"); attr(div1, "class", "flex justify-end flex-grow w-full gap-4"); }, m(target, anchor) { insert(target, div1, anchor); append(div1, div0); append(div0, p0); append(p0, t0); append(div0, t1); append(div0, p1); append(p1, t2); append(div1, t3); if (if_block) if_block.m(div1, null); ctx[56](div1); current = true; if (!mounted) { dispose = [ listen( div1, "introstart", /*introstart_handler*/ ctx[57] ), listen( div1, "outrostart", /*outrostart_handler*/ ctx[58] ) ]; mounted = true; } }, p(ctx2, dirty) { var _a2, _b; if (!current || dirty[0] & /*downloadResult*/ 16384) set_data( t0, /*downloadResult*/ ctx2[14] ); if ((!current || dirty[0] & /*$log*/ 8388608) && t2_value !== (t2_value = /*$log*/ (((_a2 = ctx2[23]) == null ? void 0 : _a2.message) ?? "") + "")) set_data(t2, t2_value); if (!current || dirty[0] & /*$log*/ 8388608) { toggle_class( p1, "text-error-500", /*$log*/ ((_b = ctx2[23]) == null ? void 0 : _b.type) === "Error" ); } if (current_block_type === (current_block_type = select_block_type_2(ctx2, dirty)) && if_block) { if_block.p(ctx2, dirty); } else { if (if_block) if_block.d(1); if_block = current_block_type && current_block_type(ctx2); if (if_block) { if_block.c(); if_block.m(div1, null); } } }, i(local) { if (current) return; if (local) { add_render_callback(() => { if (!current) return; if (!div1_transition) div1_transition = create_bidirectional_transition(div1, fade, { duration: 250 }, true); div1_transition.run(1); }); } current = true; }, o(local) { if (local) { if (!div1_transition) div1_transition = create_bidirectional_transition(div1, fade, { duration: 250 }, false); div1_transition.run(0); } current = false; }, d(detaching) { if (detaching) { detach(div1); } if (if_block) { if_block.d(); } ctx[56](null); if (detaching && div1_transition) div1_transition.end(); mounted = false; run_all(dispose); } }; } function create_if_block_8(ctx) { let button; let i; let t0; let span; let t1_value = ( /*pageConfig*/ ctx[1].genPageId.name + "" ); let t1; let mounted; let dispose; return { c() { button = element("button"); i = element("i"); t0 = space(); span = element("span"); t1 = text(t1_value); attr(i, "class", "w-5"); attr(button, "class", "btn variant-filled-primary self-start"); }, m(target, anchor) { insert(target, button, anchor); append(button, i); i.innerHTML = downloadSvg; append(button, t0); append(button, span); append(span, t1); if (!mounted) { dispose = listen( button, "click", /*click_handler_1*/ ctx[55] ); mounted = true; } }, p(ctx2, dirty) { if (dirty[0] & /*pageConfig*/ 2 && t1_value !== (t1_value = /*pageConfig*/ ctx2[1].genPageId.name + "")) set_data(t1, t1_value); }, d(detaching) { if (detaching) { detach(button); } mounted = false; dispose(); } }; } function create_if_block_7(ctx) { let div; let each_value = ensure_array_like( /*pageConfig*/ ctx[1].genPageId ); let each_blocks = []; for (let i = 0; i < each_value.length; i += 1) { each_blocks[i] = create_each_block(get_each_context(ctx, each_value, i)); } return { c() { div = element("div"); for (let i = 0; i < each_blocks.length; i += 1) { each_blocks[i].c(); } attr(div, "class", "flex-none btn-group self-start"); }, m(target, anchor) { insert(target, div, anchor); for (let i = 0; i < each_blocks.length; i += 1) { if (each_blocks[i]) { each_blocks[i].m(div, null); } } }, p(ctx2, dirty) { if (dirty[0] & /*startDownload, pageConfig*/ 16777218) { each_value = ensure_array_like( /*pageConfig*/ ctx2[1].genPageId ); let i; for (i = 0; i < each_value.length; i += 1) { const child_ctx = get_each_context(ctx2, each_value, i); if (each_blocks[i]) { each_blocks[i].p(child_ctx, dirty); } else { each_blocks[i] = create_each_block(child_ctx); each_blocks[i].c(); each_blocks[i].m(div, null); } } for (; i < each_blocks.length; i += 1) { each_blocks[i].d(1); } each_blocks.length = each_value.length; } }, d(detaching) { if (detaching) { detach(div); } destroy_each(each_blocks, detaching); } }; } function create_each_block(ctx) { let button; let i; let t0; let span; let t1_value = ( /*name*/ ctx[79] + "" ); let t1; let t2; let mounted; let dispose; function click_handler() { return ( /*click_handler*/ ctx[54]( /*id*/ ctx[80] ) ); } return { c() { button = element("button"); i = element("i"); t0 = space(); span = element("span"); t1 = text(t1_value); t2 = space(); attr(i, "class", "w-5"); attr(button, "class", "btn rounded-none !transform-none !variant-filled-primary"); }, m(target, anchor) { insert(target, button, anchor); append(button, i); i.innerHTML = downloadSvg; append(button, t0); append(button, span); append(span, t1); append(button, t2); if (!mounted) { dispose = listen(button, "click", click_handler); mounted = true; } }, p(new_ctx, dirty) { ctx = new_ctx; if (dirty[0] & /*pageConfig*/ 2 && t1_value !== (t1_value = /*name*/ ctx[79] + "")) set_data(t1, t1_value); }, d(detaching) { if (detaching) { detach(button); } mounted = false; dispose(); } }; } function create_if_block$1(ctx) { let div2; let div0; let promise2; let t0; let t1; let div1; let current_block_type_index; let if_block1; let div2_transition; let current; let mounted; let dispose; let info = { ctx, current: null, token: null, hasCatch: false, pending: create_pending_block, then: create_then_block, catch: create_catch_block, value: 78 }; handle_promise(promise2 = /*avatarUpdated*/ ctx[11], info); let if_block0 = ( /*$downloading*/ ctx[5] && !/*showDownloadMenu*/ ctx[13] && create_if_block_3(ctx) ); const if_block_creators = [create_if_block_1$1, create_if_block_2]; const if_blocks = []; function select_block_type_3(ctx2, dirty) { if ( /*$downloading*/ ctx2[5] && /*$artworkCount*/ ctx2[4] && !/*showDownloadMenu*/ ctx2[13] ) return 0; if (!/*showDownloadMenu*/ ctx2[13]) return 1; return -1; } if (~(current_block_type_index = select_block_type_3(ctx))) { if_block1 = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx); } return { c() { div2 = element("div"); div0 = element("div"); info.block.c(); t0 = space(); if (if_block0) if_block0.c(); t1 = space(); div1 = element("div"); if (if_block1) if_block1.c(); attr(div0, "data-theme", "skeleton"); attr(div0, "class", "avatar absolute -z-10 size-14 rounded-full overflow-hidden bg-scroll transition-opacity duration-[250ms]"); toggle_class(div0, "opacity-70", !/*showDownloadMenu*/ ctx[13]); toggle_class(div0, "blur-[1px]", !/*showDownloadMenu*/ ctx[13]); attr(div1, "class", "size-14 flex justify-center items-center relative"); attr(div2, "class", "size-14 rounded-full fixed right-4 top-36 drop-shadow-xl cursor-pointer hover:brightness-110 backdrop-blur-sm"); }, m(target, anchor) { insert(target, div2, anchor); append(div2, div0); info.block.m(div0, info.anchor = null); info.mount = () => div0; info.anchor = null; append(div2, t0); if (if_block0) if_block0.m(div2, null); append(div2, t1); append(div2, div1); if (~current_block_type_index) { if_blocks[current_block_type_index].m(div1, null); } current = true; if (!mounted) { dispose = listen( div2, "click", /*click_handler_3*/ ctx[70] ); mounted = true; } }, p(new_ctx, dirty) { ctx = new_ctx; info.ctx = ctx; if (dirty[0] & /*avatarUpdated*/ 2048 && promise2 !== (promise2 = /*avatarUpdated*/ ctx[11]) && handle_promise(promise2, info)) ; else { update_await_block_branch(info, ctx, dirty); } if (!current || dirty[0] & /*showDownloadMenu*/ 8192) { toggle_class(div0, "opacity-70", !/*showDownloadMenu*/ ctx[13]); } if (!current || dirty[0] & /*showDownloadMenu*/ 8192) { toggle_class(div0, "blur-[1px]", !/*showDownloadMenu*/ ctx[13]); } if ( /*$downloading*/ ctx[5] && !/*showDownloadMenu*/ ctx[13] ) { if (if_block0) { if_block0.p(ctx, dirty); if (dirty[0] & /*$downloading, showDownloadMenu*/ 8224) { transition_in(if_block0, 1); } } else { if_block0 = create_if_block_3(ctx); if_block0.c(); transition_in(if_block0, 1); if_block0.m(div2, t1); } } else if (if_block0) { group_outros(); transition_out(if_block0, 1, 1, () => { if_block0 = null; }); check_outros(); } let previous_block_index = current_block_type_index; current_block_type_index = select_block_type_3(ctx); if (current_block_type_index === previous_block_index) { if (~current_block_type_index) { if_blocks[current_block_type_index].p(ctx, dirty); } } else { if (if_block1) { group_outros(); transition_out(if_blocks[previous_block_index], 1, 1, () => { if_blocks[previous_block_index] = null; }); check_outros(); } if (~current_block_type_index) { if_block1 = if_blocks[current_block_type_index]; if (!if_block1) { if_block1 = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx); if_block1.c(); } else { if_block1.p(ctx, dirty); } transition_in(if_block1, 1); if_block1.m(div1, null); } else { if_block1 = null; } } }, i(local) { if (current) return; transition_in(if_block0); transition_in(if_block1); if (local) { add_render_callback(() => { if (!current) return; if (!div2_transition) div2_transition = create_bidirectional_transition(div2, fly, { opacity: 0, x: 50 }, true); div2_transition.run(1); }); } current = true; }, o(local) { transition_out(if_block0); transition_out(if_block1); if (local) { if (!div2_transition) div2_transition = create_bidirectional_transition(div2, fly, { opacity: 0, x: 50 }, false); div2_transition.run(0); } current = false; }, d(detaching) { if (detaching) { detach(div2); } info.block.d(); info.token = null; info = null; if (if_block0) if_block0.d(); if (~current_block_type_index) { if_blocks[current_block_type_index].d(); } if (detaching && div2_transition) div2_transition.end(); mounted = false; dispose(); } }; } function create_catch_block(ctx) { return { c: noop, m: noop, p: noop, d: noop }; } function create_then_block(ctx) { let if_block_anchor; let if_block = ( /*val*/ ctx[78] && create_if_block_4(ctx) ); return { c() { if (if_block) if_block.c(); if_block_anchor = empty(); }, m(target, anchor) { if (if_block) if_block.m(target, anchor); insert(target, if_block_anchor, anchor); }, p(ctx2, dirty) { if ( /*val*/ ctx2[78] ) { if (if_block) { if_block.p(ctx2, dirty); } else { if_block = create_if_block_4(ctx2); if_block.c(); if_block.m(if_block_anchor.parentNode, if_block_anchor); } } else if (if_block) { if_block.d(1); if_block = null; } }, d(detaching) { if (detaching) { detach(if_block_anchor); } if (if_block) if_block.d(detaching); } }; } function create_if_block_4(ctx) { let img; let img_src_value; return { c() { img = element("img"); if (!src_url_equal(img.src, img_src_value = /*val*/ ctx[78])) attr(img, "src", img_src_value); attr(img, "alt", "batch download"); attr(img, "class", "object-cover object-center size-full"); }, m(target, anchor) { insert(target, img, anchor); ctx[63](img); }, p(ctx2, dirty) { if (dirty[0] & /*avatarUpdated*/ 2048 && !src_url_equal(img.src, img_src_value = /*val*/ ctx2[78])) { attr(img, "src", img_src_value); } }, d(detaching) { if (detaching) { detach(img); } ctx[63](null); } }; } function create_pending_block(ctx) { return { c: noop, m: noop, p: noop, d: noop }; } function create_if_block_3(ctx) { let div; let progressradial; let div_transition; let current; progressradial = new ProgressRadial({ props: { width: "w-16", stroke: 32, meter: "stroke-primary-500", track: "stroke-primary-500/30", fill: "fill-primary-500", strokeLinecap: "butt", value: ( /*downloadProgress*/ ctx[15] ) } }); return { c() { div = element("div"); create_component(progressradial.$$.fragment); attr(div, "class", "!absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2"); }, m(target, anchor) { insert(target, div, anchor); mount_component(progressradial, div, null); current = true; }, p(ctx2, dirty) { const progressradial_changes = {}; if (dirty[0] & /*downloadProgress*/ 32768) progressradial_changes.value = /*downloadProgress*/ ctx2[15]; progressradial.$set(progressradial_changes); }, i(local) { if (current) return; transition_in(progressradial.$$.fragment, local); if (local) { add_render_callback(() => { if (!current) return; if (!div_transition) div_transition = create_bidirectional_transition(div, fade, { duration: 250 }, true); div_transition.run(1); }); } current = true; }, o(local) { transition_out(progressradial.$$.fragment, local); if (local) { if (!div_transition) div_transition = create_bidirectional_transition(div, fade, { duration: 250 }, false); div_transition.run(0); } current = false; }, d(detaching) { if (detaching) { detach(div); } destroy_component(progressradial); if (detaching && div_transition) div_transition.end(); } }; } function create_if_block_2(ctx) { let i; let i_transition; let current; let mounted; let dispose; return { c() { i = element("i"); attr(i, "class", "w-6 fill-slate-700 dark:fill-slate-200 mix-blend-hard-light mt-4"); }, m(target, anchor) { insert(target, i, anchor); i.innerHTML = downloadMultipleSvg; ctx[67](i); current = true; if (!mounted) { dispose = [ listen( i, "introstart", /*introstart_handler_3*/ ctx[68] ), listen( i, "outrostart", /*outrostart_handler_3*/ ctx[69] ) ]; mounted = true; } }, p: noop, i(local) { if (current) return; if (local) { add_render_callback(() => { if (!current) return; if (!i_transition) i_transition = create_bidirectional_transition(i, fade, { duration: 250 }, true); i_transition.run(1); }); } current = true; }, o(local) { if (local) { if (!i_transition) i_transition = create_bidirectional_transition(i, fade, { duration: 250 }, false); i_transition.run(0); } current = false; }, d(detaching) { if (detaching) { detach(i); } ctx[67](null); if (detaching && i_transition) i_transition.end(); mounted = false; run_all(dispose); } }; } function create_if_block_1$1(ctx) { let div; let span0; let t0; let t1; let hr; let t2; let span1; let t3; let div_transition; let current; let mounted; let dispose; return { c() { div = element("div"); span0 = element("span"); t0 = text( /*processed*/ ctx[2] ); t1 = space(); hr = element("hr"); t2 = space(); span1 = element("span"); t3 = text( /*$artworkCount*/ ctx[4] ); attr(span0, "class", "truncate max-w-full"); attr(hr, "class", "!border-t-1 my-[1px] self-stretch !border-surface-700 dark:!border-surface-200"); attr(span1, "class", "truncate max-w-full"); attr(div, "class", "flex flex-col justify-center items-center px-3 font-bold text-[12px] leading-[14px] overflow-hidden text-surface-700-200-token"); }, m(target, anchor) { insert(target, div, anchor); append(div, span0); append(span0, t0); append(div, t1); append(div, hr); append(div, t2); append(div, span1); append(span1, t3); ctx[64](div); current = true; if (!mounted) { dispose = [ listen( div, "introstart", /*introstart_handler_2*/ ctx[65] ), listen( div, "outrostart", /*outrostart_handler_2*/ ctx[66] ) ]; mounted = true; } }, p(ctx2, dirty) { if (!current || dirty[0] & /*processed*/ 4) set_data( t0, /*processed*/ ctx2[2] ); if (!current || dirty[0] & /*$artworkCount*/ 16) set_data( t3, /*$artworkCount*/ ctx2[4] ); }, i(local) { if (current) return; if (local) { add_render_callback(() => { if (!current) return; if (!div_transition) div_transition = create_bidirectional_transition(div, fade, { duration: 250 }, true); div_transition.run(1); }); } current = true; }, o(local) { if (local) { if (!div_transition) div_transition = create_bidirectional_transition(div, fade, { duration: 250 }, false); div_transition.run(0); } current = false; }, d(detaching) { if (detaching) { detach(div); } ctx[64](null); if (detaching && div_transition) div_transition.end(); mounted = false; run_all(dispose); } }; } function create_fragment$1(ctx) { let t_1; let if_block1_anchor; let current; let if_block0 = ( /*showDownloadMenu*/ ctx[13] && /*ifDownloaderCanShow*/ ctx[3] && create_if_block_5(ctx) ); let if_block1 = ( /*ifDownloaderCanShow*/ ctx[3] && create_if_block$1(ctx) ); return { c() { if (if_block0) if_block0.c(); t_1 = space(); if (if_block1) if_block1.c(); if_block1_anchor = empty(); }, m(target, anchor) { if (if_block0) if_block0.m(target, anchor); insert(target, t_1, anchor); if (if_block1) if_block1.m(target, anchor); insert(target, if_block1_anchor, anchor); current = true; }, p(ctx2, dirty) { if ( /*showDownloadMenu*/ ctx2[13] && /*ifDownloaderCanShow*/ ctx2[3] ) { if (if_block0) { if_block0.p(ctx2, dirty); if (dirty[0] & /*showDownloadMenu, ifDownloaderCanShow*/ 8200) { transition_in(if_block0, 1); } } else { if_block0 = create_if_block_5(ctx2); if_block0.c(); transition_in(if_block0, 1); if_block0.m(t_1.parentNode, t_1); } } else if (if_block0) { group_outros(); transition_out(if_block0, 1, 1, () => { if_block0 = null; }); check_outros(); } if ( /*ifDownloaderCanShow*/ ctx2[3] ) { if (if_block1) { if_block1.p(ctx2, dirty); if (dirty[0] & /*ifDownloaderCanShow*/ 8) { transition_in(if_block1, 1); } } else { if_block1 = create_if_block$1(ctx2); if_block1.c(); transition_in(if_block1, 1); if_block1.m(if_block1_anchor.parentNode, if_block1_anchor); } } else if (if_block1) { group_outros(); transition_out(if_block1, 1, 1, () => { if_block1 = null; }); check_outros(); } }, i(local) { if (current) return; transition_in(if_block0); transition_in(if_block1); current = true; }, o(local) { transition_out(if_block0); transition_out(if_block1); current = false; }, d(detaching) { if (detaching) { detach(t_1); detach(if_block1_anchor); } if (if_block0) if_block0.d(detaching); if (if_block1) if_block1.d(detaching); } }; } function beforeUnloadHandler(evt) { evt.preventDefault(); evt.returnValue = true; } function instance$1($$self, $$props, $$invalidate) { let ifDownloaderCanShow; let processed; let downloadProgress; let downloadResult; let $excluded; let $failed; let $successd; let $artworkCount; let $downloading; let $selectedFilters; let $downloadAllPages; let $pageStart; let $pageEnd; let $blacklistTag; let $whitelistTag; let $retryFailed; let $log; function initFilterStore() { Array.isArray($selectedFilters) || set_store_value(selectedFilters, $selectedFilters = downloaderConfig.filterOption.filters.filter((filter) => filter.checked).map((filter) => filter.id), $selectedFilters); } async function updateAvatarSrc(url2) { if (!downloaderConfig.avatar) return; if ($downloading) { updateAvatarAfterDownload = url2; return; } let src; if (typeof downloaderConfig.avatar === "string") { src = downloaderConfig.avatar; } else { if (url2 in avatarCache) { src = avatarCache[url2]; } else { src = await downloaderConfig.avatar(url2); avatarCache[url2] = src; } } if (!src || avatarEl && avatarEl.src === src) return; let imageLoaded; $$invalidate(11, avatarUpdated = new Promise((resolve) => { imageLoaded = resolve; })); const el = document.createElement("img"); el.src = src; el.onload = () => { imageLoaded(src); }; } function onUrlChange(url2) { logger.info("Navigating to ", url2); if (!downloaderConfig) return; const pageConfigs = downloaderConfig.pageMatch; for (let i = 0; i < pageConfigs.length; i++) { const matchPattern = pageConfigs[i].match; if (typeof matchPattern === "string") { if (url2.match(matchPattern)) { $$invalidate(1, pageConfig = pageConfigs[i]); updateAvatarSrc(url2); return; } } else if (typeof matchPattern === "function") { if (matchPattern(url2)) { $$invalidate(1, pageConfig = pageConfigs[i]); updateAvatarSrc(url2); return; } } else { if (matchPattern.test(url2)) { $$invalidate(1, pageConfig = pageConfigs[i]); updateAvatarSrc(url2); return; } } } $$invalidate(1, pageConfig = null); updateAvatarAfterDownload = ""; } function watchUrlChange() { if ("navigation" in window) { let prevUrl; let nextUrl; navigation.addEventListener("navigatesuccess", () => { prevUrl !== nextUrl && onUrlChange(nextUrl); }); navigation.addEventListener("navigate", (evt) => { prevUrl = location.href; nextUrl = evt.destination.url; }); } else { const rewrite = (type) => { const oriHistory = history[type]; return function(...args) { const currentUrl = location.href; const res = oriHistory.apply(this, args); const navigateUrl = location.href; currentUrl !== navigateUrl && onUrlChange(navigateUrl); return res; }; }; history.pushState = rewrite("pushState"); history.replaceState = rewrite("replaceState"); } } async function startDownload(id) { const { genPageId } = pageConfig; if (Array.isArray(genPageId)) { id && await batchDownload(id); } else { !id && await batchDownload(genPageId.id); } } let { downloaderConfig } = $$props; let pageConfig; const { selectedFilters, blacklistTag, whitelistTag, downloadAllPages, pageStart, pageEnd, retryFailed } = optionStore; component_subscribe($$self, selectedFilters, (value) => $$invalidate(16, $selectedFilters = value)); component_subscribe($$self, blacklistTag, (value) => $$invalidate(20, $blacklistTag = value)); component_subscribe($$self, whitelistTag, (value) => $$invalidate(21, $whitelistTag = value)); component_subscribe($$self, downloadAllPages, (value) => $$invalidate(17, $downloadAllPages = value)); component_subscribe($$self, pageStart, (value) => $$invalidate(18, $pageStart = value)); component_subscribe($$self, pageEnd, (value) => $$invalidate(19, $pageEnd = value)); component_subscribe($$self, retryFailed, (value) => $$invalidate(22, $retryFailed = value)); let startDownloadEl; let stopDownloadEl; let avatarEl; let avatarProgressEl; let avatarDownloadIcon; const avatarCache = {}; let avatarUpdated; let updateAvatarAfterDownload; let tabSet = 0; let showDownloadMenu = false; initFilterStore(); defineBatchDownload(downloaderConfig); const { artworkCount, successd, failed, excluded, downloading, log, batchDownload, abort } = useBatchDownload(); component_subscribe($$self, artworkCount, (value) => $$invalidate(4, $artworkCount = value)); component_subscribe($$self, successd, (value) => $$invalidate(41, $successd = value)); component_subscribe($$self, failed, (value) => $$invalidate(40, $failed = value)); component_subscribe($$self, excluded, (value) => $$invalidate(39, $excluded = value)); component_subscribe($$self, downloading, (value) => $$invalidate(5, $downloading = value)); component_subscribe($$self, log, (value) => $$invalidate(23, $log = value)); watchUrlChange(); onUrlChange(location.href); downloading.subscribe((val) => { if (val) { window.addEventListener("beforeunload", beforeUnloadHandler); } else { window.removeEventListener("beforeunload", beforeUnloadHandler); updateAvatarAfterDownload && pageConfig && updateAvatarSrc(updateAvatarAfterDownload); } }); const $$binding_groups = [[]]; function input_change_handler() { $selectedFilters = get_binding_group_value($$binding_groups[0], this.__value, this.checked); selectedFilters.set($selectedFilters); } function radioitem0_group_binding(value) { $downloadAllPages = value; downloadAllPages.set($downloadAllPages); } function radioitem1_group_binding(value) { $downloadAllPages = value; downloadAllPages.set($downloadAllPages); } function input0_input_handler() { $pageStart = to_number(this.value); pageStart.set($pageStart); } function input1_input_handler() { $pageEnd = to_number(this.value); pageEnd.set($pageEnd); } function inputchip0_value_binding(value) { $blacklistTag = value; blacklistTag.set($blacklistTag); } function inputchip1_value_binding(value) { $whitelistTag = value; whitelistTag.set($whitelistTag); } function slidetoggle_checked_binding(value) { $retryFailed = value; retryFailed.set($retryFailed); } function tab0_group_binding(value) { tabSet = value; $$invalidate(12, tabSet); } function tab1_group_binding(value) { tabSet = value; $$invalidate(12, tabSet); } function tab2_group_binding(value) { tabSet = value; $$invalidate(12, tabSet); } const click_handler = (id) => { startDownload(id); }; const click_handler_1 = () => { startDownload(); }; function div1_binding($$value) { binding_callbacks[$$value ? "unshift" : "push"](() => { startDownloadEl = $$value; $$invalidate(6, startDownloadEl); }); } const introstart_handler = () => ( // required when the transition reverses startDownloadEl.classList.remove("absolute") ); const outrostart_handler = () => startDownloadEl.classList.add("absolute"); const click_handler_2 = () => { abort(); }; function div2_binding($$value) { binding_callbacks[$$value ? "unshift" : "push"](() => { stopDownloadEl = $$value; $$invalidate(7, stopDownloadEl); }); } const introstart_handler_1 = () => stopDownloadEl.classList.remove("absolute"); const outrostart_handler_1 = () => stopDownloadEl.classList.add("absolute"); function img_binding($$value) { binding_callbacks[$$value ? "unshift" : "push"](() => { avatarEl = $$value; $$invalidate(8, avatarEl); }); } function div_binding($$value) { binding_callbacks[$$value ? "unshift" : "push"](() => { avatarProgressEl = $$value; $$invalidate(9, avatarProgressEl); }); } const introstart_handler_2 = () => avatarProgressEl.classList.remove("absolute"); const outrostart_handler_2 = () => avatarProgressEl.classList.add("absolute"); function i_binding($$value) { binding_callbacks[$$value ? "unshift" : "push"](() => { avatarDownloadIcon = $$value; $$invalidate(10, avatarDownloadIcon); }); } const introstart_handler_3 = () => avatarDownloadIcon.classList.remove("absolute"); const outrostart_handler_3 = () => avatarDownloadIcon.classList.add("absolute"); const click_handler_3 = () => { $$invalidate(13, showDownloadMenu = !showDownloadMenu); }; $$self.$$set = ($$props2) => { if ("downloaderConfig" in $$props2) $$invalidate(0, downloaderConfig = $$props2.downloaderConfig); }; $$self.$$.update = () => { if ($$self.$$.dirty[0] & /*$downloading, pageConfig*/ 34) { $$invalidate(3, ifDownloaderCanShow = $downloading || !!pageConfig); } if ($$self.$$.dirty[0] & /*ifDownloaderCanShow*/ 8) { { if (!ifDownloaderCanShow) $$invalidate(13, showDownloadMenu = false); } } if ($$self.$$.dirty[1] & /*$successd, $failed, $excluded*/ 1792) { $$invalidate(2, processed = $successd.length + $failed.length + $excluded.length); } if ($$self.$$.dirty[0] & /*$artworkCount, processed*/ 20) { $$invalidate(15, downloadProgress = $artworkCount ? processed / $artworkCount * 100 : void 0); } if ($$self.$$.dirty[0] & /*$downloading, $artworkCount*/ 48 | $$self.$$.dirty[1] & /*$successd, $failed, $excluded*/ 1792) { $$invalidate(14, downloadResult = !$downloading && $artworkCount ? `Completed: ${$successd.length}. Failed: ${$failed.length}. Excluded: ${$excluded.length}.` : ""); } }; return [ downloaderConfig, pageConfig, processed, ifDownloaderCanShow, $artworkCount, $downloading, startDownloadEl, stopDownloadEl, avatarEl, avatarProgressEl, avatarDownloadIcon, avatarUpdated, tabSet, showDownloadMenu, downloadResult, downloadProgress, $selectedFilters, $downloadAllPages, $pageStart, $pageEnd, $blacklistTag, $whitelistTag, $retryFailed, $log, startDownload, selectedFilters, blacklistTag, whitelistTag, downloadAllPages, pageStart, pageEnd, retryFailed, artworkCount, successd, failed, excluded, downloading, log, abort, $excluded, $failed, $successd, input_change_handler, $$binding_groups, radioitem0_group_binding, radioitem1_group_binding, input0_input_handler, input1_input_handler, inputchip0_value_binding, inputchip1_value_binding, slidetoggle_checked_binding, tab0_group_binding, tab1_group_binding, tab2_group_binding, click_handler, click_handler_1, div1_binding, introstart_handler, outrostart_handler, click_handler_2, div2_binding, introstart_handler_1, outrostart_handler_1, img_binding, div_binding, introstart_handler_2, outrostart_handler_2, i_binding, introstart_handler_3, outrostart_handler_3, click_handler_3 ]; } class Downloader extends SvelteComponent { constructor(options) { super(); init(this, options, instance$1, create_fragment$1, safe_not_equal, { downloaderConfig: 0 }, null, [-1, -1, -1]); } } const cog = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12,15.5A3.5,3.5 0 0,1 8.5,12A3.5,3.5 0 0,1 12,8.5A3.5,3.5 0 0,1 15.5,12A3.5,3.5 0 0,1 12,15.5M19.43,12.97C19.47,12.65 19.5,12.33 19.5,12C19.5,11.67 19.47,11.34 19.43,11L21.54,9.37C21.73,9.22 21.78,8.95 21.66,8.73L19.66,5.27C19.54,5.05 19.27,4.96 19.05,5.05L16.56,6.05C16.04,5.66 15.5,5.32 14.87,5.07L14.5,2.42C14.46,2.18 14.25,2 14,2H10C9.75,2 9.54,2.18 9.5,2.42L9.13,5.07C8.5,5.32 7.96,5.66 7.44,6.05L4.95,5.05C4.73,4.96 4.46,5.05 4.34,5.27L2.34,8.73C2.21,8.95 2.27,9.22 2.46,9.37L4.57,11C4.53,11.34 4.5,11.67 4.5,12C4.5,12.33 4.53,12.65 4.57,12.97L2.46,14.63C2.27,14.78 2.21,15.05 2.34,15.27L4.34,18.73C4.46,18.95 4.73,19.03 4.95,18.95L7.44,17.94C7.96,18.34 8.5,18.68 9.13,18.93L9.5,21.58C9.54,21.82 9.75,22 10,22H14C14.25,22 14.46,21.82 14.5,21.58L14.87,18.93C15.5,18.67 16.04,18.34 16.56,17.94L19.05,18.95C19.27,19.03 19.54,18.95 19.66,18.73L21.66,15.27C21.78,15.05 21.73,14.78 21.54,14.63L19.43,12.97Z" /></svg>`; function create_if_block_1(ctx) { let downloader2; let current; downloader2 = new Downloader({ props: { downloaderConfig: ( /*downloaderConfig*/ ctx[0] ) } }); return { c() { create_component(downloader2.$$.fragment); }, m(target, anchor) { mount_component(downloader2, target, anchor); current = true; }, p(ctx2, dirty) { const downloader_changes = {}; if (dirty & /*downloaderConfig*/ 1) downloader_changes.downloaderConfig = /*downloaderConfig*/ ctx2[0]; downloader2.$set(downloader_changes); }, i(local) { if (current) return; transition_in(downloader2.$$.fragment, local); current = true; }, o(local) { transition_out(downloader2.$$.fragment, local); current = false; }, d(detaching) { destroy_component(downloader2, detaching); } }; } function create_if_block(ctx) { let button; let i; let t0; let span; let mounted; let dispose; return { c() { button = element("button"); i = element("i"); t0 = space(); span = element("span"); span.textContent = `${t("button.setting")}`; attr(i, "class", "text-sm w-6 fill-current"); attr(span, "class", "text-sm"); attr(button, "type", "button"); attr(button, "class", "btn btn-sm variant-filled fixed bottom-24 rounded-none rounded-s-full opacity-40 hover:opacity-100 right-0 translate-x-[calc(100%-44px)] hover:translate-x-0 delay-100"); }, m(target, anchor) { insert(target, button, anchor); append(button, i); i.innerHTML = cog; append(button, t0); append(button, span); if (!mounted) { dispose = listen( button, "click", /*click_handler*/ ctx[14] ); mounted = true; } }, p: noop, d(detaching) { if (detaching) { detach(button); } mounted = false; dispose(); } }; } function create_fragment(ctx) { let div; let modal; let t0; let t1; let div_class_value; let current; let mounted; let dispose; modal = new Modal({ props: { components: ( /*components*/ ctx[6] ), class: "!p-0" } }); let if_block0 = ( /*downloaderConfig*/ ctx[0] && create_if_block_1(ctx) ); let if_block1 = ( /*$store*/ ctx[3].showPopupButton && create_if_block(ctx) ); return { c() { div = element("div"); create_component(modal.$$.fragment); t0 = space(); if (if_block0) if_block0.c(); t1 = space(); if (if_block1) if_block1.c(); attr(div, "class", div_class_value = "contents " + /*darkMode*/ ctx[2]); attr(div, "data-theme", "skeleton"); }, m(target, anchor) { insert(target, div, anchor); mount_component(modal, div, null); append(div, t0); if (if_block0) if_block0.m(div, null); append(div, t1); if (if_block1) if_block1.m(div, null); ctx[15](div); current = true; if (!mounted) { dispose = [ listen( window, "keydown", /*handleKeydown*/ ctx[8], true ), listen(div, "keydown", stop_propagation( /*keydown_handler*/ ctx[13] )), listen(div, "mousedown", preventBackDropClick, true), listen(div, "mouseup", preventBackDropClick, true) ]; mounted = true; } }, p(ctx2, [dirty]) { if ( /*downloaderConfig*/ ctx2[0] ) { if (if_block0) { if_block0.p(ctx2, dirty); if (dirty & /*downloaderConfig*/ 1) { transition_in(if_block0, 1); } } else { if_block0 = create_if_block_1(ctx2); if_block0.c(); transition_in(if_block0, 1); if_block0.m(div, t1); } } else if (if_block0) { group_outros(); transition_out(if_block0, 1, 1, () => { if_block0 = null; }); check_outros(); } if ( /*$store*/ ctx2[3].showPopupButton ) { if (if_block1) { if_block1.p(ctx2, dirty); } else { if_block1 = create_if_block(ctx2); if_block1.c(); if_block1.m(div, null); } } else if (if_block1) { if_block1.d(1); if_block1 = null; } if (!current || dirty & /*darkMode*/ 4 && div_class_value !== (div_class_value = "contents " + /*darkMode*/ ctx2[2])) { attr(div, "class", div_class_value); } }, i(local) { if (current) return; transition_in(modal.$$.fragment, local); transition_in(if_block0); current = true; }, o(local) { transition_out(modal.$$.fragment, local); transition_out(if_block0); current = false; }, d(detaching) { if (detaching) { detach(div); } destroy_component(modal); if (if_block0) if_block0.d(); if (if_block1) if_block1.d(); ctx[15](null); mounted = false; run_all(dispose); } }; } function preventBackDropClick(event) { if (!(event.target instanceof Element)) return; const classList = event.target.classList; if (classList.contains("modal-backdrop") || classList.contains("modal-transition")) { event.stopPropagation(); } } function instance($$self, $$props, $$invalidate) { let darkMode; let $store; initializeStores(); const store = initConfigStore(); component_subscribe($$self, store, (value) => $$invalidate(3, $store = value)); const modalStore = getModalStore(); const components = { changelog: { ref: Changelog }, setting: { ref: Config } }; const changelogModal = { type: "component", component: "changelog" }; const settingModal = { type: "component", component: "setting" }; let { dark = false } = $$props; let { updated = false } = $$props; let { downloaderConfig } = $$props; function showChangelog() { modalStore.trigger(changelogModal); } function showSetting() { modalStore.trigger(settingModal); } let root; onMount(async () => { const shadow = root.getRootNode(); addStyleToShadow(shadow); shadow.host.setAttribute("style", "position:fixed; z-index:99999"); if (updated) { showChangelog(); } }); function modalExist() { return !!(root == null ? void 0 : root.querySelector(".modal-backdrop")); } function handleKeydown(event) { if (!modalExist()) return; if (event.code === "Escape") { modalStore.close(); return; } else if (event.ctrlKey || event.shiftKey) { return; } if (!event.composedPath().includes(root)) { event.stopImmediatePropagation(); event.preventDefault(); } } function keydown_handler(event) { bubble.call(this, $$self, event); } const click_handler = () => modalStore.trigger(settingModal); function div_binding($$value) { binding_callbacks[$$value ? "unshift" : "push"](() => { root = $$value; $$invalidate(1, root); }); } $$self.$$set = ($$props2) => { if ("dark" in $$props2) $$invalidate(9, dark = $$props2.dark); if ("updated" in $$props2) $$invalidate(10, updated = $$props2.updated); if ("downloaderConfig" in $$props2) $$invalidate(0, downloaderConfig = $$props2.downloaderConfig); }; $$self.$$.update = () => { if ($$self.$$.dirty & /*dark*/ 512) { $$invalidate(2, darkMode = dark ? "dark" : ""); } }; return [ downloaderConfig, root, darkMode, $store, store, modalStore, components, settingModal, handleKeydown, dark, updated, showChangelog, showSetting, keydown_handler, click_handler, div_binding ]; } class App extends SvelteComponent { constructor(options) { super(); init(this, options, instance, create_fragment, safe_not_equal, { dark: 9, updated: 10, downloaderConfig: 0, showChangelog: 11, showSetting: 12 }); } get showChangelog() { return this.$$.ctx[11]; } get showSetting() { return this.$$.ctx[12]; } } const PdlApp = create_custom_element( App, { dark: { type: "Boolean" }, updated: { type: "Boolean" }, downloaderConfig: {} }, [], ["showChangelog", "showSetting"], true, (customElementConstructor) => { return class extends customElementConstructor { constructor(props) { super(); this.updated = props.updated ?? false; this.downloaderConfig = props.downloaderConfig; } }; } ); customElements.define("pdl-app", PdlApp); class SiteInject { constructor() { __publicField(this, "modal"); __publicField(this, "config"); this.config = loadConfig(this.getCustomConfig() || void 0); this.inject(); this.observeColorScheme(); this.runScheduledTask(); } static get hostname() { throw new Error("`hostname` should be overwritten by a subclass."); } inject() { this.injectApp(); this.injectStyle(); _GM_registerMenuCommand( t("button.setting"), () => { var _a; if ((_a = this.modal.shadowRoot) == null ? void 0 : _a.querySelector(".modal")) { return; } this.modal.showSetting(); }, "s" ); } injectApp() { const updated = this.config.get("showMsg"); updated && this.config.set("showMsg", false); const downloaderConfig = this.getBatchDownloadConfig(); const modal = new PdlApp({ updated, downloaderConfig }); document.body.append(modal); this.modal = modal; } injectStyle() { [ "pdl-btn-self-bookmark-left", "pdl-btn-self-bookmark-top", "pdl-btn-left", "pdl-btn-top" ].forEach((key) => { let val; if ((val = this.config.get(key)) !== void 0) { document.documentElement.style.setProperty("--" + key, val); } }); } runScheduledTask() { useHistoryBackup().scheduleBackup(); } setAppDarkMode() { this.modal.setAttribute("dark", ""); } setAppLightMode() { this.modal.removeAttribute("dark"); } } const wrapperStyle = ".button-wrapper{position:absolute;right:8px;top:0;bottom:0;margin-top:40px;z-index:1}.button-wrapper.rule34{bottom:calc(1em + 22px)}.button-wrapper.yande{right:calc(5em + 8px)}"; class ArtworkButton extends HTMLElement { constructor(props) { super(); __publicField(this, "props"); this.props = props; this.render(); } render() { const shadowRoot = this.attachShadow({ mode: "open" }); const btnProps = { ...this.props }; shadowRoot.innerHTML = `<style>${wrapperStyle}</style><div class="button-wrapper${btnProps.site ? " " + btnProps.site : ""}"></div>`; delete btnProps.site; const thumbnailButton = new ThumbnailButton({ type: ThumbnailBtnType.Gallery, ...btnProps }); const wrapper = shadowRoot.querySelector(".button-wrapper"); wrapper.appendChild(thumbnailButton); } } customElements.define("pdl-artwork-button", ArtworkButton); class Rule34 extends SiteInject { static get hostname() { return "rule34.xxx"; } inject() { super.inject(); this.pageAction(); } createThumbnailBtn() { const btnContainers = document.querySelectorAll( ".thumb:not(.blacklisted-image) > a:first-child" ); if (!btnContainers.length) return; btnContainers.forEach((el) => { el.style.display = "inline-block"; el.style.position = "relative"; const imgEl = el.querySelector("img"); imgEl.style.boxSizing = "border-box"; let aspectRatio = imgEl.naturalHeight / imgEl.naturalWidth; aspectRatio > 1 && (el.style.height = "inherit"); imgEl.onload = () => { aspectRatio = imgEl.naturalHeight / imgEl.naturalWidth; aspectRatio > 1 && (el.style.height = "inherit"); }; const idMathch = new RegExp("(?<=&id=)\\d+").exec(el.href); if (!idMathch) return; const id = idMathch[0]; el.appendChild( new ThumbnailButton({ id, onClick: downloadArtwork$3 }) ); }); } createArtworkBtn(id) { const btnContainer = document.querySelector("div.flexi > div"); btnContainer.style.position = "relative"; btnContainer.appendChild( new ArtworkButton({ id, site: "rule34", onClick: downloadArtwork$3 }) ); } pageAction() { const query = location.search; if (!query) return; const searchParams = new URLSearchParams(query); const page = searchParams.get("page"); const s = searchParams.get("s"); if (page === "post" && s === "view") { if (!document.querySelector("#image, #gelcomVideoPlayer")) return; const id = searchParams.get("id"); this.createArtworkBtn(id); } else { this.createThumbnailBtn(); } } getCustomConfig() { return { folderPattern: "rule34/{artist}", filenamePattern: "{id}_{artist}_{character}" }; } observeColorScheme() { const query = window.matchMedia("(prefers-color-scheme: dark)"); if (query.matches) { this.setAppDarkMode(); } query.addEventListener("change", (e) => { e.matches ? this.setAppDarkMode() : this.setAppLightMode(); }); } getBatchDownloadConfig() { return void 0; } } async function addBookmark$1(id) { var _a; try { const token = (_a = document.head.querySelector('meta[name="csrf-token"]')) == null ? void 0 : _a.content; if (!token) throw new Error("Can not get csrf-token"); const res = await fetch("/favorites?post_id=" + id, { method: "POST", headers: { "X-Csrf-Token": token } }); if (!res.ok) throw new Error(res.status + " " + res.statusText); const galleryMatch = new RegExp("(?<=^\\/posts\\/)\\d+").exec(location.pathname); if (galleryMatch && id !== galleryMatch[0]) { _unsafeWindow.Danbooru.Utility.notice("You have favorited " + id); } else { const script = await res.text(); evalScript(script); } } catch (error) { logger.error(error); } } const danbooruParser = { async getDoc(url2) { const res = await fetch(url2); if (!res.ok) throw new RequestError(res.url, res.status); const html = await res.text(); return new DOMParser().parseFromString(html, "text/html"); }, async parse(id) { var _a, _b, _c; const doc = await this.getDoc("/posts/" + id); const src = (_a = doc.querySelector("a[download]")) == null ? void 0 : _a.href; if (!src) throw new Error("Can not get media src"); const ogImageMeta = doc.querySelector('meta[property="og:image"]'); const mediaSrc = ogImageMeta.getAttribute("content"); const title = mediaSrc.slice(mediaSrc.lastIndexOf("/") + 1).split(".")[0]; const ogTypeMeta = doc.querySelector('meta[property="og:video:type"]') || doc.querySelector('meta[property="og:image:type"]'); const mimeType = ogTypeMeta.getAttribute("content"); const extendName = mimeType.slice(mimeType.lastIndexOf("/") + 1); const artists = []; const characters = []; const tags = []; const tagLists = doc.querySelectorAll( 'section#tag-list ul[class*="-tag-list"]' ); if (tagLists.length) { tagLists.forEach((ul) => { const tagTypeMatch = /[a-zA-Z]+(?=-tag-list)/.exec(ul.className); if (!tagTypeMatch) throw new Error("Unknown tag: " + ul.className); const tagType = tagTypeMatch[0]; const liEls = ul.children; let tagRef; if (tagType === "artist") { tagRef = artists; } else if (tagType === "character") { tagRef = characters; } for (let i = 0; i < liEls.length; i++) { const tag = liEls[i].getAttribute("data-tag-name"); if (!tag) continue; tagRef && tagRef.push(tag); tags.push(tagType + ":" + tag); } }); } const postDate = ((_b = doc.querySelector("time")) == null ? void 0 : _b.getAttribute("datetime")) ?? ""; const source = (_c = doc.querySelector("li#post-info-source > a")) == null ? void 0 : _c.href; if (source) tags.push("source:" + source); let comment = ""; const commentEl = doc.querySelector("#original-artist-commentary"); commentEl && (comment = getElementText(commentEl)); return { id, src, extendName, artist: artists.join(",") || "UnknownArtist", character: characters.join(",") || "UnknownCharacter", title, comment, tags, createDate: postDate }; }, async getPoolPostCount(poolId) { const doc = await this.getDoc(`/pools/${poolId}`); const nextEl = doc.querySelector("a.paginator-next"); if (nextEl) { const lastPageEl = nextEl.previousElementSibling; const poolPageCount = Number(lastPageEl.textContent); const lastPageDoc = await this.getDoc(lastPageEl.href); const postPerPage = Number(lastPageDoc.body.getAttribute("data-current-user-per-page")); const lastPagePostCount = lastPageDoc.querySelectorAll( ".posts-container article" ).length; return (poolPageCount - 1) * postPerPage + lastPagePostCount; } else { const imageContainers = doc.querySelectorAll(".posts-container article"); return imageContainers.length; } }, async *genIdByPool(poolId, filter) { let page = 0; let nextUrl; do { ++page > 1 && await sleep(1e3); const doc = await this.getDoc(`/pools/${poolId}?page=${page}`); const nextEl = doc.querySelector("a.paginator-next"); nextUrl = (nextEl == null ? void 0 : nextEl.getAttribute("href")) ?? ""; const imageContainers = doc.querySelectorAll(".posts-container article"); const ids = Array.from(imageContainers).map((el) => el.getAttribute("data-id")); for (let i = 0; i < ids.length; i++) { const id = ids[i]; const isValid = await (filter == null ? void 0 : filter(id)) ?? true; if (isValid) { yield id; i !== id.length - 1 && await sleep(1e3); } } } while (nextUrl); } }; function artworkProgressFactory(btn2) { if (!btn2) return; return function onArtworkProgress(progress) { btn2.setProgress(progress); }; } class DanbooruDownloadConfig extends DownloadConfigBuilder { constructor(meta) { super(meta); this.meta = meta; } getDownloadConfig(btn2) { return { taskId: Math.random().toString(36).slice(2), src: this.meta.src, path: this.buildFilePath(), source: this.meta, timeout: this.isImage() ? 6e4 : void 0, onProgress: artworkProgressFactory(btn2) }; } buildFilePath() { const path = super.buildFilePath(); return path.replaceAll("{character}", this.normalizeString(this.meta.character)); } } async function downloadArtwork$2(btn2) { downloader.dirHandleCheck(); const id = btn2.dataset.id; const mediaMeta = await danbooruParser.parse(id); const downloadConfigs = new DanbooruDownloadConfig(mediaMeta).getDownloadConfig(btn2); config.get("addBookmark") && addBookmark$1(id); await downloader.download(downloadConfigs); const { tags, artist, title, comment } = mediaMeta; const historyData = { pid: Number(id), user: artist, title, comment, tags }; historyDb.add(historyData); } async function downloadPoolArtwork(btn2) { downloader.dirHandleCheck(); const poolId = btn2.dataset.id; const promises = []; const postCount = await danbooruParser.getPoolPostCount(poolId); let completed = 0; const filter = async (id) => !await historyDb.has(id); const idGen = danbooruParser.genIdByPool(poolId, filter); for await (const id of idGen) { const mediaMeta = await danbooruParser.parse(id); const downloadConfigs = new DanbooruDownloadConfig(mediaMeta).getDownloadConfig(); const p = downloader.download(downloadConfigs).then(() => { completed++; btn2.setProgress(completed / postCount * 100); }).then(() => { const { tags, artist, title } = mediaMeta; const historyData = { pid: Number(id), user: artist, title, tags }; historyDb.add(historyData); }); promises.push(p); } const results = await Promise.allSettled(promises); const rejectedTasks = results.filter( (result) => result.status === "rejected" ); if (rejectedTasks.length) { rejectedTasks.length > 1 && logger.error(rejectedTasks); throw rejectedTasks[0].reason; } } class Danbooru extends SiteInject { static get hostname() { return "danbooru.donmai.us"; } inject() { super.inject(); this.pageAction(); } createThumbnailBtn() { const btnContainers = document.querySelectorAll( "article a.post-preview-link" ); if (!btnContainers.length) return; btnContainers.forEach((el) => { var _a; const id = (_a = new RegExp("(?<=\\/posts\\/)\\d+").exec(el.href)) == null ? void 0 : _a[0]; if (!id) return; const btn2 = new ThumbnailButton({ id, onClick: downloadArtwork$2 }); el.appendChild(btn2); }); } createArtworkBtn(id) { const btnContainer = document.querySelector("section.image-container"); btnContainer.appendChild( new ArtworkButton({ id, onClick: downloadArtwork$2 }) ); } createPoolThumbnailBtn() { const btnContainers = document.querySelectorAll( "article a.post-preview-link" ); if (!btnContainers.length) return; btnContainers.forEach((el) => { var _a; const poolId = (_a = new RegExp("(?<=\\/pools\\/)\\d+").exec(el.href)) == null ? void 0 : _a[0]; if (!poolId) return; const btn2 = new ThumbnailButton({ id: poolId, type: ThumbnailBtnType.DanbooruPool, onClick: downloadPoolArtwork }); el.appendChild(btn2); }); } pageAction() { const path = location.pathname; if (/^\/posts\/\d+/.test(path)) { const imageContainer = document.querySelector( "section.image-container:not(.blacklisted-active)" ); if (!imageContainer) return; const id = imageContainer.getAttribute("data-id"); this.createArtworkBtn(id); this.createThumbnailBtn(); } else if (/^\/pools\/gallery/.test(path)) { this.createPoolThumbnailBtn(); } else { this.createThumbnailBtn(); } } observeColorScheme() { const query = window.matchMedia("(prefers-color-scheme: dark)"); let uaPreferDark = query.matches; const siteSetting = document.body.getAttribute("data-current-user-theme"); const sitePreferDark = siteSetting === "dark"; if (sitePreferDark || siteSetting === "auto" && uaPreferDark) { this.setAppDarkMode(); } if (siteSetting === "auto") { query.addEventListener("change", (e) => { uaPreferDark = e.matches; uaPreferDark ? this.setAppDarkMode() : this.setAppLightMode(); }); } } getCustomConfig() { return { folderPattern: "danbooru/{artist}", filenamePattern: "{id}_{artist}_{character}" }; } getBatchDownloadConfig() { return void 0; } } const regexp = { preloadData: /"meta-preload-data" content='(.*?)'>/, globalData: /"meta-global-data" content='(.*?)'>/, artworksPage: /artworks\/(\d+)$/, userPage: /\/users\/(\d+)$|\/users\/(\d+)\/(?!following|mypixiv|followers)/, bookmarkPage: /users\/(\d+)\/bookmarks\/artworks/, userPageTags: new RegExp("(?<=users\\/)([0-9]+)\\/(artworks|illustrations|manga|bookmarks(?=\\/artworks))(?:\\/artworks)?\\/?([^?]*)"), searchPage: /\/tags\/.*\/(artworks|illustrations|manga)/, activityHref: /illust_id=(\d+)/, originSrcPageNum: new RegExp("(?<=_p)\\d+"), followLatest: /\/bookmark_new_illust(?:_r18)?\.php/, historyPage: /\/history\.php/, historyThumbnailsId: /\d+(?=_)/ }; function getSelfId() { var _a, _b; return ((_b = (_a = _unsafeWindow.dataLayer) == null ? void 0 : _a[0]) == null ? void 0 : _b.user_id) ?? ""; } function getIllustId(node) { const isLinkToArtworksPage = regexp.artworksPage.exec(node.getAttribute("href") || ""); if (isLinkToArtworksPage) { if (node.getAttribute("data-gtm-value") || [ "gtm-illust-recommend-node-node", "gtm-discover-user-recommend-node", "work", "_history-item", "_history-related-item" ].some((className) => node.classList.contains(className))) { return isLinkToArtworksPage[1]; } } else if (node instanceof HTMLSpanElement && node.className.includes("_history-item")) { const img = node.querySelector("img"); if (!img) return ""; const matchPid = regexp.historyThumbnailsId.exec(img.src); if (matchPid) return matchPid[0]; } else { const isActivityThumb = regexp.activityHref.exec(node.getAttribute("href") || ""); if (isActivityThumb && node.classList.contains("work")) { return isActivityThumb[1]; } } return ""; } var IllustType = /* @__PURE__ */ ((IllustType2) => { IllustType2[IllustType2["illusts"] = 0] = "illusts"; IllustType2[IllustType2["manga"] = 1] = "manga"; IllustType2[IllustType2["ugoira"] = 2] = "ugoira"; return IllustType2; })(IllustType || {}); var BookmarkRestrict = /* @__PURE__ */ ((BookmarkRestrict2) => { BookmarkRestrict2[BookmarkRestrict2["public"] = 0] = "public"; BookmarkRestrict2[BookmarkRestrict2["private"] = 1] = "private"; return BookmarkRestrict2; })(BookmarkRestrict || {}); function createService() { async function _requestJson(url2, init2) { logger.info("Fetch url:", url2); const res = await fetch(url2, init2); if (!res.ok) throw new RequestError(res.url, res.status); const data = await res.json(); if (data.error) throw new JsonDataError(data.message); return data.body; } return { async getJson(url2) { return await _requestJson(url2); }, async getArtworkHtml(illustId) { logger.info("Fetch illust:", illustId); const params = "?lang=" + config.get("tagLang"); const res = await fetch("https://www.pixiv.net/artworks/" + illustId + params); if (!res.ok) throw new RequestError(res.url, res.status); return await res.text(); }, getArtworkDetail(illustId) { logger.info("Fetch illust:", illustId); const params = "?lang=" + config.get("tagLang"); return _requestJson("/ajax/illust/" + illustId + params); }, addBookmark(illustId, token, tags = [], restrict = BookmarkRestrict.public) { return _requestJson("/ajax/illusts/bookmarks/add", { method: "POST", headers: { accept: "application/json", "content-type": "application/json; charset=utf-8", "x-csrf-token": token }, body: JSON.stringify({ illust_id: illustId, restrict, comment: "", tags }) }); }, getFollowLatestWorks(page, mode = "all") { return _requestJson( `/ajax/follow_latest/illust?p=${page}&mode=${mode}&lang=jp` ); }, getUserAllProfile(userId) { return _requestJson("/ajax/user/" + userId + "/profile/all"); }, getUgoiraMeta(illustId) { return _requestJson("/ajax/illust/" + illustId + "/ugoira_meta"); }, getUserData(userId) { return _requestJson("/ajax/user/" + userId); } }; } const api = createService(); function addBookmark(btn2, illustId, token, tags) { if (!config.get("addBookmark")) return; api.addBookmark( illustId, token, config.get("addBookmarkWithTags") ? tags : [], config.get("privateR18") && tags.includes("R-18") ? BookmarkRestrict.private : BookmarkRestrict.public ).then(() => { const bookmarkBtnRef = findBookmarkBtn(btn2); if (!bookmarkBtnRef) return; switch (bookmarkBtnRef.kind) { case "main": { const pathBorder = bookmarkBtnRef.button.querySelector("svg g path"); pathBorder && (pathBorder.style.color = "rgb(255, 64, 96)"); break; } case "sub": { const pathBorder = bookmarkBtnRef.button.querySelector("path"); pathBorder && (pathBorder.style.color = "rgb(255, 64, 96)"); break; } case "rank": { bookmarkBtnRef.button.style.backgroundColor = "rgb(255, 64, 96)"; break; } } }).catch((reason) => { logger.error(reason.message); }); } function findBookmarkBtn(btn2) { var _a, _b, _c, _d, _e; const bookmarkBtnRef = {}; if (!btn2.dataset.type) { const favBtn = (_b = (_a = btn2.parentElement) == null ? void 0 : _a.nextElementSibling) == null ? void 0 : _b.querySelector( 'button[type="button"]' ); if (favBtn) { bookmarkBtnRef.kind = "sub"; bookmarkBtnRef.button = favBtn; } else { const favBtn2 = (_c = btn2.parentElement) == null ? void 0 : _c.querySelector("div._one-click-bookmark"); if (favBtn2) { bookmarkBtnRef.kind = "rank"; bookmarkBtnRef.button = favBtn2; } } } else if (btn2.dataset.type === ThumbnailBtnType.PixivToolbar) { const favBtn = (_e = (_d = btn2.parentElement) == null ? void 0 : _d.parentElement) == null ? void 0 : _e.querySelector( "button.gtm-main-bookmark" ); if (favBtn) { bookmarkBtnRef.kind = "main"; bookmarkBtnRef.button = favBtn; } } else { return logger.warn(new Error("Can not find bookmark button.")); } return bookmarkBtnRef; } const pixivParser = { async parse(illustId, ajax) { let illustData; let token; if (ajax) { illustData = await api.getArtworkDetail(illustId); token = ""; } else { const htmlText = await api.getArtworkHtml(illustId); const preloadDataText = htmlText.match(regexp.preloadData); if (!preloadDataText) throw new Error("Fail to parse preload data: " + illustId); const globalDataText = htmlText.match(regexp.globalData); if (!globalDataText) throw new Error("Fail to parse global data: " + illustId); const preloadData = JSON.parse(preloadDataText[1]); const globalData = JSON.parse(globalDataText[1]); illustData = preloadData.illust[illustId]; token = globalData.token; } const { illustType, userName, userId, illustTitle, illustComment, tags, pageCount, createDate, urls, bookmarkData } = illustData; const tagsArr = []; const tagsTranslatedArr = []; tags.tags.forEach((tagData) => { var _a; tagsArr.push(tagData.tag); tagsTranslatedArr.push(((_a = tagData.translation) == null ? void 0 : _a.en) || tagData.tag); }); const unescapeComment = illustComment.replaceAll(/<|&lt;/g, "<").replaceAll(/>|&gt;/g, ">"); const p = document.createElement("p"); p.innerHTML = unescapeComment; const comment = getElementText(p); const meta = { id: illustId, src: urls.original, extendName: urls.original.slice(-3), artist: userName, title: illustTitle, tags: tagsArr, tagsTranslated: tagsTranslatedArr, userId, pageCount, comment, bookmarkData, createDate, token }; if (illustType === IllustType.ugoira) { return { ...meta, illustType, ugoiraMeta: await api.getUgoiraMeta(illustId) }; } else { return { ...meta, illustType }; } }, async *illustMangaGenerator(pageRange, checkValidity, userId) { const ARTWORKS_PER_PAGE = 48; const profile = await api.getUserAllProfile(userId); let ids = []; typeof profile.illusts === "object" && ids.push(...Object.keys(profile.illusts)); typeof profile.manga === "object" && ids.push(...Object.keys(profile.manga)); if (!ids.length) throw new Error(`User ${userId} has no illusts or mangas.`); ids = ids.sort((a, b) => Number(b) - Number(a)); let sliceStart; let sliceEnd; const [startPage = null, endPage = null] = pageRange ?? []; let page = startPage ?? 1; startPage === null ? sliceStart = 0 : sliceStart = (startPage - 1) * ARTWORKS_PER_PAGE; endPage === null ? sliceEnd = ids.length : sliceEnd = endPage * ARTWORKS_PER_PAGE; const selectedIds = ids.slice(sliceStart, sliceEnd); if (!selectedIds.length) throw new RangeError(`Page ${page} exceeds the limit.`); const baseUrl = `https://www.pixiv.net/ajax/user/${userId}/profile/illusts?`; const total = selectedIds.length; do { const chunk = selectedIds.splice(0, ARTWORKS_PER_PAGE); const queryStr = chunk.map((id) => "ids[]=" + id).join("&") + `&work_category=illustManga&is_first_page=0&lang=ja`; const data = await api.getJson(baseUrl + queryStr); const workDatas = Object.values(data.works).sort((a, b) => Number(b.id) - Number(a.id)); const avaliable = []; const invalid = []; const unavaliable = []; for (let i = 0; i < workDatas.length; i++) { const work = workDatas[i]; const { id, isMasked } = work; if (isMasked) { unavaliable.push(String(id)); continue; } const isValid = await checkValidity(work); isValid ? avaliable.push(id) : invalid.push(id); } yield { total, page, avaliable, invalid, unavaliable }; page++; } while (selectedIds.length > 0); }, async *chunkGenerator(pageRange, checkValidity, userId, category, tag, bookmarkRest = "show") { const ARTWORKS_PER_PAGE = 48; const [startPage = null, endPage = null] = pageRange ?? []; if (!userId) throw new Error('Require argument "userId".'); let offset; let offsetEnd; let total; let page = startPage ?? 1; startPage === null ? offset = 0 : offset = (startPage - 1) * ARTWORKS_PER_PAGE; do { let requestUrl; if (category === "bookmarks") { requestUrl = `/ajax/user/${userId}/illusts/bookmarks?tag=${tag}&offset=${offset}&limit=${ARTWORKS_PER_PAGE}&rest=${bookmarkRest}&lang=ja`; } else { requestUrl = `/ajax/user/${userId}/${category}/tag?tag=${tag}&offset=${offset}&limit=${ARTWORKS_PER_PAGE}&lang=ja`; } const userPageData = await api.getJson(requestUrl); const { works, total: totalArtwork } = userPageData; if (totalArtwork === 0) throw new Error(`User ${userId} has no ${category} tagged with ${tag}.`); if (!offsetEnd) { endPage === null ? offsetEnd = totalArtwork : offsetEnd = endPage * ARTWORKS_PER_PAGE > totalArtwork ? totalArtwork : endPage * ARTWORKS_PER_PAGE; if (offsetEnd <= offset) throw new RangeError(`Page ${page} exceeds the limit.`); total = offsetEnd - offset; } const avaliable = []; const invalid = []; const unavaliable = []; for (let i = 0; i < works.length; i++) { const work = works[i]; const { id, isMasked } = work; if (isMasked) { unavaliable.push(String(id)); continue; } const isValid = await checkValidity(work); isValid ? avaliable.push(id) : invalid.push(id); } yield { total, page, avaliable, invalid, unavaliable }; page++; } while ((offset += ARTWORKS_PER_PAGE) < offsetEnd); }, async *bookmarkGenerator(pageRange, checkValidity, userId, bookmarkRest = "show", tag = "") { yield* this.chunkGenerator(pageRange, checkValidity, userId, "bookmarks", tag, bookmarkRest); }, async *taggedArtworkGenerator(pageRange, checkValidity, userId, category, tag, bookmarkRest = "show") { if (category === "bookmarks") { yield* this.bookmarkGenerator(pageRange, checkValidity, userId, bookmarkRest, tag); } else { yield* this.chunkGenerator(pageRange, checkValidity, userId, category, tag); } }, async *followLatestGenerator(pageRange, checkValidity, mode = "all") { const PAGE_LIMIT = 34; const ARTWORKS_PER_PAGE = 60; let [startPage = null, endPage = null] = pageRange ?? []; startPage === null && (startPage = 1); (endPage === null || endPage > PAGE_LIMIT) && (endPage = PAGE_LIMIT); if (startPage > PAGE_LIMIT) throw new RangeError(`Page ${startPage} exceeds the limit.`); let earliestId; let total; let cache; let page = startPage; function findEarliestId(ids2) { return Math.min(...ids2); } async function* yieldData(data2, page2) { const avaliable = []; const invalid = []; const unavaliable = []; const { illust } = data2.thumbnails; for (let i = 0; i < illust.length; i++) { const work = illust[i]; const { id, isMasked } = work; if (isMasked) { unavaliable.push(String(id)); continue; } const isValid = await checkValidity(work); isValid ? avaliable.push(id) : invalid.push(id); } const { ids: ids2 } = data2.page; if (ids2.length !== illust.length) { const idDiff = ids2.filter((id) => !illust.some((item) => +item.id === id)); unavaliable.push(...idDiff.map((id) => String(id))); } yield { total, page: page2, avaliable, invalid, unavaliable }; } const data = await api.getFollowLatestWorks(page, mode); const ids = data.page.ids; total = ids.length; earliestId = findEarliestId(ids); if (endPage === startPage) { yield* yieldData(data, startPage); return; } if (total === ARTWORKS_PER_PAGE) { const secondPageData = await api.getFollowLatestWorks(++page, mode); const secondIds = secondPageData.page.ids; const secondPageEarliestId = findEarliestId(secondIds); if (secondPageEarliestId < earliestId) { earliestId = secondPageEarliestId; cache = secondPageData; total += secondIds.length; } } yield* yieldData(data, startPage); if (total === ARTWORKS_PER_PAGE) return; if (total < ARTWORKS_PER_PAGE * 2 || endPage - startPage === 1) { yield* yieldData(cache, page); return; } while (++page <= endPage) { const data2 = await api.getFollowLatestWorks(page, mode); const ids2 = data2.page.ids; const pageEarliestId = findEarliestId(ids2); if (pageEarliestId >= earliestId) { logger.info("getFollowLatestGenerator: got duplicate works"); yield* yieldData(cache, page - 1); break; } earliestId = pageEarliestId; total += ids2.length; yield* yieldData(cache, page - 1); cache = data2; } yield* yieldData(cache, page - 1); } }; function createCompressor() { const zip = new JSZip(); return { add(id, name, data) { var _a; (_a = zip.folder(id)) == null ? void 0 : _a.file(name, data); }, bundle(id, comment) { const folder = zip.folder(id); if (!folder) throw new TypeError("no such folder:" + id); return folder.generateAsync({ type: "blob", comment }); }, remove(ids) { if (typeof ids === "string") { zip.remove(ids); } else { const dirs = zip.filter((_, file) => file.dir).map((dir) => dir.name); const dirsToDel = ids.filter((id) => dirs.some((dir) => dir.includes(id))); dirsToDel.forEach((dir) => zip.remove(dir)); logger.info("Compressor: Remove", zip); } }, fileCount(id) { var _a; let count = 0; (_a = zip.folder(id)) == null ? void 0 : _a.forEach(() => count++); return count; }, async unzip(data) { const id = Math.random().toString(36); let folder = zip.folder(id); if (!folder) throw TypeError("Can not get new root folder"); const filesPromises = []; folder = await folder.loadAsync(data); folder.forEach((_, file) => { filesPromises.push(file.async("blob")); }); const files = await Promise.all(filesPromises); zip.remove(id); return files; } }; } const compressor = createCompressor(); const gifWorker = (() => GM_getResourceText("gif.js/dist/gif.worker?raw"))(); const workerUrl$2 = URL.createObjectURL(new Blob([gifWorker], { type: "text/javascript" })); function gif(frames, convertMeta) { return Promise.all( frames.map((frame) => { if (frame instanceof Blob) { return createImageBitmap(frame); } else { return frame; } }) ).then((bitmaps) => { return new Promise((resolve, reject) => { logger.info("Start convert:", convertMeta.id); logger.time(convertMeta.id); const canvas = document.createElement("canvas"); const width = canvas.width = bitmaps[0].width; const height = canvas.height = bitmaps[0].height; const ctx = canvas.getContext("2d", { willReadFrequently: true }); const gif2 = new GIF({ workers: 2, quality: config.get("gifQuality"), width, height, workerScript: workerUrl$2 }); convertMeta.abort = () => { gif2.abort(); }; bitmaps.forEach((bitmap, i) => { ctx.drawImage(bitmap, 0, 0); gif2.addFrame(ctx, { copy: true, delay: convertMeta.source.delays[i] }); bitmap.close(); }); gif2.on("progress", (progress) => { var _a; (_a = convertMeta.onProgress) == null ? void 0 : _a.call(convertMeta, progress * 100); }); gif2.on("finished", (gifBlob) => { logger.timeEnd(convertMeta.id); resolve(gifBlob); }); gif2.on("abort", () => { logger.timeEnd(convertMeta.id); logger.warn("Convert stop manually. " + convertMeta.id); convertMeta.isAborted = true; reject(new CancelError()); }); gif2.render(); }); }); } const pngWorkerFragment = 'async function encodeAPNG(frames, delays, cnum) {\n const bitmaps = await Promise.all(frames.map((frame) => {\n if (frame instanceof Blob) {\n return createImageBitmap(frame);\n }\n else {\n return frame;\n }\n }));\n const width = bitmaps[0].width;\n const height = bitmaps[0].height;\n const canvas = new OffscreenCanvas(width, height);\n const ctx = canvas.getContext("2d", { willReadFrequently: true });\n const u8arrs = [];\n for (let i = 0; i < bitmaps.length; i++) {\n ctx.drawImage(bitmaps[i], 0, 0);\n bitmaps[i].close();\n u8arrs.push(ctx.getImageData(0, 0, width, height).data);\n }\n const png = UPNG.encode(u8arrs, width, height, cnum, delays, { loop: 0 });\n if (!png)\n throw new Error("Failed to encode apng.");\n return png;\n}\nasync function decodeApng(ab) {\n const img = UPNG.decode(ab);\n const rgba = UPNG.toRGBA8(img);\n const { width, height } = img;\n const delays = img.frames.map((frame) => frame.delay);\n return { frames: rgba, delays, width, height };\n}\nasync function appendEffect(illustBlob, effect, delays, width, height) {\n if (!Array.isArray(effect)) {\n const apngDatas = await decodeApng(effect);\n effect = apngDatas.frames;\n delays = apngDatas.delays;\n width = apngDatas.width;\n height = apngDatas.height;\n }\n else {\n if (!delays || width === void 0 || height === void 0)\n throw new Error("Missing argument.");\n }\n const illustBitmap = await createImageBitmap(illustBlob);\n const effectBitmaps = await Promise.all(effect.map((buf) => createImageBitmap(new ImageData(new Uint8ClampedArray(buf), width, height))));\n const { width: illustWidth, height: illustHeight } = illustBitmap;\n const illustAspectRatio = illustWidth / illustHeight;\n const effectAspectRatio = width / height;\n let dx;\n let dy;\n let dWidth;\n let dHeight;\n if (effectAspectRatio > illustAspectRatio) {\n dWidth = illustHeight * effectAspectRatio;\n dHeight = illustHeight;\n dx = (illustWidth - dWidth) / 2;\n dy = 0;\n }\n else {\n dWidth = illustWidth;\n dHeight = illustWidth / effectAspectRatio;\n dx = 0;\n dy = (illustHeight - dHeight) / 2;\n }\n const canvas = new OffscreenCanvas(illustWidth, illustHeight);\n const ctx = canvas.getContext("2d", { willReadFrequently: true });\n const finalDatas = [];\n for (let i = 0; i < effectBitmaps.length; i++) {\n ctx.drawImage(illustBitmap, 0, 0);\n ctx.drawImage(effectBitmaps[i], dx, dy, dWidth, dHeight);\n finalDatas.push(ctx.getImageData(0, 0, illustWidth, illustHeight));\n effectBitmaps[i].close();\n }\n illustBitmap.close();\n const bitmaps = [];\n for (let i = 0; i < finalDatas.length; i++) {\n const bitmap = await createImageBitmap(finalDatas[i]);\n bitmaps.push(bitmap);\n }\n return {\n bitmaps,\n frames: effect,\n width,\n height,\n delays\n };\n}\nself.onmessage = async (evt) => {\n try {\n const data = evt.data;\n if ("effect" in data) {\n let result;\n if ("delays" in data) {\n const { illust, effect, width, height, delays } = data;\n result = await appendEffect(illust, effect, delays, width, height);\n }\n else {\n const { illust, effect } = data;\n result = await appendEffect(illust, effect);\n }\n self.postMessage(result, [...result.frames, ...result.bitmaps]);\n }\n else {\n const { frames, delays, cnum = 256 } = data;\n const apng = await encodeAPNG(frames, delays, cnum);\n self.postMessage(apng, [apng]);\n }\n }\n catch (error) {\n console.error(error);\n self.postMessage(void 0);\n }\n};\n'; const UPNG = (() => GM_getResourceText("upng-js?raw"))(); const pako = (() => GM_getResourceText("pako/dist/pako.js?raw"))(); const workerUrl$1 = URL.createObjectURL( new Blob( [ pngWorkerFragment + pako + UPNG.replace("window.UPNG", "self.UPNG").replace("window.pako", "self.pako") ], { type: "text/javascript" } ) ); const freeApngWorkers = []; function png(frames, convertMeta) { return new Promise((resolve, reject) => { logger.info("Start convert:", convertMeta.id); logger.time(convertMeta.id); let worker; if (freeApngWorkers.length) { worker = freeApngWorkers.shift(); logger.info("Reuse apng workers."); } else { worker = new Worker(workerUrl$1); } convertMeta.abort = () => { logger.timeEnd(convertMeta.id); logger.warn("Convert stop manually. " + convertMeta.id); reject(new CancelError()); convertMeta.isAborted = true; worker.terminate(); }; worker.onmessage = function(e) { freeApngWorkers.push(worker); logger.timeEnd(convertMeta.id); if (!e.data) { return reject(new TypeError("Failed to get png data. " + convertMeta.id)); } const pngBlob = new Blob([e.data], { type: "image/png" }); resolve(pngBlob); }; const delays = convertMeta.source.delays; const cfg = { frames, delays, cnum: config.get("pngColor") }; worker.postMessage( cfg, cfg.frames[0] instanceof ImageBitmap ? cfg.frames : [] ); }); } function mixPngEffect(convertMeta) { logger.info("Start convert:", convertMeta.id); logger.time(convertMeta.id); const { illust, data } = convertMeta.source; let p; if (data instanceof Blob) { p = data.arrayBuffer(); } else { p = Promise.resolve(data); } return p.then((effect) => { return new Promise((resolve, reject) => { let worker; if (freeApngWorkers.length) { worker = freeApngWorkers.shift(); logger.info("Reuse apng workers."); } else { worker = new Worker(workerUrl$1); } convertMeta.abort = () => { logger.timeEnd(convertMeta.id); logger.warn("Convert stop manually. " + convertMeta.id); reject(new CancelError()); convertMeta.isAborted = true; worker.terminate(); }; worker.onmessage = function(e) { logger.timeEnd(convertMeta.id); worker.terminate(); if (!e.data) { return reject(new Error("Mix Effect convert Failed " + convertMeta.id)); } resolve(e.data); }; let cfg; if (effect instanceof ArrayBuffer) { cfg = { illust, effect }; worker.postMessage(cfg, [effect]); } else { const { frames, delays, width, height } = effect; cfg = { illust, delays, effect: frames, width, height }; worker.postMessage(cfg, frames); } }); }); } const webpWorkerFragment = 'let webpApi = {};\nModule.onRuntimeInitialized = () => {\n webpApi = {\n init: Module.cwrap("init", "", ["number", "number", "number"]),\n createBuffer: Module.cwrap("createBuffer", "number", ["number"]),\n addFrame: Module.cwrap("addFrame", "number", ["number", "number", "number"]),\n generate: Module.cwrap("generate", "number", []),\n freeResult: Module.cwrap("freeResult", "", []),\n getResultPointer: Module.cwrap("getResultPointer", "number", []),\n getResultSize: Module.cwrap("getResultSize", "number", [])\n };\n postMessage("ok");\n};\nonmessage = async (evt) => {\n const { frames, delays, lossless = 0, quality = 95, method = 4 } = evt.data;\n webpApi.init(lossless, quality, method);\n const bitmaps = await Promise.all(frames.map((frame) => {\n if (frame instanceof Blob) {\n return createImageBitmap(frame);\n }\n else {\n return frame;\n }\n }));\n const width = bitmaps[0].width;\n const height = bitmaps[0].height;\n const canvas = new OffscreenCanvas(width, height);\n const ctx = canvas.getContext("2d");\n for (let i = 0; i < bitmaps.length; i++) {\n ctx?.drawImage(bitmaps[i], 0, 0);\n bitmaps[i].close();\n const webpBlob = await canvas.convertToBlob({\n type: "image/webp",\n quality: lossless ? 1 : quality / 100\n });\n const buffer = await webpBlob.arrayBuffer();\n const u8a = new Uint8Array(buffer);\n const pointer = webpApi.createBuffer(u8a.length);\n Module.HEAPU8.set(u8a, pointer);\n webpApi.addFrame(pointer, u8a.length, delays[i]);\n postMessage((i + 1) / bitmaps.length * 100);\n }\n webpApi.generate();\n const resultPointer = webpApi.getResultPointer();\n const resultSize = webpApi.getResultSize();\n const result = new Uint8Array(Module.HEAP8.buffer, resultPointer, resultSize);\n postMessage(result);\n webpApi.freeResult();\n};\n'; const webpWasm = (() => GM_getResourceText("../wasm/toWebpWorker?raw"))(); const workerUrl = URL.createObjectURL( new Blob([webpWasm + webpWorkerFragment], { type: "text/javascript" }) ); const freeWebpWorkers = []; function webp(frames, convertMeta) { return new Promise((resolve, reject) => { logger.time(convertMeta.id); let worker; if (freeWebpWorkers.length) { logger.info("Reuse webp workers."); worker = freeWebpWorkers.shift(); resolve(worker); } else { worker = new Worker(workerUrl); worker.onmessage = (evt) => { if (evt.data === "ok") { logger.info("Webp worker loaded."); resolve(worker); } else { reject(evt.data); } }; } }).then((worker) => { if (convertMeta.isAborted) { freeWebpWorkers.push(worker); logger.timeEnd(convertMeta.id); logger.warn("Convert stop manually." + convertMeta.id); throw new CancelError(); } return new Promise((resolve, reject) => { worker.onmessage = (evt) => { var _a; if (convertMeta.isAborted) { worker.terminate(); logger.timeEnd(convertMeta.id); logger.warn("Convert stop manually." + convertMeta.id); reject(new CancelError()); } else { const data = evt.data; if (typeof data !== "object") { (_a = convertMeta.onProgress) == null ? void 0 : _a.call(convertMeta, evt.data); } else { logger.timeEnd(convertMeta.id); freeWebpWorkers.push(worker); resolve(new Blob([evt.data], { type: "image/webp" })); } } }; const delays = convertMeta.source.delays; worker.postMessage( { frames, delays, lossless: Number(config.get("losslessWebp")), quality: config.get("webpQuality"), method: config.get("webpMehtod") }, frames[0] instanceof ImageBitmap ? frames : [] ); }); }); } function getDefaultExportFromCjs(x) { return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, "default") ? x["default"] : x; } var WebMWriter$1 = { exports: {} }; (function(module) { (function() { function extend(base, top) { let target = {}; [base, top].forEach(function(obj) { for (let prop in obj) { if (Object.prototype.hasOwnProperty.call(obj, prop)) { target[prop] = obj[prop]; } } }); return target; } function decodeBase64WebPDataURL(url2) { if (typeof url2 !== "string" || !url2.match(/^data:image\/webp;base64,/i)) { throw new Error("Failed to decode WebP Base64 URL"); } return window.atob(url2.substring("data:image/webp;base64,".length)); } function renderAsWebP(canvas, quality) { let frame = typeof canvas === "string" && /^data:image\/webp/.test(canvas) ? canvas : canvas.toDataURL("image/webp", quality); return decodeBase64WebPDataURL(frame); } function byteStringToUint32LE(string) { let a = string.charCodeAt(0), b = string.charCodeAt(1), c = string.charCodeAt(2), d = string.charCodeAt(3); return (a | b << 8 | c << 16 | d << 24) >>> 0; } function extractKeyframeFromWebP(webP) { let cursor = webP.indexOf("VP8", 12); if (cursor === -1) { throw new Error("Bad image format, does this browser support WebP?"); } let hasAlpha = false; while (cursor < webP.length - 8) { let chunkLength, fourCC; fourCC = webP.substring(cursor, cursor + 4); cursor += 4; chunkLength = byteStringToUint32LE(webP.substring(cursor, cursor + 4)); cursor += 4; switch (fourCC) { case "VP8 ": return { frame: webP.substring(cursor, cursor + chunkLength), hasAlpha }; case "ALPH": hasAlpha = true; break; } cursor += chunkLength; if ((chunkLength & 1) !== 0) { cursor++; } } throw new Error("Failed to find VP8 keyframe in WebP image, is this image mistakenly encoded in the Lossless WebP format?"); } const EBML_SIZE_UNKNOWN = -1, EBML_SIZE_UNKNOWN_5_BYTES = -2; function EBMLFloat32(value) { this.value = value; } function EBMLFloat64(value) { this.value = value; } function writeEBML(buffer, bufferFileOffset, ebml) { if (Array.isArray(ebml)) { for (let i = 0; i < ebml.length; i++) { writeEBML(buffer, bufferFileOffset, ebml[i]); } } else if (typeof ebml === "string") { buffer.writeString(ebml); } else if (ebml instanceof Uint8Array) { buffer.writeBytes(ebml); } else if (ebml.id) { ebml.offset = buffer.pos + bufferFileOffset; buffer.writeUnsignedIntBE(ebml.id); if (Array.isArray(ebml.data)) { let sizePos, dataBegin, dataEnd; if (ebml.size === EBML_SIZE_UNKNOWN) { buffer.writeByte(255); } else if (ebml.size === EBML_SIZE_UNKNOWN_5_BYTES) { sizePos = buffer.pos; buffer.writeBytes([15, 255, 255, 255, 255]); } else { sizePos = buffer.pos; buffer.writeBytes([0, 0, 0, 0]); } dataBegin = buffer.pos; ebml.dataOffset = dataBegin + bufferFileOffset; writeEBML(buffer, bufferFileOffset, ebml.data); if (ebml.size !== EBML_SIZE_UNKNOWN && ebml.size !== EBML_SIZE_UNKNOWN_5_BYTES) { dataEnd = buffer.pos; ebml.size = dataEnd - dataBegin; buffer.seek(sizePos); buffer.writeEBMLVarIntWidth(ebml.size, 4); buffer.seek(dataEnd); } } else if (typeof ebml.data === "string") { buffer.writeEBMLVarInt(ebml.data.length); ebml.dataOffset = buffer.pos + bufferFileOffset; buffer.writeString(ebml.data); } else if (typeof ebml.data === "number") { if (!ebml.size) { ebml.size = buffer.measureUnsignedInt(ebml.data); } buffer.writeEBMLVarInt(ebml.size); ebml.dataOffset = buffer.pos + bufferFileOffset; buffer.writeUnsignedIntBE(ebml.data, ebml.size); } else if (ebml.data instanceof EBMLFloat64) { buffer.writeEBMLVarInt(8); ebml.dataOffset = buffer.pos + bufferFileOffset; buffer.writeDoubleBE(ebml.data.value); } else if (ebml.data instanceof EBMLFloat32) { buffer.writeEBMLVarInt(4); ebml.dataOffset = buffer.pos + bufferFileOffset; buffer.writeFloatBE(ebml.data.value); } else if (ebml.data instanceof Uint8Array) { buffer.writeEBMLVarInt(ebml.data.byteLength); ebml.dataOffset = buffer.pos + bufferFileOffset; buffer.writeBytes(ebml.data); } else { throw new Error("Bad EBML datatype " + typeof ebml.data); } } else { throw new Error("Bad EBML datatype " + typeof ebml.data); } } let WebMWriter2 = function(ArrayBufferDataStream2, BlobBuffer2) { return function(options) { let MAX_CLUSTER_DURATION_MSEC = 5e3, DEFAULT_TRACK_NUMBER = 1, writtenHeader = false, videoWidth = 0, videoHeight = 0, alphaBuffer = null, alphaBufferContext = null, alphaBufferData = null, clusterFrameBuffer = [], clusterStartTime = 0, clusterDuration = 0, optionDefaults = { quality: 0.95, // WebM image quality from 0.0 (worst) to 0.99999 (best), 1.00 (WebP lossless) is not supported transparent: false, // True if an alpha channel should be included in the video alphaQuality: void 0, // Allows you to set the quality level of the alpha channel separately. // If not specified this defaults to the same value as `quality`. fileWriter: null, // Chrome FileWriter in order to stream to a file instead of buffering to memory (optional) fd: null, // Node.JS file descriptor to write to instead of buffering (optional) // You must supply one of: frameDuration: null, // Duration of frames in milliseconds frameRate: null // Number of frames per second }, seekPoints = { Cues: { id: new Uint8Array([28, 83, 187, 107]), positionEBML: null }, SegmentInfo: { id: new Uint8Array([21, 73, 169, 102]), positionEBML: null }, Tracks: { id: new Uint8Array([22, 84, 174, 107]), positionEBML: null } }, ebmlSegment, segmentDuration = { "id": 17545, // Duration "data": new EBMLFloat64(0) }, seekHead, cues = [], blobBuffer = new BlobBuffer2(options.fileWriter || options.fd); function fileOffsetToSegmentRelative(fileOffset) { return fileOffset - ebmlSegment.dataOffset; } function convertAlphaToGrayscaleImage(source) { if (alphaBuffer === null || alphaBuffer.width !== source.width || alphaBuffer.height !== source.height) { alphaBuffer = document.createElement("canvas"); alphaBuffer.width = source.width; alphaBuffer.height = source.height; alphaBufferContext = alphaBuffer.getContext("2d"); alphaBufferData = alphaBufferContext.createImageData(alphaBuffer.width, alphaBuffer.height); } let sourceContext = source.getContext("2d"), sourceData = sourceContext.getImageData(0, 0, source.width, source.height).data, destData = alphaBufferData.data, dstCursor = 0, srcEnd = source.width * source.height * 4; for (let srcCursor = 3; srcCursor < srcEnd; srcCursor += 4) { let alpha = sourceData[srcCursor]; destData[dstCursor++] = alpha; destData[dstCursor++] = alpha; destData[dstCursor++] = alpha; destData[dstCursor++] = 255; } alphaBufferContext.putImageData(alphaBufferData, 0, 0); return alphaBuffer; } function createSeekHead() { let seekPositionEBMLTemplate = { "id": 21420, // SeekPosition "size": 5, // Allows for 32GB video files "data": 0 // We'll overwrite this when the file is complete }, result = { "id": 290298740, // SeekHead "data": [] }; for (let name in seekPoints) { let seekPoint = seekPoints[name]; seekPoint.positionEBML = Object.create(seekPositionEBMLTemplate); result.data.push({ "id": 19899, // Seek "data": [ { "id": 21419, // SeekID "data": seekPoint.id }, seekPoint.positionEBML ] }); } return result; } function writeHeader() { seekHead = createSeekHead(); let ebmlHeader = { "id": 440786851, // EBML "data": [ { "id": 17030, // EBMLVersion "data": 1 }, { "id": 17143, // EBMLReadVersion "data": 1 }, { "id": 17138, // EBMLMaxIDLength "data": 4 }, { "id": 17139, // EBMLMaxSizeLength "data": 8 }, { "id": 17026, // DocType "data": "webm" }, { "id": 17031, // DocTypeVersion "data": 2 }, { "id": 17029, // DocTypeReadVersion "data": 2 } ] }, segmentInfo = { "id": 357149030, // Info "data": [ { "id": 2807729, // TimecodeScale "data": 1e6 // Times will be in miliseconds (1e6 nanoseconds per step = 1ms) }, { "id": 19840, // MuxingApp "data": "webm-writer-js" }, { "id": 22337, // WritingApp "data": "webm-writer-js" }, segmentDuration // To be filled in later ] }, videoProperties = [ { "id": 176, // PixelWidth "data": videoWidth }, { "id": 186, // PixelHeight "data": videoHeight } ]; if (options.transparent) { videoProperties.push( { "id": 21440, // AlphaMode "data": 1 } ); } let tracks = { "id": 374648427, // Tracks "data": [ { "id": 174, // TrackEntry "data": [ { "id": 215, // TrackNumber "data": DEFAULT_TRACK_NUMBER }, { "id": 29637, // TrackUID "data": DEFAULT_TRACK_NUMBER }, { "id": 156, // FlagLacing "data": 0 }, { "id": 2274716, // Language "data": "und" }, { "id": 134, // CodecID "data": "V_VP8" }, { "id": 2459272, // CodecName "data": "VP8" }, { "id": 131, // TrackType "data": 1 }, { "id": 224, // Video "data": videoProperties } ] } ] }; ebmlSegment = { "id": 408125543, // Segment "size": EBML_SIZE_UNKNOWN_5_BYTES, // We'll seek back and fill this in at completion "data": [ seekHead, segmentInfo, tracks ] }; let bufferStream = new ArrayBufferDataStream2(256); writeEBML(bufferStream, blobBuffer.pos, [ebmlHeader, ebmlSegment]); blobBuffer.write(bufferStream.getAsDataArray()); seekPoints.SegmentInfo.positionEBML.data = fileOffsetToSegmentRelative(segmentInfo.offset); seekPoints.Tracks.positionEBML.data = fileOffsetToSegmentRelative(tracks.offset); writtenHeader = true; } function createBlockGroupForTransparentKeyframe(keyframe) { let block, blockAdditions, bufferStream = new ArrayBufferDataStream2(1 + 2 + 1); if (!(keyframe.trackNumber > 0 && keyframe.trackNumber < 127)) { throw new Error("TrackNumber must be > 0 and < 127"); } bufferStream.writeEBMLVarInt(keyframe.trackNumber); bufferStream.writeU16BE(keyframe.timecode); bufferStream.writeByte(0); block = { "id": 161, // Block "data": [ bufferStream.getAsDataArray(), keyframe.frame ] }; blockAdditions = { "id": 30113, // BlockAdditions "data": [ { "id": 166, // BlockMore "data": [ { "id": 238, // BlockAddID "data": 1 // Means "BlockAdditional has a codec-defined meaning, pass it to the codec" }, { "id": 165, // BlockAdditional "data": keyframe.alpha // The actual alpha channel image } ] } ] }; return { "id": 160, // BlockGroup "data": [ block, blockAdditions ] }; } function createSimpleBlockForKeyframe(keyframe) { let bufferStream = new ArrayBufferDataStream2(1 + 2 + 1); if (!(keyframe.trackNumber > 0 && keyframe.trackNumber < 127)) { throw new Error("TrackNumber must be > 0 and < 127"); } bufferStream.writeEBMLVarInt(keyframe.trackNumber); bufferStream.writeU16BE(keyframe.timecode); bufferStream.writeByte( 1 << 7 // Keyframe ); return { "id": 163, // SimpleBlock "data": [ bufferStream.getAsDataArray(), keyframe.frame ] }; } function createContainerForKeyframe(keyframe) { if (keyframe.alpha) { return createBlockGroupForTransparentKeyframe(keyframe); } return createSimpleBlockForKeyframe(keyframe); } function createCluster(cluster) { return { "id": 524531317, "data": [ { "id": 231, // Timecode "data": Math.round(cluster.timecode) } ] }; } function addCuePoint(trackIndex, clusterTime, clusterFileOffset) { cues.push({ "id": 187, // Cue "data": [ { "id": 179, // CueTime "data": clusterTime }, { "id": 183, // CueTrackPositions "data": [ { "id": 247, // CueTrack "data": trackIndex }, { "id": 241, // CueClusterPosition "data": fileOffsetToSegmentRelative(clusterFileOffset) } ] } ] }); } function writeCues() { let ebml = { "id": 475249515, "data": cues }, cuesBuffer = new ArrayBufferDataStream2(16 + cues.length * 32); writeEBML(cuesBuffer, blobBuffer.pos, ebml); blobBuffer.write(cuesBuffer.getAsDataArray()); seekPoints.Cues.positionEBML.data = fileOffsetToSegmentRelative(ebml.offset); } function flushClusterFrameBuffer() { if (clusterFrameBuffer.length === 0) { return; } let rawImageSize = 0; for (let i = 0; i < clusterFrameBuffer.length; i++) { rawImageSize += clusterFrameBuffer[i].frame.length + (clusterFrameBuffer[i].alpha ? clusterFrameBuffer[i].alpha.length : 0); } let buffer = new ArrayBufferDataStream2(rawImageSize + clusterFrameBuffer.length * 64), cluster = createCluster({ timecode: Math.round(clusterStartTime) }); for (let i = 0; i < clusterFrameBuffer.length; i++) { cluster.data.push(createContainerForKeyframe(clusterFrameBuffer[i])); } writeEBML(buffer, blobBuffer.pos, cluster); blobBuffer.write(buffer.getAsDataArray()); addCuePoint(DEFAULT_TRACK_NUMBER, Math.round(clusterStartTime), cluster.offset); clusterFrameBuffer = []; clusterStartTime += clusterDuration; clusterDuration = 0; } function validateOptions() { if (!options.frameDuration) { if (options.frameRate) { options.frameDuration = 1e3 / options.frameRate; } else { throw new Error("Missing required frameDuration or frameRate setting"); } } options.quality = Math.max(Math.min(options.quality, 0.99999), 0); if (options.alphaQuality === void 0) { options.alphaQuality = options.quality; } else { options.alphaQuality = Math.max(Math.min(options.alphaQuality, 0.99999), 0); } } function addFrameToCluster(frame) { frame.trackNumber = DEFAULT_TRACK_NUMBER; frame.timecode = Math.round(clusterDuration); clusterFrameBuffer.push(frame); clusterDuration += frame.duration; if (clusterDuration >= MAX_CLUSTER_DURATION_MSEC) { flushClusterFrameBuffer(); } } function rewriteSeekHead() { let seekHeadBuffer = new ArrayBufferDataStream2(seekHead.size), oldPos = blobBuffer.pos; writeEBML(seekHeadBuffer, seekHead.dataOffset, seekHead.data); blobBuffer.seek(seekHead.dataOffset); blobBuffer.write(seekHeadBuffer.getAsDataArray()); blobBuffer.seek(oldPos); } function rewriteDuration() { let buffer = new ArrayBufferDataStream2(8), oldPos = blobBuffer.pos; buffer.writeDoubleBE(clusterStartTime); blobBuffer.seek(segmentDuration.dataOffset); blobBuffer.write(buffer.getAsDataArray()); blobBuffer.seek(oldPos); } function rewriteSegmentLength() { let buffer = new ArrayBufferDataStream2(10), oldPos = blobBuffer.pos; buffer.writeUnsignedIntBE(ebmlSegment.id); buffer.writeEBMLVarIntWidth(blobBuffer.pos - ebmlSegment.dataOffset, 5); blobBuffer.seek(ebmlSegment.offset); blobBuffer.write(buffer.getAsDataArray()); blobBuffer.seek(oldPos); } this.addFrame = function(frame, alpha, overrideFrameDuration) { if (!writtenHeader) { videoWidth = frame.width || 0; videoHeight = frame.height || 0; writeHeader(); } let keyframe = extractKeyframeFromWebP(renderAsWebP(frame, options.quality)), frameDuration, frameAlpha = null; if (overrideFrameDuration) { frameDuration = overrideFrameDuration; } else if (typeof alpha == "number") { frameDuration = alpha; } else { frameDuration = options.frameDuration; } if (options.transparent) { if (alpha instanceof HTMLCanvasElement || typeof alpha === "string") { frameAlpha = alpha; } else if (keyframe.hasAlpha) { frameAlpha = convertAlphaToGrayscaleImage(frame); } } addFrameToCluster({ frame: keyframe.frame, duration: frameDuration, alpha: frameAlpha ? extractKeyframeFromWebP(renderAsWebP(frameAlpha, options.alphaQuality)).frame : null }); }; this.complete = function() { if (!writtenHeader) { writeHeader(); } flushClusterFrameBuffer(); writeCues(); rewriteSeekHead(); rewriteDuration(); rewriteSegmentLength(); return blobBuffer.complete("video/webm"); }; this.getWrittenSize = function() { return blobBuffer.length; }; options = extend(optionDefaults, options || {}); validateOptions(); }; }; { module.exports = WebMWriter2; } })(); })(WebMWriter$1); var WebMWriterExports = WebMWriter$1.exports; var ArrayBufferDataStream = { exports: {} }; (function(module) { (function() { let ArrayBufferDataStream2 = function(length) { this.data = new Uint8Array(length); this.pos = 0; }; ArrayBufferDataStream2.prototype.seek = function(toOffset) { this.pos = toOffset; }; ArrayBufferDataStream2.prototype.writeBytes = function(arr) { for (let i = 0; i < arr.length; i++) { this.data[this.pos++] = arr[i]; } }; ArrayBufferDataStream2.prototype.writeByte = function(b) { this.data[this.pos++] = b; }; ArrayBufferDataStream2.prototype.writeU8 = ArrayBufferDataStream2.prototype.writeByte; ArrayBufferDataStream2.prototype.writeU16BE = function(u) { this.data[this.pos++] = u >> 8; this.data[this.pos++] = u; }; ArrayBufferDataStream2.prototype.writeDoubleBE = function(d) { let bytes2 = new Uint8Array(new Float64Array([d]).buffer); for (let i = bytes2.length - 1; i >= 0; i--) { this.writeByte(bytes2[i]); } }; ArrayBufferDataStream2.prototype.writeFloatBE = function(d) { let bytes2 = new Uint8Array(new Float32Array([d]).buffer); for (let i = bytes2.length - 1; i >= 0; i--) { this.writeByte(bytes2[i]); } }; ArrayBufferDataStream2.prototype.writeString = function(s) { for (let i = 0; i < s.length; i++) { this.data[this.pos++] = s.charCodeAt(i); } }; ArrayBufferDataStream2.prototype.writeEBMLVarIntWidth = function(i, width) { switch (width) { case 1: this.writeU8(1 << 7 | i); break; case 2: this.writeU8(1 << 6 | i >> 8); this.writeU8(i); break; case 3: this.writeU8(1 << 5 | i >> 16); this.writeU8(i >> 8); this.writeU8(i); break; case 4: this.writeU8(1 << 4 | i >> 24); this.writeU8(i >> 16); this.writeU8(i >> 8); this.writeU8(i); break; case 5: this.writeU8(1 << 3 | i / 4294967296 & 7); this.writeU8(i >> 24); this.writeU8(i >> 16); this.writeU8(i >> 8); this.writeU8(i); break; default: throw new Error("Bad EBML VINT size " + width); } }; ArrayBufferDataStream2.prototype.measureEBMLVarInt = function(val) { if (val < (1 << 7) - 1) { return 1; } else if (val < (1 << 14) - 1) { return 2; } else if (val < (1 << 21) - 1) { return 3; } else if (val < (1 << 28) - 1) { return 4; } else if (val < 34359738367) { return 5; } else { throw new Error("EBML VINT size not supported " + val); } }; ArrayBufferDataStream2.prototype.writeEBMLVarInt = function(i) { this.writeEBMLVarIntWidth(i, this.measureEBMLVarInt(i)); }; ArrayBufferDataStream2.prototype.writeUnsignedIntBE = function(u, width) { if (width === void 0) { width = this.measureUnsignedInt(u); } switch (width) { case 5: this.writeU8(Math.floor(u / 4294967296)); case 4: this.writeU8(u >> 24); case 3: this.writeU8(u >> 16); case 2: this.writeU8(u >> 8); case 1: this.writeU8(u); break; default: throw new Error("Bad UINT size " + width); } }; ArrayBufferDataStream2.prototype.measureUnsignedInt = function(val) { if (val < 1 << 8) { return 1; } else if (val < 1 << 16) { return 2; } else if (val < 1 << 24) { return 3; } else if (val < 4294967296) { return 4; } else { return 5; } }; ArrayBufferDataStream2.prototype.getAsDataArray = function() { if (this.pos < this.data.byteLength) { return this.data.subarray(0, this.pos); } else if (this.pos == this.data.byteLength) { return this.data; } else { throw new Error("ArrayBufferDataStream's pos lies beyond end of buffer"); } }; { module.exports = ArrayBufferDataStream2; } })(); })(ArrayBufferDataStream); var ArrayBufferDataStreamExports = ArrayBufferDataStream.exports; var BlobBuffer = { exports: {} }; (function(module) { (function() { let BlobBuffer2 = function(fs) { return function(destination) { let buffer = [], writePromise = Promise.resolve(), fileWriter = null, fd = null; if (destination && destination.constructor.name === "FileWriter") { fileWriter = destination; } else if (fs && destination) { fd = destination; } this.pos = 0; this.length = 0; function readBlobAsBuffer(blob) { return new Promise(function(resolve, reject) { let reader = new FileReader(); reader.addEventListener("loadend", function() { resolve(reader.result); }); reader.readAsArrayBuffer(blob); }); } function convertToUint8Array(thing) { return new Promise(function(resolve, reject) { if (thing instanceof Uint8Array) { resolve(thing); } else if (thing instanceof ArrayBuffer || ArrayBuffer.isView(thing)) { resolve(new Uint8Array(thing)); } else if (thing instanceof Blob) { resolve(readBlobAsBuffer(thing).then(function(buffer2) { return new Uint8Array(buffer2); })); } else { resolve(readBlobAsBuffer(new Blob([thing])).then(function(buffer2) { return new Uint8Array(buffer2); })); } }); } function measureData(data) { let result = data.byteLength || data.length || data.size; if (!Number.isInteger(result)) { throw new Error("Failed to determine size of element"); } return result; } this.seek = function(offset) { if (offset < 0) { throw new Error("Offset may not be negative"); } if (isNaN(offset)) { throw new Error("Offset may not be NaN"); } if (offset > this.length) { throw new Error("Seeking beyond the end of file is not allowed"); } this.pos = offset; }; this.write = function(data) { let newEntry = { offset: this.pos, data, length: measureData(data) }, isAppend = newEntry.offset >= this.length; this.pos += newEntry.length; this.length = Math.max(this.length, this.pos); writePromise = writePromise.then(function() { if (fd) { return new Promise(function(resolve, reject) { convertToUint8Array(newEntry.data).then(function(dataArray) { let totalWritten = 0, buffer2 = Buffer.from(dataArray.buffer), handleWriteComplete = function(err, written, buffer3) { totalWritten += written; if (totalWritten >= buffer3.length) { resolve(); } else { fs.write(fd, buffer3, totalWritten, buffer3.length - totalWritten, newEntry.offset + totalWritten, handleWriteComplete); } }; fs.write(fd, buffer2, 0, buffer2.length, newEntry.offset, handleWriteComplete); }); }); } else if (fileWriter) { return new Promise(function(resolve, reject) { fileWriter.onwriteend = resolve; fileWriter.seek(newEntry.offset); fileWriter.write(new Blob([newEntry.data])); }); } else if (!isAppend) { for (let i = 0; i < buffer.length; i++) { let entry = buffer[i]; if (!(newEntry.offset + newEntry.length <= entry.offset || newEntry.offset >= entry.offset + entry.length)) { if (newEntry.offset < entry.offset || newEntry.offset + newEntry.length > entry.offset + entry.length) { throw new Error("Overwrite crosses blob boundaries"); } if (newEntry.offset == entry.offset && newEntry.length == entry.length) { entry.data = newEntry.data; return; } else { return convertToUint8Array(entry.data).then(function(entryArray) { entry.data = entryArray; return convertToUint8Array(newEntry.data); }).then(function(newEntryArray) { newEntry.data = newEntryArray; entry.data.set(newEntry.data, newEntry.offset - entry.offset); }); } } } } buffer.push(newEntry); }); }; this.complete = function(mimeType) { if (fd || fileWriter) { writePromise = writePromise.then(function() { return null; }); } else { writePromise = writePromise.then(function() { let result = []; for (let i = 0; i < buffer.length; i++) { result.push(buffer[i].data); } return new Blob(result, { type: mimeType }); }); } return writePromise; }; }; }; { module.exports = BlobBuffer2; } })(); })(BlobBuffer); var BlobBufferExports = BlobBuffer.exports; var browser = WebMWriterExports(ArrayBufferDataStreamExports, BlobBufferExports(null)); const WebMWriter = /* @__PURE__ */ getDefaultExportFromCjs(browser); function webm(frames, convertMeta) { const quality = config.get("webmQuality") / 100; return Promise.all( frames.map((frame) => { if (frame instanceof Blob) { return createImageBitmap(frame); } else { return frame; } }) ).then((bitmaps) => { if (convertMeta.isAborted) throw new CancelError(); const width = bitmaps[0].width; const height = bitmaps[0].height; const canvas = new OffscreenCanvas(width, height); const ctx = canvas.getContext("2d"); const dataUrls = []; for (let i = 0; i < frames.length; i++) { ctx.drawImage(bitmaps[i], 0, 0); bitmaps[i].close(); const url2 = canvas.convertToBlob({ type: "image/webp", quality }).then(readBlobAsDataUrl); dataUrls.push(url2); } return Promise.all(dataUrls); }).then((dataUrls) => { if (convertMeta.isAborted) throw new CancelError(); const videoWriter = new WebMWriter({ quality, // WebM image quality from 0.0 (worst) to 0.99999 (best), 1.00 (VP8L lossless) is not supported frameRate: 30, // Number of frames per second transparent: false // True if an alpha channel should be included in the video }); const delays = convertMeta.source.delays; for (let i = 0; i < dataUrls.length; i++) { videoWriter.addFrame(dataUrls[i], delays[i]); } return videoWriter.complete(); }).then((blob) => { if (convertMeta.isAborted) throw new CancelError(); return blob; }); } var __accessCheck = (obj, member, msg) => { if (!member.has(obj)) throw TypeError("Cannot " + msg); }; var __privateGet = (obj, member, getter) => { __accessCheck(obj, member, "read from private field"); return getter ? getter.call(obj) : member.get(obj); }; var __privateAdd = (obj, member, value) => { if (member.has(obj)) throw TypeError("Cannot add the same private member more than once"); member instanceof WeakSet ? member.add(obj) : member.set(obj, value); }; var __privateSet = (obj, member, value, setter) => { __accessCheck(obj, member, "write to private field"); member.set(obj, value); return value; }; var __privateWrapper = (obj, member, setter, getter) => ({ set _(value) { __privateSet(obj, member, value); }, get _() { return __privateGet(obj, member, getter); } }); var __privateMethod = (obj, member, method) => { __accessCheck(obj, member, "access private method"); return method; }; var bytes = new Uint8Array(8); var view = new DataView(bytes.buffer); var u8 = (value) => { return [(value % 256 + 256) % 256]; }; var u16 = (value) => { view.setUint16(0, value, false); return [bytes[0], bytes[1]]; }; var i16 = (value) => { view.setInt16(0, value, false); return [bytes[0], bytes[1]]; }; var u24 = (value) => { view.setUint32(0, value, false); return [bytes[1], bytes[2], bytes[3]]; }; var u32 = (value) => { view.setUint32(0, value, false); return [bytes[0], bytes[1], bytes[2], bytes[3]]; }; var i32 = (value) => { view.setInt32(0, value, false); return [bytes[0], bytes[1], bytes[2], bytes[3]]; }; var u64 = (value) => { view.setUint32(0, Math.floor(value / 2 ** 32), false); view.setUint32(4, value, false); return [bytes[0], bytes[1], bytes[2], bytes[3], bytes[4], bytes[5], bytes[6], bytes[7]]; }; var fixed_8_8 = (value) => { view.setInt16(0, 2 ** 8 * value, false); return [bytes[0], bytes[1]]; }; var fixed_16_16 = (value) => { view.setInt32(0, 2 ** 16 * value, false); return [bytes[0], bytes[1], bytes[2], bytes[3]]; }; var fixed_2_30 = (value) => { view.setInt32(0, 2 ** 30 * value, false); return [bytes[0], bytes[1], bytes[2], bytes[3]]; }; var ascii = (text2, nullTerminated = false) => { let bytes2 = Array(text2.length).fill(null).map((_, i) => text2.charCodeAt(i)); if (nullTerminated) bytes2.push(0); return bytes2; }; var last = (arr) => { return arr && arr[arr.length - 1]; }; var lastPresentedSample = (samples) => { let result = void 0; for (let sample of samples) { if (!result || sample.presentationTimestamp > result.presentationTimestamp) { result = sample; } } return result; }; var intoTimescale = (timeInSeconds, timescale, round = true) => { let value = timeInSeconds * timescale; return round ? Math.round(value) : value; }; var rotationMatrix = (rotationInDegrees) => { let theta = rotationInDegrees * (Math.PI / 180); let cosTheta = Math.cos(theta); let sinTheta = Math.sin(theta); return [ cosTheta, sinTheta, 0, -sinTheta, cosTheta, 0, 0, 0, 1 ]; }; var IDENTITY_MATRIX = rotationMatrix(0); var matrixToBytes = (matrix) => { return [ fixed_16_16(matrix[0]), fixed_16_16(matrix[1]), fixed_2_30(matrix[2]), fixed_16_16(matrix[3]), fixed_16_16(matrix[4]), fixed_2_30(matrix[5]), fixed_16_16(matrix[6]), fixed_16_16(matrix[7]), fixed_2_30(matrix[8]) ]; }; var deepClone = (x) => { if (!x) return x; if (typeof x !== "object") return x; if (Array.isArray(x)) return x.map(deepClone); return Object.fromEntries(Object.entries(x).map(([key, value]) => [key, deepClone(value)])); }; var isU32 = (value) => { return value >= 0 && value < 2 ** 32; }; var box = (type, contents, children2) => ({ type, contents: contents && new Uint8Array(contents.flat(10)), children: children2 }); var fullBox = (type, version, flags, contents, children2) => box( type, [u8(version), u24(flags), contents ?? []], children2 ); var ftyp = (details) => { let minorVersion = 512; if (details.fragmented) return box("ftyp", [ ascii("iso5"), // Major brand u32(minorVersion), // Minor version // Compatible brands ascii("iso5"), ascii("iso6"), ascii("mp41") ]); return box("ftyp", [ ascii("isom"), // Major brand u32(minorVersion), // Minor version // Compatible brands ascii("isom"), details.holdsAvc ? ascii("avc1") : [], ascii("mp41") ]); }; var mdat = (reserveLargeSize) => ({ type: "mdat", largeSize: reserveLargeSize }); var free = (size) => ({ type: "free", size }); var moov = (tracks, creationTime, fragmented = false) => box("moov", null, [ mvhd(creationTime, tracks), ...tracks.map((x) => trak(x, creationTime)), fragmented ? mvex(tracks) : null ]); var mvhd = (creationTime, tracks) => { let duration = intoTimescale(Math.max( 0, ...tracks.filter((x) => x.samples.length > 0).map((x) => { const lastSample = lastPresentedSample(x.samples); return lastSample.presentationTimestamp + lastSample.duration; }) ), GLOBAL_TIMESCALE); let nextTrackId = Math.max(...tracks.map((x) => x.id)) + 1; let needsU64 = !isU32(creationTime) || !isU32(duration); let u32OrU64 = needsU64 ? u64 : u32; return fullBox("mvhd", +needsU64, 0, [ u32OrU64(creationTime), // Creation time u32OrU64(creationTime), // Modification time u32(GLOBAL_TIMESCALE), // Timescale u32OrU64(duration), // Duration fixed_16_16(1), // Preferred rate fixed_8_8(1), // Preferred volume Array(10).fill(0), // Reserved matrixToBytes(IDENTITY_MATRIX), // Matrix Array(24).fill(0), // Pre-defined u32(nextTrackId) // Next track ID ]); }; var trak = (track, creationTime) => box("trak", null, [ tkhd(track, creationTime), mdia(track, creationTime) ]); var tkhd = (track, creationTime) => { let lastSample = lastPresentedSample(track.samples); let durationInGlobalTimescale = intoTimescale( lastSample ? lastSample.presentationTimestamp + lastSample.duration : 0, GLOBAL_TIMESCALE ); let needsU64 = !isU32(creationTime) || !isU32(durationInGlobalTimescale); let u32OrU64 = needsU64 ? u64 : u32; let matrix; if (track.info.type === "video") { matrix = typeof track.info.rotation === "number" ? rotationMatrix(track.info.rotation) : track.info.rotation; } else { matrix = IDENTITY_MATRIX; } return fullBox("tkhd", +needsU64, 3, [ u32OrU64(creationTime), // Creation time u32OrU64(creationTime), // Modification time u32(track.id), // Track ID u32(0), // Reserved u32OrU64(durationInGlobalTimescale), // Duration Array(8).fill(0), // Reserved u16(0), // Layer u16(0), // Alternate group fixed_8_8(track.info.type === "audio" ? 1 : 0), // Volume u16(0), // Reserved matrixToBytes(matrix), // Matrix fixed_16_16(track.info.type === "video" ? track.info.width : 0), // Track width fixed_16_16(track.info.type === "video" ? track.info.height : 0) // Track height ]); }; var mdia = (track, creationTime) => box("mdia", null, [ mdhd(track, creationTime), hdlr(track.info.type === "video" ? "vide" : "soun"), minf(track) ]); var mdhd = (track, creationTime) => { let lastSample = lastPresentedSample(track.samples); let localDuration = intoTimescale( lastSample ? lastSample.presentationTimestamp + lastSample.duration : 0, track.timescale ); let needsU64 = !isU32(creationTime) || !isU32(localDuration); let u32OrU64 = needsU64 ? u64 : u32; return fullBox("mdhd", +needsU64, 0, [ u32OrU64(creationTime), // Creation time u32OrU64(creationTime), // Modification time u32(track.timescale), // Timescale u32OrU64(localDuration), // Duration u16(21956), // Language ("und", undetermined) u16(0) // Quality ]); }; var hdlr = (componentSubtype) => fullBox("hdlr", 0, 0, [ ascii("mhlr"), // Component type ascii(componentSubtype), // Component subtype u32(0), // Component manufacturer u32(0), // Component flags u32(0), // Component flags mask ascii("mp4-muxer-hdlr", true) // Component name ]); var minf = (track) => box("minf", null, [ track.info.type === "video" ? vmhd() : smhd(), dinf(), stbl(track) ]); var vmhd = () => fullBox("vmhd", 0, 1, [ u16(0), // Graphics mode u16(0), // Opcolor R u16(0), // Opcolor G u16(0) // Opcolor B ]); var smhd = () => fullBox("smhd", 0, 0, [ u16(0), // Balance u16(0) // Reserved ]); var dinf = () => box("dinf", null, [ dref() ]); var dref = () => fullBox("dref", 0, 0, [ u32(1) // Entry count ], [ url() ]); var url = () => fullBox("url ", 0, 1); var stbl = (track) => { const needsCtts = track.compositionTimeOffsetTable.length > 1 || track.compositionTimeOffsetTable.some((x) => x.sampleCompositionTimeOffset !== 0); return box("stbl", null, [ stsd(track), stts(track), stss(track), stsc(track), stsz(track), stco(track), needsCtts ? ctts(track) : null ]); }; var stsd = (track) => fullBox("stsd", 0, 0, [ u32(1) // Entry count ], [ track.info.type === "video" ? videoSampleDescription( VIDEO_CODEC_TO_BOX_NAME[track.info.codec], track ) : soundSampleDescription( AUDIO_CODEC_TO_BOX_NAME[track.info.codec], track ) ]); var videoSampleDescription = (compressionType, track) => box(compressionType, [ Array(6).fill(0), // Reserved u16(1), // Data reference index u16(0), // Pre-defined u16(0), // Reserved Array(12).fill(0), // Pre-defined u16(track.info.width), // Width u16(track.info.height), // Height u32(4718592), // Horizontal resolution u32(4718592), // Vertical resolution u32(0), // Reserved u16(1), // Frame count Array(32).fill(0), // Compressor name u16(24), // Depth i16(65535) // Pre-defined ], [ VIDEO_CODEC_TO_CONFIGURATION_BOX[track.info.codec](track) ]); var avcC = (track) => track.info.decoderConfig && box("avcC", [ // For AVC, description is an AVCDecoderConfigurationRecord, so nothing else to do here ...new Uint8Array(track.info.decoderConfig.description) ]); var hvcC = (track) => track.info.decoderConfig && box("hvcC", [ // For HEVC, description is a HEVCDecoderConfigurationRecord, so nothing else to do here ...new Uint8Array(track.info.decoderConfig.description) ]); var vpcC = (track) => { if (!track.info.decoderConfig) { return null; } let decoderConfig = track.info.decoderConfig; if (!decoderConfig.colorSpace) { throw new Error(`'colorSpace' is required in the decoder config for VP9.`); } let parts = decoderConfig.codec.split("."); let profile = Number(parts[1]); let level = Number(parts[2]); let bitDepth = Number(parts[3]); let chromaSubsampling = 0; let thirdByte = (bitDepth << 4) + (chromaSubsampling << 1) + Number(decoderConfig.colorSpace.fullRange); let colourPrimaries = 2; let transferCharacteristics = 2; let matrixCoefficients = 2; return fullBox("vpcC", 1, 0, [ u8(profile), // Profile u8(level), // Level u8(thirdByte), // Bit depth, chroma subsampling, full range u8(colourPrimaries), // Colour primaries u8(transferCharacteristics), // Transfer characteristics u8(matrixCoefficients), // Matrix coefficients u16(0) // Codec initialization data size ]); }; var av1C = () => { let marker = 1; let version = 1; let firstByte = (marker << 7) + version; return box("av1C", [ firstByte, 0, 0, 0 ]); }; var soundSampleDescription = (compressionType, track) => box(compressionType, [ Array(6).fill(0), // Reserved u16(1), // Data reference index u16(0), // Version u16(0), // Revision level u32(0), // Vendor u16(track.info.numberOfChannels), // Number of channels u16(16), // Sample size (bits) u16(0), // Compression ID u16(0), // Packet size fixed_16_16(track.info.sampleRate) // Sample rate ], [ AUDIO_CODEC_TO_CONFIGURATION_BOX[track.info.codec](track) ]); var esds = (track) => { let description = new Uint8Array(track.info.decoderConfig.description); return fullBox("esds", 0, 0, [ // https://stackoverflow.com/a/54803118 u32(58753152), // TAG(3) = Object Descriptor ([2]) u8(32 + description.byteLength), // length of this OD (which includes the next 2 tags) u16(1), // ES_ID = 1 u8(0), // flags etc = 0 u32(75530368), // TAG(4) = ES Descriptor ([2]) embedded in above OD u8(18 + description.byteLength), // length of this ESD u8(64), // MPEG-4 Audio u8(21), // stream type(6bits)=5 audio, flags(2bits)=1 u24(0), // 24bit buffer size u32(130071), // max bitrate u32(130071), // avg bitrate u32(92307584), // TAG(5) = ASC ([2],[3]) embedded in above OD u8(description.byteLength), // length ...description, u32(109084800), // TAG(6) u8(1), // length u8(2) // data ]); }; var dOps = (track) => box("dOps", [ u8(0), // Version u8(track.info.numberOfChannels), // OutputChannelCount u16(3840), // PreSkip, should be at least 80 milliseconds worth of playback, measured in 48000 Hz samples u32(track.info.sampleRate), // InputSampleRate fixed_8_8(0), // OutputGain u8(0) // ChannelMappingFamily ]); var stts = (track) => { return fullBox("stts", 0, 0, [ u32(track.timeToSampleTable.length), // Number of entries track.timeToSampleTable.map((x) => [ // Time-to-sample table u32(x.sampleCount), // Sample count u32(x.sampleDelta) // Sample duration ]) ]); }; var stss = (track) => { if (track.samples.every((x) => x.type === "key")) return null; let keySamples = [...track.samples.entries()].filter(([, sample]) => sample.type === "key"); return fullBox("stss", 0, 0, [ u32(keySamples.length), // Number of entries keySamples.map(([index]) => u32(index + 1)) // Sync sample table ]); }; var stsc = (track) => { return fullBox("stsc", 0, 0, [ u32(track.compactlyCodedChunkTable.length), // Number of entries track.compactlyCodedChunkTable.map((x) => [ // Sample-to-chunk table u32(x.firstChunk), // First chunk u32(x.samplesPerChunk), // Samples per chunk u32(1) // Sample description index ]) ]); }; var stsz = (track) => fullBox("stsz", 0, 0, [ u32(0), // Sample size (0 means non-constant size) u32(track.samples.length), // Number of entries track.samples.map((x) => u32(x.size)) // Sample size table ]); var stco = (track) => { if (track.finalizedChunks.length > 0 && last(track.finalizedChunks).offset >= 2 ** 32) { return fullBox("co64", 0, 0, [ u32(track.finalizedChunks.length), // Number of entries track.finalizedChunks.map((x) => u64(x.offset)) // Chunk offset table ]); } return fullBox("stco", 0, 0, [ u32(track.finalizedChunks.length), // Number of entries track.finalizedChunks.map((x) => u32(x.offset)) // Chunk offset table ]); }; var ctts = (track) => { return fullBox("ctts", 0, 0, [ u32(track.compositionTimeOffsetTable.length), // Number of entries track.compositionTimeOffsetTable.map((x) => [ // Time-to-sample table u32(x.sampleCount), // Sample count u32(x.sampleCompositionTimeOffset) // Sample offset ]) ]); }; var mvex = (tracks) => { return box("mvex", null, tracks.map(trex)); }; var trex = (track) => { return fullBox("trex", 0, 0, [ u32(track.id), // Track ID u32(1), // Default sample description index u32(0), // Default sample duration u32(0), // Default sample size u32(0) // Default sample flags ]); }; var moof = (sequenceNumber, tracks) => { return box("moof", null, [ mfhd(sequenceNumber), ...tracks.map(traf) ]); }; var mfhd = (sequenceNumber) => { return fullBox("mfhd", 0, 0, [ u32(sequenceNumber) // Sequence number ]); }; var fragmentSampleFlags = (sample) => { let byte1 = 0; let byte2 = 0; let byte3 = 0; let byte4 = 0; let sampleIsDifferenceSample = sample.type === "delta"; byte2 |= +sampleIsDifferenceSample; if (sampleIsDifferenceSample) { byte1 |= 1; } else { byte1 |= 2; } return byte1 << 24 | byte2 << 16 | byte3 << 8 | byte4; }; var traf = (track) => { return box("traf", null, [ tfhd(track), tfdt(track), trun(track) ]); }; var tfhd = (track) => { let tfFlags = 0; tfFlags |= 8; tfFlags |= 16; tfFlags |= 32; tfFlags |= 131072; let referenceSample = track.currentChunk.samples[1] ?? track.currentChunk.samples[0]; let referenceSampleInfo = { duration: referenceSample.timescaleUnitsToNextSample, size: referenceSample.size, flags: fragmentSampleFlags(referenceSample) }; return fullBox("tfhd", 0, tfFlags, [ u32(track.id), // Track ID u32(referenceSampleInfo.duration), // Default sample duration u32(referenceSampleInfo.size), // Default sample size u32(referenceSampleInfo.flags) // Default sample flags ]); }; var tfdt = (track) => { return fullBox("tfdt", 1, 0, [ u64(intoTimescale(track.currentChunk.startTimestamp, track.timescale)) // Base Media Decode Time ]); }; var trun = (track) => { let allSampleDurations = track.currentChunk.samples.map((x) => x.timescaleUnitsToNextSample); let allSampleSizes = track.currentChunk.samples.map((x) => x.size); let allSampleFlags = track.currentChunk.samples.map(fragmentSampleFlags); let allSampleCompositionTimeOffsets = track.currentChunk.samples.map((x) => intoTimescale(x.presentationTimestamp - x.decodeTimestamp, track.timescale)); let uniqueSampleDurations = new Set(allSampleDurations); let uniqueSampleSizes = new Set(allSampleSizes); let uniqueSampleFlags = new Set(allSampleFlags); let uniqueSampleCompositionTimeOffsets = new Set(allSampleCompositionTimeOffsets); let firstSampleFlagsPresent = uniqueSampleFlags.size === 2 && allSampleFlags[0] !== allSampleFlags[1]; let sampleDurationPresent = uniqueSampleDurations.size > 1; let sampleSizePresent = uniqueSampleSizes.size > 1; let sampleFlagsPresent = !firstSampleFlagsPresent && uniqueSampleFlags.size > 1; let sampleCompositionTimeOffsetsPresent = uniqueSampleCompositionTimeOffsets.size > 1 || [...uniqueSampleCompositionTimeOffsets].some((x) => x !== 0); let flags = 0; flags |= 1; flags |= 4 * +firstSampleFlagsPresent; flags |= 256 * +sampleDurationPresent; flags |= 512 * +sampleSizePresent; flags |= 1024 * +sampleFlagsPresent; flags |= 2048 * +sampleCompositionTimeOffsetsPresent; return fullBox("trun", 1, flags, [ u32(track.currentChunk.samples.length), // Sample count u32(track.currentChunk.offset - track.currentChunk.moofOffset || 0), // Data offset firstSampleFlagsPresent ? u32(allSampleFlags[0]) : [], track.currentChunk.samples.map((_, i) => [ sampleDurationPresent ? u32(allSampleDurations[i]) : [], // Sample duration sampleSizePresent ? u32(allSampleSizes[i]) : [], // Sample size sampleFlagsPresent ? u32(allSampleFlags[i]) : [], // Sample flags // Sample composition time offsets sampleCompositionTimeOffsetsPresent ? i32(allSampleCompositionTimeOffsets[i]) : [] ]) ]); }; var mfra = (tracks) => { return box("mfra", null, [ ...tracks.map(tfra), mfro() ]); }; var tfra = (track, trackIndex) => { let version = 1; return fullBox("tfra", version, 0, [ u32(track.id), // Track ID u32(63), // This specifies that traf number, trun number and sample number are 32-bit ints u32(track.finalizedChunks.length), // Number of entries track.finalizedChunks.map((chunk) => [ u64(intoTimescale(chunk.startTimestamp, track.timescale)), // Time u64(chunk.moofOffset), // moof offset u32(trackIndex + 1), // traf number u32(1), // trun number u32(1) // Sample number ]) ]); }; var mfro = () => { return fullBox("mfro", 0, 0, [ // This value needs to be overwritten manually from the outside, where the actual size of the enclosing mfra box // is known u32(0) // Size ]); }; var VIDEO_CODEC_TO_BOX_NAME = { "avc": "avc1", "hevc": "hvc1", "vp9": "vp09", "av1": "av01" }; var VIDEO_CODEC_TO_CONFIGURATION_BOX = { "avc": avcC, "hevc": hvcC, "vp9": vpcC, "av1": av1C }; var AUDIO_CODEC_TO_BOX_NAME = { "aac": "mp4a", "opus": "Opus" }; var AUDIO_CODEC_TO_CONFIGURATION_BOX = { "aac": esds, "opus": dOps }; var ArrayBufferTarget = class { constructor() { this.buffer = null; } }; var StreamTarget = class { constructor(options) { this.options = options; } }; var FileSystemWritableFileStreamTarget = class { constructor(stream, options) { this.stream = stream; this.options = options; } }; var _helper, _helperView; var Writer = class { constructor() { this.pos = 0; __privateAdd(this, _helper, new Uint8Array(8)); __privateAdd(this, _helperView, new DataView(__privateGet(this, _helper).buffer)); this.offsets = /* @__PURE__ */ new WeakMap(); } /** Sets the current position for future writes to a new one. */ seek(newPos) { this.pos = newPos; } writeU32(value) { __privateGet(this, _helperView).setUint32(0, value, false); this.write(__privateGet(this, _helper).subarray(0, 4)); } writeU64(value) { __privateGet(this, _helperView).setUint32(0, Math.floor(value / 2 ** 32), false); __privateGet(this, _helperView).setUint32(4, value, false); this.write(__privateGet(this, _helper).subarray(0, 8)); } writeAscii(text2) { for (let i = 0; i < text2.length; i++) { __privateGet(this, _helperView).setUint8(i % 8, text2.charCodeAt(i)); if (i % 8 === 7) this.write(__privateGet(this, _helper)); } if (text2.length % 8 !== 0) { this.write(__privateGet(this, _helper).subarray(0, text2.length % 8)); } } writeBox(box2) { this.offsets.set(box2, this.pos); if (box2.contents && !box2.children) { this.writeBoxHeader(box2, box2.size ?? box2.contents.byteLength + 8); this.write(box2.contents); } else { let startPos = this.pos; this.writeBoxHeader(box2, 0); if (box2.contents) this.write(box2.contents); if (box2.children) { for (let child of box2.children) if (child) this.writeBox(child); } let endPos = this.pos; let size = box2.size ?? endPos - startPos; this.seek(startPos); this.writeBoxHeader(box2, size); this.seek(endPos); } } writeBoxHeader(box2, size) { this.writeU32(box2.largeSize ? 1 : size); this.writeAscii(box2.type); if (box2.largeSize) this.writeU64(size); } measureBoxHeader(box2) { return 8 + (box2.largeSize ? 8 : 0); } patchBox(box2) { let endPos = this.pos; this.seek(this.offsets.get(box2)); this.writeBox(box2); this.seek(endPos); } measureBox(box2) { if (box2.contents && !box2.children) { let headerSize = this.measureBoxHeader(box2); return headerSize + box2.contents.byteLength; } else { let result = this.measureBoxHeader(box2); if (box2.contents) result += box2.contents.byteLength; if (box2.children) { for (let child of box2.children) if (child) result += this.measureBox(child); } return result; } } }; _helper = /* @__PURE__ */ new WeakMap(); _helperView = /* @__PURE__ */ new WeakMap(); var _target, _buffer, _bytes, _maxPos, _ensureSize, ensureSize_fn; var ArrayBufferTargetWriter = class extends Writer { constructor(target) { super(); __privateAdd(this, _ensureSize); __privateAdd(this, _target, void 0); __privateAdd(this, _buffer, new ArrayBuffer(2 ** 16)); __privateAdd(this, _bytes, new Uint8Array(__privateGet(this, _buffer))); __privateAdd(this, _maxPos, 0); __privateSet(this, _target, target); } write(data) { __privateMethod(this, _ensureSize, ensureSize_fn).call(this, this.pos + data.byteLength); __privateGet(this, _bytes).set(data, this.pos); this.pos += data.byteLength; __privateSet(this, _maxPos, Math.max(__privateGet(this, _maxPos), this.pos)); } finalize() { __privateMethod(this, _ensureSize, ensureSize_fn).call(this, this.pos); __privateGet(this, _target).buffer = __privateGet(this, _buffer).slice(0, Math.max(__privateGet(this, _maxPos), this.pos)); } }; _target = /* @__PURE__ */ new WeakMap(); _buffer = /* @__PURE__ */ new WeakMap(); _bytes = /* @__PURE__ */ new WeakMap(); _maxPos = /* @__PURE__ */ new WeakMap(); _ensureSize = /* @__PURE__ */ new WeakSet(); ensureSize_fn = function(size) { let newLength = __privateGet(this, _buffer).byteLength; while (newLength < size) newLength *= 2; if (newLength === __privateGet(this, _buffer).byteLength) return; let newBuffer = new ArrayBuffer(newLength); let newBytes = new Uint8Array(newBuffer); newBytes.set(__privateGet(this, _bytes), 0); __privateSet(this, _buffer, newBuffer); __privateSet(this, _bytes, newBytes); }; var _target2, _sections; var StreamTargetWriter = class extends Writer { constructor(target) { super(); __privateAdd(this, _target2, void 0); __privateAdd(this, _sections, []); __privateSet(this, _target2, target); } write(data) { __privateGet(this, _sections).push({ data: data.slice(), start: this.pos }); this.pos += data.byteLength; } flush() { var _a, _b; if (__privateGet(this, _sections).length === 0) return; let chunks = []; let sorted = [...__privateGet(this, _sections)].sort((a, b) => a.start - b.start); chunks.push({ start: sorted[0].start, size: sorted[0].data.byteLength }); for (let i = 1; i < sorted.length; i++) { let lastChunk = chunks[chunks.length - 1]; let section = sorted[i]; if (section.start <= lastChunk.start + lastChunk.size) { lastChunk.size = Math.max(lastChunk.size, section.start + section.data.byteLength - lastChunk.start); } else { chunks.push({ start: section.start, size: section.data.byteLength }); } } for (let chunk of chunks) { chunk.data = new Uint8Array(chunk.size); for (let section of __privateGet(this, _sections)) { if (chunk.start <= section.start && section.start < chunk.start + chunk.size) { chunk.data.set(section.data, section.start - chunk.start); } } (_b = (_a = __privateGet(this, _target2).options).onData) == null ? void 0 : _b.call(_a, chunk.data, chunk.start); } __privateGet(this, _sections).length = 0; } finalize() { } }; _target2 = /* @__PURE__ */ new WeakMap(); _sections = /* @__PURE__ */ new WeakMap(); var DEFAULT_CHUNK_SIZE = 2 ** 24; var MAX_CHUNKS_AT_ONCE = 2; var _target3, _chunkSize, _chunks, _writeDataIntoChunks, writeDataIntoChunks_fn, _insertSectionIntoChunk, insertSectionIntoChunk_fn, _createChunk, createChunk_fn, _flushChunks, flushChunks_fn; var ChunkedStreamTargetWriter = class extends Writer { constructor(target) { var _a; super(); __privateAdd(this, _writeDataIntoChunks); __privateAdd(this, _insertSectionIntoChunk); __privateAdd(this, _createChunk); __privateAdd(this, _flushChunks); __privateAdd(this, _target3, void 0); __privateAdd(this, _chunkSize, void 0); __privateAdd(this, _chunks, []); __privateSet(this, _target3, target); __privateSet(this, _chunkSize, ((_a = target.options) == null ? void 0 : _a.chunkSize) ?? DEFAULT_CHUNK_SIZE); if (!Number.isInteger(__privateGet(this, _chunkSize)) || __privateGet(this, _chunkSize) < 2 ** 10) { throw new Error("Invalid StreamTarget options: chunkSize must be an integer not smaller than 1024."); } } write(data) { __privateMethod(this, _writeDataIntoChunks, writeDataIntoChunks_fn).call(this, data, this.pos); __privateMethod(this, _flushChunks, flushChunks_fn).call(this); this.pos += data.byteLength; } finalize() { __privateMethod(this, _flushChunks, flushChunks_fn).call(this, true); } }; _target3 = /* @__PURE__ */ new WeakMap(); _chunkSize = /* @__PURE__ */ new WeakMap(); _chunks = /* @__PURE__ */ new WeakMap(); _writeDataIntoChunks = /* @__PURE__ */ new WeakSet(); writeDataIntoChunks_fn = function(data, position) { let chunkIndex = __privateGet(this, _chunks).findIndex((x) => x.start <= position && position < x.start + __privateGet(this, _chunkSize)); if (chunkIndex === -1) chunkIndex = __privateMethod(this, _createChunk, createChunk_fn).call(this, position); let chunk = __privateGet(this, _chunks)[chunkIndex]; let relativePosition = position - chunk.start; let toWrite = data.subarray(0, Math.min(__privateGet(this, _chunkSize) - relativePosition, data.byteLength)); chunk.data.set(toWrite, relativePosition); let section = { start: relativePosition, end: relativePosition + toWrite.byteLength }; __privateMethod(this, _insertSectionIntoChunk, insertSectionIntoChunk_fn).call(this, chunk, section); if (chunk.written[0].start === 0 && chunk.written[0].end === __privateGet(this, _chunkSize)) { chunk.shouldFlush = true; } if (__privateGet(this, _chunks).length > MAX_CHUNKS_AT_ONCE) { for (let i = 0; i < __privateGet(this, _chunks).length - 1; i++) { __privateGet(this, _chunks)[i].shouldFlush = true; } __privateMethod(this, _flushChunks, flushChunks_fn).call(this); } if (toWrite.byteLength < data.byteLength) { __privateMethod(this, _writeDataIntoChunks, writeDataIntoChunks_fn).call(this, data.subarray(toWrite.byteLength), position + toWrite.byteLength); } }; _insertSectionIntoChunk = /* @__PURE__ */ new WeakSet(); insertSectionIntoChunk_fn = function(chunk, section) { let low = 0; let high = chunk.written.length - 1; let index = -1; while (low <= high) { let mid = Math.floor(low + (high - low + 1) / 2); if (chunk.written[mid].start <= section.start) { low = mid + 1; index = mid; } else { high = mid - 1; } } chunk.written.splice(index + 1, 0, section); if (index === -1 || chunk.written[index].end < section.start) index++; while (index < chunk.written.length - 1 && chunk.written[index].end >= chunk.written[index + 1].start) { chunk.written[index].end = Math.max(chunk.written[index].end, chunk.written[index + 1].end); chunk.written.splice(index + 1, 1); } }; _createChunk = /* @__PURE__ */ new WeakSet(); createChunk_fn = function(includesPosition) { let start = Math.floor(includesPosition / __privateGet(this, _chunkSize)) * __privateGet(this, _chunkSize); let chunk = { start, data: new Uint8Array(__privateGet(this, _chunkSize)), written: [], shouldFlush: false }; __privateGet(this, _chunks).push(chunk); __privateGet(this, _chunks).sort((a, b) => a.start - b.start); return __privateGet(this, _chunks).indexOf(chunk); }; _flushChunks = /* @__PURE__ */ new WeakSet(); flushChunks_fn = function(force = false) { var _a, _b; for (let i = 0; i < __privateGet(this, _chunks).length; i++) { let chunk = __privateGet(this, _chunks)[i]; if (!chunk.shouldFlush && !force) continue; for (let section of chunk.written) { (_b = (_a = __privateGet(this, _target3).options).onData) == null ? void 0 : _b.call( _a, chunk.data.subarray(section.start, section.end), chunk.start + section.start ); } __privateGet(this, _chunks).splice(i--, 1); } }; var FileSystemWritableFileStreamTargetWriter = class extends ChunkedStreamTargetWriter { constructor(target) { var _a; super(new StreamTarget({ onData: (data, position) => target.stream.write({ type: "write", data, position }), chunkSize: (_a = target.options) == null ? void 0 : _a.chunkSize })); } }; var GLOBAL_TIMESCALE = 1e3; var SUPPORTED_VIDEO_CODECS2 = ["avc", "hevc", "vp9", "av1"]; var SUPPORTED_AUDIO_CODECS2 = ["aac", "opus"]; var TIMESTAMP_OFFSET = 2082844800; var FIRST_TIMESTAMP_BEHAVIORS = ["strict", "offset", "cross-track-offset"]; var _options, _writer, _ftypSize, _mdat, _videoTrack, _audioTrack, _creationTime, _finalizedChunks, _nextFragmentNumber, _videoSampleQueue, _audioSampleQueue, _finalized, _validateOptions, validateOptions_fn, _writeHeader, writeHeader_fn, _computeMoovSizeUpperBound, computeMoovSizeUpperBound_fn, _prepareTracks, prepareTracks_fn, _generateMpeg4AudioSpecificConfig, generateMpeg4AudioSpecificConfig_fn, _createSampleForTrack, createSampleForTrack_fn, _addSampleToTrack, addSampleToTrack_fn, _validateTimestamp, validateTimestamp_fn, _finalizeCurrentChunk, finalizeCurrentChunk_fn, _finalizeFragment, finalizeFragment_fn, _maybeFlushStreamingTargetWriter, maybeFlushStreamingTargetWriter_fn, _ensureNotFinalized, ensureNotFinalized_fn; var Muxer = class { constructor(options) { var _a; __privateAdd(this, _validateOptions); __privateAdd(this, _writeHeader); __privateAdd(this, _computeMoovSizeUpperBound); __privateAdd(this, _prepareTracks); __privateAdd(this, _generateMpeg4AudioSpecificConfig); __privateAdd(this, _createSampleForTrack); __privateAdd(this, _addSampleToTrack); __privateAdd(this, _validateTimestamp); __privateAdd(this, _finalizeCurrentChunk); __privateAdd(this, _finalizeFragment); __privateAdd(this, _maybeFlushStreamingTargetWriter); __privateAdd(this, _ensureNotFinalized); __privateAdd(this, _options, void 0); __privateAdd(this, _writer, void 0); __privateAdd(this, _ftypSize, void 0); __privateAdd(this, _mdat, void 0); __privateAdd(this, _videoTrack, null); __privateAdd(this, _audioTrack, null); __privateAdd(this, _creationTime, Math.floor(Date.now() / 1e3) + TIMESTAMP_OFFSET); __privateAdd(this, _finalizedChunks, []); __privateAdd(this, _nextFragmentNumber, 1); __privateAdd(this, _videoSampleQueue, []); __privateAdd(this, _audioSampleQueue, []); __privateAdd(this, _finalized, false); __privateMethod(this, _validateOptions, validateOptions_fn).call(this, options); options.video = deepClone(options.video); options.audio = deepClone(options.audio); options.fastStart = deepClone(options.fastStart); this.target = options.target; __privateSet(this, _options, { firstTimestampBehavior: "strict", ...options }); if (options.target instanceof ArrayBufferTarget) { __privateSet(this, _writer, new ArrayBufferTargetWriter(options.target)); } else if (options.target instanceof StreamTarget) { __privateSet(this, _writer, ((_a = options.target.options) == null ? void 0 : _a.chunked) ? new ChunkedStreamTargetWriter(options.target) : new StreamTargetWriter(options.target)); } else if (options.target instanceof FileSystemWritableFileStreamTarget) { __privateSet(this, _writer, new FileSystemWritableFileStreamTargetWriter(options.target)); } else { throw new Error(`Invalid target: ${options.target}`); } __privateMethod(this, _prepareTracks, prepareTracks_fn).call(this); __privateMethod(this, _writeHeader, writeHeader_fn).call(this); } addVideoChunk(sample, meta, timestamp, compositionTimeOffset) { let data = new Uint8Array(sample.byteLength); sample.copyTo(data); this.addVideoChunkRaw( data, sample.type, timestamp ?? sample.timestamp, sample.duration, meta, compositionTimeOffset ); } addVideoChunkRaw(data, type, timestamp, duration, meta, compositionTimeOffset) { __privateMethod(this, _ensureNotFinalized, ensureNotFinalized_fn).call(this); if (!__privateGet(this, _options).video) throw new Error("No video track declared."); if (typeof __privateGet(this, _options).fastStart === "object" && __privateGet(this, _videoTrack).samples.length === __privateGet(this, _options).fastStart.expectedVideoChunks) { throw new Error(`Cannot add more video chunks than specified in 'fastStart' (${__privateGet(this, _options).fastStart.expectedVideoChunks}).`); } let videoSample = __privateMethod(this, _createSampleForTrack, createSampleForTrack_fn).call(this, __privateGet(this, _videoTrack), data, type, timestamp, duration, meta, compositionTimeOffset); if (__privateGet(this, _options).fastStart === "fragmented" && __privateGet(this, _audioTrack)) { while (__privateGet(this, _audioSampleQueue).length > 0 && __privateGet(this, _audioSampleQueue)[0].decodeTimestamp <= videoSample.decodeTimestamp) { let audioSample = __privateGet(this, _audioSampleQueue).shift(); __privateMethod(this, _addSampleToTrack, addSampleToTrack_fn).call(this, __privateGet(this, _audioTrack), audioSample); } if (videoSample.decodeTimestamp <= __privateGet(this, _audioTrack).lastDecodeTimestamp) { __privateMethod(this, _addSampleToTrack, addSampleToTrack_fn).call(this, __privateGet(this, _videoTrack), videoSample); } else { __privateGet(this, _videoSampleQueue).push(videoSample); } } else { __privateMethod(this, _addSampleToTrack, addSampleToTrack_fn).call(this, __privateGet(this, _videoTrack), videoSample); } } addAudioChunk(sample, meta, timestamp) { let data = new Uint8Array(sample.byteLength); sample.copyTo(data); this.addAudioChunkRaw(data, sample.type, timestamp ?? sample.timestamp, sample.duration, meta); } addAudioChunkRaw(data, type, timestamp, duration, meta) { __privateMethod(this, _ensureNotFinalized, ensureNotFinalized_fn).call(this); if (!__privateGet(this, _options).audio) throw new Error("No audio track declared."); if (typeof __privateGet(this, _options).fastStart === "object" && __privateGet(this, _audioTrack).samples.length === __privateGet(this, _options).fastStart.expectedAudioChunks) { throw new Error(`Cannot add more audio chunks than specified in 'fastStart' (${__privateGet(this, _options).fastStart.expectedAudioChunks}).`); } let audioSample = __privateMethod(this, _createSampleForTrack, createSampleForTrack_fn).call(this, __privateGet(this, _audioTrack), data, type, timestamp, duration, meta); if (__privateGet(this, _options).fastStart === "fragmented" && __privateGet(this, _videoTrack)) { while (__privateGet(this, _videoSampleQueue).length > 0 && __privateGet(this, _videoSampleQueue)[0].decodeTimestamp <= audioSample.decodeTimestamp) { let videoSample = __privateGet(this, _videoSampleQueue).shift(); __privateMethod(this, _addSampleToTrack, addSampleToTrack_fn).call(this, __privateGet(this, _videoTrack), videoSample); } if (audioSample.decodeTimestamp <= __privateGet(this, _videoTrack).lastDecodeTimestamp) { __privateMethod(this, _addSampleToTrack, addSampleToTrack_fn).call(this, __privateGet(this, _audioTrack), audioSample); } else { __privateGet(this, _audioSampleQueue).push(audioSample); } } else { __privateMethod(this, _addSampleToTrack, addSampleToTrack_fn).call(this, __privateGet(this, _audioTrack), audioSample); } } /** Finalizes the file, making it ready for use. Must be called after all video and audio chunks have been added. */ finalize() { if (__privateGet(this, _finalized)) { throw new Error("Cannot finalize a muxer more than once."); } if (__privateGet(this, _options).fastStart === "fragmented") { for (let videoSample of __privateGet(this, _videoSampleQueue)) __privateMethod(this, _addSampleToTrack, addSampleToTrack_fn).call(this, __privateGet(this, _videoTrack), videoSample); for (let audioSample of __privateGet(this, _audioSampleQueue)) __privateMethod(this, _addSampleToTrack, addSampleToTrack_fn).call(this, __privateGet(this, _audioTrack), audioSample); __privateMethod(this, _finalizeFragment, finalizeFragment_fn).call(this, false); } else { if (__privateGet(this, _videoTrack)) __privateMethod(this, _finalizeCurrentChunk, finalizeCurrentChunk_fn).call(this, __privateGet(this, _videoTrack)); if (__privateGet(this, _audioTrack)) __privateMethod(this, _finalizeCurrentChunk, finalizeCurrentChunk_fn).call(this, __privateGet(this, _audioTrack)); } let tracks = [__privateGet(this, _videoTrack), __privateGet(this, _audioTrack)].filter(Boolean); if (__privateGet(this, _options).fastStart === "in-memory") { let mdatSize; for (let i = 0; i < 2; i++) { let movieBox2 = moov(tracks, __privateGet(this, _creationTime)); let movieBoxSize = __privateGet(this, _writer).measureBox(movieBox2); mdatSize = __privateGet(this, _writer).measureBox(__privateGet(this, _mdat)); let currentChunkPos = __privateGet(this, _writer).pos + movieBoxSize + mdatSize; for (let chunk of __privateGet(this, _finalizedChunks)) { chunk.offset = currentChunkPos; for (let { data } of chunk.samples) { currentChunkPos += data.byteLength; mdatSize += data.byteLength; } } if (currentChunkPos < 2 ** 32) break; if (mdatSize >= 2 ** 32) __privateGet(this, _mdat).largeSize = true; } let movieBox = moov(tracks, __privateGet(this, _creationTime)); __privateGet(this, _writer).writeBox(movieBox); __privateGet(this, _mdat).size = mdatSize; __privateGet(this, _writer).writeBox(__privateGet(this, _mdat)); for (let chunk of __privateGet(this, _finalizedChunks)) { for (let sample of chunk.samples) { __privateGet(this, _writer).write(sample.data); sample.data = null; } } } else if (__privateGet(this, _options).fastStart === "fragmented") { let startPos = __privateGet(this, _writer).pos; let mfraBox = mfra(tracks); __privateGet(this, _writer).writeBox(mfraBox); let mfraBoxSize = __privateGet(this, _writer).pos - startPos; __privateGet(this, _writer).seek(__privateGet(this, _writer).pos - 4); __privateGet(this, _writer).writeU32(mfraBoxSize); } else { let mdatPos = __privateGet(this, _writer).offsets.get(__privateGet(this, _mdat)); let mdatSize = __privateGet(this, _writer).pos - mdatPos; __privateGet(this, _mdat).size = mdatSize; __privateGet(this, _mdat).largeSize = mdatSize >= 2 ** 32; __privateGet(this, _writer).patchBox(__privateGet(this, _mdat)); let movieBox = moov(tracks, __privateGet(this, _creationTime)); if (typeof __privateGet(this, _options).fastStart === "object") { __privateGet(this, _writer).seek(__privateGet(this, _ftypSize)); __privateGet(this, _writer).writeBox(movieBox); let remainingBytes = mdatPos - __privateGet(this, _writer).pos; __privateGet(this, _writer).writeBox(free(remainingBytes)); } else { __privateGet(this, _writer).writeBox(movieBox); } } __privateMethod(this, _maybeFlushStreamingTargetWriter, maybeFlushStreamingTargetWriter_fn).call(this); __privateGet(this, _writer).finalize(); __privateSet(this, _finalized, true); } }; _options = /* @__PURE__ */ new WeakMap(); _writer = /* @__PURE__ */ new WeakMap(); _ftypSize = /* @__PURE__ */ new WeakMap(); _mdat = /* @__PURE__ */ new WeakMap(); _videoTrack = /* @__PURE__ */ new WeakMap(); _audioTrack = /* @__PURE__ */ new WeakMap(); _creationTime = /* @__PURE__ */ new WeakMap(); _finalizedChunks = /* @__PURE__ */ new WeakMap(); _nextFragmentNumber = /* @__PURE__ */ new WeakMap(); _videoSampleQueue = /* @__PURE__ */ new WeakMap(); _audioSampleQueue = /* @__PURE__ */ new WeakMap(); _finalized = /* @__PURE__ */ new WeakMap(); _validateOptions = /* @__PURE__ */ new WeakSet(); validateOptions_fn = function(options) { if (options.video) { if (!SUPPORTED_VIDEO_CODECS2.includes(options.video.codec)) { throw new Error(`Unsupported video codec: ${options.video.codec}`); } const videoRotation = options.video.rotation; if (typeof videoRotation === "number" && ![0, 90, 180, 270].includes(videoRotation)) { throw new Error(`Invalid video rotation: ${videoRotation}. Has to be 0, 90, 180 or 270.`); } else if (Array.isArray(videoRotation) && (videoRotation.length !== 9 || videoRotation.some((value) => typeof value !== "number"))) { throw new Error(`Invalid video transformation matrix: ${videoRotation.join()}`); } } if (options.audio && !SUPPORTED_AUDIO_CODECS2.includes(options.audio.codec)) { throw new Error(`Unsupported audio codec: ${options.audio.codec}`); } if (options.firstTimestampBehavior && !FIRST_TIMESTAMP_BEHAVIORS.includes(options.firstTimestampBehavior)) { throw new Error(`Invalid first timestamp behavior: ${options.firstTimestampBehavior}`); } if (typeof options.fastStart === "object") { if (options.video && options.fastStart.expectedVideoChunks === void 0) { throw new Error(`'fastStart' is an object but is missing property 'expectedVideoChunks'.`); } if (options.audio && options.fastStart.expectedAudioChunks === void 0) { throw new Error(`'fastStart' is an object but is missing property 'expectedAudioChunks'.`); } } else if (![false, "in-memory", "fragmented"].includes(options.fastStart)) { throw new Error(`'fastStart' option must be false, 'in-memory', 'fragmented' or an object.`); } }; _writeHeader = /* @__PURE__ */ new WeakSet(); writeHeader_fn = function() { var _a; __privateGet(this, _writer).writeBox(ftyp({ holdsAvc: ((_a = __privateGet(this, _options).video) == null ? void 0 : _a.codec) === "avc", fragmented: __privateGet(this, _options).fastStart === "fragmented" })); __privateSet(this, _ftypSize, __privateGet(this, _writer).pos); if (__privateGet(this, _options).fastStart === "in-memory") { __privateSet(this, _mdat, mdat(false)); } else if (__privateGet(this, _options).fastStart === "fragmented") ; else { if (typeof __privateGet(this, _options).fastStart === "object") { let moovSizeUpperBound = __privateMethod(this, _computeMoovSizeUpperBound, computeMoovSizeUpperBound_fn).call(this); __privateGet(this, _writer).seek(__privateGet(this, _writer).pos + moovSizeUpperBound); } __privateSet(this, _mdat, mdat(true)); __privateGet(this, _writer).writeBox(__privateGet(this, _mdat)); } __privateMethod(this, _maybeFlushStreamingTargetWriter, maybeFlushStreamingTargetWriter_fn).call(this); }; _computeMoovSizeUpperBound = /* @__PURE__ */ new WeakSet(); computeMoovSizeUpperBound_fn = function() { if (typeof __privateGet(this, _options).fastStart !== "object") return; let upperBound = 0; let sampleCounts = [ __privateGet(this, _options).fastStart.expectedVideoChunks, __privateGet(this, _options).fastStart.expectedAudioChunks ]; for (let n of sampleCounts) { if (!n) continue; upperBound += (4 + 4) * Math.ceil(2 / 3 * n); upperBound += 4 * n; upperBound += (4 + 4 + 4) * Math.ceil(2 / 3 * n); upperBound += 4 * n; upperBound += 8 * n; } upperBound += 4096; return upperBound; }; _prepareTracks = /* @__PURE__ */ new WeakSet(); prepareTracks_fn = function() { if (__privateGet(this, _options).video) { __privateSet(this, _videoTrack, { id: 1, info: { type: "video", codec: __privateGet(this, _options).video.codec, width: __privateGet(this, _options).video.width, height: __privateGet(this, _options).video.height, rotation: __privateGet(this, _options).video.rotation ?? 0, decoderConfig: null }, timescale: 11520, // Timescale used by FFmpeg, contains many common frame rates as factors samples: [], finalizedChunks: [], currentChunk: null, firstDecodeTimestamp: void 0, lastDecodeTimestamp: -1, timeToSampleTable: [], compositionTimeOffsetTable: [], lastTimescaleUnits: null, lastSample: null, compactlyCodedChunkTable: [] }); } if (__privateGet(this, _options).audio) { let guessedCodecPrivate = __privateMethod(this, _generateMpeg4AudioSpecificConfig, generateMpeg4AudioSpecificConfig_fn).call( this, 2, // Object type for AAC-LC, since it's the most common __privateGet(this, _options).audio.sampleRate, __privateGet(this, _options).audio.numberOfChannels ); __privateSet(this, _audioTrack, { id: __privateGet(this, _options).video ? 2 : 1, info: { type: "audio", codec: __privateGet(this, _options).audio.codec, numberOfChannels: __privateGet(this, _options).audio.numberOfChannels, sampleRate: __privateGet(this, _options).audio.sampleRate, decoderConfig: { codec: __privateGet(this, _options).audio.codec, description: guessedCodecPrivate, numberOfChannels: __privateGet(this, _options).audio.numberOfChannels, sampleRate: __privateGet(this, _options).audio.sampleRate } }, timescale: __privateGet(this, _options).audio.sampleRate, samples: [], finalizedChunks: [], currentChunk: null, firstDecodeTimestamp: void 0, lastDecodeTimestamp: -1, timeToSampleTable: [], compositionTimeOffsetTable: [], lastTimescaleUnits: null, lastSample: null, compactlyCodedChunkTable: [] }); } }; _generateMpeg4AudioSpecificConfig = /* @__PURE__ */ new WeakSet(); generateMpeg4AudioSpecificConfig_fn = function(objectType, sampleRate, numberOfChannels) { let frequencyIndices = [96e3, 88200, 64e3, 48e3, 44100, 32e3, 24e3, 22050, 16e3, 12e3, 11025, 8e3, 7350]; let frequencyIndex = frequencyIndices.indexOf(sampleRate); let channelConfig = numberOfChannels; let configBits = ""; configBits += objectType.toString(2).padStart(5, "0"); configBits += frequencyIndex.toString(2).padStart(4, "0"); if (frequencyIndex === 15) configBits += sampleRate.toString(2).padStart(24, "0"); configBits += channelConfig.toString(2).padStart(4, "0"); let paddingLength = Math.ceil(configBits.length / 8) * 8; configBits = configBits.padEnd(paddingLength, "0"); let configBytes = new Uint8Array(configBits.length / 8); for (let i = 0; i < configBits.length; i += 8) { configBytes[i / 8] = parseInt(configBits.slice(i, i + 8), 2); } return configBytes; }; _createSampleForTrack = /* @__PURE__ */ new WeakSet(); createSampleForTrack_fn = function(track, data, type, timestamp, duration, meta, compositionTimeOffset) { let presentationTimestampInSeconds = timestamp / 1e6; let decodeTimestampInSeconds = (timestamp - (compositionTimeOffset ?? 0)) / 1e6; let durationInSeconds = duration / 1e6; let adjusted = __privateMethod(this, _validateTimestamp, validateTimestamp_fn).call(this, presentationTimestampInSeconds, decodeTimestampInSeconds, track); presentationTimestampInSeconds = adjusted.presentationTimestamp; decodeTimestampInSeconds = adjusted.decodeTimestamp; if (meta == null ? void 0 : meta.decoderConfig) { if (track.info.decoderConfig === null) { track.info.decoderConfig = meta.decoderConfig; } else { Object.assign(track.info.decoderConfig, meta.decoderConfig); } } let sample = { presentationTimestamp: presentationTimestampInSeconds, decodeTimestamp: decodeTimestampInSeconds, duration: durationInSeconds, data, size: data.byteLength, type, // Will be refined once the next sample comes in timescaleUnitsToNextSample: intoTimescale(durationInSeconds, track.timescale) }; return sample; }; _addSampleToTrack = /* @__PURE__ */ new WeakSet(); addSampleToTrack_fn = function(track, sample) { if (__privateGet(this, _options).fastStart !== "fragmented") { track.samples.push(sample); } const sampleCompositionTimeOffset = intoTimescale(sample.presentationTimestamp - sample.decodeTimestamp, track.timescale); if (track.lastTimescaleUnits !== null) { let timescaleUnits = intoTimescale(sample.decodeTimestamp, track.timescale, false); let delta = Math.round(timescaleUnits - track.lastTimescaleUnits); track.lastTimescaleUnits += delta; track.lastSample.timescaleUnitsToNextSample = delta; if (__privateGet(this, _options).fastStart !== "fragmented") { let lastTableEntry = last(track.timeToSampleTable); if (lastTableEntry.sampleCount === 1) { lastTableEntry.sampleDelta = delta; lastTableEntry.sampleCount++; } else if (lastTableEntry.sampleDelta === delta) { lastTableEntry.sampleCount++; } else { lastTableEntry.sampleCount--; track.timeToSampleTable.push({ sampleCount: 2, sampleDelta: delta }); } const lastCompositionTimeOffsetTableEntry = last(track.compositionTimeOffsetTable); if (lastCompositionTimeOffsetTableEntry.sampleCompositionTimeOffset === sampleCompositionTimeOffset) { lastCompositionTimeOffsetTableEntry.sampleCount++; } else { track.compositionTimeOffsetTable.push({ sampleCount: 1, sampleCompositionTimeOffset }); } } } else { track.lastTimescaleUnits = 0; if (__privateGet(this, _options).fastStart !== "fragmented") { track.timeToSampleTable.push({ sampleCount: 1, sampleDelta: intoTimescale(sample.duration, track.timescale) }); track.compositionTimeOffsetTable.push({ sampleCount: 1, sampleCompositionTimeOffset }); } } track.lastSample = sample; let beginNewChunk = false; if (!track.currentChunk) { beginNewChunk = true; } else { let currentChunkDuration = sample.presentationTimestamp - track.currentChunk.startTimestamp; if (__privateGet(this, _options).fastStart === "fragmented") { let mostImportantTrack = __privateGet(this, _videoTrack) ?? __privateGet(this, _audioTrack); if (track === mostImportantTrack && sample.type === "key" && currentChunkDuration >= 1) { beginNewChunk = true; __privateMethod(this, _finalizeFragment, finalizeFragment_fn).call(this); } } else { beginNewChunk = currentChunkDuration >= 0.5; } } if (beginNewChunk) { if (track.currentChunk) { __privateMethod(this, _finalizeCurrentChunk, finalizeCurrentChunk_fn).call(this, track); } track.currentChunk = { startTimestamp: sample.presentationTimestamp, samples: [] }; } track.currentChunk.samples.push(sample); }; _validateTimestamp = /* @__PURE__ */ new WeakSet(); validateTimestamp_fn = function(presentationTimestamp, decodeTimestamp, track) { var _a, _b; const strictTimestampBehavior = __privateGet(this, _options).firstTimestampBehavior === "strict"; const noLastDecodeTimestamp = track.lastDecodeTimestamp === -1; const timestampNonZero = decodeTimestamp !== 0; if (strictTimestampBehavior && noLastDecodeTimestamp && timestampNonZero) { throw new Error( `The first chunk for your media track must have a timestamp of 0 (received DTS=${decodeTimestamp}).Non-zero first timestamps are often caused by directly piping frames or audio data from a MediaStreamTrack into the encoder. Their timestamps are typically relative to the age of thedocument, which is probably what you want. If you want to offset all timestamps of a track such that the first one is zero, set firstTimestampBehavior: 'offset' in the options. ` ); } else if (__privateGet(this, _options).firstTimestampBehavior === "offset" || __privateGet(this, _options).firstTimestampBehavior === "cross-track-offset") { if (track.firstDecodeTimestamp === void 0) { track.firstDecodeTimestamp = decodeTimestamp; } let baseDecodeTimestamp; if (__privateGet(this, _options).firstTimestampBehavior === "offset") { baseDecodeTimestamp = track.firstDecodeTimestamp; } else { baseDecodeTimestamp = Math.min( ((_a = __privateGet(this, _videoTrack)) == null ? void 0 : _a.firstDecodeTimestamp) ?? Infinity, ((_b = __privateGet(this, _audioTrack)) == null ? void 0 : _b.firstDecodeTimestamp) ?? Infinity ); } decodeTimestamp -= baseDecodeTimestamp; presentationTimestamp -= baseDecodeTimestamp; } if (decodeTimestamp < track.lastDecodeTimestamp) { throw new Error( `Timestamps must be monotonically increasing (DTS went from ${track.lastDecodeTimestamp * 1e6} to ${decodeTimestamp * 1e6}).` ); } track.lastDecodeTimestamp = decodeTimestamp; return { presentationTimestamp, decodeTimestamp }; }; _finalizeCurrentChunk = /* @__PURE__ */ new WeakSet(); finalizeCurrentChunk_fn = function(track) { if (__privateGet(this, _options).fastStart === "fragmented") { throw new Error("Can't finalize individual chunks 'fastStart' is set to 'fragmented'."); } if (!track.currentChunk) return; track.finalizedChunks.push(track.currentChunk); __privateGet(this, _finalizedChunks).push(track.currentChunk); if (track.compactlyCodedChunkTable.length === 0 || last(track.compactlyCodedChunkTable).samplesPerChunk !== track.currentChunk.samples.length) { track.compactlyCodedChunkTable.push({ firstChunk: track.finalizedChunks.length, // 1-indexed samplesPerChunk: track.currentChunk.samples.length }); } if (__privateGet(this, _options).fastStart === "in-memory") { track.currentChunk.offset = 0; return; } track.currentChunk.offset = __privateGet(this, _writer).pos; for (let sample of track.currentChunk.samples) { __privateGet(this, _writer).write(sample.data); sample.data = null; } __privateMethod(this, _maybeFlushStreamingTargetWriter, maybeFlushStreamingTargetWriter_fn).call(this); }; _finalizeFragment = /* @__PURE__ */ new WeakSet(); finalizeFragment_fn = function(flushStreamingWriter = true) { if (__privateGet(this, _options).fastStart !== "fragmented") { throw new Error("Can't finalize a fragment unless 'fastStart' is set to 'fragmented'."); } let tracks = [__privateGet(this, _videoTrack), __privateGet(this, _audioTrack)].filter((track) => track && track.currentChunk); if (tracks.length === 0) return; let fragmentNumber = __privateWrapper(this, _nextFragmentNumber)._++; if (fragmentNumber === 1) { let movieBox = moov(tracks, __privateGet(this, _creationTime), true); __privateGet(this, _writer).writeBox(movieBox); } let moofOffset = __privateGet(this, _writer).pos; let moofBox = moof(fragmentNumber, tracks); __privateGet(this, _writer).writeBox(moofBox); { let mdatBox = mdat(false); let totalTrackSampleSize = 0; for (let track of tracks) { for (let sample of track.currentChunk.samples) { totalTrackSampleSize += sample.size; } } let mdatSize = __privateGet(this, _writer).measureBox(mdatBox) + totalTrackSampleSize; if (mdatSize >= 2 ** 32) { mdatBox.largeSize = true; mdatSize = __privateGet(this, _writer).measureBox(mdatBox) + totalTrackSampleSize; } mdatBox.size = mdatSize; __privateGet(this, _writer).writeBox(mdatBox); } for (let track of tracks) { track.currentChunk.offset = __privateGet(this, _writer).pos; track.currentChunk.moofOffset = moofOffset; for (let sample of track.currentChunk.samples) { __privateGet(this, _writer).write(sample.data); sample.data = null; } } let endPos = __privateGet(this, _writer).pos; __privateGet(this, _writer).seek(__privateGet(this, _writer).offsets.get(moofBox)); let newMoofBox = moof(fragmentNumber, tracks); __privateGet(this, _writer).writeBox(newMoofBox); __privateGet(this, _writer).seek(endPos); for (let track of tracks) { track.finalizedChunks.push(track.currentChunk); __privateGet(this, _finalizedChunks).push(track.currentChunk); track.currentChunk = null; } if (flushStreamingWriter) { __privateMethod(this, _maybeFlushStreamingTargetWriter, maybeFlushStreamingTargetWriter_fn).call(this); } }; _maybeFlushStreamingTargetWriter = /* @__PURE__ */ new WeakSet(); maybeFlushStreamingTargetWriter_fn = function() { if (__privateGet(this, _writer) instanceof StreamTargetWriter) { __privateGet(this, _writer).flush(); } }; _ensureNotFinalized = /* @__PURE__ */ new WeakSet(); ensureNotFinalized_fn = function() { if (__privateGet(this, _finalized)) { throw new Error("Cannot add new video or audio chunks after the file has been finalized."); } }; async function mp4(frames, convertMeta) { const p = frames.map((frame) => { if (frame instanceof Blob) { return createImageBitmap(frame); } else { return frame; } }); const bitmaps = await Promise.all(p); if (convertMeta.isAborted) throw new CancelError(); let width = bitmaps[0].width; let height = bitmaps[0].height; if (width % 2 !== 0) width += 1; if (height % 2 !== 0) height += 1; const muxer = new Muxer({ target: new ArrayBufferTarget(), video: { codec: "avc", width, height }, fastStart: "in-memory" }); const videoEncoder = new VideoEncoder({ output: (chunk, meta) => muxer.addVideoChunk(chunk, meta), error: (e) => logger.error(e) }); videoEncoder.configure({ codec: "avc1.420034", width, height, bitrate: config.get("mp4Bitrate") * 1e6 }); const delays = convertMeta.source.delays.map((delay) => delay *= 1e3); let timestamp = 0; const videoFrames = []; for (let i = 0; i < bitmaps.length; i++) { const frame = new VideoFrame(bitmaps[i], { duration: delays[i], timestamp }); videoFrames.push(frame); bitmaps[i].close(); videoEncoder.encode(frame); timestamp += delays[i]; } await videoEncoder.flush(); if (convertMeta.isAborted) { videoFrames.forEach((frame) => frame.close()); throw new CancelError(); } muxer.finalize(); const { buffer } = muxer.target; videoFrames.forEach((frame) => frame.close()); return new Blob([buffer], { type: "video/mp4" }); } const adapter = { gif, png, webp, webm, mp4 }; const convertAdapter = { getAdapter(format) { return adapter[format]; }, getMixEffectFn() { return mixPngEffect; } }; function createConverter() { const MAX_CONVERT = 2; const framesData = {}; let isStop = false; let queue = []; let active2 = []; const isConvertSource = (meta) => { return Array.isArray(meta.source.data) && meta.source.data[0] instanceof Blob; }; const doConvert = (convertMeta) => { var _a; const { id, format, resolve, reject } = convertMeta; active2.push(convertMeta); (_a = convertMeta.onProgress) == null ? void 0 : _a.call(convertMeta, 0); const adapter2 = convertAdapter.getAdapter(format); if (!isConvertSource(convertMeta)) { const mixEffect = convertAdapter.getMixEffectFn(); mixEffect(convertMeta).then(({ bitmaps, frames, delays, width, height }) => { const meta = { ...convertMeta, source: { id, data: bitmaps, delays } }; return Promise.all([adapter2(meta.source.data, meta), frames, delays, width, height]); }).then(([blob, frames, delays, width, height]) => { resolve({ blob, frames, delays, width, height }); }, reject).finally(() => { active2.splice(active2.indexOf(convertMeta), 1); if (queue.length) doConvert(queue.shift()); }); } else { delete framesData[id]; adapter2(convertMeta.source.data, convertMeta).then(resolve, reject).finally(() => { active2.splice(active2.indexOf(convertMeta), 1); if (queue.length) doConvert(queue.shift()); }); } }; return { del: (taskIds) => { if (typeof taskIds === "string") taskIds = [taskIds]; if (!taskIds.length) return; logger.info( "Converter del, active:", active2.map((meta) => meta.id), "queue:", queue.map((meta) => meta.id) ); isStop = true; taskIds.forEach((taskId) => { if (taskId in framesData) delete framesData[taskId]; }); active2 = active2.filter((convertMeta) => { if (taskIds.includes(convertMeta.id)) { convertMeta.abort(); } else { return true; } }); queue = queue.filter((convertMeta) => !taskIds.includes(convertMeta.id)); isStop = false; while (active2.length < MAX_CONVERT && queue.length) { doConvert(queue.shift()); } }, addFrame(taskId, data, delay, order) { if (!(taskId in framesData)) { framesData[taskId] = { id: taskId, data: [], delays: [] }; } if (order === void 0) { const length = framesData[taskId].data.length; framesData[taskId]["data"][length] = data; framesData[taskId]["delays"][length] = delay; } else { framesData[taskId]["data"][order] = data; framesData[taskId]["delays"][order] = delay; } }, framesCount(taskId) { return taskId in framesData ? framesData[taskId]["delays"].filter((delay) => delay !== void 0).length : 0; }, convert(taskId, format, onProgress) { return new Promise((resolve, reject) => { const meta = { id: taskId, format, source: framesData[taskId], isAborted: false, onProgress, resolve, reject, abort() { this.isAborted = true; } }; logger.info("Converter add", taskId); queue.push(meta); while (active2.length < MAX_CONVERT && queue.length && !isStop) { doConvert(queue.shift()); } }); }, async appendPixivEffect(taskId, format, illust, effect, onProgress) { return new Promise((resolve, reject) => { const meta = { id: taskId, format, source: { id: taskId, illust, data: effect }, isAborted: false, onProgress, resolve, reject, abort() { this.isAborted = true; } }; logger.info("Converter add", taskId); queue.push(meta); while (active2.length < MAX_CONVERT && queue.length && !isStop) { doConvert(queue.shift()); } }); } }; } const converter = createConverter(); const pixivHooks = { download: { singleArtworkProgressFactory(btn2, pageCount) { if (!btn2 || !pageCount) return; return function onSingleArtworkProgress(progress) { if (pageCount === 1) { btn2.setProgress(progress); } }; }, mulityArtworksProgressFactory(btn2, pageCount) { if (!btn2 || !pageCount) return; let pageComplete = 0; return function onMulityArtworksProgress() { if (pageCount < 2) return; const progress = Math.floor(++pageComplete / pageCount * 100); btn2.setProgress(progress); }; } }, bundle: { async beforeFileSave(imgBlob, config2) { const { taskId, source } = config2; compressor.add(taskId, source.filename, imgBlob); if (compressor.fileCount(taskId) === source.pageCount) { let comment; if ("ugoiraMeta" in config2.source) { const delays = config2.source.ugoiraMeta.frames.map((frames) => frames.delay); comment = JSON.stringify(delays); } const zipData = await compressor.bundle(taskId, comment); compressor.remove(taskId); return zipData; } }, onError(err, config2) { compressor.remove(config2.taskId); }, onAbort(config2) { compressor.remove(config2.taskId); } }, convert: { convertProgressFactory(btn2) { return function onConvertProgress(progress) { if (progress > 0) { btn2.setProgress(progress, false); } else { btn2.setStatus(ThumbnailBtnStatus.Loading); } }; }, beforeFileSaveFactory(btn2) { const onProgress = btn2 ? this.convertProgressFactory(btn2) : void 0; return async function beforeFileSave(imgBlob, config2) { const { taskId, source } = config2; if (source.illustType === IllustType.ugoira) { converter.addFrame( taskId, imgBlob, source.ugoiraMeta.frames[source.order]["delay"], source.order ); if (converter.framesCount(taskId) === source.pageCount) { return await converter.convert(taskId, source.extendName, onProgress); } } }; }, mixGlowEffect(btn2) { const onProgress = btn2 ? this.convertProgressFactory(btn2) : void 0; return async function beforeFileSave(imgBlob, pixivConfig) { const effectId = "pixivGlow2024"; const url2 = "https://source.pixiv.net/special/seasonal-effect-tag/pixiv-glow-2024/effect.png"; const { taskId } = pixivConfig; const effectData = await historyDb.getImageEffect(effectId); if (effectData && effectData.data[0] instanceof ArrayBuffer) { const { data, delays, width, height } = effectData; const { blob } = await converter.appendPixivEffect( taskId, pixivConfig.source.extendName, imgBlob, { frames: data, delays, width, height }, onProgress ); return blob; } else { const effctBlob = await new Promise((resolve, reject) => { _GM_xmlhttpRequest({ url: url2, headers: { referer: "https://www.pixiv.net" }, responseType: "blob", onload(e) { resolve(e.response); }, onerror: reject, ontimeout: () => reject(new Error("Timeout")) }); }); const { blob, frames, delays, width, height } = await converter.appendPixivEffect( taskId, pixivConfig.source.extendName, imgBlob, effctBlob, onProgress ); historyDb.addImageEffect({ id: effectId, data: frames, delays, width, height }); return blob; } }; }, onError(err, config2) { converter.del(config2.taskId); }, onAbort(config2) { converter.del(config2.taskId); } } }; const downloaderHooks = { getHooks(meta, downloadType, button) { switch (downloadType) { case "download": return { onProgress: pixivHooks.download.singleArtworkProgressFactory(button, meta.pageCount), onFileSaved: pixivHooks.download.mulityArtworksProgressFactory(button, meta.pageCount) }; case "bundle": return { onXhrLoaded: pixivHooks.download.mulityArtworksProgressFactory(button, meta.pageCount), beforeFileSave: pixivHooks.bundle.beforeFileSave, onError: pixivHooks.bundle.onError }; case "convert": return { onXhrLoaded: pixivHooks.download.mulityArtworksProgressFactory(button, meta.pageCount), beforeFileSave: pixivHooks.convert.beforeFileSaveFactory(button), onError: pixivHooks.convert.onError }; case "mixEffect": return { onProgress: pixivHooks.download.singleArtworkProgressFactory(button, meta.pageCount), beforeFileSave: pixivHooks.convert.mixGlowEffect(button), onError: pixivHooks.convert.onError }; } } }; class PixivDownloadConfig extends DownloadConfigBuilder { constructor(meta) { super(meta); __publicField(this, "downloadAll", true); __publicField(this, "headers", { referer: "https://www.pixiv.net" }); __publicField(this, "timeout", 6e4); __publicField(this, "getImgSrc", () => ""); this.meta = meta; this.getImgSrc = this.meta.illustType === IllustType.ugoira ? (page) => this.meta.src.replace("ugoira0", "ugoira" + page) : (page) => this.meta.src.replace("_p0", "_p" + page); } getConvertFormat() { return config.get("ugoiraFormat"); } getMixEffectFormat() { const format = this.getConvertFormat(); if (format === "zip") return UgoiraFormat.WEBM; return format; } needConvert() { return this.meta.illustType === IllustType.ugoira && config.get("ugoiraFormat") !== "zip"; } needBundle() { const { pageCount, illustType } = this.meta; return this.downloadAll && (illustType === IllustType.ugoira && this.getConvertFormat() === "zip" || pageCount > 1 && (illustType === IllustType.manga && config.get("bundleManga") || illustType === IllustType.illusts && config.get("bundleIllusts"))); } useTranslatedTags() { return config.get("tagLang") !== "ja"; } supportSubpath() { return this.isBrowserApi() || this.isFsaEnable(); } buildPattern(pattern, page) { const { id, userId, artist, title, tags, tagsTranslated, createDate, pageCount } = this.meta; const currPage = page === void 0 ? pageCount : page; const useTags = this.useTranslatedTags() ? tagsTranslated : tags; const fArtist = this.normalizeString(artist) || userId; const fTitle = this.normalizeString(title) || id; const fTags = this.normalizeString(useTags.join("_")); const replaceDate = (match, p1) => { const format = p1 || "YYYY-MM-DD"; return dayjs(createDate).format(format); }; return pattern.replaceAll(/\{date\((.*?)\)\}|\{date\}/g, replaceDate).replaceAll("{artist}", fArtist).replaceAll("{artistID}", userId).replaceAll("{title}", fTitle).replaceAll("{tags}", fTags).replaceAll("{page}", String(currPage)).replaceAll("{id}", id); } getDownloadConfig(btn2) { const { illustType, src, id, pageCount, extendName } = this.meta; const pageAttr = btn2 == null ? void 0 : btn2.dataset.page; const downloadPage = pageAttr ? Number(pageAttr) : void 0; if (downloadPage && (downloadPage > pageCount - 1 || downloadPage < 0)) throw new Error("Invalid downloadPage."); if (downloadPage !== void 0) this.downloadAll = false; const taskId = id + "_" + Math.random().toString(36).slice(2); const headers = this.headers; const supportSubPath = this.supportSubpath(); const downloadConfigs = []; if ((pageCount === 1 || downloadPage !== void 0) && illustType !== IllustType.ugoira) { const imgSrc = downloadPage ? this.getImgSrc(downloadPage) : src; let path; let hooks; let source; if (config.get("mixEffect") && btn2) { const effectExt = this.getMixEffectFormat(); const pathPatternNoExt = supportSubPath ? this.getFullpathPattern().slice(0, -4) : this.getFilenamePattern(); const pathPattern = pathPatternNoExt + "." + effectExt; path = this.buildPattern(pathPattern, downloadPage ? downloadPage : 0); const filename = path.slice(path.lastIndexOf("/") + 1); hooks = downloaderHooks.getHooks({ ...this.meta, pageCount: 1 }, "mixEffect", btn2); source = { ...this.meta, pageCount: 1, extendName: effectExt, filename, order: downloadPage ?? 0 }; } else { const pathPattern = supportSubPath ? this.getFullpathPattern() : this.getFilenamePattern() + "." + extendName; path = this.buildPattern(pathPattern, downloadPage ? downloadPage : 0); const filename = path.slice(path.lastIndexOf("/") + 1); hooks = downloaderHooks.getHooks({ ...this.meta, pageCount: 1 }, "download", btn2); source = { ...this.meta, pageCount: 1, filename, order: downloadPage ?? 0 }; } const downloadConfig = { taskId, src: imgSrc, path, source, headers, timeout: this.timeout, ...hooks }; downloadConfigs.push(downloadConfig); } else { const pathPatternNoExt = supportSubPath ? this.getFullpathPattern().slice(0, -4) : this.getFilenamePattern(); if (this.needBundle()) { const pathPattern = pathPatternNoExt + ".zip"; const filenamePattern = this.getFilenamePattern().includes("{page}") ? this.getFilenamePattern() + "." + extendName : this.getFilenamePattern() + "_{page}." + extendName; let path; let imgCount; if (illustType === IllustType.ugoira) { path = this.buildPattern(pathPattern, 0); imgCount = this.meta.ugoiraMeta.frames.length; } else { path = this.buildPattern(pathPattern); imgCount = pageCount; } const hooks = downloaderHooks.getHooks( { ...this.meta, pageCount: imgCount }, "bundle", btn2 ); for (let page = 0; page < imgCount; page++) { const filename = this.buildPattern(filenamePattern, page); const imgSrc = this.getImgSrc(page); const source = { ...this.meta, pageCount: imgCount, extendName: "zip", filename, order: page }; const downloadConfig = { taskId, src: imgSrc, path, source, headers, timeout: this.timeout, ...hooks }; downloadConfigs.push(downloadConfig); } } else if (this.needConvert()) { const ext = this.getConvertFormat(); const pathPattern = pathPatternNoExt + "." + ext; const path = this.buildPattern(pathPattern, 0); const filename = path.slice(path.lastIndexOf("/") + 1); const imgCount = this.meta.ugoiraMeta.frames.length; const hooks = downloaderHooks.getHooks( { ...this.meta, pageCount: imgCount }, "convert", btn2 ); for (let page = 0; page < imgCount; page++) { const imgSrc = this.getImgSrc(page); const source = { ...this.meta, pageCount: imgCount, extendName: ext, filename, order: page }; const downloadConfig = { taskId, src: imgSrc, path, source, headers, timeout: this.timeout, ...hooks }; downloadConfigs.push(downloadConfig); } } else { const pathPattern = pathPatternNoExt + "." + extendName; const hooks = downloaderHooks.getHooks(this.meta, "download", btn2); for (let page = 0; page < pageCount; page++) { const path = this.buildPattern(pathPattern, page); const filename = path.slice(path.lastIndexOf("/") + 1); const imgSrc = this.getImgSrc(page); const source = { ...this.meta, filename, order: page }; const downloadConfig = { taskId, src: imgSrc, path, source, headers, timeout: this.timeout, ...hooks }; downloadConfigs.push(downloadConfig); } } } !this.downloadAll && (this.downloadAll = true); return downloadConfigs; } } async function downloadArtwork$1(btn2) { downloader.dirHandleCheck(); const { id, page } = btn2.dataset; const pixivMeta = await pixivParser.parse(id); const { comment, bookmarkData, token, tags, artist, userId, title } = pixivMeta; if (!bookmarkData) { addBookmark(btn2, id, token, tags); } const downloadConfigs = new PixivDownloadConfig(pixivMeta).getDownloadConfig(btn2); await downloader.download(downloadConfigs); const historyData = { pid: Number(id), user: artist, userId: Number(userId), title, comment, tags }; if (page !== void 0) { historyData.page = Number(page); } historyDb.add(historyData); } function createThumbnailBtn(nodes) { let isSelfBookmark = false; const inBookmarkPage = regexp.bookmarkPage.exec(location.pathname); inBookmarkPage && inBookmarkPage[1] === getSelfId() && (isSelfBookmark = true); nodes.forEach((e) => { let illustId; let type; if ((e.childElementCount !== 0 || e.className.includes("_history-item") || e.className.includes("_history-related-item")) && !e.querySelector("pdl-button") && (illustId = getIllustId(e))) { if (isSelfBookmark) { type = ThumbnailBtnType.PixivMyBookmark; } else if (e.className.includes("_history-related-item")) { e.style.position = "relative"; type = ThumbnailBtnType.PixivHistory; } else if (e.className.includes("_history-item")) { type = ThumbnailBtnType.PixivHistory; } const btn2 = new ThumbnailButton({ id: illustId, type, onClick: downloadArtwork$1 }); e.appendChild(btn2); } }); } function fixPixivPreviewer(nodes) { const isPpSearchPage = regexp.searchPage.test(location.pathname); if (!isPpSearchPage) return; nodes.forEach((node) => { const pdlEle = node.querySelector("pdl-button"); if (!pdlEle) return false; pdlEle.remove(); }); } class TagListButton extends HTMLElement { constructor(tagUrl, onClick) { super(); __publicField(this, "btn"); __publicField(this, "unsubscriber"); this.tagUrl = tagUrl; this.onClick = onClick; this.dispatchDownload = this.dispatchDownload.bind(this); this.render(); this.btn = this.shadowRoot.querySelector("button"); } async render() { const shadowRoot = this.attachShadow({ mode: "open" }); addStyleToShadow(shadowRoot); shadowRoot.innerHTML = ` <div class=" flex items-center"> <hr class="!border-t-0 border-l h-6 ml-4 mr-2" /> <button class=" h-[38px] w-[38px] btn-icon [&:not([disabled])]:hover:bg-slate-400/30 disabled:cursor-wait disabled:opacity-70"> <i class="text-sm w-6 fill-current mx-2"> ${downloadSvg} </i> </button> </div> `; } getTagProps() { const url2 = new URL(this.tagUrl); const { searchParams, pathname } = url2; const extractUrlMatch = regexp.userPageTags.exec(pathname); if (!extractUrlMatch) throw new Error(`Could not extract tag props from: ${pathname}`); const [, userId, urlCategory, tag] = extractUrlMatch; if (!tag) throw new Error(`Could not extract tag from: ${pathname}`); let category; if (urlCategory === "illustrations" || urlCategory === "artworks") { category = "illusts"; } else { category = urlCategory; } return { userId, category, tag, rest: searchParams.get("rest") === "hide" ? "hide" : "show" }; } dispatchDownload(evt) { evt == null ? void 0 : evt.preventDefault(); const { userId, category, tag, rest } = this.getTagProps(); const { batchDownload } = useBatchDownload(); batchDownload("tagged_artwork", userId, category, tag, rest); } connectedCallback() { const { downloading } = useBatchDownload(); this.unsubscriber = downloading.subscribe((val) => { if (val) { this.setAttribute("disabled", ""); } else { this.removeAttribute("disabled"); } }); this.btn.addEventListener("click", this.dispatchDownload); this.onClick && this.btn.addEventListener("click", this.onClick); } disconnectedCallback() { this.unsubscriber(); this.btn.removeEventListener("click", this.dispatchDownload); this.onClick && this.btn.removeEventListener("click", this.onClick); } static get observedAttributes() { return ["disabled"]; } attributeChangedCallback(name, oldValue, newValue) { const btn2 = this.shadowRoot.querySelector("button"); if (typeof newValue === "string") { btn2.setAttribute("disabled", ""); } else { btn2.removeAttribute("disabled"); } } } customElements.define("pdl-tag-list-button", TagListButton); function createTagListBtn() { var _a; const listContainer = document.querySelector('div[style*="position: relative"]'); if (!listContainer) return; const modalRoot = listContainer == null ? void 0 : listContainer.closest('div[role="presentation"], div[class="charcoal-token"]'); const closeBtn = (_a = modalRoot == null ? void 0 : modalRoot.querySelector("svg")) == null ? void 0 : _a.parentElement; const tagElements = listContainer.querySelectorAll( 'div[style*="position: absolute"] a' ); tagElements.forEach((ele) => { if (ele.querySelector("pdl-tag-list-button")) return; const btn2 = new TagListButton(ele.href, () => { closeBtn == null ? void 0 : closeBtn.click(); }); ele.appendChild(btn2); }); } function createToolbarBtn(id) { const toolbar = document.querySelector("main section section"); if (!toolbar || toolbar.querySelector("pdl-button")) return; const btn2 = new ThumbnailButton({ id, type: ThumbnailBtnType.PixivToolbar, onClick: downloadArtwork$1 }); const pdlBtnWrap = toolbar.lastElementChild.cloneNode(); pdlBtnWrap.appendChild(btn2); toolbar.appendChild(pdlBtnWrap); } function createWorkExpanedViewBtn(id) { const works = document.querySelectorAll( "figure a.gtm-expand-full-size-illust" ); if (works.length < 2) return; const containers = Array.from(works).map( (node) => node.parentElement.parentElement ); const elementToAppend = Array.from(containers).filter( (el) => !el.querySelector("pdl-artwork-button") ); if (!elementToAppend.length) return; elementToAppend.forEach((node, idx) => { node.appendChild( new ArtworkButton({ id, page: idx, onClick: downloadArtwork$1 }) ); }); } let observer; let btn; function createPresentationBtn(id) { const containers = document.querySelector("body > [role='presentation'] > div"); if (!containers) { if (observer) { observer.disconnect(); observer = null; btn = null; } return; } if (containers.querySelector("pdl-button")) return; const img = containers.querySelector("div > img"); if (!img) return; const isOriginImg = regexp.originSrcPageNum.exec(img.src); if (!isOriginImg) return; const [pageNum] = isOriginImg; btn = new ThumbnailButton({ id, type: ThumbnailBtnType.PixivPresentation, page: Number(pageNum), onClick: downloadArtwork$1 }); containers.appendChild(btn); observer = new MutationObserver((mutationList) => { const newImg = mutationList[1]["addedNodes"][0]; const [pageNum2] = regexp.originSrcPageNum.exec(newImg.src) ?? []; if (!pageNum2) return logger.throw("Invalid image element."); btn == null ? void 0 : btn.remove(); btn = new ThumbnailButton({ id, type: ThumbnailBtnType.PixivPresentation, page: Number(pageNum2), onClick: downloadArtwork$1 }); containers.appendChild(btn); }); observer.observe(img.parentElement, { childList: true, subtree: true }); } function createPreviewModalBtn() { var _a; const illustModalBtn = document.querySelector( ".gtm-manga-viewer-preview-modal-open:not(.pdl-listened)" ); const mangaModalBtn = document.querySelector(".gtm-manga-viewer-open-preview:not(.pdl-listened)"); const mangaViewerModalBtn = (_a = document.querySelectorAll( ".gtm-manga-viewer-close-icon:not(.pdl-listened)" )) == null ? void 0 : _a[1]; if (!illustModalBtn && !mangaModalBtn && !mangaViewerModalBtn) return; [illustModalBtn, mangaModalBtn, mangaViewerModalBtn].forEach((node) => { if (node) { node.classList.add("pdl-listened"); node.addEventListener("click", handleModalClick); } }); } function handleModalClick() { const timer = setInterval(() => { logger.info("Start to find modal."); const ulList = document.querySelectorAll("ul"); const previewList = ulList[ulList.length - 1]; if (getComputedStyle(previewList).display !== "grid") return; clearInterval(timer); const [, id] = regexp.artworksPage.exec(location.pathname) ?? []; previewList.childNodes.forEach((node, idx) => { node.style.position = "relative"; node.appendChild( new ThumbnailButton({ id, page: idx, onClick: downloadArtwork$1 }) ); }); }, 300); } function createMangaViewerBtn(id) { const mangaViewerBackBtn = document.querySelector(".gtm-manga-viewer-close-icon"); if (!mangaViewerBackBtn) return; const container = mangaViewerBackBtn.parentElement; if (container.querySelector("pdl-button")) return; container.appendChild( new ThumbnailButton({ id, type: ThumbnailBtnType.PixivMangaViewer, onClick: downloadArtwork$1 }) ); } class ArtworkTagButton extends HTMLElement { constructor(tagElement) { super(); __publicField(this, "ob"); __publicField(this, "unsubscriber"); this.tagElement = tagElement; this.dispatchDownload = this.dispatchDownload.bind(this); this.render(); this.resetTagStyle(); this.ob = new MutationObserver(() => { this.changeBtnColor(); }); } // 为了美观 resetTagStyle() { this.tagElement.style.borderTopRightRadius = "0px"; this.tagElement.style.borderBottomRightRadius = "0px"; } changeBtnColor() { const { color, backgroundColor } = getComputedStyle(this.tagElement); const btn2 = this.shadowRoot.querySelector("button"); btn2.style.color = color; btn2.style.backgroundColor = backgroundColor; } async render() { const shadowRoot = this.attachShadow({ mode: "open" }); addStyleToShadow(shadowRoot); shadowRoot.innerHTML = ` <button class="flex h-full items-center pr-2 rounded-e-[4px] disabled:cursor-wait disabled:opacity-70"> <hr class="!border-t-0 border-l h-6 pr-2" /> <i class="text-sm w-6 fill-current"> ${downloadSvg} </i> </button>`; this.changeBtnColor(); } getTagProps() { const tagTitles = this.tagElement.querySelectorAll("div[title]"); const tagStr = tagTitles[tagTitles.length - 1].getAttribute("title"); const tag = tagStr.startsWith("#") ? tagStr.slice(1) : "未分類"; const url2 = new URL(this.tagElement.href); const { searchParams, pathname } = url2; const extractUrlMatch = regexp.userPageTags.exec(pathname); if (!extractUrlMatch) throw new Error(`Could not extract tag props from: ${pathname}`); const [, userId, urlCategory] = extractUrlMatch; let category; if (urlCategory === "illustrations" || urlCategory === "artworks") { category = "illusts"; } else { category = urlCategory; } return { userId, category, tag, rest: searchParams.get("rest") === "hide" ? "hide" : "show" }; } dispatchDownload() { const { userId, category, tag, rest } = this.getTagProps(); const { batchDownload } = useBatchDownload(); batchDownload("tagged_artwork", userId, category, tag, rest); } connectedCallback() { const { downloading } = useBatchDownload(); this.unsubscriber = downloading.subscribe((val) => { if (val) { this.setAttribute("disabled", ""); } else { this.removeAttribute("disabled"); } }); this.addEventListener("click", this.dispatchDownload); this.ob.observe(this.tagElement, { attributes: true, attributeFilter: ["status"] }); } disconnectedCallback() { this.unsubscriber(); this.removeEventListener("click", this.dispatchDownload); this.ob.disconnect(); } static get observedAttributes() { return ["disabled"]; } attributeChangedCallback(name, oldValue, newValue) { const btn2 = this.shadowRoot.querySelector("button"); if (typeof newValue === "string") { btn2.setAttribute("disabled", ""); } else { btn2.removeAttribute("disabled"); } } } customElements.define("pdl-artwork-tag", ArtworkTagButton); function createFrequentTagBtn() { const tagsEles = Array.from(document.querySelectorAll("a[status]")); if (!tagsEles.length) return; tagsEles.forEach((ele) => { var _a; if (((_a = ele.nextElementSibling) == null ? void 0 : _a.tagName) === "PDL-ARTWORK-TAG") return; const artworkTagBtn = new ArtworkTagButton(ele); ele.parentElement.appendChild(artworkTagBtn); }); } function pageActions() { const pathname = location.pathname; let param; switch (true) { case !!(param = regexp.artworksPage.exec(pathname)): { const id = param[1]; createToolbarBtn(id); createWorkExpanedViewBtn(id); createPresentationBtn(id); createPreviewModalBtn(); createMangaViewerBtn(id); break; } case regexp.userPageTags.test(pathname): { createFrequentTagBtn(); createTagListBtn(); break; } case regexp.historyPage.test(pathname): { createThumbnailBtn(document.querySelectorAll("span[style]._history-item")); break; } } } let firstRunFlag = true; function observerCallback(records) { const addedNodes = []; records.forEach((record) => { if (!record.addedNodes.length) return; record.addedNodes.forEach((node) => { if (node.nodeType === Node.ELEMENT_NODE && node.tagName !== "PDL-BUTTON" && node.tagName !== "IMG") { addedNodes.push(node); } }); }); if (!addedNodes.length) return; if (firstRunFlag) { createThumbnailBtn(document.querySelectorAll("a")); firstRunFlag = false; } else { fixPixivPreviewer(addedNodes); const thumbnails = addedNodes.reduce((prev, current) => { return prev.concat( current instanceof HTMLAnchorElement ? [current] : Array.from(current.querySelectorAll("a")) ); }, []); createThumbnailBtn(thumbnails); } pageActions(); } class Pixiv extends SiteInject { static get hostname() { return "www.pixiv.net"; } inject() { super.inject(); new MutationObserver(observerCallback).observe(document.body, { childList: true, subtree: true }); } getCustomConfig() { return { folderPattern: "pixiv/{artist}", filenamePattern: "{artist}_{title}_{id}_p{page}" }; } observeColorScheme() { const onThemeChange = () => { const sitePreferDark = document.documentElement.getAttribute("data-theme"); if (sitePreferDark === "dark") { this.setAppDarkMode(); } else { this.setAppLightMode(); } }; onThemeChange(); new MutationObserver(onThemeChange).observe(document.documentElement, { attributes: true, childList: false, subtree: false }); } getBatchDownloadConfig() { return { async avatar(url2) { const userIdMatch = regexp.userPage.exec(url2); let userId; userIdMatch ? userId = userIdMatch[1] || userIdMatch[2] : userId = getSelfId() ?? ""; if (!userId) return ""; try { const userData = await api.getUserData(userId); return userData.imageBig; } catch (error) { logger.error(error); return ""; } }, filterOption: { filters: [ { id: "exclude_downloaded", type: "exclude", name: t("downloader.category.filter.exclude_downloaded"), checked: false, fn(meta) { return !!meta.id && historyDb.has(meta.id); } }, { id: "illust", type: "include", name: t("downloader.category.filter.pixiv_illust"), checked: true, fn(meta) { return meta.illustType === IllustType.illusts; } }, { id: "manga", type: "include", name: t("downloader.category.filter.pixiv_manga"), checked: true, fn(meta) { return meta.illustType === IllustType.manga; } }, { id: "ugoira", type: "include", name: t("downloader.category.filter.pixiv_ugoira"), checked: true, fn(meta) { return meta.illustType === IllustType.ugoira; } } ], enableTagFilter: true, filterWhenGenerateIngPage: true }, pageMatch: [ { name: "my_page", match(url2) { const userIdMatch = regexp.userPage.exec(url2); if (!userIdMatch) return false; const userId = userIdMatch[1] || userIdMatch[2]; return userId === getSelfId(); }, genPageId: [ { id: "self_bookmark_public", name: t("downloader.download_type.pixiv_bookmark_public"), fn: (...args) => { return pixivParser.bookmarkGenerator(...args, getSelfId()); } }, { id: "self_bookmark_private", name: t("downloader.download_type.pixiv_bookmark_private"), fn: (...args) => { return pixivParser.bookmarkGenerator(...args, getSelfId(), "hide"); } } ] }, { name: "user_page", match: regexp.userPage, genPageId: [ { id: "works", name: t("downloader.download_type.pixiv_works"), fn: (...args) => { const userIdMatch = regexp.userPage.exec(location.href); const userId = userIdMatch[1] || userIdMatch[2]; return pixivParser.illustMangaGenerator(...args, userId); } }, { id: "bookmark", name: t("downloader.download_type.pixiv_bookmark"), fn: (...args) => { const userIdMatch = regexp.userPage.exec(location.href); const userId = userIdMatch[1] || userIdMatch[2]; return pixivParser.bookmarkGenerator(...args, userId); } } ] }, { name: "follow_latest", match: regexp.followLatest, genPageId: [ { id: "follow_latest_all", name: t("downloader.download_type.pixiv_follow_latest_all"), fn: (...args) => { return pixivParser.followLatestGenerator(...args, "all"); } }, { id: "follow_latest_r18", name: t("downloader.download_type.pixiv_follow_latest_r18"), fn: (...args) => { return pixivParser.followLatestGenerator(...args, "r18"); } } ] }, { name: "download_specific_tag", match: () => false, // use for user tag download genPageId: [ { id: "tagged_artwork", name: "tagged_artwork", fn: (pageRange, checkValidity, userId, category, tag, bookmarkRest = "show") => { if (category === "bookmarks") { return pixivParser.taggedArtworkGenerator( pageRange, checkValidity, userId, category, tag, bookmarkRest ); } else { return pixivParser.taggedArtworkGenerator( pageRange, checkValidity, userId, category, tag ); } } } ] } ], parseMetaByArtworkId(id) { return pixivParser.parse(id, true); }, async downloadByArtworkId(meta, taskId) { downloader.dirHandleCheck(); const downloadConfigs = new PixivDownloadConfig(meta).getDownloadConfig(); downloadConfigs.forEach((config2) => { config2.taskId = taskId; config2.source.id = taskId; }); await downloader.download(downloadConfigs); const { comment, id, tags, artist, userId, title } = meta; const historyData = { pid: Number(id), user: artist, userId: Number(userId), title, comment, tags }; historyDb.add(historyData); return id; }, onDownloadAbort(taskIds) { downloader.abort(taskIds); } }; } } const yandeParser = { async parse(id) { const res = await fetch("/post/show/" + id); if (!res.ok) throw new RequestError(res.url, res.status); const html = await res.text(); const matchImageData = html.match(new RegExp("(?<=Post\\.register_resp\\().+(?=\\);)")); if (!matchImageData) throw new Error("Can not parse image data."); const imageData = JSON.parse(matchImageData[0]); const postData = imageData.posts[0]; const artists = []; const characters = []; const tags = []; for (const tag in imageData.tags) { const tagType = imageData.tags[tag]; if (tagType === "artist") { artists.push(tag); } else if (tagType === "character") { characters.push(tag); } tags.push(tagType + ":" + tag); } postData.source && tags.push("source:" + postData.source); return { id, src: postData.file_url, extendName: postData.file_ext, artist: artists.join(",") || "UnknownArtist", character: characters.join(",") || "UnknownCharacter", title: postData.md5, tags, createDate: new Date(postData.created_at * 1e3).toISOString() }; } }; class YandeDownloadConfig extends Rule34DownloadConfig { } async function downloadArtwork(btn2) { downloader.dirHandleCheck(); const id = btn2.dataset.id; const mediaMeta = await yandeParser.parse(id); const { tags, artist, title } = mediaMeta; const downloadConfigs = new YandeDownloadConfig(mediaMeta).getDownloadConfig(btn2); await downloader.download(downloadConfigs); const historyData = { pid: Number(id), user: artist, title, tags }; historyDb.add(historyData); } class Yande extends SiteInject { static get hostname() { return "yande.re"; } inject() { super.inject(); this.pageAction(); } createThumbnailBtn(containers) { if (!containers.length) return; containers.forEach((el) => { const idMathch = new RegExp("(?<=\\/post\\/show\\/)\\d+|(?<=\\/post\\/browse#)\\d+").exec(el.href); if (!idMathch) return; const id = idMathch[0]; const oldBtn = el.querySelector("pdl-button"); if (oldBtn) { if (oldBtn.dataset.id === id) return; oldBtn.remove(); } else { if (el.href.includes("/post/show")) { el.style.height = "fit-content"; if (!el.classList.contains("thumb")) { const image = el.querySelector("img"); if (image.src.includes("blacklisted-preview.png")) { return; } image.onload = () => { if (image.src.includes("blacklisted-preview.png") && image.nextElementSibling) { image.nextElementSibling.remove(); } }; el.style.marginBottom = "1em"; image.style.marginBottom = "0px"; } } el.parentElement.style.display = "flex"; el.style.position = "relative"; } el.appendChild( new ThumbnailButton({ id, onClick: downloadArtwork }) ); }); } createArtworkBtn(id) { const image = document.querySelector("#image"); const btnContainer = image.closest("div"); btnContainer.style.position = "relative"; btnContainer.style.width = "max-content"; btnContainer.appendChild( new ArtworkButton({ id, site: "yande", onClick: downloadArtwork }) ); } createScrollerBtn() { const scrollerList = document.querySelector("ul.post-browser-posts"); if (!scrollerList) return; const ob = new MutationObserver((records) => { const containers = []; records.forEach((record) => { if (!record.addedNodes.length) return; record.addedNodes.forEach((node) => { if (!(node instanceof HTMLElement)) return; const thumbs = node.querySelectorAll("a.thumb"); if (thumbs.length) containers.push(...thumbs); }); }); this.createThumbnailBtn(containers); }); ob.observe(scrollerList, { subtree: true, childList: true }); } createImageBrowseBtn() { const postId = document.querySelector("span.post-id"); if (!postId) return; function createBtn() { const oldBtn = document.querySelector("pdl-button[type]"); if (oldBtn) oldBtn.remove(); const id = postId.textContent; if (!id) return; document.body.appendChild( new ThumbnailButton({ id, type: ThumbnailBtnType.YandeBrowse, onClick: downloadArtwork }) ); } createBtn(); new MutationObserver(createBtn).observe(postId, { childList: true }); } pageAction() { const pathname = location.pathname; const galleryMatch = pathname.match(new RegExp("(?<=\\/post\\/show\\/)\\d+")); if (galleryMatch) { this.createArtworkBtn(galleryMatch[0]); } else if (pathname === "/post/browse") { this.createScrollerBtn(); this.createImageBrowseBtn(); } else { const btnContainers = document.querySelectorAll( "a.thumb, div.post div.col1 a" ); this.createThumbnailBtn(Array.from(btnContainers)); } } getCustomConfig() { return { folderPattern: "yande/{artist}", filenamePattern: "{id}_{artist}_{character}" }; } observeColorScheme() { const query = window.matchMedia("(prefers-color-scheme: dark)"); if (query.matches) { this.setAppDarkMode(); } query.addEventListener("change", (e) => { e.matches ? this.setAppDarkMode() : this.setAppLightMode(); }); } getBatchDownloadConfig() { return void 0; } } class ATFbooru extends Danbooru { static get hostname() { return "booru.allthefallen.moe"; } getCustomConfig() { return { folderPattern: "ATFbooru/{artist}", filenamePattern: "{id}_{artist}_{character}" }; } } function getSiteInjector() { const sitesAdapter = [Pixiv, Danbooru, Rule34, Yande, ATFbooru]; for (let i = 0; i < sitesAdapter.length; i++) { if (location.hostname === sitesAdapter[i].hostname) { return sitesAdapter[i]; } } } const siteInject = getSiteInjector(); siteInject && new siteInject(); })(Dexie, dayjs, JSZip, GIF);