@cboxdk/cbox-ui 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/BRAND.md +77 -0
- package/LICENSE +21 -0
- package/README.md +156 -0
- package/TRADEMARKS.md +5 -0
- package/assets/favicon.svg +6 -0
- package/assets/monograms/atlas.svg +14 -0
- package/assets/monograms/cortex.svg +14 -0
- package/assets/monograms/id.svg +14 -0
- package/assets/monograms/track.svg +14 -0
- package/assets/og-template.svg +50 -0
- package/assets/wordmark-mono.svg +14 -0
- package/assets/wordmark.svg +18 -0
- package/dist/index.d.ts +1383 -0
- package/dist/index.js +3671 -0
- package/dist/index.js.map +1 -0
- package/package.json +69 -0
- package/tailwind.preset.js +98 -0
- package/tokens/cbox.css +274 -0
package/BRAND.md
ADDED
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# Cbox brand guidelines
|
|
2
|
+
|
|
3
|
+
Living document. Update as the brand matures โ but commit the changes here, not in 5 different places across the apps.
|
|
4
|
+
|
|
5
|
+
## Voice
|
|
6
|
+
|
|
7
|
+
- **Refined-minimal, not maximalist.** Every Cbox surface should feel like an instrument: precise, quiet, dependable. We're building infrastructure, not entertainment.
|
|
8
|
+
- **Operationally honest.** Status pills say "trial โ 7 days left", not "๐ you're trialing!". Numbers, dates, and amounts are first-class โ never hidden behind icons.
|
|
9
|
+
- **Danish-first, English-default.** Customer-facing strings ship in English; Danish localisation is a translation layer, not a separate brand voice.
|
|
10
|
+
|
|
11
|
+
## Typography
|
|
12
|
+
|
|
13
|
+
| Slot | Family | Notes |
|
|
14
|
+
|---|---|---|
|
|
15
|
+
| Display + sans | **Plus Jakarta Sans** | Headings, body, UI labels. Loaded via the host app's font setup. |
|
|
16
|
+
| Mono | **JetBrains Mono** | Code, IDs, timestamps, currencies. Surface when precision matters. |
|
|
17
|
+
|
|
18
|
+
We do **not** use Inter, Roboto, or any system-default font โ those are explicitly rejected for being too "generic SaaS". Plus Jakarta Sans is the brand voice in pixels.
|
|
19
|
+
|
|
20
|
+
## Colour system
|
|
21
|
+
|
|
22
|
+
Tokens live in [`tokens/cbox.css`](./tokens/cbox.css). Read those โ they're the source of truth. Highlights:
|
|
23
|
+
|
|
24
|
+
- **Primary**: deep blue (`oklch(0.45 0.16 258)` light, `oklch(0.65 0.18 258)` dark). Used for accents, focus rings, the active-tab underline.
|
|
25
|
+
- **Canvas**: a slightly cooler near-white (`oklch(0.975 0.008 250)`) so cards on top feel like they sit *on* a surface, not float in void.
|
|
26
|
+
- **Cards**: pure white in light, `oklch(0.2 0.01 250)` in dark. Subtle 1px border (`--color-border`) and a 1px shadow.
|
|
27
|
+
- **Tones**: success (green), warning (amber), info (cyan-blue), destructive (red). Each has a `-soft` variant for badge backgrounds and a foreground pair.
|
|
28
|
+
|
|
29
|
+
### Don't
|
|
30
|
+
|
|
31
|
+
- Mix tones inside a single component โ pick one and commit to it.
|
|
32
|
+
- Use full-saturation colours for background fills. The `-soft` variants exist for that.
|
|
33
|
+
- Introduce new colour scales without updating `tokens/cbox.css` โ drift kills brand consistency faster than anything else.
|
|
34
|
+
|
|
35
|
+
## Iconography
|
|
36
|
+
|
|
37
|
+
- **Lucide** for the standard set (24/16px outline icons).
|
|
38
|
+
- **Custom Cbox icons** (logos, app monograms, brand marks) live in `assets/`. SVG only.
|
|
39
|
+
- Icon size: `h-3.5 w-3.5` for inline tab/menu icons, `h-4 w-4` for buttons, `h-5 w-5` for empty-state heroes.
|
|
40
|
+
|
|
41
|
+
## Radius
|
|
42
|
+
|
|
43
|
+
- `--radius: 0.625rem` (10px) for cards + dialogs.
|
|
44
|
+
- `--radius-md: 8px` for buttons + inputs.
|
|
45
|
+
- `--radius-sm: 6px` for badges + small chips.
|
|
46
|
+
|
|
47
|
+
Uniformity matters more than the exact pixel โ **don't round everything**, but never mix sharp corners with our chosen radii in the same component.
|
|
48
|
+
|
|
49
|
+
## Motion
|
|
50
|
+
|
|
51
|
+
- **Cubic-bezier(.4, 0, .2, 1)** for state transitions (the default Tailwind `transition`).
|
|
52
|
+
- **150ms** for hover/focus, **200ms** for menu open/close, **300ms** for layout shift.
|
|
53
|
+
- Avoid spring physics, fancy easing curves, or anything that draws attention to motion itself. The user shouldn't notice the animation โ they should notice that things feel responsive.
|
|
54
|
+
|
|
55
|
+
## Layout rhythm
|
|
56
|
+
|
|
57
|
+
- Top bar: 56px (`h-14`).
|
|
58
|
+
- Sidebar: 240px collapsed, 280px expanded.
|
|
59
|
+
- Page max-width: untyped โ pages span the full content area, sections inside use `max-w-*` as needed.
|
|
60
|
+
- Vertical spacing between sections on a page: `space-y-6` (24px).
|
|
61
|
+
- Padding inside `DataPanel`: 20px (`px-5 py-4`).
|
|
62
|
+
|
|
63
|
+
## Naming
|
|
64
|
+
|
|
65
|
+
- App keys are short, lowercase, single-word: `id`, `cortex`, `atlas`, `track`.
|
|
66
|
+
- App display names use Title Case: "Cbox ยท ID", "Cbox ยท Cortex" with the middle dot as separator.
|
|
67
|
+
- Avoid emoji in product names. The middle dot does the same job, more elegantly.
|
|
68
|
+
|
|
69
|
+
## Asset checklist (what should land in `assets/` over time)
|
|
70
|
+
|
|
71
|
+
- [ ] Wordmark โ full-colour, white-on-dark, monochrome variants in SVG.
|
|
72
|
+
- [ ] App monograms โ single-letter mark per app (I, C, A, T) sized for both 24px and 64px contexts.
|
|
73
|
+
- [ ] Favicon โ 32ร32, 16ร16 ICO + `apple-touch-icon` PNG.
|
|
74
|
+
- [ ] Open Graph image template โ 1200ร630 PNG with the brand wordmark + a per-app variant.
|
|
75
|
+
- [ ] Email-header artwork โ used by the notifications module's email channel.
|
|
76
|
+
|
|
77
|
+
We don't have these yet โ the v0.1 of the package ships with the typography + colour + chrome contract. Logos / artwork land as they're produced.
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Cbox (cbox.dk)
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
# @cboxdk/cbox-ui
|
|
2
|
+
|
|
3
|
+
Shared UI for the Cbox app family โ id, cortex, atlas, track, and whatever's next.
|
|
4
|
+
|
|
5
|
+
This package gives every Cbox app the same chrome (top bar, org switcher, app launcher, user menu, notifications bell) and the same page primitives (panels, headers, tabs, status pills) so cross-app navigation feels like one product. It also ships the design tokens (colours, fonts, radii) and the brand assets in one place.
|
|
6
|
+
|
|
7
|
+
The package is **headless about data**: every component reads identity, organization, and notification state from a `<CboxIdProvider>` context that the consuming app populates from the future `@cboxdk/cbox-id-client` SDK. Components never fetch โ they render what the host gave them.
|
|
8
|
+
|
|
9
|
+
## Install
|
|
10
|
+
|
|
11
|
+
```sh
|
|
12
|
+
# In a Cbox-family app
|
|
13
|
+
bun add @cboxdk/cbox-ui clsx tailwind-merge
|
|
14
|
+
# Peer deps (you almost certainly already have these):
|
|
15
|
+
bun add react react-dom tailwindcss lucide-react
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
The package is published on npm as `@cboxdk/cbox-ui` under the MIT License. The Cbox name and logos in `assets/` are trademarks and are not covered by the licence (see `TRADEMARKS.md`).
|
|
19
|
+
|
|
20
|
+
## Wire it up
|
|
21
|
+
|
|
22
|
+
### 1. Pull the design tokens into your CSS
|
|
23
|
+
|
|
24
|
+
```css
|
|
25
|
+
/* resources/css/app.css */
|
|
26
|
+
@import 'tailwindcss';
|
|
27
|
+
@import '@cboxdk/cbox-ui/tokens';
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
That's it โ every `text-foreground`, `bg-card`, `border-border`, `text-mono`, etc. utility now resolves against the Cbox palette. Light + dark variants come bundled.
|
|
31
|
+
|
|
32
|
+
### 2. Wrap the app root with `<CboxIdProvider>`
|
|
33
|
+
|
|
34
|
+
In **id itself** (which IS the source of truth), populate from Inertia shared props:
|
|
35
|
+
|
|
36
|
+
```tsx
|
|
37
|
+
import { CboxIdProvider } from '@cboxdk/cbox-ui';
|
|
38
|
+
|
|
39
|
+
export default function AppRoot({ shared, children }) {
|
|
40
|
+
return (
|
|
41
|
+
<CboxIdProvider value={shared.cboxId}>
|
|
42
|
+
{children}
|
|
43
|
+
</CboxIdProvider>
|
|
44
|
+
);
|
|
45
|
+
}
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
In **cortex / atlas / track / future apps**, populate from the id-client SDK on session start:
|
|
49
|
+
|
|
50
|
+
```tsx
|
|
51
|
+
import { CboxIdProvider } from '@cboxdk/cbox-ui';
|
|
52
|
+
import { useIdSession } from '@cboxdk/cbox-id-client';
|
|
53
|
+
|
|
54
|
+
export default function AppRoot({ children }) {
|
|
55
|
+
const session = useIdSession(); // {user, organizations, currentOrg, ...}
|
|
56
|
+
return (
|
|
57
|
+
<CboxIdProvider value={session.cboxIdContext}>
|
|
58
|
+
{children}
|
|
59
|
+
</CboxIdProvider>
|
|
60
|
+
);
|
|
61
|
+
}
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
The context shape is exported as `CboxIdContextValue` โ see `src/context/cbox-id.tsx` for the full surface. Required keys:
|
|
65
|
+
|
|
66
|
+
- `user` โ `{id, name, email, avatar_url?, locale?, timezone?}`
|
|
67
|
+
- `currentOrganization` โ current org context (or null on user-only surfaces)
|
|
68
|
+
- `organizations` โ every org the user belongs to (drives the switcher)
|
|
69
|
+
- `apps` โ sister apps for the launcher
|
|
70
|
+
- `urls` โ `{idBaseUrl, accountUrl, orgSettingsUrl, switchOrgUrl, signOutUrl}`
|
|
71
|
+
- `notifications?` โ `{unreadCount, inboxUrl}` (optional, hides the bell when missing)
|
|
72
|
+
- `onSwitchOrganization?` โ callback when the user picks an org (default: form-POST to `urls.switchOrgUrl`)
|
|
73
|
+
|
|
74
|
+
### 3. Drop in the chrome
|
|
75
|
+
|
|
76
|
+
```tsx
|
|
77
|
+
import { TopBar } from '@cboxdk/cbox-ui';
|
|
78
|
+
|
|
79
|
+
<TopBar
|
|
80
|
+
brand={<MyAppLogo />}
|
|
81
|
+
centre={<MySearchBar />}
|
|
82
|
+
showOrgSwitcher
|
|
83
|
+
/>
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
The default right-cluster is `<AppLauncher>` โ `<NotificationsBell>` โ `<UserMenu>`. Override with `rightCluster={...}` if a particular app needs a different mix.
|
|
87
|
+
|
|
88
|
+
### 4. Use page primitives
|
|
89
|
+
|
|
90
|
+
```tsx
|
|
91
|
+
import {
|
|
92
|
+
PageShell,
|
|
93
|
+
PageHeader,
|
|
94
|
+
PageTabs,
|
|
95
|
+
DataPanel,
|
|
96
|
+
PanelBody,
|
|
97
|
+
SectionHeader,
|
|
98
|
+
StatusPill,
|
|
99
|
+
EmptyState,
|
|
100
|
+
StatTile,
|
|
101
|
+
KeyValue,
|
|
102
|
+
} from '@cboxdk/cbox-ui';
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
Match id's existing patterns โ see id/resources/js/pages/* for examples.
|
|
106
|
+
|
|
107
|
+
## Components
|
|
108
|
+
|
|
109
|
+
### Chrome (cross-app navigation)
|
|
110
|
+
|
|
111
|
+
| Component | What it does |
|
|
112
|
+
|---|---|
|
|
113
|
+
| `TopBar` | Standard 56px-tall app bar. Slot for brand + centre + right cluster. |
|
|
114
|
+
| `OrgSwitcher` | Dropdown listing the user's orgs. Calls `onSwitchOrganization` (or POSTs to `urls.switchOrgUrl`) on pick. |
|
|
115
|
+
| `AppLauncher` | 9-dot grid showing sister Cbox apps the user can jump into. |
|
|
116
|
+
| `UserMenu` | Avatar dropdown with "Manage account โ" + "Team & billing โ" (deep-links into id) + Sign out. |
|
|
117
|
+
| `NotificationsBell` | Bell icon with unread badge, links to id's unified inbox. Renders nothing if context lacks `notifications`. |
|
|
118
|
+
|
|
119
|
+
### Page primitives
|
|
120
|
+
|
|
121
|
+
| Component | What it does |
|
|
122
|
+
|---|---|
|
|
123
|
+
| `PageShell` | Outer page container with vertical rhythm. |
|
|
124
|
+
| `PageHeader` | Title + description + actions slot. Tab-strip-aware (no padding mismatch when followed by `PageTabs`). |
|
|
125
|
+
| `PageTabs` | Tabs strip on the page baseline. Pass `currentPath` + optional `LinkComponent` (Inertia's `Link`, Next's, etc.). |
|
|
126
|
+
| `DataPanel` / `PanelBody` / `SectionHeader` | The default building block for content sections. |
|
|
127
|
+
| `StatusPill` | Coloured chip for status / state. Tones: success / warning / destructive / info / muted / neutral. |
|
|
128
|
+
| `EmptyState` | Centred icon + heading + description for empty lists. |
|
|
129
|
+
| `StatTile` | Big-number metric tile. |
|
|
130
|
+
| `KeyValue` / `KeyValueList` | Definition-list style "label โ value" for detail panels. |
|
|
131
|
+
| `Heading` | Section heading without the panel chrome. |
|
|
132
|
+
|
|
133
|
+
## Versioning
|
|
134
|
+
|
|
135
|
+
This package follows semver. **Breaking changes get a major bump** โ every Cbox app pinning a major version stays safe. New components, new optional props, new tokens โ minor. Token tweaks that don't change the visual contract โ patch.
|
|
136
|
+
|
|
137
|
+
In practice during the early days (v0.x): treat every release as potentially breaking, pin exact versions, upgrade in lockstep.
|
|
138
|
+
|
|
139
|
+
## Local dev against id
|
|
140
|
+
|
|
141
|
+
While iterating, `bun link` the package locally so id picks up changes on rebuild:
|
|
142
|
+
|
|
143
|
+
```sh
|
|
144
|
+
# In cbox-ui:
|
|
145
|
+
bun run build && bun link
|
|
146
|
+
|
|
147
|
+
# In id:
|
|
148
|
+
bun link @cboxdk/cbox-ui
|
|
149
|
+
bun run dev
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
Switch back to the published version with `bun unlink @cboxdk/cbox-ui && bun install`.
|
|
153
|
+
|
|
154
|
+
## Brand
|
|
155
|
+
|
|
156
|
+
Brand guidelines, logo files, and the canonical asset set live in [`BRAND.md`](./BRAND.md) and `assets/`.
|
package/TRADEMARKS.md
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
# Trademarks
|
|
2
|
+
|
|
3
|
+
The code in this repository is licensed under the MIT License (see `LICENSE`).
|
|
4
|
+
|
|
5
|
+
The Cbox name and the Cbox logos, wordmarks and monograms in `assets/` are trademarks of Cbox and are not licensed under the MIT License. They may be used to refer to Cbox products, but not to brand other products.
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" role="img" aria-label="Cbox">
|
|
3
|
+
<title>Cbox</title>
|
|
4
|
+
<rect x="0" y="0" width="32" height="32" rx="7" fill="oklch(0.45 0.16 258)"/>
|
|
5
|
+
<circle cx="16" cy="16" r="6" fill="oklch(0.992 0.003 247)"/>
|
|
6
|
+
</svg>
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" role="img" aria-label="Cbox ยท Atlas">
|
|
3
|
+
<title>Cbox ยท Atlas</title>
|
|
4
|
+
<rect x="2" y="2" width="60" height="60" rx="14" fill="oklch(0.6 0.14 200)"/>
|
|
5
|
+
<text
|
|
6
|
+
x="32"
|
|
7
|
+
y="44"
|
|
8
|
+
text-anchor="middle"
|
|
9
|
+
fill="oklch(0.992 0.003 247)"
|
|
10
|
+
font-family="Plus Jakarta Sans, ui-sans-serif, system-ui, sans-serif"
|
|
11
|
+
font-weight="700"
|
|
12
|
+
font-size="40"
|
|
13
|
+
letter-spacing="-0.04em">A</text>
|
|
14
|
+
</svg>
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" role="img" aria-label="Cbox ยท Cortex">
|
|
3
|
+
<title>Cbox ยท Cortex</title>
|
|
4
|
+
<rect x="2" y="2" width="60" height="60" rx="14" fill="oklch(0.55 0.21 295)"/>
|
|
5
|
+
<text
|
|
6
|
+
x="32"
|
|
7
|
+
y="44"
|
|
8
|
+
text-anchor="middle"
|
|
9
|
+
fill="oklch(0.992 0.003 247)"
|
|
10
|
+
font-family="Plus Jakarta Sans, ui-sans-serif, system-ui, sans-serif"
|
|
11
|
+
font-weight="700"
|
|
12
|
+
font-size="40"
|
|
13
|
+
letter-spacing="-0.04em">C</text>
|
|
14
|
+
</svg>
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" role="img" aria-label="Cbox ยท ID">
|
|
3
|
+
<title>Cbox ยท ID</title>
|
|
4
|
+
<rect x="2" y="2" width="60" height="60" rx="14" fill="oklch(0.45 0.16 258)"/>
|
|
5
|
+
<text
|
|
6
|
+
x="32"
|
|
7
|
+
y="44"
|
|
8
|
+
text-anchor="middle"
|
|
9
|
+
fill="oklch(0.992 0.003 247)"
|
|
10
|
+
font-family="Plus Jakarta Sans, ui-sans-serif, system-ui, sans-serif"
|
|
11
|
+
font-weight="700"
|
|
12
|
+
font-size="32"
|
|
13
|
+
letter-spacing="-0.04em">ID</text>
|
|
14
|
+
</svg>
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" role="img" aria-label="Cbox ยท Track">
|
|
3
|
+
<title>Cbox ยท Track</title>
|
|
4
|
+
<rect x="2" y="2" width="60" height="60" rx="14" fill="oklch(0.65 0.16 70)"/>
|
|
5
|
+
<text
|
|
6
|
+
x="32"
|
|
7
|
+
y="44"
|
|
8
|
+
text-anchor="middle"
|
|
9
|
+
fill="oklch(0.18 0.012 250)"
|
|
10
|
+
font-family="Plus Jakarta Sans, ui-sans-serif, system-ui, sans-serif"
|
|
11
|
+
font-weight="700"
|
|
12
|
+
font-size="40"
|
|
13
|
+
letter-spacing="-0.04em">T</text>
|
|
14
|
+
</svg>
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1200 630" role="img" aria-label="Cbox">
|
|
3
|
+
<title>Cbox social card template</title>
|
|
4
|
+
<!-- Background: cool near-white with a subtle blue-tinted gradient
|
|
5
|
+
in the lower right, mirroring the canvas treatment in-app. -->
|
|
6
|
+
<defs>
|
|
7
|
+
<linearGradient id="bg" x1="0%" y1="0%" x2="100%" y2="100%">
|
|
8
|
+
<stop offset="0%" stop-color="oklch(0.992 0.003 247)"/>
|
|
9
|
+
<stop offset="100%" stop-color="oklch(0.94 0.01 250)"/>
|
|
10
|
+
</linearGradient>
|
|
11
|
+
</defs>
|
|
12
|
+
<rect width="1200" height="630" fill="url(#bg)"/>
|
|
13
|
+
|
|
14
|
+
<!-- Mark -->
|
|
15
|
+
<g transform="translate(96 96)">
|
|
16
|
+
<rect x="0" y="0" width="120" height="120" rx="28" fill="oklch(0.45 0.16 258)"/>
|
|
17
|
+
<circle cx="60" cy="60" r="22" fill="oklch(0.992 0.003 247)"/>
|
|
18
|
+
</g>
|
|
19
|
+
|
|
20
|
+
<!-- Wordmark -->
|
|
21
|
+
<text
|
|
22
|
+
x="96"
|
|
23
|
+
y="372"
|
|
24
|
+
fill="oklch(0.18 0.012 250)"
|
|
25
|
+
font-family="Plus Jakarta Sans, ui-sans-serif, system-ui, sans-serif"
|
|
26
|
+
font-weight="700"
|
|
27
|
+
font-size="120"
|
|
28
|
+
letter-spacing="-0.04em">Cbox</text>
|
|
29
|
+
|
|
30
|
+
<!-- Tagline slot โ replace per-app/per-page when generating actual cards. -->
|
|
31
|
+
<text
|
|
32
|
+
x="96"
|
|
33
|
+
y="446"
|
|
34
|
+
fill="oklch(0.5 0.012 250)"
|
|
35
|
+
font-family="Plus Jakarta Sans, ui-sans-serif, system-ui, sans-serif"
|
|
36
|
+
font-weight="500"
|
|
37
|
+
font-size="36"
|
|
38
|
+
letter-spacing="-0.01em">Identity, billing, and entitlements for the Cbox family.</text>
|
|
39
|
+
|
|
40
|
+
<!-- Footer rule -->
|
|
41
|
+
<rect x="96" y="538" width="64" height="3" fill="oklch(0.45 0.16 258)"/>
|
|
42
|
+
<text
|
|
43
|
+
x="96"
|
|
44
|
+
y="572"
|
|
45
|
+
fill="oklch(0.5 0.012 250)"
|
|
46
|
+
font-family="JetBrains Mono, ui-monospace, monospace"
|
|
47
|
+
font-weight="500"
|
|
48
|
+
font-size="20"
|
|
49
|
+
letter-spacing="0.04em">CBOX.DK</text>
|
|
50
|
+
</svg>
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 220 56" role="img" aria-label="Cbox">
|
|
3
|
+
<title>Cbox (monochrome)</title>
|
|
4
|
+
<rect x="4" y="12" width="32" height="32" rx="8" fill="currentColor"/>
|
|
5
|
+
<circle cx="20" cy="28" r="6" fill="oklch(0.992 0.003 247)"/>
|
|
6
|
+
<text
|
|
7
|
+
x="50"
|
|
8
|
+
y="37"
|
|
9
|
+
fill="currentColor"
|
|
10
|
+
font-family="Plus Jakarta Sans, ui-sans-serif, system-ui, sans-serif"
|
|
11
|
+
font-weight="600"
|
|
12
|
+
font-size="28"
|
|
13
|
+
letter-spacing="-0.02em">Cbox</text>
|
|
14
|
+
</svg>
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 220 56" role="img" aria-label="Cbox">
|
|
3
|
+
<title>Cbox</title>
|
|
4
|
+
<!-- Mark: rounded square with a single deep-blue dot. The geometric
|
|
5
|
+
opposite of the wordmark's restraint โ small, decisive. -->
|
|
6
|
+
<rect x="4" y="12" width="32" height="32" rx="8" fill="oklch(0.45 0.16 258)"/>
|
|
7
|
+
<circle cx="20" cy="28" r="6" fill="oklch(0.992 0.003 247)"/>
|
|
8
|
+
<!-- Wordmark: Plus Jakarta Sans, semibold, slightly tightened tracking.
|
|
9
|
+
Path-based so we don't depend on the font being embedded. -->
|
|
10
|
+
<text
|
|
11
|
+
x="50"
|
|
12
|
+
y="37"
|
|
13
|
+
fill="oklch(0.18 0.012 250)"
|
|
14
|
+
font-family="Plus Jakarta Sans, ui-sans-serif, system-ui, sans-serif"
|
|
15
|
+
font-weight="600"
|
|
16
|
+
font-size="28"
|
|
17
|
+
letter-spacing="-0.02em">Cbox</text>
|
|
18
|
+
</svg>
|