From b7980e457e1dff3c462b1c226bc22236f269c0d0 Mon Sep 17 00:00:00 2001 From: mw9982 Date: Tue, 29 Sep 2026 10:58:06 -0400 Subject: [PATCH 1/4] Add unlisted /deck sales page for Light & Sound Design. Co-authored-by: Cursor --- frontend/static/deck/SerialB-Light.woff2 | Bin 0 -> 36792 bytes frontend/styles/deck.css | 94 ++++++ frontend/styles/main.css | 1 + frontend/templates/deck.html | 347 +++++++++++++++++++++++ src/app/home.rs | 21 ++ src/main.rs | 28 +- 6 files changed, 484 insertions(+), 7 deletions(-) create mode 100644 frontend/static/deck/SerialB-Light.woff2 create mode 100644 frontend/styles/deck.css create mode 100644 frontend/templates/deck.html diff --git a/frontend/static/deck/SerialB-Light.woff2 b/frontend/static/deck/SerialB-Light.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..1a9b02d41712cf13e243258d6f5c8c5e96fe59e9 GIT binary patch literal 36792 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�OtPJr2@;oVG7^C%yYqT)0#s9qPFNA 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 literal 0 HcmV?d00001 diff --git a/frontend/styles/deck.css b/frontend/styles/deck.css new file mode 100644 index 00000000..7b44e20b --- /dev/null +++ b/frontend/styles/deck.css @@ -0,0 +1,94 @@ +/* Unlisted sales deck: one Dance film, copy fades in place. */ + +@font-face { + font-family: "Serial B"; + src: url("/static/deck/SerialB-Light.woff2") format("woff2"); + font-weight: 300; + font-style: normal; + font-display: swap; +} + +html:has(#deck), +body:has(#deck) { + height: 100%; + overflow: hidden; +} + +body:has(#deck) main { + @apply w-full max-w-none items-stretch p-0; +} + +#deck { + @apply relative w-full; +} + +#deck .films { + @apply pointer-events-none fixed inset-0 z-0; + filter: blur(14px); +} + +#deck .film { + @apply absolute inset-0 h-full w-full border-0; +} + +#deck .scrim { + @apply pointer-events-none fixed inset-0 z-10; + background: rgb(8 5 4 / 0.52); +} + +#deck .copy { + @apply pointer-events-none fixed inset-0 z-20; + font-family: "Serial B", system-ui, sans-serif; + font-weight: 300; +} + +#deck .copy section { + @apply absolute top-1/2 left-1/2 flex w-[min(42rem,calc(100%-3rem))] -translate-x-1/2 -translate-y-1/2 flex-col justify-center gap-5; + opacity: 0; + transition: opacity 0.65s ease; +} + +#deck .copy section.is-on { + opacity: 1; + pointer-events: auto; +} + +@media (prefers-reduced-motion: reduce) { + #deck .copy section { + transition: none; + } +} + +#deck .copy h2 { + @apply text-lsd-bright text-sm tracking-[0.2em] uppercase; +} + +#deck .copy p { + @apply text-lsd-white text-xl leading-snug md:text-2xl; + text-shadow: 0 1px 12px rgb(8 5 4 / 0.8); + /* pretty + no hyphenation: last line does not drop a single word as type scales */ + text-wrap: pretty; + hyphens: none; + -webkit-hyphens: none; +} + +#deck .copy .line { + @apply text-lsd-bright text-2xl leading-tight md:text-4xl; + text-wrap: pretty; +} + +#deck .copy a { + @apply text-lsd-white underline decoration-lsd-blue underline-offset-4; +} + +#deck .nav { + @apply fixed right-5 bottom-5 z-30 flex gap-2; +} + +#deck .nav button { + @apply text-lsd-white/80 border border-white/30 px-3 py-2 text-sm leading-none; +} + +#deck .nav button:disabled { + @apply opacity-30; +} diff --git a/frontend/styles/main.css b/frontend/styles/main.css index 05e84f94..14c99ff7 100644 --- a/frontend/styles/main.css +++ b/frontend/styles/main.css @@ -15,6 +15,7 @@ @import "./error.css"; @import "./message.css"; @import "./sublet.css"; +@import "./deck.css"; /* Events */ @import "./events/edit.css"; diff --git a/frontend/templates/deck.html b/frontend/templates/deck.html new file mode 100644 index 00000000..89a7fcad --- /dev/null +++ b/frontend/templates/deck.html @@ -0,0 +1,347 @@ +{% extends "layout_no_nav.html" %} + +{% block title %}Light & Sound Design{% endblock title %} + +{% block content %} +
+ + +
+
+

