aboutsummaryrefslogtreecommitdiffhomepage
path: root/public/bluebey-studio/src/style.css
diff options
context:
space:
mode:
authorYasutake Yohei <61961825+yasutakeyohei@users.noreply.github.com>2026-10-02 23:51:34 +0900
committerYasutake Yohei <61961825+yasutakeyohei@users.noreply.github.com>2026-10-02 23:51:34 +0900
commite332019acb312ec64893c26cf3d797d5ce472f26 (patch)
treed97eaca75ad6d1d41658854d6b80519f6cd1ab79 /public/bluebey-studio/src/style.css
parent99204ebe327657ed4aaaa92d7f2d6e0cb04a6b3b (diff)
bluebey: ぶるべー スタジオのページを公開
Diffstat (limited to 'public/bluebey-studio/src/style.css')
-rw-r--r--public/bluebey-studio/src/style.css673
1 files changed, 673 insertions, 0 deletions
diff --git a/public/bluebey-studio/src/style.css b/public/bluebey-studio/src/style.css
new file mode 100644
index 0000000..2ca7148
--- /dev/null
+++ b/public/bluebey-studio/src/style.css
@@ -0,0 +1,673 @@
+:root {
+ --accent: #7b53d1;
+ --accent-soft: #efe8fd;
+ --accent-2: #b498ff;
+ --text: #2b2433;
+ --muted: #6f6682;
+ --border: #e4dff0;
+ --card: rgba(255, 255, 255, 0.94);
+ --radius: 12px;
+ --panel-width: 344px;
+}
+
+* { box-sizing: border-box; }
+
+html, body {
+ margin: 0;
+ height: 100%;
+ overflow: hidden;
+}
+
+body {
+ font-family: system-ui, -apple-system, "Segoe UI", "Hiragino Kaku Gothic ProN", "Noto Sans JP", Meiryo, sans-serif;
+ color: var(--text);
+ background: radial-gradient(120% 120% at 30% 0%, #f7f5fc 0%, #ece8f4 60%, #e4e0ee 100%);
+ -webkit-font-smoothing: antialiased;
+}
+
+/* ------------------------------------------------------------------ viewport */
+
+/*
+ * The canvas gets its size from #stage, never from its own width/height
+ * attributes: a canvas is a replaced element, so `width: auto` would make its
+ * layout follow those attributes - and since the renderer writes them, that
+ * becomes a resize feedback loop that leaves the picture blank.
+ */
+#stage {
+ position: fixed;
+ inset: 0;
+}
+
+body:not(.panel-hidden) #stage {
+ right: var(--panel-width);
+}
+
+#view {
+ display: block;
+ width: 100%;
+ height: 100%;
+ touch-action: none;
+ outline: none;
+}
+
+/* ------------------------------------------------------------------- topbar */
+
+#topbar {
+ position: fixed;
+ top: 14px;
+ left: 16px;
+ z-index: 20;
+ display: flex;
+ align-items: center;
+ gap: 14px;
+ max-width: calc(100vw - var(--panel-width) - 48px);
+}
+
+#topbar h1 {
+ margin: 0;
+ font-size: 16px;
+ font-weight: 700;
+ letter-spacing: 0.02em;
+ color: #4b3a72;
+ text-shadow: 0 1px 0 rgba(255, 255, 255, 0.7);
+}
+
+.topbar-actions { display: flex; flex-wrap: wrap; gap: 6px; }
+
+#topbar button {
+ font: inherit;
+ font-size: 12px;
+ padding: 6px 11px;
+ border-radius: 999px;
+ border: 1px solid rgba(123, 83, 209, 0.22);
+ background: rgba(255, 255, 255, 0.86);
+ color: #5a4a7d;
+ cursor: pointer;
+ backdrop-filter: blur(6px);
+ transition: background 0.15s, transform 0.1s;
+}
+
+#topbar button:hover { background: #fff; transform: translateY(-1px); }
+#topbar button:active { transform: translateY(0); }
+#topbar button[aria-pressed="true"] { background: var(--accent-soft); color: var(--accent); }
+
+#viewport-hint {
+ position: fixed;
+ left: 18px;
+ bottom: 14px;
+ z-index: 10;
+ margin: 0;
+ font-size: 11.5px;
+ color: #8a80a0;
+ pointer-events: none;
+}
+
+/* -------------------------------------------------------------------- panel */
+
+#panel {
+ position: fixed;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ width: var(--panel-width);
+ padding: 14px 14px 40px;
+ overflow-y: auto;
+ overflow-x: hidden;
+ background: var(--card);
+ border-left: 1px solid var(--border);
+ backdrop-filter: blur(10px);
+ z-index: 30;
+ scrollbar-width: thin;
+}
+
+#panel::-webkit-scrollbar { width: 9px; }
+#panel::-webkit-scrollbar-thumb { background: #d8d1e8; border-radius: 9px; }
+
+body.panel-hidden #panel { display: none; }
+
+body.panel-hidden #topbar { max-width: calc(100vw - 48px); }
+
+@media (max-width: 780px) {
+ :root { --panel-width: min(88vw, 344px); }
+ #topbar { max-width: calc(100vw - 60px); }
+}
+
+/* ----------------------------------------------------------------- sections */
+
+.tabs {
+ position: sticky;
+ top: 0;
+ z-index: 3;
+ display: flex;
+ gap: 4px;
+ padding: 2px 0 10px;
+ margin: -2px 0 4px;
+ background: linear-gradient(var(--card) 72%, rgba(255, 255, 255, 0));
+}
+
+.tab {
+ flex: 1;
+ font: inherit;
+ font-size: 12px;
+ padding: 8px 2px;
+ border: 1px solid var(--border);
+ border-radius: 9px;
+ background: #fff;
+ color: var(--muted);
+ cursor: pointer;
+ white-space: nowrap;
+}
+
+.tab:hover { border-color: var(--accent-2); }
+.tab.active { background: var(--accent); border-color: var(--accent); color: #fff; font-weight: 600; }
+.tab-panel[hidden] { display: none; }
+
+.details {
+ border: 1px dashed var(--border);
+ border-radius: 9px;
+ padding: 0 9px;
+ background: #fdfcff;
+}
+.details > summary {
+ font-size: 11px;
+ color: var(--muted);
+ cursor: pointer;
+ padding: 6px 0;
+ list-style-position: inside;
+}
+.details[open] > summary { color: var(--accent); }
+.details-body { display: grid; gap: 8px; padding: 2px 0 9px; }
+
+.sec {
+ background: #fff;
+ border: 1px solid var(--border);
+ border-radius: var(--radius);
+ margin-bottom: 10px;
+ overflow: hidden;
+ box-shadow: 0 1px 2px rgba(53, 38, 90, 0.04);
+}
+
+.sec-head {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ gap: 8px;
+ width: 100%;
+ padding: 10px 12px;
+ margin: 0;
+ border: 0;
+ background: #fff;
+ font: inherit;
+ font-size: 12.5px;
+ font-weight: 700;
+ color: #4b3a72;
+ text-align: left;
+ cursor: pointer;
+}
+
+.sec-head .chev { color: var(--muted); font-size: 10px; transition: transform 0.18s; }
+.sec.closed .chev { transform: rotate(-90deg); }
+.sec-body { padding: 2px 12px 12px; display: grid; gap: 9px; }
+.sec.closed .sec-body { display: none; }
+
+/* -------------------------------------------------------------------- rows */
+
+.row { display: grid; grid-template-columns: 82px minmax(0, 1fr); gap: 8px; align-items: center; }
+.row.wide { grid-template-columns: 1fr; gap: 5px; }
+.row > .label { font-size: 11.5px; color: var(--muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
+.control { display: flex; align-items: center; gap: 7px; min-width: 0; }
+.hint { font-size: 11px; line-height: 1.55; color: var(--muted); }
+.hint b { color: #5a4a7d; }
+.subhead {
+ font-size: 10.5px;
+ font-weight: 700;
+ letter-spacing: 0.06em;
+ color: #8d80ab;
+ text-transform: uppercase;
+ margin-top: 3px;
+}
+.select {
+ flex: 1;
+ min-width: 0;
+ font: inherit;
+ font-size: 11.5px;
+ padding: 5px 6px;
+ border: 1px solid var(--border);
+ border-radius: 8px;
+ background: #fff;
+ color: var(--text);
+}
+.stack { display: grid; gap: 6px; }
+.grid2 { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; }
+.grid3 { display: grid; grid-template-columns: repeat(3, 1fr); gap: 6px; }
+
+input[type="range"] {
+ flex: 1;
+ min-width: 0;
+ height: 18px;
+ accent-color: var(--accent);
+ cursor: pointer;
+}
+
+.num {
+ flex: 0 0 auto;
+ min-width: 40px;
+ font-size: 11px;
+ color: #5a4a7d;
+ font-variant-numeric: tabular-nums;
+ text-align: right;
+}
+
+.seg { display: inline-flex; flex-wrap: wrap; padding: 2px; gap: 2px; background: #f2eff9; border-radius: 999px; }
+.seg button {
+ font: inherit;
+ font-size: 11px;
+ padding: 4px 9px;
+ border: 0;
+ border-radius: 999px;
+ background: transparent;
+ color: var(--muted);
+ cursor: pointer;
+ white-space: nowrap;
+}
+.seg button.active { background: #fff; color: var(--accent); box-shadow: 0 1px 3px rgba(53, 38, 90, 0.16); }
+
+.btn {
+ font: inherit;
+ font-size: 11.5px;
+ padding: 6px 10px;
+ border: 1px solid var(--border);
+ border-radius: 8px;
+ background: #fff;
+ color: var(--text);
+ cursor: pointer;
+ white-space: nowrap;
+}
+.btn:hover { border-color: var(--accent-2); }
+.btn.primary { background: var(--accent); border-color: var(--accent); color: #fff; }
+.btn.primary:hover { background: #6b45c2; }
+.btn:disabled { opacity: 0.45; cursor: default; }
+.buttons { display: flex; flex-wrap: wrap; gap: 6px; }
+
+.chk { display: inline-flex; align-items: center; gap: 6px; font-size: 11.5px; color: #4b3a72; cursor: pointer; }
+.chk input { accent-color: var(--accent); width: 14px; height: 14px; }
+
+.pad-wrap { display: flex; gap: 10px; align-items: center; }
+.pad {
+ position: relative;
+ flex: 0 0 auto;
+ width: 118px;
+ height: 118px;
+ border-radius: 14px;
+ border: 1px solid var(--border);
+ background:
+ linear-gradient(#f0ecfa, #f0ecfa) 50% 0 / 1px 100% no-repeat,
+ linear-gradient(#f0ecfa, #f0ecfa) 0 50% / 100% 1px no-repeat,
+ #faf8ff;
+ cursor: crosshair;
+ touch-action: none;
+}
+.pad-dot {
+ position: absolute;
+ width: 13px;
+ height: 13px;
+ margin: -7px 0 0 -7px;
+ border-radius: 50%;
+ background: var(--accent);
+ box-shadow: 0 1px 4px rgba(53, 38, 90, 0.35);
+ pointer-events: none;
+}
+.pad-eye {
+ position: absolute;
+ inset: 0;
+ margin: auto;
+ width: 46px;
+ height: 46px;
+ border-radius: 50%;
+ border: 1px dashed #d9d1ec;
+ pointer-events: none;
+}
+
+/* Tail picker: a 3x3 grid where a dot's place is the direction it means, so
+ the whole pad fits next to an 82px label even in a narrow panel. */
+.tail-pad {
+ display: grid;
+ grid-template-columns: repeat(3, 1fr);
+ grid-template-rows: repeat(3, 1fr);
+ place-items: center;
+ flex: 0 0 auto;
+ width: 128px;
+ height: 128px;
+ padding: 10px;
+ border-radius: 14px;
+ border: 1px solid var(--border);
+ background: #faf8ff;
+}
+.tail-dot {
+ width: 28px;
+ height: 28px;
+ padding: 0;
+ border: 0;
+ border-radius: 50%;
+ background: #ded6f0;
+ cursor: pointer;
+ transition: background 0.12s, transform 0.1s;
+}
+.tail-dot:hover { background: var(--accent-2); transform: scale(1.1); }
+.tail-dot.active {
+ background: var(--accent);
+ box-shadow: 0 1px 4px rgba(53, 38, 90, 0.35);
+}
+
+.swatches { display: flex; gap: 5px; flex-wrap: wrap; }
+.swatch { width: 17px; height: 17px; border-radius: 5px; border: 1px solid rgba(43, 36, 51, 0.18); cursor: pointer; }
+input[type="color"] {
+ width: 30px;
+ height: 22px;
+ padding: 0;
+ border: 1px solid var(--border);
+ border-radius: 6px;
+ background: #fff;
+ cursor: pointer;
+}
+
+.bone-list {
+ max-height: 168px;
+ overflow-y: auto;
+ border: 1px solid var(--border);
+ border-radius: 9px;
+ padding: 4px;
+ display: grid;
+ gap: 2px;
+ background: #fcfbff;
+}
+.bone-item {
+ display: flex;
+ justify-content: space-between;
+ gap: 8px;
+ padding: 4px 8px;
+ border: 0;
+ border-radius: 6px;
+ background: transparent;
+ font: inherit;
+ font-size: 11.5px;
+ color: var(--text);
+ text-align: left;
+ cursor: pointer;
+}
+.bone-item:hover { background: #f4f0fd; }
+.bone-item.active { background: var(--accent-soft); color: var(--accent); font-weight: 600; }
+.bone-item small { color: var(--muted); font-size: 10.5px; }
+
+/* --------------------------------------------------------------------- 擬音 */
+
+/*
+ * The stamps are painted onto the caption canvas, which is `pointer-events:
+ * none`, so each one gets its own transparent drag box on top - the same trick
+ * the bubbles use. The box follows the stamp's rotation. Its z-index sits below
+ * the caption handles (3), because the bubbles are drawn over the stamps and so
+ * must stay grabbable where the two overlap.
+ */
+.gion-handle {
+ position: absolute;
+ display: none;
+ cursor: move;
+ touch-action: none;
+ pointer-events: auto;
+ z-index: 2;
+ border: 1px dashed transparent;
+ border-radius: 4px;
+}
+.gion-handle.selected {
+ border-color: var(--accent);
+ box-shadow: 0 0 0 2px rgba(123, 83, 209, 0.18);
+}
+
+.gion-list { display: grid; gap: 10px; }
+.gion-item-head { display: flex; align-items: center; gap: 8px; }
+.gion-thumb {
+ flex: 0 0 auto;
+ width: 84px;
+ height: 56px;
+ background: #f3f0fa;
+ border: 1px solid var(--border);
+ border-radius: 8px;
+ cursor: pointer;
+}
+.gion-item.active .gion-thumb { border-color: var(--accent); box-shadow: 0 0 0 2px var(--accent-soft); }
+
+/* The picker covers the whole window, so even a big sheet has room to draw on. */
+.gion-picker {
+ position: fixed;
+ inset: 0;
+ z-index: 95;
+ display: flex;
+ flex-direction: column;
+ gap: 10px;
+ padding: 16px;
+ background: rgba(24, 16, 44, 0.86);
+ backdrop-filter: blur(4px);
+}
+.gion-picker-bar {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ gap: 14px;
+ flex-wrap: wrap;
+ color: #fff;
+}
+.gion-picker-title { font-size: 13.5px; font-weight: 700; }
+.gion-picker-actions { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
+.gion-picker-actions .hint { color: #cfc6e6; }
+.gion-picker-board {
+ position: relative;
+ flex: 1;
+ min-height: 0;
+ overflow: hidden;
+ border-radius: 12px;
+ /* A checkerboard reads as "transparent", so a PNG sheet's holes are obvious. */
+ background:
+ linear-gradient(45deg, #2b2344 25%, transparent 25%) 0 0 / 22px 22px,
+ linear-gradient(-45deg, #2b2344 25%, transparent 25%) 0 11px / 22px 22px,
+ linear-gradient(45deg, transparent 75%, #2b2344 75%) 11px -11px / 22px 22px,
+ linear-gradient(-45deg, transparent 75%, #2b2344 75%) -11px 0 / 22px 22px,
+ #241d3a;
+ cursor: crosshair;
+ touch-action: none;
+}
+.gion-picker-sheet {
+ position: absolute;
+ display: block;
+ user-select: none;
+ -webkit-user-drag: none;
+ pointer-events: none;
+}
+.gion-picker-marquee {
+ position: absolute;
+ display: none;
+ border: 1.5px solid #fff;
+ background: rgba(180, 152, 255, 0.28);
+ box-shadow: 0 0 0 9999px rgba(20, 12, 40, 0.42);
+ pointer-events: none;
+}
+
+/* -------------------------------------------------------------------- toast */
+
+#notice {
+ position: fixed;
+ left: 50%;
+ top: 14px;
+ transform: translateX(-50%);
+ z-index: 95;
+ max-width: min(560px, 90vw);
+ padding: 10px 16px;
+ border-radius: 12px;
+ background: #fff4e5;
+ border: 1px solid #f0c48a;
+ color: #7a4a12;
+ font-size: 12px;
+ line-height: 1.65;
+ white-space: pre-line;
+ box-shadow: 0 6px 20px rgba(43, 36, 51, 0.15);
+}
+
+#notice[hidden] { display: none; }
+
+/* ------------------------------------------------ 起動時のご利用について */
+#start-notice {
+ position: fixed;
+ inset: 0;
+ z-index: 96;
+ display: grid;
+ place-items: center;
+ padding: 24px;
+ background: rgba(43, 36, 51, 0.5);
+ backdrop-filter: blur(3px);
+}
+#start-notice[hidden] { display: none; }
+
+.start-sheet {
+ width: min(560px, 100%);
+ max-height: 86vh;
+ overflow: auto;
+ padding: 22px 26px;
+ border-radius: 16px;
+ background: #fff;
+ color: #2b2433;
+ box-shadow: 0 18px 50px rgba(0, 0, 0, 0.35);
+ font-size: 13.5px;
+ line-height: 1.75;
+}
+.start-sheet h2 { margin: 0 0 12px; font-size: 17px; }
+.start-sheet p { margin: 0 0 10px; }
+.start-sheet ul { margin: 0 0 12px; padding-left: 1.3em; }
+.start-actions {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ gap: 12px;
+ flex-wrap: wrap;
+ margin-top: 16px;
+}
+.start-skip { display: flex; align-items: center; gap: 6px; font-size: 12px; color: #6b5d7a; }
+.start-ok {
+ border: 0;
+ border-radius: 8px;
+ padding: 9px 22px;
+ background: #6b4ea8;
+ color: #fff;
+ font-size: 13.5px;
+ cursor: pointer;
+}
+
+#toast {
+ position: fixed;
+ left: 50%;
+ bottom: 26px;
+ transform: translate(-50%, 14px);
+ z-index: 70;
+ padding: 8px 16px;
+ border-radius: 999px;
+ background: rgba(43, 36, 51, 0.9);
+ color: #fff;
+ font-size: 12px;
+ opacity: 0;
+ pointer-events: none;
+ transition: opacity 0.2s, transform 0.2s;
+}
+#toast.show { opacity: 1; transform: translate(-50%, 0); }
+
+/* ------------------------------------------------------------------ loading */
+
+#loading {
+ position: fixed;
+ inset: 0;
+ z-index: 80;
+ display: grid;
+ place-items: center;
+ background: rgba(244, 242, 250, 0.94);
+ transition: opacity 0.35s;
+}
+#loading.done { opacity: 0; pointer-events: none; }
+
+.loading-box { text-align: center; max-width: 520px; padding: 24px; }
+.loading-spinner {
+ width: 34px;
+ height: 34px;
+ margin: 0 auto 14px;
+ border-radius: 50%;
+ border: 3px solid #e0d8f2;
+ border-top-color: var(--accent);
+ animation: spin 0.9s linear infinite;
+}
+@keyframes spin { to { transform: rotate(360deg); } }
+#loading-text { margin: 0; font-size: 13px; color: #5a4a7d; }
+#loading-error {
+ margin: 12px 0 0;
+ font-size: 12px;
+ line-height: 1.7;
+ color: #b3261e;
+ white-space: pre-wrap;
+ text-align: left;
+}
+
+/* --------------------------------------------------------------------- help */
+
+#help {
+ position: fixed;
+ inset: 0;
+ z-index: 90;
+ display: grid;
+ place-items: center;
+ padding: 24px;
+ background: rgba(43, 36, 51, 0.42);
+ backdrop-filter: blur(3px);
+}
+#help[hidden] { display: none; }
+
+.help-sheet {
+ position: relative;
+ width: min(760px, 100%);
+ max-height: min(84vh, 900px);
+ overflow-y: auto;
+ padding: 26px 30px 32px;
+ background: #fff;
+ border-radius: 18px;
+ box-shadow: 0 24px 60px rgba(20, 12, 40, 0.3);
+ font-size: 13px;
+ line-height: 1.75;
+}
+.help-sheet h2 { margin: 0 0 14px; font-size: 17px; color: #4b3a72; }
+.help-sheet h3 { margin: 20px 0 6px; font-size: 13.5px; color: var(--accent); }
+.help-sheet ul { margin: 0; padding-left: 1.25em; }
+.help-sheet li { margin: 3px 0; }
+.help-sheet code { background: #f3f0fa; padding: 1px 5px; border-radius: 5px; font-size: 12px; }
+.help-sheet .keys { list-style: none; padding: 0; display: grid; gap: 4px; }
+.help-close {
+ position: absolute;
+ top: 12px;
+ right: 14px;
+ width: 32px;
+ height: 32px;
+ border: 0;
+ border-radius: 50%;
+ background: #f3f0fa;
+ color: #5a4a7d;
+ font-size: 19px;
+ line-height: 1;
+ cursor: pointer;
+}
+.help-close:hover { background: #e8e2f7; }
+
+kbd {
+ display: inline-block;
+ min-width: 20px;
+ padding: 1px 6px;
+ border: 1px solid var(--border);
+ border-bottom-width: 2px;
+ border-radius: 5px;
+ background: #faf9fe;
+ font: inherit;
+ font-size: 11px;
+ text-align: center;
+}