PageSourceSearch

https://www.hellocity.com/assets/FamilyHomeConceptPage-B7LtEyvY.js

js hellocity.com collected 2026-10-02 16:11:31 UTC 40,552 bytes, 446 lines download raw bytes

1import{bH as e,a7 as t,V as k,di as ee,d6 as te,aA as ie,G as ae,ax as ne,F as oe,cf as l,cB as me,bF as fe,d5 as xe,dh as ge,dm as be,aS as ue,dc as we,d9 as ye,aW as ve,bI as ke,d8 as je,cM as ze,M as $e,al as Ne,x as V,u as Ce,d1 as Ie,aY as G,m as Se,cJ as Fe,a$ as Be}from"./index-Cgui02_0.js";import{c as Me}from"./neighborhoodCenters-EA46RgCh.js";import{u as Te,a as Ae}from"./usePersonalizedFeed-BqQ5NSG1.js";import{u as Ee}from"./useHydratedFeedItems-BrSP-V4k.js";import{u as He}from"./useVisitingFeed-B_FhdsgH.js";import{h as Re}from"./visitingFeedSource-DQiWpBq4.js";import{c as K,b as Q,a as X}from"./FamilyDock-DjUFmQfQ.js";import{P as Pe,u as _e,e as Le}from"./FamilyWeekPage-Dc4N0142.js";import{u as Oe,p as We,P as De,B as qe,N as Ye}from"./FamilyPlanWidget-CCKAGpNE.js";import{u as Ve}from"./FamilyAuthOverlay-pQyDiJlu.js";import"./feedStatus-8ADoy5il.js";import"./feedNearMe-DYEM62gE.js";const J=333,U=172,Ge=[{n:1,base:"/images/family/step-1-profile",title:[{text:"Build your "},{text:"family weekend profile",hi:!0}]},{n:2,base:"/images/family/step-2-match",title:[{text:"We match it to "},{text:"what’s happening now",hi:!0}]},{n:3,base:"/images/family/step-3-plan",title:[{text:"We send you a plan, "},{text:"every week",hi:!0}]}];function Ke({onStart:r}){return e.jsxs("section",{className:"fgs","aria-labelledby":"fgs-title",children:[e.jsx("style",{children:`
2        .fgs{max-width:1200px;margin:0 auto;padding:14px 34px 0;
3          font-family:${t.fontBody};color:${t.ink}}
4        .fgs-card{background:${t.surface};border:1px solid #e3e3e3;
5          border-radius:16px;padding:20px 16px 18px}
6        .fgs h2{margin:0 0 16px;font-family:${t.fontHead};font-size:28px;font-weight:800;
7          letter-spacing:-.5px;line-height:1.1}
8        /* Three steps with an arrow between them: a process, left to right. */
9        .fgs-grid{display:grid;grid-template-columns:333px;gap:16px;
10          align-items:start;justify-content:center}
11        .fgs-step{display:flex;flex-direction:column;gap:8px;width:333px;position:relative}
12        /* Number sits above the headline, both centred over the box below. */
13        .fgs-top{display:flex;flex-direction:column;align-items:center;gap:8px;
14          min-width:0;width:100%}
15        .fgs-n{width:44px;height:44px;border-radius:50%;background:${t.yellow};
16          color:${t.ink};font-family:${t.fontHead};font-size:22px;font-weight:800;
17          display:flex;align-items:center;justify-content:center;flex:0 0 auto;
18          box-shadow:0 1px 4px rgba(0,0,0,.14)}
19        /* One line, centred, the full frame width. Sized down from the
20           original 15px so these specific sentences hold on one line. */
21        .fgs-top b{display:block;width:100%;text-align:center;
22          font-family:${t.fontHead};font-size:13px;font-weight:700;line-height:1.3;
23          white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
24        /* Desktop is one fixed layout (the family area is 1200px wide on
25           desktop): always three across. Phones stack. */
26        @media (min-width:768px){
27          .fgs-grid{grid-template-columns:repeat(3,333px)}
28        }
29        .fgs-top b em{font-style:normal;color:${t.yellow}}
30        /* The one and only frame size — same on a phone and on desktop. */
31        .fgs-shot{position:relative;border-radius:13px;overflow:hidden;background:#fff;
32          border:1px solid #8a8a8a;width:${J}px;height:${U}px;flex:0 0 auto}
33        .fgs-shot img{display:block}
34        /* Anchored to the image itself, so it stays centred on it regardless
35           of how many lines the headline above takes. */
36        .fgs-arrow{position:absolute;top:50%;right:-19px;transform:translateY(-50%);
37          color:#c9c9c9;z-index:1;background:${t.surface};border-radius:50%}
38        .fgs-step:last-child .fgs-arrow{display:none}
39        .fgs-cta{margin-top:18px;display:flex;justify-content:center}
40        .fgs-cta button{display:inline-flex;align-items:center;gap:8px;border:0;
41          border-radius:40px;background:${t.yellow};color:${t.ink};font-family:${t.fontHead};
42          font-size:15px;font-weight:800;padding:12px 26px;cursor:pointer}
43        @media (max-width:767px){
44          .fgs{padding:10px 16px 0}
45          .fgs-card{padding:14px}
46          .fgs h2{font-size:22px;margin-bottom:12px}
47          /* Same 333px frame as desktop, just one column instead of three. */
48          .fgs-arrow{display:none !important}
49          .fgs-cta button{width:100%;justify-content:center}
50        }
51      `}),e.jsxs("div",{className:"fgs-card",children:[e.jsx("h2",{id:"fgs-title",children:"How it works"}
51),e.jsx("div",{className:"fgs-grid",children:Ge.map(i=>e.jsxs("div",{className:"fgs-step",children:[e.jsxs("span",{className:"fgs-top",children:[e.jsx("span",{className:"fgs-n",children:i.n}),e.jsx("b",{children:i.title.map((d,c)=>d.hi?e.jsx("em",{children:d.text},c):e.jsx("span",{children:d.text},c))})]}),e.jsxs("span",{className:"fgs-shot",children:[e.jsx("img",{src:`${i.base}.png`,width:J,height:U,alt:"",loading:"lazy"}),e.jsx("span",{className:"fgs-arrow","aria-hidden":!0,children:e.jsx(k,{name:"chevron-forward",size:22})})]})]},i.n))}),e.jsx("div",{className:"fgs-cta",children:e.jsxs("button",{type:"button",onClick:r,children:["Build your family profile",e.jsx(k,{name:"arrow-forward",size:17})]})})]})]})}function Qe(){const r=ee(),{city:i,path:d}=te(),c=ie(i),{plans:p,loading:x}=Oe(i);return e.jsxs("section",{className:"fbb","aria-labelledby":"fbb-title",children:[e.jsx("style",{children:`
52        .fbb{max-width:1200px;margin:0 auto;padding:14px 34px 24px;
53          font-family:${t.fontBody};color:${t.ink}}
54        .fbb-card{background:${t.surface};border:1px solid #e3e3e3;border-radius:16px;
55          padding:16px 18px;display:flex;flex-direction:column;gap:14px}
56        .fbb h2{margin:0;font-family:${t.fontHead};font-size:18px;font-weight:700;
57          letter-spacing:-.3px;line-height:1.2}
58        .fbb-sub{margin:3px 0 0;font-size:13px;color:${t.textMeta}}
59        /* Map left, plans right, equal halves. */
60        .fbb-cols{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:16px;
61          align-items:start}
62        .fbb-half{display:flex;flex-direction:column;gap:9px;min-width:0}
63        .fbb-head{display:flex;align-items:center;justify-content:space-between;gap:10px}
64        .fbb-h3{margin:0;font-family:${t.fontHead};font-size:15px;font-weight:700}
65        .fbb-more{display:inline-flex;align-items:center;gap:3px;border:0;background:none;
66          font-size:12.5px;font-weight:700;color:${t.ink};cursor:pointer;
67          font-family:${t.fontBody};padding:0;white-space:nowrap}
68        .fbb-mapframe{border-radius:13px;overflow:hidden;border:1px solid #e6e6e6}
69        /* Two plan cards per row inside half the width. */
70        .fbb-plans{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}
71        .fbb-plans .pub-card-badges{display:none !important}
72        .fbb-plans .pub-card > div:first-child,
73        .fbb-plans .pub-card > div:first-child img{height:92px !important}
74        .fbb-plans .pub-card-body{padding:8px 9px 9px !important;gap:5px !important}
75        .fbb-plans .pub-card .pub-card-title{font-size:12.5px !important;
76          line-height:1.25 !important;min-height:0 !important;max-height:31px !important;
77          overflow:hidden !important}
78        .fbb-plans .pub-card-desc{font-size:11px !important;max-height:15px !important;
79          overflow:hidden !important}
80        .fbb-plans .pub-card-tags,.fbb-plans .pub-card-meta,
81        .fbb-plans .pub-btn-details,.fbb-plans .pub-btn-share{display:none !important}
82        .fbb-plans .pub-card{border:1px solid #dcdcdc !important;box-shadow:none !important}
83        .fbb-plans .pub-card-foot button{width:26px !important;height:26px !important;
84          flex:0 0 26px !important;padding:0 !important}
85        .fbb-plans .pub-card-foot svg{width:13px !important;height:13px !important}
86        .fbb-skel{height:150px;border-radius:13px;border:1px solid #dcdcdc;opacity:.7;
87          background:linear-gradient(180deg,#e6e6e6 0 92px,#fff 92px 100%)}
88        @media (max-width:767px){
89          .fbb{padding:10px 16px 20px}
90          .fbb-card{padding:14px;gap:12px}
91          .fbb-cols{grid-template-columns:minmax(0,1fr);gap:14px}
92        }
93      `}),e.jsxs("div",{className:"fbb-card",children:[e.jsxs("div",{children:[e.jsx("h2",{id:"fbb-title",children:"Explore the city"}),e.jsx("p",{className:"fbb-sub",children:"No profile needed — have a look around first."})]}),e.jsxs("div",{className:"fbb-cols",children:[e.jsxs("div",{className:"fbb-half",children:[e.jsxs("div",{className:"fbb-head",children:[e.jsx("h3",{className:"fbb-h3",children:"Explore the map"}),e.jsxs("button",{type:"button",className:"fbb-more",onClick:()=>r(d("/family/map")),children:["Open the map ",e.jsx(k,{name:"chevron-forward",size:13})]})]}),e.jsx("div",{className:"fbb-mapframe",children:e.jsx(ae,{items:[],cityLabel:c,nearLabel:"Events & places near you",center:ne(i),onOpen:()=>r(d("/family/map"))})})]}),e.jsxs("div",{className:"fbb-half",children:[e.jsxs("div",{className:"fbb-head",children:[e.jsx("h3",{className:"fbb-h3",children:"Browse plans"}),e.jsxs("button",{type:"button",className:"fbb-more",onClick:()=>r(d(oe)),children:["Browse plans ",e.jsx(k,{name:"chevron-forward",size:13})]})]}),e.jsx("div",{className:"fbb-plans",children:x?Array.from({length:4},(g,b)=>e.jsx("div",{className:"fbb-skel"},b)):p.slice(0,4).map(g=>e.jsx("div",{style:{minWidth:0},children:e.jsx(Pe,{plan:g})},g.id))})]})]})]})]})}function T(r){return r.toLowerCase().trim().replace(/[\s-]+/g,"_")}function Xe(r,i){if(!i)return r;const d=T(i);return r.filter(c=>{var p;return(p=c.forYouTags)==null?void 0:p.some(x=>x&&T(x)===d)})}function Z({children:r,flush:i=!1}){return e.jsx("section",{style:{background:t.surface,border:"1px solid #dcdcdc",borderRadius:t.radiusCard,padding:i?"12px 0":12,display:"flex",flexDirection:"column",gap:i?4:11,overflow:"hidden"},children:r})}function M({title:r,sub:i,action:d,onAction:c,pad:p=!1}){return e.jsxs("div",{style:{display:"flex",alignItems:"flex-start",justifyContent:"space-between",gap:10,padding:p?"0 14px":0},children:[e.jsxs("div",{className:"fh-head",children:[e.jsx("h2",{children:r}),i?e.jsx("p",{children:i}):null]}),d?e.jsx("button",{type:"button",onClick:c,style:{display:"inline-flex",alignItems:"center",gap:4,border:`1px solid ${t.yellow}`,background:t.yellow,color:t.ink,fontSize:12.5,fontWeight:700,borderRadius:t.radiusPill,padding:"5px 12px",whiteSpace:"nowrap",cursor:"pointer",fontFamily:t.fontBody},children:d}):null]})}function Je(){return e.jsx("div",{"aria-hidden":!0,style:{height:108,borderRadius:t.radiusCard,border:"1px solid #dcdcdc",background:"linear-gradient(180deg,#e6e6e6 0 50px,#fff 50px 100%)",opacity:.75}})}const Ue={channel:"by text"};function ht(){var D,q;const r=ee(),{path:i,city:d}=te(),c=l.useCallback((a,o,s)=>i(`/family${me(fe(d,a,o,s))}`),[i,d]),p=xe(a=>a.email),{coords:x}=Te(),g=ge(p||void 0),b=d,A=ie(b),E=((q=(D=g.data)==null?void 0:D.user)==null?void 0:q.neighborhood)||"",N=Re(g.data),C=!!p&&!N&&g.isLoading,h=He({cityId:b,homeCityId:N,email:p||void 0,enabled:!!p&&!!N}
93),re=h.active?ne(b):Me(E,b),y=Ae(p||void 0,x),H=h.active&&!h.useVisitingItems,se=l.useMemo(()=>C?[]:h.useVisitingItems?h.items:H?[]:y.items,[C,h.useVisitingItems,h.items,H,y.items]),I=Ee(se,p||void 0,b,x),R=be({queryKey:["engagementExcludeIds",p??""],queryFn:()=>Be(),enabled:!!p,staleTime:5*6e4}),j=l.useMemo(()=>new Set(R.data||[]),[R.data]),u=l.useMemo(()=>j.size===0?I:I.filter(a=>{const o=ue(a),s=String(a.id||"").trim();return!(o&&j.has(o)||s&&j.has(s))}),[I,j]),z=Ve(),pe=we(),v=ye(),m=v.status!=="loggedOut",w=_e(u,d,p||void 0),S=l.useMemo(()=>{const o=(h.useVisitingItems?ve(h.items):h.active?["For You"]:y.tabs).filter(s=>s!=="For You");return[{id:"all",label:"For you",q:""},...o.map(s=>({id:T(s),label:ke(s),q:s}))]},[y.tabs,h.active,h.useVisitingItems,h.items]),[f,de]=l.useState("all"),F=l.useMemo(()=>{var o;if(f==="all")return u;const a=((o=S.find(s=>s.id===f))==null?void 0:o.q)||null;return Xe(u,a)},[u,f,S]),{propsFor:le}=je(u,{enabled:!!p}),he=a=>{const o=G(a);r(c(o.type,o.id,o.title),{state:{item:o}})},P=l.useRef(null),B=l.useRef(0),_=l.useRef(0),L=l.useRef("all"),O=l.useRef(!1);_.current=F.length,L.current=f;const $=l.useCallback(()=>{O.current||(O.current=!0,ze({maxPosition:B.current,totalItems:_.current,activeTag:L.current}))},[]);l.useEffect(()=>{const a=P.current;if(!a||typeof IntersectionObserver>"u")return;const o=new IntersectionObserver(s=>{for(const n of s){if(!n.isIntersecting)continue;const Y=Number(n.target.dataset.feedIndex||0);Y>B.current&&(B.current=Y)}},{threshold:.5});return Array.from(a.children).forEach(s=>o.observe(s)),()=>o.disconnect()},[F.length]),l.useEffect(()=>(window.addEventListener("pagehide",$),()=>{window.removeEventListener("pagehide",$),$()}),[$]);const ce=a=>a.map((o,s)=>{const n=G(o);return e.jsx("div",{"data-feed-index":s+1,style:{minWidth:0,maxWidth:"100%"},children:e.jsx(Se,{type:n.type,image:n.image,title:n.title,tags:n.tags,venue:n.venue,date:n.date,distance:n.distance,source:n.source,description:n.description,experienceKind:n.experience_kind,mpaaRating:n.mpaa_rating,duration:n.duration,href:c(n.type,n.id,n.title),linkState:{item:n},onDetails:()=>{Fe({position:s+1,itemId:String(n.id),itemType:n.type,itemTitle:n.title,activeTag:f}),he(o)},...le(o)})},`${n.type}-${n.id}-${s}`)}),W=C||!!p&&!h.active&&(y.isLoading||!y.isSuccess)&&u.length===0;return m?e.jsxs("div",{style:{background:t.bg,minHeight:"100vh"},children:[e.jsx(K,{}),e.jsx(Ne,{}),e.jsx("style",{children:Le()}),e.jsx("style",{children:`
94        .hv2{max-width:460px;margin:0 auto;padding:8px 10px 0;
95          display:flex;flex-direction:column;gap:8px}
96        .hv2-grid{display:grid;grid-template-columns:1fr 1fr;gap:9px}
97        .hv2-greet{margin:2px 2px 0;font-family:${t.fontHead};font-size:17px;
98          font-weight:600;letter-spacing:-.2px;line-height:1.25}
99        .hv2-count{font-family:${t.fontBody};font-size:12px;font-weight:500;
100          color:${t.textMeta};margin-left:7px;white-space:nowrap}
101
102        /* The feed is its own panel inside the card: grey ground, tabs welded
103           to its top edge, and the item area scrolls on its own so the whole
104           feed lives here instead of six frozen cards. CTA stays outside it. */
105        /* Tabs sit on the panel's top edge; the active one covers that border
106           with its own -1px overhang so it reads as one connected surface. */
107        .hv2-feedwrap{display:flex;flex-direction:column;gap:0}
108        .hv2-tabstrip{display:flex;gap:3px;overflow-x:auto;padding:0;
109          margin:0;scrollbar-width:none}
110        .hv2-tabstrip::-webkit-scrollbar{display:none}
111        .hv2-tab{flex:0 0 auto;border:1px solid #dcdcdc;border-bottom:0;
112          background:#f5f5f5;color:#6c6c6c;font-size:11.5px;font-weight:500;
113          padding:5px 11px;border-radius:9px 9px 0 0;cursor:pointer;
114          font-family:${t.fontBody};white-space:nowrap;margin-bottom:-1px;
115          position:relative;line-height:1.25}
116        .hv2-tab.is-on{background:#ededed;color:${t.ink};font-weight:600;z-index:2}
117        /* The tabs sit ON this panel, so its top corners must be square or a
118           curve shows under the strip. It was already declared square here and
119           still rendered rounded on desktop, so something with equal-or-higher
120           specificity is winning — force it rather than leave a corner that
121           only appears at one breakpoint. */
122        .hv2-feedpanel{background:#ededed;border:1px solid #dcdcdc;
123          border-radius:0 0 12px 12px;margin-top:0}
124        .hv2-feedwrap > .hv2-feedpanel{
125          border-top-left-radius:0 !important;
126          border-top-right-radius:0 !important}
127        .hv2-scroll{max-height:250px;overflow-y:auto;-webkit-overflow-scrolling:touch;
128          padding:7px}
129        .hv2-grid{gap:7px}
130
131        /* Filter chips were page-scale (40px min-height, 36px wrap). The wrap
132           and the .pub-filter-chips descendant rule both need matching
133           specificity or the height wins and the padding never applies. */
134        .hv2 .pub-filter-chips-wrap,.hv2 .pub-filter-chips{height:auto !important;
135          min-height:0 !important}
136        .hv2 .pub-filter-chips .pub-filter-chip,.hv2 .pub-filter-chip{
137          height:auto !important;min-height:0 !important;padding:5px 11px !important;
138          font-size:12px !important;line-height:1.2 !important}
139
140
141        @media (max-width:767px){
142        /* Squeeze ContentCard for the fold — headline + engagement buttons only.
143           Measured on real cards: 406px raw → 122px here. Everything else goes:
144           description, tags, venue/date/time meta, More info, Share.
145           Scoped to .hv2-tight so the other 17 surfaces sharing ContentCard are
146           untouched. ContentCard uses inline styles, hence !important.
147           NOTE: the title is a flex item, so the browser blockifies
148           display:-webkit-box and -webkit-line-clamp silently stops working —
149           max-height is what actually caps it to two lines. */
150        .hv2-tight .pub-card > div:first-child{height:50px !important}
151        .hv2-tight .pub-card > div:first-child img{height:50px !important}
152        .hv2-tight .pub-card > div:first-child .pub-card-badges{
153          top:5px !important;left:5px !important;gap:3px !important;
154          max-width:calc(100% - 10px) !important}
155        .hv2-tight .pub-card > div:first-child .pub-card-badges span{
156          font-size:8px !important;padding:2px 4px !important}
157        /* Title left (~70%), the two actions right, one row — saves the whole
158           stacked footer's height. Save is dropped; Like + Not-for-me stay. */
159        .hv2-tight .pub-card-body{padding:6px 7px !important;
160          flex-direction:row !important;align-items:center !important;
161          gap:5px !important;flex:0 0 auto !important}
162        .hv2-tight .pub-card-desc{display:none !important}
163        .hv2-tight .pub-card-tags{display:none !important}
164        .hv2-tight .pub-card-meta{display:none !important}
165        .hv2-tight .pub-btn-details{display:none !important}
166        .hv2-tight .pub-btn-share{display:none !important}
167        .hv2-tight .pub-card .pub-card-title{font-size:11.5px !important;
168          font-weight:400 !important;line-height:1.2 !important;min-height:0 !important;
169          max-height:28px !important;overflow:hidden !important;margin:0 !important;
170          padding:0 !important;flex:1 1 70% !important;min-width:0 !important}
171        .hv2-tight .pub-card-foot{padding-top:0 !important;gap:3px !important;
172          margin-top:0 !important;width:auto !important;flex:0 0 auto !important;
173          justify-content:flex-end !important}
174        .hv2-tight .pub-card-foot button{width:20px !important;height:20px !important;
175          flex:0 0 20px !important;min-width:0 !important;padding:0 !important}
176        .hv2-tight .pub-card-foot svg{width:11px !important;height:11px !important}
177        .hv2-tight .pub-card-foot button[aria-label="Save"],
178        .hv2-tight .pub-card-foot button[aria-label="Saved"]{display:none !important}
179        /* 1px frame so white cards read against the grey page */
180        .hv2-tight .pub-card{border:1px solid #dcdcdc !important;box-shadow:none !important}
181        }
182
183        /* Rows inside a white Area: kill their own page background/padding. */
184        .hv2-rows .pub-pad-x{padding-left:0 !important;padding-right:0 !important}
185        /* CategoryTiles + InterestBrowse already live in the Explore box —
186           GenericHomepageBody ships its own copies, so hide the duplicates. */
187        .hv2-rows .pub-cat-grid,
188        .hv2-rows section:has(.pub-interest-grid){display:none !important}
189        /* Row cards ship at 300px — only ~1.2 fit. Match the feed grid's card
190           width so 2.3 are visible and the row reads as more-to-come. */
191        .hv2-rows .pub-news-grid{grid-template-columns:none !important;
192          grid-auto-flow:column !important;grid-auto-columns:154px !important;
193          gap:7px !important}
194        /* 5 — Ask Maya belongs in the input, not on the chip row below it. */
195        .hv2 .ask-box-compact{position:relative}
196        /* 4 — What's Hot shipped at page scale: 12/16 padding, 20px numeral,
197           9/16 CTA. Every one of those margins comes back; the block ends up
198           ~30% shorter. */
199        .hv2-rows .hot-list{gap:6px !important}
200        .hv2-rows .hot-item{padding:7px 9px !important;gap:8px !important;
201          border-radius:12px !important;box-shadow:none !important;
202          border:1px solid #dcdcdc !important}
203        .hv2-rows .hot-body{gap:4px !important}
204        .hv2-rows .hot-num{font-size:14px !important;line-height:1 !important}
205        .hv2-rows .hot-txt{font-size:12.5px !important;line-height:1.2 !important;
206          margin:0 !important}
207        /* The stock component's desc has margin-bottom, which — since hot-copy
208           has no padding — collapses straight through into hot-body's own gap,
209           doubling the space before the buttons. Zero it and cap at two lines. */
210        .hv2-rows .hot-desc{font-size:11px !important;line-height:1.22 !important;
211          margin:0 !important;max-height:27px !important;overflow:hidden !important}
212        .hv2-rows .hot-foot{gap:5px !important;margin:0 !important}
213        .hv2-rows .hot-tag{font-size:9px !important;padding:2px 6px !important}
214        .hv2-rows .hot-cta{font-size:11px !important;padding:4px 10px !important;
215          box-shadow:none !important}
216
217        /* 5 — cards in a row sat at different heights because the scroller
218           centres its items. Top-align and stretch so every row lines up. */
219        .hv2-rows .pub-card-scroll,.hv2-rows .pub-news-grid{
220          align-items:stretch !important;
221          /* Both rails start flush left. NewsGrid ships margin-left:-16px to
222             cancel its own 16px padding; the scroller ships no such margin,
223             which is why every strip except Top News sat 16px in. */
224          padding-left:0 !important;padding-right:0 !important;
225          margin-left:0 !important;margin-right:0 !important}
226        .hv2-rows .pub-card-scroll > *,.hv2-rows .pub-news-grid > *{
227          align-self:stretch !important}
228
229        /* 6 — one constant rhythm around every separator: 10px, line, 10px. */
230        .hv2-rows section{border-top:1px solid #e2e2e2 !important;
231          margin-top:10px !important;padding-top:10px !important;
232          padding-bottom:0 !important}
233        .hv2-rows section:first-of-type{border-top:0 !important;margin-top:0 !important;
234          padding-top:0 !important}
235        /* 3 — Browse Miami's heading is a bare h2, not a <section>, so the
236           section rule above skipped it and no line was drawn. */
237        .hv2-rows > div > h2.pub-h2{border-top:1px solid #e2e2e2 !important;
238          margin-top:10px !important;padding-top:10px !important}
239
240        /* 9 — Share and More info are gone for good; the card itself opens the
241           item page. Only like / save / not-for-me remain. */
242        .hv2-rows .pub-btn-share,.hv2-rows .pub-btn-details,
243        .hv2-tight .pub-btn-share,.hv2-tight .pub-btn-details{display:none !important}
244
245        /* 8 — measured: the AskBox root starts 15px above the input and the
246           input's right edge sits 17px inside the root. The Maya button is a
247           sibling of .ask-input-wrap, so it anchors to the root — these offsets
248           are what actually place it inside the field. Avatar is pinned to 20px
249           so the pill stays ~30px and centres in the 49px input. */
250        .hv2 .ask-box-compact .ask-maya-btn{position:absolute !important;
251          top:25px !important;right:22px !important;z-index:3;height:auto !important;
252          min-height:0 !important;padding:4px 9px !important;font-size:11.5px !important;
253          gap:5px !important;margin:0 !important;transform:none !important}
254        .hv2 .ask-box-compact .ask-maya-btn img{width:20px !important;height:20px !important}
255        .hv2 .ask-box-compact .pub-ask-input{padding-right:104px !important}
256
257        /* 7 — category tiles: label and count were floating apart. */
258        .hv2-browse .pub-cat-grid{gap:5px !important}
259        .hv2-browse .pub-cat-tile{padding:6px 8px !important;gap:5px !important}
260        .hv2-browse .pub-cat-tile > div{display:flex !important;
261          flex-direction:column !important;gap:0 !important;line-height:1.1 !important}
262        .hv2-browse .pub-cat-tile h3{margin:0 !important;line-height:1.15 !important}
263        .hv2-browse .pub-cat-tile > div > div{margin:0 !important;line-height:1.15 !important}
264
265        /* 6 + 9 — the rows shipped page-scale vertical rhythm; halve it. */
266        .hv2-rows section,.hv2-rows > div{padding-top:4px !important;
267          padding-bottom:0 !important;margin-top:0 !important;margin-bottom:0 !important}
268        .hv2-rows .pub-section-head{margin-bottom:1px !important;padding-bottom:0 !important}
269        .hv2-rows h2,.hv2-rows h3{font-size:14px !important;margin:0 0 2px !important;
270          padding:0 !important;line-height:1.15 !important}
271        .hv2-rows .pub-card-scroll{padding-top:2px !important;padding-bottom:2px !important}
272        .hv2-rows hr,.hv2-rows .pub-divider{display:none !important}
273        /* One consistent rule between every strip — the stock pages draw a
274           divider on some rows and not others. */
275        .hv2-rows > *,.hv2-rows > * > section,.hv2-rows > * > div{
276          border-top:0}
277        .hv2-rows .pub-see-all{padding:5px 14px !important}
278        .hv2-rows .pub-row-origin,.hv2-rows [class*="origin"]{margin-bottom:1px !important;
279          font-size:9.5px !important;letter-spacing:.08em !important}
280
281        /* 8 — CardRow ships 300px cards; match the feed grid so 2.3 fit. */
282        .hv2-rows .pub-card-scroll{gap:7px !important;
283          grid-template-columns:none !important;grid-auto-columns:154px !important}
284        .hv2-rows .pub-card-scroll > *{flex:0 0 154px !important;width:154px !important;
285          min-width:154px !important;max-width:154px !important}
286
287
288        /* Browse tiles inside the Explore box. Stock CategoryTiles +
289           InterestBrowse are page-scale (877px of Explore box); these
290           overrides bring them to 543px: category tiles become one-line rows,
291           interest taglines go, everything drops to caption sizes. */
292        .hv2-browse .pub-pad-x{padding-left:0 !important;padding-right:0 !important}
293        .hv2-browse section{padding:0 !important}
294        .hv2-browse h2,.hv2-browse h3{font-size:13px !important;
295          padding:0 0 6px !important;margin:0 !important}
296        .hv2-browse .pub-cat-grid{gap:6px !important;padding-bottom:0 !important}
297        .hv2-browse .pub-cat-tile{flex-direction:row !important;align-items:center !important;
298          justify-content:flex-start !important;padding:7px 8px !important;gap:6px !important;
299          min-height:0 !important;border-radius:10px !important;box-shadow:none !important;
300          border:1px solid #dcdcdc !important}
301        .hv2-browse .pub-cat-tile > *{padding:0 !important}
302        .hv2-browse .pub-cat-tile > span{width:18px !important;height:18px !important;
303          flex:0 0 18px !important;background:none !important}
304        .hv2-browse .pub-cat-tile > span svg{width:13px !important;height:13px !important}
305        .hv2-browse .pub-cat-tile > div{text-align:left !important}
306        .hv2-browse .pub-cat-tile h3{font-size:11px !important;line-height:1.15 !important;
307          margin:0 !important}
308        .hv2-browse .pub-cat-tile > div > div{font-size:10px !important;line-height:1.1 !important}
309        /* All four interests on one row — they are four short labels. */
310        .hv2-browse .pub-interest-tagline{display:none !important}
311        .hv2-browse .pub-interest-grid{grid-template-columns:repeat(4,1fr) !important;
312          display:grid !important;gap:5px !important}
313        .hv2-browse .pub-interest-card{padding:8px 4px !important;gap:4px !important;
314          border-radius:10px !important;min-height:0 !important;box-shadow:none !important;
315          border:1px solid #dcdcdc !important;align-items:center !important;
316          text-align:center !important}
317        .hv2-browse .pub-interest-image{width:16px !important;height:16px !important;
318          margin:0 !important}
319        .hv2-browse .pub-interest-image svg{width:16px !important;height:16px !important}
320        .hv2-browse .pub-interest-label{font-size:9.5px !important;line-height:1.1 !important;
321          text-align:center !important;
321white-space:normal !important;
322          overflow:visible !important;max-height:none !important}
323        .hv2-browse .pub-interest-card{min-height:52px !important;
324          justify-content:center !important}
325
326        /* One ladder on this page: the greeting and the two section
327           headlines are the big type; plan names and stop names sit under. */
328        .fh-head h2{margin:0;font-family:${t.fontHead};font-size:22px;font-weight:700;
329          letter-spacing:-.4px;line-height:1.15;color:${t.ink}}
330        .fh-head p{margin:3px 0 0;font-size:13px;color:${t.textMeta}}
331        .fh-hello{margin:2px 2px 2px}
332        .fh-hello h1{margin:0;font-family:${t.fontHead};font-size:19px;font-weight:700;
333          letter-spacing:-.3px;line-height:1.2}
334        .fh-hello p{margin:2px 0 0;font-size:12.5px;color:${t.textMeta}}
335        .fh-now{display:flex;align-items:center;gap:11px;width:100%;background:${t.ink};
336          border:0;border-radius:14px;padding:12px;cursor:pointer;
337          font-family:${t.fontBody};color:#fff;text-align:left}
338        .fh-now-img{flex:0 0 56px;height:56px;border-radius:11px;background:#3a3a3a center/cover no-repeat}
339        .fh-now-txt{display:flex;flex-direction:column;gap:2px;min-width:0;flex:1}
340        .fh-now-txt > span{font-family:${t.fontHead};font-size:15px;font-weight:700;
341          line-height:1.2;letter-spacing:-.2px}
342        .fh-out{display:flex;flex-direction:column;align-items:stretch;gap:12px;padding:2px}
343        .fh-out h2{margin:0;font-family:${t.fontHead};font-size:21px;font-weight:700;
344          letter-spacing:-.3px;line-height:1.2}
345        .fh-out > p{margin:0;font-size:13.5px;line-height:1.45;color:${t.textMeta};max-width:52ch}
346        .fh-out-list{list-style:none;margin:2px 0 0;padding:0;display:flex;flex-direction:column;gap:9px}
347        .fh-out-list li{display:flex;align-items:flex-start;gap:9px;font-size:13.5px;
348          line-height:1.35;color:${t.ink}}
349        .fh-out-cta{border:0;border-radius:999px;background:${t.yellow};color:${t.ink};
350          padding:12px 22px;font-family:${t.fontHead};font-size:14.5px;font-weight:800;
351          cursor:pointer;align-self:stretch}
352        .fh-map{display:flex;flex-direction:column}
353        .fh-map > button{min-height:150px}
354        /* "0 near you" means nothing before we know where they are. */
355        .hv2.is-out .fh-map > button > span:last-child{display:none}
356        .fh-planskel{min-height:260px;border-radius:14px;border:1px solid #e6e6e6;
357          background:linear-gradient(180deg,#f3f3f3 0 48px,#fafafa 48px 100%);opacity:.8}
358        .fh-planskel.is-side{background:#fff8e3;border-color:#f2e2b0}
359        .fh-waiting{display:flex;align-items:center;gap:10px;background:#fff8e3;
360          border:1px solid #f2e2b0;border-radius:13px;padding:12px}
361        .fh-waiting span{display:flex;flex-direction:column;gap:1px;min-width:0}
362        .fh-waiting b{font-family:${t.fontHead};font-size:14px;font-weight:700;line-height:1.25}
363        .fh-waiting em{font-style:normal;font-size:11.5px;color:#6b5200}
364        .fh-link{align-self:flex-start;display:inline-flex;align-items:center;gap:3px;border:0;
365          background:none;padding:0;font-size:12.5px;font-weight:700;color:${t.ink};
366          cursor:pointer;font-family:${t.fontBody}}
367        .fh-now-txt em{font-style:normal;font-size:11.5px;color:#c7c7c7}
368        .fhc-toprow{display:flex;align-items:center;justify-content:space-between;gap:8px}
369        /* Desktop: two columns — the welcome box and plans on the left, the
370           feed on the right, instead of one phone-width column. */
371        @media (min-width:768px){
372          /* Desktop: one full-width page, stacked top to bottom — Welcome,
373             then the plans bar, then the feed as a real content grid — same
374             flow as every other desktop page on the site. The old 420px/1fr
375             two-column grid boxed the feed into a narrow scrolling widget
376             (mobile-app-dashboard shape) and left a wall of empty page
377             background under the short plans column: reported repeatedly as
378             "looks completely mobile" on desktop. */
379          .hv2{max-width:1200px;display:flex;flex-direction:column;gap:20px;
380            padding:22px 24px 0}
381          .hv2.is-out{max-width:900px}
382          /* The map is the point of this block when there is no feed yet. */
383          .hv2.is-out .fh-map > button{min-height:300px}
384          .hv2.is-out .fh-hello h1{font-size:30px}
385          .fh-out{gap:14px;padding:6px 2px}
386          .fh-out h2{font-size:26px}
387          .fh-out > p{font-size:15px}
388          .fh-out-list li{font-size:14.5px}
389          .fh-out-cta{align-self:flex-start;
389padding:13px 26px;font-size:15px}
390          .fh-hello h1{font-size:34px}
391          .fh-hello p{font-size:15px}
392          .fh-head h2{font-size:28px}
393          .fh-head p{font-size:14px}
394          /* Below the headlines: the plan's name, then the stop names. */
395          .fh-tabbox .fw-glancename{font-size:20px}
396          .fh-tabbox .fw-gcopy b{font-size:17px}
397          /* Desktop cards are the site's real cards, not the fold-squeezed ones. */
398          .hv2-tight .pub-card{border:1px solid #dcdcdc !important;box-shadow:none !important}
399          .hv2-tab{font-size:13px;padding:7px 14px}
400          .hv2 .fh-now{padding:14px;max-width:520px}
401          .hv2 .fh-now-img{flex:0 0 68px;height:68px}
402          .fhc-plancell{flex:0 0 168px;width:168px}
403        }
404        .fhc-concept{font-size:9.5px;font-weight:700;text-transform:uppercase;letter-spacing:.05em;
405          color:#6b5200;background:#fff3cc;border-radius:999px;padding:3px 8px}
406        .fhc-line{display:flex;align-items:center;gap:7px;width:100%;border:0;background:#f4f4f4;
407          border-radius:10px;padding:7px 9px;font-size:12.5px;text-align:left;cursor:pointer;
408          color:${t.ink};font-family:${t.fontBody}}
409        .fhc-line > span:nth-child(2){flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
410        .fhc-edit{font-size:12px;font-weight:700;text-decoration:underline}
411        .fhc-part{display:flex;flex-direction:column;gap:5px}
412        .fhc-hello{margin:2px 0 0;font-size:13px;color:${t.textMeta}}
413        .fhc-label{font-size:10.5px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:${t.textMeta}}
414        .fhc-talk{display:flex;gap:7px}
415        .fhc-talk-btn{flex:1;min-width:0;display:inline-flex;align-items:center;justify-content:center;gap:5px;height:38px;padding:0 4px;white-space:nowrap;border-radius:10px;
416          border:1px solid #dcdcdc;background:#fff;color:${t.ink};font-family:${t.fontBody};font-size:12.5px;font-weight:700;
417          text-decoration:none;cursor:pointer}
418        .fhc-talk-btn.is-yellow{background:${t.yellow};border-color:${t.yellow};flex:2}
419        .fhc-narrow{flex:1}
420        .fhc-plancell{flex:0 0 154px;width:154px;min-width:0}
421        /* A plan is not an experience: no item-type badge. */
422        .fhc-planrow .pub-card-badges{display:none !important}
423        .fhc-gate{background:#f4f4f4;border-radius:12px;padding:14px;text-align:center}
424        .fhc-gate p{margin:0 0 10px;font-size:13px;color:#444;line-height:1.35}
425        .fhc-gate button{border:0;border-radius:999px;background:${t.yellow};padding:9px 18px;font-weight:800;font-size:13.5px;cursor:pointer;font-family:${t.fontBody}}
426        .fhc-talk-btn img{width:22px;height:22px;border-radius:50%;object-fit:cover}
427        .fhc-planrow{display:flex;gap:7px;overflow-x:auto;scrollbar-width:none;margin:0 -12px;padding:0 12px 2px}
428        .fhc-planrow::-webkit-scrollbar{display:none}
429
430        ${We()}
431
432        .fh-recs{display:flex;flex-direction:column;gap:12px}
433        .fh-recs .hv2-feedwrap{min-width:0}
434        /* FeedMiniMap is a fixed 442px tall; inside a card cell it takes the
435           cell's height instead, so it can never break the grid rhythm. */
436        .fh-mapcell{min-width:0}
437        .fh-mapcell .hv2d-map{height:100% !important;min-height:220px}
438        @media (min-width:768px){
439          /* Desktop: the site's real, full-size cards — three across, no inner scroll. */
440          .fh-recs .hv2-scroll{max-height:none;overflow:visible;padding:12px}
441          .fh-recs .hv2-grid{grid-template-columns:repeat(3,minmax(0,1fr)) !important;gap:16px}
442          /* The map is one card, same as everything around it. */
443          .fh-recs .fh-mapcell{grid-column:span 1}
444        }
445
446      `}),e.jsxs("div",{className:`hv2${m?"":" is-out"}`,children:[e.jsxs("header",{className:"fh-hello",children:[e.jsx("h1",{children:m?v.firstName?`Welcome, ${v.firstName}`:"Welcome":"Welcome to HelloCity"}),e.jsx("p",{children:m?"Your plans and your recommendations, made for your family.":`Family plans for ${A}, made for your kids.`})]}),e.jsx(Z,{children:m?!w.plans.length&&(w.pending||W)?e.jsxs(e.Fragment,{children:[e.jsx(M,{title:"Suggested upcoming plans",sub:"Loading your plans…"}),e.jsxs("div",{className:"fh-plansrow","aria-busy":"true",children:[e.jsx("div",{className:"fh-planskel"}),e.jsx("div",{className:"fh-planskel is-side"})]})]}):w.plans.length?e.jsxs(e.Fragment,{children:[e.jsx(M,{title:"Suggested upcoming plans",sub:`${w.weekendLabel} · ${w.plans.length} ${w.plans.length===1?"plan":"plans"} picked for your family`,action:"See detailed plans →",onAction:()=>r(i(V))}),e.jsxs("div",{className:"fh-plansrow",children:[e.jsx(De,{plans:w.plans,onOpen:a=>r(i(`${V}/${a}`))}),e.jsx(qe,{onBuild:()=>r(i(Ce))})]})]}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"fh-waiting",children:[e.jsx(k,{name:"calendar-outline",size:18,color:t.ink}),e.jsxs("span",{children:[e.jsxs("b",{children:["Your next plan arrives ",Ye]}),e.jsx("em",{children:Ue.channel})]})]}),e.jsxs("button",{type:"button",className:"fh-link",onClick:()=>r(i(oe)),children:["Browse other plans ",e.jsx(k,{name:"chevron-forward",size:13})]})]}):e.jsx("div",{className:"fh-out",children:e.jsx("button",{type:"button",className:"fh-out-cta",onClick:()=>z.open({tab:"signup",source:"home_signup_cta"}),children:"Sign up to start getting plans"})})}),e.jsxs(Z,{children:[e.jsx(M,{title:"Recommendations you might like",sub:"The most relevant things near you right now",action:m?"See all →":void 0,onAction:()=>{Ie("home_feed_header","/feed"),r(i("/family/feed"))}}),m?e.jsx("div",{className:"fh-recs",children:e.jsxs("div",{className:"hv2-feedwrap",children:[e.jsx("div",{className:"hv2-tabstrip",role:"tablist",children:S.map(a=>e.jsx("button",{type:"button",role:"tab","aria-selected":f===a.id,className:`hv2-tab${f===a.id?" is-on":""}`,onClick:()=>de(a.id),children:a.label},a.id))}),e.jsx("div",{className:"hv2-feedpanel",children:e.jsxs("div",{className:`hv2-scroll hv2-grid${pe?" hv2-tight":""}`,ref:P,children:[f==="all"?e.jsx("div",{className:"fh-mapcell",children:e.jsx(ae,{items:u,cityLabel:A,center:m&&v.home?v.home:re,homeNeighborhood:v.area||E||null,onOpen:()=>r(i("/family/map"))})}):null,W?Array.from({length:4},(a,o)=>e.jsx(Je,{},o)):ce(F.slice(0,15))]})})]})}):e.jsxs("div",{className:"fhc-gate",children:[e.jsx("p",{children:"Your recommendations are picked for your family: events, places and experiences near you."}),e.jsx("button",{type:"button",onClick:()=>z.open({tab:"signup",source:"home_signup_cta"}),children:"Sign up to see your recommendations"})]})]})]}),e.jsx(Q,{}),e.jsx(X,{})]}):e.jsxs("div",{style:{background:t.bg,minHeight:"100vh"},children:[e.jsx(K,{}),e.jsx($e,{topNews:null,whatsHot:null,families:null,postInterestRows:null,heroOnly:!0,hideChips:!0,hideNote:!0,heroImageDesktop:"/images/family/banner-desktop.png",heroImageMobile:"/images/family/banner-mobile.jpg",heroTitle:"A perfect personalized family plan, ",heroAccent:"every week",heroCta:"Sign up for plans",onSignUp:()=>z.open({tab:"signup",source:"home_signup_cta"})}),e.jsx(Ke,{onStart:()=>z.open({tab:"signup",source:"home_signup_cta"})}),e.jsx(Qe,{}),e.jsx(Q,{}),e.jsx(X,{})]})}
446export{ht as default};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.