01 — Open

+

A studio for making worlds.

+

+ Light & Sound Design Studio is the container for a decade-long + practice of building environments, shaping atmosphere, and creating + experiences that make another world feel possible, tangible and within + reach. +

+

+ L&SD’s Luxury Service Division creates experiences that show our + clients and their communities that another world is possible. +

+
+ +
+

02 — Lineage

+

It started with a gathering.

+

+ The Last Saturday Dance began in 2016. There was no venue, production + department or playbook. Just a room, a sound system, some lights and + the instinct to transform the space, creating unique worlds for people + to enter with intention. +

+

+ Over the years, the gathering moved through factories, warehouses, + studios, metal shops and borrowed rooms. Every time, the environment + had to be built. Then broken down. Then built again. That repetition + became a practice. +

+

+ In 2022, we found a permanent container for it: a loft on Huron + Street. +

+
+ +
+

03 — The Incubator

+

The loft became an incubator for the practice.

+

+ Ideas get tested here at full scale. Light, sound, design, + fabrication, food, casting and atmosphere come together in one + environment, in real time, with real people. +

+

+ Build. Observe. Refine. Repeat. A decade of gathering has become a way + of working: experimental, collaborative and deeply + hands‑on. +

+

The party was never the point. The practice was.

+
+ +
+

04 — The Practice

+

+ The room is an instrument, its character shaped through light, sound + and design. +

+
+ +
+

Light

+

+ We design it, program it and live with it. Light changes the scale of + a room, directs attention and shapes how people move through it. It is + not decoration. It is part of the architecture of the experience. +

+
+ +
+

Sound

+

+ We built the room around deep listening. The system is part of the + architecture, not something added after the fact. The sound is + physical, immersive and considered from every position in the room. +

+

+ Over the years, the room has held Francois K, DJ True, Jacky Sommer, + UMADJ, livwutang, Ron Like Hell, Enzo, Takaya Nagase, Mo Yasin, Niyah + West, Stonie Blue, datadata, Scott Zacharias, Cesar, 30,000AD, Ayanna + Heaven, Genevieve D, Mark Ernestus and KG. +

+

+ Artists come to contribute to the room's history, not simply to play + in it. +

+
+ +
+

Design

+

+ The environment is the work. Architecture, atmosphere, objects, light + and sound are considered together, then shaped through use. Nothing is + fixed. The room evolves through what happens inside it. +

+
+ +
+

05 — Fabrication

+

If the environment needs to be built, we build it.

+

+ For years, the practice has extended beyond the room itself into + custom environments, fixtures, structures and objects. The same hands + that build the studio build what the experience requires. Custom + lighting. Custom furniture. Custom structures. Built for the space, + the moment and the people inside it. +

+

+ That work has taken shape for Nike, Maison Margiela, American Eagle, + Vogue, Harper’s Bazaar, Calvin Klein, Pyer Moss, Max Mara and others + across events, editorial and brand experiences. +

+

+ At Huron, fabrication is part of the practice. The speakers, the + booth, the walls, the objects around you: built here, tested here, + refined here. If it needs to exist, we can make it. +

+
+ +
+

06 — Nourishment

+

+ Nourishment is integral to the worlds we create. +

+

+ Chefs and cooks are part of the practice, creating food that belongs + to the room rather than simply arriving in it. There are no catering + menus. We construct food around how people gather and what engages + their senses. +

+

+ The same kitchen that has fed this incubator can become part of yours, + thoughtfully integrated into your experience. +

+
+ +
+

07 — The Living Element

+

Atmosphere takes form through natural materials.

+

+ We introduce flowers, foliage and organic materials into the + architecture to alter the character of the space and create tension + between what is built and what is alive. These materials bring color, + texture, scale and movement into the room. +

+

+ This work is responsive to the space and to the intentions we are + setting. It grows from the environment rather than sitting on top of + it. +

+

+ Our floral artists work with locally sourced materials to make that + transformation possible, bringing their own sensibility to the room + and to the worlds we create. +

