diff --git a/pages/partnership/community/index.md b/pages/partnership/community/index.md index d09cd4bf..0176d9a7 100644 --- a/pages/partnership/community/index.md +++ b/pages/partnership/community/index.md @@ -1,90 +1,168 @@ --- title: Community Partners description: - "Community-led initiatives, resources, courses, mentoring, and events shared - by OSL community members." -date: 2026-06-25 + "Discover community-led events, courses, resources, mentoring spaces, and + practical opportunities shared by Open Science Labs members and partners." +date: 2026-06-29 authors: ["OSL Team"] template: community.html -section_label: Partnership +section_label: Community Partner Hub page_theme: partnership -hero_words: ["Connect", "Amplify", "Collaborate"] +hero_words: ["Discover", "Participate", "Contribute"] community: featured: [] - initiatives: - # Use the format below to add a Community Partner initiative. - # - name: "Community-led learning sessions" - # partner: "Community organizers and instructors" - # category: "Events" - # status: "Open for registration" - # format: "Talks, workshops, reading groups, and demos" - # audience: "Learners, researchers, developers, and open-source newcomers" - # thumbnail: /images/logos/logo.png - # url: "https://example.org/community-initiative" - # action: "Learn more" - # description: | - # A short description of the initiative, what participants can expect, - # and why it is useful for the Open Science Labs community. + events: + upcoming: [] + recurring: + - name: "Quantum Computing in a Nutshell" + partner: "Sri Kaleeswarar S" + category: "Events" + status: "Open for participation" + format: "Weekly online lectures and discussions" + recurrence: "Every Saturday" + audience: + "Students, researchers, developers, educators, and science enthusiasts + worldwide" + thumbnail: /images/community/header.png + url: "https://meet.jit.si/osl-quantum-lectures" + details_url: "https://srikaleeswarar.home.blog/osl-quantum-lectures/" + recording_url: "https://www.youtube.com/@TamilLinuxCommunity" + action: "Join the lectures" + description: | + A free, community-driven international lecture series that introduces + quantum computing from quantum theory through a physics-informed path. + Sessions cover quantum mechanics, qubits, gates, algorithms, error + correction, hardware platforms, and open-source quantum tools. No + registration is required. + past: [] + courses: [] + resources: [] + mentoring: [] + submission: + channel: community-initiatives + discord_url: /discord/ + + # Data model examples for maintainers: + # + # featured: + # - name: "Community-led learning sprint" + # partner: "Community organizers" + # category: "Course" + # status: "Open for registration" + # format: "Online cohort" + # duration: "4 weeks" + # audience: "Researchers and open-source contributors" + # topics: ["open science", "reproducibility"] + # thumbnail: /images/logos/logo.png + # url: "https://example.org" + # action: "Register" + # description: "Short description of the opportunity and why it matters." + # + # events: + # upcoming: + # - name: "Open Science Community Meetup" + # partner: "Community organizers" + # category: "Workshop" + # status: "Open" + # format: "Hybrid" + # date_start: "2026-08-12" + # date_label: "12 August 2026" + # time: "15:00" + # timezone: "UTC" + # audience: "Learners, researchers, and developers" + # location: + # name: "Community Lab" + # city: "Geneva" + # country: "Switzerland" + # map_url: "https://maps.example.org" + # url: "https://example.org/register" + # details_url: "https://example.org/details" + # action: "Register" + # description: "Short event description." + # recurring: + # - name: "Open-source contribution office hours" + # partner: "OSL community mentors" + # recurrence: "Every first Friday" + # time: "16:00" + # timezone: "UTC" + # format: "Online" + # url: "https://example.org/join" + # action: "Join session" + # description: "A recurring space for questions, pairing, and support." + # + # courses: + # - name: "Reproducible research foundations" + # partner: "Community instructors" + # status: "Self-paced" + # level: "Beginner" + # mode: "Self-paced" + # duration: "3 modules" + # workload: "2-3 hours" + # language: "English" + # prerequisites: "No prior experience required" + # syllabus_url: "https://example.org/syllabus" + # url: "https://example.org/course" + # action: "Start course" + # description: "A practical learning path for reproducible projects." + # + # resources: + # - name: "Reproducible project starter kit" + # partner: "OSL community" + # type: "Guide" + # topics: ["templates", "reproducibility"] + # language: "English" + # license: "CC BY 4.0" + # updated: "2026-06-28" + # url: "https://example.org/resource" + # action: "Open resource" + # description: "Reusable materials for starting open science projects." + # + # mentoring: + # - name: "Project clinic" + # partner: "Community mentors" + # status: "By appointment" + # format: "Online" + # recurrence: "Monthly" + # timezone: "UTC" + # audience: "Project maintainers and new contributors" + # capacity: "Small groups" + # booking_url: "https://example.org/book" + # description: "Feedback and guidance for open-source project work." --- # Community Partners -Community Partners are people from the Open Science Labs community who are -creating initiatives that can benefit others. These initiatives can include -events, educational materials, courses, mentoring, project clinics, office -hours, reading groups, and other community-led opportunities. +Community Partners are people and groups from the Open Science Labs community +who organize opportunities that help others learn, collaborate, build, mentor, +and contribute. This hub is designed to make those opportunities easy to scan +and easy to join. -This page is where we publicize those initiatives so community members can -discover useful opportunities and so organizers can connect with people who may -want to learn, contribute, mentor, or collaborate. +The page supports several kinds of community-led opportunities: + +- **Events & gatherings** for workshops, talks, meetups, study sessions, reading + groups, and demos. +- **Courses & learning paths** for cohort-based courses, self-paced material, + bootcamps, and structured curricula. +- **Resources & toolkits** for guides, datasets, templates, notebooks, + repositories, videos, and reusable educational material. +- **Mentoring, office hours & project clinics** for recurring support spaces, + contribution help, onboarding, and project feedback. ## Mission and values -Open Science Labs welcomes Community Partner initiatives that are aligned with -our mission of promoting open science and open-source technology through -community collaboration, education, and project development. +Open Science Labs welcomes Community Partner initiatives that align with our +mission of promoting open science and open-source technology through community +collaboration, education, and project development. We especially welcome initiatives that support open collaboration, continuous learning, inclusivity, accessibility, ethical responsibility, community empowerment, sustainability, and constructive communication. You can learn more about these principles in the [Open Science Labs Formula](/about/formula/). -## What we look for - -- Initiatives that are useful to the OSL community. -- Activities aligned with open science, open-source software, reproducible - research, education, mentoring, or community building. -- Clear information about the audience, format, expected commitment, and how - people can participate. -- A welcoming approach that follows the OSL Code of Conduct and community - guidelines. - -## Independent initiatives - -Community Partner initiatives are independently organized and managed by their -own community managers, organizers, or maintainers. Open Science Labs helps -promote initiatives from community members that appear aligned with our mission -and values, but OSL is not responsible for their content, activities, -registration processes, schedules, materials, decisions, or outcomes. - -Questions about a specific initiative should be directed to the initiative's -organizers. If you notice an issue with how an initiative is represented on this -page, or if you believe an initiative is not aligned with OSL values, please -contact us at [`team@opensciencelabs.org`](mailto:team@opensciencelabs.org). - -## How to suggest an initiative - -If you have an initiative to share, join our [Discord community](/discord/) and -post it in the `community-initiatives` channel with a short description, -organizer name, target audience, relevant links, and any important dates or -participation details. - -## Code of Conduct - -All Community Partner initiatives shared through Open Science Labs should follow -our [Code of Conduct](/about/coc/). We expect organizers and participants to -help keep these spaces welcoming, respectful, inclusive, and safe for everyone. +## Participation expectations -If you experience or notice any issue related to a Community Partner initiative, -please contact us at -[`team@opensciencelabs.org`](mailto:team@opensciencelabs.org). +Every opportunity listed here should provide clear information about the target +audience, format, expected commitment, schedule, participation link, organizer, +and any accessibility or location details. Community Partner initiatives should +also follow the [OSL Code of Conduct](/about/coc/) and help keep spaces +welcoming, respectful, inclusive, and safe for everyone. diff --git a/theme/community.html b/theme/community.html index a77c6d0d..2a9afdc4 100644 --- a/theme/community.html +++ b/theme/community.html @@ -1,16 +1,260 @@ {% extends "base.html" %} +{% macro meta_entry(label, value) -%} + {% if value %} +
+
{{ label }}
+
{{ value }}
+
+ {% endif %} +{%- endmacro %} + +{% macro tag_list(tags) -%} + {% if tags %} + + {% endif %} +{%- endmacro %} + +{% macro card_media(item, fallback) -%} +
+ {% if item.thumbnail %} + {% if item.url %} + + {{ item.name }} + + {% else %} + {{ item.name }} + {% endif %} + {% else %} + + {% endif %} +
+{%- endmacro %} + +{% macro primary_cta(item, subtle=False) -%} + {% if item.url %} + + {{ item.action or "Learn more" }} + + {% endif %} +{%- endmacro %} + +{% macro location_meta(location) -%} + {% if location %} +
+
Location
+
+ {% if location.name %}{{ location.name }}{% endif %}{% if location.city %}{% if location.name %}, {% endif %}{{ location.city }}{% endif %}{% if location.country %}{% if location.name or location.city %}, {% endif %}{{ location.country }}{% endif %} + {% if location.map_url %} + Open map + {% endif %} +
+
+ {% endif %} +{%- endmacro %} + +{% macro render_feature(item) -%} +
+ {{ card_media(item, item.category or item.type or "Community") }} +
+

