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

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
{
"substrateVersion": "1.0.0-milo.1",
"flavor": "milo",
"_comment": "Milo-flavor substrate. Unlike the EDS flavor it does NOT replace head.html / scripts/scripts.js / styles/styles.css / header+footer blocks — that would rip out Milo's runtime, which is what loads the live global-navigation + footer from page metadata. It only ADDS a project-local overlay block (blocks/snowflake) that Milo loads from codeRoot. Chrome is owned by Milo; the body is drawn by the block from /templates/<template>.html.",
"marker": {
"file": "blocks/snowflake/snowflake.js",
"needle": "snowflake — Milo substrate overlay block",
"_comment": "Presence of the overlay block is the install marker for the Milo flavor."
},
"replace": [
{
"src": "blocks/snowflake/snowflake.js",
"dst": "blocks/snowflake/snowflake.js",
"purpose": "Milo overlay block: resolves template name, fetches /templates/<t>.html, lifts its <link>s, loads /styles/<t>.css, applies DA slot overrides, replaces <main>. Leaves <header>/<footer> to Milo."
},
{
"src": "blocks/snowflake/snowflake.css",
"dst": "blocks/snowflake/snowflake.css",
"purpose": "Minimal; hides the (consumed) authoring block. The overlaid body carries its own styles."
}
],
"ignorePatches": [
{
"dst": ".eslintignore",
"lines": [
"scripts/*-animations.js"
],
"purpose": "Per-template animation engines are vendored verbatim from the source."
},
{
"dst": ".stylelintignore",
"lines": [
"# Per-template CSS is vendor — extracted verbatim from the source.",
"# Ignore everything in styles/ except the repo's own boilerplate files.",
"styles/*.css",
"!styles/styles.css",
"!styles/lazy-styles.css"
],
"purpose": "Skip per-template CSS files (vendored from source)."
}
],
"gitignore": {
"dst": ".gitignore",
"lines": [
"# Snowflake skill: in-progress run state (committed only on close)",
".snowflake/projects/*/state.json"
],
"purpose": "Avoid churn from mid-run state.json writes; closed runs rename to state.json.closed and commit."
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
1.0.0-milo.2
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
/*
* snowflake (Milo flavor) — intentionally minimal.
*
* The overlaid body carries its own design system: the captured
* template lifts the source's stylesheets (typekit, Milo C2 block CSS)
* into <head>, and per-template inline CSS ships at /styles/<template>.css.
* Milo's own /libs/c2/styles/styles.css loads via foundation:c2.
*
* The block element itself only hosts the (consumed) authoring rows
* before decorate() replaces <main>, so it needs no paint of its own.
*/
.snowflake {
display: none;
}

/* =========================================================================
* Prototype interaction contract (paired with snowflake.js).
*
* Only the mechanics live here (which slide is visible, where the controls
* sit). The slide CONTENT keeps the source's lifted block CSS, so the look
* stays 1:1 — we only add the behaviour wrapper the source JS would have.
* Scoped under [data-overlay] so nothing leaks into Milo's live gnav/footer.
* ========================================================================= */

/* Carousel — one slide in view, the track slides horizontally. */
[data-overlay] .proto-carousel { position: relative; overflow: hidden; }

[data-overlay] .proto-carousel-track {
display: flex;
transition: transform 0.4s ease;
}

[data-overlay] .proto-carousel-track > .proto-slide {
flex: 0 0 100%;
min-width: 100%;
}

[data-overlay] .proto-carousel-prev,
[data-overlay] .proto-carousel-next {
position: absolute;
top: 50%;
z-index: 2;
display: flex;
align-items: center;
justify-content: center;
width: 44px;
height: 44px;
padding: 0;
font-size: 1.5rem;
line-height: 1;
color: #000;
cursor: pointer;
background: rgba(255, 255, 255, 0.85);
border: 1px solid rgba(0, 0, 0, 0.1);
border-radius: 50%;
transform: translateY(-50%);
}

[data-overlay] .proto-carousel-prev { left: 1rem; }
[data-overlay] .proto-carousel-next { right: 1rem; }

[data-overlay] .proto-carousel-dots {
position: absolute;
bottom: 1rem;
left: 0;
right: 0;
z-index: 2;
display: flex;
gap: 0.5rem;
justify-content: center;
}

[data-overlay] .proto-carousel-dot {
width: 9px;
height: 9px;
padding: 0;
cursor: pointer;
background: rgba(0, 0, 0, 0.3);
border: 0;
border-radius: 50%;
}

[data-overlay] .proto-carousel-dot[aria-selected="true"] {
background: rgba(0, 0, 0, 0.85);
}

/* Marquee — only the active slide is shown. */
[data-overlay] .proto-marquee-slide:not(.is-active) { display: none; }

/* Tabs / accordion — hide inactive panels (JS toggles [hidden]). */
[data-overlay] .proto-tabpanel[hidden],
[data-overlay] .proto-acc-panel[hidden] { display: none; }

@media (prefers-reduced-motion: reduce) {
[data-overlay] .proto-carousel-track { transition: none; }
}
Loading
Loading