Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ Notable user-visible changes to Food Help are recorded here. Community publicati

### Changed

- Directory cards are easier to scan: schedule status is a coloured badge, today’s hours show one time range per line with shorter twelve-hour times (for example “9–11 a.m.”), field labels are larger, the current view’s tag and a repeated operator name are no longer shown, and the directory introduction is shorter. Resource pages show Call and Directions before the detailed schedule and sources, phone numbers in North American format, and addresses without the country code. The project homepage links straight to the directory from its introduction when one community is available.
- Configured community directories can link discreetly back to the Food Help project without changing their resource URLs or provider data.
- Category controls now show only primary types represented in the active browsing view, and omit “All types” when only one type is available.
- Published resources require reviewed, evidence-backed cost information. Free services appear in Emergency food, low-cost and subsidized services appear in Affordable food, and mixed-cost services appear in both without duplicate records.
Expand Down
2 changes: 1 addition & 1 deletion deployments/kingston/site.json
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@
"interval_days": 30
},
"presentation": {
"introduction": "Find Emergency food or Affordable food in Kingston. Use meal, grocery and market filters to see what is offered, and check details before travelling.",
"introduction": "Free and low-cost meals and groceries in Kingston, and when to go.",
"category_groups": [
{ "id": "meals", "label": "Meals", "categories": ["prepared_meals"] },
{ "id": "groceries", "label": "Groceries", "categories": ["groceries", "food_banks_pantries"] },
Expand Down
4 changes: 3 additions & 1 deletion project-site/styles.css
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@ h1,h2,h3{color:var(--navy);line-height:1.15}
.eyebrow{margin:0 0 .8rem;color:var(--brick);font-size:.875rem;font-weight:800;letter-spacing:.12em;text-transform:uppercase}
h1{max-width:14ch;margin:0;font-size:clamp(2.7rem,6.3vw,5.6rem);font-weight:650;letter-spacing:-.04em}
.hero-lead{max-width:40rem;margin:1.4rem 0 0;color:var(--muted);font-size:clamp(1.08rem,1.8vw,1.3rem);line-height:1.55}
.hero-actions{margin:1.6rem 0 0}
.hero-actions .button{min-height:52px;padding-inline:1.4rem;font-size:1.05rem}
.hero-note{border-left:4px solid var(--brick);padding:.25rem 0 .25rem 1.25rem;color:var(--muted)}
.hero-note strong{display:block;color:var(--navy);font-size:1.15rem}
.hero-note p{margin:.35rem 0 0}
Expand Down Expand Up @@ -78,7 +80,7 @@ h1{max-width:14ch;margin:0;font-size:clamp(2.7rem,6.3vw,5.6rem);font-weight:650;
.header-inner{align-items:flex-start;flex-direction:column;gap:.25rem;padding-block:.75rem}
.site-nav{justify-content:flex-start;gap:.1rem 1rem}
.hero,.section-heading,.split,.contact-panel,.footer-inner{grid-template-columns:1fr}
.hero{gap:2rem;padding-top:3.5rem}
.hero{gap:2rem;padding-top:2rem}
.community-card{grid-template-columns:1fr}
.principles{grid-template-columns:1fr}
.footer-links{justify-content:flex-start}
Expand Down
2 changes: 1 addition & 1 deletion scripts/build-project.ts
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ function home(site: ProjectSite, communities: CommunityList, production: boolean
{ '@type': 'ItemList', name: 'Food Help community directories', itemListElement: communities.communities.map((community, index) => ({ '@type': 'ListItem', position: index + 1, name: `${community.name} Food Help`, url: `${community.canonical_url}/` })) }
] };
return `<!doctype html><html lang="${e(site.language)}" dir="${e(site.text_direction)}"><head>${head(site, '/', site.site_name, site.description, index, css, logo, jsonld)}</head><body>${header(site, logo)}<main id="main" tabindex="-1">
<section class="page-width hero" aria-labelledby="page-title"><div><p class="eyebrow">Emergency and affordable food directories</p><h1 id="page-title">${e(site.headline)}</h1><p class="hero-lead">${e(site.introduction)}</p></div><aside class="hero-note" aria-label="Project scope"><strong>Local information, reviewed locally</strong><p>${e(site.scope)}</p></aside></section>
<section class="page-width hero" aria-labelledby="page-title"><div><p class="eyebrow">Emergency and affordable food directories</p><h1 id="page-title">${e(site.headline)}</h1><p class="hero-lead">${e(site.introduction)}</p><p class="hero-actions">${communities.communities.length === 1 ? `<a class="button button-primary" href="${e(communities.communities[0]!.canonical_url)}/">Find food in ${e(communities.communities[0]!.name)}</a>` : '<a class="button button-primary" href="#communities">Choose a community</a>'}</p></div><aside class="hero-note" aria-label="Project scope"><strong>Local information, reviewed locally</strong><p>${e(site.scope)}</p></aside></section>
<section class="page-width section" id="communities" aria-labelledby="communities-heading"><div class="section-heading"><h2 id="communities-heading">Choose a community</h2><p>Community directories are the place to find food programs. This project homepage does not duplicate their listings.</p></div><div class="community-list">${communityCards}</div></section>
<section class="page-width section" id="about" aria-labelledby="about-heading"><div class="section-heading"><h2 id="about-heading">Information people can check</h2><p>${e(site.maintenance)}</p></div><ol class="principles"><li><strong>Public sources</strong><p>Published program pages and trusted public directories provide an evidence trail.</p></li><li><strong>Provider input</strong><p>Provider details can clarify what is offered and what people should know before travelling.</p></li><li><strong>Corrections</strong><p>Community feedback is reviewed before it changes a public listing.</p></li></ol></section>
<section class="page-width section split"><article class="info-card"><h2>Built in Kingston</h2><p>${e(site.operator.statement)}</p><a class="text-link" href="${e(site.operator.url)}">About ${e(site.operator.name)}</a></article><article class="info-card" id="start"><h2>Built for other communities</h2><p>The software and setup guidance are public. Community operators keep control of their own reviewed information and publication.</p><div class="link-list"><a class="text-link" href="${e(site.repository_url)}">View the repository</a><a class="text-link" href="${e(site.setup_url)}">Setup guide</a><a class="text-link" href="${e(site.contribution_url)}">Contribution guide</a><a class="text-link" href="${e(site.community_guide_url)}">Add a community</a></div></article></section>
Expand Down
12 changes: 6 additions & 6 deletions src/copy/en.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,14 @@ export const copy = {
directory: 'What would help?', browseBy: 'Choose the kind of food access you need', all: 'All types', search: 'Search the directory', searchPlaceholder: 'Name, street or neighbourhood', category: 'Type of food help',
browseViews: { emergency: 'Emergency food', affordable: 'Affordable food' },
browseDescriptions: {
emergency: 'Free food support, including services with both free and lower-cost options. You do not need to prove a crisis to browse or ask for help; each listing explains any eligibility or access requirements.',
affordable: 'Lower-cost or subsidized food sold through community programs, including services with both paid and free options. These are food purchases unless a listing says otherwise.',
emergency: 'Free food, including places with some low-cost options. You do not need to prove a crisis. Each listing says who can use it.',
affordable: 'Lower-cost food sold through community programs, including places with some free options. Each listing says what it costs.',
},
scheduledFilter: 'Open now or later today', location: 'Use my location', clearLocation: 'Forget my location',
locationOptional: 'Location is optional. Browse all listings without it.',
scheduleDisclaimer: 'Times are based on published schedules,', notLive: 'not live availability.', callBefore: 'Call before travelling when you can.',
locationOptional: 'Location is optional.',
scheduleDisclaimer: 'Times come from published schedules,', notLive: 'not live availability.', callBefore: 'Call before travelling when you can.',
locationNotice: 'Location stays in memory on this device. Distance is straight-line, not a travel route.', locationFailed: 'Location was unavailable. You can still browse every resource.',
nearest: 'Approximate distance', resourceCount: (n: number, view: 'emergency' | 'affordable', review = false) => review ? `${n} ${n === 1 ? 'option' : 'options'} shown for review in ${view === 'emergency' ? 'Emergency food' : 'Affordable food'}.` : `${n} reviewed ${n === 1 ? 'option' : 'options'} shown in ${view === 'emergency' ? 'Emergency food' : 'Affordable food'}.`, noResults: (view: 'emergency' | 'affordable', includeAll = true) => `No ${view === 'emergency' ? 'Emergency food' : 'Affordable food'} options match. Clear the search${includeAll ? ', choose All types, or' : ' or'} turn off the schedule filter.`, noListings: (view: 'emergency' | 'affordable') => view === 'emergency' ? 'No Emergency food listings have completed review for publication yet. Affordable food listings may still be available.' : 'No Affordable food listings have completed review for publication yet. Emergency food listings are still available.',
nearest: 'Approximate distance', resourceCount: (n: number, view: 'emergency' | 'affordable', review = false) => review ? `${n} ${n === 1 ? 'option' : 'options'} shown for review in ${view === 'emergency' ? 'Emergency food' : 'Affordable food'}.` : `${n} ${n === 1 ? 'place' : 'places'} in ${view === 'emergency' ? 'Emergency food' : 'Affordable food'}.`, noResults: (view: 'emergency' | 'affordable', includeAll = true) => `No ${view === 'emergency' ? 'Emergency food' : 'Affordable food'} options match. Clear the search${includeAll ? ', choose All types, or' : ' or'} turn off the schedule filter.`, noListings: (view: 'emergency' | 'affordable') => view === 'emergency' ? 'No Emergency food listings have completed review for publication yet. Affordable food listings may still be available.' : 'No Affordable food listings have completed review for publication yet. Emergency food listings are still available.',
provider: 'Operated by', address: 'Where', today: 'Today', quickAccess: 'Access', area: 'Service area', phone: 'Phone', eligibility: 'Who can use this', limitations: 'Limitations', before: 'Before you go',
access: 'Access requirements', details: 'Before you go & weekly hours', schedule: 'Published schedule', timezone: 'Local timezone', cost: 'Cost', languages: 'Service languages',
foodPurpose: 'Food support provided', staticHours: 'See published hours below; confirm before travelling.', accessUnknown: 'Check access arrangements before travelling.', dropIn: 'Drop-in access', appointmentNeeded: 'Appointment required', registrationNeeded: 'Registration required',
Expand All @@ -27,7 +27,7 @@ export const copy = {
weekdays: ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'], closed: 'No service by published schedule', nextDay: '(next day)',
scheduled: { scheduled_now: 'Open by published schedule', not_scheduled_now: 'Outside published hours or currently unavailable', unknown: 'Check hours with the provider' },
scheduleLabels: { now: 'Open by schedule', later: 'Later today', ended: 'No more hours today', none: 'No published hours today', unknown: 'Check hours before going', unavailable: 'Service temporarily unavailable' },
appointmentHours: 'Appointment hours', appointmentLater: 'Appointments later today', bookingRequired: 'Booking required', until: 'Until', publishedOpening: 'Published opening', seeWeekly: 'See the weekly hours below.',
appointmentHours: 'Appointment hours', appointmentLater: 'Appointments later today', bookingRequired: 'Booking required', until: 'Until', publishedOpening: 'Scheduled to open', seeWeekly: 'See the weekly hours below.',
scheduleKinds: { weekly: 'Weekly schedule', dated: 'Dated schedule', by_arrangement: 'Contact provider to arrange', unknown: 'Hours not confirmed' },
validity: 'Schedule date range', exceptions: 'Date-specific changes', unconfirmed: 'Unconfirmed', reviewed: 'Last reviewed', updated: 'Information updated', overdue: 'Review overdue — confirm details before travelling.',
source: 'Official details', scheduleSource: 'Schedule and updates', sources: 'Evidence and provenance', checked: 'Source checked', sourcesChecked: 'Sources checked', supports: 'Reviewed information', call: 'Call', directions: 'Directions', resourcePage: 'Resource page',
Expand Down
Loading
Loading