personal memory agent
at main 2273 lines 47 kB view raw
1/** 2 * App System Styles 3 * Styles for the app.html template system (facet bar, menu bar, app bar, etc.) 4 */ 5 6/* ======================================== 7 * Cross-Document View Transitions 8 * Enables smooth page transitions in supporting browsers 9 * ======================================== */ 10@view-transition { 11 navigation: auto; 12} 13 14/* Assign transition names to persistent structural elements */ 15.facet-bar { 16 view-transition-name: facet-bar; 17} 18 19.menu-bar { 20 view-transition-name: menu-bar; 21} 22 23.app-bar { 24 view-transition-name: app-bar; 25} 26 27.workspace { 28 view-transition-name: workspace; 29} 30 31/* Customize transition animations */ 32::view-transition-old(workspace), 33::view-transition-new(workspace) { 34 animation-duration: 150ms; 35 animation-timing-function: ease-in-out; 36} 37 38/* Other fixed elements that should persist */ 39.corner-tags { 40 view-transition-name: corner-tags; 41} 42 43.notification-center { 44 view-transition-name: notification-center; 45} 46 47.status-pane { 48 view-transition-name: status-pane; 49} 50 51/* Keep structural elements stable (no animation) */ 52::view-transition-old(facet-bar), 53::view-transition-new(facet-bar), 54::view-transition-old(menu-bar), 55::view-transition-new(menu-bar), 56::view-transition-old(app-bar), 57::view-transition-new(app-bar), 58::view-transition-old(corner-tags), 59::view-transition-new(corner-tags), 60::view-transition-old(notification-center), 61::view-transition-new(notification-center), 62::view-transition-old(status-pane), 63::view-transition-new(status-pane) { 64 animation: none; 65} 66 67/* Universal box-sizing */ 68* { 69 box-sizing: border-box; 70} 71 72/* Reserve scrollbar space to prevent layout shift on navigation */ 73html { 74 scrollbar-gutter: stable; 75} 76 77/* Default theme (when no facet is selected) */ 78:root { 79 --facet-color: #b06a1a; 80 --facet-bg: transparent; 81 --facet-border: #e0e0e0; 82 83 /* Layout dimensions */ 84 --facet-bar-height: 60px; 85 --menu-bar-width-minimal: 60px; 86 --menu-bar-width-full: 200px; 87 --app-bar-height: 60px; 88 --date-nav-height: 40px; 89 --date-nav-width: 300px; 90 --status-pane-width: 280px; 91 92 /* Z-index hierarchy (increasing order) */ 93 --z-bars: 100; /* Facet bar, menu bar, app bar */ 94 --z-modals: 200; /* Modal overlays */ 95 --z-notifications: 300; /* Notifications, status pane, error log */ 96 --z-tags: 400; /* Corner tags - topmost layer */ 97} 98 99body { 100 margin: 0; 101 padding: 0; 102 overflow-x: hidden; 103 font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; 104} 105 106.workspace { 107 margin-top: var(--facet-bar-height); 108 margin-left: var(--menu-bar-width-minimal); 109 margin-bottom: calc(var(--app-bar-height) + 40px); 110} 111 112/* Add extra top margin when date-nav is present */ 113body.has-date-nav .workspace { 114 margin-top: calc(var(--facet-bar-height) + var(--date-nav-height)); 115} 116 117/* Standard workspace containers */ 118.workspace-content { 119 max-width: 1200px; 120 margin: 0 auto; 121 padding: 1.5rem 2rem 2rem; 122} 123 124.workspace-content-wide { 125 padding: 1.5rem 2rem 2rem; 126} 127 128.workspace-prose { 129 max-width: 72ch; 130 margin-inline: auto; 131} 132 133/* Responsive */ 134@media (max-width: 768px) { 135 .workspace-content, 136 .workspace-content-wide { 137 padding: 1rem; 138 } 139} 140 141@media (max-width: 768px) { 142 .menu-bar { 143 width: 0; 144 overflow: hidden; 145 } 146 147 body.menu-full .menu-bar { 148 width: var(--menu-bar-width-full); 149 box-shadow: 4px 0 16px rgba(0, 0, 0, 0.2); 150 z-index: calc(var(--z-bars) + 2); 151 } 152 153 .workspace { 154 margin-left: 0 !important; 155 } 156 157 .facet-bar .facet-pills-container { 158 overflow-x: auto; 159 -webkit-overflow-scrolling: touch; 160 } 161 162 .app-bar { 163 width: calc(100% - 16px) !important; 164 } 165 166 .menu-backdrop { 167 position: fixed; 168 inset: 0; 169 z-index: calc(var(--z-bars) + 1); 170 background: rgba(0, 0, 0, 0.3); 171 opacity: 0; 172 pointer-events: none; 173 transition: opacity 0.3s ease; 174 } 175 176 .menu-backdrop.visible { 177 opacity: 1; 178 pointer-events: auto; 179 } 180} 181 182/* Facet Bar (top) */ 183.facet-bar { 184 position: fixed; 185 top: 0; 186 left: 0; 187 right: 0; 188 background: white; 189 z-index: var(--z-bars); 190 height: var(--facet-bar-height); 191 padding: 12px 16px; 192 overflow: visible; 193 white-space: nowrap; 194 display: flex; 195 align-items: center; 196 gap: 12px; 197} 198 199.facet-bar::before { 200 content: ''; 201 position: absolute; 202 top: 0; 203 left: 0; 204 right: 0; 205 bottom: 0; 206 background: var(--facet-bg, transparent); 207 transition: background-color 0.3s ease; 208 pointer-events: none; 209 z-index: -1; 210} 211 212/* Border as pseudo-element for selective positioning */ 213.facet-bar::after { 214 content: ''; 215 position: absolute; 216 bottom: 0; 217 left: var(--menu-bar-width-minimal); 218 right: 0; 219 height: 1px; 220 background: var(--facet-border, #e0e0e0); 221 transition: left 0.3s ease, background-color 0.3s ease; /* right is instant */ 222 pointer-events: none; 223} 224 225/* When sidebar open, border only where workspace is visible */ 226body.menu-full .facet-bar::after { 227 left: var(--menu-bar-width-full); 228} 229 230/* When status pane open, stop border before it */ 231body:has(.status-pane.visible) .facet-bar::after { 232 right: var(--status-pane-width); 233} 234 235.facet-bar #hamburger { 236 display: none; 237 font-size: 24px; 238 cursor: pointer; 239 padding: 8px; 240 border-radius: 4px; 241 transition: background 0.2s; 242 user-select: none; 243 flex-shrink: 0; 244} 245 246.facet-bar #hamburger:hover { 247 background: rgba(0,0,0,0.05); 248} 249 250@media (max-width: 768px) { 251 .facet-bar #hamburger { 252 display: flex; 253 } 254} 255 256.facet-bar .status-icon { 257 font-size: 20px; 258 padding: 4px; 259 flex-shrink: 0; 260 cursor: pointer; 261 border-radius: 4px; 262 transition: background 0.2s; 263 margin-left: auto; 264 position: relative; 265} 266 267.facet-bar .status-icon:hover { 268 background: rgba(0,0,0,0.05); 269} 270 271.facet-bar .status-icon.error { 272 box-shadow: 0 0 4px 2px red; 273 border-radius: 4px; 274} 275 276/* Status indicator shapes (SVG inside .status-icon button) */ 277.status-indicator { 278 display: block; 279} 280 281.status-indicator--connecting { 282 animation: status-spin 1.2s linear infinite; 283} 284 285@keyframes status-spin { 286 to { transform: rotate(360deg); } 287} 288 289/* Date Nav - hangs below facet bar */ 290.date-nav { 291 position: fixed; 292 top: var(--facet-bar-height); /* Sits directly below facet bar */ 293 left: 50%; 294 transform: translateX(-50%); 295 width: var(--date-nav-width); 296 height: var(--date-nav-height); 297 box-sizing: border-box; 298 299 /* Grid layout: [left buttons] [centered label] [right buttons] */ 300 display: grid; 301 grid-template-columns: 1fr auto 1fr; 302 align-items: center; 303 padding: 0 8px; 304 305 /* Match facet bar styling */ 306 background: white; 307 border: 1px solid var(--facet-border, #e0e0e0); 308 border-top: none; /* Seamless connection to facet bar */ 309 border-radius: 0 0 12px 12px; /* Rounded bottom only */ 310 box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05); 311 z-index: var(--z-bars); 312 313 font-size: 15px; 314 font-weight: 500; 315 color: #374151; 316 user-select: none; 317 view-transition-name: date-nav; 318} 319 320/* Facet-colored background tint (like facet bar) */ 321.date-nav::before { 322 content: ''; 323 position: absolute; 324 inset: 0; 325 background: var(--facet-bg, transparent); 326 border-radius: 0 0 12px 12px; 327 pointer-events: none; 328 z-index: -1; 329} 330 331/* Cover the facet bar's bottom border where date nav attaches */ 332.date-nav::after { 333 content: ''; 334 position: absolute; 335 top: -1px; 336 left: 1px; 337 right: 1px; 338 height: 2px; 339 background: white; 340 /* Layer the facet tint on top */ 341 background: linear-gradient(var(--facet-bg, transparent), var(--facet-bg, transparent)), white; 342} 343 344.date-nav-arrow { 345 background: none; 346 border: none; 347 min-width: 44px; 348 min-height: 44px; 349 display: inline-flex; 350 align-items: center; 351 justify-content: center; 352 cursor: pointer; 353 font-size: 18px; 354 font-weight: 600; 355 color: #6b7280; 356 border-radius: 4px; 357 transition: background 0.15s, color 0.15s; 358} 359 360.date-nav-arrow:hover { 361 background: rgba(0, 0, 0, 0.05); 362 color: #111827; 363} 364 365/* Button groups for grid layout symmetry */ 366.date-nav-left { 367 display: flex; 368 justify-content: flex-start; 369} 370 371.date-nav-right { 372 display: flex; 373 justify-content: flex-end; 374} 375 376/* Today button - always visible, de-emphasized when viewing today */ 377.date-nav-today { 378 background: none; 379 border: none; 380 padding: 4px 12px; 381 cursor: pointer; 382 font-size: 14px; 383 font-weight: 500; 384 color: #9ca3af; 385 border-radius: 4px; 386 transition: background 0.15s, color 0.15s, font-weight 0.15s; 387} 388 389.date-nav-today:hover { 390 background: rgba(0, 0, 0, 0.05); 391 color: #111827; 392} 393 394.date-nav-today:focus-visible { 395 outline: 2px solid #b06a1a; 396 outline-offset: 2px; 397 background: rgba(0, 0, 0, 0.05); 398 color: #111827; 399} 400 401/* Prominent state when viewing a different day */ 402.date-nav-today.is-other-day { 403 color: #111827; 404 background: rgba(0, 0, 0, 0.05); 405 font-weight: 600; 406} 407 408.date-nav-today.is-other-day:hover { 409 background: rgba(0, 0, 0, 0.08); 410} 411 412.date-nav-label { 413 text-align: center; 414 color: inherit; 415 text-decoration: none; 416 padding: 6px 8px; 417 border-radius: 4px; 418 cursor: pointer; 419 transition: background 0.15s; 420} 421 422.date-nav-label:hover { 423 background: rgba(0, 0, 0, 0.05); 424} 425 426/* Keep date-nav stable during view transitions */ 427::view-transition-old(date-nav), 428::view-transition-new(date-nav) { 429 animation: none; 430} 431 432/* When picker is open, remove bottom border radius for seamless connection */ 433.date-nav.picker-open { 434 border-radius: 0; 435 box-shadow: none; 436} 437 438.date-nav.picker-open::before { 439 border-radius: 0; 440} 441 442/* Date nav mobile */ 443@media (max-width: 480px) { 444 :root { 445 --date-nav-width: 100%; 446 } 447 .date-nav { 448 left: 0; 449 transform: none; 450 border-radius: 0; 451 border-left: none; 452 border-right: none; 453 } 454} 455 456/* Month Picker Dropdown */ 457.month-picker { 458 position: absolute; 459 top: 100%; 460 left: -1px; /* Align with parent's outer border */ 461 right: -1px; /* Align with parent's outer border */ 462 background: white; 463 border: 1px solid var(--facet-border, #e0e0e0); 464 border-top: none; 465 border-radius: 0 0 12px 12px; 466 box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); 467 overflow: hidden; 468 z-index: 1; 469 470 /* Closed state */ 471 max-height: 0; 472 opacity: 0; 473 pointer-events: none; 474 transition: max-height 0.2s ease, opacity 0.15s ease; 475} 476 477/* Facet tint background */ 478.month-picker::before { 479 content: ''; 480 position: absolute; 481 inset: 0; 482 background: var(--facet-bg, transparent); 483 border-radius: 0 0 12px 12px; 484 pointer-events: none; 485 z-index: -1; 486} 487 488.month-picker.open { 489 max-height: 280px; 490 opacity: 1; 491 pointer-events: auto; 492} 493 494.mp-weekdays { 495 display: grid; 496 grid-template-columns: repeat(7, 1fr); 497 padding: 8px 8px 4px; 498 font-size: 11px; 499 font-weight: 600; 500 color: #9ca3af; 501 text-align: center; 502} 503 504.mp-grid { 505 display: grid; 506 grid-template-columns: repeat(7, 1fr); 507 gap: 3px; 508 padding: 4px 8px 8px; 509} 510 511.mp-day { 512 aspect-ratio: 1; 513 display: flex; 514 align-items: center; 515 justify-content: center; 516 font-size: 13px; 517 border-radius: 6px; 518 cursor: pointer; 519 transition: background 0.1s; 520 521 /* Heat map: intensity controls facet color opacity */ 522 background: color-mix(in srgb, var(--facet-color) calc(var(--intensity, 0) * 30%), transparent); 523} 524 525.mp-day:hover:not(.mp-other):not(.mp-empty):not(.mp-future) { 526 background: color-mix(in srgb, var(--facet-color) 40%, transparent); 527} 528 529/* Empty days - striped pattern, not clickable */ 530.mp-day.mp-empty { 531 background: 532 repeating-linear-gradient(45deg, transparent, transparent 3px, rgba(0,0,0,0.07) 3px, rgba(0,0,0,0.07) 6px), 533 color-mix(in srgb, var(--facet-color) calc(var(--intensity, 0) * 30%), transparent); 534 color: #999; 535 cursor: default; 536} 537 538/* Future days without data - clickable but muted appearance */ 539.mp-day.mp-future { 540 color: #999; 541} 542 543.mp-day.mp-future:hover { 544 background: color-mix(in srgb, var(--facet-color) 20%, transparent); 545} 546 547/* Other month days (leading/trailing) - same striped pattern */ 548.mp-day.mp-other { 549 background: repeating-linear-gradient(45deg, transparent, transparent 3px, rgba(0,0,0,0.07) 3px, rgba(0,0,0,0.07) 6px); 550 cursor: default; 551} 552 553/* Today indicator */ 554.mp-day.mp-today { 555 box-shadow: inset 0 0 0 2px #b06a1a; 556} 557 558/* Selected day */ 559.mp-day.mp-selected { 560 background: var(--facet-color, #b06a1a); 561 color: white; 562 font-weight: 600; 563} 564 565.mp-day.mp-selected:hover { 566 background: var(--facet-color, #b06a1a); 567} 568 569/* ARIA row wrappers - invisible to CSS grid */ 570.mp-grid [role="row"] { display: contents; } 571 572/* Focus indicator for keyboard navigation */ 573.mp-day:focus-visible { 574 outline: 2px solid var(--facet-color, #b06a1a); 575 outline-offset: -2px; 576} 577 578/* Month picker responsive */ 579@media (max-width: 768px) { 580 .month-picker.open { 581 width: 100%; 582 max-width: 350px; 583 } 584} 585 586@media (max-width: 480px) { 587 .month-picker.open { 588 width: 100%; 589 max-width: none; 590 left: 0; 591 right: 0; 592 } 593 .mp-day { 594 min-height: 44px; 595 min-width: 44px; 596 font-size: 14px; 597 } 598 .mp-grid { 599 gap: 2px; 600 padding: 4px; 601 } 602} 603 604/* Status Pane - slides down from facet bar on right (mirrors menu bar on left) */ 605.status-pane { 606 position: fixed; 607 top: var(--facet-bar-height); 608 right: 0; 609 width: var(--status-pane-width); 610 background: white; 611 border-left: 1px solid var(--facet-border, #e0e0e0); 612 border-bottom: 1px solid var(--facet-border, #e0e0e0); 613 border-radius: 0 0 0 12px; /* Only bottom-left rounded */ 614 /* Shadow only on left and bottom - offset down to avoid top bleed */ 615 box-shadow: -4px 4px 8px -2px rgba(0, 0, 0, 0.1); 616 z-index: var(--z-bars); 617 overflow: hidden; /* Clip content during animation */ 618 619 /* Slide animation */ 620 max-height: 0; 621 opacity: 0; 622 transition: max-height 0.3s ease, opacity 0.2s ease; 623} 624 625.status-pane.visible { 626 max-height: 400px; 627 opacity: 1; 628} 629 630/* Facet-colored background tint */ 631.status-pane::before { 632 content: ''; 633 position: absolute; 634 inset: 0; 635 background: var(--facet-bg, transparent); 636 border-radius: 0 0 0 12px; 637 pointer-events: none; 638 z-index: -1; 639} 640 641.status-pane-content { 642 padding: 16px; 643 max-height: 380px; 644 overflow-y: auto; 645} 646 647.status-pane-content h3 { 648 margin: 0 0 12px 0; 649 font-size: 16px; 650 font-weight: 600; 651 color: #333; 652} 653 654.status-pane-content p { 655 margin: 0; 656 font-size: 14px; 657 color: #666; 658} 659 660.facet-bar .facet-pills-container { 661 flex: 1; 662 display: flex; 663 align-items: center; 664 justify-content: center; 665 overflow: hidden; 666 padding-top: 4px; 667 padding-bottom: 4px; 668 min-width: 0; /* Allow container to shrink below content size */ 669} 670 671/* Menu Bar (left sidebar) */ 672.menu-bar { 673 position: fixed; 674 top: var(--facet-bar-height); 675 left: 0; 676 width: var(--menu-bar-width-minimal); 677 max-height: calc(100vh - var(--facet-bar-height)); 678 background: white; 679 border-right: none; /* No border on container - items have their own borders */ 680 z-index: calc(var(--z-bars) + 1); /* Above app bar */ 681 transition: width 0.3s ease, background 0.3s ease, box-shadow 0.3s ease, border-radius 0.3s ease; 682 overflow: hidden; /* Clip all content to rounded corner */ 683 border-bottom-right-radius: 12px; 684 display: flex; 685 flex-direction: column; 686} 687 688/* Scrollable container for menu items */ 689.menu-bar .menu-items { 690 overflow-y: auto; 691 overflow-x: hidden; 692 scrollbar-width: none; /* Firefox */ 693} 694 695ul.menu-items { 696 list-style: none; 697 margin: 0; 698 padding: 0; 699} 700 701.menu-bar .menu-items::-webkit-scrollbar { 702 display: none; /* Chrome, Safari, Edge */ 703} 704 705/* Scroll overflow shadows on .menu-items */ 706.menu-bar .menu-items::before, 707.menu-bar .menu-items::after { 708 content: ''; 709 display: block; 710 position: sticky; 711 left: 0; 712 right: 0; 713 height: 28px; 714 pointer-events: none; 715 z-index: 1; 716 opacity: 0; 717 transition: opacity 0.2s ease; 718} 719 720.menu-bar .menu-items::before { 721 top: 0; 722 margin-bottom: -28px; 723 background: linear-gradient(to bottom, rgba(0,0,0,0.06), transparent); 724} 725 726.menu-bar .menu-items::after { 727 bottom: 0; 728 margin-top: -28px; 729 background: linear-gradient(to top, rgba(0,0,0,0.06), transparent); 730} 731 732.menu-bar .menu-items.scroll-shadow-top::before { 733 opacity: 1; 734} 735 736.menu-bar .menu-items.scroll-shadow-bottom::after { 737 opacity: 1; 738} 739 740body.menu-full .menu-bar { 741 width: var(--menu-bar-width-full); 742 background: linear-gradient(var(--facet-bg, transparent), var(--facet-bg, transparent)), white; 743 border-right: 1px solid var(--facet-border, #e0e0e0); 744 box-shadow: 2px 0 8px rgba(0, 0, 0, 0.1); 745 border-bottom-right-radius: 0; /* Remove rounded corner when expanded */ 746} 747 748.menu-bar .menu-item { 749 padding: 8px 0; 750 display: flex; 751 align-items: center; 752 cursor: pointer; 753 transition: background 0.2s, transform 0.3s ease, max-height 0.3s ease, opacity 0.3s ease, padding 0.3s ease, border-radius 0.3s ease; 754 border-bottom: none; 755 border-left: 3px solid transparent; 756 border-right: 1px solid var(--facet-border, #e0e0e0); /* Always present - extends naturally with item animation */ 757 color: inherit; 758 white-space: nowrap; 759 position: relative; 760 overflow: hidden; 761 flex-shrink: 0; /* Don't compress - let container scroll instead */ 762} 763 764.menu-bar .menu-item-link { 765 display: flex; 766 align-items: center; 767 text-decoration: none; 768 color: inherit; 769 flex: 1; 770 min-width: 0; 771} 772 773 774/* Hide unstarred apps in menu-minimal state */ 775.menu-bar .menu-item[data-starred="false"] { 776 max-height: 0; 777 opacity: 0; 778 padding-top: 0; 779 padding-bottom: 0; 780 pointer-events: none; 781} 782 783/* Always show current app, even if unstarred in menu-minimal state */ 784.menu-bar .menu-item[data-starred="false"].current { 785 max-height: 50px; 786 opacity: 1; 787 padding-top: 8px; 788 padding-bottom: 8px; 789 pointer-events: auto; 790} 791 792/* Show all apps when menu-full */ 793body.menu-full .menu-bar .menu-item[data-starred="false"] { 794 max-height: 50px; 795 opacity: 1; 796 padding-top: 8px; 797 padding-bottom: 8px; 798 pointer-events: auto; 799} 800 801body.menu-full .menu-bar .menu-item.dragging { 802 opacity: 0.5; 803 cursor: grabbing; 804} 805 806.menu-bar .menu-item.drag-over { 807 border-top: 2px solid var(--facet-color); 808} 809 810/* Keyboard reorder visual feedback */ 811body.menu-full .menu-bar .menu-item.reordering { 812 outline: 2px dashed var(--facet-color, #b06a1a); 813 outline-offset: -2px; 814 background: color-mix(in srgb, var(--facet-color, #b06a1a) 8%, transparent); 815} 816 817/* Apply facet background to menu items in menu-minimal state */ 818body:not(.menu-full) .menu-bar .menu-item { 819 background: var(--facet-bg, white); 820} 821 822/* Hover state for menu items */ 823.menu-bar .menu-item:hover { 824 background: rgba(0, 0, 0, 0.05); 825} 826 827/* Active app state - stronger background + accent bar */ 828.menu-bar .menu-item.current { 829 background: rgba(0, 0, 0, 0.08); 830 border-left-color: var(--facet-color); 831} 832 833/* In menu-minimal state, layer hover tint over facet background */ 834body:not(.menu-full) .menu-bar .menu-item:hover { 835 background: 836 linear-gradient(rgba(0, 0, 0, 0.05), rgba(0, 0, 0, 0.05)), 837 var(--facet-bg, white); 838} 839 840/* In menu-minimal state, active app with stronger tint + accent bar */ 841body:not(.menu-full) .menu-bar .menu-item.current { 842 background: 843 linear-gradient(rgba(0, 0, 0, 0.08), rgba(0, 0, 0, 0.08)), 844 var(--facet-bg, white); 845 border-left-color: var(--facet-color); 846} 847 848.menu-bar .menu-item .icon { 849 font-size: 20px; 850 width: var(--menu-bar-width-minimal); 851 text-align: center; 852 flex-shrink: 0; 853} 854 855.menu-bar .menu-item .label { 856 font-size: 14px; 857 padding-right: 4px; 858 flex: 1; 859} 860 861.menu-bar .menu-item .star-toggle { 862 display: none; 863 background: none; 864 border: none; 865 font: inherit; 866 font-size: 16px; 867 min-width: 44px; 868 min-height: 44px; 869 align-items: center; 870 justify-content: center; 871 padding: 0; 872 color: inherit; 873 cursor: pointer; 874 opacity: 0; 875 transition: opacity 0.2s; 876 flex-shrink: 0; 877 user-select: none; 878} 879 880body.menu-full .menu-bar .menu-item .star-toggle { 881 display: inline-flex; 882} 883 884/* Show star on hover or when starred */ 885body.menu-full .menu-bar .menu-item:hover .star-toggle, 886.menu-bar .menu-item[data-starred="true"] .star-toggle { 887 opacity: 1; 888} 889 890.menu-bar .menu-item .star-toggle:focus-visible { 891 opacity: 1; 892} 893 894.menu-bar .menu-item[data-starred="true"] .star-toggle { 895 color: #f59e0b; 896} 897 898/* Drag handle */ 899.menu-bar .menu-item .drag-handle { 900 display: none; 901 background: none; 902 border: none; 903 font: inherit; 904 font-size: 20px; 905 min-width: 44px; 906 min-height: 44px; 907 align-items: center; 908 justify-content: center; 909 padding: 0; 910 cursor: grab; 911 opacity: 0; 912 transition: opacity 0.2s; 913 flex-shrink: 0; 914 user-select: none; 915 color: #999; 916} 917 918body.menu-full .menu-bar .menu-item .drag-handle { 919 display: inline-flex; 920} 921 922body.menu-full .menu-bar .menu-item:hover .drag-handle { 923 opacity: 1; 924} 925 926body.menu-full .menu-bar .menu-item .drag-handle:active { 927 cursor: grabbing; 928} 929 930/* Visual separator after last starred app */ 931.menu-bar .menu-item.last-starred { 932 border-bottom: 1px solid var(--facet-border, #e0e0e0); 933 padding-bottom: 12px; 934 margin-bottom: 8px; 935} 936 937/* Menu Submenus - hover pop-outs for app quick-links */ 938.menu-submenu { 939 position: fixed; 940 min-width: 160px; 941 background: white; 942 border: 1px solid var(--facet-border, #e0e0e0); 943 border-radius: 8px; 944 box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); 945 padding: 4px 0; 946 opacity: 0; 947 pointer-events: none; 948 transform: translateX(-8px); 949 transition: opacity 0.15s ease, transform 0.15s ease; 950 z-index: calc(var(--z-bars) + 10); 951} 952 953/* Show when visible class is added via JS */ 954.menu-submenu.visible { 955 opacity: 1; 956 pointer-events: auto; 957 transform: translateX(0); 958} 959 960.menu-submenu-item { 961 display: flex; 962 align-items: center; 963 padding: 8px 12px; 964 text-decoration: none; 965 color: inherit; 966 font-size: 13px; 967 transition: background 0.15s ease; 968 gap: 8px; 969 white-space: nowrap; 970} 971 972.menu-submenu-item:hover { 973 background: rgba(0, 0, 0, 0.05); 974} 975 976.menu-submenu-item:first-child { 977 border-radius: 7px 7px 0 0; 978} 979 980.menu-submenu-item:last-child { 981 border-radius: 0 0 7px 7px; 982} 983 984.menu-submenu-item:only-child { 985 border-radius: 7px; 986} 987 988.submenu-icon { 989 font-size: 14px; 990 width: 20px; 991 text-align: center; 992 flex-shrink: 0; 993} 994 995.submenu-label { 996 flex: 1; 997} 998 999.submenu-badge { 1000 background: var(--facet-color, #b06a1a); 1001 color: white; 1002 font-size: 10px; 1003 font-weight: 600; 1004 padding: 2px 6px; 1005 border-radius: 8px; 1006 min-width: 18px; 1007 text-align: center; 1008 line-height: 1.2; 1009} 1010 1011/* Menu bar icon badges */ 1012.menu-bar .menu-item .icon { 1013 position: relative; 1014} 1015 1016.menu-badge { 1017 position: absolute; 1018 bottom: -2px; 1019 right: 4px; 1020 min-width: 15px; 1021 height: 15px; 1022 font-size: 9px; 1023 font-weight: 600; 1024 background: #ef4444; 1025 color: white; 1026 border-radius: 7px; 1027 display: flex; 1028 align-items: center; 1029 justify-content: center; 1030 padding: 0 3px; 1031 line-height: 1; 1032} 1033 1034/* Menu expander (down arrow below last visible app icon) */ 1035.menu-bar .menu-expander { 1036 min-width: 44px; 1037 min-height: 44px; 1038 display: flex; 1039 align-items: center; 1040 justify-content: center; 1041 font: inherit; 1042 font-size: 16px; 1043 cursor: pointer; 1044 color: inherit; 1045 border: none; 1046 border-bottom: 1px solid var(--facet-border, #e0e0e0); 1047 border-right: 1px solid var(--facet-border, #e0e0e0); 1048 background: var(--facet-bg, white); 1049 transition: background 0.2s; 1050 user-select: none; 1051 position: relative; 1052 border-bottom-right-radius: 12px; 1053 flex-shrink: 0; /* Never shrink - always visible at bottom */ 1054} 1055 1056 1057.menu-bar .menu-expander:hover { 1058 background: rgba(0,0,0,0.05); 1059} 1060 1061/* Hide only when sidebar is menu-full (keep visible during menu-all) */ 1062body.menu-full .menu-bar .menu-expander { 1063 display: none; 1064} 1065 1066/* Show all apps in menu-all state (icons only, narrow width) */ 1067body.menu-all .menu-bar .menu-item[data-starred="false"] { 1068 max-height: 50px; 1069 opacity: 1; 1070 padding-top: 8px; 1071 padding-bottom: 8px; 1072 pointer-events: auto; 1073} 1074 1075/* Keep sidebar narrow in menu-all state (icons only) */ 1076body.menu-all .menu-bar { 1077 width: var(--menu-bar-width-minimal); 1078} 1079 1080.facet-pill { 1081 appearance: none; 1082 font-family: inherit; 1083 color: inherit; 1084 line-height: inherit; 1085 display: flex; 1086 align-items: center; 1087 padding: 8px 16px; 1088 margin-right: 8px; 1089 border-radius: 20px; 1090 background: #f5f5f5; 1091 border: 1px solid #ddd; 1092 cursor: grab; 1093 font-size: 14px; 1094 transition: transform 0.2s ease, opacity 0.2s ease, box-shadow 0.2s ease, border-color 0.2s ease, background 0.2s ease, color 0.2s ease; 1095 user-select: none; 1096 position: relative; 1097 min-width: 0; /* Allow pill to shrink below content size */ 1098 flex-shrink: 1; /* Allow shrinking when space is tight */ 1099} 1100 1101.facet-pill .label { 1102 overflow: hidden; 1103 text-overflow: ellipsis; 1104 white-space: nowrap; 1105 min-width: 0; /* Can shrink to zero width */ 1106 flex-shrink: 1; 1107 user-select: none; 1108 pointer-events: none; 1109} 1110 1111/* Dim unselected pills when a facet is selected */ 1112.facet-pill:not(.selected) { 1113 opacity: 0.85; 1114} 1115 1116.facet-pills-container:not(:has(.selected)) .facet-pill { 1117 opacity: 1; 1118} 1119 1120/* "all" label - muted caption before first pill in all-mode */ 1121.facet-all-label { 1122 font-size: 12px; 1123 color: #999; 1124 padding: 0 8px 0 4px; 1125 pointer-events: none; 1126 user-select: none; 1127 white-space: nowrap; 1128} 1129 1130/* Hide "all" label when a facet is selected (CSS backup for JS toggle) */ 1131.facet-pills-container:has(.selected) .facet-all-label { 1132 display: none; 1133} 1134 1135/* Empty state: no facets configured */ 1136.facet-empty-state { 1137 font-size: 12px; 1138 color: #999; 1139 white-space: nowrap; 1140 user-select: none; 1141 padding: 0 4px; 1142} 1143 1144.facet-empty-create { 1145 background: none; 1146 border: none; 1147 color: #777; 1148 cursor: pointer; 1149 text-decoration: underline; 1150 font-size: inherit; 1151 font-family: inherit; 1152 padding: 0; 1153} 1154 1155.facet-empty-create:hover { 1156 color: #555; 1157} 1158 1159.facet-pill:hover { 1160 opacity: 1; 1161 border-color: var(--pill-color, #999); 1162 transform: translateY(-1px); 1163 box-shadow: 0 2px 4px rgba(0,0,0,0.1); 1164 background: var(--pill-bg, #f5f5f5); 1165} 1166 1167.facet-pill.selected { 1168 opacity: 1; 1169 background: var(--pill-color); 1170 color: white; 1171 border-color: var(--pill-color); 1172 font-weight: 600; 1173} 1174 1175.facet-pill .emoji-container { 1176 position: relative; 1177 font-size: 24px; 1178 line-height: 1; 1179 margin-right: 8px; 1180 display: flex; 1181 align-items: center; 1182 user-select: none; 1183 pointer-events: none; 1184 flex-shrink: 0; /* Never shrink the emoji */ 1185} 1186 1187.facet-pill .emoji { 1188 display: block; 1189 user-select: none; 1190 pointer-events: none; 1191} 1192 1193.facet-pill .facet-badge { 1194 position: absolute; 1195 bottom: -2px; 1196 right: -2px; 1197 min-width: 15px; 1198 height: 15px; 1199 font-size: 9px; 1200 font-weight: 600; 1201 background: #ef4444; 1202 color: white; 1203 border-radius: 7px; 1204 display: flex; 1205 align-items: center; 1206 justify-content: center; 1207 padding: 0 3px; 1208 line-height: 1; 1209 user-select: none; 1210 pointer-events: none; 1211} 1212 1213.status-icon .quiet-notif-badge { 1214 position: absolute; 1215 bottom: 0; 1216 right: 0; 1217 min-width: 16px; 1218 height: 16px; 1219 border-radius: 8px; 1220 padding: 0 3px; 1221 font-size: 10px; 1222 font-weight: 700; 1223 background: #ef4444; 1224 color: white; 1225 display: flex; 1226 align-items: center; 1227 justify-content: center; 1228 pointer-events: none; 1229 user-select: none; 1230} 1231 1232/* Drag-and-drop states */ 1233.facet-pill:active { 1234 cursor: grabbing; 1235} 1236 1237.facet-pill.dragging { 1238 opacity: 0.5; 1239 cursor: grabbing; 1240 transform: scale(1.05) rotate(2deg); 1241 box-shadow: 0 6px 16px rgba(0,0,0,0.2); 1242 z-index: calc(var(--z-bars) + 1); /* Above bars, below modals */ 1243 transition: none; /* Disable transitions while dragging */ 1244} 1245 1246.facet-pill.drag-over { 1247 /* Subtle indicator only - actual reordering happens via DOM manipulation */ 1248 transform: scale(0.95); 1249} 1250 1251/* Apps without facet support - all pills identical, no selection */ 1252.facet-bar.facets-disabled .facet-pill { 1253 pointer-events: none; 1254 cursor: default; 1255 opacity: 0.5; 1256} 1257 1258/* App Bar (bottom) */ 1259.app-bar { 1260 position: fixed; 1261 bottom: 12px; 1262 left: 50%; 1263 transform: translateX(-50%); 1264 width: 80%; 1265 z-index: var(--z-bars); 1266 min-height: var(--app-bar-height); 1267 padding: 0; 1268 display: flex; 1269 flex-direction: column; 1270 border-radius: 12px; 1271 border: 1px solid var(--facet-border, #e0e0e0); 1272 box-shadow: 0 4px 16px rgba(0, 0, 0, 0.12), 0 -2px 8px rgba(0, 0, 0, 0.06); 1273} 1274 1275.app-bar::before { 1276 content: ''; 1277 position: absolute; 1278 top: 0; 1279 left: 0; 1280 right: 0; 1281 bottom: 0; 1282 background: white; 1283 pointer-events: none; 1284 z-index: -2; 1285 border-radius: 12px; 1286} 1287 1288.app-bar::after { 1289 content: ''; 1290 position: absolute; 1291 top: 0; 1292 left: 0; 1293 right: 0; 1294 bottom: 0; 1295 background: var(--facet-bg, transparent); 1296 transition: background-color 0.3s ease; 1297 pointer-events: none; 1298 z-index: -1; 1299 border-radius: 12px; 1300} 1301 1302/* Response panel (above input row) */ 1303.chat-bar-response-panel { 1304 max-height: 0; 1305 overflow: hidden; 1306 padding: 0 16px; 1307 position: relative; 1308 z-index: 1; 1309 transition: max-height 0.2s ease, padding 0.2s ease; 1310} 1311 1312.app-bar--glance .chat-bar-response-panel { 1313 max-height: 200px; 1314 padding: 12px 16px 0; 1315} 1316 1317.chat-bar-separator { 1318 height: 1px; 1319 background: var(--facet-border, #e0e0e0); 1320 margin: 12px -16px 0; 1321} 1322 1323.chat-bar-dismiss { 1324 position: absolute; 1325 top: 8px; 1326 right: 8px; 1327 min-width: 44px; 1328 min-height: 44px; 1329 border: none; 1330 background: transparent; 1331 color: #999; 1332 font-size: 14px; 1333 cursor: pointer; 1334 border-radius: 4px; 1335 display: flex; 1336 align-items: center; 1337 justify-content: center; 1338 z-index: 2; 1339} 1340 1341.chat-bar-dismiss:hover { 1342 background: rgba(0, 0, 0, 0.06); 1343 color: #666; 1344} 1345 1346/* Input row */ 1347.chat-bar-input-row { 1348 display: flex; 1349 flex-direction: row; 1350 align-items: center; 1351 gap: 12px; 1352 padding: 0 16px; 1353 min-height: var(--app-bar-height); 1354} 1355 1356/* Chat Bar Elements */ 1357.chat-bar-input { 1358 flex: 1; 1359 resize: none; 1360 border: 1px solid #ddd; 1361 border-radius: 20px; 1362 padding: 0.75em 1em; 1363 font-family: inherit; 1364 font-size: 14px; 1365 line-height: 1.5; 1366 max-height: 120px; 1367 min-height: 42px; 1368 background: transparent; 1369 position: relative; 1370 z-index: 1; 1371} 1372 1373.chat-bar-input:focus { 1374 outline: none; 1375 border-color: var(--facet-color, #b06a1a); 1376} 1377 1378.chat-bar-input::placeholder { 1379 color: #999; 1380} 1381 1382.chat-bar-send { 1383 width: 44px; 1384 height: 44px; 1385 border-radius: 50%; 1386 border: none; 1387 background: var(--facet-color, #b06a1a); 1388 color: white; 1389 cursor: pointer; 1390 display: flex; 1391 align-items: center; 1392 justify-content: center; 1393 position: relative; 1394 z-index: 1; 1395 flex-shrink: 0; 1396} 1397 1398.chat-bar-send:hover { 1399 opacity: 0.85; 1400} 1401 1402@media (max-width: 768px) { 1403 .chat-bar-send { 1404 width: 48px; 1405 height: 48px; 1406 } 1407} 1408 1409.chat-bar-thinking { 1410 display: flex; 1411 align-items: center; 1412 gap: 0.5em; 1413 color: #999; 1414 font-size: 13px; 1415 position: relative; 1416 z-index: 1; 1417 overflow: hidden; 1418 text-overflow: ellipsis; 1419 white-space: nowrap; 1420 min-width: 0; 1421} 1422 1423.chat-bar-thinking > [aria-hidden="true"] { 1424 overflow: hidden; 1425 text-overflow: ellipsis; 1426 min-width: 0; 1427} 1428 1429.chat-bar-thinking-dot { 1430 width: 8px; 1431 height: 8px; 1432 background: var(--facet-color, #b06a1a); 1433 border-radius: 50%; 1434 animation: chat-bar-pulse 1s ease-in-out infinite; 1435} 1436 1437@keyframes chat-bar-pulse { 1438 0%, 100% { opacity: 0.3; } 1439 50% { opacity: 1; } 1440} 1441 1442.thinking-elapsed { 1443 opacity: 0.5; 1444 font-variant-numeric: tabular-nums; 1445} 1446 1447.chat-bar-response { 1448 font-size: 13px; 1449 line-height: 1.5; 1450 color: #666; 1451 max-height: 5em; 1452 overflow: hidden; 1453 padding-right: 28px; 1454 position: relative; 1455 z-index: 1; 1456} 1457 1458.chat-bar-response--error { 1459 color: #d97706; 1460} 1461 1462/* ======================================== 1463 * Conversation Panel 1464 * Expandable focus-mode conversation surface. 1465 * The chat bar expands upward to 80% viewport. 1466 * Backdrop blur excludes aruco corner-tags via z-index layering: 1467 * backdrop at z-bars+49 < corner-tags at z-tags (400). 1468 * ======================================== */ 1469 1470/* Backdrop — blurs convey content when panel is open */ 1471.conversation-backdrop { 1472 position: fixed; 1473 inset: 0; 1474 z-index: calc(var(--z-bars) + 49); 1475 backdrop-filter: blur(8px); 1476 -webkit-backdrop-filter: blur(8px); 1477 background: rgba(0, 0, 0, 0.08); 1478 opacity: 0; 1479 pointer-events: none; 1480 transition: opacity 0.3s ease; 1481} 1482 1483.conversation-backdrop.visible { 1484 opacity: 1; 1485 pointer-events: auto; 1486} 1487 1488/* Panel expanded state */ 1489.app-bar.app-bar--focused { 1490 height: 80vh; /* fallback for browsers without dvh */ 1491 height: 80dvh; 1492 bottom: 0; 1493 border-radius: 12px 12px 0 0; 1494 z-index: calc(var(--z-bars) + 50); 1495 animation: panel-expand 0.3s cubic-bezier(0.4, 0, 0.2, 1); 1496} 1497 1498/* Panel closing animation */ 1499.app-bar.app-bar--dismissing { 1500 z-index: calc(var(--z-bars) + 50); 1501 animation: panel-collapse 0.25s ease forwards; 1502} 1503 1504@keyframes panel-expand { 1505 from { 1506 height: var(--app-bar-height); 1507 bottom: 12px; 1508 border-radius: 12px; 1509 } 1510} 1511 1512@keyframes panel-collapse { 1513 from { 1514 height: 80vh; 1515 height: 80dvh; 1516 bottom: 0; 1517 border-radius: 12px 12px 0 0; 1518 } 1519 to { 1520 height: var(--app-bar-height); 1521 bottom: 12px; 1522 border-radius: 12px; 1523 } 1524} 1525 1526@media (max-width: 768px) { 1527 .app-bar.app-bar--focused { 1528 width: calc(100% - 16px); 1529 } 1530} 1531 1532/* Conversation messages area */ 1533.conversation-messages { 1534 display: none; 1535 flex-direction: column; 1536 gap: 16px; 1537 overflow-y: auto; 1538 padding: 16px; 1539 flex: 1; 1540 min-height: 0; 1541 background: #fffcf9; 1542 scrollbar-width: thin; 1543 scrollbar-color: rgba(0, 0, 0, 0.15) transparent; 1544} 1545 1546.conversation-messages::-webkit-scrollbar { 1547 width: 6px; 1548} 1549 1550.conversation-messages::-webkit-scrollbar-thumb { 1551 background: rgba(0, 0, 0, 0.15); 1552 border-radius: 3px; 1553} 1554 1555.app-bar.app-bar--focused .conversation-messages { 1556 display: flex; 1557} 1558 1559/* Hide inline response panel in panel mode */ 1560.app-bar.app-bar--focused .chat-bar-response-panel { 1561 display: none; 1562} 1563 1564/* Separator between messages and input (panel mode only) */ 1565.conversation-separator { 1566 display: none; 1567} 1568 1569.app-bar.app-bar--focused .conversation-separator { 1570 display: block; 1571 height: 1px; 1572 background: var(--facet-border, #e0e0e0); 1573 flex-shrink: 0; 1574} 1575 1576/* Message bubbles */ 1577.conversation-message { 1578 max-width: 85%; 1579 padding: 10px 14px; 1580 border-radius: 16px; 1581 font-size: 14px; 1582 line-height: 1.5; 1583 word-wrap: break-word; 1584 white-space: pre-wrap; 1585} 1586 1587.conversation-message.user { 1588 align-self: flex-end; 1589 background: var(--facet-color, #b06a1a); 1590 color: white; 1591 border-bottom-right-radius: 4px; 1592} 1593 1594.conversation-message.agent { 1595 align-self: flex-start; 1596 background: #f5f0eb; 1597 color: #1f2937; 1598 border-bottom-left-radius: 4px; 1599 white-space: normal; 1600 word-break: break-word; 1601 overflow-wrap: break-word; 1602} 1603 1604.conversation-message.agent p { 1605 margin: 0 0 0.5em 0; 1606} 1607 1608.conversation-message.agent p:last-child { 1609 margin-bottom: 0; 1610} 1611 1612.conversation-message.agent ul, 1613.conversation-message.agent ol { 1614 margin: 0.25em 0 0.5em 0; 1615 padding-left: 1.5em; 1616} 1617 1618.conversation-message.agent li { 1619 margin-bottom: 0.2em; 1620} 1621 1622.conversation-message.agent code { 1623 background: rgba(0, 0, 0, 0.06); 1624 padding: 0.15em 0.35em; 1625 border-radius: 4px; 1626 font-size: 0.9em; 1627 font-family: 'SF Mono', 'Fira Code', 'Fira Mono', 'Roboto Mono', monospace; 1628} 1629 1630.conversation-message.agent pre { 1631 background: rgba(0, 0, 0, 0.06); 1632 padding: 0.6em 0.8em; 1633 border-radius: 6px; 1634 overflow-x: auto; 1635 margin: 0.4em 0; 1636} 1637 1638.conversation-message.agent pre code { 1639 background: none; 1640 padding: 0; 1641 border-radius: 0; 1642 font-size: 0.85em; 1643 white-space: pre; 1644} 1645 1646.conversation-message.agent blockquote { 1647 border-left: 3px solid rgba(0, 0, 0, 0.15); 1648 margin: 0.4em 0; 1649 padding: 0.2em 0 0.2em 0.8em; 1650 color: #4b5563; 1651} 1652 1653.conversation-message.agent h1, 1654.conversation-message.agent h2, 1655.conversation-message.agent h3, 1656.conversation-message.agent h4, 1657.conversation-message.agent h5, 1658.conversation-message.agent h6 { 1659 margin: 0.6em 0 0.3em 0; 1660 font-weight: 600; 1661 line-height: 1.3; 1662} 1663 1664.conversation-message.agent h1 { font-size: 1.2em; } 1665.conversation-message.agent h2 { font-size: 1.1em; } 1666.conversation-message.agent h3 { font-size: 1.05em; } 1667 1668.conversation-message.agent a { 1669 color: #b06a1a; 1670 text-decoration: underline; 1671 text-decoration-color: rgba(176, 106, 26, 0.3); 1672} 1673 1674.conversation-message.agent a:hover { 1675 text-decoration-color: rgba(176, 106, 26, 0.7); 1676} 1677 1678.conversation-message.agent hr { 1679 border: none; 1680 border-top: 1px solid rgba(0, 0, 0, 0.1); 1681 margin: 0.5em 0; 1682} 1683 1684.conversation-message.agent.thinking { 1685 display: flex; 1686 align-items: center; 1687 gap: 0.5em; 1688 color: #999; 1689 font-size: 13px; 1690 background: #f5f0eb; 1691} 1692 1693.conversation-message.error { 1694 align-self: flex-start; 1695 background: rgba(217, 119, 6, 0.06); 1696 color: #1f2937; 1697 border-left: 4px solid #d97706; 1698 border-bottom-left-radius: 4px; 1699} 1700 1701.conversation-message.error::before { 1702 content: '\26A0\FE0F '; 1703 color: #d97706; 1704} 1705 1706/* Error log display */ 1707#error-log { 1708 display: none; 1709 position: fixed; 1710 bottom: 0; 1711 left: 0; 1712 right: 0; 1713 background: #111; 1714 color: #eee; 1715 padding: 1em; 1716 font: 12px monospace; 1717 max-height: 30vh; 1718 overflow-y: auto; 1719 border-top: 2px solid #ff3b30; 1720 z-index: var(--z-notifications); 1721 box-shadow: 0 -2px 10px rgba(0, 0, 0, 0.5); 1722} 1723 1724#error-log-dismiss { 1725 position: sticky; 1726 top: 0; 1727 float: right; 1728 background: #222; 1729 color: #eee; 1730 border: 1px solid #444; 1731 padding: 2px 8px; 1732 font: 12px monospace; 1733 cursor: pointer; 1734} 1735 1736/* Notification Center */ 1737.notification-center { 1738 position: fixed; 1739 top: calc(var(--facet-bar-height) + 4px); 1740 right: 20px; 1741 width: 280px; 1742 z-index: var(--z-notifications); 1743 pointer-events: none; 1744 display: flex; 1745 flex-direction: column; 1746 gap: 8px; 1747} 1748 1749/* Notification Card */ 1750.notification-card { 1751 background: white; 1752 border: 1px solid #e5e7eb; 1753 border-radius: 8px; 1754 box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); 1755 padding: 12px; 1756 position: relative; 1757 overflow: hidden; 1758 pointer-events: all; 1759 animation: slideIn 0.3s ease; 1760 transition: transform 0.2s ease, box-shadow 0.2s ease; 1761 cursor: default; 1762 display: block; 1763} 1764 1765/* Reset anchor tag styles when used as notification card */ 1766a.notification-card { 1767 color: inherit; 1768 text-decoration: none; 1769} 1770 1771.notification-card[data-action]:not([data-action=""]) { 1772 cursor: pointer; 1773} 1774 1775.notification-card:hover { 1776 transform: translateX(-4px); 1777 box-shadow: 0 6px 16px rgba(0, 0, 0, 0.2); 1778} 1779 1780@keyframes slideIn { 1781 from { 1782 opacity: 0; 1783 transform: translateX(100%); 1784 } 1785 to { 1786 opacity: 1; 1787 transform: translateX(0); 1788 } 1789} 1790 1791@keyframes countdownShrink { 1792 from { 1793 transform: scaleX(1); 1794 } 1795 to { 1796 transform: scaleX(0); 1797 } 1798} 1799 1800.notification-countdown { 1801 position: absolute; 1802 bottom: 0; 1803 left: 0; 1804 right: 0; 1805 height: 3px; 1806 background: #3b82f6; 1807 transform-origin: left; 1808 animation: countdownShrink linear forwards; 1809 border-radius: 0 0 8px 8px; 1810} 1811 1812.notification-card:hover .notification-countdown, 1813.notification-card:focus-within .notification-countdown { 1814 animation-play-state: paused; 1815} 1816 1817/* Notification Header */ 1818.notification-header { 1819 display: flex; 1820 align-items: center; 1821 gap: 8px; 1822 margin-bottom: 8px; 1823} 1824 1825.notification-app-icon { 1826 font-size: 16px; 1827 line-height: 1; 1828} 1829 1830.notification-app-name { 1831 font-size: 11px; 1832 color: #9ca3af; 1833 text-transform: capitalize; 1834 flex: 1; 1835} 1836 1837.notification-close { 1838 background: none; 1839 border: none; 1840 font-size: 20px; 1841 line-height: 1; 1842 color: #9ca3af; 1843 cursor: pointer; 1844 min-width: 44px; 1845 min-height: 44px; 1846 display: flex; 1847 align-items: center; 1848 justify-content: center; 1849 border-radius: 4px; 1850 transition: background 0.2s, color 0.2s; 1851} 1852 1853.notification-close:hover { 1854 background: #f3f4f6; 1855 color: #374151; 1856} 1857 1858/* Notification Body */ 1859.notification-body { 1860 position: relative; 1861} 1862 1863.notification-title { 1864 font-weight: 600; 1865 font-size: 14px; 1866 color: #1f2937; 1867 margin-bottom: 4px; 1868 line-height: 1.3; 1869} 1870 1871.notification-message { 1872 font-size: 13px; 1873 color: #6b7280; 1874 line-height: 1.4; 1875 display: -webkit-box; 1876 -webkit-line-clamp: 2; 1877 -webkit-box-orient: vertical; 1878 overflow: hidden; 1879} 1880 1881.notification-badge { 1882 position: absolute; 1883 top: 0; 1884 right: 0; 1885 background: #ef4444; 1886 color: white; 1887 font-size: 11px; 1888 font-weight: 600; 1889 padding: 2px 6px; 1890 border-radius: 10px; 1891 min-width: 20px; 1892 text-align: center; 1893 line-height: 1.2; 1894} 1895 1896/* Notification Footer */ 1897.notification-footer { 1898 margin-top: 8px; 1899 padding-top: 8px; 1900 border-top: 1px solid #f3f4f6; 1901} 1902 1903.notification-time { 1904 font-size: 11px; 1905 color: #9ca3af; 1906} 1907 1908/* Responsive */ 1909@media (max-width: 768px) { 1910 .notification-center { 1911 top: calc(var(--facet-bar-height) + 4px); 1912 right: 8px; 1913 left: 8px; 1914 width: auto; 1915 } 1916 1917 .notification-card { 1918 width: 100%; 1919 } 1920} 1921 1922/* Modal styling */ 1923.modal { 1924 display: none; 1925 position: fixed; 1926 z-index: var(--z-modals); 1927 left: 0; 1928 top: 0; 1929 width: 100%; 1930 height: 100%; 1931 background: rgba(0,0,0,0.5); 1932} 1933 1934.modal-content { 1935 background: white; 1936 margin: 5% auto; 1937 padding: 1em; 1938 border-radius: 8px; 1939 max-width: 500px; 1940 max-height: 80vh; 1941 overflow: auto; 1942 position: relative; 1943} 1944 1945.close { 1946 position: absolute; 1947 top: 10px; 1948 right: 15px; 1949 cursor: pointer; 1950 font-size: 24px; 1951} 1952 1953/* Corner Tags - fixed markers for screen region detection */ 1954.corner-tags { 1955 position: fixed; 1956 inset: 0; 1957 pointer-events: none; 1958 z-index: var(--z-tags); 1959} 1960 1961.corner-tag { 1962 position: absolute; 1963 width: 16px; 1964 height: 16px; 1965 background: var(--facet-color); 1966 mask-size: contain; 1967 -webkit-mask-size: contain; 1968 image-rendering: pixelated; 1969 image-rendering: crisp-edges; /* Firefox fallback */ 1970} 1971 1972.corner-tag-tl { top: 0; left: 0; mask-image: url('tags/tag-6.png'); -webkit-mask-image: url('tags/tag-6.png'); } 1973.corner-tag-tr { top: 0; right: 0; mask-image: url('tags/tag-7.png'); -webkit-mask-image: url('tags/tag-7.png'); } 1974.corner-tag-bl { bottom: 32px; left: 0; mask-image: url('tags/tag-4.png'); -webkit-mask-image: url('tags/tag-4.png'); } 1975.corner-tag-br { bottom: 32px; right: 0; mask-image: url('tags/tag-2.png'); -webkit-mask-image: url('tags/tag-2.png'); } 1976 1977/* ======================================== 1978 * Facet Add Button 1979 * Plus button to create new facets 1980 * ======================================== */ 1981.facet-add-pill { 1982 appearance: none; 1983 font-family: inherit; 1984 color: inherit; 1985 line-height: inherit; 1986 display: flex; 1987 align-items: center; 1988 justify-content: center; 1989 width: 36px; 1990 height: 36px; 1991 border-radius: 50%; 1992 background: transparent; 1993 border: 2px dashed #ccc; 1994 cursor: pointer; 1995 font-size: 20px; 1996 color: #999; 1997 transition: all 0.2s ease; 1998 flex-shrink: 0; 1999} 2000 2001.facet-add-pill:hover { 2002 border-color: var(--facet-color, #b06a1a); 2003 color: var(--facet-color, #b06a1a); 2004 background: var(--facet-bg, rgba(176, 106, 26, 0.1)); 2005 transform: scale(1.1); 2006} 2007 2008/* ======================================== 2009 * Facet Create Modal 2010 * Simple modal for creating new facets 2011 * ======================================== */ 2012.facet-create-modal { 2013 display: none; 2014 position: fixed; 2015 z-index: var(--z-modals); 2016 left: 0; 2017 top: 0; 2018 width: 100%; 2019 height: 100%; 2020 background: rgba(0, 0, 0, 0.5); 2021} 2022 2023.facet-create-modal.visible { 2024 display: flex; 2025 align-items: center; 2026 justify-content: center; 2027} 2028 2029.facet-create-content { 2030 background: white; 2031 padding: 24px; 2032 border-radius: 12px; 2033 width: 90%; 2034 max-width: 400px; 2035 box-shadow: 0 8px 32px rgba(0, 0, 0, 0.2); 2036} 2037 2038.facet-create-content h3 { 2039 margin: 0 0 20px 0; 2040 font-size: 18px; 2041 font-weight: 600; 2042 color: #333; 2043} 2044 2045.facet-create-field { 2046 margin-bottom: 16px; 2047} 2048 2049.facet-create-field label { 2050 display: block; 2051 font-size: 14px; 2052 font-weight: 500; 2053 color: #555; 2054 margin-bottom: 6px; 2055} 2056 2057.facet-create-field input { 2058 width: 100%; 2059 padding: 10px 12px; 2060 border: 2px solid #ddd; 2061 border-radius: 8px; 2062 font-size: 16px; 2063 transition: border-color 0.2s; 2064} 2065 2066.facet-create-field input:focus { 2067 outline: none; 2068 border-color: var(--facet-color, #b06a1a); 2069} 2070 2071.facet-create-slug { 2072 font-size: 13px; 2073 color: #888; 2074 margin-top: 6px; 2075 font-family: monospace; 2076} 2077 2078.facet-create-slug.has-slug::before { 2079 content: "→ "; 2080} 2081 2082.facet-create-buttons { 2083 display: flex; 2084 justify-content: flex-end; 2085 gap: 12px; 2086 margin-top: 24px; 2087} 2088 2089.facet-create-buttons button { 2090 padding: 10px 20px; 2091 border-radius: 8px; 2092 font-size: 14px; 2093 font-weight: 500; 2094 cursor: pointer; 2095 transition: all 0.2s; 2096} 2097 2098.facet-create-cancel { 2099 background: #f5f5f5; 2100 border: 1px solid #ddd; 2101 color: #666; 2102} 2103 2104.facet-create-cancel:hover { 2105 background: #e5e5e5; 2106} 2107 2108.facet-create-submit { 2109 background: var(--facet-color, #b06a1a); 2110 border: none; 2111 color: white; 2112} 2113 2114.facet-create-submit:hover { 2115 opacity: 0.9; 2116} 2117 2118.facet-create-submit:disabled { 2119 background: #ccc; 2120 cursor: not-allowed; 2121} 2122 2123.facet-create-error { 2124 color: #dc2626; 2125 font-size: 13px; 2126 margin-top: 8px; 2127 display: none; 2128} 2129 2130.facet-create-error.visible { 2131 display: block; 2132} 2133 2134/* Button reset for a11y-converted controls */ 2135button#hamburger, 2136button.status-icon, 2137button.close { 2138 appearance: none; 2139 background: none; 2140 border: none; 2141 padding: 0; 2142 margin: 0; 2143 font: inherit; 2144 color: inherit; 2145 cursor: pointer; 2146} 2147 2148/* Visually-hidden expand/collapse button - focusable but invisible */ 2149.chat-bar-expand { 2150 position: absolute; 2151 width: 1px; 2152 height: 1px; 2153 padding: 0; 2154 margin: -1px; 2155 overflow: hidden; 2156 clip: rect(0, 0, 0, 0); 2157 white-space: nowrap; 2158 border: 0; 2159 background: none; 2160 font: inherit; 2161 color: inherit; 2162} 2163 2164.chat-bar-expand:focus-visible { 2165 position: static; 2166 width: auto; 2167 height: auto; 2168 margin: 0; 2169 overflow: visible; 2170 clip: auto; 2171 white-space: normal; 2172 font-size: 14px; 2173} 2174 2175/* ======================================== 2176 * Reduced Motion 2177 * Respects prefers-reduced-motion user preference 2178 * ======================================== */ 2179@media (prefers-reduced-motion: reduce) { 2180 @view-transition { 2181 navigation: none; 2182 } 2183 2184 *, 2185 *::before, 2186 *::after { 2187 transition-duration: 0.01ms !important; 2188 animation-duration: 0.01ms !important; 2189 animation-iteration-count: 1 !important; 2190 } 2191 2192 .chat-bar-thinking-dot { 2193 animation: none; 2194 opacity: 1; 2195 } 2196 2197 .status-indicator--connecting { 2198 animation: none; 2199 } 2200 2201 .facet-pill:hover { 2202 transform: none; 2203 } 2204 2205 .facet-pill.dragging { 2206 transform: none; 2207 } 2208 2209 .facet-pill.drag-over { 2210 transform: none; 2211 } 2212 2213 .facet-add-pill:hover { 2214 transform: none; 2215 } 2216 2217 .menu-submenu { 2218 transform: none; 2219 } 2220 2221 .notification-card:hover { 2222 transform: none; 2223 } 2224} 2225 2226/* Focus-visible states for keyboard navigation */ 2227.menu-bar .menu-item-link:focus-visible, 2228.menu-submenu-item:focus-visible, 2229.facet-pill:focus-visible, 2230.facet-add-pill:focus-visible, 2231#hamburger:focus-visible, 2232.facet-bar .status-icon:focus-visible, 2233.chat-bar-send:focus-visible, 2234.chat-bar-dismiss:focus-visible, 2235.date-nav-arrow:focus-visible, 2236.facet-create-submit:focus-visible, 2237.facet-create-cancel:focus-visible, 2238button:focus-visible, 2239a:focus-visible { 2240 outline: 2px solid var(--facet-color, #b06a1a); 2241 outline-offset: 2px; 2242} 2243 2244/* Visually hidden — accessible to screen readers */ 2245.visually-hidden { 2246 position: absolute; 2247 width: 1px; 2248 height: 1px; 2249 padding: 0; 2250 margin: -1px; 2251 overflow: hidden; 2252 clip: rect(0, 0, 0, 0); 2253 white-space: nowrap; 2254 border: 0; 2255} 2256 2257/* Skip-to-content link — visible on focus */ 2258.skip-link { 2259 position: absolute; 2260 top: -100%; 2261 left: 0; 2262 z-index: 9999; 2263 padding: 8px 16px; 2264 background: var(--facet-color, #b06a1a); 2265 color: #fff; 2266 text-decoration: none; 2267 font-size: 14px; 2268 border-radius: 0 0 4px 0; 2269} 2270 2271.skip-link:focus { 2272 top: 0; 2273}