feedeas 0.1.0-alpha.7 → 0.1.0-alpha.9
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/bin/feedeas.js +40 -0
- package/dist/cli/index.js +65 -7
- package/dist/ui/assets/index-B4LfCAUB.css +1 -0
- package/dist/ui/assets/index-DwuL9X1n.js +17 -0
- package/package.json +18 -3
- package/scripts/release-npm.ts +88 -0
- package/bun.lock +0 -426
- package/index.ts +0 -1
- package/product_doc.md +0 -56
- package/src/cli/commands/asset.ts +0 -148
- package/src/cli/commands/audio.ts +0 -157
- package/src/cli/commands/bgm.ts +0 -233
- package/src/cli/commands/create-scene.ts +0 -136
- package/src/cli/commands/example.ts +0 -155
- package/src/cli/commands/imagine.ts +0 -322
- package/src/cli/commands/inspect.ts +0 -44
- package/src/cli/commands/record.ts +0 -382
- package/src/cli/commands/schema.ts +0 -144
- package/src/cli/commands/set-scene.ts +0 -51
- package/src/cli/commands/validate.ts +0 -165
- package/src/cli/index.ts +0 -327
- package/src/cli/server/api.ts +0 -174
- package/src/cli/server/index.ts +0 -105
- package/src/cli/services/ffprobe.ts +0 -85
- package/src/cli/services/scene-builder.ts +0 -50
- package/src/cli/services/scene-resolver.ts +0 -99
- package/src/cli/services/telemetry.ts +0 -110
- package/src/cli/services/whisper.ts +0 -224
- package/src/cli/types/music.ts +0 -33
- package/src/cli/utils/playwright-installer.ts +0 -93
- package/src/ui/App.tsx +0 -48
- package/src/ui/components/CanvasPreview.tsx +0 -495
- package/src/ui/components/EntityList.tsx +0 -139
- package/src/ui/components/Header.tsx +0 -61
- package/src/ui/components/PropertyPanel.tsx +0 -325
- package/src/ui/components/Timeline.tsx +0 -304
- package/src/ui/context/ProjectContext.tsx +0 -130
- package/src/ui/index.css +0 -1
- package/src/ui/index.html +0 -13
- package/src/ui/main.tsx +0 -10
- package/src/ui/store/reducer.ts +0 -119
- package/src/ui/types.ts +0 -90
- package/tsconfig.json +0 -27
- package/vite.config.ts +0 -30
package/bin/feedeas.js
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import path from 'path';
|
|
4
|
+
import { fileURLToPath } from 'url';
|
|
5
|
+
import { spawn } from 'child_process';
|
|
6
|
+
import fs from 'fs';
|
|
7
|
+
|
|
8
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
9
|
+
const __dirname = path.dirname(__filename);
|
|
10
|
+
|
|
11
|
+
const cliEntrypoint = path.resolve(__dirname, '../dist/cli/index.js');
|
|
12
|
+
const args = process.argv.slice(2);
|
|
13
|
+
|
|
14
|
+
if (!fs.existsSync(cliEntrypoint)) {
|
|
15
|
+
console.error('Feedeas CLI bundle is missing. Reinstall the package and try again.');
|
|
16
|
+
process.exit(1);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
const child = spawn('bun', [cliEntrypoint, ...args], {
|
|
20
|
+
stdio: 'inherit',
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
child.on('error', (error) => {
|
|
24
|
+
if (error?.code === 'ENOENT') {
|
|
25
|
+
console.error('\nFeedeas requires the Bun runtime.');
|
|
26
|
+
console.error('Install Bun: https://bun.sh');
|
|
27
|
+
console.error('Then retry your command.\n');
|
|
28
|
+
process.exit(1);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
console.error(`Failed to start Feedeas: ${error?.message || 'Unknown error'}`);
|
|
32
|
+
process.exit(1);
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
child.on('exit', (code, signal) => {
|
|
36
|
+
if (signal) {
|
|
37
|
+
process.exit(1);
|
|
38
|
+
}
|
|
39
|
+
process.exit(code ?? 1);
|
|
40
|
+
});
|
package/dist/cli/index.js
CHANGED
|
@@ -5102,6 +5102,28 @@ function formatBytes(bytes) {
|
|
|
5102
5102
|
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
|
5103
5103
|
return `${(bytes / Math.pow(k, i)).toFixed(2)} ${sizes[i]}`;
|
|
5104
5104
|
}
|
|
5105
|
+
function getMissingUiAssets(staticRoot) {
|
|
5106
|
+
const indexPath = path3.join(staticRoot, "index.html");
|
|
5107
|
+
if (!fs2.existsSync(indexPath)) {
|
|
5108
|
+
return {
|
|
5109
|
+
missingFiles: [indexPath],
|
|
5110
|
+
expectedUrls: []
|
|
5111
|
+
};
|
|
5112
|
+
}
|
|
5113
|
+
const indexHtml = fs2.readFileSync(indexPath, "utf-8");
|
|
5114
|
+
const assetMatches = Array.from(indexHtml.matchAll(/(?:src|href)=["'](\/assets\/[^"']+)["']/g));
|
|
5115
|
+
const assetPaths = [...new Set(assetMatches.map((match2) => match2[1]))];
|
|
5116
|
+
const missingFiles = [];
|
|
5117
|
+
const expectedUrls = [];
|
|
5118
|
+
for (const assetPath of assetPaths) {
|
|
5119
|
+
const localPath = path3.join(staticRoot, assetPath.replace(/^\//, ""));
|
|
5120
|
+
if (!fs2.existsSync(localPath)) {
|
|
5121
|
+
missingFiles.push(localPath);
|
|
5122
|
+
expectedUrls.push(assetPath);
|
|
5123
|
+
}
|
|
5124
|
+
}
|
|
5125
|
+
return { missingFiles, expectedUrls };
|
|
5126
|
+
}
|
|
5105
5127
|
var recordCommand = new Command("record").description("Record the project to a video file with audio").option("-o, --output <path>", "Output file path", "output.mp4").option("-u, --url <url>", "URL of the running server", "http://localhost:3331").option("-w, --width <number>", "Viewport width", "1920").option("-h, --height <number>", "Viewport height", "1080").option("-f, --fps <number>", "Frames per second", "30").option("--project <path>", "Path to project file", "scene_1.json").option("--dry-run", "Validate scene and show estimates without rendering").option("--debug", "Enable verbose logging (FFmpeg, browser console)").action(async (options) => {
|
|
5106
5128
|
const { output, url, width, height, fps, project: projectOption, debug, dryRun } = options;
|
|
5107
5129
|
const projectPath = path3.resolve(process.cwd(), projectOption);
|
|
@@ -5211,12 +5233,48 @@ Ready to record. Run without --dry-run to start rendering.`);
|
|
|
5211
5233
|
const app2 = createServer(staticRoot);
|
|
5212
5234
|
const portMatch = url.match(/:(\d+)/);
|
|
5213
5235
|
const port = portMatch ? parseInt(portMatch[1]) : 3331;
|
|
5236
|
+
const { missingFiles, expectedUrls } = getMissingUiAssets(staticRoot);
|
|
5237
|
+
if (missingFiles.length > 0) {
|
|
5238
|
+
console.error(`
|
|
5239
|
+
\u274C UI asset preflight failed. Missing built frontend assets required for recording.`);
|
|
5240
|
+
for (let i = 0;i < missingFiles.length; i++) {
|
|
5241
|
+
const filePath = missingFiles[i];
|
|
5242
|
+
const urlPath = expectedUrls[i];
|
|
5243
|
+
if (urlPath) {
|
|
5244
|
+
console.error(` \u2717 ${filePath} (expected at ${url}${urlPath})`);
|
|
5245
|
+
} else {
|
|
5246
|
+
console.error(` \u2717 ${filePath}`);
|
|
5247
|
+
}
|
|
5248
|
+
}
|
|
5249
|
+
console.error("\nRun `bun run build` and republish so `dist/ui/assets/*` is included in the npm package.");
|
|
5250
|
+
process.exit(1);
|
|
5251
|
+
}
|
|
5214
5252
|
const server = Bun.serve({
|
|
5215
5253
|
port,
|
|
5216
5254
|
fetch: app2.fetch
|
|
5217
5255
|
});
|
|
5218
5256
|
console.log(`Temporary server started at ${url}`);
|
|
5219
5257
|
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
5258
|
+
const healthUrls = [`${url}/`];
|
|
5259
|
+
for (const assetPath of expectedUrls) {
|
|
5260
|
+
healthUrls.push(`${url}${assetPath}`);
|
|
5261
|
+
}
|
|
5262
|
+
for (const healthUrl of healthUrls) {
|
|
5263
|
+
try {
|
|
5264
|
+
const response = await fetch(healthUrl);
|
|
5265
|
+
if (!response.ok) {
|
|
5266
|
+
console.error(`
|
|
5267
|
+
\u274C Server preflight failed: ${healthUrl} returned HTTP ${response.status}`);
|
|
5268
|
+
server.stop();
|
|
5269
|
+
process.exit(1);
|
|
5270
|
+
}
|
|
5271
|
+
} catch (e) {
|
|
5272
|
+
console.error(`
|
|
5273
|
+
\u274C Server preflight failed: could not fetch ${healthUrl}: ${e.message}`);
|
|
5274
|
+
server.stop();
|
|
5275
|
+
process.exit(1);
|
|
5276
|
+
}
|
|
5277
|
+
}
|
|
5220
5278
|
try {
|
|
5221
5279
|
const widthNum = parseInt(width);
|
|
5222
5280
|
const heightNum = parseInt(height);
|
|
@@ -7562,7 +7620,7 @@ var __dirname5 = path15.dirname(__filename4);
|
|
|
7562
7620
|
var program2 = new Command;
|
|
7563
7621
|
var telemetry = new PostHogTelemetryService;
|
|
7564
7622
|
var commandStartTimes = new WeakMap;
|
|
7565
|
-
program2.name("feedeas").description("CLI for Feedeas - AI-native video creation tool").version("0.1.0");
|
|
7623
|
+
program2.name("feedeas").description("CLI for Feedeas - AI-native video creation tool").version("0.1.0-alpha.8");
|
|
7566
7624
|
program2.hook("preAction", (_thisCommand, actionCommand) => {
|
|
7567
7625
|
commandStartTimes.set(actionCommand, Date.now());
|
|
7568
7626
|
telemetry.trackCommandStarted(actionCommand);
|
|
@@ -7708,17 +7766,17 @@ Guided Flow (Agent-Friendly, End-to-End):
|
|
|
7708
7766
|
- set meta.duration to match narration/bgm
|
|
7709
7767
|
- use src values like "assets/image1.png", "assets/narration.mp3", "assets/bgm.mp3"
|
|
7710
7768
|
8. feedeas validate scene.json
|
|
7711
|
-
9. feedeas record --project scene.json --output output.mp4
|
|
7712
|
-
10. Iterate
|
|
7769
|
+
9. feedeas record --project scene.json --output output.mp4 # This will take a while...
|
|
7770
|
+
10. (optional) Iterate with human in the loop: feedeas edit # this will open the editor with your scene so human can adjust timing, captions, or swap assets if they want (usually this is not needed)
|
|
7713
7771
|
|
|
7714
7772
|
Agent Conversation Example:
|
|
7715
7773
|
User: Create a nice reel about small life habits that heal us.
|
|
7716
7774
|
Agent: I'll draft a short storyline, generate assets, build the scene, validate, and render.
|
|
7717
7775
|
Agent: Let me create the narration script first.
|
|
7718
|
-
Agent (tool): feedeas imagine
|
|
7719
|
-
Agent (tool): feedeas imagine
|
|
7720
|
-
Agent (tool): feedeas audio
|
|
7721
|
-
Agent (tool): feedeas bgm "soft reflective ambient, no vocals" -d 25 -o bgm.mp3
|
|
7776
|
+
Agent (tool): feedeas imagine "warm cinematic kitchen morning..." --aspect-ratio 9:16 -o scene1.png
|
|
7777
|
+
Agent (tool): feedeas imagine "A person meditating in a park..." --aspect-ratio 9:16 -o scene2.png
|
|
7778
|
+
Agent (tool): feedeas audio "Life changes in small daily choices..." -o narration.mp3 --no-transcribe
|
|
7779
|
+
Agent (tool): feedeas bgm "soft reflective ambient, no vocals..." -d 25 -o bgm.mp3
|
|
7722
7780
|
Agent: Now I\u2019ll wire assets into scene.json with src values under assets/.
|
|
7723
7781
|
Agent (tool): feedeas validate scene.json
|
|
7724
7782
|
Agent (tool): feedeas record --project scene.json --output output.mp4
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@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-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-font-weight:initial;--tw-tracking: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:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-red-500:oklch(63.7% .237 25.331);--color-red-900:oklch(39.6% .141 25.723);--color-amber-400:oklch(82.8% .189 84.429);--color-amber-500:oklch(76.9% .188 70.08);--color-green-500:oklch(72.3% .219 149.579);--color-neutral-400:oklch(70.8% 0 0);--color-neutral-500:oklch(55.6% 0 0);--color-neutral-600:oklch(43.9% 0 0);--color-neutral-700:oklch(37.1% 0 0);--color-neutral-800:oklch(26.9% 0 0);--color-neutral-900:oklch(20.5% 0 0);--color-neutral-950:oklch(14.5% 0 0);--color-black:#000;--color-white:#fff;--spacing:.25rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--font-weight-medium:500;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-wider:.05em;--tracking-widest:.1em;--radius-sm:.25rem;--radius-md:.375rem;--radius-lg:.5rem;--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)}}@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%;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]){appearance:button}::file-selector-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{.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.inset-0{inset:calc(var(--spacing)*0)}.inset-x-0{inset-inline:calc(var(--spacing)*0)}.top-0{top:calc(var(--spacing)*0)}.top-1{top:calc(var(--spacing)*1)}.top-1\.5{top:calc(var(--spacing)*1.5)}.right-0{right:calc(var(--spacing)*0)}.right-1{right:calc(var(--spacing)*1)}.bottom-0{bottom:calc(var(--spacing)*0)}.left-0{left:calc(var(--spacing)*0)}.left-1\/2{left:50%}.z-0{z-index:0}.z-10{z-index:10}.z-20{z-index:20}.mb-1{margin-bottom:calc(var(--spacing)*1)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.ml-2{margin-left:calc(var(--spacing)*2)}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.h-1\.5{height:calc(var(--spacing)*1.5)}.h-2\.5{height:calc(var(--spacing)*2.5)}.h-3{height:calc(var(--spacing)*3)}.h-3\.5{height:calc(var(--spacing)*3.5)}.h-4{height:calc(var(--spacing)*4)}.h-5{height:calc(var(--spacing)*5)}.h-6{height:calc(var(--spacing)*6)}.h-8{height:calc(var(--spacing)*8)}.h-10{height:calc(var(--spacing)*10)}.h-14{height:calc(var(--spacing)*14)}.h-24{height:calc(var(--spacing)*24)}.h-48{height:calc(var(--spacing)*48)}.h-full{height:100%}.h-screen{height:100vh}.w-1\.5{width:calc(var(--spacing)*1.5)}.w-2{width:calc(var(--spacing)*2)}.w-2\.5{width:calc(var(--spacing)*2.5)}.w-3{width:calc(var(--spacing)*3)}.w-3\.5{width:calc(var(--spacing)*3.5)}.w-4{width:calc(var(--spacing)*4)}.w-5{width:calc(var(--spacing)*5)}.w-6{width:calc(var(--spacing)*6)}.w-8{width:calc(var(--spacing)*8)}.w-10{width:calc(var(--spacing)*10)}.w-24{width:calc(var(--spacing)*24)}.w-32{width:calc(var(--spacing)*32)}.w-72{width:calc(var(--spacing)*72)}.w-80{width:calc(var(--spacing)*80)}.w-full{width:100%}.w-px{width:1px}.w-screen{width:100vw}.max-w-\[150px\]{max-width:150px}.min-w-0{min-width:calc(var(--spacing)*0)}.flex-1{flex:1}.shrink-0{flex-shrink:0}.-translate-x-1\/2{--tw-translate-x: -50% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-0\.5{--tw-translate-x:calc(var(--spacing)*.5);translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y: -50% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.cursor-ew-resize{cursor:ew-resize}.cursor-grab{cursor:grab}.cursor-move{cursor:move}.cursor-pointer{cursor:pointer}.resize{resize:both}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.items-center{align-items:center}.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-3{gap:calc(var(--spacing)*3)}.gap-4{gap:calc(var(--spacing)*4)}: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)))}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-sm{border-radius:var(--radius-sm)}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-none{--tw-border-style:none;border-style:none}.border-amber-500\/40{border-color:#f99c0066}@supports (color:color-mix(in lab,red,red)){.border-amber-500\/40{border-color:color-mix(in oklab,var(--color-amber-500)40%,transparent)}}.border-amber-500\/50{border-color:#f99c0080}@supports (color:color-mix(in lab,red,red)){.border-amber-500\/50{border-color:color-mix(in oklab,var(--color-amber-500)50%,transparent)}}.border-black{border-color:var(--color-black)}.border-neutral-600\/50{border-color:#52525280}@supports (color:color-mix(in lab,red,red)){.border-neutral-600\/50{border-color:color-mix(in oklab,var(--color-neutral-600)50%,transparent)}}.border-neutral-700{border-color:var(--color-neutral-700)}.border-neutral-800{border-color:var(--color-neutral-800)}.border-neutral-800\/50{border-color:#26262680}@supports (color:color-mix(in lab,red,red)){.border-neutral-800\/50{border-color:color-mix(in oklab,var(--color-neutral-800)50%,transparent)}}.border-transparent{border-color:#0000}.border-white\/20{border-color:#fff3}@supports (color:color-mix(in lab,red,red)){.border-white\/20{border-color:color-mix(in oklab,var(--color-white)20%,transparent)}}.bg-amber-500{background-color:var(--color-amber-500)}.bg-amber-500\/10{background-color:#f99c001a}@supports (color:color-mix(in lab,red,red)){.bg-amber-500\/10{background-color:color-mix(in oklab,var(--color-amber-500)10%,transparent)}}.bg-amber-500\/30{background-color:#f99c004d}@supports (color:color-mix(in lab,red,red)){.bg-amber-500\/30{background-color:color-mix(in oklab,var(--color-amber-500)30%,transparent)}}.bg-black\/20{background-color:#0003}@supports (color:color-mix(in lab,red,red)){.bg-black\/20{background-color:color-mix(in oklab,var(--color-black)20%,transparent)}}.bg-black\/30{background-color:#0000004d}@supports (color:color-mix(in lab,red,red)){.bg-black\/30{background-color:color-mix(in oklab,var(--color-black)30%,transparent)}}.bg-black\/40{background-color:#0006}@supports (color:color-mix(in lab,red,red)){.bg-black\/40{background-color:color-mix(in oklab,var(--color-black)40%,transparent)}}.bg-black\/50{background-color:#00000080}@supports (color:color-mix(in lab,red,red)){.bg-black\/50{background-color:color-mix(in oklab,var(--color-black)50%,transparent)}}.bg-green-500{background-color:var(--color-green-500)}.bg-neutral-700\/30{background-color:#4040404d}@supports (color:color-mix(in lab,red,red)){.bg-neutral-700\/30{background-color:color-mix(in oklab,var(--color-neutral-700)30%,transparent)}}.bg-neutral-800{background-color:var(--color-neutral-800)}.bg-neutral-900{background-color:var(--color-neutral-900)}.bg-neutral-900\/50{background-color:#17171780}@supports (color:color-mix(in lab,red,red)){.bg-neutral-900\/50{background-color:color-mix(in oklab,var(--color-neutral-900)50%,transparent)}}.bg-neutral-950{background-color:var(--color-neutral-950)}.bg-transparent{background-color:#0000}.bg-gradient-to-l{--tw-gradient-position:to left in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-r{--tw-gradient-position:to right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.from-white\/30{--tw-gradient-from:#ffffff4d}@supports (color:color-mix(in lab,red,red)){.from-white\/30{--tw-gradient-from:color-mix(in oklab,var(--color-white)30%,transparent)}}.from-white\/30{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-transparent{--tw-gradient-to:transparent;--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.fill-current{fill:currentColor}.object-cover{object-fit:cover}.p-0{padding:calc(var(--spacing)*0)}.p-1{padding:calc(var(--spacing)*1)}.p-1\.5{padding:calc(var(--spacing)*1.5)}.p-2{padding:calc(var(--spacing)*2)}.p-2\.5{padding:calc(var(--spacing)*2.5)}.p-3{padding:calc(var(--spacing)*3)}.p-4{padding:calc(var(--spacing)*4)}.p-5{padding:calc(var(--spacing)*5)}.p-8{padding:calc(var(--spacing)*8)}.p-10{padding:calc(var(--spacing)*10)}.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-1{padding-block:calc(var(--spacing)*1)}.py-1\.5{padding-block:calc(var(--spacing)*1.5)}.pt-2{padding-top:calc(var(--spacing)*2)}.pt-6{padding-top:calc(var(--spacing)*6)}.pl-1{padding-left:calc(var(--spacing)*1)}.text-center{text-align:center}.font-mono{font-family:var(--font-mono)}.font-sans{font-family:var(--font-sans)}.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-\[8px\]{font-size:8px}.text-\[9px\]{font-size:9px}.text-\[10px\]{font-size:10px}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.text-amber-500{color:var(--color-amber-500)}.text-black{color:var(--color-black)}.text-neutral-400{color:var(--color-neutral-400)}.text-neutral-500{color:var(--color-neutral-500)}.text-neutral-600{color:var(--color-neutral-600)}.text-red-500{color:var(--color-red-500)}.text-white{color:var(--color-white)}.uppercase{text-transform:uppercase}.accent-amber-500{accent-color:var(--color-amber-500)}.opacity-0{opacity:0}.opacity-20{opacity:.2}.opacity-40{opacity:.4}.opacity-60{opacity:.6}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-1{--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)}.shadow-amber-500\/50{--tw-shadow-color:#f99c0080}@supports (color:color-mix(in lab,red,red)){.shadow-amber-500\/50{--tw-shadow-color:color-mix(in oklab,color-mix(in oklab,var(--color-amber-500)50%,transparent)var(--tw-shadow-alpha),transparent)}}.shadow-black{--tw-shadow-color:#000}@supports (color:color-mix(in lab,red,red)){.shadow-black{--tw-shadow-color:color-mix(in oklab,var(--color-black)var(--tw-shadow-alpha),transparent)}}.ring-white\/5{--tw-ring-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.ring-white\/5{--tw-ring-color:color-mix(in oklab,var(--color-white)5%,transparent)}}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.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))}.outline-none{--tw-outline-style:none;outline-style:none}@media(hover:hover){.group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}.hover\:bg-amber-400:hover{background-color:var(--color-amber-400)}.hover\:bg-neutral-700:hover{background-color:var(--color-neutral-700)}.hover\:bg-neutral-800:hover{background-color:var(--color-neutral-800)}.hover\:bg-red-900\/20:hover{background-color:#82181a33}@supports (color:color-mix(in lab,red,red)){.hover\:bg-red-900\/20:hover{background-color:color-mix(in oklab,var(--color-red-900)20%,transparent)}}.hover\:bg-white\/20:hover{background-color:#fff3}@supports (color:color-mix(in lab,red,red)){.hover\:bg-white\/20:hover{background-color:color-mix(in oklab,var(--color-white)20%,transparent)}}.hover\:bg-white\/50:hover{background-color:#ffffff80}@supports (color:color-mix(in lab,red,red)){.hover\:bg-white\/50:hover{background-color:color-mix(in oklab,var(--color-white)50%,transparent)}}.hover\:text-amber-500:hover{color:var(--color-amber-500)}.hover\:text-white:hover{color:var(--color-white)}.hover\:opacity-100:hover{opacity:1}}.focus\:border-amber-500:focus{border-color:var(--color-amber-500)}.active\:cursor-grabbing:active{cursor:grabbing}}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"<length-percentage>";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"<length-percentage>";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"<length-percentage>";inherits:false;initial-value:100%}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{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}
|