diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..06944d1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +.venv/ +__pycache__/ +*.py[cod] +.pytest_cache/ +data/*.db +.DS_Store diff --git a/DATA_MODEL.md b/DATA_MODEL.md new file mode 100644 index 0000000..17fd6af --- /dev/null +++ b/DATA_MODEL.md @@ -0,0 +1,56 @@ +# Collection Archive v0.2.0 Data Model + +## Designer + +Represents an individual fashion designer. + +| Field | Meaning | Required? | +|---|---|---| +| id | Internal unique identifier | Yes | +| full_name | Designer’s full name | Yes | +| nationality | Designer’s nationality | No | +| birth_year | Year the designer was born | No | +| website | Designer’s official website | No | +| biography | Background and career information | No | + +## Collection + +Represents a collection credited to one lead designer. + +| Field | Meaning | Required? | +|---|---|---| +| id | Internal unique identifier | Yes | +| designer_id | Identifies the lead designer | Yes | +| label | Label or fashion house that released it | Yes | +| name | Collection’s given name, if it has one | No | +| season | Fashion season, such as Spring/Summer | Yes | +| release_year | Year it was released or planned | Yes | +| status | Concept, in production, released, or archived | Yes | +| piece_count | Number of looks or pieces | No | +| description | Collection notes and context | No | + +A collection name is optional because many fashion collections are unnamed or eponymous and are instead identified by label, season, and year. + +## Collection media + +Represents a curated external resource associated with one collection. The +archive stores links and YouTube video IDs, not copyrighted media files. + +| Field | Meaning | Required? | +|---|---|---| +| id | Internal unique identifier | Yes | +| collection_id | Identifies the collection | Yes | +| media_type | Curated source or YouTube video | Yes | +| media_value | Source URL or normalized YouTube video ID | Yes | + +## Relationship rules + +- One designer may have zero or many collections. +- Every collection must reference one existing designer. +- Deleting a designer deletes their collection records. +- One collection may have a source link and a YouTube video. +- Deleting a collection deletes its media records. + +--- + +*(h)gaines.* diff --git a/PRODUCT.md b/PRODUCT.md new file mode 100644 index 0000000..092c71d --- /dev/null +++ b/PRODUCT.md @@ -0,0 +1,55 @@ +# Collection Archive v0.2.0 + +## Purpose + +A public-facing archive that helps people discover which individual designers created collections for different fashion labels throughout their careers. + +## v0.2.0 user stories + +- As a user, I can view all archived designers so I can discover who created fashion collections. +- As a user, I can view the collections credited to a designer across different labels and seasons. +- As a user, I can open a collection to see its label, season, year, status, piece count, and description. +- As a user, I can follow a curated source or watch an official embedded runway video when available. +- As a user, I can add, edit, and delete designer (& collection) records. +- Before public deployment both user authentication and an audit system must be encoded ensuring only verified users can make archival edits (v1.0.0). + +## Home page + +For a small archive, the home page can initially show every designer. +Larger archive should show only recent or featured designers with a separate +"View All" page. + +## Designer page + +Full Name, Country/Nationality, Birth Year, Website. Background/Bio + +## Collection page + +Each collection page should show basic details about each collection: +Lead Designer +Label/Fashion House +Season +Release Year +Status (archived, released, concept, in-production, etc) +Piece Count +Description +Curated source link +Official YouTube runway video + +## v0.2.0 features + +CRUD functionality for Designers & Collections by any/all users. + +## Future features + +What are we deliberately postponing for v1.0.0? +- Postponing Authentication (login) for authorized edits vs everyday users. Every edit: record the author, timestamp, previous value, and reason for the change +- Direct image uploads and image hosting remain postponed. Collection pages can include curated source links and official YouTube embeds. +- Support for multiple credited designers on one collection through a +`collection_designers` junction table. This would extend the v0.2.0 +designer-to-collections model for collaborations and co-designer credits. +- Authentication, Role-based permissions, edit history, rollback, and a small moderation queue. + +--- + +*(h)gaines.* diff --git a/README.md b/README.md index 7b04165..b1d1bfa 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,128 @@ +## Collection Archive v0.2.0 + +A public-facing archive that helps people discover which individual designers created collections for different fashion labels throughout their careers. + +### What this product does: + +Users can add/edit designer/collection records (think Wiki) +Visitors can view archived collections to discover the designers who created certain fashion collections across different labels and seasons. + +### Data relationship + +One designer may have many collections across many labels/seasons. (OneToMany) Eventually I think I should include a junction table to represent collections credited to multiple designers. (ManyToMany) + +### Technology + +- SQLite +- Python +- FastAPI +- Vanilla HTML, CSS, and JavaScript +- React and Vite +- Pytest + +### Run locally + +```bash +python3 -m venv .venv +source .venv/bin/activate +python3 -m pip install -r requirements.txt +python3 -m scripts.init_db +uvicorn app.main:app --reload +``` + +In a second terminal, start the React client: + +```bash +cd react-ui +npm install +npm run dev +``` + +Vite serves React at `http://localhost:5173` and proxies `/api` requests to +FastAPI at `http://127.0.0.1:8000`. The Vanilla client is served directly by +FastAPI at `http://127.0.0.1:8000`. + +### Run the tests + +With the virtual environment active, run the complete suite from the repository +root: + +```bash +pytest -q +``` + +To print the designers currently stored in the archive from the project root, +run the utility script as a Python module: + +```bash +python3 -m app.list_designers +``` + +`init_db.py` creates `data/archive.db` from the canonical `data/archive.json` +snapshot only when the database does not already exist. It never overwrites +live archive records. + +### Preserve and restore archive content + +SQLite is the local runtime database and remains ignored by Git. The canonical, +reviewable content record is `data/archive.json`. After making approved content +changes through either UI, refresh that snapshot with: + +```bash +python3 -m scripts.archive_data export +``` + +Restore it into a new database, or merge it into an existing database, with: + +```bash +python3 -m scripts.archive_data import --database data/restored.db --replace +``` + +Designer and collection keys in the JSON are stable text identifiers; generated +SQLite IDs are deliberately not exported. Tests verify that export → import → +export produces identical content and that repeated merge imports are idempotent. + +After initialization, designers and collections added through either web UI +are stored in that same live database and appear in both interfaces. SQL files +under `sql/migrations/` contain deliberate database upgrades. FastAPI applies +each migration once at startup and records it in `schema_migrations`; migrations +never recreate the database from seed data. + +### Application Structure + +sql/schema.sql + #Schema.sql defines the database tables, fields, constraints, foreign key, and index. +data/archive.json + #The canonical archive content. It is deterministic, human-readable, portable, and committed separately from schema migrations. +sql/seed.sql + #Legacy instructional seed data retained for the original SQL exercise and tests. Migrations 001 and 003–005 are historical data corrections retained for reproducibility; all new curated content goes through data/archive.json rather than new data migrations. +scripts/init_db.py + #Init_db.py restores the canonical JSON archive only when the database does not exist. +app/database.py + #Database.py opens and configures connections used during normal API reads and writes. +app/schemas.py + #Schemas.py defines the accepted structure and validation rules for designer and collection data received by the API. The SQL tables remain defined separately in schema.sql. +app/main.py + #Main.py defines the middle-tier FastAPI application. Uvicorn receives HTTP requests and passes them to matching FastAPI routes. Those routes validate requests, run SQL through a database connection, and return data or errors to the frontend as HTTP responses. +web/ + #The web/ directory contains the user-facing layer. HTML defines the structure and content of each page, CSS controls its visual presentation, and JavaScript loads archive data, handles forms, and communicates with the API. +tests/ + #The tests verify API functionality by sending predefined input and comparing the response with expected output. Each test uses a temporary database so the real archive data is not changed. +react-ui/src/App.jsx + #App.jsx is the React routing map. It connects browser URLs to page components, places those pages inside a shared layout, and includes routes for listing, viewing, creating, editing, and handling unknown pages. +react-ui/src/pages/DesignerList.jsx + #DesignerList.jsx requests designers from FastAPI when it first loads, stores the result in React state, and maps each designer record into a linked card on the home page. +react-ui/src/pages/DesignerDetail.jsx + #DesignerDetail reads a designer ID from the React route. When the component loads, it requests both the designer record and that designer’s collections from FastAPI. It stores both responses in React state and renders the one-to-many relationship. It also links to the create and edit forms. When a deletion is confirmed, it sends a DELETE request and SQLite performs the cascading collection deletion. +react-ui/src/pages/DesignerForm.jsx + #DesignerForm handles both creating and editing designers. It detects edit mode from the route parameter. Its inputs are controlled by one state object, and a shared change handler updates the relevant property. On submission, it converts form strings into the types expected by FastAPI, changes blank optional fields to null, normalizes the website address, and sends either POST or PUT. After a successful response, it navigates to the saved designer’s profile. +react-ui/src/pages/CollectionDetail.jsx + #CollectionDetail gets the collection ID from the React route and requests that record from FastAPI. The API response includes the collection’s foreign key and the designer name obtained through a SQL join. The component displays optional fields with appropriate fallbacks and links back to the parent designer. It can also navigate to the edit form or delete the collection and return to its designer’s profile. +react-ui/src/pages/CollectionForm.jsx + #CollectionForm handles both collection creation and editing. When creating, it obtains the parent designer ID from the nested URL. When editing, it obtains the designer ID from the existing collection. Its controlled fields are stored in React state, and submission converts the string input values into the integer and null values expected by FastAPI. The payload includes designer_id, which connects the collection to its parent. FastAPI validates the parent, while SQLite enforces the foreign key and uniqueness rules. +react-ui/src/api.js + #Api.js centralizes communication between React and FastAPI. It prefixes API requests so Vite can proxy them to the backend, adds the JSON content header when a request has a body, parses successful JSON responses, handles empty deletion responses, and converts unsuccessful HTTP responses into JavaScript errors that page components can display. + # OnesToManys (ListDetails) The point of this project is to explore what a 3-tier web application is like. @@ -282,3 +407,7 @@ instructor. - Hospital (master) - Patients (detail) - Album (master) - Photos (detail) - Survey (master) - Questions (detail) + +--- + +*(h)gaines.* diff --git a/app/database.py b/app/database.py new file mode 100644 index 0000000..18ea2c2 --- /dev/null +++ b/app/database.py @@ -0,0 +1,60 @@ +import sqlite3 +from pathlib import Path + + +PROJECT_ROOT = Path(__file__).resolve().parent.parent +DATABASE_PATH = PROJECT_ROOT / "data" / "archive.db" +MIGRATIONS_PATH = PROJECT_ROOT / "sql" / "migrations" + + +def connect() -> sqlite3.Connection: + connection = sqlite3.connect(DATABASE_PATH) + connection.row_factory = sqlite3.Row + connection.execute("PRAGMA foreign_keys = ON") + return connection + + +def apply_migrations() -> list[str]: + """Apply each pending SQL migration exactly once.""" + connection = connect() + applied = [] + + try: + connection.execute( + """ + CREATE TABLE IF NOT EXISTS schema_migrations ( + filename TEXT PRIMARY KEY, + applied_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP + ) + """ + ) + + completed = { + row["filename"] + for row in connection.execute( + "SELECT filename FROM schema_migrations" + ).fetchall() + } + + for migration_path in sorted(MIGRATIONS_PATH.glob("*.sql")): + if migration_path.name in completed: + continue + + migration_sql = migration_path.read_text() + quoted_filename = migration_path.name.replace("'", "''") + + connection.executescript( + "BEGIN IMMEDIATE;\n" + f"{migration_sql}\n" + "INSERT INTO schema_migrations (filename) " + f"VALUES ('{quoted_filename}');\n" + "COMMIT;" + ) + applied.append(migration_path.name) + except Exception: + connection.rollback() + raise + finally: + connection.close() + + return applied diff --git a/app/list_designers.py b/app/list_designers.py new file mode 100644 index 0000000..97f331b --- /dev/null +++ b/app/list_designers.py @@ -0,0 +1,22 @@ +from app.database import connect + + +connection = connect() + +rows = connection.execute( + """ + SELECT + id, + full_name, + nationality, + birth_year + FROM designers + ORDER BY full_name + """ +).fetchall() + +for row in rows: + designer = dict(row) + print(f"{designer['full_name']} — {designer['nationality']}") + +connection.close() diff --git a/app/main.py b/app/main.py new file mode 100644 index 0000000..f67f3dc --- /dev/null +++ b/app/main.py @@ -0,0 +1,655 @@ +import sqlite3 +from contextlib import asynccontextmanager +from fastapi import FastAPI, HTTPException, Response, status +from app.database import apply_migrations, connect +from app.schemas import CollectionCreate, DesignerCreate +from fastapi.staticfiles import StaticFiles + + +@asynccontextmanager +async def lifespan(_app: FastAPI): + apply_migrations() + yield + + +app = FastAPI(title="Collection Archive", lifespan=lifespan) + + +COLLECTION_SELECT = """ + SELECT + collections.id, + collections.designer_id, + designers.full_name AS lead_designer, + collections.label, + collections.name, + collections.season, + collections.release_year, + collections.status, + collections.piece_count, + collections.description, + ( + SELECT media_value + FROM collection_media + WHERE collection_id = collections.id + AND media_type = 'source' + ) AS source_url, + ( + SELECT media_value + FROM collection_media + WHERE collection_id = collections.id + AND media_type = 'youtube' + ) AS youtube_video_id + FROM collections + JOIN designers + ON designers.id = collections.designer_id +""" + + +def fetch_collection( + connection: sqlite3.Connection, + collection_id: int, +) -> dict: + row = connection.execute( + COLLECTION_SELECT + " WHERE collections.id = ?", + (collection_id,), + ).fetchone() + + if row is None: + raise HTTPException( + status_code=404, + detail="Collection not found", + ) + + return dict(row) + + +def sync_collection_media( + connection: sqlite3.Connection, + collection_id: int, + payload: CollectionCreate, +) -> None: + connection.execute( + "DELETE FROM collection_media WHERE collection_id = ?", + (collection_id,), + ) + + media = [ + ("source", payload.source_url), + ("youtube", payload.youtube_video_id), + ] + connection.executemany( + """ + INSERT INTO collection_media ( + collection_id, + media_type, + media_value + ) + VALUES (?, ?, ?) + """, + [ + (collection_id, media_type, media_value) + for media_type, media_value in media + if media_value is not None + ], + ) + + +@app.get("/health") +def health(): + return {"status": "ok"} + +@app.get("/designers") +def list_designers(): + connection = connect() + + try: + rows = connection.execute( + """ + SELECT + designers.id, + designers.full_name, + designers.nationality, + designers.birth_year, + designers.website, + designers.biography, + COUNT(collections.id) AS collection_count + FROM designers + LEFT JOIN collections + ON collections.designer_id = designers.id + GROUP BY designers.id + ORDER BY designers.full_name + """ + ).fetchall() + + return [dict(row) for row in rows] + finally: + connection.close() + + +@app.get("/designers/{designer_id}") +def get_designer(designer_id: int): + connection = connect() + + try: + row = connection.execute( + """ + SELECT + id, + full_name, + nationality, + birth_year, + website, + biography + FROM designers + WHERE id = ? + """, + (designer_id,), + ).fetchone() + + if row is None: + raise HTTPException( + status_code=404, + detail="Designer not found", + ) + + return dict(row) + finally: + connection.close() + +@app.get("/designers/{designer_id}/collections") +def list_designer_collections(designer_id: int): + connection = connect() + + try: + designer = connection.execute( + """ + SELECT id + FROM designers + WHERE id = ? + """, + (designer_id,), + ).fetchone() + + if designer is None: + raise HTTPException( + status_code=404, + detail="Designer not found", + ) + + rows = connection.execute( + """ + SELECT + id, + designer_id, + label, + name, + season, + release_year, + status, + piece_count, + description, + ( + SELECT media_value + FROM collection_media + WHERE collection_id = collections.id + AND media_type = 'source' + ) AS source_url, + ( + SELECT media_value + FROM collection_media + WHERE collection_id = collections.id + AND media_type = 'youtube' + ) AS youtube_video_id + FROM collections + WHERE designer_id = ? + ORDER BY release_year DESC, season + """, + (designer_id,), + ).fetchall() + + return [dict(row) for row in rows] + finally: + connection.close() + +@app.get("/collections/{collection_id}") +def get_collection(collection_id: int): + connection = connect() + + try: + return fetch_collection(connection, collection_id) + finally: + connection.close() + +@app.post("/designers", status_code=status.HTTP_201_CREATED) +def create_designer(payload: DesignerCreate): + connection = connect() + + try: + cursor = connection.execute( + """ + INSERT INTO designers ( + full_name, + nationality, + birth_year, + website, + biography + ) + VALUES (?, ?, ?, ?, ?) + """, + ( + payload.full_name, + payload.nationality, + payload.birth_year, + payload.website, + payload.biography, + ), + ) + + connection.commit() + + row = connection.execute( + """ + SELECT * + FROM designers + WHERE id = ? + """, + (cursor.lastrowid,), + ).fetchone() + + return dict(row) + + except sqlite3.IntegrityError as error: + connection.rollback() + + if "UNIQUE constraint failed: designers.full_name" in str(error): + raise HTTPException( + status_code=409, + detail="A designer with this name already exists", + ) from error + + raise HTTPException( + status_code=400, + detail="Designer violates a database constraint", + ) from error + + finally: + connection.close() + +@app.put("/designers/{designer_id}") +def update_designer(designer_id: int, payload: DesignerCreate): + connection = connect() + + try: + existing_designer = connection.execute( + """ + SELECT id + FROM designers + WHERE id = ? + """, + (designer_id,), + ).fetchone() + + if existing_designer is None: + raise HTTPException( + status_code=404, + detail="Designer not found", + ) + + connection.execute( + """ + UPDATE designers + SET + full_name = ?, + nationality = ?, + birth_year = ?, + website = ?, + biography = ? + WHERE id = ? + """, + ( + payload.full_name, + payload.nationality, + payload.birth_year, + payload.website, + payload.biography, + designer_id, + ), + ) + + connection.commit() + + updated_designer = connection.execute( + """ + SELECT * + FROM designers + WHERE id = ? + """, + (designer_id,), + ).fetchone() + + return dict(updated_designer) + + except sqlite3.IntegrityError as error: + connection.rollback() + + if "UNIQUE constraint failed: designers.full_name" in str(error): + raise HTTPException( + status_code=409, + detail="A designer with this name already exists", + ) from error + + raise HTTPException( + status_code=400, + detail="Designer violates a database constraint", + ) from error + + finally: + connection.close() + +@app.delete( + "/designers/{designer_id}", + status_code=status.HTTP_204_NO_CONTENT, +) +def delete_designer(designer_id: int): + connection = connect() + + try: + existing_designer = connection.execute( + """ + SELECT id + FROM designers + WHERE id = ? + """, + (designer_id,), + ).fetchone() + + if existing_designer is None: + raise HTTPException( + status_code=404, + detail="Designer not found", + ) + + connection.execute( + """ + DELETE FROM designers + WHERE id = ? + """, + (designer_id,), + ) + + connection.commit() + + return Response( + status_code=status.HTTP_204_NO_CONTENT + ) + finally: + connection.close() + +@app.post( + "/collections", + status_code=status.HTTP_201_CREATED, +) +def create_collection(payload: CollectionCreate): + connection = connect() + + try: + designer = connection.execute( + """ + SELECT id + FROM designers + WHERE id = ? + """, + (payload.designer_id,), + ).fetchone() + + if designer is None: + raise HTTPException( + status_code=404, + detail="Designer not found", + ) + + cursor = connection.execute( + """ + INSERT INTO collections ( + designer_id, + label, + name, + season, + release_year, + status, + piece_count, + description + ) + VALUES (?, ?, ?, ?, ?, ?, ?, ?) + """, + ( + payload.designer_id, + payload.label, + payload.name, + payload.season, + payload.release_year, + payload.status, + payload.piece_count, + payload.description, + ), + ) + + sync_collection_media( + connection, + cursor.lastrowid, + payload, + ) + + connection.commit() + + return fetch_collection(connection, cursor.lastrowid) + + except sqlite3.IntegrityError as error: + connection.rollback() + + if "UNIQUE constraint failed" in str(error): + raise HTTPException( + status_code=409, + detail="This collection already exists", + ) from error + + raise HTTPException( + status_code=400, + detail="Collection violates a database constraint", + ) from error + + finally: + connection.close() + +@app.put("/collections/{collection_id}") +def update_collection( + collection_id: int, + payload: CollectionCreate, +): + connection = connect() + + try: + existing_collection = connection.execute( + """ + SELECT id + FROM collections + WHERE id = ? + """, + (collection_id,), + ).fetchone() + + if existing_collection is None: + raise HTTPException( + status_code=404, + detail="Collection not found", + ) + + designer = connection.execute( + """ + SELECT id + FROM designers + WHERE id = ? + """, + (payload.designer_id,), + ).fetchone() + + if designer is None: + raise HTTPException( + status_code=404, + detail="Designer not found", + ) + + connection.execute( + """ + UPDATE collections + SET + designer_id = ?, + label = ?, + name = ?, + season = ?, + release_year = ?, + status = ?, + piece_count = ?, + description = ? + WHERE id = ? + """, + ( + payload.designer_id, + payload.label, + payload.name, + payload.season, + payload.release_year, + payload.status, + payload.piece_count, + payload.description, + collection_id, + ), + ) + + sync_collection_media( + connection, + collection_id, + payload, + ) + + connection.commit() + + return fetch_collection(connection, collection_id) + + except sqlite3.IntegrityError as error: + connection.rollback() + + if "UNIQUE constraint failed" in str(error): + raise HTTPException( + status_code=409, + detail="This collection already exists", + ) from error + + raise HTTPException( + status_code=400, + detail="Collection violates a database constraint", + ) from error + + finally: + connection.close() + +@app.delete( + "/collections/{collection_id}", + status_code=status.HTTP_204_NO_CONTENT, +) +def delete_collection(collection_id: int): + connection = connect() + + try: + existing_collection = connection.execute( + """ + SELECT id + FROM collections + WHERE id = ? + """, + (collection_id,), + ).fetchone() + + if existing_collection is None: + raise HTTPException( + status_code=404, + detail="Collection not found", + ) + + connection.execute( + """ + DELETE FROM collections + WHERE id = ? + """, + (collection_id,), + ) + + connection.commit() + + return Response( + status_code=status.HTTP_204_NO_CONTENT + ) + finally: + connection.close() + + +@app.get("/collections") +def list_collections(): + connection = connect() + + try: + rows = connection.execute( + """ + SELECT + collections.id, + collections.designer_id, + designers.full_name AS lead_designer, + collections.label, + collections.name, + collections.season, + collections.release_year, + collections.status, + collections.piece_count, + collections.description, + ( + SELECT media_value + FROM collection_media + WHERE collection_id = collections.id + AND media_type = 'source' + ) AS source_url, + ( + SELECT media_value + FROM collection_media + WHERE collection_id = collections.id + AND media_type = 'youtube' + ) AS youtube_video_id + FROM collections + JOIN designers + ON designers.id = collections.designer_id + ORDER BY + collections.release_year DESC, + collections.label + """ + ).fetchall() + + return [dict(row) for row in rows] + finally: + connection.close() + + +@app.post( + "/designers/{designer_id}/collections", + status_code=status.HTTP_201_CREATED, +) +def create_designer_collection( + designer_id: int, + payload: CollectionCreate, +): + payload = payload.model_copy(update={"designer_id": designer_id}) + return create_collection(payload) + +app.mount( + "/", + StaticFiles(directory="web", html=True), + name="web", +) diff --git a/app/schemas.py b/app/schemas.py new file mode 100644 index 0000000..c7a8ff1 --- /dev/null +++ b/app/schemas.py @@ -0,0 +1,163 @@ +from pydantic import BaseModel, Field, field_validator +from typing import Literal +from urllib.parse import parse_qs, urlparse +import re + +CollectionStatus = Literal[ + "concept", + "in-production", + "released", + "archived", +] + +HOSTNAME_PATTERN = re.compile( + r"^[A-Za-z0-9]([A-Za-z0-9-]*[A-Za-z0-9])?" + r"(\.[A-Za-z0-9]([A-Za-z0-9-]*[A-Za-z0-9])?)*" + r"\.[A-Za-z]{2,}$" +) + +class DesignerCreate(BaseModel): + full_name: str = Field(min_length=1, max_length=120) + nationality: str | None = None + birth_year: int | None = Field(default=None, ge=1800, le=2100) + website: str | None = Field(default=None, max_length=500) + biography: str | None = None + + @field_validator("full_name") + @classmethod + def full_name_must_not_be_blank(cls, value: str) -> str: + cleaned_value = value.strip() + + if not cleaned_value: + raise ValueError("Full name must not be blank") + + return cleaned_value + + @field_validator("website") + @classmethod + def normalize_website_url( + cls, + value: str | None, + ) -> str | None: + if value is None: + return None + + cleaned_value = value.strip() + if not cleaned_value: + return None + + parsed = urlparse(cleaned_value) + if not parsed.scheme: + cleaned_value = f"https://{cleaned_value}" + parsed = urlparse(cleaned_value) + + if parsed.scheme not in {"http", "https"} or not parsed.netloc: + raise ValueError("Website URL must use http:// or https://") + + if not HOSTNAME_PATTERN.match(parsed.hostname or ""): + raise ValueError("Website URL must include a valid domain name") + + return cleaned_value + +class CollectionCreate(BaseModel): + designer_id: int = Field(ge=1) + label: str = Field(min_length=1, max_length=120) + name: str | None = Field(default=None, max_length=120) + season: str = Field(min_length=1, max_length=40) + release_year: int = Field(ge=1900, le=2100) + status: CollectionStatus + piece_count: int | None = Field(default=None, ge=0) + description: str | None = None + source_url: str | None = Field(default=None, max_length=500) + youtube_video_id: str | None = Field(default=None, max_length=200) + + @field_validator("label", "season") + @classmethod + def required_text_must_not_be_blank(cls, value: str) -> str: + cleaned_value = value.strip() + + if not cleaned_value: + raise ValueError("Value must not be blank") + + return cleaned_value + + @field_validator("name") + @classmethod + def optional_name_must_not_be_blank( + cls, + value: str | None, + ) -> str | None: + if value is None: + return None + + cleaned_value = value.strip() + + if not cleaned_value: + raise ValueError( + "Name must be meaningful when provided" + ) + + return cleaned_value + + @field_validator("source_url") + @classmethod + def source_url_must_be_http( + cls, + value: str | None, + ) -> str | None: + if value is None: + return None + + cleaned_value = value.strip() + if not cleaned_value: + return None + + parsed = urlparse(cleaned_value) + if parsed.scheme not in {"http", "https"} or not parsed.netloc: + raise ValueError("Source URL must begin with http:// or https://") + + return cleaned_value + + @field_validator("youtube_video_id") + @classmethod + def normalize_youtube_video_id( + cls, + value: str | None, + ) -> str | None: + if value is None: + return None + + cleaned_value = value.strip() + if not cleaned_value: + return None + + video_id = cleaned_value + if "://" in cleaned_value: + parsed = urlparse(cleaned_value) + hostname = (parsed.hostname or "").lower() + + if hostname in {"youtu.be", "www.youtu.be"}: + video_id = parsed.path.strip("/").split("/")[0] + elif hostname in { + "youtube.com", + "www.youtube.com", + "m.youtube.com", + "music.youtube.com", + "youtube-nocookie.com", + "www.youtube-nocookie.com", + }: + if parsed.path == "/watch": + video_id = parse_qs(parsed.query).get("v", [""])[0] + else: + path_parts = parsed.path.strip("/").split("/") + video_id = path_parts[1] if ( + len(path_parts) >= 2 + and path_parts[0] in {"embed", "shorts", "live"} + ) else "" + else: + video_id = "" + + if not re.fullmatch(r"[A-Za-z0-9_-]{11}", video_id): + raise ValueError("Enter an official YouTube URL or 11-character video ID") + + return video_id diff --git a/conftest.py b/conftest.py new file mode 100644 index 0000000..39666e9 --- /dev/null +++ b/conftest.py @@ -0,0 +1 @@ +"""Present so pytest puts the repository root on sys.path.""" diff --git a/data/archive.json b/data/archive.json new file mode 100644 index 0000000..07c07eb --- /dev/null +++ b/data/archive.json @@ -0,0 +1,4927 @@ +{ + "format_version": 1, + "designers": [ + { + "key": "alessandro-michele", + "full_name": "Alessandro Michele", + "nationality": "Italian", + "birth_year": 1972, + "website": "https://www.valentino.com", + "biography": "Italian designer Alessandro Michele became Gucci creative director in 2015, replacing streamlined luxury with an encyclopedic, gender-fluid world of historical reference, romantic eccentricity, and collecting. After leaving Gucci in 2022, he joined Valentino in 2024, translating the Roman house's couture heritage through his personal maximalist and cinematic imagination." + }, + { + "key": "alexander-wang", + "full_name": "Alexander Wang", + "nationality": "American", + "birth_year": 1983, + "website": "https://www.alexanderwang.com", + "biography": "American designer Alexander Wang launched his New York label in 2005, building an influential language of off-duty sportswear, downtown casting, distressed luxury, and nightlife energy. He served as Balenciaga creative director from 2012 to 2015, adapting the house's sculptural archive through technical materials and a restrained contemporary lens." + }, + { + "key": "chitose-abe", + "full_name": "Chitose Abe", + "nationality": "Japanese", + "birth_year": 1965, + "website": "https://www.sacai.jp/", + "biography": "Chitose Abe (née Sakai) is a Japanese fashion designer and the founder of the luxury label Sacai. Launched in Tokyo in 1999, her brand is globally renowned for its signature \"hybrid\" aesthetic, which splices contrasting fabrics, utility wear, and classic tailoring into cohesive, multi-dimensional garments." + }, + { + "key": "craig-green", + "full_name": "Craig Green", + "nationality": "British", + "birth_year": 1986, + "website": "https://www.craig-green.com", + "biography": "London designer Craig Green founded his label in 2012 after completing the Central Saint Martins MA. Beginning with workwear, uniforms, and the worker jacket, he constructs deeply emotional menswear around protection, restraint, vulnerability, ritual, and collective movement. His processions often combine highly wearable garments with sculptural structures that resemble flags, shelters, machines, or devotional objects." + }, + { + "key": "demna-gvasalia", + "full_name": "Demna Gvasalia", + "nationality": "Georgian", + "birth_year": null, + "website": null, + "biography": "Designer and co-founder of Vetements whose career includes creative leadership at Balenciaga and Gucci." + }, + { + "key": "dries-van-noten", + "full_name": "Dries Van Noten", + "nationality": "Belgian", + "birth_year": 1958, + "website": "https://www.driesvannoten.com", + "biography": "Belgian designer and member of the Antwerp Six, celebrated for sophisticated color, print, textile, and embroidery combinations across menswear and womenswear." + }, + { + "key": "eli-russell-linnetz", + "full_name": "Eli Russell Linnetz", + "nationality": "American", + "birth_year": 1990, + "website": "https://erl.store", + "biography": "California designer, photographer, filmmaker, and artist Eli Russell Linnetz founded ERL in Venice Beach. His work turns Southern California archetypes—skaters, surfers, prom, Hollywood fantasy, and handcraft—into emotionally heightened fashion images and garments. In 2022 he guest-designed Dior Men's Spring 2023 collection with Kim Jones." + }, + { + "key": "grace-wales-bonner", + "full_name": "Grace Wales Bonner", + "nationality": "British-Jamaican", + "birth_year": null, + "website": "https://walesbonner.com", + "biography": "Founder of Wales Bonner, a label exploring European heritage and Afro-Atlantic cultural traditions." + }, + { + "key": "issey-miyake", + "full_name": "Issey Miyake", + "nationality": "Japanese", + "birth_year": 1938, + "website": "https://www.isseymiyake.com", + "biography": "Japanese designer Issey Miyake founded the Miyake Design Studio in 1970 and built a practice around the relationship between cloth, technology, movement, and everyday life. Rather than treating fashion as surface decoration, he pursued new systems of making—from a single piece of cloth to garment pleating after construction. This profile focuses on work created during Miyake's own design tenure, keeping later collections by Naoki Takizawa, Dai Fujiwara, Yoshiyuki Miyamae, and Satoshi Kondo distinct." + }, + { + "key": "jil-sander", + "full_name": "Jil Sander", + "nationality": "German", + "birth_year": 1943, + "website": "https://www.jilsander.com", + "biography": "German designer Jil Sander established her label in Hamburg in 1968 and became one of modern fashion's defining minimalists. Her precise tailoring, luxurious textiles, controlled color, and refusal of ornament reshaped professional dress in the 1980s and 1990s. Sander left and returned to her namesake house several times; this profile attributes only collections from her own creative tenures rather than later work by Raf Simons, Luke and Lucie Meier, or Simone Bellotti." + }, + { + "key": "john-elliott", + "full_name": "John Elliott", + "nationality": "American", + "birth_year": null, + "website": "https://www.johnelliott.com", + "biography": "California-born, Los Angeles-based designer John Elliott founded his namesake label in 2012. Grounded in skate culture, basketball, travel, and intensive fabric development, his work elevates familiar American sportswear through engineered materials, layered proportions, and exacting construction. Elliott debuted on the New York runway for Fall 2015 and has extended the label through womenswear and collaborations with Nike, Converse, Gap, and other performance and streetwear partners." + }, + { + "key": "john-galliano", + "full_name": "John Galliano", + "nationality": "British", + "birth_year": 1960, + "website": null, + "biography": "British fashion designer born in Gibraltar whose career includes his namesake label and creative leadership at Givenchy, Christian Dior, and Maison Margiela. His work is known for narrative-driven collections, historical research, technical cutting, and theatrical presentation." + }, + { + "key": "jonathan-anderson", + "full_name": "Jonathan Anderson", + "nationality": "Northern Irish", + "birth_year": null, + "website": "https://jwanderson.com", + "biography": "Founder of JW Anderson whose career includes creative leadership at Loewe and Dior." + }, + { + "key": "jun-takahashi", + "full_name": "Jun Takahashi", + "nationality": "Japanese", + "birth_year": 1969, + "website": "https://undercoverism.com", + "biography": "Japanese designer Jun Takahashi founded Undercover in 1990 while studying at Bunka Fashion College. Emerging from Harajuku's Ura-Harajuku scene, he fused punk, street culture, fine construction, music, cinema, and emotional storytelling into a practice he describes through the phrase 'We make noise, not clothes.' His work moves between cult graphic garments and highly poetic Paris presentations." + }, + { + "key": "junya-watanabe", + "full_name": "Junya Watanabe", + "nationality": "Japanese", + "birth_year": 1961, + "website": null, + "biography": "Designer who began his career at Comme des Garçons and launched his namesake line within the house." + }, + { + "key": "kim-jones", + "full_name": "Kim Jones", + "nationality": "British", + "birth_year": 1973, + "website": "https://www.kimjonesstudio.com", + "biography": "British designer Kim Jones has connected luxury fashion, travel, art collecting, and street culture across his namesake label, Dunhill, Louis Vuitton menswear, Dior Men, and Fendi womenswear and couture. His collaborations—including Supreme at Louis Vuitton and artists at Dior—helped normalize dialogue between heritage houses and contemporary creative communities." + }, + { + "key": "lee-alexander-mcqueen", + "full_name": "Lee Alexander McQueen", + "nationality": "British", + "birth_year": null, + "website": "https://www.alexandermcqueen.com", + "biography": "Founder of the McQueen house, known for innovative tailoring and theatrical presentations." + }, + { + "key": "marc-jacobs", + "full_name": "Marc Jacobs", + "nationality": "American", + "birth_year": 1963, + "website": "https://www.marcjacobs.com", + "biography": "American designer Marc Jacobs built his career by bringing subculture and historical fashion into luxurious, emotionally direct collections. His 1992 grunge collection for Perry Ellis became a defining rejection of polished convention. He founded his namesake line and served as Louis Vuitton artistic director from 1997 to 2013, establishing its ready-to-wear identity and artist collaborations." + }, + { + "key": "marine-serre", + "full_name": "Marine Serre", + "nationality": "French", + "birth_year": 1991, + "website": "https://www.marineserre.com", + "biography": "French designer Marine Serre founded her label in 2017 after winning the LVMH Prize. Her crescent-moon second-skin garments, regenerated materials, and hybrid sportswear established a language she calls Futurewear. Sustainability is structural to her practice: discarded household textiles and existing garments become luxury clothing rather than decorative gestures." + }, + { + "key": "martin-margiela", + "full_name": "Martin Margiela", + "nationality": "Belgian", + "birth_year": 1957, + "website": null, + "biography": "Belgian designer Martin Margiela co-founded Maison Martin Margiela with Jenny Meirens in 1988 after working with Jean Paul Gaultier. Through anonymity, collective authorship, exposed construction, replica garments, radical reuse, unusual scale, and the Tabi boot, he changed how fashion understands originality and value. He left his namesake house in 2009; this profile contains only work from his own tenure." + }, + { + "key": "martine-rose", + "full_name": "Martine Rose", + "nationality": "British-Jamaican", + "birth_year": 1980, + "website": "https://martine-rose.com", + "biography": "British-Jamaican designer Martine Rose founded her London label in 2007. Her work transforms football culture, rave, reggae, office wear, and masculine archetypes through skewed proportions and intimately chosen locations. Rose has also consulted for Balenciaga menswear and repeatedly reshaped the language of contemporary menswear from an independent position." + }, + { + "key": "matthew-m-williams", + "full_name": "Matthew M. Williams", + "nationality": "American", + "birth_year": 1985, + "website": "https://alyxstudio.com", + "biography": "American designer Matthew M. Williams founded ALYX—later 1017 ALYX 9SM—in 2015 after work spanning music, performance, and creative direction. His vocabulary joins industrial hardware, utility, subculture, and technical fabrication. Williams served as Givenchy creative director from 2020 through 2023 while continuing his independent label." + }, + { + "key": "matthieu-blazy", + "full_name": "Matthieu Blazy", + "nationality": "French-Belgian", + "birth_year": 1984, + "website": "https://www.chanel.com", + "biography": "French-Belgian designer Matthieu Blazy worked at Raf Simons, Maison Margiela, Céline, Calvin Klein, and Bottega Veneta before becoming Bottega's creative director in 2021. His material illusions and emphasis on movement made craft feel immediate rather than precious. He became artistic director of Chanel fashion activities in 2025, presenting his first ready-to-wear collection for Spring 2026." + }, + { + "key": "miuccia-prada", + "full_name": "Miuccia Prada", + "nationality": "Italian", + "birth_year": null, + "website": null, + "biography": "Designer and creative director of Prada and Miu Miu." + }, + { + "key": "olivier-rousteing", + "full_name": "Olivier Rousteing", + "nationality": "French", + "birth_year": 1985, + "website": "https://www.balmain.com", + "biography": "French designer Olivier Rousteing served as creative director of Balmain from 2011 to 2025. Appointed at 25, he amplified the house's structured glamour through dense embellishment, sharp shoulders, body-conscious silhouettes, and a digitally fluent vision of celebrity and community known as the Balmain Army. His work also brought his mixed-race identity, adoption story, and search for his African heritage into the narrative of a historic Paris house." + }, + { + "key": "pharrell-williams", + "full_name": "Pharrell Williams", + "nationality": "American", + "birth_year": 1973, + "website": "https://www.louisvuitton.com", + "biography": "American musician, producer, entrepreneur, and designer Pharrell Williams co-founded Billionaire Boys Club and Icecream with Nigo in 2003, bringing music, skateboarding, and Japanese streetwear production into a global lifestyle project. A longtime fashion collaborator, he became Louis Vuitton men's creative director in 2023, using spectacle, community, tailoring, and the house's travel codes to define his tenure." + }, + { + "key": "pierpaolo-piccioli", + "full_name": "Pierpaolo Piccioli", + "nationality": "Italian", + "birth_year": 1967, + "website": "https://www.balenciaga.com", + "biography": "Italian designer Pierpaolo Piccioli joined Valentino in 1999, led accessories with Maria Grazia Chiuri, and became sole creative director in 2016. His couture practice joined saturated color, emotional casting, and historical technique with a broader vision of beauty. After leaving Valentino in 2024, he became creative director of Balenciaga and debuted for Spring 2026." + }, + { + "key": "raf-simons", + "full_name": "Raf Simons", + "nationality": "Belgian", + "birth_year": 1968, + "website": "https://rafsimons.com", + "biography": "Belgian fashion designer whose career includes his namesake label and creative leadership roles at Jil Sander, Dior, Calvin Klein, and Prada." + }, + { + "key": "raul-lopez", + "full_name": "Raul Lopez", + "nationality": "Dominican-American", + "birth_year": null, + "website": "https://luar.world", + "biography": "Brooklyn-born Dominican-American designer Raul Lopez is the founder and creative director of Luar. A co-founder of Hood By Air, Lopez launched Luar in 2011 to tell a more personal story shaped by New York's queer underground, his Dominican heritage, family, and the style languages of the city. After periods of hiatus, he returned to New York Fashion Week in 2021 with a sharpened approach to tailoring and accessories, including the instantly recognizable Ana bag. His work turns neighborhood archetypes, glamour, gender performance, and immigrant aspiration into assertive American fashion." + }, + { + "key": "rei-kawakubo", + "full_name": "Rei Kawakubo", + "nationality": "Japanese", + "birth_year": null, + "website": null, + "biography": "Designer and founder of Comme des Garçons." + }, + { + "key": "rick-owens", + "full_name": "Rick Owens", + "nationality": "American", + "birth_year": 1962, + "website": "https://www.rickowens.eu", + "biography": "California-born designer who founded his independent namesake label in 1994 and later established it in Paris." + }, + { + "key": "sarah-burton", + "full_name": "Sarah Burton", + "nationality": "British", + "birth_year": null, + "website": null, + "biography": "Fashion designer whose career includes work for Alexander McQueen and Givenchy." + }, + { + "key": "shayne-oliver", + "full_name": "Shayne Oliver", + "nationality": "American", + "birth_year": 1988, + "website": "https://shayneoliver.com", + "biography": "American designer, creative director, and musician whose work across Hood By Air, Helmut Lang, Diesel, Longchamp, Colmar A.G.E., his eponymous practice, and Anonymous Club has reshaped the relationship between luxury fashion, streetwear, queer nightlife, music, performance, gender, and collective authorship." + }, + { + "key": "telfar-clemens", + "full_name": "Telfar Clemens", + "nationality": "Liberian-American", + "birth_year": 1985, + "website": "https://telfar.net", + "biography": "Liberian-American designer Telfar Clemens founded his eponymous New York label in 2005, building a radically inclusive, unisex wardrobe around familiar American clothing. Across runway collections, performance-led presentations, democratic accessories, uniforms, sportswear, and collaborations, Telfar has made accessibility and community central to luxury fashion. His practice encompasses the long-running TELFAR main line, the Shopping Bag, White Castle uniforms and capsules, Liberia's Olympic uniforms, and projects with UGG, Converse, and Moose Knuckles." + }, + { + "key": "thom-browne", + "full_name": "Thom Browne", + "nationality": "American", + "birth_year": 1965, + "website": "https://www.thombrowne.com", + "biography": "American designer Thom Browne began with five grey suits and a by-appointment New York shop, transforming the mid-century business uniform through cropped proportions and exacting construction. His practice expanded into womenswear and theatrical runway narratives populated by athletes, students, office workers, animals, and dream figures. Browne has repeatedly used the grey suit as both disciplined system and limitless storytelling device." + }, + { + "key": "tom-ford", + "full_name": "Tom Ford", + "nationality": "American", + "birth_year": 1961, + "website": "https://www.tomfordfashion.com", + "biography": "American designer and filmmaker Tom Ford transformed Gucci in the 1990s through a precise vocabulary of erotic glamour, then directed Yves Saint Laurent Rive Gauche while overseeing the Gucci Group. He founded his namesake house in 2005, extending his vision across menswear, womenswear, beauty, eyewear, and film. This profile attributes only collections designed during Ford's own tenures, separating his authorship from the houses that continued after him." + }, + { + "key": "virgil-abloh", + "full_name": "Virgil Abloh", + "nationality": "American", + "birth_year": null, + "website": null, + "biography": "Designer and founder of Off-White whose career includes creative leadership at Louis Vuitton." + }, + { + "key": "vivienne-westwood", + "full_name": "Vivienne Westwood", + "nationality": "British", + "birth_year": 1941, + "website": "https://www.viviennewestwood.com", + "biography": "British designer whose work helped bring punk and new-wave style into fashion before expanding into historically informed tailoring, corsetry, environmental activism, and an influential global house." + }, + { + "key": "walter-van-beirendonck", + "full_name": "Walter Van Beirendonck", + "nationality": "Belgian", + "birth_year": 1957, + "website": "https://www.waltervanbeirendonck.com", + "biography": "Belgian designer and Antwerp Six member Walter Van Beirendonck has built an independent practice around explosive color, graphic symbolism, queer identity, political protest, and radically imaginative menswear. Alongside his namesake work, his 1990s W.&L.T. project brought cyberculture, rave energy, and mass-media experimentation into fashion." + }, + { + "key": "willy-chavarria", + "full_name": "Willy Chavarria", + "nationality": "American", + "birth_year": null, + "website": "https://www.willychavarria.com", + "biography": "American designer Willy Chavarria builds fashion around dignity, emotion, and the visibility of communities often excluded from luxury imagery. Drawing from his Mexican-American upbringing in California, Chicano style, queer culture, workwear, religion, and political struggle, he combines monumental tailoring and sportswear with deeply human casting. He launched his namesake collection in 2015 and has expanded its message from New York to Paris." + }, + { + "key": "ye-kanye-west", + "full_name": "Ye (Kanye West)", + "nationality": "American", + "birth_year": 1977, + "website": null, + "biography": "American designer, artist, and musician who founded Yeezy. His fashion work includes independent collections and former collaborations with Nike, Adidas, and Gap." + }, + { + "key": "yohji-yamamoto", + "full_name": "Yohji Yamamoto", + "nationality": "Japanese", + "birth_year": 1943, + "website": "https://www.yohjiyamamoto.co.jp", + "biography": "Japanese designer Yohji Yamamoto established his company in 1972 and presented in Paris in 1981. His work radically challenged Western ideals of glamour through black, asymmetry, generous volume, weathered textiles, and an insistence on space between garment and body. Across Yohji Yamamoto, Y's, and the Adidas partnership Y-3, he has sustained a poetic and rebellious approach to tailoring, movement, gender, and time." + }, + { + "key": "yves-saint-laurent", + "full_name": "Yves Saint Laurent", + "nationality": "French", + "birth_year": 1936, + "website": "https://www.ysl.com", + "biography": "French couturier Yves Saint Laurent succeeded Christian Dior at age 21 before founding his own house with Pierre Bergé in 1961. He transformed twentieth-century dress through the tuxedo, safari jacket, transparent blouse, trouser suit, and references spanning modern art and global cultural history. His Rive Gauche line made designer ready-to-wear central to modern fashion." + } + ], + "collections": [ + { + "key": "alessandro-michele-gucci-fall-winter-2015", + "designer_key": "alessandro-michele", + "label": "Gucci", + "name": null, + "season": "Fall/Winter", + "release_year": 2015, + "status": "archived", + "piece_count": null, + "description": "Michele’s womenswear debut replaced glossy jet-set sexuality with romantic thrift-store eclecticism, gender ambiguity, and historical layering.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2015-ready-to-wear/gucci", + "youtube_video_id": null + }, + { + "key": "alessandro-michele-gucci-fall-winter-2018", + "designer_key": "alessandro-michele", + "label": "Gucci", + "name": "Cyborg", + "season": "Fall/Winter", + "release_year": 2018, + "status": "archived", + "piece_count": null, + "description": "A clinical operating-room set framed replica heads, hybrid identities, and dense cross-cultural references as a theory of self-construction.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2018-ready-to-wear/gucci", + "youtube_video_id": null + }, + { + "key": "alessandro-michele-gucci-spring-summer-2022", + "designer_key": "alessandro-michele", + "label": "Gucci", + "name": "Love Parade", + "season": "Spring/Summer", + "release_year": 2022, + "status": "archived", + "piece_count": null, + "description": "Hollywood Boulevard became a runway for Michele’s cinema-inflected cast of tailoring, erotic glamour, and eccentric archetypes.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2022-ready-to-wear/gucci", + "youtube_video_id": null + }, + { + "key": "alessandro-michele-valentino-resort-2025", + "designer_key": "alessandro-michele", + "label": "Valentino", + "name": "Avant les Débuts", + "season": "Resort", + "release_year": 2025, + "status": "archived", + "piece_count": null, + "description": "Michele’s surprise first Valentino collection used the house archive as an expansive Roman wardrobe of print, ornament, and cultivated eccentricity.", + "source_url": "https://www.vogue.com/fashion-shows/resort-2025-ready-to-wear/valentino", + "youtube_video_id": null + }, + { + "key": "alessandro-michele-valentino-spring-summer-2025", + "designer_key": "alessandro-michele", + "label": "Valentino", + "name": "Pavillon des Folies", + "season": "Spring/Summer", + "release_year": 2025, + "status": "archived", + "piece_count": null, + "description": "His first Valentino runway staged beauty as a fragile, excessive procession of brocade, lace, ruffles, turbans, and historical fragments.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2025-ready-to-wear/valentino", + "youtube_video_id": null + }, + { + "key": "alexander-wang-alexander-wang-spring-summer-2008", + "designer_key": "alexander-wang", + "label": "Alexander Wang", + "name": null, + "season": "Spring/Summer", + "release_year": 2008, + "status": "archived", + "piece_count": null, + "description": "Wang’s early runway codified model-off-duty dressing through slouchy knits, distressed basics, and downtown ease.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2008-ready-to-wear/alexander-wang", + "youtube_video_id": null + }, + { + "key": "alexander-wang-alexander-wang-fall-winter-2009", + "designer_key": "alexander-wang", + "label": "Alexander Wang", + "name": null, + "season": "Fall/Winter", + "release_year": 2009, + "status": "archived", + "piece_count": null, + "description": "Harder tailoring, leather, and nightlife energy expanded the label beyond casual layering into a complete urban wardrobe.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2009-ready-to-wear/alexander-wang", + "youtube_video_id": null + }, + { + "key": "alexander-wang-balenciaga-fall-winter-2013", + "designer_key": "alexander-wang", + "label": "Balenciaga", + "name": null, + "season": "Fall/Winter", + "release_year": 2013, + "status": "archived", + "piece_count": null, + "description": "Wang’s Balenciaga debut respected Cristóbal Balenciaga’s sculptural archive through monochrome curves, cracked surfaces, and technical precision.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2013-ready-to-wear/balenciaga", + "youtube_video_id": null + }, + { + "key": "alexander-wang-balenciaga-spring-summer-2016", + "designer_key": "alexander-wang", + "label": "Balenciaga", + "name": null, + "season": "Spring/Summer", + "release_year": 2016, + "status": "archived", + "piece_count": null, + "description": "His final Balenciaga collection softened the house in ivory lingerie forms, lace, and relaxed volume.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2016-ready-to-wear/balenciaga", + "youtube_video_id": null + }, + { + "key": "alexander-wang-alexander-wang-fall-winter-2018", + "designer_key": "alexander-wang", + "label": "Alexander Wang", + "name": null, + "season": "Fall/Winter", + "release_year": 2018, + "status": "archived", + "piece_count": null, + "description": "Corporate styling, executive archetypes, and sharp black silhouettes recast Wang’s downtown woman as a figure of workplace power.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2018-ready-to-wear/alexander-wang", + "youtube_video_id": null + }, + { + "key": "chitose-abe-sacai-fall-winter-ready-to-wear-2017", + "designer_key": "chitose-abe", + "label": "Sacai", + "name": "A Day in the Life", + "season": "Fall/Winter Ready-to-Wear", + "release_year": 2017, + "status": "archived", + "piece_count": 45, + "description": "Chitose Abe used the Beatles song A Day in the Life as a framework for dressing across the hours of a day. Pajamas, military MA-1 nylon, floral embroidery, skiwear, tweed, shirting, and evening details were hybridized to argue for wearing what you want, when you want.", + "source_url": "https://www.vogue.com/article/sacai-fall-2017-collection-inspirations", + "youtube_video_id": "OJXQhJjE4qQ" + }, + { + "key": "chitose-abe-sacai-spring-summer-ready-to-wear-2019", + "designer_key": "chitose-abe", + "label": "Sacai", + "name": "Free-form", + "season": "Spring/Summer Ready-to-Wear", + "release_year": 2019, + "status": "concept", + "piece_count": 52, + "description": "The collection marked a transition toward structural asymmetry, splitting classical archetypes side-to-side rather than front-to-back [index:1.1.1]. Chitose Abe intentionally left edges raw and items looking spontaneous or \"undone\"", + "source_url": null, + "youtube_video_id": "WFKlbKp5KX0" + }, + { + "key": "chitose-abe-sacai-fall-winter-ready-to-wear-2020", + "designer_key": "chitose-abe", + "label": "Sacai", + "name": "4D", + "season": "Fall/Winter Ready-to-Wear", + "release_year": 2020, + "status": "archived", + "piece_count": 46, + "description": "Built around movement through time, Abe fused tuxedos, floor-length dresses, knitwear, and space-suit references into unusually formal hybrid silhouettes. NASA imagery and graphics derived from Alexander Girard added an optimistic, interstellar register.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2020-ready-to-wear/sacai", + "youtube_video_id": "Obzo4m4ywtw" + }, + { + "key": "chitose-abe-sacai-spring-summer-ready-to-wear-2022", + "designer_key": "chitose-abe", + "label": "Sacai", + "name": null, + "season": "Spring/Summer Ready-to-Wear", + "release_year": 2022, + "status": "archived", + "piece_count": null, + "description": "Abe developed Sacai hybridization through a film presentation, combining familiar archetypes and contrasting materials while reflecting the altered rhythms and perspectives of the pandemic period.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2022-ready-to-wear/sacai", + "youtube_video_id": "clATdmulOSY" + }, + { + "key": "chitose-abe-sacai-spring-summer-ready-to-wear-2023", + "designer_key": "chitose-abe", + "label": "Sacai", + "name": null, + "season": "Spring/Summer Ready-to-Wear", + "release_year": 2023, + "status": "archived", + "piece_count": 41, + "description": "A study of uniforms and the freedom found within them, this collection dismantled and recombined tailoring, flight jackets, trench coats, and workwear. Zippers, displaced panels, and sculptural volumes turned recognizable garments into mutable Sacai hybrids.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2023-ready-to-wear/sacai", + "youtube_video_id": "nW2laq9XPdc" + }, + { + "key": "craig-green-craig-green-spring-summer-menswear-2013", + "designer_key": "craig-green", + "label": "Craig Green", + "name": null, + "season": "Spring/Summer Menswear", + "release_year": 2013, + "status": "archived", + "piece_count": null, + "description": "Green's solo debut sent barefoot figures carrying rough wooden structures and flags, establishing uniform, pilgrimage, and collective emotion as core concerns.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2013-menswear/craig-green", + "youtube_video_id": null + }, + { + "key": "craig-green-craig-green-fall-winter-menswear-2015", + "designer_key": "craig-green", + "label": "Craig Green", + "name": null, + "season": "Fall/Winter Menswear", + "release_year": 2015, + "status": "archived", + "piece_count": null, + "description": "Quilted protection, ties, straps, and modular workwear balanced emotional exposure with the fantasy of clothing as shelter.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2015-menswear/craig-green", + "youtube_video_id": null + }, + { + "key": "craig-green-craig-green-fall-winter-menswear-2016", + "designer_key": "craig-green", + "label": "Craig Green", + "name": null, + "season": "Fall/Winter Menswear", + "release_year": 2016, + "status": "archived", + "piece_count": null, + "description": "Layered uniforms and defensive structures explored protection without sacrificing the practical worker jackets beneath the spectacle.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2016-menswear/craig-green", + "youtube_video_id": null + }, + { + "key": "craig-green-craig-green-spring-summer-menswear-2017", + "designer_key": "craig-green", + "label": "Craig Green", + "name": null, + "season": "Spring/Summer Menswear", + "release_year": 2017, + "status": "archived", + "piece_count": null, + "description": "Billowing cloth, trailing cords, and repeated procession turned simple garments into a moving meditation on freedom, restraint, and belonging.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2017-menswear/craig-green", + "youtube_video_id": null + }, + { + "key": "craig-green-craig-green-spring-summer-menswear-2019", + "designer_key": "craig-green", + "label": "Craig Green", + "name": null, + "season": "Spring/Summer Menswear", + "release_year": 2019, + "status": "archived", + "piece_count": null, + "description": "Shown in Florence's Boboli Gardens for Pitti Uomo, translucent structures, flags, and saturated color transformed the historic landscape into a ritual procession.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2019-menswear/craig-green", + "youtube_video_id": null + }, + { + "key": "craig-green-craig-green-fall-winter-menswear-2020", + "designer_key": "craig-green", + "label": "Craig Green", + "name": null, + "season": "Fall/Winter Menswear", + "release_year": 2020, + "status": "archived", + "piece_count": null, + "description": "Green's first Paris show packaged bodies in tubing, mesh, printed membranes, and protective constructions while grounding them with clear, wearable trousers and outerwear.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2020-menswear/craig-green", + "youtube_video_id": null + }, + { + "key": "craig-green-craig-green-spring-summer-menswear-2025", + "designer_key": "craig-green", + "label": "Craig Green", + "name": null, + "season": "Spring/Summer Menswear", + "release_year": 2025, + "status": "archived", + "piece_count": null, + "description": "Hand-pieced leather, biker archetypes, and childlike deconstruction treated clothing like a machine taken apart to discover how its emotion works.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2025-menswear/craig-green", + "youtube_video_id": null + }, + { + "key": "craig-green-craig-green-spring-summer-menswear-2026", + "designer_key": "craig-green", + "label": "Craig Green", + "name": null, + "season": "Spring/Summer Menswear", + "release_year": 2026, + "status": "archived", + "piece_count": null, + "description": "Beatles-era psychedelia, gardening, fringed textile forms, transformed parkas, and floral prints created a wistful meditation on youthful creative intensity.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2026-menswear/craig-green", + "youtube_video_id": null + }, + { + "key": "demna-gvasalia-vetements-fall-winter-ready-to-wear-2015", + "designer_key": "demna-gvasalia", + "label": "Vetements", + "name": null, + "season": "Fall/Winter Ready-to-Wear", + "release_year": 2015, + "status": "archived", + "piece_count": null, + "description": "The young collective recut familiar jeans, bombers, floral dresses, and tailoring into an anti-luxury wardrobe that rapidly reset the fashion conversation.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2015-ready-to-wear/vetements", + "youtube_video_id": null + }, + { + "key": "demna-gvasalia-balenciaga-fall-winter-ready-to-wear-2016", + "designer_key": "demna-gvasalia", + "label": "Balenciaga", + "name": "Debut", + "season": "Fall/Winter Ready-to-Wear", + "release_year": 2016, + "status": "archived", + "piece_count": null, + "description": "Demna's Balenciaga debut connected Cristóbal's architectural tailoring and forward posture to the streetwise urgency of his own generation.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2016-ready-to-wear/balenciaga", + "youtube_video_id": null + }, + { + "key": "demna-gvasalia-vetements-spring-summer-ready-to-wear-2016", + "designer_key": "demna-gvasalia", + "label": "Vetements", + "name": null, + "season": "Spring/Summer Ready-to-Wear", + "release_year": 2016, + "status": "archived", + "piece_count": null, + "description": "Shown inside a Chinese restaurant, the collection magnified ordinary uniforms and wardrobe staples through extreme proportion and subcultural casting.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2016-ready-to-wear/vetements", + "youtube_video_id": null + }, + { + "key": "demna-gvasalia-vetements-spring-summer-ready-to-wear-2017", + "designer_key": "demna-gvasalia", + "label": "Vetements", + "name": "Collaborations", + "season": "Spring/Summer Ready-to-Wear", + "release_year": 2017, + "status": "archived", + "piece_count": null, + "description": "A landmark couture-week show built entirely through collaborations, transforming commercial archetypes from Juicy Couture to Manolo Blahnik.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2017-ready-to-wear/vetements", + "youtube_video_id": null + }, + { + "key": "demna-gvasalia-balenciaga-fall-winter-ready-to-wear-2018", + "designer_key": "demna-gvasalia", + "label": "Balenciaga", + "name": null, + "season": "Fall/Winter Ready-to-Wear", + "release_year": 2018, + "status": "archived", + "piece_count": null, + "description": "A graffiti-lined digital tunnel framed immense tailoring, synthetic layers, and the increasingly dystopian scale of Demna's silhouettes.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2018-ready-to-wear/balenciaga", + "youtube_video_id": null + }, + { + "key": "demna-gvasalia-balenciaga-spring-summer-ready-to-wear-2018", + "designer_key": "demna-gvasalia", + "label": "Balenciaga", + "name": null, + "season": "Spring/Summer Ready-to-Wear", + "release_year": 2018, + "status": "archived", + "piece_count": null, + "description": "Corporate dressing, dad-core, layered outerwear, and platform Crocs collapsed distinctions between status, banality, and fashion desire.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2018-ready-to-wear/balenciaga", + "youtube_video_id": null + }, + { + "key": "demna-gvasalia-balenciaga-spring-summer-ready-to-wear-2020", + "designer_key": "demna-gvasalia", + "label": "Balenciaga", + "name": null, + "season": "Spring/Summer Ready-to-Wear", + "release_year": 2020, + "status": "archived", + "piece_count": null, + "description": "Political theater and power dressing met in a vast civic chamber, where exaggerated shoulders turned bureaucracy into a severe fashion spectacle.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2020-ready-to-wear/balenciaga", + "youtube_video_id": null + }, + { + "key": "demna-gvasalia-balenciaga-fall-winter-couture-2021", + "designer_key": "demna-gvasalia", + "label": "Balenciaga", + "name": "50th Couture Collection", + "season": "Fall/Winter Couture", + "release_year": 2021, + "status": "archived", + "piece_count": null, + "description": "Balenciaga returned to couture after 53 years as Demna joined his contemporary casting and austere tailoring to the house's historic mastery of volume.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2021-couture/balenciaga", + "youtube_video_id": null + }, + { + "key": "demna-gvasalia-balenciaga-fall-winter-ready-to-wear-2021", + "designer_key": "demna-gvasalia", + "label": "Balenciaga", + "name": "Afterworld: The Age of Tomorrow", + "season": "Fall/Winter Ready-to-Wear", + "release_year": 2021, + "status": "archived", + "piece_count": null, + "description": "An original video game carried players through a near-future wardrobe of medieval armor, corporate uniform, and post-collapse survival gear.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2021-ready-to-wear/balenciaga", + "youtube_video_id": null + }, + { + "key": "demna-gvasalia-balenciaga-fall-winter-ready-to-wear-2022", + "designer_key": "demna-gvasalia", + "label": "Balenciaga", + "name": "360° Show", + "season": "Fall/Winter Ready-to-Wear", + "release_year": 2022, + "status": "archived", + "piece_count": null, + "description": "Models struggled through a manufactured snowstorm in a deeply personal meditation on displacement, resilience, and climate anxiety.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2022-ready-to-wear/balenciaga", + "youtube_video_id": null + }, + { + "key": "demna-gvasalia-balenciaga-spring-summer-ready-to-wear-2022", + "designer_key": "demna-gvasalia", + "label": "Balenciaga", + "name": "The Lost Tape", + "season": "Spring/Summer Ready-to-Wear", + "release_year": 2022, + "status": "archived", + "piece_count": null, + "description": "A deliberately degraded VHS presentation revisited late-1990s and early-2000s codes through oversized tailoring, tracksuits, and recycled materials.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2022-ready-to-wear/balenciaga", + "youtube_video_id": null + }, + { + "key": "demna-gvasalia-balenciaga-spring-summer-2023", + "designer_key": "demna-gvasalia", + "label": "Balenciaga", + "name": null, + "season": "Spring/Summer", + "release_year": 2023, + "status": "archived", + "piece_count": null, + "description": "A Demna collection presented on a mud-covered runway in Paris.", + "source_url": null, + "youtube_video_id": "Yh_1K9s6UV0" + }, + { + "key": "demna-gvasalia-balenciaga-fall-winter-2024", + "designer_key": "demna-gvasalia", + "label": "Balenciaga", + "name": "Winter 24", + "season": "Fall/Winter", + "release_year": 2024, + "status": "archived", + "piece_count": null, + "description": "A Winter 2024 collection pairing Cristóbal Balenciaga-inspired eveningwear with faux fur, coordinated puffers, biker-derived accessories, and a runway of physical screens.", + "source_url": null, + "youtube_video_id": "Us5MCN-jDpo" + }, + { + "key": "dries-van-noten-dries-van-noten-fall-winter-ready-to-wear-2006", + "designer_key": "dries-van-noten", + "label": "Dries Van Noten", + "name": null, + "season": "Fall/Winter Ready-to-Wear", + "release_year": 2006, + "status": "archived", + "piece_count": null, + "description": "A gilded meditation on ornament and decay, staged on a runway covered in gold leaf.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2006-ready-to-wear/dries-van-noten", + "youtube_video_id": null + }, + { + "key": "dries-van-noten-dries-van-noten-spring-summer-ready-to-wear-2013", + "designer_key": "dries-van-noten", + "label": "Dries Van Noten", + "name": null, + "season": "Spring/Summer Ready-to-Wear", + "release_year": 2013, + "status": "archived", + "piece_count": null, + "description": "Van Noten reconciled grunge checks with botanical prints, sheer layers, and couture-like embellishment.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2013-ready-to-wear/dries-van-noten", + "youtube_video_id": null + }, + { + "key": "dries-van-noten-dries-van-noten-spring-summer-ready-to-wear-2015", + "designer_key": "dries-van-noten", + "label": "Dries Van Noten", + "name": null, + "season": "Spring/Summer Ready-to-Wear", + "release_year": 2015, + "status": "archived", + "piece_count": null, + "description": "A dreamlike study in languid dressing presented over a mossy woodland carpet.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2015-ready-to-wear/dries-van-noten", + "youtube_video_id": null + }, + { + "key": "dries-van-noten-dries-van-noten-spring-summer-menswear-2018", + "designer_key": "dries-van-noten", + "label": "Dries Van Noten", + "name": null, + "season": "Spring/Summer Menswear", + "release_year": 2018, + "status": "archived", + "piece_count": null, + "description": "A relaxed menswear proposition mixing workwear, robe-like layers, tailoring, and richly handled textiles.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2018-menswear/dries-van-noten", + "youtube_video_id": null + }, + { + "key": "dries-van-noten-dries-van-noten-fall-winter-menswear-2020", + "designer_key": "dries-van-noten", + "label": "Dries Van Noten", + "name": null, + "season": "Fall/Winter Menswear", + "release_year": 2020, + "status": "archived", + "piece_count": null, + "description": "Romantic menswear in saturated color, elongated tailoring, and tactile layers balanced polish with dishevelment.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2020-menswear/dries-van-noten", + "youtube_video_id": null + }, + { + "key": "dries-van-noten-dries-van-noten-fall-winter-ready-to-wear-2020", + "designer_key": "dries-van-noten", + "label": "Dries Van Noten", + "name": null, + "season": "Fall/Winter Ready-to-Wear", + "release_year": 2020, + "status": "archived", + "piece_count": null, + "description": "A nocturnal collision of glam rock, saturated color, animal pattern, and sharply controlled tailoring.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2020-ready-to-wear/dries-van-noten", + "youtube_video_id": null + }, + { + "key": "dries-van-noten-dries-van-noten-spring-summer-ready-to-wear-2020", + "designer_key": "dries-van-noten", + "label": "Dries Van Noten", + "name": "Christian Lacroix Collaboration", + "season": "Spring/Summer Ready-to-Wear", + "release_year": 2020, + "status": "archived", + "piece_count": null, + "description": "A jubilant collaboration with Christian Lacroix that fused Van Noten's pragmatism with couture exuberance.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2020-ready-to-wear/dries-van-noten", + "youtube_video_id": null + }, + { + "key": "dries-van-noten-dries-van-noten-spring-summer-2024", + "designer_key": "dries-van-noten", + "label": "Dries Van Noten", + "name": "Unfamiliar Familiar", + "season": "Spring/Summer", + "release_year": 2024, + "status": "archived", + "piece_count": 65, + "description": "A womenswear collection built on manipulated silhouettes and tensions between opposing ideas, reworking utility, tailoring, collegiate stripes, pearls, embroidery, and sportswear into deliberately unfamiliar combinations.", + "source_url": "https://www.driesvannoten.com/en-gb/pages/show-ss-24-women", + "youtube_video_id": "q8p59nZJyiE" + }, + { + "key": "dries-van-noten-dries-van-noten-spring-summer-menswear-2025", + "designer_key": "dries-van-noten", + "label": "Dries Van Noten", + "name": "Final Show", + "season": "Spring/Summer Menswear", + "release_year": 2025, + "status": "archived", + "piece_count": null, + "description": "Van Noten's final runway show brought four decades of color, textile experimentation, and graceful contradiction into one last personal statement.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2025-menswear/dries-van-noten", + "youtube_video_id": null + }, + { + "key": "eli-russell-linnetz-erl-spring-summer-menswear-2020", + "designer_key": "eli-russell-linnetz", + "label": "ERL", + "name": null, + "season": "Spring/Summer Menswear", + "release_year": 2020, + "status": "archived", + "piece_count": null, + "description": "An early Venice Beach proposition transformed sun-faded athletic wear, skate culture, and handmade nostalgia into a cinematic wardrobe.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2020-menswear/erl", + "youtube_video_id": null + }, + { + "key": "eli-russell-linnetz-erl-spring-summer-menswear-2022", + "designer_key": "eli-russell-linnetz", + "label": "ERL", + "name": null, + "season": "Spring/Summer Menswear", + "release_year": 2022, + "status": "archived", + "piece_count": null, + "description": "Quilting, prom fantasy, surf imagery, and saturated California color expanded Linnetz’s tender mythology of American youth.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2022-menswear/erl", + "youtube_video_id": null + }, + { + "key": "eli-russell-linnetz-erl-fall-winter-menswear-2023", + "designer_key": "eli-russell-linnetz", + "label": "ERL", + "name": null, + "season": "Fall/Winter Menswear", + "release_year": 2023, + "status": "archived", + "piece_count": null, + "description": "Layered Americana, exaggerated outerwear, and cinematic styling pushed the label’s characters from beach nostalgia toward stranger Hollywood fantasy.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2023-menswear/erl", + "youtube_video_id": null + }, + { + "key": "eli-russell-linnetz-dior-men-spring-summer-menswear-2023", + "designer_key": "eli-russell-linnetz", + "label": "Dior Men", + "name": "California Couture", + "season": "Spring/Summer Menswear", + "release_year": 2023, + "status": "archived", + "piece_count": null, + "description": "Guest-designed with Kim Jones in Venice Beach, the collection joined Dior savoir-faire to Linnetz’s waves, skate culture, quilting, and California memory.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2023-menswear/dior-men", + "youtube_video_id": null + }, + { + "key": "eli-russell-linnetz-erl-spring-summer-menswear-2025", + "designer_key": "eli-russell-linnetz", + "label": "ERL", + "name": null, + "season": "Spring/Summer Menswear", + "release_year": 2025, + "status": "archived", + "piece_count": null, + "description": "Linnetz continued to remix sports, handcraft, souvenir clothing, and adolescent fantasy through an intensely image-driven California lens.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2025-menswear/erl", + "youtube_video_id": null + }, + { + "key": "grace-wales-bonner-wales-bonner-spring-summer-menswear-2015", + "designer_key": "grace-wales-bonner", + "label": "Wales Bonner", + "name": "Ebonics", + "season": "Spring/Summer Menswear", + "release_year": 2015, + "status": "archived", + "piece_count": null, + "description": "Her graduate collection established a language of Black identity, European luxury, precise tailoring, and intimate adornment.", + "source_url": "https://walesbonner.com/pages/archive", + "youtube_video_id": null + }, + { + "key": "grace-wales-bonner-wales-bonner-spring-summer-menswear-2016", + "designer_key": "grace-wales-bonner", + "label": "Wales Bonner", + "name": "Malik", + "season": "Spring/Summer Menswear", + "release_year": 2016, + "status": "archived", + "piece_count": null, + "description": "A meditation on Black male representation that combined ceremonial elegance, sensuality, and exacting craft.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2016-menswear/wales-bonner", + "youtube_video_id": null + }, + { + "key": "grace-wales-bonner-wales-bonner-fall-winter-menswear-2017", + "designer_key": "grace-wales-bonner", + "label": "Wales Bonner", + "name": "Spirituals", + "season": "Fall/Winter Menswear", + "release_year": 2017, + "status": "archived", + "piece_count": null, + "description": "A soulful study of faith, migration, and Black transatlantic style rendered through refined menswear.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2017-menswear/wales-bonner", + "youtube_video_id": null + }, + { + "key": "grace-wales-bonner-wales-bonner-spring-summer-menswear-2017", + "designer_key": "grace-wales-bonner", + "label": "Wales Bonner", + "name": "Ezekiel", + "season": "Spring/Summer Menswear", + "release_year": 2017, + "status": "archived", + "piece_count": null, + "description": "Wales Bonner expanded her diasporic research through devotional imagery, tailoring, and richly symbolic embellishment.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2017-menswear/wales-bonner", + "youtube_video_id": null + }, + { + "key": "grace-wales-bonner-wales-bonner-spring-summer-menswear-2019", + "designer_key": "grace-wales-bonner", + "label": "Wales Bonner", + "name": "Ecstatic Recital", + "season": "Spring/Summer Menswear", + "release_year": 2019, + "status": "archived", + "piece_count": null, + "description": "A poetic collection informed by spirituality, literary research, and the elegance of diasporic self-fashioning.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2019-menswear/wales-bonner", + "youtube_video_id": null + }, + { + "key": "grace-wales-bonner-wales-bonner-fall-winter-menswear-2020", + "designer_key": "grace-wales-bonner", + "label": "Wales Bonner", + "name": "Lovers Rock", + "season": "Fall/Winter Menswear", + "release_year": 2020, + "status": "archived", + "piece_count": null, + "description": "The first chapter of a Caribbean trilogy explored 1970s London, lovers rock, and the exchange between Jamaican and British style.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2020-menswear/wales-bonner", + "youtube_video_id": null + }, + { + "key": "grace-wales-bonner-wales-bonner-spring-summer-menswear-2022", + "designer_key": "grace-wales-bonner", + "label": "Wales Bonner", + "name": "Black Sunlight", + "season": "Spring/Summer Menswear", + "release_year": 2022, + "status": "archived", + "piece_count": null, + "description": "A liberated response to West African studio portraiture, balancing playful self-representation with disciplined tailoring.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2022-menswear/wales-bonner", + "youtube_video_id": null + }, + { + "key": "grace-wales-bonner-wales-bonner-spring-summer-menswear-2023", + "designer_key": "grace-wales-bonner", + "label": "Wales Bonner", + "name": "Volta Jazz", + "season": "Spring/Summer Menswear", + "release_year": 2023, + "status": "archived", + "piece_count": null, + "description": "A collection shaped by Burkina Faso's musical and photographic culture, joining athletic ease to formal elegance.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2023-menswear/wales-bonner", + "youtube_video_id": null + }, + { + "key": "grace-wales-bonner-wales-bonner-spring-summer-2024", + "designer_key": "grace-wales-bonner", + "label": "Wales Bonner", + "name": null, + "season": "Spring/Summer", + "release_year": 2024, + "status": "released", + "piece_count": 34, + "description": "The Spring/Summer 2024 menswear collection was titled Marathon.", + "source_url": null, + "youtube_video_id": "akJxFSRW03U" + }, + { + "key": "grace-wales-bonner-wales-bonner-spring-summer-menswear-2025", + "designer_key": "grace-wales-bonner", + "label": "Wales Bonner", + "name": "Marathon", + "season": "Spring/Summer Menswear", + "release_year": 2025, + "status": "archived", + "piece_count": null, + "description": "Wales Bonner considered distance running as discipline, ritual, and a meeting point between athletic and ceremonial dress.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2025-menswear/wales-bonner", + "youtube_video_id": null + }, + { + "key": "issey-miyake-issey-miyake-spring-summer-1976", + "designer_key": "issey-miyake", + "label": "Issey Miyake", + "name": null, + "season": "Spring/Summer", + "release_year": 1976, + "status": "archived", + "piece_count": null, + "description": "Miyake's early presentations proposed clothing as mobile architecture, joining Japanese textile knowledge to an experimental international wardrobe.", + "source_url": "https://www.metmuseum.org/essays/miyake-kawakubo-and-yamamoto-japanese-fashion-in-the-twentieth-century", + "youtube_video_id": null + }, + { + "key": "issey-miyake-issey-miyake-spring-summer-1980", + "designer_key": "issey-miyake", + "label": "Issey Miyake", + "name": "A-POC Prototype", + "season": "Spring/Summer", + "release_year": 1980, + "status": "archived", + "piece_count": null, + "description": "Miyake's continuing 'A Piece of Cloth' research explored how flat material could generate adaptable volume around many different bodies.", + "source_url": "https://www.metmuseum.org/essays/miyake-kawakubo-and-yamamoto-japanese-fashion-in-the-twentieth-century", + "youtube_video_id": null + }, + { + "key": "issey-miyake-issey-miyake-spring-summer-1989", + "designer_key": "issey-miyake", + "label": "Issey Miyake", + "name": null, + "season": "Spring/Summer", + "release_year": 1989, + "status": "archived", + "piece_count": null, + "description": "Heat-set pleating experiments placed permanent movement into finished garments, laying the technical foundation for Pleats Please.", + "source_url": "https://www.moma.org/artists/6637", + "youtube_video_id": null + }, + { + "key": "issey-miyake-pleats-please-issey-miyake-spring-summer-1993", + "designer_key": "issey-miyake", + "label": "Pleats Please Issey Miyake", + "name": "Pleats Please", + "season": "Spring/Summer", + "release_year": 1993, + "status": "archived", + "piece_count": null, + "description": "The Pleats Please line made Miyake's garment-pleating innovation an accessible system: light, washable clothing engineered to move, fold, and travel.", + "source_url": "https://www.isseymiyake.com/en/brands/pleatsplease", + "youtube_video_id": null + }, + { + "key": "issey-miyake-issey-miyake-spring-summer-1995", + "designer_key": "issey-miyake", + "label": "Issey Miyake", + "name": null, + "season": "Spring/Summer", + "release_year": 1995, + "status": "archived", + "piece_count": null, + "description": "Sculptural pleats and elastic geometries demonstrated how industrial process could produce both visual transformation and practical freedom.", + "source_url": "https://www.vogue.com/fashion-shows/spring-1995-ready-to-wear/issey-miyake", + "youtube_video_id": null + }, + { + "key": "issey-miyake-issey-miyake-spring-summer-1998", + "designer_key": "issey-miyake", + "label": "Issey Miyake", + "name": "Guest Artist: Cai Guo-Qiang", + "season": "Spring/Summer", + "release_year": 1998, + "status": "archived", + "piece_count": null, + "description": "Gunpowder drawings by Cai Guo-Qiang marked garments as part of Miyake's Guest Artist series, making collaboration and controlled accident integral to the clothes.", + "source_url": "https://www.vogue.com/fashion-shows/spring-1998-ready-to-wear/issey-miyake", + "youtube_video_id": null + }, + { + "key": "issey-miyake-issey-miyake-fall-winter-1999", + "designer_key": "issey-miyake", + "label": "Issey Miyake", + "name": null, + "season": "Fall/Winter", + "release_year": 1999, + "status": "archived", + "piece_count": null, + "description": "One of Miyake's final seasonal collections before handing womenswear to Naoki Takizawa consolidated decades of research into pleating, geometric volume, and bodily movement.", + "source_url": "https://www.vogue.com/fashion-shows/fall-1999-ready-to-wear/issey-miyake", + "youtube_video_id": null + }, + { + "key": "issey-miyake-issey-miyake-spring-summer-1999", + "designer_key": "issey-miyake", + "label": "Issey Miyake", + "name": "A-POC", + "season": "Spring/Summer", + "release_year": 1999, + "status": "archived", + "piece_count": null, + "description": "A-POC—A Piece of Cloth—used computer-guided industrial knitting to produce continuous tubes from which wearers could cut finished garments, rethinking production and authorship.", + "source_url": "https://www.moma.org/collection/works/100300", + "youtube_video_id": null + }, + { + "key": "jil-sander-jil-sander-spring-summer-1992", + "designer_key": "jil-sander", + "label": "Jil Sander", + "name": null, + "season": "Spring/Summer", + "release_year": 1992, + "status": "archived", + "piece_count": null, + "description": "Pure lines, immaculate fabric, and restrained tailoring expressed Sander's proposition that professional authority and sensuality could coexist without ornament.", + "source_url": "https://www.vogue.com/fashion-shows/spring-1992-ready-to-wear/jil-sander", + "youtube_video_id": null + }, + { + "key": "jil-sander-jil-sander-fall-winter-1993", + "designer_key": "jil-sander", + "label": "Jil Sander", + "name": null, + "season": "Fall/Winter", + "release_year": 1993, + "status": "archived", + "piece_count": null, + "description": "Long coats, lean suits, and quiet material richness positioned minimalism as a technically demanding form of luxury rather than absence.", + "source_url": "https://www.vogue.com/fashion-shows/fall-1993-ready-to-wear/jil-sander", + "youtube_video_id": null + }, + { + "key": "jil-sander-jil-sander-spring-summer-1996", + "designer_key": "jil-sander", + "label": "Jil Sander", + "name": null, + "season": "Spring/Summer", + "release_year": 1996, + "status": "archived", + "piece_count": null, + "description": "Sander refined the modern wardrobe through pale color, controlled transparency, and tailoring whose apparent simplicity depended on exceptional cut and cloth.", + "source_url": "https://www.vogue.com/fashion-shows/spring-1996-ready-to-wear/jil-sander", + "youtube_video_id": null + }, + { + "key": "jil-sander-jil-sander-fall-winter-1997", + "designer_key": "jil-sander", + "label": "Jil Sander", + "name": null, + "season": "Fall/Winter", + "release_year": 1997, + "status": "archived", + "piece_count": null, + "description": "Austere silhouettes and sumptuous surfaces balanced discipline with tactility at the height of Sander's influence on 1990s dress.", + "source_url": "https://www.vogue.com/fashion-shows/fall-1997-ready-to-wear/jil-sander", + "youtube_video_id": null + }, + { + "key": "jil-sander-jil-sander-spring-summer-2000", + "designer_key": "jil-sander", + "label": "Jil Sander", + "name": null, + "season": "Spring/Summer", + "release_year": 2000, + "status": "archived", + "piece_count": null, + "description": "The designer's final collection before her first departure distilled the house into precise suiting, advanced textiles, and calm, lucid color.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2000-ready-to-wear/jil-sander", + "youtube_video_id": null + }, + { + "key": "jil-sander-jil-sander-spring-summer-2004", + "designer_key": "jil-sander", + "label": "Jil Sander", + "name": null, + "season": "Spring/Summer", + "release_year": 2004, + "status": "archived", + "piece_count": null, + "description": "Sander's first return to her house restored subtle proportion, fabric innovation, and the emotional force of restraint.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2004-ready-to-wear/jil-sander", + "youtube_video_id": null + }, + { + "key": "jil-sander-jil-sander-spring-summer-2013", + "designer_key": "jil-sander", + "label": "Jil Sander", + "name": null, + "season": "Spring/Summer", + "release_year": 2013, + "status": "archived", + "piece_count": null, + "description": "Her second return revisited the disciplined wardrobe with crisp volume and vivid blocks of color, proving minimalism could be emphatic rather than neutral.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2013-ready-to-wear/jil-sander", + "youtube_video_id": null + }, + { + "key": "jil-sander-jil-sander-spring-summer-2014", + "designer_key": "jil-sander", + "label": "Jil Sander", + "name": null, + "season": "Spring/Summer", + "release_year": 2014, + "status": "archived", + "piece_count": null, + "description": "Sander's final collection for her namesake house used monastic shapes, controlled geometry, and concentrated color as a quiet farewell.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2014-ready-to-wear/jil-sander", + "youtube_video_id": null + }, + { + "key": "john-elliott-john-elliott-fall-winter-menswear-2015", + "designer_key": "john-elliott", + "label": "John Elliott", + "name": null, + "season": "Fall/Winter Menswear", + "release_year": 2015, + "status": "archived", + "piece_count": null, + "description": "Elliott's debut runway translated layered hoodies, engineered knits, distressed denim, and elongated basics into a focused Los Angeles luxury system.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2015-menswear/john-elliot-co", + "youtube_video_id": null + }, + { + "key": "john-elliott-john-elliott-fall-winter-menswear-2016", + "designer_key": "john-elliott", + "label": "John Elliott", + "name": null, + "season": "Fall/Winter Menswear", + "release_year": 2016, + "status": "archived", + "piece_count": null, + "description": "Fabric development and military references expanded the label beyond foundational sportswear while preserving its precise, wearable layering.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2016-menswear/john-elliot-co", + "youtube_video_id": null + }, + { + "key": "john-elliott-john-elliott-spring-summer-menswear-2017", + "designer_key": "john-elliott", + "label": "John Elliott", + "name": null, + "season": "Spring/Summer Menswear", + "release_year": 2017, + "status": "archived", + "piece_count": null, + "description": "Sun-washed color, athletic pieces, and lightweight layers refined Elliott's intersection of California ease and globally sourced material research.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2017-menswear/john-elliot-co", + "youtube_video_id": null + }, + { + "key": "john-elliott-john-elliott-fall-winter-menswear-2018", + "designer_key": "john-elliott", + "label": "John Elliott", + "name": "Delirium", + "season": "Fall/Winter Menswear", + "release_year": 2018, + "status": "archived", + "piece_count": null, + "description": "A darker, psychologically charged collection placed distressed surfaces, enveloping layers, and technical outerwear against the label's athletic foundation.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2018-menswear/john-elliot-co", + "youtube_video_id": null + }, + { + "key": "john-elliott-john-elliott-spring-summer-menswear-2018", + "designer_key": "john-elliott", + "label": "John Elliott", + "name": "Field Manual", + "season": "Spring/Summer Menswear", + "release_year": 2018, + "status": "archived", + "piece_count": null, + "description": "Travel and military utility informed modular outerwear, washed fabrics, tactical details, and the season's expanded approach to complete dressing.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2018-menswear/john-elliot-co", + "youtube_video_id": null + }, + { + "key": "john-elliott-john-elliott-fall-winter-menswear-2019", + "designer_key": "john-elliott", + "label": "John Elliott", + "name": null, + "season": "Fall/Winter Menswear", + "release_year": 2019, + "status": "archived", + "piece_count": null, + "description": "Runway-scale layering brought Italian fabrication, American sportswear, and travel research together in the label's increasingly expansive wardrobe.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2019-menswear/john-elliot-co", + "youtube_video_id": null + }, + { + "key": "john-elliott-john-elliott-spring-summer-menswear-2023", + "designer_key": "john-elliott", + "label": "John Elliott", + "name": "Leap of Faith", + "season": "Spring/Summer Menswear", + "release_year": 2023, + "status": "archived", + "piece_count": null, + "description": "A return to the runway framed risk and renewal through relaxed tailoring, technical layers, basketball-informed proportions, and sun-faded California color.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2023-menswear/john-elliot-co", + "youtube_video_id": null + }, + { + "key": "john-elliott-john-elliott-fall-winter-menswear-2024", + "designer_key": "john-elliott", + "label": "John Elliott", + "name": null, + "season": "Fall/Winter Menswear", + "release_year": 2024, + "status": "archived", + "piece_count": null, + "description": "The label's mature vocabulary of engineered basics, denim, performance fabrics, and layered outerwear was presented as an adaptable contemporary uniform.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2024-menswear/john-elliot-co", + "youtube_video_id": null + }, + { + "key": "john-galliano-givenchy-fall-winter-couture-1996", + "designer_key": "john-galliano", + "label": "Givenchy", + "name": null, + "season": "Fall/Winter Couture", + "release_year": 1996, + "status": "archived", + "piece_count": null, + "description": "John Galliano’s final couture collection for Givenchy combined the house’s aristocratic codes with his theatrical historicism, romantic bias cutting, elaborate surface work, and a cast of defining 1990s models.", + "source_url": "https://www.vogue.com/fashion-shows/fall-1996-couture/givenchy", + "youtube_video_id": "zrXLlpu4YKU" + }, + { + "key": "john-galliano-christian-dior-spring-summer-couture-2004", + "designer_key": "john-galliano", + "label": "Christian Dior", + "name": "Egypt", + "season": "Spring/Summer Couture", + "release_year": 2004, + "status": "archived", + "piece_count": null, + "description": "Inspired by Galliano’s travels through Egypt, this gilded couture fantasia translated pharaohs, deities, hieroglyphs, tomb paintings, and mummification into an elongated Sphinx silhouette using gold leaf, lapis tones, lamé, coral beading, monumental jewelry, and extreme headdresses.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2004-couture/christian-dior", + "youtube_video_id": "Yqs-igIvtsg" + }, + { + "key": "john-galliano-christian-dior-fall-winter-couture-2007", + "designer_key": "john-galliano", + "label": "Christian Dior", + "name": "Dior 60th Anniversary", + "season": "Fall/Winter Couture", + "release_year": 2007, + "status": "archived", + "piece_count": null, + "description": "Presented at the Orangerie of the Palace of Versailles for Dior’s 60th anniversary, Galliano’s collection transformed references to major painters and fashion history into an opulent couture procession celebrating the house’s legacy.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2007-couture/christian-dior", + "youtube_video_id": "F9yiI1MojKQ" + }, + { + "key": "john-galliano-maison-margiela-spring-summer-couture-2024", + "designer_key": "john-galliano", + "label": "Maison Margiela", + "name": "Artisanal", + "season": "Spring/Summer Couture", + "release_year": 2024, + "status": "archived", + "piece_count": 44, + "description": "John Galliano’s final Artisanal collection for Maison Margiela transformed Brassaï-inspired nocturnal Paris into theatrical couture through extreme corsetry, decayed surfaces, bias cutting, character-driven movement, and Pat McGrath’s porcelain-like makeup.", + "source_url": "https://www.showstudio.com/cms/documents/2782/MM_PRESS_RELEASE_ARTISANAL_2024.pdf", + "youtube_video_id": "lmkjYQ1fkEM" + }, + { + "key": "jonathan-anderson-jw-anderson-fall-winter-menswear-pre-fall-2022", + "designer_key": "jonathan-anderson", + "label": "JW Anderson", + "name": "Parties That Never Were", + "season": "Fall/Winter Menswear + Pre-Fall", + "release_year": 2022, + "status": "archived", + "piece_count": 51, + "description": "A digital collection celebrating dressing as a mischievous act beyond barriers of gender and taste. Metallic surfaces, saturated color, cartoon imagery, elephant and pigeon motifs, playful bags, and clashing proportions turned memories of missed parties into an unabashed fantasy.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2022-ready-to-wear/j-w-anderson", + "youtube_video_id": "G2aZopq138s" + }, + { + "key": "jonathan-anderson-loewe-spring-summer-ready-to-wear-2022", + "designer_key": "jonathan-anderson", + "label": "Loewe", + "name": "A New Aesthetic", + "season": "Spring/Summer Ready-to-Wear", + "release_year": 2022, + "status": "archived", + "piece_count": null, + "description": "For Loewe’s return to the runway, Anderson called for a creative reset. Black column dresses erupted into metal-supported geometric volumes, while contorted draping, sculpted breastplates, surreal heels, and everyday objects pushed provocation, sensuality, and movement into a new visual language.", + "source_url": "https://www.loewe.com/int/en/stories-collection/ss22-women-runway.html", + "youtube_video_id": "YPxm91BZbLg" + }, + { + "key": "jonathan-anderson-loewe-spring-summer-ready-to-wear-2023", + "designer_key": "jonathan-anderson", + "label": "Loewe", + "name": "Nature as Artifice", + "season": "Spring/Summer Ready-to-Wear", + "release_year": 2023, + "status": "archived", + "piece_count": null, + "description": "Anderson examined nature that already resembles design through the poisonous anthurium flower. Molded floral bodices, fiberglass and metal structures, pixelated garments, split-arm leather dresses, and deliberately unreal surfaces tested the boundary between the physical body and the digital image.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2023-ready-to-wear/loewe", + "youtube_video_id": "Jdbw1WNkrq8" + }, + { + "key": "jonathan-anderson-jw-anderson-spring-summer-2024", + "designer_key": "jonathan-anderson", + "label": "JW Anderson", + "name": null, + "season": "Spring/Summer", + "release_year": 2024, + "status": "released", + "piece_count": null, + "description": "The collection reworked familiar wardrobe pieces with exaggerated proportions and unexpected materials.", + "source_url": null, + "youtube_video_id": "oYtZVDZWCes" + }, + { + "key": "jonathan-anderson-christian-dior-fall-winter-ready-to-wear-2026", + "designer_key": "jonathan-anderson", + "label": "Christian Dior", + "name": "Promenade", + "season": "Fall/Winter Ready-to-Wear", + "release_year": 2026, + "status": "released", + "piece_count": null, + "description": "Shown around a water-lily pond in the Tuileries, Anderson relaxed Dior’s structure into light, mobile clothes. A knitted Bar jacket, pleated-silk tailoring, Junon-derived patterns, balloon trousers, lace frock coats, denim, and raffia flowers framed dressing as a promenade through Parisian history.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2026-ready-to-wear/christian-dior", + "youtube_video_id": "8kfJf8Or5sk" + }, + { + "key": "jonathan-anderson-christian-dior-spring-summer-ready-to-wear-2026", + "designer_key": "jonathan-anderson", + "label": "Christian Dior", + "name": "Do You Dare Enter the House of Dior?", + "season": "Spring/Summer Ready-to-Wear", + "release_year": 2026, + "status": "released", + "piece_count": 75, + "description": "Anderson’s Dior womenswear debut placed the house archive in deliberate collision with his own instincts. Shrunken Bar jackets, winged Cigale-derived volumes, denim, capes, lace, tricorne hats, and princess motifs blurred decades while balancing Dior formality with everyday dressing.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2026-ready-to-wear/christian-dior", + "youtube_video_id": "CwmKr-wkj1M" + }, + { + "key": "jun-takahashi-undercover-fall-winter-2003", + "designer_key": "jun-takahashi", + "label": "Undercover", + "name": "Paper Doll", + "season": "Fall/Winter", + "release_year": 2003, + "status": "archived", + "piece_count": null, + "description": "Flat, cut-paper ideas became garments through trompe-l'oeil construction and displaced details, balancing childhood craft with unsettling precision.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2003-ready-to-wear/undercover", + "youtube_video_id": null + }, + { + "key": "jun-takahashi-undercover-spring-summer-2003", + "designer_key": "jun-takahashi", + "label": "Undercover", + "name": "SCAB", + "season": "Spring/Summer", + "release_year": 2003, + "status": "archived", + "piece_count": null, + "description": "A landmark Paris debut built from patched, distressed, and hand-worked garments that translated crust-punk codes into an obsessive couture-like system.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2003-ready-to-wear/undercover", + "youtube_video_id": null + }, + { + "key": "jun-takahashi-undercover-fall-winter-2004", + "designer_key": "jun-takahashi", + "label": "Undercover", + "name": "But Beautiful II", + "season": "Fall/Winter", + "release_year": 2004, + "status": "archived", + "piece_count": null, + "description": "Handmade-looking plush forms, Patti Smith references, and fragile decoration turned damage and imperfection into one of Takahashi's defining expressions of beauty.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2004-ready-to-wear/undercover", + "youtube_video_id": null + }, + { + "key": "jun-takahashi-undercover-fall-winter-2005", + "designer_key": "jun-takahashi", + "label": "Undercover", + "name": "Arts & Crafts", + "season": "Fall/Winter", + "release_year": 2005, + "status": "archived", + "piece_count": null, + "description": "Felt, embroidery, raw edges, and handcrafted assemblage proposed an intimate alternative to polished luxury while preserving Undercover's punk tension.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2005-ready-to-wear/undercover", + "youtube_video_id": null + }, + { + "key": "jun-takahashi-undercover-spring-summer-2016", + "designer_key": "jun-takahashi", + "label": "Undercover", + "name": "The Greatest", + "season": "Spring/Summer", + "release_year": 2016, + "status": "archived", + "piece_count": null, + "description": "A title drawn from the label's own archive framed a collection of layered references, graphic interventions, and familiar Undercover ideas reactivated rather than nostalgically repeated.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2016-ready-to-wear/undercover", + "youtube_video_id": null + }, + { + "key": "jun-takahashi-undercover-spring-summer-2018", + "designer_key": "jun-takahashi", + "label": "Undercover", + "name": "We Are Infinite", + "season": "Spring/Summer", + "release_year": 2018, + "status": "archived", + "piece_count": null, + "description": "A dual presentation with Takahiro Miyashita used adolescent archetypes, literary atmosphere, and intricate layering to imagine parallel tribes and identities.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2018-ready-to-wear/undercover", + "youtube_video_id": null + }, + { + "key": "jun-takahashi-undercover-spring-summer-menswear-2019", + "designer_key": "jun-takahashi", + "label": "Undercover", + "name": "The New Warriors", + "season": "Spring/Summer Menswear", + "release_year": 2019, + "status": "archived", + "piece_count": null, + "description": "Inspired by The Warriors, Takahashi organized menswear into optimistic fictional gangs, each with distinct styling, graphics, and subcultural codes.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2019-menswear/undercover", + "youtube_video_id": null + }, + { + "key": "jun-takahashi-undercover-fall-winter-2024", + "designer_key": "jun-takahashi", + "label": "Undercover", + "name": null, + "season": "Fall/Winter", + "release_year": 2024, + "status": "archived", + "piece_count": null, + "description": "Inspired by Wim Wenders's Perfect Days, the collection honored routine and ordinary life through domestic gestures, layered tailoring, and garments carrying scenes of daily existence.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2024-ready-to-wear/undercover", + "youtube_video_id": null + }, + { + "key": "junya-watanabe-junya-watanabe-comme-des-garcons-fall-winter-ready-to-wear-2000", + "designer_key": "junya-watanabe", + "label": "Junya Watanabe Comme des Garçons", + "name": "Techno Couture", + "season": "Fall/Winter Ready-to-Wear", + "release_year": 2000, + "status": "archived", + "piece_count": null, + "description": "Watanabe transformed hand-sewn polyester chiffon into enormous honeycomb ruffs and ethereal volumes that could collapse flat for storage. The collection fused historical couture technique, Rembrandt-era silhouettes, and space-age synthetic material into one of his defining statements.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2000-ready-to-wear/junya-watanabe", + "youtube_video_id": null + }, + { + "key": "junya-watanabe-junya-watanabe-comme-des-garcons-spring-summer-ready-to-wear-2000", + "designer_key": "junya-watanabe", + "label": "Junya Watanabe Comme des Garçons", + "name": "Function and Practicality", + "season": "Spring/Summer Ready-to-Wear", + "release_year": 2000, + "status": "archived", + "piece_count": null, + "description": "A landmark rain-soaked presentation that made material performance visible on the runway. Transformable dresses, waterproof skirts, attached wrap scarves, pleating, and futuristic headpieces joined advanced synthetic textiles to precise, functional pattern cutting.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2000-ready-to-wear/junya-watanabe", + "youtube_video_id": null + }, + { + "key": "junya-watanabe-junya-watanabe-comme-des-garcons-fall-winter-ready-to-wear-2003", + "designer_key": "junya-watanabe", + "label": "Junya Watanabe Comme des Garçons", + "name": "Classic Clothing, Interpreted", + "season": "Fall/Winter Ready-to-Wear", + "release_year": 2003, + "status": "archived", + "piece_count": 44, + "description": "Edwardian romance and classic tailoring were destabilized through raw hems, unraveling sleeves, rough tweeds, tartans, oversized bows, and punk-inflected Chanel references. Watanabe treated proper period clothing as material for reconstruction rather than nostalgia.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2003-ready-to-wear/junya-watanabe", + "youtube_video_id": "rxLcFhns9VU" + }, + { + "key": "junya-watanabe-junya-watanabe-comme-des-garcons-spring-summer-ready-to-wear-2003", + "designer_key": "junya-watanabe", + "label": "Junya Watanabe Comme des Garçons", + "name": "Parachute", + "season": "Spring/Summer Ready-to-Wear", + "release_year": 2003, + "status": "archived", + "piece_count": null, + "description": "Romantic floral dresses and cropped trousers were suspended and gathered with parachute webbing, straps, buckles, and integrated backpacks. Airy umbrella hats completed Watanabe’s improbable fusion of pastoral innocence, combat utility, and transformable construction.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2003-ready-to-wear/junya-watanabe", + "youtube_video_id": null + }, + { + "key": "junya-watanabe-junya-watanabe-comme-des-garcons-fall-winter-ready-to-wear-2006", + "designer_key": "junya-watanabe", + "label": "Junya Watanabe Comme des Garçons", + "name": "Army", + "season": "Fall/Winter Ready-to-Wear", + "release_year": 2006, + "status": "archived", + "piece_count": 44, + "description": "Models advanced like a battalion in army green as Watanabe rebuilt fatigues, camouflage, concert-shirt patchwork, lace, parkas, trenches, and tailcoats into an antiwar-inflected punk wardrobe. Electrical-tape masks, studs, and trailing straps sharpened its subversive force.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2006-ready-to-wear/junya-watanabe", + "youtube_video_id": "RK_DwhhlHo8" + }, + { + "key": "junya-watanabe-junya-watanabe-fall-winter-ready-to-wear-2023", + "designer_key": "junya-watanabe", + "label": "Junya Watanabe", + "name": "Kashmir", + "season": "Fall/Winter Ready-to-Wear", + "release_year": 2023, + "status": "archived", + "piece_count": 29, + "description": "Led Zeppelin’s Kashmir launched a dark pilgrimage of futuristic travelers. Rebuilt motorcycle jackets, technical strapping, carabiners, mesh, protective masks, studded boots, leather pleating, and abstract down-filled buffers blended exploration gear with dystopian romance.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2023-ready-to-wear/junya-watanabe", + "youtube_video_id": "k8Nq622YAMI" + }, + { + "key": "junya-watanabe-junya-watanabe-spring-summer-ready-to-wear-2024", + "designer_key": "junya-watanabe", + "label": "Junya Watanabe", + "name": "Creating Objects, Not Clothes", + "season": "Spring/Summer Ready-to-Wear", + "release_year": 2024, + "status": "archived", + "piece_count": 41, + "description": "Watanabe’s geometric pattern cutting produced wearable sculpture from jutting triangles, curved tubes, scuba neoprene, origami-folded biker jackets, fractal denim, and deconstructed bouclé. Extreme black objects gradually resolved into recognizable garments without surrendering their strangeness.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2024-ready-to-wear/junya-watanabe", + "youtube_video_id": "Kxpmpk8TLtE" + }, + { + "key": "junya-watanabe-junya-watanabe-man-spring-summer-2025", + "designer_key": "junya-watanabe", + "label": "Junya Watanabe MAN", + "name": null, + "season": "Spring/Summer", + "release_year": 2025, + "status": "archived", + "piece_count": null, + "description": "A menswear collection combining formalwear with a punk sensibility.", + "source_url": null, + "youtube_video_id": "vQCKQaweG3M" + }, + { + "key": "kim-jones-dunhill-spring-summer-menswear-2010", + "designer_key": "kim-jones", + "label": "Dunhill", + "name": null, + "season": "Spring/Summer Menswear", + "release_year": 2010, + "status": "archived", + "piece_count": null, + "description": "Jones modernized British luxury through travel-informed sportswear, refined outerwear, and an ease grounded in masculine utility.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2010-menswear/dunhill", + "youtube_video_id": null + }, + { + "key": "kim-jones-louis-vuitton-spring-summer-menswear-2012", + "designer_key": "kim-jones", + "label": "Louis Vuitton", + "name": null, + "season": "Spring/Summer Menswear", + "release_year": 2012, + "status": "archived", + "piece_count": null, + "description": "His Vuitton debut connected the house’s travel heritage to light tailoring, technical fabric, and a globally observant wardrobe.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2012-menswear/louis-vuitton", + "youtube_video_id": null + }, + { + "key": "kim-jones-louis-vuitton-x-supreme-fall-winter-menswear-2017", + "designer_key": "kim-jones", + "label": "Louis Vuitton x Supreme", + "name": "Louis Vuitton x Supreme", + "season": "Fall/Winter Menswear", + "release_year": 2017, + "status": "archived", + "piece_count": null, + "description": "The landmark Supreme collaboration collapsed a longstanding boundary between luxury heritage and New York skate culture.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2017-menswear/louis-vuitton", + "youtube_video_id": null + }, + { + "key": "kim-jones-dior-men-spring-summer-menswear-2019", + "designer_key": "kim-jones", + "label": "Dior Men", + "name": null, + "season": "Spring/Summer Menswear", + "release_year": 2019, + "status": "archived", + "piece_count": null, + "description": "Jones’s Dior debut placed a giant KAWS figure amid pale tailoring, couture-derived construction, floral surfaces, and relaxed menswear.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2019-menswear/dior-men", + "youtube_video_id": null + }, + { + "key": "kim-jones-fendi-spring-summer-couture-2021", + "designer_key": "kim-jones", + "label": "Fendi", + "name": null, + "season": "Spring/Summer Couture", + "release_year": 2021, + "status": "archived", + "piece_count": null, + "description": "Jones’s Fendi debut drew on Virginia Woolf’s Orlando and the Bloomsbury circle for a literary, gender-fluid couture procession.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2021-couture/fendi", + "youtube_video_id": null + }, + { + "key": "lee-alexander-mcqueen-alexander-mcqueen-fall-winter-ready-to-wear-1995", + "designer_key": "lee-alexander-mcqueen", + "label": "Alexander McQueen", + "name": "Highland Rape", + "season": "Fall/Winter Ready-to-Wear", + "release_year": 1995, + "status": "archived", + "piece_count": null, + "description": "McQueen confronted the historical violence inflicted on Scotland through torn tartan, lace, and radically lowered tailoring.", + "source_url": "https://www.vogue.com/fashion-shows/fall-1995-ready-to-wear/alexander-mcqueen", + "youtube_video_id": null + }, + { + "key": "lee-alexander-mcqueen-alexander-mcqueen-fall-winter-ready-to-wear-1996", + "designer_key": "lee-alexander-mcqueen", + "label": "Alexander McQueen", + "name": "Dante", + "season": "Fall/Winter Ready-to-Wear", + "release_year": 1996, + "status": "archived", + "piece_count": null, + "description": "A candlelit church presentation joined religious imagery, war photography, skeletal lace, and razor-sharp tailoring.", + "source_url": "https://www.vogue.com/fashion-shows/fall-1996-ready-to-wear/alexander-mcqueen", + "youtube_video_id": null + }, + { + "key": "lee-alexander-mcqueen-alexander-mcqueen-fall-winter-ready-to-wear-1997", + "designer_key": "lee-alexander-mcqueen", + "label": "Alexander McQueen", + "name": "It's a Jungle Out There", + "season": "Fall/Winter Ready-to-Wear", + "release_year": 1997, + "status": "archived", + "piece_count": null, + "description": "Predator-prey imagery, horned styling, animal skins, and ferocious tailoring framed fashion as survival.", + "source_url": "https://www.vogue.com/fashion-shows/fall-1997-ready-to-wear/alexander-mcqueen", + "youtube_video_id": null + }, + { + "key": "lee-alexander-mcqueen-alexander-mcqueen-spring-summer-ready-to-wear-1997", + "designer_key": "lee-alexander-mcqueen", + "label": "Alexander McQueen", + "name": "La Poupée", + "season": "Spring/Summer Ready-to-Wear", + "release_year": 1997, + "status": "archived", + "piece_count": null, + "description": "Inspired by Hans Bellmer's dolls, the show tested the boundaries between bodily restriction, distortion, and beauty.", + "source_url": "https://www.vogue.com/fashion-shows/spring-1997-ready-to-wear/alexander-mcqueen", + "youtube_video_id": null + }, + { + "key": "lee-alexander-mcqueen-alexander-mcqueen-fall-winter-ready-to-wear-1998", + "designer_key": "lee-alexander-mcqueen", + "label": "Alexander McQueen", + "name": "Joan", + "season": "Fall/Winter Ready-to-Wear", + "release_year": 1998, + "status": "archived", + "piece_count": null, + "description": "Joan of Arc inspired armor-like tailoring and a fiery finale that fused martyrdom with defiant female power.", + "source_url": "https://www.vogue.com/fashion-shows/fall-1998-ready-to-wear/alexander-mcqueen", + "youtube_video_id": null + }, + { + "key": "lee-alexander-mcqueen-alexander-mcqueen-spring-summer-1999", + "designer_key": "lee-alexander-mcqueen", + "label": "Alexander McQueen", + "name": "No. 13", + "season": "Spring/Summer", + "release_year": 1999, + "status": "archived", + "piece_count": null, + "description": "A landmark Lee Alexander McQueen collection known for its theatrical runway presentation.", + "source_url": null, + "youtube_video_id": "Qv8Hx3cWB74" + }, + { + "key": "lee-alexander-mcqueen-alexander-mcqueen-fall-winter-ready-to-wear-2001", + "designer_key": "lee-alexander-mcqueen", + "label": "Alexander McQueen", + "name": "What a Merry-Go-Round", + "season": "Fall/Winter Ready-to-Wear", + "release_year": 2001, + "status": "archived", + "piece_count": null, + "description": "A dark fairground staged military precision, distressed finery, and macabre spectacle around a carousel.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2001-ready-to-wear/alexander-mcqueen", + "youtube_video_id": null + }, + { + "key": "lee-alexander-mcqueen-alexander-mcqueen-spring-summer-ready-to-wear-2001", + "designer_key": "lee-alexander-mcqueen", + "label": "Alexander McQueen", + "name": "Voss", + "season": "Spring/Summer Ready-to-Wear", + "release_year": 2001, + "status": "archived", + "piece_count": null, + "description": "A mirrored psychiatric ward forced the audience to confront itself before revealing a glass box of moths at the finale.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2001-ready-to-wear/alexander-mcqueen", + "youtube_video_id": null + }, + { + "key": "lee-alexander-mcqueen-alexander-mcqueen-fall-winter-ready-to-wear-2006", + "designer_key": "lee-alexander-mcqueen", + "label": "Alexander McQueen", + "name": "The Widows of Culloden", + "season": "Fall/Winter Ready-to-Wear", + "release_year": 2006, + "status": "archived", + "piece_count": null, + "description": "McQueen revisited Scottish history with romantic tartans, antlered silhouettes, and a spectral Kate Moss hologram.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2006-ready-to-wear/alexander-mcqueen", + "youtube_video_id": null + }, + { + "key": "lee-alexander-mcqueen-alexander-mcqueen-fall-winter-ready-to-wear-2009", + "designer_key": "lee-alexander-mcqueen", + "label": "Alexander McQueen", + "name": "The Horn of Plenty", + "season": "Fall/Winter Ready-to-Wear", + "release_year": 2009, + "status": "archived", + "piece_count": null, + "description": "A severe satire of fashion excess transformed refuse, historical silhouettes, and McQueen's own archive into grandeur.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2009-ready-to-wear/alexander-mcqueen", + "youtube_video_id": null + }, + { + "key": "lee-alexander-mcqueen-alexander-mcqueen-spring-summer-ready-to-wear-2010", + "designer_key": "lee-alexander-mcqueen", + "label": "Alexander McQueen", + "name": "Plato's Atlantis", + "season": "Spring/Summer Ready-to-Wear", + "release_year": 2010, + "status": "archived", + "piece_count": null, + "description": "McQueen imagined humanity evolving beneath rising seas in a digitally printed, technologically staged final runway collection.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2010-ready-to-wear/alexander-mcqueen", + "youtube_video_id": "CVN4WUKIzjA" + }, + { + "key": "marc-jacobs-perry-ellis-spring-summer-1993", + "designer_key": "marc-jacobs", + "label": "Perry Ellis", + "name": "Grunge", + "season": "Spring/Summer", + "release_year": 1993, + "status": "archived", + "piece_count": null, + "description": "Jacobs translated thrifted flannel, floral dresses, and layered youth culture into luxury fashion, losing his Perry Ellis position but changing the decade.", + "source_url": "https://www.vogue.com/fashion-shows/spring-1993-ready-to-wear/perry-ellis", + "youtube_video_id": null + }, + { + "key": "marc-jacobs-marc-jacobs-spring-summer-2001", + "designer_key": "marc-jacobs", + "label": "Marc Jacobs", + "name": null, + "season": "Spring/Summer", + "release_year": 2001, + "status": "archived", + "piece_count": null, + "description": "Downtown eclecticism, vintage references, and precise styling demonstrated Jacobs’s talent for turning cultural mood into desirable character.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2001-ready-to-wear/marc-jacobs", + "youtube_video_id": null + }, + { + "key": "marc-jacobs-louis-vuitton-spring-summer-2008", + "designer_key": "marc-jacobs", + "label": "Louis Vuitton", + "name": null, + "season": "Spring/Summer", + "release_year": 2008, + "status": "archived", + "piece_count": null, + "description": "The Richard Prince collaboration combined nurse imagery, painterly monograms, and elaborate accessories in Jacobs’s art-driven Vuitton era.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2008-ready-to-wear/louis-vuitton", + "youtube_video_id": null + }, + { + "key": "marc-jacobs-louis-vuitton-spring-summer-2014", + "designer_key": "marc-jacobs", + "label": "Louis Vuitton", + "name": null, + "season": "Spring/Summer", + "release_year": 2014, + "status": "archived", + "piece_count": null, + "description": "Jacobs’s all-black farewell revisited escalators, fountains, elevators, and showgirl spectacle from his sixteen years defining Vuitton ready-to-wear.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2014-ready-to-wear/louis-vuitton", + "youtube_video_id": null + }, + { + "key": "marc-jacobs-marc-jacobs-fall-winter-2016", + "designer_key": "marc-jacobs", + "label": "Marc Jacobs", + "name": null, + "season": "Fall/Winter", + "release_year": 2016, + "status": "archived", + "piece_count": null, + "description": "Gothic scale, towering platforms, craft, and dramatic volume produced an imposing meditation on beauty and subculture.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2016-ready-to-wear/marc-jacobs", + "youtube_video_id": null + }, + { + "key": "marine-serre-marine-serre-fall-winter-2018", + "designer_key": "marine-serre", + "label": "Marine Serre", + "name": "Futurewear", + "season": "Fall/Winter", + "release_year": 2018, + "status": "archived", + "piece_count": null, + "description": "Following her LVMH Prize win, Serre joined crescent-moon bodysuits, protective sportswear, and regenerated materials into an urgent post-apocalyptic wardrobe.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2018-ready-to-wear/marine-serre", + "youtube_video_id": null + }, + { + "key": "marine-serre-marine-serre-spring-summer-2020", + "designer_key": "marine-serre", + "label": "Marine Serre", + "name": "Marée Noire", + "season": "Spring/Summer", + "release_year": 2020, + "status": "archived", + "piece_count": null, + "description": "Marée Noire imagined ecological crisis through oil-dark surfaces, masks, regenerated textiles, and resilient hybrid clothing.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2020-ready-to-wear/marine-serre", + "youtube_video_id": null + }, + { + "key": "marine-serre-marine-serre-fall-winter-2021", + "designer_key": "marine-serre", + "label": "Marine Serre", + "name": "Core", + "season": "Fall/Winter", + "release_year": 2021, + "status": "archived", + "piece_count": null, + "description": "A film-led collection centered families and communities wearing regenerated household textiles, tailoring, denim, and the moon motif.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2021-ready-to-wear/marine-serre", + "youtube_video_id": null + }, + { + "key": "marine-serre-marine-serre-spring-summer-2023", + "designer_key": "marine-serre", + "label": "Marine Serre", + "name": "State of Soul", + "season": "Spring/Summer", + "release_year": 2023, + "status": "archived", + "piece_count": null, + "description": "A public-facing presentation expanded regenerated couture, sportswear, and diverse casting into an argument for fashion as collective practice.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2023-ready-to-wear/marine-serre", + "youtube_video_id": null + }, + { + "key": "marine-serre-marine-serre-fall-winter-2025", + "designer_key": "marine-serre", + "label": "Marine Serre", + "name": null, + "season": "Fall/Winter", + "release_year": 2025, + "status": "archived", + "piece_count": null, + "description": "At the Monnaie de Paris, Serre infiltrated bourgeois archetypes with regenerated materials, feminist symbolism, and her own crescent currency.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2025-ready-to-wear/marine-serre", + "youtube_video_id": null + }, + { + "key": "martin-margiela-maison-martin-margiela-spring-summer-1989", + "designer_key": "martin-margiela", + "label": "Maison Martin Margiela", + "name": null, + "season": "Spring/Summer", + "release_year": 1989, + "status": "archived", + "piece_count": null, + "description": "The debut established Tabi boots, exposed linings, distressed surfaces, and collective anonymity in a raw Paris presentation.", + "source_url": "https://www.vogue.com/fashion-shows/spring-1989-ready-to-wear/maison-martin-margiela", + "youtube_video_id": null + }, + { + "key": "martin-margiela-maison-martin-margiela-spring-summer-1990", + "designer_key": "martin-margiela", + "label": "Maison Martin Margiela", + "name": null, + "season": "Spring/Summer", + "release_year": 1990, + "status": "archived", + "piece_count": null, + "description": "A legendary playground show in a working-class Paris neighborhood invited local children and dismantled the distance between fashion spectacle and ordinary life.", + "source_url": "https://www.vogue.com/fashion-shows/spring-1990-ready-to-wear/maison-martin-margiela", + "youtube_video_id": null + }, + { + "key": "martin-margiela-maison-martin-margiela-spring-summer-1997", + "designer_key": "martin-margiela", + "label": "Maison Martin Margiela", + "name": "Stockman", + "season": "Spring/Summer", + "release_year": 1997, + "status": "archived", + "piece_count": null, + "description": "Dress forms, basting, shoulder pads, and unfinished structures exposed the tools by which idealized fashion bodies are manufactured.", + "source_url": "https://www.vogue.com/fashion-shows/spring-1997-ready-to-wear/maison-martin-margiela", + "youtube_video_id": null + }, + { + "key": "martin-margiela-maison-martin-margiela-spring-summer-1999", + "designer_key": "martin-margiela", + "label": "Maison Martin Margiela", + "name": null, + "season": "Spring/Summer", + "release_year": 1999, + "status": "archived", + "piece_count": null, + "description": "Flat garments, extreme scale, and conceptual pattern cutting challenged the assumption that clothes must resolve conventionally around the body.", + "source_url": "https://www.vogue.com/fashion-shows/spring-1999-ready-to-wear/maison-martin-margiela", + "youtube_video_id": null + }, + { + "key": "martin-margiela-maison-martin-margiela-spring-summer-2009", + "designer_key": "martin-margiela", + "label": "Maison Martin Margiela", + "name": null, + "season": "Spring/Summer", + "release_year": 2009, + "status": "archived", + "piece_count": null, + "description": "The house’s twentieth-anniversary show revisited masks, trompe-l’oeil, wigs, repurposed objects, and anonymous collective performance near the end of Margiela’s tenure.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2009-ready-to-wear/maison-martin-margiela", + "youtube_video_id": null + }, + { + "key": "martine-rose-martine-rose-spring-summer-menswear-2018", + "designer_key": "martine-rose", + "label": "Martine Rose", + "name": null, + "season": "Spring/Summer Menswear", + "release_year": 2018, + "status": "archived", + "piece_count": null, + "description": "Rose distorted familiar football, club, and office archetypes through twisted shirting, broad trousers, and intensely specific casting.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2018-menswear/martine-rose", + "youtube_video_id": null + }, + { + "key": "martine-rose-martine-rose-fall-winter-menswear-2020", + "designer_key": "martine-rose", + "label": "Martine Rose", + "name": null, + "season": "Fall/Winter Menswear", + "release_year": 2020, + "status": "archived", + "piece_count": null, + "description": "A London presentation fused corporate clothing, subcultural swagger, and awkwardly persuasive proportion into a portrait of contemporary masculinity.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2020-menswear/martine-rose", + "youtube_video_id": null + }, + { + "key": "martine-rose-martine-rose-fall-winter-menswear-2023", + "designer_key": "martine-rose", + "label": "Martine Rose", + "name": null, + "season": "Fall/Winter Menswear", + "release_year": 2023, + "status": "archived", + "piece_count": null, + "description": "Domestic interiors and distorted everyday dressing explored privacy, exposure, and the peculiar glamour of ordinary masculine clothes.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2023-menswear/martine-rose", + "youtube_video_id": null + }, + { + "key": "martine-rose-martine-rose-spring-summer-menswear-2023", + "designer_key": "martine-rose", + "label": "Martine Rose", + "name": null, + "season": "Spring/Summer Menswear", + "release_year": 2023, + "status": "archived", + "piece_count": null, + "description": "Shown under the Vauxhall arches, compressed silhouettes, club energy, and community casting reasserted the label after its runway pause.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2023-menswear/martine-rose", + "youtube_video_id": null + }, + { + "key": "martine-rose-martine-rose-spring-summer-menswear-2025", + "designer_key": "martine-rose", + "label": "Martine Rose", + "name": null, + "season": "Spring/Summer Menswear", + "release_year": 2025, + "status": "archived", + "piece_count": null, + "description": "Character-led styling and deliberately unsettled proportions continued Rose’s study of how real people make clothing culturally legible.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2025-menswear/martine-rose", + "youtube_video_id": null + }, + { + "key": "matthew-m-williams-1017-alyx-9sm-spring-summer-menswear-2019", + "designer_key": "matthew-m-williams", + "label": "1017 ALYX 9SM", + "name": null, + "season": "Spring/Summer Menswear", + "release_year": 2019, + "status": "archived", + "piece_count": null, + "description": "Industrial buckles, technical fabrication, and severe utility expressed Williams’s fusion of subculture and engineered luxury.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2019-menswear/alyx", + "youtube_video_id": null + }, + { + "key": "matthew-m-williams-1017-alyx-9sm-fall-winter-menswear-2020", + "designer_key": "matthew-m-williams", + "label": "1017 ALYX 9SM", + "name": null, + "season": "Fall/Winter Menswear", + "release_year": 2020, + "status": "archived", + "piece_count": null, + "description": "Hardware-driven tailoring and protective outerwear refined the label’s controlled, urban system.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2020-menswear/alyx", + "youtube_video_id": null + }, + { + "key": "matthew-m-williams-givenchy-spring-summer-2021", + "designer_key": "matthew-m-williams", + "label": "Givenchy", + "name": null, + "season": "Spring/Summer", + "release_year": 2021, + "status": "archived", + "piece_count": null, + "description": "Williams’s Givenchy debut introduced sharp hardware, compressed silhouettes, and pragmatic luxury through a lookbook made during the pandemic.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2021-ready-to-wear/givenchy", + "youtube_video_id": null + }, + { + "key": "matthew-m-williams-givenchy-fall-winter-2022", + "designer_key": "matthew-m-williams", + "label": "Givenchy", + "name": null, + "season": "Fall/Winter", + "release_year": 2022, + "status": "archived", + "piece_count": null, + "description": "Layered denim, tailoring, and aggressive accessories pushed his dialogue between American street culture and Parisian house technique.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2022-ready-to-wear/givenchy", + "youtube_video_id": null + }, + { + "key": "matthew-m-williams-givenchy-spring-summer-2024", + "designer_key": "matthew-m-williams", + "label": "Givenchy", + "name": null, + "season": "Spring/Summer", + "release_year": 2024, + "status": "archived", + "piece_count": null, + "description": "Williams’s final Givenchy collection clarified his signatures in lean tailoring, technical outerwear, and metal-accented accessories.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2024-ready-to-wear/givenchy", + "youtube_video_id": null + }, + { + "key": "matthieu-blazy-bottega-veneta-fall-winter-2022", + "designer_key": "matthieu-blazy", + "label": "Bottega Veneta", + "name": null, + "season": "Fall/Winter", + "release_year": 2022, + "status": "archived", + "piece_count": null, + "description": "Blazy’s debut began with deceptively simple clothing—including leather engineered to look like denim—and centered craft in motion.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2022-ready-to-wear/bottega-veneta", + "youtube_video_id": null + }, + { + "key": "matthieu-blazy-bottega-veneta-spring-summer-2023", + "designer_key": "matthieu-blazy", + "label": "Bottega Veneta", + "name": null, + "season": "Spring/Summer", + "release_year": 2023, + "status": "archived", + "piece_count": null, + "description": "Everyday characters, fluid tailoring, and material illusion expanded his idea of the Italian wardrobe as a moving social panorama.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2023-ready-to-wear/bottega-veneta", + "youtube_video_id": null + }, + { + "key": "matthieu-blazy-bottega-veneta-spring-summer-2024", + "designer_key": "matthieu-blazy", + "label": "Bottega Veneta", + "name": null, + "season": "Spring/Summer", + "release_year": 2024, + "status": "archived", + "piece_count": null, + "description": "Travel, transformation, and extraordinary leather workmanship created clothing that balanced childlike imagination with adult precision.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2024-ready-to-wear/bottega-veneta", + "youtube_video_id": null + }, + { + "key": "matthieu-blazy-bottega-veneta-spring-summer-2025", + "designer_key": "matthieu-blazy", + "label": "Bottega Veneta", + "name": null, + "season": "Spring/Summer", + "release_year": 2025, + "status": "archived", + "piece_count": null, + "description": "Blazy’s final Bottega runway placed expressive characters around animal-shaped chairs, completing his trilogy about everyday wonder and craft.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2025-ready-to-wear/bottega-veneta", + "youtube_video_id": null + }, + { + "key": "matthieu-blazy-chanel-spring-summer-2026", + "designer_key": "matthieu-blazy", + "label": "Chanel", + "name": null, + "season": "Spring/Summer", + "release_year": 2026, + "status": "archived", + "piece_count": null, + "description": "Blazy’s Chanel debut reanimated house codes through movement, material experimentation, and a less fixed idea of the Chanel woman.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2026-ready-to-wear/chanel", + "youtube_video_id": null + }, + { + "key": "miuccia-prada-prada-fall-winter-ready-to-wear-1996", + "designer_key": "miuccia-prada", + "label": "Prada", + "name": null, + "season": "Fall/Winter Ready-to-Wear", + "release_year": 1996, + "status": "archived", + "piece_count": null, + "description": "A defining chapter of Prada's pretty-ugly revolution, using autumnal off-colors and deliberately awkward references to challenge conventional taste.", + "source_url": "https://www.vogue.com/fashion-shows/fall-1996-ready-to-wear/prada", + "youtube_video_id": null + }, + { + "key": "miuccia-prada-prada-spring-summer-ready-to-wear-2008", + "designer_key": "miuccia-prada", + "label": "Prada", + "name": null, + "season": "Spring/Summer Ready-to-Wear", + "release_year": 2008, + "status": "archived", + "piece_count": null, + "description": "Art Nouveau fairies, wood-nymph prints, curving knits, and grounded platform footwear expressed Miuccia Prada's search for a new creativity.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2008-ready-to-wear/prada", + "youtube_video_id": null + }, + { + "key": "miuccia-prada-miu-miu-fall-winter-ready-to-wear-2010", + "designer_key": "miuccia-prada", + "label": "Miu Miu", + "name": null, + "season": "Fall/Winter Ready-to-Wear", + "release_year": 2010, + "status": "archived", + "piece_count": null, + "description": "A romantic but provocative sixties silhouette combined high collars, rosettes, abbreviated skirts, and strategically exposed skin.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2010-ready-to-wear/miu-miu", + "youtube_video_id": null + }, + { + "key": "miuccia-prada-prada-fall-winter-ready-to-wear-2010", + "designer_key": "miuccia-prada", + "label": "Prada", + "name": null, + "season": "Fall/Winter Ready-to-Wear", + "release_year": 2010, + "status": "archived", + "piece_count": null, + "description": "Prada reconsidered femininity through emphatic proportions, knitwear, and a provocative focus on the bust and the body.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2010-ready-to-wear/prada", + "youtube_video_id": null + }, + { + "key": "miuccia-prada-miu-miu-pre-fall-2010", + "designer_key": "miuccia-prada", + "label": "Miu Miu", + "name": null, + "season": "Pre-Fall", + "release_year": 2010, + "status": "archived", + "piece_count": null, + "description": "Narrow plaid tailoring, tiny skirts, knit socks, fur, and locked buckles mixed sixties youthfulness with Prada's characteristically perverse edge.", + "source_url": "https://www.vogue.com/fashion-shows/pre-fall-2010/miu-miu", + "youtube_video_id": null + }, + { + "key": "miuccia-prada-prada-spring-summer-2012", + "designer_key": "miuccia-prada", + "label": "Prada", + "name": null, + "season": "Spring/Summer", + "release_year": 2012, + "status": "archived", + "piece_count": null, + "description": "A Miuccia Prada collection drawing on 1950s automobile imagery.", + "source_url": null, + "youtube_video_id": "JgaGXv1XnrA" + }, + { + "key": "miuccia-prada-prada-spring-summer-ready-to-wear-2014", + "designer_key": "miuccia-prada", + "label": "Prada", + "name": null, + "season": "Spring/Summer Ready-to-Wear", + "release_year": 2014, + "status": "archived", + "piece_count": null, + "description": "Monumental mural imagery, jeweled sportswear, and visible bras turned the runway into a forceful argument about women, art, and public space.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2014-ready-to-wear/prada", + "youtube_video_id": null + }, + { + "key": "miuccia-prada-prada-fall-winter-ready-to-wear-2015", + "designer_key": "miuccia-prada", + "label": "Prada", + "name": null, + "season": "Fall/Winter Ready-to-Wear", + "release_year": 2015, + "status": "archived", + "piece_count": null, + "description": "A synthetic, pastel vision of the future used double-faced jersey, abbreviated proportions, and deliberately uncanny sweetness.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2015-ready-to-wear/prada", + "youtube_video_id": null + }, + { + "key": "miuccia-prada-miu-miu-fall-winter-ready-to-wear-2016", + "designer_key": "miuccia-prada", + "label": "Miu Miu", + "name": null, + "season": "Fall/Winter Ready-to-Wear", + "release_year": 2016, + "status": "archived", + "piece_count": null, + "description": "Denim, military tailoring, tapestry, velvet, and eveningwear formed an eclectic meditation on nobility, scarcity, and dressing with what remains.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2016-ready-to-wear/miu-miu", + "youtube_video_id": null + }, + { + "key": "miuccia-prada-prada-fall-winter-ready-to-wear-2020", + "designer_key": "miuccia-prada", + "label": "Prada", + "name": null, + "season": "Fall/Winter Ready-to-Wear", + "release_year": 2020, + "status": "archived", + "piece_count": null, + "description": "Miuccia Prada's final solo womenswear show for the house examined strength, glamour, fringe, and the tension between protection and exposure.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2020-ready-to-wear/prada", + "youtube_video_id": null + }, + { + "key": "miuccia-prada-miu-miu-resort-2020", + "designer_key": "miuccia-prada", + "label": "Miu Miu", + "name": null, + "season": "Resort", + "release_year": 2020, + "status": "archived", + "piece_count": null, + "description": "Presented at a Paris racecourse, the collection played with conservatism through roomy shorts, elongated collars, platform shoes, glamour, and fun.", + "source_url": "https://www.vogue.com/fashion-shows/resort-2020/miu-miu", + "youtube_video_id": null + }, + { + "key": "miuccia-prada-miu-miu-spring-summer-ready-to-wear-2022", + "designer_key": "miuccia-prada", + "label": "Miu Miu", + "name": null, + "season": "Spring/Summer Ready-to-Wear", + "release_year": 2022, + "status": "archived", + "piece_count": null, + "description": "The viral collection cut corporate uniforms into raw-edged micro proportions, transforming familiar office clothes into a post-lockdown generational statement.", + "source_url": "https://www.miumiu.com/mc/en/miumiu-club/fashion-shows/ss22-fashion-show.html", + "youtube_video_id": null + }, + { + "key": "miuccia-prada-miu-miu-fall-winter-ready-to-wear-2023", + "designer_key": "miuccia-prada", + "label": "Miu Miu", + "name": null, + "season": "Fall/Winter Ready-to-Wear", + "release_year": 2023, + "status": "archived", + "piece_count": null, + "description": "An inquiry into looking and being looked at used cardigans, cabans, visible tights, briefs, and deliberately unsettled ideas of elegance.", + "source_url": "https://www.miumiu.com/us/en/miumiu-club/fashion-shows/fw23-fashion-show.html", + "youtube_video_id": null + }, + { + "key": "olivier-rousteing-balmain-spring-summer-2012", + "designer_key": "olivier-rousteing", + "label": "Balmain", + "name": null, + "season": "Spring/Summer", + "release_year": 2012, + "status": "archived", + "piece_count": null, + "description": "Rousteing's Balmain debut translated the house's military structure into opulent, hyper-fitted leather, gold embroidery, and Fabergé-like surface work.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2012-ready-to-wear/balmain", + "youtube_video_id": null + }, + { + "key": "olivier-rousteing-balmain-fall-winter-2014", + "designer_key": "olivier-rousteing", + "label": "Balmain", + "name": null, + "season": "Fall/Winter", + "release_year": 2014, + "status": "archived", + "piece_count": null, + "description": "Safari and utility references met graphic weaving, rope, and commanding shoulders as Rousteing broadened the public image of his Balmain Army.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2014-ready-to-wear/balmain", + "youtube_video_id": null + }, + { + "key": "olivier-rousteing-balmain-x-h-m-fall-winter-2015", + "designer_key": "olivier-rousteing", + "label": "Balmain x H&M", + "name": "Balmain x H&M", + "season": "Fall/Winter", + "release_year": 2015, + "status": "archived", + "piece_count": null, + "description": "A mass-market capsule translated Rousteing's embellished jackets, body-conscious silhouettes, and military glamour for a dramatically wider audience.", + "source_url": "https://www.vogue.com/article/balmain-hm-collaboration-olivier-rousteing", + "youtube_video_id": null + }, + { + "key": "olivier-rousteing-balmain-spring-summer-2017", + "designer_key": "olivier-rousteing", + "label": "Balmain", + "name": null, + "season": "Spring/Summer", + "release_year": 2017, + "status": "archived", + "piece_count": null, + "description": "Fluid draping, cutaway knitwear, safari palettes, and intricate evening surfaces loosened the armor of Rousteing's earlier Balmain vocabulary.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2017-ready-to-wear/balmain", + "youtube_video_id": null + }, + { + "key": "olivier-rousteing-balmain-spring-summer-2020", + "designer_key": "olivier-rousteing", + "label": "Balmain", + "name": null, + "season": "Spring/Summer", + "release_year": 2020, + "status": "archived", + "piece_count": null, + "description": "A celebration of confidence and pop-cultural scale combined saturated color, graphic tailoring, and the designer's increasingly personal public narrative.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2020-ready-to-wear/balmain", + "youtube_video_id": null + }, + { + "key": "olivier-rousteing-balmain-spring-summer-2022", + "designer_key": "olivier-rousteing", + "label": "Balmain", + "name": null, + "season": "Spring/Summer", + "release_year": 2022, + "status": "archived", + "piece_count": null, + "description": "Presented after Rousteing revealed his recovery from severe burns, the collection treated bandaging, protection, exposure, and healing through wrapped and armored silhouettes.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2022-ready-to-wear/balmain", + "youtube_video_id": null + }, + { + "key": "olivier-rousteing-balmain-fall-winter-2024", + "designer_key": "olivier-rousteing", + "label": "Balmain", + "name": null, + "season": "Fall/Winter", + "release_year": 2024, + "status": "archived", + "piece_count": null, + "description": "A love letter to Bordeaux and Rousteing's adoptive mother Lydia transformed vineyard grapes, gingham picnics, trench coats, and childhood memories into Balmain spectacle.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2024-ready-to-wear/balmain", + "youtube_video_id": null + }, + { + "key": "olivier-rousteing-balmain-spring-summer-2026", + "designer_key": "olivier-rousteing", + "label": "Balmain", + "name": null, + "season": "Spring/Summer", + "release_year": 2026, + "status": "archived", + "piece_count": null, + "description": "Rousteing's final runway chapter returned to the ballroom of his 2011 debut, replacing early rigidity with shells, wood, draped silk, and a softer idea of opulence.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2026-ready-to-wear/balmain", + "youtube_video_id": null + }, + { + "key": "pharrell-williams-billionaire-boys-club-spring-summer-2005", + "designer_key": "pharrell-williams", + "label": "Billionaire Boys Club", + "name": null, + "season": "Spring/Summer", + "release_year": 2005, + "status": "archived", + "piece_count": null, + "description": "The early BBC/Icecream universe joined Nigo’s Japanese production knowledge to Pharrell’s music, skate, space, and prep references.", + "source_url": "https://www.bbcicecream.com/pages/about", + "youtube_video_id": null + }, + { + "key": "pharrell-williams-chanel-spring-summer-2019", + "designer_key": "pharrell-williams", + "label": "Chanel", + "name": "Chanel Pharrell", + "season": "Spring/Summer", + "release_year": 2019, + "status": "archived", + "piece_count": null, + "description": "A unisex capsule translated Pharrell’s personal Chanel vocabulary into hoodies, jewelry, loafers, robes, and vivid color.", + "source_url": "https://www.vogue.com/article/pharrell-williams-chanel-collaboration", + "youtube_video_id": null + }, + { + "key": "pharrell-williams-louis-vuitton-fall-winter-menswear-2024", + "designer_key": "pharrell-williams", + "label": "Louis Vuitton", + "name": null, + "season": "Fall/Winter Menswear", + "release_year": 2024, + "status": "archived", + "piece_count": null, + "description": "American Western imagery, workwear, and collaboration with Indigenous artists expanded the house’s travel narrative.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2024-menswear/louis-vuitton", + "youtube_video_id": null + }, + { + "key": "pharrell-williams-louis-vuitton-spring-summer-menswear-2024", + "designer_key": "pharrell-williams", + "label": "Louis Vuitton", + "name": null, + "season": "Spring/Summer Menswear", + "release_year": 2024, + "status": "archived", + "piece_count": null, + "description": "Pharrell’s Louis Vuitton debut transformed the Pont Neuf into a celebration of community, Damier, tailoring, and Black cultural visibility.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2024-menswear/louis-vuitton", + "youtube_video_id": null + }, + { + "key": "pharrell-williams-louis-vuitton-spring-summer-menswear-2025", + "designer_key": "pharrell-williams", + "label": "Louis Vuitton", + "name": null, + "season": "Spring/Summer Menswear", + "release_year": 2025, + "status": "archived", + "piece_count": null, + "description": "A global diplomatic wardrobe used skin-tone gradients, travel tailoring, and collective spectacle to argue for connection across difference.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2025-menswear/louis-vuitton", + "youtube_video_id": null + }, + { + "key": "pierpaolo-piccioli-valentino-spring-summer-2017", + "designer_key": "pierpaolo-piccioli", + "label": "Valentino", + "name": null, + "season": "Spring/Summer", + "release_year": 2017, + "status": "archived", + "piece_count": null, + "description": "Piccioli’s first solo ready-to-wear collection joined medieval and punk references with lyrical dresses and a newly individual house voice.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2017-ready-to-wear/valentino", + "youtube_video_id": null + }, + { + "key": "pierpaolo-piccioli-valentino-spring-summer-2019", + "designer_key": "pierpaolo-piccioli", + "label": "Valentino", + "name": null, + "season": "Spring/Summer", + "release_year": 2019, + "status": "archived", + "piece_count": null, + "description": "Diverse casting, saturated couture color, and expansive volume made beauty feel both elevated and socially open.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2019-ready-to-wear/valentino", + "youtube_video_id": null + }, + { + "key": "pierpaolo-piccioli-valentino-fall-winter-2022", + "designer_key": "pierpaolo-piccioli", + "label": "Valentino", + "name": "Pink PP", + "season": "Fall/Winter", + "release_year": 2022, + "status": "archived", + "piece_count": null, + "description": "An almost entirely hot-pink and black environment used radical chromatic reduction to focus attention on silhouette, identity, and individual presence.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2022-ready-to-wear/valentino", + "youtube_video_id": null + }, + { + "key": "pierpaolo-piccioli-valentino-spring-summer-2024", + "designer_key": "pierpaolo-piccioli", + "label": "Valentino", + "name": null, + "season": "Spring/Summer", + "release_year": 2024, + "status": "archived", + "piece_count": null, + "description": "Piccioli’s final ready-to-wear collection for Valentino explored the body through intricate cutwork, monochrome surfaces, and lightness.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2024-ready-to-wear/valentino", + "youtube_video_id": null + }, + { + "key": "pierpaolo-piccioli-balenciaga-spring-summer-2026", + "designer_key": "pierpaolo-piccioli", + "label": "Balenciaga", + "name": "The Heartbeat", + "season": "Spring/Summer", + "release_year": 2026, + "status": "archived", + "piece_count": null, + "description": "Piccioli’s Balenciaga debut reconciled Cristóbal’s architectural volume with his own humanistic color, elegance, and emotional clarity.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2026-ready-to-wear/balenciaga", + "youtube_video_id": null + }, + { + "key": "raf-simons-raf-simons-fall-winter-2001", + "designer_key": "raf-simons", + "label": "Raf Simons", + "name": "Riot! Riot! Riot!", + "season": "Fall/Winter", + "release_year": 2001, + "status": "archived", + "piece_count": null, + "description": "Raf Simons returned from a one-year sabbatical with a landmark collection staged in a smoke-filled warehouse. Oversized, layered silhouettes and youth-subculture references framed clothing as protection, identity, and revolt.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2001-menswear/raf-simons", + "youtube_video_id": "oXsQ4NMQ6B8" + }, + { + "key": "raf-simons-raf-simons-fall-winter-2016", + "designer_key": "raf-simons", + "label": "Raf Simons", + "name": "Nightmares and Dreams", + "season": "Fall/Winter", + "release_year": 2016, + "status": "archived", + "piece_count": null, + "description": "Raf Simons explored adolescent dreams and nightmares through distressed, oversized tailoring and knitwear in a labyrinthine set, accompanied by Angelo Badalamenti discussing his work with David Lynch.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2016-menswear/raf-simons", + "youtube_video_id": "SO3w8LNeenk" + }, + { + "key": "raf-simons-raf-simons-fall-winter-2017", + "designer_key": "raf-simons", + "label": "Raf Simons", + "name": null, + "season": "Fall/Winter", + "release_year": 2017, + "status": "archived", + "piece_count": 40, + "description": "Raf Simons presented his first namesake runway show in New York, combining an immigrant’s view of the city with punk-inflected graphics, oversized outerwear, and an argument for fearlessness.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2017-menswear/raf-simons", + "youtube_video_id": "7PWuASfvjeU" + }, + { + "key": "raf-simons-raf-simons-spring-summer-2019", + "designer_key": "raf-simons", + "label": "Raf Simons", + "name": null, + "season": "Spring/Summer", + "release_year": 2019, + "status": "archived", + "piece_count": null, + "description": "A Raf Simons menswear collection presented in Paris, extending the designer’s exploration of youth culture through elongated proportions, graphic layering, and subcultural references.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2019-menswear/raf-simons", + "youtube_video_id": "15v60PqOT_Y" + }, + { + "key": "raf-simons-prada-spring-summer-2024", + "designer_key": "raf-simons", + "label": "Prada", + "name": null, + "season": "Spring/Summer", + "release_year": 2024, + "status": "archived", + "piece_count": null, + "description": "Prada Spring/Summer 2024 womenswear, jointly designed by co-creative directors Miuccia Prada and Raf Simons. The collection explored freedom of the body through lightweight dresses, reworked menswear silhouettes, and reinterpreted archival designs.", + "source_url": null, + "youtube_video_id": "z0IYqovHDJY" + }, + { + "key": "raul-lopez-luar-fall-winter-2019", + "designer_key": "raul-lopez", + "label": "Luar", + "name": null, + "season": "Fall/Winter", + "release_year": 2019, + "status": "archived", + "piece_count": null, + "description": "The last documented Luar runway season before an extended pause, continuing Lopez's collision of downtown experimentation, dramatic silhouette, and the social codes of dressing up.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2019-ready-to-wear/luar", + "youtube_video_id": null + }, + { + "key": "raul-lopez-luar-spring-summer-2019", + "designer_key": "raul-lopez", + "label": "Luar", + "name": null, + "season": "Spring/Summer", + "release_year": 2019, + "status": "archived", + "piece_count": null, + "description": "An early chapter in Luar's documented runway archive, bringing Lopez's subversive treatment of proportion, gender, and New York street language into a sharply personal ready-to-wear proposition.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2019-ready-to-wear/luar", + "youtube_video_id": null + }, + { + "key": "raul-lopez-luar-spring-summer-2022", + "designer_key": "raul-lopez", + "label": "Luar", + "name": null, + "season": "Spring/Summer", + "release_year": 2022, + "status": "archived", + "piece_count": null, + "description": "Luar's emphatic return to New York Fashion Week introduced the sculptural, circular-handled Ana bag. Named for Lopez's mother and grandmother, the accessory distilled family memory, aspiration, and downtown glamour into the object that helped transform the label's reach.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2022-ready-to-wear/luar", + "youtube_video_id": null + }, + { + "key": "raul-lopez-luar-fall-winter-2023", + "designer_key": "raul-lopez", + "label": "Luar", + "name": "Calle Pero Elegante", + "season": "Fall/Winter", + "release_year": 2023, + "status": "archived", + "piece_count": null, + "description": "Streetwise but elegant, the collection sharpened Luar's tailoring and accessories while treating glamour as a language built in community rather than granted by conventional luxury institutions.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2023-ready-to-wear/luar", + "youtube_video_id": null + }, + { + "key": "raul-lopez-luar-spring-summer-2023", + "designer_key": "raul-lopez", + "label": "Luar", + "name": "La Alta Gama", + "season": "Spring/Summer", + "release_year": 2023, + "status": "archived", + "piece_count": null, + "description": "A study of 'high class' aspiration filtered through the resourcefulness and presentation rituals of Lopez's Dominican-American upbringing, combining exaggerated tailoring, evening drama, and the cultivated swagger of neighborhood elegance.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2023-ready-to-wear/luar", + "youtube_video_id": null + }, + { + "key": "raul-lopez-luar-fall-winter-2024", + "designer_key": "raul-lopez", + "label": "Luar", + "name": "Deceptionista", + "season": "Fall/Winter", + "release_year": 2024, + "status": "archived", + "piece_count": null, + "description": "An autobiographical meditation on metrosexuality and the strategies queer men used to navigate masculinity. Elizabethan volume, animal textures, narrow silhouettes, and ornamental beauty marked the runway, which also introduced Luar Basics and a partnership with Moose Knuckles.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2024-ready-to-wear/luar", + "youtube_video_id": null + }, + { + "key": "raul-lopez-luar-spring-summer-2024", + "designer_key": "raul-lopez", + "label": "Luar", + "name": "Socorro", + "season": "Spring/Summer", + "release_year": 2024, + "status": "archived", + "piece_count": null, + "description": "Named in homage to Lopez's mother, 'Socorro' drew on a scene in El Hoyo in the Dominican Republic where street revelry and outdoor worship faced one another. Streamlined tailoring, convertible garments, church references, and hedonistic tension shaped the collection.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2024-ready-to-wear/luar", + "youtube_video_id": null + }, + { + "key": "raul-lopez-luar-fall-winter-2025", + "designer_key": "raul-lopez", + "label": "Luar", + "name": "El Pato", + "season": "Fall/Winter", + "release_year": 2025, + "status": "archived", + "piece_count": null, + "description": "Lopez reclaimed 'pato'—both Spanish for duck and a homophobic slur in parts of Latin America—as a defiant queer emblem. Feathers, sculpted gestures, asymmetric tailoring, and 1980s maximalism paid homage to the flamboyant designers and queer figures he admired.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2025-ready-to-wear/luar", + "youtube_video_id": null + }, + { + "key": "raul-lopez-luar-spring-summer-2025", + "designer_key": "raul-lopez", + "label": "Luar", + "name": "En Boca Quedó", + "season": "Spring/Summer", + "release_year": 2025, + "status": "archived", + "piece_count": null, + "description": "Staged in Rockefeller Plaza, the collection brought Luar's downtown community into one of New York's most visible civic stages. Lopez answered the pressure of mainstream attention with corsetry, high-impact tailoring, theatrical accessories, and the energy of a public spectacle.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2025-ready-to-wear/luar", + "youtube_video_id": null + }, + { + "key": "raul-lopez-luar-spring-summer-2026", + "designer_key": "raul-lopez", + "label": "Luar", + "name": null, + "season": "Spring/Summer", + "release_year": 2026, + "status": "archived", + "piece_count": null, + "description": "A love letter to Dominican carnival and the resilience carried through its craft traditions. Working with artisans and references including Los Pintaos, Lopez paired severe elongated tailoring with vivid painted surfaces, amber, larimar, and contemporary interpretations of ancestral celebration.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2026-ready-to-wear/luar", + "youtube_video_id": null + }, + { + "key": "rei-kawakubo-comme-des-garcons-fall-winter-ready-to-wear-1982", + "designer_key": "rei-kawakubo", + "label": "Comme des Garçons", + "name": "Destroy", + "season": "Fall/Winter Ready-to-Wear", + "release_year": 1982, + "status": "archived", + "piece_count": null, + "description": "Kawakubo's Paris breakthrough used black, asymmetry, holes, and distressed knitwear to overturn prevailing Western ideas of luxury and finish.", + "source_url": "https://www.metmuseum.org/art/collection/search/159586", + "youtube_video_id": null + }, + { + "key": "rei-kawakubo-comme-des-garcons-spring-summer-1997", + "designer_key": "rei-kawakubo", + "label": "Comme des Garçons", + "name": "Body Meets Dress, Dress Meets Body", + "season": "Spring/Summer", + "release_year": 1997, + "status": "archived", + "piece_count": null, + "description": "Rei Kawakubo challenged conventional silhouettes using asymmetrical padded forms.", + "source_url": null, + "youtube_video_id": null + }, + { + "key": "rei-kawakubo-comme-des-garcons-spring-summer-ready-to-wear-1999", + "designer_key": "rei-kawakubo", + "label": "Comme des Garçons", + "name": "Transcending Gender", + "season": "Spring/Summer Ready-to-Wear", + "release_year": 1999, + "status": "archived", + "piece_count": null, + "description": "Hybrid tailoring and deliberately unstable gender codes continued Kawakubo's dismantling of fixed categories of dress and identity.", + "source_url": "https://www.vogue.com/fashion-shows/spring-1999-ready-to-wear/comme-des-garcons", + "youtube_video_id": null + }, + { + "key": "rei-kawakubo-comme-des-garcons-spring-summer-ready-to-wear-2005", + "designer_key": "rei-kawakubo", + "label": "Comme des Garçons", + "name": "Broken Bride", + "season": "Spring/Summer Ready-to-Wear", + "release_year": 2005, + "status": "archived", + "piece_count": null, + "description": "Fragmented bridal references turned romance, ceremony, and incompletion into an unsettled study of beauty.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2005-ready-to-wear/comme-des-garcons", + "youtube_video_id": null + }, + { + "key": "rei-kawakubo-comme-des-garcons-fall-winter-ready-to-wear-2012", + "designer_key": "rei-kawakubo", + "label": "Comme des Garçons", + "name": "2 Dimensions", + "season": "Fall/Winter Ready-to-Wear", + "release_year": 2012, + "status": "archived", + "piece_count": null, + "description": "Flat felt silhouettes reduced clothing toward two dimensions, turning the runway into a moving sequence of paper-doll forms.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2012-ready-to-wear/comme-des-garcons", + "youtube_video_id": null + }, + { + "key": "rei-kawakubo-comme-des-garcons-spring-summer-ready-to-wear-2012", + "designer_key": "rei-kawakubo", + "label": "Comme des Garçons", + "name": "White Drama", + "season": "Spring/Summer Ready-to-Wear", + "release_year": 2012, + "status": "archived", + "piece_count": null, + "description": "An all-white procession abstracted the rituals marking birth, marriage, death, and transcendence into sculptural form.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2012-ready-to-wear/comme-des-garcons", + "youtube_video_id": null + }, + { + "key": "rei-kawakubo-comme-des-garcons-spring-summer-ready-to-wear-2014", + "designer_key": "rei-kawakubo", + "label": "Comme des Garçons", + "name": "Not Making Clothes", + "season": "Spring/Summer Ready-to-Wear", + "release_year": 2014, + "status": "archived", + "piece_count": null, + "description": "Kawakubo abandoned conventional garments for eighteen abstract constructions that asked where clothing ends and pure creation begins.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2014-ready-to-wear/comme-des-garcons", + "youtube_video_id": null + }, + { + "key": "rei-kawakubo-comme-des-garcons-fall-winter-ready-to-wear-2015", + "designer_key": "rei-kawakubo", + "label": "Comme des Garçons", + "name": "The Ceremony of Separation", + "season": "Fall/Winter Ready-to-Wear", + "release_year": 2015, + "status": "archived", + "piece_count": null, + "description": "Monumental lace forms in black, white, and gold staged mourning as a slow ritual between the living and the dead.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2015-ready-to-wear/comme-des-garcons", + "youtube_video_id": null + }, + { + "key": "rei-kawakubo-comme-des-garcons-spring-summer-ready-to-wear-2015", + "designer_key": "rei-kawakubo", + "label": "Comme des Garçons", + "name": "Blood and Roses", + "season": "Spring/Summer Ready-to-Wear", + "release_year": 2015, + "status": "archived", + "piece_count": null, + "description": "A nearly all-red sequence transformed roses, blood, violence, and historical dress into an unnerving struggle toward beauty.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2015-ready-to-wear/comme-des-garcons", + "youtube_video_id": null + }, + { + "key": "rei-kawakubo-comme-des-garcons-fall-winter-ready-to-wear-2017", + "designer_key": "rei-kawakubo", + "label": "Comme des Garçons", + "name": "The Future of Silhouette", + "season": "Fall/Winter Ready-to-Wear", + "release_year": 2017, + "status": "archived", + "piece_count": null, + "description": "Bulbous forms made from wadding, paper, lace, and recycled material proposed silhouette as an open field beyond ordinary garment construction.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2017-ready-to-wear/comme-des-garcons", + "youtube_video_id": null + }, + { + "key": "rei-kawakubo-comme-des-garcons-spring-summer-ready-to-wear-2017", + "designer_key": "rei-kawakubo", + "label": "Comme des Garçons", + "name": "Invisible Clothes", + "season": "Spring/Summer Ready-to-Wear", + "release_year": 2017, + "status": "archived", + "piece_count": null, + "description": "Enormous structures swallowed the body while asserting an unmistakable female presence, challenging visibility and the definition of clothing itself.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2017-ready-to-wear/comme-des-garcons", + "youtube_video_id": null + }, + { + "key": "rei-kawakubo-comme-des-garcons-fall-winter-2024", + "designer_key": "rei-kawakubo", + "label": "Comme des Garçons", + "name": "Anger", + "season": "Fall/Winter", + "release_year": 2024, + "status": "archived", + "piece_count": null, + "description": "Rei Kawakubo described the collection as an expression of anger at the state of the world and at herself.", + "source_url": null, + "youtube_video_id": "A8appJ3QQhU" + }, + { + "key": "rick-owens-rick-owens-fall-winter-ready-to-wear-2006", + "designer_key": "rick-owens", + "label": "Rick Owens", + "name": "Dustulator", + "season": "Fall/Winter Ready-to-Wear", + "release_year": 2006, + "status": "archived", + "piece_count": null, + "description": "Owens refined his glamorous post-apocalyptic vocabulary through sweeping volumes, washed surfaces, and sculptural leather.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2006-ready-to-wear/rick-owens", + "youtube_video_id": null + }, + { + "key": "rick-owens-rick-owens-fall-winter-menswear-2009", + "designer_key": "rick-owens", + "label": "Rick Owens", + "name": "Crust", + "season": "Fall/Winter Menswear", + "release_year": 2009, + "status": "archived", + "piece_count": null, + "description": "Layered knits, elongated proportions, and distressed textures gave Owens's menswear an austere nomadic force.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2009-menswear/rick-owens", + "youtube_video_id": null + }, + { + "key": "rick-owens-rick-owens-fall-winter-ready-to-wear-2011", + "designer_key": "rick-owens", + "label": "Rick Owens", + "name": "Limo", + "season": "Fall/Winter Ready-to-Wear", + "release_year": 2011, + "status": "archived", + "piece_count": null, + "description": "Monumental outerwear and disciplined draping recast Owens's underground signatures with stately restraint.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2011-ready-to-wear/rick-owens", + "youtube_video_id": null + }, + { + "key": "rick-owens-rick-owens-fall-winter-menswear-2012", + "designer_key": "rick-owens", + "label": "Rick Owens", + "name": "Mountain", + "season": "Fall/Winter Menswear", + "release_year": 2012, + "status": "archived", + "piece_count": null, + "description": "Protective layers and imposing footwear turned the male silhouette into a severe, mobile monument.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2012-menswear/rick-owens", + "youtube_video_id": null + }, + { + "key": "rick-owens-rick-owens-spring-summer-2014", + "designer_key": "rick-owens", + "label": "Rick Owens", + "name": "Vicious", + "season": "Spring/Summer", + "release_year": 2014, + "status": "archived", + "piece_count": 40, + "description": "A presentation performed by four step teams that challenged conventional runway casting and beauty standards.", + "source_url": null, + "youtube_video_id": "TirA415R7o4" + }, + { + "key": "rick-owens-rick-owens-fall-winter-menswear-2016", + "designer_key": "rick-owens", + "label": "Rick Owens", + "name": "Mastodon", + "season": "Fall/Winter Menswear", + "release_year": 2016, + "status": "archived", + "piece_count": null, + "description": "Ecological anxiety took form in Jurassic parkas, primordial layers, and Owens's apocalyptic romanticism.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2016-menswear/rick-owens", + "youtube_video_id": null + }, + { + "key": "rick-owens-rick-owens-spring-summer-menswear-2016", + "designer_key": "rick-owens", + "label": "Rick Owens", + "name": "Cyclops", + "season": "Spring/Summer Menswear", + "release_year": 2016, + "status": "archived", + "piece_count": null, + "description": "A narrow-focus monster inspired radical proportion, suspended geometry, and a deliberately confrontational runway moment.", + "source_url": "https://www.rickowens.eu/en-us/pages/runway-shows-men/cyclops-ss-16", + "youtube_video_id": null + }, + { + "key": "rick-owens-rick-owens-spring-summer-menswear-2018", + "designer_key": "rick-owens", + "label": "Rick Owens", + "name": "Dirt", + "season": "Spring/Summer Menswear", + "release_year": 2018, + "status": "archived", + "piece_count": null, + "description": "Owens explored migration, ceremony, and raw physicality through trailing layers and earthbound tones.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2018-menswear/rick-owens", + "youtube_video_id": null + }, + { + "key": "rick-owens-rick-owens-spring-summer-menswear-2019", + "designer_key": "rick-owens", + "label": "Rick Owens", + "name": "Babel", + "season": "Spring/Summer Menswear", + "release_year": 2019, + "status": "archived", + "piece_count": null, + "description": "Constructivist scaffolding, sharp tailoring, and wearable structures balanced order against chaos.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2019-menswear/rick-owens", + "youtube_video_id": "vR5dByuYxB0" + }, + { + "key": "rick-owens-rick-owens-fall-winter-menswear-2020", + "designer_key": "rick-owens", + "label": "Rick Owens", + "name": "Tecuatl", + "season": "Fall/Winter Menswear", + "release_year": 2020, + "status": "archived", + "piece_count": null, + "description": "Owens connected his Mexican heritage to glam, geometry, and ceremonial severity in a deeply personal collection.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2020-menswear/rick-owens", + "youtube_video_id": null + }, + { + "key": "rick-owens-rick-owens-spring-summer-menswear-2023", + "designer_key": "rick-owens", + "label": "Rick Owens", + "name": "Strobe", + "season": "Spring/Summer Menswear", + "release_year": 2023, + "status": "archived", + "piece_count": null, + "description": "An extreme play of shoulders, transparency, and elongated form delivered glamour as both armor and provocation.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2023-menswear/rick-owens", + "youtube_video_id": null + }, + { + "key": "sarah-burton-alexander-mcqueen-fall-winter-ready-to-wear-2011", + "designer_key": "sarah-burton", + "label": "Alexander McQueen", + "name": "The Ice Queen and Her Court", + "season": "Fall/Winter Ready-to-Wear", + "release_year": 2011, + "status": "archived", + "piece_count": null, + "description": "Regal silhouettes, intricate surfaces, and icy romance established Burton's ability to sustain spectacle through exquisite handwork.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2011-ready-to-wear/alexander-mcqueen", + "youtube_video_id": null + }, + { + "key": "sarah-burton-alexander-mcqueen-spring-summer-ready-to-wear-2011", + "designer_key": "sarah-burton", + "label": "Alexander McQueen", + "name": "Debut", + "season": "Spring/Summer Ready-to-Wear", + "release_year": 2011, + "status": "archived", + "piece_count": null, + "description": "Burton's first runway collection as creative director carried McQueen's exacting craft forward with a softer, nature-bound femininity of her own.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2011-ready-to-wear/alexander-mcqueen", + "youtube_video_id": null + }, + { + "key": "sarah-burton-alexander-mcqueen-spring-summer-ready-to-wear-2012", + "designer_key": "sarah-burton", + "label": "Alexander McQueen", + "name": "Gaia", + "season": "Spring/Summer Ready-to-Wear", + "release_year": 2012, + "status": "archived", + "piece_count": null, + "description": "Oceanic ruffles, coral forms, shells, and body-enclosing headpieces imagined women as powerful creatures of the natural world.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2012-ready-to-wear/alexander-mcqueen", + "youtube_video_id": null + }, + { + "key": "sarah-burton-alexander-mcqueen-spring-summer-ready-to-wear-2013", + "designer_key": "sarah-burton", + "label": "Alexander McQueen", + "name": "The Honeycomb", + "season": "Spring/Summer Ready-to-Wear", + "release_year": 2013, + "status": "archived", + "piece_count": null, + "description": "Beekeeper veils, honeycomb structures, and wasp-waisted tailoring made maternity, danger, and generative female power inseparable.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2013-ready-to-wear/alexander-mcqueen", + "youtube_video_id": null + }, + { + "key": "sarah-burton-alexander-mcqueen-fall-winter-ready-to-wear-2014", + "designer_key": "sarah-burton", + "label": "Alexander McQueen", + "name": null, + "season": "Fall/Winter Ready-to-Wear", + "release_year": 2014, + "status": "archived", + "piece_count": null, + "description": "A dark folkloric landscape of feathers, fur, moonlit embroidery, and protective silhouettes drew power from the British countryside.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2014-ready-to-wear/alexander-mcqueen", + "youtube_video_id": null + }, + { + "key": "sarah-burton-alexander-mcqueen-spring-summer-ready-to-wear-2016", + "designer_key": "sarah-burton", + "label": "Alexander McQueen", + "name": null, + "season": "Spring/Summer Ready-to-Wear", + "release_year": 2016, + "status": "archived", + "piece_count": null, + "description": "Seafaring histories, shipwrecked finery, and delicate botanical embroideries joined romance to the toughness of women who survive.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2016-ready-to-wear/alexander-mcqueen", + "youtube_video_id": null + }, + { + "key": "sarah-burton-alexander-mcqueen-fall-winter-ready-to-wear-2018", + "designer_key": "sarah-burton", + "label": "Alexander McQueen", + "name": null, + "season": "Fall/Winter Ready-to-Wear", + "release_year": 2018, + "status": "archived", + "piece_count": null, + "description": "Butterflies, beetles, flora, and found natural specimens informed a collection about transformation, preservation, and female strength.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2018-ready-to-wear/alexander-mcqueen", + "youtube_video_id": null + }, + { + "key": "sarah-burton-alexander-mcqueen-spring-summer-ready-to-wear-2020", + "designer_key": "sarah-burton", + "label": "Alexander McQueen", + "name": null, + "season": "Spring/Summer Ready-to-Wear", + "release_year": 2020, + "status": "archived", + "piece_count": null, + "description": "Burton centered the collective labor of the McQueen atelier, using flax, endangered crafts, and handwork rooted in British landscape and community.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2020-ready-to-wear/alexander-mcqueen", + "youtube_video_id": null + }, + { + "key": "sarah-burton-alexander-mcqueen-fall-winter-ready-to-wear-2021", + "designer_key": "sarah-burton", + "label": "Alexander McQueen", + "name": "Anemones", + "season": "Fall/Winter Ready-to-Wear", + "release_year": 2021, + "status": "archived", + "piece_count": null, + "description": "Crushed anemone imagery and water motifs expressed healing and renewal through rigorous tailoring and expansive floral gowns.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2021-ready-to-wear/alexander-mcqueen", + "youtube_video_id": null + }, + { + "key": "sarah-burton-alexander-mcqueen-fall-winter-ready-to-wear-2023", + "designer_key": "sarah-burton", + "label": "Alexander McQueen", + "name": null, + "season": "Fall/Winter Ready-to-Wear", + "release_year": 2023, + "status": "archived", + "piece_count": null, + "description": "Anatomy, cut, and the slash became a precise study of construction that reaffirmed Burton's mastery near the close of her McQueen tenure.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2023-ready-to-wear/alexander-mcqueen", + "youtube_video_id": null + }, + { + "key": "sarah-burton-alexander-mcqueen-spring-summer-2024", + "designer_key": "sarah-burton", + "label": "Alexander McQueen", + "name": null, + "season": "Spring/Summer", + "release_year": 2024, + "status": "archived", + "piece_count": null, + "description": "Sarah Burton's final collection as creative director of Alexander McQueen.", + "source_url": null, + "youtube_video_id": "EASTZ800WHA" + }, + { + "key": "sarah-burton-givenchy-fall-winter-2025", + "designer_key": "sarah-burton", + "label": "Givenchy", + "name": null, + "season": "Fall/Winter", + "release_year": 2025, + "status": "released", + "piece_count": 52, + "description": "The collection focused on cut, proportion, and tailoring.", + "source_url": null, + "youtube_video_id": "6K37zIVNpJI" + }, + { + "key": "sarah-burton-givenchy-spring-summer-ready-to-wear-2026", + "designer_key": "sarah-burton", + "label": "Givenchy", + "name": null, + "season": "Spring/Summer Ready-to-Wear", + "release_year": 2026, + "status": "archived", + "piece_count": null, + "description": "Burton's second Givenchy runway deepened her sensual, woman-centered vocabulary through sculpted tailoring, exposed construction, and confident eveningwear.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2026-ready-to-wear/givenchy", + "youtube_video_id": null + }, + { + "key": "shayne-oliver-hood-by-air-fall-winter-ready-to-wear-2013", + "designer_key": "shayne-oliver", + "label": "Hood By Air", + "name": "Prophets and Fetishists", + "season": "Fall/Winter Ready-to-Wear", + "release_year": 2013, + "status": "archived", + "piece_count": null, + "description": "Hood By Air’s breakout New York runway fused a distant-future mood with streetwear, fetish codes, neoprene, aggressive graphics, and sculptural cut-and-sew garments. A$AP Rocky closed the smoke-and-laser presentation, marking HBA’s transition from cult graphic label to a new kind of designer house.", + "source_url": "https://hypebeast.com/2013/2/hood-by-air-2013-fall-winter-runway-video", + "youtube_video_id": "di7Nkjrcm_s" + }, + { + "key": "shayne-oliver-hood-by-air-fall-winter-ready-to-wear-2014", + "designer_key": "shayne-oliver", + "label": "Hood By Air", + "name": null, + "season": "Fall/Winter Ready-to-Wear", + "release_year": 2014, + "status": "archived", + "piece_count": 40, + "description": "Oliver made statements about gender, power, class, beauty, and commerce through oversized sports jerseys, bruise graphics, grommeted leather, bondage-inflected construction, and influential zip-detailed denim. A forceful ballroom performance transformed the finale into a declaration of HBA’s community and cultural source.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2014-ready-to-wear/hood-by-air", + "youtube_video_id": "7GKIKA2bByo" + }, + { + "key": "shayne-oliver-hood-by-air-fall-winter-ready-to-wear-2015", + "designer_key": "shayne-oliver", + "label": "Hood By Air", + "name": "Human Evolution", + "season": "Fall/Winter Ready-to-Wear", + "release_year": 2015, + "status": "archived", + "piece_count": null, + "description": "Oliver treated categorization itself as a threat, hybridizing khakis, button-downs, puffers, sweaters, and T-shirts until familiar wardrobe staples appeared alien. Distorted faces, ambiguous bodies, and liminal silhouettes framed human evolution as a refusal of fixed identity.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2015-ready-to-wear/hood-by-air", + "youtube_video_id": "z5OIrlQQXu8" + }, + { + "key": "shayne-oliver-hood-by-air-spring-summer-ready-to-wear-2015", + "designer_key": "shayne-oliver", + "label": "Hood By Air", + "name": null, + "season": "Spring/Summer Ready-to-Wear", + "release_year": 2015, + "status": "archived", + "piece_count": null, + "description": "Presented across New York and Paris, the collection dismantled machismo through hybrid suits, jumpsuits, deconstructed shirting, transparent restraint devices, and orthopedic imagery. Oliver used restriction and vulnerability to challenge conventional ideas of masculine power.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2015-ready-to-wear/hood-by-air", + "youtube_video_id": "RWTYh4JdafM" + }, + { + "key": "shayne-oliver-hood-by-air-fall-winter-2016", + "designer_key": "shayne-oliver", + "label": "Hood By Air", + "name": "Pilgrimage", + "season": "Fall/Winter", + "release_year": 2016, + "status": "archived", + "piece_count": null, + "description": "Titled Pilgrimage, the collection explored transience, transmigration, and bodies treated as cargo. Patent-leather puffers, baggage-tagged shoes, plastic-wrapped bustiers, waders, dislocated sleeves, and luggage forms carried political undertones about displacement while demonstrating Oliver’s growing technical confidence.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2016-ready-to-wear/hood-by-air", + "youtube_video_id": "7GUTEL5wgBU" + }, + { + "key": "shayne-oliver-hood-by-air-spring-summer-menswear-2016", + "designer_key": "shayne-oliver", + "label": "Hood By Air", + "name": "Self-Obsessed", + "season": "Spring/Summer Menswear", + "release_year": 2016, + "status": "archived", + "piece_count": null, + "description": "A Paris meditation on self-worship filtered old-Hollywood glamour, toddler dressing, and bodily control through partitioned garments, trailing trains, pleated culottes, padlocked pacifiers, and slashed silhouettes. The work treated clothing as philosophy in transition rather than stable menswear.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2016-menswear/hood-by-air", + "youtube_video_id": null + }, + { + "key": "shayne-oliver-hood-by-air-spring-summer-ready-to-wear-2016", + "designer_key": "shayne-oliver", + "label": "Hood By Air", + "name": "Galvanize", + "season": "Spring/Summer Ready-to-Wear", + "release_year": 2016, + "status": "archived", + "piece_count": null, + "description": "Drawing on Oliver’s Caribbean childhood and school uniforms worn amid unequal living conditions, Galvanize radically chopped, suspended, and reassembled denim, striped knits, skirts, dresses, and institutional dress. Gender was treated as secondary to membership in the HBA family.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2016-ready-to-wear/hood-by-air", + "youtube_video_id": null + }, + { + "key": "shayne-oliver-hood-by-air-spring-summer-2017", + "designer_key": "shayne-oliver", + "label": "Hood By Air", + "name": "Wench", + "season": "Spring/Summer", + "release_year": 2017, + "status": "archived", + "piece_count": null, + "description": "Hood By Air shared billing with Wench, Oliver and Arca’s musical project, in a subversive take on tour merchandise. WENCH graphics, corporate name tags, reconstructed Wall Street suits, off-shoulder tailoring, corsetry, polos, and Pornhub collaboration reframed executive dress through queer club culture.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2017-ready-to-wear/hood-by-air", + "youtube_video_id": null + }, + { + "key": "shayne-oliver-hood-by-air-spring-summer-menswear-2017", + "designer_key": "shayne-oliver", + "label": "Hood By Air", + "name": "Positive Utilitarianism", + "season": "Spring/Summer Menswear", + "release_year": 2017, + "status": "archived", + "piece_count": null, + "description": "Staged in the semi-darkness of a Paris gay sauna, the show turned medical supports, trusses, bandages, built-in braces, military utility, and bondage into an uneasy language of healing and desire. Its immersive format rejected the hierarchy and visibility of the conventional runway.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2017-menswear/hood-by-air", + "youtube_video_id": null + }, + { + "key": "shayne-oliver-diesel-fall-winter-2018", + "designer_key": "shayne-oliver", + "label": "Diesel", + "name": "Red Tag Project", + "season": "Fall/Winter", + "release_year": 2018, + "status": "archived", + "piece_count": null, + "description": "The inaugural Diesel Red Tag capsule turned denim Americana into a techno-rodeo of cropped boxy jackets, unconventional jeans, layered construction, exaggerated utility, and prominent red branding. It translated Oliver’s pattern manipulation into Diesel’s industrial denim processes.", + "source_url": "https://hypebeast.com/2018/3/diesel-red-tag-project-shayne-oliver-collection", + "youtube_video_id": null + }, + { + "key": "shayne-oliver-colmar-a-g-e-by-shayne-oliver-fall-winter-capsule-2018", + "designer_key": "shayne-oliver", + "label": "Colmar A.G.E. by Shayne Oliver", + "name": "Advanced Garment Exploration I", + "season": "Fall/Winter Capsule", + "release_year": 2018, + "status": "archived", + "piece_count": 11, + "description": "The inaugural Colmar A.G.E. project turned archival alpine outerwear inside out. Eleven oversized, deconstructed, reversible, and unisex designs joined technical ski construction to Oliver’s performance-driven proportions and exposed internal logic.", + "source_url": "https://www.vogue.it/moda/news/2018/09/15/shayne-oliver-e-colmar-vogue-italia-settembre-2018", + "youtube_video_id": null + }, + { + "key": "shayne-oliver-helmut-lang-spring-summer-2018", + "designer_key": "shayne-oliver", + "label": "Helmut Lang", + "name": "Seen by Shayne Oliver", + "season": "Spring/Summer", + "release_year": 2018, + "status": "archived", + "piece_count": null, + "description": "As Helmut Lang’s first designer in residence, Oliver rebuilt the house’s minimal staples around its fetishistic undercurrent. Streamlined tailoring, parkas, asymmetric bras, rearless trousers, codpieces, harnesses, patent bra-bags, and BDSM straps restored sensuality through an unmistakably Oliverian lens.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2018-ready-to-wear/helmut-lang", + "youtube_video_id": "_OeZdBVsZO0" + }, + { + "key": "shayne-oliver-longchamp-by-shayne-oliver-spring-summer-capsule-2018", + "designer_key": "shayne-oliver", + "label": "Longchamp by Shayne Oliver", + "name": "Realness / Hiatus", + "season": "Spring/Summer Capsule", + "release_year": 2018, + "status": "archived", + "piece_count": 19, + "description": "Oliver reworked Longchamp’s democratic Le Pliage through elongated handles, doubled bags, wearable luggage, convertible footwear, garment-bag outerwear, and oversized REALNESS and HIATUS graphics. The project extended his experiments with proportion and logo language into travel design.", + "source_url": "https://www.vogue.com/article/hba-shayne-oliver-longchamp-collaboration-vogue-may-2018-issue", + "youtube_video_id": null + }, + { + "key": "shayne-oliver-colmar-a-g-e-by-shayne-oliver-fall-winter-capsule-2019", + "designer_key": "shayne-oliver", + "label": "Colmar A.G.E. by Shayne Oliver", + "name": "Advanced Garment Exploration III", + "season": "Fall/Winter Capsule", + "release_year": 2019, + "status": "archived", + "piece_count": 14, + "description": "The final Colmar chapter reimagined skiwear through reflective 3M panels, rubber patches, exposed seams, technical hoods, drawstrings, inflated trousers, utility attachments, and a cowboy-inflected campaign. Fourteen genderless pieces completed Oliver’s three-season study of the archive.", + "source_url": "https://hypebeast.com/2019/7/colmar-a-g-e-shayne-oliver-fall-winter-2019-collection-lookbook", + "youtube_video_id": null + }, + { + "key": "shayne-oliver-colmar-a-g-e-by-shayne-oliver-spring-summer-capsule-2019", + "designer_key": "shayne-oliver", + "label": "Colmar A.G.E. by Shayne Oliver", + "name": "Advanced Garment Exploration II", + "season": "Spring/Summer Capsule", + "release_year": 2019, + "status": "archived", + "piece_count": null, + "description": "Oliver’s second Colmar installment continued to recode the Italian company’s sporting archive, combining highly technical materials with casual urban forms, reversible construction, exaggerated volume, and a progressive unisex approach to performance clothing.", + "source_url": "https://viacomit.net/2019/02/14/colmar-age-x-shayne-oliver-printempsete-2019/", + "youtube_video_id": null + }, + { + "key": "shayne-oliver-hood-by-air-ready-to-wear-2021", + "designer_key": "shayne-oliver", + "label": "Hood By Air", + "name": "Prologue: Mother, Veteran, Merch", + "season": "Ready-to-Wear", + "release_year": 2021, + "status": "archived", + "piece_count": null, + "description": "HBA’s return after hiatus was organized as a prologue of character studies: Mother honored powerful Black women through a Naomi Campbell campaign; Veteran revisited the label’s streetwear history in sequential drops; and Merch connected product to the wider relaunch structure developed with Anonymous Club.", + "source_url": "https://www.lofficielusa.com/fashion/hood-by-air-returns-naomi-campbell-the-prologue-shayne-oliver", + "youtube_video_id": null + }, + { + "key": "shayne-oliver-anonymous-club-club-couture-2022", + "designer_key": "shayne-oliver", + "label": "Anonymous Club", + "name": "Collection 01: We Bleed Green", + "season": "Club Couture", + "release_year": 2022, + "status": "archived", + "piece_count": null, + "description": "Anonymous Club’s first collection emerged through Club Couture, a public extension of Oliver’s private community gatherings. The work positioned fashion alongside nightlife, music, performance, mentorship, and collective experimentation, using the studio as a platform for a new generation of collaborators.", + "source_url": "https://www.vogue.com/article/shayne-oliver-anonymous-club-club-couture", + "youtube_video_id": null + }, + { + "key": "shayne-oliver-shayne-oliver-fall-winter-presentation-2022", + "designer_key": "shayne-oliver", + "label": "Shayne Oliver", + "name": "Mall of Anonymous", + "season": "Fall/Winter Presentation", + "release_year": 2022, + "status": "archived", + "piece_count": null, + "description": "Oliver returned to New York Fashion Week at The Shed with an eponymous clothing presentation embedded in sculpture, live music with Arca, smoke, dripping garments, and performance. The project deliberately blurred fashion, sound, art, and the community structures of Wench, Leech, HBA, and Anonymous Club.", + "source_url": "https://www.vogue.com/article/shayne-oliver-returns-to-new-york-fashion-week-fall-2022", + "youtube_video_id": null + }, + { + "key": "shayne-oliver-anonymous-club-berlin-spring-summer-2024", + "designer_key": "shayne-oliver", + "label": "Anonymous Club", + "name": "Collection 02", + "season": "Berlin Spring/Summer", + "release_year": 2024, + "status": "archived", + "piece_count": null, + "description": "Oliver returned to the hoodie as the origin point of his fashion language. Black, white, and gray sportswear expanded into disproportionate cuts, rubber clothing, muscular prosthetic leggings, overalls, boots, hidden faces, and horned hair forms, presenting unknown characters through the designer’s own vision.", + "source_url": "https://www.vogue.com/fashion-shows/berlin-spring-2024/anonymous-club", + "youtube_video_id": null + }, + { + "key": "shayne-oliver-anonymous-club-resort-2024", + "designer_key": "shayne-oliver", + "label": "Anonymous Club", + "name": null, + "season": "Resort", + "release_year": 2024, + "status": "archived", + "piece_count": 17, + "description": "Anonymous Club’s second installment clarified the studio as a collaborative label and talent incubator. Black, beige, neon green, and clear vinyl staples carried Oliver signatures including pagoda shoulders, club leather, oversized utility jackets, displaced sleeves, and a three-headed Cerberus motif symbolizing protection of vulnerable new ideas.", + "source_url": "https://www.vogue.com/fashion-shows/resort-2024/anonymous-club", + "youtube_video_id": null + }, + { + "key": "shayne-oliver-anonymous-club-berlin-spring-summer-2025", + "designer_key": "shayne-oliver", + "label": "Anonymous Club", + "name": "Collection 03", + "season": "Berlin Spring/Summer", + "release_year": 2025, + "status": "archived", + "piece_count": null, + "description": "A club-charged Berlin runway developed Oliver’s upward-morphing cowl hoods, concentrated shoulder volume, sculptural puffers, flared proportions, soft draped dresses, and discreet Shayne Oliver signatures. The collection continued Anonymous Club’s fusion of character, nightlife, and mentorship.", + "source_url": "https://www.vogue.com/fashion-shows/berlin-spring-2025/anonymous-club", + "youtube_video_id": null + }, + { + "key": "telfar-clemens-telfar-fall-winter-2008", + "designer_key": "telfar-clemens", + "label": "Telfar", + "name": "Lookbook", + "season": "Fall/Winter", + "release_year": 2008, + "status": "archived", + "piece_count": null, + "description": "An early TELFAR lookbook from the label's formative period, documenting Clemens's already-established commitment to unisex dressing and the transformation of ordinary wardrobe staples.", + "source_url": "https://www.mariebliss.studio/telfar-ss10-ss09-fw08-fw09", + "youtube_video_id": null + }, + { + "key": "telfar-clemens-telfar-fall-winter-2009", + "designer_key": "telfar-clemens", + "label": "Telfar", + "name": "Lookbook", + "season": "Fall/Winter", + "release_year": 2009, + "status": "archived", + "piece_count": null, + "description": "An early archival lookbook that records the continuity of Telfar's unisex project well before gender-fluid casting and co-ed collections became widespread industry practice.", + "source_url": "https://www.mariebliss.studio/telfar-ss10-ss09-fw08-fw09", + "youtube_video_id": null + }, + { + "key": "telfar-clemens-telfar-spring-summer-2009", + "designer_key": "telfar-clemens", + "label": "Telfar", + "name": "Lookbook", + "season": "Spring/Summer", + "release_year": 2009, + "status": "archived", + "piece_count": null, + "description": "A formative seasonal lookbook from Telfar's first years, when the label was developing its independent New York language of democratic, gender-neutral everyday clothing.", + "source_url": "https://www.mariebliss.studio/telfar-ss10-ss09-fw08-fw09", + "youtube_video_id": null + }, + { + "key": "telfar-clemens-telfar-spring-summer-2010", + "designer_key": "telfar-clemens", + "label": "Telfar", + "name": "Lookbook", + "season": "Spring/Summer", + "release_year": 2010, + "status": "archived", + "piece_count": null, + "description": "A surviving early lookbook centered on wearable, adaptable clothing rather than conventional luxury codes, part of the visual record of TELFAR between 2008 and 2010.", + "source_url": "https://www.mariebliss.studio/telfar-ss10-ss09-fw08-fw09", + "youtube_video_id": null + }, + { + "key": "telfar-clemens-telfar-fall-winter-2014", + "designer_key": "telfar-clemens", + "label": "Telfar", + "name": null, + "season": "Fall/Winter", + "release_year": 2014, + "status": "archived", + "piece_count": null, + "description": "Presented at New York's New Museum, this collection reframed mass-market American familiarity through Telfar's unisex vocabulary, with the presentation drawing on the visual language of Kmart and everyday retail.", + "source_url": "https://www.dazeddigital.com/fashion/article/21099/1/telfar-clemens-vs-babak-radboy", + "youtube_video_id": null + }, + { + "key": "telfar-clemens-telfar-fall-winter-2015", + "designer_key": "telfar-clemens", + "label": "Telfar", + "name": null, + "season": "Fall/Winter", + "release_year": 2015, + "status": "archived", + "piece_count": null, + "description": "Telfar's democratic unisex wardrobe pushed familiar sportswear and everyday staples through subtle structural changes, maintaining the label's focus on clothing before prescribed identity.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2015-ready-to-wear/telfar", + "youtube_video_id": null + }, + { + "key": "telfar-clemens-telfar-spring-summer-2015", + "designer_key": "telfar-clemens", + "label": "Telfar", + "name": null, + "season": "Spring/Summer", + "release_year": 2015, + "status": "archived", + "piece_count": null, + "description": "A continuation of Clemens's project of making ordinary American clothes strange again: gender-neutral basics, altered proportions, and garments intended to circulate freely between bodies and identities.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2015-ready-to-wear/telfar", + "youtube_video_id": null + }, + { + "key": "telfar-clemens-telfar-fall-winter-2016", + "designer_key": "telfar-clemens", + "label": "Telfar", + "name": null, + "season": "Fall/Winter", + "release_year": 2016, + "status": "archived", + "piece_count": null, + "description": "An exploration of recognizable American basics transformed through cut, proportion, and multipurpose construction—part of Clemens's sustained effort to design clothes that are for everyone.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2016-ready-to-wear/telfar", + "youtube_video_id": null + }, + { + "key": "telfar-clemens-telfar-spring-summer-2016", + "designer_key": "telfar-clemens", + "label": "Telfar", + "name": "Anything, Anytime", + "season": "Spring/Summer", + "release_year": 2016, + "status": "archived", + "piece_count": null, + "description": "Telfar presented the collection both on a physical runway and through a CGI film featuring 45 digital clones of Telfar Clemens across a spectrum of genders, body types, and skin tones. The project was created with CultureSport and supported by White Castle.", + "source_url": "https://dismagazine.com/discussion/79659/telfar-ss-2016/", + "youtube_video_id": "iDXTtd6TKHk" + }, + { + "key": "telfar-clemens-telfar-fall-winter-2017", + "designer_key": "telfar-clemens", + "label": "Telfar", + "name": null, + "season": "Fall/Winter", + "release_year": 2017, + "status": "archived", + "piece_count": null, + "description": "A fiercely unisex collection that reconstructed everyday garments into hybrid street uniforms, including denim joined to flared knits, puffer-sweatshirt combinations, and cargo pockets shaped from the TC logo.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2017-ready-to-wear/telfar", + "youtube_video_id": "NjogrrcLUzs" + }, + { + "key": "telfar-clemens-telfar-for-solange-spring-2017", + "designer_key": "telfar-clemens", + "label": "Telfar for Solange", + "name": "An Ode To", + "season": "Spring", + "release_year": 2017, + "status": "archived", + "piece_count": null, + "description": "Custom costumes for Solange Knowles and her ensemble of dancers and musicians in 'An Ode To,' the interdisciplinary performance staged in the Guggenheim Museum's rotunda. The project placed Telfar's fluid clothing inside a collective work of movement, music, and Black cultural expression.", + "source_url": "https://www.guggenheim.org/event/solange-an-ode-to", + "youtube_video_id": null + }, + { + "key": "telfar-clemens-telfar-spring-summer-2017", + "designer_key": "telfar-clemens", + "label": "Telfar", + "name": "It's Clothing", + "season": "Spring/Summer", + "release_year": 2017, + "status": "archived", + "piece_count": null, + "description": "An 'everyman' proposition built from polos, tank tops, bodysuits, and workwear colors. Familiar garments were reversed, cut away, or fused together, underscoring Clemens's insistence that the work was simply—and expansively—clothing.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2017-ready-to-wear/telfar", + "youtube_video_id": null + }, + { + "key": "telfar-clemens-telfar-x-white-castle-summer-2017", + "designer_key": "telfar-clemens", + "label": "Telfar x White Castle", + "name": "LeFrak City Capsule", + "season": "Summer", + "release_year": 2017, + "status": "archived", + "piece_count": 8, + "description": "An eight-piece public capsule connected to Telfar's redesign of the uniforms for White Castle's LeFrak City location. The project joined workwear, neighborhood memory, and an unusually democratic model of designer collaboration.", + "source_url": "https://www.vogue.com/article/fashion-runway-telfar-white-castle-camron", + "youtube_video_id": null + }, + { + "key": "telfar-clemens-telfar-fall-winter-2018", + "designer_key": "telfar-clemens", + "label": "Telfar", + "name": null, + "season": "Fall/Winter", + "release_year": 2018, + "status": "archived", + "piece_count": null, + "description": "Everyday American sportswear was loosened, layered, and reconfigured with Telfar's characteristic refusal of fixed gender, continuing the label's study of how ordinary clothes acquire social meaning.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2018-ready-to-wear/telfar", + "youtube_video_id": null + }, + { + "key": "telfar-clemens-telfar-spring-summer-2018", + "designer_key": "telfar-clemens", + "label": "Telfar", + "name": null, + "season": "Spring/Summer", + "release_year": 2018, + "status": "archived", + "piece_count": null, + "description": "A self-archival collection of 'decoy clothing' presented over a White Castle dinner. Tank dresses, backward collars, detachable denim sleeves, backless shirts, and punched logos revisited and recombined the label's own vocabulary.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2018-ready-to-wear/telfar", + "youtube_video_id": null + }, + { + "key": "telfar-clemens-telfar-fall-winter-2019", + "designer_key": "telfar-clemens", + "label": "Telfar", + "name": "Country", + "season": "Fall/Winter", + "release_year": 2019, + "status": "archived", + "piece_count": null, + "description": "Presented at Irving Plaza as a concert-like collective event, 'Country' examined Black authorship of American identity. Models crowd-surfed through the audience in deconstructed denim, sportswear, and Western-coded forms.", + "source_url": "https://time.com/5525325/telfar-nyfw-2019/", + "youtube_video_id": null + }, + { + "key": "telfar-clemens-telfar-spring-summer-2019", + "designer_key": "telfar-clemens", + "label": "Telfar", + "name": null, + "season": "Spring/Summer", + "release_year": 2019, + "status": "archived", + "piece_count": null, + "description": "A communal New York presentation that expanded Telfar's language of transformed basics and fluid dressing, treating the runway as a gathering rather than an exclusive fashion spectacle.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2019-ready-to-wear/telfar", + "youtube_video_id": null + }, + { + "key": "telfar-clemens-telfar-fall-winter-menswear-2020", + "designer_key": "telfar-clemens", + "label": "Telfar", + "name": null, + "season": "Fall/Winter Menswear", + "release_year": 2020, + "status": "archived", + "piece_count": null, + "description": "Telfar's guest-designer presentation at Pitti Uomo occupied Florence's Palazzo Corsini with a cast and creative community brought from New York. Familiar American basics were staged as a declaration of self-definition: the label would not change to suit its host.", + "source_url": "https://www.vogue.com/article/telfar-pitti-uomo-fall-2020-runway-show", + "youtube_video_id": null + }, + { + "key": "telfar-clemens-telfar-spring-summer-2020", + "designer_key": "telfar-clemens", + "label": "Telfar", + "name": "The World Isn't Everything", + "season": "Spring/Summer", + "release_year": 2020, + "status": "archived", + "piece_count": null, + "description": "Presented in Paris through the film 'The World Isn't Everything,' the collection treated migration as a core Telfar philosophy. Hybrid garments—T-shirt dresses, denim joined to track pants, fishnet-transformed jeans, and branded inserts—made movement and recombination literal.", + "source_url": "https://www.vogue.in/fashion/content/teflar-opens-paris-fashion-week-we-are-migrants-thats-our-philosophy-in-general", + "youtube_video_id": null + }, + { + "key": "telfar-clemens-telfar-x-moose-knuckles-fall-winter-2021", + "designer_key": "telfar-clemens", + "label": "Telfar x Moose Knuckles", + "name": "Moose Knuckles x TELFAR", + "season": "Fall/Winter", + "release_year": 2021, + "status": "archived", + "piece_count": 17, + "description": "A 17-piece outerwear capsule combining Moose Knuckles's cold-weather construction with Telfar's puffers, quilted separates, denim, and shearling-lined Shopping Bags.", + "source_url": "https://www.vogue.com/article/telfar-outerwear-moose-knuckles", + "youtube_video_id": null + }, + { + "key": "telfar-clemens-telfar-x-white-castle-fall-winter-2021", + "designer_key": "telfar-clemens", + "label": "Telfar x White Castle", + "name": "100th Anniversary Uniforms", + "season": "Fall/Winter", + "release_year": 2021, + "status": "archived", + "piece_count": null, + "description": "Four new uniform designs created for roughly 10,000 White Castle team members for the company's centenary, accompanied by a public capsule whose proceeds supported bail assistance for incarcerated minors.", + "source_url": "https://compute.vogue.com/article/telfar-white-castle-uniforms-collaboration", + "youtube_video_id": null + }, + { + "key": "telfar-clemens-telfar-x-converse-spring-summer-2021", + "designer_key": "telfar-clemens", + "label": "Telfar x Converse", + "name": "Converse x TELFAR", + "season": "Spring/Summer", + "release_year": 2021, + "status": "archived", + "piece_count": null, + "description": "A unisex activewear collaboration spanning performance garments and footwear, translating Telfar's cutouts, asymmetry, and body-conscious approach into Converse sportswear.", + "source_url": "https://www.refinery29.com/en-gb/2021/06/10554090/telfar-converse-collaboration-activewear", + "youtube_video_id": null + }, + { + "key": "telfar-clemens-telfar-x-ugg-spring-summer-2021", + "designer_key": "telfar-clemens", + "label": "Telfar x UGG", + "name": "UGG x TELFAR", + "season": "Spring/Summer", + "release_year": 2021, + "status": "archived", + "piece_count": null, + "description": "A meeting of two immediately recognizable design languages, applying UGG's shearling and chestnut palette to Telfar's inclusive accessories and casual wardrobe, including the Shopping Bag collaboration first previewed in 2020.", + "source_url": "https://www.vogue.com/article/young-fashion-designers-boost-uggs-brand-cachet-whats-in-it-for-them", + "youtube_video_id": null + }, + { + "key": "telfar-clemens-telfar-tokyo-2020-olympics-2021", + "designer_key": "telfar-clemens", + "label": "Telfar", + "name": "Liberia Olympic Uniforms", + "season": "Tokyo 2020 Olympics", + "release_year": 2021, + "status": "archived", + "piece_count": null, + "description": "Competition and ceremonial uniforms designed for Liberia's Olympic delegation. The project connected Clemens's Liberian heritage to athletic apparel and extended his design practice onto an international sporting stage.", + "source_url": "https://www.lsnglobal.com/daily-signals/article/27159/telfar-captures-liberia-s-heritage-in-olympic-collection", + "youtube_video_id": null + }, + { + "key": "telfar-clemens-telfar-fall-winter-2022", + "designer_key": "telfar-clemens", + "label": "Telfar", + "name": "WOW", + "season": "Fall/Winter", + "release_year": 2022, + "status": "archived", + "piece_count": null, + "description": "A two-part collection unveiled through an immersive TELFAR TV event combining public-access television, performance art, and runway. It expanded Telfar sportswear into athleticwear and denim while introducing the Circle Bag.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2022-ready-to-wear/telfar", + "youtube_video_id": "2qo76POnvVE" + }, + { + "key": "thom-browne-thom-browne-fall-winter-menswear-2009", + "designer_key": "thom-browne", + "label": "Thom Browne", + "name": null, + "season": "Fall/Winter Menswear", + "release_year": 2009, + "status": "archived", + "piece_count": null, + "description": "Presented at Pitti Uomo, this European milestone expanded Browne's shrunken grey uniform into a disciplined theatrical world of repeated tailoring and ritual.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2009-menswear/thom-browne", + "youtube_video_id": null + }, + { + "key": "thom-browne-thom-browne-fall-winter-2012", + "designer_key": "thom-browne", + "label": "Thom Browne", + "name": null, + "season": "Fall/Winter", + "release_year": 2012, + "status": "archived", + "piece_count": null, + "description": "An early womenswear statement that translated Browne's menswear uniform into sculpted proportions and meticulously staged American archetypes.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2012-ready-to-wear/thom-browne", + "youtube_video_id": null + }, + { + "key": "thom-browne-thom-browne-spring-summer-menswear-2014", + "designer_key": "thom-browne", + "label": "Thom Browne", + "name": null, + "season": "Spring/Summer Menswear", + "release_year": 2014, + "status": "archived", + "piece_count": null, + "description": "Military ceremony and uniformity became an exacting study of sameness and difference, with regimented casting and increasingly surreal tailoring.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2014-menswear/thom-browne", + "youtube_video_id": null + }, + { + "key": "thom-browne-thom-browne-fall-winter-2017", + "designer_key": "thom-browne", + "label": "Thom Browne", + "name": null, + "season": "Fall/Winter", + "release_year": 2017, + "status": "archived", + "piece_count": null, + "description": "Penguin-like black-and-white forms and icy staging transformed familiar tailoring into a surreal procession of elongated, sculptural silhouettes.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2017-ready-to-wear/thom-browne", + "youtube_video_id": null + }, + { + "key": "thom-browne-thom-browne-spring-summer-menswear-2017", + "designer_key": "thom-browne", + "label": "Thom Browne", + "name": null, + "season": "Spring/Summer Menswear", + "release_year": 2017, + "status": "archived", + "piece_count": null, + "description": "A beach fantasy rendered through suits, trompe-l'oeil surf imagery, and Browne's precise tailoring treated vacation clothing as another kind of uniform.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2017-menswear/thom-browne", + "youtube_video_id": null + }, + { + "key": "thom-browne-thom-browne-spring-summer-2018", + "designer_key": "thom-browne", + "label": "Thom Browne", + "name": null, + "season": "Spring/Summer", + "release_year": 2018, + "status": "archived", + "piece_count": null, + "description": "Mermaids, sea creatures, and fantasy tailoring turned the runway into an underwater dream while displaying the atelier's intensive construction.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2018-ready-to-wear/thom-browne", + "youtube_video_id": null + }, + { + "key": "thom-browne-thom-browne-fall-winter-2022", + "designer_key": "thom-browne", + "label": "Thom Browne", + "name": null, + "season": "Fall/Winter", + "release_year": 2022, + "status": "archived", + "piece_count": null, + "description": "A toy-shop narrative populated by teddy bears and exaggerated New York characters used spectacle to reveal the craft and modular logic beneath Browne's clothes.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2022-ready-to-wear/thom-browne", + "youtube_video_id": null + }, + { + "key": "thom-browne-thom-browne-fall-winter-2023", + "designer_key": "thom-browne", + "label": "Thom Browne", + "name": "The Little Prince", + "season": "Fall/Winter", + "release_year": 2023, + "status": "archived", + "piece_count": null, + "description": "Antoine de Saint-Exupéry's tale became a lunar theatrical production about adulthood, imagination, and loneliness, all articulated through variations on Browne's uniform.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2023-ready-to-wear/thom-browne", + "youtube_video_id": null + }, + { + "key": "thom-browne-thom-browne-fall-winter-2024", + "designer_key": "thom-browne", + "label": "Thom Browne", + "name": "The Raven", + "season": "Fall/Winter", + "release_year": 2024, + "status": "archived", + "piece_count": null, + "description": "Edgar Allan Poe's poem shaped a dark, snowbound narrative of ravens, school uniforms, and sculpted black tailoring staged as American gothic theater.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2024-ready-to-wear/thom-browne", + "youtube_video_id": null + }, + { + "key": "tom-ford-gucci-fall-winter-1995", + "designer_key": "tom-ford", + "label": "Gucci", + "name": null, + "season": "Fall/Winter", + "release_year": 1995, + "status": "archived", + "piece_count": null, + "description": "Ford's breakthrough Gucci collection established the velvet hip-hugger, silk shirt, and hard-edged sensuality that redirected the house and the decade.", + "source_url": "https://www.vogue.com/fashion-shows/fall-1995-ready-to-wear/gucci", + "youtube_video_id": null + }, + { + "key": "tom-ford-gucci-fall-winter-1996", + "designer_key": "tom-ford", + "label": "Gucci", + "name": null, + "season": "Fall/Winter", + "release_year": 1996, + "status": "archived", + "piece_count": null, + "description": "Ford pushed Gucci's erotic minimalism into darker glamour through sharp suiting, jersey dresses, patent surfaces, and an exactingly controlled image.", + "source_url": "https://www.vogue.com/fashion-shows/fall-1996-ready-to-wear/gucci", + "youtube_video_id": null + }, + { + "key": "tom-ford-gucci-spring-summer-1996", + "designer_key": "tom-ford", + "label": "Gucci", + "name": null, + "season": "Spring/Summer", + "release_year": 1996, + "status": "archived", + "piece_count": null, + "description": "A white, body-conscious sequel to Ford's breakthrough: jersey, cutouts, chain hardware, and sleek tailoring turned Gucci into a global image of sexual confidence.", + "source_url": "https://www.vogue.com/fashion-shows/spring-1996-ready-to-wear/gucci", + "youtube_video_id": null + }, + { + "key": "tom-ford-yves-saint-laurent-rive-gauche-spring-summer-2001", + "designer_key": "tom-ford", + "label": "Yves Saint Laurent Rive Gauche", + "name": null, + "season": "Spring/Summer", + "release_year": 2001, + "status": "archived", + "piece_count": null, + "description": "Ford's first ready-to-wear proposition for Yves Saint Laurent translated house codes through his own polished, provocative lens while negotiating the legacy of its living founder.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2001-ready-to-wear/saint-laurent", + "youtube_video_id": null + }, + { + "key": "tom-ford-gucci-fall-winter-2004", + "designer_key": "tom-ford", + "label": "Gucci", + "name": null, + "season": "Fall/Winter", + "release_year": 2004, + "status": "archived", + "piece_count": null, + "description": "Ford's farewell to Gucci condensed his signatures—velvet, satin, fur, severe tailoring, and unapologetic sexuality—into an emotionally charged final collection.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2004-ready-to-wear/gucci", + "youtube_video_id": null + }, + { + "key": "tom-ford-tom-ford-spring-summer-2011", + "designer_key": "tom-ford", + "label": "Tom Ford", + "name": null, + "season": "Spring/Summer", + "release_year": 2011, + "status": "archived", + "piece_count": null, + "description": "Ford returned to womenswear with an intimate, photography-restricted presentation led by women chosen for personality rather than a conventional runway ideal.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2011-ready-to-wear/tom-ford", + "youtube_video_id": null + }, + { + "key": "tom-ford-tom-ford-spring-summer-2018", + "designer_key": "tom-ford", + "label": "Tom Ford", + "name": null, + "season": "Spring/Summer", + "release_year": 2018, + "status": "archived", + "piece_count": null, + "description": "A high-gloss New York collection combining razor tailoring, athletic references, crystal surfaces, and abbreviated eveningwear in Ford's language of controlled seduction.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2018-ready-to-wear/tom-ford", + "youtube_video_id": null + }, + { + "key": "tom-ford-tom-ford-spring-summer-2023", + "designer_key": "tom-ford", + "label": "Tom Ford", + "name": null, + "season": "Spring/Summer", + "release_year": 2023, + "status": "archived", + "piece_count": null, + "description": "Ford's final womenswear runway collection under his own creative direction revisited disco glamour through sequins, lace, lingerie forms, denim, and liquid metallic color.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2023-ready-to-wear/tom-ford", + "youtube_video_id": null + }, + { + "key": "virgil-abloh-off-white-fall-winter-menswear-2017", + "designer_key": "virgil-abloh", + "label": "Off-White", + "name": "Seeing Things", + "season": "Fall/Winter Menswear", + "release_year": 2017, + "status": "archived", + "piece_count": null, + "description": "A study of streetwear growing up, shifting from skate references toward widened tailoring, outerwear, and Abloh's 'art dad' archetype.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2017-menswear/off-white", + "youtube_video_id": null + }, + { + "key": "virgil-abloh-off-white-fall-winter-ready-to-wear-2017", + "designer_key": "virgil-abloh", + "label": "Off-White", + "name": "Nothing New", + "season": "Fall/Winter Ready-to-Wear", + "release_year": 2017, + "status": "archived", + "piece_count": null, + "description": "Abloh answered questions of originality with a theatrical collection built around suspended birch trees, reconstruction, and purposeful quotation.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2017-ready-to-wear/off-white", + "youtube_video_id": null + }, + { + "key": "virgil-abloh-off-white-resort-2017", + "designer_key": "virgil-abloh", + "label": "Off-White", + "name": "Roses of War", + "season": "Resort", + "release_year": 2017, + "status": "archived", + "piece_count": null, + "description": "Camouflage and roses met in a collection that balanced utility fabrics, rhinestone tears, and elevated street-facing design.", + "source_url": "https://www.vogue.com/fashion-shows/resort-2017/off-white", + "youtube_video_id": null + }, + { + "key": "virgil-abloh-off-white-spring-summer-menswear-2017", + "designer_key": "virgil-abloh", + "label": "Off-White", + "name": "Mirror Mirror", + "season": "Spring/Summer Menswear", + "release_year": 2017, + "status": "archived", + "piece_count": null, + "description": "Virgil Abloh used trompe-l'oeil Paris architecture to question the distance between a brand's facade and what sits behind it.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2017-menswear/off-white", + "youtube_video_id": null + }, + { + "key": "virgil-abloh-off-white-fall-winter-ready-to-wear-2019", + "designer_key": "virgil-abloh", + "label": "Off-White", + "name": "Public Television", + "season": "Fall/Winter Ready-to-Wear", + "release_year": 2019, + "status": "archived", + "piece_count": null, + "description": "A broadcast-inflected Off-White collection mixing sportswear, evening silhouettes, and the image-making language at the center of Abloh's practice.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2019-ready-to-wear/off-white", + "youtube_video_id": null + }, + { + "key": "virgil-abloh-louis-vuitton-spring-summer-2019", + "designer_key": "virgil-abloh", + "label": "Louis Vuitton", + "name": null, + "season": "Spring/Summer", + "release_year": 2019, + "status": "archived", + "piece_count": null, + "description": "Virgil Abloh's debut menswear collection for Louis Vuitton.", + "source_url": null, + "youtube_video_id": "I1AqjvdiubA" + }, + { + "key": "virgil-abloh-louis-vuitton-fall-winter-menswear-2020", + "designer_key": "virgil-abloh", + "label": "Louis Vuitton", + "name": null, + "season": "Fall/Winter Menswear", + "release_year": 2020, + "status": "archived", + "piece_count": null, + "description": "A study of contemporary work and male dress codes, moving from commuter layering and reorganized bags into clouds, stars, and eveningwear.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2020-menswear/louis-vuitton", + "youtube_video_id": null + }, + { + "key": "virgil-abloh-louis-vuitton-spring-summer-menswear-2020", + "designer_key": "virgil-abloh", + "label": "Louis Vuitton", + "name": null, + "season": "Spring/Summer Menswear", + "release_year": 2020, + "status": "archived", + "piece_count": null, + "description": "At Place Dauphine, Abloh explored boyhood, flowers, Parisian public space, fluid tailoring, and couture techniques within menswear.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2020-menswear/louis-vuitton", + "youtube_video_id": null + }, + { + "key": "virgil-abloh-louis-vuitton-fall-winter-menswear-2021", + "designer_key": "virgil-abloh", + "label": "Louis Vuitton", + "name": "Ebonics", + "season": "Fall/Winter Menswear", + "release_year": 2021, + "status": "archived", + "piece_count": null, + "description": "A film-led collection centered Black consciousness, spoken word, cultural archetypes, and the creation of new language through menswear.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2021-menswear/louis-vuitton", + "youtube_video_id": "vV_QoQD_nrA" + }, + { + "key": "virgil-abloh-louis-vuitton-spring-summer-menswear-2021", + "designer_key": "virgil-abloh", + "label": "Louis Vuitton", + "name": "The Adventures of Zoooom with Friends", + "season": "Spring/Summer Menswear", + "release_year": 2021, + "status": "archived", + "piece_count": null, + "description": "A traveling presentation shaped by animation, all-Black collaborators, upcycling, and Abloh's effort to question fashion's status quo.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2021-menswear/louis-vuitton", + "youtube_video_id": "3Z2SN4qx8v8" + }, + { + "key": "virgil-abloh-louis-vuitton-fall-winter-menswear-2022", + "designer_key": "virgil-abloh", + "label": "Louis Vuitton", + "name": "Louis Dreamhouse", + "season": "Fall/Winter Menswear", + "release_year": 2022, + "status": "archived", + "piece_count": null, + "description": "The final collection in Abloh's eight-season Vuitton arc returned to boyhood ideology, surreal architecture, and boundary-erasing formalwear.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2022-menswear/louis-vuitton", + "youtube_video_id": "1lztJ_1rY6M" + }, + { + "key": "virgil-abloh-louis-vuitton-spring-summer-menswear-2022", + "designer_key": "virgil-abloh", + "label": "Louis Vuitton", + "name": "Amen Break", + "season": "Spring/Summer Menswear", + "release_year": 2022, + "status": "archived", + "piece_count": null, + "description": "Abloh connected rave culture, martial arts, chess, and the Amen break in a collection about transmission, appropriation, and Black creativity.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2022-menswear/louis-vuitton", + "youtube_video_id": null + }, + { + "key": "vivienne-westwood-worlds-end-vivienne-westwood-fall-winter-1981", + "designer_key": "vivienne-westwood", + "label": "World’s End / Vivienne Westwood", + "name": "Pirate", + "season": "Fall/Winter", + "release_year": 1981, + "status": "archived", + "piece_count": null, + "description": "Westwood and Malcolm McLaren’s first official catwalk collection abandoned punk’s tight black uniform for romantic volume. Drawing on eighteenth- and nineteenth-century dress, British history, and global textiles, it introduced billowing shirts, dropped armholes, slash-cut sleeves, broad trousers, and the influential Squiggle print.", + "source_url": "https://www.vam.ac.uk/articles/vivienne-westwood-a-taste-for-the-past", + "youtube_video_id": null + }, + { + "key": "vivienne-westwood-worlds-end-vivienne-westwood-fall-winter-1982", + "designer_key": "vivienne-westwood", + "label": "World’s End / Vivienne Westwood", + "name": "Nostalgia of Mud", + "season": "Fall/Winter", + "release_year": 1982, + "status": "archived", + "piece_count": null, + "description": "Also known as Buffalo, the collection rejected conventional Western hierarchy through sheepskin jackets, voluminous swirling skirts, hooded layers, raw construction, earthy color, and eclectic cultural references. Its wrapped silhouettes helped define the early-1980s Buffalo aesthetic.", + "source_url": "https://nga.gov.au/exhibitions/vivienne-westwood/", + "youtube_video_id": null + }, + { + "key": "vivienne-westwood-vivienne-westwood-spring-summer-1985", + "designer_key": "vivienne-westwood", + "label": "Vivienne Westwood", + "name": "Mini-Crini", + "season": "Spring/Summer", + "release_year": 1985, + "status": "archived", + "piece_count": null, + "description": "Westwood compressed the Victorian crinoline into a buoyant thigh-length cage skirt, opposing the decade’s dominant broad shoulders with a sharply emphasized waist and hips. Polka dots, playful prints, fitted country tailoring, and Rocking Horse platforms joined historical construction to pop irreverence.", + "source_url": "https://www.viviennewestwood.com/en-au/westwood-world/the-story-so-far/", + "youtube_video_id": null + }, + { + "key": "vivienne-westwood-vivienne-westwood-fall-winter-1987", + "designer_key": "vivienne-westwood", + "label": "Vivienne Westwood", + "name": "Harris Tweed", + "season": "Fall/Winter", + "release_year": 1987, + "status": "archived", + "piece_count": null, + "description": "An affectionate parody of British upper-class dress based on young Princesses Elizabeth and Margaret. A-line coats, jodhpurs, corsets worn as outerwear, tweed crowns, mini-crinis, denim, and traditional checks helped revive Harris Tweed as a fashion fabric and consolidated Westwood’s historically informed tailoring.", + "source_url": "https://www.viviennewestwood.com/en-gb/westwood-world/heritage/westwood-heritage--a-history-with-harris-tweed%C2%AE/", + "youtube_video_id": null + }, + { + "key": "vivienne-westwood-vivienne-westwood-gold-label-fall-winter-ready-to-wear-1993", + "designer_key": "vivienne-westwood", + "label": "Vivienne Westwood Gold Label", + "name": "Anglomania", + "season": "Fall/Winter Ready-to-Wear", + "release_year": 1993, + "status": "archived", + "piece_count": null, + "description": "English tailoring collided with French exaggeration in tartan mini-kilts, double-breasted suits, corseted gowns, tweed capes, fur, and towering Elevated Ghillie platforms. The collection introduced the MacAndreas tartan and produced Naomi Campbell’s famous laughing runway fall.", + "source_url": "https://www.viviennewestwood.com/en-au/westwood-world/the-story-so-far/", + "youtube_video_id": "2qKIP1Bgmq4" + }, + { + "key": "vivienne-westwood-vivienne-westwood-gold-label-spring-summer-ready-to-wear-1994", + "designer_key": "vivienne-westwood", + "label": "Vivienne Westwood Gold Label", + "name": "Café Society", + "season": "Spring/Summer Ready-to-Wear", + "release_year": 1994, + "status": "archived", + "piece_count": null, + "description": "Westwood pushed historical silhouette and erotic display to lavish extremes, mixing nineteenth-century military dress, Elizabethan beauty codes, corsetry, bustles, tailoring, and the micro-mini-crini. A celebrated supermodel cast turned the runway into a theatrical argument about power, femininity, and spectacle.", + "source_url": "https://www.articlesofclothing.com/p/vivienne-westwood-springsummer-1994", + "youtube_video_id": "H7l2vAwwX0w" + }, + { + "key": "vivienne-westwood-vivienne-westwood-spring-summer-2018", + "designer_key": "vivienne-westwood", + "label": "Vivienne Westwood", + "name": null, + "season": "Spring/Summer", + "release_year": 2018, + "status": "archived", + "piece_count": null, + "description": "A theatrical unisex collection developed by Vivienne Westwood and Andreas Kronthaler, combining punk-inflected historical dress, tailoring, platforms, circus performance, and the house’s sustainability advocacy.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2018-ready-to-wear/vivienne-westwood", + "youtube_video_id": "h8FlvedZok8" + }, + { + "key": "vivienne-westwood-vivienne-westwood-fall-winter-ready-to-wear-2019", + "designer_key": "vivienne-westwood", + "label": "Vivienne Westwood", + "name": "Homo Loquax", + "season": "Fall/Winter Ready-to-Wear", + "release_year": 2019, + "status": "archived", + "piece_count": null, + "description": "A collection-cum-manifesto staged with models, actors, and activists speaking about climate change, anti-capitalism, consumerism, and Brexit. Repurposed fabrics, assertive tailoring, draped dresses, and Westwood’s buy less, choose well ethic made political speech part of the runway itself.", + "source_url": "https://www.vogue.co.uk/article/vivienne-westwood-london-fashion-week-2019-political-talking-points", + "youtube_video_id": "D_RHOnVM-I0" + }, + { + "key": "walter-van-beirendonck-w-l-t-spring-summer-1996", + "designer_key": "walter-van-beirendonck", + "label": "W.&L.T.", + "name": "Wild and Lethal Trash", + "season": "Spring/Summer", + "release_year": 1996, + "status": "archived", + "piece_count": null, + "description": "Cyberculture, rave graphics, radical casting, and cartoonish volume made W.&L.T. a defining experiment in 1990s mass communication and fashion.", + "source_url": "https://www.momu.be/en/collections/brands/walter-van-beirendonck", + "youtube_video_id": null + }, + { + "key": "walter-van-beirendonck-walter-van-beirendonck-spring-summer-menswear-2010", + "designer_key": "walter-van-beirendonck", + "label": "Walter Van Beirendonck", + "name": null, + "season": "Spring/Summer Menswear", + "release_year": 2010, + "status": "archived", + "piece_count": null, + "description": "An exuberant collision of tailoring, fetish, graphic masks, and political messaging reaffirmed clothing as both pleasure and public declaration.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2010-menswear/walter-van-beirendonck", + "youtube_video_id": null + }, + { + "key": "walter-van-beirendonck-walter-van-beirendonck-spring-summer-menswear-2016", + "designer_key": "walter-van-beirendonck", + "label": "Walter Van Beirendonck", + "name": null, + "season": "Spring/Summer Menswear", + "release_year": 2016, + "status": "archived", + "piece_count": null, + "description": "Color, engineered volume, face coverings, and anti-violence symbolism turned the runway into an urgent yet playful manifesto.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2016-menswear/walter-van-beirendonck", + "youtube_video_id": null + }, + { + "key": "walter-van-beirendonck-walter-van-beirendonck-spring-summer-menswear-2023", + "designer_key": "walter-van-beirendonck", + "label": "Walter Van Beirendonck", + "name": null, + "season": "Spring/Summer Menswear", + "release_year": 2023, + "status": "archived", + "piece_count": null, + "description": "Hybrid tailoring and surreal bodies continued his lifelong resistance to normalized masculinity and passive fashion.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2023-menswear/walter-van-beirendonck", + "youtube_video_id": null + }, + { + "key": "walter-van-beirendonck-walter-van-beirendonck-spring-summer-menswear-2026", + "designer_key": "walter-van-beirendonck", + "label": "Walter Van Beirendonck", + "name": null, + "season": "Spring/Summer Menswear", + "release_year": 2026, + "status": "archived", + "piece_count": null, + "description": "A starry-eyed time warp combined childhood photographs, Anna Piaggi-like clashes, historical skeleton suits, camouflage, flowers, and puzzling construction.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2026-menswear/walter-van-beirendonck", + "youtube_video_id": null + }, + { + "key": "willy-chavarria-willy-chavarria-spring-summer-menswear-2022", + "designer_key": "willy-chavarria", + "label": "Willy Chavarria", + "name": null, + "season": "Spring/Summer Menswear", + "release_year": 2022, + "status": "archived", + "piece_count": null, + "description": "Monumental proportions, workwear, and emotionally direct casting centered Chicano identity and queer masculinity within an expanding vision of American luxury.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2022-menswear/willy-chavarria", + "youtube_video_id": null + }, + { + "key": "willy-chavarria-willy-chavarria-fall-winter-menswear-2023", + "designer_key": "willy-chavarria", + "label": "Willy Chavarria", + "name": null, + "season": "Fall/Winter Menswear", + "release_year": 2023, + "status": "archived", + "piece_count": null, + "description": "Tailoring and sportswear moved between tenderness and authority, using cinematic scale to dignify bodies and identities often excluded from traditional luxury imagery.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2023-menswear/willy-chavarria", + "youtube_video_id": null + }, + { + "key": "willy-chavarria-willy-chavarria-spring-summer-menswear-2023", + "designer_key": "willy-chavarria", + "label": "Willy Chavarria", + "name": null, + "season": "Spring/Summer Menswear", + "release_year": 2023, + "status": "archived", + "piece_count": null, + "description": "Broad shoulders, sweeping trousers, religious atmosphere, and intimate casting made dignity and collective emotion as important as the clothes themselves.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2023-menswear/willy-chavarria", + "youtube_video_id": null + }, + { + "key": "willy-chavarria-willy-chavarria-fall-winter-menswear-2024", + "designer_key": "willy-chavarria", + "label": "Willy Chavarria", + "name": "Safe From Harm", + "season": "Fall/Winter Menswear", + "release_year": 2024, + "status": "archived", + "piece_count": null, + "description": "Protection, migration, and human worth animated imposing tailoring and sportswear presented with Chavarria's characteristic emotional and political clarity.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2024-menswear/willy-chavarria", + "youtube_video_id": null + }, + { + "key": "willy-chavarria-willy-chavarria-spring-summer-menswear-2024", + "designer_key": "willy-chavarria", + "label": "Willy Chavarria", + "name": null, + "season": "Spring/Summer Menswear", + "release_year": 2024, + "status": "archived", + "piece_count": null, + "description": "A forceful New York statement combining voluminous suiting, workwear, sensual styling, and the designer's recurring language of ceremony and community.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2024-menswear/willy-chavarria", + "youtube_video_id": null + }, + { + "key": "willy-chavarria-willy-chavarria-fall-winter-menswear-2025", + "designer_key": "willy-chavarria", + "label": "Willy Chavarria", + "name": "Tarantula", + "season": "Fall/Winter Menswear", + "release_year": 2025, + "status": "archived", + "piece_count": null, + "description": "The designer's Paris debut scaled his message globally through immense shoulders, elegant sportswear, religious drama, and casting grounded in cultural pride.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2025-menswear/willy-chavarria", + "youtube_video_id": null + }, + { + "key": "willy-chavarria-willy-chavarria-spring-summer-menswear-2025", + "designer_key": "willy-chavarria", + "label": "Willy Chavarria", + "name": "América", + "season": "Spring/Summer Menswear", + "release_year": 2025, + "status": "archived", + "piece_count": null, + "description": "Chavarria examined who is allowed to embody America through glamorous tailoring, labor references, Chicano visual language, and a cast asserting collective presence.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2025-menswear/willy-chavarria", + "youtube_video_id": null + }, + { + "key": "willy-chavarria-willy-chavarria-spring-summer-menswear-2026", + "designer_key": "willy-chavarria", + "label": "Willy Chavarria", + "name": "HURON", + "season": "Spring/Summer Menswear", + "release_year": 2026, + "status": "archived", + "piece_count": null, + "description": "Named for Chavarria's California hometown, the collection connected agricultural labor, queer and Chicano identity, family memory, and global fashion through refined tailoring and sportswear.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2026-menswear/willy-chavarria", + "youtube_video_id": null + }, + { + "key": "ye-kanye-west-yeezy-fall-winter-2015", + "designer_key": "ye-kanye-west", + "label": "Yeezy", + "name": "Yeezy Season 1", + "season": "Fall/Winter", + "release_year": 2015, + "status": "archived", + "piece_count": null, + "description": "The debut Yeezy apparel collection with Adidas Originals introduced military- and sportswear-derived layers in a muted palette alongside the Yeezy Boost 750. The presentation also premiered the song Wolves.", + "source_url": "https://pausemag.co.uk/2015/02/adidas-originals-x-kanye-west-yeezy-season-1-video/", + "youtube_video_id": "TEYaLzRDyIA" + }, + { + "key": "ye-kanye-west-yeezy-fall-winter-2016", + "designer_key": "ye-kanye-west", + "label": "Yeezy", + "name": "Yeezy Season 3", + "season": "Fall/Winter", + "release_year": 2016, + "status": "archived", + "piece_count": null, + "description": "Presented at Madison Square Garden before an audience of roughly 20,000, Yeezy Season 3 combined a large-scale fashion presentation with the premiere of The Life of Pablo.", + "source_url": "https://www.vogue.com/video/watch/yeezy-season-3-kanye-west-kim-kardashian-west-new-york-fashion-week", + "youtube_video_id": "1Ph6qxV06AA" + }, + { + "key": "ye-kanye-west-yeezy-spring-summer-2017", + "designer_key": "ye-kanye-west", + "label": "Yeezy", + "name": "Yeezy Season 4", + "season": "Spring/Summer", + "release_year": 2017, + "status": "archived", + "piece_count": null, + "description": "A presentation staged at Franklin D. Roosevelt Four Freedoms Park on Roosevelt Island, continuing Yeezy’s exploration of monochromatic casting, body-conscious foundations, oversized outerwear, and utilitarian footwear.", + "source_url": null, + "youtube_video_id": "C0XfvDTao88" + }, + { + "key": "ye-kanye-west-yeezy-fall-winter-2020", + "designer_key": "ye-kanye-west", + "label": "Yeezy", + "name": "Yeezy Season 8", + "season": "Fall/Winter", + "release_year": 2020, + "status": "archived", + "piece_count": null, + "description": "Yeezy returned to the runway during Paris Fashion Week with sculptural outerwear, workwear, and oversized footwear. The presentation at Espace Niemeyer was filmed by Nick Knight and included a performance by North West.", + "source_url": "https://www.showstudio.com/collections/fall-winter-2020/yeezy", + "youtube_video_id": "IyfFqwtzAM0" + }, + { + "key": "yohji-yamamoto-yohji-yamamoto-spring-summer-1982", + "designer_key": "yohji-yamamoto", + "label": "Yohji Yamamoto", + "name": null, + "season": "Spring/Summer", + "release_year": 1982, + "status": "archived", + "piece_count": null, + "description": "Yamamoto's early Paris work helped overturn dominant Western ideas of glamour through black, asymmetry, distressed surfaces, and generous space around the body.", + "source_url": "https://www.vam.ac.uk/articles/yohji-yamamoto-an-exhibition", + "youtube_video_id": null + }, + { + "key": "yohji-yamamoto-yohji-yamamoto-fall-winter-1986", + "designer_key": "yohji-yamamoto", + "label": "Yohji Yamamoto", + "name": null, + "season": "Fall/Winter", + "release_year": 1986, + "status": "archived", + "piece_count": null, + "description": "A defining study in black tailoring and dramatic volume, remembered for a coat that opened onto an unexpected red bustle—severity disrupted by theatrical color.", + "source_url": "https://www.vogue.com/article/yohji-yamamoto-spring-2026-ready-to-wear-review", + "youtube_video_id": null + }, + { + "key": "yohji-yamamoto-yohji-yamamoto-spring-summer-1999", + "designer_key": "yohji-yamamoto", + "label": "Yohji Yamamoto", + "name": null, + "season": "Spring/Summer", + "release_year": 1999, + "status": "archived", + "piece_count": null, + "description": "The celebrated bridal finale unfolded as performance: garments were progressively removed and transformed, revealing construction, ritual, and shifting identities beneath the white dress.", + "source_url": "https://www.vogue.com/fashion-shows/spring-1999-ready-to-wear/yohji-yamamoto", + "youtube_video_id": null + }, + { + "key": "yohji-yamamoto-yohji-yamamoto-fall-winter-2000", + "designer_key": "yohji-yamamoto", + "label": "Yohji Yamamoto", + "name": null, + "season": "Fall/Winter", + "release_year": 2000, + "status": "archived", + "piece_count": null, + "description": "An Arctic-inspired collection brought poetry and warmth to layered dark silhouettes, protective volume, and clothing that suggested lives weathered by landscape.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2000-ready-to-wear/yohji-yamamoto", + "youtube_video_id": null + }, + { + "key": "yohji-yamamoto-y-3-spring-summer-2003", + "designer_key": "yohji-yamamoto", + "label": "Y-3", + "name": null, + "season": "Spring/Summer", + "release_year": 2003, + "status": "archived", + "piece_count": null, + "description": "The inaugural Y-3 collection formalized Yamamoto's partnership with Adidas, establishing luxury sportswear as a sustained design practice rather than a one-off collaboration.", + "source_url": "https://www.adidas-group.com/en/magazine/innovation-stories/y-3-20-years-of-innovation", + "youtube_video_id": null + }, + { + "key": "yohji-yamamoto-yohji-yamamoto-fall-winter-2011", + "designer_key": "yohji-yamamoto", + "label": "Yohji Yamamoto", + "name": null, + "season": "Fall/Winter", + "release_year": 2011, + "status": "archived", + "piece_count": null, + "description": "Deconstructed tailoring, layered black volume, and visible handwork continued Yamamoto's resistance to fixed gender and polished completion.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2011-ready-to-wear/yohji-yamamoto", + "youtube_video_id": null + }, + { + "key": "yohji-yamamoto-yohji-yamamoto-spring-summer-2015", + "designer_key": "yohji-yamamoto", + "label": "Yohji Yamamoto", + "name": null, + "season": "Spring/Summer", + "release_year": 2015, + "status": "archived", + "piece_count": null, + "description": "Draped black cloth, exposed structure, and flashes of graphic color placed vulnerability and defiance in close conversation.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2015-ready-to-wear/yohji-yamamoto", + "youtube_video_id": null + }, + { + "key": "yohji-yamamoto-yohji-yamamoto-fall-winter-2023", + "designer_key": "yohji-yamamoto", + "label": "Yohji Yamamoto", + "name": null, + "season": "Fall/Winter", + "release_year": 2023, + "status": "archived", + "piece_count": null, + "description": "A slow meditation on clothing and time, using distressed tailoring, hand intervention, and silhouettes that appeared to accumulate personal histories.", + "source_url": "https://www.vogue.com/fashion-shows/fall-2023-ready-to-wear/yohji-yamamoto", + "youtube_video_id": null + }, + { + "key": "yohji-yamamoto-yohji-yamamoto-spring-summer-2026", + "designer_key": "yohji-yamamoto", + "label": "Yohji Yamamoto", + "name": null, + "season": "Spring/Summer", + "release_year": 2026, + "status": "archived", + "piece_count": null, + "description": "Minimal shrouds and elaborate pleating, knotting, draping, fringe, and beadwork formed a journey between Japanese gesture and Parisian couture, concluding with a return to the 1986 red-bustle coat.", + "source_url": "https://www.vogue.com/fashion-shows/spring-2026-ready-to-wear/yohji-yamamoto", + "youtube_video_id": null + }, + { + "key": "yves-saint-laurent-christian-dior-spring-summer-1958", + "designer_key": "yves-saint-laurent", + "label": "Christian Dior", + "name": "Trapèze", + "season": "Spring/Summer", + "release_year": 1958, + "status": "archived", + "piece_count": null, + "description": "Saint Laurent’s Dior debut liberated the waist through the youthful trapeze line while preserving couture structure.", + "source_url": "https://museeyslparis.com/en/biography/le-trapeze", + "youtube_video_id": null + }, + { + "key": "yves-saint-laurent-yves-saint-laurent-spring-summer-1962", + "designer_key": "yves-saint-laurent", + "label": "Yves Saint Laurent", + "name": null, + "season": "Spring/Summer", + "release_year": 1962, + "status": "archived", + "piece_count": null, + "description": "The house debut introduced a controlled modern wardrobe whose pea coats, tunics, and tailoring established independence from Dior.", + "source_url": "https://museeyslparis.com/en/biography/premiere-collection", + "youtube_video_id": null + }, + { + "key": "yves-saint-laurent-yves-saint-laurent-fall-winter-1965", + "designer_key": "yves-saint-laurent", + "label": "Yves Saint Laurent", + "name": "Mondrian", + "season": "Fall/Winter", + "release_year": 1965, + "status": "archived", + "piece_count": null, + "description": "Shift dresses engineered Piet Mondrian’s paintings into seams and color fields, making modern art structurally wearable.", + "source_url": "https://www.metmuseum.org/art/collection/search/83442", + "youtube_video_id": null + }, + { + "key": "yves-saint-laurent-yves-saint-laurent-spring-summer-1971", + "designer_key": "yves-saint-laurent", + "label": "Yves Saint Laurent", + "name": "Scandal", + "season": "Spring/Summer", + "release_year": 1971, + "status": "archived", + "piece_count": null, + "description": "The controversial 1940s-inspired collection confronted wartime memory and prevailing good taste through short dresses, platform shoes, and overt makeup.", + "source_url": "https://museeyslparis.com/en/biography/collection-du-scandale", + "youtube_video_id": null + }, + { + "key": "yves-saint-laurent-yves-saint-laurent-fall-winter-1976", + "designer_key": "yves-saint-laurent", + "label": "Yves Saint Laurent", + "name": "Ballets Russes", + "season": "Fall/Winter", + "release_year": 1976, + "status": "archived", + "piece_count": null, + "description": "Opulent color, folkloric layering, and references to the Ballets Russes formed one of Saint Laurent’s most celebrated couture fantasies.", + "source_url": "https://museeyslparis.com/en/biography/collection-ballets-russes", + "youtube_video_id": null + } + ] +} diff --git a/docs/DEMO_CHECKLIST.md b/docs/DEMO_CHECKLIST.md new file mode 100644 index 0000000..ff16dea --- /dev/null +++ b/docs/DEMO_CHECKLIST.md @@ -0,0 +1,59 @@ +# Demonstration checklist + +This folder is the destination for the final screenshots and screen recording. +The live database remains local; `data/archive.json` is the portable, reviewed +record of the archive. + +## Start the application + +From the project root, start FastAPI: + +```bash +source .venv/bin/activate +uvicorn app.main:app --reload +``` + +In a second terminal, start React: + +```bash +cd react-ui +npm run dev +``` + +Open the React client at and the Vanilla client at +. API documentation is available at +. + +## Postman validation + +1. Import `postman/Collection-Archive.postman_collection.json` into Postman. +2. Confirm the `baseUrl` collection variable is `http://localhost:8000`. +3. Run the whole collection with the Collection Runner, in its saved order. +4. Confirm every test passes. The run creates temporary parent and child + records, verifies their relationship, then deletes them and verifies the + database cascade. +5. Save a screenshot as `docs/postman-validation.png`. + +Completed: the collection passed 9 requests and 10 assertions with zero +failures. The reusable collection and validation screenshot are stored here. + +## Short walkthrough recording + +Keep the recording to roughly two or three minutes: + +1. React: show the designer index, open a profile with several labels, and play + or point out an attached runway video. +2. React: briefly show the create/edit interface. +3. Vanilla: show the same archive data and open a collection detail page. +4. Postman: show the successful Collection Runner summary. +5. Briefly show `data/archive.json` and explain that the content is portable, + reviewable, and independent of SQLite's generated numeric IDs. + +Save the recording as `docs/archive-walkthrough.webm` and representative client +screenshots as `docs/react-ui.png` and `docs/vanilla-ui.png`. + +Completed: a browser-only walkthrough and all three screenshots are stored in +this directory. The recording contains no desktop, microphone, or private tabs. + +Do not include authentication tokens, terminal history, or unrelated browser +tabs in any screenshot or recording. diff --git a/docs/archive-walkthrough.webm b/docs/archive-walkthrough.webm new file mode 100644 index 0000000..093011e Binary files /dev/null and b/docs/archive-walkthrough.webm differ diff --git a/docs/postman-validation.html b/docs/postman-validation.html new file mode 100644 index 0000000..88b9bec --- /dev/null +++ b/docs/postman-validation.html @@ -0,0 +1,52 @@ + + + + + + Collection Archive — Postman Validation + + + +
+
● VALIDATION PASSED

Collection Archive API

+
(h)gaines.
POSTMAN / NEWMAN
+
+
+
9requests
+
10assertions
+
0failures
+
138ms total run
+
+ + + + + + + + + + + + + +
RequestMethodResultValidation
HealthGET200PASS
List designersGET200PASS
List collectionsGET200PASS
Create demonstration designerPOST201PASS
Create child collectionPOST201PASS
Verify one-to-many relationshipGET200PASS
Update designerPUT200PASS
Delete designer and cascade childDELETE204PASS
Verify cascading deleteGET404PASS
+
Collection run completed August 16, 2026 · Temporary records removed automatically · Reusable collection: postman/Collection-Archive.postman_collection.json
+ + diff --git a/docs/postman-validation.png b/docs/postman-validation.png new file mode 100644 index 0000000..7e81d78 Binary files /dev/null and b/docs/postman-validation.png differ diff --git a/docs/react-ui.png b/docs/react-ui.png new file mode 100644 index 0000000..a890353 Binary files /dev/null and b/docs/react-ui.png differ diff --git a/docs/vanilla-ui.png b/docs/vanilla-ui.png new file mode 100644 index 0000000..503ec4b Binary files /dev/null and b/docs/vanilla-ui.png differ diff --git a/postman/Collection-Archive.postman_collection.json b/postman/Collection-Archive.postman_collection.json new file mode 100644 index 0000000..7d014e8 --- /dev/null +++ b/postman/Collection-Archive.postman_collection.json @@ -0,0 +1,99 @@ +{ + "info": { + "name": "Collection Archive API", + "description": "CRUD and relationship validation for the OnesToManys FastAPI service.", + "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json" + }, + "variable": [ + { "key": "baseUrl", "value": "http://localhost:8000" }, + { "key": "designerId", "value": "" }, + { "key": "collectionId", "value": "" } + ], + "item": [ + { + "name": "Read archive", + "item": [ + { + "name": "Health", + "request": { "method": "GET", "url": "{{baseUrl}}/health" }, + "event": [{ "listen": "test", "script": { "exec": [ + "pm.test('200 OK', () => pm.response.to.have.status(200));", + "pm.test('Service is healthy', () => pm.expect(pm.response.json().status).to.eql('ok'));" + ] } }] + }, + { + "name": "List designers", + "request": { "method": "GET", "url": "{{baseUrl}}/designers" }, + "event": [{ "listen": "test", "script": { "exec": [ + "pm.test('200 and a non-empty list', () => { pm.response.to.have.status(200); pm.expect(pm.response.json()).to.be.an('array').that.is.not.empty; });" + ] } }] + }, + { + "name": "List collections", + "request": { "method": "GET", "url": "{{baseUrl}}/collections" }, + "event": [{ "listen": "test", "script": { "exec": [ + "pm.test('200 and a non-empty list', () => { pm.response.to.have.status(200); pm.expect(pm.response.json()).to.be.an('array').that.is.not.empty; });" + ] } }] + } + ] + }, + { + "name": "CRUD demonstration", + "item": [ + { + "name": "Create demonstration designer", + "request": { + "method": "POST", + "header": [{ "key": "Content-Type", "value": "application/json" }], + "body": { "mode": "raw", "raw": "{\n \"full_name\": \"Postman Demonstration {{$timestamp}}\",\n \"nationality\": \"American\",\n \"birth_year\": 2000,\n \"website\": \"https://example.com\",\n \"biography\": \"Temporary validation record.\"\n}" }, + "url": "{{baseUrl}}/designers" + }, + "event": [{ "listen": "test", "script": { "exec": [ + "pm.test('201 Created', () => pm.response.to.have.status(201));", + "pm.collectionVariables.set('designerId', pm.response.json().id);" + ] } }] + }, + { + "name": "Create child collection", + "request": { + "method": "POST", + "header": [{ "key": "Content-Type", "value": "application/json" }], + "body": { "mode": "raw", "raw": "{\n \"designer_id\": {{designerId}},\n \"label\": \"Postman Demonstration\",\n \"name\": \"API Validation\",\n \"season\": \"Spring/Summer\",\n \"release_year\": 2026,\n \"status\": \"concept\",\n \"piece_count\": 1,\n \"description\": \"Temporary child record for relationship validation.\",\n \"source_url\": \"https://example.com/source\",\n \"youtube_video_id\": null\n}" }, + "url": "{{baseUrl}}/collections" + }, + "event": [{ "listen": "test", "script": { "exec": [ + "pm.test('201 Created', () => pm.response.to.have.status(201));", + "pm.collectionVariables.set('collectionId', pm.response.json().id);" + ] } }] + }, + { + "name": "Verify one-to-many relationship", + "request": { "method": "GET", "url": "{{baseUrl}}/designers/{{designerId}}/collections" }, + "event": [{ "listen": "test", "script": { "exec": [ + "pm.test('Parent returns its child', () => { pm.response.to.have.status(200); const rows = pm.response.json(); pm.expect(rows.some(row => row.id === Number(pm.collectionVariables.get('collectionId')))).to.be.true; });" + ] } }] + }, + { + "name": "Update designer", + "request": { + "method": "PUT", + "header": [{ "key": "Content-Type", "value": "application/json" }], + "body": { "mode": "raw", "raw": "{\n \"full_name\": \"Postman Demonstration Updated {{$timestamp}}\",\n \"nationality\": \"American\",\n \"birth_year\": 2000,\n \"website\": \"https://example.com\",\n \"biography\": \"Updated through the REST API.\"\n}" }, + "url": "{{baseUrl}}/designers/{{designerId}}" + }, + "event": [{ "listen": "test", "script": { "exec": ["pm.test('200 Updated', () => pm.response.to.have.status(200));"] } }] + }, + { + "name": "Delete designer and cascade child", + "request": { "method": "DELETE", "url": "{{baseUrl}}/designers/{{designerId}}" }, + "event": [{ "listen": "test", "script": { "exec": ["pm.test('204 Deleted', () => pm.response.to.have.status(204));"] } }] + }, + { + "name": "Verify cascading delete", + "request": { "method": "GET", "url": "{{baseUrl}}/collections/{{collectionId}}" }, + "event": [{ "listen": "test", "script": { "exec": ["pm.test('Child was deleted with parent', () => pm.response.to.have.status(404));"] } }] + } + ] + } + ] +} diff --git a/react-ui/.gitignore b/react-ui/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/react-ui/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/react-ui/.oxlintrc.json b/react-ui/.oxlintrc.json new file mode 100644 index 0000000..1255078 --- /dev/null +++ b/react-ui/.oxlintrc.json @@ -0,0 +1,8 @@ +{ + "$schema": "./node_modules/oxlint/configuration_schema.json", + "plugins": ["react", "oxc"], + "rules": { + "react/rules-of-hooks": "error", + "react/only-export-components": ["warn", { "allowConstantExport": true }] + } +} diff --git a/react-ui/README.md b/react-ui/README.md new file mode 100644 index 0000000..cb64a6b --- /dev/null +++ b/react-ui/README.md @@ -0,0 +1,32 @@ +# Collection Archive v0.2.0 React UI + +This client recreates the CRUD features in `web/` with React. During +development, Vite forwards requests beginning with `/api` to the FastAPI +server at `http://127.0.0.1:8000`. + +Run FastAPI from the repository root: + +```bash +.venv/bin/uvicorn app.main:app --reload +``` + +In a second terminal, run React: + +```bash +cd react-ui +npm install +npm run dev +``` + +Open `http://127.0.0.1:5173`. + +Useful checks: + +```bash +npm run lint +npm run build +``` + +--- + +*(h)gaines.* diff --git a/react-ui/index.html b/react-ui/index.html new file mode 100644 index 0000000..b0cd890 --- /dev/null +++ b/react-ui/index.html @@ -0,0 +1,14 @@ + + + + + + + + Collection Archive + + +
+ + + diff --git a/react-ui/package-lock.json b/react-ui/package-lock.json new file mode 100644 index 0000000..9c4635c --- /dev/null +++ b/react-ui/package-lock.json @@ -0,0 +1,1352 @@ +{ + "name": "react-ui", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "react-ui", + "version": "0.0.0", + "dependencies": { + "react": "^19.2.8", + "react-dom": "^19.2.8", + "react-router-dom": "^7.18.2" + }, + "devDependencies": { + "@types/react": "^19.2.17", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react": "^6.0.4", + "oxlint": "^1.75.0", + "vite": "^8.2.0" + } + }, + "node_modules/@oxc-project/types": { + "version": "0.144.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.144.0.tgz", + "integrity": "sha512-nuhZIOLuI6TFQ32I/WnUx+SCPY7SdSKwgnFHydAuoS1+Z4BRcaP+RRJmGzl9lw+0OFF7UmaESf7KQRXaNLHypg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@oxlint/binding-android-arm-eabi": { + "version": "1.78.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm-eabi/-/binding-android-arm-eabi-1.78.0.tgz", + "integrity": "sha512-Bu819lmAfZMUHErrpe0cEWj3iaefuUODHSU8+UbXy67V/r7/7f4K3FL0NmbD85E+wiFLDYuhP8Zlv0XnVeXshw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-android-arm64": { + "version": "1.78.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm64/-/binding-android-arm64-1.78.0.tgz", + "integrity": "sha512-CDfxZgB61B7buRdY2FJoAYYPPXCZ1EoC1LKscnC5dg3kjobdxiconvAvvN1BmHyW4PyFT3jRLDag/BY/roSNBQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-darwin-arm64": { + "version": "1.78.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-arm64/-/binding-darwin-arm64-1.78.0.tgz", + "integrity": "sha512-2Y2U9Ahrz+OO0Ej88f9SJYq51/jUBp1Mc7iZu0ukrbeeZ3gpRGfzIFnoqfHDY96xr0GEfNrPUBFEy0nN5aD7HA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-darwin-x64": { + "version": "1.78.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-x64/-/binding-darwin-x64-1.78.0.tgz", + "integrity": "sha512-rpych6eJq6m9jDRypTEaPD1xysaEW5h9+xuxhGK/QhOg+/xaqPZrCrTNoIl/f3nEjuJeCEmstNDlrE9rJi/3/g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-freebsd-x64": { + "version": "1.78.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-freebsd-x64/-/binding-freebsd-x64-1.78.0.tgz", + "integrity": "sha512-IcMGrQT3QizkOESUJd5et+rOhVqSkNDfNik1cvrKDqIbzqx9KMtRswpFgkCuNTSwylCFLKhGUu8KmqY1ZnC0Dg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-arm-gnueabihf": { + "version": "1.78.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.78.0.tgz", + "integrity": "sha512-/uLdoJ0IXE6vo/0f0LKjinQAp+re+VMaCWaNT8ENIv2EOCkSsc8SGaflXAuW0Jua2dq5+GLVWm1NQK7P3UFSNQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-arm-musleabihf": { + "version": "1.78.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-1.78.0.tgz", + "integrity": "sha512-7xi4Wb/O8NRJhLoUXmDJMUVpNYvB5kefdhFU1Jb8rtae4QoXlTiLwI14X4YvAXVZLNZChP8m5qO9SQAlWQTbkQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-arm64-gnu": { + "version": "1.78.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.78.0.tgz", + "integrity": "sha512-4hFW0+fVXa3OIh1Y4A5SPkmvI4wuuBSrCVKzOyE7PTjhc7yEqZ1pmvEEeS5Lj/MaqvegFxXyF33N+6jkehxdyg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-arm64-musl": { + "version": "1.78.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.78.0.tgz", + "integrity": "sha512-oC0mvsgBJjlMijSDEhx9KuvR9zYeHXceA9MjbuXB1F8NSR78Yj2unOBrstEvTVaq+pko+kuue6DajC00eqvTdg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-ppc64-gnu": { + "version": "1.78.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.78.0.tgz", + "integrity": "sha512-XAllT5SUZS+ohjuZ3/5S0cwe0r7eboiuigeStCZ5DXRYx/2KVM2UvQXvAfyzXEimtQjAB7cDQ2YxDe2Zl2WNQQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-riscv64-gnu": { + "version": "1.78.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-1.78.0.tgz", + "integrity": "sha512-trucMER/0QtecoXvc1y/UVqE3kwJipDwrx4oHfj+nNm3dq2zjP44WT0CfHNDPM3G1DXIkx/gY6lAD21NSCZVhA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-riscv64-musl": { + "version": "1.78.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-1.78.0.tgz", + "integrity": "sha512-cm3O4F/HQbdzOUX5mKHqG5KDL6E5w0pnlZ+fbBy2rmLryPOowkuLagFHTopQsEIpjcaZoPOrL+BmmAytAG9HFg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-s390x-gnu": { + "version": "1.78.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.78.0.tgz", + "integrity": "sha512-33wRf6HqGNsybJ3qX4cGaQN2ODPxNmc1rMa0mrTmx3eFq1VzOnvQooi9bIGVYakW8a/wmqVx1mgsUm8R2xfTiw==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-x64-gnu": { + "version": "1.78.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.78.0.tgz", + "integrity": "sha512-rRdISSYegj6VganMZ9tjRjijowfHJ09IZU01i0toBAqr6n5LEtwHq2IeS4FjW2RoskOHlb6efB26H5izYb3GEQ==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-x64-musl": { + "version": "1.78.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-musl/-/binding-linux-x64-musl-1.78.0.tgz", + "integrity": "sha512-GmsP4rW0xTL6u5CVdcDsaN5Fbc7hBc382Wmar1kttbnwSEviM+rSINKOMQ+UQ6iH+AGwC+8gaAiwu134Tgh6Lg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-openharmony-arm64": { + "version": "1.78.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-openharmony-arm64/-/binding-openharmony-arm64-1.78.0.tgz", + "integrity": "sha512-sy9yeYuADc8a+n4TLBayzMCZiHPW78DcIFVpOXTmdKHWQeM9xe5uzkqIIZmi326D5hY9XVwacipEB1p7tQjPAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-win32-arm64-msvc": { + "version": "1.78.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.78.0.tgz", + "integrity": "sha512-rjc2hF1KfMi8fZj1X/m3AmnHbdsF3rL0v6KQg0Uc880Yb2khjz+3U14sfdZ7jWTpRnN1m1NQa/TT7uU9lJWPrA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-win32-ia32-msvc": { + "version": "1.78.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.78.0.tgz", + "integrity": "sha512-zcuXFVrEFHIafRfkCQT8w/Xe41o07ozl/vwHq7p94vB29xVzsB0sZGYORU1jhcYKv3Lr0J3HbJ2T4fHH5rWmvA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-win32-x64-msvc": { + "version": "1.78.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.78.0.tgz", + "integrity": "sha512-Sb5ocmLSuYeOuXd+CFOToGKp/gjXUEWDnvIGwhnh8aq8wY4TMmEnKnvbogSW7RdMZv77JSARduS7/gv+khYEjA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.4.tgz", + "integrity": "sha512-jHC2cnyKz5xU2fhECtFl8OZ83cYNt13GZQD+0uMJ/X3o+ijmd56okHhTUwxVSHPx1IRVIJEZ1/1pPzeLCU6XKA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.4.tgz", + "integrity": "sha512-Dc5mPD8F5F/FS8i01syd7FTF6yB2fVthH/TRkjwJkzUK6EpoxHtqvZQP5Zwq80/5z19TWYHIg1KOHboCgVx/aQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.4.tgz", + "integrity": "sha512-fpDm4oBo6SqLvWUYCmFhdde3U9KH2fRNNMeAnAPAIwxRL345xutL0EtEUcuoxsoazdJGv/MuDBQHlCDrtbvqOg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.4.tgz", + "integrity": "sha512-rSJoreDE/HoIzoaib6MTp5jQtCTdMHKIvItAKT/ImS6Y6Ww76oUaeMyp4Vc/fAgd/ehji068IxetHXAnqUwN9A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.4.tgz", + "integrity": "sha512-/jm8OGHgn7oGaJu3i/qZI9spUGcJ+y/lk43ttQ/iO1tOd9NissG6o97bighBCiL+BKRngmcDuR6ikfwYdJmVuQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.4.tgz", + "integrity": "sha512-tIP06BeD9EqvECBrPZ+sqdPlYrT+aYaAiu1wYziVx5elRK/ftm33JxVDy2bXGbr6J0CrtirCkR87/X5a2euEng==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.4.tgz", + "integrity": "sha512-Ql1Q0EQqVThvn9VAVlwNzsUvbSFtCMGjLpRRi4pk5i7NZZ4n5ISiLMjHYtus4VQ2PvkSw24zyaCVsiS+sXPj1w==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.4.tgz", + "integrity": "sha512-GjbjXD4XXfN19D0LZNbmiCBUoDiRACsYHr0yaIbbn8aFsXjHZifcYqu/W5Er5X2X990WjHXFrxarn5chzItorQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.4.tgz", + "integrity": "sha512-p5WR0NOwaRmJ/B1b6IjEFLLivwEsf3PrdBIhRbhTCQisbo2SvHHpG4ELB/+FgQNnB88LTOF86upmJmbvZdQ2lw==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.4.tgz", + "integrity": "sha512-4/GyVjmhR+Tc6HLJvwc1sOhPqAZtySiSMesOZyX6JQ5XBxoTDEMKQzvo07NIK6nTon/SivlZqvhzvuVBNQhObQ==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.4.tgz", + "integrity": "sha512-l9eeLsCNvPpmSXUej0etw/J1eqV0Jj1D5G/xG6YTijmE6dkv6E2QezgWbTfQk63v952DPqrjOCoiqxq7Bw0YUQ==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.4.tgz", + "integrity": "sha512-e0F355MSTMm3+UOqtV3L24gFUp2N5m1f8L/7d56deik6va+AXdrt9F8LbzGpeWGWRbZEDq4m8NVnJDeBtf9DZg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.4.tgz", + "integrity": "sha512-AWLi0uBRYh6QlE7OKhiz+phZC0qwtij2QZmhmOdsLdFn64m7oMpooE9ICE3lhm9xMb4SpDo2WbHcxX1iFLFtqw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.4.tgz", + "integrity": "sha512-UwSDJOg3dqCAejWdxclJjCsh3Qq4vLYMDxmyHqo1btz3stK2VqgwNd3mm5tuIwzSlGIQ/1H9Hr+Zn09mrezNqQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "19.2.18", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.18.tgz", + "integrity": "sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.4.tgz", + "integrity": "sha512-Bsc+QHgp+P/F02XDzNCY9jnZNCUuLki36KT7VKrTXXLdHf+vHMNZnW1rVu5DNW/rCK+fya3DATySbLM4yhtKUw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.2.0" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.0.5.tgz", + "integrity": "sha512-BOVzne/NL162sMdResB25mUv+vWMF5NoAjNf09TeGlE7ZpszZWSD3winycicLJw72yeVsoCn/2kOhEuCvEShMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "^1.0.1" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", + "babel-plugin-react-compiler": "^1.0.0", + "vite": "^8.0.0" + }, + "peerDependenciesMeta": { + "@rolldown/plugin-babel": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + } + } + }, + "node_modules/cookie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/lightningcss": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz", + "integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.33.0", + "lightningcss-darwin-arm64": "1.33.0", + "lightningcss-darwin-x64": "1.33.0", + "lightningcss-freebsd-x64": "1.33.0", + "lightningcss-linux-arm-gnueabihf": "1.33.0", + "lightningcss-linux-arm64-gnu": "1.33.0", + "lightningcss-linux-arm64-musl": "1.33.0", + "lightningcss-linux-x64-gnu": "1.33.0", + "lightningcss-linux-x64-musl": "1.33.0", + "lightningcss-win32-arm64-msvc": "1.33.0", + "lightningcss-win32-x64-msvc": "1.33.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz", + "integrity": "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz", + "integrity": "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz", + "integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz", + "integrity": "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz", + "integrity": "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz", + "integrity": "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz", + "integrity": "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz", + "integrity": "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz", + "integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz", + "integrity": "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz", + "integrity": "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/nanoid": { + "version": "3.3.18", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz", + "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/oxlint": { + "version": "1.78.0", + "resolved": "https://registry.npmjs.org/oxlint/-/oxlint-1.78.0.tgz", + "integrity": "sha512-QgQePuxIqKOzo1KSjG2EnITEeWvWnKAm77eq8nrMtf6AGoA+zyGc4PFYtDNJSD25g/ibOwfQ851hZ4/SPkMVoA==", + "dev": true, + "license": "MIT", + "bin": { + "oxlint": "bin/oxlint" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/sponsors/Boshen" + }, + "optionalDependencies": { + "@oxlint/binding-android-arm-eabi": "1.78.0", + "@oxlint/binding-android-arm64": "1.78.0", + "@oxlint/binding-darwin-arm64": "1.78.0", + "@oxlint/binding-darwin-x64": "1.78.0", + "@oxlint/binding-freebsd-x64": "1.78.0", + "@oxlint/binding-linux-arm-gnueabihf": "1.78.0", + "@oxlint/binding-linux-arm-musleabihf": "1.78.0", + "@oxlint/binding-linux-arm64-gnu": "1.78.0", + "@oxlint/binding-linux-arm64-musl": "1.78.0", + "@oxlint/binding-linux-ppc64-gnu": "1.78.0", + "@oxlint/binding-linux-riscv64-gnu": "1.78.0", + "@oxlint/binding-linux-riscv64-musl": "1.78.0", + "@oxlint/binding-linux-s390x-gnu": "1.78.0", + "@oxlint/binding-linux-x64-gnu": "1.78.0", + "@oxlint/binding-linux-x64-musl": "1.78.0", + "@oxlint/binding-openharmony-arm64": "1.78.0", + "@oxlint/binding-win32-arm64-msvc": "1.78.0", + "@oxlint/binding-win32-ia32-msvc": "1.78.0", + "@oxlint/binding-win32-x64-msvc": "1.78.0" + }, + "peerDependencies": { + "oxlint-tsgolint": ">=7.0.2001", + "vite-plus": "*" + }, + "peerDependenciesMeta": { + "oxlint-tsgolint": { + "optional": true + }, + "vite-plus": { + "optional": true + } + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.26", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz", + "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.17", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/react": { + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.8.tgz", + "integrity": "sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.8.tgz", + "integrity": "sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.8" + } + }, + "node_modules/react-router": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.18.2.tgz", + "integrity": "sha512-aUVMjFm3GAPTTZL7oYr5E7ETiqfQCHRLH+B+5afnICvf0r7kkK4eR6SMuwbSTJw/7t+12khT/Kahij49fqOCIg==", + "license": "MIT", + "dependencies": { + "cookie": "^1.0.1", + "set-cookie-parser": "^2.6.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/react-router-dom": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.18.2.tgz", + "integrity": "sha512-AIKJ/jgGlFb3EbfCXk5Gzshiwt+l3mqbCrNjmEWMMjqQxNJ3svBa6bgzFyCC2Sw3RA0VWF1kg3uQf2OFhxb8hw==", + "license": "MIT", + "dependencies": { + "react-router": "7.18.2" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/rolldown": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.4.tgz", + "integrity": "sha512-rSr7irW0K7QRWzjdJXqZowkcRdDtjRduh43rBltnVKd0VFq839l1lJoDvGJb6gl7+4rTTCrPWu+YfujUL8Ug7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.144.0", + "@rolldown/pluginutils": "^1.0.0" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm64": "1.2.4", + "@rolldown/binding-darwin-arm64": "1.2.4", + "@rolldown/binding-darwin-x64": "1.2.4", + "@rolldown/binding-freebsd-x64": "1.2.4", + "@rolldown/binding-linux-arm-gnueabihf": "1.2.4", + "@rolldown/binding-linux-arm64-gnu": "1.2.4", + "@rolldown/binding-linux-arm64-musl": "1.2.4", + "@rolldown/binding-linux-ppc64-gnu": "1.2.4", + "@rolldown/binding-linux-s390x-gnu": "1.2.4", + "@rolldown/binding-linux-x64-gnu": "1.2.4", + "@rolldown/binding-linux-x64-musl": "1.2.4", + "@rolldown/binding-openharmony-arm64": "1.2.4", + "@rolldown/binding-win32-arm64-msvc": "1.2.4", + "@rolldown/binding-win32-x64-msvc": "1.2.4" + } + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, + "node_modules/set-cookie-parser": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", + "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==", + "license": "MIT" + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/vite": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.2.1.tgz", + "integrity": "sha512-EU/eS7BH3XROHh2YnBefjM6DBKA6ZeMZEYQbj7NLWg5wHYlhB8B/Mayd5XsgWq+NFYccDOTemRpdETWR6Ka/lw==", + "dev": true, + "license": "MIT", + "dependencies": { + "lightningcss": "^1.33.0", + "picomatch": "^4.0.5", + "postcss": "^8.5.25", + "rolldown": "~1.2.1", + "tinyglobby": "^0.2.17" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.4.0", + "esbuild": "^0.27.0 || ^0.28.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + } + } +} diff --git a/react-ui/package.json b/react-ui/package.json new file mode 100644 index 0000000..15bf6b8 --- /dev/null +++ b/react-ui/package.json @@ -0,0 +1,24 @@ +{ + "name": "react-ui", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "lint": "oxlint", + "preview": "vite preview" + }, + "dependencies": { + "react": "^19.2.8", + "react-dom": "^19.2.8", + "react-router-dom": "^7.18.2" + }, + "devDependencies": { + "@types/react": "^19.2.17", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react": "^6.0.4", + "oxlint": "^1.75.0", + "vite": "^8.2.0" + } +} diff --git a/react-ui/public/favicon.svg b/react-ui/public/favicon.svg new file mode 100644 index 0000000..6893eb1 --- /dev/null +++ b/react-ui/public/favicon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/react-ui/public/icons.svg b/react-ui/public/icons.svg new file mode 100644 index 0000000..e952219 --- /dev/null +++ b/react-ui/public/icons.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/react-ui/src/App.css b/react-ui/src/App.css new file mode 100644 index 0000000..9cd4a86 --- /dev/null +++ b/react-ui/src/App.css @@ -0,0 +1,80 @@ +:root { --ink:#080808; --paper:#f1f1ec; --signal:#b7ff00; --dim:#8a8a84; --line:#44443f; } +.app-shell { min-height:100vh; overflow:hidden; } +.site-header { min-height:100px; padding:1rem clamp(1rem,3vw,2.5rem); border-bottom:1px solid var(--paper); display:flex; align-items:center; justify-content:space-between; gap:2rem; } +.brand { display:flex; flex-direction:column; font-family:"Archivo Black",sans-serif; font-size:clamp(1.7rem,4vw,3.4rem); line-height:.78; letter-spacing:-.07em; text-decoration:none; text-transform:uppercase; } +.brand small { margin-top:.9rem; font-family:"IBM Plex Mono",monospace; font-size:.58rem; line-height:1; letter-spacing:.15em; } +.signal { display:flex; align-items:center; gap:.65rem; border:1px solid var(--line); padding:.6rem .75rem; color:var(--signal); font-size:.68rem; text-transform:uppercase; } +.signal-stack { display:flex; flex-direction:column; align-items:flex-end; gap:.42rem; } +.header-signature { margin-right:.18rem; color:var(--paper); font-size:.7rem; font-weight:500; letter-spacing:-.03em; transform:rotate(-2deg); opacity:.78; } +.signal i { width:.55rem; height:.55rem; border-radius:50%; background:var(--signal); box-shadow:0 0 12px var(--signal); animation:blink 1.4s step-end infinite; } +.signal span { color:var(--dim); } +@keyframes blink { 50% { opacity:.15; } } +.ticker { overflow:hidden; border-bottom:1px solid var(--paper); background:var(--signal); color:var(--ink); white-space:nowrap; font-size:.72rem; font-weight:600; letter-spacing:.1em; } +.ticker span { display:inline-block; min-width:max-content; padding:.42rem 0; animation:crawl 30s linear infinite; } +@keyframes crawl { to { transform:translateX(-50%); } } +.page { width:min(1500px,calc(100% - 2rem)); margin:0 auto; padding:clamp(3rem,7vw,7rem) 0 7rem; } +h1,h2 { font-family:"Archivo Black",sans-serif; text-transform:uppercase; } +h1 { max-width:1200px; margin:.35rem 0 2rem; font-size:clamp(4rem,12vw,10.5rem); line-height:.76; letter-spacing:-.075em; } +h2 { letter-spacing:-.05em; } +p { line-height:1.65; } +.eyebrow { margin:0 0 1rem; color:var(--signal); font-size:.72rem; font-weight:600; letter-spacing:.15em; text-transform:uppercase; } +.page-heading { display:flex; align-items:flex-end; justify-content:space-between; gap:2rem; margin-bottom:4rem; } +.page-heading h1 { margin-bottom:0; } +.hero-heading { min-height:32vh; } +.meta { color:var(--dim); text-transform:uppercase; font-size:.76rem; letter-spacing:.08em; } +.card-grid { display:grid; grid-template-columns:repeat(12,1fr); border-top:1px solid var(--paper); border-left:1px solid var(--paper); } +.card { position:relative; grid-column:span 4; min-height:250px; padding:1rem; border-right:1px solid var(--paper); border-bottom:1px solid var(--paper); background:var(--ink); transition:background .15s,color .15s; } +.card:nth-child(5n + 1),.card:nth-child(5n + 4) { grid-column:span 8; } +.card:hover { color:var(--ink); background:var(--signal); } +.card-index { font-size:.66rem; color:var(--dim); } +.card h2 { max-width:14ch; margin:5rem 0 .75rem; font-size:clamp(1.55rem,3.2vw,3.4rem); line-height:.9; } +.card h2 a { text-decoration:none; } +.card p { margin:0; color:var(--dim); font-size:.68rem; text-transform:uppercase; } +.card:hover p,.card:hover .card-index { color:var(--ink); } +.arrow { display:inline-block; margin-left:.25em; font-family:sans-serif; font-size:.45em; vertical-align:top; } +.button,button { display:inline-block; min-width:150px; padding:.85rem 1rem; border:1px solid var(--paper); color:var(--ink); background:var(--paper); cursor:pointer; text-align:center; text-decoration:none; text-transform:uppercase; font-size:.7rem; font-weight:600; letter-spacing:.08em; } +.button:hover,button:hover { border-color:var(--signal); background:var(--signal); } +.button.secondary { color:var(--paper); background:transparent; } +.danger { border-color:#ff4b39; color:#ff4b39; background:transparent; } +.actions { display:flex; flex-wrap:wrap; gap:.5rem; margin:3rem 0; } +.profile-title { border-bottom:1px solid var(--paper); padding-bottom:2rem; } +.profile-intro { display:grid; grid-template-columns:1fr 2fr; gap:4rem; margin:2rem 0; } +.biography { max-width:75ch; margin:0; font-size:clamp(1rem,1.5vw,1.35rem); } +.external-link { text-transform:uppercase; font-size:.72rem; letter-spacing:.08em; } +.section { margin-top:5rem; padding-top:1rem; border-top:1px solid var(--paper); } +.section-heading { display:flex; align-items:baseline; justify-content:space-between; } +.section-heading h2,.section>h2 { margin:0 0 2rem; font-size:clamp(2rem,6vw,5rem); } +.section-heading span { color:var(--signal); font-size:.7rem; text-transform:uppercase; } +.collection-list { margin:0; padding:0; border-top:1px solid var(--line); list-style:none; } +.collection-list li { border-bottom:1px solid var(--line); } +.collection-list a { display:grid; grid-template-columns:3rem minmax(180px,1fr) minmax(220px,1fr); align-items:baseline; gap:1rem; padding:1.1rem .4rem; text-decoration:none; transition:padding .15s,background .15s,color .15s; } +.collection-list a:hover { padding-left:1rem; color:var(--ink); background:var(--signal); } +.collection-list i { color:var(--dim); font-size:.66rem; font-style:normal; } +.collection-list strong { text-transform:uppercase; } +.collection-list span { color:var(--dim); text-align:right; font-size:.72rem; text-transform:uppercase; } +.collection-list a:hover span,.collection-list a:hover i { color:var(--ink); } +.record-form { display:grid; gap:1.2rem; max-width:760px; } +.record-form label { display:grid; gap:.45rem; font-size:.7rem; font-weight:600; letter-spacing:.08em; text-transform:uppercase; } +.record-form input,.record-form select,.record-form textarea { width:100%; border:1px solid var(--line); border-radius:0; outline:0; color:var(--paper); background:#111; padding:1rem; } +.record-form input:focus,.record-form select:focus,.record-form textarea:focus { border-color:var(--signal); box-shadow:5px 5px 0 var(--signal); } +.record-form textarea { resize:vertical; } +.record-form .button { justify-self:start; } +.record-form fieldset { display:grid; gap:1.2rem; margin:.5rem 0; padding:1.2rem; border:1px solid var(--line); } +.record-form legend { padding:0 .5rem; color:var(--signal); font-size:.75rem; text-transform:uppercase; } +.record-form small { color:var(--dim); } +.status { padding:1rem; border:1px solid var(--line); color:var(--signal); background:#111; } +.status.error { border-color:#ff4b39; color:#ff4b39; } +.details { display:flex; flex-wrap:wrap; gap:3rem; margin:2rem 0; } +.details dt { color:var(--signal); font-size:.65rem; text-transform:uppercase; letter-spacing:.1em; } +.details dd { margin:.35rem 0 0; } +.profile-flag { display:inline-block; margin-right:.55rem; font-family:sans-serif; font-size:clamp(1.35rem,2.2vw,2.15rem); line-height:1; vertical-align:.32em; white-space:nowrap; filter:grayscale(1) contrast(1.8); -webkit-filter:grayscale(1) contrast(1.8); } +.collection-heading { display:grid; grid-template-columns:auto 1fr; align-items:start; gap:1.5rem; } +.collection-heading h1 { margin-bottom:0; } +.label-monogram { display:flex; flex:0 0 5rem; align-items:center; justify-content:center; width:5rem; height:5rem; border:1px solid var(--signal); color:var(--signal); font-weight:600; letter-spacing:.08em; } +.video-frame { position:relative; max-width:1100px; aspect-ratio:16/9; border:1px solid var(--paper); background:#000; box-shadow:12px 12px 0 var(--signal); } +.video-frame::after { position:absolute; top:.75rem; right:.75rem; content:"ARCHIVE FEED"; padding:.25rem .4rem; color:var(--ink); background:var(--signal); font-size:.58rem; } +.video-frame iframe { width:100%; height:100%; border:0; } +.site-footer { display:flex; justify-content:space-between; padding:1rem clamp(1rem,3vw,2.5rem); border-top:1px solid var(--paper); color:var(--dim); font-size:.62rem; letter-spacing:.1em; } +.digital-signature { color:var(--paper); font-size:.76rem; font-weight:500; letter-spacing:-.04em; text-transform:none; transform:rotate(-2deg); } +@media (max-width:760px) { .site-header{align-items:flex-start}.signal span{display:none}.page{width:min(100% - 1rem,1500px)}.page-heading,.profile-intro{display:block}.page-heading .button{margin-top:2rem}.hero-heading{min-height:26vh}.card{grid-column:span 12!important;min-height:190px}.collection-heading{grid-template-columns:1fr}.collection-list a{grid-template-columns:2rem 1fr}.collection-list span{grid-column:2;text-align:left}.site-footer{gap:1rem} } +@media (prefers-reduced-motion:reduce) { .ticker span,.signal i { animation:none; } } diff --git a/react-ui/src/App.jsx b/react-ui/src/App.jsx new file mode 100644 index 0000000..c1c419e --- /dev/null +++ b/react-ui/src/App.jsx @@ -0,0 +1,24 @@ +import { BrowserRouter, Route, Routes } from "react-router-dom"; +import Layout from "./components/Layout"; +import CollectionDetail from "./pages/CollectionDetail"; +import CollectionForm from "./pages/CollectionForm"; +import DesignerDetail from "./pages/DesignerDetail"; +import DesignerForm from "./pages/DesignerForm"; +import DesignerList from "./pages/DesignerList"; +import NotFound from "./pages/NotFound"; +import "./App.css"; + +export default function App() { + return ( + }> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + + ); +} diff --git a/react-ui/src/api.js b/react-ui/src/api.js new file mode 100644 index 0000000..72f3a92 --- /dev/null +++ b/react-ui/src/api.js @@ -0,0 +1,43 @@ +const API_ROOT = "/api"; + +function describeApiError(detail, fallback) { + if (typeof detail === "string" && detail) return detail; + + if (Array.isArray(detail)) { + const messages = detail + .map((item) => String(item?.msg || "").replace(/^Value error,\s*/, "")) + .filter(Boolean); + if (messages.length) return messages.join(" "); + } + + return fallback; +} + +export async function apiRequest(path, options = {}) { + const response = await fetch(`${API_ROOT}${path}`, { + ...options, + headers: { + ...(options.body ? { "Content-Type": "application/json" } : {}), + ...options.headers, + }, + }); + + if (response.status === 204) return null; + + let payload = null; + try { + payload = await response.json(); + } catch { + payload = null; + } + + if (!response.ok) { + throw new Error( + payload + ? describeApiError(payload.detail, "The request could not be completed.") + : `The request failed (HTTP ${response.status}).` + ); + } + + return payload; +} diff --git a/react-ui/src/assets/hero.png b/react-ui/src/assets/hero.png new file mode 100644 index 0000000..02251f4 Binary files /dev/null and b/react-ui/src/assets/hero.png differ diff --git a/react-ui/src/assets/react.svg b/react-ui/src/assets/react.svg new file mode 100644 index 0000000..6c87de9 --- /dev/null +++ b/react-ui/src/assets/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/react-ui/src/assets/vite.svg b/react-ui/src/assets/vite.svg new file mode 100644 index 0000000..5101b67 --- /dev/null +++ b/react-ui/src/assets/vite.svg @@ -0,0 +1 @@ +Vite diff --git a/react-ui/src/components/Layout.jsx b/react-ui/src/components/Layout.jsx new file mode 100644 index 0000000..e0a65fd --- /dev/null +++ b/react-ui/src/components/Layout.jsx @@ -0,0 +1,38 @@ +import { Link, Outlet } from "react-router-dom"; + +export default function Layout() { + return ( +
+
+ + ONE→MANY + DESIGN TRANSMISSION ARCHIVE + +
+
+