@pinkpixel/haku 0.1.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +18 -11
- package/dist/cli.mjs +38 -4
- package/dist/{mcp-DDuNECfs.mjs → mcp-DsSn95Rn.mjs} +3 -2
- package/dist/samples/drums/cabasa_v0_r1.ogg +0 -0
- package/dist/samples/drums/cabasa_v0_r2.ogg +0 -0
- package/dist/samples/drums/cabasa_v1_r1.ogg +0 -0
- package/dist/samples/drums/cabasa_v1_r2.ogg +0 -0
- package/dist/samples/drums/shaker_v0_r1.ogg +0 -0
- package/dist/samples/drums/shaker_v0_r2.ogg +0 -0
- package/dist/samples/drums/shaker_v1_r1.ogg +0 -0
- package/dist/samples/drums/shaker_v1_r2.ogg +0 -0
- package/dist/samples/guitar/v0_31.ogg +0 -0
- package/dist/samples/guitar/v0_32.ogg +0 -0
- package/dist/samples/guitar/v0_33.ogg +0 -0
- package/dist/samples/guitar/v0_34.ogg +0 -0
- package/dist/samples/guitar/v0_35.ogg +0 -0
- package/dist/samples/guitar/v0_36.ogg +0 -0
- package/dist/samples/guitar/v0_37.ogg +0 -0
- package/dist/samples/guitar/v0_38.ogg +0 -0
- package/dist/samples/guitar/v0_39.ogg +0 -0
- package/dist/samples/guitar/v0_40.ogg +0 -0
- package/dist/samples/guitar/v0_41.ogg +0 -0
- package/dist/samples/guitar/v0_43.ogg +0 -0
- package/dist/samples/guitar/v0_45.ogg +0 -0
- package/dist/samples/guitar/v0_47.ogg +0 -0
- package/dist/samples/guitar/v0_48.ogg +0 -0
- package/dist/samples/guitar/v0_50.ogg +0 -0
- package/dist/samples/guitar/v0_52.ogg +0 -0
- package/dist/samples/guitar/v0_53.ogg +0 -0
- package/dist/samples/guitar/v0_54.ogg +0 -0
- package/dist/samples/guitar/v0_55.ogg +0 -0
- package/dist/samples/guitar/v0_56.ogg +0 -0
- package/dist/samples/guitar/v0_57.ogg +0 -0
- package/dist/samples/guitar/v0_58.ogg +0 -0
- package/dist/samples/guitar/v0_59.ogg +0 -0
- package/dist/samples/guitar/v0_60.ogg +0 -0
- package/dist/samples/guitar/v0_61.ogg +0 -0
- package/dist/samples/guitar/v0_62.ogg +0 -0
- package/dist/samples/guitar/v0_63.ogg +0 -0
- package/dist/samples/guitar/v0_64.ogg +0 -0
- package/dist/samples/guitar/v0_65.ogg +0 -0
- package/dist/samples/guitar/v0_66.ogg +0 -0
- package/dist/samples/guitar/v0_67.ogg +0 -0
- package/dist/samples/guitar/v0_69.ogg +0 -0
- package/dist/samples/guitar/v0_70.ogg +0 -0
- package/dist/samples/guitar/v0_71.ogg +0 -0
- package/dist/samples/guitar/v0_72.ogg +0 -0
- package/dist/samples/guitar/v0_73.ogg +0 -0
- package/dist/samples/guitar/v0_74.ogg +0 -0
- package/dist/samples/guitar/v0_75.ogg +0 -0
- package/dist/samples/guitar/v0_76.ogg +0 -0
- package/dist/samples/guitar/v0_77.ogg +0 -0
- package/dist/samples/guitar/v0_78.ogg +0 -0
- package/dist/samples/guitar/v0_79.ogg +0 -0
- package/dist/samples/guitar/v0_80.ogg +0 -0
- package/dist/samples/guitar/v0_81.ogg +0 -0
- package/dist/samples/guitar/v0_82.ogg +0 -0
- package/dist/samples/guitar/v0_83.ogg +0 -0
- package/dist/samples/guitar/v0_84.ogg +0 -0
- package/dist/samples/kalimba/v0_44.ogg +0 -0
- package/dist/samples/kalimba/v0_46.ogg +0 -0
- package/dist/samples/kalimba/v0_49.ogg +0 -0
- package/dist/samples/kalimba/v0_51.ogg +0 -0
- package/dist/samples/kalimba/v0_53.ogg +0 -0
- package/dist/samples/kalimba/v0_56.ogg +0 -0
- package/dist/samples/kalimba/v0_59.ogg +0 -0
- package/dist/samples/kalimba/v0_61.ogg +0 -0
- package/dist/samples/kalimba/v0_64.ogg +0 -0
- package/dist/samples/kalimba/v0_65.ogg +0 -0
- package/dist/samples/kalimba/v0_67.ogg +0 -0
- package/dist/samples/kalimba/v0_71.ogg +0 -0
- package/dist/samples/kalimba/v0_73.ogg +0 -0
- package/dist/samples/kalimba/v0_74.ogg +0 -0
- package/dist/samples/kalimba/v0_75.ogg +0 -0
- package/dist/samples/kalimba/v0_77.ogg +0 -0
- package/dist/samples/kalimba/v0_78.ogg +0 -0
- package/dist/samples/kalimba/v0_79.ogg +0 -0
- package/dist/samples/kalimba/v0_82.ogg +0 -0
- package/dist/samples/kalimba/v0_83.ogg +0 -0
- package/dist/samples/manifest.json +181 -0
- package/dist/samples/vibes/v0_53.ogg +0 -0
- package/dist/samples/vibes/v0_57.ogg +0 -0
- package/dist/samples/vibes/v0_60.ogg +0 -0
- package/dist/samples/vibes/v0_64.ogg +0 -0
- package/dist/samples/vibes/v0_67.ogg +0 -0
- package/dist/samples/vibes/v0_71.ogg +0 -0
- package/dist/samples/vibes/v0_74.ogg +0 -0
- package/dist/samples/vibes/v0_77.ogg +0 -0
- package/dist/samples/vibes/v0_81.ogg +0 -0
- package/dist/samples/vibes/v0_84.ogg +0 -0
- package/dist/samples/vibes/v0_88.ogg +0 -0
- package/dist/samples/vibes/v1_53.ogg +0 -0
- package/dist/samples/vibes/v1_57.ogg +0 -0
- package/dist/samples/vibes/v1_60.ogg +0 -0
- package/dist/samples/vibes/v1_64.ogg +0 -0
- package/dist/samples/vibes/v1_67.ogg +0 -0
- package/dist/samples/vibes/v1_71.ogg +0 -0
- package/dist/samples/vibes/v1_74.ogg +0 -0
- package/dist/samples/vibes/v1_77.ogg +0 -0
- package/dist/samples/vibes/v1_81.ogg +0 -0
- package/dist/samples/vibes/v1_84.ogg +0 -0
- package/dist/samples/vibes/v1_88.ogg +0 -0
- package/dist/{src-D5fW7AC1.mjs → src-Bz-0ulVm.mjs} +179 -23
- package/dist/{src-JrRbTOJC.mjs → src-DNP73wX3.mjs} +60 -3
- package/dist/{version-DoZ2etXG.mjs → tools-CO-tdB7d.mjs} +321 -82
- package/dist/web/assets/esm-J-U37_Wq.js +210 -0
- package/dist/web/assets/figtree-latin-ext-wght-normal-DCwSJGxG.woff2 +0 -0
- package/dist/web/assets/figtree-latin-wght-normal-D_ZTVpCC.woff2 +0 -0
- package/dist/web/assets/fraunces-latin-ext-wght-normal-Ca2vKHc0.woff2 +0 -0
- package/dist/web/assets/fraunces-latin-wght-normal-ukD16Tqj.woff2 +0 -0
- package/dist/web/assets/fraunces-vietnamese-wght-normal-CnvboYUG.woff2 +0 -0
- package/dist/web/assets/index-BkzOde44.js +65 -0
- package/dist/web/assets/index-D0m3L8JK.css +1 -0
- package/dist/web/assets/rolldown-runtime-BWaJ3C7D.js +1 -0
- package/dist/web/assets/src-m48ItyJA.js +1 -0
- package/dist/web/icon-192.png +0 -0
- package/dist/web/icon-512.png +0 -0
- package/dist/web/index.html +19 -0
- package/dist/web/manifest.webmanifest +24 -0
- package/dist/web/sw.js +37 -0
- package/package.json +2 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@font-face{font-family:Figtree Variable;font-style:normal;font-display:swap;font-weight:300 900;src:url(/assets/figtree-latin-ext-wght-normal-DCwSJGxG.woff2)format("woff2-variations");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Figtree Variable;font-style:normal;font-display:swap;font-weight:300 900;src:url(/assets/figtree-latin-wght-normal-D_ZTVpCC.woff2)format("woff2-variations");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Fraunces Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/fraunces-vietnamese-wght-normal-CnvboYUG.woff2)format("woff2-variations");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Fraunces Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/fraunces-latin-ext-wght-normal-Ca2vKHc0.woff2)format("woff2-variations");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Fraunces Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/fraunces-latin-wght-normal-ukD16Tqj.woff2)format("woff2-variations");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}:root{--font-ui:"Figtree Variable", "Figtree", sans-serif;--font-display:"Fraunces Variable", "Fraunces", serif;--bg:oklch(20% .014 50);--surface:oklch(23.2% .016 50);--raised:oklch(27.5% .018 50);--sunken:oklch(17.8% .012 50);--border:oklch(33.5% .019 50);--border-strong:oklch(43% .024 52);--text:oklch(95% .008 75);--text-muted:oklch(73% .016 65);--text-faint:oklch(57% .016 60);--coral:oklch(73% .11 35);--coral-strong:oklch(78% .12 35);--coral-ink:oklch(24% .04 35);--sage:oklch(72% .06 145);--wood:oklch(62% .08 55);--wood-dark:oklch(42% .06 50);--danger:oklch(68% .15 25);--grain:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='2' stitchTiles='stitch'/%3E%3CfeColorMatrix values='0 0 0 0 1 0 0 0 0 0.9 0 0 0 0 0.78 0 0 0 0.035 0'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");--wall:oklch(30% .045 45);--wall-seam:oklch(24% .04 42);--wall-shade:oklch(27% .042 44);--beam:oklch(36% .06 48);--beam-light:oklch(44% .07 52);--frame:oklch(50% .09 50);--frame-light:oklch(60% .095 55);--frame-dark:oklch(34% .065 45);--inset:oklch(20.5% .016 40);--desk:oklch(42% .075 48);--desk-light:oklch(50% .085 52);--desk-edge:oklch(30% .055 44);--leaf:oklch(66% .09 128);--leaf-shade:oklch(50% .08 135);--vine:oklch(42% .05 120);--lamp:oklch(86% .12 75);--lamp-pool:oklch(78% .13 65);--paper:oklch(90% .03 80);--petal:oklch(68% .13 15);--fur:oklch(72% .12 55);--fur-light:oklch(88% .04 70);--fur-dark:oklch(56% .12 45);--book-red:oklch(42% .11 25);--book-green:oklch(40% .06 150);--book-blue:oklch(36% .06 250);--book-plum:oklch(36% .07 330);--book-band:oklch(72% .1 80);--gutter:clamp(14px, 4vw, 72px);--window-peek:clamp(24px, 7dvh, 68px);--desk-h:clamp(40px, 8.5dvh, 86px);--focus:oklch(85% .09 70);--radius-sm:6px;--radius:9px;--space-1:4px;--space-2:8px;--space-3:12px;--space-4:16px;--space-5:24px;--text-xs:11px;--text-sm:12.5px;--text-md:14px;--text-lg:17px;--ease:cubic-bezier(.2, 0, 0, 1);--fast:.12s}*,:before,:after{box-sizing:border-box}html,body,#root{height:100%;margin:0}body{background:var(--bg);color:var(--text);font-family:var(--font-ui);font-size:var(--text-md);-webkit-font-smoothing:antialiased}button,input,select{font:inherit;color:inherit}:focus-visible{outline:2px solid var(--focus);outline-offset:2px}.spin{animation:.9s linear infinite spin}@keyframes spin{to{transform:rotate(360deg)}}.app{isolation:isolate;height:100dvh;padding:0 var(--gutter);column-gap:var(--space-4);grid-template-columns:300px minmax(0,1fr) 296px;grid-template-rows:var(--window-peek) auto minmax(0, 1fr) var(--desk-h);grid-template-areas:". . .""top top top""layers stage side"". .status";display:grid;position:relative}.app>:not(.room){z-index:1;position:relative}.app>.topbar{z-index:3}.topbar,.toolbar,.panel,.stage__frame{border:5px solid var(--frame);border-top-color:var(--frame-light);border-left-color:var(--frame-light);border-bottom-color:var(--frame-dark);border-right-color:var(--frame-dark);box-shadow:inset 0 0 0 1px var(--frame-dark), 0 5px 0 var(--wall-seam);border-radius:16px}.topbar{align-items:center;gap:var(--space-5);margin-bottom:var(--space-4);padding:0 var(--space-3) 0 var(--space-4);background-color:var(--beam);background-image:var(--grain);border-width:3px;border-radius:14px;grid-area:top;min-width:0;min-height:60px;display:flex}.topbar>div{align-items:center;gap:var(--space-2);min-width:0;display:flex}.topbar__brand{flex:0 280px}.topbar__actions{margin-left:auto;gap:2px!important}.topbar__divider{background:var(--border);width:1px;height:20px;margin:0 6px}.save-state{font-size:var(--text-xs);color:var(--text-faint);white-space:nowrap;flex:none}.save-state--error{color:var(--danger)}.app-loading{height:100dvh;color:var(--text-faint);place-items:center;display:grid}.wordmark{font-family:var(--font-display);letter-spacing:-.01em;color:var(--coral-strong);padding-right:var(--space-2);font-size:22px;font-weight:600}.project-name{border-radius:var(--radius-sm);width:100%;min-width:0;color:var(--text-muted);transition:border-color var(--fast) var(--ease), color var(--fast) var(--ease);background:0 0;border:1px solid #0000;padding:5px 8px}.project-name:hover{border-color:var(--border)}.project-name:focus{color:var(--text);border-color:var(--border-strong);outline:none}.project-name:focus-visible{outline:2px solid var(--focus)}.bpm{background:var(--sunken);border:1px solid var(--border);border-radius:var(--radius-sm);color:var(--text-faint);font-size:var(--text-xs);align-items:baseline;gap:4px;padding:4px 10px 4px 4px;display:flex}.bpm input{text-align:right;width:46px;font-size:var(--text-md);font-variant-numeric:tabular-nums;color:var(--text);background:0 0;border:0;font-weight:600}.bpm input:focus{outline:none}.bpm:focus-within{border-color:var(--focus)}.layers{grid-area:layers;align-self:start;max-height:calc(100% - 6px)}.side{flex-direction:column;grid-area:side;min-height:0;display:flex}.side__cat{z-index:2;pointer-events:none;flex:none;height:86px;position:relative}.side__cat .cat{width:226px;height:196px;position:absolute;top:-29.64px;right:-17px}.side__scroll{gap:var(--space-4);scrollbar-width:thin;scrollbar-color:var(--frame) transparent;flex-direction:column;flex:1;min-height:0;padding-bottom:6px;display:flex;overflow-y:auto}.panel{gap:var(--space-3);background-image:var(--grain);padding:var(--space-4);background-color:var(--inset);flex-direction:column;min-height:0;display:flex}.layers.panel{gap:var(--space-4);scrollbar-width:thin;scrollbar-color:var(--frame) transparent;padding:18px;overflow-y:auto}.side .panel{flex:none;gap:10px;padding:12px 14px}.side .band-part{gap:6px;padding-top:10px}.panel__title{font-family:var(--font-display);color:var(--text);align-items:center;gap:6px;margin:0;font-size:17px;font-weight:600;display:flex}.panel__title .sprig{translate:0 -3px}.panel__subtitle{margin:var(--space-1) 0 0;font-size:var(--text-xs);color:var(--text-faint);font-weight:600}.band-part{gap:var(--space-2);padding-top:var(--space-3);border-top:1px dashed var(--border);flex-direction:column;display:flex}.band-part:first-of-type{border-top:0;padding-top:0}.field-row{gap:var(--space-2);grid-template-columns:1fr 1fr;display:grid}.layer-list{gap:var(--space-1);flex-direction:column;margin:0;padding:0;list-style:none;display:flex}.layer{border-radius:var(--radius);border:1px solid #0000}.layer--active{background:var(--raised);border-color:var(--border)}.layer__row{align-items:center;gap:var(--space-1);padding:5px 6px 5px 4px;display:flex}.layer__select{align-items:center;gap:var(--space-3);border-radius:var(--radius-sm);text-align:left;cursor:pointer;background:0 0;border:0;flex:1;min-width:0;padding:7px 8px;display:flex}.layer__select:hover{background:color-mix(in oklch, var(--raised) 70%, transparent)}.layer--active .layer__select:hover{background:0 0}.layer__swatch{border-radius:4px;flex:none;width:12px;height:12px}.layer--muted .layer__swatch{opacity:.35}.layer__text{flex-direction:column;min-width:0;display:flex}.layer__name{white-space:nowrap;text-overflow:ellipsis;font-weight:600;overflow:hidden}.layer__meta{font-size:var(--text-xs);color:var(--text-faint);white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.layer__detail{gap:var(--space-4);padding:var(--space-3) var(--space-4) var(--space-4);flex-direction:column;display:flex}.add-layer{gap:var(--space-2);flex-direction:column;display:flex}.add-layer__button{height:40px;font-size:var(--text-md);justify-content:center}.add-layer__menu{gap:var(--space-1);padding:var(--space-2);border:1px solid var(--border-strong);border-radius:var(--radius);background-color:var(--surface);animation:pop-in .14s var(--ease);grid-template-columns:1fr 1fr;display:grid}.add-layer__option{border-radius:var(--radius-sm);font-size:var(--text-sm);text-align:left;cursor:pointer;transition:background-color var(--fast) var(--ease), border-color var(--fast) var(--ease);background:0 0;border:1px solid #0000;padding:9px 10px;font-weight:600}.add-layer__option:hover,.add-layer__option:focus-visible{background:var(--raised);border-color:var(--border)}.stage{gap:var(--space-3);flex-direction:column;grid-area:stage;min-width:0;min-height:0;display:flex}.toolbar{align-self:flex-start;align-items:center;gap:var(--space-3);max-width:100%;padding:5px var(--space-3) 5px 5px;background-color:var(--beam);background-image:var(--grain);z-index:3;border-width:3px;border-radius:14px;display:flex;position:relative}.stage__frame{background-color:var(--inset);border-width:7px;border-radius:18px;flex-direction:column;flex:1;min-height:0;display:flex;overflow:hidden}.stage__vine{z-index:2;pointer-events:none;width:300px;height:auto;position:absolute;top:40px;right:-22px}.toolbar__size{width:170px}.toolbar__size .slider{align-items:center;gap:var(--space-3);flex-direction:row}.toolbar__size .slider__label{gap:var(--space-2);flex:none}.toolbar__size input,.toolbar__spacer{flex:1}.segmented{background:var(--sunken);border:1px solid var(--border);border-radius:var(--radius);gap:2px;padding:2px;display:flex}.canvas-wrap{background-color:oklch(20.5% .012 45);background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='180' height='180'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='3' stitchTiles='stitch'/%3E%3CfeColorMatrix values='0 0 0 0 1 0 0 0 0 0.95 0 0 0 0 0.85 0 0 0 0.05 0'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");flex:1;min-height:0;position:relative;overflow:hidden}.draw-canvas{touch-action:none;cursor:crosshair;display:block}.canvas-wrap[data-tool=erase] .draw-canvas{cursor:cell}.statusbar{align-self:center;align-items:center;gap:var(--space-3);min-width:0;height:30px;padding:0 4px 0 var(--space-3);border:2px solid var(--frame-dark);background-color:var(--inset);background-image:var(--grain);box-shadow:0 4px 0 var(--desk-edge);color:var(--text-muted);font-size:var(--text-xs);white-space:nowrap;border-radius:10px;grid-area:status;display:flex}.statusbar__text{text-overflow:ellipsis;flex:1;min-width:0;overflow:hidden}.statusbar__link{height:22px;padding:0 var(--space-2);border-radius:var(--radius-sm);color:var(--text-faint);font:inherit;cursor:pointer;background:0 0;border:0;align-items:center;gap:6px;display:inline-flex}.statusbar__link:hover{background:var(--raised);color:var(--text-muted)}.statusbar__link:focus-visible{outline:2px solid var(--focus);outline-offset:-2px}.statusbar__dot{border:1.5px solid var(--text-faint);border-radius:50%;width:7px;height:7px}.statusbar__link--connected{color:var(--text-muted)}.statusbar__link--connected .statusbar__dot{border-color:var(--sage);background:var(--sage)}.statusbar--error .statusbar__text{color:var(--danger)}@media (width<=1400px){.topbar{flex-wrap:wrap;row-gap:0;padding-top:9px}.topbar__music{flex-basis:100%;order:3;padding:8px 0 10px}.stage__vine{width:210px;right:-16px}}@media (width<=1180px){.app{grid-template-columns:268px minmax(0,1fr) 256px}.topbar{gap:var(--space-3)}.topbar__brand{flex-basis:180px}}@media (width<=920px){.app{height:auto;min-height:100dvh;padding:var(--space-3);row-gap:var(--space-3);grid-template:"top""stage"70dvh"layers""side""status"30px/minmax(0,1fr)}.topbar{margin-bottom:0}.layers{align-self:stretch;max-height:none}.side__cat,.stage__vine{display:none}.topbar{padding:var(--space-2) var(--space-3);row-gap:var(--space-2);flex-wrap:wrap}.topbar__actions{margin-left:0}.topbar>div{flex-wrap:wrap}.side__scroll,.layers.panel,.side{overflow:visible}.toolbar{flex-wrap:wrap}}.icon-btn{border-radius:var(--radius-sm);width:32px;height:32px;color:var(--text-muted);cursor:pointer;transition:background-color var(--fast) var(--ease), color var(--fast) var(--ease), border-color var(--fast) var(--ease);background:0 0;border:1px solid #0000;flex:none;place-items:center;display:inline-grid;position:relative}.icon-btn:hover{background:var(--raised);color:var(--text)}.icon-btn:active{transform:translateY(1px)}.icon-btn[aria-pressed=true]{background:var(--raised);border-color:var(--border-strong);color:var(--coral-strong)}.icon-btn:disabled{opacity:.45;cursor:not-allowed}.icon-btn--primary{background:var(--coral);color:var(--coral-ink)}.icon-btn--primary:hover{background:var(--coral-strong);color:var(--coral-ink)}.play-btn{border-radius:50%;width:38px;height:38px}[data-tip]:after{content:attr(data-tip);z-index:20;border-radius:var(--radius-sm);background:var(--sunken);border:1px solid var(--border-strong);color:var(--text);font-size:var(--text-xs);white-space:nowrap;pointer-events:none;opacity:0;transition:opacity var(--fast) var(--ease), transform var(--fast) var(--ease);padding:5px 8px;font-weight:500;position:absolute;top:calc(100% + 6px);left:50%;transform:translate(-50%,-2px)}[data-tip-side=top]:after{top:auto;bottom:calc(100% + 6px);transform:translate(-50%,2px)}[data-tip]:hover:after,[data-tip]:focus-visible:after{opacity:1;transition-delay:.35s;transform:translate(-50%)}[data-tip]:focus-visible:after{transition-delay:0s}.layer__row [data-tip]:after{left:auto;right:0;transform:translateY(-2px)}.layer__row [data-tip]:hover:after,.layer__row [data-tip]:focus-visible:after{transform:translate(0)}.field{flex-direction:column;gap:5px;min-width:0;display:flex}.field__label,.slider__label{font-size:var(--text-xs);color:var(--text-faint);font-weight:550}.select{appearance:none;background-color:var(--sunken);border:1px solid var(--border);border-radius:var(--radius-sm);width:100%;min-width:0;height:32px;font-size:var(--text-sm);cursor:pointer;text-overflow:ellipsis;transition:border-color var(--fast) var(--ease);background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6' fill='none' stroke='%23a69d94' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M1 1l4 4 4-4'/%3E%3C/svg%3E");background-position:right 10px center;background-repeat:no-repeat;padding:0 28px 0 10px}.select:hover{border-color:var(--border-strong)}.select option{background:var(--surface);color:var(--text)}.topbar .select{width:auto;max-width:190px}.field--key .select{width:64px}.slider{flex-direction:column;gap:6px;display:flex}.slider__label{justify-content:space-between;display:flex}.slider__label output{color:var(--text-muted);font-variant-numeric:tabular-nums}input[type=range]{--pct:50%;appearance:none;cursor:pointer;background:0 0;width:100%;height:18px;margin:0}input[type=range]::-webkit-slider-runnable-track{background:linear-gradient(to right, var(--coral) var(--pct), var(--border) var(--pct));border-radius:2px;height:4px}input[type=range]::-moz-range-track{background:var(--border);border-radius:2px;height:4px}input[type=range]::-moz-range-progress{background:var(--coral);border-radius:2px;height:4px}input[type=range]::-webkit-slider-thumb{appearance:none;background:var(--text);border:2px solid var(--bg);border-radius:50%;width:14px;height:14px;margin-top:-5px}input[type=range]::-moz-range-thumb{background:var(--text);border:2px solid var(--bg);border-radius:50%;width:12px;height:12px}input[type=range]:focus-visible{outline:none}input[type=range]:focus-visible::-webkit-slider-thumb{outline:2px solid var(--focus);outline-offset:2px}input[type=range]:focus-visible::-moz-range-thumb{outline:2px solid var(--focus);outline-offset:2px}.switch{align-items:center;gap:var(--space-2);cursor:pointer;font-weight:600;font-size:var(--text-sm);background:0 0;border:0;align-self:flex-start;padding:2px 0;display:inline-flex}.switch__track{background:var(--border);width:28px;height:16px;transition:background-color var(--fast) var(--ease);border-radius:8px;padding:2px}.switch__thumb{background:var(--text-muted);width:12px;height:12px;transition:transform var(--fast) var(--ease), background-color var(--fast) var(--ease);border-radius:50%;display:block}.switch[aria-checked=true] .switch__track{background:var(--sage)}.switch[aria-checked=true] .switch__thumb{background:var(--bg);transform:translate(12px)}.text-btn{border:1px solid var(--border);border-radius:var(--radius-sm);height:30px;color:var(--text-muted);font-size:var(--text-sm);white-space:nowrap;cursor:pointer;transition:background-color var(--fast) var(--ease), color var(--fast) var(--ease), border-color var(--fast) var(--ease);background:0 0;align-self:flex-start;align-items:center;gap:6px;padding:0 10px;display:inline-flex}.text-btn:hover{background:var(--raised);color:var(--text)}.text-btn:disabled{opacity:.45;cursor:not-allowed}.text-btn--danger:hover{color:var(--danger);border-color:color-mix(in oklch, var(--danger) 50%, var(--border))}.segmented--text button{border-radius:var(--radius-sm);height:28px;color:var(--text-muted);font-size:var(--text-sm);white-space:nowrap;cursor:pointer;transition:background-color var(--fast) var(--ease), color var(--fast) var(--ease);background:0 0;border:1px solid #0000;align-items:center;gap:5px;padding:0 10px;font-weight:600;display:inline-flex;position:relative}.segmented--text button:hover{color:var(--text)}.segmented--text button[aria-pressed=true]{background:var(--raised);border-color:var(--border-strong);color:var(--text)}.segmented--text button:disabled{color:var(--text-faint);cursor:default;background:0 0;border-color:#0000}.tip-left[data-tip]:after{left:auto;right:0;transform:translateY(-2px)}.tip-left[data-tip]:hover:after,.tip-left[data-tip]:focus-visible:after{transform:translate(0)}.btn{border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--raised);height:34px;color:var(--text);font-size:var(--text-sm);white-space:nowrap;cursor:pointer;transition:background-color var(--fast) var(--ease), border-color var(--fast) var(--ease), color var(--fast) var(--ease);align-items:center;gap:7px;padding:0 14px;font-weight:600;display:inline-flex}.btn:hover{border-color:var(--border-strong);background:color-mix(in oklch, var(--raised) 80%, var(--text) 6%)}.btn:active{transform:translateY(1px)}.btn:disabled{opacity:.45;cursor:not-allowed;transform:none}.btn--primary{background:var(--coral);border-color:var(--coral);color:var(--coral-ink)}.btn--primary:hover{background:var(--coral-strong);border-color:var(--coral-strong)}.btn--danger{background:var(--danger);border-color:var(--danger);color:var(--coral-ink)}.btn--danger:hover{background:color-mix(in oklch, var(--danger) 85%, white)}.btn--sm{height:28px;font-size:var(--text-xs);padding:0 10px}.scenes-bar{align-items:center;gap:var(--space-4);padding:var(--space-2) var(--space-3);border-top:2px solid var(--frame-dark);background-color:var(--surface);background-image:var(--grain);min-width:0;display:flex}.scenes{flex:none;align-items:center;gap:2px;display:flex}.scene-tabs{background:var(--sunken);border:1px solid var(--border);border-radius:var(--radius);scrollbar-width:none;gap:2px;max-width:260px;margin-right:4px;padding:2px;display:flex;overflow-x:auto}.scene-tab{border-radius:var(--radius-sm);min-width:32px;height:28px;color:var(--text-muted);font-weight:600;font-size:var(--text-sm);white-space:nowrap;cursor:pointer;background:0 0;border:1px solid #0000;padding:0 10px}.scene-tab:hover{color:var(--text)}.scene-tab[aria-selected=true]{background:var(--raised);border-color:var(--border-strong);color:var(--text)}.scene-name{background:var(--sunken);border:1px solid var(--border);border-radius:var(--radius-sm);width:110px;height:30px;font-size:var(--text-sm);margin:0 2px 0 6px;padding:0 8px}.scene-name:focus{border-color:var(--focus);outline:none}.arrangement{align-items:center;gap:var(--space-2);min-width:0;padding-left:var(--space-4);border-left:1px solid var(--border);flex-wrap:wrap;flex:1;display:flex}.arrangement__label{font-size:var(--text-xs);color:var(--text-faint);font-weight:600}.arrangement__list{gap:var(--space-2);flex-wrap:wrap;flex:1 1 0;min-width:min-content;margin:0;padding:2px 0;list-style:none;display:flex}.chip{border:1px solid var(--border);border-radius:var(--radius);background:var(--surface);flex:none;align-items:center;height:32px;padding:0 2px;display:flex}.chip--viewed{border-color:var(--border-strong);background:var(--raised)}.chip--playing{border-color:var(--coral)}.chip__name{font-weight:650;font-size:var(--text-sm);white-space:nowrap;padding:0 4px}.chip__repeat{text-align:center;min-width:22px;font-size:var(--text-xs);color:var(--text-muted);font-variant-numeric:tabular-nums}.icon-btn.chip__btn{width:22px;height:24px}@media (width<=1400px){.scenes-bar{flex-wrap:wrap}.arrangement{border-left:0;flex-basis:100%;padding-left:0}}.dialog{border:1px solid var(--border-strong);background:var(--surface);width:min(440px,100vw - 32px);max-height:min(640px,100dvh - 32px);color:var(--text);border-radius:12px;padding:0;overflow:hidden}.dialog--wide{width:min(560px,100vw - 32px)}.dialog::backdrop{background:oklch(12% .01 60/.6)}.dialog[open]{animation:dialog-in .16s var(--ease)}@keyframes dialog-in{0%{opacity:0;transform:translateY(6px)}}.dialog__box{max-height:inherit;flex-direction:column;display:flex}.dialog__head{padding:var(--space-3) var(--space-3) var(--space-3) var(--space-5);border-bottom:1px solid var(--border);justify-content:space-between;align-items:center;display:flex}.dialog__head h2{font-size:var(--text-lg);margin:0;font-weight:650}.dialog__head .icon-btn[data-tip]:after{display:none}.dialog__body{gap:var(--space-4);padding:var(--space-5);flex-direction:column;display:flex;overflow-y:auto}.dialog__actions{gap:var(--space-2);flex-wrap:wrap;display:flex}.dialog__section{font-size:var(--text-sm);color:var(--text-muted);margin:0;font-weight:650}.dialog__note{font-size:var(--text-sm);color:var(--text-faint);margin:0}.dialog a{color:var(--coral-strong);text-underline-offset:3px}.projects__new{align-items:flex-end;gap:var(--space-2);display:flex}.projects__new .field{flex:1}.project-list{background:var(--sunken);border:1px solid var(--border);border-radius:var(--radius);flex-direction:column;gap:2px;max-height:300px;margin:0;padding:4px;list-style:none;display:flex;overflow-y:auto}.project-list__empty{padding:var(--space-4);color:var(--text-faint);font-size:var(--text-sm);text-align:center}.project-row{align-items:center;gap:var(--space-2);border-radius:var(--radius-sm);padding-right:6px;display:flex}.project-row:hover,.project-row--current{background:var(--raised)}.project-row__open{text-align:left;cursor:pointer;border-radius:var(--radius-sm);background:0 0;border:0;flex-direction:column;flex:1;align-items:flex-start;gap:2px;min-width:0;padding:9px 10px;display:flex}.project-row__name{text-overflow:ellipsis;white-space:nowrap;max-width:100%;font-weight:600;overflow:hidden}.project-row__meta{font-size:var(--text-xs);color:var(--text-faint)}.project-row__confirm{gap:4px;display:flex}.choice{gap:var(--space-2);border:0;flex-direction:column;margin:0;padding:0;display:flex}.choice legend{margin-bottom:var(--space-2)}.choice__option{align-items:flex-start;gap:var(--space-3);padding:var(--space-3);border:1px solid var(--border);border-radius:var(--radius);cursor:pointer;display:flex}.choice__option:has(input:checked){border-color:var(--coral);background:var(--raised)}.choice__option input{accent-color:var(--coral);margin-top:3px}.choice__option span{flex-direction:column;gap:2px;font-weight:600;display:flex}.choice__option small{font-weight:400;font-size:var(--text-xs);color:var(--text-faint)}.credit-list{flex-direction:column;margin:0;padding:0;list-style:none;display:flex}.credit-list li{align-items:baseline;gap:var(--space-3);border-bottom:1px dashed var(--border);font-size:var(--text-sm);padding:8px 0;display:flex}.credit-list li>span:not(.credit-list__license){color:var(--text-muted);min-width:0}.credit-list__license{font-size:var(--text-xs);color:var(--text-faint);font-variant-numeric:tabular-nums;flex:none;margin-left:auto}.window-art{width:100%;height:100%;display:block}.window-art__plant{transform-box:fill-box;transform-origin:50% 100%}.window-art__plant.is-swaying{animation:plant-sway var(--sway-duration,3.3s) ease-in-out infinite}@keyframes plant-sway{0%,to{transform:rotate(-2.2deg)}50%{transform:rotate(2.2deg)}}@media (prefers-reduced-motion:reduce){.window-art__plant.is-swaying{animation:none}}.mood-picker{position:relative}.mood-button{border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--sunken);height:32px;font-size:var(--text-sm);white-space:nowrap;cursor:pointer;transition:border-color var(--fast) var(--ease);align-items:center;gap:8px;padding:0 10px 0 4px;display:inline-flex}.mood-button:hover,.mood-button[aria-expanded=true]{border-color:var(--border-strong)}.mood-button svg:last-child{color:var(--text-faint)}.mood-button__thumb{border-radius:4px;width:34px;height:auto}.mood-popover{z-index:30;gap:var(--space-2);padding:var(--space-3);border:1px solid var(--border-strong);background-color:var(--surface);background-image:var(--grain);animation:pop-in .14s var(--ease);border-radius:12px;grid-template-columns:repeat(5,132px);display:grid;position:absolute;top:calc(100% + 8px);right:0}@keyframes pop-in{0%{opacity:0;transform:translateY(-4px)}}.mood-card{border-radius:var(--radius);text-align:left;cursor:pointer;transition:background-color var(--fast) var(--ease), border-color var(--fast) var(--ease);background:0 0;border:1px solid #0000;flex-direction:column;gap:4px;padding:6px 6px 8px;display:flex}.mood-card:hover{background:var(--raised)}.mood-card[aria-pressed=true]{border-color:var(--coral);background:var(--raised)}.mood-card__art{border-radius:6px;width:100%;height:auto;margin-bottom:4px}.mood-card__name{font-weight:650;font-size:var(--text-sm)}.mood-card__meta{font-size:var(--text-xs);color:var(--text-faint)}@media (width<=920px){.mood-popover{grid-template-columns:repeat(auto-fill,minmax(132px,1fr));max-height:76dvh;position:fixed;top:12dvh;left:12px;right:12px;overflow-y:auto}}.room{--window-w:min(64vw, 1180px);z-index:0;pointer-events:none;background-color:var(--wall);background-image:var(--grain), repeating-linear-gradient(90deg, var(--wall) 0 84px, var(--wall-seam) 84px 87px, var(--wall-shade) 87px 171px, var(--wall-seam) 171px 174px);position:fixed;inset:0;overflow:hidden}.room__beam{background-color:var(--beam);background-image:var(--grain);border-bottom:4px solid var(--wall-seam);height:22px;box-shadow:inset 0 -3px 0 var(--beam-light);position:absolute;inset:0 0 auto}.room__brace{background-color:var(--beam);background-image:var(--grain);border-top:3px solid var(--beam-light);border-bottom:3px solid var(--wall-seam);width:26vw;height:20px;position:absolute;top:16px}.room__brace--left{right:calc(50% + var(--window-w) / 2 - 8px);transform-origin:100%;rotate:-13deg}.room__brace--right{left:calc(50% + var(--window-w) / 2 - 8px);transform-origin:0;rotate:13deg}.room-window{width:var(--window-w);height:calc(var(--window-peek) + 104px);border:11px solid var(--frame);border-top-color:var(--frame-dark);border-bottom-color:var(--frame-dark);background:var(--wall-seam);box-shadow:0 0 0 3px var(--frame-dark);border-radius:0 0 8px 8px;position:absolute;top:-10px;left:50%;translate:-50%}.room-window__glass{height:100%;position:relative;overflow:hidden}.room-window__view,.room-window__weather{width:100%;height:100%;display:block;position:absolute;inset:0}.room-window__panes{background-image:linear-gradient(to right, var(--frame-light) 0 2px, var(--frame) 2px 9px, transparent 9px), linear-gradient(to bottom, transparent calc(34% - 4px), var(--frame-light) calc(34% - 4px) calc(34% - 2px), var(--frame) calc(34% - 2px) calc(34% + 4px), transparent calc(34% + 4px));background-position:-4px 0,0 0;background-repeat:repeat-x,no-repeat;background-size:16.6667% 100%,100% 100%;position:absolute;inset:0}.room-window__panes:after{content:"";background-image:linear-gradient(115deg,#0000 18%,oklch(100% 0 0/.05) 18% 21%,#0000 21%),linear-gradient(115deg,#0000 62%,oklch(100% 0 0/.04) 62% 63.5%,#0000 63.5%);position:absolute;inset:0}.room__garland{top:0;left:calc(50% - var(--window-w) / 2 - 26px);width:min(560px,38vw);height:auto;position:absolute}.lantern{top:0;left:calc(var(--gutter) / 2 - 20px);transform-origin:top;flex-direction:column;align-items:center;width:40px;display:flex;position:absolute;scale:1.25}.lantern__chain{width:3px;height:calc(var(--window-peek) * .8);background:repeating-linear-gradient(to bottom, var(--frame-dark) 0 5px, transparent 5px 7px)}.lantern__cap{background:var(--frame-dark);clip-path:polygon(28% 0,72% 0,100% 100%,0 100%);width:40px;height:12px}.lantern__body{background:var(--lamp);border:3px solid var(--frame-dark);border-radius:3px;width:32px;height:46px;position:relative}.lantern__body:before{content:"";background:var(--frame-dark);opacity:.55;position:absolute;inset:0 calc(50% - 1px)}.lantern__flame{background:var(--paper);width:9px;height:15px;box-shadow:inset 0 -5px 0 var(--coral-strong);border-radius:50% 50% 45% 45%/62% 62% 38% 38%;position:absolute;bottom:6px;left:50%;translate:-50%}.lantern__base{background:var(--frame-dark);clip-path:polygon(0 0,100% 0,82% 100%,18% 100%);width:38px;height:8px}.lantern__light{left:50%;top:calc(var(--window-peek) + 42px);aspect-ratio:1;background:var(--lamp-pool);opacity:.08;border-radius:50%;width:230px;position:absolute;translate:-50% -50%}.lantern__light--wide{opacity:.045;width:440px}.room__vine{height:auto;position:absolute;top:0}.room__vine--left{left:2px}.room__vine--left-2{left:calc(var(--gutter) - 14px);top:18px}.room__vine--right{right:2px}.room__vine--right-2{right:calc(var(--gutter) - 14px);top:26px}.photo{left:calc(var(--gutter) + 74px);bottom:calc(var(--desk-h) + 168px);background:var(--paper);width:92px;box-shadow:4px 5px 0 var(--wall-seam);border-radius:2px;padding:6px 6px 20px;position:absolute;rotate:-7deg}.photo svg{width:100%;height:66px;display:block}.photo__pin{background:var(--coral);width:10px;height:10px;box-shadow:inset -2px -2px 0 color-mix(in oklch, var(--coral) 70%, black);border-radius:50%;position:absolute;top:-4px;left:12px}.photo__pin--right{left:auto;right:12px}.desk{height:var(--desk-h);border-top:7px solid var(--desk-light);background-color:var(--desk);background-image:var(--grain), repeating-linear-gradient(to bottom, var(--desk) 0 22px, var(--desk-edge) 22px 24px);box-shadow:0 -5px 0 var(--wall-seam);position:absolute;inset:auto 0 0}.desk__sun{background:var(--lamp-pool);opacity:.14;height:100%;position:absolute;bottom:0;transform:skew(-38deg)}.desk__sun--a{width:70px;left:30%}.desk__sun--b{width:34px;left:36%}.desk__sun--c{width:96px;left:63%}.petal{background:var(--petal);width:17px;height:9px;box-shadow:inset -4px -2px 0 color-mix(in oklch, var(--petal) 75%, black);border-radius:60% 40%;position:absolute}.books{left:calc(var(--gutter) - 8px);bottom:calc(var(--desk-h) - 14px);align-items:flex-end;gap:2px;display:flex;position:absolute}.book{--book:var(--book-red);background-color:var(--book);border-left:4px solid color-mix(in oklch, var(--book) 72%, black);background-image:linear-gradient(to bottom, transparent 14px, var(--book-band) 14px 17px, transparent 17px 21px, var(--book-band) 21px 23px, transparent 23px calc(100% - 26px), var(--book-band) calc(100% - 26px) calc(100% - 23px), transparent calc(100% - 23px));width:30px;height:150px;box-shadow:3px 0 0 var(--wall-seam);border-radius:3px 3px 2px 2px}.book--green{--book:var(--book-green);width:26px;height:172px}.book--blue{--book:var(--book-blue);width:34px;height:160px}.book--plum{--book:var(--book-plum);width:24px;height:138px}.book--lean{--book:var(--book-red);transform-origin:0 100%;width:28px;height:144px;margin-left:18px;rotate:11deg}.mug{left:calc(var(--gutter) + 196px);bottom:calc(var(--desk-h) - 30px);width:82px;height:84px;position:absolute}.mug__saucer{background:var(--frame-light);width:96px;height:15px;box-shadow:inset 0 -5px 0 var(--frame);border-radius:50%;position:absolute;bottom:0;left:-8px}.mug__handle{border:7px solid var(--paper);border-radius:50%;width:30px;height:34px;position:absolute;top:20px;right:0}.mug__body{background:var(--paper);width:58px;height:66px;box-shadow:inset -9px 0 0 color-mix(in oklch, var(--paper) 86%, black);border-radius:5px 5px 18px 18px;place-items:center;padding-top:8px;display:grid;position:absolute;bottom:9px;left:4px}.mug__body:before{content:"";background:var(--wood-dark);border-radius:5px 5px 50% 50%;height:7px;position:absolute;inset:0 0 auto}.mug__body svg{width:40px;height:auto}.sheet{width:400px;height:120px;display:flex;position:absolute;bottom:-30px;left:50%;translate:-50%}.sheet__page{background:var(--paper);border-radius:10px 10px 0 0;flex:1;padding:12px 10px;display:block}.sheet__page--left{transform-origin:100% 100%;box-shadow:inset -12px 0 0 color-mix(in oklch, var(--paper) 90%, black);rotate:-3deg}.sheet__page--right{transform-origin:0 100%;box-shadow:inset 12px 0 0 color-mix(in oklch, var(--paper) 90%, black);rotate:3deg}.sheet__notes{width:100%;height:72px;display:block}.art-leaf{fill:var(--leaf)}.art-leaf-shade{fill:var(--leaf-shade)}.art-vine{stroke:var(--vine)}.art-fur{fill:var(--fur)}.art-fur-light{fill:var(--fur-light)}.art-fur-dark{fill:var(--fur-dark)}.art-fur-stroke{stroke:var(--fur)}.art-fur-light-stroke{stroke:var(--fur-light)}.art-fur-dark-stroke{stroke:var(--fur-dark)}.art-ear,.art-petal{fill:var(--petal)}.art-blush{stroke:var(--petal);opacity:.55}.art-flower-heart{fill:var(--book-band)}.art-ink{stroke:var(--coral-ink)}.art-ink-fill{fill:var(--coral-ink)}.art-staff{stroke:var(--coral-ink);opacity:.45}@media (width<=1320px){.lantern,.room__vine--left-2,.room__vine--right-2{display:none}}@media (width<=1180px),(height<=800px){.photo,.books,.mug{display:none}}@media (width<=920px){.room>:not(.room__beam){display:none}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,t,n)=>()=>{if(n)throw n[0];try{return e&&(t=e(e=0)),t}catch(e){throw n=[e],e}},s=(e,t)=>()=>(t||(e((t={exports:{}}).exports,t,t.exports),e=null),t.exports),c=(e,n)=>{let r={};for(var i in e)t(r,i,{get:e[i],enumerable:!0});return n||t(r,Symbol.toStringTag,{value:`Module`}),r},l=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},u=(n,r,o)=>(o=n==null?{}:e(i(n)),l(r||!n||!n.__esModule||!a.call(n,`default`)?t(o,`default`,{value:n,enumerable:!0}):o,n)),d=e=>a.call(e,`module.exports`)?e[`module.exports`]:l(t({},`__esModule`,{value:!0}),e);export{u as a,d as i,o as n,c as r,s as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{C as e,S as t,_ as n,a as r,b as i,c as a,d as o,f as s,g as c,h as l,i as u,l as d,m as f,n as p,o as ee,p as m,r as te,s as ne,u as h,v as g,w as _,x as re,y as ie}from"./esm-J-U37_Wq.js";import{a as v,i as y,n as b,o as x,r as ae,s as oe,t as se}from"./index-BkzOde44.js";function S(e,t){return e.find(e=>t<=e.maxVelocity)??e[e.length-1]}function C(e){let t=new Set;for(let n of Object.values(e.instruments))for(let e of n?.layers??[])for(let n of Object.values(e.zones))t.add(n);for(let n of Object.values(e.drums.pieces))for(let e of n??[])for(let n of e.files)t.add(n);for(let n of Object.values(e.ambience))t.add(n.file);return[...t]}async function w(e,t,n){let r=C(e),i=new Map,a=0;return await Promise.all(r.map(async e=>{let o=await t(e);i.set(e,new _(o)),n?.(++a,r.length)})),{manifest:e,buffers:i}}function T(t){let n=t.endsWith(`/`)?t:`${t}/`;return async t=>{let r=await fetch(n+t);if(!r.ok)throw Error(`Couldn't load ${t} (${r.status})`);return e().decodeAudioData(await r.arrayBuffer())}}function E(e,t){let n=e.buffers.get(t);if(!n)throw Error(`Sample ${t} isn't loaded`);return n}var D={piano:0,wurli:-9,"fm-ep":-2,glock:-9,marimba:-2,harp:-3,vibes:-9,kalimba:-3,guitar:-9,pad:-11,pluck:-6,celesta:-4.5,musicbox:-3,bass:-19,drums:0},O={piano:[12,0]},k=e=>.45+.55*e,A={kick:0,snare:-3,brush:8,rim:-4,hat:-9,brushhat:2,openhat:-12,ride:-10,tom:-4,shaker:-3,cabasa:-10},ce=6,j=-1,M=.55,N=-12,P=-46,F=12;function I(e){return Math.max(0,Math.min(1,e))**2}var L=e=>10**(e/20),R=e=>1e3*2**(Math.max(0,Math.min(1,e))*4);function z(e,t,n,r){let a=new i(L(D[e]));return r.connect(a),{output:a,play(e,n,i){r.frequency.setValueAtTime(R(e.brightness),n),t(e).triggerAttackRelease(re(e.midi,`midi`).toFrequency(),i,n,e.velocity)},dispose(){for(let e of n)e.dispose();r.dispose(),a.dispose()}}}function B(e,t){let n=t.manifest.instruments[e];if(!n)throw Error(`No samples for ${e}`);let r=new m({type:`lowpass`,frequency:12e3,rolloff:-12}),a=O[e]??[],o=[],s=n.layers.map((e,s)=>{let c={};for(let[n,r]of Object.entries(e.zones))c[Number(n)]=E(t,r);let l=new i(L(a[s]??0)).connect(r),u=new d({urls:c,release:n.release}).connect(l);return o.push(u,l),{maxVelocity:e.maxVelocity,sampler:u}});return z(e,e=>{let{sampler:t}=S(s,e.velocity);return{triggerAttackRelease:(e,n,r,i)=>t.triggerAttackRelease(e,n,r,k(i)),dispose(){}}},o,r)}function V(e){let t=new m({type:`lowpass`,frequency:8e3,rolloff:-12}),n;switch(e){case`fm-ep`:n=new h(o,{harmonicity:1,modulationIndex:3.5,oscillator:{type:`sine`},modulation:{type:`sine`},envelope:{attack:.002,decay:1.8,sustain:.18,release:.9},modulationEnvelope:{attack:.002,decay:.45,sustain:.08,release:.6}});break;case`pad`:n=new h(f,{oscillator:{type:`fatsawtooth`,count:3,spread:16},envelope:{attack:.9,decay:.6,sustain:.8,release:2.4}}),t.Q.value=.5;break;case`celesta`:n=new h(o,{harmonicity:1,modulationIndex:16,oscillator:{type:`sine`},modulation:{type:`sine`},envelope:{attack:.002,decay:2.2,sustain:0,release:1.2},modulationEnvelope:{attack:.001,decay:.35,sustain:.01,release:.5}});break;case`musicbox`:n=new h(o,{harmonicity:6.27,modulationIndex:24,oscillator:{type:`sine`},modulation:{type:`sine`},envelope:{attack:.001,decay:1.5,sustain:0,release:.7},modulationEnvelope:{attack:.001,decay:.5,sustain:0,release:.4}});break;case`pluck`:n=new h(f,{oscillator:{type:`triangle`},envelope:{attack:.003,decay:.4,sustain:0,release:.35}});break;case`bass`:n=new h(s,{oscillator:{type:`triangle`},envelope:{attack:.008,decay:.35,sustain:.65,release:.35},filter:{Q:1,type:`lowpass`,rolloff:-24},filterEnvelope:{attack:.005,decay:.25,sustain:.35,release:.4,baseFrequency:110,octaves:2.6}}),n.maxPolyphony=4;break;default:throw Error(`${e} isn't a synth`)}return n.connect(t),z(e,()=>n,[n],t)}function H(e){let t=new i(L(D.drums)),r=new Map(x.map(e=>[e,new i(L(A[e])).connect(t)]));return{output:t,play(i,a){let o=i.drum,s=o&&e.manifest.drums.pieces[o];if(!o||!s?.length)return;let c=S(s,i.velocity).files,l=c[Math.floor(i.time*4+.01)%c.length],u=new n({url:E(e,l),context:t.context}).connect(r.get(o));u.onended=()=>u.dispose(),u.start(a,0,void 0,i.velocity**1.2)},dispose(){for(let e of r.values())e.dispose();t.dispose()}}}function U(e,t){return oe[e].kind===`drums`?H(t):t.manifest.instruments[e]?B(e,t):V(e)}var W=7;function G(e){let t=v(7),n=new Float32Array(Math.floor(e*W)),r=0;for(;r<n.length;){r+=Math.floor(-Math.log(1-t())*e/38);let i=t()<.04,a=(i?.6+t()*.4:.05+t()**3*.35)*(t()<.5?-1:1),o=i?24+Math.floor(t()*40):2+Math.floor(t()*6);for(let e=0;e<o&&r+e<n.length;e++)n[r+e]+=a*Math.exp(-e/(o/3))}let i=0,a=0;for(let e=0;e<n.length;e++){let t=n[e];a=.97*(a+t-i),i=t,n[e]=a}return _.fromArray(n)}function le(e=2.2){let t=2048,n=new Float32Array(t),r=Math.tanh(e);for(let i=0;i<t;i++){let t=i/2047*2-1;n[i]=Math.tanh(t*e)/r}return n}var K=class{input=new i(1);ready;drive=new i(1);saturate=new g(le(),2048);trim=new i(1);warmth=new m({type:`lowpass`,frequency:16e3,rolloff:-12,Q:.4});wobble=new ee({frequency:.55,depth:0,maxDelay:.006,type:`sine`});reverb=new ne({decay:3.2,preDelay:.02,wet:1});reverbReturn=new i(0);bus=new i(1);highpass=new m({type:`highpass`,frequency:32,rolloff:-12});comp=new u({threshold:-20,ratio:3,attack:.015,release:.25,knee:8});makeup=new i(L(6));fader=new i(1);limiter=new te(-1);crackle;crackleGain=new i(0);hiss=new c(`pink`);hissGain=new i(0);hissFilter=new m({type:`bandpass`,frequency:5e3,Q:.4});rain=new l({loop:!0,fadeIn:1.5,fadeOut:.5});rainGain=new i(0);rainFile=null;bank;constructor(t){this.bank=t,this.input.chain(this.drive,this.saturate,this.trim,this.warmth,this.wobble),this.wobble.connect(this.bus),this.wobble.chain(this.reverb,this.reverbReturn,this.bus),this.bus.chain(this.highpass,this.comp,this.makeup,this.fader,this.limiter,p()),this.crackle=new l({url:G(e().sampleRate),loop:!0}),this.crackle.chain(this.crackleGain,this.fader),this.hiss.chain(this.hissFilter,this.hissGain,this.fader),this.rain.chain(this.rainGain,this.fader),this.ready=this.reverb.ready}apply(e){let t=e.warmth;this.drive.gain.value=L(t*10),this.trim.gain.value=L(-t*8),this.warmth.frequency.value=16e3*(2600/16e3)**t,this.wobble.depth.value=e.wobble*.35,this.wobble.frequency.value=.4+e.wobble*.5,this.reverbReturn.gain.value=e.reverb*M,this.fader.gain.value=I(e.master)*1.56,this.crackleGain.gain.value=e.crackle>0?L(-12)*e.crackle**1.5:0,this.hissGain.gain.value=e.crackle>0?L(-46)*e.crackle:0;let n=this.bank.manifest.ambience[e.rain.kind===`roof`?`rain_roof`:`rain_window`].file;n!==this.rainFile&&(this.rainFile=n,this.rain.buffer=E(this.bank,n)),this.rainGain.gain.value=e.rain.enabled?L(12)*I(e.rain.level):0}startAmbience(e,t=0){this.crackle.state!==`started`&&this.crackle.start(e),this.hiss.state!==`started`&&this.hiss.start(e),this.rain.state!==`started`&&this.rain.loaded&&this.rain.start(e,t)}stopAmbience(e){this.crackle.stop(e),this.hiss.stop(e),this.rain.stop(e)}dispose(){for(let e of[this.input,this.drive,this.saturate,this.trim,this.warmth,this.wobble,this.reverb,this.reverbReturn,this.bus,this.highpass,this.comp,this.makeup,this.fader,this.limiter,this.crackle,this.crackleGain,this.hiss,this.hissGain,this.hissFilter,this.rain,this.rainGain])e.dispose()}},ue=[`chords`,`bass`,`drums`];function q(e,t){if(!e.track.startsWith(`backing:`))return e.track;let n=t.sections.findLast(t=>e.time>=t.start-.5)??t.sections[0];return`${e.track}@${n?.sceneId??``}`}function de(e){let t=new Map;for(let n of e.scenes){for(let e of n.layers)t.set(e.id,{volume:e.volume,pan:e.pan});for(let e of ue)t.set(`backing:${e}@${n.id}`,{volume:n.backing[e].volume,pan:0})}return t}var J=class{master;ready;bank;tracks=new Map;settings=new Map;part=null;constructor(e){this.bank=e,this.master=new K(e),this.ready=this.master.ready}sync(e){this.settings=de(e),this.master.apply(e.mix);for(let[e,t]of this.tracks){let n=this.settings.get(e);n?this.applySettings(t,n):this.disposeTrack(e,t)}}applySettings(e,n){let r=I(n.volume)*1.56;e.channel.volume.value=r>0?t(r):-1/0,e.channel.pan.value=n.pan}voice(e,t){let n=this.tracks.get(e);n||(n={channel:new r().connect(this.master.input),voices:new Map},this.applySettings(n,this.settings.get(e)??{volume:.8,pan:0}),this.tracks.set(e,n));let i=n.voices.get(t);return i||(i=U(t,this.bank),i.output.connect(n.channel),n.voices.set(t,i)),i}schedule(e){this.part?.dispose();let t=e.events.map(t=>{let n=q(t,e);return this.voice(n,t.instrument),{time:Math.max(0,y(t.time,e.bpm)),e:t,key:n,seconds:Math.max(.03,y(t.duration,e.bpm))}});this.part=new a((e,t)=>this.voice(t.key,t.e.instrument).play(t.e,e,t.seconds),t),this.part.start(0)}clear(){this.part?.dispose(),this.part=null}disposeTrack(e,t){for(let e of t.voices.values())e.dispose();t.channel.dispose(),this.tracks.delete(e)}dispose(){this.clear();for(let[e,t]of this.tracks)this.disposeTrack(e,t);this.master.dispose()}},Y=.05;function fe(e,t){if(t<=1)return e;let n={...e,beats:e.beats*t,events:[],chords:[],sections:[]};for(let r=0;r<t;r++){let t=r*e.beats;n.events.push(...e.events.map(e=>({...e,time:e.time+t}))),n.chords.push(...e.chords.map(e=>({...e,time:e.time+t}))),n.sections.push(...e.sections.map(e=>({...e,start:e.start+t})))}return n}function X(e,t={}){return t.scope===`song`?b(e):fe(ae(e,t.sceneId),t.loops??1)}var Z=Promise.resolve();function pe(e,t,n={}){let r=Z.then(()=>me(e,t,n));return Z=r.catch(()=>{}),r}async function me(e,t,n){let r=X(e,n),i=n.sampleRate??44100,a=Y+y(r.beats,r.bpm)+(n.tail??3),o=(await ie(async n=>{let i=new J(t);i.sync(e),await i.ready,n.transport.bpm.value=r.bpm,i.schedule(r),i.master.startAmbience(0),n.transport.start(Y)},a,2,i)).get();if(!o)throw Error(`Render came back empty`);let s=Array.from({length:o.numberOfChannels},(e,t)=>o.getChannelData(t));return{sampleRate:o.sampleRate,channels:s}}function he({channels:e}){let t=0,n=0,r=0;for(let i of e)for(let e=0;e<i.length;e++){let a=i[e];if(!Number.isFinite(a))return{peakDb:NaN,rmsDb:NaN};t=Math.max(t,Math.abs(a)),n+=a*a,r++}let i=e=>e>0?20*Math.log10(e):-1/0;return{peakDb:i(t),rmsDb:i(Math.sqrt(n/Math.max(1,r)))}}function ge(e){return[(()=>{let t=.7071752369554196,n=Math.tan(Math.PI*1681.974450955533/e),r=10**(3.999843853973347/20),i=r**.4996667741545416,a=1+n/t+n*n;return{b0:(r+i*n/t+n*n)/a,b1:2*(n*n-r)/a,b2:(r-i*n/t+n*n)/a,a1:2*(n*n-1)/a,a2:(1-n/t+n*n)/a}})(),(()=>{let t=.5003270373238773,n=Math.tan(Math.PI*38.13547087602444/e),r=1+n/t+n*n;return{b0:1,b1:-2,b2:1,a1:2*(n*n-1)/r,a2:(1-n/t+n*n)/r}})()]}function Q(e,{b0:t,b1:n,b2:r,a1:i,a2:a}){let o=new Float64Array(e.length),s=0,c=0,l=0,u=0;for(let d=0;d<e.length;d++){let f=e[d],p=t*f+n*s+r*c-i*l-a*u;o[d]=p,c=s,s=f,u=l,l=p}return o}var $=e=>-.691+10*Math.log10(e);function _e({sampleRate:e,channels:t}){let[n,r]=ge(e),i=t.map(e=>Q(Q(e,n),r)),a=Math.round(.4*e),o=Math.round(.1*e),s=t[0]?.length??0,c=[];for(let e=0;e+a<=s;e+=o){let t=0;for(let n of i){let r=0;for(let t=e;t<e+a;t++)r+=n[t]*n[t];t+=r/a}c.push(t)}let l=e=>e.reduce((e,t)=>e+t,0)/e.length,u=c.filter(e=>$(e)>-70);if(!u.length)return-1/0;let d=$(l(u))-10,f=u.filter(e=>$(e)>d);return f.length?$(l(f)):-1/0}export{N as CRACKLE_DB,A as DRUM_TRIM_DB,P as HISS_DB,D as INSTRUMENT_TRIM_DB,j as LIMITER_DB,ce as MASTER_MAKEUP_DB,K as MasterChain,F as RAIN_DB,M as REVERB_RETURN,J as Rig,O as SAMPLE_LAYER_LIFT_DB,E as bankBuffer,T as browserDecoder,U as createVoice,L as dbToGain,se as encodeWav,I as faderToGain,_e as integratedLoudness,w as loadSampleBank,C as manifestFiles,he as measure,pe as renderProject,k as sampleVelocityGain,X as scoreFor,q as trackKey};
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
|
+
<meta name="color-scheme" content="dark" />
|
|
7
|
+
<title>Haku</title>
|
|
8
|
+
<script type="module" crossorigin src="/assets/index-BkzOde44.js"></script>
|
|
9
|
+
<link rel="modulepreload" crossorigin href="/assets/rolldown-runtime-BWaJ3C7D.js">
|
|
10
|
+
<link rel="stylesheet" crossorigin href="/assets/index-D0m3L8JK.css">
|
|
11
|
+
<link rel="manifest" href="/manifest.webmanifest">
|
|
12
|
+
<link rel="icon" type="image/png" href="/icon-192.png">
|
|
13
|
+
<link rel="apple-touch-icon" href="/icon-192.png">
|
|
14
|
+
<meta name="theme-color" content="#201a17">
|
|
15
|
+
</head>
|
|
16
|
+
<body>
|
|
17
|
+
<div id="root"></div>
|
|
18
|
+
</body>
|
|
19
|
+
</html>
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "Haku",
|
|
3
|
+
"short_name": "Haku",
|
|
4
|
+
"description": "Draw on a canvas, get cozy lofi music.",
|
|
5
|
+
"start_url": "/",
|
|
6
|
+
"scope": "/",
|
|
7
|
+
"display": "standalone",
|
|
8
|
+
"background_color": "#201a17",
|
|
9
|
+
"theme_color": "#201a17",
|
|
10
|
+
"icons": [
|
|
11
|
+
{
|
|
12
|
+
"src": "/icon-192.png",
|
|
13
|
+
"sizes": "192x192",
|
|
14
|
+
"type": "image/png",
|
|
15
|
+
"purpose": "any"
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"src": "/icon-512.png",
|
|
19
|
+
"sizes": "512x512",
|
|
20
|
+
"type": "image/png",
|
|
21
|
+
"purpose": "any"
|
|
22
|
+
}
|
|
23
|
+
]
|
|
24
|
+
}
|
package/dist/web/sw.js
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
// Haku's service worker. It keeps the app and every sample in the cache, so the installed app opens
|
|
2
|
+
// even when `haku web` isn't running. The build fills in the file list and the cache version.
|
|
3
|
+
|
|
4
|
+
const CACHE = 'haku-9cc61dfac228';
|
|
5
|
+
const PRECACHE = ["/","/ambience/rain_roof.ogg","/ambience/rain_window.ogg","/assets/esm-J-U37_Wq.js","/assets/figtree-latin-ext-wght-normal-DCwSJGxG.woff2","/assets/figtree-latin-wght-normal-D_ZTVpCC.woff2","/assets/fraunces-latin-ext-wght-normal-Ca2vKHc0.woff2","/assets/fraunces-latin-wght-normal-ukD16Tqj.woff2","/assets/fraunces-vietnamese-wght-normal-CnvboYUG.woff2","/assets/index-BkzOde44.js","/assets/index-D0m3L8JK.css","/assets/rolldown-runtime-BWaJ3C7D.js","/assets/src-m48ItyJA.js","/drums/brush_v0_r1.ogg","/drums/brush_v0_r2.ogg","/drums/brush_v1_r1.ogg","/drums/brush_v1_r2.ogg","/drums/brushhat_v0_r1.ogg","/drums/brushhat_v0_r2.ogg","/drums/brushhat_v1_r1.ogg","/drums/brushhat_v1_r2.ogg","/drums/cabasa_v0_r1.ogg","/drums/cabasa_v0_r2.ogg","/drums/cabasa_v1_r1.ogg","/drums/cabasa_v1_r2.ogg","/drums/hat_v0_r1.ogg","/drums/hat_v0_r2.ogg","/drums/hat_v1_r1.ogg","/drums/hat_v1_r2.ogg","/drums/kick_v0_r1.ogg","/drums/kick_v0_r2.ogg","/drums/kick_v1_r1.ogg","/drums/kick_v1_r2.ogg","/drums/openhat_v0_r1.ogg","/drums/openhat_v0_r2.ogg","/drums/openhat_v1_r1.ogg","/drums/openhat_v1_r2.ogg","/drums/ride_v0_r1.ogg","/drums/ride_v0_r2.ogg","/drums/ride_v1_r1.ogg","/drums/ride_v1_r2.ogg","/drums/rim_v0_r1.ogg","/drums/rim_v0_r2.ogg","/drums/rim_v1_r1.ogg","/drums/rim_v1_r2.ogg","/drums/shaker_v0_r1.ogg","/drums/shaker_v0_r2.ogg","/drums/shaker_v1_r1.ogg","/drums/shaker_v1_r2.ogg","/drums/snare_v0_r1.ogg","/drums/snare_v0_r2.ogg","/drums/snare_v1_r1.ogg","/drums/snare_v1_r2.ogg","/drums/tom_v0_r1.ogg","/drums/tom_v0_r2.ogg","/drums/tom_v1_r1.ogg","/drums/tom_v1_r2.ogg","/glock/v0_103.ogg","/glock/v0_108.ogg","/glock/v0_79.ogg","/glock/v0_84.ogg","/glock/v0_91.ogg","/glock/v0_96.ogg","/guitar/v0_31.ogg","/guitar/v0_32.ogg","/guitar/v0_33.ogg","/guitar/v0_34.ogg","/guitar/v0_35.ogg","/guitar/v0_36.ogg","/guitar/v0_37.ogg","/guitar/v0_38.ogg","/guitar/v0_39.ogg","/guitar/v0_40.ogg","/guitar/v0_41.ogg","/guitar/v0_43.ogg","/guitar/v0_45.ogg","/guitar/v0_47.ogg","/guitar/v0_48.ogg","/guitar/v0_50.ogg","/guitar/v0_52.ogg","/guitar/v0_53.ogg","/guitar/v0_54.ogg","/guitar/v0_55.ogg","/guitar/v0_56.ogg","/guitar/v0_57.ogg","/guitar/v0_58.ogg","/guitar/v0_59.ogg","/guitar/v0_60.ogg","/guitar/v0_61.ogg","/guitar/v0_62.ogg","/guitar/v0_63.ogg","/guitar/v0_64.ogg","/guitar/v0_65.ogg","/guitar/v0_66.ogg","/guitar/v0_67.ogg","/guitar/v0_69.ogg","/guitar/v0_70.ogg","/guitar/v0_71.ogg","/guitar/v0_72.ogg","/guitar/v0_73.ogg","/guitar/v0_74.ogg","/guitar/v0_75.ogg","/guitar/v0_76.ogg","/guitar/v0_77.ogg","/guitar/v0_78.ogg","/guitar/v0_79.ogg","/guitar/v0_80.ogg","/guitar/v0_81.ogg","/guitar/v0_82.ogg","/guitar/v0_83.ogg","/guitar/v0_84.ogg","/harp/v0_101.ogg","/harp/v0_28.ogg","/harp/v0_31.ogg","/harp/v0_35.ogg","/harp/v0_38.ogg","/harp/v0_41.ogg","/harp/v0_45.ogg","/harp/v0_48.ogg","/harp/v0_52.ogg","/harp/v0_55.ogg","/harp/v0_59.ogg","/harp/v0_62.ogg","/harp/v0_65.ogg","/harp/v0_69.ogg","/harp/v0_72.ogg","/harp/v0_76.ogg","/harp/v0_79.ogg","/harp/v0_83.ogg","/harp/v0_86.ogg","/harp/v0_89.ogg","/harp/v0_93.ogg","/harp/v0_95.ogg","/harp/v0_98.ogg","/icon-192.png","/icon-512.png","/index.html","/kalimba/v0_44.ogg","/kalimba/v0_46.ogg","/kalimba/v0_49.ogg","/kalimba/v0_51.ogg","/kalimba/v0_53.ogg","/kalimba/v0_56.ogg","/kalimba/v0_59.ogg","/kalimba/v0_61.ogg","/kalimba/v0_64.ogg","/kalimba/v0_65.ogg","/kalimba/v0_67.ogg","/kalimba/v0_71.ogg","/kalimba/v0_73.ogg","/kalimba/v0_74.ogg","/kalimba/v0_75.ogg","/kalimba/v0_77.ogg","/kalimba/v0_78.ogg","/kalimba/v0_79.ogg","/kalimba/v0_82.ogg","/kalimba/v0_83.ogg","/manifest.json","/manifest.webmanifest","/marimba/v0_41.ogg","/marimba/v0_48.ogg","/marimba/v0_55.ogg","/marimba/v0_59.ogg","/marimba/v0_65.ogg","/marimba/v0_72.ogg","/marimba/v0_79.ogg","/marimba/v0_83.ogg","/marimba/v0_89.ogg","/marimba/v0_96.ogg","/piano/v0_29.ogg","/piano/v0_33.ogg","/piano/v0_37.ogg","/piano/v0_41.ogg","/piano/v0_45.ogg","/piano/v0_49.ogg","/piano/v0_53.ogg","/piano/v0_57.ogg","/piano/v0_61.ogg","/piano/v0_65.ogg","/piano/v0_69.ogg","/piano/v0_73.ogg","/piano/v0_77.ogg","/piano/v0_81.ogg","/piano/v0_85.ogg","/piano/v0_89.ogg","/piano/v0_93.ogg","/piano/v0_97.ogg","/piano/v1_29.ogg","/piano/v1_33.ogg","/piano/v1_37.ogg","/piano/v1_41.ogg","/piano/v1_45.ogg","/piano/v1_49.ogg","/piano/v1_53.ogg","/piano/v1_57.ogg","/piano/v1_61.ogg","/piano/v1_65.ogg","/piano/v1_69.ogg","/piano/v1_73.ogg","/piano/v1_77.ogg","/piano/v1_81.ogg","/piano/v1_85.ogg","/piano/v1_89.ogg","/piano/v1_93.ogg","/piano/v1_97.ogg","/vibes/v0_53.ogg","/vibes/v0_57.ogg","/vibes/v0_60.ogg","/vibes/v0_64.ogg","/vibes/v0_67.ogg","/vibes/v0_71.ogg","/vibes/v0_74.ogg","/vibes/v0_77.ogg","/vibes/v0_81.ogg","/vibes/v0_84.ogg","/vibes/v0_88.ogg","/vibes/v1_53.ogg","/vibes/v1_57.ogg","/vibes/v1_60.ogg","/vibes/v1_64.ogg","/vibes/v1_67.ogg","/vibes/v1_71.ogg","/vibes/v1_74.ogg","/vibes/v1_77.ogg","/vibes/v1_81.ogg","/vibes/v1_84.ogg","/vibes/v1_88.ogg","/wurli/v0_33.ogg","/wurli/v0_40.ogg","/wurli/v0_45.ogg","/wurli/v0_51.ogg","/wurli/v0_56.ogg","/wurli/v0_61.ogg","/wurli/v0_66.ogg","/wurli/v0_71.ogg","/wurli/v0_73.ogg","/wurli/v0_79.ogg","/wurli/v0_85.ogg","/wurli/v0_92.ogg","/wurli/v1_33.ogg","/wurli/v1_36.ogg","/wurli/v1_41.ogg","/wurli/v1_47.ogg","/wurli/v1_52.ogg","/wurli/v1_56.ogg","/wurli/v1_61.ogg","/wurli/v1_68.ogg","/wurli/v1_73.ogg","/wurli/v1_79.ogg","/wurli/v1_85.ogg","/wurli/v1_92.ogg"];
|
|
6
|
+
|
|
7
|
+
self.addEventListener('install', (event) => {
|
|
8
|
+
event.waitUntil(
|
|
9
|
+
caches
|
|
10
|
+
.open(CACHE)
|
|
11
|
+
.then((cache) => cache.addAll(PRECACHE))
|
|
12
|
+
.then(() => self.skipWaiting()),
|
|
13
|
+
);
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
self.addEventListener('activate', (event) => {
|
|
17
|
+
event.waitUntil(
|
|
18
|
+
caches
|
|
19
|
+
.keys()
|
|
20
|
+
.then((keys) => Promise.all(keys.filter((k) => k.startsWith('haku-') && k !== CACHE).map((k) => caches.delete(k))))
|
|
21
|
+
.then(() => self.clients.claim()),
|
|
22
|
+
);
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
self.addEventListener('fetch', (event) => {
|
|
26
|
+
const { request } = event;
|
|
27
|
+
if (request.method !== 'GET' || new URL(request.url).origin !== self.location.origin) return;
|
|
28
|
+
|
|
29
|
+
// Pages try the network first so a newer Haku shows up, and fall back to the cached app.
|
|
30
|
+
if (request.mode === 'navigate') {
|
|
31
|
+
event.respondWith(fetch(request).catch(() => caches.match('/', { cacheName: CACHE })));
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// Everything else is versioned by this cache, so the cache wins.
|
|
36
|
+
event.respondWith(caches.match(request, { cacheName: CACHE }).then((hit) => hit ?? fetch(request)));
|
|
37
|
+
});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pinkpixel/haku",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "1.0.0",
|
|
4
4
|
"description": "Draw lofi music from the terminal or an AI agent. The Haku CLI and MCP server.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"lofi",
|
|
@@ -56,7 +56,7 @@
|
|
|
56
56
|
"@haku/protocol": "0.1.0"
|
|
57
57
|
},
|
|
58
58
|
"scripts": {
|
|
59
|
-
"build": "tsdown",
|
|
59
|
+
"build": "pnpm --filter @haku/web build && tsdown",
|
|
60
60
|
"typecheck": "tsc -p tsconfig.json"
|
|
61
61
|
}
|
|
62
62
|
}
|