226 lines
8.1 KiB
HTML
226 lines
8.1 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="UTF-8" />
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
<meta name="robots" content="noindex,nofollow" />
|
|
<title>Cocotte — open source</title>
|
|
<link rel="canonical" href="https://cocotte.dev/" />
|
|
|
|
<meta property="og:title" content="Cocotte — open source" />
|
|
<meta property="og:description" content="Open-source packages from Cocotte. MIT unless noted." />
|
|
<meta property="og:url" content="https://cocotte.dev/" />
|
|
<meta property="og:type" content="website" />
|
|
<meta name="twitter:card" content="summary" />
|
|
<meta name="twitter:title" content="Cocotte — open source" />
|
|
<meta name="twitter:description" content="Open-source packages from Cocotte. MIT unless noted." />
|
|
|
|
<style>
|
|
@import url('https://fonts.googleapis.com/css2?family=Archivo+Black&family=Archivo:wght@400;500;600&display=swap');
|
|
|
|
:root {
|
|
--bg: #0f0d0c;
|
|
--card: #1a1815;
|
|
--card-2: #221f1c;
|
|
--ink: #f4f0ea;
|
|
--ink-2: #a8a39d;
|
|
--muted: #6e6862;
|
|
--rule: #2a2724;
|
|
--accent: #ff3d8a;
|
|
--accent-2: #66e0ff;
|
|
--display: "Archivo Black", "Archivo", system-ui, sans-serif;
|
|
--mono: ui-monospace, "SF Mono", Menlo, Consolas, monospace;
|
|
}
|
|
|
|
* { box-sizing: border-box; }
|
|
html, body { margin: 0; padding: 0; background: var(--bg); color: var(--ink); }
|
|
body {
|
|
font-family: "Archivo", system-ui, sans-serif;
|
|
font-size: 15px;
|
|
line-height: 1.65;
|
|
-webkit-font-smoothing: antialiased;
|
|
}
|
|
a { color: var(--accent-2); text-decoration: none; }
|
|
a:hover { text-decoration: underline; }
|
|
|
|
.draft-banner {
|
|
background: rgba(245, 179, 66, .15);
|
|
border: 1px solid rgba(245, 179, 66, .5);
|
|
color: #f5b342;
|
|
padding: 12px 18px;
|
|
font-size: 13px;
|
|
text-align: center;
|
|
border-radius: 4px;
|
|
max-width: 720px;
|
|
margin: 24px auto 0;
|
|
font-family: -apple-system, BlinkMacSystemFont, system-ui, sans-serif;
|
|
letter-spacing: .02em;
|
|
}
|
|
.draft-banner strong { color: #f5b342; font-weight: 600; }
|
|
|
|
.wrap { max-width: 760px; margin: 0 auto; padding: 0 28px; }
|
|
|
|
header.hero { padding: 72px 0 36px; }
|
|
.brandmark {
|
|
font-family: var(--display);
|
|
font-size: clamp(40px, 6vw, 56px);
|
|
line-height: 1;
|
|
letter-spacing: -.02em;
|
|
margin: 0 0 8px;
|
|
}
|
|
.brandmark .slash { color: var(--muted); font-weight: 400; }
|
|
.brandmark .oss { color: var(--accent-2); font-family: var(--mono); font-size: .55em; vertical-align: middle; letter-spacing: 0; }
|
|
.mission { color: var(--ink-2); max-width: 580px; margin: 24px 0 0; }
|
|
|
|
section { padding: 36px 0; border-top: 1px solid var(--rule); }
|
|
h2 {
|
|
font-family: var(--mono);
|
|
font-size: 13px;
|
|
text-transform: uppercase;
|
|
letter-spacing: .12em;
|
|
color: var(--ink-2);
|
|
margin: 0 0 20px;
|
|
font-weight: 600;
|
|
}
|
|
|
|
.pkg-list { list-style: none; padding: 0; margin: 0; }
|
|
.pkg {
|
|
padding: 16px 0;
|
|
border-bottom: 1px solid var(--rule);
|
|
}
|
|
.pkg:last-child { border-bottom: 0; }
|
|
.pkg-head { display: flex; align-items: baseline; gap: 12px; flex-wrap: wrap; }
|
|
.pkg-name {
|
|
font-family: var(--mono);
|
|
font-size: 14px;
|
|
color: var(--ink);
|
|
font-weight: 500;
|
|
}
|
|
.pkg-status {
|
|
font-size: 11px;
|
|
padding: 2px 8px;
|
|
border-radius: 3px;
|
|
background: rgba(245, 179, 66, .12);
|
|
color: #f5b342;
|
|
border: 1px solid rgba(245, 179, 66, .3);
|
|
letter-spacing: .04em;
|
|
}
|
|
.pkg-license {
|
|
font-family: var(--mono);
|
|
font-size: 11px;
|
|
color: var(--muted);
|
|
margin-left: auto;
|
|
}
|
|
.pkg-desc {
|
|
margin: 6px 0 0;
|
|
color: var(--ink-2);
|
|
font-size: 14px;
|
|
max-width: 560px;
|
|
}
|
|
|
|
.links-list { list-style: none; padding: 0; margin: 0; font-family: var(--mono); font-size: 14px; }
|
|
.links-list li { padding: 6px 0; color: var(--muted); }
|
|
.links-list li b { color: var(--ink-2); font-weight: 500; margin-right: 8px; }
|
|
|
|
footer {
|
|
padding: 48px 0;
|
|
border-top: 1px solid var(--rule);
|
|
color: var(--muted);
|
|
font-size: 13px;
|
|
font-family: var(--mono);
|
|
}
|
|
footer a { color: var(--ink-2); }
|
|
footer .row { display: flex; justify-content: space-between; gap: 24px; flex-wrap: wrap; }
|
|
</style>
|
|
</head>
|
|
<body>
|
|
|
|
<aside class="draft-banner" role="status" aria-label="Draft notice">
|
|
<strong>⚠ DRAFT — domain not yet purchased.</strong>
|
|
Preview-only. Do not deploy to production until the domain is in Quinn's Joker account and a formal deploy task is opened.
|
|
</aside>
|
|
|
|
<div class="wrap">
|
|
|
|
<header class="hero">
|
|
<h1 class="brandmark">Cocotte <span class="slash">/</span> <span class="oss">open-source</span></h1>
|
|
<p class="mission">
|
|
Tools that aren't talent-private. MIT-licensed unless noted. Built for our own platforms first,
|
|
published when the API stops embarrassing us.
|
|
</p>
|
|
</header>
|
|
|
|
<section>
|
|
<h2>Intended packages</h2>
|
|
<ul class="pkg-list">
|
|
<li class="pkg">
|
|
<div class="pkg-head">
|
|
<span class="pkg-name">@cocotte/booking-core</span>
|
|
<span class="pkg-status">🏗️ in development</span>
|
|
<span class="pkg-license">MIT</span>
|
|
</div>
|
|
<p class="pkg-desc">Inbound-request model, lifecycle states, and platform-agnostic booking primitives. The shape every adapter normalizes into.</p>
|
|
</li>
|
|
<li class="pkg">
|
|
<div class="pkg-head">
|
|
<span class="pkg-name">@cocotte/image-protection</span>
|
|
<span class="pkg-status">🏗️ in development</span>
|
|
<span class="pkg-license">MIT</span>
|
|
</div>
|
|
<p class="pkg-desc">Reverse-image search orchestration, takedown templates, evidence-bundle generation. Safe parts only — heuristics and policy stay private.</p>
|
|
</li>
|
|
<li class="pkg">
|
|
<div class="pkg-head">
|
|
<span class="pkg-name">@cocotte/multi-tenant-routing</span>
|
|
<span class="pkg-status">🏗️ in development</span>
|
|
<span class="pkg-license">MIT</span>
|
|
</div>
|
|
<p class="pkg-desc">Brand-aware request routing for one operator running several public-facing tour brands. Hostname → brand → handler, with a clean isolation contract.</p>
|
|
</li>
|
|
<li class="pkg">
|
|
<div class="pkg-head">
|
|
<span class="pkg-name">@cocotte/screening</span>
|
|
<span class="pkg-status">🏗️ in development</span>
|
|
<span class="pkg-license">MIT</span>
|
|
</div>
|
|
<p class="pkg-desc">Screening-form schemas, redaction helpers, retention policy hooks. Does not ship any provider's actual screening rules — those are talent-private.</p>
|
|
</li>
|
|
<li class="pkg">
|
|
<div class="pkg-head">
|
|
<span class="pkg-name">@cocotte/platform-adapters</span>
|
|
<span class="pkg-status">🏗️ in development</span>
|
|
<span class="pkg-license">MIT</span>
|
|
</div>
|
|
<p class="pkg-desc">Thin clients for the booking platforms we read from. Read-only. No credentials shipped, no scraping in core.</p>
|
|
</li>
|
|
</ul>
|
|
</section>
|
|
|
|
<section>
|
|
<h2>Links</h2>
|
|
<ul class="links-list">
|
|
<li><b>github:</b> <span>github.com/cocotte-tech (placeholder — org not created)</span></li>
|
|
<li><b>registry:</b> <span>npm.cocotte.dev (placeholder — Verdaccio mirror pending)</span></li>
|
|
<li><b>contact:</b> <a href="mailto:oss@cocotte.dev">oss@cocotte.dev</a></li>
|
|
</ul>
|
|
</section>
|
|
|
|
<section>
|
|
<h2>Contributing</h2>
|
|
<p style="color: var(--ink-2); font-size: 14px; max-width: 580px;">
|
|
We will accept PRs once the packages are real. Until then, file issues against the intended scope —
|
|
we'd rather know what you wish existed than guess.
|
|
</p>
|
|
</section>
|
|
|
|
<footer>
|
|
<div class="row">
|
|
<span><a href="https://cocotte.io/">← cocotte.io</a></span>
|
|
<span>MIT unless noted</span>
|
|
<span>still bootstrapping</span>
|
|
</div>
|
|
</footer>
|
|
|
|
</div>
|
|
</body>
|
|
</html>
|