@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.
@@ -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
- .settings-menu {
348
- left: auto;
349
- right: 0;
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
@@ -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: {