1136 lines
68 KiB
CSS
1136 lines
68 KiB
CSS
/* ── Script Rehearser ───────────────────────────────────────────────────── */
|
|
.reh-phase[hidden] { display: none; }
|
|
|
|
/* ── IMSDb browser modal ────────────────────────────────────────────────── */
|
|
.reh-imsdb-modal {
|
|
position: fixed; inset: 0; z-index: 1000;
|
|
background: rgba(0,0,0,.55); display: flex; align-items: center; justify-content: center;
|
|
padding: 24px;
|
|
}
|
|
.reh-imsdb-modal[hidden] { display: none; }
|
|
.reh-imsdb-box {
|
|
background: var(--bg); border: 1px solid var(--border); border-radius: 14px;
|
|
width: 100%; max-width: 1100px; height: 88vh; display: flex; flex-direction: column;
|
|
box-shadow: 0 20px 60px rgba(0,0,0,.4); overflow: hidden;
|
|
}
|
|
.reh-imsdb-head {
|
|
display: flex; align-items: center; gap: 12px; padding: 14px 18px;
|
|
border-bottom: 1px solid var(--border); flex-shrink: 0;
|
|
}
|
|
.reh-imsdb-head h3 { margin: 0; font-size: 15px; display: flex; align-items: center; gap: 7px; white-space: nowrap; }
|
|
.reh-imsdb-url-row { display:flex; align-items:center; gap:8px; padding:10px 18px; border-bottom:1px solid var(--border); background:var(--panel); }
|
|
.reh-imsdb-url-row .reh-imsdb-url-input { flex:1; min-width:0; height:32px; padding:0 10px; border:1px solid var(--border); border-radius:7px; background:var(--surface); color:var(--text); font-size:13px; }
|
|
.reh-imsdb-search {
|
|
flex: 1; height: 34px; padding: 0 12px; border: 1px solid var(--border);
|
|
border-radius: 8px; background: var(--input-bg, var(--panel)); color: var(--text); font-size: 13px;
|
|
}
|
|
.reh-imsdb-count { font-size: 12px; color: var(--subtext); white-space: nowrap; }
|
|
.reh-imsdb-grid {
|
|
flex: 1; overflow-y: auto; padding: 16px;
|
|
display: grid; grid-template-columns: repeat(auto-fill, minmax(140px, 1fr)); gap: 14px;
|
|
align-content: start;
|
|
}
|
|
.reh-imsdb-loading { grid-column: 1/-1; text-align: center; padding: 40px; color: var(--subtext); font-size: 13px; display: flex; align-items: center; justify-content: center; gap: 10px; }
|
|
.reh-imsdb-load-error { grid-column: 1/-1; margin-bottom: 8px; padding: 10px 12px; border: 1px solid var(--red); border-left-width: 5px; border-radius: 8px; color: var(--red); background: rgba(220,38,38,.08); font-size: 13px; font-weight: 700; }
|
|
.reh-scripts-link { white-space: nowrap; }
|
|
.reh-imsdb-card {
|
|
cursor: pointer; border-radius: 8px; overflow: hidden; background: var(--card-bg, var(--panel));
|
|
border: 1px solid var(--border); transition: transform .12s, box-shadow .12s, border-color .12s;
|
|
display: flex; flex-direction: column;
|
|
}
|
|
.reh-imsdb-card:hover { transform: translateY(-3px); box-shadow: 0 8px 20px rgba(0,0,0,.25); border-color: var(--accent); }
|
|
/* Poster image: use padding-bottom trick for guaranteed 2:3 ratio regardless of parent */
|
|
.reh-imsdb-poster-wrap {
|
|
position: relative; width: 100%; padding-bottom: 150%; /* 2:3 ratio */ overflow: hidden; flex-shrink: 0;
|
|
}
|
|
.reh-imsdb-poster {
|
|
position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; display: block;
|
|
}
|
|
.reh-imsdb-fallback {
|
|
position: absolute; inset: 0; width: 100%; height: 100%;
|
|
display: flex; flex-direction: column; align-items: center; justify-content: center;
|
|
gap: 6px; color: rgba(255,255,255,.85); font-size: 28px; padding: 10px; box-sizing: border-box;
|
|
}
|
|
.reh-imsdb-fallback-title {
|
|
font-size: 11px; font-weight: 700; text-align: center; line-height: 1.35;
|
|
color: rgba(255,255,255,.95); text-shadow: 0 1px 4px rgba(0,0,0,.5);
|
|
overflow: hidden; display: -webkit-box;
|
|
-webkit-line-clamp: 4; -webkit-box-orient: vertical;
|
|
word-break: break-word; padding: 0 4px; max-width: 100%;
|
|
}
|
|
.reh-imsdb-meta { padding: 7px 9px; display: flex; flex-direction: column; gap: 2px; }
|
|
.reh-imsdb-title { font-size: 12px; font-weight: 600; color: var(--text); line-height: 1.25;
|
|
display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
|
|
.reh-imsdb-year { font-size: 11px; color: var(--subtext); }
|
|
|
|
/* IMSDb list view */
|
|
.reh-imsdb-grid.list-view {
|
|
display: flex; flex-direction: column; gap: 4px; padding: 12px 16px;
|
|
}
|
|
.reh-imsdb-grid.list-view .reh-imsdb-card {
|
|
flex-direction: row; align-items: center; gap: 0; height: 48px; border-radius: 6px;
|
|
}
|
|
.reh-imsdb-grid.list-view .reh-imsdb-card:hover { transform: none; box-shadow: 0 2px 8px rgba(0,0,0,.15); }
|
|
.reh-imsdb-grid.list-view .reh-imsdb-poster-wrap {
|
|
width: 32px; min-width: 32px; height: 48px; padding-bottom: 0; flex-shrink: 0;
|
|
}
|
|
.reh-imsdb-grid.list-view .reh-imsdb-fallback {
|
|
font-size: 13px; gap: 0;
|
|
}
|
|
.reh-imsdb-grid.list-view .reh-imsdb-fallback-title { display: none; }
|
|
.reh-imsdb-grid.list-view .reh-imsdb-poster {
|
|
position: static; width: 32px; height: 48px; object-fit: cover;
|
|
}
|
|
.reh-imsdb-grid.list-view .reh-imsdb-meta {
|
|
flex-direction: row; align-items: center; gap: 8px; padding: 0 12px; flex: 1; min-width: 0;
|
|
}
|
|
.reh-imsdb-grid.list-view .reh-imsdb-title {
|
|
display:block; min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; color:var(--text); -webkit-line-clamp: unset; font-size: 13px; flex: 1;
|
|
}
|
|
.reh-imsdb-grid.list-view .reh-imsdb-card { background:var(--surface); }
|
|
.reh-imsdb-grid.list-view .reh-imsdb-year { margin-left: auto; white-space: nowrap; font-size: 11px; }
|
|
|
|
/* View toggle buttons in modal header */
|
|
.reh-imsdb-view-btns {
|
|
display: flex; gap: 2px; flex-shrink: 0;
|
|
}
|
|
.reh-imsdb-view-btn {
|
|
background: none; border: 1px solid var(--border); border-radius: 6px;
|
|
padding: 4px 8px; cursor: pointer; color: var(--subtext); font-size: 15px;
|
|
transition: background .12s, color .12s;
|
|
}
|
|
.reh-imsdb-view-btn:hover { background: var(--panel); color: var(--text); }
|
|
.reh-imsdb-view-btn.active { background: var(--accent); border-color: var(--accent); color: #fff; }
|
|
|
|
/* Loading spinner */
|
|
@keyframes reh-spin { to { transform: rotate(360deg); } }
|
|
.reh-imsdb-spinner {
|
|
display: inline-block; width: 16px; height: 16px; border-radius: 50%;
|
|
border: 2px solid var(--border); border-top-color: var(--accent);
|
|
animation: reh-spin .7s linear infinite; flex-shrink: 0;
|
|
}
|
|
|
|
/* ── Page break marker ──────────────────────────────────────────────────── */
|
|
.reh-block-pagebreak {
|
|
display: flex; align-items: center; justify-content: center;
|
|
padding: 6px 0; margin: 4px 0; gap: 10px;
|
|
}
|
|
.reh-block-pagebreak::before, .reh-block-pagebreak::after {
|
|
content: ''; flex: 1; height: 1px; background: var(--border);
|
|
}
|
|
.reh-pagebreak-label {
|
|
font-size: 10px; color: var(--subtext); white-space: nowrap; letter-spacing: .04em;
|
|
}
|
|
|
|
/* ── Scroll mode (no A4 paper) ──────────────────────────────────────────── */
|
|
.reh-page-wrap:not(.paginated) .reh-a4-page {
|
|
box-shadow: none; border: none; border-radius: 0; min-height: unset;
|
|
padding: 24px 32px;
|
|
}
|
|
|
|
/* ── Train Mode ─────────────────────────────────────────────────────────── */
|
|
.reh-train-panel {
|
|
display: flex; flex-direction: column; gap: 10px;
|
|
padding: 12px 16px 16px;
|
|
}
|
|
.reh-train-header {
|
|
display: flex; align-items: center; gap: 10px; flex-shrink: 0;
|
|
}
|
|
.reh-train-badge {
|
|
display: inline-flex; align-items: center; gap: 5px;
|
|
font-size: 11px; font-weight: 800; letter-spacing: .08em;
|
|
color: var(--accent); background: rgba(37,99,235,.1);
|
|
border: 1px solid rgba(37,99,235,.25); border-radius: 6px; padding: 3px 10px;
|
|
}
|
|
.reh-train-progress { font-size: 13px; color: var(--subtext); font-variant-numeric: tabular-nums; }
|
|
.reh-train-cue, .reh-train-myline, .reh-train-rec, .reh-train-result { flex-shrink: 0; }
|
|
.reh-train-cue.no-cue { border-style: dashed; opacity: .7; }
|
|
.reh-train-cue.no-cue .reh-train-cue-text { color: var(--subtext); font-style: italic; }
|
|
.reh-train-cue-head, .reh-train-myline-head {
|
|
display: flex; align-items: center; gap: 8px; margin-bottom: 8px;
|
|
}
|
|
.reh-train-cue-avatar { display: inline-flex; flex-shrink: 0; }
|
|
.reh-train-cue-speaker { font-size: 13px; font-weight: 700; color: var(--text); }
|
|
.reh-train-cue-tag {
|
|
font-size: 10px; font-weight: 700; letter-spacing: .06em;
|
|
background: rgba(37,99,235,.1); color: var(--accent);
|
|
border-radius: 4px; padding: 1px 7px; margin-left: 2px;
|
|
}
|
|
.reh-train-me-tag { background: rgba(16,185,129,.1); color: var(--green); }
|
|
.reh-train-cue-state { margin-left: auto; font-size: 12px; }
|
|
.reh-train-cue-text { font-size: 14px; line-height: 1.55; }
|
|
.reh-train-cue-block { display: flex; flex-direction: column; gap: 2px; margin-bottom: 8px; }
|
|
.reh-train-cue-block:last-child { margin-bottom: 0; }
|
|
.reh-train-cue-who { font-size: 11px; font-weight: 700; letter-spacing: .04em; text-transform: uppercase; }
|
|
.reh-train-cue-line { font-style: italic; color: var(--subtext); }
|
|
.reh-train-my-text { font-size: 16px; color: var(--text); line-height: 1.6; font-weight: 600; min-height: 2em; }
|
|
.reh-train-rec-head {
|
|
display: flex; align-items: center; gap: 10px; font-size: 13px; font-weight: 600;
|
|
color: var(--text); margin-bottom: 6px;
|
|
}
|
|
.reh-train-rec-state { flex: 1; }
|
|
.reh-train-rec-timer { font-variant-numeric: tabular-nums; color: var(--red); font-weight: 700; font-size: 13px; }
|
|
.reh-train-meters { margin-top: 6px; }
|
|
.reh-train-result-head {
|
|
display: flex; align-items: center; gap: 8px;
|
|
font-size: 13px; font-weight: 700; color: var(--text); margin-bottom: 10px;
|
|
}
|
|
.reh-train-score { margin-left: auto; font-size: 15px; }
|
|
.reh-train-compare-row { display: flex; align-items: baseline; gap: 10px; margin-bottom: 6px; flex-wrap: wrap; }
|
|
.reh-train-compare-lbl { font-size: 11px; font-weight: 700; color: var(--subtext); white-space: nowrap; min-width: 58px; }
|
|
.reh-train-compare-text { font-size: 14px; line-height: 1.7; flex: 1; }
|
|
.tw-ok { color: var(--green); }
|
|
.tw-miss { color: var(--red); text-decoration: line-through; }
|
|
.tw-extra{ color: #f59e0b; }
|
|
.reh-train-controls {
|
|
display: flex; align-items: center; justify-content: center; gap: 10px;
|
|
margin-top: 4px; flex-shrink: 0; padding: 8px 0;
|
|
border-top: 1px solid var(--border);
|
|
}
|
|
.reh-train-rec-btn { color: var(--red) !important; }
|
|
.reh-impex-cat { font-size: 13px; font-weight: 700; color: var(--subtext); text-transform: uppercase; letter-spacing: .05em; margin: 16px 0 10px; }
|
|
.reh-impex-note { font-size: 12px; color: var(--subtext); margin: -4px 0 10px; }
|
|
.reh-impex-grid { display: flex; flex-wrap: wrap; gap: 10px; }
|
|
.reh-impex-btn {
|
|
display: inline-flex; flex-direction: column; align-items: center; justify-content: center;
|
|
gap: 6px; padding: 14px 18px; min-width: 100px;
|
|
background: var(--card-bg); border: 1px solid var(--border); border-radius: 10px;
|
|
color: var(--text); font-size: 12px; font-weight: 600; cursor: pointer;
|
|
transition: border-color .15s, background .15s; text-align: center;
|
|
}
|
|
.reh-impex-btn .mdi { font-size: 22px; color: var(--accent); }
|
|
.reh-impex-btn:hover { border-color: var(--accent); background: rgba(var(--accent-rgb),.07); }
|
|
.reh-impex-btn--accent { border-color: rgba(var(--accent-rgb),.35); }
|
|
|
|
/* Library */
|
|
.reh-lib-header { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin-bottom: 14px; flex-wrap: wrap; }
|
|
.reh-lib-list { display: flex; flex-direction: column; gap: 8px; }
|
|
.reh-lib-empty { display: flex; flex-direction: column; align-items: center; gap: 8px; padding: 28px 0; color: var(--subtext); }
|
|
.reh-lib-empty .mdi { font-size: 36px; opacity: .4; }
|
|
.reh-lib-empty p { text-align: center; font-size: 13px; line-height: 1.5; margin: 0; }
|
|
.reh-lib-row { display: flex; align-items: center; gap: 12px; padding: 10px 12px; background: var(--panel); border: 1px solid var(--border); border-radius: 8px; flex-wrap: wrap; }
|
|
|
|
/* Phase 2 backend row */
|
|
.reh-cast2-backend { display: flex; gap: 10px; align-items: flex-end; margin-bottom: 14px; flex-wrap: wrap; }
|
|
.reh-narrator-row { display: flex; align-items: center; gap: 10px; padding: 8px 0; margin-bottom: 8px; border-top: 1px solid var(--border); flex-wrap: wrap; }
|
|
.reh-cast-instruct-wrap { padding: 0 12px 8px; margin-top: -4px; }
|
|
.reh-cast-instruct { width: 100%; font-size: 11px; padding: 4px 8px; border: 1px solid var(--border); border-radius: 4px; background: var(--surface); color: var(--subtext); font-family: var(--font); }
|
|
.reh-cast-instruct:focus { outline: none; border-color: var(--accent); color: var(--text); }
|
|
.reh-lib-current { border-color: var(--accent); background: rgba(137,180,250,.06); }
|
|
.reh-lib-row-main { display: flex; align-items: center; gap: 10px; flex: 1; min-width: 0; }
|
|
.reh-lib-avatars { display: flex; gap: 4px; flex-shrink: 0; }
|
|
.reh-lib-info { min-width: 0; flex: 1; }
|
|
.reh-lib-info strong { display: block; font-size: 14px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
|
|
.reh-lib-progress-wrap { height: 3px; background: var(--border); border-radius: 2px; overflow: hidden; margin-top: 5px; }
|
|
.reh-lib-progress { height: 100%; background: var(--accent); }
|
|
.reh-lib-row-actions { display: flex; gap: 6px; align-items: center; flex-shrink: 0; }
|
|
|
|
/* Phase 1 */
|
|
.reh-new-script-head {
|
|
display: flex; align-items: center; gap: 14px; margin-bottom: 6px; flex-wrap: wrap;
|
|
}
|
|
.reh-script-title-inline {
|
|
flex: 1; min-width: 160px; max-width: 360px;
|
|
height: 32px; padding: 0 10px; border: 1px solid var(--border); border-radius: 6px;
|
|
background: var(--input-bg, var(--surface)); color: var(--text); font-size: 14px;
|
|
font-weight: 600; transition: border-color .15s;
|
|
}
|
|
.reh-script-title-inline:focus { outline: none; border-color: var(--accent); }
|
|
.reh-input-row { display: grid; grid-template-columns: 1fr 200px; gap: 14px; align-items: start; }
|
|
.reh-input-row textarea { min-height: 220px; font-family: monospace; font-size: 13px; width: 100%; resize: vertical; background: var(--surface); border: 1px solid var(--border); border-radius: 6px; padding: 10px; color: var(--text); }
|
|
.reh-input-side { display: flex; flex-direction: column; gap: 8px; }
|
|
|
|
/* ── Cast list: toolbar + Card/List view toggle ───────────────────────────── */
|
|
.reh-cast-toolbar { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin-bottom: 12px; flex-wrap: wrap; }
|
|
.reh-cast-count { font-size: 13px; color: var(--subtext); font-weight: 600; }
|
|
.reh-view-toggle { display: inline-flex; border: 1px solid var(--border); border-radius: 9px; overflow: hidden; background: var(--panel); }
|
|
.reh-view-btn { display: inline-flex; align-items: center; gap: 5px; padding: 7px 14px; border: none; background: transparent; color: var(--subtext); font-size: 13px; font-weight: 600; cursor: pointer; font-family: var(--font); transition: background .12s, color .12s; }
|
|
.reh-view-btn + .reh-view-btn { border-left: 1px solid var(--border); }
|
|
.reh-view-btn:hover { color: var(--text); }
|
|
.reh-view-btn.active { background: var(--accent); color: #fff; }
|
|
.reh-view-btn .mdi { font-size: 16px; }
|
|
.reh-cast-controls { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; flex: 1; min-width: 0; justify-content: center; }
|
|
.reh-cast-ctl { font-size: 13px; padding: 6px 9px; border: 1px solid var(--border); border-radius: 8px; background: var(--panel); color: var(--text); font-family: var(--font); }
|
|
.reh-cast-ctl:focus { outline: none; border-color: var(--accent); }
|
|
.reh-cast-search { min-width: 150px; flex: 1 1 150px; max-width: 240px; }
|
|
.reh-cast-sortdir { display: inline-flex; align-items: center; justify-content: center; width: 34px; padding: 6px; cursor: pointer; color: var(--subtext); }
|
|
.reh-cast-sortdir:hover { color: var(--accent); border-color: var(--accent); }
|
|
.reh-cast-sortdir .mdi { font-size: 17px; }
|
|
|
|
/* ── Cast cards (shared) ──────────────────────────────────────────────────── */
|
|
.reh-cast-card { background: var(--panel); border: 1px solid var(--border); border-radius: 14px; display: flex; flex-direction: column; transition: border-color .15s, opacity .15s, box-shadow .15s; }
|
|
.reh-cast-card.reh-cast-narrator { border-color: var(--accent); }
|
|
.reh-cast-card.reh-cast-ignored { opacity: .5; }
|
|
.reh-cast-card.reh-cast-hidden-c { outline: 1px dashed var(--border); }
|
|
.reh-cc-head { display: flex; gap: 12px; }
|
|
.reh-cc-avatar { flex-shrink: 0; }
|
|
/* rounded-square portrait (not a circle) — overrides the inline border-radius:50% */
|
|
.reh-cc-avatar .reh-char-img, .reh-cc-avatar span, .reh-cc-avatar img { width: 64px !important; height: 64px !important; font-size: 28px !important; border-radius: 12px !important; }
|
|
.reh-cc-titles { flex: 1; min-width: 0; }
|
|
.reh-cc-name { font-size: 16px; font-weight: 800; line-height: 1.15; white-space: normal; overflow-wrap: anywhere; word-break: break-word; }
|
|
.reh-cc-sub { font-size: 12px; color: var(--subtext); margin-top: 3px; line-height: 1.3; }
|
|
.reh-cc-voicechip { display: inline-flex; align-items: center; gap: 5px; margin-top: 7px; font-size: 11px; font-weight: 600; color: var(--accent); background: color-mix(in srgb, var(--accent) 12%, transparent); padding: 3px 9px; border-radius: 999px; max-width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
.reh-cc-voicechip.empty { color: var(--subtext); background: var(--surface); }
|
|
.reh-cc-sample-btn { margin-top: 7px; display: inline-flex; align-items: center; gap: 5px; font-size: 11px; font-weight: 600; padding: 4px 10px; border-radius: 999px; border: 1px solid var(--accent); background: color-mix(in srgb, var(--accent) 8%, transparent); color: var(--accent); cursor: pointer; font-family: var(--font); transition: background .12s; }
|
|
.reh-cc-sample-btn:hover { background: color-mix(in srgb, var(--accent) 16%, transparent); }
|
|
.reh-cc-sample-btn.playing { background: var(--accent); color: #fff; }
|
|
.reh-cc-sample-btn.loading { pointer-events: none; opacity: .8; }
|
|
.reh-cc-sample-btn.loading .mdi { animation: spin .8s linear infinite; }
|
|
.reh-cc-sample-btn .mdi { font-size: 13px; }
|
|
.reh-cc-voicechip .mdi { font-size: 13px; }
|
|
.reh-cc-occupation { font-size: 11.5px; color: var(--subtext); font-style: italic; margin-top: 2px; line-height: 1.3; }
|
|
.reh-cc-emotions { display: flex; flex-wrap: wrap; gap: 4px; margin-top: 7px; }
|
|
.reh-cc-emo-chip {
|
|
font-size: 10.5px; font-weight: 600; padding: 2px 7px; border-radius: 999px;
|
|
background: var(--panel); border: 1px solid var(--border); color: var(--text); white-space: nowrap;
|
|
}
|
|
.reh-cc-actions { display: flex; align-items: center; gap: 5px; }
|
|
.reh-cc-actions-spacer { flex: 1; }
|
|
.reh-cc-me-row { display: inline-flex; align-items: center; gap: 6px; font-size: 12px; color: var(--subtext); cursor: pointer; white-space: nowrap; }
|
|
.reh-cc-me-row:hover { color: var(--text); }
|
|
.reh-cc-me-row .mdi { font-size: 15px; }
|
|
.reh-cc-extra { display: flex; flex-direction: column; gap: 8px; }
|
|
|
|
/* ── Card view: "character card" look ─────────────────────────────────────── */
|
|
.reh-cast-view-card { display: grid; grid-template-columns: repeat(auto-fill, minmax(340px, 1fr)); gap: 16px; }
|
|
.reh-cast-view-card .reh-cast-card { overflow: hidden; }
|
|
.reh-cast-view-card .reh-cast-card:hover { box-shadow: 0 6px 22px rgba(0,0,0,.10); }
|
|
.reh-cast-view-card .reh-cc-head { flex-direction: column; align-items: center; text-align: center; gap: 10px; padding: 22px 18px 16px; background: linear-gradient(180deg, color-mix(in srgb, var(--cc-color, var(--accent)) 24%, var(--panel)), var(--panel)); border-bottom: 1px solid var(--border); }
|
|
.reh-cast-view-card .reh-cc-titles { flex: none; display: flex; flex-direction: column; align-items: center; }
|
|
.reh-cast-view-card .reh-cc-avatar .reh-char-img, .reh-cast-view-card .reh-cc-avatar span, .reh-cast-view-card .reh-cc-avatar img { width: 104px !important; height: 104px !important; font-size: 44px !important; border-width: 3px !important; box-shadow: 0 4px 14px rgba(0,0,0,.20); }
|
|
.reh-cast-view-card .reh-cc-name { font-size: 22px; }
|
|
.reh-cast-view-card .reh-cc-actions { padding: 10px 16px; border-bottom: 1px solid var(--border); }
|
|
.reh-cast-view-card .reh-cc-body { padding: 14px 16px 16px; gap: 10px; }
|
|
|
|
/* ── List view: compact rows ──────────────────────────────────────────────── */
|
|
.reh-cast-view-list { display: flex; flex-direction: column; gap: 8px; }
|
|
.reh-cast-view-list .reh-cast-card { flex-direction: row; align-items: center; flex-wrap: wrap; gap: 14px; padding: 10px 14px; border-radius: 10px; }
|
|
.reh-cast-view-list .reh-cc-head { flex: 1; min-width: 200px; align-items: center; gap: 12px; padding: 0; background: none; border: none; }
|
|
.reh-cast-view-list .reh-cc-avatar .reh-char-img, .reh-cast-view-list .reh-cc-avatar span, .reh-cast-view-list .reh-cc-avatar img { width: 52px !important; height: 52px !important; font-size: 22px !important; }
|
|
.reh-cast-view-list .reh-cc-titles { flex: 1; }
|
|
.reh-cast-view-list .reh-cc-name { font-size: 16px; }
|
|
.reh-cast-view-list .reh-cc-voicechip { margin-top: 4px; }
|
|
.reh-cast-view-list .reh-cc-body { order: 2; flex: 0 0 240px; padding: 0; }
|
|
.reh-cast-view-list .reh-cc-extra { display: none; } /* full editor lives in Card view */
|
|
.reh-cast-view-list .reh-cc-voice > label { display: none; }
|
|
.reh-cast-view-list .reh-cc-actions { order: 3; padding: 0; }
|
|
.reh-cast-view-list .reh-cc-actions-spacer { display: none; }
|
|
@media (max-width: 620px) {
|
|
.reh-cast-view-list .reh-cc-body { flex-basis: 100%; }
|
|
}
|
|
/* ── Online voice picker (try / alternatives / agree) ─────────────────────── */
|
|
.reh-cc-online { border: 1px solid var(--border); border-radius: 9px; background: var(--surface); padding: 9px; display: flex; flex-direction: column; gap: 7px; }
|
|
.reh-cc-online-head { font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: .04em; color: var(--subtext); display: flex; align-items: center; gap: 6px; }
|
|
.reh-vo-toggle { margin-left: auto; background: none; border: none; color: var(--accent); font-size: 11px; font-weight: 700; cursor: pointer; font-family: inherit; }
|
|
.reh-vo-list { display: flex; flex-direction: column; gap: 6px; }
|
|
.reh-vo-row { display: flex; align-items: center; gap: 8px; padding: 6px 7px; border-radius: 7px; border: 1px solid transparent; }
|
|
.reh-vo-row.current { border-color: var(--accent); background: color-mix(in srgb, var(--accent) 8%, var(--surface)); }
|
|
.reh-vo-play { flex-shrink: 0; width: 30px; height: 30px; border-radius: 50%; border: 1px solid var(--border); background: var(--panel); color: var(--accent); cursor: pointer; display: inline-flex; align-items: center; justify-content: center; font-size: 16px; transition: all .12s; }
|
|
.reh-vo-play:hover { border-color: var(--accent); }
|
|
.reh-vo-play.playing { background: var(--accent); color: #fff; border-color: var(--accent); }
|
|
.reh-vo-info { flex: 1; min-width: 0; display: flex; flex-direction: column; line-height: 1.2; }
|
|
.reh-vo-name { font-size: 13px; font-weight: 600; color: var(--text); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
.reh-vo-meta { font-size: 10px; color: var(--subtext); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
.reh-vo-badge { flex-shrink: 0; font-size: 11px; font-weight: 700; color: var(--accent); display: inline-flex; align-items: center; gap: 3px; }
|
|
.reh-vo-use { flex-shrink: 0; }
|
|
.reh-vo-play.loading { pointer-events: none; }
|
|
.reh-vo-play.loading .mdi { animation: spin .8s linear infinite; }
|
|
/* change-voice tools (library / online search) */
|
|
.reh-vo-tools { display: flex; gap: 6px; }
|
|
.reh-vo-tool { flex: 1; display: inline-flex; align-items: center; justify-content: center; gap: 5px; padding: 6px 8px; font-size: 12px; font-weight: 600; border: 1px solid var(--border); border-radius: 7px; background: var(--panel); color: var(--subtext); cursor: pointer; font-family: inherit; transition: all .12s; }
|
|
.reh-vo-tool:hover { color: var(--text); border-color: var(--accent); }
|
|
.reh-vo-tool.active { color: var(--accent); border-color: var(--accent); background: color-mix(in srgb, var(--accent) 8%, var(--panel)); }
|
|
.reh-vo-tool-panel { display: flex; flex-direction: column; gap: 7px; }
|
|
.reh-vo-search-row { display: flex; gap: 6px; }
|
|
.reh-vo-search-row .reh-vo-search-input { flex: 1; }
|
|
.reh-vo-local-input, .reh-vo-search-input { width: 100%; padding: 7px 9px; font-size: 12px; border: 1px solid var(--border); border-radius: 7px; background: var(--panel); color: var(--text); font-family: inherit; }
|
|
.reh-vo-local-input:focus, .reh-vo-search-input:focus { outline: none; border-color: var(--accent); }
|
|
.reh-vo-results { display: flex; flex-direction: column; gap: 6px; max-height: 230px; overflow-y: auto; }
|
|
.reh-vo-hint { font-size: 11px; color: var(--subtext); padding: 4px 2px; display: flex; align-items: center; gap: 6px; }
|
|
.reh-cc-iconbtn { width: 28px; height: 28px; border-radius: 6px; border: 1px solid var(--border); background: var(--surface); color: var(--subtext); cursor: pointer; display: inline-flex; align-items: center; justify-content: center; font-size: 15px; transition: all .12s; }
|
|
.reh-cc-iconbtn:hover { color: var(--text); border-color: var(--accent); }
|
|
.reh-cc-iconbtn.active { background: var(--accent); color: #fff; border-color: var(--accent); }
|
|
.reh-cc-del:hover { color: var(--red); border-color: var(--red); }
|
|
.reh-cc-body { display: flex; flex-direction: column; gap: 8px; }
|
|
.reh-cc-grid { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 8px; }
|
|
.reh-cc-field { display: flex; flex-direction: column; gap: 3px; min-width: 0; }
|
|
.reh-cc-field > label { font-size: 10px; font-weight: 600; text-transform: uppercase; letter-spacing: .04em; color: var(--subtext); }
|
|
.reh-cc-field select, .reh-cc-field input { width: 100%; min-width: 0; font-size: 12px; padding: 5px 7px; border: 1px solid var(--border); border-radius: 5px; background: var(--surface); color: var(--text); font-family: var(--font); }
|
|
.reh-cc-voice .vp-root { width: 100%; min-width: 0; flex: 1 1 auto; }
|
|
.reh-cc-voice .vp-trigger { min-height: 30px; font-size: 12px; }
|
|
.reh-cc-voice .vp-drop { max-height: 310px; z-index: 80; }
|
|
.reh-cc-field select:focus, .reh-cc-field input:focus { outline: none; border-color: var(--accent); }
|
|
.reh-cc-soul { border-top: 1px solid var(--border); padding-top: 6px; }
|
|
.reh-cc-soul > summary { font-size: 11px; font-weight: 600; color: var(--subtext); cursor: pointer; display: flex; align-items: center; gap: 6px; list-style: none; }
|
|
.reh-cc-soul > summary::-webkit-details-marker { display: none; }
|
|
.reh-cc-develop { margin-left: auto; padding: 2px 8px; font-size: 11px; }
|
|
.reh-cc-soul-text { width: 100%; margin-top: 6px; min-height: 64px; resize: vertical; font-size: 12px; padding: 6px 8px; border: 1px solid var(--border); border-radius: 5px; background: var(--surface); color: var(--text); font-family: var(--font); line-height: 1.45; }
|
|
.reh-cc-soul-text:focus { outline: none; border-color: var(--accent); }
|
|
.reh-cc-more { border-top: 1px solid var(--border); padding-top: 8px; margin-top: 2px; }
|
|
/* Cast card reusing the exact Library card (_charCardHtml) — no extra
|
|
border/shadow around it, its own 16px-radius styling already stands
|
|
alone; the Rehearser-only controls strip sits directly under it. */
|
|
.reh-cast-card-libcard { background: none; border: none; box-shadow: none; }
|
|
.reh-cast-card-libcard .lib-char-card { cursor: pointer; }
|
|
.reh-cast-card-libcard .lib-char-select { display: none; }
|
|
.reh-cast-card-libcard > .reh-cc-body { padding: 12px 4px 4px; }
|
|
.reh-cc-controls { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }
|
|
.reh-cc-more > summary { font-size: 11.5px; font-weight: 700; color: var(--subtext); cursor: pointer; display: flex; align-items: center; gap: 6px; list-style: none; }
|
|
.reh-cc-more > summary::-webkit-details-marker { display: none; }
|
|
.reh-cc-more[open] > summary { color: var(--accent); margin-bottom: 8px; }
|
|
.reh-cc-more .reh-cc-extra { margin-top: 8px; }
|
|
|
|
|
|
.reh-tb-btn { width: 36px; height: 36px; border-radius: 50%; border: 1px solid var(--border); background: var(--panel); color: var(--text); cursor: pointer; font-size: 16px; display: flex; align-items: center; justify-content: center; transition: background .15s; }
|
|
.reh-tb-btn:hover { background: var(--border); }
|
|
.reh-tb-play { background: var(--accent); color: #fff; border-color: var(--accent); font-size: 18px; }
|
|
.reh-tb-play:hover { opacity: .85; }
|
|
.reh-btn-active { background: var(--accent) !important; color: #fff !important; border-color: var(--accent) !important; }
|
|
.reh-tb-progress-wrap { flex: 1; height: 4px; background: var(--border); border-radius: 2px; overflow: hidden; }
|
|
.reh-tb-progress { height: 100%; background: var(--accent); width: 0%; transition: width .3s ease; }
|
|
.reh-tb-label { font-size: 12px; color: var(--subtext); white-space: nowrap; font-variant-numeric: tabular-nums; }
|
|
|
|
/* Stage: script page + character sidebar (same .ab-cv-side look Read Aloud's
|
|
Casting view uses). The sidebar sticks in place while the script scrolls. */
|
|
.reh-stage-area { display: flex; gap: 12px; align-items: flex-start; transition: none; }
|
|
.reh-stage-area .reh-page-wrap { flex: 1; min-width: 0; }
|
|
.reh-stage-area .ab-cv-side {
|
|
width: 220px; flex-shrink: 0; position: sticky; top: 12px;
|
|
max-height: calc(100vh - 160px);
|
|
}
|
|
.reh-stage-area.side-collapsed .ab-cv-side { width: 44px; }
|
|
.reh-stage-area .ab-cv-side .ab-cv-chars { flex: 1; overflow-y: auto; }
|
|
@media (max-width: 767px) {
|
|
/* The sidebar was a fixed 220px column next to the script page — on a
|
|
phone-width viewport that left almost no room for the page itself.
|
|
Stack the sidebar above the page instead, collapsible the same way it
|
|
already is on desktop, just full-width instead of a narrow rail. */
|
|
.reh-stage-area { flex-direction: column; }
|
|
.reh-stage-area .ab-cv-side { width: 100%; position: static; max-height: 220px; order: -1; }
|
|
.reh-stage-area.side-collapsed .ab-cv-side { width: 100%; max-height: 44px; overflow: hidden; }
|
|
.reh-page-wrap { padding: 16px 10px; }
|
|
.reh-a4-page { padding: 20px 14px; }
|
|
}
|
|
|
|
/* A4 page */
|
|
.reh-page-wrap { padding: 24px 16px; background: var(--panel); min-height: 60vh; }
|
|
.reh-a4-page {
|
|
width: min(1180px, 96%); min-height: 400px;
|
|
background: #fff; color: #1a1a2e;
|
|
padding: 56px 72px;
|
|
box-shadow: 0 4px 24px rgba(0,0,0,.18);
|
|
margin: 0 auto;
|
|
font-family: 'Georgia', 'Times New Roman', serif;
|
|
border-radius: 2px;
|
|
}
|
|
[data-theme="dark"] .reh-a4-page { background: #f8f8f2; color: #1a1a2e; }
|
|
.reh-page-title { font-size: 22px; font-weight: 700; text-align: center; margin-bottom: 36px; letter-spacing: .04em; text-transform: uppercase; color: #1a1a2e; border-bottom: 2px solid #1a1a2e; padding-bottom: 12px; }
|
|
.reh-script-lines { display: flex; flex-direction: column; gap: 0; }
|
|
|
|
/* Each dialog block — flex: gutter | content */
|
|
.reh-block { display: flex; align-items: stretch; padding: 8px 12px 8px 2px; border-left: 3px solid transparent; border-radius: 0 4px 4px 0; margin-bottom: 2px; transition: background .2s, border-color .2s; }
|
|
.reh-block-inner { flex: 1; min-width: 0; }
|
|
.reh-block-head { display: flex; align-items: center; gap: 6px; margin-bottom: 4px; flex-wrap: nowrap; }
|
|
.reh-block-name { font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: .12em; white-space: nowrap; }
|
|
.reh-block-head-spacer { flex: 1; min-width: 8px; }
|
|
.reh-block-badge { font-size: 10px; padding: 1px 6px; border-radius: 10px; font-family: sans-serif; flex-shrink: 0; }
|
|
.reh-badge-tts { background: rgba(137,180,250,.2); color: #2563eb; }
|
|
.reh-badge-me { background: rgba(166,227,161,.25); color: #16a34a; }
|
|
.reh-block-dialog { font-size: 15px; line-height: 1.65; padding-left: 40px; color: #1a1a2e; }
|
|
.reh-direction { font-style: italic; color: #666; font-size: 13px; padding: 4px 12px; }
|
|
.reh-char-img { vertical-align: middle; }
|
|
.reh-line-play-avatar { border:0; background:transparent; padding:0; margin:0 2px 0 0; cursor:pointer; border-radius:50%; position:relative; display:inline-flex; align-items:center; justify-content:center; }
|
|
.reh-line-play-avatar:hover { box-shadow:0 0 0 3px rgba(37,99,235,.18); }
|
|
/* This badge overlay is meant to sit in the corner of the bigger avatar
|
|
circle (dialogue's own play button) — .reh-action-play-btn (the plain
|
|
narrator play button, no avatar underneath) also carries the shared
|
|
.reh-line-play-avatar class for click wiring, so it was ALSO getting
|
|
this badge layered on top of its own inline icon: two visibly different
|
|
play icons stacked on one small button. Excluded here; it's styled to
|
|
look like this same badge directly instead (one icon, not two). */
|
|
.reh-line-play-avatar:not(.reh-action-play-btn)::after { content:'\F040A'; font-family:'Material Design Icons'; position:absolute; right:-5px; bottom:-5px; width:16px; height:16px; border-radius:50%; background:var(--accent); color:#fff; font-size:11px; display:flex; align-items:center; justify-content:center; box-shadow:0 1px 4px rgba(0,0,0,.24); }
|
|
.reh-line-active .reh-line-play-avatar:not(.reh-action-play-btn)::after { content:'\F03E4'; background:var(--red); }
|
|
|
|
/* Narrator paragraph play button — no avatar image underneath, so styled
|
|
to look like the same small blue circular badge dialogue's own play
|
|
button already shows (see the ::after rule above), just as its own real
|
|
icon instead of a badge layered over something else. */
|
|
.reh-action-play-btn {
|
|
width: 16px; height: 16px; margin: 0 5px 0 0; vertical-align: middle;
|
|
border: none; color: #fff; font-size: 11px;
|
|
background: var(--accent); flex-shrink: 0;
|
|
}
|
|
.reh-action-play-btn:hover { box-shadow: 0 0 0 3px rgba(37,99,235,.18); }
|
|
.reh-line-active .reh-action-play-btn { background: var(--red); }
|
|
|
|
/* Gutter: narrow play/range column left of each dialog block */
|
|
.reh-gutter-btn { width:22px; min-width:22px; flex-shrink:0; align-self:stretch; background:none; border:none; cursor:pointer; display:flex; align-items:center; justify-content:center; color:transparent; transition:color .12s; font-size:9px; padding:0; margin-right:4px; }
|
|
.reh-block:hover .reh-gutter-btn { color:var(--accent); }
|
|
.reh-range-start .reh-gutter-btn { color:#10b981 !important; }
|
|
.reh-range-end .reh-gutter-btn { color:#ef4444 !important; }
|
|
.reh-in-range { background:rgba(245,158,11,.05) !important; }
|
|
.reh-range-start { border-left-color:#10b981 !important; }
|
|
.reh-range-end { border-left-color:#ef4444 !important; }
|
|
.reh-practice-info { display:none; align-items:center; gap:3px; font-size:10px; color:var(--subtext); white-space:nowrap; margin-left:6px; }
|
|
.reh-practice-info.visible { display:inline-flex; }
|
|
|
|
/* ── Bulk-edit (line selection) ───────────────────────────────────────────── */
|
|
.reh-bulk-bar {
|
|
display:flex; align-items:center; gap:6px; flex-wrap:wrap;
|
|
padding:6px 10px; margin:6px 0; border:1px solid var(--border); border-radius:8px;
|
|
background:var(--panel); position:sticky; top:0; z-index:6;
|
|
}
|
|
.reh-bulk-count { font-size:12px; font-weight:700; color:var(--accent); min-width:74px; }
|
|
.reh-bulk-sep { width:1px; align-self:stretch; background:var(--border); margin:2px 2px; }
|
|
.reh-bulk-spacer{ flex:1; }
|
|
/* Leading checkbox in front of each line */
|
|
.reh-bulk-check {
|
|
display:none; align-items:center; justify-content:center; flex-shrink:0;
|
|
width:26px; cursor:pointer; color:var(--subtext); font-size:20px; align-self:center;
|
|
}
|
|
.reh-bulk-mode .reh-bulk-check { display:inline-flex; }
|
|
.reh-bulk-check.checked { color:var(--accent); }
|
|
.reh-bulk-check:hover { color:var(--accent); }
|
|
/* Non-dialog blocks: keep the checkbox inline at the start */
|
|
.reh-bulk-mode .reh-act,
|
|
.reh-bulk-mode .reh-scene,
|
|
.reh-bulk-mode .reh-action-block,
|
|
.reh-bulk-mode .reh-transition,
|
|
.reh-bulk-mode .reh-direction,
|
|
.reh-bulk-mode .reh-block-pagebreak { position:relative; }
|
|
/* Ignored lines: greyed out but still visible */
|
|
.reh-line-ignored { opacity:.42; filter:grayscale(1); }
|
|
.reh-line-ignored .reh-block-dialog { text-decoration:line-through; text-decoration-color:rgba(0,0,0,.3); }
|
|
/* Hidden lines revealed in bulk mode: dashed, dimmed */
|
|
.reh-line-hidden { opacity:.5; outline:1px dashed var(--border); outline-offset:-2px; }
|
|
|
|
/* Active line */
|
|
.reh-block-active { background: rgba(37,99,235,.07); border-left-color: #2563eb; }
|
|
.reh-block-active .reh-block-dialog { font-weight: 500; }
|
|
|
|
/* Emotion picker button */
|
|
.reh-emo-btn { font-size:11px; border:1px solid rgba(0,0,0,.15); border-radius:4px; padding:2px 6px; background:rgba(0,0,0,.03); color:#555; cursor:pointer; margin-left:auto; flex-shrink:0; font-family:sans-serif; display:inline-flex; align-items:center; gap:3px; white-space:nowrap; max-width:115px; overflow:hidden; }
|
|
.reh-emo-btn:hover { border-color:var(--accent); }
|
|
.reh-emo-btn.has-emotion { background:rgba(37,99,235,.07); color:#1a1a2e; border-color:rgba(37,99,235,.3); font-weight:600; }
|
|
.reh-emo-label { overflow:hidden; text-overflow:ellipsis; white-space:nowrap; max-width:72px; }
|
|
|
|
/* Emotion picker popover */
|
|
.reh-emo-popover { background:var(--bg); border:1px solid var(--border); border-radius:8px; box-shadow:0 8px 32px rgba(0,0,0,.18); overflow:hidden; }
|
|
.reh-emo-pop-inner { display:flex; flex-direction:column; max-height:300px; }
|
|
.reh-emo-search { padding:8px 10px; border:none; border-bottom:1px solid var(--border); background:var(--surface); font-size:12px; outline:none; color:var(--text); width:100%; box-sizing:border-box; }
|
|
.reh-emo-list { overflow-y:auto; flex:1; padding:4px; }
|
|
.reh-emo-item { display:flex; align-items:center; gap:8px; padding:5px 8px; border-radius:4px; cursor:pointer; font-size:12px; color:var(--text); }
|
|
.reh-emo-item:hover { background:var(--panel); }
|
|
.reh-emo-item.selected { background:rgba(37,99,235,.1); color:var(--accent); font-weight:600; }
|
|
.reh-emo-item-emoji { font-size:15px; flex-shrink:0; }
|
|
.reh-emo-custom-row { padding:6px; border-top:1px solid var(--border); }
|
|
|
|
/* Markdown formatting toolbar */
|
|
.reh-fmt-toolbar { display:flex; gap:3px; align-items:center; padding:4px 6px; background:var(--panel); border:1px solid var(--border); border-bottom:none; border-radius:3px 3px 0 0; flex-wrap:wrap; }
|
|
.reh-fmt-btn { padding:2px 8px; border:1px solid var(--border); border-radius:3px; background:var(--surface); cursor:pointer; font-size:12px; color:var(--text); line-height:1.4; }
|
|
.reh-fmt-btn:hover { background:var(--border); }
|
|
.reh-fmt-hint { font-size:10px; color:var(--subtext); margin-left:auto; font-style:italic; }
|
|
|
|
/* Markdown inside A4 */
|
|
.reh-a4-page strong, .reh-paper strong { font-weight:700; }
|
|
.reh-a4-page em, .reh-paper em { font-style:italic; }
|
|
.reh-a4-page u, .reh-paper u { text-decoration:underline; }
|
|
.reh-a4-page del, .reh-paper del { text-decoration:line-through; opacity:.65; }
|
|
.reh-a4-page .reh-hl, .reh-paper .reh-hl { background:#fef3c7; border-radius:2px; padding:0 1px; }
|
|
|
|
/* Word-level highlight during playback */
|
|
.reh-word { display:inline; border-radius:2px; transition:background .06s, color .06s; }
|
|
.reh-word-active { background:rgba(37,99,235,.22); color:#1a1a2e; border-radius:2px; padding:0 1px; }
|
|
|
|
/* ── Proper screenplay A4 formatting ─────────────────────────────────── */
|
|
/* Use Courier New throughout — 1 page ≈ 1 minute of screen time */
|
|
/* Base play font size. Everything below is expressed in `em` so the whole
|
|
play scales together via --reh-stage-scale (the +A / -A control). */
|
|
.reh-a4-page {
|
|
font-family: 'Courier New', Courier, monospace !important;
|
|
font-size: calc(12pt * var(--reh-stage-scale, 1));
|
|
line-height: 1.6;
|
|
}
|
|
.reh-page-title {
|
|
font-family: 'Courier New', Courier, monospace;
|
|
font-size: 1.17em;
|
|
}
|
|
/* Scene headings: all-caps, bold, with spacing */
|
|
.reh-scene {
|
|
font-size: 1em;
|
|
letter-spacing: .04em;
|
|
}
|
|
/* Narrator / action text and spoken dialog share ONE size (1em) so the play
|
|
reads evenly — no narrator-vs-dialogue size mismatch. */
|
|
.reh-action-block { font-size: 1em; }
|
|
.reh-action-text { font-size: 1em; }
|
|
|
|
/* Act headings: larger, extra top space */
|
|
.reh-act { font-size: 1.08em; }
|
|
|
|
/* Transitions: right-aligned */
|
|
.reh-transition { font-size: 1em; }
|
|
|
|
/* Dialog block — screenplay format */
|
|
.reh-block-name {
|
|
font-size: 0.92em;
|
|
letter-spacing: .1em;
|
|
}
|
|
.reh-block-dialog {
|
|
font-size: 1em;
|
|
padding-left: 32px; /* ~1.5" dialog indent */
|
|
max-width: 440px; /* ~3.5" dialog column width */
|
|
}
|
|
/* Parenthetical directions: centered-ish */
|
|
.reh-direction {
|
|
font-size: 0.92em;
|
|
padding-left: 80px;
|
|
color: #444;
|
|
}
|
|
|
|
/* Script editor modal */
|
|
.reh-modal-overlay { position:fixed; inset:0; z-index:2000; background:rgba(0,0,0,.45); display:flex; align-items:center; justify-content:center; padding:16px; }
|
|
.reh-modal-overlay[hidden] { display: none !important; }
|
|
.reh-modal-box { background:var(--bg); border-radius:10px; box-shadow:0 20px 60px rgba(0,0,0,.3); overflow:hidden; display:flex; flex-direction:column; }
|
|
.reh-modal-head { display:flex; align-items:center; justify-content:space-between; padding:12px 16px; border-bottom:1px solid var(--border); font-weight:700; }
|
|
|
|
/* TTS status bar */
|
|
.reh-tts-status-bar { display: flex; align-items: center; gap: 12px; padding: 8px 16px; background: var(--panel); border-top: 1px solid var(--border); font-size: 13px; }
|
|
.reh-tts-status-bar[hidden] { display: none; }
|
|
|
|
/* Recording overlay */
|
|
.reh-rec-overlay {
|
|
position: sticky; bottom: 0; z-index: 60;
|
|
background: var(--bg); border-top: 2px solid var(--green);
|
|
box-shadow: 0 -4px 20px rgba(0,0,0,.15);
|
|
}
|
|
.reh-rec-overlay[hidden] { display: none; }
|
|
.reh-rec-overlay-inner { padding: 14px 20px; max-width: 860px; margin: 0 auto; }
|
|
.reh-rec-cue { font-size: 14px; margin-bottom: 10px; line-height: 1.5; }
|
|
.reh-rec-cue-name { font-weight: 700; font-size: 12px; text-transform: uppercase; letter-spacing: .1em; }
|
|
.reh-rec-cue-text { font-size: 17px; margin-top: 4px; padding: 8px 12px; background: rgba(166,227,161,.1); border-left: 3px solid var(--green); border-radius: 0 4px 4px 0; font-style: italic; }
|
|
.reh-rec-inner { padding: 14px 20px; max-width: 860px; margin: 0 auto; }
|
|
|
|
/* Summary */
|
|
.reh-summary-list { display: flex; flex-direction: column; gap: 10px; }
|
|
.reh-summary-row { display: flex; align-items: flex-start; gap: 10px; padding: 10px; background: var(--panel); border-radius: 6px; }
|
|
|
|
/* Console / sticky transport bar */
|
|
.reh-console {
|
|
position: sticky; top: 0; z-index: 50;
|
|
background: var(--bg); border-bottom: 1px solid var(--border);
|
|
display: flex; align-items: center; gap: 10px; padding: 7px 14px; flex-wrap: wrap;
|
|
}
|
|
.reh-console-transport { display: flex; gap: 4px; align-items: center; flex-shrink: 0; }
|
|
.reh-console-progress { display: flex; align-items: center; gap: 8px; flex: 1; min-width: 80px; }
|
|
/* flex-shrink:0 with the flexbox-default min-width:auto meant this block could
|
|
never shrink below its unwrapped natural width (confirmed live: ~1560px of
|
|
buttons in a 524px-wide bar) — flex-wrap never got a chance to kick in since
|
|
the item was never considered "too wide to fit" by the wrapping algorithm,
|
|
so on any real (non-ultrawide) window the tail of the toolbar — font size,
|
|
page mode, Train, Exit — silently fell off-screen with no scrollbar to
|
|
reach it. Allowing it to shrink (and explicitly zeroing min-width, since
|
|
flex items default to min-width:auto regardless of any width you set) lets
|
|
it wrap onto additional rows within the available space instead. */
|
|
.reh-console-actions { display: flex; gap: 6px; align-items: center; flex-shrink: 1; min-width: 0; flex-wrap: wrap; }
|
|
|
|
/* Synth progress bar */
|
|
/* Tone / style backend warning bar */
|
|
.reh-tone-warn {
|
|
display: flex; align-items: flex-start; gap: 8px; padding: 7px 14px;
|
|
background: rgba(234,179,8,.1); border-bottom: 1px solid rgba(234,179,8,.35);
|
|
font-size: 12px; color: #92400e;
|
|
}
|
|
.reh-tone-warn[hidden] { display: none; }
|
|
.reh-tone-warn .mdi { color: #d97706; font-size: 14px; flex-shrink: 0; }
|
|
/* Aligns the alert icon with the table's own text baseline rather than the
|
|
whole (now taller, multi-row) bar. */
|
|
.reh-tone-warn > .mdi { margin-top: 3px; }
|
|
.reh-tone-warn-close {
|
|
margin-left: auto; background: none; border: none; cursor: pointer;
|
|
color: #92400e; font-size: 13px; line-height: 1; padding: 2px 4px; border-radius: 3px;
|
|
opacity: .7; flex-shrink: 0;
|
|
}
|
|
.reh-tone-warn-close:hover { opacity: 1; background: rgba(0,0,0,.06); }
|
|
|
|
/* Backend tone/identity comparison table — replaced a run-on sentence with a
|
|
button wedged mid-clause (confirmed live: read badly and wrapped worse).
|
|
Same two facts, laid out as two columns instead of two clauses. */
|
|
.reh-tone-cmp { border-collapse: collapse; font-size: 12px; }
|
|
.reh-tone-cmp th {
|
|
text-align: left; font-weight: 600; padding: 2px 14px 4px 0; color: #92400e;
|
|
opacity: .75; white-space: nowrap;
|
|
}
|
|
.reh-tone-cmp td { padding: 3px 14px 3px 0; white-space: nowrap; }
|
|
.reh-tone-cmp tr:first-child td { padding-top: 0; }
|
|
.reh-tone-cmp-current td:first-child { font-weight: 700; }
|
|
.reh-tone-cmp-current-tag {
|
|
font-size: 10px; font-weight: 600; text-transform: uppercase; letter-spacing: .04em;
|
|
color: #92400e; opacity: .7;
|
|
}
|
|
.reh-tone-cmp-yes { color: #15803d; }
|
|
.reh-tone-cmp-no { color: #b91c1c; opacity: .8; }
|
|
.reh-tone-cmp-yes .mdi, .reh-tone-cmp-no .mdi { font-size: 13px; }
|
|
.reh-tone-switch-btn { padding: 2px 10px !important; font-size: 11px !important; }
|
|
.reh-tone-cmp-note { margin: 4px 0 0; font-size: 11.5px; opacity: .85; }
|
|
|
|
/* Synth progress bar — more prominent while running */
|
|
.reh-synth-bar {
|
|
display: flex; align-items: center; gap: 10px; padding: 7px 16px;
|
|
background: linear-gradient(90deg, rgba(37,99,235,.08), rgba(37,99,235,.04));
|
|
border-bottom: 2px solid rgba(37,99,235,.3); font-size: 12px;
|
|
box-shadow: 0 2px 8px rgba(37,99,235,.12);
|
|
}
|
|
.reh-synth-bar[hidden] { display: none; }
|
|
.reh-synth-bar-lbl {
|
|
font-size: 11px; font-weight: 700; color: var(--accent); white-space: nowrap;
|
|
display: flex; align-items: center; gap: 4px; letter-spacing: .04em;
|
|
}
|
|
.reh-synth-track { flex: 1; height: 6px; background: var(--border); border-radius: 3px; overflow: hidden; }
|
|
.reh-synth-fill { height: 100%; background: linear-gradient(90deg, var(--accent), #7c3aed); width: 0%; transition: width .25s ease; border-radius: 3px; }
|
|
.reh-synth-label { font-size: 12px; font-weight: 600; color: var(--accent); white-space: nowrap; min-width: 48px; text-align: right; }
|
|
|
|
/* Synthesizing dot — pulsing spinner ring */
|
|
@keyframes reh-synth-pulse { 0%,100% { transform: scale(1); opacity: 1; } 50% { transform: scale(1.5); opacity: .5; } }
|
|
.reh-synth-dot.synthesizing {
|
|
background: var(--accent);
|
|
animation: reh-synth-pulse .8s ease-in-out infinite;
|
|
box-shadow: 0 0 0 3px rgba(37,99,235,.25);
|
|
}
|
|
|
|
/* Row highlight while a line is being synthesized */
|
|
.reh-line-synthesizing {
|
|
background: rgba(37,99,235,.06) !important;
|
|
border-left-color: var(--accent) !important;
|
|
transition: background .15s;
|
|
}
|
|
|
|
/* Play font-size stepper (+A / -A) */
|
|
.reh-fontsize-ctl { display: inline-flex; gap: 2px; }
|
|
/* No padding override here on purpose — confirmed live these two buttons
|
|
rendered ~18px shorter than every sibling toolbar button (2px 7px vs the
|
|
base .btn-secondary.btn-sm's 9px 18px) because this rule fought that
|
|
padding instead of inheriting it. Font weight is the only real
|
|
customization these need. */
|
|
/* Padding now matches every sibling button exactly, but a residual gap
|
|
remained — plain "A" + superscript text computes a shorter natural
|
|
line-height than an icon+text button, and guessing at a line-height
|
|
multiplier to compensate (tried 1: overshot the other way, to 35.7px
|
|
against siblings' 43px) is fragile. Match the sibling toolbar buttons'
|
|
actual height directly instead of trying to reverse-engineer it via
|
|
line-height. */
|
|
.reh-fontsize-btn { font-weight: 700; height: 43px; display: inline-flex; align-items: center; justify-content: center; }
|
|
.reh-fontsize-btn .reh-fontsize-plus, .reh-fontsize-btn .reh-fontsize-minus { font-size: 9px; vertical-align: super; margin-left: 1px; }
|
|
|
|
/* Act heading on A4 page */
|
|
.reh-act {
|
|
font-family: 'Courier New', Courier, monospace; font-size: 13px; font-weight: 700;
|
|
text-transform: uppercase; letter-spacing: .14em; color: #1a1a2e;
|
|
margin: 28px 0 8px; padding: 7px 0; text-align: center;
|
|
border-top: 2.5px solid #1a1a2e; border-bottom: 2.5px solid #1a1a2e;
|
|
cursor: pointer;
|
|
}
|
|
|
|
/* Chapter marker — a horizontal rule with the chapter's own title/number
|
|
between the two halves, so a chapter break is visible while scrolling the
|
|
script itself and not just audible as a pause in the exported audiobook. */
|
|
.reh-chapter-marker {
|
|
display: flex; align-items: center; gap: 14px;
|
|
margin: 32px 0 20px; position: relative;
|
|
}
|
|
.reh-chapter-marker-line { flex: 1; height: 1px; background: var(--border); }
|
|
.reh-chapter-marker-label {
|
|
font-weight: 700; text-transform: uppercase; letter-spacing: .08em;
|
|
font-size: 13px; color: var(--subtext); white-space: nowrap; padding: 0 2px;
|
|
}
|
|
.reh-chapter-marker:hover .reh-edit-btn { opacity: 1; }
|
|
|
|
/* Inline edit button — shown on hover */
|
|
.reh-edit-btn {
|
|
opacity: 0; transition: opacity .12s; border: 1px solid transparent;
|
|
background: none; cursor: pointer; font-size: 10px; color: var(--subtext);
|
|
padding: 1px 5px; border-radius: 3px; line-height: 1; flex-shrink: 0;
|
|
}
|
|
.reh-block:hover .reh-edit-btn,
|
|
.reh-action-block:hover .reh-edit-btn,
|
|
.reh-scene:hover .reh-edit-btn,
|
|
.reh-act:hover .reh-edit-btn { opacity: 1; }
|
|
.reh-edit-btn:hover { background: var(--panel); border-color: var(--border); color: var(--accent); }
|
|
|
|
/* Scene heading on the A4 page */
|
|
.reh-scene {
|
|
font-family: 'Courier New', Courier, monospace; font-size: 11.5px; font-weight: 700;
|
|
text-transform: uppercase; letter-spacing: .07em; color: #1a1a2e;
|
|
margin: 22px 0 8px; padding: 5px 0;
|
|
border-top: 1.5px solid #333; border-bottom: 1.5px solid #333;
|
|
cursor: pointer; display: flex; align-items: center; gap: 6px;
|
|
}
|
|
.reh-scene .mdi { font-size: 11px; opacity: .5; flex-shrink: 0; }
|
|
|
|
/* Action / description block — 1em so narrator matches spoken dialog and
|
|
scales with the +A / -A control. */
|
|
.reh-action-block {
|
|
font-family: 'Courier New', Courier, monospace; font-size: 1em; line-height: 1.75;
|
|
color: #2c2c3e; padding: 2px 0 10px; cursor: pointer;
|
|
}
|
|
|
|
/* Transition line */
|
|
.reh-transition {
|
|
font-family: 'Courier New', Courier, monospace; font-size: 0.75em; font-weight: 700;
|
|
text-align: right; text-transform: uppercase; letter-spacing: .1em;
|
|
color: #555; padding: 8px 0;
|
|
}
|
|
|
|
/* Active line highlight (works on any block type) */
|
|
.reh-line-active.reh-block { background: rgba(37,99,235,.08) !important; border-left-color: var(--accent) !important; }
|
|
.reh-line-active.reh-scene { background: rgba(37,99,235,.06) !important; outline: 2px solid var(--accent); outline-offset: 1px; border-radius: 3px; }
|
|
.reh-line-active.reh-action-block { background: rgba(37,99,235,.05) !important; padding-left: 6px; border-left: 2px solid var(--accent); }
|
|
.reh-line-active.reh-direction { background: rgba(37,99,235,.04) !important; }
|
|
|
|
/* Emotion selector on TTS dialog blocks */
|
|
.reh-emotion-sel {
|
|
font-size: 10px; border: 1px solid rgba(0,0,0,.18); border-radius: 3px;
|
|
padding: 1px 4px; background: rgba(0,0,0,.04); color: #555;
|
|
cursor: pointer; margin-left: auto; flex-shrink: 0; font-family: sans-serif;
|
|
max-width: 90px;
|
|
}
|
|
.reh-emotion-sel:hover, .reh-emotion-sel:focus { border-color: var(--accent); outline: none; }
|
|
.reh-emotion-sel.has-emotion { background: rgba(37,99,235,.08); color: var(--accent); border-color: var(--accent); font-weight: 600; }
|
|
|
|
/* Pre-synthesized dot */
|
|
.reh-synth-dot {
|
|
width: 7px; height: 7px; border-radius: 50%; background: var(--green);
|
|
flex-shrink: 0; display: inline-block; margin-left: 3px;
|
|
}
|
|
.reh-synth-dot.stale {
|
|
background: var(--red, #ef4444);
|
|
box-shadow: 0 0 0 2px rgba(239,68,68,.2);
|
|
}
|
|
|
|
/* Per-line re-synth button */
|
|
.reh-resynth-btn {
|
|
background: none; border: none; cursor: pointer; padding: 2px 4px;
|
|
color: var(--red, #ef4444); font-size: 12px; border-radius: 4px;
|
|
opacity: .85; transition: opacity .15s, background .15s;
|
|
display: inline-flex; align-items: center;
|
|
}
|
|
.reh-resynth-btn:hover { opacity: 1; background: rgba(239,68,68,.1); }
|
|
|
|
/* Note area — right gutter of dialog block (holds edit btn + note btn) */
|
|
.reh-block { position: relative; }
|
|
.reh-note-area {
|
|
display: flex; flex-direction: column; align-items: flex-end; gap: 2px;
|
|
min-width: 28px; flex-shrink: 0; padding-top: 2px;
|
|
}
|
|
/* Edit button inside note-area gutter */
|
|
.reh-note-area .reh-edit-btn {
|
|
opacity: 0; transition: opacity .12s; border: 1px solid transparent;
|
|
background: none; cursor: pointer; font-size: 13px; color: var(--subtext);
|
|
padding: 3px 5px; border-radius: 4px; line-height: 1; flex-shrink: 0;
|
|
}
|
|
.reh-block:hover .reh-note-area .reh-edit-btn { opacity: 1; }
|
|
.reh-note-area .reh-edit-btn:hover { background: var(--panel); border-color: var(--border); color: var(--accent); }
|
|
.reh-note-btn {
|
|
background: none; border: none; cursor: pointer; padding: 3px;
|
|
font-size: 14px; color: var(--subtext); opacity: .45; border-radius: 4px;
|
|
transition: opacity .15s, color .15s; line-height: 1; flex-shrink: 0;
|
|
}
|
|
.reh-note-btn:hover, .reh-note-btn.has-note { opacity: 1; color: #f59e0b; }
|
|
.reh-note-ta {
|
|
display: none; width: 160px; min-height: 60px; resize: vertical;
|
|
font-size: 11px; font-family: inherit; line-height: 1.45;
|
|
padding: 6px 8px; border: 1px solid #f59e0b55; border-radius: 6px;
|
|
background: rgba(245,158,11,.06); color: var(--text); outline: none;
|
|
}
|
|
.reh-note-ta.open { display: block; }
|
|
.reh-note-ta:focus { border-color: #f59e0b; background: rgba(245,158,11,.1); }
|
|
|
|
@media (max-width: 700px) {
|
|
.reh-input-row { grid-template-columns: 1fr; }
|
|
.reh-a4-page { padding: 28px 20px; }
|
|
.reh-console { gap: 8px; }
|
|
.reh-cc-grid { grid-template-columns: 1fr; }
|
|
}
|
|
|
|
/* ── Phase sub-tabs ─────────────────────────────────────────────────────── */
|
|
.reh-subtabs {
|
|
display: flex; gap: 4px; padding: 4px; margin: 0 0 14px;
|
|
background: var(--panel); border: 1px solid var(--border); border-radius: 10px;
|
|
flex-wrap: wrap;
|
|
}
|
|
.reh-subtab {
|
|
display: inline-flex; align-items: center; gap: 6px;
|
|
padding: 7px 14px; border: none; border-radius: 7px; cursor: pointer;
|
|
background: transparent; color: var(--subtext); font-size: 13px; font-weight: 600;
|
|
transition: background .15s, color .15s;
|
|
}
|
|
.reh-subtab .mdi { font-size: 16px; }
|
|
.reh-subtab:hover:not(:disabled):not(.active) { background: var(--border); color: var(--text); }
|
|
.reh-subtab.active { background: var(--surface); color: var(--accent); box-shadow: 0 1px 3px rgba(0,0,0,.08); }
|
|
.reh-subtab:disabled { opacity: .4; cursor: not-allowed; }
|
|
@media (max-width: 600px) {
|
|
.reh-subtab span:not(.mdi) { display: none; }
|
|
.reh-subtab { padding: 8px 12px; }
|
|
}
|
|
|
|
/* ── Studio phase tabs (deliberately separate classes from .reh-subtab —
|
|
rehearser.js wires its OWN click listeners onto every .reh-subtab in the
|
|
document via querySelectorAll, and every section's HTML is present in the
|
|
DOM at once regardless of which is visible, so reusing that class name
|
|
here would silently attach Rehearser's phase-switching logic to Studio's
|
|
own tab buttons too) ───────────────────────────────────────────────── */
|
|
.stu-subtabs {
|
|
display: flex; gap: 4px; padding: 4px; margin: 0 0 14px;
|
|
background: var(--panel); border: 1px solid var(--border); border-radius: 10px;
|
|
flex-wrap: wrap;
|
|
}
|
|
.stu-subtab {
|
|
display: inline-flex; align-items: center; gap: 6px;
|
|
padding: 7px 14px; border: none; border-radius: 7px; cursor: pointer;
|
|
background: transparent; color: var(--subtext); font-size: 13px; font-weight: 600;
|
|
transition: background .15s, color .15s;
|
|
}
|
|
.stu-subtab .mdi { font-size: 16px; }
|
|
.stu-subtab:hover:not(:disabled):not(.active) { background: var(--border); color: var(--text); }
|
|
.stu-subtab.active { background: var(--surface); color: var(--accent); box-shadow: 0 1px 3px rgba(0,0,0,.08); }
|
|
.stu-subtab:disabled { opacity: .4; cursor: not-allowed; }
|
|
.stu-subtab-num {
|
|
display: inline-flex; align-items: center; justify-content: center;
|
|
width: 16px; height: 16px; border-radius: 50%; font-size: 10px; font-weight: 700;
|
|
background: var(--border); color: var(--subtext); flex-shrink: 0;
|
|
}
|
|
.stu-subtab.active .stu-subtab-num { background: var(--accent); color: #fff; }
|
|
@media (max-width: 600px) {
|
|
.stu-subtab span:not(.mdi):not(.stu-subtab-num) { display: none; }
|
|
.stu-subtab { padding: 8px 12px; }
|
|
}
|
|
|
|
/* Nested sub-tabs inside Studio's Characters/Perform phases (smaller, inline) */
|
|
.stu-inner-tabs { display: flex; gap: 4px; margin: 0 0 12px; }
|
|
.stu-book-context-btn {
|
|
display: inline-flex; align-items: center; gap: 6px; margin-right: 4px;
|
|
padding: 6px 12px; border: 1px solid var(--border); border-radius: 6px;
|
|
cursor: pointer; background: var(--panel); color: var(--subtext);
|
|
font-size: 12.5px; font-weight: 600;
|
|
}
|
|
.stu-book-context-btn:hover { color: var(--accent); border-color: var(--accent); background: var(--surface); }
|
|
.stu-inner-tab {
|
|
padding: 6px 12px; border: 1px solid var(--border); border-radius: 6px; cursor: pointer;
|
|
background: var(--panel); color: var(--subtext); font-size: 12.5px; font-weight: 600;
|
|
}
|
|
.stu-inner-tab.active { background: var(--surface); color: var(--accent); border-color: var(--accent); }
|
|
.stu-mode-toggle {
|
|
display: inline-flex; align-items: center; gap: 8px; padding: 8px 12px;
|
|
border: 1px solid var(--border); border-radius: 8px; background: var(--panel);
|
|
font-size: 13px; font-weight: 600; margin: 0 0 14px; cursor: pointer;
|
|
}
|
|
|
|
/* ── Auto-design voices (Phase 2) ───────────────────────────────────────── */
|
|
.reh-autodesign {
|
|
border: 1px solid var(--border); border-radius: 10px;
|
|
padding: 12px 14px; margin: 4px 0 14px;
|
|
background: linear-gradient(180deg, rgba(37,99,235,.04), transparent);
|
|
}
|
|
.reh-autodesign-head { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; margin-bottom: 10px; font-size: 13px; }
|
|
.reh-autodesign-head .note { font-weight: 400; }
|
|
.reh-autodesign-row { display: flex; gap: 10px; align-items: flex-end; flex-wrap: wrap; }
|
|
.reh-autodesign-row input, .reh-autodesign-row select {
|
|
width: 100%; padding: 6px 8px; border: 1px solid var(--border);
|
|
border-radius: 5px; background: var(--surface); color: var(--text); font-size: 12px;
|
|
}
|
|
.reh-llm-refresh { border: none; background: none; cursor: pointer; color: var(--accent); font-size: 13px; padding: 0 2px; }
|
|
.reh-autodesign-progress { display: flex; align-items: center; gap: 10px; margin-top: 10px; }
|
|
|
|
/* Three casting options (local match / online match / design) */
|
|
.reh-cast-options { display: grid; grid-template-columns: repeat(auto-fit, minmax(230px, 1fr)); gap: 10px; margin-top: 12px; }
|
|
.reh-cast-opt { display: flex; gap: 10px; padding: 12px; background: var(--surface); border: 1px solid var(--border); border-radius: 10px; }
|
|
.reh-co-num { flex-shrink: 0; width: 22px; height: 22px; border-radius: 50%; background: var(--accent); color: #fff; font-size: 12px; font-weight: 700; display: inline-flex; align-items: center; justify-content: center; }
|
|
.reh-co-body { display: flex; flex-direction: column; gap: 6px; min-width: 0; }
|
|
.reh-co-body > strong { font-size: 13px; display: flex; align-items: center; gap: 6px; }
|
|
.reh-co-body > strong .mdi { color: var(--accent); }
|
|
.reh-co-body > p { font-size: 11.5px; color: var(--subtext); line-height: 1.45; margin: 0; }
|
|
.reh-co-body > p em { font-style: normal; color: var(--text); font-weight: 600; }
|
|
.reh-co-body > button { align-self: flex-start; margin-top: 2px; white-space: nowrap; }
|
|
|
|
/* Per-character status pill while designing */
|
|
.reh-cast-designing { opacity: .75; }
|
|
.reh-cast-design-badge {
|
|
font-size: 10px; padding: 1px 7px; border-radius: 10px; margin-left: 6px;
|
|
background: rgba(37,99,235,.12); color: var(--accent); font-weight: 600;
|
|
}
|
|
.reh-cast-design-badge.done { background: rgba(22,163,74,.15); color: var(--green); }
|
|
.reh-cast-design-badge.err { background: rgba(220,38,38,.15); color: var(--red); }
|
|
|
|
/* ── Per-character auto-design detail panel ─────────────────────────────── */
|
|
.reh-cast-design-panel {
|
|
margin: -4px 12px 8px 12px; padding: 10px 12px;
|
|
border: 1px solid rgba(37,99,235,.25); border-radius: 8px;
|
|
background: rgba(37,99,235,.05); display: flex; flex-direction: column; gap: 7px;
|
|
animation: reh-cdp-in .15s ease-out;
|
|
}
|
|
@keyframes reh-cdp-in { from { opacity: 0; transform: translateY(-4px); } to { opacity: 1; transform: none; } }
|
|
.reh-cast-design-panel.done {
|
|
border-color: rgba(22,163,74,.25); background: rgba(22,163,74,.04);
|
|
}
|
|
.reh-cdp-meta { display: flex; flex-wrap: wrap; gap: 5px; align-items: center; }
|
|
.reh-cdp-chip {
|
|
font-size: 10px; font-weight: 600; padding: 2px 8px; border-radius: 10px;
|
|
background: var(--panel); border: 1px solid var(--border); color: var(--subtext);
|
|
display: inline-flex; align-items: center; gap: 4px; white-space: nowrap;
|
|
}
|
|
.reh-cdp-gender { color: #8b5cf6; border-color: rgba(139,92,246,.3); background: rgba(139,92,246,.07); }
|
|
.reh-cdp-lang { color: #0ea5e9; border-color: rgba(14,165,233,.3); background: rgba(14,165,233,.07); }
|
|
.reh-cdp-name { color: var(--accent); border-color: rgba(37,99,235,.3); background: rgba(37,99,235,.07); font-family: monospace; font-size: 10px; }
|
|
.reh-cdp-desc {
|
|
font-size: 11px; line-height: 1.5; color: var(--text); font-style: italic;
|
|
border-left: 2px solid var(--accent); padding-left: 8px; opacity: .85;
|
|
}
|
|
.reh-cdp-step {
|
|
display: flex; align-items: center; gap: 7px; font-size: 11px; color: var(--subtext);
|
|
}
|
|
.reh-cdp-step .reh-imsdb-spinner { border-top-color: var(--accent); }
|
|
|
|
/* ── Drag & drop importer ───────────────────────────────────────────────── */
|
|
.reh-dropzone {
|
|
margin-top: 14px; padding: 26px 16px; border: 2px dashed var(--border);
|
|
border-radius: 12px; text-align: center; color: var(--subtext);
|
|
display: flex; flex-direction: column; align-items: center; gap: 5px;
|
|
transition: border-color .15s, background .15s; cursor: default;
|
|
}
|
|
.reh-dropzone-icon { font-size: 34px; opacity: .5; }
|
|
.reh-dropzone.dragover {
|
|
border-color: var(--accent); background: rgba(37,99,235,.06); color: var(--accent);
|
|
}
|
|
.reh-dropzone.dragover .reh-dropzone-icon { opacity: 1; }
|
|
|
|
/* ── Bookshelf library ──────────────────────────────────────────────────── */
|
|
.reh-bookshelf {
|
|
display: grid; grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
|
|
gap: 18px 16px; padding: 6px 4px 4px;
|
|
}
|
|
.sk { background: linear-gradient(90deg, var(--panel), rgba(37,99,235,.08), var(--panel)); background-size: 220% 100%; animation: skeletonSweep 1.15s ease-in-out infinite; }
|
|
.lib-book-sk { background: linear-gradient(135deg, var(--panel), var(--border)) !important; opacity: .7; animation: none; cursor: default; }
|
|
.lib-book-sk .sk { border-radius: 4px; }
|
|
.reh-book {
|
|
position: relative; cursor: pointer; border-radius: 4px 7px 7px 4px;
|
|
aspect-ratio: 2 / 3; padding: 14px 12px 12px 18px; color: #fff; overflow: hidden;
|
|
box-shadow: 0 5px 14px rgba(0,0,0,.22), inset 3px 0 0 rgba(0,0,0,.18);
|
|
display: flex; flex-direction: column;
|
|
transition: transform .16s ease, box-shadow .16s ease;
|
|
background: linear-gradient(135deg, var(--bk1, #4f46e5), var(--bk2, #7c3aed));
|
|
}
|
|
.reh-book::before { /* spine highlight */
|
|
content: ''; position: absolute; left: 6px; top: 0; bottom: 0; width: 2px;
|
|
background: rgba(255,255,255,.25);
|
|
}
|
|
.reh-book:hover { transform: translateY(-5px) rotate(-.6deg); box-shadow: 0 12px 26px rgba(0,0,0,.3), inset 3px 0 0 rgba(0,0,0,.18); }
|
|
.reh-book-title {
|
|
font-size: 14px; font-weight: 800; line-height: 1.25; letter-spacing: .01em;
|
|
text-shadow: 0 1px 3px rgba(0,0,0,.35); display: -webkit-box;
|
|
-webkit-line-clamp: 4; -webkit-box-orient: vertical; overflow: hidden;
|
|
}
|
|
.reh-book-meta { margin-top: auto; font-size: 10.5px; opacity: .9; line-height: 1.5; }
|
|
.reh-book-avatars { display: flex; gap: 3px; margin-bottom: 6px; flex-wrap: wrap; }
|
|
.reh-book-avatars span {
|
|
width: 19px; height: 19px; border-radius: 50%; font-size: 9px; font-weight: 700;
|
|
display: inline-flex; align-items: center; justify-content: center;
|
|
border: 1.5px solid rgba(255,255,255,.7); color: #fff;
|
|
}
|
|
.reh-book-progress { height: 3px; border-radius: 2px; background: rgba(255,255,255,.28); margin-top: 5px; overflow: hidden; }
|
|
.reh-book-progress > div { height: 100%; background: rgba(255,255,255,.9); }
|
|
.reh-book-actions {
|
|
position: absolute; top: 6px; right: 6px; display: flex; gap: 3px; opacity: 0;
|
|
transition: opacity .14s;
|
|
}
|
|
.reh-book:hover .reh-book-actions { opacity: 1; }
|
|
.reh-book-act {
|
|
width: 22px; height: 22px; border-radius: 5px; border: none; cursor: pointer;
|
|
background: rgba(0,0,0,.32); color: #fff; font-size: 12px;
|
|
display: inline-flex; align-items: center; justify-content: center;
|
|
}
|
|
.reh-book-act:hover { background: rgba(0,0,0,.55); }
|
|
.reh-book-active-tag {
|
|
position: absolute; top: 8px; left: 14px; font-size: 8.5px; font-weight: 700;
|
|
text-transform: uppercase; letter-spacing: .08em; background: rgba(255,255,255,.92);
|
|
color: #1a1a2e; padding: 1px 6px; border-radius: 8px;
|
|
}
|
|
/* List-view fallback reuses old rows */
|
|
.reh-bookshelf.list-view { display: flex; flex-direction: column; gap: 8px; }
|
|
.reh-bookshelf.list-view .reh-book {
|
|
aspect-ratio: auto; flex-direction: row; align-items: center; gap: 12px;
|
|
padding: 10px 14px; color: var(--text); background: var(--panel) !important;
|
|
box-shadow: none; border: 1px solid var(--border); border-radius: 8px;
|
|
}
|
|
.reh-bookshelf.list-view .reh-book:hover { transform: none; }
|
|
.reh-bookshelf.list-view .reh-book::before { display: none; }
|
|
.reh-bookshelf.list-view .reh-book-title { -webkit-line-clamp: 1; text-shadow: none; font-size: 14px; }
|
|
.reh-bookshelf.list-view .reh-book-meta { margin: 0 0 0 auto; }
|
|
.reh-bookshelf.list-view .reh-book-actions { position: static; opacity: 1; }
|
|
.reh-bookshelf.list-view .reh-book-act { background: var(--surface); color: var(--text); border: 1px solid var(--border); }
|
|
|
|
/* ── Multi-page (paginated) script view ─────────────────────────────────── */
|
|
.reh-page-wrap.paginated { display: flex; flex-direction: column; align-items: center; gap: 22px; }
|
|
.reh-paper {
|
|
width: min(1180px, 96%); background: #fff; color: #1a1a2e;
|
|
padding: 56px 72px 40px; box-shadow: 0 4px 24px rgba(0,0,0,.18);
|
|
font-family: 'Courier New', Courier, monospace; font-size: calc(12pt * var(--reh-stage-scale, 1)); line-height: 1.6;
|
|
border-radius: 2px; position: relative; box-sizing: border-box;
|
|
min-height: min(1123px, calc((100vw - 32px) * 1.414));
|
|
}
|
|
.reh-paper-num {
|
|
position: absolute; top: 20px; right: 32px; font-size: 10pt; color: #888;
|
|
font-family: 'Courier New', monospace;
|
|
}
|
|
[data-theme="dark"] .reh-paper { background: #f8f8f2; }
|
|
|
|
/* Keep script-browser list rows readable even when old cached list styles collapse. */
|
|
.reh-imsdb-grid.list-view > .reh-imsdb-card {
|
|
height: 48px !important;
|
|
min-height: 48px !important;
|
|
max-height: 48px;
|
|
overflow: hidden;
|
|
}
|
|
.reh-imsdb-grid.list-view > .reh-imsdb-card .reh-imsdb-meta {
|
|
height: 48px;
|
|
min-height: 48px;
|
|
}
|
|
|
|
|
|
.reh-bulk-hint { font-size:11px; color:var(--subtext); margin-right:4px; }
|
|
.reh-bulk-mode .reh-selected {
|
|
background: rgba(37,99,235,.11) !important;
|
|
outline: 2px solid rgba(37,99,235,.35);
|
|
outline-offset: -2px;
|
|
}
|
|
.reh-bulk-mode .reh-selected .reh-block-dialog { font-weight:600; }
|
|
|
|
/* Keep script-browser thumbnail cards tall enough to click/download in cover view. */
|
|
.reh-imsdb-grid:not(.list-view) > .reh-imsdb-card {
|
|
display: flex !important;
|
|
flex-direction: column !important;
|
|
min-height: 230px !important;
|
|
height: auto !important;
|
|
overflow: hidden;
|
|
}
|
|
.reh-imsdb-grid:not(.list-view) > .reh-imsdb-card .reh-imsdb-poster-wrap {
|
|
display: block !important;
|
|
position: relative !important;
|
|
width: 100% !important;
|
|
aspect-ratio: 2 / 3 !important;
|
|
min-height: 178px !important;
|
|
height: auto !important;
|
|
padding-bottom: 0 !important;
|
|
flex: 0 0 auto !important;
|
|
}
|
|
.reh-imsdb-grid:not(.list-view) > .reh-imsdb-card .reh-imsdb-poster,
|
|
.reh-imsdb-grid:not(.list-view) > .reh-imsdb-card .reh-imsdb-fallback {
|
|
position: absolute !important;
|
|
inset: 0 !important;
|
|
width: 100% !important;
|
|
height: 100% !important;
|
|
}
|
|
.reh-imsdb-grid:not(.list-view) > .reh-imsdb-card .reh-imsdb-meta {
|
|
min-height: 46px;
|
|
flex: 0 0 auto;
|
|
}
|