diff --git a/.github/ISSUE_TEMPLATE/project-submission.yml b/.github/ISSUE_TEMPLATE/project-submission.yml index 198d12c..be568cc 100644 --- a/.github/ISSUE_TEMPLATE/project-submission.yml +++ b/.github/ISSUE_TEMPLATE/project-submission.yml @@ -51,6 +51,12 @@ body: - Learning validations: required: true + - type: input + id: course + attributes: + label: Course (optional) + description: For coursework, give the programme, official module code and name, scheduled semester, and handbook or project source. Leave blank for personal projects. + placeholder: "AIN-B-29 · Deep Learning/Big Data · Semester 6" - type: textarea id: collaboration attributes: diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index a9e4082..5c9156f 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -10,6 +10,8 @@ The submission workflow leaves an acknowledgement and checks whether the reposit To update or remove your own listing, open an issue or pull request. If you need to discuss something privately, [email Alexander](mailto:alex.rudaev@outlook.com). +For coursework, use the optional `academic` object in `site/projects.json`: `kind` is `coursework` or `companion`, `modules` lists `code`, `name`, and scheduled `semester`, and `source` links the official handbook. Add the project-to-course evidence to [COURSES.md](COURSES.md). Personal projects do not need a course assignment. Module codes and course names are searchable in the showroom. + ## Change the website The website is buildless HTML, CSS, and JavaScript in `site/`. It uses a local JSON catalogue, with no visitor accounts or database. Search and filters run in the browser. An external Google Fonts stylesheet provides the fonts; system sans-serif fonts are the fallback. diff --git a/COURSES.md b/COURSES.md new file mode 100644 index 0000000..cf5f818 --- /dev/null +++ b/COURSES.md @@ -0,0 +1,28 @@ +# Projects by course + +Bachelor of Science in Artificial Intelligence (AIN-B), Deggendorf Institute of Technology. Module codes identify courses; they are **not semester numbers**. Semester means the scheduled curriculum semester, not when a particular author completed a project. + +| Semester | Module code | Course | Project | +| --- | --- | --- | --- | +| 2 | AIN-B-10 | Internet Technologies | [Devablos V2](https://github.com/THD-AI/Devablos-Project-V2), [original prototype](https://github.com/THD-AI/Devablos-Project) | +| 3 | AIN-B-16 | Assistance Systems | [Project Apero](https://github.com/THD-AI/Project-Arepo) – decision support and a Rasa chatbot | +| 4 | AIN-B-21 | Machine Learning | [Painfully Trivial](https://github.com/THD-AI/Painfully-Trivial) – train-delay prediction and waste-sorting experiments | +| 4 | AIN-B-22 | Computer Vision | [Painfully Trivial](https://github.com/THD-AI/Painfully-Trivial) – waste-sorting vision project | +| 6 | AIN-B-29 | Deep Learning/Big Data | [CheXVision](https://github.com/THD-AI/chexvision), [CheXVision Mini](https://github.com/THD-AI/chexvision-mini) (companion implementation) | + +## Independent work and related projects + +- [THD Room Finder](https://github.com/THD-AI/THD-Room-Finder) is an independent campus tool. No course code or semester is assigned. +- [Studybooks](https://github.com/THD-AI/studybooks) spans multiple modules. Use each book's own course information. +- [iTravel](https://github.com/arudaev/iTravel) identifies itself as a Media Technology project. It is outside the AIN-B course list; its exact module and semester are not documented in its README. +- [Smart Bin Recognition](https://github.com/arudaev/smart-bin-recognition) and [bahn-predict](https://github.com/arudaev/bahn-predict) continue ideas from Painfully Trivial. They are successor projects, not additional course submissions. [The delay-prediction paper](https://github.com/arudaev/ml-db-delay-paper) documents the earlier ML work. + +## Sources and corrections + +Course codes, names, and scheduled semesters were checked on 18 October 2026 against the [official AIN-B module handbook](https://www.th-deg.de/Studierende/Antraege-und-Organisatorisches/Modulhandbuecher/modulhandbuch-ain-b-ws25-26.pdf) (document dated 7 September 2026; Internet Technologies p. 33, Assistance Systems p. 51, Machine Learning p. 67, Computer Vision p. 70, Deep Learning/Big Data p. 93). The [2023 handbook](https://cs-mariakirchen.th-deg.de/Studierende/Antraege-und-Organisatorisches/Modulhandbuecher/Module%20Handbooks/modulhandbuch-ain-b-en.pdf) also identifies these modules in the original cohort curriculum. + +Project associations use the creators' confirmation and repository evidence: [CheXVision README](https://github.com/arudaev/chexvision#readme), [Mini README](https://github.com/arudaev/chexvision-mini#readme), [Painfully Trivial README](https://github.com/arudaev/Painfully-Trivial#readme), and [Devablos prototype README](https://github.com/THD-AI/Devablos-Project#readme). Alexander confirmed the Assistance Systems association for Apero and both course associations for Painfully Trivial. Its README explicitly records Machine Learning; the Computer Vision association is creator-confirmed rather than a claim of a separate graded submission. + +The official course name is **Internet Technologies**, not Ethernet Technologies, and **Assistance Systems**. Rasa is a framework used by Apero, not a separate module. Project names, creator credits, original artwork, licences, and repository URLs are preserved. GitHub has no separate repository display-name field, so course-first names appear in descriptions, documentation, and the showroom. + +Curricula can change. When adding coursework, provide the programme, exact module code, course name, scheduled semester, handbook edition, and evidence linking the project to the course. For personal work, leave course fields empty. Never infer an academic assignment from its technical subject alone. diff --git a/asset-sources.json b/asset-sources.json index ff53457..2b2d5db 100644 --- a/asset-sources.json +++ b/asset-sources.json @@ -3,5 +3,6 @@ "project-painfully-trivial.png": "https://raw.githubusercontent.com/arudaev/Painfully-Trivial/main/.github/banner.png", "project-devablos.png": "https://raw.githubusercontent.com/THD-AI/Devablos-Project-V2/main/.github/banner.png", "project-room.webp": "https://raw.githubusercontent.com/arudaev/THD-Room-Finder/main/website/assets/hero-day.webp", - "history-avatar-first-redesign.png": "https://github.com/THD-AI/.github/tree/main/archive/2026-10-17-first-redesign" + "history-avatar-first-redesign.png": "https://github.com/THD-AI/.github/tree/main/archive/2026-10-17-first-redesign", + "project-apero.png": "https://raw.githubusercontent.com/arudaev/Project-Arepo/main/.github/banner.png" } diff --git a/scripts/check.mjs b/scripts/check.mjs index 601e927..aaf3ddd 100644 --- a/scripts/check.mjs +++ b/scripts/check.mjs @@ -33,6 +33,23 @@ for (const project of collection.projects) { https(creator.url, 'creator'); } assert(Array.isArray(project.tags) && project.tags.every(t => typeof t === 'string'), 'Project tags must be strings'); + if (project.academic) { + const academic = project.academic; + assert(['coursework', 'companion', 'independent', 'collection'].includes(academic.kind), 'Known academic context required'); + if (['coursework', 'companion'].includes(academic.kind)) { + assert(academic.modules?.length, 'Coursework must identify its modules'); + https(academic.source, 'course source'); + const moduleCodes = new Set(); + for (const module of academic.modules) { + assert(/^AIN-B-\d+$/.test(module.code) && !moduleCodes.has(module.code), 'Unique official AIN-B module code required'); + moduleCodes.add(module.code); + assert(module.name?.trim(), 'Course name required'); + assert(Number.isInteger(module.semester) && module.semester >= 1 && module.semester <= 7, 'Curriculum semester must be 1–7'); + } + } else { + assert(academic.label?.trim() && !academic.modules, 'Independent work and collections must not imply a single course assignment'); + } + } if (project.image) { assert(project.image.startsWith('assets/') && !project.image.includes('..'), 'Project image must be a local asset'); await access(path.join(site, project.image)); diff --git a/site/404.html b/site/404.html index 38efbce..2dbe430 100644 --- a/site/404.html +++ b/site/404.html @@ -1,5 +1,5 @@ -Page not found – THD AI +Page not found – THD AI

