@typicalday/firegraph 0.6.0 → 0.7.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.
@@ -0,0 +1 @@
1
+ *,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:JetBrains Mono,Fira Code,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:#334155;border-radius:3px}::-webkit-scrollbar-thumb:hover{background:#475569}.\!container{width:100%!important}.container{width:100%}@media(min-width:640px){.\!container{max-width:640px!important}.container{max-width:640px}}@media(min-width:768px){.\!container{max-width:768px!important}.container{max-width:768px}}@media(min-width:1024px){.\!container{max-width:1024px!important}.container{max-width:1024px}}@media(min-width:1280px){.\!container{max-width:1280px!important}.container{max-width:1280px}}@media(min-width:1536px){.\!container{max-width:1536px!important}.container{max-width:1536px}}.pointer-events-none{pointer-events:none}.pointer-events-auto{pointer-events:auto}.visible{visibility:visible}.collapse{visibility:collapse}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.bottom-0{bottom:0}.left-0{left:0}.left-1\.5{left:.375rem}.right-0{right:0}.top-0{top:0}.top-full{top:100%}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.z-\[60\]{z-index:60}.mx-0\.5{margin-left:.125rem;margin-right:.125rem}.mx-4{margin-left:1rem;margin-right:1rem}.mx-6{margin-left:1.5rem;margin-right:1.5rem}.mx-auto{margin-left:auto;margin-right:auto}.my-0\.5{margin-top:.125rem;margin-bottom:.125rem}.mb-1{margin-bottom:.25rem}.mb-1\.5{margin-bottom:.375rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-5{margin-bottom:1.25rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.ml-0\.5{margin-left:.125rem}.ml-1{margin-left:.25rem}.ml-1\.5{margin-left:.375rem}.ml-3{margin-left:.75rem}.ml-4{margin-left:1rem}.ml-\[4\.5rem\]{margin-left:4.5rem}.ml-auto{margin-left:auto}.mr-0\.5{margin-right:.125rem}.mr-1{margin-right:.25rem}.mr-2{margin-right:.5rem}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-1\.5{margin-top:.375rem}.mt-12{margin-top:3rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-5{margin-top:1.25rem}.mt-6{margin-top:1.5rem}.mt-8{margin-top:2rem}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.h-1\.5{height:.375rem}.h-2{height:.5rem}.h-2\.5{height:.625rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-\[2px\]{height:2px}.h-full{height:100%}.h-px{height:1px}.h-screen{height:100vh}.max-h-32{max-height:8rem}.max-h-40{max-height:10rem}.max-h-64{max-height:16rem}.max-h-80{max-height:20rem}.max-h-96{max-height:24rem}.w-1\.5{width:.375rem}.w-10{width:2.5rem}.w-14{width:3.5rem}.w-16{width:4rem}.w-2{width:.5rem}.w-2\.5{width:.625rem}.w-20{width:5rem}.w-24{width:6rem}.w-28{width:7rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-32{width:8rem}.w-36{width:9rem}.w-4{width:1rem}.w-44{width:11rem}.w-48{width:12rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-64{width:16rem}.w-7{width:1.75rem}.w-8{width:2rem}.w-\[420px\]{width:420px}.w-full{width:100%}.w-px{width:1px}.min-w-0{min-width:0px}.min-w-\[200px\]{min-width:200px}.min-w-\[480px\]{min-width:480px}.max-w-4xl{max-width:56rem}.max-w-6xl{max-width:72rem}.max-w-\[100px\]{max-width:100px}.max-w-\[120px\]{max-width:120px}.max-w-\[700px\]{max-width:700px}.max-w-\[80\%\]{max-width:80%}.max-w-\[85\%\]{max-width:85%}.max-w-\[90\%\]{max-width:90%}.max-w-lg{max-width:32rem}.max-w-md{max-width:28rem}.max-w-sm{max-width:24rem}.max-w-xs{max-width:20rem}.flex-1{flex:1 1 0%}.shrink-0{flex-shrink:0}.rotate-180{--tw-rotate: 180deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-90{--tw-rotate: 90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.animate-\[slide-in-right_0\.2s_ease-out\]{animation:slide-in-right .2s ease-out}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-help{cursor:help}.cursor-pointer{cursor:pointer}.resize-none{resize:none}.resize-y{resize:vertical}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-\[auto_1fr\]{grid-template-columns:auto 1fr}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-0\.5{gap:.125rem}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-5{gap:1.25rem}.gap-6{gap:1.5rem}.gap-x-3{-moz-column-gap:.75rem;column-gap:.75rem}.gap-y-0\.5{row-gap:.125rem}.space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.125rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem * var(--tw-space-y-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.375rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.space-y-px>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1px * var(--tw-space-y-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}.divide-slate-800\/50>:not([hidden])~:not([hidden]){border-color:#1e293b80}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.rounded{border-radius:.25rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-sm{border-radius:.125rem}.rounded-xl{border-radius:.75rem}.border{border-width:1px}.border-2{border-width:2px}.border-\[1\.5px\]{border-width:1.5px}.border-b{border-bottom-width:1px}.border-l{border-left-width:1px}.border-l-2{border-left-width:2px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-amber-400{--tw-border-opacity: 1;border-color:rgb(251 191 36 / var(--tw-border-opacity, 1))}.border-amber-500\/20{border-color:#f59e0b33}.border-amber-500\/30{border-color:#f59e0b4d}.border-indigo-400{--tw-border-opacity: 1;border-color:rgb(129 140 248 / var(--tw-border-opacity, 1))}.border-indigo-500{--tw-border-opacity: 1;border-color:rgb(99 102 241 / var(--tw-border-opacity, 1))}.border-indigo-500\/20{border-color:#6366f133}.border-indigo-500\/30{border-color:#6366f14d}.border-indigo-500\/40{border-color:#6366f166}.border-indigo-500\/50{border-color:#6366f180}.border-indigo-500\/60{border-color:#6366f199}.border-red-500\/20{border-color:#ef444433}.border-red-500\/30{border-color:#ef44444d}.border-red-500\/50{border-color:#ef444480}.border-slate-400{--tw-border-opacity: 1;border-color:rgb(148 163 184 / var(--tw-border-opacity, 1))}.border-slate-500{--tw-border-opacity: 1;border-color:rgb(100 116 139 / var(--tw-border-opacity, 1))}.border-slate-600{--tw-border-opacity: 1;border-color:rgb(71 85 105 / var(--tw-border-opacity, 1))}.border-slate-700{--tw-border-opacity: 1;border-color:rgb(51 65 85 / var(--tw-border-opacity, 1))}.border-slate-700\/40{border-color:#33415566}.border-slate-700\/50{border-color:#33415580}.border-slate-700\/60{border-color:#33415599}.border-slate-800{--tw-border-opacity: 1;border-color:rgb(30 41 59 / var(--tw-border-opacity, 1))}.border-slate-800\/50{border-color:#1e293b80}.border-white{--tw-border-opacity: 1;border-color:rgb(255 255 255 / var(--tw-border-opacity, 1))}.border-t-transparent{border-top-color:transparent}.bg-amber-400{--tw-bg-opacity: 1;background-color:rgb(251 191 36 / var(--tw-bg-opacity, 1))}.bg-amber-500{--tw-bg-opacity: 1;background-color:rgb(245 158 11 / var(--tw-bg-opacity, 1))}.bg-amber-500\/10{background-color:#f59e0b1a}.bg-amber-500\/15{background-color:#f59e0b26}.bg-amber-500\/20{background-color:#f59e0b33}.bg-amber-950\/30{background-color:#451a034d}.bg-black\/60{background-color:#0009}.bg-black\/70{background-color:#000000b3}.bg-blue-500{--tw-bg-opacity: 1;background-color:rgb(59 130 246 / var(--tw-bg-opacity, 1))}.bg-blue-500\/15{background-color:#3b82f626}.bg-cyan-500{--tw-bg-opacity: 1;background-color:rgb(6 182 212 / var(--tw-bg-opacity, 1))}.bg-cyan-500\/15{background-color:#06b6d426}.bg-emerald-400{--tw-bg-opacity: 1;background-color:rgb(52 211 153 / var(--tw-bg-opacity, 1))}.bg-emerald-500{--tw-bg-opacity: 1;background-color:rgb(16 185 129 / var(--tw-bg-opacity, 1))}.bg-emerald-500\/15{background-color:#10b98126}.bg-emerald-600{--tw-bg-opacity: 1;background-color:rgb(5 150 105 / var(--tw-bg-opacity, 1))}.bg-indigo-400{--tw-bg-opacity: 1;background-color:rgb(129 140 248 / var(--tw-bg-opacity, 1))}.bg-indigo-500{--tw-bg-opacity: 1;background-color:rgb(99 102 241 / var(--tw-bg-opacity, 1))}.bg-indigo-500\/15{background-color:#6366f126}.bg-indigo-600{--tw-bg-opacity: 1;background-color:rgb(79 70 229 / var(--tw-bg-opacity, 1))}.bg-indigo-600\/20{background-color:#4f46e533}.bg-indigo-600\/30{background-color:#4f46e54d}.bg-indigo-950\/40{background-color:#1e1b4b66}.bg-indigo-950\/50{background-color:#1e1b4b80}.bg-lime-500{--tw-bg-opacity: 1;background-color:rgb(132 204 22 / var(--tw-bg-opacity, 1))}.bg-lime-500\/15{background-color:#84cc1626}.bg-orange-500{--tw-bg-opacity: 1;background-color:rgb(249 115 22 / var(--tw-bg-opacity, 1))}.bg-orange-500\/15{background-color:#f9731626}.bg-pink-500{--tw-bg-opacity: 1;background-color:rgb(236 72 153 / var(--tw-bg-opacity, 1))}.bg-pink-500\/15{background-color:#ec489926}.bg-red-500\/10{background-color:#ef44441a}.bg-red-600{--tw-bg-opacity: 1;background-color:rgb(220 38 38 / var(--tw-bg-opacity, 1))}.bg-red-600\/20{background-color:#dc262633}.bg-rose-500{--tw-bg-opacity: 1;background-color:rgb(244 63 94 / var(--tw-bg-opacity, 1))}.bg-rose-500\/15{background-color:#f43f5e26}.bg-slate-500\/15{background-color:#64748b26}.bg-slate-600{--tw-bg-opacity: 1;background-color:rgb(71 85 105 / var(--tw-bg-opacity, 1))}.bg-slate-700{--tw-bg-opacity: 1;background-color:rgb(51 65 85 / var(--tw-bg-opacity, 1))}.bg-slate-700\/50{background-color:#33415580}.bg-slate-800{--tw-bg-opacity: 1;background-color:rgb(30 41 59 / var(--tw-bg-opacity, 1))}.bg-slate-800\/40{background-color:#1e293b66}.bg-slate-800\/50{background-color:#1e293b80}.bg-slate-800\/60{background-color:#1e293b99}.bg-slate-800\/80{background-color:#1e293bcc}.bg-slate-900{--tw-bg-opacity: 1;background-color:rgb(15 23 42 / var(--tw-bg-opacity, 1))}.bg-slate-900\/80{background-color:#0f172acc}.bg-slate-950{--tw-bg-opacity: 1;background-color:rgb(2 6 23 / var(--tw-bg-opacity, 1))}.bg-slate-950\/90{background-color:#020617e6}.bg-teal-500{--tw-bg-opacity: 1;background-color:rgb(20 184 166 / var(--tw-bg-opacity, 1))}.bg-teal-500\/15{background-color:#14b8a626}.bg-violet-500{--tw-bg-opacity: 1;background-color:rgb(139 92 246 / var(--tw-bg-opacity, 1))}.bg-violet-500\/15{background-color:#8b5cf626}.bg-violet-500\/20{background-color:#8b5cf633}.bg-violet-600\/20{background-color:#7c3aed33}.p-0\.5{padding:.125rem}.p-1{padding:.25rem}.p-1\.5{padding:.375rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-20{padding-top:5rem;padding-bottom:5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.py-px{padding-top:1px;padding-bottom:1px}.pb-1{padding-bottom:.25rem}.pb-2{padding-bottom:.5rem}.pb-3{padding-bottom:.75rem}.pb-5{padding-bottom:1.25rem}.pl-2{padding-left:.5rem}.pl-3{padding-left:.75rem}.pl-4{padding-left:1rem}.pl-6{padding-left:1.5rem}.pr-1\.5{padding-right:.375rem}.pt-1{padding-top:.25rem}.pt-2{padding-top:.5rem}.pt-3{padding-top:.75rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.align-text-bottom{vertical-align:text-bottom}.font-\[\'Inter\'\]{font-family:Inter}.font-mono{font-family:JetBrains Mono,Fira Code,monospace}.font-sans{font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji"}.text-2xl{font-size:1.5rem;line-height:2rem}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[8px\]{font-size:8px}.text-\[9px\]{font-size:9px}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.italic{font-style:italic}.leading-none{line-height:1}.leading-relaxed{line-height:1.625}.tracking-wider{letter-spacing:.05em}.text-amber-300{--tw-text-opacity: 1;color:rgb(252 211 77 / var(--tw-text-opacity, 1))}.text-amber-300\/80{color:#fcd34dcc}.text-amber-400{--tw-text-opacity: 1;color:rgb(251 191 36 / var(--tw-text-opacity, 1))}.text-amber-400\/40{color:#fbbf2466}.text-amber-400\/50{color:#fbbf2480}.text-amber-400\/60{color:#fbbf2499}.text-amber-400\/70{color:#fbbf24b3}.text-amber-400\/80{color:#fbbf24cc}.text-amber-500{--tw-text-opacity: 1;color:rgb(245 158 11 / var(--tw-text-opacity, 1))}.text-amber-500\/60{color:#f59e0b99}.text-amber-500\/70{color:#f59e0bb3}.text-amber-500\/80{color:#f59e0bcc}.text-blue-400{--tw-text-opacity: 1;color:rgb(96 165 250 / var(--tw-text-opacity, 1))}.text-cyan-400{--tw-text-opacity: 1;color:rgb(34 211 238 / var(--tw-text-opacity, 1))}.text-emerald-400{--tw-text-opacity: 1;color:rgb(52 211 153 / var(--tw-text-opacity, 1))}.text-indigo-200{--tw-text-opacity: 1;color:rgb(199 210 254 / var(--tw-text-opacity, 1))}.text-indigo-300{--tw-text-opacity: 1;color:rgb(165 180 252 / var(--tw-text-opacity, 1))}.text-indigo-400{--tw-text-opacity: 1;color:rgb(129 140 248 / var(--tw-text-opacity, 1))}.text-indigo-400\/80{color:#818cf8cc}.text-indigo-500\/60{color:#6366f199}.text-indigo-600{--tw-text-opacity: 1;color:rgb(79 70 229 / var(--tw-text-opacity, 1))}.text-lime-400{--tw-text-opacity: 1;color:rgb(163 230 53 / var(--tw-text-opacity, 1))}.text-orange-400{--tw-text-opacity: 1;color:rgb(251 146 60 / var(--tw-text-opacity, 1))}.text-pink-400{--tw-text-opacity: 1;color:rgb(244 114 182 / var(--tw-text-opacity, 1))}.text-red-400{--tw-text-opacity: 1;color:rgb(248 113 113 / var(--tw-text-opacity, 1))}.text-red-400\/60{color:#f8717199}.text-rose-400{--tw-text-opacity: 1;color:rgb(251 113 133 / var(--tw-text-opacity, 1))}.text-slate-100{--tw-text-opacity: 1;color:rgb(241 245 249 / var(--tw-text-opacity, 1))}.text-slate-200{--tw-text-opacity: 1;color:rgb(226 232 240 / var(--tw-text-opacity, 1))}.text-slate-300{--tw-text-opacity: 1;color:rgb(203 213 225 / var(--tw-text-opacity, 1))}.text-slate-400{--tw-text-opacity: 1;color:rgb(148 163 184 / var(--tw-text-opacity, 1))}.text-slate-500{--tw-text-opacity: 1;color:rgb(100 116 139 / var(--tw-text-opacity, 1))}.text-slate-600{--tw-text-opacity: 1;color:rgb(71 85 105 / var(--tw-text-opacity, 1))}.text-slate-700{--tw-text-opacity: 1;color:rgb(51 65 85 / var(--tw-text-opacity, 1))}.text-teal-400{--tw-text-opacity: 1;color:rgb(45 212 191 / var(--tw-text-opacity, 1))}.text-violet-300{--tw-text-opacity: 1;color:rgb(196 181 253 / var(--tw-text-opacity, 1))}.text-violet-400{--tw-text-opacity: 1;color:rgb(167 139 250 / var(--tw-text-opacity, 1))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.underline{text-decoration-line:underline}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.opacity-50{opacity:.5}.shadow-2xl{--tw-shadow: 0 25px 50px -12px rgb(0 0 0 / .25);--tw-shadow-colored: 0 25px 50px -12px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-xl{--tw-shadow: 0 20px 25px -5px rgb(0 0 0 / .1), 0 8px 10px -6px rgb(0 0 0 / .1);--tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-black\/50{--tw-shadow-color: rgb(0 0 0 / .5);--tw-shadow: var(--tw-shadow-colored)}.ring-1{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-indigo-500\/30{--tw-ring-color: rgb(99 102 241 / .3)}.blur{--tw-blur: blur(8px);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur-md{--tw-backdrop-blur: blur(12px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-300{transition-duration:.3s}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.drill-perspective{perspective:1200px;perspective-origin:center center;position:relative;overflow:hidden}.drill-frame{position:absolute;top:0;right:0;bottom:0;left:0;overflow-y:auto;transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .25s cubic-bezier(.4,0,.2,1),filter .25s cubic-bezier(.4,0,.2,1);will-change:transform,opacity,filter;transform-style:preserve-3d;backface-visibility:hidden}.drill-frame--active{transform:translateZ(0);opacity:1;filter:blur(0);z-index:10}.drill-frame--behind{transform:translateZ(-100px) scale(.95);opacity:.2;filter:blur(4px);z-index:5;pointer-events:none}.drill-frame--entering{transform:translateZ(-200px) scale(.9);opacity:0}.drill-frame--hidden{transform:translateZ(-200px) scale(.85);opacity:0;z-index:0;pointer-events:none}@media(max-width:768px){.drill-perspective{perspective:800px}.drill-frame--behind{transform:translateZ(-50px) scale(.97);opacity:.08;filter:blur(3px)}}@media(prefers-reduced-motion:reduce){.drill-frame{transition:opacity .15s ease;transform:none!important}.drill-frame--behind{opacity:.05}}@keyframes slide-in-right{0%{transform:translate(100%)}to{transform:translate(0)}}@keyframes chat-breathe{0%,to{opacity:.35;box-shadow:0 0 8px 1px #34d3994d}50%{opacity:.7;box-shadow:0 0 16px 3px #34d39980}}@keyframes chat-overlay-in{0%{opacity:0}to{opacity:1}}@media(prefers-reduced-motion:reduce){.chat-breathe-line{animation:none!important;opacity:.5}}.placeholder\:text-slate-500::-moz-placeholder{--tw-text-opacity: 1;color:rgb(100 116 139 / var(--tw-text-opacity, 1))}.placeholder\:text-slate-500::placeholder{--tw-text-opacity: 1;color:rgb(100 116 139 / var(--tw-text-opacity, 1))}.placeholder\:text-slate-600::-moz-placeholder{--tw-text-opacity: 1;color:rgb(71 85 105 / var(--tw-text-opacity, 1))}.placeholder\:text-slate-600::placeholder{--tw-text-opacity: 1;color:rgb(71 85 105 / var(--tw-text-opacity, 1))}.hover\:border-amber-400\/40:hover{border-color:#fbbf2466}.hover\:border-amber-500\/30:hover{border-color:#f59e0b4d}.hover\:border-indigo-400\/50:hover{border-color:#818cf880}.hover\:border-indigo-500\/40:hover{border-color:#6366f166}.hover\:border-indigo-500\/50:hover{border-color:#6366f180}.hover\:border-red-500\/50:hover{border-color:#ef444480}.hover\:bg-amber-900\/40:hover{background-color:#78350f66}.hover\:bg-emerald-500:hover{--tw-bg-opacity: 1;background-color:rgb(16 185 129 / var(--tw-bg-opacity, 1))}.hover\:bg-indigo-500:hover{--tw-bg-opacity: 1;background-color:rgb(99 102 241 / var(--tw-bg-opacity, 1))}.hover\:bg-indigo-600\/10:hover{background-color:#4f46e51a}.hover\:bg-indigo-600\/30:hover{background-color:#4f46e54d}.hover\:bg-indigo-600\/40:hover{background-color:#4f46e566}.hover\:bg-indigo-900\/50:hover{background-color:#312e8180}.hover\:bg-red-500:hover{--tw-bg-opacity: 1;background-color:rgb(239 68 68 / var(--tw-bg-opacity, 1))}.hover\:bg-red-600\/30:hover{background-color:#dc26264d}.hover\:bg-slate-700:hover{--tw-bg-opacity: 1;background-color:rgb(51 65 85 / var(--tw-bg-opacity, 1))}.hover\:bg-slate-700\/60:hover{background-color:#33415599}.hover\:bg-slate-700\/80:hover{background-color:#334155cc}.hover\:bg-slate-800:hover{--tw-bg-opacity: 1;background-color:rgb(30 41 59 / var(--tw-bg-opacity, 1))}.hover\:bg-slate-800\/30:hover{background-color:#1e293b4d}.hover\:bg-slate-800\/50:hover{background-color:#1e293b80}.hover\:bg-slate-800\/60:hover{background-color:#1e293b99}.hover\:bg-violet-600\/30:hover{background-color:#7c3aed4d}.hover\:text-amber-300:hover{--tw-text-opacity: 1;color:rgb(252 211 77 / var(--tw-text-opacity, 1))}.hover\:text-amber-400\/70:hover{color:#fbbf24b3}.hover\:text-indigo-200:hover{--tw-text-opacity: 1;color:rgb(199 210 254 / var(--tw-text-opacity, 1))}.hover\:text-indigo-300:hover{--tw-text-opacity: 1;color:rgb(165 180 252 / var(--tw-text-opacity, 1))}.hover\:text-red-400:hover{--tw-text-opacity: 1;color:rgb(248 113 113 / var(--tw-text-opacity, 1))}.hover\:text-slate-200:hover{--tw-text-opacity: 1;color:rgb(226 232 240 / var(--tw-text-opacity, 1))}.hover\:text-slate-300:hover{--tw-text-opacity: 1;color:rgb(203 213 225 / var(--tw-text-opacity, 1))}.hover\:text-slate-400:hover{--tw-text-opacity: 1;color:rgb(148 163 184 / var(--tw-text-opacity, 1))}.hover\:opacity-80:hover{opacity:.8}.focus\:border-emerald-500\/50:focus{border-color:#10b98180}.focus\:border-indigo-500:focus{--tw-border-opacity: 1;border-color:rgb(99 102 241 / var(--tw-border-opacity, 1))}.focus\:border-red-500\/50:focus{border-color:#ef444480}.focus\:border-slate-500:focus{--tw-border-opacity: 1;border-color:rgb(100 116 139 / var(--tw-border-opacity, 1))}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-1:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-emerald-500\/20:focus{--tw-ring-color: rgb(16 185 129 / .2)}.focus\:ring-indigo-500:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(99 102 241 / var(--tw-ring-opacity, 1))}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-30:disabled{opacity:.3}.disabled\:opacity-50:disabled{opacity:.5}.group:hover .group-hover\:text-amber-300{--tw-text-opacity: 1;color:rgb(252 211 77 / var(--tw-text-opacity, 1))}.group:hover .group-hover\:text-indigo-300{--tw-text-opacity: 1;color:rgb(165 180 252 / var(--tw-text-opacity, 1))}.group:hover .group-hover\:text-indigo-400{--tw-text-opacity: 1;color:rgb(129 140 248 / var(--tw-text-opacity, 1))}.group:hover .group-hover\:text-slate-500{--tw-text-opacity: 1;color:rgb(100 116 139 / var(--tw-text-opacity, 1))}@media(min-width:640px){.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}@media(min-width:768px){.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}
@@ -7,8 +7,8 @@
7
7
  <link rel="preconnect" href="https://fonts.googleapis.com" />