+ {{ item.category or item.type or "Community opportunity" }}{% if item.status %}·{{ item.status }}{% endif %} +

+

{{ item.name }}

+ {% if item.partner %} +

By {{ item.partner }}

+ {% endif %} + {% if item.description %} +

{{ item.description }}

+ {% endif %} +
+ {{ meta_entry("Format", item.format) }} + {{ meta_entry("Schedule", item.schedule or item.recurrence) }} + {{ meta_entry("Date", item.date_label or item.date_start) }} + {{ meta_entry("Duration", item.duration) }} + {{ meta_entry("Level", item.level) }} + {{ meta_entry("Audience", item.audience) }} +
+ {{ tag_list(item.topics) }} +
+ {{ primary_cta(item) }} +
+
+
+{%- endmacro %} + +{% macro render_event(event, state="upcoming") -%} +
+
+ {% if event.recurrence %} + Schedule + {{ event.recurrence }} + {% else %} + {% if state == 'past' %}Past event{% else %}Event date{% endif %} + {{ event.date_label or event.date_start or "Date TBA" }} + {% if event.date_end and event.date_end != event.date_start %} + until {{ event.date_end }} + {% endif %} + {% endif %} +
+
+

+ {{ event.category or "Event" }}{% if event.status %}·{{ event.status }}{% endif %} +

