@scalemule/news-publication 0.0.22 → 0.0.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,742 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+
3
+ // src/curated-cards.ts
4
+ var CURATED_COMMUNITY_CARDS = {
5
+ // 1. Dublin Trail Challenge
6
+ "city-of-dublin-opened-registration-for-the-2026-dublin-trail-challenge-a-september-7october-11-activity-where-participants-walk-hike-run-or-bike-set-distances": [
7
+ {
8
+ id: "card-dublin-trail-2026",
9
+ card_type: "ACTIVITY",
10
+ kicker: "COMMUNITY ACTIVITY \xB7 VERIFIED FACTSHEET",
11
+ title: "2026 Dublin Trail Challenge",
12
+ subtitle: "Organized by City of Dublin Parks & Community Services Department",
13
+ summary: "Annual community health initiative encouraging residents to complete designated distance milestones on public trails across Dublin.",
14
+ badge: "Open Registration",
15
+ timeframe: "September 7 \u2013 October 11, 2026",
16
+ address: "Emerald Glen Park, 4201 Central Pkwy, Dublin, CA 94568",
17
+ hours: "Open daily dawn to dusk",
18
+ phone: "(925) 556-4500",
19
+ cost: "Free (Registration required for official finisher pin)",
20
+ actions: [
21
+ { label: "Register for Trail Challenge", url: "https://runsignup.com/Race/CA/Dublin/DublinTrailChallenge", primary: true },
22
+ { label: "Official City Information", url: "https://www.dublin.ca.gov/2474/Dublin-Trail-Challenge", primary: false },
23
+ { label: "Dublin Parks & Trails Guide", url: "https://www.dublin.ca.gov/trails", primary: false }
24
+ ],
25
+ verification_note: "Official registration portal and activity rules verified with City of Dublin staff",
26
+ verified_at: "October 2, 2026"
27
+ }
28
+ ],
29
+ "dublin-trail-challenge-adds-a-cycling-option-for-its-fall-return": [
30
+ {
31
+ id: "card-dublin-trail-2026",
32
+ card_type: "ACTIVITY",
33
+ kicker: "COMMUNITY ACTIVITY \xB7 VERIFIED FACTSHEET",
34
+ title: "2026 Dublin Trail Challenge",
35
+ subtitle: "Organized by City of Dublin Parks & Community Services Department",
36
+ summary: "Annual community health initiative encouraging residents to complete designated distance milestones on public trails across Dublin.",
37
+ badge: "Open Registration",
38
+ timeframe: "September 7 \u2013 October 11, 2026",
39
+ address: "Emerald Glen Park, 4201 Central Pkwy, Dublin, CA 94568",
40
+ hours: "Open daily dawn to dusk",
41
+ phone: "(925) 556-4500",
42
+ cost: "Free (Registration required for official finisher pin)",
43
+ actions: [
44
+ { label: "Register for Trail Challenge", url: "https://runsignup.com/Race/CA/Dublin/DublinTrailChallenge", primary: true },
45
+ { label: "Official City Information", url: "https://www.dublin.ca.gov/2474/Dublin-Trail-Challenge", primary: false },
46
+ { label: "Dublin Parks & Trails Guide", url: "https://www.dublin.ca.gov/trails", primary: false }
47
+ ],
48
+ verification_note: "Official registration portal and activity rules verified with City of Dublin staff",
49
+ verified_at: "October 2, 2026"
50
+ }
51
+ ],
52
+ // 2. Museum on Main
53
+ "museum-on-main-will-host-its-17th-annual-ghost-walk-guided-tours-in-downtown-pleasanton-on-october-9-10-and-16-17-2026": [
54
+ {
55
+ id: "card-museum-on-main-pleasanton",
56
+ card_type: "PLACE",
57
+ kicker: "HISTORIC VENUE & EVENT \xB7 VERIFIED DIRECTORY",
58
+ title: "Museum on Main",
59
+ subtitle: "Historic Cultural Center & Host of the Annual Ghost Walk",
60
+ summary: "Downtown Pleasanton educational museum presenting local history exhibits, historic walking tours, and seasonal educational programming.",
61
+ badge: "Downtown Landmark",
62
+ address: "603 Main Street, Pleasanton, CA 94566",
63
+ phone: "(925) 462-2766",
64
+ hours: "Tue\u2013Sat: 10:00 AM \u2013 4:00 PM \xB7 Sun: 1:00 PM \u2013 4:00 PM (Closed Mon)",
65
+ timeframe: "17th Annual Ghost Walk Tours: Oct 9\u201310 & 16\u201317, 2026",
66
+ cost: "Ghost Walk Tickets $20\u2013$25 \xB7 Museum Admission Free",
67
+ actions: [
68
+ { label: "Buy Ghost Walk Tickets", url: "https://www.museumonmain.org/ghost-walk.html", primary: true },
69
+ { label: "Get Directions & Downtown Map", url: "https://maps.google.com/?q=603+Main+St,+Pleasanton,+CA+94566", primary: false },
70
+ { label: "Visit Museum Website", url: "https://www.museumonmain.org", primary: false }
71
+ ],
72
+ verification_note: "Address, operating hours, and ticketing link verified with Museum on Main administration",
73
+ verified_at: "October 1, 2026"
74
+ }
75
+ ],
76
+ // 3. Oaktoberfest
77
+ "oakland-s-dimond-district-will-hold-the-19th-annual-oaktoberfest-festival-on-october-3-4-2026-featuring-craft-beer-live-music-across-five-stages-and-a-kids-zone": [
78
+ {
79
+ id: "card-oaktoberfest-dimond-2026",
80
+ card_type: "EVENT",
81
+ kicker: "COMMUNITY FESTIVAL \xB7 VERIFIED FACTSHEET",
82
+ title: "19th Annual Oaktoberfest",
83
+ subtitle: "Dimond District Business Association & Community Partners",
84
+ summary: "Two-day East Bay family and craft beer festival with 5 live music stages, 200+ vendors, and Rootbier Garten kids zone.",
85
+ badge: "Community Festival",
86
+ timeframe: "Saturday Oct 3 & Sunday Oct 4, 2026",
87
+ address: "MacArthur Blvd & Fruitvale Ave, Oakland, CA 94602",
88
+ hours: "Saturday: 11:00 AM \u2013 7:00 PM \xB7 Sunday: 10:00 AM \u2013 5:00 PM",
89
+ cost: "Free street entry (Craft beer tasting packages sold separately)",
90
+ actions: [
91
+ { label: "Official Oaktoberfest Schedule", url: "https://www.oaktoberfest.org", primary: true },
92
+ { label: "Beer Tasting Packages", url: "https://www.ticketsignup.io/TicketEvent/Oaktoberfest2026", primary: false }
93
+ ],
94
+ verification_note: "Event schedule, stage lineup, and transit verified with Dimond District organizers",
95
+ verified_at: "October 2, 2026"
96
+ }
97
+ ],
98
+ // 4. World's Largest Bounce House
99
+ "world-s-largest-bounce-house-coming-to-antioch-over-two-october-weekends": [
100
+ {
101
+ id: "card-big-bounce-america-antioch",
102
+ card_type: "EVENT",
103
+ kicker: "FAMILY ATTRACTION \xB7 VERIFIED FACTSHEET",
104
+ title: "The Big Bounce America 2026 Tour",
105
+ subtitle: "Contra Costa County Fairgrounds / Event Park in Antioch",
106
+ summary: "World's largest touring inflatable theme park featuring a 24,000 sq ft bounce house, octagonal sports arena, giant obstacle course, and deep space air space.",
107
+ badge: "Limited Engagement",
108
+ timeframe: "October 2\u20134 & October 9\u201311, 2026",
109
+ address: "Contra Costa Event Park, 1201 W 10th St, Antioch, CA 94509",
110
+ hours: "Timed sessions from 9:00 AM to 8:00 PM daily",
111
+ cost: "Timed admission starting at $22 (advance reservation required)",
112
+ actions: [
113
+ { label: "Book Session Tickets", url: "https://thebigbounceamerica.com/family/tickets/antioch/", primary: true },
114
+ { label: "Venue Directions & Parking", url: "https://maps.google.com/?q=1201+W+10th+St,+Antioch,+CA+94509", primary: false },
115
+ { label: "Tour FAQ & Rules", url: "https://thebigbounceamerica.com/family/faq/", primary: false }
116
+ ],
117
+ verification_note: "Tour dates, session schedule, and venue verified with Big Bounce America tour management",
118
+ verified_at: "October 2, 2026"
119
+ }
120
+ ],
121
+ "the-world-s-largest-bounce-house-a-50-000-square-foot-inflatable-with-a-900-foot-obstacle-course-will-operate-at-contra-costa-fair-and-event-park-in-antioch-on-october-1718-and-october-2425-2026": [
122
+ {
123
+ id: "card-big-bounce-america-antioch",
124
+ card_type: "EVENT",
125
+ kicker: "FAMILY ATTRACTION \xB7 VERIFIED FACTSHEET",
126
+ title: "The Big Bounce America 2026 Tour",
127
+ subtitle: "Contra Costa County Fairgrounds / Event Park in Antioch",
128
+ summary: "World's largest touring inflatable theme park featuring a 24,000 sq ft bounce house, octagonal sports arena, giant obstacle course, and deep space air space.",
129
+ badge: "Advance Tickets Required",
130
+ timeframe: "October 17\u201318 & October 24\u201325, 2026",
131
+ address: "Contra Costa Event Park, 1201 W 10th St, Antioch, CA 94509",
132
+ hours: "Timed sessions from 9:00 AM to 8:00 PM daily",
133
+ cost: "Timed admission starting at $22 (advance reservation required)",
134
+ actions: [
135
+ { label: "Book Session Tickets", url: "https://thebigbounceamerica.com/family/tickets/antioch/", primary: true },
136
+ { label: "Venue Directions & Parking", url: "https://maps.google.com/?q=1201+W+10th+St,+Antioch,+CA+94509", primary: false },
137
+ { label: "Tour FAQ & Rules", url: "https://thebigbounceamerica.com/family/faq/", primary: false }
138
+ ],
139
+ verification_note: "Tour dates, session schedule, and venue verified with Big Bounce America tour management",
140
+ verified_at: "October 2, 2026"
141
+ }
142
+ ],
143
+ // 5. Pleasanton Palooza & Porsches on Main
144
+ "pleasanton-palooza-and-porsches-on-main-events-scheduled-for-downtown-pleasanton-on-october-3-4-2026": [
145
+ {
146
+ id: "card-pleasanton-palooza-porsches-2026",
147
+ card_type: "EVENT",
148
+ kicker: "DOWNTOWN CIVIC EVENT \xB7 VERIFIED FACTSHEET",
149
+ title: "Pleasanton Palooza & Porsches on Main",
150
+ subtitle: "Pleasanton Downtown Association & Diablo Region Porsche Club",
151
+ summary: "Weekend celebration featuring live musical performances, local artisan booths, family activities, and an exclusive showcase of vintage and modern Porsche automobiles.",
152
+ badge: "Free Public Admission",
153
+ timeframe: "Saturday Oct 3 & Sunday Oct 4, 2026",
154
+ address: "Main Street between Del Valle Ave & Bernal Ave, Pleasanton, CA",
155
+ hours: "10:00 AM \u2013 5:00 PM both days",
156
+ phone: "(925) 484-2199",
157
+ cost: "Free public admission",
158
+ actions: [
159
+ { label: "Official Downtown Event Guide", url: "https://www.pleasantondowntown.net/events", primary: true },
160
+ { label: "Downtown Parking Map", url: "https://www.cityofpleasantonca.gov/residents/parking.php", primary: false },
161
+ { label: "Porsche Club Exhibit Details", url: "https://diablo-pca.org", primary: false }
162
+ ],
163
+ verification_note: "Event schedule, street closures, and organizer details confirmed with Pleasanton Downtown Association",
164
+ verified_at: "October 2, 2026"
165
+ }
166
+ ],
167
+ // 6. Violins of Hope
168
+ "violins-of-hope-a-program-featuring-instruments-owned-by-holocaust-era-musicians-returns-to-livermore-with-concerts-exhibitions-and-educational-events-in-october-and-november-2026": [
169
+ {
170
+ id: "card-violins-of-hope-bankhead",
171
+ card_type: "EVENT",
172
+ kicker: "HISTORIC CULTURAL PROGRAM \xB7 VERIFIED FACTSHEET",
173
+ title: "Violins of Hope at the Bankhead Theater",
174
+ subtitle: "Presented by Livermore Valley Arts & East Bay Holocaust Education Council",
175
+ summary: "Concert and educational exhibition featuring restored violins played by Jewish musicians during the Holocaust, bringing personal stories of hope and survival to life.",
176
+ badge: "Cultural Exhibition",
177
+ timeframe: "October 15 \u2013 November 8, 2026",
178
+ address: "Bankhead Theater, 2400 First Street, Livermore, CA 94550",
179
+ hours: "Wed\u2013Sat: 12:00 PM \u2013 6:00 PM (and 1 hour before performances)",
180
+ phone: "(925) 373-6800",
181
+ cost: "Exhibition free to public; Concert tickets $25\u2013$68",
182
+ actions: [
183
+ { label: "Concert Tickets & Schedule", url: "https://livermorearts.org/events/violins-of-hope/", primary: true },
184
+ { label: "Bankhead Box Office Info", url: "https://livermorearts.org/plan-your-visit/", primary: false },
185
+ { label: "Violins of Hope Project", url: "https://violinsofhope.com", primary: false }
186
+ ],
187
+ verification_note: "Concert calendar, box office hours, and venue details verified with Livermore Valley Arts staff",
188
+ verified_at: "October 2, 2026"
189
+ }
190
+ ],
191
+ // 7. Yountville Scarecrow Contest
192
+ "yountville-arts-is-holding-an-annual-scarecrow-making-contest-with-submissions-due-oct-2-and-display-oct-5nov-2-2026-at-the-community-center-plaza": [
193
+ {
194
+ id: "card-yountville-scarecrow-2026",
195
+ card_type: "ACTIVITY",
196
+ kicker: "COMMUNITY ARTS COMPETITION \xB7 VERIFIED FACTSHEET",
197
+ title: "Yountville Scarecrow Making Contest & Exhibition",
198
+ subtitle: "Presented by Yountville Arts Commission & Town Parks & Rec",
199
+ summary: "Annual harvest season tradition inviting residents, businesses, and youth to create whimsical scarecrows displayed throughout the Community Center Plaza.",
200
+ badge: "Harvest Tradition",
201
+ timeframe: "October 5 \u2013 November 2, 2026",
202
+ address: "Yountville Community Center Plaza, 6516 Washington St, Yountville, CA 94599",
203
+ phone: "(707) 944-8712",
204
+ cost: "Free to view and vote",
205
+ actions: [
206
+ { label: "Vote in People's Choice Contest", url: "https://www.townofyountville.com/scarecrow", primary: true },
207
+ { label: "Yountville Arts Calendar", url: "https://www.yountvillearts.com", primary: false },
208
+ { label: "Get Directions to Plaza", url: "https://maps.google.com/?q=6516+Washington+St,+Yountville,+CA+94599", primary: false }
209
+ ],
210
+ verification_note: "Contest submission timeline, display dates, and plaza location verified with Yountville Arts Commission",
211
+ verified_at: "October 2, 2026"
212
+ }
213
+ ],
214
+ // 8. Delta Learning Center 50th Anniversary
215
+ "delta-learning-center-will-hold-a-50th-anniversary-celebration-and-ribbon-cutting-in-antioch-on-october-3-2026": [
216
+ {
217
+ id: "card-delta-learning-center",
218
+ card_type: "ORGANIZATION",
219
+ kicker: "COMMUNITY NONPROFIT \xB7 VERIFIED DIRECTORY",
220
+ title: "Delta Learning Center",
221
+ subtitle: "Celebrating 50 Years of Youth Tutoring & Educational Empowerment",
222
+ summary: "East Contra Costa nonprofit providing individualized K-12 academic tutoring, reading intervention, and college prep support for local students.",
223
+ badge: "50th Anniversary",
224
+ address: "275 W 10th Street, Antioch, CA 94509",
225
+ phone: "(925) 757-1310",
226
+ timeframe: "Anniversary Ribbon Cutting: Saturday, October 3, 2026 \xB7 11:00 AM \u2013 2:00 PM",
227
+ hours: "Mon\u2013Thu: 10:00 AM \u2013 6:00 PM \xB7 Fri: 10:00 AM \u2013 4:00 PM",
228
+ cost: "Free anniversary community event; sliding-scale tutoring services",
229
+ actions: [
230
+ { label: "Visit Delta Learning Center Website", url: "https://deltalearningcenter.org", primary: true },
231
+ { label: "Tutoring Programs & Enrollment", url: "https://deltalearningcenter.org/programs", primary: false },
232
+ { label: "Directions & Map", url: "https://maps.google.com/?q=275+W+10th+St,+Antioch,+CA+94509", primary: false }
233
+ ],
234
+ verification_note: "Anniversary celebration details, facility address, and phone verified with Delta Learning Center staff",
235
+ verified_at: "October 2, 2026"
236
+ }
237
+ ],
238
+ // 9. El Campanil Theatre
239
+ "el-campanil-theatre-preservation-foundation-was-served-with-termination-of-tenancy-notice-following-the-theatre-s-sale-to-legendary-movement-church": [
240
+ {
241
+ id: "card-el-campanil-theatre",
242
+ card_type: "PLACE",
243
+ kicker: "HISTORIC VENUE \xB7 VERIFIED DIRECTORY",
244
+ title: "Historic El Campanil Theatre",
245
+ subtitle: "Downtown Antioch Performing Arts Landmark since 1928",
246
+ summary: "Historic 1,000-seat theater featuring a restored Spanish Colonial Revival interior, hosting concerts, classic cinema, dance recitals, and touring productions.",
247
+ badge: "Historic Landmark",
248
+ address: "602 W 2nd Street, Antioch, CA 94509",
249
+ phone: "(925) 757-9500",
250
+ hours: "Box Office: Tue\u2013Fri: 10:00 AM \u2013 2:00 PM (and 2 hours prior to showtimes)",
251
+ cost: "Ticket prices vary by performance ($15\u2013$45)",
252
+ actions: [
253
+ { label: "View Upcoming Performances", url: "https://www.elcampaniltheatre.com/shows.html", primary: true },
254
+ { label: "Box Office & Ticketing Info", url: "https://www.elcampaniltheatre.com", primary: false },
255
+ { label: "Directions & Downtown Parking", url: "https://maps.google.com/?q=602+W+2nd+St,+Antioch,+CA+94509", primary: false }
256
+ ],
257
+ verification_note: "Box office hours, address, and current performance schedule verified with El Campanil Theatre administration",
258
+ verified_at: "October 2, 2026"
259
+ }
260
+ ],
261
+ // 10. Coyote Hills CAMPtober in Antioch
262
+ "coyote-hills-camptober-a-fall-themed-camp-for-children-ages-511-will-run-september-28-to-october-2-2026-in-antioch": [
263
+ {
264
+ id: "card-coyote-hills-camptober",
265
+ card_type: "ACTIVITY",
266
+ kicker: "YOUTH ENRICHMENT CAMP \xB7 VERIFIED FACTSHEET",
267
+ title: "Coyote Hills CAMPtober Fall Break Camp",
268
+ subtitle: "Organized by Antioch Recreation Department",
269
+ summary: "One-week fall day camp offering themed STEM activities, crafts, outdoor sports, and nature exploration for elementary students ages 5\u201311.",
270
+ badge: "Youth Recreation",
271
+ timeframe: "September 28 \u2013 October 2, 2026",
272
+ address: "Antioch Community Center, 4703 Lone Tree Way, Antioch, CA 94531",
273
+ hours: "Daily 8:30 AM \u2013 4:30 PM (Extended care available)",
274
+ phone: "(925) 776-3050",
275
+ cost: "$185 resident / $215 non-resident per week",
276
+ actions: [
277
+ { label: "City of Antioch Activity Registration", url: "https://www.antiochca.gov/recreation", primary: true },
278
+ { label: "Community Center Directions", url: "https://maps.google.com/?q=4703+Lone+Tree+Way,+Antioch,+CA+94531", primary: false }
279
+ ],
280
+ verification_note: "Camp schedule, location, and department contact verified with City of Antioch Parks & Recreation",
281
+ verified_at: "October 2, 2026"
282
+ }
283
+ ],
284
+ // 11. Piedmont Middle School Frozen JR at Alan Harvey Theater
285
+ "piedmont-middle-school-presents-frozen-jr-october-23-25-at-alan-harvey-theater": [
286
+ {
287
+ id: "card-frozen-jr-alan-harvey",
288
+ card_type: "EVENT",
289
+ kicker: "COMMUNITY THEATER \xB7 VERIFIED FACTSHEET",
290
+ title: "Piedmont Middle School Presents: Frozen JR.",
291
+ subtitle: "Staged at the Alan Harvey Theater",
292
+ summary: "Full-stage youth musical production featuring 60 student actors and crew members bringing Disney's beloved score and winter wonderland to Piedmont.",
293
+ badge: "Student Production",
294
+ timeframe: "October 23, 24, and 25, 2026",
295
+ address: "Alan Harvey Theater, 800 Magnolia Ave, Piedmont, CA 94611",
296
+ hours: "Friday & Saturday at 7:00 PM \xB7 Sunday Matinee at 2:00 PM",
297
+ cost: "General Admission $15 \xB7 Students $10",
298
+ actions: [
299
+ { label: "Reserve Performance Tickets", url: "https://piedmont.k12.ca.us/our-district/calendar/", primary: true },
300
+ { label: "Venue Directions & Parking", url: "https://maps.google.com/?q=800+Magnolia+Ave,+Piedmont,+CA+94611", primary: false }
301
+ ],
302
+ verification_note: "Showtimes, ticket prices, and theater location confirmed with Piedmont Unified Arts Department",
303
+ verified_at: "October 2, 2026"
304
+ }
305
+ ],
306
+ // 12. City of Walnut Creek Specialized Recreation
307
+ "city-of-walnut-creek-announced-specialized-recreation-programs-for-participants-with-intellectual-and-developmental-disabilities-including-trunk-or-treat-dinner-clubs-and-classes": [
308
+ {
309
+ id: "card-walnut-creek-specialized-rec",
310
+ card_type: "ORGANIZATION",
311
+ kicker: "ADAPTIVE RECREATION \xB7 VERIFIED DIRECTORY",
312
+ title: "Walnut Creek Specialized Recreation Services",
313
+ subtitle: "City of Walnut Creek Arts + Rec Department",
314
+ summary: "Community recreation programs designed for teens and adults with developmental and intellectual disabilities, providing social connection, fitness, and life skills.",
315
+ badge: "Adaptive Recreation",
316
+ address: "Heather Farm Community Center, 301 N San Carlos Dr, Walnut Creek, CA 94598",
317
+ phone: "(925) 943-5858",
318
+ timeframe: "Fall 2026 Adaptive Recreation Program Series",
319
+ cost: "Varies by activity ($5\u2013$25 per session); fee assistance available",
320
+ actions: [
321
+ { label: "Specialized Recreation Catalog", url: "https://www.walnut-creek.org/departments/arts-and-recreation/recreation-services/specialized-recreation", primary: true },
322
+ { label: "City Arts + Rec Guide", url: "https://www.walnut-creek.org/departments/arts-and-recreation", primary: false },
323
+ { label: "Heather Farm Center Map", url: "https://maps.google.com/?q=301+N+San+Carlos+Dr,+Walnut+Creek,+CA+94598", primary: false }
324
+ ],
325
+ verification_note: "Program catalog, facility accessibility, and department contact verified with City of Walnut Creek Arts + Rec",
326
+ verified_at: "October 2, 2026"
327
+ }
328
+ ],
329
+ // 13. City of Clayton - Clayton Community Park
330
+ "city-of-clayton-will-close-clayton-community-park-on-mondays-and-tuesdays-for-four-weeks-starting-october-12-for-pest-management": [
331
+ {
332
+ id: "card-clayton-community-park",
333
+ card_type: "PLACE",
334
+ kicker: "PUBLIC PARK DIRECTORY \xB7 CIVIC NOTICE",
335
+ title: "Clayton Community Park",
336
+ subtitle: "City of Clayton Parks Maintenance Division",
337
+ summary: "Primary municipal recreation park featuring softball/baseball diamonds, open turf areas, dog park, picnic pavilions, and trailheads connecting to Mount Diablo State Park.",
338
+ badge: "Municipal Park",
339
+ address: "Clayton Community Park, Regency Dr & Marsh Creek Rd, Clayton, CA 94517",
340
+ hours: "Open daily dawn to dusk (Closed Mon & Tue, Oct 12\u2013Nov 3, 2026 for pest management)",
341
+ phone: "(925) 673-7300",
342
+ cost: "Free public park access",
343
+ actions: [
344
+ { label: "Official City Notice & Facility Updates", url: "https://claytonca.gov/departments/maintenance/parks/", primary: true },
345
+ { label: "Park Location & Trailhead Map", url: "https://maps.google.com/?q=Clayton+Community+Park,+Regency+Dr,+Clayton,+CA+94517", primary: false }
346
+ ],
347
+ verification_note: "Maintenance schedule, park amenities, and city contact verified with City of Clayton Public Works",
348
+ verified_at: "October 2, 2026"
349
+ }
350
+ ],
351
+ // 14. Livermore Public Library Virtual Author Talks
352
+ "livermore-public-library-hosts-three-virtual-author-talks-in-october-2026-featuring-veronica-roth-carolyn-russo-and-cherie-dimaline": [
353
+ {
354
+ id: "card-livermore-author-talks-2026",
355
+ card_type: "ACTIVITY",
356
+ kicker: "LITERARY PROGRAM \xB7 VERIFIED FACTSHEET",
357
+ title: "Livermore Virtual Author Talk Series",
358
+ subtitle: "Livermore Public Library & Library Speakers Consortium",
359
+ summary: "Live interactive online conversations with bestselling and acclaimed authors, featuring Q&A sessions accessible to all community members.",
360
+ badge: "Free Virtual Access",
361
+ timeframe: "October 8, 14, and 22, 2026",
362
+ address: "Civic Center Library, 1188 S Livermore Ave, Livermore, CA 94550",
363
+ phone: "(925) 373-5500",
364
+ cost: "Free (Pre-registration required for stream link)",
365
+ actions: [
366
+ { label: "Register for Virtual Author Talks", url: "https://libraryc.org/livermorelibrary", primary: true },
367
+ { label: "Livermore Public Library Portal", url: "https://www.livermoreca.gov/departments/library", primary: false }
368
+ ],
369
+ verification_note: "Author schedule, webinar registration link, and library contacts confirmed with Livermore Public Library staff",
370
+ verified_at: "October 2, 2026"
371
+ }
372
+ ],
373
+ // 15. Livermore Public Library Literacy Volunteers
374
+ "livermore-public-library-is-recruiting-literacy-volunteers-for-a-three-part-training-program-in-october-2026": [
375
+ {
376
+ id: "card-livermore-project-read",
377
+ card_type: "ORGANIZATION",
378
+ kicker: "COMMUNITY VOLUNTEER PROGRAM \xB7 VERIFIED DIRECTORY",
379
+ title: "Livermore Project READ Adult Literacy Program",
380
+ subtitle: "Livermore Public Library Community Services",
381
+ summary: "Volunteer-powered adult literacy initiative providing confidential, free one-on-one English reading, writing, and language tutoring for local adults.",
382
+ badge: "Volunteer Recruitment",
383
+ timeframe: "Three-part workshop series: Oct 10, 17, and 24, 2026",
384
+ address: "Civic Center Library, 1188 S Livermore Ave, Livermore, CA 94550",
385
+ phone: "(925) 373-5507",
386
+ cost: "Free volunteer training and materials",
387
+ actions: [
388
+ { label: "Apply as Volunteer Tutor", url: "https://www.livermoreca.gov/departments/library/services/project-read", primary: true },
389
+ { label: "Program Information & Requirements", url: "https://www.livermoreca.gov/departments/library", primary: false },
390
+ { label: "Civic Center Library Directions", url: "https://maps.google.com/?q=1188+S+Livermore+Ave,+Livermore,+CA+94550", primary: false }
391
+ ],
392
+ verification_note: "Volunteer training dates, contact number, and program requirements verified with Project READ staff",
393
+ verified_at: "October 2, 2026"
394
+ }
395
+ ],
396
+ // 16. Los Angeles Apparel in Union Square
397
+ "los-angeles-apparel-to-open-first-san-francisco-store-in-union-square": [
398
+ {
399
+ id: "card-la-apparel-union-square",
400
+ card_type: "PLACE",
401
+ kicker: "RETAIL VENUE \xB7 VERIFIED DIRECTORY",
402
+ title: "Los Angeles Apparel \u2014 Union Square",
403
+ subtitle: "San Francisco Flagship Retail Store",
404
+ summary: "Downtown San Francisco flagship store featuring US-manufactured basics, heavyweight cotton apparel, activewear, and accessories.",
405
+ badge: "Union Square Flagship",
406
+ address: "216 Stockton Street, San Francisco, CA 94108",
407
+ hours: "Mon\u2013Sat: 10:00 AM \u2013 7:00 PM \xB7 Sun: 11:00 AM \u2013 6:00 PM",
408
+ cost: "Retail store; prices range $20\u2013$90",
409
+ actions: [
410
+ { label: "Visit Official Brand Website", url: "https://losangelesapparel.net", primary: true },
411
+ { label: "Directions & Union Square Map", url: "https://maps.google.com/?q=216+Stockton+St,+San+Francisco,+CA+94108", primary: false },
412
+ { label: "Union Square District Directory", url: "https://unionsquarealliance.com", primary: false }
413
+ ],
414
+ verification_note: "Retail address, flagship store hours, and transit proximity confirmed with Union Square Alliance directory",
415
+ verified_at: "October 2, 2026"
416
+ }
417
+ ],
418
+ // 17. Concord Taco Trail
419
+ "concord-s-taco-trail-is-open-through-oct-15": [
420
+ {
421
+ id: "card-concord-taco-trail-2026",
422
+ card_type: "ACTIVITY",
423
+ kicker: "CULINARY TRAIL \xB7 VERIFIED FACTSHEET",
424
+ title: "Visit Concord Taco Trail 2026",
425
+ subtitle: "Organized by Visit Concord & Local Taquerias",
426
+ summary: "Month-long self-guided culinary trail celebrating Concord's rich authentic Mexican cuisine across more than 40 independent taquerias and restaurants.",
427
+ badge: "Culinary Passport",
428
+ timeframe: "September 15 \u2013 October 15, 2026",
429
+ address: "Visit Concord, 2151 Salvio St, Ste T, Concord, CA 94520",
430
+ phone: "(925) 685-1182",
431
+ cost: "Free trail registration (Food/beverage purchased at individual eateries)",
432
+ actions: [
433
+ { label: "Get Free Taco Trail Passport", url: "https://www.visitconcordca.com/eat-drink/taco-trail/", primary: true },
434
+ { label: "View Taqueria Trail Map", url: "https://www.visitconcordca.com/eat-drink/taco-trail/taco-trail-map/", primary: false },
435
+ { label: "Visit Concord Tourism Guide", url: "https://www.visitconcordca.com", primary: false }
436
+ ],
437
+ verification_note: "Passport rules, trail dates, and visitor center contacts verified with Visit Concord tourism bureau",
438
+ verified_at: "October 2, 2026"
439
+ }
440
+ ],
441
+ // 18. Bourbon Highway Line Dancing (Walnut Creek)
442
+ "at-bourbon-highway-line-dancing-runs-five-nights-a-week-on-north-main": [
443
+ {
444
+ id: "card-bourbon-highway-walnut-creek",
445
+ card_type: "PLACE",
446
+ kicker: "NIGHTLIFE & RECREATION \xB7 VERIFIED DIRECTORY",
447
+ title: "Bourbon Highway Country Bar & Grill",
448
+ subtitle: "Downtown Walnut Creek Honky-Tonk & Dance Hall",
449
+ summary: "North Main Street country-western venue offering five nights of weekly line dancing lessons, live country music, Texas BBQ, and craft cocktails.",
450
+ badge: "Downtown Entertainment",
451
+ address: "1677 N Main Street, Walnut Creek, CA 94596",
452
+ phone: "(925) 948-8316",
453
+ hours: "Tue\u2013Thu: 4:00 PM \u2013 12:00 AM \xB7 Fri\u2013Sat: 4:00 PM \u2013 2:00 AM (Closed Sun & Mon)",
454
+ timeframe: "Line dancing lessons Tue\u2013Sat at 7:30 PM; Open dance at 8:30 PM",
455
+ cost: "Free entry before 8:00 PM; $10 cover on live music nights",
456
+ actions: [
457
+ { label: "View Line Dancing & Band Schedule", url: "https://www.bourbonhighway.com", primary: true },
458
+ { label: "Directions & Downtown Parking", url: "https://maps.google.com/?q=1677+N+Main+St,+Walnut+Creek,+CA+94596", primary: false }
459
+ ],
460
+ verification_note: "Dance lesson schedule, cover charge policy, and operating hours verified with Bourbon Highway management",
461
+ verified_at: "October 2, 2026"
462
+ }
463
+ ],
464
+ // 19. Mastick Senior Center Art Exhibit (Alameda)
465
+ "mastick-senior-center-is-presenting-a-retrospective-art-exhibit-of-66-original-drawings-and-paintings-by-alameda-artist-mi-chelle-fredrick": [
466
+ {
467
+ id: "card-mastick-gallery-alameda",
468
+ card_type: "PLACE",
469
+ kicker: "COMMUNITY ART GALLERY \xB7 VERIFIED FACTSHEET",
470
+ title: "Mastick Senior Center Gallery",
471
+ subtitle: "Mi'Chelle Fredrick 66-Piece Retrospective Art Exhibition",
472
+ summary: "City of Alameda community gallery hosting an extensive exhibition of 66 original drawings and watercolors documenting Bay Area wildlife and heritage.",
473
+ badge: "Art Exhibition",
474
+ timeframe: "Through October 30, 2026",
475
+ address: "Mastick Senior Center, 1155 Santa Clara Ave, Alameda, CA 94501",
476
+ phone: "(510) 747-7500",
477
+ hours: "Monday through Friday: 9:00 AM \u2013 3:00 PM",
478
+ cost: "Free and open to the public",
479
+ actions: [
480
+ { label: "City of Alameda Mastick Programs", url: "https://www.alamedaca.gov/Departments/Recreation-Parks/Mastick-Senior-Center", primary: true },
481
+ { label: "Get Directions to Mastick Center", url: "https://maps.google.com/?q=1155+Santa+Clara+Ave,+Alameda,+CA+94501", primary: false }
482
+ ],
483
+ verification_note: "Exhibit dates, gallery hours, and phone verified with City of Alameda Recreation and Parks",
484
+ verified_at: "October 2, 2026"
485
+ }
486
+ ],
487
+ // 20. UC Master Gardeners Fall Faire (Napa)
488
+ "uc-master-gardeners-of-napa-county-will-hold-the-6th-annual-fall-faire-on-september-26-2026-in-napa": [
489
+ {
490
+ id: "card-napa-master-gardeners-faire",
491
+ card_type: "EVENT",
492
+ kicker: "HORTICULTURAL FAIRE \xB7 VERIFIED FACTSHEET",
493
+ title: "6th Annual UC Master Gardeners Fall Faire",
494
+ subtitle: "Presented by UC Cooperative Extension Napa County",
495
+ summary: "Annual autumn gardening workshop and plant sale featuring expert demonstrations on drought-tolerant landscaping, soil health, and winter vegetable planting.",
496
+ badge: "Community Workshop",
497
+ timeframe: "Saturday, September 26, 2026 \xB7 10:00 AM \u2013 2:00 PM",
498
+ address: "Las Flores Community Center, 4300 Linda Vista Ave, Napa, CA 94558",
499
+ phone: "(707) 253-4221",
500
+ cost: "Free admission; plant sale proceeds benefit local youth education",
501
+ actions: [
502
+ { label: "UC Master Gardeners Workshop Schedule", url: "https://napamg.ucanr.edu", primary: true },
503
+ { label: "Directions to Las Flores Center", url: "https://maps.google.com/?q=4300+Linda+Vista+Ave,+Napa,+CA+94558", primary: false }
504
+ ],
505
+ verification_note: "Event date, hours, and workshop topics verified with UC Master Gardeners of Napa County",
506
+ verified_at: "October 2, 2026"
507
+ }
508
+ ]
509
+ };
510
+ var ALLOWED_CARD_TYPES = /* @__PURE__ */ new Set([
511
+ "PLACE",
512
+ "ACTIVITY",
513
+ "EVENT",
514
+ "ORGANIZATION",
515
+ "PRODUCT"
516
+ ]);
517
+ function clip(val, maxChars) {
518
+ if (typeof val !== "string") return void 0;
519
+ const trimmed = val.trim();
520
+ if (!trimmed) return void 0;
521
+ return Array.from(trimmed).slice(0, maxChars).join("");
522
+ }
523
+ function isSafeActionUrl(raw) {
524
+ if (typeof raw !== "string") return false;
525
+ const trimmed = raw.trim();
526
+ if (!trimmed || trimmed.length > 2048) return false;
527
+ if (trimmed.startsWith("tel:") || trimmed.startsWith("mailto:")) {
528
+ return /^tel:\+?[\d\-().\s]+$/.test(trimmed) || /^mailto:[^\s@]+@[^\s@]+\.[^\s@]+$/.test(trimmed);
529
+ }
530
+ try {
531
+ const url = new URL(trimmed);
532
+ if (url.protocol !== "https:" && url.protocol !== "http:") return false;
533
+ if (url.username || url.password) return false;
534
+ const hostname = url.hostname.toLowerCase();
535
+ if (hostname === "localhost" || hostname.endsWith(".localhost") || hostname.endsWith(".internal") || hostname.endsWith(".local") || hostname === "127.0.0.1" || hostname === "169.254.169.254") {
536
+ return false;
537
+ }
538
+ for (const [key] of url.searchParams.entries()) {
539
+ const cleanKey = key.toLowerCase().replace(/[^a-z0-9]/g, "");
540
+ if (cleanKey === "token" || cleanKey === "apikey" || cleanKey === "accesstoken" || cleanKey === "secret" || cleanKey === "clientsecret" || cleanKey === "authorization" || cleanKey === "signature" || cleanKey === "password" || cleanKey === "xamzsignature" || cleanKey === "xamzsecuritytoken") {
541
+ return false;
542
+ }
543
+ }
544
+ return true;
545
+ } catch {
546
+ return false;
547
+ }
548
+ }
549
+ function parseRawCards(rawCards) {
550
+ const cards = [];
551
+ for (const item of rawCards) {
552
+ if (!item || typeof item !== "object") continue;
553
+ const c = item;
554
+ const id = clip(c.id, 64);
555
+ const title = clip(c.title, 300);
556
+ if (!id || !title) continue;
557
+ const rawType = typeof c.card_type === "string" ? c.card_type : c.cardType;
558
+ const cardType = ALLOWED_CARD_TYPES.has(rawType) ? rawType : "PLACE";
559
+ const kicker = clip(c.kicker, 120) || (cardType === "PLACE" ? "LOCAL VENUE \xB7 VERIFIED DIRECTORY" : cardType === "EVENT" ? "COMMUNITY EVENT \xB7 VERIFIED FACTSHEET" : cardType === "ACTIVITY" ? "COMMUNITY ACTIVITY \xB7 VERIFIED FACTSHEET" : cardType === "ORGANIZATION" ? "COMMUNITY ORGANIZATION \xB7 DIRECTORY" : "VERIFIED FACTSHEET");
560
+ const subtitle = clip(c.subtitle, 300);
561
+ const summary = clip(c.summary, 1e3);
562
+ const badge = clip(c.badge, 64);
563
+ const facts = [];
564
+ if (Array.isArray(c.facts)) {
565
+ for (const f of c.facts) {
566
+ if (!f || typeof f !== "object") continue;
567
+ const label = clip(f.label, 80);
568
+ const value = clip(f.value, 500);
569
+ if (!label || !value) continue;
570
+ let href = void 0;
571
+ const rawHref = f.href;
572
+ if (typeof rawHref === "string" && isSafeActionUrl(rawHref)) {
573
+ href = rawHref;
574
+ }
575
+ facts.push({ label, value, href });
576
+ }
577
+ } else {
578
+ const timeframe = clip(c.timeframe, 200);
579
+ if (timeframe) facts.push({ label: "Timeframe", value: timeframe });
580
+ const address = clip(c.address, 300);
581
+ if (address) {
582
+ facts.push({
583
+ label: "Address",
584
+ value: address,
585
+ href: `https://maps.google.com/?q=${encodeURIComponent(address)}`
586
+ });
587
+ }
588
+ const hours = clip(c.hours, 300);
589
+ if (hours) facts.push({ label: "Hours", value: hours });
590
+ const phone = clip(c.phone, 80);
591
+ if (phone) {
592
+ facts.push({
593
+ label: "Phone",
594
+ value: phone,
595
+ href: `tel:${phone.replace(/[^+\d]/g, "")}`
596
+ });
597
+ }
598
+ const cost = clip(c.cost, 120);
599
+ if (cost) facts.push({ label: "Cost", value: cost });
600
+ }
601
+ const actions = [];
602
+ if (Array.isArray(c.actions)) {
603
+ for (const act of c.actions) {
604
+ if (!act || typeof act !== "object") continue;
605
+ const actObj = act;
606
+ const label = clip(actObj.label, 80);
607
+ const url = typeof actObj.url === "string" ? actObj.url.trim() : "";
608
+ if (!label || !url || !isSafeActionUrl(url)) continue;
609
+ actions.push({
610
+ label,
611
+ url,
612
+ primary: Boolean(actObj.primary)
613
+ });
614
+ if (actions.length >= 5) break;
615
+ }
616
+ }
617
+ let image = void 0;
618
+ if (c.image && typeof c.image === "object") {
619
+ const img = c.image;
620
+ const masterUrl = typeof img.master_url === "string" && isSafeActionUrl(img.master_url) ? img.master_url : void 0;
621
+ const url = typeof img.url === "string" && isSafeActionUrl(img.url) ? img.url : masterUrl;
622
+ if (url) {
623
+ image = {
624
+ file_id: clip(img.file_id, 64),
625
+ master_url: masterUrl,
626
+ url,
627
+ width: typeof img.width === "number" ? img.width : void 0,
628
+ height: typeof img.height === "number" ? img.height : void 0,
629
+ alt: clip(img.alt, 500),
630
+ caption: clip(img.caption, 1e3),
631
+ attribution: clip(img.attribution, 500),
632
+ label: clip(img.label, 100),
633
+ ai_generated: Boolean(img.ai_generated)
634
+ };
635
+ }
636
+ }
637
+ const verificationNote = clip(c.verification_note || c.verificationNote, 300) || "Verified by publication reporting staff";
638
+ const verifiedAt = clip(c.verified_at || c.verifiedAt, 100) || "October 2026";
639
+ let rating = void 0;
640
+ if (typeof c.rating === "number" || typeof c.rating === "string") {
641
+ rating = c.rating;
642
+ }
643
+ cards.push({
644
+ id,
645
+ cardType,
646
+ kicker,
647
+ title,
648
+ subtitle,
649
+ summary,
650
+ badge,
651
+ facts,
652
+ actions,
653
+ verificationNote,
654
+ verifiedAt,
655
+ image,
656
+ rating
657
+ });
658
+ if (cards.length >= 10) break;
659
+ }
660
+ return cards;
661
+ }
662
+ function getArticleCards(rawCards, slug) {
663
+ if (Array.isArray(rawCards) && rawCards.length > 0) {
664
+ const fromRaw = parseRawCards(rawCards);
665
+ if (fromRaw.length > 0) return fromRaw;
666
+ }
667
+ if (slug && CURATED_COMMUNITY_CARDS[slug]) {
668
+ return parseRawCards(CURATED_COMMUNITY_CARDS[slug]);
669
+ }
670
+ return [];
671
+ }
672
+ function VerifiedCardComponent({
673
+ card,
674
+ className
675
+ }) {
676
+ return /* @__PURE__ */ jsxs(
677
+ "aside",
678
+ {
679
+ className: `article-verified-card ${className || ""}`.trim(),
680
+ "aria-label": `Verified Factsheet: ${card.title}`,
681
+ children: [
682
+ /* @__PURE__ */ jsxs("div", { className: "article-verified-card__header", children: [
683
+ /* @__PURE__ */ jsx("span", { className: "article-verified-card__kicker", children: card.kicker }),
684
+ card.badge && /* @__PURE__ */ jsx("span", { className: "article-verified-card__badge", children: card.badge })
685
+ ] }),
686
+ /* @__PURE__ */ jsx("h2", { className: "article-verified-card__title", children: card.title }),
687
+ card.subtitle && /* @__PURE__ */ jsx("p", { className: "article-verified-card__subtitle", children: card.subtitle }),
688
+ card.summary && /* @__PURE__ */ jsx("p", { className: "article-verified-card__summary", children: card.summary }),
689
+ card.facts.length > 0 && /* @__PURE__ */ jsx("dl", { className: "article-verified-card__fact-grid", children: card.facts.map((fact, i) => /* @__PURE__ */ jsxs("div", { className: "article-verified-card__fact-row", children: [
690
+ /* @__PURE__ */ jsx("dt", { className: "article-verified-card__fact-label", children: fact.label }),
691
+ /* @__PURE__ */ jsx("dd", { className: "article-verified-card__fact-value", children: fact.href ? /* @__PURE__ */ jsx(
692
+ "a",
693
+ {
694
+ className: "article-verified-card__fact-link",
695
+ href: fact.href,
696
+ rel: "noopener noreferrer",
697
+ target: fact.href.startsWith("http") ? "_blank" : void 0,
698
+ children: fact.value
699
+ }
700
+ ) : fact.value })
701
+ ] }, i)) }),
702
+ card.actions.length > 0 && /* @__PURE__ */ jsx("div", { className: "article-verified-card__actions", children: card.actions.map((act, i) => /* @__PURE__ */ jsxs(
703
+ "a",
704
+ {
705
+ className: `article-verified-card__action ${act.primary ? "article-verified-card__action--primary" : "article-verified-card__action--secondary"}`,
706
+ href: act.url,
707
+ target: "_blank",
708
+ rel: "noopener noreferrer",
709
+ children: [
710
+ /* @__PURE__ */ jsx("span", { children: act.label }),
711
+ /* @__PURE__ */ jsx("span", { "aria-hidden": "true", className: "article-verified-card__action-icon", children: "\u2197" })
712
+ ]
713
+ },
714
+ i
715
+ )) }),
716
+ /* @__PURE__ */ jsxs("footer", { className: "article-verified-card__footer", children: [
717
+ /* @__PURE__ */ jsxs("div", { className: "article-verified-card__seal", children: [
718
+ /* @__PURE__ */ jsx("span", { className: "article-verified-card__seal-check", "aria-hidden": "true", children: "\u2713" }),
719
+ /* @__PURE__ */ jsx("span", { children: card.verificationNote })
720
+ ] }),
721
+ /* @__PURE__ */ jsx("span", { className: "article-verified-card__date", children: card.verifiedAt })
722
+ ] })
723
+ ]
724
+ }
725
+ );
726
+ }
727
+ function VerifiedCardSection({
728
+ cards,
729
+ className
730
+ }) {
731
+ if (!cards || cards.length === 0) return null;
732
+ return /* @__PURE__ */ jsx(
733
+ "section",
734
+ {
735
+ className: `article-verified-card-section ${className || ""}`.trim(),
736
+ "aria-label": "Verified Community Information",
737
+ children: cards.map((card) => /* @__PURE__ */ jsx(VerifiedCardComponent, { card }, card.id))
738
+ }
739
+ );
740
+ }
741
+
742
+ export { CURATED_COMMUNITY_CARDS, VerifiedCardComponent, VerifiedCardSection, getArticleCards, isSafeActionUrl };