Skip to content
Merged
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
1 change: 0 additions & 1 deletion .claude/.proven-config-version

This file was deleted.

11 changes: 0 additions & 11 deletions .claude/launch.json

This file was deleted.

42 changes: 0 additions & 42 deletions .claude/proven-config.json

This file was deleted.

3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -49,3 +49,6 @@ next-env.d.ts

# claude-flow local tooling data
.claude-flow/

# Claude Code local settings (per-machine, never committed)
.claude/
37 changes: 27 additions & 10 deletions app/globals.css
Original file line number Diff line number Diff line change
Expand Up @@ -905,25 +905,33 @@
color: var(--color-ink);
}

/* Blog (app/(marketing)/blog, components/patterns/blog-card.tsx). */
/* Blog (app/(marketing)/blog, components/patterns/blog-card.tsx).
Posts sit in a ruled band: it runs out to the frame's side rules and the
cells share hairlines (right and bottom), like the landing page grids. */
.blog-grid {
--blog-line: color-mix(in srgb, var(--color-ink) 10%, transparent);
--blog-cols: 3;
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 16px;
grid-template-columns: repeat(var(--blog-cols), minmax(0, 1fr));
margin-inline: calc(-1 * var(--lp-gutter, 0px));
border-top: 1px solid var(--blog-line);
}
.blog-card {
display: flex;
height: 100%;
flex-direction: column;
overflow: hidden;
border: 1px solid color-mix(in srgb, var(--color-ink) 10%, transparent);
border-radius: var(--radius-card);
border-right: 1px solid var(--blog-line);
border-bottom: 1px solid var(--blog-line);
background: var(--color-surface);
transition: border-color 200ms ease, box-shadow 200ms ease;
transition: background-color 200ms ease;
}
/* The last cell in each row leans on the frame's own side rule. */
.blog-grid > .blog-card:nth-child(3n) {
border-right-color: transparent;
}
.blog-card:hover {
border-color: color-mix(in srgb, var(--color-brand) 45%, transparent);
box-shadow: var(--shadow-card);
background: color-mix(in srgb, var(--color-brand) 5%, var(--color-surface));
}
.blog-back {
display: inline-flex;
Expand Down Expand Up @@ -953,12 +961,21 @@
}
@media (max-width: 1023px) {
.blog-grid {
grid-template-columns: repeat(2, minmax(0, 1fr));
--blog-cols: 2;
}
.blog-grid > .blog-card:nth-child(3n) {
border-right-color: var(--blog-line);
}
.blog-grid > .blog-card:nth-child(2n) {
border-right-color: transparent;
}
}
@media (max-width: 639px) {
.blog-grid {
grid-template-columns: minmax(0, 1fr);
--blog-cols: 1;
}
.blog-grid > .blog-card:nth-child(n) {
border-right-color: transparent;
}
}

Expand Down
16 changes: 16 additions & 0 deletions commitlint.config.mjs
Original file line number Diff line number Diff line change
@@ -1,10 +1,26 @@
// Conventional Commits per CONTRIBUTING.md — scopes from the documented set.
// Scope is optional for repo-level commits (docs:, chore:); when present it
// must come from the enum.
// Commits are authored by the maintainers alone: AI tools are never credited as
// co-authors (GitHub would list them as repo contributors), so the trailer an
// assistant suggests by default fails CI instead of slipping into a squash merge.
const AI_COAUTHOR = /^co-authored-by:.*(claude|anthropic)/im;

/** @type {import('@commitlint/types').UserConfig} */
export default {
extends: ["@commitlint/config-conventional"],
plugins: [
{
rules: {
"no-ai-coauthor": ({ raw }) => [
!AI_COAUTHOR.test(raw ?? ""),
"remove the AI Co-authored-by trailer: maintainers are the only authors",
],
},
},
],
rules: {
"no-ai-coauthor": [2, "always"],
"scope-enum": [
2,
"always",
Expand Down
44 changes: 30 additions & 14 deletions components/patterns/site-footer.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,27 @@ const FOOTER_SECTIONS: { title: string; links: { label: string; href: string }[]

const LINK_CLASS = "text-sm text-body-copy transition-colors hover:text-ink";

function Partnership() {
return (
<>
<p className="text-sm text-body-copy">In partnership with:</p>
<a
href="https://salamandertechhub.com/"
target="_blank"
rel="noopener noreferrer"
className="mt-3 inline-block transition-opacity hover:opacity-80"
>
{/* eslint-disable-next-line @next/next/no-img-element -- SVG wordmark, no raster source */}
<img
src="/images/salamander-logo-yellow.svg"
alt="Salamander Tech Hub"
className="h-9 w-auto max-w-full"
/>
</a>
</>
);
}

export function SiteFooter() {
const year = new Date().getFullYear();

Expand Down Expand Up @@ -149,20 +170,15 @@ export function SiteFooter() {
</span>
</li>
</ul>
<p className="mt-6 text-sm text-body-copy">In partnership with:</p>
<a
href="https://salamandertechhub.com/"
target="_blank"
rel="noopener noreferrer"
className="mt-3 inline-block transition-opacity hover:opacity-80"
>
{/* eslint-disable-next-line @next/next/no-img-element -- SVG wordmark, no raster source */}
<img
src="/images/salamander-logo-yellow.svg"
alt="Salamander Tech Hub"
className="h-9 w-auto max-w-full"
/>
</a>
<div className="mt-6 hidden lg:block">
<Partnership />
</div>
</div>

{/* Mobile: the partnership gets its own centered row under the columns
(lg keeps it at the foot of "Contact Us"). */}
<div className="col-span-2 text-center lg:hidden">
<Partnership />
</div>
</div>

Expand Down
Loading