404 / A small detour

This shelf
is empty.

That page may have moved. The showroom and project collection are still here.

Back to the showroom ↗
diff --git a/site/app.js b/site/app.js index 0d75cb4..e74a6ce 100644 --- a/site/app.js +++ b/site/app.js @@ -65,13 +65,23 @@ function card(project) { bottom.append(safeLink('Explore the project ↗', project.repository)); if (project.demo) bottom.append(safeLink(project.demoLabel || 'Try it ↗', project.demo)); else if (project.community) bottom.append(safeLink('Build with others ↗', project.community)); - article.append(projectArt(project), meta, element('h3', '', project.title), element('p', 'project-description', project.description), creators, bottom, element('p', 'collaboration', project.collaboration)); + article.append(projectArt(project), meta, element('h3', '', project.title)); + if (project.academic) { + const context = element('p', 'project-course'); + if (project.academic.modules) { + context.append(safeLink(project.academic.modules.map(module => `${module.code} · Semester ${module.semester}`).join(' / '), project.academic.source)); + if (project.academic.kind === 'companion') context.append(document.createTextNode(' · Companion project')); + } else context.textContent = project.academic.label; + article.append(context); + } + article.append(element('p', 'project-description', project.description), creators, bottom, element('p', 'collaboration', project.collaboration)); return article; } function render() { const query = search.value.trim().toLocaleLowerCase(); const visible = projects.filter(project => { - const haystack = [project.title, project.description, project.categoryLabel, ...project.tags, ...project.creators.map(c => c.name)].join(' ').toLocaleLowerCase(); + const courseTerms = project.academic?.modules?.flatMap(module => [module.code, module.name, `Semester ${module.semester}`]) || [project.academic?.label || '']; + const haystack = [project.title, project.description, project.categoryLabel, ...courseTerms, ...project.tags, ...project.creators.map(c => c.name)].join(' ').toLocaleLowerCase(); return (activeFilter === 'all' || project.categories.includes(activeFilter)) && haystack.includes(query); }); grid.replaceChildren(...visible.map(card)); @@ -83,7 +93,7 @@ async function loadProjects() { document.querySelector('#load-error').hidden = true; document.querySelector('#project-count').textContent = 'Opening the showroom…'; try { - const response = await fetch(new URL('projects.json', import.meta.url)); + const response = await fetch(new URL('projects.json', import.meta.url), { cache: 'no-cache' }); if (!response.ok) throw new Error(`Project data: ${response.status}`); const data = await response.json(); if (!Array.isArray(data.projects)) throw new Error('Invalid project collection'); diff --git a/site/assets/project-apero.png b/site/assets/project-apero.png new file mode 100644 index 0000000..f37e110 Binary files /dev/null and b/site/assets/project-apero.png differ diff --git a/site/credits/index.html b/site/credits/index.html index 34c4bd8..8a13683 100644 --- a/site/credits/index.html +++ b/site/credits/index.html @@ -1,10 +1,10 @@ -Credits & licences – THD AI +Credits & licences – THD AI

The people and sources behind the work

Give good work
its credit.

The showroom connects projects. It does not take ownership of them. Every project keeps its original creators, repository, and licence.

Campus artwork

The public campus banner adapts the campus illustration from THD Room Finder. Its source photograph is Hauptcampus der Technischen Hochschule Deggendorf 2018 by Danube-Waidler, licensed CC BY-SA 4.0. The repainted illustration and public banner are shared under that same licence. The banner widens the composition, changes the light and palette, simplifies people into grey silhouettes, and adds THD AI lettering.

The member-workspace and showcase illustrations follow the same visual family, using the Room Finder art as visual references. These new illustrations are also shared under CC BY-SA 4.0. The original public banner remains unchanged. Detailed source notes and production briefs live in the brand record.

The open-portal symbol

The THD AI symbol is an open architectural portal with a warm sun at its centre: room for a person, an idea, and what comes next. It replaces the earlier boxed initials. The new symbol and earlier typographic badge are community identity artwork shared under CC BY 4.0. No official university marks are used.

-

Project images and creators

Image source URLs are recorded in asset-sources.json. Historical visuals retain their original rights and are not relicensed by appearing in the archive.

+

Project images and creators

Image source URLs are recorded in asset-sources.json. Historical visuals retain their original rights and are not relicensed by appearing in the archive.

Website

The original website code and documentation are MIT-licensed. This does not relicense the images or linked projects. The typefaces are Manrope and DM Sans, served by Google Fonts, with system sans-serif fallbacks. The site has no analytics, visitor accounts, or advertising.

For a credit correction, listing update, or removal request, open an issue or email Alexander.

diff --git a/site/history/index.html b/site/history/index.html index c7084ad..14b0b70 100644 --- a/site/history/index.html +++ b/site/history/index.html @@ -1,5 +1,5 @@ -Visual history – THD AI +Visual history – THD AI

Earlier chapters / Visual history

A little history.
Room for what comes next.

THD AI began as a 2023 cohort experiment. The direction has changed, but the work that came before it still belongs in the story. These are preserved originals and the illustrations that followed.

2023 / Original public profile

2023 / Original public profile

The first cohort profile imagined students reaching toward what they could make together. The original image is preserved unchanged.

2023 / Community hub

2023 / Community hub

The early discussion hub paired collaborative learning with a painterly illustration.

2024 / A new semester

2024 / A new semester

A campus scene from the winter-semester calendar announcement. The schedule itself remains a dated historical record.

2023 / First organization avatar

2023 / First organization avatar

The organization’s original avatar, saved before the identity changed.

2026 / The first redesign

2026 / The first redesign

The initial THD AI typographic badge. Replaced by the open-portal symbol, and kept here as part of the process.

2026 / An open campus

2026 / An open campus

The approved public banner. Its soft campus light, lavender haze, and grey silhouettes set the direction for the current identity.

2026 / Room for ideas

2026 / Room for ideas

The member-workspace banner brings the same atmosphere indoors, around personal projects, collaboration, and coffee.

2026 / A shared showroom

2026 / A shared showroom

A new scene for showing work, asking questions, and finding people who care about the same things.

The member-only chapter is preserved too.

The original internal illustration and member documents stay in the private member archive. The first member-profile redesign is saved there as well. They have not been copied into this public page.

Open the member archive on GitHub ↗

The complete public archive includes the calendar-release variant and earlier iceberg asset. Browse the original files and versioned archive, or visit the visual-history discussion. A SHA-256 manifest records the saved public files. Artwork credits and licences.

diff --git a/site/index.html b/site/index.html index e1d337e..ff85c8d 100644 --- a/site/index.html +++ b/site/index.html @@ -14,8 +14,8 @@ - - + + @@ -35,9 +35,10 @@

A place for the work
you care about.

01 / The showroom

Take a look around.

Something useful. Something unusual.
Something that makes you want to start.

+
- +

Opening the showroom…

diff --git a/site/projects.json b/site/projects.json index b19c10c..0e98e9b 100644 --- a/site/projects.json +++ b/site/projects.json @@ -4,91 +4,281 @@ "id": "room", "title": "THD Room Finder", "description": "Find a free room on campus and see how long it stays free. A small, practical answer to a familiar THD problem.", - "categories": ["campus"], + "categories": [ + "campus" + ], "categoryLabel": "Campus life · PWA & Android", "status": "Working app", "repository": "https://github.com/arudaev/THD-Room-Finder", "community": "https://github.com/THD-AI/THD-Room-Finder", "demo": "https://thd-room-finder.vercel.app/", "demoLabel": "Find a room ↗", - "creators": [{"name": "Alexander Rudaev", "url": "https://github.com/arudaev"}], + "creators": [ + { + "name": "Alexander Rudaev", + "url": "https://github.com/arudaev" + } + ], "image": "assets/project-room.webp", "imageAlt": "THD Room Finder: a softly lit campus study space.", - "tags": ["React", "TypeScript", "campus", "rooms", "PWA"], - "collaboration": "Community fork available · original project stays upstream" + "tags": [ + "React", + "TypeScript", + "campus", + "rooms", + "PWA" + ], + "collaboration": "Community fork available · original project stays upstream", + "academic": { + "kind": "independent", + "label": "Independent campus project · no course assignment" + } }, { "id": "chexvision", - "title": "CheXVision", + "title": "Deep Learning/Big Data – CheXVision", "description": "A deep-learning course project exploring chest X-ray pathology detection with PyTorch. Research to learn from, with its limitations in view.", - "categories": ["ai", "learning"], + "categories": [ + "ai", + "learning" + ], "categoryLabel": "AI & ML · Computer vision", "status": "Course project", "repository": "https://github.com/arudaev/chexvision", "community": "https://github.com/THD-AI/chexvision", "demo": "https://arudaev.github.io/chexvision/", "demoLabel": "See the slides ↗", - "creators": [{"name": "Alexander Rudaev", "url": "https://github.com/arudaev"}], + "creators": [ + { + "name": "Alexander Rudaev", + "url": "https://github.com/arudaev" + } + ], "image": "assets/project-chexvision.png", "imageAlt": "CheXVision's original one-line drawing project banner.", - "tags": ["PyTorch", "computer vision", "deep learning", "X-ray"], - "collaboration": "Educational research · not for clinical use" + "tags": [ + "PyTorch", + "computer vision", + "deep learning", + "X-ray" + ], + "collaboration": "Educational research · not for clinical use", + "academic": { + "kind": "coursework", + "modules": [ + { + "code": "AIN-B-29", + "name": "Deep Learning/Big Data", + "semester": 6 + } + ], + "source": "https://www.th-deg.de/Studierende/Antraege-und-Organisatorisches/Modulhandbuecher/modulhandbuch-ain-b-ws25-26.pdf" + } }, { "id": "painfully-trivial", - "title": "Painfully Trivial", + "title": "Machine Learning & Computer Vision – Painfully Trivial", "description": "Making machine learning meet ordinary life: experiments in waste sorting assistance and train delay prediction.", - "categories": ["ai"], + "categories": [ + "ai" + ], "categoryLabel": "AI & ML · Everyday problems", "status": "Course experiments", "repository": "https://github.com/arudaev/Painfully-Trivial", "community": "https://github.com/THD-AI/Painfully-Trivial", - "creators": [{"name": "Alexander Rudaev", "url": "https://github.com/arudaev"}, {"name": "FaresM7", "url": "https://github.com/FaresM7"}, {"name": "TheSameerCode", "url": "https://github.com/TheSameerCode"}], + "creators": [ + { + "name": "Alexander Rudaev", + "url": "https://github.com/arudaev" + }, + { + "name": "FaresM7", + "url": "https://github.com/FaresM7" + }, + { + "name": "TheSameerCode", + "url": "https://github.com/TheSameerCode" + } + ], "image": "assets/project-painfully-trivial.png", "imageAlt": "Painfully Trivial's original one-line drawing banner.", - "tags": ["machine learning", "waste sorting", "prediction", "Python"], - "collaboration": "Community fork available · original authors credited" + "tags": [ + "machine learning", + "waste sorting", + "prediction", + "Python" + ], + "collaboration": "Community fork available · original authors credited", + "academic": { + "kind": "coursework", + "modules": [ + { + "code": "AIN-B-21", + "name": "Machine Learning", + "semester": 4 + }, + { + "code": "AIN-B-22", + "name": "Computer Vision", + "semester": 4 + } + ], + "source": "https://www.th-deg.de/Studierende/Antraege-und-Organisatorisches/Modulhandbuecher/modulhandbuch-ain-b-ws25-26.pdf" + } }, { "id": "devablos", - "title": "Devablos V2", + "title": "Internet Technologies – Devablos V2", "description": "An Internet Technologies project that grew into a full-stack chatbot, with a React client, a Node.js backend, and real-time conversation.", - "categories": ["ai", "learning"], + "categories": [ + "ai", + "learning" + ], "categoryLabel": "AI & ML · Web development", "status": "Historical project", "repository": "https://github.com/THD-AI/Devablos-Project-V2", - "creators": [{"name": "Alexander Rudaev", "url": "https://github.com/arudaev"}, {"name": "Denisa Iulia", "url": "https://github.com/Denisa-Iulia"}], + "creators": [ + { + "name": "Alexander Rudaev", + "url": "https://github.com/arudaev" + }, + { + "name": "Denisa Iulia", + "url": "https://github.com/Denisa-Iulia" + } + ], "image": "assets/project-devablos.png", "imageAlt": "Devablos V2's original project banner.", - "tags": ["React", "Node.js", "chatbot", "WebSocket"], - "collaboration": "Archived source · fork it to take the idea further" + "tags": [ + "React", + "Node.js", + "chatbot", + "WebSocket" + ], + "collaboration": "Archived source · fork it to take the idea further", + "academic": { + "kind": "coursework", + "modules": [ + { + "code": "AIN-B-10", + "name": "Internet Technologies", + "semester": 2 + } + ], + "source": "https://www.th-deg.de/Studierende/Antraege-und-Organisatorisches/Modulhandbuecher/modulhandbuch-ain-b-ws25-26.pdf" + } + }, + { + "id": "apero", + "title": "Assistance Systems – Project Apero", + "description": "An educational decision-support project combining stroke-risk modelling, analytics dashboards, and a Rasa chatbot. A course experiment, not a medical service.", + "categories": [ + "ai", + "learning" + ], + "categoryLabel": "AI & ML · Decision support", + "status": "Course project", + "repository": "https://github.com/arudaev/Project-Arepo", + "community": "https://github.com/THD-AI/Project-Arepo", + "creators": [ + { + "name": "Alexander Rudaev", + "url": "https://github.com/arudaev" + }, + { + "name": "shafwanur", + "url": "https://github.com/shafwanur" + } + ], + "image": "assets/project-apero.png", + "imageAlt": "Project Apero's original project banner.", + "tags": [ + "Rasa", + "Streamlit", + "assistance systems", + "decision support", + "Python" + ], + "collaboration": "Community fork available · educational use only", + "academic": { + "kind": "coursework", + "modules": [ + { + "code": "AIN-B-16", + "name": "Assistance Systems", + "semester": 3 + } + ], + "source": "https://www.th-deg.de/Studierende/Antraege-und-Organisatorisches/Modulhandbuecher/modulhandbuch-ain-b-ws25-26.pdf" + } }, { "id": "studybooks", "title": "Course Studybooks", "description": "Student-written explanations, revision notes, and cheatsheets. Self-contained HTML studybooks that stay readable online, offline, and on a phone.", - "categories": ["learning"], + "categories": [ + "learning" + ], "categoryLabel": "Learning · Shared knowledge", "status": "Reading collection", "repository": "https://github.com/THD-AI/studybooks", "demo": "https://thd-ai.github.io/studybooks/", "demoLabel": "Open a studybook ↗", - "creators": [{"name": "Alexander Rudaev", "url": "https://github.com/arudaev"}], - "tags": ["notes", "courses", "revision", "HTML", "learning"], - "collaboration": "Corrections and original explanations welcome" + "creators": [ + { + "name": "Alexander Rudaev", + "url": "https://github.com/arudaev" + } + ], + "tags": [ + "notes", + "courses", + "revision", + "HTML", + "learning" + ], + "collaboration": "Corrections and original explanations welcome", + "academic": { + "kind": "collection", + "label": "Multiple AIN-B modules · see each studybook" + } }, { "id": "chexvision-mini", - "title": "CheXVision Mini", + "title": "Deep Learning/Big Data – CheXVision Mini", "description": "A neural network built from scratch with NumPy. A companion project for understanding what happens beneath a deep-learning framework.", - "categories": ["ai", "learning"], + "categories": [ + "ai", + "learning" + ], "categoryLabel": "Learning · From first principles", "status": "Learning experiment", "repository": "https://github.com/arudaev/chexvision-mini", "community": "https://github.com/THD-AI/chexvision-mini", - "creators": [{"name": "Alexander Rudaev", "url": "https://github.com/arudaev"}], - "tags": ["NumPy", "neural network", "Python", "from scratch"], - "collaboration": "Community fork available · explore the implementation" + "creators": [ + { + "name": "Alexander Rudaev", + "url": "https://github.com/arudaev" + } + ], + "tags": [ + "NumPy", + "neural network", + "Python", + "from scratch" + ], + "collaboration": "Community fork available · explore the implementation", + "academic": { + "kind": "companion", + "modules": [ + { + "code": "AIN-B-29", + "name": "Deep Learning/Big Data", + "semester": 6 + } + ], + "source": "https://www.th-deg.de/Studierende/Antraege-und-Organisatorisches/Modulhandbuecher/modulhandbuch-ain-b-ws25-26.pdf" + } } ] } diff --git a/site/style.css b/site/style.css index 0dbb622..07c3919 100644 --- a/site/style.css +++ b/site/style.css @@ -3,3 +3,6 @@ .project-description{font-size:14px}.project-creators{font-size:12px}.card-meta{font-size:10px}.card-bottom a{font-size:13px}@media(min-width:1600px){.wrap{width:1280px}}@media(max-width:1000px){.wrap{width:calc(100% - 64px)}.site-header nav{gap:18px}.project-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:32px 24px}.intro h1{letter-spacing:-3px}.about,.share{gap:50px}.gathering-caption{flex-wrap:wrap}.gathering-caption h2{max-width:none}.site-footer{gap:25px}.coffee{padding:28px}.book-sheet strong{font-size:23px}}@media(max-width:700px){.wrap{width:calc(100% - 40px)}.site-header{height:87px;gap:12px}.site-header .identity{font-size:24px}.site-header .identity img{width:38px;height:38px}.site-header nav{display:none}.header-action{font-size:11px;padding:9px 10px}.header-action span{margin-left:5px}.intro{padding-top:35px}.eyebrow{font-size:9px;letter-spacing:1.4px}.intro h1{font-size:clamp(41px,8.8vw,61px);letter-spacing:-2.4px;line-height:1.18;margin:22px 0}.intro-bottom{display:block;margin-bottom:25px}.intro-bottom p{font-size:14px}.intro-bottom .text-link{margin-top:20px}.campus-art img{min-height:0;object-fit:contain}.campus-art figcaption{text-align:left;font-size:10px}.showroom{padding-top:63px}.section-heading{align-items:start;flex-direction:column;gap:17px;margin-bottom:25px}.section-heading>p{font-size:12px}.section-heading>p br{display:none}h2{font-size:34px;letter-spacing:-1.5px}.catalogue-tools{align-items:stretch;flex-direction:column;gap:13px}.filters{gap:4px}.filters button{font-size:11px;padding:8px 10px}.search{border-top:1px solid var(--line);padding-top:8px}.search input{width:100%;font-size:13px}.project-grid{gap:32px 16px}.project-card h3{font-size:18px;letter-spacing:-.5px}.project-description{font-size:12px}.card-meta{align-items:start;gap:5px;flex-direction:column;font-size:8px;margin:13px 0 9px}.project-art{aspect-ratio:1.35}.project-creators{font-size:10px}.card-bottom{gap:7px;align-items:start;flex-direction:column}.card-bottom a{font-size:11px}.collaboration{font-size:9px}.art-studybooks,.art-chexvision-mini{padding:15px!important}.book-art{gap:5px}.book-sheet{padding:8px}.book-sheet strong{font-size:12px}.book-sheet small{font-size:6px}.book-sheet span{height:2px}.network-art{gap:13px}.network-node{width:14px;height:14px;box-shadow:0 0 0 3px #fff5}.node-column{gap:9px}.shelf-note{align-items:start;font-size:11px;margin-top:22px}.shelf-note .little-sun{margin-top:6px}.about{grid-template-columns:1fr;gap:15px;padding-top:60px;padding-bottom:60px;margin-top:35px}.about-copy>p:not(.eyebrow){font-size:14px}.principles{padding:25px;margin-top:20px}.gathering-caption{gap:14px;padding-top:21px}.gathering-caption h2{font-size:23px}.gathering-caption>p{width:100%}.gathering-caption .text-link{margin-top:5px}.share{grid-template-columns:1fr;gap:14px;padding-top:60px;padding-bottom:45px;margin-top:55px}.share>div>p:not(.eyebrow):not(.quiet){font-size:14px}.share-steps{margin-top:25px}.share-actions{gap:10px}.button{font-size:12px;padding:11px 13px;gap:14px}.coffee{align-items:start;padding:25px;flex-wrap:wrap;gap:13px;margin-bottom:55px}.coffee-mark{font-size:24px}.coffee>div:nth-child(2){flex:1;min-width:200px}.coffee h2{font-size:21px;line-height:1.4}.coffee>.text-link{margin-left:37px}.site-footer{grid-template-columns:1fr;gap:22px;padding-top:30px}.footer-links{max-width:100%;gap:13px 22px}.site-footer .footer-note{text-align:left}.history-main{padding-top:35px}.history-main>h1{font-size:45px;letter-spacing:-2px}.history-main>.lede{font-size:15px;margin-bottom:35px}.history-grid{gap:30px;grid-template-columns:1fr}.history-item img{height:auto;max-height:360px;object-fit:contain}.history-item.logo-history img{height:220px}.history-item h2{font-size:23px}.history-private{padding:25px}}@media(max-width:380px){.project-grid{grid-template-columns:1fr}.project-art{aspect-ratio:1.65}.card-meta{flex-direction:row}.card-bottom{flex-direction:row}.project-card h3{font-size:22px}.project-description{font-size:13px}}@media(prefers-reduced-motion:reduce){:root{scroll-behavior:auto}*,*:before,*:after{transition:none!important;animation:none!important}} @media(max-width:540px){.project-grid{grid-template-columns:1fr}.project-art{aspect-ratio:1.75}.project-card h3{font-size:22px}.project-description{font-size:14px}.card-meta{flex-direction:row;font-size:9px}.card-bottom{flex-direction:row}.card-bottom a{font-size:12px}.project-creators{font-size:11px}.book-sheet strong{font-size:23px}.book-sheet small{font-size:9px}.book-sheet{padding:18px}.book-art{gap:12px}.network-node{width:23px;height:23px}.network-art{gap:30px}} + +.project-course{font-size:12px;line-height:1.65;color:var(--muted);margin:9px 0 14px}.project-course a{color:inherit;overflow-wrap:anywhere} +.course-map-link{font-size:13px;margin:0 0 22px}