+

{{ event.name }}

+ {% if event.partner %} +

By {{ event.partner }}

+ {% endif %} + {% if event.description %} +

{{ event.description }}

+ {% endif %} +
+ {{ meta_entry("Format", event.format) }} + {{ meta_entry("Time", event.time) }} + {{ meta_entry("Timezone", event.timezone) }} + {{ meta_entry("Audience", event.audience) }} + {{ location_meta(event.location) }} +
+ {{ tag_list(event.topics) }} +
+ {{ primary_cta(event, state == 'past') }} + {% set details_url = event.details_url or event.more_details_url %} + {% if details_url %} + More details + {% endif %} + {% if event.recording_url %} + Watch recording + {% endif %} + {% if event.notes_url %} + Read notes + {% endif %} +
+
+
+{%- endmacro %} + +{% macro render_course(course) -%} +
+ {{ card_media(course, "Course") }} +
+

+ {{ course.category or "Course" }}{% if course.status %}·{{ course.status }}{% endif %} +

+

{{ course.name }}

+ {% if course.partner %} +

By {{ course.partner }}

+ {% endif %} + {% if course.description %} +

{{ course.description }}

+ {% endif %} +
+ {{ meta_entry("Level", course.level) }} + {{ meta_entry("Mode", course.mode or course.format) }} + {{ meta_entry("Duration", course.duration) }} + {{ meta_entry("Workload", course.workload) }} + {{ meta_entry("Language", course.language) }} + {{ meta_entry("Prerequisites", course.prerequisites) }} +
+ {{ tag_list(course.topics) }} +
+ {{ primary_cta(course) }} + {% if course.syllabus_url %} + View syllabus + {% endif %} +
+
+
+{%- endmacro %} + +{% macro render_resource(resource) -%} +
+
+

