/* ============================================================
   wall.css — the community wall, from Carolain's styles/wall.css.
   Copied VERBATIM from .app-header onward and not edited.

   Her :root block and body reset are deliberately NOT copied:
   kol-tokens.css owns the palette, and a page that re-declares it
   drifts from every other page. Her .app-header rules come along
   but are inert, since the real header is kol-shell.css.

   Anything our data forces goes in the ADDITIONS block at the end.
   Never edit her rules in place.
   ============================================================ */

/* ------------------------------------------------------------
   TYPE FLOOR (Kolmena, applied mechanically — not a hand edit)

   Her captions run 8-10px. This project's floor is 11px, so
   every font-size below it was raised to 11px and nothing else
   was touched. Her hierarchy above the floor is untouched; the
   two smallest tiers merge into one, which is the cost of the
   rule.
   ------------------------------------------------------------ */

*{box-sizing:border-box}html{scroll-behavior:smooth}body{margin:0;background:var(--bg);color:var(--ink);font-family:"Poppins",Arial,sans-serif;-webkit-font-smoothing:antialiased}.sprite{position:absolute;width:0;height:0;overflow:hidden}button,input,textarea,select{font:inherit}button,a,select{cursor:pointer}svg{fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}
.app-header{height:74px;position:sticky;top:0;z-index:50;display:flex;align-items:center;gap:22px;padding:0 clamp(24px,2vw,42px);background:rgba(255,255,255,.93);border-bottom:1px solid #ebe9e4;backdrop-filter:blur(15px)}.wordmark{display:flex;align-items:center;gap:10px;flex:0 0 auto;color:var(--ink);font-size:24px;text-decoration:none}.brand-glyph{width:31px;height:36px;fill:var(--amber);stroke:none}.brand-glyph path:last-child{fill:white}.community-switch{height:48px;min-width:210px;display:flex;align-items:center;gap:10px;padding:0 12px;border:1px solid var(--line);border-radius:11px;background:#fff;text-align:left;font-size:12px;font-weight:600;line-height:1.2;box-shadow:0 2px 8px rgba(0,0,0,.025)}.community-switch .switch-icon{color:var(--amber);font-size:20px}.community-switch b{margin-left:auto}.main-nav{height:100%;display:flex;align-items:center;gap:26px;white-space:nowrap}.main-nav a{height:100%;display:grid;place-items:center;position:relative;color:var(--ink);font-size:13px;font-weight:600;text-decoration:none}.main-nav a:after{content:"";position:absolute;left:0;right:0;bottom:0;height:3px;border-radius:3px 3px 0 0;background:var(--amber);transform:scaleX(0);transition:.2s}.main-nav a.active:after,.main-nav a:hover:after{transform:scaleX(1)}.global-search{height:42px;min-width:190px;max-width:280px;flex:1;display:flex;align-items:center;gap:10px;margin-left:auto;padding:0 15px;border-radius:22px;background:#f5f4f2}.global-search svg{width:18px}.global-search input{width:100%;border:0;outline:0;background:none;font-size:13px}.header-actions{display:flex;align-items:center;gap:8px}.header-actions>button{position:relative;width:40px;height:40px;display:grid;place-items:center;border:0;background:none;border-radius:50%}.header-actions>button:hover{background:#f5f4f2}.header-actions svg{width:21px;height:21px}.header-actions i{position:absolute;right:2px;top:0;width:18px;height:18px;display:grid;place-items:center;border:2px solid white;border-radius:50%;background:#df3f36;color:#fff;font:700 11px Arial}.header-actions .profile-button{width:52px;display:flex;gap:7px}.profile-button img{width:36px;height:36px;border-radius:50%;object-fit:cover}.profile-button span{font-size:12px}.mobile-menu{display:none!important;font-size:20px}.dashboard{width:min(1510px,calc(100% - 48px));margin:0 auto;padding:45px 0 70px;display:grid;grid-template-columns:minmax(0,920px) 360px;gap:42px;justify-content:center}.feed-column{min-width:0}.welcome-row{display:flex;align-items:end;justify-content:space-between;gap:20px;margin-bottom:17px}.welcome-row h1{margin:0;font-size:28px;line-height:1.15;letter-spacing:-.035em}.welcome-row h1 span{font-size:23px}.welcome-row p{margin:5px 0 0;color:var(--muted);font-size:15px}.viewing-select{height:43px;display:flex;align-items:center;gap:8px;padding:0 13px;border:1px solid var(--line);border-radius:10px;background:#fff;font-size:12px}.viewing-select svg{width:16px;color:color-mix(in oklab, var(--brand-58), #7a7a7a 9%)}.viewing-select span{color:var(--muted)}.viewing-select select{max-width:180px;border:0;outline:0;background:transparent;font-weight:600}.feed-tabs{width:350px;height:45px;margin:0 0 14px auto;display:grid;grid-template-columns:repeat(3,1fr);padding:3px;border:1px solid var(--line);border-radius:12px;background:#fff}.feed-tabs button{border:0;border-radius:9px;background:transparent;color:var(--muted);font-size:13px}.feed-tabs button.active{background:var(--cream);color:color-mix(in oklab, var(--brand-43), #505050 14%);font-weight:600;box-shadow:inset 0 0 0 1px color-mix(in oklab, var(--brand-91), #e1e1e1 41%)}.card,.side-card{background:var(--surface);border:1px solid var(--line);border-radius:16px;box-shadow:var(--shadow)}.composer{padding:19px 20px 17px}.composer-intro{display:flex;align-items:center;gap:16px}.online-avatar{position:relative;flex:0 0 auto}.online-avatar img{width:49px;height:49px;border-radius:50%;object-fit:cover}.online-avatar i{position:absolute;right:0;bottom:2px;width:12px;height:12px;border:2px solid white;border-radius:50%;background:var(--green)}.composer textarea{width:100%;height:48px;padding:14px 10px;border:0;outline:0;resize:none;font-size:15px}.composer textarea::placeholder{color:#8d908c}.post-kinds{display:flex;gap:5px;margin:15px 45px 14px 66px;border-bottom:1px solid #efede8}.post-kinds button{height:49px;display:flex;align-items:center;gap:9px;padding:0 20px;border:0;border-bottom:2px solid transparent;background:none;font-size:13px;font-weight:600}.post-kinds button svg{width:20px;height:20px}.post-kinds button span{font-size:18px}.post-kinds button.active{border:1px solid color-mix(in oklab, var(--brand-81), #c1c1c1 13%);border-bottom-color:color-mix(in oklab, var(--brand-81), #c1c1c1 13%);border-radius:10px;background:color-mix(in oklab, var(--brand-98), #f8f8f8 38%);color:var(--brand-on);transform:translateY(1px)}.composer-tools{height:48px;display:flex;align-items:center;justify-content:space-between;border:1px solid #eeeae4;border-radius:10px;background:#fdfdfc}.composer-tools>div{display:flex}.composer-tools button,.composer-tools label{height:46px;display:flex;align-items:center;gap:8px;padding:0 14px;border:0;background:none;color:#555954;font-size:12px}.composer-tools svg{width:18px;height:18px}.composer-tools label{border-left:1px solid #eeeae4}.composer-tools label span{color:#777}.composer-tools select{border:0;outline:0;background:none;font-size:12px;font-weight:600}.composer-submit{height:51px;display:flex;justify-content:flex-end;align-items:end}.draft-status{margin-right:auto;color:var(--green);font-size:11px}.publish-button{width:112px;height:38px;border:0;border-radius:20px;background:linear-gradient(100deg,var(--brand-72),var(--amber2));color:#fff;font-weight:700;box-shadow:0 7px 18px rgba(var(--brand-rgb), .2);transition:.2s}.publish-button:hover{transform:translateY(-2px);box-shadow:0 10px 24px rgba(var(--brand-rgb), .28)}.filters{display:grid;grid-template-columns:minmax(260px,1fr) auto auto auto 44px;gap:10px;margin:20px 0 14px}.filters label{height:44px;display:flex;align-items:center;gap:10px;padding:0 14px;border:1px solid var(--line);border-radius:10px;background:#fff}.filters label svg{width:18px}.filters input{width:100%;border:0;outline:0;background:none;font-size:13px}.filters>button{padding:0 16px;border:1px solid var(--line);border-radius:10px;background:#fff;font-size:12px}.filters .filter-icon{padding:0;display:grid;place-items:center}.filter-icon svg{width:18px}.post{padding:18px 20px 10px}.post-header{display:flex;justify-content:space-between}.post-header>button{width:34px;height:34px;border:0;background:none}.post-header>button svg{width:20px}.pin{display:inline-block;margin-bottom:9px;padding:5px 10px;border-radius:7px;background:var(--brand-98);color:color-mix(in oklab, var(--brand-47), #5b5b5b 6%);font-size:11px;font-weight:600}.author{display:flex;align-items:center;gap:11px}.author img{width:46px;height:46px;border-radius:50%;object-fit:cover}.author p{margin:0}.author b,.author small{display:block}.author b{font-size:15px}.author small{margin-top:3px;color:var(--muted);font-size:11px}.post-label{display:inline-block;margin-top:10px;padding:5px 10px;border-radius:7px;background:#eaf3ff;color:#1763b7;font-size:11px}.post-text{margin:10px 0 13px;font-size:15px}.post-image{display:block;width:100%;height:290px;border-radius:11px;object-fit:cover;object-position:center 57%}.post-stats{height:50px;display:flex;align-items:center;justify-content:space-between;color:#555954;font-size:12px;border-bottom:1px solid #eceae5}.reaction-stack{display:flex;align-items:center}.reaction-stack i{width:24px;height:24px;display:grid;place-items:center;margin-left:-5px;border:2px solid white;border-radius:50%;font-style:normal;font-size:12px}.reaction-stack i:first-child{margin-left:0;background:#e5f2ff}.reaction-stack i:nth-child(2){background:#ffe8e8}.reaction-stack i:nth-child(3){background:var(--brand-96)}.reaction-stack b{margin-left:7px;font-weight:500}.post-actions{height:51px;display:grid;grid-template-columns:repeat(4,1fr);gap:6px}.post-actions button{display:flex;align-items:center;justify-content:center;gap:9px;border:0;border-radius:8px;background:none;font-size:13px}.post-actions button:hover{background:#f7f6f3}.post-actions svg{width:20px;height:20px}.post-actions .active{color:var(--brand-72);font-weight:600}.post-actions .active svg{fill:currentColor}.side-column{display:grid;align-content:start;gap:16px}.side-card{padding:18px}.side-card header{display:flex;justify-content:space-between;align-items:center;margin-bottom:17px}.side-card h2{margin:0;font-size:15px}.side-card header h2{display:flex;align-items:center;gap:8px}.side-card header h2 svg{width:18px;height:18px;flex:0 0 18px;color:color-mix(in oklab, var(--brand-47), #5b5b5b 8%)}.side-card header a,.side-card>a{color:var(--brand-67);font-size:11px;text-decoration:none}.event-body{display:grid;grid-template-columns:65px 1fr;gap:14px}.event-body time{height:70px;display:grid;place-content:center;text-align:center;border-radius:9px;background:color-mix(in oklab, var(--brand-98), #f8f8f8 30%)}.event-body time b{font-size:25px}.event-body time span{font-size:11px;font-weight:700}.event-body h3{margin:0 0 6px;font-size:14px;line-height:1.3}.event-body p{margin:2px 0;color:var(--muted);font-size:11px}.event-card footer{display:flex;align-items:center;justify-content:space-between;margin-top:18px}.event-join{height:36px;padding:0 22px;border:0;border-radius:7px;background:linear-gradient(100deg,var(--brand-72),var(--brand-78));color:white;font-weight:600}.mini-faces{display:flex;align-items:center}.mini-faces img,.mini-faces span{width:29px;height:29px;margin-left:-7px;border:2px solid white;border-radius:50%;object-fit:cover}.mini-faces span{display:grid;place-items:center;background:var(--av,color-mix(in oklab, var(--brand-98), #f8f8f8 19%));font-size:11px}.person{display:grid;grid-template-columns:45px 1fr auto;align-items:center;gap:10px;margin-top:14px}.person img{width:45px;height:45px;border-radius:50%;object-fit:cover}.person p{margin:0;min-width:0}.person b,.person span,.person small{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.person b{font-size:12px}.person span,.person small{margin-top:2px;color:var(--muted);font-size:11px}.person button{height:31px;padding:0 13px;border:1px solid color-mix(in oklab, var(--brand-91), #e1e1e1 65%);border-radius:7px;background:color-mix(in oklab, var(--brand-98), #f8f8f8 25%);font-size:11px;font-weight:600}.person button.connected{background:#eef8f1;border-color:#cfe8d6;color:#258146}.active-members header span{color:var(--muted);font-size:11px}.member-row{display:flex;align-items:center;padding-top:2px}.member-row>span,.member-row>b{position:relative;width:39px;height:39px;margin-left:-5px;border:2px solid white;border-radius:50%}.member-row>span:first-child{margin-left:0}.member-row img{width:100%;height:100%;border-radius:50%;object-fit:cover}.member-row .kol-presence{position:absolute;right:0;bottom:0;width:9px;height:9px;border:2px solid white;border-radius:50%;background:var(--green)}.member-row>b{display:grid;place-items:center;background:color-mix(in oklab, var(--brand-98), #f8f8f8 6%);font-size:11px}.activity-card h2{margin:0 0 15px;font-size:15px}.activity-card ul{list-style:none;margin:0;padding:0;display:grid;gap:10px}.activity-card li{display:flex;align-items:center;gap:11px;font-size:11px}.activity-card li i{width:28px;height:28px;display:grid;place-items:center;border-radius:7px}.activity-card li svg{width:16px;height:16px}.activity-card .green{color:#279e4a;background:#e9f8ec}.activity-card .purple{color:#8745d9;background:#f1e9ff}.activity-card .orange{color:#e46f22;background:#fff0e8}.activity-card .blue{color:#2877db;background:#eaf3ff}.activity-card>a{display:flex;align-items:center;justify-content:space-between;margin-top:18px}.activity-card>a svg{width:17px}.wall-toast{position:fixed;left:50%;bottom:25px;z-index:100;transform:translate(-50%,20px);opacity:0;padding:12px 18px;border-radius:9px;background:#171916;color:#fff;font-size:12px;box-shadow:0 10px 30px rgba(0,0,0,.2);transition:.25s}.wall-toast.show{opacity:1;transform:translate(-50%,0)}
@media(max-width:1380px){.app-header{gap:14px}.main-nav{gap:17px}.main-nav a:nth-last-child(-n+3){display:none}.dashboard{grid-template-columns:minmax(0,820px) 330px;gap:28px}.global-search{max-width:220px}}
@media(max-width:1120px){.community-switch{min-width:190px}.main-nav{display:none}.mobile-menu{display:grid!important}.dashboard{grid-template-columns:minmax(0,820px);width:min(860px,calc(100% - 36px));padding-top:32px}.side-column{grid-template-columns:repeat(2,minmax(0,1fr));margin-top:0}.activity-card{grid-column:span 2}.global-search{max-width:none}.feed-tabs{margin-top:16px}}
@media(max-width:720px){.app-header{height:64px;padding:0 16px;gap:10px}.wordmark{font-size:20px}.brand-glyph{width:27px}.community-switch{min-width:0;width:44px;padding:0;justify-content:center}.community-switch span:not(.switch-icon),.community-switch b{display:none}.global-search{display:none}.header-actions>button:not(.profile-button):not(.mobile-menu){display:none}.profile-button{width:40px!important}.profile-button span{display:none}.dashboard{width:100%;padding:24px 14px 50px}.welcome-row{display:block}.welcome-row h1{font-size:24px}.viewing-select{margin-top:16px;width:100%}.viewing-select select{max-width:none;flex:1}.feed-tabs{width:100%;margin-top:14px}.composer{padding:15px}.composer-intro{align-items:flex-start}.composer textarea{min-height:60px}.post-kinds{margin:12px 0;overflow-x:auto}.post-kinds button{padding:0 15px;white-space:nowrap}.composer-tools{height:auto;display:block;padding:4px}.composer-tools>div{overflow-x:auto}.composer-tools label{border-left:0;border-top:1px solid #eeeae4}.composer-submit{height:48px}.filters{grid-template-columns:1fr 44px}.filters>button:not(.filter-icon){display:none}.post{padding:15px 13px 8px}.post-image{height:220px}.post-actions button{font-size:0}.post-actions svg{width:21px}.side-column{display:block}.side-card{margin-top:14px}.suggestions,.activity-card{display:none}.event-card{margin-top:4px}.post-text{font-size:14px}.author small{font-size:11px}}
@media(max-width:420px){.welcome-row h1{font-size:22px}.composer-tools button{padding:0 10px;font-size:11px}.post-image{height:190px}.event-card{padding:15px}.wordmark strong{display:none}}
@media(prefers-reduced-motion:reduce){*{scroll-behavior:auto!important;transition:none!important}}
.filters>button{height:44px;align-self:start}
.community-picker{position:relative;flex:0 0 auto}.community-menu{position:absolute;left:0;top:57px;z-index:80;width:350px;padding:9px;border:1px solid var(--line);border-radius:14px;background:rgba(255,255,255,.98);box-shadow:0 20px 55px rgba(25,22,16,.16);backdrop-filter:blur(16px);animation:menu-in .2s ease both}.community-menu[hidden]{display:none}.community-menu-title{display:flex;justify-content:space-between;padding:8px 9px 10px}.community-menu-title span{font-size:12px;font-weight:700}.community-menu-title small{color:var(--subtle);font-size:11px}.community-menu>button{width:100%;display:grid;grid-template-columns:42px minmax(0,1fr) 20px;align-items:center;gap:10px;padding:9px;border:0;border-radius:10px;background:none;text-align:left}.community-menu>button:hover{background:#f8f6f1}.community-menu>button.selected{background:var(--brand-98)}.community-symbol{width:39px;height:39px;display:grid;place-items:center;border-radius:11px;color:#fff;font-style:normal;font-weight:700}.community-symbol.amber{background:linear-gradient(145deg,var(--brand-76),var(--brand-83))}.community-symbol.green{background:linear-gradient(145deg,#249f63,#42c57e)}.community-symbol.blue{background:linear-gradient(145deg,#3576d4,#65a0ee)}.community-symbol.violet{background:linear-gradient(145deg,#7d55ca,#ab83ec)}.community-symbol.coral{background:linear-gradient(145deg,#d75c58,#f28b7f)}.community-menu button b,.community-menu button small{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.community-menu button b{font-size:12px}.community-menu button small{margin-top:3px;color:var(--muted);font-size:11px}.community-menu button em{color:var(--brand-62);font-style:normal;font-weight:700}.community-menu>a{display:flex;justify-content:space-between;margin-top:5px;padding:11px 10px 7px;border-top:1px solid #eeeae3;color:var(--brand-62);font-size:11px;font-weight:600;text-decoration:none}@keyframes menu-in{from{opacity:0;transform:translateY(-6px)}to{opacity:1;transform:translateY(0)}}
.post+.post{margin-top:16px}.post-description{margin:-4px 0 14px;color:#636762;font-size:13px;line-height:1.55}.post-question{max-width:700px;font-size:18px;font-weight:600;line-height:1.4}.label-search{background:#f1edff;color:#6c43ae}.label-offer{background:#e9f8ee;color:#188443}.label-celebrate{background:#fff1ec;color:#c15e32}.topic-tags{display:flex;flex-wrap:wrap;gap:7px;margin:0 0 16px}.topic-tags span{padding:6px 9px;border-radius:7px;background:#f5f3ef;color:#626660;font-size:11px;font-weight:600}.help-callout{display:flex;align-items:center;gap:12px;padding:13px 15px;border:1px solid #ebe6db;border-radius:11px;background:#fcfbf8}.avatar-pair{display:flex}.avatar-pair img{width:36px;height:36px;margin-left:-8px;border:2px solid white;border-radius:50%;object-fit:cover}.avatar-pair img:first-child{margin-left:0}.help-callout p{margin:0}.help-callout b,.help-callout small{display:block}.help-callout b{font-size:11px}.help-callout small{margin-top:2px;color:var(--muted);font-size:11px}.help-callout button{height:32px;margin-left:auto;padding:0 13px;border:1px solid color-mix(in oklab, var(--brand-91), #e1e1e1 65%);border-radius:7px;background:color-mix(in oklab, var(--brand-98), #f8f8f8 25%);font-size:11px;font-weight:600}.post-image-small{height:250px}.offer-meta{min-height:50px;display:flex;align-items:center;gap:18px;padding:8px 0;border-bottom:1px solid #eceae5}.offer-meta span{display:flex;align-items:center;gap:6px;color:#595d58;font-size:11px}.offer-meta svg{width:17px}.offer-meta button{height:32px;margin-left:auto;padding:0 17px;border:1px solid color-mix(in oklab, var(--brand-83), #c7c7c7 25%);border-radius:8px;background:color-mix(in oklab, var(--brand-98), #f8f8f8 19%);color:color-mix(in oklab, var(--brand-51), #666666 10%);font-size:11px;font-weight:600}
@media(max-width:720px){.community-menu{position:fixed;left:14px;right:14px;top:70px;width:auto}.post-question{font-size:16px}.help-callout{align-items:flex-start}.help-callout button{display:none}.post-image-small{height:205px}.offer-meta{flex-wrap:wrap;gap:8px 14px}.offer-meta button{margin-left:0}.post+.post{margin-top:13px}}

/* Modern inline comments */
.comments-panel{margin:0 -20px -10px;padding:0 20px 15px;border-top:1px solid #eeece7;background:linear-gradient(180deg,#fdfcf9,#fff);animation:comments-open .25s ease both}.comments-head{display:flex;align-items:center;justify-content:space-between;padding:15px 0 11px}.comments-head b{font-size:13px}.comments-head button{border:0;background:none;color:#7a7d78;font-size:11px}.comment-list{display:grid;gap:10px}.comment{display:grid;grid-template-columns:38px minmax(0,1fr);gap:10px}.comment>img{width:38px;height:38px;border-radius:50%;object-fit:cover}.comment-bubble{width:fit-content;max-width:min(600px,92%);padding:10px 12px;border-radius:5px 14px 14px 14px;background:#f3f2ef}.comment-bubble header{display:flex;align-items:center;gap:8px}.comment-bubble b{font-size:11px}.comment-bubble time{color:#999;font-size:11px}.comment-bubble p{margin:4px 0 0;font-size:12px;line-height:1.45}.comment-tools{display:flex;gap:13px;margin:5px 0 0 12px}.comment-tools button{border:0;background:none;color:#747873;font-size:11px;font-weight:600}.comment-tools button.liked{color:var(--brand-72)}.comment-replies{display:grid;gap:8px;margin:8px 0 0 46px}.comment.reply{grid-template-columns:30px minmax(0,1fr)}.comment.reply>img{width:30px;height:30px}.comment-composer{display:grid;grid-template-columns:36px minmax(0,1fr) auto;align-items:end;gap:9px;margin-top:13px}.comment-composer>img{width:36px;height:36px;border-radius:50%;object-fit:cover}.comment-input-wrap{min-height:40px;display:flex;align-items:center;padding:4px 8px 4px 13px;border:1px solid #e4e1da;border-radius:20px;background:#fff;transition:.2s}.comment-input-wrap:focus-within{border-color:color-mix(in oklab, var(--brand-78), #b7b7b7 7%);box-shadow:0 0 0 3px rgba(var(--brand-rgb), .1)}.comment-input-wrap textarea{width:100%;max-height:90px;padding:6px 0;border:0;outline:0;resize:none;background:none;font-size:11px}.comment-input-wrap button{width:27px;height:27px;border:0;border-radius:50%;background:none;font-size:15px}.comment-submit{width:39px;height:39px;display:grid;place-items:center;border:0;border-radius:50%;background:linear-gradient(145deg,var(--brand-74),var(--brand-83));color:white;box-shadow:0 6px 15px rgba(var(--brand-rgb), .2)}.comment-submit svg{width:17px}.comments-panel.collapsing{display:none}@keyframes comments-open{from{opacity:0;transform:translateY(-5px)}to{opacity:1;transform:translateY(0)}}

/* Messaging drawer */
.chat-scrim[hidden]{display:none}.chat-scrim{position:fixed;inset:0;z-index:89;background:rgba(20,22,19,.2);backdrop-filter:blur(2px);animation:chat-fade .2s ease}.chat-drawer{position:fixed;z-index:90;right:18px;top:88px;bottom:18px;width:min(410px,calc(100% - 36px));display:flex;flex-direction:column;border:1px solid rgba(255,255,255,.75);border-radius:19px;background:#fff;box-shadow:0 30px 80px rgba(18,20,18,.22);overflow:hidden;transform:translateX(calc(100% + 40px));opacity:0;pointer-events:none;transition:transform .32s cubic-bezier(.2,.8,.25,1),opacity .25s}.chat-drawer.open{transform:translateX(0);opacity:1;pointer-events:auto}.chat-header{height:72px;display:flex;align-items:center;justify-content:space-between;padding:0 18px;background:linear-gradient(120deg,#1b1d1a,#29251d);color:white}.chat-header>div{display:flex;align-items:center;gap:11px}.chat-brand{width:38px;height:38px;display:grid;place-items:center;border-radius:11px;background:var(--amber);color:#171916}.chat-brand svg{width:20px}.chat-header p{margin:0}.chat-header b,.chat-header small{display:block}.chat-header b{font-size:15px}.chat-header small{margin-top:2px;color:#c6c8c3;font-size:11px}.chat-close{width:34px;height:34px;border:0;border-radius:50%;background:rgba(255,255,255,.08);color:white;font-size:22px}.chat-inbox{display:flex;flex-direction:column;min-height:0;flex:1}.chat-search{height:42px;display:flex;align-items:center;gap:8px;margin:13px 14px 9px;padding:0 12px;border-radius:21px;background:#f4f3f0}.chat-search svg{width:16px}.chat-search input{width:100%;border:0;outline:0;background:none;font-size:11px}.chat-tabs{display:flex;gap:5px;padding:0 14px 8px;border-bottom:1px solid #eeeae4}.chat-tabs button{height:29px;padding:0 10px;border:0;border-radius:7px;background:none;color:#747872;font-size:11px}.chat-tabs button.active{background:color-mix(in oklab, var(--brand-97), #f5f5f5 13%);color:color-mix(in oklab, var(--brand-47), #5b5b5b 10%);font-weight:700}.chat-tabs span{display:inline-grid;place-items:center;width:17px;height:17px;margin-left:3px;border-radius:50%;background:color-mix(in oklab, var(--brand-76), #b1b1b1 8%);color:#fff;font-size:11px}.conversation-list{min-height:0;overflow:auto;padding:5px 8px}.conversation{position:relative;width:100%;display:grid;grid-template-columns:44px minmax(0,1fr) auto;align-items:center;gap:10px;padding:10px 9px;border:0;border-radius:11px;background:none;text-align:left}.conversation:hover{background:#f7f6f2}.conversation.unread{background:color-mix(in oklab, var(--brand-98), #f8f8f8 13%)}.conversation-avatar{position:relative;width:43px;height:43px}.conversation-avatar img{width:100%;height:100%;border-radius:50%;object-fit:cover}.conversation-avatar i{position:absolute;right:0;bottom:1px;width:10px;height:10px;border:2px solid white;border-radius:50%;background:var(--green)}.conversation p{margin:0;min-width:0}.conversation b,.conversation p span{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.conversation b{font-size:11px}.conversation p span{margin-top:3px;color:#7c807a;font-size:11px}.conversation time{align-self:start;color:#999;font-size:11px}.conversation em{position:absolute;right:10px;bottom:10px;width:17px;height:17px;display:grid;place-items:center;border-radius:50%;background:var(--brand-74);color:#fff;font:700 11px Arial}.new-chat{height:38px;margin:8px 14px 14px;border:1px solid color-mix(in oklab, var(--brand-83), #c7c7c7 46%);border-radius:9px;background:color-mix(in oklab, var(--brand-98), #f8f8f8 13%);color:color-mix(in oklab, var(--brand-47), #5b5b5b 6%);font-size:11px;font-weight:600}.chat-thread{min-height:0;display:flex;flex-direction:column;flex:1}.chat-thread[hidden]{display:none}.chat-thread>header{height:62px;display:grid;grid-template-columns:32px 40px 1fr 34px;align-items:center;gap:8px;padding:0 12px;border-bottom:1px solid #ece9e3}.thread-back,.thread-more{width:32px;height:32px;display:grid;place-items:center;border:0;border-radius:50%;background:none}.thread-more svg{width:18px}.chat-thread header .conversation-avatar{width:38px;height:38px}.chat-thread header p{margin:0}.chat-thread header b,.chat-thread header small{display:block}.chat-thread header b{font-size:11px}.chat-thread header small{margin-top:2px;color:#41905c;font-size:11px}.messages{flex:1;overflow:auto;padding:15px;background:radial-gradient(circle at 90% 0,rgba(var(--brand-rgb), .06),transparent 35%),#fafaf8}.date-separator{display:flex;align-items:center;gap:10px;margin-bottom:15px}.date-separator:before,.date-separator:after{content:"";height:1px;flex:1;background:#e6e3dc}.date-separator span{color:#999;font-size:11px}.message{width:fit-content;max-width:78%;margin-bottom:9px;padding:9px 11px;border-radius:13px}.message p{margin:0;font-size:11px;line-height:1.4}.message time{display:block;margin-top:4px;color:#8b8f89;font-size:11px;text-align:right}.message.received{border-radius:4px 13px 13px 13px;background:#fff;box-shadow:0 2px 8px rgba(0,0,0,.04)}.message.sent{margin-left:auto;border-radius:13px 4px 13px 13px;background:var(--brand-96)}.typing-indicator{height:27px;display:flex;align-items:center;gap:3px;padding:0 15px;color:#888;font-size:11px}.typing-indicator i{width:5px;height:5px;border-radius:50%;background:#aaa;animation:typing 1s ease-in-out infinite}.typing-indicator i:nth-child(2){animation-delay:.15s}.typing-indicator i:nth-child(3){animation-delay:.3s}.typing-indicator span{margin-left:5px}.message-composer{display:grid;grid-template-columns:32px minmax(0,1fr) 36px;align-items:end;gap:7px;padding:11px;border-top:1px solid #ece9e3;background:#fff}.message-composer>button{width:32px;height:32px;border:0;border-radius:50%;background:#f2f1ee}.message-composer textarea{min-height:34px;max-height:90px;padding:9px 12px;border:1px solid #e5e2dc;border-radius:17px;outline:0;resize:none;font-size:11px}.message-composer textarea:focus{border-color:color-mix(in oklab, var(--brand-78), #b7b7b7 13%)}.message-composer .send-message{width:36px;height:36px;background:linear-gradient(145deg,var(--brand-74),var(--brand-83));color:#fff}.send-message svg{width:17px}@keyframes chat-fade{from{opacity:0}to{opacity:1}}@keyframes typing{0%,100%{transform:translateY(0)}50%{transform:translateY(-3px)}}
@media(max-width:720px){.comments-panel{margin-inline:-13px;padding-inline:13px}.comment-bubble{max-width:100%}.comment-composer{grid-template-columns:32px minmax(0,1fr) 38px}.comment-composer>img{width:32px;height:32px}.chat-drawer{inset:0;width:100%;border-radius:0}.chat-header{height:64px}.chat-scrim{display:none}}

/* Functional filter controls */
.filters{align-items:start}.filter-dropdown{position:relative}.filter-toggle{height:44px;display:flex;align-items:center;justify-content:space-between;gap:10px;padding:0 14px;border:1px solid var(--line);border-radius:10px;background:#fff;color:#454844;font-size:12px;white-space:nowrap;transition:.18s}.filter-toggle:hover,.filter-toggle[aria-expanded="true"]{border-color:color-mix(in oklab, var(--brand-81), #c1c1c1 27%);background:color-mix(in oklab, var(--brand-98), #f8f8f8 33%);box-shadow:0 4px 14px rgba(var(--brand-rgb), .06)}.filter-toggle b{font-size:11px;transition:transform .2s}.filter-toggle[aria-expanded="true"] b{transform:rotate(180deg)}.filter-toggle.has-value{border-color:color-mix(in oklab, var(--brand-78), #b7b7b7 15%);background:var(--brand-98);color:var(--brand-43);font-weight:600}.filter-menu{position:absolute;z-index:35;top:51px;left:0;width:220px;padding:8px;border:1px solid #e8e4dc;border-radius:12px;background:rgba(255,255,255,.98);box-shadow:0 18px 45px rgba(33,29,20,.14);backdrop-filter:blur(14px);animation:filter-pop .18s ease both}.filter-menu[hidden]{display:none}.filter-menu>small{display:block;padding:6px 8px 8px;color:#969993;font-size:11px;text-transform:uppercase;letter-spacing:.09em;font-weight:700}.filter-menu>button:not(.clear-filters){width:100%;height:36px;display:flex;align-items:center;justify-content:space-between;padding:0 9px;border:0;border-radius:8px;background:none;color:#4c504b;text-align:left;font-size:11px}.filter-menu>button:hover{background:#f7f5f1}.filter-menu>button.selected{background:var(--brand-97);color:color-mix(in oklab, var(--brand-47), #5b5b5b 10%);font-weight:700}.filter-menu button i{font-style:normal;color:#9a9d98;font-size:11px}.community-filter-menu{width:230px}.order-menu{width:190px}.advanced-dropdown .filter-menu{left:auto;right:0}.advanced-menu{width:225px}.advanced-menu label{height:37px;display:flex;align-items:center;gap:9px;padding:0 8px;border-radius:8px;font-size:11px}.advanced-menu label:hover{background:#f7f5f1}.advanced-menu input{accent-color:var(--brand-74)}.clear-filters{width:100%;height:34px;margin-top:5px;border:0;border-top:1px solid #eeeae3;background:none;color:var(--brand-62);font-size:11px}.advanced-dropdown em{position:absolute;right:-2px;top:-3px;display:none;width:9px;height:9px;border:2px solid white;border-radius:50%;background:var(--brand-74)}.advanced-dropdown.active em{display:block}.filter-summary{height:25px;display:flex;align-items:center;justify-content:space-between;margin:-7px 2px 8px;color:#8a8e88;font-size:11px}.filter-summary b{color:#343733}.filter-summary button{border:0;background:none;color:var(--brand-62);font-size:11px}@keyframes filter-pop{from{opacity:0;transform:translateY(-5px) scale(.98)}to{opacity:1;transform:translateY(0) scale(1)}}

/* Press-and-hold / hover reactions */
.reaction-control{position:relative;min-width:0}.reaction-control>.like-button{width:100%;height:100%}.reaction-picker{position:absolute;z-index:30;left:8px;bottom:calc(100% + 8px);display:flex;align-items:center;gap:3px;padding:6px 7px;border:1px solid #e9e5dd;border-radius:25px;background:#fff;box-shadow:0 12px 35px rgba(28,25,18,.18);opacity:0;visibility:hidden;transform:translateY(7px) scale(.94);transform-origin:bottom left;pointer-events:none;transition:opacity .16s,transform .2s,visibility .16s;transition-delay:.18s}.reaction-control:hover .reaction-picker,.reaction-control:focus-within .reaction-picker,.reaction-control.show-picker .reaction-picker{opacity:1;visibility:visible;transform:translateY(0) scale(1);pointer-events:auto;transition-delay:0s}.reaction-picker:after{content:"";position:absolute;left:25px;bottom:-6px;width:11px;height:11px;background:#fff;border-right:1px solid #e9e5dd;border-bottom:1px solid #e9e5dd;transform:rotate(45deg)}.reaction-picker button{position:relative;z-index:1;width:34px!important;height:34px!important;padding:0!important;border-radius:50%!important;background:none!important;font-size:21px!important;transition:transform .16s!important}.reaction-picker button:hover,.reaction-picker button:focus{transform:translateY(-6px) scale(1.22);outline:0}.reaction-picker button:after{content:attr(aria-label);position:absolute;left:50%;bottom:42px;padding:4px 6px;border-radius:5px;background:#1d1f1c;color:#fff;font:11px Arial;white-space:nowrap;transform:translateX(-50%);opacity:0;pointer-events:none}.reaction-picker button:hover:after,.reaction-picker button:focus:after{opacity:1}.reaction-emoji{font-size:17px;line-height:1}.like-button[data-reaction="Me encanta"]{color:#df4545}.like-button[data-reaction="Celebro"]{color:#db7a24}.like-button[data-reaction="Apoyo"]{color:#8a5acb}.like-button[data-reaction="Útil"]{color:var(--brand-67)}.reaction-hint{position:absolute;top:-17px;left:50%;padding:3px 6px;border-radius:4px;background:#282a27;color:#fff;font-size:11px;white-space:nowrap;transform:translateX(-50%);opacity:0;pointer-events:none}.reaction-control:hover .reaction-hint{opacity:.8}
@media(max-width:720px){.filters{grid-template-columns:1fr auto}.filter-dropdown:not(.advanced-dropdown){display:none}.advanced-dropdown{grid-column:2}.advanced-menu{position:fixed;left:14px;right:14px;top:auto;bottom:18px;width:auto}.filter-summary{margin-inline:3px}.reaction-picker{position:fixed;left:50%;bottom:25px;transform:translate(-50%,10px) scale(.94);transform-origin:center}.reaction-control.show-picker .reaction-picker{transform:translate(-50%,0) scale(1)}.reaction-control:hover:not(.show-picker) .reaction-picker{opacity:0;visibility:hidden;pointer-events:none}.reaction-picker:after{display:none}.reaction-hint{display:none}}

/* Discovery modules placed between feed posts */
.feed-module{margin-top:16px;padding:16px 18px;overflow:hidden}.module-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:14px}.module-header>div{display:flex;align-items:center;gap:10px}.module-header p{margin:0}.module-header b,.module-header small{display:block}.module-header b{font-size:14px}.module-header small{margin-top:2px;color:var(--muted);font-size:11px}.module-header a{color:var(--brand-67);font-size:11px;font-weight:600;text-decoration:none}.module-header>div:last-child{gap:6px}.module-icon{width:35px;height:35px;display:grid;place-items:center;border-radius:10px;font-size:18px}.module-icon.shop{background:var(--brand-96);color:var(--brand-58)}.module-icon.cause{background:#ffedef;color:#d34f60}.module-icon.photos{background:#eaf2ff;color:#3375c7}.carousel-arrow{width:29px;height:29px;border:1px solid #e6e2da;border-radius:8px;background:#fff;color:#60645f}.carousel-arrow:hover{border-color:color-mix(in oklab, var(--brand-76), #b1b1b1 21%);background:var(--brand-98)}.horizontal-track{scroll-behavior:smooth;scrollbar-width:none}.horizontal-track::-webkit-scrollbar{display:none}.product-track{display:grid;grid-auto-flow:column;grid-auto-columns:minmax(185px,1fr);gap:10px;overflow-x:auto;scroll-snap-type:x mandatory}.product-card{position:relative;overflow:hidden;border:1px solid #e8e4dc;border-radius:11px;background:#fff;scroll-snap-align:start;transition:.2s}.product-card:hover{transform:translateY(-3px);border-color:color-mix(in oklab, var(--brand-78), #b7b7b7 22%);box-shadow:0 9px 22px rgba(var(--brand-rgb), .09)}.product-card>img{width:100%;height:125px;display:block;object-fit:cover}.product-card>div{padding:10px}.product-card span{color:color-mix(in oklab, var(--brand-62), #868686 5%);font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.06em}.product-card h3{min-height:34px;margin:4px 0 5px;font-size:12px;line-height:1.35}.product-card p{margin:0;color:#70746f;font-size:11px}.product-card .quick-product{width:100%;height:31px;margin-top:9px;border:0;border-radius:7px;background:var(--brand-98);color:var(--brand-43);font-size:11px;font-weight:600}.product-favorite{position:absolute;z-index:2;right:8px;top:8px;width:30px;height:30px;border:0;border-radius:50%;background:rgba(255,255,255,.9);font-size:18px;box-shadow:0 4px 10px rgba(0,0,0,.08)}.product-favorite.saved{background:#fff0ef;color:#d84e4e}.module-progress{height:3px;margin-top:12px;border-radius:2px;background:#eeeae2}.module-progress i{display:block;width:36%;height:100%;border-radius:2px;background:var(--brand-76);transition:width .25s}.cause-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}.cause-card{display:grid;grid-template-columns:92px 1fr;overflow:hidden;border:1px solid #e8e4dc;border-radius:11px}.cause-visual{display:grid;place-items:center;font-size:36px}.green-cause{background:linear-gradient(145deg,#edf8e9,#dbf2d7)}.orange-cause{background:linear-gradient(145deg,var(--brand-97),color-mix(in oklab, var(--brand-93), #e8e8e8 11%))}.cause-card>div{padding:12px}.cause-card>div>small{color:var(--brand-58);font-size:11px;font-weight:700;text-transform:uppercase}.cause-card h3{margin:4px 0;font-size:12px}.cause-card p{height:31px;margin:0;color:#747873;font-size:11px;line-height:1.4}.cause-progress{height:5px;margin:10px 0 5px;border-radius:4px;background:#ece9e3;overflow:hidden}.cause-progress i{display:block;height:100%;border-radius:4px;background:linear-gradient(90deg,var(--brand-74),var(--brand-83));transition:width .5s}.cause-numbers{display:flex;justify-content:space-between}.cause-numbers b,.cause-numbers small{font-size:11px}.cause-numbers b{font-weight:500}.cause-numbers small{color:color-mix(in oklab, var(--brand-58), #7a7a7a 9%)}.cause-card footer{display:flex;align-items:center;justify-content:space-between;margin-top:10px}.cause-card .mini-faces img,.cause-card .mini-faces span{width:25px;height:25px}.support-cause{height:30px;padding:0 14px;border:0;border-radius:7px;background:var(--brand-97);color:color-mix(in oklab, var(--brand-47), #5b5b5b 8%);font-size:11px;font-weight:700}.photo-track{display:grid;grid-auto-flow:column;grid-auto-columns:180px;gap:9px;overflow-x:auto;scroll-snap-type:x mandatory}.photo-track button{position:relative;height:130px;padding:0;overflow:hidden;border:0;border-radius:10px;background:#eee;scroll-snap-align:start}.photo-track img{width:100%;height:100%;display:block;object-fit:cover;transition:transform .3s}.photo-track button:hover img{transform:scale(1.06)}.photo-track span{position:absolute;left:0;right:0;bottom:0;padding:22px 9px 8px;background:linear-gradient(transparent,rgba(0,0,0,.72));color:#fff;text-align:left;font-size:11px;font-weight:600}.discovery-modal[hidden]{display:none}.discovery-modal{position:fixed;inset:0;z-index:120;display:grid;place-items:center;padding:20px;background:rgba(16,18,16,.58);backdrop-filter:blur(7px);animation:chat-fade .2s}.discovery-card{position:relative;width:min(650px,100%);max-height:min(760px,calc(100vh - 40px));overflow:auto;border-radius:20px;background:#fff;box-shadow:0 30px 90px rgba(0,0,0,.27);animation:modal-card-in .28s ease both}.discovery-close{position:absolute;right:14px;top:14px;z-index:3;width:34px;height:34px;border:0;border-radius:50%;background:rgba(255,255,255,.9);font-size:21px}.product-preview{display:grid;grid-template-columns:48% 52%;min-height:390px}.product-preview>img{width:100%;height:100%;min-height:390px;object-fit:cover}.product-preview>div{padding:43px 32px 30px}.product-preview small{color:var(--brand-62);font-size:11px;font-weight:700;text-transform:uppercase}.product-preview h2{margin:8px 0;font-size:25px}.product-preview .preview-price{font-size:18px;font-weight:700}.product-preview p{color:#686c67;font-size:12px;line-height:1.55}.preview-features{display:grid;grid-template-columns:repeat(2,1fr);gap:8px;margin:18px 0}.preview-features span{padding:9px;border-radius:7px;background:#f7f5f1;font-size:11px}.preview-actions{display:grid;grid-template-columns:1fr 1.5fr;gap:8px}.preview-actions button{height:43px;border:1px solid color-mix(in oklab, var(--brand-81), #c1c1c1 26%);border-radius:9px;background:color-mix(in oklab, var(--brand-98), #f8f8f8 19%);color:color-mix(in oklab, var(--brand-47), #5b5b5b 6%);font-weight:600}.preview-actions button:last-child{border:0;background:linear-gradient(100deg,var(--brand-74),var(--brand-83));color:#fff}.cause-preview{padding:42px;text-align:center}.cause-preview .cause-visual{width:80px;height:80px;margin:auto;border-radius:20px}.cause-preview h2{margin:16px 0 6px}.cause-preview p{color:#6f736e;font-size:12px}.amount-options{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;margin:20px 0}.amount-options button{height:42px;border:1px solid #e6e1d7;border-radius:8px;background:#fff;font-size:11px}.amount-options button.selected{border-color:color-mix(in oklab, var(--brand-76), #b1b1b1 8%);background:var(--brand-97);color:color-mix(in oklab, var(--brand-47), #5b5b5b 6%);font-weight:700}.confirm-support{width:100%;height:48px;border:0;border-radius:9px;background:linear-gradient(100deg,var(--brand-74),var(--brand-83));color:#fff;font-weight:700}.photo-preview{background:#111}.photo-preview img{display:block;width:100%;max-height:75vh;object-fit:contain}.photo-preview p{margin:0;padding:15px 20px;color:#fff;font-size:12px}@keyframes modal-card-in{from{opacity:0;transform:translateY(15px) scale(.98)}to{opacity:1;transform:translateY(0) scale(1)}}
@media(max-width:720px){.feed-module{padding:14px 13px}.module-header small{display:none}.module-header .carousel-arrow{display:none}.product-track{grid-auto-columns:70%}.cause-grid{grid-template-columns:1fr}.cause-card{grid-template-columns:78px 1fr}.photo-track{grid-auto-columns:72%}.product-preview{display:block}.product-preview>img{height:260px;min-height:0}.product-preview>div{padding:24px 20px}.discovery-card{border-radius:16px}.cause-preview{padding:35px 20px}}
.feed-module+.post{margin-top:16px}

/* Purposeful module rhythm and larger discovery cards */
.feed-module{margin-top:24px;padding:21px 22px}.feed-module+.post{margin-top:24px}.module-header{margin-bottom:18px}.module-header b{font-size:15px}.module-header small{font-size:11px}.product-track{grid-auto-columns:minmax(225px,calc((100% - 20px)/3));gap:12px}.product-card>img{height:155px}.product-card>div{padding:13px}.product-card h3{min-height:38px;font-size:13px}.product-card p{font-size:11px}.product-card .quick-product{height:35px;margin-top:11px}.photo-track{grid-auto-columns:240px;gap:11px}.photo-track button{height:165px}.cause-grid{gap:15px}.cause-card{grid-template-columns:110px 1fr}.cause-card>div{padding:15px}.cause-card h3{font-size:13px}.cause-card p{height:36px;font-size:11px}.cause-progress{margin-top:12px}

/* Designed selects replace browser-native dropdowns */
.smart-select{position:relative}.smart-select-toggle{height:45px;display:flex;align-items:center;gap:10px;padding:0 13px;border:1px solid var(--line);border-radius:11px;background:#fff;color:#4e524d;text-align:left;transition:.2s}.smart-select-toggle:hover,.smart-select-toggle[aria-expanded="true"]{border-color:color-mix(in oklab, var(--brand-78), #b7b7b7 20%);background:color-mix(in oklab, var(--brand-98), #f8f8f8 54%);box-shadow:0 7px 20px rgba(var(--brand-rgb), .07)}.smart-select-toggle>svg{width:18px;color:color-mix(in oklab, var(--brand-58), #7a7a7a 5%)}.smart-select-toggle>span{min-width:0}.smart-select-toggle small,.smart-select-toggle b{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.smart-select-toggle small{color:#8b8e89;font-size:11px;font-weight:500}.smart-select-toggle b{margin-top:1px;color:#343733;font-size:11px}.smart-select-toggle>em{margin-left:auto;font-style:normal;font-size:11px;transition:transform .2s}.smart-select-toggle[aria-expanded="true"]>em{transform:rotate(180deg)}.viewing-smart{width:280px}.viewing-smart .smart-select-toggle{width:100%}.smart-select-menu{position:absolute;z-index:45;right:0;top:52px;width:330px;padding:8px;border:1px solid #e7e3db;border-radius:13px;background:rgba(255,255,255,.98);box-shadow:0 20px 55px rgba(30,27,20,.15);backdrop-filter:blur(15px);animation:filter-pop .18s ease both}.smart-select-menu[hidden]{display:none}.smart-select-menu>small{display:block;padding:7px 9px;color:#92958f;font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.09em}.smart-select-menu>button{width:100%;display:grid;grid-template-columns:37px minmax(0,1fr) 18px;align-items:center;gap:10px;padding:8px;border:0;border-radius:9px;background:none;text-align:left}.smart-select-menu>button:hover{background:#f7f6f2}.smart-select-menu>button.selected{background:var(--brand-98)}.smart-select-menu button>i{width:34px;height:34px;display:grid;place-items:center;border-radius:9px;background:#eee;color:#fff;font-style:normal;font-weight:700}.smart-select-menu button>i.all-community{background:linear-gradient(145deg,#242620,#54564e)}.smart-select-menu button>i.amber{background:linear-gradient(145deg,var(--brand-74),var(--brand-83))}.smart-select-menu button>i.green{background:linear-gradient(145deg,#249f63,#42c57e)}.smart-select-menu button>i.blue{background:linear-gradient(145deg,#3576d4,#65a0ee)}.smart-select-menu button span{min-width:0}.smart-select-menu button b,.smart-select-menu button small{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.smart-select-menu button b{font-size:11px}.smart-select-menu button small{margin-top:2px;color:#858984;font-size:11px}.smart-select-menu button>em{color:var(--brand-62);font-style:normal;font-weight:700}.composer-tools .visibility-smart{height:46px;margin-left:auto;border-left:1px solid #eeeae4}.visibility-smart .smart-select-toggle{width:235px;height:46px;border:0;border-radius:0 10px 10px 0;background:transparent}.visibility-smart .smart-select-menu{width:285px;top:52px}.visibility-smart .smart-select-menu button>i{background:var(--brand-96);color:var(--brand-58)}.composer-tools>div:first-child{min-width:0}
@media(max-width:720px){.viewing-smart{width:100%;margin-top:16px}.viewing-smart .smart-select-menu{position:fixed;left:14px;right:14px;top:125px;width:auto}.composer-tools .visibility-smart{height:auto;margin-left:0;border-left:0;border-top:1px solid #eeeae4}.visibility-smart .smart-select-toggle{width:100%;border-radius:0}.visibility-smart .smart-select-menu{position:fixed;left:14px;right:14px;top:auto;bottom:18px;width:auto}.product-track{grid-auto-columns:82%}.product-card>img{height:170px}.cause-card{grid-template-columns:88px 1fr}.photo-track{grid-auto-columns:82%}.photo-track button{height:190px}}

/* Category icons use the product icon system; emojis remain exclusive to reactions. */
.type-filter-menu>button:not(.clear-filters){display:grid;grid-template-columns:29px minmax(0,1fr) auto;gap:9px;height:42px}.type-filter-menu>button>b{text-align:left;font-size:11px}.type-icon{width:28px;height:28px;display:grid;place-items:center;border-radius:7px}.type-icon svg{width:15px;height:15px}.type-icon.neutral{background:#f0efec;color:#666a65}.type-icon.amber{background:var(--brand-96);color:var(--brand-62)}.type-icon.blue{background:#eaf3ff;color:#3678cc}.type-icon.green{background:#e8f8ed;color:#24984d}.type-icon.coral{background:#fff0eb;color:#d06741}.post-label{display:inline-flex;align-items:center;gap:6px}.post-label svg{width:13px;height:13px}.post-kinds button>svg{width:20px;height:20px}

/* Sidebar cards size to content instead of inheriting the feed's free height. */
.side-column{grid-auto-rows:max-content;align-items:start}.side-card{height:max-content;align-self:start}.event-card{padding:16px}.event-card header{margin-bottom:12px}.event-body{grid-template-columns:58px 1fr;gap:12px}.event-body time{height:62px}.event-body time b{font-size:22px}.event-card footer{margin-top:14px}.activity-card{padding:16px}.activity-card h2{margin-bottom:12px}.activity-card ul{gap:8px}.activity-card li i{width:26px;height:26px}.activity-card>a{margin-top:13px;padding-top:11px;border-top:1px solid #efede8}
@media(min-width:1121px){.side-column{display:flex;flex-direction:column;align-items:stretch;gap:16px}.side-column>.side-card{flex:0 0 auto;width:100%;height:auto;min-height:0}}
/* Compact sidebar cards: isolated from legacy header/footer/list rules. */
.event-card-clean,.activity-card-clean{display:block;height:auto;min-height:0;max-height:none;padding:16px}
.event-card-top{display:flex;align-items:center;justify-content:space-between;gap:12px;margin:0 0 14px}
.event-card-top h2{display:flex;align-items:center;gap:8px;margin:0;font-size:15px}
.event-card-top h2 svg{width:18px;height:18px;color:color-mix(in oklab, var(--brand-47), #5b5b5b 8%)}
.event-card-top a{color:var(--brand-67);font-size:11px;text-decoration:none}
.event-card-main{display:grid;grid-template-columns:58px minmax(0,1fr);align-items:center;gap:12px}
.event-card-main time{width:58px;height:62px;display:grid;place-content:center;text-align:center;border-radius:10px;background:color-mix(in oklab, var(--brand-98), #f8f8f8 17%)}
.event-card-main time b,.event-card-main time span{display:block}
.event-card-main time b{font-size:22px;line-height:1}
.event-card-main time span{margin-top:4px;font-size:11px;font-weight:700}
.event-copy{min-width:0}
.event-copy h3{margin:0 0 5px;font-size:13px;line-height:1.35}
.event-copy p{margin:2px 0;color:var(--muted);font-size:11px;line-height:1.35}
.event-card-actions{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-top:14px}
.event-card-actions .event-join{height:36px;padding-inline:20px}

.activity-card-clean{display:flex!important;flex-direction:column!important;overflow:hidden}
.activity-card-clean h2{flex:0 0 auto;margin:0 0 13px;font-size:15px}
.activity-list{display:grid;gap:8px}
.activity-list>div{display:grid;grid-template-columns:28px minmax(0,1fr);align-items:center;gap:10px}
.activity-list i{width:28px;height:28px;display:grid;place-items:center;border-radius:8px;font-style:normal}
.activity-list i svg{width:16px;height:16px}
.activity-list span{min-width:0}
.activity-list b,.activity-list small{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.activity-list b{font-size:11px;font-weight:600}
.activity-list small{margin-top:2px;color:var(--muted);font-size:11px}
.activity-link{position:static!important;flex:0 0 auto;display:flex!important;align-items:center;justify-content:space-between;width:100%;margin:13px 0 0!important;padding:11px 0 0!important;border-top:1px solid #efede8;color:var(--brand-67);font-size:11px;text-decoration:none;transform:none!important}
.activity-link svg{width:16px;height:16px}
@media(min-width:1121px){.event-card-clean{display:block!important}.event-card-clean,.activity-card-clean{height:auto!important;min-height:0!important;max-height:none!important;padding:16px!important}.activity-card-clean{display:flex!important}}

/* New-member discovery appears after the first full feed cycle. */
.module-icon.members{background:#edf8f0;color:#238d4d}
.module-icon.members svg{width:19px;height:19px}
.member-discovery-track{display:grid;grid-auto-flow:column;grid-auto-columns:190px;gap:12px;overflow-x:auto;scroll-snap-type:x mandatory}
.member-discovery-card{overflow:hidden;border:1px solid #e7e4dd;border-radius:12px;background:#fff;scroll-snap-align:start;transition:transform .2s,border-color .2s,box-shadow .2s}
.member-discovery-card:hover{transform:translateY(-3px);border-color:color-mix(in oklab, var(--brand-81), #c1c1c1 28%);box-shadow:0 9px 24px rgba(var(--brand-rgb), .09)}
.member-discovery-card>img{display:block;width:100%;height:132px;object-fit:cover;object-position:center 25%;background:#f2f1ee}
.member-discovery-card>div{padding:12px}
.member-discovery-card b,.member-discovery-card span,.member-discovery-card small{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.member-discovery-card b{font-size:12px}
.member-discovery-card span{margin-top:4px;color:#585c57;font-size:11px}
.member-discovery-card small{margin-top:3px;color:#91958f;font-size:11px}
.connect-member{width:100%;height:34px;margin-top:11px;border:1px solid color-mix(in oklab, var(--brand-91), #e1e1e1 52%);border-radius:8px;background:var(--brand-98);color:color-mix(in oklab, var(--brand-47), #5b5b5b 11%);font-size:11px;font-weight:700;transition:.18s}
.connect-member:hover{border-color:color-mix(in oklab, var(--brand-76), #b1b1b1 10%);background:var(--brand-96)}
.connect-member.connected{border-color:#cce8d5;background:#edf9f0;color:#217a43}
@media(max-width:720px){.member-discovery-track{grid-auto-columns:72%}.member-discovery-card>img{height:175px}}

/* Contextual rail fills the lower right side without trapping page scrolling. */
.side-feed-nav{position:sticky;top:92px;z-index:5;padding:16px!important;background:rgba(255,255,255,.94);backdrop-filter:blur(16px)}
.side-feed-nav-head{display:flex;align-items:end;justify-content:space-between}
.side-feed-nav-head small{display:block;margin-bottom:2px;color:#92958f;font-size:11px}
.side-feed-nav-head h2{margin:0;font-size:15px}
.feed-progress-label{color:var(--brand-58);font-size:11px;font-weight:700}
.feed-progress{height:4px;margin:12px 0 10px;overflow:hidden;border-radius:4px;background:#eeeae2}
.feed-progress i{display:block;width:0;height:100%;border-radius:4px;background:linear-gradient(90deg,var(--brand-74),var(--brand-83));transition:width .18s linear}
.side-feed-links{display:grid;gap:3px}
.side-feed-links button{width:100%;display:grid;grid-template-columns:32px minmax(0,1fr);align-items:center;gap:10px;padding:8px;border:0;border-radius:9px;background:transparent;text-align:left;color:#3e423d;transition:.16s}
.side-feed-links button:hover,.side-feed-links button.active{background:var(--brand-98);color:color-mix(in oklab, var(--brand-47), #5b5b5b 5%)}
.side-feed-links button:focus{outline:none}.side-feed-links button:focus-visible{box-shadow:inset 0 0 0 2px color-mix(in oklab, var(--brand-76), #b1b1b1 6%)}
.side-feed-links button>svg{width:17px;height:17px;margin:auto}
.side-feed-links button:first-child>svg{transform:rotate(-90deg)}
.side-feed-links b,.side-feed-links small{display:block}
.side-feed-links b{font-size:11px}
.side-feed-links small{margin-top:2px;color:#8a8e88;font-size:11px}
@media(max-width:1120px){.side-feed-nav{display:none}}
.feed-module.jump-highlight{animation:jump-highlight 1.4s ease both}
@keyframes jump-highlight{0%,100%{border-color:var(--line);box-shadow:var(--shadow)}20%{border-color:color-mix(in oklab, var(--brand-76), #b1b1b1 6%);box-shadow:0 0 0 5px rgba(var(--brand-rgb), .13),0 12px 35px rgba(var(--brand-rgb), .09)}}

/* New-conversation flow inside the messaging drawer. */
.chat-new{min-height:0;display:flex;flex-direction:column;flex:1;background:#fff}
.chat-new[hidden]{display:none}
.chat-new-head{height:64px;display:flex;align-items:center;gap:11px;padding:0 14px;border-bottom:1px solid #ece9e3}
.new-chat-back{width:34px;height:34px;display:grid;place-items:center;border:0;border-radius:50%;background:#f5f3ef;font-size:16px}
.chat-new-head b,.chat-new-head small{display:block}
.chat-new-head b{font-size:13px}
.chat-new-head small{margin-top:2px;color:#8a8e88;font-size:11px}
.new-chat-search{height:43px;display:flex;align-items:center;gap:9px;margin:13px 14px 10px;padding:0 12px;border:1px solid #e7e3dc;border-radius:11px;background:#faf9f7;transition:.18s}
.new-chat-search:focus-within{border-color:color-mix(in oklab, var(--brand-78), #b7b7b7 17%);background:#fff;box-shadow:0 0 0 3px rgba(var(--brand-rgb), .08)}
.new-chat-search svg{width:16px;color:#777b76}
.new-chat-search input{width:100%;border:0;outline:0;background:none;font-size:11px}
.new-chat-section-title{display:flex;justify-content:space-between;padding:5px 17px 7px}
.new-chat-section-title span{font-size:11px;font-weight:700}
.new-chat-section-title small{color:#969a94;font-size:11px}
.new-chat-people{min-height:0;overflow:auto;padding:0 8px 6px}
.new-chat-people>button{width:100%;display:grid;grid-template-columns:44px minmax(0,1fr) 30px;align-items:center;gap:10px;padding:9px;border:0;border-radius:11px;background:none;text-align:left;transition:.16s}
.new-chat-people>button:hover{background:var(--brand-98)}
.new-chat-people p{margin:0;min-width:0}
.new-chat-people b,.new-chat-people p span,.new-chat-people small{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.new-chat-people b{font-size:11px}
.new-chat-people p span{margin-top:2px;color:#666a65;font-size:11px}
.new-chat-people small{margin-top:2px;color:#9a9d98;font-size:11px}
.new-chat-people em{width:28px;height:28px;display:grid;place-items:center;border:1px solid color-mix(in oklab, var(--brand-87), #d4d4d4 62%);border-radius:50%;background:color-mix(in oklab, var(--brand-98), #f8f8f8 33%);color:var(--brand-58);font-style:normal;font-size:16px}
.create-group-chat{display:grid;grid-template-columns:38px minmax(0,1fr) 20px;align-items:center;gap:10px;margin:8px 14px 14px;padding:10px;border:1px solid #e8e3d9;border-radius:11px;background:#fff;text-align:left}
.create-group-chat>span{width:36px;height:36px;display:grid;place-items:center;border-radius:10px;background:var(--brand-96);color:var(--brand-58)}
.create-group-chat svg{width:18px}
.create-group-chat p{margin:0}.create-group-chat b,.create-group-chat small{display:block}.create-group-chat b{font-size:11px}.create-group-chat small{margin-top:2px;color:#8d918b;font-size:11px}.create-group-chat em{color:var(--brand-58);font-style:normal}
.new-thread-empty{display:grid;place-items:center;min-height:210px;padding:25px;text-align:center}
.new-thread-empty span{width:58px;height:58px;display:grid;place-items:center;margin:auto;border-radius:18px;background:var(--brand-96);color:var(--brand-58)}
.new-thread-empty svg{width:25px;height:25px}.new-thread-empty b,.new-thread-empty small{display:block}.new-thread-empty b{margin-top:13px;font-size:12px}.new-thread-empty small{max-width:220px;margin:5px auto 0;color:#858984;font-size:11px;line-height:1.45}

/* Community identity can be a logo, an icon or a photographic mark. */
.community-switch .switch-icon{width:36px;height:36px;flex:0 0 36px;display:grid;place-items:center;overflow:hidden;border-radius:9px;color:#fff;font-size:0}
.community-switch .switch-icon svg{width:17px;height:17px}
.switch-icon.amber{background:linear-gradient(145deg,var(--brand-74),var(--brand-83))}
.switch-icon.blue{background:linear-gradient(145deg,#3576d4,#65a0ee)}
.switch-icon.green{background:linear-gradient(145deg,#249f63,#42c57e)}
.switch-icon.violet{background:linear-gradient(145deg,#7d55ca,#ab83ec)}
.switch-icon.coral{background:linear-gradient(145deg,#d75c58,#f28b7f)}
.community-symbol svg,.smart-select-menu button>i svg{width:18px;height:18px}
.community-symbol img,.smart-select-menu button>i img,.smart-toggle-identity img,.switch-icon img{width:100%;height:100%;display:block;object-fit:cover}
.community-symbol.identity-photo,.smart-select-menu button>i.identity-photo,.switch-icon.identity-photo,.smart-toggle-identity.identity-photo{padding:0!important;background:#eceae5!important;color:transparent}
.smart-toggle-identity{width:36px;height:36px;flex:0 0 36px;display:grid;place-items:center;overflow:hidden;border-radius:9px;background:#eee;color:#fff;font-size:14px;font-weight:700}
.smart-toggle-identity.all-community{background:linear-gradient(145deg,#242620,#54564e)}
.smart-toggle-identity.amber{background:linear-gradient(145deg,var(--brand-74),var(--brand-83))}
.smart-toggle-identity.blue{background:linear-gradient(145deg,#3576d4,#65a0ee)}
.smart-toggle-identity svg{width:16px;height:16px}
.smart-select-menu button>i.identity-photo{border:1px solid #e4e1da}
.community-menu .community-symbol,.smart-select-menu button>i{width:36px!important;height:36px!important;min-width:36px;flex:0 0 36px;border-radius:9px!important}
.community-menu .community-symbol img,.smart-select-menu button>i img{width:36px;height:36px;object-fit:cover}

/* Header rhythm: clearer separation between brand, workspace and navigation. */
@media(min-width:1381px){
  .app-header{height:82px;gap:26px;padding-inline:clamp(30px,2.5vw,52px);box-shadow:0 3px 18px rgba(33,29,21,.025)}
  .wordmark{gap:12px;padding-right:3px;font-size:23px}
  .community-picker{padding-left:22px;border-left:1px solid #ece9e3}
  .community-switch{height:52px;min-width:238px;padding:0 13px;gap:11px;border-radius:13px}
  .community-current{font-size:11px;line-height:1.25}
  .community-menu{top:61px}
  .main-nav{gap:27px}
  .main-nav a{padding-inline:2px;font-size:12px}
  .global-search{height:44px;min-width:235px;max-width:285px;margin-left:auto;padding-inline:17px}
  .header-actions{gap:10px;margin-left:2px}
  .header-actions>button{width:42px;height:42px}
}
@media(min-width:1381px) and (max-width:1580px){
  .app-header{gap:20px;padding-inline:28px}
  .community-picker{padding-left:16px}
  .community-switch{min-width:215px}
  .main-nav{gap:20px}
  .main-nav a:nth-last-child(-n+2){display:none}
  .global-search{min-width:205px;max-width:235px}
}


/* Account menu shared across the authenticated mockups. */
.account-menu{position:fixed;z-index:96;top:70px;right:24px;width:280px;overflow:hidden;border:1px solid #e5e1d9;border-radius:15px;background:rgba(255,255,255,.98);box-shadow:0 22px 60px rgba(30,27,21,.18);backdrop-filter:blur(16px);animation:account-in .18s ease both}
.account-menu[hidden]{display:none}.account-menu>header{display:grid;grid-template-columns:43px minmax(0,1fr);align-items:center;gap:10px;padding:14px;border-bottom:1px solid #ece9e3}.account-menu>header img{width:43px;height:43px;border-radius:12px;object-fit:cover}.account-menu>header b,.account-menu>header small{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.account-menu>header b{font-size:13px}.account-menu>header small{margin-top:3px;color:#8a8e88;font-size:11px}.account-menu nav{display:grid;height:auto;padding:7px}.account-menu nav a,.account-menu nav button{width:100%;height:39px;display:flex;align-items:center;justify-content:space-between;padding:0 10px;border:0;border-radius:8px;background:none;color:#565a55;text-align:left;font-size:12px;text-decoration:none}.account-menu nav a:hover,.account-menu nav button:hover{background:#f7f5f1;color:#171916}.account-menu nav a span{color:var(--brand-62)}.account-language{display:flex;align-items:center;justify-content:space-between;padding:11px 14px;border-top:1px solid #ece9e3}.account-language>span{color:#777b76;font-size:11px}.account-language>div{display:flex;gap:4px}.account-language button{width:32px;height:27px;border:0;border-radius:7px;background:none;color:#7f8691;font-size:11px}.account-language button.active{background:color-mix(in oklab, var(--brand-96), #f2f2f2 11%);color:color-mix(in oklab, var(--brand-47), #5b5b5b 6%);font-weight:700}.account-logout{width:100%;height:45px;padding:0 14px;border:0;border-top:1px solid #ece9e3;background:#fff;color:#7a5b57;text-align:left;font-size:12px}.account-logout:hover{background:#fff4f2;color:#a33e33}@keyframes account-in{from{opacity:0;transform:translateY(-6px) scale(.97)}to{opacity:1;transform:translateY(0) scale(1)}}@media(max-width:620px){.account-menu{top:60px;right:10px;width:min(300px,calc(100vw - 20px))}}
/* Modern notification center: contextual, actionable and grouped by time. */
.notification-panel{position:fixed;z-index:86;top:72px;right:74px;width:min(420px,calc(100vw - 32px));max-height:calc(100vh - 92px);display:flex;flex-direction:column;overflow:hidden;border:1px solid #e8e4dc;border-radius:18px;background:rgba(255,255,255,.98);box-shadow:0 26px 75px rgba(28,25,19,.2);backdrop-filter:blur(18px);transform-origin:top right;animation:notification-in .22s ease both}
.notification-panel[hidden]{display:none}
.notification-head{display:flex;align-items:center;justify-content:space-between;padding:18px 18px 13px}
.notification-head h2{margin:0;font-size:18px;letter-spacing:-.02em}.notification-head small{display:block;margin-top:3px;color:#8b8f89;font-size:11px}.notification-head small b{color:var(--brand-62)}
.mark-all-read{padding:7px 9px;border:0;border-radius:7px;background:var(--brand-98);color:var(--brand-54);font-size:11px;font-weight:700}
.mark-all-read:disabled{opacity:.45;cursor:default}
.notification-tabs{display:flex;gap:5px;padding:0 18px 11px;border-bottom:1px solid #ece9e3}
.notification-tabs button{height:31px;padding:0 11px;border:0;border-radius:8px;background:transparent;color:#747872;font-size:11px}
.notification-tabs button.active{background:var(--brand-97);color:color-mix(in oklab, var(--brand-47), #5b5b5b 7%);font-weight:700}.notification-tabs span{display:inline-grid;place-items:center;min-width:17px;height:17px;margin-left:3px;padding:0 4px;border-radius:9px;background:var(--brand-74);color:#fff;font-size:11px}
.notification-list{min-height:0;overflow:auto;padding:5px 9px 10px;scrollbar-width:thin;scrollbar-color:#d8d5cf transparent}
.notification-group h3{margin:10px 9px 5px;color:#999c97;font-size:11px;text-transform:uppercase;letter-spacing:.09em}
.notification-item{position:relative;display:grid;grid-template-columns:43px minmax(0,1fr) 9px;gap:10px;padding:11px 9px;border-radius:12px;outline:0;transition:.16s}
.notification-item:hover,.notification-item:focus-visible{background:#f7f6f2}.notification-item.unread{background:color-mix(in oklab, var(--brand-98), #f8f8f8 19%)}.notification-item.unread:hover{background:var(--brand-97)}
.notification-visual{width:42px;height:42px;display:grid;place-items:center;overflow:hidden;border-radius:12px}
.notification-visual svg{width:19px;height:19px}.notification-visual img{width:100%;height:100%;object-fit:cover}.notification-visual.amber{background:var(--brand-96);color:var(--brand-58)}.notification-visual.green{background:#e7f8ed;color:#238d4d}.notification-visual.blue{background:#eaf3ff;color:#3779ce}.notification-visual.photo{background:#eee}
.notification-item>div{min-width:0}.notification-item p{margin:0}.notification-item p b,.notification-item p span{display:block}.notification-item p b{font-size:11px}.notification-item p span{margin-top:3px;color:#6f736e;font-size:11px;line-height:1.4}.notification-item small{display:block;margin-top:5px;color:#9a9d98;font-size:11px}
.unread-dot{width:8px;height:8px;margin-top:5px;border-radius:50%;background:var(--brand-74)}
.notification-action{height:27px;margin-top:8px;padding:0 10px;border:1px solid color-mix(in oklab, var(--brand-87), #d4d4d4 43%);border-radius:7px;background:#fff;color:color-mix(in oklab, var(--brand-51), #666666 6%);font-size:11px;font-weight:700}
.notification-empty{min-height:230px;place-items:center;align-content:center;padding:30px;text-align:center}.notification-empty:not([hidden]){display:grid}.notification-empty>span{width:50px;height:50px;display:grid;place-items:center;border-radius:15px;background:#f4f2ee;color:#777}.notification-empty svg{width:22px}.notification-empty b,.notification-empty small{display:block}.notification-empty b{margin-top:11px;font-size:12px}.notification-empty small{margin-top:4px;color:#8c908a;font-size:11px}
.notification-footer{padding:10px 14px 13px;border-top:1px solid #ece9e3}.notification-footer button{width:100%;display:flex;align-items:center;justify-content:space-between;padding:8px;border:0;background:none;color:var(--brand-58);font-size:11px;font-weight:700}
.notification-back{display:none;width:36px;height:36px;place-items:center;border:0;border-radius:50%;background:#f3f1ed;font-size:17px}
.notification-item.notification-extra{display:none}
.notification-center-scrim{position:fixed;inset:0;z-index:85;background:rgba(24,25,22,.28);backdrop-filter:blur(4px);animation:chat-fade .2s ease}
.notification-center-scrim[hidden]{display:none}
.notification-panel.full-view{top:94px;right:auto;bottom:28px;left:50%;width:min(900px,calc(100vw - 48px));max-height:none;border-radius:20px;transform:translateX(-50%);animation:none}
.notification-panel.full-view .notification-head{padding:20px 24px 15px}.notification-panel.full-view .notification-back{display:grid}.notification-panel.full-view .notification-head>div{margin-right:auto}.notification-panel.full-view .notification-head h2{font-size:22px}
.notification-panel.full-view .notification-tabs{padding-inline:24px}.notification-panel.full-view .notification-list{padding:12px 24px 24px}.notification-panel.full-view .notification-group{max-width:760px;margin-inline:auto}.notification-panel.full-view .notification-group h3{margin-top:16px}.notification-panel.full-view .notification-item{grid-template-columns:48px minmax(0,1fr) 10px;padding:14px 12px}.notification-panel.full-view .notification-visual{width:46px;height:46px}.notification-panel.full-view .notification-item p b{font-size:12px}.notification-panel.full-view .notification-item p span{font-size:11px}.notification-panel.full-view .notification-item.notification-extra{display:grid}.notification-panel.full-view .notification-footer{display:none}
@keyframes notification-in{from{opacity:0;transform:translateY(-8px) scale(.97)}to{opacity:1;transform:translateY(0) scale(1)}}
@media(max-width:720px){.notification-panel,.notification-panel.full-view{top:64px;right:0;bottom:0;left:0;width:100%;max-height:none;border-radius:18px 18px 0 0;transform:none}.notification-head{padding-top:20px}.notification-item{grid-template-columns:43px minmax(0,1fr) 9px}.notification-panel.full-view .notification-head{padding:17px 14px 13px}.notification-panel.full-view .notification-tabs{padding-inline:14px}.notification-panel.full-view .notification-list{padding:8px 9px 18px}}


/* ============================================================
   ADDITIONS — ours. Only facts about our data she did not face,
   and elements that differ structurally. Never a preference.
   ============================================================ */

/* Most of our members have no photo. Initials must occupy exactly
   the space the image would, or the author block reflows. Note the
   tag: her `.author i` and `.person-avatar i` are decorative dots,
   so initials must not be an <i>. */
.post-initials { display: grid; place-items: center; flex: 0 0 auto;
    width: 46px; height: 46px; border-radius: 50%;
    background: var(--av, linear-gradient(145deg,var(--brand-74),var(--brand-83)));
    color: #fff; font-size: 14px; font-weight: 700; }
.online-avatar .post-initials { width: 49px; height: 49px; }
.person .post-initials { width: 45px; height: 45px; font-size: 13px; }
/* S31: la regla del punto de presencia (arriba, en el bloque portado:
   busca `.member-row .kol-presence`) decia `.member-row i`, y en esa fila
   hay DOS <i>: el punto y el avatar de iniciales de quien no tiene foto.
   El avatar se llevaba el position:absolute, los 9px y el verde del
   punto, así que las cuatro caras de "Miembros activos ahora" salían
   iguales y verdes, cada una con su tono real anulado. (Una sesión previa
   ya se topó con esto y parcheó sólo el COLOR del punto en kol-shell.css;
   la forma seguía rota.) Nadie lo vio antes porque la tarjeta no llegaba
   a pintarse: feed_strips no devolvía nada para ella.
   Se acota al punto, que es lo que la regla siempre quiso decir. */
.member-row .post-initials { width: 100%; height: 100%; font-size: 11px; }

/* Her author was a div; ours is a link to the member page. It has to
   read as a name, not as a URL. */
a.author { text-decoration: none; color: inherit; min-width: 0; }
a.author:hover b { text-decoration: underline; }
a.author p { min-width: 0; }
a.author b, a.author small { display: block; overflow: hidden;
    text-overflow: ellipsis; white-space: nowrap; }

/* Her rail buttons are links for us. */
a.event-join, a.person-cta { display: inline-flex; align-items: center;
    justify-content: center; text-decoration: none; }
a.person-cta { height: 31px; padding: 0 13px; border: 1px solid color-mix(in oklab, var(--brand-91), #e1e1e1 65%);
    border-radius: 7px; background: color-mix(in oklab, var(--brand-98), #f8f8f8 25%); color: color-mix(in oklab, var(--brand-51), #666666 10%);
    font-size: 10px; font-weight: 600; }

/* Anything irreversible hangs off her options button. Her mockup had
   no menu behind it because nothing in it was destructive. */
.post-header { position: relative; }
.post-more-menu { position: absolute; right: 0; top: 40px; z-index: 20;
    min-width: 168px; padding: 6px; border: 1px solid #ebe8e2;
    border-radius: 12px; background: #fff;
    box-shadow: 0 18px 44px rgba(23,25,22,.14); }
.post-more-menu[hidden] { display: none; }
.post-more-menu button { display: block; width: 100%; padding: 10px 12px;
    border: 0; border-radius: 8px; background: none; text-align: left;
    font-size: 13px; }
.post-more-menu button:hover { background: #f7f6f3; }
.post-more-menu button.danger { color: #c0392b; }

/* The interleaved shelves are ours (S14) and she never drew them.
   They wear her card so a shelf and a post read as one family. */
.strip { margin-top: 16px; padding: 18px 20px; background: var(--surface);
    border: 1px solid var(--line); border-radius: 16px; box-shadow: var(--shadow); }
.strip-head { display: flex; align-items: center; justify-content: space-between;
    margin-bottom: 15px; }
.strip-head b { font-size: 15px; letter-spacing: -.01em; }
.strip-head a { color: var(--brand-67); font-size: 11px; text-decoration: none; }
.strip-track { display: flex; gap: 12px; overflow-x: auto; padding-bottom: 4px; }
.strip-card { flex: 0 0 172px; display: block; padding: 12px;
    border: 1px solid #efede8; border-radius: 12px; background: #fdfcfa;
    color: inherit; text-decoration: none; transition: .16s; }
.strip-card:hover { border-color: color-mix(in oklab, var(--brand-91), #e1e1e1 70%); background: color-mix(in oklab, var(--brand-98), #f8f8f8 38%); }
.strip-card .strip-img, .strip-card .strip-ph { display: grid; place-items: center;
    width: 100%; height: 92px; margin-bottom: 10px; border-radius: 9px;
    object-fit: cover; background: #f3f1ec; font-size: 22px; }
.strip-card .strip-ph.initials { background: linear-gradient(145deg,var(--brand-74),var(--brand-83));
    color: #fff; font-size: 20px; font-weight: 700; }
.strip-name { font-size: 12.5px; font-weight: 700; line-height: 1.3;
    overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.strip-meta { margin-top: 3px; color: var(--muted); font-size: 11px;
    overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.strip-cta { display: inline-block; margin-top: 9px; padding: 5px 10px;
    border-radius: 7px; background: var(--brand-98); color: color-mix(in oklab, var(--brand-47), #5b5b5b 6%); font-size: 11px;
    font-weight: 600; }

/* Our composer carries fields hers did not: a product picker, a group
   target, a tag row. They sit inside her card without changing it. */
.composer .field { margin: 0 0 12px; }
.composer-scopes { display: flex; align-items: center; gap: 8px; }
.composer-scopes select { border: 0; outline: 0; background: none;
    font-size: 12px; font-weight: 600; }
.composer .publish-button { background: linear-gradient(100deg,var(--brand-72),var(--brand-83));
    color: #fff; border: 0; }

@media (max-width: 720px) { .strip { padding: 15px 13px; } }

/* Estado vacío del carril: ocupa el espacio con intención, no en blanco. */
.rail-empty{display:grid;justify-items:center;gap:9px;padding:18px 10px 6px;text-align:center}
.rail-empty i{width:42px;height:42px;display:grid;place-items:center;border-radius:12px;background:var(--brand-98);color:var(--brand-62)}
.rail-empty i svg{width:20px;height:20px;fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}
.rail-empty p{margin:0;color:var(--muted);font-size:12px;line-height:1.45}
.rail-empty a{color:var(--brand-67);font-size:12px;font-weight:600;text-decoration:none}
.rail-empty a:hover{text-decoration:underline}

/* Iniciales como avatar en los comentarios: el CSS del diseño dimensiona
   solo <img>, y sin foto avatarHtml emite .post-initials. */
.comment>.post-initials{width:38px;height:38px;font-size:12px}
.comment.reply>.post-initials{width:30px;height:30px;font-size:11px}
.comment-composer>.post-initials{width:36px;height:36px;font-size:12px}
.comments-head span{color:#8a8d87;font-size:11px}

/* avatarHtml emite <b class="post-initials">, y `.author b{display:block}`
   le ganaba por especificidad: las iniciales perdían el centrado y salían
   corridas. Misma especificidad, más abajo en el archivo: gana esta. */
b.post-initials{display:grid;place-items:center;line-height:1;text-align:center}

/* El anillo de foco lo pintaba el navegador en su azul por defecto.
   Se recolorea, no se elimina: quitarlo dejaría sin rastro al teclado. */
.dashboard :focus-visible{outline:2px solid var(--brand-76);outline-offset:2px;border-radius:8px}
.feed-tabs button:focus-visible,.post-kinds button:focus-visible{outline-offset:1px}

/* Una persona no es una portada: el marcador rectangular de 108px (y su
   gradiente azul Oceano heredado) se convierte en avatar circular sobre
   fondo crema, que es como se lee a alguien en una tarjeta. */
.strip-ph.initials{background:linear-gradient(160deg,color-mix(in oklab, var(--brand-98), #f8f8f8 33%),color-mix(in oklab, var(--brand-96), #f2f2f2 24%))!important}
.strip-ph.initials>span{width:62px;height:62px;display:grid;place-items:center;border-radius:50%;background:var(--av,linear-gradient(145deg,var(--brand-74),var(--brand-83)));color:#fff;font-size:20px;font-weight:700;letter-spacing:-.02em;box-shadow:0 6px 16px rgba(var(--brand-rgb), .25)}

/* La cara del botón reemplaza al icono cuando hay reacción puesta. */
.like-button .react-face{font-size:17px;line-height:1}
.like-button .react-face + svg{display:none}
.reaction-control:hover .reaction-picker{opacity:1;visibility:visible;transform:translateY(0) scale(1);pointer-events:auto;transition-delay:0s}
.reaction-picker button:hover{transform:translateY(-5px) scale(1.2)}

/* Guía de recorrido: nace oculta y aparece al bajar. Se queda pegada
   para que el salto esté siempre a mano sin robar altura al carril. */
.scroll-guide{position:sticky;top:96px;opacity:0;transform:translateY(8px);
  pointer-events:none;transition:opacity .22s ease,transform .22s ease}
.scroll-guide.on{opacity:1;transform:none;pointer-events:auto}
.guide-head{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;margin-bottom:11px}
.guide-head small{display:block;color:var(--muted);font-size:11px}
.guide-head b{display:block;margin-top:2px;font-size:16px;letter-spacing:-.02em}
.guide-pct{color:var(--brand-67);font-size:12px;font-weight:700}
.guide-bar{height:4px;border-radius:4px;background:#f0ece4;overflow:hidden}
.guide-bar i{display:block;height:100%;width:0;border-radius:4px;
  background:linear-gradient(90deg,var(--brand-72),var(--brand-83));transition:width .18s ease}
.guide-steps{list-style:none;margin:14px 0 0;padding:0;display:grid;gap:2px}
.guide-steps li{display:grid;grid-template-columns:34px 1fr;align-items:center;gap:11px;
  padding:9px 10px;border-radius:11px;cursor:pointer;transition:background .16s}
.guide-steps li:hover{background:#faf8f4}
.guide-steps li.now{background:color-mix(in oklab, var(--brand-98), #f8f8f8 6%)}
.guide-steps li i{width:34px;height:34px;display:grid;place-items:center;border-radius:10px;
  background:#f5f2ec;color:#7a7266}
.guide-steps li.now i{background:var(--brand-96);color:var(--brand-58)}
.guide-steps li i svg{width:17px;height:17px;fill:none;stroke:currentColor;stroke-width:1.9;
  stroke-linecap:round;stroke-linejoin:round}
.guide-steps li b{display:block;font-size:12.5px;font-weight:600}
.guide-steps li small{display:block;margin-top:1px;color:var(--muted);font-size:11px}

/* El sprite no tiene flecha hacia arriba; se gira la horizontal. */
.guide-steps li[data-step="top"] i svg{transform:rotate(-90deg)}

/* Barra de filtros del muro, según la maqueta: una tarjeta blanca que
   contiene el buscador (relleno suave, sin borde propio) y los controles
   en píldora. La rejilla anterior declaraba cinco columnas para tres
   elementos, así que la ✕ quedaba suelta a media fila. */
.filters{display:flex;align-items:center;gap:10px;
  margin:20px 0 14px;padding:11px 12px;
  border:1px solid var(--line);border-radius:16px;background:#fff;
  box-shadow:var(--shadow-sm,0 6px 18px rgba(37,32,22,.05))}
.filters label{flex:1 1 auto;min-width:0;height:46px;gap:11px;padding:0 16px;
  border:1px solid transparent;border-radius:13px;background:#f4f2ee;transition:.16s}
.filters label:focus-within{border-color:color-mix(in oklab, var(--brand-78), #b7b7b7 7%);background:#fff;
  box-shadow:0 0 0 3px rgba(var(--brand-rgb), .1)}
.filters label svg{width:18px;height:18px;flex:0 0 18px;color:#8a8e87}
.filters input{font-size:13.5px}
.filters input::placeholder{color:#9a9e97}
.filters>select,.filters>button{flex:0 0 auto;height:46px;border:1px solid var(--line);
  border-radius:13px;background:#fff;color:#3c413b;font:inherit;font-size:12.5px;
  font-weight:600;cursor:pointer;transition:.16s}
.filters>select{padding:0 34px 0 14px;
  background-image:linear-gradient(45deg,transparent 50%,#9a9e97 50%),
                   linear-gradient(135deg,#9a9e97 50%,transparent 50%);
  background-position:calc(100% - 17px) 21px,calc(100% - 12px) 21px;
  background-size:5px 5px,5px 5px;background-repeat:no-repeat;
  -webkit-appearance:none;appearance:none}
.filters>select:hover,.filters>button:hover{border-color:#ddd7cc;background:#faf8f4}
.filters .filter-icon{width:46px;padding:0;color:#8a8e87;font-size:15px}
.filters .filter-icon:hover{color:#3c413b}
@media(max-width:720px){
  .filters{flex-wrap:wrap;padding:10px}
  .filters label{flex:1 1 100%}
}

/* Estado del compositor: un fallo no puede anunciarse en verde. */
.draft-status.is-ok   { color: var(--green); }
.draft-status.is-bad  { color: #c0392b; }
.draft-status.is-busy { color: var(--muted); }
/* El campo de etiquetas colgaba suelto bajo la barra de herramientas;
   ahora se lee como continuación de ella. */
#tagsField { margin: 8px 0 0 !important; }
#tagsField input { width: 100%; height: 44px; padding: 0 15px; border: 1px solid #eeeae4;
    border-radius: 10px; background: #fdfdfc; font: inherit; font-size: 13px; outline: 0;
    transition: .16s; }
#tagsField input:focus { border-color: color-mix(in oklab, var(--brand-78), #b7b7b7 7%); background: #fff;
    box-shadow: 0 0 0 3px rgba(var(--brand-rgb), .1); }
.composer-tools button:hover, .composer-tools label:hover { background: #f6f4f0;
    border-radius: 9px; cursor: pointer; }


/* Tipos de publicación: eran pestañas de 49px con una línea inferior que no
   llegaba a ningún sitio y un activo que saltaba 1px. Ahora son píldoras
   alineadas con el avatar, sin subrayado y sin desplazamiento al elegir. */
.post-kinds{gap:6px;margin:14px 0 12px 65px;padding-bottom:0;border-bottom:0}
.post-kinds button{height:40px;gap:8px;padding:0 15px;border:1px solid transparent;
  border-radius:11px;color:#5b605a;font-size:12.5px;font-weight:600;
  transition:background .16s,color .16s,border-color .16s}
.post-kinds button svg{width:17px;height:17px;opacity:.75}
.post-kinds button:hover{background:#f6f4f0;color:#2f332e}
.post-kinds button.active{transform:none;border-color:color-mix(in oklab, var(--brand-83), #c7c7c7 36%);background:color-mix(in oklab, var(--brand-98), #f8f8f8 17%);color:var(--brand-47)}
.post-kinds button.active svg{opacity:1;color:var(--brand-67)}
@media(max-width:720px){.post-kinds{margin-left:0}}

/* dropdown.js copia la clase del <select> al botón que lo reemplaza, y solo
   inventa medidas en línea cuando el select NO tiene clase (era el caso:
   el botón heredaba 18px). Con clase propia, estas reglas alcanzan a los dos.
   Aplican al envoltorio para que el ancho no se descuadre en la fila. */
.filters .select-wrap,.filters .select-wrap.select-block{flex:0 0 auto;display:block;width:auto}
.wall-filter{height:46px;min-width:158px;display:flex;align-items:center;
  justify-content:space-between;gap:10px;padding:0 14px;border:1px solid var(--line);
  border-radius:13px;background:#fff;color:#3c413b;font:inherit;font-size:13px;
  font-weight:600;cursor:pointer;transition:.16s}
.wall-filter:hover{border-color:#ddd7cc;background:#faf8f4}
button.wall-filter[aria-expanded="true"]{border-color:var(--brand-76);
  box-shadow:0 0 0 3px rgba(var(--brand-rgb), .13)}

/* Selectores de contexto del compositor: discretos, son contexto y no acción. */
.composer-scopes .select-wrap{display:block}
.wall-scope{height:38px;max-width:236px;display:flex;align-items:center;gap:8px;
  padding:0 12px;border:1px solid transparent;border-radius:9px;background:none;
  color:#6a6e68;font:inherit;font-size:12px;font-weight:600;cursor:pointer}
.wall-scope:hover{background:#f6f4f0;border-color:#eeeae4}
.wall-scope span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

/* Miniatura del borrador: lo que se subió, antes de publicarlo. */
.draft-image{position:relative;margin:12px 0 0;max-width:320px}
.draft-image img{display:block;width:100%;max-height:220px;border-radius:11px;
  object-fit:cover;border:1px solid var(--line)}
.draft-image button{position:absolute;right:8px;top:8px;width:28px;height:28px;
  display:grid;place-items:center;border:0;border-radius:50%;
  background:rgba(23,25,22,.72);color:#fff;font-size:17px;line-height:1;
  cursor:pointer;transition:.16s}
.draft-image button:hover{background:rgba(23,25,22,.92)}

/* Tipo de publicación en el teléfono: un desplegable, no cinco pestañas.
   La fila cabía en el escritorio y en el móvil se salía del borde — la
   última quedaba cortada y sólo aparecía al arrastrar de lado, que nadie
   descubre. Los dos controles llevan el mismo estado y nunca se ven a la
   vez: por encima de 720px manda la fila, por debajo el desplegable. */
.composer-kind{display:none;margin:14px 0 12px}
.composer-kind .select-wrap{display:block;width:100%}
.composer-kind .select-button.wall-scope{width:100%;max-width:none;height:46px;
  padding:0 34px 0 14px;border-color:var(--line);background:#fff;color:var(--ink);
  font-size:13.5px;font-weight:700}
@media(max-width:720px){
  #typeRow{display:none}
  .composer-kind{display:block}

  /* La fila de contexto (comunidad y grupo) era el otro scroll lateral del
     compositor: dos selectores de nombre largo dentro de un overflow-x, o
     sea que el segundo sólo existía si se descubría arrastrando. Apilados
     se leen los dos de una vez, que es justo lo que hay que revisar antes
     de publicar: dónde va a caer esto. */
  .composer-tools>div{overflow-x:visible}
  .composer-tools>div:first-child{display:grid;grid-template-columns:1fr 1fr}
  /* `.composer-tools>div` (0,1,1) le gana a `.composer-scopes` (0,1,0):
     por eso hay que nombrar al padre para volver a apilar. */
  .composer-tools>.composer-scopes{display:grid;gap:4px;padding:2px}
  .composer-scopes .select-wrap{display:block;width:100%}
  .composer-scopes .wall-scope{width:100%;max-width:none;height:42px}
  /* Los dos son el mismo tipo de dato, asi que se escriben igual: sin esto
     el primero heredaba el tamano de campo de formulario y el segundo no. */
  .composer-scopes .select-button.wall-scope{font-size:13px;font-weight:600}
}

/* La encuesta anunciada en el muro. Es una puerta, no un resumen: el título
   y una acción. Lo que la explica es el mensaje que escribió quien la
   publicó, que va arriba como el de cualquier entrada. */
.sv-post{display:flex;align-items:center;justify-content:space-between;gap:14px;
  margin:12px 0 4px;padding:14px 16px;border:1px solid #eee9df;border-left:3px solid var(--amber);
  border-radius:13px;background:color-mix(in oklab, var(--brand-98), #f8f8f8 61%)}
.sv-post strong{display:block;font-size:14.5px;letter-spacing:-.01em}
.sv-post small{display:block;margin-top:3px;color:var(--muted);font-size:11.5px}
.sv-post-cta{flex:0 0 auto;height:36px;display:inline-flex;align-items:center;padding:0 16px;
  border-radius:10px;background:linear-gradient(140deg,var(--brand-76),var(--brand-83));color:var(--brand-on);
  font-size:12.5px;font-weight:700;text-decoration:none;white-space:nowrap}
.sv-post-cta:hover{filter:brightness(1.04)}
.sv-post-closed,.sv-post-done{flex:0 0 auto;color:var(--muted);font-size:12px;font-weight:600}
/* Una encuesta cerrada deja de llamar la atención: sigue ahí como registro. */
.sv-post.closed{border-left-color:#d8d3c8;background:#fbfaf7}
@media(max-width:720px){
  .sv-post{flex-direction:column;align-items:stretch;gap:10px}
  .sv-post-cta{justify-content:center}
}

/* ============================================================
   S31 — ADDITIONS: el muro, sobre el shell con barra lateral.
   Reglas nuestras; nada de arriba se edita en su sitio.
   ============================================================ */

/* ---------- El hero: tú a la izquierda, tu comunidad a la derecha ----------
   Dos bloques sueltos (un <h1> al aire y, debajo, la banda de la
   comunidad) pasan a una sola tarjeta. La columna derecha es fija y no
   fluida: es una foto, y una foto que cambia de proporción con el ancho
   recorta por donde no debe. */
.wall-hero{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,42%);
  margin:0 0 16px;border:1px solid var(--line);border-radius:18px;
  background:var(--surface);box-shadow:var(--shadow);overflow:hidden}
.hero-copy{display:flex;flex-direction:column;align-items:flex-start;
  justify-content:center;gap:4px;padding:26px 28px}
.hero-copy h1{margin:0;font-size:28px;line-height:1.15;letter-spacing:-.035em}
.hero-copy h1 span{font-size:23px}
.hero-copy p{margin:5px 0 0;color:var(--muted);font-size:15px;line-height:1.45}
/* El selector de ámbito sólo aparece si el miembro tiene más de una
   comunidad (feed.js lo oculta); por eso el margen va en él y no en el
   párrafo de arriba, que sí está siempre. */
.hero-copy .viewing-select{margin-top:14px}

/* El panel de la comunidad. Sin portada cargada queda el color de la
   comunidad, que theme.js ya resolvió antes del primer pintado — nunca
   un rectángulo gris. */
.hero-banner{position:relative;display:flex;min-height:172px;overflow:hidden;
  background:linear-gradient(145deg,var(--brand-72),var(--brand-51))}
/* La foto, en su propia capa: así se puede acercar sin arrastrar con ella
   el texto ni el velo, que van encima. */
.hb-photo{position:absolute;inset:0;background-size:cover;
  background-position:center 62%;
  transform:scale(1);transition:transform .5s cubic-bezier(.2,.7,.3,1)}
.hero-banner:hover .hb-photo{transform:scale(1.06)}
.hero-banner[hidden]{display:none}
/* El velo existe sólo cuando hay foto debajo: sobre el degradado de marca
   oscurecería un color que ya está elegido. */
.hero-banner .hb-veil{display:none}
/* El velo cae casi entero sobre el tercio izquierdo, que es donde va el
   texto: ahí tiene que haber contraste de sobra para el blanco. A la
   derecha se levanta hasta casi nada, y es lo único que hace que el panel
   se lea como una imagen y no como un rectángulo teñido. Una cortina
   uniforme apagaba la foto entera para proteger unas pocas palabras. */
.hero-banner.has-cover .hb-veil{position:absolute;inset:0;display:block;
  background:linear-gradient(100deg,rgba(18,20,17,.76) 0%,
                                    rgba(18,20,17,.62) 44%,
                                    rgba(18,20,17,.14) 100%)}
.hb-body{position:relative;display:flex;flex-direction:column;
  justify-content:center;gap:10px;padding:24px 26px;color:#fff}
.hb-quote{margin:0;font-size:19px;font-weight:600;line-height:1.3;
  letter-spacing:-.02em;text-wrap:balance}
.hb-org{display:flex;align-items:center;gap:8px;
  font-size:12.5px;font-weight:500;opacity:.92}
.hb-logo{width:22px;height:22px;flex:0 0 22px;border-radius:6px;object-fit:cover}

/* Una sola columna cuando la tarjeta se estrecha: a menos de 820px el
   panel de la foto baja de 300px y la frase de bienvenida se parte en
   cinco renglones de tres palabras. */
@media(max-width:1180px){
  .wall-hero{grid-template-columns:1fr}
  .hero-banner{min-height:132px}
  .hb-quote{font-size:17px}
}

/* ---------- Las píldoras de tipo ----------
   Eran un <select> "Todo tipo". En fila se ve de un golpe qué se puede
   filtrar y qué filtro está puesto.

   Ocho píldoras piden ~1090px y la columna del muro mide ~1030px con la
   lateral puesta: envuelven a una segunda fila. Envolver y no desplazar,
   porque una fila que se desplaza esconde la última píldora cortada por
   la mitad y nadie arrastra un carrusel que no parece un carrusel. En el
   teléfono se invierte (más abajo): allí envolver serían cuatro renglones
   antes de la primera publicación, y el dedo sí arrastra. */
.wall-chips{display:flex;flex-wrap:wrap;gap:8px;margin:0 0 4px;padding:2px 0}
.wall-chips::-webkit-scrollbar{display:none}
@media(max-width:720px){
  .wall-chips{flex-wrap:nowrap;overflow-x:auto;scrollbar-width:none}
}
.wall-chips button{flex:0 0 auto;height:36px;display:inline-flex;
  align-items:center;gap:7px;padding:0 15px;border:1px solid var(--line);
  border-radius:999px;background:var(--surface);color:var(--muted);
  font-size:13px;font-weight:500;white-space:nowrap;
  transition:border-color .15s,background .15s,color .15s}
.wall-chips button svg{width:15px;height:15px;flex:0 0 15px;
  stroke:currentColor;stroke-width:1.8}
.wall-chips button:hover{border-color:var(--border-strong);color:var(--ink)}
/* El filtro puesto se tiñe de tinta, no de ámbar: el ámbar de esta pantalla
   ya significa "publica" y "ver todas", y un tercer significado lo gasta. */
.wall-chips button.active{border-color:var(--ink);background:var(--ink);
  color:#fff;font-weight:600}
.wall-chips button:focus-visible{outline:2px solid var(--brand-76);outline-offset:2px}

/* La barra de búsqueda se queda con dos controles en vez de tres. */
.filters{margin-top:12px}
.filters label{flex:1;min-width:0}

/* ---------- Los cuatro números, en rejilla ---------- */
.act-grid{display:grid;grid-template-columns:1fr 1fr;gap:9px}
.act-tile{display:grid;grid-template-columns:30px minmax(0,1fr);
  grid-template-rows:auto auto;column-gap:9px;align-items:center;
  padding:11px 12px;border-radius:13px;background:var(--surface-subtle);
  border:1px solid var(--border-subtle)}
.act-tile i{grid-row:1 / span 2;width:30px;height:30px;display:grid;
  place-items:center;border-radius:9px}
.act-tile i svg{width:16px;height:16px;stroke-width:1.9}
.act-tile b{font-size:17px;font-weight:700;line-height:1.1;letter-spacing:-.03em}
.act-tile span{color:var(--muted);font-size:11px;line-height:1.3}
/* Los tonos son los que ya usaba la lista; sólo cambia el envase. */
.act-tile i.green{background:#e7f6ed;color:#1d8a4b}
.act-tile i.purple{background:#f0ecfa;color:#6d4bb5}
.act-tile i.orange{background:var(--brand-96);color:var(--brand-51)}
.act-tile i.blue{background:#e9f0fb;color:#3663b4}

/* ---------- La invitación ----------
   La única tarjeta oscura de la columna, y por eso la última: en medio
   partía en dos la lectura del carril. */
.invite-card{position:relative;display:flex;flex-direction:column;
  align-items:flex-start;gap:7px;border:0;overflow:hidden;color:#fff;
  /* La foto de fondo, y encima un velo. El velo no es decorativo: sobre el
     cielo del atardecer, el blanco del titular se perdía. Cae más cerrado
     a la izquierda —que es donde van el titular y el botón— y se abre
     hacia la derecha, para que se vea que hay un bosque detrás y no una
     mancha verde. */
  background-image:
    linear-gradient(103deg, rgba(9,17,11,.62) 0%, rgba(9,17,11,.44) 46%,
                            rgba(9,17,11,.18) 80%, rgba(9,17,11,.10) 100%),
    url("../img/invite-bosque.jpg");
  background-size:cover;background-position:center 62%;background-repeat:no-repeat}
/* La marca de agua se apaga casi del todo: servía cuando el fondo era un
   degradado liso; sobre la foto es ruido encima de ruido. */
.invite-card .ic-mark{position:absolute;right:-12px;top:10px;width:70px;
  height:70px;stroke:rgba(255,255,255,.10);stroke-width:1.3}
.invite-card h2{position:relative;margin:0;font-size:19px;font-weight:700;
  line-height:1.22;letter-spacing:-.025em;max-width:16ch;
  text-shadow:0 1px 4px rgba(0,0,0,.5)}
/* 30ch y no 24: a 24 la frase partía "comuni-dad" con guion. La app
   lleva hyphens:auto y aquí el ancho es cosa nuestra, así que se
   ensancha el párrafo en vez de apagar la regla global. */
.invite-card p{position:relative;margin:0;max-width:30ch;
  color:rgba(255,255,255,.84);font-size:12.5px;line-height:1.45;
  text-shadow:0 1px 3px rgba(0,0,0,.45)}
.invite-card a{position:relative;height:38px;margin-top:7px;
  display:inline-flex;align-items:center;gap:7px;padding:0 16px;
  border-radius:10px;background:var(--brand-grad);color:var(--brand-on);
  font-size:13px;font-weight:700;text-decoration:none}
.invite-card a svg{width:15px;height:15px;stroke-width:2.1}
.invite-card a:hover{filter:brightness(1.05)}

/* ---------- La rejilla del muro, con la lateral puesta ----------

   Dos arreglos que tienen que vivir juntos, porque son la misma regla:

   1. El muro estaba topado en 920px (minmax(0,920px)) dentro de una
      rejilla centrada, así que en cuanto la ventana daba de sí lo que
      sobraba no se lo quedaba nadie: 184px muertos por lado a 1920, 504 a
      2560. Ahora el muro es 1fr y crece; el carril se queda en sus 360,
      que es lo que miden sus tarjetas. El tope pasa a la rejilla entera,
      porque una publicación de 1500px no se lee de un renglón al otro.

   2. El punto de corte a una columna estaba en 1120px, medido cuando la
      ventana entera era el ancho del contenido. Con la lateral el
      contenido son 250px menos, así que se corre a 1370: es donde ahora
      pasa lo que antes pasaba a 1120.

   Y el aire: la maqueta original se dibujó sin lateral, y sus 42px de
   calle y 45 de arriba se leen como un hueco cuando el muro ya está
   arrimado a la columna del menú.

   OJO al orden. La regla ancha va PRIMERO y el media query DESPUÉS, y el
   media query repite grid-template-columns aunque parezca redundante. Al
   revés —que es como estuvo un rato— la regla sin condición pisaba a la
   del media query, el móvil se quedaba con las dos columnas y 360px de
   carril dentro de una pantalla de 430: la página entera salía con scroll
   horizontal y el composer aplastado contra el borde. */
.dashboard{width:min(1680px,calc(100% - 30px));padding:22px 0 60px;gap:22px;
  grid-template-columns:minmax(0,1fr) 360px}

@media(max-width:1370px){
  .dashboard{grid-template-columns:minmax(0,820px);
    width:min(860px,calc(100% - 24px));padding-top:20px}
  /* El carril pasa debajo, en dos columnas. display:grid explícito porque
     en parte de este tramo aplica su @media(min-width:1121px), que lo
     pone en columna flex. */
  .side-column{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));
    margin-top:0;gap:14px}
  .activity-card{grid-column:span 2}
  .feed-tabs{margin-top:16px}
}
/* Y a una sola columna cuando ni dos tarjetas de carril caben. */
@media(max-width:660px){
  .side-column{grid-template-columns:minmax(0,1fr)}
  .activity-card{grid-column:auto}
}

/* ============================================================
   S31b — el composer y las píldoras, sobre la maqueta de Juan
   ============================================================ */

/* ---------- El composer ----------
   Eran tres filas apiladas: los tipos, las herramientas y el botón. Ahora
   son dos — el texto arriba, todo lo demás abajo — y el bloque pierde un
   tercio de su alto sin perder un solo control. */

/* El campo de texto, en pastilla. Antes era un área abierta sin contorno:
   no se leía como "aquí se escribe" hasta hacer clic. */
.composer-intro{align-items:center;gap:13px}
.composer-intro textarea{min-height:48px;padding:13px 19px;
  border:1px solid transparent;border-radius:999px;background:var(--surface-muted);
  font-size:14.5px;line-height:1.4;resize:none;transition:background .15s,border-color .15s}
.composer-intro textarea:focus{outline:0;border-color:var(--border);background:#fff}
/* Escribiendo varias líneas la pastilla deja de serlo: un óvalo de seis
   renglones se lee mal. Al crecer, feed.js le sube el alto y aquí pierde
   el radio de píldora. */
.composer-intro textarea:not(:placeholder-shown){border-radius:18px}

.composer-bar{display:flex;align-items:center;justify-content:space-between;
  gap:16px;flex-wrap:wrap;margin-top:14px}

/* Los tipos y las dos acciones, en una sola fila. Sin fondo ni borde:
   compiten con el botón de publicar si se visten de control. */
.composer-bar .post-kinds{display:flex;flex-wrap:wrap;align-items:center;
  gap:3px;margin:0;flex:1 1 auto;min-width:0}
.composer-bar .post-kinds>button,
.composer-bar .post-kinds>label{display:inline-flex;align-items:center;gap:7px;
  height:36px;padding:0 11px;border:0;border-radius:10px;background:none;
  color:var(--ink-2);font-size:13px;font-weight:500;white-space:nowrap;
  cursor:pointer;transition:background .14s,color .14s}
.composer-bar .post-kinds svg{width:17px;height:17px;flex:0 0 17px;
  stroke:currentColor;stroke-width:1.75}
.composer-bar .post-kinds>button:hover,
.composer-bar .post-kinds>label:hover{background:var(--surface-muted);color:var(--ink)}
/* El tipo elegido, con el color de la comunidad. .ck-extra queda fuera a
   propósito: adjuntar una imagen no es elegir un tipo, y teñirla igual
   haría creer que se publica "una imagen". */
.composer-bar .post-kinds>button.active{background:var(--brand-96);
  color:var(--brand-43);font-weight:600}
.composer-bar .post-kinds>button.active svg{stroke:var(--brand-62)}
.composer-bar .post-kinds>.ck-extra{color:var(--ink-3)}
.composer-bar .post-kinds>.ck-extra:hover{color:var(--ink-2)}
/* Una raya fina antes de las acciones, para que se lean como otro grupo
   sin necesidad de separarlas con aire (que no sobra en esta fila). */
.composer-bar .post-kinds>#tagsToggle{margin-left:5px;
  border-left:1px solid var(--border-subtle);border-radius:0 10px 10px 0;padding-left:14px}

.composer-send{flex:0 0 auto;display:flex;align-items:center;gap:11px}
.composer-bar .publish-button{display:inline-flex;align-items:center;gap:8px;
  height:42px;padding:0 20px;border:0;border-radius:11px;
  background:var(--brand-grad);color:var(--brand-on);
  font-size:14px;font-weight:700;letter-spacing:-.01em;
  box-shadow:var(--brand-glow);cursor:pointer}
.composer-bar .publish-button svg{width:17px;height:17px;flex:0 0 17px;
  stroke:currentColor;stroke-width:1.9;fill:none}
.composer-bar .publish-button:hover{filter:brightness(1.04)}

/* Dónde se publica: una línea discreta, y sólo si hay algo que elegir. */
.composer-scopes{display:flex;flex-wrap:wrap;gap:9px;margin-top:12px}

/* En el teléfono el botón manda la fila entera: a 360px, "Publicar"
   compartiendo renglón con seis acciones deja a cada una en dos letras. */
@media(max-width:620px){
  .composer-bar{flex-direction:column;align-items:stretch;gap:12px}
  .composer-send{justify-content:space-between}
  .composer-bar .publish-button{flex:1 1 auto;justify-content:center}
  /* "¿Qué quieres compartir con la comunidad?" no cabe en un renglón a
     este ancho, y el textarea es rows=1: la segunda línea del marcador de
     posición quedaba cortada por el borde de la pastilla. Dos renglones de
     14.5px a 1.4 piden 41px; con el relleno, 66. Y a esa altura ya no es
     una píldora, así que el radio baja al de tarjeta. */
  .composer-intro textarea{min-height:66px;border-radius:20px;padding:12px 16px}
}

/* ---------- Las píldoras, con su icono de color ----------
   Cada tipo tiene ya un color en las publicaciones del muro (la etiqueta
   verde de "Ofrezco", la ámbar de "Anuncio"). Las píldoras lo repiten en
   el icono: se reconoce el filtro por el color antes de leer la palabra,
   que es de lo que vive una fila de ocho. El texto se queda en tinta —
   ocho etiquetas de colores distintos no son una fila, son un semáforo. */
/* Un color por tipo, declarado UNA vez y en las dos filas que nombran
   tipos: las píldoras del filtro y la fila del composer. Antes el color
   vivía sólo en las píldoras, así que el mismo "Busco" salía morado
   abajo y gris arriba — dos cosas que son la misma. */
[data-kind="busco"],    [data-type="busco"]    {--tipo:#7c5cd6}
[data-kind="ofrezco"],  [data-type="ofrezco"]  {--tipo:#1d8a4b}
[data-kind="anuncio"],  [data-type="anuncio"]  {--tipo:#3663b4}
[data-kind="celebro"],  [data-type="celebro"]  {--tipo:#e0566a}
[data-kind="product"],  [data-type="product"]  {--tipo:#8a5cc4}
[data-kind="encuesta"], [data-type="encuesta"] {--tipo:#0f766e}
[data-kind="job"],      [data-type="job"]      {--tipo:#b4632a}

.wall-chips button svg{stroke:var(--tipo, currentColor);stroke-width:1.9;
  transition:stroke .14s}
/* Puesta la píldora, el icono va del color del texto: sobre el relleno
   sólido su color propio no contrasta. */
.wall-chips button.active svg{stroke:currentColor}

/* "Todos" es la ausencia de filtro, así que no lleva icono y su estado
   activo es el de la comunidad, como el resto. */
.wall-chips button.active{border-color:transparent;background:var(--brand-grad);
  color:var(--brand-on);font-weight:700}

/* Dos reglas del bloque portado que la fila nueva tiene que deshacer, y
   que se dejan aquí juntas porque son el mismo tipo de sorpresa:

   · .publish-button traía width:112px. Con el icono de avión al lado, el
     texto ya no cabía y "Publicar" se partía en "Public / ar".
   · .post-kinds button span traía font-size:18px, más grande que el propio
     botón. Con seis etiquetas a ese cuerpo la fila no entraba y el botón
     se caía a un renglón suyo. */
.composer-bar .publish-button{width:auto;min-width:0}
.composer-bar .post-kinds>button span,
.composer-bar .post-kinds>label span{font-size:13px;font-weight:inherit}
/* Que la fila de acciones ceda ANTES de envolver: prefiere apretarse a
   dejar el botón solo abajo. */
.composer-bar .post-kinds{flex:1 1 320px}

/* Medido, no supuesto: la tarjeta del composer deja 736px por dentro, el
   botón se lleva 124 y la fila se queda con 585. Con el relleno anterior
   los seis elementos pedían 608 y "Etiquetas" caía sola a un segundo
   renglón, con su filete a la izquierda colgando de nada.

   Apretando el relleno y la separación los seis entran en 556. Con siete
   (quien administra ve también "Anuncio") no entran a ningún tamaño
   legible, así que ahí sí envuelve — pero envuelve limpio: el separador
   de "Etiquetas" pasa de filete a un margen, que no se rompe al saltar. */
.composer-bar .post-kinds{gap:2px}
.composer-bar .post-kinds>button,
.composer-bar .post-kinds>label{padding:0 9px}
.composer-bar .post-kinds svg{width:16px;height:16px;flex:0 0 16px}
.composer-bar .post-kinds>#tagsToggle{margin-left:8px;border-left:0;
  border-radius:10px;padding-left:9px}

/* Dónde cae la publicación. Los <select> que viste dropdown.js salían aquí
   como texto en negrita suelto contra el fondo de la tarjeta: parecía una
   etiqueta, no algo que se pueda tocar. */
.composer-scopes{align-items:center;padding-top:11px;
  border-top:1px solid var(--border-subtle)}
/* El relleno derecho no es decorativo: .select-button cuelga su flecha en
   position:absolute a 14px del borde, así que un padding simétrico se la
   monta encima del texto ("Toda la comunidad◂"). */
.composer-scopes .select-button,
.composer-scopes select{height:34px;padding:0 30px 0 12px;
  border:1px solid var(--border);border-radius:9px;background:#fff;
  color:var(--ink-2);font-size:12.5px;font-weight:600}
.composer-scopes .select-button:hover{border-color:var(--border-strong);color:var(--ink)}

/* ---------- La cabecera de cada publicación, en pantallas angostas ----------
   A 360px el botón "···" salía 10px fuera de su tarjeta y arrastraba con
   él el ancho del documento: la página entera se podía desplazar en
   horizontal 4px, que es de esos defectos que no se ven pero se sienten
   al arrastrar con el dedo.

   .post-header es un flex con dos hijos — el bloque del autor y el botón —
   y el primero no llevaba min-width:0. Sin eso un hijo flex nunca encoge
   por debajo del ancho de su contenido, así que un nombre largo no se
   recortaba: empujaba. Ahora el nombre cede con puntos suspensivos y el
   botón se queda dentro. */
.post-header>div{min-width:0}
.post-header>div .author{min-width:0}
.post-header>div .author p{min-width:0}
.post-header>div .author b,
.post-header>div .author small{display:block;overflow:hidden;
  text-overflow:ellipsis;white-space:nowrap}
.post-header>button{flex:0 0 34px}

/* ============================================================
   S31c — menos redondez, y los filtros como un solo bloque
   ============================================================ */

/* ---------- Radios ----------
   Tres escalones y ninguno más, porque la mezcla era el problema: en la
   misma pantalla convivían píldoras de 999px (el campo del composer, los
   chips, el buscador de la barra), tarjetas de 16 y 18, y controles de 9,
   11, 12 y 13. Nada estaba mal por separado; juntos no parecían del mismo
   sitio, y las de 999 tiraban de todo lo demás hacia lo blando.

     tarjeta  13px    lo que contiene cosas
     control  10px    lo que se toca
     chip      9px    lo que se toca y es pequeño

   Las píldoras de 999px se quedan sólo donde son de verdad una píldora:
   las etiquetas de tipo dentro de una publicación, que son texto en una
   cápsula y no un control. */

/* tarjetas */
.card,.side-card,.wall-hero,.filters{border-radius:13px}
.hero-banner,.hero-banner.has-cover .hb-veil{border-radius:0}
.invite-card{border-radius:13px}

/* controles */
.composer-intro textarea,
.composer-intro textarea:not(:placeholder-shown){border-radius:10px}
.composer-bar .publish-button{border-radius:10px}
.filters label{border-radius:10px}
.filters-find .filter-icon{border-radius:10px}
.composer-scopes .select-button,
.composer-scopes select{border-radius:10px}
.act-tile{border-radius:10px}
.invite-card a{border-radius:10px}

/* chips */
.wall-chips button{border-radius:9px}

/* ---------- La tarjeta de filtros ----------
   Dos filas dentro de una: los tipos arriba, el texto abajo, y una raya
   fina entre ellas. La raya hace el trabajo que antes hacía el hueco
   entre dos tarjetas, pero sin separarlas en dos cosas. */
.filters{display:flex;flex-direction:column;align-items:stretch;gap:0;
  padding:0;margin:16px 0}
.filters .wall-chips{margin:0;padding:13px 13px 12px}
.filters-find{display:flex;align-items:center;gap:9px;
  padding:11px 13px;border-top:1px solid var(--border-subtle)}
.filters-find label{flex:1 1 auto;min-width:0;height:42px}
/* El botón ya no es hijo directo de .filters, así que las reglas portadas
   que le daban alto (.filters>button) dejaron de alcanzarlo. */
.filters-find .filter-icon{flex:0 0 42px;width:42px;height:42px;
  display:grid;place-items:center;padding:0;
  border:1px solid var(--border);background:#fff;
  color:var(--ink-3);font-size:15px;cursor:pointer;transition:.16s}
.filters-find .filter-icon:hover{border-color:var(--border-strong);color:var(--ink-2)}

/* ---------- El ritmo vertical ----------
   Los huecos entre bloques iban de 4px a 24px sin criterio: las píldoras
   pegadas al composer, la búsqueda despegada, la primera publicación
   lejos. Un solo valor entre bloques y el muro se lee de arriba abajo sin
   tropezar. */
.wall-hero{margin-bottom:16px}
.composer.card{margin-bottom:0}
#feedList .post:first-child{margin-top:0}

/* El orden, ya dentro de la tarjeta de filtros. Va entre el buscador y la
   ✕ — la ✕ limpia los tres controles, así que cierra la fila. */
.filters-find .feed-tabs{order:1;flex:0 0 auto;width:294px;height:42px;
  margin:0;padding:3px;border-radius:10px}
.filters-find .filter-icon{order:2}
.filters-find .feed-tabs button{height:100%;border-radius:8px;font-size:12.5px}

/* Por debajo de 900px la fila de tres controles no cabe: el buscador se
   queda arriba a todo lo ancho y el orden baja con la ✕ al lado. */
@media(max-width:900px){
  .filters-find{flex-wrap:wrap}
  .filters-find label{flex:1 1 100%;order:0}
  .filters-find .feed-tabs{flex:1 1 auto;width:auto}
}

/* ---------- Que la tarjeta de filtros pueda encoger ----------
   En el teléfono la tarjeta salía de 917px dentro de una pantalla de 430,
   y con ella la página entera. La causa no era obvia: por debajo de 720px
   aplica una regla portada, .filters{flex-wrap:wrap}, escrita cuando esto
   era una fila. Al volverlo yo una COLUMNA, esa línea lo convirtió en una
   columna que envuelve — y en un contenedor flex que envuelve, stretch
   estira cada hijo al ancho de SU LÍNEA, no al del contenedor. La línea
   medía lo que medía el hijo más ancho: la fila de píldoras sin envolver.

   De ahí el nowrap explícito. El min-width:0 se queda porque hace falta
   igual para que .wall-chips pueda desplazarse por dentro en vez de
   crecer por fuera — un elemento no scrollea si su caja ya se estiró. */
.filters{flex-wrap:nowrap}
.filters>*{min-width:0;width:100%}
.filters-find>*{min-width:0}
.filters .wall-chips{min-width:0}

/* El orden en el teléfono: fila propia y a todo lo ancho. Sus tres
   columnas son 1fr, así que con width:auto tomaban el ancho del texto más
   largo por columna y sumaban más que la pantalla. */
@media(max-width:900px){
  .filters-find .feed-tabs{flex:1 1 100%;width:100%;order:1}
  .filters-find .filter-icon{order:0}
  .filters-find label{flex:1 1 auto}
}

/* ============================================================
   S31d — la publicación: dos columnas, un pie, y profundidad
   ============================================================ */

/* ---------- El cuerpo en dos columnas ----------
   La imagen a la derecha en vez de debajo. Ancho fijo y no fluido porque
   es una foto: una columna que cambia de proporción con la ventana la
   recorta por donde no debe. */
.post-body{display:grid;gap:18px;align-items:start}
.post-body.has-shot{grid-template-columns:minmax(0,1fr) minmax(0,36%)}
.post-copy{min-width:0}
.post-shot{margin:0;border-radius:11px;overflow:hidden;background:var(--surface-muted)}
/* Alto acotado: una publicación de una línea con foto no puede medir el
   triple que la misma sin ella. El recorte lo hace object-fit, que centra. */
.post-shot .post-image{display:block;width:100%;height:100%;
  min-height:132px;max-height:196px;object-fit:cover;margin:0;border-radius:0}

/* Por debajo de 620px la foto vuelve arriba, a todo lo ancho: en una
   columna de 340px, un 36% son 120px y eso ya no es una imagen. */
@media(max-width:620px){
  .post-body.has-shot{grid-template-columns:minmax(0,1fr)}
  .post-shot{order:-1}
  .post-shot .post-image{max-height:200px}
}

/* ---------- La marca de quien lidera ----------
   Verde, no azul: el azul de las redes dice "cuenta verificada" y esto no
   lo es. Dice quién responde por la comunidad. */
.author-badge{display:inline-grid;place-items:center;width:15px;height:15px;
  margin-left:5px;vertical-align:-2px}
.author-badge svg{width:15px;height:15px;fill:none;stroke:var(--success);
  stroke-width:1.9;stroke-linecap:round;stroke-linejoin:round}

/* ---------- El pie ----------
   Reacciones a la izquierda, lo que lleva a otro sitio a la derecha. */
.post-foot{display:flex;align-items:center;justify-content:space-between;
  gap:14px;flex-wrap:wrap;margin-top:14px;padding-top:11px;
  border-top:1px solid var(--border-subtle)}
.post-foot .post-actions{display:flex;align-items:center;gap:4px;
  margin:0;padding:0;border:0;flex:0 1 auto;min-width:0}
.post-foot-end{display:flex;align-items:center;gap:2px;flex:0 0 auto}
.post-link{display:inline-flex;align-items:center;gap:7px;height:34px;
  padding:0 11px;border:0;border-radius:9px;background:none;
  color:var(--ink-2);font:inherit;font-size:13px;font-weight:500;
  cursor:pointer;transition:background .15s,color .15s}
.post-link b{font-weight:700;color:var(--ink)}
.post-link svg{width:16px;height:16px;flex:0 0 16px;fill:none;
  stroke:currentColor;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}
.post-link:hover{background:var(--surface-muted);color:var(--ink)}
/* Confirmación del copiado, además del aviso: el aviso sale abajo del todo
   y quien acaba de pulsar está mirando el botón. */
.post-link.is-done{color:var(--success)}
.post-link.is-done svg{stroke:var(--success)}

/* La pila de emojis vive dentro del botón de reaccionar. */
.like-button .reaction-stack{display:inline-flex;align-items:center;gap:0;
  margin-left:2px}
.like-button .reaction-stack i{display:grid;place-items:center;
  width:19px;height:19px;margin-left:-5px;border-radius:50%;
  background:#fff;box-shadow:0 0 0 1.5px #fff;font-size:11px;font-style:normal}
.like-button .reaction-stack i:first-child{margin-left:0}
.like-button .like-count{margin-left:7px;font-size:12.5px;font-weight:700;
  color:var(--ink-2)}

/* ---------- Profundidad ----------
   Lo que pidió Juan como "3D": relieve, no ilustraciones. Sombra en dos
   capas (una corta y cerrada que asienta la tarjeta sobre el fondo, y una
   larga y abierta que la separa de él) — una sola sombra grande da bruma,
   no volumen. */
.post.card{box-shadow:0 1px 2px rgba(31,27,20,.05), 0 8px 22px rgba(31,27,20,.05);
  transition:transform .18s ease, box-shadow .18s ease, border-color .18s ease}
.post.card:hover{transform:translateY(-2px);border-color:var(--border-strong);
  box-shadow:0 2px 4px rgba(31,27,20,.06), 0 16px 38px rgba(31,27,20,.09)}

/* La etiqueta de tipo, en relieve: un filo claro arriba y sombra propia
   abajo. Es lo que hace que una pastilla plana parezca una pieza. */
.post-label{box-shadow:inset 0 1px 0 rgba(255,255,255,.75),
  0 1px 2px rgba(31,27,20,.07)}

/* La foto, hundida en la tarjeta en vez de pegada encima. */
.post-shot{box-shadow:inset 0 0 0 1px rgba(31,27,20,.06),
  0 4px 14px rgba(31,27,20,.07)}

/* Y el avatar, levantado. */
.post-header .author .post-initials,
.post-header .author img{box-shadow:0 2px 6px rgba(31,27,20,.14)}

/* Quien llega por un enlace compartido ve cuál es, y el resalte se va solo. */
.post.is-shared{border-color:var(--brand-81);
  box-shadow:0 0 0 3px rgba(var(--brand-rgb),.16), 0 16px 38px rgba(31,27,20,.1)}

@media(prefers-reduced-motion:reduce){
  .post.card,.post.card:hover{transform:none;transition:none}
}

/* ---------- El botón de reaccionar, sin decir dos cosas ----------
   postAction() le pone un icono y una etiqueta a todos los botones del
   pie por igual. En éste sobran las dos: el corazón de contorno y la
   palabra "Me gusta" aparecían junto a un 🎉 recién puesto, de modo que
   el botón contradecía la reacción que acababas de elegir. Y el emoji
   salía dos veces — en la cara del botón y otra vez en la pila.

   Queda lo que dice la verdad: las caras de quien reaccionó y el número,
   que es exactamente lo que enseña la maqueta. La etiqueta sigue ahí para
   quien navega con lector de pantalla. */
.like-button>svg{display:none}
/* :not([class]) y no `>span` a secas: los tres hijos del botón son <span>
   — la cara, la etiqueta y la pila —, y la etiqueta es el único sin clase.
   Sin ese filtro esto se llevaba también la pila a position:absolute y el
   botón se quedaba en 22px de puro relleno, sin nada visible dentro. */
.like-button>span:not([class]){position:absolute;width:1px;height:1px;padding:0;
  margin:-1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap}
/* Sin ninguna reacción todavía, la cara es la invitación a poner la
   primera; con alguna puesta manda la pila y la cara sobra. */
.like-button:has(.reaction-stack i)>.react-face{display:none}
.like-button{position:relative;gap:2px;padding:0 11px}
.like-button .react-face{font-size:17px;line-height:1}

/* Y los demás botones del pie ("Me interesa", los de vacante) se leen como
   lo que hay a su lado, no como controles de otra pantalla. */
.post-foot .post-actions>button,
.post-foot .reaction-control>button{display:inline-flex;align-items:center;
  gap:7px;height:34px;padding:0 11px;border:0;border-radius:9px;
  background:none;color:var(--ink-2);font:inherit;font-size:13px;
  font-weight:500;cursor:pointer;transition:background .15s,color .15s}
.post-foot .post-actions>button:hover,
.post-foot .reaction-control>button:hover{background:var(--surface-muted);color:var(--ink)}
.post-foot .post-actions>button>svg{width:16px;height:16px;flex:0 0 16px;
  fill:none;stroke:currentColor;stroke-width:1.8}
.post-foot .post-actions>button.active{color:var(--brand-ink)}

/* ============================================================
   S31e — las reacciones, dibujadas y con gesto
   ============================================================ */

/* Cada reacción tiene su color: el disco tintado y el trazo saturado, como
   en la referencia. Se declaran aquí y no en el SVG para que un mismo
   símbolo sirva en el selector (grande), en el botón (mediano) y en la
   pila (pequeño) sin repetir el dibujo tres veces. */
.r-face{display:grid;place-items:center;width:100%;height:100%;
  border-radius:50%;background:var(--r-bg)}
.r-face svg{width:64%;height:64%;fill:none;stroke:var(--r-ink);
  stroke-width:1.9;stroke-linecap:round;stroke-linejoin:round}
/* Las rayas de movimiento van más finas: son acento, no dibujo. */
.r-face svg .r-spark{stroke-width:1.6;opacity:.85}

.r-blue  {--r-bg:#E8F1FD; --r-ink:#2F6FD0}
.r-rose  {--r-bg:#FDECEF; --r-ink:#E0566A}
.r-amber {--r-bg:#FDF3DC; --r-ink:#E0A017}
.r-green {--r-bg:#E6F6EC; --r-ink:#2E9A5B}
.r-violet{--r-bg:#EFEBFB; --r-ink:#6C4FD0}

/* ---------- El selector ----------
   Cinco discos con su nombre debajo. Las caras crecen al pasar por encima
   y la fila entra escalonada: es lo que lo separa de un menú. */
.reaction-picker{display:flex;align-items:flex-end;gap:2px;padding:9px 10px}
.reaction-picker button{position:relative;display:grid;justify-items:center;
  gap:4px;width:58px;padding:2px 0 0;border:0;background:none;cursor:pointer;
  animation:r-in .26s cubic-bezier(.2,1.3,.4,1) backwards;
  animation-delay:calc(var(--i, 0) * 32ms)}
.reaction-picker button>.r-face{width:40px;height:40px;
  transition:transform .18s cubic-bezier(.2,1.5,.4,1);
  box-shadow:0 2px 5px rgba(31,27,20,.10)}
.reaction-picker button>em{font-style:normal;font-size:10.5px;font-weight:600;
  color:var(--ink-3);opacity:0;transform:translateY(3px);
  transition:opacity .15s,transform .15s;white-space:nowrap}
.reaction-picker button:hover>.r-face,
.reaction-picker button:focus-visible>.r-face{transform:translateY(-6px) scale(1.22)}
.reaction-picker button:hover>em,
.reaction-picker button:focus-visible>em{opacity:1;transform:none;color:var(--ink-2)}
.reaction-picker button:active>.r-face{transform:translateY(-2px) scale(1.05)}

@keyframes r-in{from{opacity:0;transform:translateY(8px) scale(.7)}
                to{opacity:1;transform:none}}

/* ---------- El botón del pie ---------- */
.like-button .react-face{display:block;width:26px;height:26px;font-size:0}
.like-button:hover .react-face .r-face{transform:scale(1.12)}
.like-button .react-face .r-face{transition:transform .16s cubic-bezier(.2,1.5,.4,1)}
/* El brinco al elegir: la reacción recién puesta se hace notar una vez. */
.r-face.is-pop{animation:r-pop .42s cubic-bezier(.2,1.4,.35,1)}
@keyframes r-pop{0%{transform:scale(.5) rotate(-12deg)}
                 55%{transform:scale(1.32) rotate(6deg)}
                 100%{transform:scale(1)}}

/* ---------- La pila ---------- */
.like-button .reaction-stack i{width:22px;height:22px;margin-left:-6px;
  border-radius:50%;box-shadow:0 0 0 2px #fff, 0 1px 3px rgba(31,27,20,.16);
  background:none;font-size:0;overflow:hidden;
  animation:r-in .22s cubic-bezier(.2,1.3,.4,1) backwards}
.like-button .reaction-stack i:nth-child(2){animation-delay:40ms}
.like-button .reaction-stack i:nth-child(3){animation-delay:80ms}

@media(prefers-reduced-motion:reduce){
  .reaction-picker button,.r-face,.like-button .reaction-stack i{animation:none}
  .reaction-picker button>.r-face,.like-button .react-face .r-face{transition:none}
  .reaction-picker button:hover>.r-face{transform:none}
}

/* ============================================================
   S31f — la profundidad, ahora sí visible
   ------------------------------------------------------------
   La primera pasada se quedó corta: con 5% de opacidad la sombra
   existía en el CSS pero no en la pantalla. Aquí sube a un nivel
   que se ve sin volverse pesado, y el salto al pasar el ratón es
   de 4px en vez de 2 — el relieve se nota al moverse, no quieto.
   ============================================================ */
.post.card,.side-card,.composer.card,.wall-hero,.filters{
  box-shadow:0 1px 2px rgba(31,27,20,.06),
             0 4px 10px rgba(31,27,20,.05),
             0 14px 34px rgba(31,27,20,.07)}
.post.card:hover{transform:translateY(-4px);border-color:var(--border-strong);
  box-shadow:0 2px 4px rgba(31,27,20,.07),
             0 8px 18px rgba(31,27,20,.08),
             0 26px 56px rgba(31,27,20,.13)}

/* La etiqueta de tipo, como una pieza puesta encima. */
.post-label{box-shadow:inset 0 1px 0 rgba(255,255,255,.9),
  inset 0 -1px 0 rgba(31,27,20,.05), 0 2px 4px rgba(31,27,20,.10)}

/* El avatar, levantado del papel. */
.post-header .author .post-initials,
.post-header .author img{box-shadow:0 3px 8px rgba(31,27,20,.20),
  0 0 0 2px #fff}

/* Y la foto, hundida. */
.post-shot{box-shadow:inset 0 0 0 1px rgba(31,27,20,.08),
  0 6px 18px rgba(31,27,20,.10)}

/* Dos reglas del bloque portado que el selector nuevo tiene que deshacer:

   · `.reaction-picker button{width:34px!important;height:34px!important}`
     dimensionaba el botón cuando era un emoji suelto. Ahora el botón es
     una rejilla de disco + nombre, y con 34px de alto el nombre se salía
     por debajo de la burbuja y quedaba flotando sobre la publicación.
     Se responde con !important porque contra !important no hay otra.

   · `.reaction-picker button:after{content:attr(aria-label)}` dibujaba un
     globo negro con el nombre. Ahora el nombre va debajo del disco, como
     en la referencia, y los dos juntos decían lo mismo dos veces. */
.reaction-picker button{width:auto!important;height:auto!important;
  padding:2px 0 0!important;border-radius:0!important;font-size:inherit!important}
.reaction-picker button:after{display:none!important}
.reaction-picker button:hover,
.reaction-picker button:focus{transform:none!important}
/* La burbuja crece para contener los nombres. */
.reaction-picker{border-radius:22px}

/* ============================================================
   S31g — el relieve, que no se veía
   ------------------------------------------------------------
   Juan miró la pantalla y dijo que no veía ni el 3D ni los
   degradados. Tenía razón, y por dos motivos distintos:

   1. Los degradados existían pero recorrían 0.09 de luminosidad.
      En ámbar se notan; en el azul marino que tiene puesto su
      comunidad, los dos extremos eran el mismo azul. Eso se
      arregló en theme.js, que es donde se calculan.

   2. Las sombras estaban al 5-7% de un marrón sobre un fondo
      casi blanco: técnicamente ahí, invisibles en la práctica.

   Lo que sigue es lo segundo, más el truco que de verdad hace que
   algo parezca una pieza y no un rectángulo: un filo claro arriba
   y uno oscuro abajo, DENTRO del elemento. Una sombra por fuera
   dice "está flotando"; los filos dicen "tiene grosor".
   ============================================================ */

/* ---------- Los botones principales ---------- */
.composer-bar .publish-button,
.wall-chips button.active,
.invite-card a{
  background-image:var(--brand-grad);
  box-shadow:
    inset 0 1px 0 rgba(255,255,255,.34),      /* filo de luz arriba   */
    inset 0 -2px 0 rgba(0,0,0,.16),           /* filo de sombra abajo */
    0 1px 2px rgba(31,27,20,.14),
    0 6px 14px rgba(var(--brand-rgb), .30);
  transition:transform .14s ease, box-shadow .14s ease, filter .14s ease}
.composer-bar .publish-button:hover,
.wall-chips button.active:hover,
.invite-card a:hover{transform:translateY(-1px);filter:brightness(1.06);
  box-shadow:
    inset 0 1px 0 rgba(255,255,255,.4),
    inset 0 -2px 0 rgba(0,0,0,.16),
    0 2px 4px rgba(31,27,20,.16),
    0 12px 24px rgba(var(--brand-rgb), .38)}
/* Al pulsar se hunde: el filo de luz se va arriba y el de sombra pasa a
   estar dentro, que es lo que hace un botón físico. */
.composer-bar .publish-button:active,
.wall-chips button.active:active,
.invite-card a:active{transform:translateY(1px);
  box-shadow:inset 0 2px 5px rgba(0,0,0,.25), 0 1px 2px rgba(31,27,20,.14)}

/* ---------- Las tarjetas ----------
   Sombra más presente y, sobre todo, un degradado propio: la superficie
   es un punto más clara arriba que abajo. Es imperceptible si lo buscas y
   es lo que separa "papel" de "rectángulo blanco". */
/* :not(.invite-card) porque la tarjeta de invitación TAMBIÉN es .side-card,
   y sin esa exclusión este degradado blanco le pisaba la foto del bosque.
   Lo cazó la medición de contraste: pasó de 7.4:1 a 1.01:1 — blanco sobre
   blanco. Un cambio de aspecto puede romper otro sin que se vea. */
.post.card,.composer.card,.side-card:not(.invite-card),.wall-hero,.filters{
  background-image:linear-gradient(180deg,#fff 0%,#FCFBF9 100%);
  box-shadow:
    inset 0 1px 0 rgba(255,255,255,.9),
    0 1px 2px rgba(31,27,20,.07),
    0 6px 14px rgba(31,27,20,.07),
    0 18px 40px rgba(31,27,20,.09)}
.post.card:hover{transform:translateY(-4px);border-color:var(--border-strong);
  box-shadow:
    inset 0 1px 0 rgba(255,255,255,.9),
    0 2px 5px rgba(31,27,20,.09),
    0 12px 24px rgba(31,27,20,.11),
    0 32px 64px rgba(31,27,20,.16)}

/* ---------- Las píldoras de tipo, sin elegir ---------- */
.wall-chips button{box-shadow:inset 0 1px 0 rgba(255,255,255,.8),
  0 1px 2px rgba(31,27,20,.06)}

/* ---------- Las fichas de números del carril ---------- */
.act-tile{background-image:linear-gradient(180deg,#fff 0%,#FAF9F6 100%);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.9), 0 2px 5px rgba(31,27,20,.06)}
.act-tile i{box-shadow:inset 0 1px 0 rgba(255,255,255,.55),
  0 2px 5px rgba(31,27,20,.12)}

/* ---------- Los discos de reacción ----------
   Luz arriba y sombra abajo dentro del propio disco: es lo que los saca
   del plano y los vuelve fichas. */
.r-face{box-shadow:inset 0 1px 0 rgba(255,255,255,.75),
  inset 0 -2px 4px rgba(31,27,20,.07)}
.reaction-picker button>.r-face{box-shadow:
  inset 0 1.5px 0 rgba(255,255,255,.85),
  inset 0 -3px 6px rgba(31,27,20,.09),
  0 3px 8px rgba(31,27,20,.16)}
.reaction-picker button:hover>.r-face{box-shadow:
  inset 0 1.5px 0 rgba(255,255,255,.9),
  inset 0 -3px 6px rgba(31,27,20,.09),
  0 10px 20px rgba(31,27,20,.24)}

/* ---------- La lateral ---------- */
.k-nav>a.active,.k-nav>a.on{box-shadow:inset 0 1px 0 rgba(255,255,255,.7),
  0 2px 6px rgba(31,27,20,.07)}


/* ---------- El panel del hero, ahora se puede tocar ----------
   El enlace cubre el panel entero (inset:0) en vez de ser una etiqueta
   pequeña en una esquina: si todo el cuadro reacciona al ratón, todo el
   cuadro tiene que llevar a algún sitio. La etiqueta sólo aparece al pasar
   por encima, para no competir con el mensaje de bienvenida. */
.hb-go{position:absolute;inset:0;z-index:2;display:flex;align-items:flex-end;
  justify-content:flex-end;gap:7px;padding:16px 18px;
  color:#fff;font-size:12.5px;font-weight:700;text-decoration:none;
  opacity:0;transform:translateY(6px);
  transition:opacity .2s ease, transform .2s ease}
.hb-go svg{width:15px;height:15px;fill:none;stroke:currentColor;
  stroke-width:2.1;stroke-linecap:round;stroke-linejoin:round}
.hb-go span{text-shadow:0 1px 4px rgba(0,0,0,.5)}
.hero-banner:hover .hb-go,
.hb-go:focus-visible{opacity:1;transform:none}
.hb-go:focus-visible{outline:2px solid #fff;outline-offset:-4px;border-radius:12px}
/* El velo se cierra un punto al pasar por encima: el texto tiene que
   seguir leyéndose cuando la foto se acerca y se aclara. */
.hero-banner.has-cover .hb-veil{transition:background .25s ease}
.hero-banner.has-cover:hover .hb-veil{
  background:linear-gradient(100deg,rgba(18,20,17,.82) 0%,
                                    rgba(18,20,17,.68) 44%,
                                    rgba(18,20,17,.30) 100%)}

@media(prefers-reduced-motion:reduce){
  .hb-photo,.hero-banner:hover .hb-photo{transform:none;transition:none}
  .hb-go{transition:none}
}

/* ---------- El retrato dentro de la tira de personas ----------
   .strip-img enmarca en 172x92 — casi 2:1 — y object-fit:cover recorta
   por el centro. En una foto de evento eso está bien; en un retrato, el
   centro de la imagen es la boca, así que las caras salían cortadas por
   la frente y sin ojos.

   Se sube el encuadre al 28%, que es donde caen los ojos en un retrato
   de medio busto. Sólo para las caras: las fotos de evento siguen
   centradas, que es lo que les toca. */
.strip-img.is-face{object-position:center 28%}


/* ============================================================
   S31h — el hero, con vida
   ------------------------------------------------------------
   Era medio cuadro blanco con dos frases. Lo que sigue le pone
   el color de la comunidad y el motivo de la marca, sin
   inventarse ningún dato que no exista.
   ============================================================ */

/* El lado izquierdo deja de ser blanco: un lavado del color de la
   comunidad. Los pasos 91/96 de la rampa y no 96/98: mezclados con blanco
   como estaban antes salía L=0.976, o sea blanco, y el color no se veía. */
.hero-copy{position:relative;overflow:hidden;
  background:
    radial-gradient(130% 150% at 0% 0%,
      color-mix(in oklab, var(--brand-91), #fff 28%) 0%,
      color-mix(in oklab, var(--brand-96), #fff 22%) 48%,
      #fff 88%)}

/* El panal encima, teñido del color de la comunidad. Dos máscaras: el
   hexágono y un desvanecido hacia la derecha, para no pelear con el
   texto. mask-composite las cruza. */
.hero-copy:before{content:"";position:absolute;inset:0;z-index:1;
  pointer-events:none;background-color:var(--brand-81);opacity:.20;
  -webkit-mask-image:var(--trama-panal), linear-gradient(102deg,#000 0%,transparent 72%);
  mask-image:var(--trama-panal), linear-gradient(102deg,#000 0%,transparent 72%);
  -webkit-mask-size:56px 97px, cover;
  mask-size:56px 97px, cover;
  -webkit-mask-composite:source-in;
  mask-composite:intersect}
/* z-index explícito: `.hero-copy > *` no alcanza a los pseudo-elementos,
   así que ::before y ::after —que van los últimos en el orden de pintado—
   quedaban ENCIMA del texto y lo deslavaban. Con capas numeradas el fondo
   es fondo. */
.hero-copy>*{position:relative;z-index:2}

/* Un halo del color abajo a la izquierda: el remate que hace que la
   tarjeta se lea como algo dibujado y no como un rectángulo con texto. */
.hero-copy:after{content:"";position:absolute;left:-40px;bottom:-56px;
  z-index:0;width:190px;height:190px;border-radius:50%;pointer-events:none;
  background:radial-gradient(circle,
    color-mix(in oklab, var(--brand-83), #fff 42%) 0%,
    color-mix(in oklab, var(--brand-91), #fff 62%) 45%,
    transparent 70%);
  opacity:.55}

/* El saludo saluda. Una sola vez al cargar, y sólo la mano: animar el
   texto entero sería un parpadeo, no un gesto. */
.hero-copy h1 .wave{display:inline-block;transform-origin:70% 78%;
  animation:h-wave 2.1s ease-in-out .35s 2}
@keyframes h-wave{
   0%,60%,100%{transform:rotate(0)}
  10%,30%,50%{transform:rotate(15deg)}
  20%,40%    {transform:rotate(-9deg)}
}

@media(prefers-reduced-motion:reduce){
  .hero-copy h1 .wave{animation:none}
}

/* ============================================================
   S31i — compartir: menú, cuadro y cita
   ============================================================ */

/* ---------- El menú del botón ---------- */
.post-foot-end{position:relative}
.share-menu{position:absolute;right:0;bottom:calc(100% + 8px);z-index:40;
  width:260px;padding:6px;border:1px solid var(--border-subtle);
  border-radius:12px;background:#fff;
  box-shadow:0 2px 6px rgba(31,27,20,.08), 0 18px 44px rgba(31,27,20,.18);
  animation:sm-in .16s cubic-bezier(.2,1.1,.4,1)}
@keyframes sm-in{from{opacity:0;transform:translateY(6px) scale(.97)}to{opacity:1;transform:none}}
.share-menu button{width:100%;display:flex;align-items:flex-start;gap:11px;
  padding:10px 11px;border:0;border-radius:9px;background:none;
  font:inherit;text-align:left;cursor:pointer;transition:background .14s}
.share-menu button:hover{background:var(--surface-muted)}
.share-menu svg{width:17px;height:17px;flex:0 0 17px;margin-top:2px;fill:none;
  stroke:var(--ink-2);stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}
.share-menu span{display:grid;gap:2px;min-width:0}
.share-menu b{font-size:13.5px;font-weight:600;color:var(--ink)}
.share-menu small{font-size:11.5px;color:var(--ink-3);line-height:1.35}

/* ---------- El cuadro de "compartir con un comentario" ---------- */
.share-dialog{position:fixed;inset:0;z-index:300;display:grid;place-items:center;
  padding:20px}
.sd-scrim{position:absolute;inset:0;background:rgba(24,22,18,.42);
  backdrop-filter:blur(3px)}
.sd-box{position:relative;width:min(560px,100%);max-height:88vh;overflow:auto;
  padding:18px;border-radius:15px;background:#fff;
  box-shadow:0 30px 80px rgba(20,20,17,.3);
  animation:sd-in .2s cubic-bezier(.2,1.1,.4,1)}
@keyframes sd-in{from{opacity:0;transform:translateY(12px) scale(.97)}to{opacity:1;transform:none}}
/* La cabecera lleva el color de la comunidad y ocupa el ancho del cuadro:
   antes era una línea de texto suelta sobre blanco y el diálogo empezaba
   sin decir nada. El margen negativo la saca del padding del cuadro para
   que llegue a los bordes.
 *
 * El `>` importa: la cita que va dentro del diálogo trae su propio
 * <header> con el autor, y sin él este bloque se lo aplicaba también —
 * banda azul y todo, con el margen negativo sacándola fuera de su
 * tarjeta. Aquí sólo manda la cabecera propia del diálogo. */
.sd-box{padding-top:0}
.sd-box > header{display:flex;align-items:center;justify-content:space-between;
  gap:12px;margin:0 -18px 15px;padding:15px 18px;
  border-radius:15px 15px 0 0;background:var(--brand-grad);
  box-shadow:inset 0 -1px 0 rgba(255,255,255,.22)}
.sd-box > header b{display:flex;align-items:center;gap:9px;
  font-size:16px;letter-spacing:-.02em;color:#fff}
.sd-box > header b svg{width:17px;height:17px;flex:0 0 17px;fill:none;
  stroke:currentColor;stroke-width:1.9;stroke-linecap:round;stroke-linejoin:round}
.sd-close{width:32px;height:32px;display:grid;place-items:center;border:0;
  border-radius:50%;background:rgba(255,255,255,.18);color:#fff;
  font-size:19px;line-height:1;cursor:pointer;transition:background .15s}
.sd-close:hover{background:rgba(255,255,255,.34);color:#fff}
.sd-text{width:100%;min-height:78px;padding:12px 14px;border:1px solid var(--border);
  border-radius:10px;background:var(--surface-muted);font:inherit;font-size:14.5px;
  line-height:1.45;resize:vertical}
.sd-text:focus{outline:0;background:#fff;border-color:var(--brand-81);
  box-shadow:0 0 0 3px rgba(var(--brand-rgb),.13)}
.sd-quote{margin-top:13px}
.sd-box footer{display:flex;justify-content:flex-end;margin-top:15px}

/* ---------- La cita ----------
   Marco propio y fondo distinto: tiene que leerse como algo de otra
   persona metido dentro de esto, no como la continuación del texto. */
.post-quote{margin-top:13px;padding:13px 14px;border:1px solid var(--border-subtle);
  border-radius:11px;background:var(--surface-subtle)}
.post-quote header a,.post-quote header span{display:flex;align-items:center;gap:10px;
  color:inherit;text-decoration:none}
.post-quote header .post-initials,.post-quote header img{width:34px;height:34px;
  flex:0 0 34px;border-radius:50%;object-fit:cover;object-position:center 28%;
  font-size:12px}
.post-quote header p{margin:0;display:grid;min-width:0}
.post-quote header b{font-size:13.5px;font-weight:600;letter-spacing:-.01em;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.post-quote header small{font-size:11.5px;color:var(--ink-3)}
/* Texto a la izquierda y foto a la derecha, igual que una publicación
   suelta. Apiladas, la cita hacía la compartición un 62% más alta que la
   misma publicación sin compartir. */
/* El cuerpo de la cita es un enlace a la original: hereda el color en vez
   de teñirse de azul, y se levanta un poco al pasar por encima para que se
   note que lleva a alguna parte. */
.pq-open{display:block;color:inherit;text-decoration:none;border-radius:9px;
  transition:opacity .15s}
.pq-open:hover{opacity:.82}
.pq-body{display:grid;gap:13px;align-items:start}
.pq-body.has-shot{grid-template-columns:minmax(0,1fr) minmax(0,36%)}
.pq-copy{min-width:0}
/* Por debajo de 620px la foto vuelve arriba y a todo lo ancho: en una
   columna estrecha, un 36% ya no es una imagen. Es el mismo corte que usa
   .post-body, y por la misma razón. */
@media(max-width:620px){
  .pq-body.has-shot{grid-template-columns:minmax(0,1fr)}
  .pq-shot{order:-1}
}
.pq-text{margin:9px 0 0;font-size:14px;line-height:1.5;color:var(--ink-2)}
.pq-shot{margin:0;border-radius:9px;overflow:hidden;
  box-shadow:inset 0 0 0 1px rgba(31,27,20,.07)}
.pq-shot img{display:block;width:100%;height:100%;min-height:112px;
  max-height:168px;object-fit:cover}
/* Lo que se compartió y ya no está. Se dice, no se esconde: una tarjeta
   con un hueco es más desconcertante que una que explica el hueco. */
.post-quote.is-gone{color:var(--ink-3);font-size:13px;font-style:italic;
  text-align:center;padding:18px 14px}

/* "X compartió esta publicación", encima de todo lo demás. */
/* La nota de compartición vive DENTRO del bloque del autor, bajo su
   nombre. Antes iba suelta después de la cabecera con display:flex, es
   decir a todo lo ancho y arrancando en el borde de la tarjeta, a la
   altura del avatar en vez de la del nombre: una línea colgando de nada.
   inline-flex la deja del ancho de su texto, y la sangría la hereda del
   nombre sin que nadie tenga que medirla. */
.post-shared-note{display:inline-flex;align-items:center;gap:5px;
  margin-top:3px;color:var(--brand-47);font-size:11.5px;font-weight:600;
  line-height:1.3}
.post-shared-note svg{width:13px;height:13px;flex:0 0 13px;fill:none;
  stroke:currentColor;stroke-width:1.9;stroke-linecap:round;stroke-linejoin:round}

@media(max-width:560px){
  .share-menu{width:min(280px,calc(100vw - 40px))}
}

/* El botón del cuadro reutiliza .publish-button, pero la regla que le da
   tamaño al icono estaba acotada a `.composer-bar .publish-button svg`:
   aquí el <svg> salía sin medida y se estiraba a todo el botón. */
/* width:auto es lo que importa: .publish-button trae width:112px del
   bloque portado, el contenido de éste pide 119, y "Compartir" salía
   cortado en "Comparti". Es el mismo arreglo que el botón del composer ya
   tenía — se me quedó fuera este, que es el que se ve en un diálogo y en
   mitad de la pantalla. */
.sd-send{display:inline-flex;align-items:center;gap:8px;height:42px;
  width:auto;min-width:0;padding:0 20px;border:0;border-radius:10px;
  cursor:pointer;font-size:14px;font-weight:700;letter-spacing:-.01em}
.sd-send svg{width:17px;height:17px;flex:0 0 17px;fill:none;
  stroke:currentColor;stroke-width:1.9;stroke-linecap:round;stroke-linejoin:round}

/* La etiqueta de tipo dentro de una cita: la misma pastilla, un punto más
   pequeña, para que se lea como parte de la cita y no compita con la
   etiqueta de la publicación que la contiene. */
.post-quote .post-label{margin:9px 0 0;height:26px;padding:0 10px;font-size:11.5px}
.post-quote .post-label svg{width:13px;height:13px}


/* La fila del composer, con el mismo color por tipo que las píldoras. */
.composer-bar .post-kinds>button[data-type] svg{stroke:var(--tipo, currentColor)}
/* Elegido: la pastilla se tiñe del color de la comunidad, pero el icono
   conserva SU color — es lo que lo identifica, y perderlo justo cuando se
   selecciona es perderlo cuando más se mira. */
.composer-bar .post-kinds>button.active svg{stroke:var(--tipo, var(--brand-62))}

/* La ilustración de vacantes dentro de la tira. A diferencia de un retrato,
   aquí NO hay que subir el encuadre: la imagen ya viene compuesta con su
   figura en el centro, y el marco (172x92, casi 2:1) es casi la misma
   proporción que la ilustración, así que apenas recorta. */
.strip-img.is-art{object-fit:cover;object-position:center;background:#eef3fd}

/* ============================================================
   S31j — la cabecera de la comunidad
   ============================================================ */

.wall-head{position:relative;overflow:hidden;margin:0 0 16px;
  border:1px solid var(--line);border-radius:13px;min-height:196px;
  display:flex;align-items:flex-end;
  background:linear-gradient(145deg,var(--brand-72),var(--brand-51));
  box-shadow:inset 0 1px 0 rgba(255,255,255,.12),
             0 1px 2px rgba(31,27,20,.07),
             0 10px 26px rgba(31,27,20,.10)}
.wall-head[hidden]{display:none}

/* La portada, en su propia capa para poder acercarla sin mover el texto. */
.wh-photo{position:absolute;inset:0;background-size:cover;
  background-position:center 45%;
  transform:scale(1);transition:transform .6s cubic-bezier(.2,.7,.3,1)}
.wall-head:hover .wh-photo{transform:scale(1.04)}

/* El velo sube desde abajo, que es donde vive el texto: así la parte alta
   de la foto se ve y la baja sostiene la lectura. */
.wh-veil{position:absolute;inset:0;
  background:linear-gradient(180deg,rgba(12,16,12,.18) 0%,
                                    rgba(12,16,12,.48) 45%,
                                    rgba(12,16,12,.86) 100%)}
/* Sin portada no hay nada que oscurecer: el degradado de marca ya es
   oscuro y un velo encima lo apaga. */
.wall-head:not(.has-cover) .wh-veil{
  background:linear-gradient(180deg,rgba(12,16,12,0) 40%,rgba(12,16,12,.35) 100%)}

.wh-body{position:relative;z-index:2;display:flex;align-items:flex-end;
  gap:18px;width:100%;padding:20px 22px;color:#fff}

/* El logo, en tarjeta blanca: los logos vienen con fondo blanco y sobre
   una foto oscura, sin tarjeta, se ven recortados a mordiscos. */
.wh-logo{flex:0 0 auto;width:86px;height:86px;display:grid;place-items:center;
  padding:10px;border-radius:14px;background:#fff;
  box-shadow:0 6px 18px rgba(12,16,12,.28)}
.wh-logo img{max-width:100%;max-height:100%;object-fit:contain}

.wh-copy{flex:1 1 auto;min-width:0;display:grid;gap:5px}
.wh-badge{justify-self:start;display:inline-flex;align-items:center;
  height:22px;padding:0 10px;border-radius:6px;
  background:rgba(255,255,255,.18);backdrop-filter:blur(4px);
  font-size:10.5px;font-weight:700;letter-spacing:.09em;text-transform:uppercase}
.wh-copy h1{margin:1px 0 0;font-size:27px;line-height:1.14;letter-spacing:-.035em;
  text-shadow:0 1px 6px rgba(0,0,0,.4)}
.wh-copy>p{margin:0;max-width:56ch;font-size:13.5px;line-height:1.45;
  color:rgba(255,255,255,.88);text-shadow:0 1px 4px rgba(0,0,0,.4);
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}

.wh-stats{display:flex;flex-wrap:wrap;gap:16px;margin:7px 0 0;padding:0;
  list-style:none;font-size:12.5px;color:rgba(255,255,255,.9)}
.wh-stats li{display:inline-flex;align-items:center;gap:6px;
  text-shadow:0 1px 4px rgba(0,0,0,.4)}
.wh-stats b{font-weight:700}
.wh-stats svg{width:15px;height:15px;flex:0 0 15px;fill:none;
  stroke:currentColor;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round;
  opacity:.85}

.wh-actions{flex:0 0 auto;align-self:flex-end}
.wh-manage{display:inline-flex;align-items:center;gap:8px;height:40px;
  padding:0 16px;border-radius:10px;background:#fff;color:var(--ink);
  font-size:13.5px;font-weight:700;text-decoration:none;white-space:nowrap;
  box-shadow:0 2px 6px rgba(12,16,12,.22);transition:transform .14s,box-shadow .14s}
.wh-manage:hover{transform:translateY(-1px);box-shadow:0 6px 16px rgba(12,16,12,.3)}
.wh-manage svg{width:15px;height:15px;flex:0 0 15px;fill:none;
  stroke:currentColor;stroke-width:1.9;stroke-linecap:round;stroke-linejoin:round}
/* Quien no lidera no gestiona: su botón es un enlace, no una acción. */
.wh-manage.is-quiet{background:rgba(255,255,255,.16);color:#fff;
  backdrop-filter:blur(4px);box-shadow:none;font-weight:600}
.wh-manage.is-quiet:hover{background:rgba(255,255,255,.26);transform:none}

/* El saludo, para cuando no hay una sola comunidad que encabezar. */
.wall-greet{margin:0 0 16px}
.wall-greet[hidden]{display:none}
.wall-greet h1{margin:0;font-size:28px;line-height:1.15;letter-spacing:-.035em}
.wall-greet h1 span{font-size:23px}
.wall-greet p{margin:5px 0 0;color:var(--muted);font-size:15px}

/* El selector de ámbito, debajo de lo que encabece. feed.js lo esconde
   cuando sólo hay una comunidad. */
#communityBar{margin:0 0 16px}

@media(max-width:720px){
  .wall-head{min-height:0}
  .wh-body{flex-direction:column;align-items:flex-start;gap:13px;padding:16px}
  .wh-logo{width:62px;height:62px;padding:7px;border-radius:12px}
  .wh-copy h1{font-size:22px}
  .wh-actions{align-self:stretch}
  .wh-manage{width:100%;justify-content:center}
}

@media(prefers-reduced-motion:reduce){
  .wh-photo,.wall-head:hover .wh-photo{transform:none;transition:none}
}

/* ============================================================
   S31k — "N personas pueden ayudarte con esto"
   ------------------------------------------------------------
   El motor de emparejamiento, asomando en la publicación que
   pidió la ayuda. Se tiñe del color de la comunidad porque es
   una propuesta de la plataforma, no contenido de nadie: tiene
   que distinguirse del texto que escribió la persona.
   ============================================================ */
.match-strip{display:flex;align-items:center;gap:13px;margin-top:13px;
  padding:11px 13px;border:1px solid transparent;border-radius:11px;
  background:linear-gradient(180deg,
    color-mix(in oklab, var(--brand-96), #fff 34%),
    color-mix(in oklab, var(--brand-98), #fff 22%));
  box-shadow:inset 0 0 0 1px color-mix(in oklab, var(--brand-91), #fff 55%);
  color:inherit;text-decoration:none;
  transition:box-shadow .15s, transform .15s}
.match-strip:hover{transform:translateY(-1px);
  box-shadow:inset 0 0 0 1px var(--brand-87), 0 6px 16px rgba(31,27,20,.08)}

.ms-faces{flex:0 0 auto;display:flex;align-items:center}
.ms-face{width:34px;height:34px;margin-left:-9px;border-radius:50%;
  box-shadow:0 0 0 2px #fff, 0 1px 3px rgba(31,27,20,.18)}
.ms-face:first-child{margin-left:0}
.ms-face .post-initials,.ms-face img{width:100%;height:100%;border-radius:50%;
  object-fit:cover;object-position:center 28%;font-size:11px}

.ms-copy{flex:1 1 auto;min-width:0;display:grid;gap:1px}
.ms-copy b{font-size:13.5px;font-weight:600;letter-spacing:-.01em;color:var(--ink)}
.ms-copy small{font-size:11.5px;color:var(--ink-2);line-height:1.35;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

.ms-cta{flex:0 0 auto;display:inline-flex;align-items:center;gap:6px;
  height:34px;padding:0 13px;border-radius:9px;background:#fff;
  color:var(--brand-ink);font-size:12.5px;font-weight:700;white-space:nowrap;
  box-shadow:0 1px 3px rgba(31,27,20,.1)}
.ms-cta svg{width:14px;height:14px;flex:0 0 14px;fill:none;stroke:currentColor;
  stroke-width:2;stroke-linecap:round;stroke-linejoin:round}

/* En el teléfono el botón no cabe al lado: baja y ocupa el ancho. */
@media(max-width:620px){
  .match-strip{flex-wrap:wrap}
  .ms-copy{flex:1 1 60%}
  .ms-cta{flex:1 1 100%;justify-content:center;height:36px}
  .ms-copy small{white-space:normal}
}
@media(prefers-reduced-motion:reduce){
  .match-strip,.match-strip:hover{transform:none;transition:none}
}

/* El retrato de la tira, completo.
 *
 * La caja era de 92px de alto sobre un ancho de más de 200: una franja
 * apaisada para un retrato CUADRADO, así que object-fit:cover se comía la
 * frente y la barbilla — medido, se veía el 42% del alto de la foto. Una
 * tira que existe para presentar personas enseñaba media cara.
 *
 * Cuadrada, el recorte desaparece: fuente y caja tienen la misma
 * proporción. La tarjeta se estrecha un poco para que crecer de alto no
 * la vuelva una columna. */
/* min-width:0 es lo que hace que el 158px se respete: sin él, un elemento
   flex no baja de su contenido, y el nombre más largo del padrón
   ("Claudia Consuelo Fajardo Méndez") estiraba la tarjeta a 245px. El
   nombre se corta a dos líneas, que es donde deja de aportar. */
.strip-card{flex:0 0 158px;min-width:0}
/* white-space:normal es la clave: .strip-name lleva nowrap de una regla
   anterior, y con nowrap el clamp a dos líneas no puede hacer nada porque
   nunca hay una segunda. El nombre completo cabe casi siempre en dos. */
.strip-track .strip-card .strip-name{display:-webkit-box;-webkit-line-clamp:2;
  line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;
  white-space:normal;text-overflow:clip}
.strip-card .strip-meta{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.strip-card .strip-img,
.strip-card .strip-ph{height:auto;aspect-ratio:1}

/* ---------- El recuento de interesados ----------
   posts_feed devolvía interest_count desde el principio y no lo pintaba
   nadie: ni quien miraba la oferta ni —lo que importa— quien la publicó,
   que se enteraba por las notificaciones, de una en una, sin ver el total.

   Va dentro del propio botón, igual que la pila de reacciones: el control
   que produce el número es el que lo enseña. */
.post-actions button .interest-count{margin-left:7px;font-size:12.5px;
  font-weight:700;color:var(--ink-2)}

/* Y en la publicación propia no hay botón —nadie se interesa en lo suyo—,
   así que el número va suelto, con el mismo peso visual que los demás
   controles de la fila pero sin parecer pulsable. */
.interest-mine{display:inline-flex;align-items:center;gap:6px;
  font-size:12.5px;color:var(--ink-2)}
.interest-mine svg{width:17px;height:17px;fill:none;stroke:currentColor;
  stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round}
.interest-mine b{font-weight:700}
.interest-mine span{font-weight:500}


/* 029: the card for a post's first link (feed.js linkCardHtml). */
.link-card{display:grid;grid-template-columns:1fr;margin:12px 0 0;border:1px solid var(--line);
  border-radius:14px;overflow:hidden;background:#fff;color:inherit;text-decoration:none}
.link-card.has-img{grid-template-columns:160px minmax(0,1fr)}
.link-card img{width:100%;height:100%;min-height:96px;max-height:140px;object-fit:cover;display:block}
.link-card .link-copy{display:grid;gap:4px;padding:12px 14px;min-width:0}
.link-card small{color:var(--muted);font-size:12px;text-transform:lowercase}
.link-card b{font-size:14px;line-height:1.35;overflow:hidden;display:-webkit-box;
  -webkit-line-clamp:2;-webkit-box-orient:vertical;word-break:break-word}
.link-card .link-copy>span{color:var(--muted);font-size:13px;line-height:1.45;overflow:hidden;
  display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical}
.link-card:hover{border-color:var(--brand-62)}
@media(max-width:600px){.link-card.has-img{grid-template-columns:1fr}
  .link-card img{max-height:180px}}
