styles.css (87061B)
1 :root { 2 --bg: #060611; 3 --panel: #0c0c18; 4 --text: #f6f0ff; 5 --muted-pct: 65; 6 --line-pct: 10; 7 --panel2-pct: 2; 8 --muted: color-mix(in srgb, var(--text) calc(var(--muted-pct) * 1%), transparent); 9 --line: color-mix(in srgb, var(--text) calc(var(--line-pct) * 1%), transparent); 10 --panel2: color-mix(in srgb, var(--text) calc(var(--panel2-pct) * 1%), transparent); 11 --accent: #ff3ea5; 12 --accent2: #b84bff; 13 --warn: #ffb84d; 14 --warn2: #ff7a18; 15 --font-body: ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, "Apple Color Emoji", "Segoe UI Emoji"; 16 --font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; 17 --good: #3ddc97; 18 --bad: #ff4d8a; 19 --sidebar-width: 320px; 20 --sidebar-min: 240px; 21 --chat-width: 640px; 22 --chat-min: 380px; 23 --mod-width: 360px; 24 --mod-min: 280px; 25 --people-width: 360px; 26 --people-min: 320px; 27 --dur-fast: 110ms; 28 --dur-med: 180ms; 29 --dur-slow: 260ms; 30 --ease-out: cubic-bezier(0.22, 1, 0.36, 1); 31 --ease-soft: cubic-bezier(0.2, 0.8, 0.2, 1); 32 --shadow-panel: 0 20px 70px rgba(0, 0, 0, 0.45); 33 --shadow-soft: 0 12px 34px rgba(0, 0, 0, 0.35); 34 --font-size-base: 15px; 35 --font-size-small: 11px; 36 --app-gap: 12px; 37 --app-pad: 12px; 38 --panel-pad: 14px; 39 --panel-header-pad-y: 10px; 40 --panel-header-pad-x: 12px; 41 --label-font-size: 12px; 42 --label-gap: 6px; 43 --control-pad-y: 10px; 44 --control-pad-x: 10px; 45 --btn-pad-y: 10px; 46 --btn-pad-x: 12px; 47 --chat-rail-inset: 12px; 48 --chat-rail-side-max: 66%; 49 --chat-rail-center-max: 70%; 50 --hotbar-safe-lane: 0px; 51 } 52 53 :root[data-ui-scale="xs"] { 54 --font-size-base: 12px; 55 --font-size-small: 9px; 56 --app-gap: 7px; 57 --app-pad: 7px; 58 --panel-pad: 10px; 59 --panel-header-pad-y: 8px; 60 --panel-header-pad-x: 10px; 61 --label-font-size: 11px; 62 --label-gap: 5px; 63 --control-pad-y: 8px; 64 --control-pad-x: 9px; 65 --btn-pad-y: 8px; 66 --btn-pad-x: 10px; 67 } 68 69 :root[data-ui-scale="sm"] { 70 --font-size-base: 13px; 71 --font-size-small: 10px; 72 --app-gap: 9px; 73 --app-pad: 9px; 74 --panel-pad: 12px; 75 --panel-header-pad-y: 9px; 76 --panel-header-pad-x: 11px; 77 --label-font-size: 12px; 78 --label-gap: 6px; 79 --control-pad-y: 9px; 80 --control-pad-x: 10px; 81 --btn-pad-y: 9px; 82 --btn-pad-x: 11px; 83 } 84 85 :root[data-ui-scale="md"] { 86 --font-size-base: 15px; 87 --font-size-small: 11px; 88 --app-gap: 12px; 89 --app-pad: 12px; 90 } 91 92 :root[data-ui-scale="lg"] { 93 --font-size-base: 16px; 94 --font-size-small: 12px; 95 --app-gap: 14px; 96 --app-pad: 14px; 97 } 98 99 :root[data-aspect="threeTwo"] { 100 --sidebar-width: 300px; 101 --sidebar-min: 230px; 102 --chat-width: 600px; 103 --chat-min: 360px; 104 --people-width: 340px; 105 --people-min: 300px; 106 --mod-width: 340px; 107 --mod-min: 280px; 108 --app-gap: 10px; 109 --app-pad: 10px; 110 --chat-rail-side-max: 70%; 111 --chat-rail-center-max: 74%; 112 } 113 114 :root[data-aspect="fourThree"] { 115 --sidebar-width: 280px; 116 --sidebar-min: 220px; 117 --chat-width: 560px; 118 --chat-min: 340px; 119 --people-width: 320px; 120 --people-min: 280px; 121 --mod-width: 320px; 122 --mod-min: 260px; 123 --app-gap: 10px; 124 --app-pad: 10px; 125 --chat-rail-side-max: 74%; 126 --chat-rail-center-max: 78%; 127 } 128 129 :root[data-aspect="portrait"] { 130 --sidebar-width: 300px; 131 --sidebar-min: 230px; 132 --chat-width: 520px; 133 --chat-min: 320px; 134 --people-width: 320px; 135 --people-min: 260px; 136 --mod-width: 320px; 137 --mod-min: 260px; 138 --app-gap: 10px; 139 --app-pad: 10px; 140 --chat-rail-inset: 10px; 141 --chat-rail-side-max: 88%; 142 --chat-rail-center-max: 88%; 143 } 144 145 :root[data-aspect="ultrawide"] { 146 --sidebar-width: 340px; 147 --sidebar-min: 260px; 148 --chat-width: 720px; 149 --chat-min: 420px; 150 --people-width: 400px; 151 --people-min: 340px; 152 --mod-width: 400px; 153 --mod-min: 320px; 154 --chat-rail-side-max: 62%; 155 --chat-rail-center-max: 66%; 156 } 157 158 :root[data-viewport="xs"] { 159 --sidebar-width: 230px; 160 --sidebar-min: 210px; 161 --chat-width: 480px; 162 --chat-min: 300px; 163 --people-width: 260px; 164 --people-min: 250px; 165 --mod-width: 260px; 166 --mod-min: 250px; 167 --app-gap: 8px; 168 --app-pad: 8px; 169 --chat-rail-inset: 10px; 170 --chat-rail-side-max: 92%; 171 --chat-rail-center-max: 92%; 172 } 173 174 :root[data-viewport="sm"] { 175 --sidebar-width: 290px; 176 --sidebar-min: 220px; 177 --chat-width: 600px; 178 --chat-min: 340px; 179 --people-width: 320px; 180 --people-min: 280px; 181 --mod-width: 320px; 182 --mod-min: 260px; 183 --app-gap: 11px; 184 --app-pad: 11px; 185 --chat-rail-side-max: 78%; 186 --chat-rail-center-max: 82%; 187 } 188 189 * { 190 box-sizing: border-box; 191 } 192 193 body { 194 margin: 0; 195 height: 100vh; 196 font-family: var(--font-body); 197 font-size: var(--font-size-base); 198 background: radial-gradient(1200px 800px at 10% 0%, color-mix(in srgb, var(--accent) 18%, transparent), transparent 55%), 199 radial-gradient(900px 700px at 90% 10%, color-mix(in srgb, var(--accent2) 14%, transparent), transparent 50%), var(--bg); 200 color: var(--text); 201 } 202 203 .app * { 204 -webkit-tap-highlight-color: transparent; 205 } 206 207 .app { 208 color-scheme: dark; 209 } 210 211 .app, 212 .sidebar, 213 .main, 214 .chat, 215 .moderation, 216 .feed, 217 .chatMessages, 218 .modBody, 219 .peopleDrawer, 220 .peopleList, 221 .modalBody { 222 scrollbar-gutter: stable; 223 } 224 225 * { 226 scrollbar-width: thin; 227 scrollbar-color: color-mix(in srgb, var(--accent) 28%, transparent) rgba(0, 0, 0, 0); 228 } 229 230 ::-webkit-scrollbar { 231 width: 10px; 232 height: 10px; 233 } 234 235 ::-webkit-scrollbar-thumb { 236 background: color-mix(in srgb, var(--accent) 22%, transparent); 237 border-radius: 999px; 238 border: 2px solid rgba(0, 0, 0, 0); 239 background-clip: content-box; 240 } 241 242 ::-webkit-scrollbar-thumb:hover { 243 background: color-mix(in srgb, var(--accent) 34%, transparent); 244 border: 2px solid rgba(0, 0, 0, 0); 245 background-clip: content-box; 246 } 247 248 ::-webkit-scrollbar-corner { 249 background: transparent; 250 } 251 252 .app ::selection { 253 background: color-mix(in srgb, var(--accent) 25%, transparent); 254 } 255 256 .app a { 257 color: #ffd2ea; 258 text-decoration: none; 259 } 260 261 .app a:hover { 262 text-decoration: underline; 263 } 264 265 .app a:focus-visible { 266 outline: none; 267 box-shadow: 0 0 0 3px color-mix(in srgb, var(--accent) 18%, transparent), 0 0 0 1px color-mix(in srgb, var(--accent) 35%, transparent) inset; 268 border-radius: 10px; 269 } 270 271 .hidden { 272 display: none !important; 273 } 274 275 .small { 276 font-size: var(--font-size-small); 277 } 278 279 .muted { 280 color: var(--muted); 281 } 282 283 .app { 284 display: grid; 285 grid-template-columns: minmax(var(--sidebar-min), var(--sidebar-width)) 10px minmax(var(--chat-min), var(--chat-width)) 10px 1fr; 286 grid-template-areas: "sidebar sidebarResize chat chatResize main"; 287 gap: 0; 288 padding: var(--app-pad); 289 padding-bottom: calc(var(--app-pad) + var(--hotbar-safe-lane)); 290 height: 100vh; 291 overflow: hidden; 292 position: relative; 293 } 294 295 .app.hotbarVisible { 296 --hotbar-safe-lane: calc(82px + env(safe-area-inset-bottom, 0px)); 297 } 298 299 .app.rackMode { 300 grid-template-columns: minmax(var(--sidebar-min), var(--sidebar-width)) 10px 1fr 10px minmax(var(--people-min), var(--people-width)); 301 grid-template-areas: "sidebar sidebarResize main mainResize rightRack"; 302 } 303 304 .app.rackMode .peopleToggle { 305 display: none !important; 306 } 307 308 .app.rackMode.rightCollapsed, 309 .app.rackMode.hasMod.rightCollapsed { 310 grid-template-columns: minmax(var(--sidebar-min), var(--sidebar-width)) 10px 1fr; 311 grid-template-areas: "sidebar sidebarResize main"; 312 } 313 314 .app.rackMode.rightCollapsed #rightRack { 315 display: none !important; 316 } 317 318 .app.rackMode.rightCollapsed .mainResizeHandle { 319 display: none !important; 320 } 321 322 .app.sideCollapsed #mainSideRack { 323 display: none !important; 324 } 325 326 .app.sideRackEmpty #mainSideRack { 327 display: none !important; 328 } 329 330 .sideRackToggle { 331 position: absolute; 332 top: 12px; 333 right: 12px; 334 z-index: 60; 335 } 336 337 .app.rackMode.rightCollapsed .sideRackToggle { 338 right: 64px; 339 } 340 341 .app.rackMode.sideCollapsed .sideRackToggle { 342 display: block !important; 343 } 344 345 .app.rackMode:not(.sideCollapsed) .sideRackToggle { 346 display: none !important; 347 } 348 349 .rightRackToggle { 350 position: absolute; 351 top: 12px; 352 right: 12px; 353 z-index: 70; 354 } 355 356 .app.rackMode.rightCollapsed .rightRackToggle { 357 display: block !important; 358 } 359 360 .app.rackMode:not(.rightCollapsed) .rightRackToggle { 361 display: none !important; 362 } 363 364 .pluginPanel .panelBody { 365 display: flex; 366 flex-direction: column; 367 min-height: 0; 368 } 369 370 .pluginRackPanel .pluginRackBody { 371 display: flex; 372 flex-direction: column; 373 min-height: 0; 374 } 375 376 .pluginRackToolbar { 377 display: flex; 378 align-items: center; 379 gap: 10px; 380 padding: 8px 10px; 381 border-bottom: 1px solid color-mix(in srgb, var(--text) 10%, transparent); 382 } 383 384 .pluginRackWidgets { 385 flex: 1; 386 min-height: 0; 387 overflow: auto; 388 display: flex; 389 flex-direction: column; 390 gap: var(--app-gap); 391 padding: 10px; 392 } 393 394 .pluginRackWidgets > .rackPanel { 395 flex: 0 0 auto; 396 min-height: 0; 397 } 398 399 .app.rackMode.hasMod { 400 /* In rack mode, mod is just another panel inside the right rack. */ 401 grid-template-columns: minmax(var(--sidebar-min), var(--sidebar-width)) 10px 1fr 10px minmax(var(--people-min), var(--people-width)); 402 grid-template-areas: "sidebar sidebarResize main mainResize rightRack"; 403 } 404 405 .app.hasMod { 406 grid-template-columns: minmax(var(--sidebar-min), var(--sidebar-width)) 10px minmax(var(--chat-min), var(--chat-width)) 10px 1fr 10px minmax(var(--mod-min), var(--mod-width)); 407 grid-template-areas: "sidebar sidebarResize chat chatResize main mainResize moderation"; 408 } 409 410 .app.chatRight { 411 grid-template-columns: minmax(var(--sidebar-min), var(--sidebar-width)) 10px 1fr 10px minmax(var(--chat-min), var(--chat-width)); 412 grid-template-areas: "sidebar sidebarResize main chatResize chat"; 413 } 414 415 .app.hasMod.chatRight { 416 grid-template-columns: minmax(var(--sidebar-min), var(--sidebar-width)) 10px 1fr 10px minmax(var(--chat-min), var(--chat-width)) 10px minmax(var(--mod-min), var(--mod-width)); 417 grid-template-areas: "sidebar sidebarResize main chatResize chat mainResize moderation"; 418 } 419 420 .app.rackMode.chatRight, 421 .app.rackMode.hasMod.chatRight { 422 grid-template-columns: minmax(var(--sidebar-min), var(--sidebar-width)) 10px 1fr 10px minmax(var(--people-min), var(--people-width)); 423 grid-template-areas: "sidebar sidebarResize main mainResize rightRack"; 424 } 425 426 @media (hover: none) and (pointer: coarse) and (max-width: 900px), (hover: none) and (pointer: coarse) and (max-height: 520px) { 427 .app { 428 grid-template-columns: 300px 1fr; 429 grid-template-rows: 1fr auto; 430 grid-template-areas: 431 "sidebar main" 432 "chat chat"; 433 gap: var(--app-gap); 434 } 435 .app.hasMod { 436 grid-template-columns: 300px 1fr; 437 grid-template-rows: 1fr 45vh; 438 grid-template-areas: 439 "sidebar main" 440 "chat moderation"; 441 } 442 .chat { 443 height: 45vh; 444 } 445 .moderation { 446 height: 45vh; 447 } 448 .panelResizeHandle, 449 .peopleResizeHandle { 450 display: none; 451 } 452 453 .mainRack { 454 flex-direction: column; 455 } 456 .sideRack { 457 flex: 0 0 auto; 458 min-width: 0; 459 max-width: none; 460 } 461 } 462 463 @media (max-width: 760px), (hover: none) and (pointer: coarse) and (max-width: 900px), (hover: none) and (pointer: coarse) and (max-height: 520px) { 464 .app.sidebarHidden { 465 grid-template-columns: 1fr; 466 grid-template-rows: 1fr auto; 467 grid-template-areas: 468 "main" 469 "chat"; 470 } 471 } 472 473 .sidebar, 474 .main, 475 .chat, 476 .moderation, 477 .panelResizeHandle { 478 min-width: 0; 479 min-height: 0; 480 } 481 482 .sidebar { 483 grid-area: sidebar; 484 display: flex; 485 flex-direction: column; 486 gap: 0; 487 overflow: hidden; 488 } 489 490 .rightRack { 491 grid-area: rightRack; 492 min-width: 0; 493 min-height: 0; 494 display: flex; 495 flex-direction: column; 496 gap: var(--app-gap); 497 overflow: hidden; 498 } 499 500 .rightRack .rackPanel { 501 flex: 1; 502 min-height: 0; 503 } 504 505 .sideRack .rackPanel { 506 flex: 1; 507 min-height: 0; 508 } 509 510 .rightRack .rackPanel.panelCollapsed, 511 .sideRack .rackPanel.panelCollapsed { 512 flex: 0 0 auto; 513 } 514 515 .rightRack .rackPanel > .panelBody, 516 .rightRack .rackPanel > .panelFill, 517 .rightRack .rackPanel .panelBody, 518 .sideRack .rackPanel > .panelBody, 519 .sideRack .rackPanel > .panelFill, 520 .sideRack .rackPanel .panelBody { 521 min-height: 0; 522 } 523 524 .panel.panelCollapsed { 525 overflow: hidden; 526 } 527 528 .panel.panelCollapsed > :not(.panelHeader) { 529 display: none !important; 530 } 531 532 .rackDragHandle { 533 cursor: grab; 534 user-select: none; 535 } 536 537 .rackDragHandle:active { 538 cursor: grabbing; 539 } 540 541 .rackDragging { 542 opacity: 0.86; 543 box-shadow: 0 26px 90px rgba(0, 0, 0, 0.65); 544 } 545 546 .rackPlaceholder { 547 border: 1px dashed color-mix(in srgb, var(--accent) 40%, transparent); 548 border-radius: 18px; 549 background: color-mix(in srgb, var(--accent) 10%, transparent); 550 } 551 552 .app.rackMode .panelHeader { 553 /* Slightly stronger header affordance in rack mode */ 554 background: linear-gradient(180deg, color-mix(in srgb, var(--text) 5%, transparent), transparent); 555 } 556 557 .app.rackMode .chat, 558 .app.rackMode .moderation, 559 .app.rackMode .peopleDrawer { 560 position: static; 561 grid-area: unset !important; 562 height: auto; 563 min-height: 0; 564 } 565 566 .app.rackMode .chatResizeHandle, 567 .app.rackMode .peopleResizeHandle { 568 display: none !important; 569 } 570 571 .app.rackMode .peopleDrawer { 572 display: flex; 573 flex-direction: column; 574 overflow: hidden; 575 border: 1px solid var(--line); 576 border-radius: 18px; 577 background: linear-gradient(180deg, color-mix(in srgb, var(--panel) 96%, transparent), color-mix(in srgb, var(--panel) 90%, transparent)); 578 box-shadow: var(--shadow-panel); 579 } 580 581 .dockHotbar { 582 position: fixed; 583 left: 50%; 584 bottom: 10px; 585 transform: translateX(-50%) translateY(28px); 586 opacity: 0; 587 pointer-events: none; 588 z-index: 60; 589 display: flex; 590 gap: 12px; 591 padding: 10px 12px; 592 max-width: calc(100vw - 24px); 593 overflow-x: auto; 594 overscroll-behavior: contain; 595 border-radius: 999px; 596 border: 1px solid color-mix(in srgb, var(--text) 12%, transparent); 597 background: color-mix(in srgb, var(--panel) 92%, transparent); 598 box-shadow: 0 16px 50px rgba(0, 0, 0, 0.45); 599 transition: transform var(--dur-med) var(--ease-out), opacity var(--dur-med) var(--ease-out); 600 } 601 602 .dockHotbar.show { 603 transform: translateX(-50%) translateY(0); 604 opacity: 1; 605 pointer-events: auto; 606 } 607 608 .dockHotbar.dockTarget { 609 border-color: color-mix(in srgb, var(--accent) 45%, transparent); 610 box-shadow: 0 22px 70px rgba(0, 0, 0, 0.6), 0 0 0 3px color-mix(in srgb, var(--accent) 12%, transparent); 611 } 612 613 .dockOrb.dragging { 614 opacity: 0.6; 615 } 616 617 .dockOrb { 618 display: inline-flex; 619 align-items: center; 620 gap: 9px; 621 flex: 0 0 auto; 622 max-width: 220px; 623 min-height: 38px; 624 padding: 8px 13px; 625 border-radius: 999px; 626 border: 1px solid var(--line); 627 background: color-mix(in srgb, var(--text) 6%, transparent); 628 color: var(--text); 629 cursor: grab; 630 user-select: none; 631 font-size: 13px; 632 font-weight: 600; 633 white-space: nowrap; 634 } 635 636 .dockOrb:hover { 637 background: color-mix(in srgb, var(--accent) 14%, transparent); 638 border-color: color-mix(in srgb, var(--accent) 25%, transparent); 639 } 640 641 .dockOrb:active { 642 cursor: grabbing; 643 } 644 645 .dockOrb .dockOrbIcon { 646 width: 22px; 647 height: 22px; 648 border-radius: 6px; 649 display: inline-flex; 650 align-items: center; 651 justify-content: center; 652 background: color-mix(in srgb, var(--accent) 22%, transparent); 653 } 654 655 .hotbarHint { 656 display: inline-flex; 657 align-items: center; 658 gap: 7px; 659 flex: 0 0 auto; 660 min-height: 38px; 661 padding: 8px 12px; 662 border-radius: 999px; 663 border: 1px dashed color-mix(in srgb, var(--text) 22%, transparent); 664 background: color-mix(in srgb, var(--text) 4%, transparent); 665 color: color-mix(in srgb, var(--text) 82%, transparent); 666 font-size: 12px; 667 white-space: nowrap; 668 } 669 670 .hotbarHintGrip { 671 font-weight: 700; 672 opacity: 0.9; 673 } 674 675 .hotbarHintSep { 676 opacity: 0.66; 677 } 678 679 .hotbarAddMenu { 680 position: fixed; 681 z-index: 90; 682 width: 260px; 683 max-height: min(320px, 70vh); 684 overflow: hidden; 685 border: 1px solid rgba(246, 240, 255, 0.16); 686 border-radius: 14px; 687 background: rgba(8, 8, 16, 0.92); 688 backdrop-filter: blur(12px); 689 box-shadow: 0 16px 60px rgba(0, 0, 0, 0.45); 690 animation: popFloat var(--dur-med) var(--ease-out) both; 691 } 692 693 .hotbarAddMenuList { 694 overflow: auto; 695 padding: 6px; 696 display: flex; 697 flex-direction: column; 698 gap: 6px; 699 } 700 701 .dockOrbPlus .dockOrbIcon { 702 background: color-mix(in srgb, var(--accent) 30%, transparent); 703 } 704 705 .sidebarScroll { 706 flex: 1; 707 min-height: 0; 708 overflow: auto; 709 padding-right: 4px; 710 display: flex; 711 flex-direction: column; 712 gap: 12px; 713 } 714 715 .sidebarFooter { 716 flex: 0 0 auto; 717 display: flex; 718 align-items: flex-end; 719 justify-content: space-between; 720 gap: 10px; 721 padding: 12px 14px 14px; 722 border-top: 1px solid var(--line); 723 background: linear-gradient(180deg, transparent, rgba(0, 0, 0, 0.22)); 724 } 725 726 .poweredByTile { 727 text-decoration: none; 728 color: inherit; 729 width: 220px; 730 height: 84px; 731 border-radius: 16px; 732 border: 1px solid rgba(246, 240, 255, 0.14); 733 background: linear-gradient(180deg, rgba(255, 62, 165, 0.10), rgba(184, 75, 255, 0.06) 55%), rgba(255, 255, 255, 0.02); 734 box-shadow: 0 14px 46px rgba(0, 0, 0, 0.32); 735 padding: 10px 12px; 736 display: flex; 737 flex-direction: row; 738 align-items: center; 739 justify-content: flex-start; 740 gap: 12px; 741 transition: transform 120ms ease, box-shadow 120ms ease, border-color 120ms ease; 742 } 743 744 a.poweredByTile:hover { 745 transform: translateY(-1px); 746 border-color: rgba(246, 240, 255, 0.24); 747 box-shadow: 0 18px 52px rgba(0, 0, 0, 0.36); 748 } 749 750 .poweredByLogo { 751 width: 56px; 752 height: 56px; 753 object-fit: contain; 754 border-radius: 14px; 755 filter: drop-shadow(0 10px 18px rgba(0, 0, 0, 0.42)); 756 } 757 758 .poweredByText { 759 display: flex; 760 flex-direction: column; 761 gap: 2px; 762 min-width: 0; 763 } 764 765 .poweredByTitle { 766 font-weight: 900; 767 font-size: 13px; 768 letter-spacing: 0.2px; 769 line-height: 1.1; 770 } 771 772 .poweredByByline { 773 font-size: 10px; 774 color: rgba(246, 240, 255, 0.62); 775 line-height: 1.1; 776 } 777 778 .poweredByVersion { 779 font-size: 10px; 780 color: rgba(246, 240, 255, 0.82); 781 line-height: 1.1; 782 } 783 784 .appearanceWorkbench { 785 margin-top: 12px; 786 padding: 10px; 787 border: 1px solid var(--line); 788 border-radius: 12px; 789 background: color-mix(in srgb, var(--panel2) 80%, transparent); 790 display: flex; 791 flex-direction: column; 792 gap: 10px; 793 } 794 795 .appearanceWorkbenchHeader { 796 display: flex; 797 align-items: baseline; 798 justify-content: space-between; 799 gap: 10px; 800 } 801 802 .appearanceWorkbenchRow { 803 display: flex; 804 gap: 10px; 805 flex-wrap: wrap; 806 } 807 808 .appearanceColorGrid { 809 display: grid; 810 gap: 10px; 811 grid-template-columns: repeat(3, minmax(0, 1fr)); 812 } 813 814 .appearanceWorkbenchActions { 815 display: flex; 816 gap: 8px; 817 flex-wrap: wrap; 818 } 819 820 @media (max-width: 980px) { 821 .appearanceColorGrid { 822 grid-template-columns: repeat(2, minmax(0, 1fr)); 823 } 824 } 825 826 .main { 827 grid-area: main; 828 display: flex; 829 flex-direction: column; 830 gap: var(--app-gap); 831 overflow: hidden; 832 } 833 834 .mainRack { 835 flex: 1; 836 min-height: 0; 837 display: flex; 838 flex-direction: row; 839 gap: var(--app-gap); 840 overflow: hidden; 841 } 842 843 .workspaceRack { 844 flex: 1; 845 min-width: 0; 846 min-height: 0; 847 display: flex; 848 flex-direction: column; 849 gap: var(--app-gap); 850 overflow: hidden; 851 } 852 853 .app.rackMode.workspaceInfinite .workspaceRack { 854 display: flex; 855 flex-direction: row; 856 align-items: stretch; 857 gap: var(--app-gap); 858 overflow-x: auto; 859 overflow-y: hidden; 860 scroll-snap-type: x mandatory; 861 scroll-behavior: smooth; 862 padding-bottom: 2px; 863 } 864 865 .app.rackMode.workspaceInfinite .workspaceRack > .rackPanel { 866 flex: 0 0 min(640px, 74vw); 867 min-width: 280px; 868 max-width: min(96vw, 1120px); 869 min-height: 0; 870 scroll-snap-align: start; 871 } 872 873 .app.rackMode.workspaceInfinite .workspaceRack > .rackPanel.workspaceSizeSkinny { 874 flex-basis: min(360px, 42vw); 875 } 876 877 .app.rackMode.workspaceInfinite .workspaceRack > .rackPanel.workspaceSizeHalf { 878 flex-basis: min(680px, 74vw); 879 } 880 881 .app.rackMode.workspaceInfinite .workspaceRack > .rackPanel.workspaceSizeFull { 882 flex-basis: min(1040px, 92vw); 883 } 884 885 .app.rackMode .workspaceRack > .rackPanel.workspaceArrivalGlow { 886 animation: workspaceArrivalGlow 780ms ease-out; 887 } 888 889 .app.rackMode.workspaceInfinite .workspaceRack > .workspaceMinSpacer { 890 flex: 0 0 auto; 891 width: 0; 892 min-width: 0; 893 pointer-events: none; 894 } 895 896 .app.rackMode.workspaceInfinite .workspaceSlot { 897 display: none !important; 898 } 899 900 .app.rackMode.workspaceInfinite .sideRack { 901 display: none !important; 902 } 903 904 .app.rackMode.workspaceInfinite .rightRack { 905 display: flex; 906 } 907 908 .panelSizeControls { 909 display: inline-flex; 910 align-items: center; 911 gap: 3px; 912 padding: 1px; 913 border-radius: 999px; 914 border: 1px solid color-mix(in srgb, var(--text) 12%, transparent); 915 background: color-mix(in srgb, var(--text) 5%, transparent); 916 } 917 918 .panelSizeBtn { 919 min-width: 24px; 920 padding: 4px 7px; 921 font-size: 11px; 922 line-height: 1; 923 } 924 925 .panelSizeBtn.isActive { 926 border-color: color-mix(in srgb, var(--accent) 30%, transparent); 927 background: color-mix(in srgb, var(--accent) 22%, transparent); 928 color: var(--text); 929 } 930 931 /* Workspace 4x2 grid (rack mode) */ 932 .app.rackMode .workspaceRack { 933 display: grid; 934 grid-template-columns: repeat(4, minmax(0, 1fr)); 935 grid-template-rows: repeat(2, minmax(0, 1fr)); 936 gap: var(--app-gap); 937 } 938 939 .workspaceSlot { 940 min-width: 0; 941 min-height: 0; 942 display: flex; 943 flex-direction: column; 944 overflow: hidden; 945 } 946 947 .workspaceSlot.workspaceSlotEmpty { 948 border: 1px dashed color-mix(in srgb, var(--text) 16%, transparent); 949 border-radius: 14px; 950 background: color-mix(in srgb, var(--panel) 88%, transparent); 951 align-items: center; 952 justify-content: center; 953 } 954 955 .workspaceEmptyAdd { 956 display: inline-flex; 957 align-items: center; 958 gap: 8px; 959 border-radius: 999px; 960 padding: 10px 14px; 961 border: 1px dashed color-mix(in srgb, var(--accent) 30%, transparent); 962 background: color-mix(in srgb, var(--accent) 10%, transparent); 963 } 964 965 .workspaceEmptyAddPlus { 966 width: 20px; 967 height: 20px; 968 border-radius: 999px; 969 display: inline-flex; 970 align-items: center; 971 justify-content: center; 972 background: color-mix(in srgb, var(--accent) 24%, transparent); 973 font-weight: 900; 974 } 975 976 .workspaceSlot > .rackPanel { 977 flex: 1; 978 min-height: 0; 979 } 980 981 .workspaceSlot > .rackPanel > .panelBody, 982 .workspaceSlot > .rackPanel > .panelFill, 983 .workspaceSlot > .rackPanel .panelBody { 984 min-height: 0; 985 } 986 987 .workspaceSlotLeft { 988 grid-column: 1 / span 2; 989 grid-row: 1 / span 2; 990 } 991 992 .workspaceSlotRight { 993 grid-column: 3 / span 2; 994 grid-row: 1 / span 2; 995 } 996 997 .app.rackMode.workspaceExpandedLeft #workspaceLeftSlot, 998 .app.rackMode.workspaceExpandedRight #workspaceRightSlot { 999 grid-column: 1 / span 4; 1000 } 1001 1002 .app.rackMode.workspaceExpandedLeft #workspaceRightSlot, 1003 .app.rackMode.workspaceExpandedRight #workspaceLeftSlot { 1004 display: none; 1005 } 1006 1007 .app.rackMode:not(.rackIsDragging).workspaceSingleLeft #workspaceLeftSlot { 1008 grid-column: 1 / span 4; 1009 } 1010 1011 .app.rackMode:not(.rackIsDragging).workspaceSingleLeft #workspaceRightSlot { 1012 display: none; 1013 } 1014 1015 .app.rackMode:not(.rackIsDragging).workspaceSingleRight #workspaceRightSlot { 1016 grid-column: 1 / span 4; 1017 } 1018 1019 .app.rackMode:not(.rackIsDragging).workspaceSingleRight #workspaceLeftSlot { 1020 display: none; 1021 } 1022 1023 .app:not(.rackMode) .workspaceSlot { 1024 display: none; 1025 } 1026 1027 .sideRack { 1028 flex: 0 0 min(380px, 30vw); 1029 min-width: 260px; 1030 max-width: 420px; 1031 min-height: 0; 1032 display: flex; 1033 flex-direction: column; 1034 gap: var(--app-gap); 1035 overflow: hidden; 1036 } 1037 1038 .chat { 1039 grid-area: chat; 1040 display: flex; 1041 flex-direction: column; 1042 gap: 0; 1043 overflow: hidden; 1044 background: linear-gradient(180deg, rgba(255, 62, 165, 0.06), transparent 40%), var(--panel); 1045 border: 1px solid var(--line); 1046 border-radius: 16px; 1047 box-shadow: var(--shadow-soft); 1048 } 1049 1050 .moderation { 1051 grid-area: moderation; 1052 display: flex; 1053 flex-direction: column; 1054 gap: 10px; 1055 overflow: hidden; 1056 background: linear-gradient(180deg, rgba(255, 62, 165, 0.06), transparent 40%), var(--panel); 1057 border: 1px solid var(--line); 1058 border-radius: 16px; 1059 padding: 10px; 1060 box-shadow: var(--shadow-soft); 1061 } 1062 1063 .panelResizeHandle { 1064 grid-area: chatResize; 1065 display: block; 1066 position: relative; 1067 z-index: 3; 1068 border-radius: 999px; 1069 background: linear-gradient(180deg, rgba(255, 62, 165, 0.24), rgba(255, 255, 255, 0.12)); 1070 border: 1px solid rgba(246, 240, 255, 0.26); 1071 box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.25) inset; 1072 cursor: col-resize; 1073 align-self: stretch; 1074 } 1075 1076 .panelResizeHandle:hover { 1077 background: linear-gradient(180deg, rgba(255, 62, 165, 0.35), rgba(255, 255, 255, 0.16)); 1078 } 1079 1080 .panelResizeHandle::before { 1081 content: ""; 1082 position: absolute; 1083 left: 50%; 1084 top: 50%; 1085 width: 2px; 1086 height: 34px; 1087 transform: translate(-50%, -50%); 1088 border-radius: 999px; 1089 background: rgba(246, 240, 255, 0.55); 1090 } 1091 1092 .sidebarResizeHandle { 1093 grid-area: sidebarResize; 1094 } 1095 1096 .chatResizeHandle { 1097 grid-area: chatResize; 1098 } 1099 1100 .mainResizeHandle { 1101 grid-area: mainResize; 1102 } 1103 1104 .app.sidebarHidden .sidebarResizeHandle, 1105 .app:not(.hasMod) .mainResizeHandle { 1106 display: none; 1107 } 1108 1109 .app.isResizing { 1110 user-select: none; 1111 cursor: col-resize; 1112 } 1113 1114 .app.isDocking { 1115 user-select: none; 1116 } 1117 1118 .chat .panelHeader { 1119 cursor: grab; 1120 } 1121 1122 .app.isDocking .chat .panelHeader { 1123 cursor: grabbing; 1124 } 1125 1126 .moderation .panelHeader, 1127 .moderation .modTabs, 1128 .moderation .modFilters { 1129 flex: 0 0 auto; 1130 } 1131 1132 .brand { 1133 padding: 14px 14px 0; 1134 } 1135 1136 .smallBtn { 1137 padding: 6px 10px; 1138 border-radius: 999px; 1139 white-space: nowrap; 1140 line-height: 1; 1141 } 1142 1143 .mapChatToggle { 1144 display: inline-flex; 1145 gap: 6px; 1146 margin-left: 6px; 1147 vertical-align: middle; 1148 } 1149 1150 .sidebarToggle { 1151 position: fixed; 1152 bottom: calc(12px + env(safe-area-inset-bottom, 0px)); 1153 left: 12px; 1154 top: auto; 1155 z-index: 20; 1156 } 1157 1158 .peopleToggle { 1159 position: absolute; 1160 top: 12px; 1161 right: 12px; 1162 z-index: 70; 1163 } 1164 1165 .app.sidebarHidden { 1166 grid-template-columns: minmax(var(--chat-min), var(--chat-width)) 10px 1fr; 1167 grid-template-areas: "chat chatResize main"; 1168 } 1169 1170 .app.sidebarHidden.hasMod { 1171 grid-template-columns: minmax(var(--chat-min), var(--chat-width)) 10px 1fr 10px minmax(var(--mod-min), var(--mod-width)); 1172 grid-template-areas: "chat chatResize main mainResize moderation"; 1173 } 1174 1175 .app.rackMode.sidebarHidden, 1176 .app.rackMode.hasMod.sidebarHidden { 1177 grid-template-columns: 1fr 10px minmax(var(--people-min), var(--people-width)); 1178 grid-template-areas: "main mainResize rightRack"; 1179 } 1180 1181 .app.rackMode.sidebarHidden.rightCollapsed, 1182 .app.rackMode.hasMod.sidebarHidden.rightCollapsed { 1183 grid-template-columns: 1fr; 1184 grid-template-areas: "main"; 1185 } 1186 1187 .peopleDrawer { 1188 position: fixed; 1189 top: 12px; 1190 right: 12px; 1191 bottom: 12px; 1192 width: min(var(--people-width), calc(100vw - 24px)); 1193 z-index: 75; 1194 display: flex; 1195 flex-direction: column; 1196 gap: 10px; 1197 border: 1px solid var(--line); 1198 border-radius: 16px; 1199 background: linear-gradient(180deg, rgba(255, 62, 165, 0.06), transparent 40%), var(--panel); 1200 box-shadow: var(--shadow-panel); 1201 overflow: hidden; 1202 } 1203 1204 .peopleResizeHandle { 1205 position: absolute; 1206 left: 0; 1207 top: 0; 1208 bottom: 0; 1209 width: 10px; 1210 z-index: 3; 1211 cursor: col-resize; 1212 border-right: 1px solid rgba(246, 240, 255, 0.26); 1213 background: linear-gradient(180deg, rgba(255, 62, 165, 0.24), rgba(255, 255, 255, 0.12)); 1214 } 1215 1216 .peopleResizeHandle:hover { 1217 background: linear-gradient(180deg, rgba(255, 62, 165, 0.35), rgba(255, 255, 255, 0.16)); 1218 } 1219 1220 .peopleResizeHandle::before { 1221 content: ""; 1222 position: absolute; 1223 left: 50%; 1224 top: 50%; 1225 width: 2px; 1226 height: 36px; 1227 transform: translate(-50%, -50%); 1228 border-radius: 999px; 1229 background: rgba(246, 240, 255, 0.55); 1230 } 1231 1232 .peopleDrawer:not(.hidden) { 1233 animation: drawerIn var(--dur-slow) var(--ease-out) both; 1234 } 1235 1236 .modal { 1237 position: fixed; 1238 inset: 0; 1239 z-index: 120; 1240 display: grid; 1241 place-items: center; 1242 padding: 16px; 1243 } 1244 1245 .modal:not(.hidden) .modalBackdrop { 1246 animation: fadeIn var(--dur-slow) var(--ease-out) both; 1247 } 1248 1249 .modal:not(.hidden) .modalCard { 1250 animation: modalIn var(--dur-slow) var(--ease-out) both; 1251 } 1252 1253 .modalBackdrop { 1254 position: absolute; 1255 inset: 0; 1256 background: rgba(0, 0, 0, 0.55); 1257 backdrop-filter: blur(6px); 1258 } 1259 1260 .modalCard { 1261 position: relative; 1262 width: min(920px, calc(100vw - 24px)); 1263 max-height: calc(100vh - 24px); 1264 overflow: hidden; 1265 display: flex; 1266 flex-direction: column; 1267 z-index: 1; 1268 } 1269 1270 .modalBody { 1271 padding: 12px; 1272 overflow: auto; 1273 display: flex; 1274 flex-direction: column; 1275 gap: 10px; 1276 min-height: 0; 1277 } 1278 1279 .editModalEditor { 1280 min-height: 180px; 1281 max-height: 45vh; 1282 overflow: auto; 1283 } 1284 1285 .modalActions { 1286 justify-content: flex-end; 1287 } 1288 1289 .shortcutHelpBody { 1290 display: flex; 1291 flex-direction: column; 1292 gap: 10px; 1293 } 1294 1295 .editMetaGrid { 1296 display: grid; 1297 grid-template-columns: 1fr 1fr; 1298 gap: 10px; 1299 } 1300 1301 .checkRow { 1302 display: flex; 1303 align-items: center; 1304 justify-content: space-between; 1305 gap: 10px; 1306 padding: 10px 12px; 1307 border: 1px solid var(--line); 1308 border-radius: 14px; 1309 background: rgba(255, 255, 255, 0.02); 1310 } 1311 1312 .checkRow input[type="checkbox"] { 1313 width: 18px; 1314 height: 18px; 1315 } 1316 1317 .roleRow { 1318 display: flex; 1319 align-items: center; 1320 justify-content: space-between; 1321 gap: 10px; 1322 padding: 8px 10px; 1323 border: 1px solid var(--line); 1324 border-radius: 14px; 1325 background: rgba(255, 255, 255, 0.02); 1326 } 1327 1328 .roleRowLeft { 1329 display: flex; 1330 align-items: center; 1331 gap: 10px; 1332 min-width: 0; 1333 } 1334 1335 .roleSwatch { 1336 width: 12px; 1337 height: 12px; 1338 border-radius: 999px; 1339 border: 1px solid rgba(255, 255, 255, 0.18); 1340 flex: 0 0 auto; 1341 } 1342 1343 .roleMeta { 1344 display: flex; 1345 flex-direction: column; 1346 min-width: 0; 1347 } 1348 1349 .roleKey { 1350 font-size: 12px; 1351 opacity: 0.75; 1352 } 1353 1354 .roleCreateRow { 1355 display: grid; 1356 grid-template-columns: 1fr 1fr 120px auto; 1357 gap: 8px; 1358 align-items: end; 1359 } 1360 1361 .roleCreateRow input[type="color"] { 1362 height: 40px; 1363 width: 100%; 1364 padding: 0; 1365 border: 1px solid var(--line); 1366 border-radius: 12px; 1367 background: transparent; 1368 } 1369 1370 .gateList { 1371 display: flex; 1372 flex-direction: column; 1373 gap: 8px; 1374 } 1375 1376 .gateOption { 1377 display: flex; 1378 align-items: center; 1379 justify-content: space-between; 1380 gap: 10px; 1381 padding: 10px 12px; 1382 border: 1px solid var(--line); 1383 border-radius: 14px; 1384 background: rgba(255, 255, 255, 0.02); 1385 } 1386 1387 .gateOptionLeft { 1388 display: flex; 1389 align-items: center; 1390 gap: 10px; 1391 } 1392 1393 @media (max-width: 900px) { 1394 .modal { 1395 padding: 0; 1396 } 1397 .modalCard { 1398 width: 100%; 1399 height: 100%; 1400 border-radius: 0; 1401 } 1402 .editModalEditor { 1403 max-height: none; 1404 flex: 1; 1405 } 1406 .editMetaGrid { 1407 grid-template-columns: 1fr; 1408 } 1409 .roleCreateRow { 1410 grid-template-columns: 1fr; 1411 } 1412 } 1413 1414 .peopleTabs { 1415 display: flex; 1416 gap: 8px; 1417 padding: 0 10px; 1418 } 1419 1420 .peopleTabs button { 1421 flex: 1; 1422 padding: 8px 10px; 1423 } 1424 1425 .peopleFilters { 1426 padding: 0 10px; 1427 } 1428 1429 .peopleList { 1430 padding: 10px; 1431 overflow: auto; 1432 min-height: 0; 1433 flex: 1; 1434 display: flex; 1435 flex-direction: column; 1436 gap: 8px; 1437 } 1438 1439 #peopleMembersView { 1440 display: flex; 1441 flex-direction: column; 1442 min-height: 0; 1443 flex: 1; 1444 } 1445 1446 .peopleCard { 1447 border: 1px solid rgba(246, 240, 255, 0.14); 1448 border-radius: 12px; 1449 padding: 8px; 1450 background: rgba(255, 255, 255, 0.02); 1451 display: flex; 1452 flex-direction: column; 1453 gap: 4px; 1454 transition: border-color 180ms ease, background 180ms ease, box-shadow 180ms ease; 1455 cursor: pointer; 1456 } 1457 1458 .peopleCard:hover { 1459 border-color: rgba(246, 240, 255, 0.22); 1460 background: rgba(255, 255, 255, 0.03); 1461 box-shadow: 0 12px 34px rgba(0, 0, 0, 0.25); 1462 } 1463 1464 .peopleCard:active { 1465 transform: scale(0.99); 1466 } 1467 1468 .peopleCard:focus-visible { 1469 outline: none; 1470 box-shadow: 0 0 0 4px rgba(255, 62, 165, 0.12), 0 12px 34px rgba(0, 0, 0, 0.22); 1471 border-color: rgba(255, 62, 165, 0.28); 1472 } 1473 1474 .peopleCardActions { 1475 display: flex; 1476 justify-content: flex-end; 1477 } 1478 1479 .peopleCardTop { 1480 display: flex; 1481 justify-content: space-between; 1482 gap: 8px; 1483 align-items: center; 1484 } 1485 1486 .peopleStatus { 1487 font-size: 11px; 1488 color: var(--muted); 1489 } 1490 1491 .peopleDms { 1492 padding: 12px; 1493 } 1494 1495 .dmHeader { 1496 display: flex; 1497 flex-direction: column; 1498 gap: 10px; 1499 margin-bottom: 10px; 1500 } 1501 1502 .dmNewRow { 1503 display: flex; 1504 gap: 8px; 1505 align-items: center; 1506 } 1507 1508 .dmToSelect { 1509 flex: 1; 1510 height: 34px; 1511 padding: 6px 10px; 1512 border-radius: 10px; 1513 } 1514 1515 .dmThreadList { 1516 display: flex; 1517 flex-direction: column; 1518 gap: 10px; 1519 } 1520 1521 .dmThreadCard { 1522 border: 1px solid rgba(246, 240, 255, 0.14); 1523 border-radius: 12px; 1524 padding: 10px; 1525 background: rgba(255, 255, 255, 0.02); 1526 display: flex; 1527 flex-direction: column; 1528 gap: 6px; 1529 } 1530 1531 .dmThreadTop { 1532 display: flex; 1533 justify-content: space-between; 1534 gap: 10px; 1535 align-items: center; 1536 } 1537 1538 .dmThreadLeft { 1539 display: flex; 1540 gap: 8px; 1541 align-items: center; 1542 flex-wrap: wrap; 1543 } 1544 1545 .dmTag { 1546 font-size: 11px; 1547 padding: 4px 10px; 1548 border-radius: 999px; 1549 border: 1px solid rgba(246, 240, 255, 0.16); 1550 background: rgba(255, 255, 255, 0.03); 1551 } 1552 1553 .dmTagIncoming { 1554 border-color: rgba(61, 220, 151, 0.28); 1555 background: rgba(61, 220, 151, 0.10); 1556 color: #c7ffe7; 1557 } 1558 1559 .dmTagActive { 1560 border-color: rgba(255, 62, 165, 0.30); 1561 background: rgba(255, 62, 165, 0.10); 1562 color: #ffd2ea; 1563 } 1564 1565 .dmTagPending { 1566 border-color: rgba(246, 240, 255, 0.16); 1567 background: rgba(255, 255, 255, 0.03); 1568 color: var(--muted); 1569 } 1570 1571 .dmTagDeclined { 1572 border-color: rgba(255, 77, 138, 0.24); 1573 background: rgba(255, 77, 138, 0.08); 1574 color: #ffd2e2; 1575 } 1576 1577 .profileActions { 1578 margin-left: auto; 1579 display: flex; 1580 align-items: center; 1581 } 1582 1583 .walkieBar { 1584 padding: 10px 12px 12px; 1585 border-top: 1px solid var(--line); 1586 display: flex; 1587 flex-direction: column; 1588 gap: 8px; 1589 } 1590 1591 .walkieBar button { 1592 width: 100%; 1593 font-weight: 800; 1594 } 1595 1596 .walkieBar.isRecording button { 1597 background: linear-gradient(180deg, rgba(61, 220, 151, 0.95), rgba(18, 168, 111, 0.90)); 1598 border-color: rgba(61, 220, 151, 0.30); 1599 } 1600 1601 .walkieHint .tag { 1602 padding: 2px 8px; 1603 font-size: 11px; 1604 } 1605 1606 .chat.walkie .chatForm { 1607 display: none; 1608 } 1609 1610 .chat.walkie #typingIndicator { 1611 display: none; 1612 } 1613 1614 .streamStage { 1615 margin: 10px 12px 0; 1616 padding: 10px; 1617 border: 1px solid rgba(246, 240, 255, 0.14); 1618 border-radius: 14px; 1619 background: rgba(255, 255, 255, 0.02); 1620 display: flex; 1621 flex-direction: column; 1622 gap: 8px; 1623 position: sticky; 1624 top: 0; 1625 z-index: 4; 1626 backdrop-filter: blur(2px); 1627 } 1628 1629 .streamStageHeader { 1630 display: flex; 1631 align-items: center; 1632 justify-content: space-between; 1633 gap: 8px; 1634 } 1635 1636 .streamStageTitle { 1637 font-weight: 800; 1638 } 1639 1640 .streamStageVideo, 1641 .streamStageAudio { 1642 width: 100%; 1643 border-radius: 12px; 1644 border: 1px solid rgba(246, 240, 255, 0.12); 1645 background: rgba(0, 0, 0, 0.25); 1646 } 1647 1648 .streamStageVideo { 1649 max-height: min(42vh, 320px); 1650 object-fit: contain; 1651 } 1652 1653 .streamStagePlaceholder { 1654 padding: 8px 10px; 1655 border: 1px dashed rgba(246, 240, 255, 0.16); 1656 border-radius: 12px; 1657 background: rgba(0, 0, 0, 0.12); 1658 } 1659 1660 .streamVoiceControls { 1661 border: 1px solid rgba(246, 240, 255, 0.14); 1662 border-radius: 12px; 1663 background: rgba(0, 0, 0, 0.16); 1664 padding: 8px; 1665 display: flex; 1666 flex-direction: column; 1667 gap: 8px; 1668 } 1669 1670 .streamVoiceToggleRow { 1671 padding: 8px 10px; 1672 } 1673 1674 .streamVoiceButtonsRow { 1675 gap: 8px; 1676 } 1677 1678 .streamVoiceUsers { 1679 display: flex; 1680 flex-direction: column; 1681 gap: 6px; 1682 } 1683 1684 .streamVoiceUserRow { 1685 display: grid; 1686 grid-template-columns: 1fr minmax(90px, 170px); 1687 align-items: center; 1688 gap: 8px; 1689 } 1690 1691 .app.sidebarHidden .sidebar { 1692 display: none; 1693 } 1694 1695 .logo { 1696 font-weight: 900; 1697 letter-spacing: 0.6px; 1698 font-size: 20px; 1699 } 1700 1701 .subtitle { 1702 font-size: 12px; 1703 color: var(--muted); 1704 margin-top: 4px; 1705 } 1706 1707 .statusBlock { 1708 padding: 0 14px; 1709 display: flex; 1710 flex-direction: column; 1711 gap: 8px; 1712 } 1713 1714 .statusBlock .row { 1715 margin-top: 4px; 1716 } 1717 1718 .notifOptions { 1719 display: flex; 1720 flex-direction: column; 1721 gap: 6px; 1722 } 1723 1724 .notifCheckRow { 1725 padding: 6px 10px; 1726 border-radius: 10px; 1727 } 1728 1729 .notifCheckRow span { 1730 font-size: 12px; 1731 } 1732 1733 .toastHost { 1734 position: fixed; 1735 right: 16px; 1736 bottom: 16px; 1737 display: flex; 1738 flex-direction: column; 1739 gap: 10px; 1740 z-index: 50; 1741 } 1742 1743 .toast { 1744 border: 1px solid rgba(246, 240, 255, 0.14); 1745 background: rgba(12, 12, 24, 0.92); 1746 backdrop-filter: blur(10px); 1747 border-radius: 14px; 1748 padding: 10px 12px; 1749 max-width: min(360px, calc(100vw - 32px)); 1750 box-shadow: 0 16px 60px rgba(0, 0, 0, 0.45); 1751 animation: toastIn var(--dur-slow) var(--ease-out) both; 1752 } 1753 1754 .toastTitle { 1755 font-weight: 800; 1756 font-size: 12px; 1757 margin-bottom: 4px; 1758 } 1759 1760 .toastBody { 1761 font-size: 12px; 1762 color: var(--muted); 1763 line-height: 1.15rem; 1764 } 1765 1766 .panel { 1767 background: linear-gradient(180deg, rgba(255, 255, 255, 0.03), transparent 60%), var(--panel); 1768 border: 1px solid var(--line); 1769 border-radius: 16px; 1770 padding: var(--panel-pad); 1771 box-shadow: var(--shadow-soft); 1772 } 1773 1774 .panelFill { 1775 flex: 1; 1776 display: flex; 1777 flex-direction: column; 1778 min-height: 0; 1779 } 1780 1781 .panelHeader { 1782 display: flex; 1783 justify-content: space-between; 1784 gap: 10px; 1785 align-items: center; 1786 padding: var(--panel-header-pad-y) var(--panel-header-pad-x) calc(var(--panel-header-pad-y) - 2px); 1787 border-bottom: 1px solid var(--line); 1788 } 1789 1790 .panelTitle { 1791 font-weight: 800; 1792 } 1793 1794 .uiHint { 1795 margin-top: 8px; 1796 margin-bottom: 8px; 1797 padding: 8px 10px; 1798 border-radius: 10px; 1799 border: 1px solid rgba(246, 240, 255, 0.14); 1800 background: rgba(120, 50, 190, 0.12); 1801 color: var(--muted); 1802 font-size: 12px; 1803 line-height: 1.1rem; 1804 } 1805 1806 .app:not(.hintsEnabled) .uiHint { 1807 display: none !important; 1808 } 1809 1810 .panelTitleSub { 1811 font-weight: 800; 1812 margin-top: 2px; 1813 } 1814 1815 .panelDivider { 1816 height: 1px; 1817 background: var(--line); 1818 margin: 12px 0; 1819 } 1820 1821 .pluginInstallRow { 1822 display: flex; 1823 gap: 8px; 1824 align-items: center; 1825 margin-top: 8px; 1826 } 1827 1828 .pluginInstallRow input[type="file"] { 1829 padding: 8px; 1830 } 1831 1832 .pluginsList { 1833 display: flex; 1834 flex-direction: column; 1835 gap: 8px; 1836 margin-top: 10px; 1837 } 1838 1839 .pluginRow { 1840 border: 1px solid var(--line); 1841 border-radius: 12px; 1842 padding: 10px; 1843 background: rgba(255, 255, 255, 0.02); 1844 display: flex; 1845 justify-content: space-between; 1846 gap: 10px; 1847 align-items: flex-start; 1848 } 1849 1850 .pluginName { 1851 font-weight: 800; 1852 } 1853 1854 .pluginDesc { 1855 color: var(--muted); 1856 font-size: 12px; 1857 line-height: 1.05rem; 1858 margin-top: 4px; 1859 } 1860 1861 .pluginBadges { 1862 display: flex; 1863 gap: 6px; 1864 flex-wrap: wrap; 1865 margin-top: 8px; 1866 } 1867 1868 .pluginBadge { 1869 font-size: 11px; 1870 color: var(--muted); 1871 border: 1px solid rgba(246, 240, 255, 0.14); 1872 padding: 3px 7px; 1873 border-radius: 999px; 1874 } 1875 1876 .pluginError { 1877 color: #ffb3c6; 1878 font-size: 12px; 1879 margin-top: 8px; 1880 } 1881 1882 .form { 1883 display: flex; 1884 flex-direction: column; 1885 gap: 10px; 1886 } 1887 1888 .row { 1889 display: flex; 1890 gap: 10px; 1891 } 1892 1893 .grow { 1894 flex: 1; 1895 } 1896 1897 .onboardingCard { 1898 margin-top: 10px; 1899 border: 1px solid var(--line); 1900 border-radius: 12px; 1901 padding: 10px; 1902 background: rgba(255, 255, 255, 0.02); 1903 } 1904 1905 .onboardingAbout { 1906 max-height: 180px; 1907 overflow: auto; 1908 border: 1px solid var(--line); 1909 border-radius: 10px; 1910 padding: 8px; 1911 background: rgba(255, 255, 255, 0.01); 1912 } 1913 1914 .onboardingRules { 1915 margin: 8px 0 0 18px; 1916 padding: 0; 1917 display: flex; 1918 flex-direction: column; 1919 gap: 8px; 1920 } 1921 1922 .onboardingPanelBody { 1923 padding: 10px; 1924 overflow: auto; 1925 } 1926 1927 .onbTabs { 1928 display: flex; 1929 gap: 8px; 1930 flex-wrap: wrap; 1931 } 1932 1933 .onbRuleList, 1934 .onbRuleEditorList { 1935 display: flex; 1936 flex-direction: column; 1937 gap: 10px; 1938 } 1939 1940 .onbRuleViewerCard, 1941 .onbRuleEditorCard { 1942 border: 1px solid var(--line); 1943 border-radius: 12px; 1944 padding: 10px; 1945 background: rgba(255, 255, 255, 0.02); 1946 } 1947 1948 .onbRuleEditorBody { 1949 display: flex; 1950 flex-direction: column; 1951 gap: 8px; 1952 margin-top: 8px; 1953 } 1954 1955 .onbRoleGrid { 1956 display: grid; 1957 grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); 1958 gap: 8px; 1959 margin-top: 8px; 1960 } 1961 1962 .onbSeverityInfo { 1963 border-color: rgba(61, 220, 151, 0.55); 1964 color: #9beac7; 1965 } 1966 1967 .onbSeverityWarn { 1968 border-color: rgba(255, 166, 0, 0.55); 1969 color: #ffd28d; 1970 } 1971 1972 .onbSeverityCritical { 1973 border-color: rgba(255, 77, 138, 0.65); 1974 color: #ffb3cb; 1975 } 1976 1977 .goodText { 1978 color: var(--good); 1979 } 1980 1981 .badText { 1982 color: var(--bad); 1983 } 1984 1985 label span { 1986 display: block; 1987 color: var(--muted); 1988 font-size: var(--label-font-size); 1989 margin-bottom: var(--label-gap); 1990 } 1991 1992 input, 1993 textarea, 1994 select { 1995 width: 100%; 1996 color: var(--text); 1997 background: color-mix(in srgb, var(--text) 3%, transparent); 1998 border: 1px solid color-mix(in srgb, var(--text) 14%, transparent); 1999 border-radius: 12px; 2000 padding: var(--control-pad-y) var(--control-pad-x); 2001 outline: none; 2002 } 2003 2004 select option, 2005 select optgroup { 2006 color: #11131a; 2007 background: #f4f6fb; 2008 } 2009 2010 select option:checked { 2011 color: #0f1724; 2012 background: #8eb8e6; 2013 } 2014 2015 select optgroup { 2016 font-weight: 700; 2017 background: #e7ebf3; 2018 } 2019 2020 input:focus, 2021 textarea:focus, 2022 select:focus, 2023 .editor:focus-within { 2024 border-color: color-mix(in srgb, var(--accent) 45%, transparent); 2025 box-shadow: 0 0 0 4px color-mix(in srgb, var(--accent) 10%, transparent); 2026 } 2027 2028 button { 2029 border: 1px solid color-mix(in srgb, var(--text) 14%, transparent); 2030 background: color-mix(in srgb, var(--text) 4%, transparent); 2031 color: var(--text); 2032 border-radius: 12px; 2033 padding: var(--btn-pad-y) var(--btn-pad-x); 2034 cursor: pointer; 2035 transition: transform var(--dur-fast) var(--ease-soft), border-color var(--dur-fast) var(--ease-soft), 2036 background var(--dur-fast) var(--ease-soft), box-shadow var(--dur-fast) var(--ease-soft), filter var(--dur-fast) var(--ease-soft); 2037 } 2038 2039 button.primary { 2040 background: linear-gradient(180deg, color-mix(in srgb, var(--accent) 95%, transparent), color-mix(in srgb, var(--accent2) 90%, transparent)); 2041 border-color: color-mix(in srgb, var(--accent) 30%, transparent); 2042 color: #120013; 2043 font-weight: 900; 2044 } 2045 2046 button.ghost { 2047 background: transparent; 2048 } 2049 2050 button.danger { 2051 border-color: rgba(255, 77, 138, 0.26); 2052 background: color-mix(in srgb, var(--bad) 10%, transparent); 2053 } 2054 2055 button.danger:hover:not(:disabled) { 2056 background: color-mix(in srgb, var(--bad) 14%, transparent); 2057 border-color: color-mix(in srgb, var(--bad) 35%, transparent); 2058 } 2059 2060 button:hover { 2061 transform: translateY(-1px); 2062 } 2063 2064 button:active { 2065 transform: translateY(0px) scale(0.985); 2066 } 2067 2068 button:focus-visible { 2069 outline: none; 2070 box-shadow: 0 0 0 4px color-mix(in srgb, var(--accent) 14%, transparent); 2071 border-color: color-mix(in srgb, var(--accent) 35%, transparent); 2072 } 2073 2074 button:disabled { 2075 opacity: 0.55; 2076 cursor: not-allowed; 2077 transform: none; 2078 } 2079 2080 .badge { 2081 display: inline-flex; 2082 align-items: center; 2083 gap: 8px; 2084 padding: 6px 10px; 2085 border-radius: 999px; 2086 font-size: 12px; 2087 border: 1px solid color-mix(in srgb, var(--text) 14%, transparent); 2088 background: color-mix(in srgb, var(--text) 2%, transparent); 2089 } 2090 2091 .badge-good { 2092 border-color: color-mix(in srgb, var(--good) 25%, transparent); 2093 background: color-mix(in srgb, var(--good) 10%, transparent); 2094 color: #baf6dd; 2095 } 2096 2097 .badge-warn { 2098 border-color: color-mix(in srgb, var(--accent) 30%, transparent); 2099 background: color-mix(in srgb, var(--accent) 10%, transparent); 2100 color: #ffd2ea; 2101 } 2102 2103 .badge-bad { 2104 border-color: color-mix(in srgb, var(--bad) 30%, transparent); 2105 background: color-mix(in srgb, var(--bad) 10%, transparent); 2106 color: #ffd2e2; 2107 } 2108 2109 .filters { 2110 display: flex; 2111 gap: 6px; 2112 align-items: center; 2113 flex-wrap: nowrap; 2114 padding: 6px; 2115 border: 1px solid color-mix(in srgb, var(--text) 10%, transparent); 2116 border-radius: 12px; 2117 background: color-mix(in srgb, var(--text) 2%, transparent); 2118 overflow-x: auto; 2119 max-width: 100%; 2120 } 2121 2122 .filters input, 2123 .filters select { 2124 min-width: 0; 2125 height: 34px; 2126 padding: 6px 10px; 2127 border-radius: 10px; 2128 font-size: 13px; 2129 } 2130 2131 .filters #filterAuthor { 2132 width: 170px; 2133 } 2134 2135 .filters #filterKeywords { 2136 width: 210px; 2137 } 2138 2139 .filters #sortBy { 2140 width: 170px; 2141 } 2142 2143 .filters button { 2144 height: 34px; 2145 padding: 6px 12px; 2146 border-radius: 10px; 2147 font-size: 13px; 2148 } 2149 2150 .hiveTabs { 2151 display: flex; 2152 gap: 10px; 2153 padding: 14px 12px 12px; 2154 flex-wrap: wrap; 2155 border-bottom: 1px solid var(--line); 2156 margin-bottom: 6px; 2157 position: relative; 2158 } 2159 2160 .hiveTabs::before { 2161 content: ""; 2162 position: absolute; 2163 left: 12px; 2164 right: 12px; 2165 top: 0; 2166 height: 1px; 2167 background: linear-gradient(90deg, rgba(255, 62, 165, 0.26), rgba(184, 75, 255, 0.12), transparent); 2168 } 2169 2170 .hiveTabs button { 2171 padding: 10px 16px; 2172 font-size: 13px; 2173 border-radius: 999px; 2174 font-weight: 700; 2175 } 2176 2177 .mobileComposerToggle { 2178 display: inline-flex; 2179 } 2180 2181 .mobileOnlyHiveControl { 2182 display: none; 2183 } 2184 2185 #pollinatePanel.composerCollapsed { 2186 display: none; 2187 } 2188 2189 .feed { 2190 padding: 12px; 2191 overflow: auto; 2192 display: grid; 2193 grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); 2194 gap: 12px; 2195 align-content: start; 2196 min-height: 0; 2197 } 2198 2199 .profileViewBody { 2200 flex: 1; 2201 min-height: 0; 2202 overflow: auto; 2203 padding: 12px; 2204 } 2205 2206 .profileCard { 2207 border: 1px solid rgba(246, 240, 255, 0.12); 2208 border-radius: 14px; 2209 background: rgba(255, 255, 255, 0.02); 2210 padding: 14px; 2211 display: flex; 2212 flex-direction: column; 2213 gap: 12px; 2214 } 2215 2216 .profileHeader { 2217 display: flex; 2218 gap: 12px; 2219 align-items: center; 2220 border: 1px solid rgba(246, 240, 255, 0.12); 2221 border-radius: 12px; 2222 padding: 10px; 2223 background: linear-gradient(180deg, rgba(255, 62, 165, 0.08), rgba(255, 255, 255, 0.02)); 2224 } 2225 2226 .profileHeroPfp { 2227 width: 72px; 2228 height: 72px; 2229 border-radius: 10px; 2230 } 2231 2232 .profileIdentity { 2233 display: flex; 2234 flex-direction: column; 2235 gap: 4px; 2236 } 2237 2238 .profileHandle { 2239 font-size: 21px; 2240 font-weight: 900; 2241 } 2242 2243 .profileSection { 2244 display: flex; 2245 flex-direction: column; 2246 gap: 8px; 2247 } 2248 2249 .profileBio { 2250 line-height: 1.35rem; 2251 } 2252 2253 .profileBio img { 2254 max-width: 100%; 2255 max-height: min(420px, 55vh); 2256 object-fit: contain; 2257 border-radius: 12px; 2258 display: block; 2259 cursor: zoom-in; 2260 } 2261 2262 .editor img { 2263 max-width: 100%; 2264 max-height: min(420px, 55vh); 2265 object-fit: contain; 2266 border-radius: 12px; 2267 display: block; 2268 margin-top: 8px; 2269 cursor: zoom-in; 2270 } 2271 2272 .ytEmbed { 2273 margin-top: 8px; 2274 border: 1px solid rgba(246, 240, 255, 0.12); 2275 border-radius: 14px; 2276 overflow: hidden; 2277 background: rgba(255, 255, 255, 0.02); 2278 aspect-ratio: 16 / 9; 2279 box-shadow: 0 16px 50px rgba(0, 0, 0, 0.25); 2280 } 2281 2282 .ytEmbed iframe { 2283 width: 100%; 2284 height: 100%; 2285 border: 0; 2286 display: block; 2287 } 2288 2289 .profileBio audio { 2290 width: 100%; 2291 margin-top: 8px; 2292 } 2293 2294 .profileLinksWrap { 2295 display: flex; 2296 flex-wrap: wrap; 2297 gap: 8px; 2298 } 2299 2300 .profileLinkTag { 2301 text-decoration: none; 2302 } 2303 2304 .profileEditPanel { 2305 border-top: 1px solid var(--line); 2306 padding: 12px; 2307 display: flex; 2308 flex-direction: column; 2309 gap: 10px; 2310 max-height: 46vh; 2311 overflow: auto; 2312 } 2313 2314 .profileBioEditor { 2315 min-height: 120px; 2316 max-height: 260px; 2317 overflow: auto; 2318 } 2319 2320 .profileLinksHead { 2321 display: flex; 2322 justify-content: space-between; 2323 align-items: center; 2324 gap: 8px; 2325 } 2326 2327 .profileLinksEditor { 2328 display: flex; 2329 flex-direction: column; 2330 gap: 8px; 2331 } 2332 2333 .profileLinkEditRow { 2334 display: grid; 2335 grid-template-columns: 1fr 1.4fr auto; 2336 gap: 8px; 2337 align-items: center; 2338 } 2339 2340 @media (max-width: 1100px) { 2341 .panelHeader { 2342 align-items: flex-start; 2343 } 2344 2345 .filters { 2346 flex-wrap: wrap; 2347 overflow-x: visible; 2348 } 2349 2350 .filters #filterAuthor, 2351 .filters #filterKeywords, 2352 .filters #sortBy { 2353 width: 100%; 2354 } 2355 2356 .profileLinkEditRow { 2357 grid-template-columns: 1fr; 2358 } 2359 } 2360 2361 .post { 2362 border: 1px solid rgba(246, 240, 255, 0.12); 2363 border-radius: 14px; 2364 padding: 12px; 2365 background: var(--panel2); 2366 display: flex; 2367 flex-direction: column; 2368 gap: 10px; 2369 position: relative; 2370 transition: transform var(--dur-med) var(--ease-out), border-color var(--dur-med) var(--ease-out), 2371 background var(--dur-med) var(--ease-out), box-shadow var(--dur-med) var(--ease-out); 2372 } 2373 2374 .feed.hivesListView .post { 2375 padding: 10px; 2376 gap: 6px; 2377 } 2378 2379 .feed.hivesListView .postTop { 2380 align-items: center; 2381 } 2382 2383 .feed.hivesListView .postTitleRow { 2384 gap: 0; 2385 min-width: 0; 2386 } 2387 2388 .feed.hivesListView .postTitle { 2389 margin-bottom: 0; 2390 white-space: nowrap; 2391 overflow: hidden; 2392 text-overflow: ellipsis; 2393 } 2394 2395 .feed.hivesListView .postMeta, 2396 .feed.hivesListView .reactionsRow, 2397 .feed.hivesListView .boostControls, 2398 .feed.hivesListView .countdown.boost { 2399 display: none !important; 2400 } 2401 2402 .feed.hivesListView .postMeta { 2403 display: flex !important; 2404 margin-top: 6px; 2405 flex-wrap: nowrap; 2406 overflow: hidden; 2407 white-space: nowrap; 2408 text-overflow: ellipsis; 2409 gap: 6px; 2410 } 2411 2412 .feed.hivesListView .rightCol { 2413 gap: 6px; 2414 } 2415 2416 .post:hover { 2417 transform: translateY(-2px); 2418 border-color: rgba(255, 62, 165, 0.22); 2419 background: rgba(255, 255, 255, 0.03); 2420 box-shadow: 0 16px 50px rgba(0, 0, 0, 0.25); 2421 } 2422 2423 .post.isUnread { 2424 box-shadow: 0 0 0 1px rgba(255, 62, 165, 0.18), 0 14px 40px rgba(255, 62, 165, 0.10); 2425 } 2426 2427 .post.isNew { 2428 animation: glowPop 900ms ease-out; 2429 } 2430 2431 .post.isBuzz { 2432 animation: buzzPulse 700ms ease-out; 2433 } 2434 2435 @keyframes glowPop { 2436 0% { 2437 box-shadow: 0 0 0 1px rgba(255, 62, 165, 0.05), 0 0 0 rgba(255, 62, 165, 0.0); 2438 transform: translateY(0px); 2439 } 2440 40% { 2441 box-shadow: 0 0 0 1px rgba(255, 62, 165, 0.30), 0 18px 60px rgba(255, 62, 165, 0.18); 2442 transform: translateY(-2px); 2443 } 2444 100% { 2445 box-shadow: 0 0 0 1px rgba(246, 240, 255, 0.12), 0 0 0 rgba(255, 62, 165, 0.0); 2446 transform: translateY(0px); 2447 } 2448 } 2449 2450 @keyframes buzzPulse { 2451 0% { 2452 box-shadow: 0 0 0 1px rgba(246, 240, 255, 0.12), 0 0 0 rgba(255, 62, 165, 0); 2453 } 2454 40% { 2455 box-shadow: 0 0 0 1px rgba(255, 62, 165, 0.18), 0 8px 22px rgba(255, 62, 165, 0.08); 2456 } 2457 100% { 2458 box-shadow: 0 0 0 1px rgba(246, 240, 255, 0.12), 0 0 0 rgba(255, 62, 165, 0); 2459 } 2460 } 2461 2462 @keyframes workspaceArrivalGlow { 2463 0% { 2464 box-shadow: 0 0 0 1px color-mix(in srgb, var(--text) 12%, transparent), 0 0 0 rgba(255, 62, 165, 0); 2465 } 2466 35% { 2467 box-shadow: 0 0 0 1px color-mix(in srgb, var(--accent) 48%, transparent), 0 18px 52px color-mix(in srgb, var(--accent) 22%, transparent); 2468 } 2469 100% { 2470 box-shadow: 0 0 0 1px color-mix(in srgb, var(--text) 12%, transparent), 0 0 0 rgba(255, 62, 165, 0); 2471 } 2472 } 2473 2474 .badgeDot { 2475 width: 10px; 2476 height: 10px; 2477 border-radius: 999px; 2478 background: rgba(255, 62, 165, 0.95); 2479 box-shadow: 0 0 0 4px rgba(255, 62, 165, 0.15); 2480 } 2481 2482 .postTop { 2483 display: flex; 2484 justify-content: space-between; 2485 gap: 12px; 2486 align-items: flex-start; 2487 } 2488 2489 .postContent { 2490 line-height: 1.25rem; 2491 } 2492 2493 .postTitle { 2494 font-weight: 900; 2495 letter-spacing: 0.2px; 2496 margin-bottom: 6px; 2497 } 2498 2499 .postTitleRow { 2500 display: flex; 2501 flex-direction: column; 2502 gap: 6px; 2503 } 2504 2505 .postContent p { 2506 margin: 0 0 8px; 2507 } 2508 2509 .postContent p:last-child { 2510 margin-bottom: 0; 2511 } 2512 2513 .postMeta { 2514 display: flex; 2515 gap: 8px; 2516 flex-wrap: wrap; 2517 margin-top: 10px; 2518 } 2519 2520 .postLastChat, 2521 .postTypingLine { 2522 margin-top: 6px; 2523 } 2524 2525 .postStreamLine { 2526 margin-top: 6px; 2527 color: color-mix(in srgb, var(--accent) 52%, var(--text)); 2528 } 2529 2530 .reactionsRow { 2531 display: flex; 2532 gap: 6px; 2533 flex-wrap: wrap; 2534 align-items: center; 2535 margin-top: 10px; 2536 } 2537 2538 .customRoleRow { 2539 display: inline-flex; 2540 gap: 4px; 2541 margin-left: 6px; 2542 flex-wrap: wrap; 2543 } 2544 2545 .reactBtn { 2546 display: inline-flex; 2547 align-items: center; 2548 gap: 6px; 2549 padding: 6px 10px; 2550 border-radius: 999px; 2551 border: 1px solid rgba(246, 240, 255, 0.12); 2552 background: rgba(255, 255, 255, 0.02); 2553 cursor: pointer; 2554 user-select: none; 2555 transition: transform var(--dur-fast) var(--ease-soft), border-color var(--dur-fast) var(--ease-soft), 2556 background var(--dur-fast) var(--ease-soft), box-shadow var(--dur-fast) var(--ease-soft), filter var(--dur-fast) var(--ease-soft); 2557 } 2558 2559 .reactBtn:hover { 2560 transform: translateY(-1px); 2561 background: rgba(255, 255, 255, 0.035); 2562 border-color: rgba(246, 240, 255, 0.18); 2563 } 2564 2565 .reactBtn:active { 2566 transform: translateY(0px) scale(0.985); 2567 } 2568 2569 .reactBtn:focus-visible { 2570 outline: none; 2571 box-shadow: 0 0 0 4px rgba(255, 62, 165, 0.12); 2572 border-color: rgba(255, 62, 165, 0.28); 2573 } 2574 2575 .reactBtn .count { 2576 font-size: 12px; 2577 color: var(--muted); 2578 } 2579 2580 .reactBtn.isOn { 2581 border-color: rgba(255, 62, 165, 0.30); 2582 box-shadow: 0 0 0 4px rgba(255, 62, 165, 0.08); 2583 } 2584 2585 .reactBtn.pulse { 2586 animation: reactPop 420ms var(--ease-out) both; 2587 } 2588 2589 .tag { 2590 font-size: 12px; 2591 padding: 4px 8px; 2592 border-radius: 999px; 2593 border: 1px solid color-mix(in srgb, var(--accent) 28%, transparent); 2594 background: color-mix(in srgb, var(--accent) 10%, transparent); 2595 color: #ffd2ea; 2596 } 2597 2598 .rightCol { 2599 display: flex; 2600 flex-direction: column; 2601 gap: 8px; 2602 align-items: flex-end; 2603 } 2604 2605 .postActionsRow { 2606 display: flex; 2607 gap: 6px; 2608 align-items: center; 2609 justify-content: flex-end; 2610 width: 100%; 2611 position: relative; 2612 } 2613 2614 .kebabBtn { 2615 width: 38px; 2616 height: 34px; 2617 padding: 0; 2618 border-radius: 12px; 2619 line-height: 34px; 2620 font-weight: 900; 2621 } 2622 2623 .postMenu { 2624 position: absolute; 2625 right: 0; 2626 top: calc(100% + 6px); 2627 z-index: 40; 2628 width: 170px; 2629 max-width: min(240px, calc(100vw - 48px)); 2630 border: 1px solid rgba(246, 240, 255, 0.16); 2631 border-radius: 14px; 2632 background: rgba(8, 8, 16, 0.92); 2633 backdrop-filter: blur(12px); 2634 box-shadow: 0 16px 60px rgba(0, 0, 0, 0.45); 2635 padding: 6px; 2636 animation: popFloat var(--dur-med) var(--ease-out) both; 2637 } 2638 2639 .postMenu button { 2640 width: 100%; 2641 text-align: left; 2642 padding: 8px 10px; 2643 border-radius: 12px; 2644 } 2645 2646 .postMenu button:hover { 2647 transform: none; 2648 background: rgba(255, 255, 255, 0.06); 2649 border-color: rgba(246, 240, 255, 0.18); 2650 } 2651 2652 .postMenu button:active { 2653 transform: scale(0.99); 2654 } 2655 2656 .postMenu button.danger { 2657 border-color: rgba(255, 77, 138, 0.26); 2658 } 2659 2660 .postMenu button.danger:hover { 2661 background: rgba(255, 77, 138, 0.10); 2662 border-color: rgba(255, 77, 138, 0.35); 2663 } 2664 2665 .countdown { 2666 font-size: 12px; 2667 color: var(--muted); 2668 } 2669 2670 .countdown.boost { 2671 color: #ffd2ea; 2672 } 2673 2674 .boostRow { 2675 display: flex; 2676 gap: 8px; 2677 align-items: center; 2678 } 2679 2680 .boostRow select { 2681 padding: 6px 8px; 2682 } 2683 2684 .userLine { 2685 display: flex; 2686 align-items: center; 2687 gap: 10px; 2688 padding: 8px 10px; 2689 border-radius: 12px; 2690 border: 1px solid rgba(246, 240, 255, 0.12); 2691 background: rgba(255, 255, 255, 0.02); 2692 margin: 6px 0 10px; 2693 } 2694 2695 .userPill { 2696 display: inline-flex; 2697 align-items: center; 2698 gap: 8px; 2699 } 2700 2701 .userPillLink { 2702 background: transparent; 2703 border: 0; 2704 padding: 0; 2705 } 2706 2707 .userPillLink:hover { 2708 transform: none; 2709 text-decoration: underline; 2710 } 2711 2712 .userPillLink:active { 2713 transform: scale(0.99); 2714 } 2715 2716 .userPillLink:focus-visible { 2717 outline: none; 2718 box-shadow: 0 0 0 4px rgba(255, 62, 165, 0.12); 2719 border-radius: 12px; 2720 } 2721 2722 .postAuthor .userPill { 2723 gap: 10px; 2724 } 2725 2726 .pfp { 2727 width: 34px; 2728 height: 34px; 2729 border-radius: 6px; 2730 display: inline-flex; 2731 align-items: center; 2732 justify-content: center; 2733 background: rgba(255, 255, 255, 0.02); 2734 border: 1px solid rgba(246, 240, 255, 0.14); 2735 overflow: hidden; 2736 } 2737 2738 .post .pfp { 2739 width: 64px; 2740 height: 64px; 2741 border-radius: 10px; 2742 } 2743 2744 .pfp img { 2745 width: 100%; 2746 height: 100%; 2747 object-fit: cover; 2748 } 2749 2750 .pfpBox { 2751 width: 64px; 2752 height: 64px; 2753 border-radius: 12px; 2754 border: 1px solid rgba(246, 240, 255, 0.14); 2755 background: rgba(255, 255, 255, 0.02); 2756 overflow: hidden; 2757 flex: 0 0 auto; 2758 } 2759 2760 .pfpBox img { 2761 width: 100%; 2762 height: 100%; 2763 object-fit: cover; 2764 display: none; 2765 } 2766 2767 .pfpBox img.hasImg { 2768 display: block; 2769 } 2770 2771 .editorShell { 2772 border: 1px solid rgba(246, 240, 255, 0.14); 2773 border-radius: 16px; 2774 overflow: hidden; 2775 background: rgba(255, 255, 255, 0.02); 2776 } 2777 2778 .toolbar { 2779 display: flex; 2780 flex-wrap: wrap; 2781 gap: 6px; 2782 padding: 8px; 2783 border-bottom: 1px solid var(--line); 2784 } 2785 2786 .toolbar button { 2787 padding: 6px 10px; 2788 border-radius: 10px; 2789 } 2790 2791 .toolbar .sep { 2792 width: 1px; 2793 background: var(--line); 2794 margin: 4px 6px; 2795 } 2796 2797 .editor { 2798 min-height: 110px; 2799 padding: 10px; 2800 outline: none; 2801 } 2802 2803 .editor:empty:before { 2804 content: "Write something..."; 2805 color: rgba(246, 240, 255, 0.40); 2806 } 2807 2808 .chatMessages { 2809 padding: 10px 10px 8px; 2810 overflow: auto; 2811 display: flex; 2812 flex-direction: column; 2813 gap: 0; 2814 flex: 1; 2815 min-height: 0; 2816 container-type: inline-size; 2817 } 2818 2819 .typingIndicator { 2820 padding: 0 12px 10px; 2821 min-height: 18px; 2822 } 2823 2824 .typingDots { 2825 display: inline-flex; 2826 gap: 2px; 2827 margin-left: 6px; 2828 } 2829 2830 .typingDots span { 2831 opacity: 0.2; 2832 animation: dotPulse 1.2s infinite; 2833 } 2834 2835 .typingDots span:nth-child(2) { 2836 animation-delay: 0.2s; 2837 } 2838 2839 .typingDots span:nth-child(3) { 2840 animation-delay: 0.4s; 2841 } 2842 2843 @keyframes dotPulse { 2844 0%, 2845 100% { 2846 opacity: 0.2; 2847 } 2848 50% { 2849 opacity: 1; 2850 } 2851 } 2852 2853 .chatMsg { 2854 border: 1px solid rgba(246, 240, 255, 0.12); 2855 background: rgba(255, 255, 255, 0.02); 2856 border-radius: 14px; 2857 padding: 8px 9px; 2858 margin-top: 8px; 2859 width: fit-content; 2860 margin-left: auto; 2861 margin-right: auto; 2862 max-width: min(var(--chat-rail-center-max, 70%), calc(100% - (var(--chat-rail-inset, 12px) * 2))); 2863 transition: border-color var(--dur-med) var(--ease-out), background var(--dur-med) var(--ease-out), 2864 box-shadow var(--dur-med) var(--ease-out), transform var(--dur-med) var(--ease-out); 2865 } 2866 2867 .chatMsg.railLeft { 2868 margin-left: var(--chat-rail-inset, 12px); 2869 margin-right: auto; 2870 max-width: min(var(--chat-rail-side-max, 66%), calc(100% - (var(--chat-rail-inset, 12px) * 2))); 2871 } 2872 2873 .chatMsg.railCenter { 2874 margin-left: auto; 2875 margin-right: auto; 2876 max-width: min(var(--chat-rail-center-max, 70%), calc(100% - (var(--chat-rail-inset, 12px) * 2))); 2877 } 2878 2879 .chatMsg.railRight { 2880 margin-left: auto; 2881 margin-right: var(--chat-rail-inset, 12px); 2882 max-width: min(var(--chat-rail-side-max, 66%), calc(100% - (var(--chat-rail-inset, 12px) * 2))); 2883 background: color-mix(in srgb, var(--accent) 10%, rgba(255, 255, 255, 0.02)); 2884 border-color: color-mix(in srgb, var(--accent) 30%, rgba(246, 240, 255, 0.12)); 2885 } 2886 2887 .chatMsg:first-child { 2888 margin-top: 0; 2889 } 2890 2891 .chatMsg.isStacked { 2892 margin-top: 4px; 2893 } 2894 2895 .chatMsg.railRight .meta { 2896 justify-content: flex-end; 2897 } 2898 2899 .chatMsg.mentionMe { 2900 border-color: rgba(255, 62, 165, 0.45); 2901 box-shadow: 0 0 0 2px rgba(255, 62, 165, 0.14); 2902 } 2903 2904 .chatMsg.isModMsg { 2905 background: linear-gradient( 2906 180deg, 2907 color-mix(in srgb, var(--warn) 22%, transparent), 2908 rgba(255, 255, 255, 0.02) 2909 ), 2910 rgba(255, 255, 255, 0.02); 2911 border-color: color-mix(in srgb, var(--warn2) 38%, rgba(246, 240, 255, 0.12)); 2912 box-shadow: 0 0 0 2px color-mix(in srgb, var(--warn2) 10%, transparent); 2913 } 2914 2915 .chatMsg.isModMsg .meta { 2916 color: color-mix(in srgb, var(--warn) 60%, var(--muted)); 2917 } 2918 2919 .modPill { 2920 display: inline-flex; 2921 align-items: center; 2922 gap: 6px; 2923 font-weight: 900; 2924 letter-spacing: 0.3px; 2925 color: color-mix(in srgb, var(--warn) 88%, var(--text)); 2926 border: 1px solid color-mix(in srgb, var(--warn2) 42%, transparent); 2927 background: color-mix(in srgb, var(--warn2) 10%, transparent); 2928 padding: 2px 8px; 2929 border-radius: 999px; 2930 } 2931 2932 .chatMsg.isNewMsg { 2933 animation: msgIn 520ms var(--ease-out) both; 2934 } 2935 2936 /* When the chat container gets narrow, collapse center-lane messages to the left lane. 2937 Self stays right-aligned; mod/system keep their visual treatment. */ 2938 @container (max-width: 520px) { 2939 .chatMessages { 2940 --chat-rail-side-max: 92%; 2941 --chat-rail-center-max: 92%; 2942 } 2943 2944 .chatMsg.railCenter { 2945 margin-left: var(--chat-rail-inset, 12px); 2946 margin-right: auto; 2947 } 2948 2949 .chatMsg.railCenter .meta { 2950 justify-content: flex-start; 2951 } 2952 2953 .chatMsg.isModMsg { 2954 margin-left: calc(var(--chat-rail-inset, 12px) + 8px); 2955 } 2956 } 2957 2958 .chatMsg:hover { 2959 border-color: rgba(246, 240, 255, 0.18); 2960 background: rgba(255, 255, 255, 0.028); 2961 } 2962 2963 .chatMsg.mentionMe:not(.isNewMsg) { 2964 animation: mentionPing 720ms var(--ease-out) both; 2965 } 2966 2967 .chatActionsRow { 2968 margin-top: 6px; 2969 display: flex; 2970 align-items: center; 2971 justify-content: space-between; 2972 gap: 10px; 2973 flex-wrap: wrap; 2974 } 2975 2976 .chatReactions { 2977 display: flex; 2978 gap: 4px; 2979 flex-wrap: wrap; 2980 margin-top: 6px; 2981 } 2982 2983 .chatActionsRow .chatReactions { 2984 margin-top: 0; 2985 flex: 1 1 auto; 2986 } 2987 2988 .chatReactions .reactionsRow { 2989 margin-top: 0; 2990 gap: 4px; 2991 } 2992 2993 .chatReactions .reactBtn { 2994 padding: 4px 8px; 2995 } 2996 2997 .chatMsg .content img { 2998 max-width: 100%; 2999 max-height: min(420px, 55vh); 3000 object-fit: contain; 3001 border-radius: 10px; 3002 display: block; 3003 margin-top: 6px; 3004 cursor: zoom-in; 3005 } 3006 3007 .chatReactions:empty { 3008 display: none; 3009 } 3010 3011 .chatMsg .content audio, 3012 .post audio, 3013 .editor audio { 3014 width: 100%; 3015 margin-top: 8px; 3016 } 3017 3018 #mediaModalImg { 3019 max-width: min(92vw, 1200px); 3020 max-height: 78vh; 3021 width: auto; 3022 height: auto; 3023 display: block; 3024 margin: 0 auto; 3025 border-radius: 14px; 3026 background: rgba(0, 0, 0, 0.18); 3027 } 3028 3029 .editor.isDropActive { 3030 outline: 2px dashed rgba(255, 62, 165, 0.7); 3031 outline-offset: 6px; 3032 } 3033 3034 .chatMsg .meta { 3035 font-size: 11px; 3036 color: var(--muted); 3037 margin-bottom: 3px; 3038 display: flex; 3039 gap: 6px; 3040 align-items: center; 3041 line-height: 1.1; 3042 } 3043 3044 .chatHeaderInline { 3045 display: inline-flex; 3046 align-items: center; 3047 gap: 6px; 3048 } 3049 3050 .chatMsg .content p { 3051 margin: 0 0 6px; 3052 } 3053 3054 .chatMsg .content p:last-child { 3055 margin-bottom: 0; 3056 } 3057 3058 .mentionToken { 3059 border: 1px solid rgba(255, 62, 165, 0.28); 3060 border-radius: 999px; 3061 padding: 0 6px; 3062 background: rgba(255, 62, 165, 0.10); 3063 color: #ffd2ea; 3064 } 3065 3066 .mentionTokenMe { 3067 border-color: rgba(61, 220, 151, 0.4); 3068 background: rgba(61, 220, 151, 0.14); 3069 color: #baf6dd; 3070 } 3071 3072 .chatReplyRef { 3073 margin-bottom: 6px; 3074 padding: 6px 8px; 3075 border-left: 3px solid rgba(255, 62, 165, 0.5); 3076 border-radius: 8px; 3077 background: rgba(255, 255, 255, 0.02); 3078 } 3079 3080 .chatTools { 3081 margin-top: 6px; 3082 display: flex; 3083 justify-content: flex-end; 3084 gap: 6px; 3085 } 3086 3087 .chatActionsRow .chatTools { 3088 margin-top: 0; 3089 flex: 0 0 auto; 3090 } 3091 3092 .chatForm { 3093 display: flex; 3094 flex-direction: column; 3095 gap: 10px; 3096 padding: 12px; 3097 border-top: 1px solid var(--line); 3098 } 3099 3100 .app.hotbarVisible .chatForm { 3101 padding-bottom: 12px; 3102 } 3103 3104 .chatForm > .primary[type="submit"] { 3105 align-self: flex-end; 3106 } 3107 3108 .chat.isSkinnyChat .chatMessages { 3109 padding: 8px; 3110 } 3111 3112 .chat.isSkinnyChat .chatMsg { 3113 width: auto; 3114 max-width: 100%; 3115 margin-left: 0; 3116 margin-right: 0; 3117 border-radius: 10px; 3118 padding: 6px 8px; 3119 } 3120 3121 .chat.isSkinnyChat .chatMsg.railLeft, 3122 .chat.isSkinnyChat .chatMsg.railCenter, 3123 .chat.isSkinnyChat .chatMsg.railRight { 3124 margin-left: 0; 3125 margin-right: 0; 3126 max-width: 100%; 3127 } 3128 3129 .chat.isSkinnyChat .chatMsg .meta { 3130 font-size: 10px; 3131 margin-bottom: 2px; 3132 } 3133 3134 .chat.isSkinnyChat .chatMsg .content { 3135 font-size: 12px; 3136 line-height: 1.3; 3137 white-space: pre-wrap; 3138 overflow-wrap: anywhere; 3139 word-break: break-word; 3140 } 3141 3142 .chat.isSkinnyChat .chatMsg .content img, 3143 .chat.isSkinnyChat .chatMsg .content audio, 3144 .chat.isSkinnyChat .chatMsg .content video, 3145 .chat.isSkinnyChat .chatReplyRef, 3146 .chat.isSkinnyChat .chatReactions { 3147 display: none !important; 3148 } 3149 3150 .chat.isSkinnyChat .chatActionsRow { 3151 margin-top: 4px; 3152 gap: 6px; 3153 } 3154 3155 .chat.isSkinnyChat .chatTools { 3156 margin-top: 0; 3157 gap: 4px; 3158 justify-content: flex-start; 3159 } 3160 3161 .chat.isSkinnyChat .chatTools .smallBtn { 3162 padding: 3px 8px; 3163 } 3164 3165 .chat.isSkinnyChat .toolbar { 3166 padding: 6px; 3167 gap: 4px; 3168 } 3169 3170 .chat.isSkinnyChat .toolbar .sep, 3171 .chat.isSkinnyChat .toolbar button[data-chatcmd], 3172 .chat.isSkinnyChat .toolbar button[data-chatemoji] { 3173 display: none; 3174 } 3175 3176 .chat.isSkinnyChat .chatEditor { 3177 min-height: 64px; 3178 } 3179 3180 .chat.isSkinnyChat .chatForm { 3181 gap: 8px; 3182 padding: 8px; 3183 } 3184 3185 .chatReplyBanner { 3186 border: 1px solid rgba(246, 240, 255, 0.16); 3187 border-radius: 12px; 3188 padding: 6px 8px; 3189 display: flex; 3190 justify-content: space-between; 3191 align-items: center; 3192 gap: 8px; 3193 background: rgba(255, 255, 255, 0.03); 3194 } 3195 3196 .chatComposer { 3197 flex: 1; 3198 display: flex; 3199 flex-direction: column; 3200 gap: 8px; 3201 min-width: 0; 3202 position: relative; 3203 } 3204 3205 .chatEditor { 3206 min-height: 84px; 3207 max-height: 160px; 3208 overflow: auto; 3209 border: 1px solid rgba(246, 240, 255, 0.14); 3210 border-radius: 14px; 3211 background: rgba(255, 255, 255, 0.02); 3212 } 3213 3214 .mentionMenu { 3215 position: fixed; 3216 z-index: 130; 3217 width: 220px; 3218 max-height: 220px; 3219 overflow: auto; 3220 border: 1px solid rgba(246, 240, 255, 0.16); 3221 border-radius: 14px; 3222 background: rgba(8, 8, 16, 0.92); 3223 backdrop-filter: blur(12px); 3224 box-shadow: 0 16px 60px rgba(0, 0, 0, 0.45); 3225 padding: 6px; 3226 animation: popFloat var(--dur-med) var(--ease-out) both; 3227 } 3228 3229 .mentionItem { 3230 padding: 8px 10px; 3231 border-radius: 12px; 3232 cursor: pointer; 3233 border: 1px solid transparent; 3234 } 3235 3236 .mentionItem.isOn { 3237 border-color: rgba(255, 62, 165, 0.35); 3238 background: rgba(255, 62, 165, 0.14); 3239 } 3240 3241 .mentionItem:hover { 3242 border-color: rgba(246, 240, 255, 0.14); 3243 background: rgba(255, 255, 255, 0.04); 3244 } 3245 3246 .modTabs { 3247 display: flex; 3248 gap: 8px; 3249 margin-top: 10px; 3250 } 3251 3252 .modTabs button { 3253 flex: 1; 3254 padding: 8px 10px; 3255 } 3256 3257 .modFilters { 3258 margin-top: 10px; 3259 display: flex; 3260 gap: 8px; 3261 } 3262 3263 .modBody { 3264 margin-top: 10px; 3265 flex: 1; 3266 min-height: 0; 3267 overflow: auto; 3268 display: flex; 3269 flex-direction: column; 3270 gap: 8px; 3271 padding-right: 4px; 3272 } 3273 3274 .modCard { 3275 border: 1px solid rgba(246, 240, 255, 0.14); 3276 border-radius: 12px; 3277 padding: 8px; 3278 background: rgba(255, 255, 255, 0.02); 3279 display: flex; 3280 flex-direction: column; 3281 gap: 6px; 3282 transition: border-color var(--dur-med) var(--ease-out), background var(--dur-med) var(--ease-out), 3283 box-shadow var(--dur-med) var(--ease-out), transform var(--dur-med) var(--ease-out); 3284 } 3285 3286 .modCard:hover { 3287 border-color: rgba(246, 240, 255, 0.20); 3288 background: rgba(255, 255, 255, 0.03); 3289 box-shadow: 0 12px 34px rgba(0, 0, 0, 0.24); 3290 } 3291 3292 .modRowTop { 3293 display: flex; 3294 justify-content: space-between; 3295 gap: 10px; 3296 align-items: center; 3297 } 3298 3299 .modActions { 3300 display: flex; 3301 flex-wrap: wrap; 3302 gap: 6px; 3303 } 3304 3305 .modActions button { 3306 padding: 6px 8px; 3307 border-radius: 10px; 3308 font-size: 12px; 3309 } 3310 3311 .devLogPre { 3312 margin: 0; 3313 padding: 10px; 3314 border-radius: 12px; 3315 border: 1px solid rgba(246, 240, 255, 0.10); 3316 background: rgba(0, 0, 0, 0.18); 3317 max-height: min(52vh, 520px); 3318 overflow: auto; 3319 font-size: 12px; 3320 line-height: 1.2rem; 3321 white-space: pre-wrap; 3322 word-break: break-word; 3323 } 3324 3325 .modStatus { 3326 display: inline-flex; 3327 align-items: center; 3328 border: 1px solid rgba(255, 62, 165, 0.25); 3329 background: rgba(255, 62, 165, 0.12); 3330 border-radius: 999px; 3331 padding: 2px 8px; 3332 font-size: 11px; 3333 margin-left: 6px; 3334 } 3335 3336 .mobilePager { 3337 position: fixed; 3338 left: 50%; 3339 bottom: calc(10px + env(safe-area-inset-bottom, 0px)); 3340 transform: translateX(-50%); 3341 z-index: 80; 3342 display: flex; 3343 gap: 8px; 3344 padding: 8px; 3345 border-radius: 999px; 3346 border: 1px solid rgba(246, 240, 255, 0.14); 3347 background: rgba(8, 8, 16, 0.92); 3348 backdrop-filter: blur(10px); 3349 } 3350 3351 .mobilePager button { 3352 padding: 8px 12px; 3353 border-radius: 999px; 3354 } 3355 3356 /* Mobile UX: screens, not racks (see docs/MOBILE_UX.md). */ 3357 .mobileNav { 3358 position: fixed; 3359 left: 50%; 3360 bottom: calc(10px + env(safe-area-inset-bottom, 0px)); 3361 transform: translateX(-50%); 3362 z-index: 90; 3363 display: flex; 3364 gap: 8px; 3365 padding: 8px; 3366 width: min(720px, calc(100vw - 24px)); 3367 max-width: calc(100vw - 24px); 3368 justify-content: space-between; 3369 border-radius: 999px; 3370 border: 1px solid rgba(246, 240, 255, 0.14); 3371 background: rgba(8, 8, 16, 0.92); 3372 backdrop-filter: blur(10px); 3373 } 3374 3375 .mobileNav button { 3376 flex: 1 1 0; 3377 min-width: 0; 3378 padding: 10px 0; 3379 border-radius: 999px; 3380 text-align: center; 3381 white-space: nowrap; 3382 overflow: hidden; 3383 text-overflow: ellipsis; 3384 } 3385 3386 .mobileMoreSheet { 3387 position: fixed; 3388 inset: 0; 3389 z-index: 95; 3390 display: flex; 3391 align-items: flex-end; 3392 justify-content: center; 3393 } 3394 3395 @media (max-width: 380px) { 3396 .mobileNav { 3397 gap: 6px; 3398 padding: 6px; 3399 } 3400 3401 .mobileNav button { 3402 font-size: 12px; 3403 } 3404 } 3405 3406 .mobileMoreBackdrop { 3407 position: absolute; 3408 inset: 0; 3409 background: rgba(0, 0, 0, 0.55); 3410 } 3411 3412 .mobileMoreCard { 3413 position: relative; 3414 width: min(720px, 100%); 3415 max-height: calc(100dvh - 18px - env(safe-area-inset-bottom, 0px)); 3416 max-height: calc(100vh - 18px - env(safe-area-inset-bottom, 0px)); 3417 border-radius: 16px 16px 0 0; 3418 border-bottom-left-radius: 0; 3419 border-bottom-right-radius: 0; 3420 overflow: hidden; 3421 box-shadow: var(--shadow-soft); 3422 } 3423 3424 .mobileMoreBody { 3425 padding: 12px; 3426 display: flex; 3427 flex-direction: column; 3428 gap: 10px; 3429 overflow: auto; 3430 } 3431 3432 .mobileMoreBody input { 3433 width: 100%; 3434 } 3435 3436 .mobileMoreList { 3437 display: flex; 3438 flex-direction: column; 3439 gap: 10px; 3440 } 3441 3442 .mobileMoreItem { 3443 display: flex; 3444 align-items: center; 3445 justify-content: space-between; 3446 gap: 10px; 3447 padding: 10px 12px; 3448 border: 1px solid var(--line); 3449 border-radius: 14px; 3450 background: rgba(255, 255, 255, 0.02); 3451 } 3452 3453 .mobileScreenHost { 3454 grid-area: main; 3455 display: none; 3456 flex-direction: column; 3457 gap: var(--app-gap); 3458 overflow: hidden; 3459 } 3460 3461 @media (max-width: 760px), (hover: none) and (pointer: coarse) and (max-width: 900px), (hover: none) and (pointer: coarse) and (max-height: 520px) { 3462 .app.mobileScreens { 3463 display: block; 3464 padding: 0; 3465 gap: 0; 3466 height: 100dvh; 3467 height: 100vh; 3468 } 3469 3470 .app.mobileScreens .sidebarToggle, 3471 .app.mobileScreens .peopleToggle, 3472 .app.mobileScreens .sideRackToggle, 3473 .app.mobileScreens .rightRackToggle { 3474 display: none; 3475 } 3476 3477 .app.mobileScreens > .sidebar, 3478 .app.mobileScreens > .main, 3479 .app.mobileScreens > .chat, 3480 .app.mobileScreens > .panelResizeHandle, 3481 .app.mobileScreens > #rightRack, 3482 .app.mobileScreens > .mobileScreenHost, 3483 .app.mobileScreens > .moderation { 3484 display: none; 3485 width: 100%; 3486 height: calc(100dvh - 56px - env(safe-area-inset-bottom, 0px)); 3487 height: calc(100vh - 56px - env(safe-area-inset-bottom, 0px)); 3488 border-radius: 0; 3489 border-left: 0; 3490 border-right: 0; 3491 } 3492 3493 /* Core screens */ 3494 .app.mobileScreens[data-mobile-screen="account"] > .sidebar { 3495 display: flex; 3496 } 3497 3498 .app.mobileScreens[data-mobile-screen="hives"] > .main, 3499 .app.mobileScreens[data-mobile-screen="chat"] > .chat, 3500 .app.mobileScreens[data-mobile-screen="moderation"] > .moderation { 3501 display: flex; 3502 } 3503 3504 .app.mobileScreens[data-mobile-screen="host"] > .mobileScreenHost { 3505 display: flex; 3506 } 3507 3508 /* Force active screen to full width/height regardless of desktop grid. */ 3509 .app.mobileScreens[data-mobile-screen="account"] > .sidebar, 3510 .app.mobileScreens[data-mobile-screen="hives"] > .main, 3511 .app.mobileScreens[data-mobile-screen="chat"] > .chat, 3512 .app.mobileScreens[data-mobile-screen="moderation"] > .moderation, 3513 .app.mobileScreens[data-mobile-screen="host"] > .mobileScreenHost { 3514 position: fixed; 3515 top: 0; 3516 left: 0; 3517 right: 0; 3518 bottom: calc(56px + env(safe-area-inset-bottom, 0px)); 3519 z-index: 85; 3520 } 3521 3522 /* People screen is a sibling of .app */ 3523 .app.mobileScreens + .peopleDrawer { 3524 display: none; 3525 top: 0; 3526 right: 0; 3527 bottom: 56px; 3528 width: 100%; 3529 border-radius: 0; 3530 border-left: 0; 3531 border-right: 0; 3532 } 3533 3534 .app.mobileScreens[data-mobile-screen="people"] + .peopleDrawer { 3535 display: flex; 3536 } 3537 3538 .app.mobileScreens[data-mobile-screen="people"] + .peopleDrawer { 3539 position: fixed; 3540 left: 0; 3541 top: 0; 3542 right: 0; 3543 bottom: calc(56px + env(safe-area-inset-bottom, 0px)); 3544 z-index: 85; 3545 } 3546 3547 /* In mobile hives screen, hide the desktop side rack column. */ 3548 .app.mobileScreens[data-mobile-screen="hives"] #mainSideRack { 3549 display: none !important; 3550 } 3551 3552 /* Hide the hotbar unless explicitly shown elsewhere. */ 3553 .app.mobileScreens + .dockHotbar { 3554 display: none; 3555 } 3556 } 3557 3558 /* (Rack-specific mobile styles removed in favor of screen-based mobile UX.) */ 3559 3560 /* JS-driven mobile mode: enforce screen behavior by class, even if viewport/media heuristics disagree. */ 3561 .app.mobileScreens { 3562 display: block; 3563 padding: 0; 3564 gap: 0; 3565 width: 100vw; 3566 height: 100dvh; 3567 height: 100vh; 3568 overflow: hidden; 3569 grid-template-columns: 1fr !important; 3570 grid-template-areas: "main" !important; 3571 } 3572 3573 .app.mobileScreens .sidebarToggle, 3574 .app.mobileScreens .peopleToggle, 3575 .app.mobileScreens .sideRackToggle, 3576 .app.mobileScreens .rightRackToggle { 3577 display: none !important; 3578 } 3579 3580 .app.mobileScreens.rackMode .sideRackToggle, 3581 .app.mobileScreens.rackMode .rightRackToggle, 3582 .app.mobileScreens #showSideRack, 3583 .app.mobileScreens #showRightRack { 3584 display: none !important; 3585 } 3586 3587 .app.mobileScreens > .sidebar, 3588 .app.mobileScreens > .main, 3589 .app.mobileScreens > .chat, 3590 .app.mobileScreens > .panelResizeHandle, 3591 .app.mobileScreens > #rightRack, 3592 .app.mobileScreens > .mobileScreenHost, 3593 .app.mobileScreens > .moderation { 3594 display: none !important; 3595 width: 100vw !important; 3596 max-width: none !important; 3597 height: calc(100dvh - 56px - env(safe-area-inset-bottom, 0px)); 3598 height: calc(100vh - 56px - env(safe-area-inset-bottom, 0px)); 3599 border-radius: 0 !important; 3600 border-left: 0 !important; 3601 border-right: 0 !important; 3602 } 3603 3604 .app.mobileScreens[data-mobile-screen="account"] > .sidebar, 3605 .app.mobileScreens[data-mobile-screen="hives"] > .main, 3606 .app.mobileScreens[data-mobile-screen="chat"] > .chat, 3607 .app.mobileScreens[data-mobile-screen="moderation"] > .moderation, 3608 .app.mobileScreens[data-mobile-screen="host"] > .mobileScreenHost { 3609 display: flex !important; 3610 position: fixed; 3611 top: 0; 3612 left: 0; 3613 right: 0; 3614 bottom: calc(56px + env(safe-area-inset-bottom, 0px)); 3615 z-index: 85; 3616 } 3617 3618 .app.mobileScreens[data-mobile-screen="hives"] #mainSideRack { 3619 display: none !important; 3620 } 3621 3622 .app.mobileScreens[data-mobile-screen="hives"] .main, 3623 .app.mobileScreens[data-mobile-screen="hives"] .mainRack, 3624 .app.mobileScreens[data-mobile-screen="hives"] #mainWorkspaceRack, 3625 .app.mobileScreens[data-mobile-screen="hives"] #hivesPanel { 3626 width: 100% !important; 3627 max-width: none !important; 3628 min-width: 0 !important; 3629 } 3630 3631 .app.mobileScreens[data-mobile-screen="hives"] .mainRack { 3632 gap: 0; 3633 } 3634 3635 .app.mobileScreens[data-mobile-screen="account"] #viewPanel .checkRow:has(#toggleSideRack), 3636 .app.mobileScreens[data-mobile-screen="account"] #viewPanel .checkRow:has(#toggleRightRack), 3637 .app.mobileScreens[data-mobile-screen="account"] #viewPanel .checkRow:has(#toggleReactions), 3638 .app.mobileScreens[data-mobile-screen="account"] .sidebarFooter { 3639 display: none !important; 3640 } 3641 3642 .app.mobileScreens[data-mobile-screen="host"] > .mobileScreenHost { 3643 gap: 0; 3644 overflow: auto; 3645 } 3646 3647 .app.mobileScreens .mobileScreenHost > .peopleDrawer { 3648 position: relative !important; 3649 top: 0 !important; 3650 right: 0 !important; 3651 bottom: 0 !important; 3652 left: 0 !important; 3653 width: 100% !important; 3654 height: 100% !important; 3655 border-radius: 0 !important; 3656 border-left: 0 !important; 3657 border-right: 0 !important; 3658 box-shadow: none !important; 3659 } 3660 3661 .app.mobileScreens .mobileScreenHost > .peopleDrawer .peopleResizeHandle { 3662 display: none !important; 3663 } 3664 3665 .app.mobileScreens .reactionsRow, 3666 .app.mobileScreens .chatReactions { 3667 display: none !important; 3668 } 3669 3670 .app.mobileScreens .chatMessages { 3671 font-size: 13px; 3672 line-height: 1.24; 3673 padding: 8px 8px 6px; 3674 } 3675 3676 .app.mobileScreens .streamStage { 3677 margin: 8px; 3678 padding: 8px; 3679 gap: 6px; 3680 } 3681 3682 .app.mobileScreens .streamStageVideo { 3683 max-height: min(28vh, 220px); 3684 } 3685 3686 .app.mobileScreens .chatMsg { 3687 padding: 6px 7px; 3688 margin-top: 6px; 3689 border-radius: 12px; 3690 } 3691 3692 .app.mobileScreens .chatMsg .meta { 3693 font-size: 10px; 3694 margin-bottom: 2px; 3695 } 3696 3697 .app.mobileScreens .chatComposer .toolbar [data-chatcmd], 3698 .app.mobileScreens .chatComposer .toolbar [data-chatemoji], 3699 .app.mobileScreens .chatComposer .toolbar .sep { 3700 display: none !important; 3701 } 3702 3703 .app.mobileScreens .chatComposer .toolbar .chatModToggle:not(.hidden) { 3704 display: inline-flex !important; 3705 align-items: center; 3706 gap: 6px; 3707 } 3708 3709 .app.mobileScreens [data-rackdrag], 3710 .app.mobileScreens [data-skinny], 3711 .app.mobileScreens [data-expand], 3712 .app.mobileScreens [data-minimize] { 3713 display: none !important; 3714 } 3715 3716 .app.mobileScreens #pollinatePanel .toolbar [data-cmd], 3717 .app.mobileScreens #pollinatePanel .toolbar [data-postemoji], 3718 .app.mobileScreens #pollinatePanel .toolbar .sep { 3719 display: none !important; 3720 } 3721 3722 .app.mobileScreens .chatForm > .primary[type="submit"] { 3723 align-self: stretch; 3724 width: 100%; 3725 } 3726 3727 .app.mobileScreens .chatForm { 3728 gap: 8px; 3729 padding: 8px; 3730 padding-bottom: calc(74px + env(safe-area-inset-bottom, 0px)); 3731 } 3732 3733 .app.mobileScreens .typingIndicator { 3734 padding: 0 8px 4px; 3735 min-height: 14px; 3736 } 3737 3738 .app.mobileScreens .chatHeaderActions { 3739 margin-left: auto; 3740 } 3741 3742 .chatContextSelect { 3743 min-width: 180px; 3744 max-width: 320px; 3745 } 3746 3747 .mobileChatSection { 3748 display: flex; 3749 flex-direction: column; 3750 gap: 8px; 3751 } 3752 3753 .app.mobileScreens .mobileChatList { 3754 display: flex; 3755 flex-direction: column; 3756 gap: 12px; 3757 } 3758 3759 .app.mobileScreens .chatContextSelect { 3760 min-width: 132px; 3761 max-width: 180px; 3762 } 3763 3764 .app.mobileScreens .mobileChatListItem { 3765 width: 100%; 3766 text-align: left; 3767 padding: 10px; 3768 border-radius: 12px; 3769 display: flex; 3770 flex-direction: column; 3771 gap: 3px; 3772 } 3773 3774 .app.mobileScreens .mobileChatListTop { 3775 font-weight: 800; 3776 } 3777 3778 .app.mobileScreens .mobileChatListMeta { 3779 font-size: 12px; 3780 color: var(--muted); 3781 } 3782 3783 .app.mobileScreens[data-mobile-screen="hives"] #filterAuthor, 3784 .app.mobileScreens[data-mobile-screen="hives"] #filterKeywords, 3785 .app.mobileScreens[data-mobile-screen="hives"] #sortBy { 3786 display: none !important; 3787 } 3788 3789 .app.mobileScreens[data-mobile-screen="hives"] .mobileOnlyHiveControl { 3790 display: inline-flex !important; 3791 align-items: center; 3792 justify-content: center; 3793 min-width: 68px; 3794 height: 34px; 3795 padding: 0 10px; 3796 } 3797 3798 .app.mobileScreens[data-mobile-screen="hives"] #mobileHiveSearch { 3799 min-width: 42px; 3800 font-size: 15px; 3801 } 3802 3803 .app.mobileScreens[data-mobile-screen="hives"] .filters { 3804 gap: 4px; 3805 padding: 4px; 3806 } 3807 3808 .app.mobileScreens[data-mobile-screen="hives"] .hiveTabs { 3809 flex-wrap: nowrap; 3810 overflow-x: auto; 3811 gap: 6px; 3812 padding: 8px 10px 8px; 3813 margin-bottom: 0; 3814 } 3815 3816 .app.mobileScreens[data-mobile-screen="hives"] .hiveTabs button { 3817 padding: 7px 12px; 3818 font-size: 12px; 3819 flex: 0 0 auto; 3820 } 3821 3822 .app.mobileScreens[data-mobile-screen="hives"] .feed { 3823 grid-template-columns: 1fr; 3824 gap: 8px; 3825 padding: 8px; 3826 } 3827 3828 .app.mobileScreens[data-mobile-screen="hives"] .post { 3829 padding: 8px; 3830 gap: 6px; 3831 border-radius: 12px; 3832 } 3833 3834 .app.mobileScreens[data-mobile-screen="hives"] .postTitle { 3835 font-size: 14px; 3836 margin-bottom: 2px; 3837 } 3838 3839 .app.mobileScreens[data-mobile-screen="hives"] .postTitleRow { 3840 gap: 2px; 3841 } 3842 3843 .app.mobileScreens[data-mobile-screen="hives"] .post .pfp { 3844 display: none; 3845 } 3846 3847 .app.mobileScreens[data-mobile-screen="hives"] .post .small { 3848 font-size: 11px; 3849 } 3850 3851 .app.mobileScreens[data-mobile-screen="hives"] .postMeta { 3852 margin-top: 4px; 3853 gap: 4px; 3854 } 3855 3856 .app.mobileScreens[data-mobile-screen="hives"] .tag { 3857 font-size: 11px; 3858 padding: 2px 7px; 3859 } 3860 3861 .app.mobileScreens + .peopleDrawer { 3862 display: none; 3863 } 3864 3865 .app.mobileScreens[data-mobile-screen="people"] + .peopleDrawer { 3866 display: flex !important; 3867 position: fixed; 3868 left: 0; 3869 top: 0; 3870 right: 0; 3871 bottom: calc(56px + env(safe-area-inset-bottom, 0px)); 3872 width: 100vw; 3873 border-radius: 0; 3874 border-left: 0; 3875 border-right: 0; 3876 z-index: 85; 3877 } 3878 3879 .app.mobileScreens + .dockHotbar { 3880 display: none !important; 3881 } 3882 3883 @keyframes fadeIn { 3884 from { 3885 opacity: 0; 3886 } 3887 to { 3888 opacity: 1; 3889 } 3890 } 3891 3892 @keyframes modalIn { 3893 from { 3894 opacity: 0; 3895 transform: translateY(10px) scale(0.985); 3896 } 3897 to { 3898 opacity: 1; 3899 transform: translateY(0px) scale(1); 3900 } 3901 } 3902 3903 @keyframes drawerIn { 3904 from { 3905 opacity: 0; 3906 transform: translateX(10px) scale(0.995); 3907 } 3908 to { 3909 opacity: 1; 3910 transform: translateX(0px) scale(1); 3911 } 3912 } 3913 3914 @keyframes toastIn { 3915 from { 3916 opacity: 0; 3917 transform: translateY(10px) scale(0.995); 3918 } 3919 to { 3920 opacity: 1; 3921 transform: translateY(0px) scale(1); 3922 } 3923 } 3924 3925 @keyframes popFloat { 3926 from { 3927 opacity: 0; 3928 transform: translateY(6px) scale(0.985); 3929 } 3930 to { 3931 opacity: 1; 3932 transform: translateY(0px) scale(1); 3933 } 3934 } 3935 3936 @keyframes msgIn { 3937 from { 3938 opacity: 0.75; 3939 transform: translateY(6px); 3940 box-shadow: 0 0 0 rgba(0, 0, 0, 0); 3941 } 3942 to { 3943 opacity: 1; 3944 transform: translateY(0px); 3945 box-shadow: 0 0 0 rgba(0, 0, 0, 0); 3946 } 3947 } 3948 3949 @keyframes mentionPing { 3950 0% { 3951 box-shadow: 0 0 0 2px rgba(255, 62, 165, 0.12); 3952 } 3953 45% { 3954 box-shadow: 0 0 0 2px rgba(255, 62, 165, 0.12), 0 16px 50px rgba(255, 62, 165, 0.12); 3955 } 3956 100% { 3957 box-shadow: 0 0 0 2px rgba(255, 62, 165, 0.14); 3958 } 3959 } 3960 3961 @keyframes reactPop { 3962 0% { 3963 transform: scale(1); 3964 filter: brightness(1); 3965 } 3966 40% { 3967 transform: scale(1.08); 3968 filter: brightness(1.15); 3969 } 3970 100% { 3971 transform: scale(1); 3972 filter: brightness(1); 3973 } 3974 } 3975 3976 .guidedTourOverlay { 3977 position: fixed; 3978 inset: 0; 3979 z-index: 1400; 3980 pointer-events: none; 3981 } 3982 3983 .guidedTourShade { 3984 display: none; 3985 } 3986 3987 .guidedTourFocus { 3988 display: none; 3989 } 3990 3991 .onboardingGateHint { 3992 margin-top: 8px; 3993 margin-bottom: 8px; 3994 border-radius: 12px; 3995 border: 1px solid color-mix(in oklab, var(--bad) 55%, var(--line) 45%); 3996 background: linear-gradient(180deg, rgba(255, 77, 138, 0.16), rgba(255, 77, 138, 0.07)); 3997 padding: 10px 12px; 3998 display: flex; 3999 align-items: center; 4000 justify-content: space-between; 4001 gap: 10px; 4002 } 4003 4004 .onboardingGateText { 4005 color: color-mix(in oklab, var(--text) 92%, white 8%); 4006 font-size: 13px; 4007 line-height: 1.35; 4008 } 4009 4010 .guidedTourCard { 4011 position: absolute; 4012 left: 50%; 4013 bottom: 16px; 4014 transform: translateX(-50%); 4015 width: min(760px, calc(100vw - 24px)); 4016 border-radius: 14px; 4017 border: 1px solid color-mix(in oklab, var(--accent) 45%, var(--line)); 4018 background: color-mix(in oklab, var(--panel) 94%, #020204 6%); 4019 box-shadow: 0 24px 60px rgba(0, 0, 0, 0.45); 4020 padding: 12px 14px; 4021 pointer-events: auto; 4022 } 4023 4024 .guidedTourOverlay[data-cardpos="top"] .guidedTourCard { 4025 top: 16px; 4026 bottom: auto; 4027 left: 50%; 4028 right: auto; 4029 transform: translateX(-50%); 4030 } 4031 4032 .guidedTourOverlay[data-cardpos="left"] .guidedTourCard { 4033 top: 50%; 4034 bottom: auto; 4035 left: 16px; 4036 right: auto; 4037 transform: translateY(-50%); 4038 width: min(560px, calc(100vw - 32px)); 4039 } 4040 4041 .guidedTourOverlay[data-cardpos="right"] .guidedTourCard { 4042 top: 50%; 4043 bottom: auto; 4044 left: auto; 4045 right: 16px; 4046 transform: translateY(-50%); 4047 width: min(560px, calc(100vw - 32px)); 4048 } 4049 4050 .guidedTourStep { 4051 font-size: 11px; 4052 letter-spacing: 0.08em; 4053 text-transform: uppercase; 4054 color: color-mix(in oklab, var(--accent2) 55%, var(--text) 45%); 4055 margin-bottom: 4px; 4056 } 4057 4058 .guidedTourTitle { 4059 font-size: 18px; 4060 font-weight: 700; 4061 margin-bottom: 6px; 4062 } 4063 4064 .guidedTourBody { 4065 line-height: 1.45; 4066 } 4067 4068 .guidedTourTask { 4069 margin-top: 10px; 4070 font-size: 13px; 4071 color: color-mix(in oklab, var(--good) 70%, var(--text) 30%); 4072 } 4073 4074 .guidedTourStatus { 4075 margin-top: 6px; 4076 min-height: 18px; 4077 } 4078 4079 .guidedTourDontShow { 4080 display: inline-flex; 4081 align-items: center; 4082 gap: 8px; 4083 margin-top: 6px; 4084 user-select: none; 4085 } 4086 4087 .guidedTourDontShow input[type="checkbox"] { 4088 transform: translateY(0.5px); 4089 } 4090 4091 .guidedTourActions { 4092 margin-top: 8px; 4093 justify-content: flex-end; 4094 gap: 8px; 4095 } 4096 4097 .tourTargetPulse { 4098 outline: 4px solid color-mix(in oklab, var(--accent) 88%, white 12%); 4099 outline-offset: 5px; 4100 border-radius: 10px; 4101 box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.2), 0 0 42px rgba(255, 62, 165, 0.45), 0 0 92px rgba(184, 75, 255, 0.35); 4102 animation: tourPulse 1.1s ease-in-out infinite alternate; 4103 } 4104 4105 @keyframes tourPulse { 4106 from { 4107 outline-color: color-mix(in oklab, var(--accent) 90%, white 10%); 4108 box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.2), 0 0 42px rgba(255, 62, 165, 0.45), 0 0 92px rgba(184, 75, 255, 0.35); 4109 } 4110 to { 4111 outline-color: color-mix(in oklab, var(--accent2) 86%, white 14%); 4112 box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.28), 0 0 58px rgba(255, 62, 165, 0.55), 0 0 120px rgba(184, 75, 255, 0.45); 4113 } 4114 } 4115 4116 .app.authLockedWorkspace { 4117 filter: blur(20px) saturate(0.6) brightness(0.45) contrast(0.9); 4118 pointer-events: none; 4119 user-select: none; 4120 } 4121 4122 .app.authLockedWorkspace .peopleToggle, 4123 .app.authLockedWorkspace .rightRackToggle, 4124 .app.authLockedWorkspace .sideRackToggle { 4125 display: none !important; 4126 } 4127 4128 .rackPanel.tourContextDim { 4129 filter: brightness(0.55) saturate(0.75); 4130 opacity: 0.7; 4131 transition: filter 180ms ease, opacity 180ms ease; 4132 } 4133 4134 .bzlSplash { 4135 position: fixed; 4136 inset: 0; 4137 z-index: 1700; 4138 display: flex; 4139 align-items: center; 4140 justify-content: center; 4141 background: 4142 radial-gradient(1400px 740px at 50% 28%, rgba(38, 235, 255, 0.24), rgba(4, 9, 22, 0.97)), 4143 linear-gradient(130deg, rgba(7, 10, 20, 0.98), rgba(4, 7, 16, 0.98)); 4144 overflow: hidden; 4145 transition: opacity 420ms ease; 4146 } 4147 4148 .bzlSplash.hidden { 4149 opacity: 0; 4150 pointer-events: none; 4151 } 4152 4153 .bzlSplashFx { 4154 position: absolute; 4155 inset: -20%; 4156 background: 4157 radial-gradient(circle at 20% 35%, rgba(72, 249, 255, 0.2), transparent 34%), 4158 radial-gradient(circle at 78% 68%, rgba(255, 60, 186, 0.16), transparent 36%), 4159 repeating-linear-gradient( 4160 to bottom, 4161 rgba(255, 255, 255, 0.02) 0px, 4162 rgba(255, 255, 255, 0.02) 1px, 4163 transparent 3px, 4164 transparent 8px 4165 ); 4166 filter: blur(0.3px) saturate(1.2); 4167 animation: splashDrift 9s ease-in-out infinite alternate; 4168 } 4169 4170 .bzlSplashCore { 4171 position: relative; 4172 width: min(380px, calc(100vw - 28px)); 4173 display: flex; 4174 flex-direction: column; 4175 align-items: center; 4176 gap: 8px; 4177 padding: 24px 20px 18px; 4178 border-radius: 18px; 4179 border: 1px solid rgba(111, 248, 255, 0.25); 4180 background: 4181 linear-gradient(180deg, rgba(18, 28, 44, 0.75), rgba(8, 14, 28, 0.84)), 4182 rgba(9, 12, 24, 0.86); 4183 box-shadow: 4184 0 30px 80px rgba(0, 0, 0, 0.48), 4185 inset 0 0 0 1px rgba(255, 255, 255, 0.05), 4186 0 0 40px rgba(66, 239, 255, 0.2); 4187 } 4188 4189 .bzlSplashRing { 4190 position: absolute; 4191 width: 172px; 4192 height: 172px; 4193 border-radius: 50%; 4194 border: 1px solid rgba(95, 246, 255, 0.5); 4195 box-shadow: 0 0 36px rgba(95, 246, 255, 0.26), inset 0 0 22px rgba(255, 255, 255, 0.06); 4196 animation: splashRing 1.7s ease-in-out infinite; 4197 pointer-events: none; 4198 } 4199 4200 .bzlSplashLogo { 4201 width: clamp(84px, 13vw, 150px); 4202 height: auto; 4203 filter: drop-shadow(0 0 22px rgba(60, 245, 255, 0.6)); 4204 animation: splashBreathe 950ms ease-in-out infinite alternate; 4205 } 4206 4207 .bzlSplashWord { 4208 font-size: clamp(28px, 4vw, 36px); 4209 font-weight: 800; 4210 letter-spacing: 0.12em; 4211 text-transform: uppercase; 4212 color: #effcff; 4213 text-shadow: 0 0 18px rgba(94, 246, 255, 0.42); 4214 } 4215 4216 .bzlSplashTag { 4217 margin-top: -2px; 4218 color: color-mix(in oklab, var(--text) 72%, #9defff 28%); 4219 } 4220 4221 .bzlSplashProgress { 4222 width: 100%; 4223 height: 7px; 4224 border-radius: 999px; 4225 border: 1px solid rgba(111, 248, 255, 0.3); 4226 background: rgba(6, 11, 20, 0.65); 4227 overflow: hidden; 4228 } 4229 4230 .bzlSplashProgressFill { 4231 width: 100%; 4232 height: 100%; 4233 transform: scaleX(0); 4234 transform-origin: 0 50%; 4235 background: linear-gradient(90deg, #4df8ff, #6ce9ff, #ff65c8); 4236 box-shadow: 0 0 14px rgba(103, 240, 255, 0.6); 4237 } 4238 4239 .bzlSplashStartBtn { 4240 margin-top: 2px; 4241 } 4242 4243 @keyframes splashDrift { 4244 from { 4245 transform: translate3d(-1.2%, -0.8%, 0) scale(1); 4246 } 4247 to { 4248 transform: translate3d(1.2%, 1.3%, 0) scale(1.03); 4249 } 4250 } 4251 4252 @keyframes splashRing { 4253 0% { 4254 transform: scale(0.95); 4255 opacity: 0.72; 4256 } 4257 60% { 4258 transform: scale(1.04); 4259 opacity: 1; 4260 } 4261 100% { 4262 transform: scale(0.97); 4263 opacity: 0.8; 4264 } 4265 } 4266 4267 @keyframes splashBreathe { 4268 from { 4269 transform: scale(0.98); 4270 opacity: 0.86; 4271 } 4272 to { 4273 transform: scale(1.03); 4274 opacity: 1; 4275 } 4276 } 4277 4278 .authGate { 4279 position: fixed; 4280 inset: 0; 4281 z-index: 1650; 4282 display: grid; 4283 place-items: center; 4284 pointer-events: auto; 4285 background: rgba(5, 8, 16, 0.42); 4286 backdrop-filter: blur(12px) saturate(1.05); 4287 -webkit-backdrop-filter: blur(12px) saturate(1.05); 4288 } 4289 4290 .authGateInner { 4291 width: min(880px, calc(100vw - 24px)); 4292 max-height: calc(100vh - 24px); 4293 overflow: auto; 4294 display: grid; 4295 grid-template-columns: minmax(280px, 360px) minmax(0, 1fr); 4296 gap: 12px; 4297 } 4298 4299 .authGateCard, 4300 .authGateOnboarding { 4301 border: 1px solid color-mix(in oklab, var(--line) 66%, var(--accent) 34%); 4302 border-radius: 14px; 4303 background: color-mix(in oklab, var(--panel) 96%, #010204 4%); 4304 box-shadow: 0 22px 62px rgba(0, 0, 0, 0.4); 4305 padding: 12px; 4306 } 4307 4308 .authGateForm { 4309 margin-top: 8px; 4310 } 4311 4312 @media (max-width: 920px) { 4313 .authGateInner { 4314 grid-template-columns: 1fr; 4315 } 4316 } 4317 4318 @media (max-width: 780px) { 4319 .guidedTourCard { 4320 width: calc(100vw - 14px); 4321 left: 7px; 4322 right: 7px; 4323 bottom: 8px; 4324 transform: none; 4325 padding: 10px; 4326 } 4327 4328 .guidedTourTitle { 4329 font-size: 16px; 4330 } 4331 } 4332 4333 @media (prefers-reduced-motion: reduce) { 4334 *, 4335 *::before, 4336 *::after { 4337 animation: none !important; 4338 transition: none !important; 4339 scroll-behavior: auto !important; 4340 } 4341 }