返回 ppt-master
style.css
1 :root {
2 --bg: #12121f;
3 --card: #ffffff;
4 --ink: #1d2430;
5 --muted: #6b7280;
6 --line: #e3e6ea;
7 --accent: #4a9eff;
8 --accent-soft: #eaf4ff;
9 --shell: #16162a;
10 --shell-2: #12121f;
11 --shell-line: #2a2a4a;
12 --shell-ink: #e0e0e0;
13 --shell-muted: #8a8aaa;
14 --shell-hover: #2a2a4a;
15 --warning: #f5c542;
16 --radius: 10px;
17 --shadow: 0 4px 24px rgba(0, 0, 0, 0.22);
18 --ui-font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Arial, sans-serif;
19 }
20
21 * { box-sizing: border-box; }
22
23 html { height: 100%; }
24
25 html:lang(ja) {
26 --ui-font-family: "Hiragino Sans", "Hiragino Kaku Gothic ProN", "Yu Gothic UI",
27 "Yu Gothic", "Meiryo UI", Meiryo, "Noto Sans CJK JP", "Noto Sans JP", sans-serif;
28 }
29
30 html:lang(zh) {
31 --ui-font-family: "PingFang SC", "Microsoft YaHei UI", "Microsoft YaHei",
32 "Noto Sans CJK SC", "Noto Sans SC", "Hiragino Sans GB", sans-serif;
33 }
34
35 body {
36 margin: 0;
37 height: 100%;
38 background: #1a1a2e;
39 color: var(--ink);
40 font-family: var(--ui-font-family);
41 line-height: 1.5;
42 overflow: hidden;
43 }
44
45 button,
46 input,
47 select,
48 textarea {
49 font-family: inherit;
50 }
51
52 /* ---- fullscreen shell ---- */
53 #app {
54 display: flex;
55 width: 100vw;
56 height: 100vh;
57 min-width: 0;
58 }
59 #preview-panel {
60 flex: 0 0 clamp(360px, 38vw, 560px);
61 min-width: 0;
62 background: var(--shell);
63 color: var(--shell-ink);
64 border-right: 1px solid var(--shell-line);
65 display: flex;
66 flex-direction: column;
67 gap: 18px;
68 padding: 0;
69 overflow: hidden;
70 }
71 #control-panel {
72 flex: 1;
73 min-width: 0;
74 height: 100vh;
75 display: flex;
76 flex-direction: column;
77 background: var(--shell-2);
78 }
79 .brand-block {
80 display: flex;
81 align-items: center;
82 gap: 12px;
83 padding: 14px 16px;
84 border-bottom: 1px solid var(--shell-line);
85 flex: none;
86 }
87 .brand-mark {
88 flex: none;
89 width: 38px;
90 height: 38px;
91 border-radius: 9px;
92 display: grid;
93 place-items: center;
94 background: #1e3a5f;
95 color: #fff;
96 font-weight: 760;
97 letter-spacing: .03em;
98 }
99 .panel-kicker {
100 font-size: 11px;
101 letter-spacing: .08em;
102 text-transform: uppercase;
103 color: var(--shell-muted);
104 }
105 .panel-title {
106 margin-top: 2px;
107 font-size: 14px;
108 font-weight: 650;
109 line-height: 1.35;
110 }
111
112 /* ---- top bar ---- */
113 #topbar {
114 flex: none;
115 z-index: 10;
116 background: var(--shell);
117 border-bottom: 1px solid var(--shell-line);
118 }
119 #topbar-inner {
120 max-width: none;
121 margin: 0;
122 padding: 16px 24px;
123 display: flex;
124 align-items: center;
125 justify-content: space-between;
126 gap: 16px;
127 }
128 .topbar-titles h1 { margin: 0; font-size: 18px; font-weight: 650; }
129 .topbar-titles h1 { color: var(--shell-ink); }
130 .topbar-titles p { margin: 2px 0 0; font-size: 13px; color: var(--shell-muted); }
131 #topbar-preview:empty { display: none; }
132 #topbar-preview {
133 flex: 1;
134 min-height: 0;
135 overflow-y: auto;
136 padding: 0 16px 16px;
137 }
138 #topbar-preview .style-preview {
139 position: static;
140 background: transparent;
141 padding: 0;
142 margin: 0;
143 color: var(--ink);
144 }
145 #topbar-preview .style-preview + .style-preview {
146 margin-top: 18px;
147 padding-top: 18px;
148 border-top: 1px solid var(--shell-line);
149 }
150 #topbar-preview .style-preview-label {
151 margin-bottom: 10px;
152 }
153 #topbar-preview .style-preview-card {
154 box-shadow: none;
155 flex-direction: column;
156 align-items: stretch;
157 gap: 14px;
158 padding: 18px;
159 min-height: 260px;
160 background: #ffffff;
161 }
162 #topbar-preview .spl-title {
163 color: var(--shell-ink);
164 }
165 #topbar-preview .spl-note {
166 color: var(--shell-muted);
167 }
168 #topbar-preview .sp-title,
169 #topbar-preview .sp-body-wrap {
170 white-space: normal;
171 }
172 #topbar-preview .sp-chip {
173 align-self: stretch;
174 justify-content: flex-start;
175 }
176 #topbar-preview .sp-icon-mark {
177 width: 34px;
178 height: 34px;
179 }
180 #topbar-preview .sp-icon-mark svg {
181 width: 30px;
182 height: 30px;
183 max-width: 30px;
184 max-height: 30px;
185 }
186
187 .lang-select {
188 position: relative;
189 flex: none;
190 }
191 .lang-select-btn {
192 display: flex;
193 align-items: center;
194 justify-content: space-between;
195 gap: 6px;
196 height: 38px;
197 min-width: 118px;
198 padding: 0 12px;
199 border-radius: 4px;
200 border: 1px solid #3a3a5a;
201 background: #1e1e3a;
202 color: #c0c0d8;
203 font-size: 14px;
204 cursor: pointer;
205 }
206 .lang-select-btn:hover { color: #ffffff; background: var(--shell-hover); border-color: #5a5a7a; }
207 .lang-caret { font-size: 10px; color: #8a8aa8; }
208 .lang-menu {
209 position: absolute;
210 right: 0;
211 top: calc(100% + 6px);
212 margin: 0;
213 padding: 4px;
214 list-style: none;
215 min-width: 110px;
216 background: #1e1e3a;
217 border: 1px solid #3a3a5a;
218 border-radius: 6px;
219 box-shadow: 0 8px 20px rgba(0, 0, 0, 0.4);
220 z-index: 60;
221 }
222 .lang-menu li {
223 padding: 8px 12px;
224 border-radius: 6px;
225 font-size: 14px;
226 color: #c0c0d8;
227 cursor: pointer;
228 }
229 .lang-menu li:hover,
230 .lang-menu li:focus { background: var(--shell-hover); color: #ffffff; }
231 .lang-menu li.selected { color: #ffffff; font-weight: 650; }
232
233 /* ---- form ---- */
234 #form {
235 flex: 1;
236 min-height: 0;
237 max-width: none;
238 margin: 0;
239 padding: 24px 32px;
240 overflow-y: auto;
241 }
242 #sections {
243 max-width: 1220px;
244 margin: 0 auto;
245 }
246 #loading, #error { padding: 40px 0; text-align: center; color: var(--shell-muted); }
247 #error { color: #b42318; }
248
249 .section {
250 background: var(--card);
251 border: 1px solid var(--line);
252 border-radius: var(--radius);
253 box-shadow: var(--shadow);
254 padding: 18px 20px;
255 margin-bottom: 16px;
256 }
257 .section-head {
258 display: flex;
259 align-items: baseline;
260 gap: 10px;
261 flex-wrap: wrap;
262 margin-bottom: 14px;
263 }
264 .section-num {
265 flex: none;
266 width: 22px; height: 22px;
267 border-radius: 50%;
268 background: var(--accent-soft);
269 color: #1e4fa3;
270 font-size: 12px; font-weight: 700;
271 display: grid; place-items: center;
272 }
273 .section-title { font-size: 15px; font-weight: 620; }
274 .section-note { font-size: 12.5px; color: var(--muted); }
275
276 /* ---- generic controls ---- */
277 .chips { display: flex; flex-wrap: wrap; gap: 8px; }
278 .chip {
279 border: 1px solid var(--line);
280 background: var(--card);
281 border-radius: 8px;
282 padding: 7px 14px;
283 font-size: 13.5px;
284 line-height: 1.35;
285 cursor: pointer;
286 transition: all .12s ease;
287 max-width: 100%;
288 overflow-wrap: anywhere;
289 }
290 .chip:hover { border-color: var(--accent); }
291 .chip.selected {
292 border-color: var(--accent);
293 background: var(--accent-soft);
294 color: var(--accent);
295 font-weight: 600;
296 }
297 .chip-text { min-width: 0; }
298 .chip-copy { min-width: 0; }
299 .chip-with-preview {
300 width: 230px;
301 padding: 9px;
302 display: flex;
303 flex-direction: column;
304 gap: 8px;
305 align-items: stretch;
306 text-align: left;
307 }
308 .chip-with-preview .chip-text {
309 display: block;
310 font-size: 12.8px;
311 }
312 .chip-with-preview .rec-badge {
313 display: inline-block;
314 margin: 4px 0 0;
315 }
316 .chip-preview-visual_style {
317 width: min(100%, 430px);
318 flex-direction: row;
319 align-items: center;
320 }
321 .chip-preview-visual_style .option-preview {
322 flex: 0 0 clamp(116px, 36%, 160px);
323 }
324 .chip-preview-visual_style .chip-copy {
325 flex: 1;
326 }
327 .visual-style-grid {
328 display: grid;
329 grid-template-columns: repeat(2, minmax(0, 1fr));
330 align-items: stretch;
331 }
332 .visual-style-grid .chip-preview-visual_style {
333 width: 100%;
334 }
335 .option-preview {
336 width: 100%;
337 aspect-ratio: 16 / 9;
338 border: 1px solid var(--line);
339 border-radius: 7px;
340 overflow: hidden;
341 background: #fff;
342 }
343 .option-preview svg {
344 display: block;
345 width: 100%;
346 height: 100%;
347 }
348 .option-preview img {
349 display: block;
350 width: 100%;
351 height: 100%;
352 object-fit: cover;
353 }
354 .option-preview-icons { aspect-ratio: 16 / 7; }
355 .real-icon-preview {
356 height: 100%;
357 display: flex;
358 align-items: center;
359 justify-content: center;
360 padding: 8px;
361 background: #fff;
362 color: #2563eb;
363 }
364 .real-icon-sample {
365 min-width: 0;
366 display: flex;
367 flex-direction: column;
368 align-items: center;
369 justify-content: center;
370 gap: 6px;
371 }
372 .real-icon-mark {
373 width: 38px;
374 height: 38px;
375 display: grid;
376 place-items: center;
377 color: currentColor;
378 }
379 .real-icon-mark svg {
380 display: block;
381 width: 34px;
382 height: 34px;
383 max-width: 34px;
384 max-height: 34px;
385 overflow: visible;
386 }
387 .real-icon-preview-chunk-filled .real-icon-mark svg {
388 shape-rendering: crispEdges;
389 }
390 .real-icon-label {
391 max-width: 100%;
392 color: #64748b;
393 font-size: 9px;
394 line-height: 1.1;
395 text-align: center;
396 white-space: nowrap;
397 overflow: hidden;
398 text-overflow: ellipsis;
399 }
400
401 .text-input, .num-input {
402 width: 100%;
403 border: 1px solid var(--line);
404 border-radius: 8px;
405 padding: 9px 12px;
406 font-size: 14px;
407 font-family: inherit;
408 color: var(--ink);
409 }
410 .text-input:focus, .num-input:focus { outline: none; border-color: var(--accent); }
411 textarea.text-input { resize: vertical; line-height: 1.5; }
412 .num-input { width: 140px; }
413 .text-input.locked-field {
414 background: #f1f5f9;
415 color: #475569;
416 cursor: not-allowed;
417 }
418 .locked-field-hint { margin-top: 6px; }
419
420 /* ---- color candidates ---- */
421 .color-grid { display: flex; flex-wrap: wrap; gap: 12px; }
422 .color-card {
423 border: 2px solid var(--line);
424 border-radius: 10px;
425 padding: 10px;
426 cursor: pointer;
427 min-width: 150px;
428 transition: border-color .12s ease;
429 }
430 .color-card:hover { border-color: var(--accent); }
431 .color-card.selected { border-color: var(--accent); }
432 .swatches { display: flex; gap: 6px; margin-bottom: 8px; }
433 .swatch {
434 width: 34px; height: 34px;
435 border-radius: 7px;
436 border: 1px solid rgba(0,0,0,.06);
437 }
438 .color-name { font-size: 13.5px; font-weight: 600; }
439 .color-hex { font-size: 11.5px; color: var(--muted); font-family: ui-monospace, monospace; }
440 .color-note { font-size: 12px; color: var(--muted); margin-top: 4px; }
441
442 .hex-override { margin-top: 12px; display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
443 .hex-override label { font-size: 12.5px; color: var(--muted); }
444 .hex-override input {
445 width: 96px;
446 border: 1px solid var(--line);
447 border-radius: 6px;
448 padding: 5px 8px;
449 font-family: ui-monospace, monospace;
450 font-size: 12.5px;
451 }
452
453 /* ---- typography candidates ---- */
454 .font-grid { display: flex; flex-direction: column; gap: 10px; }
455 .font-card {
456 border: 2px solid var(--line);
457 border-radius: 10px;
458 padding: 12px 14px;
459 cursor: pointer;
460 transition: border-color .12s ease;
461 }
462 .font-card:hover { border-color: var(--accent); }
463 .font-card.selected { border-color: var(--accent); }
464 .font-card-head {
465 display: flex; align-items: baseline; gap: 10px;
466 margin-bottom: 8px;
467 }
468 .font-card-name { font-size: 13.5px; font-weight: 600; }
469 .font-card-meta { font-size: 11.5px; color: var(--muted); }
470 .design-direction-grid {
471 flex-direction: row;
472 flex-wrap: nowrap;
473 align-items: stretch;
474 overflow-x: auto;
475 padding-bottom: 2px;
476 }
477 .design-direction-card {
478 flex: 1 0 calc((100% - 20px) / 3);
479 min-width: 200px;
480 }
481 .design-direction-card.adjusted {
482 border-color: #d97706;
483 background: #fffbeb;
484 }
485 .design-direction-card.selected,
486 .design-direction-card.adjusted { cursor: default; }
487 .direction-status { margin-left: auto; }
488 .direction-reset-button {
489 margin-top: 10px;
490 border: 1px solid #d97706;
491 border-radius: 7px;
492 background: #fff;
493 color: #92400e;
494 padding: 6px 10px;
495 font-size: 12px;
496 font-weight: 650;
497 cursor: pointer;
498 }
499 .direction-reset-button:hover { background: #fef3c7; }
500 .direction-reset-button:focus-visible {
501 outline: 2px solid #d97706;
502 outline-offset: 2px;
503 }
504 .scheme-component-options { margin-bottom: 14px; }
505 .scheme-component-grid {
506 flex-direction: row;
507 flex-wrap: nowrap;
508 align-items: stretch;
509 overflow-x: auto;
510 padding-bottom: 2px;
511 }
512 .scheme-component-card {
513 flex: 1 0 calc((100% - 20px) / 3);
514 min-width: 190px;
515 }
516 .scheme-component-card.adjusted {
517 border-color: #d97706;
518 background: #fffbeb;
519 }
520 .scheme-component-editor {
521 margin-top: 8px;
522 min-height: 84px;
523 max-height: 380px;
524 overflow-y: auto;
525 font-size: 12px;
526 line-height: 1.5;
527 resize: none;
528 cursor: text;
529 }
530 .scheme-component-card .design-direction-preview { margin-top: 8px; }
531 .design-direction-preview {
532 width: 100%;
533 aspect-ratio: 16 / 9;
534 margin-bottom: 8px;
535 border: 1px solid var(--line);
536 border-radius: 8px;
537 overflow: hidden;
538 }
539 .design-direction-preview img { width: 100%; height: 100%; object-fit: cover; }
540 .design-direction-custom-preview {
541 display: flex;
542 flex-direction: column;
543 justify-content: center;
544 gap: 8px;
545 padding: 14px;
546 background: var(--accent-soft);
547 }
548 .design-direction-custom-label {
549 color: var(--accent);
550 font-size: 11px;
551 font-weight: 700;
552 letter-spacing: .04em;
553 }
554 .design-direction-custom-copy {
555 display: -webkit-box;
556 overflow: hidden;
557 color: var(--ink);
558 font-size: 12.5px;
559 line-height: 1.55;
560 -webkit-box-orient: vertical;
561 -webkit-line-clamp: 5;
562 }
563 .design-direction-swatches { display: flex; gap: 5px; margin-top: 8px; }
564 .design-direction-swatches .swatch { width: 24px; height: 24px; }
565 .locked-summary-chip { cursor: default; }
566 .locked-summary-chip:hover { border-color: var(--accent); }
567 .image-strategy-previews {
568 display: grid;
569 grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
570 gap: 8px;
571 margin: 8px 0 10px;
572 }
573 .image-strategy-picker { margin-top: 10px; }
574 .image-strategy-preview {
575 position: relative;
576 aspect-ratio: 16 / 9;
577 border: 1px solid var(--line);
578 border-radius: 8px;
579 overflow: hidden;
580 background: #fff;
581 }
582 .image-strategy-preview img {
583 display: block;
584 width: 100%;
585 height: 100%;
586 object-fit: cover;
587 }
588 .image-strategy-preview-label {
589 position: absolute;
590 left: 6px;
591 bottom: 6px;
592 padding: 2px 6px;
593 border-radius: 999px;
594 background: rgba(17, 24, 39, 0.74);
595 color: #fff;
596 font-size: 10.5px;
597 line-height: 1.4;
598 }
599 .image-strategy-preview-card {
600 flex-direction: column;
601 align-items: stretch;
602 }
603 .image-strategy-preview-visual {
604 width: 100%;
605 }
606 .image-strategy-preview-visual .image-strategy-previews {
607 grid-template-columns: 1fr;
608 margin: 0 0 12px;
609 }
610 .image-strategy-preview-visual .image-strategy-preview {
611 min-height: 150px;
612 }
613 .image-strategy-preview-empty {
614 padding: 14px 0 4px;
615 }
616 .image-strategy-custom-card {
617 background: var(--card);
618 margin-top: 10px;
619 }
620 .font-sample-heading { font-size: 24px; font-weight: 700; line-height: 1.3; }
621 .font-sample-body { font-size: 14px; color: #333; margin-top: 4px; }
622 .custom-typography-fields {
623 display: grid;
624 grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
625 gap: 10px;
626 margin-top: 8px;
627 }
628 .font-picker-head {
629 grid-column: 1 / -1;
630 display: flex;
631 align-items: center;
632 justify-content: space-between;
633 gap: 10px;
634 }
635 .font-picker-head .subfield-label { margin-bottom: 0; }
636 .font-picker-hint { grid-column: 1 / -1; }
637 .font-custom-status {
638 display: none;
639 align-items: center;
640 border-radius: 999px;
641 padding: 2px 8px;
642 background: var(--accent-soft);
643 color: var(--accent);
644 font-size: 11.5px;
645 font-weight: 650;
646 }
647 .custom-typography-legacy { grid-column: 1 / -1; }
648 .custom-typography-field { display: flex; flex-direction: column; gap: 4px; }
649 .font-select {
650 width: 100%;
651 border: 1px solid var(--line);
652 border-radius: 8px;
653 padding: 9px 12px;
654 background: var(--card);
655 color: var(--ink);
656 font-size: 14px;
657 }
658 .font-select:focus { outline: none; border-color: var(--accent); }
659 .other-font-input { margin-top: 2px; }
660 .custom-color-input { margin-top: 8px; min-height: 58px; resize: vertical; }
661 .image-strategy-custom-input { margin-top: 8px; min-height: 72px; resize: vertical; }
662 .image-usage-notes-input { min-height: 64px; resize: vertical; }
663 .font-size-row { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
664 .font-size-input { width: 96px; }
665 .font-size-unit {
666 color: var(--muted);
667 font-size: 12.5px;
668 font-weight: 600;
669 }
670 .body-size-relation { margin-bottom: 6px; }
671 .body-size-pt { margin-top: 6px; }
672 .body-size-hint { margin-top: 3px; }
673
674 .subfield { margin-top: 14px; }
675 .subfield-label { font-size: 12.5px; color: var(--muted); margin-bottom: 7px; }
676
677 /* ---- Stage 1 template selection ---- */
678 .template-mode-choices {
679 display: grid;
680 grid-template-columns: repeat(2, minmax(0, 1fr));
681 gap: 12px;
682 }
683 .template-mode-choice {
684 width: 100%;
685 display: flex;
686 align-items: flex-start;
687 gap: 11px;
688 border: 1px solid var(--line);
689 border-radius: 9px;
690 background: var(--card);
691 color: var(--ink);
692 padding: 11px 13px;
693 text-align: left;
694 cursor: pointer;
695 transition: border-color .12s ease, background .12s ease, box-shadow .12s ease;
696 }
697 .template-mode-choice:hover {
698 border-color: var(--accent);
699 }
700 .template-mode-choice:focus-visible {
701 outline: 2px solid var(--accent);
702 outline-offset: 2px;
703 }
704 .template-mode-choice.selected {
705 border-color: var(--accent);
706 background: var(--accent-soft);
707 box-shadow: 0 0 0 1px var(--accent);
708 }
709 .template-choice-radio {
710 flex: none;
711 width: 17px;
712 height: 17px;
713 margin-top: 2px;
714 border: 2px solid #aeb5bf;
715 border-radius: 50%;
716 background: #fff;
717 box-shadow: inset 0 0 0 3px #fff;
718 }
719 .template-mode-choice.selected .template-choice-radio {
720 border-color: var(--accent);
721 background: var(--accent);
722 }
723 .template-choice-copy {
724 min-width: 0;
725 display: flex;
726 flex-direction: column;
727 gap: 2px;
728 }
729 .template-choice-title {
730 font-size: 13.5px;
731 font-weight: 700;
732 line-height: 1.4;
733 }
734 .template-choice-desc {
735 color: var(--muted);
736 font-size: 12.5px;
737 line-height: 1.45;
738 }
739 .template-selector-panel {
740 margin-top: 16px;
741 padding-top: 14px;
742 border-top: 1px solid var(--line);
743 }
744 .template-selector-panel[hidden] {
745 display: none;
746 }
747 .template-selector-hint {
748 margin-bottom: 11px;
749 color: var(--muted);
750 font-size: 12.5px;
751 }
752 .template-select-grid {
753 display: grid;
754 grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
755 gap: 13px 16px;
756 }
757 .template-select-field {
758 min-width: 0;
759 }
760 .template-select-label {
761 display: block;
762 margin-bottom: 6px;
763 color: var(--ink);
764 font-size: 12.5px;
765 font-weight: 700;
766 }
767 .template-select {
768 width: 100%;
769 min-width: 0;
770 height: 40px;
771 border: 1px solid var(--line);
772 border-radius: 8px;
773 padding: 0 34px 0 11px;
774 background: var(--card);
775 color: var(--ink);
776 font-size: 13.5px;
777 }
778 .template-select:hover:not(:disabled) {
779 border-color: var(--accent);
780 }
781 .template-select:focus {
782 outline: none;
783 border-color: var(--accent);
784 box-shadow: 0 0 0 2px var(--accent-soft);
785 }
786 .template-select:disabled {
787 background: #f4f6f8;
788 color: #9aa1aa;
789 cursor: not-allowed;
790 }
791 .template-select-help {
792 margin-top: 6px;
793 color: var(--muted);
794 font-size: 11.5px;
795 line-height: 1.45;
796 }
797 .template-selected-path {
798 margin-top: 7px;
799 min-width: 0;
800 }
801 .template-selected-path[hidden] {
802 display: none;
803 }
804 .template-selected-path-label {
805 display: block;
806 margin-bottom: 2px;
807 color: var(--muted);
808 font-size: 10.5px;
809 font-weight: 700;
810 }
811 .template-selected-path-value {
812 display: block;
813 color: #475569;
814 font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
815 font-size: 11px;
816 line-height: 1.4;
817 overflow-wrap: anywhere;
818 white-space: normal;
819 }
820
821 /* ---- toggles ---- */
822 .toggle-row { display: flex; align-items: center; gap: 12px; }
823 .toggle-desc { font-size: 12.5px; color: var(--muted); }
824
825 /* ---- action bar ---- */
826 #actionbar {
827 flex: none;
828 background: var(--shell);
829 border-top: 1px solid var(--shell-line);
830 padding: 14px 24px;
831 display: flex;
832 align-items: center;
833 justify-content: flex-end;
834 gap: 16px;
835 }
836 #confirm-status {
837 min-height: 20px;
838 font-size: 13px;
839 color: var(--shell-muted);
840 }
841 #confirm-status.done { color: #067647; font-weight: 600; }
842 #btn-confirm {
843 border: none;
844 background: var(--warning);
845 color: #1a1a2e;
846 font-size: 14.5px;
847 font-weight: 600;
848 min-width: 132px;
849 padding: 10px 26px;
850 border-radius: 9px;
851 cursor: pointer;
852 }
853 #btn-confirm:hover { background: #e5b532; }
854 #btn-confirm:disabled { background: #6d6450; color: #b8b0a0; cursor: default; }
855
856 /* ---- custom input ---- */
857 .custom-input { margin-top: 8px; }
858 .custom-chip-row,
859 .standalone-chip-row { margin-top: 8px; }
860 .custom-chip-row .ai-custom-candidate { width: 100%; }
861 .ai-custom-candidate {
862 display: block;
863 width: 100%;
864 padding: 12px 14px;
865 text-align: left;
866 color: inherit;
867 font-weight: 400;
868 }
869 .ai-custom-candidate-head {
870 display: flex;
871 align-items: baseline;
872 gap: 10px;
873 flex-wrap: wrap;
874 }
875 .ai-custom-candidate-head .chip-text { font-weight: 650; }
876 .ai-custom-candidate-hint { font-size: 11.5px; color: var(--muted); }
877 .ai-custom-candidate-copy {
878 margin-top: 8px;
879 color: var(--ink);
880 font-size: 12.5px;
881 line-height: 1.55;
882 white-space: pre-wrap;
883 }
884 .ai-custom-candidate.selected .ai-custom-candidate-copy { color: inherit; }
885 .ai-custom-candidate .custom-input,
886 .ai-custom-candidate .image-strategy-custom-input {
887 width: 100%;
888 min-height: 86px;
889 margin-top: 8px;
890 resize: vertical;
891 }
892
893 /* ---- recommended chip + group labels ---- */
894 .chip.recommended {
895 border-color: var(--line);
896 box-shadow: none;
897 }
898 .rec-badge {
899 margin-left: 6px;
900 font-size: 10.5px;
901 font-weight: 700;
902 color: var(--muted);
903 }
904 .chip.selected .rec-badge { color: var(--accent); }
905 .group-label {
906 font-size: 11.5px;
907 color: var(--muted);
908 margin: 10px 0 5px;
909 letter-spacing: .02em;
910 }
911 .chips + .group-label { margin-top: 12px; }
912
913 /* ---- palette swatches with role labels ---- */
914 .swatches { display: flex; gap: 8px; margin-bottom: 8px; flex-wrap: wrap; }
915 .swatch-col { display: flex; flex-direction: column; align-items: center; gap: 3px; }
916 .swatch-role { font-size: 10px; color: var(--muted); }
917
918 /* ---- custom HEX grid ---- */
919 .hex-override { margin-top: 14px; }
920 .hex-row { display: flex; gap: 10px; flex-wrap: wrap; }
921 .hex-cell { display: flex; flex-direction: column; gap: 4px; }
922 .hex-cell-label { font-size: 11px; color: var(--muted); }
923 .hex-input-line { display: flex; align-items: center; gap: 6px; }
924 .role-size-line { display: flex; align-items: center; gap: 6px; }
925 .role-size-pt { min-height: 15px; font-size: 11px; color: var(--muted); }
926 .hex-cell input {
927 width: 92px;
928 border: 1px solid var(--line);
929 border-radius: 6px;
930 padding: 5px 8px;
931 font-family: ui-monospace, monospace;
932 font-size: 12.5px;
933 }
934 /* Live preview of the value typed into the HEX box. */
935 .hex-swatch {
936 flex: none;
937 width: 20px; height: 20px;
938 border-radius: 5px;
939 border: 1px solid var(--line);
940 }
941 .hex-swatch.hex-swatch-empty {
942 /* Subtle checker so an empty / invalid value reads as "no color" */
943 background:
944 linear-gradient(45deg, var(--line) 25%, transparent 25%, transparent 75%, var(--line) 75%) 0 0 / 10px 10px,
945 var(--card);
946 }
947
948 /* ---- typography primary-language / English previews ---- */
949 .font-sample-line { display: flex; align-items: baseline; gap: 16px; flex-wrap: wrap; }
950 .font-sample-heading-box .fs-primary { font-size: 24px; font-weight: 700; }
951 .font-sample-heading-box .fs-english { font-size: 22px; font-weight: 700; }
952 .font-sample-body-box { margin-top: 6px; }
953 .font-sample-body-box .fs-primary,
954 .font-sample-body-box .fs-english { font-size: 14px; color: #333; }
955 .font-card-meta { display: block; margin-top: 4px; }
956
957 /* ---- confirmed overlay ---- */
958 #confirmed-overlay {
959 position: fixed;
960 inset: 0;
961 background: rgba(17, 18, 29, 0.86);
962 display: flex;
963 align-items: center;
964 justify-content: center;
965 z-index: 50;
966 }
967 .cf-card {
968 background: var(--card);
969 border: 1px solid var(--line);
970 border-radius: 16px;
971 box-shadow: var(--shadow);
972 padding: 36px 44px;
973 text-align: center;
974 max-width: 420px;
975 }
976 .cf-title { font-size: 22px; font-weight: 700; color: #067647; }
977 .cf-hint { font-size: 14px; color: var(--muted); margin-top: 10px; line-height: 1.6; }
978
979 /* Combined color + typography "overall impression" preview — sticky strip
980 that rides along the color / icon / typography picking sections. */
981 .style-preview {
982 position: sticky;
983 z-index: 5;
984 background: var(--shell-2);
985 padding: 8px 0;
986 margin-bottom: 16px;
987 }
988 .style-preview-label {
989 display: flex;
990 flex-wrap: wrap;
991 align-items: baseline;
992 gap: 8px;
993 margin-bottom: 6px;
994 }
995 .spl-title { font-size: 12.5px; font-weight: 600; color: var(--muted); }
996 .spl-note { font-size: 11.5px; color: var(--muted); }
997 .style-preview-card {
998 border: 1px solid var(--line);
999 border-radius: var(--radius);
1000 box-shadow: var(--shadow);
1001 padding: 14px 18px;
1002 display: flex;
1003 align-items: center;
1004 gap: 16px;
1005 overflow: hidden;
1006 }
1007 .sp-textcol { flex: 1; min-width: 0; }
1008 .sp-title {
1009 font-weight: 700;
1010 line-height: 1.25;
1011 white-space: nowrap;
1012 overflow: hidden;
1013 text-overflow: ellipsis;
1014 }
1015 .sp-title-english { margin-left: 10px; opacity: 0.92; }
1016 .sp-body { display: flex; align-items: stretch; gap: 10px; margin-top: 6px; }
1017 .sp-accent-bar { flex: 0 0 4px; border-radius: 2px; }
1018 .sp-body-wrap {
1019 flex: 1;
1020 min-width: 0;
1021 line-height: 1.5;
1022 white-space: nowrap;
1023 overflow: hidden;
1024 text-overflow: ellipsis;
1025 }
1026 .sp-body-english { margin-left: 10px; opacity: 0.92; }
1027 .sp-content {
1028 display: grid;
1029 gap: 10px;
1030 }
1031 .sp-content-row {
1032 display: flex;
1033 align-items: flex-start;
1034 gap: 10px;
1035 padding: 10px;
1036 border: 1px solid rgba(0, 0, 0, 0.07);
1037 border-radius: 8px;
1038 background: rgba(255, 255, 255, 0.68);
1039 }
1040 .sp-content-icon {
1041 flex: none;
1042 width: 32px;
1043 height: 32px;
1044 display: grid;
1045 place-items: center;
1046 color: currentColor;
1047 }
1048 .sp-content-copy {
1049 min-width: 0;
1050 display: flex;
1051 flex-direction: column;
1052 gap: 3px;
1053 }
1054 .sp-content-copy b {
1055 font-size: 13px;
1056 line-height: 1.3;
1057 }
1058 .sp-content-copy small {
1059 color: #64748b;
1060 font-size: 11.5px;
1061 line-height: 1.45;
1062 }
1063 .sp-chip {
1064 flex: none;
1065 display: inline-flex;
1066 align-items: center;
1067 gap: 8px;
1068 padding: 7px 12px;
1069 border-radius: 8px;
1070 border: 1px solid rgba(0, 0, 0, 0.06);
1071 }
1072 .sp-chip-dot { width: 12px; height: 12px; border-radius: 50%; }
1073 .sp-chip-label { font-size: 12.5px; }
1074 .sp-icon-mark {
1075 width: 24px;
1076 height: 24px;
1077 display: grid;
1078 place-items: center;
1079 color: currentColor;
1080 }
1081 .sp-icon-mark svg {
1082 display: block;
1083 width: 22px;
1084 height: 22px;
1085 max-width: 22px;
1086 max-height: 22px;
1087 overflow: visible;
1088 }
1089 .sp-icon-emoji {
1090 font-size: 20px;
1091 line-height: 1;
1092 }
1093 .sp-icon-none {
1094 color: #64748b;
1095 font-size: 11px;
1096 white-space: nowrap;
1097 }
1098 .sp-icon-none-dot {
1099 width: 8px;
1100 height: 8px;
1101 border-radius: 50%;
1102 background: currentColor;
1103 opacity: .55;
1104 }
1105 .direction-preview-card {
1106 gap: 14px;
1107 }
1108 .direction-preview-visual {
1109 overflow: hidden;
1110 border: 1px solid var(--line);
1111 border-radius: 9px;
1112 background: #fff;
1113 }
1114 .direction-preview-visual svg,
1115 .direction-preview-visual img {
1116 display: block;
1117 width: 100%;
1118 aspect-ratio: 16 / 9;
1119 object-fit: cover;
1120 }
1121 .direction-preview-title {
1122 color: var(--ink);
1123 font-size: 16px;
1124 font-weight: 700;
1125 }
1126 .direction-preview-desc {
1127 margin-top: 4px;
1128 color: var(--muted);
1129 font-size: 12.5px;
1130 line-height: 1.55;
1131 }
1132
1133 @media (max-width: 1040px) {
1134 body {
1135 height: auto;
1136 overflow: auto;
1137 background: var(--shell-2);
1138 }
1139 #app {
1140 display: block;
1141 width: auto;
1142 height: auto;
1143 min-height: 100vh;
1144 }
1145 #preview-panel {
1146 width: auto;
1147 border: 0;
1148 border-bottom: 1px solid var(--shell-line);
1149 overflow: visible;
1150 padding: 0;
1151 }
1152 #control-panel {
1153 height: auto;
1154 min-height: 0;
1155 }
1156 #form {
1157 overflow: visible;
1158 padding: 20px;
1159 }
1160 #actionbar {
1161 position: sticky;
1162 bottom: 0;
1163 padding: 14px 20px;
1164 }
1165 .chip-with-preview {
1166 width: min(100%, 230px);
1167 }
1168 .chip-preview-visual_style {
1169 width: 100%;
1170 }
1171 .style-preview-card {
1172 flex-wrap: wrap;
1173 }
1174 .template-mode-choices {
1175 grid-template-columns: 1fr;
1176 }
1177 }
1178
1178 lines CSS