diff --git a/app/assets/css/main.css b/app/assets/css/main.css index 4191323e..97ba1bfa 100644 --- a/app/assets/css/main.css +++ b/app/assets/css/main.css @@ -545,12 +545,6 @@ } } -.home-featured-heading { - display: grid; - gap: 1.5rem; - align-items: end; -} - .home-community-band { background: color-mix(in oklab, var(--ui-bg) 94%, var(--ui-bg-muted)); } @@ -599,294 +593,6 @@ } } -.home-featured-title { - font-size: clamp(2.5rem, 2.1rem + 1.8vw, 3.5rem); - font-weight: 600; - letter-spacing: -0.04em; - line-height: 1.02; -} - -.home-featured-layout { - display: grid; - min-width: 0; - gap: 0.75rem; -} - -.home-featured-lead, -.home-featured-support-card { - min-width: 0; - border: 1px solid var(--ui-border); - border-radius: var(--ui-radius); - background: var(--ui-bg); -} - -.home-featured-lead { - padding: 1.25rem; -} - -.home-featured-lead__intro { - display: flex; - min-width: 0; - flex-direction: column; - gap: 1rem; -} - -.home-featured-lead__title { - font-size: clamp(1.75rem, 1.55rem + 0.8vw, 2.25rem); - font-weight: 600; - letter-spacing: -0.035em; - line-height: 1.08; -} - -.home-featured-curator { - display: flex; - min-width: 0; - flex: none; - align-items: center; - gap: 0.75rem; -} - -.home-featured-avatar, -.home-featured-skill-avatar, -.home-featured-support-avatar { - flex: none; - border: 2px solid var(--ui-bg); - border-radius: 9999px; - outline: 1px solid var(--ui-border); - background: var(--ui-bg-muted); - object-fit: cover; -} - -.home-featured-avatar { - width: 3.5rem; - height: 3.5rem; -} - -.home-featured-rationale { - margin-top: 1.25rem; - padding-block: 1.25rem; - border-block: 1px solid var(--ui-border); -} - -.home-featured-skill-heading { - display: flex; - align-items: baseline; - justify-content: space-between; - gap: 1rem; - margin-top: 1.25rem; -} - -.home-featured-skills { - display: grid; - min-width: 0; - grid-template-columns: minmax(0, 1fr); - margin-top: 0.75rem; - padding: 0; - border-block: 1px solid var(--ui-border); - list-style: none; -} - -.home-featured-skills > li { - min-width: 0; -} - -.home-featured-skills > li:not(:last-child) { - border-bottom: 1px solid var(--ui-border); -} - -.home-featured-skill { - display: flex; - min-width: 0; - min-height: 4.75rem; - height: 100%; - align-items: center; - gap: 0.75rem; - padding: 0.75rem; - overflow-wrap: anywhere; - transition: background-color 200ms ease-out; -} - -.home-featured-skill-avatar { - width: 2rem; - height: 2rem; -} - -.home-featured-skill:focus-visible, -.home-featured-support-card:focus-visible { - outline: 2px solid var(--ui-color-primary-500) !important; - outline-offset: -3px !important; -} - -.home-featured-install { - min-width: 0; - margin-top: 1.5rem; -} - -.home-featured-install__heading { - display: flex; - min-width: 0; - flex-direction: column; - gap: 0.75rem; -} - -.home-featured-command { - display: grid; - min-width: 0; - gap: 0.5rem; - margin-top: 1rem; -} - -/* The command wraps rather than scrolls: a horizontal scrollbar inside the - lead card is chrome the reader has to operate to finish reading one line. */ -.home-featured-command code { - display: block; - min-width: 0; - max-width: 100%; - padding: 0.75rem 1rem; - border: 1px solid var(--ui-border); - border-radius: var(--ui-radius); - background: var(--ui-bg-muted); - font-size: 0.875rem; - line-height: 1.5rem; - user-select: text; -} - -.home-featured-command code:focus-visible { - outline: 2px solid var(--ui-color-primary-500); - outline-offset: 2px; -} - -.home-featured-copy { - width: 100%; -} - -.home-featured-feedback { - min-height: 1.5rem; - margin: 0; - padding-top: 0.5rem; -} - -.home-featured-support { - display: grid; - min-width: 0; - gap: 0.75rem; -} - -.home-featured-support article { - min-width: 0; - height: 100%; -} - -.home-featured-support-card { - display: flex; - min-height: 11rem; - height: 100%; - flex-direction: column; - background: color-mix(in oklab, var(--ui-bg-muted) 32%, var(--ui-bg)); - padding: 1.25rem; - transition: background-color 200ms ease-out, border-color 200ms ease-out; -} - -.home-featured-support-avatar { - width: 2rem; - height: 2rem; -} - -.home-featured-owner-stack { - display: flex; - flex: none; - align-items: center; -} - -.home-featured-owner-stack > * + * { - margin-left: -0.5rem; -} - -.home-featured-support-arrow { - color: var(--ui-text-muted); - transition: color 200ms ease-out, translate 200ms ease-out; -} - -.home-featured-support-meta { - margin-top: auto; - padding-top: 1rem; -} - -@media (min-width: 40rem) { - .home-featured-heading { - grid-template-columns: minmax(0, 1fr) auto; - } - - .home-featured-lead { - padding: 1.5rem; - } - - .home-featured-lead__intro { - flex-direction: row; - align-items: flex-start; - justify-content: space-between; - } - - .home-featured-install__heading { - flex-direction: row; - align-items: flex-start; - justify-content: space-between; - } - - .home-featured-command { - grid-template-columns: minmax(0, 1fr) auto; - } - - .home-featured-copy { - width: auto; - } - - .home-featured-support { - grid-template-columns: repeat(2, minmax(0, 1fr)); - } - - .home-featured-skills { - grid-template-columns: repeat(2, minmax(0, 1fr)); - } - - .home-featured-skills > li:not(:last-child) { - border-bottom: 0; - } - - .home-featured-skills > li:nth-child(odd) { - border-right: 1px solid var(--ui-border); - } - - .home-featured-skills > li:nth-child(n+3) { - border-top: 1px solid var(--ui-border); - } -} - -@media (min-width: 64rem) { - .home-featured-layout { - grid-template-columns: minmax(0, 1.55fr) minmax(0, 0.85fr); - } - - .home-featured-support { - align-self: start; - grid-template-columns: minmax(0, 1fr); - grid-template-rows: repeat(2, auto); - } - -} - -@media (hover: hover) { - .home-featured-skill:hover, - .home-featured-support-card:hover { - background: var(--ui-bg-muted); - } - - .home-featured-support-card:hover .home-featured-support-arrow { - color: var(--ui-text); - translate: 0.125rem -0.125rem; - } -} - .home-freshness-title { font-size: clamp(2.25rem, 1.9rem + 1.7vw, 3.5rem); letter-spacing: -0.04em; @@ -1536,6 +1242,99 @@ } } +/* The braille names texture: behind the hero, masked clear of the headline. + Below 64rem the copy stacks above the rail, so the names sit behind the rail. */ +.home-hero-texture { + position: absolute; + inset-inline: 0; + bottom: 0; + z-index: 0; + height: 22rem; + pointer-events: none; + mask-image: linear-gradient(to bottom, transparent, #000 40%); + -webkit-mask-image: linear-gradient(to bottom, transparent, #000 40%); +} + +@media (min-width: 64rem) { + .home-hero-texture { + top: 0; + height: auto; + mask-image: linear-gradient(to right, transparent 57%, #000 80%); + -webkit-mask-image: linear-gradient(to right, transparent 57%, #000 80%); + } +} + +/* The H1 full stop is the brand dot, the hero's rose element. */ +.home-hero-dot { + display: inline-block; + width: 0.16em; + height: 0.16em; + margin-inline-start: 0.05em; + border-radius: 999px; + background: var(--brand-dot); +} + +.home-hero-claims a { + color: var(--ui-text); + text-decoration-line: underline; + text-decoration-color: var(--ui-border-accented); + text-underline-offset: 0.2em; + transition: text-decoration-color 200ms ease-out; +} + +.home-hero-claims a:hover { + text-decoration-color: currentColor; +} + +.home-hero-promo { + display: flex; + flex-wrap: wrap; + align-items: center; + gap: 0.5rem 0.75rem; + max-width: 36rem; +} + +/* Trending cards: the repository link covers the card, and the run chip and + the source link sit above it. */ +.home-trending-card { + position: relative; + display: flex; + height: 100%; + min-width: 0; + flex-direction: column; + border: 1px solid var(--ui-border); + border-radius: var(--ui-radius); + padding: 1rem; + transition: border-color 200ms ease-out; +} + +.home-trending-card__link::after { + content: ''; + position: absolute; + inset: 0; + border-radius: inherit; +} + +.home-trending-card__action { + position: relative; + z-index: 1; +} + +@media (hover: hover) { + .home-trending-card:has(.home-trending-card__link:hover) { + border-color: var(--ui-text-muted); + } +} + +.home-trending-card:has(.home-trending-card__link:focus-visible) { + outline: 2px solid var(--ui-primary); + outline-offset: 2px; +} + +.home-trending-card__link:focus-visible { + outline: none; +} + /* the homepage hero: named agent row under the search. Proof of "every agent". */ .home-hero-agents { display: flex; @@ -1573,62 +1372,6 @@ column-gap: 0.5rem; } -/* "ecosystem" carries the brand: rose ink and the chevron mark in place of a full stop. */ -.home-hero-eco { - position: relative; - display: inline-block; - color: var(--ui-primary); - opacity: 0.92; -} - -/* Dot-grid underline: the noise field's grid, frozen, in rose. */ -.home-hero-eco::after { - content: ''; - position: absolute; - inset-inline: 0.04em 0.3em; - bottom: -0.01em; - height: 0.13em; - background-image: radial-gradient(circle, var(--ui-primary) 1px, transparent 1.25px); - background-size: 0.115em 0.115em; - opacity: 0.6; - pointer-events: none; -} - - -.home-hero-taste { - position: relative; - display: inline-block; -} - -/* Emoji wink on the first line: sits on the cap line, clear of the last letter. */ -.home-hero-emoji { - position: absolute; - top: 0.04em; - right: -1.55em; - font-size: 0.4em; - line-height: 1; - transform: rotate(10deg); - transform-origin: 50% 80%; -} - -/* A quick wiggle when the headline is hovered: 360ms, inside the motion budget. */ -.home-hero-title:hover .home-hero-emoji { - animation: home-emoji-wiggle 360ms ease-in-out; -} - -@keyframes home-emoji-wiggle { - 0% { transform: rotate(10deg); } - 30% { transform: rotate(-6deg) scale(1.08); } - 60% { transform: rotate(16deg) scale(1.04); } - 100% { transform: rotate(10deg); } -} - -@media (prefers-reduced-motion: reduce) { - .home-hero-title:hover .home-hero-emoji { - animation: none; - } -} - /* The homepage authoring link opens the setup wizard. */ .home-make-strip { display: grid; @@ -1650,38 +1393,6 @@ } } -/* the homepage rail: fade both ends so a half row reads as depth, not a bug. */ -/* The packet: a rose dot that rides the rail's spine, the CLI ripple as a signal. */ -.home-hero-rail .skill-source-stream__list::after { - content: ''; - position: absolute; - inset-inline-start: calc(1.125rem - 2.5px); - top: 1.75rem; - width: 6px; - height: 6px; - border-radius: 999px; - background: var(--ui-primary); - box-shadow: 0 0 6px 1px var(--ui-primary); - opacity: 0; - animation: home-packet 2.4s ease-in infinite; - animation-delay: 1s; - pointer-events: none; -} - -@keyframes home-packet { - 0% { transform: translateY(0); opacity: 0; } - 8% { opacity: 1; } - 70% { opacity: 1; } - 78% { transform: translateY(calc(100% * 1)); opacity: 0; } - 100% { transform: translateY(0); opacity: 0; } -} - -@media (prefers-reduced-motion: reduce) { - .home-hero-rail .skill-source-stream__list::after { - animation: none; - } -} - .home-hero-rail [class*="stream"] { scrollbar-width: none; } @@ -1742,7 +1453,8 @@ band, so the page reads as one made thing instead of a decorated hero. ========================================================================== */ -/* Band edges are printed in the dot grid, not drawn as a flat rule. */ +/* Band edges are printed in the dot grid, not drawn as a flat rule. Stone + dots: rose is for the one dot a motif picks. */ .home-page > section, .home-page > nav { position: relative; @@ -1756,16 +1468,16 @@ bottom: 0; z-index: 2; height: 5px; - background-image: radial-gradient(circle, var(--ui-primary) 1.1px, transparent 1.4px); + background-image: radial-gradient(circle, var(--ui-text-dimmed) 1.1px, transparent 1.4px); background-size: 7px 5px; - opacity: 0.28; + opacity: 0.5; pointer-events: none; } -/* One word per heading carries the hero's dot underline. */ +/* One word per heading carries a stone underline. */ .home-ink { text-decoration-line: underline; - text-decoration-color: color-mix(in oklab, var(--ui-primary) 65%, transparent); + text-decoration-color: var(--ui-border-accented); text-decoration-thickness: max(2px, 0.045em); text-underline-offset: 0.16em; text-decoration-skip-ink: none; @@ -1799,23 +1511,6 @@ z-index: 1; } -/* The tasted chip: the hero's emoji, reused wherever a person said yes. */ -.home-tasted { - display: inline-flex; - align-items: center; - gap: 0.35rem; - padding: 0.2rem 0.5rem 0.2rem 0.4rem; - border: 1px solid color-mix(in oklab, var(--ui-primary) 32%, transparent); - border-radius: 999px; - background: color-mix(in oklab, var(--ui-primary) 10%, transparent); - color: var(--ui-primary); - font-family: var(--font-mono); - font-size: 0.6875rem; - letter-spacing: 0.04em; - text-transform: uppercase; - white-space: nowrap; -} - /* Ecosystem tiles under the authoring strip. Same chip as the agent row. */ .home-eco-logos { display: flex; @@ -1850,13 +1545,6 @@ color: var(--ui-text-highlighted); } -/* The rail spine carries a rose wash under the packet. */ -.home-hero-rail .skill-source-stream__list::after { - width: 7px; - height: 7px; - box-shadow: 0 0 10px 2px color-mix(in oklab, var(--ui-primary) 70%, transparent); -} - /* One heading scale for every band on /alt. The page had four before. */ .home-page .home-h2 { font-size: clamp(1.875rem, 1.5rem + 1.5vw, 2.625rem); @@ -1900,10 +1588,6 @@ } /* Two h3 steps under the heading scale, not four. */ -.home-page .home-featured-lead__title { - font-size: 1.75rem; -} - .home-page .home-freshness-primary-title, .home-page .home-freshness-secondary-title { font-size: 1.5rem; @@ -1977,13 +1661,6 @@ } } -/* "+N more" closes the lead collection's skill list when it is truncated. */ -.home-featured-skill-more { - display: flex; - align-items: center; - padding: 0.75rem 1rem; -} - /* An in-page jump landed the heading flush against the sticky header, with no space above it. The header is 4rem; this adds a breath on top of that. */ .home-page > section[id] { diff --git a/app/components/NoiseField.client.vue b/app/components/NoiseField.client.vue deleted file mode 100644 index 6ff531ea..00000000 --- a/app/components/NoiseField.client.vue +++ /dev/null @@ -1,405 +0,0 @@ - - - diff --git a/app/pages/index.vue b/app/pages/index.vue index bcb3a7e9..79adb9f3 100644 --- a/app/pages/index.vue +++ b/app/pages/index.vue @@ -1,9 +1,7 @@