+
+ +
+

08 — One Practice

+

+ Creative direction, production, fabrication and casting are part of + the same practice. +

+

+ We can develop the idea, shape the environment, build what it requires + and produce the experience from beginning to end. One studio. One + team. One shared point of view. +

+

+ The result is a world that feels considered from every angle because + it was made that way. +

+
+ +
+

09 — Close

+

+ Bring Us the Brief. We’ll build the world around it. +

+

+ We want to work alongside you to give physical form to your vision, + creating experiences that are considered, immersive and enduring. +

+

+ lightandsound.design +

+

+ studio@lightandsound.design +

+
+
+ +
+{% endblock content %} + +{% block scripts %} + +{% endblock scripts %} diff --git a/src/app/home.rs b/src/app/home.rs index 1cd0e6e7..188a47e0 100644 --- a/src/app/home.rs +++ b/src/app/home.rs @@ -8,6 +8,7 @@ pub fn add_routes(router: AppRouter) -> AppRouter { r.route("/", get(home_page)) .route("/past", get(past_page)) .route("/sublet", get(sublet_page)) + .route("/deck", get(deck_page)) }) // TODO: Rethink roles, not WRITER. Template out buttons based on role. .restricted_routes(User::WRITER, |r| r.route("/dashboard", get(dashboard_page))) @@ -57,3 +58,23 @@ struct SubletHtml { async fn sublet_page(user: Option) -> HtmlResult { Ok(SubletHtml { user }.into_response()) } + +#[derive(Template, WebTemplate)] +#[template(path = "deck.html")] +struct DeckHtml { + film_origin: &'static str, +} + +/// Unlisted sales deck. Not linked from EVENTS / PAST / GALLERY. +async fn deck_page() -> HtmlResult { + Ok(DeckHtml { + // Local Next on :3000 while workshopping. Prod iframes the live Dance + // embed on Max's site (password skipped via ?embed=1). + film_origin: if cfg!(debug_assertions) { + "http://localhost:3000" + } else { + "https://www.maxweinman.net" + }, + } + .into_response()) +} diff --git a/src/main.rs b/src/main.rs index 306a2095..a30c2338 100644 --- a/src/main.rs +++ b/src/main.rs @@ -60,19 +60,33 @@ async fn main() -> Result<()> { let (router, state) = app::build(config.clone()).await?; // HTTP/3 sidesteps make_service, so utils::h3 injects ConnectInfo itself let router_h3 = router.clone(); + let router_http = router.clone(); let app = router.into_make_service_with_connect_info::(); tracing::info!("Live at {}", &config.app.url); // Spawn periodic jobs jobs::init(state, config.clone()).await; - // Spawn an auxillary HTTP server which just redirects to HTTPS - tokio::spawn(async move { - let redirect = move || async move { Redirect::permanent(&config.app.url) }; - axum_server::bind(config.net.http_addr) - .serve(redirect.into_make_service()) - .await - }); + // Dev (no ACME): serve the real app on HTTP so a local Next iframe + // does not hit mixed-content or self-signed cert walls. + // Prod: HTTP only redirects to HTTPS. + if config.acme.is_none() { + let http_addr = config.net.http_addr; + tokio::spawn(async move { + let http_app = router_http.into_make_service_with_connect_info::(); + tracing::info!("HTTP (dev) at http://localhost:{}", http_addr.port()); + if let Err(err) = axum_server::bind(http_addr).serve(http_app).await { + tracing::error!("HTTP server: {err}"); + } + }); + } else { + tokio::spawn(async move { + let redirect = move || async move { Redirect::permanent(&config.app.url) }; + axum_server::bind(config.net.http_addr) + .serve(redirect.into_make_service()) + .await + }); + } // Spawn the main HTTPS server match config.acme { From 87b179f9ebb428ae4622500fa68597d6d0b02568 Mon Sep 17 00:00:00 2001 From: mw9982 Date: Tue, 29 Sep 2026 11:33:55 -0400 Subject: [PATCH 2/4] Rewrite Luxury Service Division line on /deck. Co-authored-by: Cursor --- frontend/templates/deck.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/templates/deck.html b/frontend/templates/deck.html index 89a7fcad..e8ba52e8 100644 --- a/frontend/templates/deck.html +++ b/frontend/templates/deck.html @@ -25,8 +25,8 @@

