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.
Files changed (44) hide show
  1. package/bin/feedeas.js +40 -0
  2. package/dist/cli/index.js +65 -7
  3. package/dist/ui/assets/index-B4LfCAUB.css +1 -0
  4. package/dist/ui/assets/index-DwuL9X1n.js +17 -0
  5. package/package.json +18 -3
  6. package/scripts/release-npm.ts +88 -0
  7. package/bun.lock +0 -426
  8. package/index.ts +0 -1
  9. package/product_doc.md +0 -56
  10. package/src/cli/commands/asset.ts +0 -148
  11. package/src/cli/commands/audio.ts +0 -157
  12. package/src/cli/commands/bgm.ts +0 -233
  13. package/src/cli/commands/create-scene.ts +0 -136
  14. package/src/cli/commands/example.ts +0 -155
  15. package/src/cli/commands/imagine.ts +0 -322
  16. package/src/cli/commands/inspect.ts +0 -44
  17. package/src/cli/commands/record.ts +0 -382
  18. package/src/cli/commands/schema.ts +0 -144
  19. package/src/cli/commands/set-scene.ts +0 -51
  20. package/src/cli/commands/validate.ts +0 -165
  21. package/src/cli/index.ts +0 -327
  22. package/src/cli/server/api.ts +0 -174
  23. package/src/cli/server/index.ts +0 -105
  24. package/src/cli/services/ffprobe.ts +0 -85
  25. package/src/cli/services/scene-builder.ts +0 -50
  26. package/src/cli/services/scene-resolver.ts +0 -99
  27. package/src/cli/services/telemetry.ts +0 -110
  28. package/src/cli/services/whisper.ts +0 -224
  29. package/src/cli/types/music.ts +0 -33
  30. package/src/cli/utils/playwright-installer.ts +0 -93
  31. package/src/ui/App.tsx +0 -48
  32. package/src/ui/components/CanvasPreview.tsx +0 -495
  33. package/src/ui/components/EntityList.tsx +0 -139
  34. package/src/ui/components/Header.tsx +0 -61
  35. package/src/ui/components/PropertyPanel.tsx +0 -325
  36. package/src/ui/components/Timeline.tsx +0 -304
  37. package/src/ui/context/ProjectContext.tsx +0 -130
  38. package/src/ui/index.css +0 -1
  39. package/src/ui/index.html +0 -13
  40. package/src/ui/main.tsx +0 -10
  41. package/src/ui/store/reducer.ts +0 -119
  42. package/src/ui/types.ts +0 -90
  43. package/tsconfig.json +0 -27
  44. 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 fast with: feedeas edit
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 prompts/scene1.txt --aspect-ratio 9:16 -o scene1.png
7719
- Agent (tool): feedeas imagine prompts/scene2.txt --aspect-ratio 9:16 -o scene2.png
7720
- Agent (tool): feedeas audio narration.txt -o narration.mp3 --no-transcribe
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}