@oodarun/cli 0.1.1 → 0.1.3
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/dashboard-dist/_redirects +1 -0
- package/dashboard-dist/assets/AdminApp-B0pStzVl.js +6 -0
- package/dashboard-dist/assets/App-C_nY6S8g.js +5 -0
- package/dashboard-dist/assets/InternalDashboard-CGGYXACm.js +1 -0
- package/dashboard-dist/assets/{index-DNhLzZDP.js → index-5I_ipmZc.js} +2 -2
- package/dashboard-dist/assets/index-lADDHY9o.css +1 -0
- package/dashboard-dist/index.html +2 -2
- package/dist/cli.js +59 -44
- package/package.json +1 -1
- package/dashboard-dist/assets/AdminApp-XtgMLudZ.js +0 -6
- package/dashboard-dist/assets/App-BD_pv1Jv.js +0 -5
- package/dashboard-dist/assets/InternalDashboard-BaxkB3eO.js +0 -1
- package/dashboard-dist/assets/index-CKu0aeQ4.css +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
/*! tailwindcss v4.2.1 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-font-weight:initial;--tw-tracking:initial;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000}}}@layer theme{:root,:host{--font-sans:"Geist", ui-sans-serif, system-ui, -apple-system, sans-serif;--font-mono:"Geist Mono", ui-monospace, "SFMono-Regular", monospace;--color-red-100:oklch(93.6% .032 17.717);--color-red-500:oklch(63.7% .237 25.331);--color-red-600:oklch(57.7% .245 27.325);--color-red-700:oklch(50.5% .213 27.518);--color-red-800:oklch(44.4% .177 26.899);--color-orange-100:oklch(95.4% .038 75.164);--color-orange-800:oklch(47% .157 37.304);--color-amber-600:oklch(66.6% .179 58.318);--color-amber-800:oklch(47.3% .137 46.201);--color-yellow-100:oklch(97.3% .071 103.193);--color-yellow-500:oklch(79.5% .184 86.047);--color-yellow-800:oklch(47.6% .114 61.907);--color-green-50:oklch(98.2% .018 155.826);--color-green-100:oklch(96.2% .044 156.743);--color-green-400:oklch(79.2% .209 151.711);--color-green-500:oklch(72.3% .219 149.579);--color-green-600:oklch(62.7% .194 149.214);--color-green-700:oklch(52.7% .154 150.069);--color-green-800:oklch(44.8% .119 151.328);--color-blue-600:oklch(54.6% .245 262.881);--color-gray-50:oklch(98.5% .002 247.839);--color-gray-100:oklch(96.7% .003 264.542);--color-gray-600:oklch(44.6% .03 256.802);--color-white:#fff;--spacing:.25rem;--container-sm:24rem;--container-md:28rem;--container-lg:32rem;--container-4xl:56rem;--container-5xl:64rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--tracking-normal:0em;--tracking-widest:.1em;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--blur-sm:8px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--color-surface:#ebf1e5;--color-ink:#272725;--color-ink-muted:#5a5a56;--color-ink-faint:#8a8a84;--color-border:#cdd4c7}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}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;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.fixed{position:fixed}.start{inset-inline-start:var(--spacing)}.top-0{top:calc(var(--spacing) * 0)}.right-0{right:calc(var(--spacing) * 0)}.left-0{left:calc(var(--spacing) * 0)}.z-10{z-index:10}.col-span-2{grid-column:span 2/span 2}.mx-1{margin-inline:calc(var(--spacing) * 1)}.mx-auto{margin-inline:auto}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:calc(var(--spacing) * 1)}.mt-1\.5{margin-top:calc(var(--spacing) * 1.5)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-6{margin-top:calc(var(--spacing) * 6)}.mb-1{margin-bottom:calc(var(--spacing) * 1)}.mb-1\.5{margin-bottom:calc(var(--spacing) * 1.5)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.mb-8{margin-bottom:calc(var(--spacing) * 8)}.ml-1{margin-left:calc(var(--spacing) * 1)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-auto{margin-left:auto}.block{display:block}.flex{display:flex}.grid{display:grid}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.h-2{height:calc(var(--spacing) * 2)}.h-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-12{height:calc(var(--spacing) * 12)}.h-full{height:100%}.max-h-60{max-height:calc(var(--spacing) * 60)}.max-h-64{max-height:calc(var(--spacing) * 64)}.max-h-72{max-height:calc(var(--spacing) * 72)}.min-h-screen{min-height:100vh}.w-2{width:calc(var(--spacing) * 2)}.w-24{width:calc(var(--spacing) * 24)}.w-40{width:calc(var(--spacing) * 40)}.w-full{width:100%}.max-w-4xl{max-width:var(--container-4xl)}.max-w-5xl{max-width:var(--container-5xl)}.max-w-lg{max-width:var(--container-lg)}.max-w-md{max-width:var(--container-md)}.max-w-sm{max-width:var(--container-sm)}.min-w-0{min-width:calc(var(--spacing) * 0)}.flex-1{flex:1}.flex-\[2\]{flex:2}.flex-shrink-0{flex-shrink:0}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-pulse{animation:var(--animate-pulse)}.cursor-help{cursor:help}.cursor-pointer{cursor:pointer}.resize-none{resize:none}.list-inside{list-style-position:inside}.list-disc{list-style-type:disc}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-1{gap:calc(var(--spacing) * 1)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-6{gap:calc(var(--spacing) * 6)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-8>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 8) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 8) * calc(1 - var(--tw-space-y-reverse)))}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-border>:not(:last-child)){border-color:var(--color-border)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.rounded-full{border-radius:3.40282e38px}.border{border-style:var(--tw-border-style);border-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-border{border-color:var(--color-border)}.border-border\/30{border-color:#cdd4c74d}@supports (color:color-mix(in lab,red,red)){.border-border\/30{border-color:color-mix(in oklab,var(--color-border) 30%,transparent)}}.border-ink{border-color:var(--color-ink)}.border-transparent{border-color:#0000}.bg-border{background-color:var(--color-border)}.bg-border\/50{background-color:#cdd4c780}@supports (color:color-mix(in lab,red,red)){.bg-border\/50{background-color:color-mix(in oklab,var(--color-border) 50%,transparent)}}.bg-gray-100{background-color:var(--color-gray-100)}.bg-green-50{background-color:var(--color-green-50)}.bg-green-100{background-color:var(--color-green-100)}.bg-green-500{background-color:var(--color-green-500)}.bg-ink{background-color:var(--color-ink)}.bg-orange-100{background-color:var(--color-orange-100)}.bg-red-100{background-color:var(--color-red-100)}.bg-surface{background-color:var(--color-surface)}.bg-surface\/95{background-color:#ebf1e5f2}@supports (color:color-mix(in lab,red,red)){.bg-surface\/95{background-color:color-mix(in oklab,var(--color-surface) 95%,transparent)}}.bg-white{background-color:var(--color-white)}.bg-yellow-100{background-color:var(--color-yellow-100)}.bg-yellow-500{background-color:var(--color-yellow-500)}.p-4{padding:calc(var(--spacing) * 4)}.p-6{padding:calc(var(--spacing) * 6)}.p-8{padding:calc(var(--spacing) * 8)}.px-1{padding-inline:calc(var(--spacing) * 1)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-6{padding-inline:calc(var(--spacing) * 6)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-8{padding-block:calc(var(--spacing) * 8)}.py-12{padding-block:calc(var(--spacing) * 12)}.pt-1{padding-top:calc(var(--spacing) * 1)}.pt-20{padding-top:calc(var(--spacing) * 20)}.pb-8{padding-bottom:calc(var(--spacing) * 8)}.text-center{text-align:center}.text-left{text-align:left}.font-mono{font-family:var(--font-mono)}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[11px\]{font-size:11px}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-normal{--tw-tracking:var(--tracking-normal);letter-spacing:var(--tracking-normal)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.break-all{word-break:break-all}.whitespace-pre-wrap{white-space:pre-wrap}.text-amber-600{color:var(--color-amber-600)}.text-blue-600{color:var(--color-blue-600)}.text-gray-600{color:var(--color-gray-600)}.text-green-400{color:var(--color-green-400)}.text-green-600{color:var(--color-green-600)}.text-green-700{color:var(--color-green-700)}.text-green-800{color:var(--color-green-800)}.text-ink{color:var(--color-ink)}.text-ink-faint{color:var(--color-ink-faint)}.text-ink-muted{color:var(--color-ink-muted)}.text-orange-800{color:var(--color-orange-800)}.text-red-500{color:var(--color-red-500)}.text-red-600{color:var(--color-red-600)}.text-red-800{color:var(--color-red-800)}.text-surface{color:var(--color-surface)}.text-surface\/60{color:#ebf1e599}@supports (color:color-mix(in lab,red,red)){.text-surface\/60{color:color-mix(in oklab,var(--color-surface) 60%,transparent)}}.text-yellow-800{color:var(--color-yellow-800)}.normal-case{text-transform:none}.uppercase{text-transform:uppercase}.underline{text-decoration-line:underline}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-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-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.placeholder\:text-ink-faint::placeholder{color:var(--color-ink-faint)}.last\:border-0:last-child{border-style:var(--tw-border-style);border-width:0}@media(hover:hover){.hover\:border-border:hover{border-color:var(--color-border)}.hover\:border-ink:hover{border-color:var(--color-ink)}.hover\:border-ink-faint:hover{border-color:var(--color-ink-faint)}.hover\:bg-border:hover{background-color:var(--color-border)}.hover\:bg-border\/30:hover{background-color:#cdd4c74d}@supports (color:color-mix(in lab,red,red)){.hover\:bg-border\/30:hover{background-color:color-mix(in oklab,var(--color-border) 30%,transparent)}}.hover\:bg-green-100:hover{background-color:var(--color-green-100)}.hover\:bg-ink\/80:hover{background-color:#272725cc}@supports (color:color-mix(in lab,red,red)){.hover\:bg-ink\/80:hover{background-color:color-mix(in oklab,var(--color-ink) 80%,transparent)}}.hover\:text-amber-800:hover{color:var(--color-amber-800)}.hover\:text-ink:hover{color:var(--color-ink)}.hover\:text-ink\/70:hover{color:#272725b3}@supports (color:color-mix(in lab,red,red)){.hover\:text-ink\/70:hover{color:color-mix(in oklab,var(--color-ink) 70%,transparent)}}.hover\:text-red-700:hover{color:var(--color-red-700)}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-90:hover{opacity:.9}}.focus\:border-ink:focus{border-color:var(--color-ink)}.focus\:border-transparent:focus{border-color:#0000}.focus\:ring-1:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-ink:focus{--tw-ring-color:var(--color-ink)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:bg-gray-50:disabled{background-color:var(--color-gray-50)}.disabled\:text-ink-muted:disabled{color:var(--color-ink-muted)}.disabled\:opacity-30:disabled{opacity:.3}.disabled\:opacity-50:disabled{opacity:.5}}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@keyframes pulse{50%{opacity:.5}}
|
|
@@ -8,8 +8,8 @@
|
|
|
8
8
|
<link rel="preconnect" href="https://cdn.jsdelivr.net" crossorigin />
|
|
9
9
|
<link href="https://cdn.jsdelivr.net/npm/geist@1/dist/fonts/geist-sans/style.css" rel="stylesheet" />
|
|
10
10
|
<link href="https://cdn.jsdelivr.net/npm/geist@1/dist/fonts/geist-mono/style.css" rel="stylesheet" />
|
|
11
|
-
<script type="module" crossorigin src="/assets/index-
|
|
12
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
11
|
+
<script type="module" crossorigin src="/assets/index-5I_ipmZc.js"></script>
|
|
12
|
+
<link rel="stylesheet" crossorigin href="/assets/index-lADDHY9o.css">
|
|
13
13
|
</head>
|
|
14
14
|
<body>
|
|
15
15
|
<div id="root"></div>
|
package/dist/cli.js
CHANGED
|
@@ -763,6 +763,54 @@ function getAccessToken() {
|
|
|
763
763
|
if (process.env.OODA_ACCESS_TOKEN) return process.env.OODA_ACCESS_TOKEN;
|
|
764
764
|
return readAuthData().accessToken || null;
|
|
765
765
|
}
|
|
766
|
+
function decodeJwtExp(token) {
|
|
767
|
+
try {
|
|
768
|
+
const payload = JSON.parse(
|
|
769
|
+
Buffer.from(token.split(".")[1], "base64url").toString()
|
|
770
|
+
);
|
|
771
|
+
return typeof payload.exp === "number" ? payload.exp : null;
|
|
772
|
+
} catch {
|
|
773
|
+
return null;
|
|
774
|
+
}
|
|
775
|
+
}
|
|
776
|
+
var _refreshInFlight = null;
|
|
777
|
+
async function ensureFreshAccessToken() {
|
|
778
|
+
if (process.env.OODA_ACCESS_TOKEN) return process.env.OODA_ACCESS_TOKEN;
|
|
779
|
+
const data = readAuthData();
|
|
780
|
+
if (!data.accessToken || !data.refreshToken) return data.accessToken || null;
|
|
781
|
+
const exp = decodeJwtExp(data.accessToken);
|
|
782
|
+
const now = Math.floor(Date.now() / 1e3);
|
|
783
|
+
if (exp && exp - now > 300) return data.accessToken;
|
|
784
|
+
if (_refreshInFlight) return _refreshInFlight;
|
|
785
|
+
_refreshInFlight = refreshAccessToken(data.refreshToken, data.orgId || "").finally(
|
|
786
|
+
() => {
|
|
787
|
+
_refreshInFlight = null;
|
|
788
|
+
}
|
|
789
|
+
);
|
|
790
|
+
return _refreshInFlight;
|
|
791
|
+
}
|
|
792
|
+
async function refreshAccessToken(refreshToken, orgId) {
|
|
793
|
+
try {
|
|
794
|
+
const doFetch = globalThis.__originalFetch ?? globalThis.fetch;
|
|
795
|
+
const res = await doFetch(
|
|
796
|
+
`${ORG_API_BASE}/auth/refresh`,
|
|
797
|
+
{
|
|
798
|
+
method: "POST",
|
|
799
|
+
headers: { "Content-Type": "application/json" },
|
|
800
|
+
body: JSON.stringify({ refreshToken })
|
|
801
|
+
}
|
|
802
|
+
);
|
|
803
|
+
if (!res.ok) return null;
|
|
804
|
+
const body = await res.json();
|
|
805
|
+
const data = readAuthData();
|
|
806
|
+
data.accessToken = body.accessToken;
|
|
807
|
+
data.refreshToken = body.refreshToken;
|
|
808
|
+
writeAuthData(data);
|
|
809
|
+
return body.accessToken;
|
|
810
|
+
} catch {
|
|
811
|
+
return null;
|
|
812
|
+
}
|
|
813
|
+
}
|
|
766
814
|
function saveJwtTokens(accessToken, refreshToken, userId, orgId) {
|
|
767
815
|
const data = readAuthData();
|
|
768
816
|
data.accessToken = accessToken;
|
|
@@ -1081,13 +1129,14 @@ function patchFetchForOrg(orgId) {
|
|
|
1081
1129
|
if (_orgPatchApplied) return;
|
|
1082
1130
|
_orgPatchApplied = true;
|
|
1083
1131
|
const originalFetch = globalThis.fetch;
|
|
1132
|
+
globalThis.__originalFetch = originalFetch;
|
|
1084
1133
|
globalThis.fetch = (async (input, init) => {
|
|
1085
1134
|
const url = typeof input === "string" ? input : input instanceof URL ? input.toString() : input.url;
|
|
1086
1135
|
const method = init?.method ?? (input instanceof Request ? input.method : void 0);
|
|
1087
1136
|
const rewritten = rewriteOrgUrl(url, orgId, method);
|
|
1088
1137
|
if (rewritten) {
|
|
1089
1138
|
const headers = new Headers(init?.headers || {});
|
|
1090
|
-
const jwt = getAccessToken();
|
|
1139
|
+
const jwt = await ensureFreshAccessToken() ?? getAccessToken();
|
|
1091
1140
|
if (jwt) {
|
|
1092
1141
|
headers.set("Authorization", `Bearer ${jwt}`);
|
|
1093
1142
|
}
|
|
@@ -2107,7 +2156,11 @@ function buildStartSkill(opts) {
|
|
|
2107
2156
|
return `Get this project's dev server running. Follow these steps:
|
|
2108
2157
|
|
|
2109
2158
|
1. **Detect the framework** \u2014 read package.json, config files, etc.
|
|
2110
|
-
2. **Install dependencies** if node_modules is missing or stale
|
|
2159
|
+
2. **Install dependencies** if node_modules is missing or stale. Use the fastest method available:
|
|
2160
|
+
- If \`pnpm-lock.yaml\` exists \u2192 \`pnpm install --frozen-lockfile\`
|
|
2161
|
+
- If \`yarn.lock\` exists \u2192 \`yarn install --frozen-lockfile\`
|
|
2162
|
+
- If \`package-lock.json\` exists \u2192 \`npm ci --no-audit --no-fund\`
|
|
2163
|
+
- Otherwise \u2192 \`npm install --no-audit --no-fund\`
|
|
2111
2164
|
3. **Configure host access** \u2014 the dev server is accessed via an external proxy hostname, so host checking must be disabled:
|
|
2112
2165
|
- **Astro**: set \`server.allowedHosts: true\` at the TOP LEVEL of \`astro.config.mjs\` (inside \`defineConfig({ server: { allowedHosts: true } })\`). Do NOT put it under \`vite.server\` \u2014 Astro ignores that for host validation.
|
|
2113
2166
|
- **Vite**: set \`server.allowedHosts: true\` in \`vite.config.ts\`
|
|
@@ -2918,23 +2971,6 @@ async function patchServerConfig(projectName, token, projectRoot, onProgress) {
|
|
|
2918
2971
|
const result = await exec(`node /tmp/patch-server-config.mjs "${projectRoot}" 2>&1`);
|
|
2919
2972
|
console.log("[project-provisioner] Server config patch result:", result.trim());
|
|
2920
2973
|
}
|
|
2921
|
-
function generateInstallScript(projectRoot, project) {
|
|
2922
|
-
return [
|
|
2923
|
-
`#!/bin/bash`,
|
|
2924
|
-
`set -e`,
|
|
2925
|
-
`cd "${projectRoot}"`,
|
|
2926
|
-
``,
|
|
2927
|
-
`# Kill any running dev servers`,
|
|
2928
|
-
`pkill -f 'vite\\|astro\\|next' 2>/dev/null || true`,
|
|
2929
|
-
`sleep 1`,
|
|
2930
|
-
``,
|
|
2931
|
-
`# Clean install`,
|
|
2932
|
-
`rm -rf node_modules`,
|
|
2933
|
-
`${project.packageManager} install 2>&1`,
|
|
2934
|
-
``,
|
|
2935
|
-
`echo "INSTALL_OK"`
|
|
2936
|
-
].join("\n");
|
|
2937
|
-
}
|
|
2938
2974
|
async function provisionFromFolder(localPath, projectName, token, onProgress, branchName, gitInfo, claudeToken, claudeEnv, githubToken) {
|
|
2939
2975
|
const projectRoot = `/home/user/${path5.basename(localPath)}`;
|
|
2940
2976
|
const headers = { Authorization: `Bearer ${token}` };
|
|
@@ -2969,16 +3005,6 @@ async function provisionFromFolder(localPath, projectName, token, onProgress, br
|
|
|
2969
3005
|
}
|
|
2970
3006
|
await deployClaudeConfig(projectName, token, projectRoot, project.framework, onProgress, gitInfo || null, branchName || null);
|
|
2971
3007
|
await writeRemoteFile("/home/user/.ooda/publish.mjs", PUBLISH_SCRIPT2);
|
|
2972
|
-
onProgress({ step: "Installing dependencies...", detail: project.packageManager });
|
|
2973
|
-
const installScript = generateInstallScript(projectRoot, project);
|
|
2974
|
-
await writeRemoteFile("/tmp/project-install.sh", installScript);
|
|
2975
|
-
const installOutput = await exec("bash /tmp/project-install.sh 2>&1");
|
|
2976
|
-
console.log("[project-provisioner] Install output:", installOutput.substring(0, 500));
|
|
2977
|
-
const installOk = installOutput.includes("INSTALL_OK");
|
|
2978
|
-
onProgress({
|
|
2979
|
-
step: installOk ? "Dependencies installed" : "Install may have issues",
|
|
2980
|
-
detail: installOk ? void 0 : installOutput.substring(0, 200)
|
|
2981
|
-
});
|
|
2982
3008
|
await patchServerConfig(projectName, token, projectRoot, onProgress);
|
|
2983
3009
|
await installSourcePlugin(projectName, token, projectRoot, project.framework, onProgress);
|
|
2984
3010
|
try {
|
|
@@ -3225,16 +3251,6 @@ async function provisionFromGitHub(parsed, projectName, token, onProgress, githu
|
|
|
3225
3251
|
);
|
|
3226
3252
|
await writeRemoteFile(`${projectRoot}/CLAUDE.md`, updatedClaudeMd);
|
|
3227
3253
|
await writeRemoteFile(`${homeDir}/.ooda/publish.mjs`, PUBLISH_SCRIPT2);
|
|
3228
|
-
onProgress({ step: "Installing dependencies...", detail: project.packageManager });
|
|
3229
|
-
const installScript = generateInstallScript(projectRoot, project);
|
|
3230
|
-
await writeRemoteFile("/tmp/project-install.sh", installScript);
|
|
3231
|
-
const installOutput = await exec("bash /tmp/project-install.sh 2>&1");
|
|
3232
|
-
console.log("[project-provisioner] Install output:", installOutput.substring(0, 500));
|
|
3233
|
-
const installOk = installOutput.includes("INSTALL_OK");
|
|
3234
|
-
onProgress({
|
|
3235
|
-
step: installOk ? "Dependencies installed" : "Install may have issues",
|
|
3236
|
-
detail: installOk ? void 0 : installOutput.substring(0, 200)
|
|
3237
|
-
});
|
|
3238
3254
|
await patchServerConfig(projectName, token, projectRoot, onProgress);
|
|
3239
3255
|
await installSourcePlugin(projectName, token, projectRoot, project.framework, onProgress);
|
|
3240
3256
|
try {
|
|
@@ -3365,10 +3381,6 @@ async function provisionFromTemplate(projectName, templateId, token, onProgress,
|
|
|
3365
3381
|
} catch (err) {
|
|
3366
3382
|
console.warn("[project-provisioner] MCP tool setup failed:", err instanceof Error ? err.message : String(err));
|
|
3367
3383
|
}
|
|
3368
|
-
onProgress({ step: "Installing dependencies...", detail: "npm install" });
|
|
3369
|
-
const installOutput = await exec(`cd ${projectRoot} && ${template.installCmd}`);
|
|
3370
|
-
const added = installOutput.match(/added \d+ packages/)?.[0];
|
|
3371
|
-
onProgress({ step: "Dependencies installed", detail: added || void 0 });
|
|
3372
3384
|
onProgress({ step: "Starting dev server..." });
|
|
3373
3385
|
await exec("pkill -f vite || true");
|
|
3374
3386
|
await new Promise((r) => setTimeout(r, 2e3));
|
|
@@ -3962,6 +3974,9 @@ data: ${JSON.stringify(data)}
|
|
|
3962
3974
|
if (!token) return c2.json({ error: "Not authenticated" }, 401);
|
|
3963
3975
|
const name = c2.req.param("name");
|
|
3964
3976
|
const result = await destroyProject(name, token);
|
|
3977
|
+
if (!result.ok) {
|
|
3978
|
+
return c2.json(result, result.status === 502 ? 502 : 500);
|
|
3979
|
+
}
|
|
3965
3980
|
return c2.json(result);
|
|
3966
3981
|
});
|
|
3967
3982
|
app.get("/api/browse", (c2) => {
|
|
@@ -5292,7 +5307,7 @@ async function deployFromGitHubFlow(target, apiToken, claudeToken) {
|
|
|
5292
5307
|
}
|
|
5293
5308
|
|
|
5294
5309
|
// src/cli/index.ts
|
|
5295
|
-
var CLI_VERSION = "0.1.
|
|
5310
|
+
var CLI_VERSION = "0.1.3";
|
|
5296
5311
|
function formatMutationError(result) {
|
|
5297
5312
|
const parts = [];
|
|
5298
5313
|
if (result.status !== void 0) parts.push(String(result.status));
|
package/package.json
CHANGED
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import{r,j as e}from"./index-DNhLzZDP.js";import{b as E,d as D,g as H,a as J,c as F,s as Y}from"./api-DbuItvnH.js";function q({onLogin:s}){const[n,o]=r.useState("login"),[i,j]=r.useState(""),[d,k]=r.useState(""),[h,f]=r.useState(""),[g,x]=r.useState(null),[c,a]=r.useState([]),[t,u]=r.useState(!1),p="https://api.ooda.run",y=async v=>{v.preventDefault(),x(null),a([]),u(!0);try{const A=await fetch(`${p}/auth/login`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({email:i,password:d})});if(!A.ok){x("Invalid email or password");return}const w=await A.json();s(w.user,w.orgs,w.accessToken,w.refreshToken)}catch{x("Could not reach the server")}finally{u(!1)}},b=async v=>{v.preventDefault(),x(null),a([]),u(!0);try{const A=await fetch(`${p}/auth/signup`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({email:i,password:d,name:h})}),w=await A.json();if(!A.ok){x(w.error||"Signup failed"),a(w.errors||[]);return}const $=await fetch(`${p}/auth/login`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({email:i,password:d})});if(!$.ok){x("Account created but login failed. Try logging in."),o("login");return}const P=await $.json();s(P.user,P.orgs,P.accessToken,P.refreshToken)}catch{x("Could not reach the server")}finally{u(!1)}};return e.jsx("div",{className:"min-h-screen bg-surface flex items-center justify-center",children:e.jsxs("div",{className:"w-full max-w-sm p-8",children:[e.jsxs("div",{className:"text-center mb-8",children:[e.jsx("img",{src:"/logo.svg",alt:"ooda",className:"h-6 mx-auto mb-2"}),e.jsx("p",{className:"text-sm text-ink-muted",children:n==="login"?"Sign in to your account":"Create an account"})]}),e.jsxs("form",{onSubmit:n==="login"?y:b,className:"space-y-4",children:[n==="signup"&&e.jsxs("div",{children:[e.jsx("label",{htmlFor:"name",className:"block text-sm font-medium text-ink-muted mb-1",children:"Name"}),e.jsx("input",{id:"name",type:"text",value:h,onChange:v=>f(v.target.value),required:!0,autoComplete:"name",className:"w-full px-3 py-2 border border-border text-sm bg-white focus:outline-none focus:ring-2 focus:ring-ink focus:border-transparent"})]}),e.jsxs("div",{children:[e.jsx("label",{htmlFor:"email",className:"block text-sm font-medium text-ink-muted mb-1",children:"Email"}),e.jsx("input",{id:"email",type:"email",value:i,onChange:v=>j(v.target.value),required:!0,autoComplete:"email",autoFocus:!0,className:"w-full px-3 py-2 border border-border text-sm bg-white focus:outline-none focus:ring-2 focus:ring-ink focus:border-transparent"})]}),e.jsxs("div",{children:[e.jsx("label",{htmlFor:"password",className:"block text-sm font-medium text-ink-muted mb-1",children:"Password"}),e.jsx("input",{id:"password",type:"password",value:d,onChange:v=>k(v.target.value),required:!0,autoComplete:n==="login"?"current-password":"new-password",className:"w-full px-3 py-2 border border-border text-sm bg-white focus:outline-none focus:ring-2 focus:ring-ink focus:border-transparent"})]}),g&&e.jsxs("div",{className:"text-sm text-red-600",children:[e.jsx("p",{children:g}),c.length>0&&e.jsx("ul",{className:"mt-1 list-disc list-inside text-xs text-red-500",children:c.map(v=>e.jsx("li",{children:v},v))})]}),e.jsx("button",{type:"submit",disabled:t,className:"w-full px-4 py-2 bg-ink text-surface text-sm font-medium hover:bg-ink/80 transition-colors disabled:opacity-50",children:t?"...":n==="login"?"Sign in":"Create account"})]}),e.jsx("p",{className:"mt-4 text-center text-xs text-ink-faint",children:n==="login"?e.jsxs(e.Fragment,{children:["Need an account?"," ",e.jsx("button",{onClick:()=>{o("signup"),x(null),a([])},className:"text-ink-muted underline hover:text-ink",children:"Sign up"})]}):e.jsxs(e.Fragment,{children:["Already have an account?"," ",e.jsx("button",{onClick:()=>{o("login"),x(null),a([])},className:"text-ink-muted underline hover:text-ink",children:"Sign in"})]})})]})})}function z({orgId:s,role:n="admin"}){const[o,i]=r.useState([]),[j,d]=r.useState(!0),[k,h]=r.useState(null),f=n==="admin",g=async()=>{d(!0);try{const c=f?await E(s,"/users"):await D(s,"/members");if(!c.ok){h("Failed to load members");return}const a=await c.json();i(a.users||[])}catch{h("Could not reach the server")}finally{d(!1)}};r.useEffect(()=>{g()},[s]);const x=async c=>{if(!confirm(`Remove ${c} from this organization?`))return;(await E(s,`/users/${encodeURIComponent(c)}`,{method:"DELETE"})).ok&&i(t=>t.filter(u=>u.email!==c))};return j?e.jsx("p",{className:"text-sm text-ink-muted",children:"Loading members..."}):k?e.jsx("p",{className:"text-sm text-red-600",children:k}):e.jsxs("div",{children:[e.jsxs("h2",{className:"text-lg font-medium text-ink mb-4",children:["Members",e.jsx("span",{className:"text-ink-faint font-normal ml-2",children:o.length})]}),o.length===0?e.jsx("p",{className:"text-sm text-ink-muted",children:"No members yet."}):e.jsx("div",{className:"border border-border divide-y divide-border",children:o.map(c=>e.jsxs("div",{className:"flex items-center justify-between px-4 py-3",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsxs("div",{children:[e.jsx("p",{className:"text-sm font-medium text-ink",children:c.name||c.email}),e.jsx("p",{className:"text-xs text-ink-faint",children:c.email})]}),c.role&&e.jsx("span",{className:`text-xs px-2 py-0.5 ${c.role==="admin"?"bg-ink text-surface":"bg-border text-ink-muted"}`,children:c.role})]}),e.jsxs("div",{className:"flex items-center gap-4",children:[e.jsx("span",{className:"text-xs text-ink-faint",children:new Date(c.joinedAt).toLocaleDateString()}),f&&e.jsx("button",{onClick:()=>x(c.email),className:"text-xs text-red-500 hover:text-red-700 transition-colors",children:"Remove"})]})]},c.email))})]})}function O(s){return s.status==="pending"&&s.expiresAt&&new Date(s.expiresAt).getTime()<Date.now()?"expired":s.status}function V({orgId:s}){const[n,o]=r.useState([]),[i,j]=r.useState(!0),[d,k]=r.useState(null),[h,f]=r.useState(""),[g,x]=r.useState("member"),[c,a]=r.useState(!1),[t,u]=r.useState(null),p=async()=>{j(!0);try{const l=await E(s,"/invites");if(!l.ok){k("Failed to load invites");return}const C=await l.json();o(C.invites||[])}catch{k("Could not reach the server")}finally{j(!1)}};r.useEffect(()=>{p()},[s]);const y=async l=>{l.preventDefault(),u(null);const C=h.split(/[,\n]/).map(m=>m.trim()).filter(Boolean);if(C.length===0){u("Enter at least one email address");return}a(!0);try{const m=await E(s,"/invites",{method:"POST",body:JSON.stringify({emails:C,role:g})});if(!m.ok){const N=await m.json();u(N.error||"Failed to create invites");return}f(""),p()}catch{u("Could not reach the server")}finally{a(!1)}},b=async l=>{if(!confirm(`Revoke invite for ${l}?`))return;(await E(s,`/invites/${encodeURIComponent(l)}`,{method:"DELETE"})).ok&&p()},v=n.filter(l=>O(l)==="pending"),A=n.filter(l=>O(l)==="expired"),w=n.filter(l=>O(l)==="accepted"),$=n.filter(l=>O(l)==="revoked"),P=async l=>{a(!0);try{(await E(s,"/invites",{method:"POST",body:JSON.stringify({emails:[l],role:"member"})})).ok&&p()}catch{}finally{a(!1)}},R=l=>{switch(l){case"pending":return"bg-yellow-100 text-yellow-800";case"accepted":return"bg-green-100 text-green-800";case"revoked":return"bg-red-100 text-red-800";case"expired":return"bg-orange-100 text-orange-800";default:return"bg-border text-ink-muted"}};return e.jsxs("div",{className:"space-y-8",children:[e.jsxs("div",{children:[e.jsx("h2",{className:"text-lg font-medium text-ink mb-4",children:"Invite people"}),e.jsxs("form",{onSubmit:y,className:"space-y-3",children:[e.jsx("div",{children:e.jsx("textarea",{value:h,onChange:l=>f(l.target.value),placeholder:"Email addresses (comma or newline separated)",rows:3,className:"w-full px-3 py-2 border border-border text-sm bg-white focus:outline-none focus:ring-2 focus:ring-ink focus:border-transparent resize-none font-mono"})}),e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsxs("select",{value:g,onChange:l=>x(l.target.value),className:"px-3 py-2 border border-border text-sm bg-white focus:outline-none focus:ring-2 focus:ring-ink",children:[e.jsx("option",{value:"member",children:"Member"}),e.jsx("option",{value:"admin",children:"Admin"})]}),e.jsx("button",{type:"submit",disabled:c,className:"px-4 py-2 bg-ink text-surface text-sm font-medium hover:bg-ink/80 transition-colors disabled:opacity-50",children:c?"Sending...":"Send invites"})]}),t&&e.jsx("p",{className:"text-sm text-red-600",children:t})]})]}),i?e.jsx("p",{className:"text-sm text-ink-muted",children:"Loading invites..."}):d?e.jsx("p",{className:"text-sm text-red-600",children:d}):e.jsxs("div",{children:[e.jsxs("h2",{className:"text-lg font-medium text-ink mb-4",children:["Invites",e.jsx("span",{className:"text-ink-faint font-normal ml-2",children:n.length})]}),n.length===0?e.jsx("p",{className:"text-sm text-ink-muted",children:"No invites yet."}):e.jsx("div",{className:"border border-border divide-y divide-border",children:[...v,...A,...w,...$].map(l=>{const C=O(l);return e.jsxs("div",{className:"flex items-center justify-between px-4 py-3",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsxs("div",{children:[e.jsx("p",{className:"text-sm font-medium text-ink",children:l.email}),e.jsx("p",{className:"text-xs text-ink-faint",children:new Date(l.createdAt).toLocaleDateString()})]}),e.jsx("span",{className:`text-xs px-2 py-0.5 ${R(C)}`,children:C}),e.jsx("span",{className:`text-xs px-2 py-0.5 ${l.role==="admin"?"bg-ink text-surface":"bg-border text-ink-muted"}`,children:l.role})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[C==="expired"&&e.jsx("button",{onClick:()=>P(l.email),disabled:c,className:"text-xs text-ink hover:text-ink/70 transition-colors disabled:opacity-50",children:"Re-send"}),C==="pending"&&e.jsx("button",{onClick:()=>b(l.email),className:"text-xs text-red-500 hover:text-red-700 transition-colors",children:"Revoke"})]})]},l.id)})})]})]})}function G(s){const n=Math.max(0,Math.floor(Date.now()/1e3-s));return n<60?`${n}s ago`:n<3600?`${Math.floor(n/60)}m ago`:n<86400?`${Math.floor(n/3600)}h ago`:`${Math.floor(n/86400)}d ago`}function Q(s){try{return atob(s.logTailBase64)}catch{return""}}function U(s){const n=Q(s).trim();if(!n)return"";const o=n.split(`
|
|
2
|
-
`).filter(i=>i.trim());return o[o.length-1]||""}function _(s){const n=Date.now()-new Date(s).getTime(),o=Math.floor(n/6e4);if(o<1)return"just now";if(o<60)return`${o}m ago`;const i=Math.floor(o/60);return i<24?`${i}h ago`:`${Math.floor(i/24)}d ago`}function W(s){const n=s.toLowerCase();return["running","started","ready"].includes(n)?"bg-green-100 text-green-800":["stopped","suspended"].includes(n)?"bg-red-100 text-red-800":n==="sleeping"?"bg-gray-100 text-gray-600":"bg-yellow-100 text-yellow-800"}function X({orgId:s,role:n="admin"}){const[o,i]=r.useState([]),[j,d]=r.useState(!0),[k,h]=r.useState(null),f=n==="admin",g=f?E:D,x=async()=>{d(!0);try{const t=await g(s,"/projects");if(!t.ok){h("Failed to load projects");return}const u=await t.json();i(u.projects||[])}catch{h("Could not reach the server")}finally{d(!1)}};r.useEffect(()=>{x()},[s]);const c=async t=>{(await g(s,`/projects/${encodeURIComponent(t)}/stop`,{method:"POST"})).ok&&i(p=>p.map(y=>y.name===t?{...y,status:"stopped"}:y))},a=async t=>{if(!confirm(`Delete project "${t}"? This will destroy the running environment.`))return;(await g(s,`/projects/${encodeURIComponent(t)}`,{method:"DELETE"})).ok&&i(p=>p.filter(y=>y.name!==t))};return j?e.jsx("p",{className:"text-sm text-ink-muted",children:"Loading projects..."}):k?e.jsx("p",{className:"text-sm text-red-600",children:k}):e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center justify-between mb-4",children:[e.jsxs("h2",{className:"text-lg font-medium text-ink",children:["Projects",e.jsx("span",{className:"text-ink-faint font-normal ml-2",children:o.length})]}),e.jsx("button",{onClick:x,className:"text-xs text-ink-muted hover:text-ink transition-colors",children:"Refresh"})]}),o.length===0?e.jsxs("div",{className:"border border-border py-12 text-center",children:[e.jsx("p",{className:"text-sm text-ink-muted",children:"No projects created yet"}),e.jsx("p",{className:"text-xs text-ink-faint mt-1",children:"Projects will appear here when members deploy"})]}):e.jsx("div",{className:"border border-border divide-y divide-border",children:o.map(t=>{const u=f||t.isOwn,p=t.status&&["running","started","ready"].includes(t.status.toLowerCase());return e.jsxs("div",{className:"flex items-center justify-between px-4 py-3",children:[e.jsxs("div",{className:"flex items-center gap-4",children:[e.jsxs("div",{children:[e.jsx("p",{className:"text-sm font-medium text-ink",children:t.name}),t.createdByName&&e.jsxs("p",{className:"text-xs text-ink-faint",children:[t.createdByName,t.isOwn&&!f&&e.jsx("span",{className:"text-ink-muted ml-1",children:"(you)"})]})]}),t.status&&e.jsx("span",{className:`text-xs px-2 py-0.5 ${W(t.status)}`,children:t.status}),t.devServerStatus&&e.jsx("span",{className:"text-xs px-2 py-0.5 bg-red-100 text-red-800 cursor-help",title:`Dev server auto-disabled ${G(t.devServerStatus.disabledAt)} after ${t.devServerStatus.fails} rapid crashes.${U(t.devServerStatus)?`
|
|
3
|
-
|
|
4
|
-
Last error: ${U(t.devServerStatus).slice(0,300)}`:""}
|
|
5
|
-
|
|
6
|
-
The owner needs to reconnect with npx @oodarun/cli and run /start-server after fixing the underlying error.`,children:"dev server disabled"})]}),e.jsxs("div",{className:"flex items-center gap-4",children:[t.lastActiveAt?e.jsxs("span",{className:"text-xs text-ink-muted",title:`Last active: ${t.lastActiveAt}`,children:["active ",_(t.lastActiveAt)]}):e.jsxs("span",{className:"text-xs text-ink-faint",title:t.createdAt,children:["created ",_(t.createdAt)]}),u&&p&&e.jsx("button",{onClick:()=>c(t.name),className:"text-xs text-amber-600 hover:text-amber-800 transition-colors",children:"Stop"}),u&&e.jsx("button",{onClick:()=>a(t.name),className:"text-xs text-red-500 hover:text-red-700 transition-colors",children:"Delete"})]})]},t.name)})})]})}function Z(s){const n=Date.now()-new Date(s).getTime(),o=Math.floor(n/6e4);if(o<1)return"just now";if(o<60)return`${o}m ago`;const i=Math.floor(o/60);return i<24?`${i}h ago`:`${Math.floor(i/24)}d ago`}function ee({orgId:s,role:n="admin"}){const[o,i]=r.useState([]),[j,d]=r.useState(!0),[k,h]=r.useState(null),f=n==="admin",g=f?E:D,x=async()=>{d(!0);try{const a=await g(s,"/sites");if(!a.ok){h("Failed to load sites");return}const t=await a.json();i(t.sites||[])}catch{h("Could not reach the server")}finally{d(!1)}};r.useEffect(()=>{x()},[s]);const c=async a=>{if(!confirm(`Unpublish "${a}"? This will remove the site from ooda.run.`))return;(await g(s,`/sites/${encodeURIComponent(a)}`,{method:"DELETE"})).ok&&i(u=>u.filter(p=>p.slug!==a))};return j?e.jsx("p",{className:"text-sm text-ink-muted",children:"Loading sites..."}):k?e.jsx("p",{className:"text-sm text-red-600",children:k}):e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center justify-between mb-4",children:[e.jsxs("h2",{className:"text-lg font-medium text-ink",children:["Published Sites",e.jsx("span",{className:"text-ink-faint font-normal ml-2",children:o.length})]}),e.jsx("button",{onClick:x,className:"text-xs text-ink-muted hover:text-ink transition-colors",children:"Refresh"})]}),o.length===0?e.jsxs("div",{className:"border border-border py-12 text-center",children:[e.jsx("p",{className:"text-sm text-ink-muted",children:"No sites published yet"}),e.jsx("p",{className:"text-xs text-ink-faint mt-1",children:"Published sites will appear here"})]}):e.jsx("div",{className:"border border-border divide-y divide-border",children:o.map(a=>{const t=f||a.isOwn;return e.jsxs("div",{className:"flex items-center justify-between px-4 py-3",children:[e.jsxs("div",{children:[e.jsx("p",{className:"text-sm font-medium text-ink",children:a.slug}),e.jsx("p",{className:"text-xs text-ink-faint",children:a.url}),a.publishedByName&&e.jsxs("p",{className:"text-xs text-ink-faint mt-0.5",children:["by ",a.publishedByName,a.isOwn&&!f&&e.jsx("span",{className:"text-ink-muted ml-1",children:"(you)"})]})]}),e.jsxs("div",{className:"flex items-center gap-4",children:[e.jsx("span",{className:"text-xs text-ink-faint",title:a.publishedAt,children:Z(a.publishedAt)}),e.jsx("a",{href:a.url,target:"_blank",rel:"noopener noreferrer",className:"text-xs text-ink-muted hover:text-ink border border-border px-2 py-1 transition-colors",children:"Open"}),t&&e.jsx("button",{onClick:()=>c(a.slug),className:"text-xs text-red-500 hover:text-red-700 transition-colors",children:"Unpublish"})]})]},a.slug)})})]})}function te({orgId:s}){const[n,o]=r.useState(null),[i,j]=r.useState(!0),[d,k]=r.useState(!1),[h,f]=r.useState(null),[g,x]=r.useState(null),[c,a]=r.useState(""),[t,u]=r.useState(""),[p,y]=r.useState(""),[b,v]=r.useState(60),[A,w]=r.useState([]),$=async()=>{var m,N;j(!0),f(null);try{const S=await E(s,"/settings");if(!S.ok){f("Failed to load settings");return}const L=await S.json();o(L);const T=L.claude;if(T){a(((m=T.env)==null?void 0:m.ANTHROPIC_API_KEY)||""),u(((N=T.env)==null?void 0:N.ANTHROPIC_BASE_URL)||""),y(T.apiKeyHelper||""),v(Math.round((T.apiKeyHelperTtlMs||36e5)/6e4));const I=new Set(["ANTHROPIC_API_KEY","ANTHROPIC_BASE_URL"]),B=Object.entries(T.env||{}).filter(([M])=>!I.has(M)).map(([M,K])=>({key:M,value:K}));w(B)}}catch{f("Could not reach the server")}finally{j(!1)}};r.useEffect(()=>{$()},[s]);const P=async()=>{k(!0),f(null),x(null);const m={};c&&(m.ANTHROPIC_API_KEY=c),t&&(m.ANTHROPIC_BASE_URL=t);for(const S of A)S.key.trim()&&(m[S.key.trim()]=S.value);const N={};Object.keys(m).length>0&&(N.env=m),p.trim()&&(N.apiKeyHelper=p.trim(),N.apiKeyHelperTtlMs=b*6e4);try{const S={claude:Object.keys(N).length>0?N:null};if(!(await E(s,"/settings",{method:"PUT",body:JSON.stringify(S)})).ok){f("Failed to save settings");return}x("Settings saved"),setTimeout(()=>x(null),3e3)}catch{f("Could not reach the server")}finally{k(!1)}},R=()=>{w(m=>[...m,{key:"",value:""}])},l=m=>{w(N=>N.filter((S,L)=>L!==m))},C=(m,N,S)=>{w(L=>L.map((T,I)=>I===m?{...T,[N]:S}:T))};return i?e.jsx("p",{className:"text-sm text-ink-muted",children:"Loading settings..."}):h&&!n?e.jsx("p",{className:"text-sm text-red-600",children:h}):e.jsxs("div",{className:"space-y-8",children:[e.jsxs("section",{children:[e.jsx("h2",{className:"text-lg font-medium text-ink mb-1",children:"Claude Configuration"}),e.jsx("p",{className:"text-xs text-ink-faint mb-4",children:"Configure how Claude Code authenticates on cloud sandboxes in this organization."}),e.jsxs("div",{className:"border border-border divide-y divide-border",children:[e.jsxs("div",{className:"px-4 py-3",children:[e.jsx("label",{className:"block text-sm font-medium text-ink mb-1",children:"Anthropic API Key"}),e.jsx("p",{className:"text-xs text-ink-faint mb-2",children:"Encrypted at rest. Consider using an API key helper for automatic rotation."}),e.jsx("input",{type:"password",value:c,onChange:m=>a(m.target.value),placeholder:"sk-ant-api03-...",className:"w-full text-sm px-3 py-1.5 border border-border bg-surface text-ink placeholder:text-ink-faint focus:outline-none focus:border-ink"})]}),e.jsxs("div",{className:"px-4 py-3",children:[e.jsx("label",{className:"block text-sm font-medium text-ink mb-1",children:"Base URL"}),e.jsx("p",{className:"text-xs text-ink-faint mb-2",children:"Custom Anthropic API endpoint (leave blank for default)."}),e.jsx("input",{type:"text",value:t,onChange:m=>u(m.target.value),placeholder:"https://api.anthropic.com",className:"w-full text-sm px-3 py-1.5 border border-border bg-surface text-ink placeholder:text-ink-faint focus:outline-none focus:border-ink"})]}),e.jsxs("div",{className:"px-4 py-3",children:[e.jsx("label",{className:"block text-sm font-medium text-ink mb-1",children:"API Key Helper"}),e.jsx("p",{className:"text-xs text-ink-faint mb-2",children:"Path to a script that prints a valid API key to stdout. Used for token rotation."}),e.jsx("input",{type:"text",value:p,onChange:m=>y(m.target.value),placeholder:"/usr/local/bin/token-helper.sh",className:"w-full text-sm px-3 py-1.5 border border-border bg-surface text-ink placeholder:text-ink-faint focus:outline-none focus:border-ink"}),p&&e.jsxs("div",{className:"mt-2",children:[e.jsx("label",{className:"block text-xs text-ink-muted mb-1",children:"Refresh interval (minutes)"}),e.jsx("input",{type:"number",value:b,onChange:m=>v(parseInt(m.target.value,10)||60),min:1,className:"w-24 text-sm px-3 py-1.5 border border-border bg-surface text-ink focus:outline-none focus:border-ink"})]})]}),e.jsxs("div",{className:"px-4 py-3",children:[e.jsx("label",{className:"block text-sm font-medium text-ink mb-1",children:"Environment Variables"}),e.jsx("p",{className:"text-xs text-ink-faint mb-2",children:"Additional env vars injected into project sessions."}),A.map((m,N)=>e.jsxs("div",{className:"flex gap-2 mb-2",children:[e.jsx("input",{type:"text",value:m.key,onChange:S=>C(N,"key",S.target.value),placeholder:"KEY",className:"flex-1 text-sm px-3 py-1.5 border border-border bg-surface text-ink placeholder:text-ink-faint focus:outline-none focus:border-ink font-mono"}),e.jsx("input",{type:"text",value:m.value,onChange:S=>C(N,"value",S.target.value),placeholder:"value",className:"flex-[2] text-sm px-3 py-1.5 border border-border bg-surface text-ink placeholder:text-ink-faint focus:outline-none focus:border-ink font-mono"}),e.jsx("button",{onClick:()=>l(N),className:"text-xs text-red-500 hover:text-red-700 px-2",children:"Remove"})]},N)),e.jsx("button",{onClick:R,className:"text-xs text-ink-muted hover:text-ink transition-colors",children:"+ Add variable"})]})]})]}),e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("button",{onClick:P,disabled:d,className:"text-sm font-medium px-4 py-1.5 bg-ink text-surface hover:opacity-90 transition-opacity disabled:opacity-50",children:d?"Saving...":"Save changes"}),g&&e.jsx("span",{className:"text-xs text-green-600",children:g}),h&&e.jsx("span",{className:"text-xs text-red-600",children:h})]})]})}const se=[["projects","Projects"],["sites","Published Sites"],["members","Members"],["invites","Invites"],["settings","Settings"]],ne=[["projects","Projects"],["sites","Published Sites"],["members","Members"]];function re({orgId:s,orgName:n,user:o,role:i,onLogout:j}){const[d,k]=r.useState("projects"),h=i==="admin",f=h?se:ne;return e.jsxs("div",{className:"min-h-screen bg-surface",children:[e.jsxs("header",{className:"border-b border-border px-6 py-4 flex items-center justify-between",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("img",{src:"/logo.svg",alt:"ooda",className:"h-5"}),e.jsx("span",{className:"text-ink-faint",children:"/"}),e.jsx("span",{className:"text-sm font-medium text-ink",children:n})]}),e.jsxs("div",{className:"flex items-center gap-4",children:[e.jsx("span",{className:"text-xs text-ink-faint",children:o.email}),e.jsx("button",{onClick:j,className:"text-xs text-ink-muted hover:text-ink transition-colors",children:"Sign out"})]})]}),e.jsx("div",{className:"border-b border-border px-6",children:e.jsx("nav",{className:"flex gap-6",children:f.map(([g,x])=>e.jsx("button",{onClick:()=>k(g),className:`py-3 text-sm font-medium border-b-2 transition-colors ${d===g?"border-ink text-ink":"border-transparent text-ink-muted hover:text-ink"}`,children:x},g))})}),e.jsxs("main",{className:"max-w-4xl mx-auto px-6 py-8",children:[d==="projects"&&e.jsx(X,{orgId:s,role:i}),d==="sites"&&e.jsx(ee,{orgId:s,role:i}),d==="members"&&e.jsx(z,{orgId:s,role:i}),d==="invites"&&h&&e.jsx(V,{orgId:s}),d==="settings"&&h&&e.jsx(te,{orgId:s})]})]})}function oe(){const[s,n]=r.useState(null),[o,i]=r.useState([]),[j,d]=r.useState(null),[k,h]=r.useState(!0);r.useEffect(()=>{(async()=>{if(!H()){h(!1);return}const t=await J();if(t){n(t.user);const u=localStorage.getItem("ooda-selected-org"),p=localStorage.getItem("ooda-selected-org-name"),y=t.orgs.find(b=>b.orgId===u);if(y)i(t.orgs.map(b=>({...b,orgName:b.orgId===u&&p||b.orgId}))),d({...y,orgName:p||y.orgId});else if(t.orgs.length>0){const b=t.orgs.map(v=>({...v,orgName:v.orgId}));i(b),d(b[0]),localStorage.setItem("ooda-selected-org",b[0].orgId),localStorage.setItem("ooda-selected-org-name",b[0].orgName)}}else F();h(!1)})()},[]);const f=(a,t,u,p)=>{Y(u,p),n(a),i(t);const b=t.find(v=>v.role==="admin")||t[0];b&&(d(b),localStorage.setItem("ooda-selected-org",b.orgId),localStorage.setItem("ooda-selected-org-name",b.orgName))},g=()=>{F(),localStorage.removeItem("ooda-selected-org"),localStorage.removeItem("ooda-selected-org-name"),n(null),i([]),d(null)};if(k)return e.jsx("div",{className:"min-h-screen bg-surface flex items-center justify-center",children:e.jsx("p",{className:"text-sm text-ink-muted",children:"Loading..."})});if(!s||!j)return e.jsx(q,{onLogin:f});const x=o.find(a=>a.orgId===j.orgId),c=(x==null?void 0:x.role)||"member";return e.jsx(re,{orgId:j.orgId,orgName:j.orgName,user:s,role:c,onLogout:g})}export{oe as AdminApp};
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import{r as s,j as e}from"./index-DNhLzZDP.js";function I({onOpen:b}){const[d,a]=s.useState([]),[N,i]=s.useState(!0),[g,l]=s.useState(null),[m,v]=s.useState({}),t=async()=>{i(!0);try{const k=(await(await fetch("/api/projects")).json()).projects||[];a(k);const u={};await Promise.all(k.map(async c=>{try{const j=await fetch(`https://ooda.run/api/publish/${c.name}`);j.ok&&(u[c.name]=await j.json())}catch{}})),v(u)}catch{a([])}finally{i(!1)}};s.useEffect(()=>{t()},[]);const y=async o=>{if(confirm(`Delete project "${o}"? This cannot be undone.`)){l(o);try{await fetch(`/api/projects/${o}`,{method:"DELETE"}),a(h=>h.filter(k=>k.name!==o))}finally{l(null)}}};return N?e.jsx("div",{className:"text-center py-12 text-sm text-ink-faint",children:"Loading projects..."}):d.length===0?e.jsxs("div",{className:"text-center py-12",children:[e.jsx("p",{className:"text-ink-muted text-sm mb-1",children:"No projects yet"}),e.jsx("p",{className:"text-ink-faint text-xs",children:"Create a new project or deploy a local folder to get started."})]}):e.jsxs("div",{children:[e.jsx("h2",{className:"text-xs font-semibold text-ink uppercase tracking-widest mb-4",children:"Projects"}),e.jsx("div",{className:"space-y-2",children:d.map(o=>{const h=o.isOwn!==!1;return e.jsxs("div",{className:"flex items-center justify-between p-4 border border-border hover:border-ink-faint transition-colors",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("div",{className:`w-2 h-2 rounded-full ${o.status==="running"?"bg-green-500":o.status==="stopped"?"bg-border":"bg-yellow-500"}`}),e.jsxs("div",{children:[e.jsx("p",{className:"text-sm font-medium text-ink",children:o.name}),e.jsxs("p",{className:"text-xs text-ink-faint font-mono mt-0.5",children:[o.owner&&e.jsxs("span",{children:[o.owner,o.isOwn&&e.jsx("span",{className:"text-ink-muted ml-1",children:"(you)"}),o.url&&e.jsx("span",{className:"mx-1",children:"·"})]}),o.url&&o.url]})]})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[m[o.name]&&e.jsx("a",{href:m[o.name].latestUrl,target:"_blank",rel:"noopener noreferrer",className:"px-3 py-1.5 text-sm font-medium text-green-700 bg-green-50 hover:bg-green-100 transition-colors",children:"Published"}),h&&o.url&&e.jsx("button",{onClick:()=>b({name:o.name,url:o.url}),className:"px-3 py-1.5 text-sm font-medium text-ink-muted bg-border/50 hover:bg-border transition-colors",children:"Open"}),h&&e.jsx("button",{onClick:()=>y(o.name),disabled:g===o.name,className:"px-3 py-1.5 text-sm text-ink-faint hover:text-ink transition-colors disabled:opacity-50",children:g===o.name?"...":"Delete"})]})]},o.name)})})]})}function G({onCreate:b,deploying:d}){const[a,N]=s.useState([]),[i,g]=s.useState(""),[l,m]=s.useState(null);s.useEffect(()=>{fetch("/api/templates").then(t=>t.json()).then(t=>{var y;N(t.templates||[]),((y=t.templates)==null?void 0:y.length)>0&&m(t.templates[0].id)})},[]);const v=t=>{t.preventDefault(),!(!i.trim()||!l)&&b(i.trim(),l)};return e.jsxs("div",{children:[e.jsx("h2",{className:"text-xs font-semibold text-ink uppercase tracking-widest mb-4",children:"Create new project"}),e.jsxs("form",{onSubmit:v,className:"max-w-lg space-y-6",children:[e.jsxs("div",{children:[e.jsx("label",{htmlFor:"project-name",className:"block text-sm font-medium text-ink-muted mb-1.5",children:"Project name"}),e.jsx("input",{id:"project-name",type:"text",value:i,onChange:t=>g(t.target.value),placeholder:"my-project",className:"w-full px-3 py-2 border border-border text-sm focus:outline-none focus:ring-2 focus:ring-ink focus:border-transparent"})]}),e.jsxs("div",{children:[e.jsx("label",{className:"block text-sm font-medium text-ink-muted mb-3",children:"Template"}),e.jsx("div",{className:"space-y-2",children:a.map(t=>e.jsxs("label",{className:`flex items-start gap-3 p-4 border cursor-pointer transition-colors ${l===t.id?"border-ink bg-surface":"border-border hover:border-border"}`,children:[e.jsx("input",{type:"radio",name:"template",value:t.id,checked:l===t.id,onChange:()=>m(t.id),className:"mt-0.5"}),e.jsxs("div",{children:[e.jsx("p",{className:"text-sm font-medium text-ink",children:t.name}),e.jsx("p",{className:"text-xs text-ink-muted mt-0.5",children:t.description})]})]},t.id))})]}),e.jsx("button",{type:"submit",disabled:!i.trim()||!l||d,className:"px-6 py-2 bg-ink text-surface text-sm font-medium hover:bg-ink/80 disabled:opacity-50 disabled:cursor-not-allowed transition-colors",children:d?"Creating...":"Create project"})]})]})}function H({onDeploy:b,deploying:d}){const[a,N]=s.useState(null),[i,g]=s.useState(null),[l,m]=s.useState(!0),[v,t]=s.useState(!1),[y,o]=s.useState(""),[h,k]=s.useState(""),u=s.useCallback(async c=>{m(!0);try{const j=c?`?path=${encodeURIComponent(c)}`:"",D=await fetch(`/api/browse${j}`);if(!D.ok)throw new Error;const P=await D.json();N(P),g(null),t(!1)}catch{t(!0)}finally{m(!1)}},[]);return s.useEffect(()=>{u()},[u]),v?e.jsxs("div",{children:[e.jsx("h2",{className:"text-xs font-semibold text-ink uppercase tracking-widest mb-4",children:"Deploy a folder"}),e.jsxs("div",{className:"max-w-lg space-y-4",children:[e.jsxs("div",{children:[e.jsx("label",{htmlFor:"project-name-fallback",className:"block text-sm font-medium text-ink-muted mb-1.5",children:"Project name"}),e.jsx("input",{id:"project-name-fallback",type:"text",value:h,onChange:c=>k(c.target.value),placeholder:"Defaults to folder name",className:"w-full px-3 py-2 border border-border text-sm focus:outline-none focus:ring-2 focus:ring-ink focus:border-transparent"})]}),e.jsxs("div",{children:[e.jsx("label",{htmlFor:"folder-path",className:"block text-sm font-medium text-ink-muted mb-1.5",children:"Folder path"}),e.jsx("input",{id:"folder-path",type:"text",value:y,onChange:c=>o(c.target.value),placeholder:"Leave empty to deploy the current directory",className:"w-full px-3 py-2 border border-border text-sm focus:outline-none focus:ring-2 focus:ring-ink focus:border-transparent"}),e.jsx("p",{className:"mt-1.5 text-xs text-ink-faint",children:"Absolute path to a project folder with a package.json."})]}),e.jsx("button",{onClick:()=>b(y.trim()||void 0,h.trim()||void 0),disabled:d,className:"px-6 py-2 bg-ink text-surface text-sm font-medium hover:bg-ink/80 disabled:opacity-50 disabled:cursor-not-allowed transition-colors",children:d?"Deploying...":"Deploy"})]})]}):e.jsxs("div",{children:[e.jsx("h2",{className:"text-xs font-semibold text-ink uppercase tracking-widest mb-4",children:"Deploy a folder"}),e.jsxs("div",{className:"max-w-lg space-y-3",children:[a&&e.jsxs("div",{className:"flex items-center gap-2 text-xs text-ink-muted",children:[a.parent&&e.jsx("button",{onClick:()=>u(a.parent),disabled:l,className:"px-2 py-0.5 font-medium text-ink-muted bg-border/50 border border-border hover:bg-border disabled:opacity-30 transition-colors",children:"←"}),e.jsx("span",{className:"font-mono truncate",children:a.current})]}),e.jsx("div",{className:"border border-border overflow-hidden",children:l&&!a?e.jsx("div",{className:"px-3 py-8 text-center text-sm text-ink-faint",children:"Loading..."}):e.jsxs("div",{className:"max-h-72 overflow-y-auto",children:[(a==null?void 0:a.entries.length)===0&&e.jsx("div",{className:"px-3 py-8 text-center text-sm text-ink-faint",children:"No subfolders"}),a==null?void 0:a.entries.map(c=>{const j=i===c.path;return e.jsxs("button",{type:"button",className:`w-full flex items-center gap-2.5 px-3 py-2 text-left border-b border-border/30 last:border-0 transition-colors ${j?"bg-ink text-surface":"hover:bg-border/30"}`,onClick:()=>g(j?null:c.path),onDoubleClick:()=>u(c.path),children:[e.jsx("span",{className:"text-sm flex-shrink-0",children:c.hasPackageJson?"📦":"📁"}),e.jsx("span",{className:`text-sm truncate ${j?"text-surface font-medium":"text-ink"}`,children:c.name}),c.hasPackageJson&&e.jsx("span",{className:`ml-auto text-[11px] flex-shrink-0 ${j?"text-ink-faint":"text-ink-muted"}`,children:"project"})]},c.path)})]})}),e.jsxs("div",{children:[e.jsx("label",{htmlFor:"project-name",className:"block text-sm font-medium text-ink-muted mb-1.5",children:"Project name"}),e.jsx("input",{id:"project-name",type:"text",value:h,onChange:c=>k(c.target.value),placeholder:"Defaults to folder name",className:"w-full px-3 py-2 border border-border text-sm focus:outline-none focus:ring-2 focus:ring-ink focus:border-transparent"})]}),e.jsxs("div",{className:"flex items-center gap-3 pt-1",children:[e.jsx("button",{onClick:()=>b(i||void 0,h.trim()||void 0),disabled:d||!i,className:"px-6 py-2 bg-ink text-surface text-sm font-medium hover:bg-ink/80 disabled:opacity-50 disabled:cursor-not-allowed transition-colors",children:d?"Deploying...":"Deploy"}),e.jsx("span",{className:"text-xs text-ink-faint",children:i?e.jsx("span",{className:"font-mono text-ink-muted",children:i}):"Click to select, double-click to open"})]})]})]})}function M({onDeploy:b,deploying:d}){const[a,N]=s.useState(""),[i,g]=s.useState(""),[l,m]=s.useState([]),[v,t]=s.useState(null),[y,o]=s.useState(null),[h,k]=s.useState(!0),[u,c]=s.useState("");s.useEffect(()=>{fetch("/api/github-repos").then(n=>n.json()).then(n=>{m(n.repos),t(n.authenticated),o(n.username||null)}).catch(()=>t(!1)).finally(()=>k(!1))},[]);const j=()=>{const n=a.trim();n&&b(n,i.trim()||void 0)},D=n=>{N(n.fullName),g("")},P=u?l.filter(n=>n.fullName.toLowerCase().includes(u.toLowerCase())||n.description&&n.description.toLowerCase().includes(u.toLowerCase())):l;return e.jsxs("div",{children:[e.jsxs("h2",{className:"text-xs font-semibold text-ink uppercase tracking-widest mb-4",children:["Clone from GitHub",y&&e.jsxs("span",{className:"text-ink-faint font-normal normal-case tracking-normal ml-2",children:["signed in as ",y]})]}),e.jsxs("div",{className:"max-w-lg space-y-4",children:[e.jsxs("div",{children:[e.jsx("label",{htmlFor:"github-url",className:"block text-sm font-medium text-ink-muted mb-1.5",children:"GitHub URL"}),e.jsx("input",{id:"github-url",type:"text",value:a,onChange:n=>N(n.target.value),onKeyDown:n=>n.key==="Enter"&&j(),placeholder:"owner/repo or https://github.com/owner/repo",className:"w-full px-3 py-2 border border-border text-sm focus:outline-none focus:ring-2 focus:ring-ink focus:border-transparent font-mono"}),e.jsx("p",{className:"mt-1.5 text-xs text-ink-faint",children:"Paste a URL, or pick from your repos below. Add #branch for a specific branch."})]}),v===!1&&e.jsxs("p",{className:"text-xs text-ink-muted",children:["No GitHub token detected. Run ",e.jsx("span",{className:"font-mono font-medium",children:"gh auth login"})," to see your repos here."]}),v&&e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center justify-between mb-1.5",children:[e.jsx("label",{className:"block text-sm font-medium text-ink-muted",children:"Your repos"}),l.length>5&&e.jsx("input",{type:"text",value:u,onChange:n=>c(n.target.value),placeholder:"Filter...",className:"px-2 py-1 border border-border text-xs focus:outline-none focus:ring-1 focus:ring-ink w-40"})]}),e.jsx("div",{className:"border border-border overflow-hidden",children:h?e.jsx("div",{className:"px-3 py-8 text-center text-sm text-ink-faint",children:"Loading repos..."}):P.length===0?e.jsx("div",{className:"px-3 py-8 text-center text-sm text-ink-faint",children:u?"No matching repos":"No repos found"}):e.jsx("div",{className:"max-h-64 overflow-y-auto",children:P.map(n=>{const $=a===n.fullName;return e.jsxs("button",{type:"button",className:`w-full flex items-center gap-2.5 px-3 py-2 text-left border-b border-border/30 last:border-0 transition-colors ${$?"bg-ink text-surface":"hover:bg-border/30"}`,onClick:()=>D(n),children:[e.jsx("span",{className:"text-sm flex-shrink-0",children:n.isPrivate?"🔒":"📦"}),e.jsxs("div",{className:"min-w-0 flex-1",children:[e.jsx("span",{className:`text-sm truncate block ${$?"text-surface font-medium":"text-ink"}`,children:n.fullName}),n.description&&e.jsx("span",{className:`text-xs truncate block ${$?"text-surface/60":"text-ink-faint"}`,children:n.description})]})]},n.fullName)})})})]}),e.jsxs("div",{children:[e.jsx("label",{htmlFor:"gh-project-name",className:"block text-sm font-medium text-ink-muted mb-1.5",children:"Project name"}),e.jsx("input",{id:"gh-project-name",type:"text",value:i,onChange:n=>g(n.target.value),onKeyDown:n=>n.key==="Enter"&&j(),placeholder:"Defaults to repo name",className:"w-full px-3 py-2 border border-border text-sm focus:outline-none focus:ring-2 focus:ring-ink focus:border-transparent"})]}),e.jsx("button",{onClick:j,disabled:d||!a.trim(),className:"px-6 py-2 bg-ink text-surface text-sm font-medium hover:bg-ink/80 disabled:opacity-50 disabled:cursor-not-allowed transition-colors",children:d?"Deploying...":"Clone & Deploy"})]})]})}function _({onLogin:b,authenticated:d}){const[a,N]=s.useState(""),[i,g]=s.useState(null),l=m=>{if(m.preventDefault(),!a.trim()){g("Please enter your Claude API key or OAuth token");return}g(null),b("",a.trim())};return e.jsx("div",{className:"min-h-screen bg-surface flex items-center justify-center",children:e.jsxs("div",{className:"w-full max-w-md p-8",children:[e.jsxs("div",{className:"text-center mb-8",children:[e.jsx("img",{src:"/logo.svg",alt:"ooda",className:"h-6 mx-auto mb-2"}),e.jsx("p",{className:"text-sm text-ink-muted",children:d?"Connect Claude to edit code on your cloud sandbox":"Sign in to manage cloud sandboxes"})]}),e.jsxs("form",{onSubmit:l,className:"space-y-4",children:[e.jsxs("div",{children:[e.jsx("label",{htmlFor:"claude-token",className:"block text-sm font-medium text-ink-muted mb-1.5",children:"Claude API Key or OAuth Token"}),e.jsx("input",{id:"claude-token",type:"password",value:a,onChange:m=>N(m.target.value),placeholder:"sk-ant-... or oauth token",autoFocus:!0,className:"w-full px-3 py-2 border border-border text-sm focus:outline-none focus:ring-2 focus:ring-ink focus:border-transparent"}),e.jsxs("p",{className:"mt-1.5 text-xs text-ink-faint",children:[e.jsx("strong",{children:"API key"}),": get from"," ",e.jsx("a",{href:"https://console.anthropic.com/settings/keys",target:"_blank",rel:"noopener noreferrer",className:"text-ink-muted underline hover:text-ink",children:"console.anthropic.com"}),e.jsx("br",{}),e.jsx("strong",{children:"OAuth token"}),": run"," ",e.jsx("code",{className:"bg-border/50 px-1 text-xs font-mono",children:"claude setup-token"})," ","in your terminal (for Claude Pro/Teams)"]})]}),i&&e.jsx("p",{className:"text-sm text-red-600",children:i}),e.jsx("button",{type:"submit",className:"w-full px-4 py-2 bg-ink text-surface text-sm font-medium hover:bg-ink/80 transition-colors",children:"Sign in"})]})]})})}function B(){const d=new URLSearchParams(window.location.search).get("view");return d==="new"||d==="deploy"||d==="github"?d:"projects"}function V(){const[b,d]=s.useState(null),[a,N]=s.useState(null),[i,g]=s.useState(B),[l,m]=s.useState(!1),[v,t]=s.useState(null);s.useEffect(()=>{Promise.all([fetch("/api/auth").then(r=>r.json()),fetch("/api/detect").then(r=>r.json())]).then(([r,f])=>{d({authenticated:r.authenticated,claudeAuthenticated:r.claudeAuthenticated}),N(f)})},[]);const y=async(r,f)=>{(await fetch("/api/auth",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({claudeToken:f})})).ok&&d({authenticated:!0,claudeAuthenticated:!0})},o=async r=>{if(r.projectName&&r.projectUrl)try{await fetch("/api/project-opened",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({projectName:r.projectName,projectUrl:r.projectUrl,projectRoot:r.projectRoot||`/home/user/${r.projectName}`})})}catch{}},[h,k]=s.useState(null),[u,c]=s.useState([]),j=async(r,f)=>{m(!0),t(null),k(null),c([]);try{const x=await fetch("/api/deploy",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:r,name:f})});if(!x.ok||!x.body){const C=await x.json();t(C.error||"Deploy failed");return}const w=x.body.getReader(),A=new TextDecoder;let S="";for(;;){const{done:C,value:F}=await w.read();if(C)break;S+=A.decode(F,{stream:!0});const U=S.split(`
|
|
2
|
-
|
|
3
|
-
`);S=U.pop()||"";for(const T of U){const O=T.match(/^event: (.+)$/m),E=T.match(/^data: (.+)$/m);if(!O||!E)continue;const L=O[1],p=JSON.parse(E[1]);if(L==="progress"){const R=p.detail?`${p.step} (${p.detail})`:p.step;c(J=>[...J,R])}else L==="done"&&(p.success&&p.projectUrl?k({projectName:p.projectName,projectUrl:p.projectUrl}):t(p.error||"Deploy failed"))}}}catch(x){t(x instanceof Error?x.message:"Deploy failed")}finally{m(!1)}},D=async(r,f)=>{m(!0),t(null),k(null),c([]);try{const x=await fetch("/api/deploy-github",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({url:r,name:f})});if(!x.ok||!x.body){const C=await x.json();t(C.error||"Deploy failed");return}const w=x.body.getReader(),A=new TextDecoder;let S="";for(;;){const{done:C,value:F}=await w.read();if(C)break;S+=A.decode(F,{stream:!0});const U=S.split(`
|
|
4
|
-
|
|
5
|
-
`);S=U.pop()||"";for(const T of U){const O=T.match(/^event: (.+)$/m),E=T.match(/^data: (.+)$/m);if(!O||!E)continue;const L=O[1],p=JSON.parse(E[1]);if(L==="progress"){const R=p.detail?`${p.step} (${p.detail})`:p.step;c(J=>[...J,R])}else L==="done"&&(p.success&&p.projectUrl?k({projectName:p.projectName,projectUrl:p.projectUrl}):t(p.error||"Deploy failed"))}}}catch(x){t(x instanceof Error?x.message:"Deploy failed")}finally{m(!1)}},P=async(r,f)=>{m(!0),t(null);try{const w=await(await fetch("/api/create",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:r,templateId:f})})).json();w.success&&w.projectUrl?window.location.href=w.projectUrl:t(w.error||"Create failed")}catch(x){t(x instanceof Error?x.message:"Create failed")}finally{m(!1)}},n=async r=>{await o({projectName:r.name,projectUrl:r.url,projectRoot:`/home/user/${r.name}`}),window.location.href=r.url};if(b===null)return e.jsx("div",{className:"min-h-screen bg-surface flex items-center justify-center",children:e.jsx("div",{className:"text-ink-faint text-sm",children:"Loading..."})});if(!b.authenticated||!b.claudeAuthenticated)return e.jsx(_,{onLogin:y,authenticated:b.authenticated});const $=[["projects","Browse projects"],["deploy","Pick a folder"],["github","Deploy from GitHub"],["new","Start from scratch"]];return e.jsxs("div",{className:"min-h-screen bg-surface text-ink antialiased",children:[e.jsx("header",{className:"fixed top-0 left-0 right-0 z-10 px-6 bg-surface/95 backdrop-blur-sm border-b border-border",children:e.jsxs("div",{className:"flex items-center justify-between h-12",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("img",{src:"/logo.svg",alt:"ooda",className:"h-5"}),e.jsx("span",{className:"text-ink-faint",children:"/"}),e.jsx("span",{className:"text-sm font-medium text-ink",children:"Deploy tool"})]}),e.jsxs("nav",{className:"flex items-center gap-6 h-full",children:[$.map(([r,f])=>e.jsx("button",{onClick:()=>g(r),className:`h-full text-sm font-medium border-b-2 transition-colors ${i===r?"border-ink text-ink":"border-transparent text-ink-muted hover:text-ink"}`,children:f},r)),e.jsx("a",{href:"https://app.ooda.run",target:"_blank",rel:"noopener noreferrer",className:"ml-2 px-3 py-1 text-sm font-medium text-ink-muted bg-border/50 hover:bg-border transition-colors",children:"Go to app"})]})]})}),e.jsxs("main",{className:"max-w-4xl mx-auto px-6 pt-20 pb-8",children:[(a==null?void 0:a.isProject)&&i==="deploy"&&e.jsxs("div",{className:"mb-6 p-4 border border-border flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsxs("p",{className:"text-sm font-medium text-ink",children:["Detected project: ",a.name]}),e.jsx("p",{className:"text-xs text-ink-muted font-mono mt-0.5",children:a.path})]}),e.jsx("button",{onClick:()=>j(),disabled:l,className:"px-4 py-2 bg-ink text-surface text-sm font-medium hover:bg-ink/80 disabled:opacity-50 transition-colors",children:l?"Deploying...":"Deploy this project"})]}),h&&e.jsxs("div",{className:"mb-6 p-4 border border-border",children:[e.jsxs("p",{className:"text-sm font-medium text-ink",children:["Deployed to ",h.projectName]}),e.jsx("p",{className:"text-sm text-ink-muted mt-1",children:"Switch to your terminal — Claude is connecting and will start the dev server."}),e.jsx("a",{href:h.projectUrl,target:"_blank",rel:"noopener noreferrer",className:"inline-block mt-2 text-xs text-ink-muted underline hover:text-ink",children:h.projectUrl})]}),v&&e.jsxs("div",{className:"mb-6 p-4 border border-border",children:[e.jsx("p",{className:"text-sm font-medium text-ink mb-1",children:"Something went wrong"}),e.jsx("pre",{className:"text-xs text-ink-muted whitespace-pre-wrap break-all font-mono",children:v}),e.jsx("button",{onClick:()=>t(null),className:"mt-2 text-xs text-ink-muted underline hover:text-ink",children:"Dismiss"})]}),i==="projects"&&e.jsx(I,{onOpen:n}),i==="github"&&e.jsxs(e.Fragment,{children:[e.jsx(M,{onDeploy:D,deploying:l}),u.length>0&&e.jsx("div",{className:"mt-6 max-w-lg",children:e.jsxs("div",{className:"border border-border bg-ink p-4 font-mono text-xs text-ink-faint max-h-60 overflow-y-auto",children:[u.map((r,f)=>e.jsxs("div",{className:"flex gap-2",children:[e.jsx("span",{className:"text-green-400 flex-shrink-0",children:f===u.length-1&&l?"▸":"✓"}),e.jsx("span",{children:r})]},f)),l&&e.jsx("div",{className:"text-ink-muted mt-1 animate-pulse",children:"Working..."})]})})]}),i==="new"&&e.jsx(G,{onCreate:P,deploying:l}),i==="deploy"&&e.jsxs(e.Fragment,{children:[e.jsx(H,{onDeploy:j,deploying:l}),u.length>0&&e.jsx("div",{className:"mt-6 max-w-lg",children:e.jsxs("div",{className:"border border-border bg-ink p-4 font-mono text-xs text-ink-faint max-h-60 overflow-y-auto",children:[u.map((r,f)=>e.jsxs("div",{className:"flex gap-2",children:[e.jsx("span",{className:"text-green-400 flex-shrink-0",children:f===u.length-1&&l?"▸":"✓"}),e.jsx("span",{children:r})]},f)),l&&e.jsx("div",{className:"text-ink-muted mt-1 animate-pulse",children:"Working..."})]})})]})]})]})}export{V as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{r as s,j as e}from"./index-DNhLzZDP.js";import{g,a as p,c as j,i as u}from"./api-DbuItvnH.js";function h(r){const c=Date.now()-new Date(r).getTime(),a=Math.floor(c/6e4);if(a<1)return"just now";if(a<60)return`${a}m ago`;const n=Math.floor(a/60);return n<24?`${n}h ago`:`${Math.floor(n/24)}d ago`}function N(){const[r,c]=s.useState([]),[a,n]=s.useState(!0),[l,o]=s.useState(null),i=async()=>{n(!0);try{const t=await u("/orgs");if(!t.ok){o(t.status===401?"Not authorized (requires internal admin)":"Failed to load orgs");return}const d=await t.json();c(d.orgs||[])}catch{o("Could not reach the server")}finally{n(!1)}};return s.useEffect(()=>{i()},[]),a?e.jsx("p",{className:"text-sm text-ink-muted",children:"Loading orgs..."}):l?e.jsx("p",{className:"text-sm text-red-600",children:l}):e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center justify-between mb-4",children:[e.jsxs("h2",{className:"text-lg font-medium text-ink",children:["Organisations",e.jsx("span",{className:"text-ink-faint font-normal ml-2",children:r.length})]}),e.jsx("button",{onClick:i,className:"text-xs text-ink-muted hover:text-ink transition-colors",children:"Refresh"})]}),r.length===0?e.jsx("div",{className:"border border-border py-12 text-center",children:e.jsx("p",{className:"text-sm text-ink-muted",children:"No organisations yet"})}):e.jsxs("div",{className:"border border-border divide-y divide-border",children:[e.jsxs("div",{className:"grid grid-cols-6 gap-4 px-4 py-2 text-xs font-medium text-ink-muted bg-surface-alt",children:[e.jsx("span",{className:"col-span-2",children:"Name"}),e.jsx("span",{children:"Projects"}),e.jsx("span",{children:"Members"}),e.jsx("span",{children:"Limit"}),e.jsx("span",{children:"Created"})]}),r.map(t=>e.jsxs("div",{className:"grid grid-cols-6 gap-4 px-4 py-3 items-center",children:[e.jsxs("div",{className:"col-span-2",children:[e.jsx("p",{className:"text-sm font-medium text-ink",children:t.name}),e.jsx("p",{className:"text-xs text-ink-faint",children:t.id})]}),e.jsx("span",{className:"text-sm text-ink",children:t.projectCount}),e.jsx("span",{className:"text-sm text-ink",children:t.memberCount}),e.jsx("span",{className:"text-sm text-ink-muted",children:t.maxProjects}),e.jsx("span",{className:"text-xs text-ink-faint",title:t.createdAt,children:h(t.createdAt)})]},t.id))]})]})}function k(){const[r,c]=s.useState([]),[a,n]=s.useState(!0),[l,o]=s.useState(null),i=async()=>{n(!0);try{const t=await u("/projects");if(!t.ok){o(t.status===401?"Not authorized (requires internal admin)":"Failed to load projects");return}const d=await t.json();c(d.projects||[])}catch{o("Could not reach the server")}finally{n(!1)}};return s.useEffect(()=>{i()},[]),a?e.jsx("p",{className:"text-sm text-ink-muted",children:"Loading projects..."}):l?e.jsx("p",{className:"text-sm text-red-600",children:l}):e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center justify-between mb-4",children:[e.jsxs("h2",{className:"text-lg font-medium text-ink",children:["All Projects",e.jsx("span",{className:"text-ink-faint font-normal ml-2",children:r.length})]}),e.jsx("button",{onClick:i,className:"text-xs text-ink-muted hover:text-ink transition-colors",children:"Refresh"})]}),r.length===0?e.jsx("div",{className:"border border-border py-12 text-center",children:e.jsx("p",{className:"text-sm text-ink-muted",children:"No projects across any org"})}):e.jsxs("div",{className:"border border-border divide-y divide-border",children:[e.jsxs("div",{className:"grid grid-cols-5 gap-4 px-4 py-2 text-xs font-medium text-ink-muted bg-surface-alt",children:[e.jsx("span",{children:"Project"}),e.jsx("span",{children:"Org"}),e.jsx("span",{children:"Owner"}),e.jsx("span",{children:"Last Active"}),e.jsx("span",{children:"Created"})]}),r.map(t=>e.jsxs("div",{className:"grid grid-cols-5 gap-4 px-4 py-3 items-center",children:[e.jsxs("div",{children:[e.jsx("p",{className:"text-sm font-medium text-ink",children:t.name}),t.previewUrl&&e.jsx("a",{href:t.previewUrl,target:"_blank",rel:"noopener noreferrer",className:"text-xs text-blue-600 hover:underline truncate block",children:"preview"})]}),e.jsxs("div",{children:[e.jsx("p",{className:"text-sm text-ink",children:t.orgName||t.orgId}),t.orgName&&e.jsx("p",{className:"text-xs text-ink-faint",children:t.orgId})]}),e.jsx("span",{className:"text-sm text-ink-muted truncate",children:t.ownerEmail||"—"}),e.jsx("span",{className:"text-xs text-ink-muted",title:t.lastActiveAt||"",children:t.lastActiveAt?h(t.lastActiveAt):"—"}),e.jsx("span",{className:"text-xs text-ink-faint",title:t.createdAt,children:h(t.createdAt)})]},`${t.orgId}/${t.name}`))]})]})}const b=[["orgs","Organisations"],["projects","All Projects"]];function w(){const[r,c]=s.useState(null),[a,n]=s.useState(!1),[l,o]=s.useState(!0),[i,t]=s.useState("orgs"),d=async()=>(await u("/orgs")).ok;s.useEffect(()=>{(async()=>{if(!g()){o(!1);return}const m=await p();m?(c(m.user),n(await d())):j(),o(!1)})()},[]);const f=()=>{j(),c(null)};return l?e.jsx("div",{className:"min-h-screen bg-surface flex items-center justify-center",children:e.jsx("p",{className:"text-sm text-ink-muted",children:"Loading..."})}):!r||!a?e.jsx("div",{className:"min-h-screen bg-surface flex items-center justify-center",children:e.jsx("p",{className:"text-sm text-ink-muted",children:"404 — Not found"})}):e.jsxs("div",{className:"min-h-screen bg-surface",children:[e.jsxs("header",{className:"border-b border-border px-6 py-4 flex items-center justify-between",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("img",{src:"/logo.svg",alt:"ooda",className:"h-5"}),e.jsx("span",{className:"text-ink-faint",children:"/"}),e.jsx("span",{className:"text-sm font-medium text-ink",children:"Internal"})]}),e.jsxs("div",{className:"flex items-center gap-4",children:[e.jsx("span",{className:"text-xs text-ink-faint",children:r.email}),e.jsx("button",{onClick:f,className:"text-xs text-ink-muted hover:text-ink transition-colors",children:"Sign out"})]})]}),e.jsx("div",{className:"border-b border-border px-6",children:e.jsx("nav",{className:"flex gap-6",children:b.map(([x,m])=>e.jsx("button",{onClick:()=>t(x),className:`py-3 text-sm font-medium border-b-2 transition-colors ${i===x?"border-ink text-ink":"border-transparent text-ink-muted hover:text-ink"}`,children:m},x))})}),e.jsxs("main",{className:"max-w-5xl mx-auto px-6 py-8",children:[i==="orgs"&&e.jsx(N,{}),i==="projects"&&e.jsx(k,{})]})]})}export{w as InternalDashboard};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
/*! tailwindcss v4.2.1 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-font-weight:initial;--tw-tracking:initial;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000}}}@layer theme{:root,:host{--font-sans:"Geist", ui-sans-serif, system-ui, -apple-system, sans-serif;--font-mono:"Geist Mono", ui-monospace, "SFMono-Regular", monospace;--color-red-100:oklch(93.6% .032 17.717);--color-red-500:oklch(63.7% .237 25.331);--color-red-600:oklch(57.7% .245 27.325);--color-red-700:oklch(50.5% .213 27.518);--color-red-800:oklch(44.4% .177 26.899);--color-orange-100:oklch(95.4% .038 75.164);--color-orange-800:oklch(47% .157 37.304);--color-amber-600:oklch(66.6% .179 58.318);--color-amber-800:oklch(47.3% .137 46.201);--color-yellow-100:oklch(97.3% .071 103.193);--color-yellow-500:oklch(79.5% .184 86.047);--color-yellow-800:oklch(47.6% .114 61.907);--color-green-50:oklch(98.2% .018 155.826);--color-green-100:oklch(96.2% .044 156.743);--color-green-400:oklch(79.2% .209 151.711);--color-green-500:oklch(72.3% .219 149.579);--color-green-600:oklch(62.7% .194 149.214);--color-green-700:oklch(52.7% .154 150.069);--color-green-800:oklch(44.8% .119 151.328);--color-blue-600:oklch(54.6% .245 262.881);--color-gray-100:oklch(96.7% .003 264.542);--color-gray-600:oklch(44.6% .03 256.802);--color-white:#fff;--spacing:.25rem;--container-sm:24rem;--container-md:28rem;--container-lg:32rem;--container-4xl:56rem;--container-5xl:64rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--tracking-normal:0em;--tracking-widest:.1em;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--blur-sm:8px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--color-surface:#ebf1e5;--color-ink:#272725;--color-ink-muted:#5a5a56;--color-ink-faint:#8a8a84;--color-border:#cdd4c7}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}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;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.fixed{position:fixed}.start{inset-inline-start:var(--spacing)}.top-0{top:calc(var(--spacing) * 0)}.right-0{right:calc(var(--spacing) * 0)}.left-0{left:calc(var(--spacing) * 0)}.z-10{z-index:10}.col-span-2{grid-column:span 2/span 2}.mx-1{margin-inline:calc(var(--spacing) * 1)}.mx-auto{margin-inline:auto}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:calc(var(--spacing) * 1)}.mt-1\.5{margin-top:calc(var(--spacing) * 1.5)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-6{margin-top:calc(var(--spacing) * 6)}.mb-1{margin-bottom:calc(var(--spacing) * 1)}.mb-1\.5{margin-bottom:calc(var(--spacing) * 1.5)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.mb-8{margin-bottom:calc(var(--spacing) * 8)}.ml-1{margin-left:calc(var(--spacing) * 1)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-auto{margin-left:auto}.block{display:block}.flex{display:flex}.grid{display:grid}.inline-block{display:inline-block}.h-2{height:calc(var(--spacing) * 2)}.h-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-12{height:calc(var(--spacing) * 12)}.h-full{height:100%}.max-h-60{max-height:calc(var(--spacing) * 60)}.max-h-64{max-height:calc(var(--spacing) * 64)}.max-h-72{max-height:calc(var(--spacing) * 72)}.min-h-screen{min-height:100vh}.w-2{width:calc(var(--spacing) * 2)}.w-24{width:calc(var(--spacing) * 24)}.w-40{width:calc(var(--spacing) * 40)}.w-full{width:100%}.max-w-4xl{max-width:var(--container-4xl)}.max-w-5xl{max-width:var(--container-5xl)}.max-w-lg{max-width:var(--container-lg)}.max-w-md{max-width:var(--container-md)}.max-w-sm{max-width:var(--container-sm)}.min-w-0{min-width:calc(var(--spacing) * 0)}.flex-1{flex:1}.flex-\[2\]{flex:2}.flex-shrink-0{flex-shrink:0}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-pulse{animation:var(--animate-pulse)}.cursor-help{cursor:help}.cursor-pointer{cursor:pointer}.resize-none{resize:none}.list-inside{list-style-position:inside}.list-disc{list-style-type:disc}.grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-6{gap:calc(var(--spacing) * 6)}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-8>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 8) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 8) * calc(1 - var(--tw-space-y-reverse)))}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-border>:not(:last-child)){border-color:var(--color-border)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.rounded-full{border-radius:3.40282e38px}.border{border-style:var(--tw-border-style);border-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-border{border-color:var(--color-border)}.border-border\/30{border-color:#cdd4c74d}@supports (color:color-mix(in lab,red,red)){.border-border\/30{border-color:color-mix(in oklab,var(--color-border) 30%,transparent)}}.border-ink{border-color:var(--color-ink)}.border-transparent{border-color:#0000}.bg-border{background-color:var(--color-border)}.bg-border\/50{background-color:#cdd4c780}@supports (color:color-mix(in lab,red,red)){.bg-border\/50{background-color:color-mix(in oklab,var(--color-border) 50%,transparent)}}.bg-gray-100{background-color:var(--color-gray-100)}.bg-green-50{background-color:var(--color-green-50)}.bg-green-100{background-color:var(--color-green-100)}.bg-green-500{background-color:var(--color-green-500)}.bg-ink{background-color:var(--color-ink)}.bg-orange-100{background-color:var(--color-orange-100)}.bg-red-100{background-color:var(--color-red-100)}.bg-surface{background-color:var(--color-surface)}.bg-surface\/95{background-color:#ebf1e5f2}@supports (color:color-mix(in lab,red,red)){.bg-surface\/95{background-color:color-mix(in oklab,var(--color-surface) 95%,transparent)}}.bg-white{background-color:var(--color-white)}.bg-yellow-100{background-color:var(--color-yellow-100)}.bg-yellow-500{background-color:var(--color-yellow-500)}.p-4{padding:calc(var(--spacing) * 4)}.p-8{padding:calc(var(--spacing) * 8)}.px-1{padding-inline:calc(var(--spacing) * 1)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-6{padding-inline:calc(var(--spacing) * 6)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-8{padding-block:calc(var(--spacing) * 8)}.py-12{padding-block:calc(var(--spacing) * 12)}.pt-1{padding-top:calc(var(--spacing) * 1)}.pt-20{padding-top:calc(var(--spacing) * 20)}.pb-8{padding-bottom:calc(var(--spacing) * 8)}.text-center{text-align:center}.text-left{text-align:left}.font-mono{font-family:var(--font-mono)}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[11px\]{font-size:11px}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-normal{--tw-tracking:var(--tracking-normal);letter-spacing:var(--tracking-normal)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.break-all{word-break:break-all}.whitespace-pre-wrap{white-space:pre-wrap}.text-amber-600{color:var(--color-amber-600)}.text-blue-600{color:var(--color-blue-600)}.text-gray-600{color:var(--color-gray-600)}.text-green-400{color:var(--color-green-400)}.text-green-600{color:var(--color-green-600)}.text-green-700{color:var(--color-green-700)}.text-green-800{color:var(--color-green-800)}.text-ink{color:var(--color-ink)}.text-ink-faint{color:var(--color-ink-faint)}.text-ink-muted{color:var(--color-ink-muted)}.text-orange-800{color:var(--color-orange-800)}.text-red-500{color:var(--color-red-500)}.text-red-600{color:var(--color-red-600)}.text-red-800{color:var(--color-red-800)}.text-surface{color:var(--color-surface)}.text-surface\/60{color:#ebf1e599}@supports (color:color-mix(in lab,red,red)){.text-surface\/60{color:color-mix(in oklab,var(--color-surface) 60%,transparent)}}.text-yellow-800{color:var(--color-yellow-800)}.normal-case{text-transform:none}.uppercase{text-transform:uppercase}.underline{text-decoration-line:underline}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-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-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.placeholder\:text-ink-faint::placeholder{color:var(--color-ink-faint)}.last\:border-0:last-child{border-style:var(--tw-border-style);border-width:0}@media(hover:hover){.hover\:border-border:hover{border-color:var(--color-border)}.hover\:border-ink-faint:hover{border-color:var(--color-ink-faint)}.hover\:bg-border:hover{background-color:var(--color-border)}.hover\:bg-border\/30:hover{background-color:#cdd4c74d}@supports (color:color-mix(in lab,red,red)){.hover\:bg-border\/30:hover{background-color:color-mix(in oklab,var(--color-border) 30%,transparent)}}.hover\:bg-green-100:hover{background-color:var(--color-green-100)}.hover\:bg-ink\/80:hover{background-color:#272725cc}@supports (color:color-mix(in lab,red,red)){.hover\:bg-ink\/80:hover{background-color:color-mix(in oklab,var(--color-ink) 80%,transparent)}}.hover\:text-amber-800:hover{color:var(--color-amber-800)}.hover\:text-ink:hover{color:var(--color-ink)}.hover\:text-ink\/70:hover{color:#272725b3}@supports (color:color-mix(in lab,red,red)){.hover\:text-ink\/70:hover{color:color-mix(in oklab,var(--color-ink) 70%,transparent)}}.hover\:text-red-700:hover{color:var(--color-red-700)}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-90:hover{opacity:.9}}.focus\:border-ink:focus{border-color:var(--color-ink)}.focus\:border-transparent:focus{border-color:#0000}.focus\:ring-1:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-ink:focus{--tw-ring-color:var(--color-ink)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-30:disabled{opacity:.3}.disabled\:opacity-50:disabled{opacity:.5}}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@keyframes pulse{50%{opacity:.5}}
|