:root{color:#201b16;background:#f7f2ea;font-family:Helvetica Neue,PingFang SC,Noto Sans SC,sans-serif}*{box-sizing:border-box}[hidden]{display:none!important}html{overscroll-behavior:none}body{margin:0;height:100vh;height:100dvh;overflow:hidden;overscroll-behavior:none;background:#f7f2ea}button,input,select{font:inherit}.shell{height:100vh;height:100dvh;display:flex;flex-direction:column;overflow:hidden}.shell__title{margin:0;font-size:16px;font-weight:600;line-height:1;white-space:nowrap;flex-shrink:0}.shell__title-link{text-decoration:none;color:inherit;cursor:pointer}.shell__title-link:hover .shell__title-letter{opacity:.7}.shell__title-letter{display:inline-block;transition:color .18s ease,transform .18s ease}.shell--easter-egg .shell__title-letter:nth-child(6n+1){color:#ff45d4}.shell--easter-egg .shell__title-letter:nth-child(6n+2){color:#34e0ff}.shell--easter-egg .shell__title-letter:nth-child(6n+3){color:#ffe03a}.shell--easter-egg .shell__title-letter:nth-child(6n+4){color:#7cff37}.shell--easter-egg .shell__title-letter:nth-child(6n+5){color:#4f63ff}.shell--easter-egg .shell__title-letter:nth-child(6n+6){color:#c7fff8}#results{flex:1 1 0;min-height:0;overflow:hidden;background:#ebe3d7;display:flex;align-items:center;justify-content:center;touch-action:none;cursor:grab;position:relative}.results__empty-hint{display:none;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);margin:0;padding:28px 44px;border:2px dashed rgba(54,44,34,.28);border-radius:14px;font-size:16px;color:#201b1666;white-space:nowrap;pointer-events:none;user-select:none}.shell--empty .results__empty-hint{display:block}#results:active{cursor:grabbing}.results-transform{display:flex;transform-origin:center center;will-change:transform;max-width:100%}.results{display:flex;gap:0;align-items:flex-start;width:100vw}.results--image-top,.results--image-bottom{flex-direction:column;align-items:center}.results--image-top .panel,.results--image-bottom .panel{width:100%}.results--image-left,.results--image-right{flex-direction:row}.results--image-top .panel--image,.results--image-left .panel--image{order:0}.results--image-top .panel--paper,.results--image-left .panel--paper{order:1}.results--image-bottom .panel--paper,.results--image-right .panel--paper{order:0}.results--image-bottom .panel--image,.results--image-right .panel--image{order:1}.results--empty canvas{display:none}.panel{flex:1 1 0;min-width:0}canvas{display:block;width:100%;height:auto;border-radius:0;background:#ebe3d7}.results--empty canvas{background:transparent}.controls-bar{flex-shrink:0;background:#fffcf7f7;border-top:1px solid rgba(54,44,34,.12);display:flex;flex-direction:column}.tabs{display:flex;align-items:center;gap:4px;padding:0 12px;border-bottom:1px solid rgba(54,44,34,.1)}.tab{padding:8px 14px;border:none;border-bottom:2px solid transparent;margin-bottom:-1px;background:transparent;color:#201b168c;cursor:pointer;font-size:13px;font-weight:500;transition:color .12s ease,border-color .12s ease}.tab:hover{color:#201b16}.tab--active{color:#201b16;border-bottom-color:#59a92b}.status{margin:0 0 0 auto;font-size:13px;color:#271f188c;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:200px}.status:empty{display:none}.tab-panel{display:none;flex-wrap:wrap;gap:10px;padding:10px 12px;overflow-x:auto;min-height:110px;align-content:flex-start}.tab-panel--active{display:flex}.upload,.field,#shuffle-button,#undo-dot-button{min-height:40px;border:1px solid rgba(54,44,34,.14);background:#fffcf7c7;border-radius:14px}.upload span,#shuffle-button,#undo-dot-button,#download-button,.upload--image span{color:#201b16}.upload,.field{display:flex;align-items:center;gap:10px;padding:0 14px}.upload{position:relative;overflow:hidden;cursor:pointer}.upload input[type=file]{position:absolute;inset:0;opacity:0;cursor:pointer}.field{min-width:200px}.field--select{min-width:150px}.field span,.upload span,output{font-size:13px}#dot-char-input{width:2em;text-align:center;font-size:13px;color:#201b16;background:transparent;border:none;outline:none;padding:0 2px 2px}.field input[type=range]{flex:1;accent-color:#59a92b;color:#59a92b}.field--color{position:relative;cursor:pointer}.field input[type=color]{position:absolute;inset:0;width:100%;height:100%;padding:0;border:0;opacity:0;cursor:pointer}.field--color:after{content:"";width:20px;height:20px;border-radius:6px;border:1px solid rgba(54,44,34,.18);background:var(--color-swatch, #fff);flex-shrink:0}.color-picker-popover{position:fixed;z-index:1000;border-radius:12px;box-shadow:0 4px 24px #0000002e;overflow:hidden;background:#fff;display:flex;flex-direction:column}.color-picker-hex-input{border:none;border-top:1px solid rgba(54,44,34,.12);padding:10px 14px;font-size:14px;font-family:monospace;color:#201b16;background:#fff;outline:none;width:100%}.field select{flex:1;min-width:0;border:0;background:transparent;color:inherit;outline:none;font-size:13px}output{min-width:20px;text-align:right}#shuffle-button,#undo-dot-button{padding:0 16px;cursor:pointer;font-size:13px}#undo-dot-button:disabled{opacity:.45;cursor:not-allowed}.distribution-row{display:flex;gap:10px;width:100%}.weixin-save-overlay{position:fixed;inset:0;z-index:2000;display:flex;flex-direction:column;align-items:center;justify-content:center}.weixin-save-overlay__backdrop{position:absolute;inset:0;background:#000000b8}.weixin-save-overlay__content{position:relative;display:flex;flex-direction:column;align-items:center;gap:16px;padding:20px;max-width:90vw;max-height:90vh}.weixin-save-overlay__hint{margin:0;color:#fff;font-size:15px;font-weight:500;text-align:center}.weixin-save-overlay__img{max-width:100%;max-height:70vh;border-radius:8px;display:block}.distribution-row .field,.distribution-row #shuffle-button,.distribution-row #undo-dot-button{flex:1;min-width:0}.top-dock{flex-shrink:0;display:flex;align-items:center;gap:8px;padding:0 16px;height:48px;background:#fffcf7f7;border-bottom:1px solid rgba(54,44,34,.12)}.top-dock .shell__title{flex-shrink:0}.top-dock .status{flex:1 1 0;min-width:0;margin:0;padding:0 4px}.top-dock__btn--upload{margin-left:auto}.top-dock__btn{flex-shrink:0;display:inline-flex;align-items:center;justify-content:center;width:64px;height:32px;padding:0;border:1px solid rgba(54,44,34,.14);border-radius:12px;background:#fffcf7c7;font:inherit;font-size:13px;color:#201b16;white-space:nowrap;cursor:pointer;position:relative;overflow:hidden}.top-dock__btn input[type=file]{position:absolute;inset:0;opacity:0;cursor:pointer}#download-button:disabled{opacity:.45;cursor:not-allowed}@media(max-width:720px){.tab-panel{flex-direction:column;align-items:stretch}.field,.upload{min-width:0;width:100%}.distribution-row .field{width:auto}}@media(min-width:721px){.shell{flex-direction:row;flex-wrap:wrap}.top-dock{width:100%;flex-shrink:0;height:52px}#results{flex:1 1 0;order:2;min-width:0}.controls-bar{order:1;flex-direction:row;border-top:none;border-right:1px solid rgba(54,44,34,.12);width:288px;flex-shrink:0;align-items:stretch;height:calc(100vh - 52px);height:calc(100dvh - 52px);overflow:hidden;background:#faf6ef}.tabs{flex-direction:column;align-items:stretch;gap:2px;padding:10px 8px;border-bottom:none;border-right:1px solid rgba(54,44,34,.09);width:64px;flex-shrink:0;background:#f5f0e8}.tab{padding:10px 4px;border-bottom:none;border-right:none;border-radius:10px;margin-bottom:0;margin-right:0;text-align:center;font-size:12px;font-weight:500;line-height:1.3;color:#201b1673;transition:background .14s ease,color .14s ease}.tab:hover{background:#362c2212;color:#201b16}.tab--active{border-bottom-color:transparent;border-right-color:transparent;background:transparent;color:#3a7216;font-weight:600}.tab-panel{flex:1 1 0;flex-direction:column;align-items:stretch;min-height:0;height:100%;overflow-y:auto;padding:16px 12px;gap:8px;min-height:unset;scrollbar-width:thin;scrollbar-color:rgba(54,44,34,.15) transparent}.tab-panel::-webkit-scrollbar{width:4px}.tab-panel::-webkit-scrollbar-track{background:transparent}.tab-panel::-webkit-scrollbar-thumb{background:#362c2226;border-radius:4px}.tab-panel .field,.tab-panel .upload{min-width:0;width:100%}.distribution-row{flex-direction:column;gap:8px}.distribution-row .field,.distribution-row #shuffle-button,.distribution-row #undo-dot-button{width:100%;flex:none}.field{min-width:0;padding:0 10px;gap:8px}.field input[type=range]{min-width:0;flex:1 1 0}.upload,.field,#shuffle-button,#undo-dot-button{min-height:42px;border-radius:12px}.field span,.upload span{font-size:12px;font-weight:500;color:#201b168c;white-space:nowrap;flex-shrink:0}output{font-size:12px;font-weight:500;color:#201b16;min-width:26px;text-align:right;flex-shrink:0}.field select{font-size:13px;color:#201b16}}
