@odori/cli 0.0.7 → 0.0.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/dist/{chunk-STVORYOF.js → chunk-TDM65HRW.js} +1575 -1074
- package/dist/cli.js +1 -1
- package/dist/index.d.ts +52 -4
- package/dist/index.js +1 -1
- package/dist/{registry-snapshot-ADKSTGDR.js → registry-snapshot-TKH2KAC3.js} +362 -25
- package/package.json +3 -3
- package/src/audio-mix.ts +6 -1
- package/src/cli.ts +53 -4
- package/src/commands/bed.ts +224 -0
- package/src/commands/dev.ts +80 -0
- package/src/commands/doctor.ts +20 -0
- package/src/commands/exportVideo.ts +15 -0
- package/src/commands/integrations.ts +26 -0
- package/src/commands/narrate.ts +74 -0
- package/src/commands/test.ts +55 -16
- package/src/config.ts +5 -0
- package/src/jobs.ts +1 -1
- package/src/keystore.ts +76 -0
- package/src/providers.ts +173 -0
- package/src/registry-snapshot.json +362 -25
- package/src/render.ts +69 -22
- package/src/server.ts +10 -0
- package/studio/src/Studio.tsx +1 -1
- package/studio/src/components/GenerateBed.tsx +148 -0
- package/studio/src/components/Settings.tsx +266 -50
- package/studio/src/components/ui.tsx +11 -1
- package/studio/src/integrations.ts +29 -0
- package/studio/src/studio.css +276 -3
- package/studio/src/views/AssetsView.tsx +6 -0
- package/studio/src/virtual.d.ts +1 -0
package/studio/src/studio.css
CHANGED
|
@@ -344,9 +344,176 @@ a.button {
|
|
|
344
344
|
}
|
|
345
345
|
/* Right-aligned: the trigger is the last thing in the header, so a menu
|
|
346
346
|
growing rightward from its left edge would leave the window. */
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
347
|
+
/* The settings dialog: pages down the left, one page's controls on the right. */
|
|
348
|
+
.settings-dialog {
|
|
349
|
+
background: var(--elevated);
|
|
350
|
+
border: 1px solid var(--border-strong);
|
|
351
|
+
border-radius: var(--radius-lg);
|
|
352
|
+
box-shadow: var(--shadow);
|
|
353
|
+
display: flex;
|
|
354
|
+
/* One size regardless of the page shown: a dialog that grows and shrinks
|
|
355
|
+
as you switch pages reads as two dialogs. The body scrolls instead. */
|
|
356
|
+
height: min(480px, 82vh);
|
|
357
|
+
overflow: hidden;
|
|
358
|
+
width: min(640px, 92vw);
|
|
359
|
+
}
|
|
360
|
+
.settings-nav {
|
|
361
|
+
border-right: 1px solid var(--border);
|
|
362
|
+
display: flex;
|
|
363
|
+
flex-direction: column;
|
|
364
|
+
flex: none;
|
|
365
|
+
gap: 2px;
|
|
366
|
+
padding: 14px 10px;
|
|
367
|
+
width: 168px;
|
|
368
|
+
}
|
|
369
|
+
.settings-nav-title {
|
|
370
|
+
color: var(--subtle);
|
|
371
|
+
font-size: 11px;
|
|
372
|
+
letter-spacing: 0.04em;
|
|
373
|
+
margin: 0 0 8px;
|
|
374
|
+
padding: 0 8px;
|
|
375
|
+
text-transform: uppercase;
|
|
376
|
+
}
|
|
377
|
+
.settings-nav-item {
|
|
378
|
+
background: transparent;
|
|
379
|
+
border: none;
|
|
380
|
+
border-radius: var(--radius-sm);
|
|
381
|
+
color: var(--muted);
|
|
382
|
+
cursor: pointer;
|
|
383
|
+
font: inherit;
|
|
384
|
+
font-size: 13px;
|
|
385
|
+
padding: 7px 8px;
|
|
386
|
+
text-align: left;
|
|
387
|
+
}
|
|
388
|
+
.settings-nav-item:hover {
|
|
389
|
+
color: var(--foreground);
|
|
390
|
+
}
|
|
391
|
+
.settings-nav-item[data-selected="true"] {
|
|
392
|
+
background: var(--active);
|
|
393
|
+
color: var(--foreground);
|
|
394
|
+
}
|
|
395
|
+
.settings-body {
|
|
396
|
+
display: flex;
|
|
397
|
+
flex: 1;
|
|
398
|
+
flex-direction: column;
|
|
399
|
+
gap: 18px;
|
|
400
|
+
min-width: 0;
|
|
401
|
+
overflow-y: auto;
|
|
402
|
+
padding: 14px 18px 20px;
|
|
403
|
+
}
|
|
404
|
+
.settings-body-head {
|
|
405
|
+
align-items: center;
|
|
406
|
+
display: flex;
|
|
407
|
+
justify-content: space-between;
|
|
408
|
+
}
|
|
409
|
+
.settings-body-title {
|
|
410
|
+
font-size: 15px;
|
|
411
|
+
font-weight: 600;
|
|
412
|
+
margin: 0;
|
|
413
|
+
}
|
|
414
|
+
.settings-group {
|
|
415
|
+
display: grid;
|
|
416
|
+
gap: 8px;
|
|
417
|
+
}
|
|
418
|
+
.settings-group-title {
|
|
419
|
+
color: var(--subtle);
|
|
420
|
+
font-size: 11px;
|
|
421
|
+
letter-spacing: 0.04em;
|
|
422
|
+
margin: 0;
|
|
423
|
+
text-transform: uppercase;
|
|
424
|
+
}
|
|
425
|
+
.settings-options {
|
|
426
|
+
display: grid;
|
|
427
|
+
gap: 2px;
|
|
428
|
+
}
|
|
429
|
+
.settings-option {
|
|
430
|
+
align-items: baseline;
|
|
431
|
+
background: transparent;
|
|
432
|
+
border: none;
|
|
433
|
+
border-radius: var(--radius-sm);
|
|
434
|
+
color: var(--muted);
|
|
435
|
+
cursor: pointer;
|
|
436
|
+
display: flex;
|
|
437
|
+
font: inherit;
|
|
438
|
+
font-size: 13px;
|
|
439
|
+
gap: 10px;
|
|
440
|
+
justify-content: space-between;
|
|
441
|
+
padding: 7px 9px;
|
|
442
|
+
text-align: left;
|
|
443
|
+
}
|
|
444
|
+
.settings-option:hover {
|
|
445
|
+
color: var(--foreground);
|
|
446
|
+
}
|
|
447
|
+
.settings-option[data-selected="true"] {
|
|
448
|
+
background: var(--active);
|
|
449
|
+
color: var(--foreground);
|
|
450
|
+
}
|
|
451
|
+
.settings-option-hint {
|
|
452
|
+
color: var(--subtle);
|
|
453
|
+
font-size: 11px;
|
|
454
|
+
}
|
|
455
|
+
.settings-note {
|
|
456
|
+
color: var(--subtle);
|
|
457
|
+
font-size: 12px;
|
|
458
|
+
line-height: 1.5;
|
|
459
|
+
margin: 0;
|
|
460
|
+
}
|
|
461
|
+
.settings-provider {
|
|
462
|
+
border: 1px solid var(--border);
|
|
463
|
+
border-radius: var(--radius);
|
|
464
|
+
display: grid;
|
|
465
|
+
gap: 10px;
|
|
466
|
+
padding: 12px 14px;
|
|
467
|
+
}
|
|
468
|
+
.settings-provider-head {
|
|
469
|
+
align-items: center;
|
|
470
|
+
display: flex;
|
|
471
|
+
gap: 12px;
|
|
472
|
+
justify-content: space-between;
|
|
473
|
+
}
|
|
474
|
+
.settings-provider-id {
|
|
475
|
+
display: grid;
|
|
476
|
+
gap: 3px;
|
|
477
|
+
min-width: 0;
|
|
478
|
+
}
|
|
479
|
+
.settings-provider-name {
|
|
480
|
+
font-size: 13px;
|
|
481
|
+
font-weight: 600;
|
|
482
|
+
}
|
|
483
|
+
.settings-provider-sub {
|
|
484
|
+
align-items: center;
|
|
485
|
+
color: var(--subtle);
|
|
486
|
+
display: flex;
|
|
487
|
+
font-size: 12px;
|
|
488
|
+
gap: 6px;
|
|
489
|
+
}
|
|
490
|
+
.settings-provider-sub a {
|
|
491
|
+
color: inherit;
|
|
492
|
+
}
|
|
493
|
+
.settings-provider-dot {
|
|
494
|
+
background: var(--subtle);
|
|
495
|
+
border-radius: 999px;
|
|
496
|
+
flex: none;
|
|
497
|
+
height: 6px;
|
|
498
|
+
width: 6px;
|
|
499
|
+
}
|
|
500
|
+
.settings-provider-sub[data-tone="ok"] .settings-provider-dot {
|
|
501
|
+
background: var(--success);
|
|
502
|
+
}
|
|
503
|
+
.settings-provider-form {
|
|
504
|
+
display: flex;
|
|
505
|
+
gap: 8px;
|
|
506
|
+
}
|
|
507
|
+
.settings-integration-input {
|
|
508
|
+
flex: 1;
|
|
509
|
+
min-width: 0;
|
|
510
|
+
background: var(--field, transparent);
|
|
511
|
+
border: 1px solid var(--border);
|
|
512
|
+
border-radius: 6px;
|
|
513
|
+
color: inherit;
|
|
514
|
+
font: inherit;
|
|
515
|
+
font-size: 12px;
|
|
516
|
+
padding: 6px 10px;
|
|
350
517
|
}
|
|
351
518
|
.menu-heading {
|
|
352
519
|
color: var(--subtle);
|
|
@@ -1894,3 +2061,109 @@ html[data-inspector="collapsed"] .main:not([data-single="true"]) {
|
|
|
1894
2061
|
margin-left: auto;
|
|
1895
2062
|
text-transform: uppercase;
|
|
1896
2063
|
}
|
|
2064
|
+
|
|
2065
|
+
/* Integrations: one provider per row, the key one-way by design. */
|
|
2066
|
+
.integrations-view {
|
|
2067
|
+
max-width: 640px;
|
|
2068
|
+
padding: 24px;
|
|
2069
|
+
display: grid;
|
|
2070
|
+
gap: 16px;
|
|
2071
|
+
}
|
|
2072
|
+
|
|
2073
|
+
.integration-list {
|
|
2074
|
+
list-style: none;
|
|
2075
|
+
margin: 12px 0 0;
|
|
2076
|
+
padding: 0;
|
|
2077
|
+
display: grid;
|
|
2078
|
+
gap: 12px;
|
|
2079
|
+
}
|
|
2080
|
+
|
|
2081
|
+
.integration {
|
|
2082
|
+
border: 1px solid var(--border);
|
|
2083
|
+
border-radius: 8px;
|
|
2084
|
+
padding: 14px 16px;
|
|
2085
|
+
display: grid;
|
|
2086
|
+
gap: 10px;
|
|
2087
|
+
}
|
|
2088
|
+
|
|
2089
|
+
.integration-head {
|
|
2090
|
+
display: flex;
|
|
2091
|
+
align-items: center;
|
|
2092
|
+
gap: 10px;
|
|
2093
|
+
}
|
|
2094
|
+
|
|
2095
|
+
.integration-title {
|
|
2096
|
+
font-weight: 600;
|
|
2097
|
+
}
|
|
2098
|
+
|
|
2099
|
+
.integration-docs {
|
|
2100
|
+
margin-left: auto;
|
|
2101
|
+
color: var(--muted);
|
|
2102
|
+
font-size: 12px;
|
|
2103
|
+
}
|
|
2104
|
+
|
|
2105
|
+
.integration-form {
|
|
2106
|
+
display: flex;
|
|
2107
|
+
gap: 8px;
|
|
2108
|
+
}
|
|
2109
|
+
|
|
2110
|
+
.integration-input {
|
|
2111
|
+
flex: 1;
|
|
2112
|
+
min-width: 0;
|
|
2113
|
+
background: var(--field, transparent);
|
|
2114
|
+
border: 1px solid var(--border);
|
|
2115
|
+
border-radius: 6px;
|
|
2116
|
+
padding: 6px 10px;
|
|
2117
|
+
color: inherit;
|
|
2118
|
+
font: inherit;
|
|
2119
|
+
font-size: 13px;
|
|
2120
|
+
}
|
|
2121
|
+
|
|
2122
|
+
.integration-usage {
|
|
2123
|
+
margin: 0;
|
|
2124
|
+
font-size: 12px;
|
|
2125
|
+
color: var(--muted);
|
|
2126
|
+
overflow-x: auto;
|
|
2127
|
+
}
|
|
2128
|
+
|
|
2129
|
+
/* Generate: prompt to registered role, the terminal's numbers rendered. */
|
|
2130
|
+
.generate-prompt {
|
|
2131
|
+
width: 100%;
|
|
2132
|
+
resize: vertical;
|
|
2133
|
+
background: var(--field, transparent);
|
|
2134
|
+
border: 1px solid var(--border);
|
|
2135
|
+
border-radius: 6px;
|
|
2136
|
+
padding: 8px 10px;
|
|
2137
|
+
color: inherit;
|
|
2138
|
+
font: inherit;
|
|
2139
|
+
font-size: 13px;
|
|
2140
|
+
}
|
|
2141
|
+
|
|
2142
|
+
.generate-controls {
|
|
2143
|
+
display: flex;
|
|
2144
|
+
align-items: end;
|
|
2145
|
+
gap: 10px;
|
|
2146
|
+
}
|
|
2147
|
+
|
|
2148
|
+
.generate-field {
|
|
2149
|
+
display: grid;
|
|
2150
|
+
gap: 4px;
|
|
2151
|
+
font-size: 11px;
|
|
2152
|
+
color: var(--muted);
|
|
2153
|
+
}
|
|
2154
|
+
|
|
2155
|
+
.generate-field input {
|
|
2156
|
+
background: var(--field, transparent);
|
|
2157
|
+
border: 1px solid var(--border);
|
|
2158
|
+
border-radius: 6px;
|
|
2159
|
+
padding: 5px 8px;
|
|
2160
|
+
color: inherit;
|
|
2161
|
+
font: inherit;
|
|
2162
|
+
font-size: 13px;
|
|
2163
|
+
width: 120px;
|
|
2164
|
+
}
|
|
2165
|
+
|
|
2166
|
+
.generate-report {
|
|
2167
|
+
display: grid;
|
|
2168
|
+
gap: 8px;
|
|
2169
|
+
}
|
|
@@ -2,6 +2,7 @@ import {resolveEntryLayout} from "odori";
|
|
|
2
2
|
import {project, videos} from "virtual:odori-project";
|
|
3
3
|
import {AudioClip} from "../components/AudioClip";
|
|
4
4
|
import {Empty, SectionTitle} from "../components/ui";
|
|
5
|
+
import {GenerateBed} from "../components/GenerateBed";
|
|
5
6
|
|
|
6
7
|
const isImage = (url: string) => /\.(png|jpe?g|gif|svg|webp|avif)$/i.test(url);
|
|
7
8
|
const isAudio = (url: string) => /\.(m4a|mp3|wav|aac|ogg|opus|flac)$/i.test(url);
|
|
@@ -88,6 +89,11 @@ export const AssetsView = () => {
|
|
|
88
89
|
)}
|
|
89
90
|
</section>
|
|
90
91
|
|
|
92
|
+
<section>
|
|
93
|
+
<SectionTitle>Generate a bed</SectionTitle>
|
|
94
|
+
<GenerateBed />
|
|
95
|
+
</section>
|
|
96
|
+
|
|
91
97
|
<section>
|
|
92
98
|
<SectionTitle>Fonts</SectionTitle>
|
|
93
99
|
{/* Studio's own chrome never loaded these faces, so a name rendered in
|
package/studio/src/virtual.d.ts
CHANGED
|
@@ -17,6 +17,7 @@ declare module "virtual:odori-project" {
|
|
|
17
17
|
exportDir: string;
|
|
18
18
|
audioDir: string;
|
|
19
19
|
audio: Array<{name: string; url: string; relativeFile: string; bytes: number}>;
|
|
20
|
+
version: string;
|
|
20
21
|
sourceHash: string;
|
|
21
22
|
assets: Array<{reference: string; url: string}>;
|
|
22
23
|
files: {
|