Tend your corner of the atmosphere. spores.garden turns your AT Protocol records into a personal site with unique themes. Your data never leaves your PDS. Grow something that's truly yours. spores.garden
at main 4351 lines 91 kB view raw
1/** 2 * spores.garden - Base Theme 3 * Brutalist/minimalist aesthetic with high contrast and bold typography. 4 */ 5 6/* ============================================ 7 Google Fonts Import 8 ============================================ */ 9 10/* Fonts are loaded dynamically based on theme - see engine.ts */ 11/* Only Inter and JetBrains Mono are loaded statically as fallbacks */ 12@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&family=JetBrains+Mono:wght@400;600&family=Work+Sans:wght@400;600;700&display=swap'); 13 14/* ============================================ 15 CSS Custom Properties 16 ============================================ */ 17 18:root { 19 /* Breakpoints */ 20 --breakpoint-sm: 480px; 21 --breakpoint-md: 768px; 22 --breakpoint-lg: 1024px; 23 24 /* Safe Area Insets (Notch Support) */ 25 --safe-area-inset-top: env(safe-area-inset-top, 0px); 26 --safe-area-inset-bottom: env(safe-area-inset-bottom, 0px); 27 --safe-area-inset-left: env(safe-area-inset-left, 0px); 28 --safe-area-inset-right: env(safe-area-inset-right, 0px); 29 30 /* Colors - High Contrast */ 31 --color-background: #ffffff; 32 --color-background-rgb: 255, 255, 255; 33 --color-text: #000000; 34 --color-text-rgb: 0, 0, 0; 35 --color-surface: #f8f9fa; 36 --color-text-muted: #6b7280; 37 --color-primary: #000000; 38 --color-accent: #0ea5e9; 39 --color-border: #e5e7eb; 40 --color-border-muted: #d1d5db; 41 --color-border-dark: #000000; 42 43 /* Fluid Typography (Phase 7) */ 44 --font-size-base: clamp(0.875rem, 2.5vw, 1rem); 45 --font-size-sm: clamp(0.75rem, 2vw, 0.875rem); 46 --font-size-lg: clamp(1rem, 3vw, 1.25rem); 47 --font-size-xl: clamp(1.25rem, 4vw, 1.75rem); 48 --font-size-2xl: clamp(1.5rem, 5vw, 2.5rem); 49 50 /* Typography */ 51 --font-heading: 'Work Sans', sans-serif; 52 --font-body: 'Work Sans', sans-serif; 53 --font-mono: 'JetBrains Mono', 'Courier New', monospace; 54 55 /* Spacing */ 56 --spacing-xs: 0.25rem; 57 --spacing-sm: 0.5rem; 58 --spacing-md: 1rem; 59 --spacing-lg: 2rem; 60 --spacing-xl: 4rem; 61 62 /* Border */ 63 --border-width: 2px; 64 --border-width-thick: 4px; 65 --border-width-extra-thick: 20px; 66 --border-style: solid; 67 /* Border radius derived from border-width */ 68 --border-radius: calc(var(--border-width) * 4); 69 70 /* Drop shadow (overridden by theme engine / generated themes) */ 71 --shadow-type: normal; 72 --shadow-x: 6px; 73 --shadow-y: 6px; 74 --shadow-blur: 0px; 75 --shadow-spread: 0px; 76 --shadow-color: rgba(0, 0, 0, 0.08); 77 78 /* Convenience: one var to use everywhere */ 79 --shadow-elevated: var(--shadow-x) var(--shadow-y) var(--shadow-blur) var(--shadow-spread) var(--shadow-color); 80 81 /* Transitions */ 82 --transition: 150ms ease; 83} 84 85/* ============================================ 86 Base Reset 87 ============================================ */ 88 89*, 90*::before, 91*::after { 92 box-sizing: border-box; 93} 94 95body { 96 margin: 0; 97 padding: 0; 98 min-height: 100vh; 99 min-height: 100svh; /* Small viewport height for mobile */ 100 font-family: var(--font-body); 101 font-size: var(--font-size-base); 102 line-height: 1.5; 103 color: var(--color-text); 104 background-color: var(--color-background); 105 /* Isoline pattern background - fixed, 1:1 with viewport (size set in JS) */ 106 background-image: var(--pattern-background, none); 107 background-size: var(--pattern-width, auto) var(--pattern-height, auto); 108 background-repeat: no-repeat; 109 background-attachment: fixed; 110 background-position: 0 0; 111 /* Smooth color transitions when navigating between gardens */ 112 transition: background-color 0.6s ease-in-out, color 0.6s ease-in-out; 113 -webkit-font-smoothing: antialiased; 114 -moz-osx-font-smoothing: grayscale; 115} 116 117/* Skip navigation link for keyboard users */ 118.skip-link { 119 position: absolute; 120 top: -100%; 121 left: var(--spacing-md); 122 z-index: 9999; 123 padding: var(--spacing-sm) var(--spacing-md); 124 background: var(--color-text); 125 color: var(--color-background); 126 font-weight: 700; 127 text-decoration: none; 128 font-size: 0.875rem; 129 text-transform: uppercase; 130 letter-spacing: 0.05em; 131 border: 2px solid var(--color-border-dark); 132} 133.skip-link:focus { 134 top: var(--spacing-md); 135} 136#main-content:focus { 137 outline: none; 138} 139 140/* Hide text until fonts are loaded to prevent flicker */ 141body:not(.fonts-ready) h1, 142body:not(.fonts-ready) h2, 143body:not(.fonts-ready) h3, 144body:not(.fonts-ready) h4, 145body:not(.fonts-ready) h5, 146body:not(.fonts-ready) h6, 147body:not(.fonts-ready) .site-title, 148body:not(.fonts-ready) .section-title { 149 visibility: hidden; 150} 151 152body.fonts-ready h1, 153body.fonts-ready h2, 154body.fonts-ready h3, 155body.fonts-ready h4, 156body.fonts-ready h5, 157body.fonts-ready h6, 158body.fonts-ready .site-title, 159body.fonts-ready .section-title { 160 visibility: visible; 161 transition: opacity 200ms ease-in-out; 162} 163 164h1, 165h2, 166h3, 167h4, 168h5, 169h6 { 170 font-family: var(--font-heading); 171 font-weight: 700; 172 margin: 0 0 var(--spacing-md); 173 line-height: 1.1; 174 letter-spacing: 0.02em; 175} 176 177h1 { 178 font-size: var(--font-size-xl); 179} 180 181h2 { 182 font-size: var(--font-size-lg); 183} 184 185h3 { 186 font-size: var(--font-size-base); 187} 188 189h4 { 190 font-size: var(--font-size-base); 191} 192 193h5, 194h6 { 195 font-size: var(--font-size-sm); 196} 197 198a { 199 color: var(--color-text); 200 text-decoration: underline; 201 text-decoration-thickness: 2px; 202 text-underline-offset: 3px; 203 transition: text-decoration var(--transition); 204} 205 206a:hover { 207 text-decoration-style: double; 208} 209 210img { 211 max-width: 100%; 212 height: auto; 213 display: block; 214} 215 216/* ============================================ 217 Site Structure 218 ============================================ */ 219 220site-app { 221 display: flex; 222 flex-direction: column; 223 min-height: 100vh; 224 /* Ensure main content is centered on ultra-wide screens */ 225 align-items: center; 226 width: 100%; 227} 228 229/* Theme loading state: content fades in smoothly after theme is applied */ 230site-app:not(.theme-ready) .main, 231site-app:not(.theme-ready) .header { 232 opacity: 0; 233} 234 235site-app.theme-ready .main, 236site-app.theme-ready .header { 237 opacity: 1; 238 animation: fadeIn 0.35s ease-out; 239} 240 241.header { 242 display: flex; 243 justify-content: space-between; 244 align-items: flex-start; 245 padding-bottom: var(--spacing-md); 246 padding-top: calc(var(--spacing-lg) + var(--safe-area-inset-top)); 247 padding-left: calc(var(--spacing-lg) + var(--safe-area-inset-left)); 248 padding-right: calc(var(--spacing-lg) + var(--safe-area-inset-right)); 249 background: var(--color-background); 250 gap: var(--spacing-md); 251 /* Ensure header stretches to full width since parent is now centered */ 252 width: 100%; 253 max-width: 100%; 254 position: sticky; 255 top: 0; 256 z-index: 200; 257 transition: transform 0.3s ease; 258} 259 260.header.header--hidden { 261 transform: translateY(-100%); 262} 263 264.header-left { 265 display: flex; 266 align-items: center; 267 gap: var(--spacing-md); 268} 269 270/* Header special spore – nudge up so stem doesn’t sit low vs title/flower */ 271.header-spores { 272 align-self: center; 273 display: inline-flex; 274 align-items: center; 275} 276 277.header-spores > div { 278 display: flex; 279 align-items: center; 280 justify-content: center; 281} 282 283.header-spores > div svg { 284 display: block; 285 /* Optical nudge: spore graphic has stem below, so shift up to align with text */ 286 transform: translateY(-4px); 287} 288 289/* Home Button with Dandelion Icon */ 290.home-button { 291 display: flex; 292 align-items: center; 293 justify-content: center; 294 width: 48px; 295 height: 48px; 296 flex-shrink: 0; 297 color: var(--color-text); 298 text-decoration: none; 299 border: var(--border-width) var(--border-style, solid) var(--color-border-dark); 300 background: var(--color-background); 301 transition: all var(--transition); 302 padding: var(--spacing-xs); 303} 304 305.home-button:hover { 306 background: var(--color-text); 307 color: var(--color-background); 308 transform: scale(1.05); 309} 310 311.home-button:active { 312 transform: scale(0.98); 313} 314 315.dandelion-icon { 316 width: 100%; 317 height: 100%; 318} 319 320/* Dandelion icon - has both stroke and fill */ 321.dandelion-icon path, 322.dandelion-icon line, 323.dandelion-icon circle { 324 stroke: var(--color-text); 325 fill: var(--color-text); 326 transition: stroke var(--transition), fill var(--transition); 327} 328 329/* Monochrome spore flower - outline only, no fill */ 330.monochrome-spore-flower path, 331.monochrome-spore-flower circle { 332 stroke: var(--color-text); 333 transition: stroke var(--transition); 334} 335 336/* Invert colors on hover */ 337.home-button:hover .dandelion-icon path, 338.home-button:hover .dandelion-icon line, 339.home-button:hover .dandelion-icon circle { 340 stroke: var(--color-background) !important; 341 fill: var(--color-background) !important; 342} 343 344.home-button:hover .monochrome-spore-flower path, 345.home-button:hover .monochrome-spore-flower circle { 346 stroke: var(--color-background) !important; 347} 348 349.site-title { 350 margin: 0; 351 font-size: var(--font-size-xl); 352 font-weight: 700; 353 color: var(--color-text); 354 letter-spacing: -0.03em; 355} 356 357.site-subtitle { 358 font-size: 0.98rem; 359 font-weight: 500; 360 margin: 0; 361 margin-top: 0.25rem; 362 color: var(--color-text-muted); 363 letter-spacing: 0.05em; 364} 365 366/* Inline edit inputs for title/subtitle in edit mode */ 367.site-title-input, 368.site-subtitle-input { 369 font-family: var(--font-heading); 370 background: var(--color-background); 371 border: 2px dashed var(--color-border-dark); 372 border-radius: 0; 373 color: var(--color-text); 374 width: 100%; 375 max-width: 400px; 376 transition: all var(--transition); 377} 378 379.site-title-input { 380 font-size: var(--font-size-xl); 381 font-weight: 700; 382 letter-spacing: -0.03em; 383 padding: var(--spacing-xs) var(--spacing-sm); 384 margin: 0; 385} 386 387.site-subtitle-input { 388 font-size: 0.98rem; 389 font-weight: 500; 390 letter-spacing: 0.05em; 391 padding: var(--spacing-xs) var(--spacing-sm); 392 margin-top: 0.25rem; 393 color: var(--color-text-muted); 394} 395 396.site-title-input:focus, 397.site-subtitle-input:focus { 398 outline: none; 399 border-style: solid; 400 border-width: 2px; 401 border-color: var(--color-border-dark); 402} 403 404.site-title-input::placeholder { 405 color: var(--color-text-muted); 406 opacity: 0.6; 407} 408 409.site-subtitle-input::placeholder { 410 color: var(--color-text-muted); 411 opacity: 0.6; 412} 413 414/* Mobile adjustments for inline edit inputs */ 415@media (max-width: 767px) { 416 .site-title-input { 417 font-size: 1.25rem; 418 max-width: 100%; 419 } 420 421 .site-subtitle-input { 422 font-size: 0.85rem; 423 max-width: 100%; 424 } 425} 426 427@media (max-width: 479px) { 428 .site-title-input { 429 font-size: 1.1rem; 430 } 431 432 .site-subtitle-input { 433 font-size: 0.75rem; 434 } 435} 436 437.controls { 438 display: flex; 439 gap: var(--spacing-sm); 440 align-items: stretch; 441} 442 443/* Header controls: match home button pattern (outline default, filled on hover) */ 444.header .controls .button, 445.header .controls .button-primary, 446.header .controls .button-secondary, 447.header .controls .button-ghost { 448 color: var(--color-text); 449 background: var(--color-background); 450 border: var(--border-width) var(--border-style, solid) var(--color-border-dark); 451} 452 453.header .controls .button:hover, 454.header .controls .button-primary:hover, 455.header .controls .button-secondary:hover, 456.header .controls .button-ghost:hover { 457 background: var(--color-text); 458 color: var(--color-background); 459} 460 461.header .controls .button-ghost:hover { 462 border-color: var(--color-border-dark); 463} 464 465/* Mobile Menu Toggle (Hamburger) */ 466.mobile-menu-toggle { 467 display: none; 468 width: 48px; 469 height: 48px; 470 padding: var(--spacing-xs); 471 background: transparent; 472 border: var(--border-width) var(--border-style) var(--color-border-dark); 473 cursor: pointer; 474 flex-shrink: 0; 475 align-self: flex-start; 476} 477 478.mobile-menu-toggle svg { 479 width: 24px; 480 height: 24px; 481} 482 483.mobile-menu-toggle:hover { 484 background: var(--color-text); 485 color: var(--color-background); 486} 487 488.mobile-menu-toggle:active { 489 transform: scale(0.98); 490} 491 492/* Mobile menu styles (< 768px) */ 493@media (max-width: 767px) { 494 .mobile-menu-toggle { 495 display: flex; 496 align-items: center; 497 justify-content: center; 498 } 499 500 .header { 501 position: sticky; 502 z-index: 200; 503 padding: var(--spacing-sm) var(--spacing-md); 504 padding-top: calc(var(--spacing-md) + var(--safe-area-inset-top)); 505 padding-left: calc(var(--spacing-md) + var(--safe-area-inset-left)); 506 padding-right: calc(var(--spacing-md) + var(--safe-area-inset-right)); 507 flex-wrap: nowrap; 508 } 509 510 .header-left { 511 flex: 1; 512 min-width: 0; 513 overflow: visible; 514 flex-wrap: nowrap !important; 515 /* Prevent wrapping - keep title on same line as home button */ 516 } 517 518 /* Title container should flex and allow text wrapping */ 519 .header-left > div { 520 flex: 1; 521 min-width: 0; 522 max-width: 100%; 523 overflow-wrap: break-word; 524 word-wrap: break-word; 525 } 526 527 .site-info { 528 min-width: 0; 529 overflow: hidden; 530 } 531 532 .site-title { 533 font-size: 1.25rem; 534 word-wrap: break-word; 535 overflow-wrap: break-word; 536 max-width: 100%; 537 } 538 539 .site-subtitle { 540 font-size: 0.85rem; 541 word-wrap: break-word; 542 overflow-wrap: break-word; 543 max-width: 100%; 544 } 545 546 .controls { 547 position: absolute; 548 top: 100%; 549 left: 0; 550 right: 0; 551 flex-direction: column; 552 background: var(--color-background); 553 border: none; 554 border-bottom: var(--border-width) var(--border-style) var(--color-border-dark); 555 padding: var(--spacing-md); 556 gap: var(--spacing-sm); 557 z-index: 100; 558 transform: translateY(-100%); 559 opacity: 0; 560 pointer-events: none; 561 transition: transform 200ms ease, opacity 200ms ease; 562 } 563 564 .controls.open { 565 transform: translateY(0); 566 opacity: 1; 567 pointer-events: auto; 568 } 569 570 /* Match header padding (including safe area) so dropdown aligns when has-pattern */ 571 body.has-pattern .controls.open { 572 padding-top: var(--spacing-sm); 573 padding-bottom: var(--spacing-sm); 574 padding-left: calc(var(--spacing-md) + var(--safe-area-inset-left)); 575 padding-right: calc(var(--spacing-md) + var(--safe-area-inset-right)); 576 } 577 578 .controls .button { 579 width: 100%; 580 justify-content: center; 581 min-height: 44px; 582 text-align: center; 583 } 584} 585 586/* Extra small screens (< 480px) */ 587@media (max-width: 479px) { 588 .site-title { 589 font-size: 1.1rem; 590 } 591 592 .site-subtitle { 593 font-size: 0.75rem; 594 } 595 596 .home-button, 597 .mobile-menu-toggle { 598 width: 36px; 599 height: 36px; 600 padding: 4px; 601 } 602 603 .mobile-menu-toggle svg { 604 width: 18px; 605 height: 18px; 606 } 607 608 .home-button svg, 609 .dandelion-icon { 610 width: 100%; 611 height: 100%; 612 } 613} 614 615.flower-bed { 616 width: 100%; 617} 618 619.main { 620 flex: 1; 621 align-self: center; 622 width: 100%; 623 max-width: 1200px; 624 margin: 0 auto; 625 padding: var(--spacing-xl) var(--spacing-lg); 626 display: flex; 627 flex-direction: column; 628 box-sizing: border-box; 629} 630 631/* Constrain homepage width for better readability */ 632.main.is-homepage { 633 max-width: 1000px !important; 634} 635 636/* Add bottom padding on mobile to account for fixed save bar when in edit mode */ 637@media (max-width: 1280px) { 638 .main { 639 padding: var(--spacing-lg) var(--spacing-md); 640 } 641 642 .main:has(.save-bar) { 643 padding-bottom: calc(110px + var(--safe-area-inset-bottom)); 644 } 645} 646 647.footer { 648 text-align: center; 649 color: var(--color-text-muted); 650 font-size: 0.875rem; 651 margin-top: var(--spacing-lg); 652 margin-bottom: var(--spacing-lg); 653} 654 655.footer a { 656 color: inherit; 657} 658 659.footer .hypha-credit-link, 660.footer .hypha-credit-link:visited { 661 color: #9900FC; 662 font-family: 'Work Sans', var(--font-body); 663 font-size: 1.1em; 664 text-decoration-line: none; 665 text-decoration-color: #000; 666 text-decoration-style: solid; 667 text-decoration-thickness: 2px; 668 text-underline-offset: 3px; 669 text-decoration-skip-ink: none; 670} 671 672.footer .hypha-credit-link:hover, 673.footer .hypha-credit-link:focus-visible, 674.footer .hypha-credit-link:active { 675 color: #9900FC; 676 text-decoration-line: underline; 677 text-decoration-color: #000; 678 text-decoration-style: solid; 679} 680 681/* ============================================ 682 Sections 683 ============================================ */ 684 685/* Section blocks stay hidden until content is ready, then fade in */ 686section-block:not(.section-ready) { 687 opacity: 0; 688 pointer-events: none; 689} 690 691section-block.section-ready { 692 animation: fadeIn 0.35s ease-out forwards; 693 pointer-events: auto; 694} 695 696.section { 697 margin-bottom: var(--spacing-xl); 698} 699 700/* Liquid glass effect for sections when isoline pattern is active */ 701body.has-pattern .section, 702body.has-pattern section-block, 703body.has-pattern section-block.section { 704 background: rgba(var(--color-background-rgb), 0.25) !important; 705 border-radius: var(--border-radius); 706 box-shadow: 0 4px 30px rgba(0, 0, 0, 0.1); 707 backdrop-filter: blur(80px); 708 -webkit-backdrop-filter: blur(80px); 709 border: 1px solid rgba(var(--color-text-rgb), 0.1); 710 padding: var(--spacing-lg); 711} 712 713@media (max-width: 767px) { 714 body.has-pattern .section, 715 body.has-pattern section-block, 716 body.has-pattern section-block.section { 717 padding: var(--spacing-md); 718 } 719} 720 721/* Liquid glass effect for header and mobile menu when isoline pattern is active */ 722body.has-pattern .header, 723body.has-pattern .controls.open { 724 background: rgba(var(--color-background-rgb), 0.25) !important; 725 box-shadow: 0 4px 30px rgba(0, 0, 0, 0.1); 726 backdrop-filter: blur(80px); 727 -webkit-backdrop-filter: blur(80px); 728 border-bottom: 1px solid rgba(var(--color-text-rgb), 0.1); 729} 730 731/* When menu open: header + dropdown read as one panel (no double border) */ 732body.has-pattern .header:has(.controls.open) { 733 border-bottom: none !important; 734} 735 736/* Fallback for browsers without backdrop-filter support */ 737@supports not (backdrop-filter: blur(1px)) { 738 739 body.has-pattern .section, 740 body.has-pattern section-block, 741 body.has-pattern section-block.section { 742 background: rgba(var(--color-background-rgb), 0.85) !important; 743 box-shadow: 0 2px 12px rgba(0, 0, 0, 0.1); 744 } 745 746 body.has-pattern .header, 747 body.has-pattern .controls.open { 748 background: rgba(var(--color-background-rgb), 0.9) !important; 749 box-shadow: 0 2px 12px rgba(0, 0, 0, 0.1); 750 } 751 752 body.has-pattern .garden-preview__flower-box, 753 body.has-pattern .flower-grid-item { 754 background: rgba(var(--color-background-rgb), 0.85) !important; 755 box-shadow: 0 2px 12px rgba(0, 0, 0, 0.1); 756 } 757} 758 759.section-header { 760 display: flex; 761 justify-content: space-between; 762 align-items: flex-start; 763 gap: var(--spacing-md); 764 flex-wrap: wrap; 765 margin-bottom: var(--spacing-md); 766} 767 768.section-title-wrapper { 769 display: flex; 770 align-items: center; 771 gap: 0.5rem; 772} 773 774.section-title { 775 margin: 0; 776 font-size: var(--font-size-lg); 777 font-weight: 700; 778 letter-spacing: -0.02em; 779} 780 781.section-controls { 782 display: flex; 783 gap: var(--spacing-sm); 784 align-items: center; 785 justify-content: flex-end; 786 flex-wrap: wrap; 787 margin-top: var(--spacing-lg); 788 padding-top: var(--spacing-md); 789 border-top: calc(var(--border-width) * 0.25) var(--border-style, solid) var(--color-border-dark); 790} 791 792/* In edit mode, put the divider on the whole section, not the header */ 793.section[data-edit-mode="true"] { 794 padding: var(--spacing-md); 795 border: calc(var(--border-width) * 0.5) var(--border-style, solid) var(--color-border-dark); 796} 797 798.section-info { 799 display: inline-flex; 800 align-items: center; 801 padding: var(--spacing-sm) var(--spacing-md); 802 border: 2px var(--border-style, solid) var(--color-border); 803 font-family: var(--font-mono); 804 color: var(--color-text-muted); 805 white-space: nowrap; 806 max-width: 300px; 807 overflow: hidden; 808 text-overflow: ellipsis; 809} 810 811.section-info-row { 812 display: flex; 813 gap: var(--spacing-xs); 814 align-items: center; 815} 816 817.section-move-buttons { 818 display: flex; 819 gap: 0.25rem; 820} 821 822.section-action-buttons { 823 display: flex; 824 gap: var(--spacing-xs); 825 align-items: center; 826} 827 828/* Section Controls Mobile Responsive (< 768px) */ 829@media (max-width: 767px) { 830 .section-header { 831 flex-direction: column; 832 align-items: stretch; 833 } 834 835 .section-title-wrapper { 836 width: 100%; 837 } 838 839 .section-controls { 840 width: 100%; 841 flex-wrap: wrap; 842 justify-content: flex-start; 843 } 844 845 .section-controls .button { 846 flex: 1 1 calc(50% - var(--spacing-xs)); 847 min-width: 120px; 848 min-height: 44px; 849 } 850 851 .section-info-row { 852 width: 100%; 853 display: flex; 854 } 855 856 .section-info-row .section-info, 857 .section-info-row .section-move-buttons { 858 flex: 0 0 50%; 859 width: 50%; 860 box-sizing: border-box; 861 } 862 863 .section-info-row .section-info { 864 font-size: 0.7rem; 865 overflow: hidden; 866 text-overflow: ellipsis; 867 } 868 869 .section-info-row .section-move-buttons { 870 justify-content: flex-end; 871 } 872 873 /* Override button sizing inside move buttons - keep them small */ 874 .section-info-row .section-move-buttons .button { 875 flex: 0 0 auto; 876 min-width: 44px; 877 width: auto; 878 } 879 880 .section-action-buttons { 881 display: flex; 882 flex-wrap: wrap; 883 gap: var(--spacing-xs); 884 width: 100%; 885 } 886 887 .section-action-buttons .button { 888 flex: 1 1 calc(50% - var(--spacing-xs)); 889 min-width: 0; 890 } 891} 892 893/* Section Info Collapse - Extra small screens (< 480px) */ 894@media (max-width: 479px) { 895 .section-info-row .section-info { 896 font-size: 0.65rem; 897 } 898 899 /* Keep action buttons at 50% even on small screens */ 900 .section-action-buttons .button { 901 flex: 1 1 calc(50% - var(--spacing-xs)); 902 min-width: 0; 903 } 904} 905 906/* Record Grid - Mobile-first responsive grid */ 907.record-grid { 908 display: grid; 909 gap: var(--spacing-md); 910 grid-template-columns: 1fr; 911 /* Base: single column on mobile */ 912} 913 914@media (min-width: 480px) { 915 .record-grid { 916 grid-template-columns: repeat(auto-fit, minmax(min(100%, 300px), 1fr)); 917 gap: var(--spacing-lg); 918 } 919} 920 921@media (min-width: 768px) { 922 .record-grid { 923 grid-template-columns: repeat(auto-fit, minmax(min(100%, 350px), 1fr)); 924 } 925} 926 927@media (min-width: 1024px) { 928 .record-grid { 929 grid-template-columns: repeat(auto-fit, minmax(min(100%, 400px), 1fr)); 930 } 931} 932 933/* When there's only one item, let it take full width up to a max */ 934.record-grid:has(> :only-child) { 935 grid-template-columns: 1fr; 936} 937 938.record-grid> :only-child { 939 max-width: 700px; 940} 941 942.record-grid.content-enter { 943 display: flex; 944 flex-direction: column; 945 align-items: center; 946} 947 948.record-error { 949 min-height: 200px; 950 display: flex; 951 align-items: center; 952 justify-content: center; 953} 954 955.image-error-container { 956 padding: var(--spacing-md); 957} 958 959/* ============================================ 960 Form Elements 961 ============================================ */ 962 963.input, 964.textarea, 965.select { 966 font-family: inherit; 967 font-size: 1rem; 968 padding: var(--spacing-md); 969 border: 2px var(--border-style, solid) var(--color-border-dark); 970 border-radius: 0; 971 background: var(--color-background); 972 color: var(--color-text); 973 width: 100%; 974 transition: all var(--transition), border-style var(--transition); 975} 976 977.input:focus, 978.textarea:focus, 979.select:focus { 980 outline: none; 981 border-width: 4px; 982 border-color: var(--color-border-dark); 983} 984 985.input::placeholder, 986.textarea::placeholder { 987 color: var(--color-text-muted); 988} 989 990.textarea { 991 resize: vertical; 992 min-height: 120px; 993} 994 995/* Text selection - inverted colors for sufficient contrast */ 996.textarea::selection, 997.content::selection, 998.input::selection { 999 background-color: var(--color-text); 1000 color: var(--color-background); 1001} 1002 1003.textarea::-moz-selection, 1004.content::-moz-selection, 1005.input::-moz-selection { 1006 background-color: var(--color-text); 1007 color: var(--color-background); 1008} 1009 1010/* ============================================ 1011 Buttons 1012 ============================================ */ 1013 1014.button { 1015 font-family: var(--font-body); 1016 font-size: 0.875rem; 1017 font-weight: 700; 1018 padding: var(--spacing-md) var(--spacing-lg); 1019 border: var(--border-width) var(--border-style, solid) var(--color-border-dark); 1020 border-radius: 0; 1021 background: var(--color-text); 1022 color: var(--color-background); 1023 cursor: pointer; 1024 transition: all var(--transition); 1025 text-transform: uppercase; 1026 letter-spacing: 0.05em; 1027} 1028 1029.button:hover { 1030 background: var(--color-background); 1031 color: var(--color-text); 1032} 1033 1034.button:focus-visible { 1035 outline: 3px solid var(--color-border-dark); 1036 outline-offset: 2px; 1037} 1038 1039.button:active { 1040 transform: translate(1px, 1px); 1041} 1042 1043.button:disabled { 1044 opacity: 0.3; 1045 cursor: not-allowed; 1046} 1047 1048.button-primary { 1049 background: var(--color-text); 1050 color: var(--color-background); 1051 border: var(--border-width) var(--border-style, solid) var(--color-border-dark); 1052} 1053 1054.button-secondary { 1055 background: var(--color-text-muted); 1056 color: var(--color-button-secondary-text, var(--color-background)); 1057 border: var(--border-width) var(--border-style, solid) var(--color-border-muted); 1058} 1059 1060.modal-actions .button-secondary { 1061 margin-top: 0; 1062} 1063 1064.button-ghost { 1065 background: transparent; 1066 color: var(--color-text); 1067 border: var(--border-width) var(--border-style, solid) transparent; 1068} 1069 1070.button-ghost:hover { 1071 color: var(--color-text); 1072 border-color: var(--color-border); 1073} 1074 1075.button-danger { 1076 background: #dc2626; 1077 border-color: #dc2626; 1078 color: white; 1079} 1080 1081.button-danger:hover { 1082 background: #b91c1c; 1083 border-color: #b91c1c; 1084} 1085 1086.button-accent { 1087 background: var(--color-accent); 1088 border-color: var(--color-accent); 1089 color: var(--color-button-accent-text, white); 1090} 1091 1092.button-accent:hover { 1093 background: #0284c7; 1094 border-color: #0284c7; 1095} 1096 1097.button-small { 1098 padding: var(--spacing-sm) var(--spacing-md); 1099 font-size: 0.75rem; 1100} 1101 1102.button-icon { 1103 padding: var(--spacing-xs); 1104 display: inline-flex; 1105 align-items: center; 1106 justify-content: center; 1107 line-height: 1; 1108} 1109 1110.button-large { 1111 padding: var(--spacing-lg) var(--spacing-xl); 1112 font-size: 1rem; 1113} 1114 1115/* ============================================ 1116 Touch Targets & Interactions (Phase 6) 1117 ============================================ */ 1118 1119/* Minimum Touch Target Size - Ensure all interactive elements meet 44x44px */ 1120.button, 1121.section-move-btn, 1122.flower-item { 1123 min-height: 44px; 1124 min-width: 44px; 1125} 1126 1127/* Links need touch target via padding on mobile */ 1128@media (max-width: 767px) { 1129 .button { 1130 padding: var(--spacing-sm) var(--spacing-md); 1131 min-height: 44px; 1132 } 1133 1134 .button-small { 1135 min-height: 36px; 1136 padding: var(--spacing-xs) var(--spacing-sm); 1137 } 1138 1139 /* Tap Highlight for better touch feedback */ 1140 .button, 1141 a, 1142 .flower-item, 1143 .flower-grid-item a, 1144 .recent-garden-row-link, 1145 .section-type, 1146 .template-card, 1147 .collection-item, 1148 .record-item, 1149 .post-item, 1150 .welcome-action-card { 1151 -webkit-tap-highlight-color: rgba(0, 0, 0, 0.1); 1152 } 1153 1154 /* Ensure clickable elements have adequate touch area */ 1155 .links-item, 1156 .recent-garden-row-link { 1157 min-height: 44px; 1158 } 1159 1160 /* Improve touch target for close buttons */ 1161 .modal-close, 1162 .notification-close { 1163 min-width: 44px; 1164 min-height: 44px; 1165 display: flex; 1166 align-items: center; 1167 justify-content: center; 1168 } 1169} 1170 1171/* ============================================ 1172 Dev Notice 1173 ============================================ */ 1174 1175.dev-notice { 1176 margin: var(--spacing-sm) 0; 1177 padding: var(--spacing-xs) var(--spacing-sm); 1178 border-left: 3px solid var(--color-text-muted); 1179 background: var(--color-surface, rgba(0,0,0,0.03)); 1180 font-size: 0.8rem; 1181 color: var(--color-text-muted); 1182 border-radius: 0 var(--radius-sm) var(--radius-sm) 0; 1183} 1184.dev-notice a { 1185 color: inherit; 1186 text-decoration: underline; 1187} 1188 1189/* ============================================ 1190 Modals 1191 ============================================ */ 1192 1193.modal, 1194.modal-overlay { 1195 position: fixed; 1196 inset: 0; 1197 display: flex; 1198 align-items: center; 1199 justify-content: center; 1200 background: rgba(0, 0, 0, 0.8); 1201 padding: var(--spacing-md); 1202 z-index: 1000; 1203} 1204 1205.modal-content { 1206 background: var(--color-background); 1207 padding: var(--spacing-lg); 1208 border: var(--border-width-thick) var(--border-style, solid) var(--color-border-dark); 1209 max-width: 800px; 1210 width: 100%; 1211 max-height: 90vh; 1212 overflow-y: auto; 1213} 1214 1215/* Modal Mobile Responsive - Bottom Sheet Style (< 480px) */ 1216@media (max-width: 479px) { 1217 1218 .modal, 1219 .modal-overlay { 1220 padding: 0; 1221 align-items: flex-end; 1222 } 1223 1224 .modal-content { 1225 max-width: none; 1226 max-height: 90vh; 1227 border-left: none; 1228 border-right: none; 1229 border-bottom: none; 1230 border-radius: 0; 1231 padding: 0; 1232 } 1233 1234 .modal-header { 1235 position: sticky; 1236 top: 0; 1237 background: var(--color-background); 1238 padding: var(--spacing-md); 1239 z-index: 1; 1240 } 1241 1242 .modal-body { 1243 padding: var(--spacing-md); 1244 } 1245 1246 .modal-footer { 1247 position: sticky; 1248 bottom: 0; 1249 background: var(--color-background); 1250 border-top: var(--border-width) var(--border-style, solid) var(--color-border-dark); 1251 padding: var(--spacing-md); 1252 padding-left: calc(var(--spacing-md) + var(--safe-area-inset-left)); 1253 padding-right: calc(var(--spacing-md) + var(--safe-area-inset-right)); 1254 } 1255 1256 .modal-content h2 { 1257 font-size: var(--font-size-lg); 1258 padding: var(--spacing-md); 1259 padding-bottom: 0; 1260 } 1261 1262 /* Add padding to modal description text on mobile */ 1263 .modal-content h2+p, 1264 .modal-content>p:first-of-type { 1265 padding: 0 var(--spacing-md); 1266 } 1267 1268 .modal-actions { 1269 flex-direction: column; 1270 padding: 0 var(--spacing-md); 1271 padding-bottom: var(--spacing-lg); 1272 } 1273 1274 .modal-actions .button { 1275 width: 100%; 1276 min-height: 44px; 1277 justify-content: center; 1278 } 1279 1280 .dev-notice { 1281 margin: var(--spacing-sm) var(--spacing-md); 1282 font-size: 0.85rem; 1283 border-left-width: 2px; 1284 } 1285} 1286 1287.login-modal-content { 1288 padding: var(--spacing-xl); 1289 max-width: 400px; 1290} 1291 1292/* Login Modal Mobile Responsive (< 480px) */ 1293@media (max-width: 479px) { 1294 .login-modal-content { 1295 padding: var(--spacing-md); 1296 } 1297 1298 .login-modal-content .input, 1299 .login-modal-content input { 1300 font-size: 16px; 1301 /* Prevents iOS zoom on focus */ 1302 } 1303} 1304 1305.create-content-modal, 1306.create-block-modal { 1307 max-width: 600px; 1308} 1309 1310/* Create Content/Block Modal Mobile Responsive (< 480px) */ 1311@media (max-width: 479px) { 1312 1313 .create-content-modal, 1314 .create-block-modal { 1315 max-width: none; 1316 padding: var(--spacing-md); 1317 } 1318 1319 .create-content-modal .section-types, 1320 .create-block-modal .section-types { 1321 grid-template-columns: 1fr; 1322 gap: var(--spacing-sm); 1323 } 1324 1325 .section-type { 1326 padding: var(--spacing-md); 1327 min-height: 44px; 1328 } 1329} 1330 1331.content { 1332 line-height: 1.6; 1333} 1334 1335/* Markdown/text content blocks: max-width 700px, centered in parent */ 1336.section[data-type="content"] .section-content { 1337 display: flex; 1338 flex-direction: column; 1339 align-items: center; 1340} 1341 1342.section[data-type="content"] .section-content > .content { 1343 max-width: 700px; 1344 width: 100%; 1345} 1346 1347/* Smooth appearance when content replaces loading state */ 1348.content-enter { 1349 animation: fadeIn 0.3s ease-out; 1350} 1351 1352.content h1, 1353.content h2, 1354.content h3 { 1355 margin-top: 1.5em; 1356 margin-bottom: 0.5em; 1357} 1358 1359.content p { 1360 margin-bottom: 1em; 1361} 1362 1363.config-modal-content { 1364 max-width: 800px; 1365 max-height: 90vh; 1366 overflow-y: auto; 1367} 1368 1369/* Config Modal Mobile Responsive (< 480px) */ 1370@media (max-width: 479px) { 1371 .config-modal-content { 1372 padding: var(--spacing-sm); 1373 } 1374 1375 .config-modal-content .site-config { 1376 margin: 0; 1377 padding: var(--spacing-sm); 1378 } 1379 1380 .config-modal-content .theme-colors { 1381 grid-template-columns: 1fr; 1382 } 1383 1384 .config-tabs { 1385 flex-wrap: wrap; 1386 } 1387 1388 .config-tab { 1389 flex: 1 1 calc(50% - var(--spacing-xs)); 1390 min-width: 0; 1391 text-align: center; 1392 } 1393} 1394 1395.config-modal-header { 1396 display: flex; 1397 justify-content: space-between; 1398 align-items: baseline; 1399 margin-bottom: var(--spacing-lg); 1400 padding-bottom: var(--spacing-md); 1401 border-bottom: var(--border-width) var(--border-style, solid) var(--color-border); 1402} 1403 1404.config-modal-header h2 { 1405 margin: 0; 1406} 1407 1408.config-modal-header .modal-close { 1409 width: auto; 1410 margin: 0; 1411 padding: var(--spacing-sm) var(--spacing-md); 1412 font-size: 1.5rem; 1413 line-height: 1; 1414 min-width: auto; 1415} 1416 1417.modal-content h2 { 1418 font-size: var(--font-size-lg); 1419 margin-top: 0; 1420 margin-bottom: var(--spacing-lg); 1421} 1422 1423.modal-close { 1424 display: block; 1425 width: 100%; 1426} 1427 1428/* Modal close button padding on mobile */ 1429@media (max-width: 479px) { 1430 .modal-content>.modal-close { 1431 margin-left: var(--spacing-md); 1432 margin-right: var(--spacing-md); 1433 margin-bottom: var(--spacing-lg); 1434 width: calc(100% - var(--spacing-md) * 2); 1435 } 1436} 1437 1438.login-form { 1439 display: flex; 1440 flex-direction: column; 1441 gap: var(--spacing-md); 1442 margin-bottom: 0; 1443} 1444 1445.form-group { 1446 margin-bottom: var(--spacing-lg); 1447} 1448 1449/* Form group mobile padding in modals */ 1450@media (max-width: 479px) { 1451 1452 .modal-content .form-group, 1453 .take-flower-form { 1454 padding: 0 var(--spacing-md); 1455 } 1456 1457 .login-form { 1458 padding: var(--spacing-md); 1459 } 1460} 1461 1462.form-group label { 1463 display: block; 1464 font-weight: 600; 1465 margin-bottom: var(--spacing-sm); 1466 text-transform: uppercase; 1467 font-size: 0.75rem; 1468 letter-spacing: 0.05em; 1469} 1470 1471.form-hint { 1472 display: block; 1473 margin-top: var(--spacing-xs); 1474 font-size: 0.75rem; 1475 color: var(--color-text-muted); 1476 font-style: italic; 1477} 1478 1479.upload-label { 1480 display: flex; 1481 flex-direction: column; 1482 gap: var(--spacing-xs); 1483 cursor: pointer; 1484} 1485 1486.upload-label>span:first-child { 1487 font-weight: 600; 1488 text-transform: uppercase; 1489 font-size: 0.75rem; 1490 letter-spacing: 0.05em; 1491} 1492 1493.file-input { 1494 display: none; 1495} 1496 1497.upload-hint { 1498 font-size: 0.875rem; 1499 color: var(--color-text-muted); 1500 font-weight: normal; 1501 text-transform: none; 1502 letter-spacing: normal; 1503} 1504 1505.modal-actions { 1506 display: flex; 1507 gap: var(--spacing-md); 1508 margin-top: var(--spacing-lg); 1509} 1510 1511.modal-actions .button { 1512 flex: 1; 1513} 1514 1515/* Confirmation Modal */ 1516.confirm-modal-content { 1517 max-width: 400px; 1518 text-align: center; 1519} 1520 1521.confirm-modal-content h2 { 1522 margin-bottom: var(--spacing-md); 1523} 1524 1525.confirm-modal-message { 1526 margin: 0 0 var(--spacing-lg); 1527 color: var(--color-text); 1528 line-height: 1.5; 1529} 1530 1531.confirm-modal-content .modal-actions { 1532 justify-content: center; 1533} 1534 1535.confirm-modal-content .modal-actions .button { 1536 flex: 0 1 auto; 1537 min-width: 100px; 1538} 1539 1540/* Confirmation Modal Mobile Responsive (< 480px) */ 1541@media (max-width: 479px) { 1542 .confirm-modal-content { 1543 max-width: none; 1544 padding: var(--spacing-md); 1545 } 1546 1547 .confirm-modal-content .modal-actions { 1548 flex-direction: row; 1549 gap: var(--spacing-sm); 1550 } 1551 1552 .confirm-modal-content .modal-actions .button { 1553 flex: 1; 1554 min-width: 0; 1555 min-height: 44px; 1556 } 1557} 1558 1559/* Alert Modal (single button notification) */ 1560.alert-modal-content { 1561 max-width: 400px; 1562 text-align: center; 1563} 1564 1565.alert-modal-content h2 { 1566 margin-bottom: var(--spacing-md); 1567} 1568 1569.alert-modal-message { 1570 margin: 0 0 var(--spacing-lg); 1571 color: var(--color-text); 1572 line-height: 1.5; 1573} 1574 1575.alert-modal-icon { 1576 font-size: 3rem; 1577 line-height: 1; 1578 margin-bottom: var(--spacing-md); 1579} 1580 1581.alert-modal-content.alert-success .alert-modal-icon { 1582 color: #22c55e; 1583} 1584 1585.alert-modal-content.alert-error .alert-modal-icon { 1586 color: #dc2626; 1587} 1588 1589.alert-modal-content .modal-actions { 1590 justify-content: center; 1591} 1592 1593.alert-modal-content .modal-actions .button { 1594 min-width: 120px; 1595} 1596 1597/* Alert Modal Mobile Responsive (< 480px) */ 1598@media (max-width: 479px) { 1599 .alert-modal-content { 1600 max-width: none; 1601 padding: var(--spacing-md); 1602 } 1603 1604 .alert-modal-content .modal-actions .button { 1605 min-height: 44px; 1606 } 1607} 1608 1609.section-types { 1610 display: grid; 1611 grid-template-columns: repeat(3, 1fr); 1612 gap: var(--spacing-md); 1613 margin-bottom: var(--spacing-lg); 1614 padding: var(--spacing-md); 1615} 1616 1617.section-type { 1618 display: flex; 1619 flex-direction: column; 1620 align-items: center; 1621 gap: var(--spacing-sm); 1622 padding: var(--spacing-lg); 1623 background: var(--color-background); 1624 border: var(--border-width) var(--border-style, solid) var(--color-border-dark); 1625 cursor: pointer; 1626 transition: all var(--transition); 1627 text-transform: uppercase; 1628 font-weight: 700; 1629 font-size: 0.75rem; 1630 letter-spacing: 0.05em; 1631} 1632 1633.section-type:hover { 1634 background: var(--color-text); 1635 color: var(--color-background); 1636} 1637 1638.section-type-helper { 1639 grid-column: 1 / -1; 1640 font-size: 0.75rem; 1641 color: var(--color-text-muted); 1642 text-align: center; 1643 font-style: italic; 1644 text-transform: none; 1645 font-weight: normal; 1646 margin-top: calc(var(--spacing-md) * -1); 1647 line-height: 1.5; 1648} 1649 1650.icon { 1651 font-size: 2rem; 1652} 1653 1654/* ============================================ 1655 Utilities 1656 ============================================ */ 1657 1658.loading { 1659 text-align: center; 1660 padding: var(--spacing-xl); 1661 color: var(--color-text-muted); 1662 font-weight: 600; 1663 font-size: var(--font-size-xl); 1664 text-transform: uppercase; 1665 letter-spacing: 0.1em; 1666 animation: fadeIn 0.2s ease-out; 1667} 1668 1669.error { 1670 color: #dc2626; 1671 padding: var(--spacing-lg); 1672 background: #fef2f2; 1673 border: var(--border-width) var(--border-style, solid) #dc2626; 1674 font-weight: 600; 1675} 1676 1677/* Loading and Error States */ 1678.loading-state { 1679 display: flex; 1680 flex-direction: column; 1681 align-items: center; 1682 justify-content: center; 1683 padding: var(--spacing-xl); 1684 gap: var(--spacing-md); 1685 min-height: 200px; 1686 animation: fadeIn 0.2s ease-out; 1687} 1688 1689.loading-text { 1690 margin: 0; 1691 color: var(--color-text-muted); 1692 font-weight: 600; 1693 text-transform: uppercase; 1694 letter-spacing: 0.1em; 1695 font-size: 0.875rem; 1696} 1697 1698.error-state { 1699 display: flex; 1700 flex-direction: column; 1701 align-items: center; 1702 justify-content: center; 1703 padding: var(--spacing-xl); 1704 gap: var(--spacing-md); 1705 min-height: 200px; 1706 text-align: center; 1707 background: #fef2f2; 1708 border: var(--border-width) var(--border-style, solid) #dc2626; 1709 border-radius: 4px; 1710 animation: fadeIn 0.2s ease-out; 1711} 1712 1713.error-icon { 1714 font-size: 3rem; 1715 line-height: 1; 1716} 1717 1718.error-message { 1719 margin: 0; 1720 color: #dc2626; 1721 font-weight: 600; 1722 font-size: 1.125rem; 1723} 1724 1725.error-details { 1726 margin: 0; 1727 color: var(--color-text-muted); 1728 font-size: 0.875rem; 1729 font-family: var(--font-mono); 1730} 1731 1732.button-retry { 1733 margin-top: var(--spacing-sm); 1734} 1735 1736.button-retry:disabled { 1737 opacity: 0.6; 1738 cursor: not-allowed; 1739} 1740 1741/* Loading States */ 1742.loading-state { 1743 display: flex; 1744 flex-direction: column; 1745 align-items: center; 1746 justify-content: center; 1747 gap: var(--spacing-md); 1748 padding: var(--spacing-xl); 1749 text-align: center; 1750 min-height: 120px; 1751 animation: fadeIn 0.2s ease-out; 1752} 1753 1754.loading-message { 1755 margin: 0; 1756 color: var(--color-text-muted); 1757 font-weight: 500; 1758 text-transform: uppercase; 1759 letter-spacing: 0.05em; 1760 font-size: 0.875rem; 1761} 1762 1763/* Error States */ 1764.error-state { 1765 display: flex; 1766 flex-direction: column; 1767 align-items: center; 1768 justify-content: center; 1769 gap: var(--spacing-md); 1770 padding: var(--spacing-lg); 1771 background: #fef2f2; 1772 border: var(--border-width) var(--border-style, solid) #dc2626; 1773 border-radius: 0; 1774 min-height: 120px; 1775 animation: fadeIn 0.2s ease-out; 1776} 1777 1778.error-icon { 1779 font-size: 2rem; 1780 line-height: 1; 1781} 1782 1783.error-message { 1784 margin: 0; 1785 color: #dc2626; 1786 font-weight: 600; 1787 text-align: center; 1788} 1789 1790.error-state .button { 1791 margin-top: var(--spacing-sm); 1792} 1793 1794.empty { 1795 text-align: center; 1796 padding: var(--spacing-lg); 1797 color: var(--color-text-muted); 1798} 1799 1800.homepage-view { 1801 text-align: center; 1802 padding: var(--spacing-xl); 1803 border: var(--border-width-thick) groove var(--color-border-dark); 1804 margin: auto 0; 1805 background-color: #ffffff; 1806} 1807 1808.homepage-view h2 { 1809 margin-bottom: var(--spacing-md); 1810 font-weight: 500; 1811} 1812 1813/* Homepage hero */ 1814.homepage-hero { 1815 display: flex; 1816 flex-direction: column; 1817 align-items: center; 1818 gap: var(--spacing-md); 1819} 1820 1821.homepage-hero__greeting { 1822 font-size: 1.5rem; 1823 color: #000000; 1824 margin: 0; 1825} 1826 1827.homepage-hero__heading { 1828 font-size: 1.5rem; 1829 font-weight: 600; 1830 margin: 0; 1831} 1832 1833.homepage-features { 1834 list-style: none; 1835 padding: 0; 1836 margin: var(--spacing-sm) 0 0; 1837 text-align: left; 1838 display: flex; 1839 flex-direction: column; 1840 gap: var(--spacing-sm); 1841} 1842 1843.homepage-features__item { 1844 position: relative; 1845 padding-left: 1.5em; 1846 line-height: 1.5; 1847 color: var(--color-text); 1848} 1849 1850.homepage-features__item::before { 1851 content: '\2022'; 1852 position: absolute; 1853 left: 0; 1854} 1855 1856.homepage-teaser { 1857 font-style: italic; 1858 color: var(--color-text); 1859 font-size: 0.875rem; 1860 margin: var(--spacing-md) 0 0; 1861} 1862 1863/* Homepage Mobile Responsive (Phase 10) - Extra small screens (< 480px) */ 1864@media (max-width: 479px) { 1865 .homepage-view { 1866 padding: var(--spacing-md); 1867 text-align: center; 1868 } 1869 1870 .homepage-hero__heading { 1871 font-size: 1.25rem; 1872 } 1873 1874 .homepage-hero__greeting { 1875 font-size: 1.25rem; 1876 } 1877 1878 .homepage-features { 1879 text-align: left; 1880 } 1881} 1882 1883.empty-state { 1884 text-align: center; 1885 padding: var(--spacing-xl); 1886 border: var(--border-width-extra-thick) groove var(--color-border-dark); 1887 margin: auto 0; 1888} 1889 1890.empty-state h2 { 1891 margin-bottom: var(--spacing-md); 1892} 1893 1894/* Garden preview: theme + flower + CTA when no config or empty garden */ 1895.garden-preview { 1896 display: flex; 1897 flex-direction: column; 1898 align-items: center; 1899 justify-content: center; 1900 text-align: center; 1901 padding: var(--spacing-xl); 1902 gap: var(--spacing-lg); 1903 min-height: 40vh; 1904} 1905 1906.garden-preview__flower-box { 1907 border: var(--border-width) var(--border-style) var(--color-border); 1908 padding: var(--spacing-lg); 1909 display: flex; 1910 flex-direction: column; 1911 align-items: center; 1912 justify-content: center; 1913 gap: var(--spacing-md); 1914} 1915 1916/* Liquid glass effect for flower box and flower grid items when isoline pattern is active */ 1917body.has-pattern .garden-preview__flower-box, 1918body.has-pattern .flower-grid-item { 1919 background: rgba(var(--color-background-rgb), 0.25) !important; 1920 border-radius: var(--border-radius); 1921 box-shadow: 0 4px 30px rgba(0, 0, 0, 0.1); 1922 backdrop-filter: blur(80px); 1923 -webkit-backdrop-filter: blur(80px); 1924 border: 1px solid rgba(var(--color-text-rgb), 0.1); 1925} 1926 1927body.has-pattern .flower-grid-item { 1928 margin-top: var(--spacing-sm); 1929} 1930 1931.garden-preview__heading { 1932 font-family: var(--font-heading); 1933 font-size: var(--font-size-xl); 1934 font-weight: 700; 1935 margin: 0; 1936 color: var(--color-text); 1937} 1938 1939.garden-preview__subtext { 1940 margin: 0; 1941 color: var(--color-text-muted); 1942 font-size: var(--font-size-base); 1943 max-width: 28ch; 1944} 1945 1946.garden-preview__hint { 1947 margin: 0; 1948 margin-top: var(--spacing-sm); 1949 display: flex; 1950 flex-wrap: wrap; 1951 align-items: center; 1952 justify-content: center; 1953 gap: 0.25rem 0.5rem; 1954 color: var(--color-text-muted); 1955 font-size: var(--font-size-base); 1956} 1957 1958.garden-preview__flower-box > .button { 1959 margin-top: var(--spacing-sm); 1960} 1961 1962.add-section { 1963 display: block; 1964 width: 100%; 1965 padding: var(--spacing-lg); 1966 margin: var(--spacing-md); 1967 margin-bottom: var(--spacing-lg); 1968 background: transparent; 1969 border: var(--border-width-thick) dashed var(--color-border-dark); 1970 color: var(--color-text); 1971 cursor: pointer; 1972 transition: all var(--transition); 1973 font-size: 1rem; 1974 font-weight: 700; 1975 text-transform: uppercase; 1976 letter-spacing: 0.05em; 1977 /* Account for margin in width calculation */ 1978 width: calc(100% - var(--spacing-md) * 2); 1979} 1980 1981.add-section:hover { 1982 background: var(--color-text); 1983 color: var(--color-background); 1984 border-style: solid; 1985} 1986 1987/* Save Bar - Mobile-first: full-width bottom bar, floating on desktop */ 1988.save-bar { 1989 position: fixed; 1990 bottom: 0; 1991 left: 0; 1992 right: 0; 1993 padding: var(--spacing-md); 1994 padding-bottom: calc(var(--spacing-md) + var(--safe-area-inset-bottom)); 1995 padding-left: calc(var(--spacing-md) + var(--safe-area-inset-left)); 1996 padding-right: calc(var(--spacing-md) + var(--safe-area-inset-right)); 1997 background: var(--color-surface); 1998 border-top: var(--border-width) var(--border-style, solid) var(--color-border-dark); 1999 display: flex; 2000 justify-content: center; 2001 gap: var(--spacing-md); 2002 z-index: 999; 2003} 2004 2005/* Desktop: floating save bar */ 2006@media (min-width: 768px) { 2007 .save-bar { 2008 position: fixed; 2009 bottom: var(--spacing-lg); 2010 right: var(--spacing-lg); 2011 left: auto; 2012 border: var(--border-width) var(--border-style, solid) var(--color-border-dark); 2013 padding: 0; 2014 background: var(--color-surface); 2015 } 2016} 2017 2018.save-bar .save-btn { 2019 padding: var(--spacing-md) var(--spacing-lg); 2020 font-size: 0.875rem; 2021 font-weight: 700; 2022 text-transform: uppercase; 2023 letter-spacing: 0.05em; 2024 box-shadow: 0 4px 6px rgba(0, 0, 0, 0.3); 2025 transition: all var(--transition); 2026 min-height: 44px; 2027 /* Touch target */ 2028} 2029 2030.save-bar .save-btn:hover { 2031 transform: translateY(-2px); 2032 box-shadow: 0 6px 8px rgba(0, 0, 0, 0.4); 2033} 2034 2035.save-bar .save-btn:active { 2036 transform: translateY(0); 2037 box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3); 2038} 2039 2040/* ============================================ 2041 Dev Tools (only visible on localhost) 2042 ============================================ */ 2043 2044.dev-tools { 2045 position: fixed; 2046 bottom: calc(var(--spacing-md) + var(--safe-area-inset-bottom)); 2047 left: calc(var(--spacing-md) + var(--safe-area-inset-left)); 2048 display: flex; 2049 flex-direction: column; 2050 gap: 0.5rem; 2051 z-index: 999; 2052} 2053 2054.dev-tool-button { 2055 padding: var(--spacing-md) var(--spacing-lg); 2056 color: white; 2057 border: var(--border-width) solid transparent; 2058 font-family: var(--font-body); 2059 font-size: 0.875rem; 2060 font-weight: 700; 2061 text-transform: uppercase; 2062 letter-spacing: 0.05em; 2063 cursor: pointer; 2064 transition: all var(--transition); 2065 box-shadow: 0 4px 6px rgba(0, 0, 0, 0.3); 2066} 2067 2068.dev-tool-button-backup { 2069 background: #1d4ed8; 2070 border-color: #1e40af; 2071} 2072 2073.dev-tool-button-reset { 2074 background: #dc2626; 2075 border-color: #b91c1c; 2076} 2077 2078.dev-tool-button-restore { 2079 background: #166534; 2080 border-color: #14532d; 2081} 2082 2083.dev-tool-button:hover { 2084 transform: translateY(-2px); 2085 box-shadow: 0 6px 8px rgba(0, 0, 0, 0.4); 2086} 2087 2088.dev-tool-button-backup:hover { 2089 background: #1e40af; 2090 border-color: #1e3a8a; 2091} 2092 2093.dev-tool-button-reset:hover { 2094 background: #b91c1c; 2095 border-color: #991b1b; 2096} 2097 2098.dev-tool-button-restore:hover { 2099 background: #14532d; 2100 border-color: #052e16; 2101} 2102 2103.dev-tool-button:active { 2104 transform: translateY(0); 2105 box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3); 2106} 2107 2108/* ============================================ 2109 Welcome Modal 2110 ============================================ */ 2111 2112.welcome-modal { 2113 position: fixed; 2114 inset: 0; 2115 display: flex; 2116 align-items: center; 2117 justify-content: center; 2118 background: rgba(0, 0, 0, 0.9); 2119 z-index: 2000; 2120 padding: var(--spacing-sm); 2121} 2122 2123.welcome-content { 2124 background: var(--color-background); 2125 border: var(--border-width-thick) var(--border-style, solid) var(--color-border-dark); 2126 max-width: 800px; 2127 width: 100%; 2128 max-height: 90vh; 2129 overflow-y: auto; 2130 padding: var(--spacing-lg); 2131} 2132 2133/* Welcome Modal Mobile Responsive (< 480px) */ 2134@media (max-width: 479px) { 2135 .welcome-modal { 2136 padding: 0; 2137 align-items: flex-end; 2138 } 2139 2140 .welcome-content { 2141 max-width: none; 2142 max-height: 95vh; 2143 border-left: none; 2144 border-right: none; 2145 border-bottom: none; 2146 padding: var(--spacing-md); 2147 } 2148 2149 .welcome-title { 2150 font-size: var(--font-size-lg); 2151 } 2152 2153 .welcome-actions { 2154 grid-template-columns: 1fr; 2155 gap: var(--spacing-md); 2156 } 2157 2158 .welcome-action-card { 2159 padding: var(--spacing-md); 2160 } 2161 2162 .welcome-icon { 2163 font-size: 2rem; 2164 } 2165} 2166 2167.welcome-header { 2168 margin-bottom: var(--spacing-md); 2169} 2170 2171.welcome-title { 2172 text-align: center; 2173 font-size: var(--font-size-xl); 2174 font-weight: 700; 2175 margin-bottom: var(--spacing-lg); 2176 letter-spacing: -0.05em; 2177} 2178 2179.welcome-subtitle { 2180 font-size: 1.25rem; 2181 color: var(--color-text-muted); 2182 margin: 0; 2183} 2184 2185/* Center the primary CTA in onboarding step 2 */ 2186#save-continue-btn { 2187 display: block; 2188 margin: var(--spacing-lg) auto 0; 2189} 2190 2191.welcome-actions { 2192 display: grid; 2193 grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); 2194 gap: var(--spacing-lg); 2195 margin-bottom: var(--spacing-xl); 2196} 2197 2198.welcome-action-card { 2199 display: flex; 2200 flex-direction: column; 2201 align-items: center; 2202 gap: var(--spacing-md); 2203 padding: var(--spacing-xl); 2204 background: var(--color-background); 2205 border: var(--border-width) var(--border-style, solid) var(--color-border-dark); 2206 cursor: pointer; 2207 transition: all var(--transition); 2208 text-align: center; 2209 font-family: inherit; 2210 font-size: inherit; 2211} 2212 2213.welcome-action-card:hover { 2214 background: var(--color-text); 2215 color: var(--color-background); 2216 transform: translateY(-2px); 2217 border-width: var(--border-width-thick); 2218} 2219 2220.welcome-icon { 2221 font-size: 3rem; 2222 line-height: 1; 2223} 2224 2225.welcome-card-content h3 { 2226 margin: 0 0 var(--spacing-sm); 2227 font-size: var(--font-size-base); 2228 letter-spacing: 0.05em; 2229} 2230 2231.welcome-card-content p { 2232 margin: 0; 2233 font-size: 0.875rem; 2234 color: var(--color-text-muted); 2235 line-height: 1.5; 2236} 2237 2238.welcome-action-card:hover .welcome-card-content p { 2239 color: var(--color-background); 2240} 2241 2242.welcome-footer { 2243 text-align: center; 2244 padding-top: var(--spacing-lg); 2245 border-top: var(--border-width) var(--border-style, solid) var(--color-border); 2246} 2247 2248.welcome-loading, 2249.welcome-message { 2250 text-align: center; 2251 padding: var(--spacing-xl); 2252 min-height: 200px; 2253 display: flex; 2254 flex-direction: column; 2255 align-items: center; 2256 justify-content: center; 2257 gap: var(--spacing-lg); 2258} 2259 2260.spinner, 2261.loading-spinner { 2262 width: 40px; 2263 height: 40px; 2264 border: var(--border-width-thick) var(--border-style, solid) var(--color-border); 2265 border-top-color: var(--color-text); 2266 border-radius: 50%; 2267 animation: spin 0.8s linear infinite; 2268} 2269 2270@keyframes spin { 2271 to { 2272 transform: rotate(360deg); 2273 } 2274} 2275 2276@keyframes fadeIn { 2277 from { 2278 opacity: 0; 2279 } 2280 2281 to { 2282 opacity: 1; 2283 } 2284} 2285 2286/* Share Modal Styles */ 2287.share-modal .share-modal-body { 2288 min-height: 200px; 2289} 2290 2291.share-modal .share-preview-loading { 2292 display: flex; 2293 flex-direction: column; 2294 align-items: center; 2295 justify-content: center; 2296 gap: var(--spacing-md); 2297 padding: var(--spacing-xl); 2298 text-align: center; 2299} 2300 2301.share-modal .share-preview-loading p { 2302 margin: 0; 2303 color: var(--color-text-muted); 2304 font-weight: 600; 2305 text-transform: uppercase; 2306 letter-spacing: 0.05em; 2307 font-size: 0.875rem; 2308} 2309 2310.share-modal .share-preview img { 2311 display: block; 2312 max-width: 100%; 2313 border: 2px solid var(--color-border); 2314 border-radius: var(--radius-md); 2315 box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); 2316} 2317 2318.share-modal .share-preview-hint { 2319 margin-top: var(--spacing-md); 2320 color: var(--color-text-muted); 2321 font-size: 0.9em; 2322} 2323 2324.share-modal .share-post-text { 2325 margin-top: var(--spacing-lg); 2326} 2327 2328.share-modal .share-post-text label { 2329 display: block; 2330 font-weight: 600; 2331 margin-bottom: var(--spacing-xs); 2332 font-size: 0.875rem; 2333} 2334 2335.share-modal .share-post-text-controls { 2336 display: flex; 2337 flex-direction: column; 2338 gap: var(--spacing-xs); 2339} 2340 2341.share-modal .share-post-text-input { 2342 width: 100%; 2343 resize: vertical; 2344 min-height: 4em; 2345} 2346 2347.share-modal .share-post-text-meta { 2348 display: flex; 2349 align-items: center; 2350 justify-content: end; 2351 gap: var(--spacing-sm); 2352 font-size: 0.8rem; 2353 color: var(--color-text-muted); 2354 padding-right: var(--spacing-sm); 2355} 2356 2357.share-modal .share-post-text-count.over-limit { 2358 color: var(--error-color); 2359 font-weight: 600; 2360} 2361 2362.share-modal .share-post-text-reset { 2363 margin-left: auto; 2364 padding: 0 var(--spacing-xs); 2365 font-size: 0.75rem; 2366 background: none; 2367 border: none; 2368 color: var(--color-link); 2369 cursor: pointer; 2370 text-decoration: underline; 2371} 2372 2373.share-modal .share-post-text-reset:hover { 2374 color: var(--color-link-hover); 2375} 2376 2377/* Share modal mobile padding */ 2378@media (max-width: 479px) { 2379 2380 .share-modal .share-preview, 2381 .share-modal .share-preview-hint, 2382 .share-modal .share-post-text { 2383 padding-left: var(--spacing-md); 2384 padding-right: var(--spacing-md); 2385 } 2386} 2387 2388.share-modal .share-error, 2389.share-modal .share-success { 2390 padding: var(--spacing-lg); 2391} 2392 2393.welcome-selector { 2394 max-width: 600px; 2395 margin: 0 auto; 2396} 2397 2398.welcome-selector h2 { 2399 margin-bottom: var(--spacing-sm); 2400} 2401 2402.welcome-selector p { 2403 color: var(--color-text-muted); 2404 margin-bottom: var(--spacing-lg); 2405} 2406 2407.collection-list, 2408.record-list, 2409.post-list, 2410.template-list { 2411 display: flex; 2412 flex-direction: column; 2413 gap: var(--spacing-sm); 2414 margin-bottom: var(--spacing-lg); 2415 max-height: 400px; 2416 overflow-y: auto; 2417 overflow-x: hidden; 2418 padding: var(--spacing-md); 2419} 2420 2421.collection-item, 2422.record-item, 2423.post-item { 2424 display: flex; 2425 gap: var(--spacing-md); 2426 padding: var(--spacing-md); 2427 background: var(--color-surface); 2428 border: var(--border-width) var(--border-style, solid) var(--color-border); 2429 cursor: pointer; 2430 transition: all var(--transition); 2431 font-family: inherit; 2432 font-size: inherit; 2433 text-align: left; 2434 min-width: 0; 2435 max-width: 100%; 2436} 2437 2438.collection-item, 2439.record-item { 2440 align-items: center; 2441} 2442 2443.post-item { 2444 align-items: flex-start; 2445} 2446 2447.collection-item:hover, 2448.record-item:hover, 2449.post-item:hover { 2450 background: var(--color-text); 2451 color: var(--color-background); 2452 border-color: var(--color-border-dark); 2453} 2454 2455.collection-name, 2456.record-title { 2457 flex: 1; 2458 font-weight: 600; 2459 word-break: break-word; 2460} 2461 2462.collection-arrow { 2463 font-size: 1.25rem; 2464 opacity: 0.5; 2465} 2466 2467.collection-item:hover .collection-arrow { 2468 opacity: 1; 2469} 2470 2471.record-item input[type="checkbox"], 2472.post-item input[type="checkbox"] { 2473 width: 20px; 2474 height: 20px; 2475 cursor: pointer; 2476 accent-color: var(--color-text); 2477} 2478 2479.post-content { 2480 flex: 1; 2481 display: flex; 2482 flex-direction: column; 2483 gap: var(--spacing-xs); 2484 min-width: 0; 2485} 2486 2487.post-text { 2488 margin: 0; 2489 line-height: 1.5; 2490 display: -webkit-box; 2491 -webkit-line-clamp: 3; 2492 -webkit-box-orient: vertical; 2493 overflow: hidden; 2494} 2495 2496.post-date { 2497 font-size: 0.75rem; 2498 color: var(--color-text-muted); 2499 text-transform: uppercase; 2500 letter-spacing: 0.05em; 2501} 2502 2503.post-item:hover .post-date { 2504 color: var(--color-background); 2505} 2506 2507.template-card { 2508 padding: var(--spacing-lg); 2509 background: var(--color-surface); 2510 border: var(--border-width) var(--border-style, solid) var(--color-border-dark); 2511 cursor: pointer; 2512 transition: all var(--transition); 2513 text-align: left; 2514 font-family: inherit; 2515 font-size: inherit; 2516} 2517 2518.template-card:hover { 2519 background: var(--color-text); 2520 color: var(--color-background); 2521 border-width: var(--border-width-thick); 2522} 2523 2524.template-card h3 { 2525 margin: 0 0 var(--spacing-xs); 2526 font-size: var(--font-size-base); 2527 letter-spacing: 0.05em; 2528} 2529 2530.template-card p { 2531 margin: 0; 2532 font-size: 0.875rem; 2533 color: var(--color-text-muted); 2534} 2535 2536.template-card:hover p { 2537 color: var(--color-background); 2538} 2539 2540.selector-actions { 2541 display: flex; 2542 gap: var(--spacing-md); 2543 justify-content: flex-end; 2544} 2545 2546.bsky-user-search { 2547 display: flex; 2548 gap: var(--spacing-sm); 2549 align-items: stretch; 2550 margin-bottom: var(--spacing-md); 2551} 2552 2553.bsky-user-search .input { 2554 flex: 1; 2555 min-width: 0; 2556} 2557 2558.bsky-user-search .button { 2559 white-space: nowrap; 2560} 2561 2562/* Post selector mobile: add side padding to elements that lose it when modal-content padding is 0 */ 2563@media (max-width: 479px) { 2564 .modal-content .welcome-selector p { 2565 padding-left: var(--spacing-md); 2566 padding-right: var(--spacing-md); 2567 } 2568 2569 .modal-content .bsky-user-search { 2570 flex-direction: column; 2571 align-items: stretch; 2572 padding: 0 var(--spacing-md); 2573 } 2574 2575 .modal-content .bsky-user-search .button { 2576 width: 100%; 2577 min-height: 44px; 2578 justify-content: center; 2579 } 2580 2581 .modal-content .selector-actions { 2582 padding: 0 var(--spacing-md) var(--spacing-lg); 2583 } 2584 2585 .modal-content .selector-actions .button { 2586 width: 100%; 2587 min-height: 44px; 2588 justify-content: center; 2589 } 2590} 2591 2592/* ============================================ 2593 Layout Styles 2594 ============================================ */ 2595 2596/* Card Layout */ 2597.layout-card { 2598 display: flex; 2599 flex-direction: column; 2600 background: var(--color-surface); 2601 border: var(--border-width) var(--border-style, solid) var(--color-border-dark); 2602 transition: all var(--transition); 2603 overflow: hidden; 2604} 2605 2606.layout-card:hover { 2607 border-width: var(--border-width-thick); 2608} 2609 2610.card-image { 2611 width: 100%; 2612 height: auto; 2613 display: block; 2614 border-bottom: var(--border-width) var(--border-style, solid) var(--color-border-dark); 2615} 2616 2617.card-body { 2618 padding: var(--spacing-lg); 2619 display: flex; 2620 flex-direction: column; 2621 gap: var(--spacing-sm); 2622 flex: 1; 2623} 2624 2625.card-title { 2626 margin: 0; 2627 font-size: var(--font-size-base); 2628 font-weight: 700; 2629 color: var(--color-text); 2630 letter-spacing: -0.02em; 2631} 2632 2633.card-content { 2634 margin: 0; 2635 color: var(--color-text); 2636 line-height: 1.6; 2637 flex: 1; 2638} 2639 2640.card-date { 2641 font-size: 0.75rem; 2642 color: var(--color-text-muted); 2643 text-transform: uppercase; 2644 letter-spacing: 0.05em; 2645} 2646 2647/* Card Layout Mobile Responsive (< 480px) */ 2648@media (max-width: 479px) { 2649 .layout-card { 2650 padding: var(--spacing-sm); 2651 } 2652 2653 .card-body { 2654 padding: var(--spacing-md); 2655 } 2656 2657 .card-title { 2658 font-size: var(--font-size-sm); 2659 } 2660 2661 .card-content { 2662 font-size: 0.9rem; 2663 } 2664} 2665 2666.layout-profile { 2667 display: flex; 2668 flex-direction: column; 2669 gap: 0; 2670} 2671 2672.profile-banner { 2673 width: 100%; 2674 height: 150px; 2675 overflow: hidden; 2676 border-radius: var(--radius-md) var(--radius-md) 0 0; 2677 background: var(--color-background-alt, var(--color-border)); 2678} 2679 2680.profile-banner-image { 2681 width: 100%; 2682 height: 100%; 2683 object-fit: cover; 2684} 2685 2686.profile-body { 2687 display: flex; 2688 gap: var(--spacing-lg); 2689 align-items: flex-start; 2690 padding: var(--spacing-md); 2691} 2692 2693/* Pull avatar up to overlap banner when banner exists */ 2694.profile-banner+.profile-body { 2695 margin-top: -40px; 2696} 2697 2698.profile-banner+.profile-body .profile-avatar { 2699 border: 3px solid var(--color-background); 2700 box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); 2701} 2702 2703.profile-avatar { 2704 width: 80px; 2705 height: 80px; 2706 border-radius: 50%; 2707 object-fit: cover; 2708 border: var(--border-width) var(--border-style, solid) var(--color-border-dark); 2709 flex-shrink: 0; 2710 background: var(--color-background); 2711} 2712 2713.profile-info { 2714 flex: 1; 2715 padding-top: var(--spacing-sm); 2716} 2717 2718/* When avatar overlaps banner, add padding to info to align text */ 2719.profile-banner+.profile-body .profile-info { 2720 padding-top: calc(40px + var(--spacing-sm)); 2721} 2722 2723.profile-name { 2724 margin: 0 0 var(--spacing-sm); 2725} 2726 2727.profile-bio { 2728 margin: 0; 2729 color: var(--color-text-muted); 2730 line-height: 1.6; 2731 white-space: pre-wrap; 2732} 2733 2734/* Profile Layout Mobile Responsive (< 480px) */ 2735@media (max-width: 479px) { 2736 .layout-profile { 2737 padding: var(--spacing-sm); 2738 } 2739 2740 .profile-banner { 2741 height: 120px; 2742 } 2743 2744 .profile-avatar { 2745 width: 60px; 2746 height: 60px; 2747 } 2748 2749 .profile-body { 2750 gap: var(--spacing-md); 2751 padding: var(--spacing-sm); 2752 } 2753 2754 /* Adjust overlap when banner exists */ 2755 .profile-banner+.profile-body { 2756 margin-top: -30px; 2757 } 2758 2759 .profile-banner+.profile-body .profile-info { 2760 padding-top: calc(30px + var(--spacing-xs)); 2761 } 2762 2763 .profile-name { 2764 font-size: var(--font-size-lg); 2765 } 2766 2767 .profile-bio { 2768 font-size: 0.9rem; 2769 } 2770} 2771 2772/* Post Layout */ 2773.layout-post { 2774 padding: var(--spacing-lg); 2775 border: var(--border-width) var(--border-style, solid) var(--color-border-dark); 2776 background: var(--color-background); 2777 max-width: 800px; 2778 margin: 0 auto; 2779} 2780 2781.post-title { 2782 margin: 0 0 var(--spacing-md); 2783 font-size: var(--font-size-xl); 2784 font-weight: 700; 2785 line-height: 1.3; 2786} 2787 2788.post-meta { 2789 display: flex; 2790 align-items: center; 2791 gap: var(--spacing-md); 2792 margin-bottom: var(--spacing-md); 2793 font-size: 0.875rem; 2794 color: var(--color-text-muted); 2795} 2796 2797.post-avatar { 2798 width: 20px; 2799 height: 20px; 2800 border-radius: 50%; 2801 flex-shrink: 0; 2802 border: var(--border-width) var(--border-style, solid) var(--color-border-dark); 2803} 2804 2805.post-meta time { 2806 color: var(--color-text-muted); 2807} 2808 2809.post-tags { 2810 display: flex; 2811 flex-wrap: wrap; 2812 gap: var(--spacing-xs); 2813} 2814 2815.tag { 2816 padding: 0.25rem 0.5rem; 2817 background: var(--color-background); 2818 border: var(--border-width) var(--border-style, solid) var(--color-border-dark); 2819 color: var(--color-text); 2820 font-size: 0.75rem; 2821 text-transform: uppercase; 2822 letter-spacing: 0.05em; 2823} 2824 2825.post-image { 2826 width: 100%; 2827 height: auto; 2828 margin: var(--spacing-md) 0; 2829 border: var(--border-width) var(--border-style, solid) var(--color-border-dark); 2830} 2831 2832/* Multi-image grid layouts for posts */ 2833.post-images { 2834 display: grid; 2835 gap: var(--spacing-sm); 2836 margin: var(--spacing-md) 0; 2837} 2838 2839.post-images-single { 2840 grid-template-columns: 1fr; 2841} 2842 2843.post-images-two { 2844 grid-template-columns: repeat(2, 1fr); 2845} 2846 2847.post-images-three { 2848 grid-template-columns: repeat(3, 1fr); 2849} 2850 2851.post-images-grid { 2852 grid-template-columns: repeat(2, 1fr); 2853} 2854 2855.post-images .post-image { 2856 width: 100%; 2857 height: auto; 2858 margin: 0; 2859 object-fit: cover; 2860 aspect-ratio: 1; 2861} 2862 2863.post-images-single .post-image { 2864 aspect-ratio: auto; 2865 max-height: 500px; 2866 object-fit: contain; 2867} 2868 2869@media (max-width: 640px) { 2870 .post-images-three { 2871 grid-template-columns: repeat(2, 1fr); 2872 } 2873 2874 .post-images-three .post-image:last-child:nth-child(odd) { 2875 grid-column: span 2; 2876 } 2877} 2878 2879/* Post Layout Mobile Responsive (< 480px) */ 2880@media (max-width: 479px) { 2881 .layout-post { 2882 padding: var(--spacing-sm); 2883 } 2884 2885 .post-title { 2886 font-size: var(--font-size-lg); 2887 } 2888 2889 .post-images-two { 2890 grid-template-columns: 1fr; 2891 } 2892 2893 .post-meta { 2894 flex-wrap: wrap; 2895 gap: var(--spacing-xs); 2896 } 2897 2898 .post-tags { 2899 width: 100%; 2900 margin-top: var(--spacing-xs); 2901 } 2902} 2903 2904.layout-post .post-content { 2905 margin: var(--spacing-md) 0 0; 2906 line-height: 1.7; 2907} 2908 2909.layout-post .post-content p { 2910 margin: 0 0 var(--spacing-md); 2911} 2912 2913.layout-post .post-content p:last-child { 2914 margin-bottom: 0; 2915} 2916 2917/* ============================================ 2918 Line Length Control (Phase 7) 2919 ============================================ */ 2920 2921/* Limit line length for optimal readability */ 2922.layout-post .post-content, 2923.layout-card .card-content, 2924.modal-body p { 2925 max-width: 65ch; 2926} 2927 2928/* Remove max-width constraint on small screens where space is limited */ 2929@media (max-width: 479px) { 2930 2931 .layout-post .post-content, 2932 .layout-card .card-content { 2933 max-width: none; 2934 } 2935} 2936 2937.card-date-link, 2938.post-date-link { 2939 text-decoration: none; 2940 color: inherit; 2941 transition: opacity var(--transition); 2942} 2943 2944.card-date-link:hover, 2945.post-date-link:hover { 2946 opacity: 0.7; 2947 text-decoration: underline; 2948} 2949 2950.card-date-link time, 2951.post-date-link time { 2952 display: inline; 2953} 2954 2955.post-link-back { 2956 display: block; 2957 font-size: 0.75rem; 2958 color: var(--color-text-muted); 2959 text-decoration: none; 2960 margin-top: var(--spacing-md); 2961 transition: opacity var(--transition); 2962} 2963 2964.post-link-back:hover { 2965 opacity: 0.7; 2966 text-decoration: underline; 2967} 2968 2969/* Image Layout */ 2970.layout-image { 2971 display: flex; 2972 flex-direction: column; 2973 gap: var(--spacing-md); 2974} 2975 2976.image-main { 2977 width: 100%; 2978 height: auto; 2979 display: block; 2980 border: var(--border-width) var(--border-style, solid) var(--color-border-dark); 2981} 2982 2983/* Image Gallery - Mobile-first responsive grid */ 2984.image-gallery { 2985 display: grid; 2986 gap: var(--spacing-sm); 2987 grid-template-columns: repeat(2, 1fr); 2988 /* Base: 2 columns on mobile */ 2989} 2990 2991@media (min-width: 480px) { 2992 .image-gallery { 2993 grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); 2994 } 2995} 2996 2997@media (min-width: 768px) { 2998 .image-gallery { 2999 grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); 3000 gap: var(--spacing-md); 3001 } 3002} 3003 3004.image-gallery img { 3005 width: 100%; 3006 height: auto; 3007 display: block; 3008 border: var(--border-width) var(--border-style, solid) var(--color-border-dark); 3009} 3010 3011.image-caption { 3012 color: var(--color-text); 3013 font-size: 0.875rem; 3014 text-align: center; 3015 padding: var(--spacing-sm); 3016} 3017 3018/* Link Layout */ 3019.layout-link { 3020 display: flex; 3021 gap: var(--spacing-md); 3022 padding: var(--spacing-md); 3023 border: var(--border-width) var(--border-style, solid) var(--color-border-dark); 3024 background: var(--color-surface); 3025 text-decoration: none; 3026 color: var(--color-text); 3027 transition: all var(--transition); 3028} 3029 3030.layout-link:hover { 3031 border-width: var(--border-width-thick); 3032 background: var(--color-background); 3033} 3034 3035.link-image { 3036 width: 120px; 3037 height: 120px; 3038 object-fit: cover; 3039 flex-shrink: 0; 3040 border: var(--border-width) var(--border-style, solid) var(--color-border-dark); 3041} 3042 3043.link-body { 3044 flex: 1; 3045 display: flex; 3046 flex-direction: column; 3047 gap: var(--spacing-xs); 3048} 3049 3050.link-title { 3051 font-weight: 600; 3052 color: var(--color-text); 3053} 3054 3055.link-description { 3056 font-size: 0.875rem; 3057 color: var(--color-text-muted); 3058} 3059 3060.link-url { 3061 font-size: 0.75rem; 3062 color: var(--color-text-muted); 3063 font-family: var(--font-mono); 3064} 3065 3066/* Link Layout Mobile Responsive (< 480px) */ 3067@media (max-width: 479px) { 3068 .layout-link { 3069 flex-direction: column; 3070 } 3071 3072 .link-image { 3073 width: 100%; 3074 max-width: none; 3075 height: auto; 3076 aspect-ratio: 16/9; 3077 } 3078 3079 .link-body { 3080 padding: var(--spacing-sm); 3081 } 3082 3083 .link-title { 3084 font-size: 1rem; 3085 } 3086 3087 .link-description { 3088 font-size: 0.85rem; 3089 } 3090} 3091 3092/* Links Layout */ 3093.layout-links { 3094 display: flex; 3095 flex-direction: column; 3096 gap: var(--spacing-sm); 3097} 3098 3099.links-item { 3100 display: flex; 3101 align-items: center; 3102 gap: var(--spacing-sm); 3103 padding: var(--spacing-md); 3104 border: var(--border-width) var(--border-style, solid) var(--color-border-dark); 3105 background: var(--color-surface); 3106 text-decoration: none; 3107 color: var(--color-text); 3108 transition: all var(--transition); 3109} 3110 3111.links-item:hover { 3112 background: var(--color-text); 3113 color: var(--color-background); 3114 border-width: var(--border-width-thick); 3115} 3116 3117.links-icon { 3118 font-size: 1.25rem; 3119} 3120 3121.links-title { 3122 flex: 1; 3123 font-weight: 600; 3124} 3125 3126/* Smoke Signal Events Layout */ 3127.layout-smoke-signal { 3128 display: flex; 3129 flex-direction: column; 3130 gap: var(--spacing-lg); 3131} 3132 3133.smoke-signal-event { 3134 border: var(--border-width) var(--border-style, solid) var(--color-border-dark); 3135 background: var(--color-surface); 3136 padding: var(--spacing-lg); 3137 position: relative; 3138 transition: all var(--transition); 3139} 3140 3141.smoke-signal-event:hover { 3142 border-width: var(--border-width-thick); 3143 box-shadow: var(--shadow-elevated); 3144} 3145 3146.event-type-badge { 3147 display: inline-block; 3148 padding: 0.25rem 0.75rem; 3149 font-size: 0.75rem; 3150 font-weight: 700; 3151 text-transform: uppercase; 3152 letter-spacing: 0.05em; 3153 margin-bottom: var(--spacing-md); 3154 border: var(--border-width) var(--border-style, solid) var(--color-border-dark); 3155} 3156 3157.event-hosting .event-type-badge { 3158 background: var(--color-primary, #000); 3159 color: var(--color-background, #fff); 3160} 3161 3162.event-attending .event-type-badge { 3163 background: var(--color-surface, #f8f9fa); 3164 color: var(--color-text, #000); 3165} 3166 3167.event-image { 3168 margin-bottom: var(--spacing-md); 3169} 3170 3171.event-image img { 3172 width: 100%; 3173 height: auto; 3174 max-height: 300px; 3175 object-fit: cover; 3176 border: var(--border-width) var(--border-style, solid) var(--color-border-dark); 3177} 3178 3179.event-content { 3180 display: flex; 3181 flex-direction: column; 3182 gap: var(--spacing-sm); 3183} 3184 3185.event-title { 3186 font-size: var(--font-size-lg); 3187 font-weight: 700; 3188 margin: 0; 3189 letter-spacing: -0.02em; 3190} 3191 3192.event-title a { 3193 color: inherit; 3194 text-decoration: none; 3195} 3196 3197.event-title a:hover { 3198 text-decoration: underline; 3199} 3200 3201.event-date { 3202 font-size: 0.875rem; 3203 color: var(--color-text-muted, #6b7280); 3204 font-family: var(--font-mono); 3205} 3206 3207.event-date-relative { 3208 color: var(--color-text-muted, #999); 3209 font-weight: 400; 3210} 3211 3212.event-location { 3213 font-size: 0.875rem; 3214 color: var(--color-text); 3215 margin-top: var(--spacing-xs); 3216} 3217 3218.event-description { 3219 font-size: 1rem; 3220 line-height: 1.6; 3221 color: var(--color-text); 3222 margin-top: var(--spacing-sm); 3223 white-space: pre-wrap; 3224} 3225 3226/* Standard.site Long-Form Publishing Layout */ 3227.layout-leaflet { 3228 display: flex; 3229 flex-direction: column; 3230 gap: var(--spacing-xl); 3231} 3232 3233.leaflet-article { 3234 width: 100%; 3235 max-width: 100%; 3236 padding: var(--spacing-lg); 3237} 3238 3239.leaflet-badge { 3240 display: inline-block; 3241 padding: 0.25rem 0.75rem; 3242 font-size: 0.75rem; 3243 font-weight: 700; 3244 text-transform: uppercase; 3245 letter-spacing: 0.05em; 3246 margin-bottom: var(--spacing-md); 3247 border: var(--border-width) var(--border-style, solid) var(--color-border-dark); 3248 background: var(--color-primary, #000); 3249 color: var(--color-background, #fff); 3250} 3251 3252.leaflet-header { 3253 margin-bottom: var(--spacing-lg); 3254 border-bottom: var(--border-width) var(--border-style, solid) var(--color-border-dark); 3255 padding-bottom: var(--spacing-md); 3256} 3257 3258.leaflet-title { 3259 font-size: var(--font-size-xl); 3260 font-weight: 700; 3261 margin: 0 0 var(--spacing-md); 3262 line-height: 1.2; 3263 letter-spacing: -0.02em; 3264} 3265 3266.leaflet-title a { 3267 color: inherit; 3268 text-decoration: none; 3269} 3270 3271.leaflet-title a:hover { 3272 text-decoration: underline; 3273} 3274 3275.leaflet-meta { 3276 display: flex; 3277 flex-wrap: wrap; 3278 gap: var(--spacing-md); 3279 align-items: center; 3280 margin-top: var(--spacing-sm); 3281} 3282 3283.leaflet-date { 3284 font-size: 0.875rem; 3285 color: var(--color-text-muted); 3286 font-family: var(--font-mono); 3287} 3288 3289.leaflet-tags { 3290 display: flex; 3291 flex-wrap: wrap; 3292 gap: var(--spacing-xs); 3293} 3294 3295.leaflet-tag { 3296 font-size: 0.75rem; 3297 padding: 0.25rem 0.5rem; 3298 background: var(--color-background); 3299 border: var(--border-width) var(--border-style, solid) var(--color-border-dark); 3300 border-radius: 0.25rem; 3301 color: var(--color-text-muted); 3302} 3303 3304.leaflet-image { 3305 margin: var(--spacing-xl) 0; 3306} 3307 3308.leaflet-image img { 3309 width: 100%; 3310 height: auto; 3311 max-height: 600px; 3312 object-fit: cover; 3313 border: var(--border-width) var(--border-style, solid) var(--color-border-dark); 3314} 3315 3316.leaflet-subheader { 3317 font-size: 1.125rem; 3318 font-weight: 500; 3319 line-height: 1.5; 3320 color: var(--color-text-muted); 3321 margin: var(--spacing-md) 0 0; 3322} 3323 3324.leaflet-content { 3325 font-size: 1.125rem; 3326 line-height: 1.8; 3327 margin-top: var(--spacing-lg); 3328 color: var(--color-text); 3329} 3330 3331.leaflet-content p { 3332 margin-bottom: var(--spacing-md); 3333} 3334 3335.leaflet-content h2, 3336.leaflet-content h3, 3337.leaflet-content h4 { 3338 margin-top: var(--spacing-lg); 3339 margin-bottom: var(--spacing-md); 3340 font-weight: 700; 3341 line-height: 1.3; 3342} 3343 3344.leaflet-content h2 { 3345 font-size: var(--font-size-xl); 3346} 3347 3348.leaflet-content h3 { 3349 font-size: var(--font-size-lg); 3350} 3351 3352.leaflet-content h4 { 3353 font-size: var(--font-size-base); 3354} 3355 3356.leaflet-content ul, 3357.leaflet-content ol { 3358 margin: var(--spacing-md) 0; 3359 padding-left: var(--spacing-lg); 3360} 3361 3362.leaflet-content li { 3363 margin-bottom: var(--spacing-xs); 3364} 3365 3366.leaflet-content blockquote { 3367 margin: var(--spacing-lg) 0; 3368 padding: var(--spacing-md); 3369 border-left: 4px solid var(--color-border-dark); 3370 background: var(--color-background); 3371 font-style: italic; 3372} 3373 3374.leaflet-content code { 3375 font-family: var(--font-mono); 3376 font-size: 0.9em; 3377 padding: 0.125rem 0.25rem; 3378 background: var(--color-background); 3379 border: var(--border-width) var(--border-style, solid) var(--color-border-dark); 3380} 3381 3382.leaflet-content pre { 3383 margin: var(--spacing-md) 0; 3384 padding: var(--spacing-md); 3385 background: var(--color-background); 3386 border: var(--border-width) var(--border-style, solid) var(--color-border-dark); 3387 overflow-x: auto; 3388} 3389 3390.leaflet-content pre code { 3391 display: block; 3392 padding: 0; 3393 background: none; 3394 border: none; 3395} 3396 3397.leaflet-content a { 3398 color: var(--color-primary); 3399 text-decoration: underline; 3400 text-decoration-thickness: 1px; 3401} 3402 3403.leaflet-content a:hover { 3404 text-decoration-thickness: 2px; 3405} 3406 3407.leaflet-link-back { 3408 margin-top: var(--spacing-xl); 3409 padding-top: var(--spacing-md); 3410 border-top: var(--border-width) var(--border-style, solid) var(--color-border-dark); 3411 text-align: center; 3412} 3413 3414.leaflet-link-back a { 3415 color: var(--color-text-muted); 3416 text-decoration: none; 3417 font-size: 0.875rem; 3418 font-family: var(--font-mono); 3419} 3420 3421.leaflet-link-back a:hover { 3422 color: var(--color-text); 3423 text-decoration: underline; 3424} 3425 3426.event-description { 3427 font-size: 1rem; 3428 line-height: 1.6; 3429 color: var(--color-text); 3430 margin-top: var(--spacing-sm); 3431 white-space: pre-wrap; 3432} 3433 3434/* List Layout */ 3435.layout-list { 3436 list-style: none; 3437 padding: 0; 3438 margin: 0; 3439 display: flex; 3440 flex-direction: column; 3441 gap: var(--spacing-sm); 3442} 3443 3444.list-item { 3445 padding: var(--spacing-md); 3446 border: var(--border-width) var(--border-style, solid) var(--color-border-dark); 3447 background: var(--color-surface); 3448 color: var(--color-text); 3449} 3450 3451/* ============================================ 3452 Responsive 3453 ============================================ */ 3454 3455@media (max-width: 640px) { 3456 .main { 3457 padding: var(--spacing-sm) var(--spacing-md); 3458 } 3459 3460 .garden-preview { 3461 padding: var(--spacing-md) var(--spacing-lg); 3462 } 3463 3464 /* .record-grid now uses mobile-first approach - see Grid Systems section */ 3465 3466 .section-types { 3467 grid-template-columns: 1fr; 3468 } 3469} 3470 3471/* ============================================ 3472 Garden Config Editor 3473 ============================================ */ 3474 3475.site-config { 3476 border: var(--border-width-thick) var(--border-style, solid) var(--color-border-dark); 3477 margin: var(--spacing-lg); 3478 background: var(--color-surface); 3479} 3480 3481.config-modal-content .site-config { 3482 border: none; 3483 margin: 0; 3484 background: transparent; 3485} 3486 3487.config-modal-content .site-config-header { 3488 display: none; 3489} 3490 3491.site-config-header { 3492 padding: var(--spacing-md) var(--spacing-lg); 3493 border-bottom: var(--border-width) var(--border-style, solid) var(--color-border-dark); 3494 background: var(--color-background); 3495} 3496 3497.site-config-header h3 { 3498 margin: 0; 3499 font-size: var(--font-size-sm); 3500 letter-spacing: 0.05em; 3501} 3502 3503.site-config-content { 3504 display: flex; 3505 flex-direction: column; 3506 gap: var(--spacing-lg); 3507 background: var(--color-background); 3508} 3509 3510.site-config-section { 3511 display: flex; 3512 flex-direction: column; 3513 gap: var(--spacing-sm); 3514} 3515 3516.label { 3517 display: block; 3518 font-weight: 600; 3519 text-transform: uppercase; 3520 font-size: 0.75rem; 3521 letter-spacing: 0.05em; 3522 color: var(--color-text); 3523} 3524 3525.label-small { 3526 display: block; 3527 font-weight: 500; 3528 font-size: 0.75rem; 3529 color: var(--color-text-muted); 3530 margin-bottom: var(--spacing-xs); 3531} 3532 3533.theme-colors { 3534 display: grid; 3535 grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); 3536 gap: var(--spacing-md); 3537} 3538 3539.theme-color-group { 3540 display: flex; 3541 flex-direction: column; 3542 gap: var(--spacing-xs); 3543} 3544 3545.color-input { 3546 width: 100%; 3547 height: 40px; 3548 border: var(--border-width) var(--border-style, solid) var(--color-border-dark); 3549 background: var(--color-background); 3550 cursor: pointer; 3551 padding: 0; 3552} 3553 3554.color-input::-webkit-color-swatch-wrapper { 3555 padding: 0; 3556} 3557 3558.color-input::-webkit-color-swatch { 3559 border: none; 3560 border-radius: 0; 3561} 3562 3563.input-small { 3564 font-size: 0.875rem; 3565 padding: var(--spacing-sm); 3566} 3567 3568.textarea { 3569 resize: vertical; 3570 min-height: 120px; 3571 font-family: var(--font-mono); 3572 font-size: 0.875rem; 3573} 3574 3575/* ============================================ 3576 Notifications - Mobile-first 3577 ============================================ */ 3578 3579.notification { 3580 position: fixed; 3581 /* Mobile: full-width with spacing (no save bar by default) */ 3582 bottom: calc(var(--spacing-md) + var(--safe-area-inset-bottom)); 3583 right: calc(var(--spacing-md) + var(--safe-area-inset-right)); 3584 left: calc(var(--spacing-md) + var(--safe-area-inset-left)); 3585 z-index: 3000; 3586 background: var(--color-background); 3587 border: var(--border-width-thick) var(--border-style, solid) var(--color-border-dark); 3588 box-shadow: var(--shadow-elevated); 3589 transition: opacity var(--transition); 3590} 3591 3592/* When save bar is present, push notification up so it sits above the bar */ 3593body:has(.save-bar) .notification { 3594 bottom: calc(var(--spacing-md) + 80px + var(--safe-area-inset-bottom)); 3595} 3596@media (min-width: 480px) { 3597 body:has(.save-bar) .notification { 3598 bottom: calc(var(--spacing-lg) + 80px); 3599 } 3600} 3601 3602/* Desktop: constrained width, right-aligned */ 3603@media (min-width: 480px) { 3604 .notification { 3605 left: auto; 3606 right: var(--spacing-lg); 3607 bottom: var(--spacing-lg); 3608 max-width: 400px; 3609 } 3610} 3611 3612.notification-content { 3613 display: flex; 3614 align-items: center; 3615 justify-content: space-between; 3616 padding: var(--spacing-md) var(--spacing-lg); 3617 gap: var(--spacing-md); 3618} 3619 3620.notification-message { 3621 font-weight: 600; 3622 font-size: 0.875rem; 3623 text-transform: uppercase; 3624 letter-spacing: 0.05em; 3625 flex: 1; 3626} 3627 3628.notification-close { 3629 background: transparent; 3630 border: none; 3631 font-size: 1.5rem; 3632 line-height: 1; 3633 cursor: pointer; 3634 color: var(--color-text); 3635 padding: 0; 3636 width: 24px; 3637 height: 24px; 3638 display: flex; 3639 align-items: center; 3640 justify-content: center; 3641 transition: all var(--transition); 3642} 3643 3644.notification-close:hover { 3645 background: var(--color-text); 3646 color: var(--color-background); 3647} 3648 3649.notification-success { 3650 border-color: var(--color-border-dark); 3651} 3652 3653.notification-error { 3654 border-color: #dc2626; 3655 background: #fef2f2; 3656} 3657 3658.notification-error .notification-message { 3659 color: #dc2626; 3660} 3661 3662.notification-error .notification-close { 3663 color: #dc2626; 3664} 3665 3666.notification-error .notification-close:hover { 3667 background: #dc2626; 3668 color: #fef2f2; 3669} 3670 3671@media (max-width: 640px) { 3672 .site-config { 3673 margin: var(--spacing-md); 3674 } 3675 3676 .theme-colors { 3677 grid-template-columns: 1fr; 3678 } 3679 3680 /* Notification mobile styles now handled in mobile-first section above */ 3681} 3682 3683/* ============================================ 3684 Generative Art & DID Visualization 3685 ============================================ */ 3686 3687.generative-art-explanation { 3688 background: var(--color-surface); 3689 border: var(--border-width) var(--border-style, solid) var(--color-border); 3690 padding: var(--spacing-lg); 3691 margin-bottom: var(--spacing-lg); 3692 line-height: 1.6; 3693} 3694 3695.generative-art-explanation p { 3696 margin: 0 0 var(--spacing-md); 3697} 3698 3699.generative-art-explanation p:last-child { 3700 margin-bottom: 0; 3701} 3702 3703.did-visualization-row { 3704 display: flex; 3705 align-items: center; 3706 justify-content: center; 3707 gap: var(--spacing-sm); 3708 flex-wrap: wrap; 3709} 3710 3711.theme-details-help-tooltip { 3712 display: inline-flex; 3713} 3714 3715.favicon-note, 3716.edit-note { 3717 font-size: 0.875rem; 3718 color: var(--color-text-muted); 3719 text-align: center; 3720 margin: var(--spacing-sm) 0; 3721 font-style: italic; 3722} 3723 3724.did-info-button { 3725 width: 24px; 3726 height: 24px; 3727 border-radius: 50%; 3728 border: var(--border-width) var(--border-style, solid) var(--color-border-dark); 3729 background: var(--color-background); 3730 color: var(--color-text); 3731 cursor: pointer; 3732 font-size: 0.875rem; 3733 font-weight: 700; 3734 display: flex; 3735 align-items: center; 3736 justify-content: center; 3737 padding: 0; 3738 transition: all var(--transition); 3739 font-family: var(--font-body); 3740 line-height: 1; 3741} 3742 3743.did-info-button:hover { 3744 background: var(--color-text); 3745 color: var(--color-background); 3746 border-width: var(--border-width-thick); 3747} 3748 3749.did-info-tooltip { 3750 position: absolute; 3751 top: calc(100% + var(--spacing-sm)); 3752 left: 50%; 3753 transform: translateX(-50%); 3754 background: var(--color-background); 3755 border: var(--border-width) var(--border-style, solid) var(--color-border-dark); 3756 padding: var(--spacing-md); 3757 max-width: 280px; 3758 font-size: 0.875rem; 3759 line-height: 1.5; 3760 color: var(--color-text); 3761 z-index: 1000; 3762 display: none; 3763 box-shadow: 4px 4px 0 rgba(0, 0, 0, 0.1); 3764 white-space: normal; 3765} 3766 3767.did-info-tooltip::before { 3768 content: ''; 3769 position: absolute; 3770 bottom: 100%; 3771 left: 50%; 3772 transform: translateX(-50%); 3773 border: var(--border-width) var(--border-style, solid) transparent; 3774 border-bottom-color: var(--color-border-dark); 3775 border-width: 8px; 3776 margin-left: -8px; 3777} 3778 3779/* Flower Bed (full bordered container using owner's unique style) */ 3780.flower-bed { 3781 position: relative; 3782 padding: var(--spacing-lg); 3783 margin-top: var(--spacing-md); 3784 background: var(--flower-bed-background, var(--color-surface)); 3785 border: var(--flower-bed-border-width, var(--border-width-thick)) var(--flower-bed-border-style, var(--border-style, solid)) var(--flower-bed-border-color, var(--color-border-dark)); 3786 box-shadow: var(--shadow-elevated); 3787 overflow: hidden; 3788 /* Prevent horizontal scrolling, ensure grid wraps */ 3789} 3790 3791/* Inner decorative border using owner's accent/primary color */ 3792.flower-bed::before { 3793 content: ''; 3794 position: absolute; 3795 inset: calc(var(--flower-bed-border-width, var(--border-width-thick)) + var(--spacing-sm)); 3796 border: var(--border-width) var(--flower-bed-border-style, var(--border-style, solid)) var(--flower-bed-inset-color, var(--color-accent, var(--color-primary, var(--color-border-dark)))); 3797 opacity: 0.6; 3798 pointer-events: none; 3799 transition: opacity 0.2s ease; 3800} 3801 3802.flower-bed:hover::before { 3803 opacity: 0.9; 3804} 3805 3806/* Flower Grid Layout - Mobile-first responsive */ 3807.flower-grid { 3808 display: grid; 3809 gap: var(--spacing-sm); 3810 grid-template-columns: repeat(3, 1fr); 3811 /* Base: 3 columns on mobile */ 3812 margin-top: var(--spacing-lg); 3813 margin-bottom: var(--spacing-lg); 3814} 3815 3816@media (min-width: 480px) { 3817 .flower-grid { 3818 grid-template-columns: repeat(auto-fill, minmax(100px, 1fr)); 3819 gap: var(--spacing-md); 3820 } 3821} 3822 3823@media (min-width: 768px) { 3824 .flower-grid { 3825 grid-template-columns: repeat(auto-fill, minmax(120px, 1fr)); 3826 } 3827} 3828 3829.flower-grid-item { 3830 display: flex; 3831 flex-direction: column; 3832 align-items: center; 3833 gap: var(--spacing-sm); 3834 min-width: 0; 3835 /* Allow shrinking in grid */ 3836 overflow: hidden; 3837} 3838 3839/* Ensure flower visualizations scale within grid cells */ 3840.flower-grid-item did-visualization { 3841 width: 100%; 3842 max-width: 100px; 3843} 3844 3845.flower-grid-item did-visualization svg { 3846 width: 100%; 3847 height: auto; 3848} 3849 3850.flower-grid-item a { 3851 display: block; 3852 text-decoration: none; 3853 transition: transform 0.2s ease; 3854} 3855 3856a.flower-grid-item { 3857 text-decoration: none; 3858 color: inherit; 3859 transition: transform 0.2s ease; 3860} 3861 3862button.flower-grid-item { 3863 background: none; 3864 border: none; 3865 padding: 0; 3866 cursor: pointer; 3867 transition: transform 0.2s ease; 3868} 3869 3870.flower-grid-item a:hover, 3871a.flower-grid-item:hover { 3872 transform: scale(1.05); 3873} 3874 3875.flower-note { 3876 font-size: 0.875rem; 3877 color: var(--color-text-muted); 3878 text-align: center; 3879 padding: var(--spacing-xs); 3880 margin-top: var(--spacing-xs); 3881 line-height: 1.4; 3882 max-width: 100%; 3883 word-wrap: break-word; 3884} 3885 3886.flower-grid-item-actions { 3887 display: flex; 3888 gap: var(--spacing-xs); 3889 justify-content: center; 3890 margin-top: var(--spacing-xs); 3891 flex-wrap: wrap; 3892} 3893 3894.flower-grid-item-actions .button-icon { 3895 padding: var(--spacing-xs); 3896 min-width: 32px; 3897 min-height: 32px; 3898 display: inline-flex; 3899 align-items: center; 3900 justify-content: center; 3901} 3902 3903.flower-grid-item-actions .action-icon { 3904 width: 16px; 3905 height: 16px; 3906 display: block; 3907} 3908 3909/* ============================================ 3910 Recent Gardens Display 3911 ============================================ */ 3912 3913.recent-gardens { 3914 padding: var(--spacing-lg) 0; 3915} 3916 3917.recent-gardens-title { 3918 font-size: var(--font-size-lg); 3919 font-weight: 700; 3920 margin-bottom: var(--spacing-md); 3921 letter-spacing: -0.02em; 3922} 3923 3924.recent-gardens-list { 3925 display: flex; 3926 flex-direction: column; 3927 gap: var(--spacing-sm); 3928} 3929 3930/* Streamlined single-row garden item */ 3931.recent-garden-row { 3932 transition: all var(--transition); 3933 /* Default styles are overridden by inline styles from each garden's unique theme */ 3934} 3935 3936.recent-garden-row-link { 3937 display: flex; 3938 align-items: center; 3939 gap: var(--spacing-md); 3940 padding: var(--spacing-sm) var(--spacing-md); 3941 text-decoration: none; 3942 color: var(--color-text); 3943} 3944 3945/* Smaller flower visualization */ 3946.recent-garden-flower { 3947 flex-shrink: 0; 3948 width: 40px; 3949 height: 40px; 3950 display: flex; 3951 align-items: center; 3952 justify-content: center; 3953} 3954 3955/* Display name and handle stacked */ 3956.recent-garden-identity { 3957 flex: 1; 3958 display: flex; 3959 flex-direction: column; 3960 gap: 0; 3961 min-width: 0; 3962 overflow: hidden; 3963} 3964 3965.recent-garden-display-name { 3966 font-size: 0.9rem; 3967 font-weight: 700; 3968 letter-spacing: -0.01em; 3969 line-height: 1.2; 3970 white-space: nowrap; 3971 overflow: hidden; 3972 text-overflow: ellipsis; 3973} 3974 3975.recent-garden-handle { 3976 font-size: 0.75rem; 3977 color: var(--color-text-muted); 3978 font-weight: 400; 3979 white-space: nowrap; 3980 overflow: hidden; 3981 text-overflow: ellipsis; 3982} 3983 3984/* Flower emoji and timestamp */ 3985.recent-garden-activity { 3986 flex-shrink: 0; 3987 display: flex; 3988 align-items: center; 3989 gap: var(--spacing-xs); 3990 font-size: 0.75rem; 3991 color: var(--color-text-muted); 3992} 3993 3994.recent-garden-update-icon { 3995 font-size: 0.875rem; 3996} 3997 3998.recent-garden-time { 3999 white-space: nowrap; 4000} 4001 4002.recent-gardens-loading, 4003.recent-gardens-empty { 4004 text-align: center; 4005 padding: var(--spacing-lg); 4006 color: var(--color-text-muted); 4007} 4008 4009.recent-gardens-empty-note { 4010 font-size: 0.875rem; 4011 font-style: italic; 4012 margin-top: var(--spacing-sm); 4013} 4014 4015/* Responsive adjustments */ 4016@media (max-width: 768px) { 4017 .recent-gardens-title { 4018 font-size: var(--font-size-base); 4019 } 4020 4021 .recent-garden-row-link { 4022 padding: var(--spacing-xs) var(--spacing-sm); 4023 } 4024 4025 .recent-garden-display-name { 4026 font-size: 0.85rem; 4027 } 4028} 4029 4030/* ============================================ 4031 Phase 9: Specific Components Mobile (< 480px) 4032 ============================================ */ 4033 4034/* 9.1 Recent Gardens - Extra small screens */ 4035@media (max-width: 479px) { 4036 .recent-gardens-list { 4037 margin: 0 calc(-1 * var(--spacing-md)); 4038 padding: var(--spacing-md); 4039 } 4040 4041 .recent-garden-row-link { 4042 padding: var(--spacing-sm); 4043 gap: var(--spacing-sm); 4044 } 4045 4046 .recent-garden-flower { 4047 width: 32px; 4048 height: 32px; 4049 flex-shrink: 0; 4050 } 4051 4052 .recent-garden-display-name { 4053 font-size: 0.9rem; 4054 } 4055 4056 .recent-garden-handle { 4057 font-size: 0.75rem; 4058 } 4059} 4060 4061/* 9.2 DID Visualization - Extra small screens */ 4062@media (max-width: 479px) { 4063 .did-visualization { 4064 max-width: 200px; 4065 margin: 0 auto; 4066 } 4067} 4068 4069/* 9.3 Flower Bed - Extra small screens */ 4070@media (max-width: 479px) { 4071 .flower-bed-header { 4072 flex-direction: column; 4073 align-items: flex-start; 4074 gap: var(--spacing-sm); 4075 } 4076 4077 .flower-modal { 4078 padding: var(--spacing-md); 4079 padding-bottom: var(--spacing-lg); 4080 } 4081 4082 .flower-modal-content { 4083 max-width: 280px; 4084 padding: 0 var(--spacing-md) var(--spacing-lg); 4085 } 4086 4087 /* Flower gardens modal buttons need horizontal padding */ 4088 #flower-gardens-self-cta, 4089 #flower-gardens-list { 4090 padding: 0 var(--spacing-md); 4091 } 4092 4093 #flower-gardens-self-cta .button, 4094 #flower-gardens-list .button { 4095 width: 100%; 4096 box-sizing: border-box; 4097 } 4098} 4099 4100/* Flower garden CTAs use each garden's theme colors (like recent-gardens) */ 4101.flower-garden-cta { 4102 text-transform: none; 4103} 4104.flower-garden-cta:hover { 4105 filter: brightness(0.95); 4106} 4107 4108/* ============================================ 4109 Flower Bed Header Strip 4110 ============================================ */ 4111 4112/* Override container styles for header strip variant */ 4113.flower-bed.header-strip { 4114 padding: 0.75rem 1.5rem; 4115 padding-top: 0; 4116 margin: 0; 4117 border: none; 4118 box-shadow: none; 4119 background: transparent; 4120} 4121 4122/* Remove decorative border for header strip */ 4123.flower-bed.header-strip::before { 4124 display: none; 4125} 4126 4127/* Transform grid to flex-wrap for header strip */ 4128.flower-bed.header-strip .flower-grid { 4129 display: flex; 4130 flex-wrap: wrap; 4131 align-items: center; 4132 gap: 0.5rem; 4133 margin: 0; 4134} 4135 4136/* Adjust flower size for header strip */ 4137.flower-bed.header-strip .flower-grid-item { 4138 width: 48px; 4139 height: 48px; 4140 flex-shrink: 0; 4141 transition: transform 0.2s ease; 4142} 4143 4144.flower-bed.header-strip .flower-grid-item:hover { 4145 transform: scale(1.15); 4146} 4147 4148.flower-bed.header-strip .flower-grid-item did-visualization { 4149 width: 48px; 4150 height: 48px; 4151 max-width: 48px; 4152} 4153 4154.flower-bed.header-strip .flower-grid-item did-visualization svg { 4155 width: 48px; 4156 height: 48px; 4157} 4158 4159/* Header strip CTA button */ 4160.header-strip-cta { 4161 /* Slightly smaller than 48px flowers on desktop */ 4162 height: 44px; 4163 margin-top: var(--spacing-sm); 4164 margin-bottom: 2px; 4165 padding: 0 1rem; 4166 font-size: 0.8rem; 4167 font-weight: 600; 4168 text-transform: uppercase; 4169 letter-spacing: 0.03em; 4170 white-space: nowrap; 4171 border-width: 1px; 4172 min-height: auto; 4173 min-width: auto; 4174} 4175 4176.header-strip-cta:hover { 4177 transform: scale(1.05); 4178} 4179 4180/* Mobile adjustments for header strip */ 4181@media (max-width: 479px) { 4182 .flower-bed.header-strip { 4183 padding: var(--spacing-sm); 4184 padding-top: 0; 4185 } 4186 4187 .flower-bed.header-strip .flower-grid { 4188 gap: 0.375rem; 4189 } 4190 4191 .flower-bed.header-strip .flower-grid-item, 4192 .flower-bed.header-strip .flower-grid-item did-visualization, 4193 .flower-bed.header-strip .flower-grid-item did-visualization svg { 4194 width: 44px; 4195 height: 44px; 4196 } 4197 4198 .header-strip-cta { 4199 height: 44px; 4200 margin: 0; 4201 padding: 0 0.75rem; 4202 font-size: 0.75rem; 4203 } 4204 4205 /* Header spores - smaller on mobile to match flower bed header */ 4206 .header-spores > div { 4207 width: 44px !important; 4208 height: 44px !important; 4209 } 4210 4211 .header-spores > div svg { 4212 width: 44px !important; 4213 height: 44px !important; 4214 } 4215} 4216 4217/* Owner flower in header strip – circular clip with accent ring */ 4218.flower-bed.header-strip .flower-grid-item--owner { 4219 width: 56px; 4220 height: 56px; 4221 position: relative; 4222 border-radius: 50%; 4223 overflow: hidden; 4224} 4225 4226.flower-bed.header-strip .flower-grid-item--owner::after { 4227 content: ''; 4228 position: absolute; 4229 inset: 0; 4230 border: var(--border-width) var(--border-style) var(--color-primary); 4231 border-radius: 50%; 4232 pointer-events: none; 4233 z-index: 1; 4234} 4235 4236.flower-bed.header-strip .flower-grid-item--owner did-visualization, 4237.flower-bed.header-strip .flower-grid-item--owner did-visualization svg { 4238 width: 56px; 4239 height: 56px; 4240 max-width: 56px; 4241 transform: translateY(-1.5px); 4242} 4243 4244@media (max-width: 479px) { 4245 .flower-bed.header-strip .flower-grid-item--owner { 4246 width: 52px; 4247 height: 52px; 4248 } 4249 4250 .flower-bed.header-strip .flower-grid-item--owner did-visualization, 4251 .flower-bed.header-strip .flower-grid-item--owner did-visualization svg { 4252 width: 52px; 4253 height: 52px; 4254 max-width: 52px; 4255 transform: translateY(-2px); 4256 } 4257} 4258 4259/* Help tooltips – fixed positioning, viewport-aware */ 4260.help-tooltip { 4261 position: fixed; 4262 z-index: 10001; 4263 display: none; 4264 background: var(--color-background, #fff); 4265 border: var(--border-width) var(--border-style, solid) var(--color-border-dark); 4266 padding: var(--spacing-md); 4267 max-width: min(360px, calc(100vw - 1rem)); 4268 width: max-content; 4269 font-size: 0.875rem; 4270 line-height: 1.5; 4271 color: var(--color-text); 4272 box-shadow: 4px 4px 0 rgba(0, 0, 0, 0.1); 4273 white-space: normal; 4274} 4275 4276.theme-details-help-tooltip + .help-tooltip { 4277 white-space: pre-line; 4278} 4279 4280@media (max-width: 640px) { 4281 .did-info-button { 4282 width: 28px; 4283 height: 28px; 4284 font-size: 1rem; 4285 } 4286 4287 .theme-details-help-tooltip { 4288 margin-top: var(--spacing-xs); 4289 } 4290 4291 .help-tooltip { 4292 max-width: calc(100vw - 2rem); 4293 width: auto; 4294 font-size: 0.8125rem; 4295 line-height: 1.45; 4296 padding: var(--spacing-sm); 4297 } 4298} 4299 4300/* ============================================ 4301 Font Modal 4302 ============================================ */ 4303 4304.font-modal-backdrop { 4305 position: fixed; 4306 inset: 0; 4307 background: rgba(0, 0, 0, 0.5); 4308 z-index: 9999; 4309 display: flex; 4310 align-items: center; 4311 justify-content: center; 4312} 4313 4314.font-modal-content { 4315 background: var(--color-background); 4316 color: var(--color-text); 4317 border: var(--border-width) var(--border-style) var(--color-border); 4318 border-radius: var(--border-radius); 4319 padding: var(--spacing-lg); 4320 min-width: 280px; 4321 max-width: 400px; 4322 width: 90vw; 4323} 4324 4325.font-modal-content h2 { 4326 margin-top: 0; 4327} 4328 4329.font-modal-content label { 4330 display: block; 4331 font-weight: 600; 4332 margin-bottom: var(--spacing-xs); 4333} 4334 4335.font-modal-content select { 4336 width: 100%; 4337 padding: var(--spacing-sm); 4338 margin-bottom: var(--spacing-md); 4339 font-size: var(--font-size-base); 4340 font-family: var(--font-body); 4341 border: var(--border-width) var(--border-style) var(--color-border); 4342 border-radius: var(--border-radius); 4343 background: var(--color-background); 4344 color: var(--color-text); 4345} 4346 4347.font-modal-content .font-modal-actions { 4348 display: flex; 4349 justify-content: flex-end; 4350 margin-top: var(--spacing-md); 4351}