8
8
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
9
9
  <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet" />
10
- <script type="module" crossorigin src="/assets/index-B1nKCPMa.js"></script>
11
- <link rel="stylesheet" crossorigin href="/assets/index-CJJR5qe5.css">
10
+ <script type="module" crossorigin src="/assets/index-BIwgcRWJ.js"></script>
11
+ <link rel="stylesheet" crossorigin href="/assets/index-CJ4m_EOL.css">
12
12
  </head>
13
13
  <body class="bg-slate-950 text-slate-100 font-['Inter'] antialiased">
14
14
  <div id="root"></div>
@@ -29316,6 +29316,323 @@ var require_ajv = __commonJS({
29316
29316
  }
29317
29317
  });
29318
29318
 
29319
+ // node_modules/.pnpm/ajv-formats@3.0.1_ajv@8.18.0/node_modules/ajv-formats/dist/formats.js
29320
+ var require_formats2 = __commonJS({
29321
+ "node_modules/.pnpm/ajv-formats@3.0.1_ajv@8.18.0/node_modules/ajv-formats/dist/formats.js"(exports) {
29322
+ "use strict";
29323
+ Object.defineProperty(exports, "__esModule", { value: true });
29324
+ exports.formatNames = exports.fastFormats = exports.fullFormats = void 0;
29325
+ function fmtDef(validate, compare) {
29326
+ return { validate, compare };
29327
+ }
29328
+ exports.fullFormats = {
29329
+ // date: http://tools.ietf.org/html/rfc3339#section-5.6
29330
+ date: fmtDef(date5, compareDate),
29331
+ // date-time: http://tools.ietf.org/html/rfc3339#section-5.6
29332
+ time: fmtDef(getTime(true), compareTime),
29333
+ "date-time": fmtDef(getDateTime(true), compareDateTime),
29334
+ "iso-time": fmtDef(getTime(), compareIsoTime),
29335
+ "iso-date-time": fmtDef(getDateTime(), compareIsoDateTime),
29336
+ // duration: https://tools.ietf.org/html/rfc3339#appendix-A
29337
+ duration: /^P(?!$)((\d+Y)?(\d+M)?(\d+D)?(T(?=\d)(\d+H)?(\d+M)?(\d+S)?)?|(\d+W)?)$/,
29338
+ uri,
29339
+ "uri-reference": /^(?:[a-z][a-z0-9+\-.]*:)?(?:\/?\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:]|%[0-9a-f]{2})*@)?(?:\[(?:(?:(?:(?:[0-9a-f]{1,4}:){6}|::(?:[0-9a-f]{1,4}:){5}|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}|(?:(?:[0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::)(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?))|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|[Vv][0-9a-f]+\.[a-z0-9\-._~!$&'()*+,;=:]+)\]|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)|(?:[a-z0-9\-._~!$&'"()*+,;=]|%[0-9a-f]{2})*)(?::\d*)?(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*|\/(?:(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*)?|(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'"()*+,;=:@]|%[0-9a-f]{2})*)*)?(?:\?(?:[a-z0-9\-._~!$&'"()*+,;=:@/?]|%[0-9a-f]{2})*)?(?:#(?:[a-z0-9\-._~!$&'"()*+,;=:@/?]|%[0-9a-f]{2})*)?$/i,
29340
+ // uri-template: https://tools.ietf.org/html/rfc6570
29341
+ "uri-template": /^(?:(?:[^\x00-\x20"'<>%\\^`{|}]|%[0-9a-f]{2})|\{[+#./;?&=,!@|]?(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?(?:,(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\*)?)*\})*$/i,
29342
+ // For the source: https://gist.github.com/dperini/729294
29343
+ // For test cases: https://mathiasbynens.be/demo/url-regex
29344
+ url: /^(?:https?|ftp):\/\/(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z0-9\u{00a1}-\u{ffff}]+-)*[a-z0-9\u{00a1}-\u{ffff}]+)(?:\.(?:[a-z0-9\u{00a1}-\u{ffff}]+-)*[a-z0-9\u{00a1}-\u{ffff}]+)*(?:\.(?:[a-z\u{00a1}-\u{ffff}]{2,})))(?::\d{2,5})?(?:\/[^\s]*)?$/iu,
29345
+ email: /^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i,
29346
+ hostname: /^(?=.{1,253}\.?$)[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[-0-9a-z]{0,61}[0-9a-z])?)*\.?$/i,
29347
+ // optimized https://www.safaribooksonline.com/library/view/regular-expressions-cookbook/9780596802837/ch07s16.html
29348
+ ipv4: /^(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)\.){3}(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)$/,
29349
+ ipv6: /^((([0-9a-f]{1,4}:){7}([0-9a-f]{1,4}|:))|(([0-9a-f]{1,4}:){6}(:[0-9a-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9a-f]{1,4}:){5}(((:[0-9a-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9a-f]{1,4}:){4}(((:[0-9a-f]{1,4}){1,3})|((:[0-9a-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9a-f]{1,4}:){3}(((:[0-9a-f]{1,4}){1,4})|((:[0-9a-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9a-f]{1,4}:){2}(((:[0-9a-f]{1,4}){1,5})|((:[0-9a-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9a-f]{1,4}:){1}(((:[0-9a-f]{1,4}){1,6})|((:[0-9a-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9a-f]{1,4}){1,7})|((:[0-9a-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))$/i,
29350
+ regex,
29351
+ // uuid: http://tools.ietf.org/html/rfc4122
29352
+ uuid: /^(?:urn:uuid:)?[0-9a-f]{8}-(?:[0-9a-f]{4}-){3}[0-9a-f]{12}$/i,
29353
+ // JSON-pointer: https://tools.ietf.org/html/rfc6901
29354
+ // uri fragment: https://tools.ietf.org/html/rfc3986#appendix-A
29355
+ "json-pointer": /^(?:\/(?:[^~/]|~0|~1)*)*$/,
29356
+ "json-pointer-uri-fragment": /^#(?:\/(?:[a-z0-9_\-.!$&'()*+,;:=@]|%[0-9a-f]{2}|~0|~1)*)*$/i,
29357
+ // relative JSON-pointer: http://tools.ietf.org/html/draft-luff-relative-json-pointer-00
29358
+ "relative-json-pointer": /^(?:0|[1-9][0-9]*)(?:#|(?:\/(?:[^~/]|~0|~1)*)*)$/,
29359
+ // the following formats are used by the openapi specification: https://spec.openapis.org/oas/v3.0.0#data-types
29360
+ // byte: https://github.com/miguelmota/is-base64
29361
+ byte,
29362
+ // signed 32 bit integer
29363
+ int32: { type: "number", validate: validateInt32 },
29364
+ // signed 64 bit integer
29365
+ int64: { type: "number", validate: validateInt64 },
29366
+ // C-type float
29367
+ float: { type: "number", validate: validateNumber },
29368
+ // C-type double
29369
+ double: { type: "number", validate: validateNumber },
29370
+ // hint to the UI to hide input strings
29371
+ password: true,
29372
+ // unchecked string payload
29373
+ binary: true
29374
+ };
29375
+ exports.fastFormats = {
29376
+ ...exports.fullFormats,
29377
+ date: fmtDef(/^\d\d\d\d-[0-1]\d-[0-3]\d$/, compareDate),
29378
+ time: fmtDef(/^(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)$/i, compareTime),
29379
+ "date-time": fmtDef(/^\d\d\d\d-[0-1]\d-[0-3]\dt(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)$/i, compareDateTime),
29380
+ "iso-time": fmtDef(/^(?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)?$/i, compareIsoTime),
29381
+ "iso-date-time": fmtDef(/^\d\d\d\d-[0-1]\d-[0-3]\d[t\s](?:[0-2]\d:[0-5]\d:[0-5]\d|23:59:60)(?:\.\d+)?(?:z|[+-]\d\d(?::?\d\d)?)?$/i, compareIsoDateTime),
29382
+ // uri: https://github.com/mafintosh/is-my-json-valid/blob/master/formats.js
29383
+ uri: /^(?:[a-z][a-z0-9+\-.]*:)(?:\/?\/)?[^\s]*$/i,
29384
+ "uri-reference": /^(?:(?:[a-z][a-z0-9+\-.]*:)?\/?\/)?(?:[^\\\s#][^\s#]*)?(?:#[^\\\s]*)?$/i,
29385
+ // email (sources from jsen validator):
29386
+ // http://stackoverflow.com/questions/201323/using-a-regular-expression-to-validate-an-email-address#answer-8829363
29387
+ // http://www.w3.org/TR/html5/forms.html#valid-e-mail-address (search for 'wilful violation')
29388
+ email: /^[a-z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*$/i
29389
+ };
29390
+ exports.formatNames = Object.keys(exports.fullFormats);
29391
+ function isLeapYear(year) {
29392
+ return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);
29393
+ }
29394
+ var DATE = /^(\d\d\d\d)-(\d\d)-(\d\d)$/;
29395
+ var DAYS = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
29396
+ function date5(str) {
29397
+ const matches = DATE.exec(str);
29398
+ if (!matches)
29399
+ return false;
29400
+ const year = +matches[1];
29401
+ const month = +matches[2];
29402
+ const day = +matches[3];
29403
+ return month >= 1 && month <= 12 && day >= 1 && day <= (month === 2 && isLeapYear(year) ? 29 : DAYS[month]);
29404
+ }
29405
+ function compareDate(d1, d2) {
29406
+ if (!(d1 && d2))
29407
+ return void 0;
29408
+ if (d1 > d2)
29409
+ return 1;
29410
+ if (d1 < d2)
29411
+ return -1;
29412
+ return 0;
29413
+ }
29414
+ var TIME = /^(\d\d):(\d\d):(\d\d(?:\.\d+)?)(z|([+-])(\d\d)(?::?(\d\d))?)?$/i;
29415
+ function getTime(strictTimeZone) {
29416
+ return function time3(str) {
29417
+ const matches = TIME.exec(str);
29418
+ if (!matches)
29419
+ return false;
29420
+ const hr = +matches[1];
29421
+ const min = +matches[2];
29422
+ const sec = +matches[3];
29423
+ const tz = matches[4];
29424
+ const tzSign = matches[5] === "-" ? -1 : 1;
29425
+ const tzH = +(matches[6] || 0);
29426
+ const tzM = +(matches[7] || 0);
29427
+ if (tzH > 23 || tzM > 59 || strictTimeZone && !tz)
29428
+ return false;
29429
+ if (hr <= 23 && min <= 59 && sec < 60)
29430
+ return true;
29431
+ const utcMin = min - tzM * tzSign;
29432
+ const utcHr = hr - tzH * tzSign - (utcMin < 0 ? 1 : 0);
29433
+ return (utcHr === 23 || utcHr === -1) && (utcMin === 59 || utcMin === -1) && sec < 61;
29434
+ };
29435
+ }
29436
+ function compareTime(s1, s2) {
29437
+ if (!(s1 && s2))
29438
+ return void 0;
29439
+ const t1 = (/* @__PURE__ */ new Date("2020-01-01T" + s1)).valueOf();
29440
+ const t2 = (/* @__PURE__ */ new Date("2020-01-01T" + s2)).valueOf();
29441
+ if (!(t1 && t2))
29442
+ return void 0;
29443
+ return t1 - t2;
29444
+ }
29445
+ function compareIsoTime(t1, t2) {
29446
+ if (!(t1 && t2))
29447
+ return void 0;
29448
+ const a1 = TIME.exec(t1);
29449
+ const a2 = TIME.exec(t2);
29450
+ if (!(a1 && a2))
29451
+ return void 0;
29452
+ t1 = a1[1] + a1[2] + a1[3];
29453
+ t2 = a2[1] + a2[2] + a2[3];
29454
+ if (t1 > t2)
29455
+ return 1;
29456
+ if (t1 < t2)
29457
+ return -1;
29458
+ return 0;
29459
+ }
29460
+ var DATE_TIME_SEPARATOR = /t|\s/i;
29461
+ function getDateTime(strictTimeZone) {
29462
+ const time3 = getTime(strictTimeZone);
29463
+ return function date_time(str) {
29464
+ const dateTime = str.split(DATE_TIME_SEPARATOR);
29465
+ return dateTime.length === 2 && date5(dateTime[0]) && time3(dateTime[1]);
29466
+ };
29467
+ }
29468
+ function compareDateTime(dt1, dt2) {
29469
+ if (!(dt1 && dt2))
29470
+ return void 0;
29471
+ const d1 = new Date(dt1).valueOf();
29472
+ const d2 = new Date(dt2).valueOf();
29473
+ if (!(d1 && d2))
29474
+ return void 0;
29475
+ return d1 - d2;
29476
+ }
29477
+ function compareIsoDateTime(dt1, dt2) {
29478
+ if (!(dt1 && dt2))
29479
+ return void 0;
29480
+ const [d1, t1] = dt1.split(DATE_TIME_SEPARATOR);
29481
+ const [d2, t2] = dt2.split(DATE_TIME_SEPARATOR);
29482
+ const res = compareDate(d1, d2);
29483
+ if (res === void 0)
29484
+ return void 0;
29485
+ return res || compareTime(t1, t2);
29486
+ }
29487
+ var NOT_URI_FRAGMENT = /\/|:/;
29488
+ var URI = /^(?:[a-z][a-z0-9+\-.]*:)(?:\/?\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:]|%[0-9a-f]{2})*@)?(?:\[(?:(?:(?:(?:[0-9a-f]{1,4}:){6}|::(?:[0-9a-f]{1,4}:){5}|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}|(?:(?:[0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::)(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?))|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|[Vv][0-9a-f]+\.[a-z0-9\-._~!$&'()*+,;=:]+)\]|(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)|(?:[a-z0-9\-._~!$&'()*+,;=]|%[0-9a-f]{2})*)(?::\d*)?(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*|\/(?:(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*)?|(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})+(?:\/(?:[a-z0-9\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*)(?:\?(?:[a-z0-9\-._~!$&'()*+,;=:@/?]|%[0-9a-f]{2})*)?(?:#(?:[a-z0-9\-._~!$&'()*+,;=:@/?]|%[0-9a-f]{2})*)?$/i;
29489
+ function uri(str) {
29490
+ return NOT_URI_FRAGMENT.test(str) && URI.test(str);
29491
+ }
29492
+ var BYTE = /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/gm;
29493
+ function byte(str) {
29494
+ BYTE.lastIndex = 0;
29495
+ return BYTE.test(str);
29496
+ }
29497
+ var MIN_INT32 = -(2 ** 31);
29498
+ var MAX_INT32 = 2 ** 31 - 1;
29499
+ function validateInt32(value) {
29500
+ return Number.isInteger(value) && value <= MAX_INT32 && value >= MIN_INT32;
29501
+ }
29502
+ function validateInt64(value) {
29503
+ return Number.isInteger(value);
29504
+ }
29505
+ function validateNumber() {
29506
+ return true;
29507
+ }
29508
+ var Z_ANCHOR = /[^\\]\\Z/;
29509
+ function regex(str) {
29510
+ if (Z_ANCHOR.test(str))
29511
+ return false;
29512
+ try {
29513
+ new RegExp(str);
29514
+ return true;
29515
+ } catch (e) {
29516
+ return false;
29517
+ }
29518
+ }
29519
+ }
29520
+ });
29521
+
29522
+ // node_modules/.pnpm/ajv-formats@3.0.1_ajv@8.18.0/node_modules/ajv-formats/dist/limit.js
29523
+ var require_limit = __commonJS({
29524
+ "node_modules/.pnpm/ajv-formats@3.0.1_ajv@8.18.0/node_modules/ajv-formats/dist/limit.js"(exports) {
29525
+ "use strict";
29526
+ Object.defineProperty(exports, "__esModule", { value: true });
29527
+ exports.formatLimitDefinition = void 0;
29528
+ var ajv_1 = require_ajv();
29529
+ var codegen_1 = require_codegen();
29530
+ var ops = codegen_1.operators;
29531
+ var KWDs = {
29532
+ formatMaximum: { okStr: "<=", ok: ops.LTE, fail: ops.GT },
29533
+ formatMinimum: { okStr: ">=", ok: ops.GTE, fail: ops.LT },
29534
+ formatExclusiveMaximum: { okStr: "<", ok: ops.LT, fail: ops.GTE },
29535
+ formatExclusiveMinimum: { okStr: ">", ok: ops.GT, fail: ops.LTE }
29536
+ };
29537
+ var error48 = {
29538
+ message: ({ keyword, schemaCode }) => (0, codegen_1.str)`should be ${KWDs[keyword].okStr} ${schemaCode}`,
29539
+ params: ({ keyword, schemaCode }) => (0, codegen_1._)`{comparison: ${KWDs[keyword].okStr}, limit: ${schemaCode}}`
29540
+ };
29541
+ exports.formatLimitDefinition = {
29542
+ keyword: Object.keys(KWDs),
29543
+ type: "string",
29544
+ schemaType: "string",
29545
+ $data: true,
29546
+ error: error48,
29547
+ code(cxt) {
29548
+ const { gen, data, schemaCode, keyword, it } = cxt;
29549
+ const { opts, self } = it;
29550
+ if (!opts.validateFormats)
29551
+ return;
29552
+ const fCxt = new ajv_1.KeywordCxt(it, self.RULES.all.format.definition, "format");
29553
+ if (fCxt.$data)
29554
+ validate$DataFormat();
29555
+ else
29556
+ validateFormat();
29557
+ function validate$DataFormat() {
29558
+ const fmts = gen.scopeValue("formats", {
29559
+ ref: self.formats,
29560
+ code: opts.code.formats
29561
+ });
29562
+ const fmt = gen.const("fmt", (0, codegen_1._)`${fmts}[${fCxt.schemaCode}]`);
29563
+ cxt.fail$data((0, codegen_1.or)((0, codegen_1._)`typeof ${fmt} != "object"`, (0, codegen_1._)`${fmt} instanceof RegExp`, (0, codegen_1._)`typeof ${fmt}.compare != "function"`, compareCode(fmt)));
29564
+ }
29565
+ function validateFormat() {
29566
+ const format = fCxt.schema;
29567
+ const fmtDef = self.formats[format];
29568
+ if (!fmtDef || fmtDef === true)
29569
+ return;
29570
+ if (typeof fmtDef != "object" || fmtDef instanceof RegExp || typeof fmtDef.compare != "function") {
29571
+ throw new Error(`"${keyword}": format "${format}" does not define "compare" function`);
29572
+ }
29573
+ const fmt = gen.scopeValue("formats", {
29574
+ key: format,
29575
+ ref: fmtDef,
29576
+ code: opts.code.formats ? (0, codegen_1._)`${opts.code.formats}${(0, codegen_1.getProperty)(format)}` : void 0
29577
+ });
29578
+ cxt.fail$data(compareCode(fmt));
29579
+ }
29580
+ function compareCode(fmt) {
29581
+ return (0, codegen_1._)`${fmt}.compare(${data}, ${schemaCode}) ${KWDs[keyword].fail} 0`;
29582
+ }
29583
+ },
29584
+ dependencies: ["format"]
29585
+ };
29586
+ var formatLimitPlugin = (ajv2) => {
29587
+ ajv2.addKeyword(exports.formatLimitDefinition);
29588
+ return ajv2;
29589
+ };
29590
+ exports.default = formatLimitPlugin;
29591
+ }
29592
+ });
29593
+
29594
+ // node_modules/.pnpm/ajv-formats@3.0.1_ajv@8.18.0/node_modules/ajv-formats/dist/index.js
29595
+ var require_dist = __commonJS({
29596
+ "node_modules/.pnpm/ajv-formats@3.0.1_ajv@8.18.0/node_modules/ajv-formats/dist/index.js"(exports, module) {
29597
+ "use strict";
29598
+ Object.defineProperty(exports, "__esModule", { value: true });
29599
+ var formats_1 = require_formats2();
29600
+ var limit_1 = require_limit();
29601
+ var codegen_1 = require_codegen();
29602
+ var fullName = new codegen_1.Name("fullFormats");
29603
+ var fastName = new codegen_1.Name("fastFormats");
29604
+ var formatsPlugin = (ajv2, opts = { keywords: true }) => {
29605
+ if (Array.isArray(opts)) {
29606
+ addFormats2(ajv2, opts, formats_1.fullFormats, fullName);
29607
+ return ajv2;
29608
+ }
29609
+ const [formats, exportName] = opts.mode === "fast" ? [formats_1.fastFormats, fastName] : [formats_1.fullFormats, fullName];
29610
+ const list = opts.formats || formats_1.formatNames;
29611
+ addFormats2(ajv2, list, formats, exportName);
29612
+ if (opts.keywords)
29613
+ (0, limit_1.default)(ajv2);
29614
+ return ajv2;
29615
+ };
29616
+ formatsPlugin.get = (name, mode = "full") => {
29617
+ const formats = mode === "fast" ? formats_1.fastFormats : formats_1.fullFormats;
29618
+ const f = formats[name];
29619
+ if (!f)
29620
+ throw new Error(`Unknown format "${name}"`);
29621
+ return f;
29622
+ };
29623
+ function addFormats2(ajv2, list, fs3, exportName) {
29624
+ var _a2;
29625
+ var _b;
29626
+ (_a2 = (_b = ajv2.opts.code).formats) !== null && _a2 !== void 0 ? _a2 : _b.formats = (0, codegen_1._)`require("ajv-formats/dist/formats").${exportName}`;
29627
+ for (const f of list)
29628
+ ajv2.addFormat(f, fs3[f]);
29629
+ }
29630
+ module.exports = exports = formatsPlugin;
29631
+ Object.defineProperty(exports, "__esModule", { value: true });
29632
+ exports.default = formatsPlugin;
29633
+ }
29634
+ });
29635
+
29319
29636
  // editor/server/index.ts
29320
29637
  var import_express = __toESM(require_express2(), 1);
29321
29638
  var import_cors = __toESM(require_lib3(), 1);
@@ -30005,10 +30322,13 @@ var GraphTransactionImpl = class {
30005
30322
  }
30006
30323
  async updateNode(uid, data) {
30007
30324
  const docId = computeNodeDocId(uid);
30008
- this.adapter.updateDoc(docId, {
30009
- ...data,
30325
+ const update = {
30010
30326
  updatedAt: FieldValue3.serverTimestamp()
30011
- });
30327
+ };
30328
+ for (const [k, v] of Object.entries(data)) {
30329
+ update[`data.${k}`] = v;
30330
+ }
30331
+ this.adapter.updateDoc(docId, update);
30012
30332
  }
30013
30333
  async removeNode(uid) {
30014
30334
  const docId = computeNodeDocId(uid);
@@ -30058,10 +30378,13 @@ var GraphBatchImpl = class {
30058
30378
  }
30059
30379
  async updateNode(uid, data) {
30060
30380
  const docId = computeNodeDocId(uid);
30061
- this.adapter.updateDoc(docId, {
30062
- ...data,
30381
+ const update = {
30063
30382
  updatedAt: FieldValue4.serverTimestamp()
30064
- });
30383
+ };
30384
+ for (const [k, v] of Object.entries(data)) {
30385
+ update[`data.${k}`] = v;
30386
+ }
30387
+ this.adapter.updateDoc(docId, update);
30065
30388
  }
30066
30389
  async removeNode(uid) {
30067
30390
  const docId = computeNodeDocId(uid);
@@ -30223,7 +30546,9 @@ import { createHash as createHash3 } from "node:crypto";
30223
30546
 
30224
30547
  // src/json-schema.ts
30225
30548
  var import_ajv = __toESM(require_ajv(), 1);
30549
+ var import_ajv_formats = __toESM(require_dist(), 1);
30226
30550
  var ajv = new import_ajv.default({ allErrors: true, strict: false });
30551
+ (0, import_ajv_formats.default)(ajv);
30227
30552
  function compileSchema(schema, label) {
30228
30553
  const validate = ajv.compile(schema);
30229
30554
  return (data) => {
@@ -31174,10 +31499,13 @@ var GraphClientImpl = class _GraphClientImpl {
31174
31499
  }
31175
31500
  async updateNode(uid, data) {
31176
31501
  const docId = computeNodeDocId(uid);
31177
- await this.adapter.updateDoc(docId, {
31178
- ...data,
31502
+ const update = {
31179
31503
  updatedAt: FieldValue5.serverTimestamp()
31180
- });
31504
+ };
31505
+ for (const [k, v] of Object.entries(data)) {
31506
+ update[`data.${k}`] = v;
31507
+ }
31508
+ await this.adapter.updateDoc(docId, update);
31181
31509
  }
31182
31510
  async removeNode(uid) {
31183
31511
  const docId = computeNodeDocId(uid);
@@ -49598,15 +49926,30 @@ var appRouter = t.router({
49598
49926
  collectionName: external_exports.string(),
49599
49927
  params: external_exports.record(external_exports.string(), external_exports.string()).optional(),
49600
49928
  cursor: external_exports.string().optional(),
49601
- limit: external_exports.number().int().min(1).max(100).default(50)
49929
+ limit: external_exports.number().int().min(1).max(100).default(50),
49930
+ where: external_exports.array(external_exports.object({
49931
+ field: external_exports.string(),
49932
+ op: external_exports.string(),
49933
+ value: external_exports.union([external_exports.string(), external_exports.number(), external_exports.boolean()])
49934
+ })).optional()
49602
49935
  })).query(async ({ ctx, input }) => {
49603
49936
  const def = getCollectionDef(ctx, input.collectionName);
49604
49937
  const colPath = substitutePathTemplate(def.path, input.params ?? {});
49605
49938
  const col = ctx.db.collection(colPath);
49939
+ const allowedOps = ["==", "!=", "<", "<=", ">", ">="];
49940
+ const schemaFieldNames = def.fields.length > 0 ? new Set(def.fields.map((f) => f.name)) : null;
49941
+ const safeFieldNameRe = /^[a-zA-Z_][a-zA-Z0-9_.]*$/;
49606
49942
  let query = col;
49607
49943
  if (def.typeField && def.typeValue !== void 0) {
49608
49944
  query = query.where(def.typeField, "==", def.typeValue);
49609
49945
  }
49946
+ if (input.where?.length) {
49947
+ for (const clause of input.where) {
49948
+ if (!allowedOps.includes(clause.op)) continue;
49949
+ if (schemaFieldNames ? !schemaFieldNames.has(clause.field) : !safeFieldNameRe.test(clause.field)) continue;
49950
+ query = query.where(clause.field, clause.op, clause.value);
49951
+ }
49952
+ }
49610
49953
  if (def.defaultOrderBy) {
49611
49954
  query = query.orderBy(def.defaultOrderBy.field, def.defaultOrderBy.direction);
49612
49955
  } else {
package/dist/index.cjs CHANGED
@@ -793,10 +793,13 @@ var GraphTransactionImpl = class {
793
793
  }
794
794
  async updateNode(uid, data) {
795
795
  const docId = computeNodeDocId(uid);
796
- this.adapter.updateDoc(docId, {
797
- ...data,
796
+ const update = {
798
797
  updatedAt: import_firestore3.FieldValue.serverTimestamp()
799
- });
798
+ };
799
+ for (const [k, v] of Object.entries(data)) {
800
+ update[`data.${k}`] = v;
801
+ }
802
+ this.adapter.updateDoc(docId, update);
800
803
  }
801
804
  async removeNode(uid) {
802
805
  const docId = computeNodeDocId(uid);
@@ -846,10 +849,13 @@ var GraphBatchImpl = class {
846
849
  }
847
850
  async updateNode(uid, data) {
848
851
  const docId = computeNodeDocId(uid);
849
- this.adapter.updateDoc(docId, {
850
- ...data,
852
+ const update = {
851
853
  updatedAt: import_firestore4.FieldValue.serverTimestamp()
852
- });
854
+ };
855
+ for (const [k, v] of Object.entries(data)) {
856
+ update[`data.${k}`] = v;
857
+ }
858
+ this.adapter.updateDoc(docId, update);
853
859
  }
854
860
  async removeNode(uid) {
855
861
  const docId = computeNodeDocId(uid);
@@ -1011,7 +1017,9 @@ var import_node_crypto3 = require("crypto");
1011
1017
 
1012
1018
  // src/json-schema.ts
1013
1019
  var import_ajv = __toESM(require("ajv"), 1);
1020
+ var import_ajv_formats = __toESM(require("ajv-formats"), 1);
1014
1021
  var ajv = new import_ajv.default({ allErrors: true, strict: false });
1022
+ (0, import_ajv_formats.default)(ajv);
1015
1023
  function compileSchema(schema, label) {
1016
1024
  const validate = ajv.compile(schema);
1017
1025
  return (data) => {
@@ -1973,10 +1981,13 @@ var GraphClientImpl = class _GraphClientImpl {
1973
1981
  }
1974
1982
  async updateNode(uid, data) {
1975
1983
  const docId = computeNodeDocId(uid);
1976
- await this.adapter.updateDoc(docId, {
1977
- ...data,
1984
+ const update = {
1978
1985
  updatedAt: import_firestore5.FieldValue.serverTimestamp()
1979
- });
1986
+ };
1987
+ for (const [k, v] of Object.entries(data)) {
1988
+ update[`data.${k}`] = v;
1989
+ }
1990
+ await this.adapter.updateDoc(docId, update);
1980
1991
  }
1981
1992
  async removeNode(uid) {
1982
1993
  const docId = computeNodeDocId(uid);