01 — Open

reach.

- L&SD’s Luxury Service Division creates experiences that show our - clients and their communities that another world is possible. + L&SD’s Luxury Service Division works to make those possibilities + accessible to our clients and their communities.*

From 14c048bc36178677f617b0d28025912f321dc17a Mon Sep 17 00:00:00 2001 From: mw9982 Date: Tue, 29 Sep 2026 11:44:57 -0400 Subject: [PATCH 3/4] Drop asterisk from Luxury Service line. Co-authored-by: Cursor --- frontend/templates/deck.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/templates/deck.html b/frontend/templates/deck.html index e8ba52e8..067efd92 100644 --- a/frontend/templates/deck.html +++ b/frontend/templates/deck.html @@ -26,7 +26,7 @@

01 — Open

L&SD’s Luxury Service Division works to make those possibilities - accessible to our clients and their communities.* + accessible to our clients and their communities.

From 6f6aefdc638c703f87ed48065fcc6516588d8810 Mon Sep 17 00:00:00 2001 From: mw9982 Date: Tue, 29 Sep 2026 13:08:23 -0400 Subject: [PATCH 4/4] Restore 50% overlay films and update deck copy. Co-authored-by: Cursor --- frontend/styles/deck.css | 8 +++++++- frontend/templates/deck.html | 23 ++++++++++++++++------- 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/frontend/styles/deck.css b/frontend/styles/deck.css index 7b44e20b..041fc2a6 100644 --- a/frontend/styles/deck.css +++ b/frontend/styles/deck.css @@ -1,4 +1,4 @@ -/* Unlisted sales deck: one Dance film, copy fades in place. */ +/* Unlisted sales deck: two Dance films blended, copy fades in place. */ @font-face { font-family: "Serial B"; @@ -24,6 +24,7 @@ body:has(#deck) main { #deck .films { @apply pointer-events-none fixed inset-0 z-0; + isolation: isolate; filter: blur(14px); } @@ -31,6 +32,11 @@ body:has(#deck) main { @apply absolute inset-0 h-full w-full border-0; } +#deck .film + .film { + mix-blend-mode: overlay; + opacity: 0.5; +} + #deck .scrim { @apply pointer-events-none fixed inset-0 z-10; background: rgb(8 5 4 / 0.52); diff --git a/frontend/templates/deck.html b/frontend/templates/deck.html index 067efd92..e7f906af 100644 --- a/frontend/templates/deck.html +++ b/frontend/templates/deck.html @@ -12,6 +12,13 @@ allow="autoplay" referrerpolicy="no-referrer-when-downgrade" > +
@@ -36,8 +43,8 @@

02 — Lineage

The Last Saturday Dance began in 2016. There was no venue, production department or playbook. Just a room, a sound system, some lights and - the instinct to transform the space, creating unique worlds for people - to enter with intention. + the instinct to transform the space, creating unique worlds for a + community to enter with intention.

Over the years, the gathering moved through factories, warehouses, @@ -56,7 +63,7 @@

03 — The Incubator

The loft became an incubator for the practice.

Ideas get tested here at full scale. Light, sound, design, - fabrication, food, casting and atmosphere come together in one + fabrication, food and atmosphere come together in one environment, in real time, with real people.

@@ -94,8 +101,10 @@

Sound

Over the years, the room has held Francois K, DJ True, Jacky Sommer, UMADJ, livwutang, Ron Like Hell, Enzo, Takaya Nagase, Mo Yasin, Niyah - West, Stonie Blue, datadata, Scott Zacharias, Cesar, 30,000AD, Ayanna - Heaven, Genevieve D, Mark Ernestus and KG. + West, Stonie Blue, datadata, Scott Zacharias, Toribio, 30,000AD, + Ayanna Heaven, Genevieve D, Mark Ernestus, Ron Trent, Keith Fullerton + Whitman, HxH, A Space for Sound, CCL, Objekt, SLINK, KWata, DJ + Marcelle and KG.

Artists come to contribute to the room's history, not simply to play @@ -175,8 +184,8 @@

07 — The Living Element

08 — One Practice

- Creative direction, production, fabrication and casting are part of - the same practice. + Creative direction, production and fabrication are part of the same + practice.

We can develop the idea, shape the environment, build what it requires