+ {{ resource.type or "Resource" }}{% if resource.status %}·{{ resource.status }}{% endif %} +

+

{{ resource.name }}

+
+ {% if resource.partner %} +

By {{ resource.partner }}

+ {% endif %} + {% if resource.description %} +

{{ resource.description }}

+ {% endif %} +
+ {{ meta_entry("Language", resource.language) }} + {{ meta_entry("License", resource.license) }} + {{ meta_entry("Updated", resource.updated) }} + {{ meta_entry("Maintainer", resource.maintainer) }} +
+ {{ tag_list(resource.topics) }} +
+ {{ primary_cta(resource, True) }} + {% if resource.repository_url %} + View repository + {% endif %} +
+
+{%- endmacro %} + +{% macro render_mentoring(item) -%} +
+ {{ card_media(item, "Mentoring") }} +
+

+ {{ item.category or "Mentoring" }}{% if item.status %}·{{ item.status }}{% endif %} +

+

{{ item.name }}

+ {% if item.partner %} +

By {{ item.partner }}

+ {% endif %} + {% if item.description %} +

{{ item.description }}

+ {% endif %} +
+ {{ meta_entry("Format", item.format) }} + {{ meta_entry("Schedule", item.schedule or item.recurrence) }} + {{ meta_entry("Timezone", item.timezone) }} + {{ meta_entry("Audience", item.audience) }} + {{ meta_entry("Capacity", item.capacity) }} +
+ {{ tag_list(item.topics) }} +
+ {{ primary_cta(item) }} + {% if item.booking_url %} + Book a slot + {% endif %} +
+
+
+{%- endmacro %} + {% block content %} {% set community = page.meta.get("community", {}) %} -{% set featured = community.get("featured", []) %} -{% set initiatives = community.get("initiatives", []) %} +{% set featured = community.get("featured", []) or [] %} +{% set events = community.get("events", {}) or {} %} +{% set upcoming_events = events.get("upcoming", []) or [] %} +{% set recurring_events = events.get("recurring", []) or [] %} +{% set past_events = events.get("past", events.get("past_events", [])) or [] %} +{% set courses = community.get("courses", []) or [] %} +{% set resources = community.get("resources", []) or [] %} +{% set mentoring = community.get("mentoring", []) or [] %} +{% set submission = community.get("submission", {}) or {} %} +{% set event_count = upcoming_events|length + recurring_events|length + past_events|length %} {% set page_title = page.meta.get("title", page.title) %} -{% set page_description = page.meta.get("description", "Community-led initiatives, resources, courses, mentoring, and events shared by OSL community members.") %} +{% set page_description = page.meta.get("description", "Community-led events, resources, courses, mentoring, and other opportunities shared by OSL community members.") %} {% set section_label = page.meta.get("section_label", "Partnership") %} {% set section_slug = page.url.split("/")[0] %} {% if not section_slug %}{% set section_slug = "partnership" %}{% endif %} {% set page_theme = page.meta.get("page_theme", "partnership") %} -{% set hero_words = page.meta.get("hero_words", ["Connect", "Amplify", "Collaborate"]) %} +{% set hero_words = page.meta.get("hero_words", ["Discover", "Participate", "Contribute"]) %} +{% set submission_channel = submission.get("channel", "community-initiatives") %} +{% set submission_url = submission.get("discord_url", "/discord/") %}
@@ -33,125 +277,175 @@

{{ page_title }}

-
+
{{ page.content }}
-
+ + + {% if featured %} + + {% endif %} + +
+
+

Meet, practice, and exchange

