@vtbag/inspection-chamber 1.0.15 → 1.0.16
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 +6 -6
- package/lib/index.d.ts +1 -0
- package/lib/index.js +2 -2
- package/package.json +8 -3
package/README.md
CHANGED
|
@@ -11,20 +11,20 @@ The @vtbag website can be found at https://vtbag.pages.dev/
|
|
|
11
11
|
|
|
12
12
|
## !!! News !!!
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
Smaller fixes and improvements.
|
|
15
15
|
|
|
16
16
|
For latest changes, see the [CHANGELOG](https://github.com/vtbag/inspection-chamber/blob/main/CHANGELOG.md)
|
|
17
17
|
|
|
18
18
|
## What happened so far:
|
|
19
19
|
|
|
20
|
-
>
|
|
21
|
-
|
|
22
|
-
> Names in the Animation Groups panel are now shown in the order in which the transition groups appear as children of the `::view-transition` pseudo-element. This makes it easier to understand how the individual groups overlap during rendering.
|
|
20
|
+
> In addition to CSS animations of pseudo-elements, the Chamber can now also handle animations of pseudo-elements started using the Web Animation API.
|
|
23
21
|
|
|
24
|
-
>
|
|
22
|
+
> Improved error handling
|
|
25
23
|
|
|
26
|
-
>
|
|
24
|
+
> Names in the Animation Groups panel are now shown in the order in which the transition groups appear as children of the `::view-transition` pseudo-element. This makes it easier to understand how the individual groups overlap during the transition.
|
|
27
25
|
|
|
26
|
+
* Observe in real-time how CSS properties are updated by animations
|
|
27
|
+
* Ability to switch single animations on and off
|
|
28
28
|
* Improved error reporting for missing animations or corrupted keyframe definitions.
|
|
29
29
|
* Improved opening the Chamber on mobiles.
|
|
30
30
|
* Explicit close button to the inner panel and fixes some styling issues.
|
package/lib/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/lib/index.js
CHANGED
|
@@ -931,6 +931,6 @@
|
|
|
931
931
|
${U("animation:",v)}
|
|
932
932
|
${U("animates:",C)}
|
|
933
933
|
${u(p)}
|
|
934
|
-
</table>`}}function m(s){let l=new Set;i.keyframesMap?.get(s)?.forEach(d=>Object.keys(d).forEach(g=>l.add(g)));let c=[...l].filter(d=>!n.includes(d)).sort();return c.forEach(d=>e.add(d)),c.join(", ")}function u(s){return i.keyframesMap?.get(s)?.map(l=>U(+(l.computedOffset??0)*100+"% :",Object.keys(l).sort().filter(c=>!n.includes(c)).map(c=>l[c]).join(", "))).join("")}}function Tt(){top.__vtbag.inspectionChamber.animations?.forEach(t=>{t instanceof CSSAnimation&&t.animationName!=="vtbag-twin-noop"&&t.playState==="idle"&&t.pause()}),q(top.document.querySelector("#vtbag-ui-animations h4").dataset.vtbagName),f()}function ce(t,e,n,i,o){let a=Yt(t,e,n,i);return a?(o?(a.pause(),y()==="full-control"&&f()):a.cancel(),!0):!1}function Yt(t,e,n,i){let o=`::view-transition-${e}(${t})`,a=top.__vtbag.inspectionChamber,r=a.animations;if(i){let c=r.filter(d=>d.id===i&&d.effect?.pseudoElement===o);if(c.length===1)return c[0];console.error(`[injection chamber] found ${c.length} animations for ${o} when looking for animation with id ${i} `);return}let u=a.styleMap.get(`${e}-${t}`).animationName.split(", ")[n],s=r.filter(c=>c.effect?.pseudoElement===o);if(n>=s.length){console.error(`[injection chamber] found ${s.length} animations for ${o} when looking for animation with index ${n} called ${t}`);return}let l=s[n];if(l instanceof CSSAnimation&&l.animationName!==u){console.error(`[injection chamber] found an animation called ${l.animationName} for ${o} when looking for animation at index ${n} with expected name ${t}`);return}return l}function J(){let t=top.document.querySelector("h4[data-vtbag-name]")?.dataset.vtbagName,n=top.__vtbag.inspectionChamber.styleMap;top.document.querySelectorAll("[data-vtbag-live-values]").forEach(i=>{let[o,...a]=i.dataset.vtbagLiveValues.split(","),r=n.get(`${o}-${t}`),m=a.map(u=>U(u+":",r.getPropertyValue(u)));i.innerHTML=`<summary> \u{1F300}  ${o}: live values</summary><table>`+m.join("")+"</table>"})}function jt(){let t=top.document.querySelector("h4[data-vtbag-name]")?.dataset.vtbagName,n=top.__vtbag.inspectionChamber.styleMap;top.document.querySelectorAll("[data-vtbag-snapshot]").forEach(i=>{if(i.open){let o=i.dataset.vtbagSnapshot,a=i.previousElementSibling?.dataset.vtbagLiveValues?.split(",").slice(1)??[""],r=n.get(`${o}-${t}`),m=bt(r).filter(u=>!a.includes(u)).sort().map(u=>U(u+":",r.getPropertyValue(u)));i.innerHTML=`<summary> \u{1F4F8} ${o}: CSS snapshot</summary><table>`+m.join("")+"</table>"}})}function Ht(){let t=top.__vtbag.inspectionChamber.animationEndTime;top.document.querySelector("#vtbag-ui-controller-max").innerText=t+" ms",top.document.querySelector("#vtbag-ui-progress").innerText="0";let e=top.document.querySelector("#vtbag-ui-controller");e.max=""+t,e.value="0",e.disabled=!1,top.document.querySelector("#vtbag-ui-progress2").innerText="0";let n=top.document.querySelector("#vtbag-ui-controller2");n.max=""+t,n.value="0",n.disabled=!1,f(),B()}function f(){let t=top.__vtbag.inspectionChamber,e=t.animations;if(t.updateNameVisibilityTimeout&&(top.clearTimeout(t.updateNameVisibilityTimeout),t.updateNameVisibilityTimeout=void 0),t.updateNameVisibilityTimeout=top.setTimeout(B,Nt),e){let n=parseInt(top.document.querySelector("#vtbag-ui-progress").innerText,10),i=parseInt(top.document.querySelector("#vtbag-ui-progress2").innerText,10),o=new Set;top.document.querySelectorAll("#vtbag-ui-names li.selected").forEach(a=>o.add(a.innerText)),e.forEach(a=>{if(a.playState==="paused"){let{viewTransitionName:r}=F(a);a.currentTime=r&&o.has(r)?n:i}})}J()}function F(t){let e=t.effect?.pseudoElement?.replace(/::view-transition-(new|old|group|image-pair)\((.*)\)/,"$1 $2").split(" ");return{pseudoName:e?.[0],viewTransitionName:e?.[1]}}function Ut(){let t=top.document.querySelector("#vtbag-ui-controller"),e=top.document.querySelector("#vtbag-ui-progress");t.addEventListener("input",o=>{o.target instanceof HTMLInputElement&&(e.innerText=""+~~o.target.value,f())});let n=top.document.querySelector("#vtbag-ui-controller2"),i=top.document.querySelector("#vtbag-ui-progress2");n.addEventListener("input",o=>{o.target instanceof HTMLInputElement&&(i.innerText=""+~~o.target.value,f())})}function V(){b()&&y()==="full-control"&&f()}var Pt="vtbag-ui-panel-orientation",Ot="vtbag-ui-framed",Vt="named_only",Qt="\u{1F52C}";top.__vtbag??={};top.__vtbag.inspectionChamber??={};var M=top.__vtbag.inspectionChamber;top===self?top.setTimeout(pe,500):self.parent===top&&ue();function ue(){let t=M.frameDocument=self.document;self.addEventListener("pageswap",Rt
|
|
934
|
+
</table>`}}function m(s){let l=new Set;i.keyframesMap?.get(s)?.forEach(d=>Object.keys(d).forEach(g=>l.add(g)));let c=[...l].filter(d=>!n.includes(d)).sort();return c.forEach(d=>e.add(d)),c.join(", ")}function u(s){return i.keyframesMap?.get(s)?.map(l=>U(+(l.computedOffset??0)*100+"% :",Object.keys(l).sort().filter(c=>!n.includes(c)).map(c=>l[c]).join(", "))).join("")}}function Tt(){top.__vtbag.inspectionChamber.animations?.forEach(t=>{t instanceof CSSAnimation&&t.animationName!=="vtbag-twin-noop"&&t.playState==="idle"&&t.pause()}),q(top.document.querySelector("#vtbag-ui-animations h4").dataset.vtbagName),f()}function ce(t,e,n,i,o){let a=Yt(t,e,n,i);return a?(o?(a.pause(),y()==="full-control"&&f()):a.cancel(),!0):!1}function Yt(t,e,n,i){let o=`::view-transition-${e}(${t})`,a=top.__vtbag.inspectionChamber,r=a.animations;if(i){let c=r.filter(d=>d.id===i&&d.effect?.pseudoElement===o);if(c.length===1)return c[0];console.error(`[injection chamber] found ${c.length} animations for ${o} when looking for animation with id ${i} `);return}let u=a.styleMap.get(`${e}-${t}`).animationName.split(", ")[n],s=r.filter(c=>c.effect?.pseudoElement===o);if(n>=s.length){console.error(`[injection chamber] found ${s.length} animations for ${o} when looking for animation with index ${n} called ${t}`);return}let l=s[n];if(l instanceof CSSAnimation&&l.animationName!==u){console.error(`[injection chamber] found an animation called ${l.animationName} for ${o} when looking for animation at index ${n} with expected name ${t}`);return}return l}function J(){let t=top.document.querySelector("h4[data-vtbag-name]")?.dataset.vtbagName,n=top.__vtbag.inspectionChamber.styleMap;top.document.querySelectorAll("[data-vtbag-live-values]").forEach(i=>{let[o,...a]=i.dataset.vtbagLiveValues.split(","),r=n.get(`${o}-${t}`),m=a.map(u=>U(u+":",r.getPropertyValue(u)));i.innerHTML=`<summary> \u{1F300}  ${o}: live values</summary><table>`+m.join("")+"</table>"})}function jt(){let t=top.document.querySelector("h4[data-vtbag-name]")?.dataset.vtbagName,n=top.__vtbag.inspectionChamber.styleMap;top.document.querySelectorAll("[data-vtbag-snapshot]").forEach(i=>{if(i.open){let o=i.dataset.vtbagSnapshot,a=i.previousElementSibling?.dataset.vtbagLiveValues?.split(",").slice(1)??[""],r=n.get(`${o}-${t}`),m=bt(r).filter(u=>!a.includes(u)).sort().map(u=>U(u+":",r.getPropertyValue(u)));i.innerHTML=`<summary> \u{1F4F8} ${o}: CSS snapshot</summary><table>`+m.join("")+"</table>"}})}function Ht(){let t=top.__vtbag.inspectionChamber.animationEndTime;top.document.querySelector("#vtbag-ui-controller-max").innerText=t+" ms",top.document.querySelector("#vtbag-ui-progress").innerText="0";let e=top.document.querySelector("#vtbag-ui-controller");e.max=""+t,e.value="0",e.disabled=!1,top.document.querySelector("#vtbag-ui-progress2").innerText="0";let n=top.document.querySelector("#vtbag-ui-controller2");n.max=""+t,n.value="0",n.disabled=!1,f(),B()}function f(){let t=top.__vtbag.inspectionChamber,e=t.animations;if(t.updateNameVisibilityTimeout&&(top.clearTimeout(t.updateNameVisibilityTimeout),t.updateNameVisibilityTimeout=void 0),t.updateNameVisibilityTimeout=top.setTimeout(B,Nt),e){let n=parseInt(top.document.querySelector("#vtbag-ui-progress").innerText,10),i=parseInt(top.document.querySelector("#vtbag-ui-progress2").innerText,10),o=new Set;top.document.querySelectorAll("#vtbag-ui-names li.selected").forEach(a=>o.add(a.innerText)),e.forEach(a=>{if(a.playState==="paused"){let{viewTransitionName:r}=F(a);a.currentTime=r&&o.has(r)?n:i}})}J()}function F(t){let e=t.effect?.pseudoElement?.replace(/::view-transition-(new|old|group|image-pair)\((.*)\)/,"$1 $2").split(" ");return{pseudoName:e?.[0],viewTransitionName:e?.[1]}}function Ut(){let t=top.document.querySelector("#vtbag-ui-controller"),e=top.document.querySelector("#vtbag-ui-progress");t.addEventListener("input",o=>{o.target instanceof HTMLInputElement&&(e.innerText=""+~~o.target.value,f())});let n=top.document.querySelector("#vtbag-ui-controller2"),i=top.document.querySelector("#vtbag-ui-progress2");n.addEventListener("input",o=>{o.target instanceof HTMLInputElement&&(i.innerText=""+~~o.target.value,f())})}function V(){b()&&y()==="full-control"&&f()}var Pt="vtbag-ui-panel-orientation",Ot="vtbag-ui-framed",Vt="named_only",Qt="\u{1F52C}";top.__vtbag??={};top.__vtbag.inspectionChamber??={};var M=top.__vtbag.inspectionChamber;top===self?top.setTimeout(pe,500):self.parent===top&&ue();function ue(){let t=M.frameDocument=self.document;self.addEventListener("pageswap",Rt),self.addEventListener("pagereveal",de),e();function e(){let n=top.document.startViewTransition;n&&(t.startViewTransition=i=>{"@vtbag";return Rt(),M.viewTransition=n.call(t,async()=>{await Promise.resolve(),i&&await i(),Gt()}),M.viewTransition})}}function Rt(){!1,M.glow?.cancel(),j(!1,!1)}function de(t){M.viewTransition="viewTransition"in t&&t.viewTransition||void 0,Gt()}function Gt(){!1,M.viewTransition&&(zt(),me())}function me(){it();let t=top.document.documentElement,e=M.viewTransition,n={bypass:()=>{},"slow-motion":mt,"full-control":Ht,compare:()=>{}},i=y();e.updateCallbackDone.catch(()=>{}),e.ready.then(async()=>{if(i&&i!=="bypass"){try{await kt(),j(!!top.document.querySelector("#vtbag-ui-framed")?.checked,!!top.document.querySelector("#vtbag-ui-named-only")?.checked),M.twin.ownerDocument.addEventListener("click",ft)}finally{}n[i]()}top.history.replaceState(self.history.state,"",self.location.href),top.document.title=Qt+" "+self.document.title}).finally(()=>{}),e.finished.finally(()=>{ot(),M.viewTransition=void 0,M.frameDocument?.querySelector("#vtbag-twin--view-transition")?.remove(),Zt(),M.animations=void 0,M.longestAnimation=void 0,j(!!top.document.querySelector("#vtbag-ui-framed")?.checked,!!top.document.querySelector("#vtbag-ui-named-only")?.checked),H(Q()),x(),top.document.querySelector("#vtbag-ui-slo-mo-progress").innerText="",top.document.querySelector("#vtbag-ui-animations").innerText="",!y()&&top.document.querySelector("#vtbag-ui-modi li input")?.click(),M.frameDocument.addEventListener("click",qt),rt()})}function Bt(){let t=top.document.documentElement;t.style.setProperty("--vtbag-background-accent",t.style.colorScheme.startsWith("dark")?"#4E545D":"#c6d1d7")}function Ie(){let t=top.document.querySelector("#vtbag-tutorial-mode");t.checked=localStorage.getItem("vtbag-tutorial-mode")!=="false",t.addEventListener("change",()=>{localStorage.setItem("vtbag-tutorial-mode",""+t.checked);let e=top.document.querySelector("#vtbag-ui-inner-panel #vtbag-ui-messages h4"),n=top.document.querySelector("#vtbag-ui-panel #vtbag-ui-messages h4");!t.checked&&e&&e.click(),t.checked&&n&&n.click()})}async function pe(){if(top.document.querySelector("#vtbag-ui-panel"))return;let t=top.document.documentElement;if(top.sessionStorage.getItem(z)==="true"){nt();return}let e=top.getComputedStyle(t).colorScheme,n=top.document.title,i=top.document.querySelector('link[rel="icon"]')?.outerHTML??"",o=K.replace('<iframe id="vtbag-main-frame" src="/"></iframe>',`<iframe id="vtbag-main-frame" style="opacity: 0;" src="${location.href}"></iframe>`).replace("<title></title>",`<title>${Qt} ${n}</title>`).replace('<link rel="icon" />',i);top.addEventListener("resize",Wt),t.innerHTML=o,t.style.colorScheme=e,Wt(),Bt(),Ie(),G();let a=top.document.querySelector("#vtbag-main-frame");if(await new Promise(m=>a.onload=m),!top.document.startViewTransition){top.document.querySelector("#vtbag-ui-messages").innerHTML=`
|
|
935
935
|
<p>I'm sorry!</p><p>Native view transitions are required to make the \u{1F52C} Inspection Chamber work, but they are not supported by this browser.</p>
|
|
936
|
-
<p>Sadly have to give up.</p>`,top.document.querySelectorAll("#vtbag-ui-modi, #vtbag-ui-filter, #vtbag-ui-names, #vtbag-ui-animations, #vtbag-ui-info").forEach(m=>m.remove());return}H(Q()),Ae();let r=top.document.querySelector("#divider");T(r,(m,u)=>{t.classList.contains("vtbag-ui-column")?t.classList.contains("vtbag-ui-tl")?t.style.setProperty("--vtbag-panel-width",`calc(max(216px, ${Math.min(innerWidth-100,m)}px))`):t.style.setProperty("--vtbag-panel-width",`calc(max(216px, 100vw - ${Math.max(100,m+1)}px))`):t.classList.contains("vtbag-ui-tl")?t.style.setProperty("--vtbag-panel-height",`calc(max(245px, ${Math.min(innerHeight-100,u)}px))`):t.style.setProperty("--vtbag-panel-height",`calc(max(245px, 100vh - ${Math.max(100,u+1)}px))`)}),localStorage.getItem("vtbag-tutorial-mode")!=="false"&&top.document.querySelector("#vtbag-ui-messages h4").click(),a.animate([{opacity:0,transform:"translateY(100vh)"},{opacity:1}],{duration:500,fill:"forwards"}),a.contentDocument.addEventListener("click",qt)}function qt(t){if(b())return;let n=t.target.closest("[data-vtbag-transition-name]");if(n){let i=n.dataset.vtbagTransitionName;top.document.querySelectorAll("#vtbag-ui-names li").forEach(o=>{o.innerText===i&&(o.click(),t.ctrlKey&&t.shiftKey&&t.preventDefault())})}}function Wt(){let t=top.document.documentElement,e=top.localStorage.getItem(Pt)??"";e?(e.split(" ").forEach(n=>t.classList.add(n)),Ft()):
|
|
936
|
+
<p>Sadly have to give up.</p>`,top.document.querySelectorAll("#vtbag-ui-modi, #vtbag-ui-filter, #vtbag-ui-names, #vtbag-ui-animations, #vtbag-ui-info").forEach(m=>m.remove());return}H(Q()),Ae();let r=top.document.querySelector("#divider");T(r,(m,u)=>{t.classList.contains("vtbag-ui-column")?t.classList.contains("vtbag-ui-tl")?t.style.setProperty("--vtbag-panel-width",`calc(max(216px, ${Math.min(innerWidth-100,m)}px))`):t.style.setProperty("--vtbag-panel-width",`calc(max(216px, 100vw - ${Math.max(100,m+1)}px))`):t.classList.contains("vtbag-ui-tl")?t.style.setProperty("--vtbag-panel-height",`calc(max(245px, ${Math.min(innerHeight-100,u)}px))`):t.style.setProperty("--vtbag-panel-height",`calc(max(245px, 100vh - ${Math.max(100,u+1)}px))`)}),localStorage.getItem("vtbag-tutorial-mode")!=="false"&&top.document.querySelector("#vtbag-ui-messages h4").click(),a.animate([{opacity:0,transform:"translateY(100vh)"},{opacity:1}],{duration:500,fill:"forwards"}),a.contentDocument.addEventListener("click",qt)}function qt(t){if(b())return;let n=t.target.closest("[data-vtbag-transition-name]");if(n){let i=n.dataset.vtbagTransitionName;top.document.querySelectorAll("#vtbag-ui-names li").forEach(o=>{o.innerText===i&&(o.click(),t.ctrlKey&&t.shiftKey&&t.preventDefault())})}}function Wt(){let t=top.document.documentElement,e=top.localStorage.getItem(Pt)??"";e?(e.split(" ").forEach(n=>t.classList.add(n)),Ft()):Jt()}function Jt(){h(()=>{let t=top.document.documentElement.classList;k(),t.toggle("vtbag-ui-column"),t.contains("vtbag-ui-column")&&t.toggle("vtbag-ui-tl"),top.localStorage.setItem(Pt,[...t].filter(e=>e.startsWith("vtbag-ui-")).join(" ")),Ft()},"switch orientation")}function Ft(){let t=top.document.querySelector("#vtbag-ui-turn"),e=top.document.documentElement.classList;t.innerText="\u292A\u2928\u2929\u2927"[(e.contains("vtbag-ui-column")?2:0)+(e.contains("vtbag-ui-tl")?1:0)]}function Ae(){top.document.querySelector("#vtbag-ui-turn").addEventListener("click",()=>Jt()),top.document.querySelector("#vtbag-ui-light-dark").addEventListener("click",()=>{let o=top.document.documentElement.style;top.document.querySelector("#vtbag-main-frame").contentDocument.documentElement.style.colorScheme=o.colorScheme=o.colorScheme.startsWith("dark")?"light":"dark",Bt()}),at(),top.document.querySelector("#vtbag-ui-standby").addEventListener("click",()=>{top.sessionStorage.setItem(z,"true"),top.location.reload()}),top.document.querySelector("#vtbag-ui-modi ul").addEventListener("change",ve),wt(),Dt();let e=top.document.querySelector("#vtbag-ui-framed"),n=top.document.querySelector("#vtbag-ui-named-only");e.addEventListener("change",i),n.addEventListener("change",i);function i(){let o=e.checked,a=n.checked;top.sessionStorage.setItem(Ot,o?"X":""),top.sessionStorage.setItem(Vt,a?"X":""),j(o,a)}pt(),Ut(),top.document.querySelectorAll("#vtbag-ui-control-exit, #vtbag-ui-control-play").forEach(o=>o.addEventListener("click",k)),top.addEventListener("keyup",function(o){o.key==="Escape"&&(b()?k():(top.sessionStorage.setItem(z,"true"),top.location.reload()))})}function ve(){let t=top.document.querySelector("#vtbag-ui-modi ul input:checked");if(t){let e=t.id.replace("vtbag-m-","");e!==y()&&h(()=>{G(e),k(),top.document.querySelector("#vtbag-ui-filter ul input").click(),e==="slow-motion"&&X("#vtbag-ui-slow-motion"),e==="full-control"&&X("#vtbag-ui-control"),e==="bypass"&&X("#vtbag-ui-modi"),dt(e),gt()},"update-modus")}}function X(t){let e=top.document.querySelector("#vtbag-ui-framed"),n=top.document.querySelector("#vtbag-ui-named-only"),i=e.parentElement,o=top.document.querySelector(t);e.checked=!!top.sessionStorage.getItem(Ot),n.checked=!!top.sessionStorage.getItem(Vt),j(e.checked,n.checked),i&&o&&i.parentElement!==o&&o.insertAdjacentElement("beforeend",i)}})();
|
package/package.json
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vtbag/inspection-chamber",
|
|
3
|
-
"
|
|
3
|
+
"type": "module",
|
|
4
|
+
"version": "1.0.16",
|
|
4
5
|
"main": "lib/index.js",
|
|
5
6
|
"description": "The Inspection Chamber is an in-browser development tool that gives you all the knobs and dials to interactively put your view transitions through their paces.",
|
|
6
7
|
"files": [
|
|
7
|
-
"lib/index.js"
|
|
8
|
+
"lib/index.js",
|
|
9
|
+
"lib/index.d.ts"
|
|
8
10
|
],
|
|
9
11
|
"scripts": {
|
|
10
12
|
"dev": "bin/bundle dev",
|
|
@@ -43,6 +45,9 @@
|
|
|
43
45
|
"@types/dom-view-transitions": "^1.0.5",
|
|
44
46
|
"esbuild": "^0.24.0",
|
|
45
47
|
"prettier": "^3.3.3",
|
|
46
|
-
"typescript": "^5.6.
|
|
48
|
+
"typescript": "^5.6.3"
|
|
49
|
+
},
|
|
50
|
+
"dependencies": {
|
|
51
|
+
"eruda": "^3.4.0"
|
|
47
52
|
}
|
|
48
53
|
}
|