+

Events & gatherings

+
+ + {% if upcoming_events or recurring_events or past_events %} + {% if upcoming_events or recurring_events %} +
+

Current events

+
+ {% for event in upcoming_events %} + {{ render_event(event, "upcoming") }} + {% endfor %} + {% for event in recurring_events %} + {{ render_event(event, "recurring") }} + {% endfor %}
-
-

- {{ initiative.category }}{% if initiative.status %} · {{ initiative.status }}{% endif %} -

-

{{ initiative.name }}

- {% if initiative.partner %} -

By {{ initiative.partner }}

- {% endif %} -

{{ initiative.description }}

-
- {% if initiative.format %} -
-
Format
-
{{ initiative.format }}
-
- {% endif %} - {% if initiative.audience %} -
-
Audience
-
{{ initiative.audience }}
-
- {% endif %} -
- {% if initiative.url %} - - {{ initiative.action or "Learn more" }} - - {% endif %} +
+ {% endif %} + + {% if past_events %} +
+

Past events

+
+ {% for event in past_events %} + {{ render_event(event, "past") }} + {% endfor %}
-
+ + {% endif %} + {% else %} +
+

No community events listed yet

+

Upcoming, recurring, hybrid, and in-person events will appear here when community organizers share them.

+
+ {% endif %} +
+ +
+
+

Learn with structure

+

Courses & learning paths

+
+ + {% if courses %} +
+ {% for course in courses %} + {{ render_course(course) }} {% endfor %}
{% else %} -
-

TBA

+
+

No courses listed yet

+

Cohort-based courses, self-paced modules, bootcamps, and reading paths from community partners will appear here.

{% endif %}
-
+
-

Community initiatives

-

Community Partner Initiatives

-
- - {% if initiatives %} -
- {% for initiative in initiatives %} -
-
- {% if initiative.url %} - - {{ initiative.name }} - - {% else %} - {{ initiative.name }} - {% endif %} -
-
-

- {{ initiative.category }}{% if initiative.status %} · {{ initiative.status }}{% endif %} -

-

{{ initiative.name }}

- {% if initiative.partner %} -

By {{ initiative.partner }}

- {% endif %} -

{{ initiative.description }}

-
- {% if initiative.format %} -
-
Format
-
{{ initiative.format }}
-
- {% endif %} - {% if initiative.audience %} -
-
Audience
-
{{ initiative.audience }}
-
- {% endif %} -
- {% if initiative.url %} - - {{ initiative.action or "Learn more" }} - - {% endif %} -
-
+

Use and reuse

+

Resources & toolkits

+
+ + {% if resources %} +
+ {% for resource in resources %} + {{ render_resource(resource) }} {% endfor %}
{% else %} -
-

TBA

+
+

No resources listed yet

+

Guides, datasets, templates, notebooks, videos, curricula, and repositories will be listed without location or map fields.

{% endif %}
+ +
+
+

Get support

+

Mentoring, office hours & project clinics

+
+ + {% if mentoring %} +
+ {% for item in mentoring %} + {{ render_mentoring(item) }} + {% endfor %} +
+ {% else %} +
+

No mentoring spaces listed yet

+

Recurring office hours, project clinics, contribution support, and mentoring opportunities will appear here.

+
+ {% endif %} +
+ +
+
+

Share responsibly

+

Suggest a community opportunity

+
+ +
+
+

Have something useful for the community?

+

Post it in the {{ submission_channel }} channel with the organizer name, audience, format, participation link, dates or recurrence, and any accessibility notes.

+ Join Discord +
+
+

What we look for

+
    +
  • Clear value for open science, open source, education, mentoring, or community building.
  • +
  • Transparent ownership, schedule, expected commitment, and participation details.
  • +
  • A welcoming approach aligned with the OSL Code of Conduct.
  • +
+
+
+

Independent initiatives & Code of Conduct

+

Community Partner opportunities are independently organized by their maintainers. OSL helps amplify aligned initiatives, but organizers remain responsible for content, activities, registration, schedules, materials, decisions, and outcomes.

+

All opportunities shared through OSL should follow our Code of Conduct. Organizers and participants are expected to keep these spaces welcoming, respectful, inclusive, and safe.

+

Questions about a listed opportunity should go to its organizers. For questions about this page, initiative representation, or alignment with OSL values, use the {{ submission_channel }} channel on Discord.

+
+
+
{% endblock content %} diff --git a/theme/css/base.css b/theme/css/base.css index 100fcf48..9d33f691 100644 --- a/theme/css/base.css +++ b/theme/css/base.css @@ -27,6 +27,20 @@ * { box-sizing: border-box; -webkit-appearance: none; } html, body { min-height: 100%; } html { scroll-padding-top: 4.5rem; } + +/* Prevent tiny horizontal overflow from full-bleed sections that use viewport + units; 100vw includes the scrollbar in some browsers. */ +html, +body { + overflow-x: clip; +} + +@supports not (overflow: clip){ + html, + body { + overflow-x: hidden; + } +} body{ background: var(--bg); color: var(--fg); diff --git a/theme/css/content.css b/theme/css/content.css index 75427556..f67ef339 100644 --- a/theme/css/content.css +++ b/theme/css/content.css @@ -1238,3 +1238,460 @@ html[data-mode="dim"] .osl-page-hero{ color: var(--osl-accent); } } + +/* ───────── Community Partner Hub ───────── */ +.community-intro{ + padding-bottom: clamp(1.15rem, 3vw, 2.2rem); +} + +.community-switchboard{ + display: grid; + grid-template-columns: repeat(5, minmax(0, 1fr)); + margin: clamp(.5rem, 2vw, 1rem) 0 clamp(1.5rem, 4vw, 2.6rem); + border: 1px solid var(--border-strong); + border-left: .36rem solid var(--osl-accent); + background: var(--surface-solid); +} + +.community-switchboard a{ + display: flex; + align-items: center; + justify-content: space-between; + gap: .8rem; + min-height: 4.75rem; + padding: 1rem; + border-left: 1px solid var(--border); + color: var(--heading); + text-decoration: none; + transition: background-color .18s ease, color .18s ease, box-shadow .18s ease; +} + +.community-switchboard a:first-child{ + border-left: 0; +} + +.community-switchboard a:hover, +.community-switchboard a:focus-visible{ + background: color-mix(in oklab, var(--osl-accent) 9%, transparent); + color: var(--osl-accent); + box-shadow: inset 0 -3px 0 var(--osl-accent); + outline: none; +} + +.community-switchboard__label{ + font-size: clamp(.9rem, 1vw, 1rem); + font-weight: 850; + line-height: 1.2; +} + +.community-switchboard__count{ + display: inline-grid; + place-items: center; + min-width: 2.2rem; + min-height: 2.2rem; + padding: .25rem .55rem; + border: 1px solid var(--border); + background: var(--surface-muted); + color: var(--osl-accent); + font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; + font-size: .78rem; + font-weight: 850; +} + +.community-switchboard__submit{ + background: linear-gradient(135deg, color-mix(in oklab, var(--osl-accent) 10%, transparent), transparent); +} + +.community-section, +.community-guidance{ + scroll-margin-top: 6rem; + margin-top: clamp(1.8rem, 5vw, 3.4rem); +} + +.community-subsection{ + margin-top: clamp(1rem, 3vw, 1.6rem); +} + +.community-subsection > h3{ + margin: 0 0 .85rem; + padding-left: .8rem; + border-left: .25rem solid var(--osl-accent); + color: var(--heading); + font-size: clamp(1.1rem, 2vw, 1.45rem); +} + +.community-feature-grid, +.community-card-grid, +.community-resource-grid{ + display: grid; + gap: 1rem; +} + +.community-feature-grid{ + grid-template-columns: repeat(auto-fit, minmax(min(100%, 430px), 1fr)); +} + +.community-card-grid{ + grid-template-columns: repeat(auto-fit, minmax(min(100%, 320px), 1fr)); +} + +.community-resource-grid{ + grid-template-columns: repeat(auto-fit, minmax(min(100%, 360px), 1fr)); +} + +.community-event-list{ + display: grid; + gap: 1rem; +} + +.community-card, +.community-resource-card, +.community-guidance-card{ + position: relative; + overflow: hidden; + border: 1px solid var(--border); + border-left: .36rem solid var(--osl-accent); + background: var(--surface-solid); + box-shadow: none; + transition: transform .18s ease, border-color .18s ease, background-color .18s ease; +} + +.community-card:hover, +.community-resource-card:hover, +.community-guidance-card:hover{ + transform: translateY(-2px); + border-color: color-mix(in oklab, var(--osl-accent) 38%, var(--border)); +} + +.community-card{ + display: grid; + grid-template-rows: auto 1fr; + min-height: 100%; +} + +.community-card--feature{ + grid-template-columns: minmax(220px, .8fr) minmax(0, 1.2fr); + grid-template-rows: 1fr; +} + +.community-card--muted{ + border-left-color: color-mix(in oklab, var(--muted) 42%, var(--osl-accent)); +} + +.community-card__media{ + min-height: 190px; + background: + linear-gradient(135deg, color-mix(in oklab, var(--osl-accent) 13%, transparent), transparent), + var(--surface-muted); +} + +.community-card__media a, +.community-card__placeholder{ + display: grid; + min-height: 100%; +} + +.community-card__media img{ + width: 100%; + height: 100%; + min-height: 190px; + max-height: 320px; + object-fit: cover; +} + +.community-card__placeholder{ + place-items: center; + padding: 1.25rem; + color: var(--osl-accent); + font-size: .78rem; + font-weight: 900; + letter-spacing: .14em; + text-align: center; + text-transform: uppercase; +} + +.community-card__placeholder span{ + display: inline-block; + max-width: 16rem; + padding: .7rem .9rem; + border: 1px solid color-mix(in oklab, var(--osl-accent) 34%, var(--border)); + background: color-mix(in oklab, var(--surface-solid) 82%, transparent); +} + +.community-card__body, +.community-event-card__body{ + display: flex; + flex-direction: column; + min-width: 0; + padding: clamp(1rem, 2.4vw, 1.35rem); +} + +.community-card__eyebrow{ + display: flex; + flex-wrap: wrap; + gap: .35rem; + align-items: center; + margin: 0 0 .45rem; + color: var(--osl-accent); + font-size: .78rem; + font-weight: 900; + letter-spacing: .08em; + line-height: 1.25; + text-transform: uppercase; +} + +.community-card__eyebrow span{ + color: var(--muted); +} + +.community-card h3, +.community-resource-card h3, +.community-guidance-card h3{ + margin: 0 0 .55rem; + color: var(--heading); + font-size: clamp(1.18rem, 2vw, 1.45rem); + line-height: 1.12; +} + +.community-card__partner{ + margin: -.2rem 0 .7rem; + color: var(--muted); + font-size: .92rem; + font-weight: 750; +} + +.community-card__description{ + color: color-mix(in oklab, var(--fg) 84%, var(--muted)); +} + +.community-card__actions{ + display: flex; + flex-wrap: wrap; + gap: .45rem; + align-items: center; + margin-top: auto; + padding-top: .35rem; +} + +.community-card__actions .osl-inline-button{ + margin-bottom: 0; +} + +.community-meta{ + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: .65rem; + margin: .9rem 0 1rem; +} + +.community-meta--feature{ + grid-template-columns: repeat(2, minmax(0, 1fr)); +} + +.community-meta--inline{ + display: flex; + flex-wrap: wrap; + gap: .55rem; +} + +.community-meta div{ + min-width: 0; + padding: .65rem .75rem; + border: 1px solid var(--border); + background: var(--surface-muted); +} + +.community-meta--inline div{ + flex: 1 1 10rem; +} + +.community-meta dt{ + margin-bottom: .15rem; + color: var(--muted); + font-size: .68rem; + font-weight: 900; + letter-spacing: .09em; + text-transform: uppercase; +} + +.community-meta dd{ + margin: 0; + color: var(--fg); + font-size: .93rem; + font-weight: 750; + line-height: 1.28; +} + +.community-map-link{ + display: inline-flex; + margin-left: .4rem; + color: var(--osl-accent); + font-size: .82rem; + font-weight: 900; + text-decoration: underline; + text-underline-offset: .16em; +} + +.community-tags{ + display: flex; + flex-wrap: wrap; + gap: .4rem; + margin: .1rem 0 1rem; + padding: 0; + list-style: none; +} + +.community-tags li{ + padding: .28rem .5rem; + border: 1px solid color-mix(in oklab, var(--osl-accent) 25%, var(--border)); + background: color-mix(in oklab, var(--osl-accent) 8%, transparent); + color: color-mix(in oklab, var(--fg) 86%, var(--osl-accent)); + font-size: .78rem; + font-weight: 780; +} + +.community-event-card{ + display: grid; + grid-template-columns: minmax(160px, .28fr) minmax(0, 1fr); +} + +.community-event-card__date{ + display: flex; + flex-direction: column; + justify-content: center; + gap: .35rem; + padding: clamp(1rem, 2.5vw, 1.35rem); + border-right: 1px solid var(--border); + background: + linear-gradient(135deg, color-mix(in oklab, var(--osl-accent) 16%, transparent), transparent), + var(--surface-muted); +} + +.community-event-card__date span{ + color: var(--muted); + font-size: .7rem; + font-weight: 900; + letter-spacing: .11em; + text-transform: uppercase; +} + +.community-event-card__date strong, +.community-event-card__date time{ + color: var(--heading); + font-size: clamp(1.22rem, 2.7vw, 1.75rem); + font-weight: 900; + line-height: 1.06; +} + +.community-event-card__date small{ + color: var(--muted); + font-size: .84rem; + font-weight: 750; +} + +.community-resource-card{ + display: flex; + flex-direction: column; + padding: clamp(1rem, 2.4vw, 1.35rem); +} + +.community-resource-card__top{ + display: grid; + gap: .15rem; +} + +.community-guidance-grid{ + display: grid; + grid-template-columns: minmax(0, 1.1fr) repeat(2, minmax(0, .95fr)); + gap: 1rem; +} + +.community-guidance-card{ + padding: clamp(1.1rem, 2.6vw, 1.5rem); +} + +.community-guidance-card--primary{ + background: + linear-gradient(135deg, color-mix(in oklab, var(--osl-accent) 12%, transparent), transparent), + var(--surface-solid); +} + +.community-guidance-card p, +.community-guidance-card li{ + color: color-mix(in oklab, var(--fg) 84%, var(--muted)); +} + +.community-guidance-card ul{ + margin: .45rem 0 0; + padding-left: 1.15rem; +} + +.community-guidance-card code{ + padding: .15rem .35rem; + border: 1px solid var(--border); + background: var(--surface-muted); + color: var(--osl-accent); +} + +.community-empty-state{ + border-left: .36rem solid var(--osl-accent); +} + +@media (max-width: 980px){ + .community-switchboard{ + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + .community-switchboard a:nth-child(odd){ + border-left: 0; + } + + .community-card--feature, + .community-event-card, + .community-guidance-grid{ + grid-template-columns: 1fr; + } + + .community-event-card__date{ + border-right: 0; + border-bottom: 1px solid var(--border); + } +} + +@media (max-width: 640px){ + .community-switchboard{ + display: flex; + overflow-x: auto; + margin-inline: calc(50% - 50vw); + padding-inline: max(1rem, calc((100vw - 1180px) / 2)); + border-right: 0; + border-left: 0; + scroll-snap-type: x proximity; + } + + .community-switchboard a, + .community-switchboard a:nth-child(odd){ + flex: 0 0 min(82vw, 18rem); + border-left: 1px solid var(--border); + scroll-snap-align: start; + } + + .community-switchboard a:first-child{ + border-left: 0; + } + + .community-meta, + .community-meta--feature{ + grid-template-columns: 1fr; + } + + .community-meta--inline{ + display: grid; + } + + .community-card__media, + .community-card__media a, + .community-card__media img{ + min-height: 150px; + } +}