@calliopelabs/ui 0.1.0 → 0.3.1
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/README.md +5 -3
- package/dist/appearance/brands.d.ts +93 -0
- package/dist/appearance/brands.js +89 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -2,7 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
The shared operator UI of Calliope AI: the app shell, navigation, page frame, data table and list patterns, status colours, design tokens and appearance settings that Astrolift AI and Zentinelle AI both run on. Extracted from the Astrolift AI frontend and generalized with a per-product config, so each console keeps its own name, accent, sidebar colour and navigation while sharing everything else.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
The shared base of the Calliope AI ui series. Product packages (`@calliopelabs/ui-astrolift`, `ui-zentinelle`, `ui-workbench`, later `ui-chat`) depend on it and carry only what is specific to their product. `0.2.0` was published as `@calliopelabs/ui-astrolift` with the same exports; it is deprecated in favour of this package.
|
|
6
|
+
|
|
7
|
+
It is built Storybook first: every component and every screen pattern is built and reviewed in the catalog before an app uses it. The catalog is published at **https://calliope-ux.astro.conflict.cloud**.
|
|
6
8
|
|
|
7
9
|
- React 19 and TypeScript, shipped as per-file ESM with types. No Next-only APIs: the app hands the package its link component.
|
|
8
10
|
- Tailwind CSS 4: the theme tokens as CSS, plus a preset.
|
|
@@ -296,11 +298,11 @@ Conventions for contributors and agents are in [`bootstrap.md`](bootstrap.md).
|
|
|
296
298
|
|
|
297
299
|
## Releasing
|
|
298
300
|
|
|
299
|
-
`publish.yml` publishes to npm as `@calliopelabs/ui` through npm trusted publishing: there is no npm token, the job's GitHub OIDC identity stands in for one
|
|
301
|
+
`publish.yml` publishes to npm as `@calliopelabs/ui` through npm trusted publishing: there is no npm token, the job's GitHub OIDC identity stands in for one. The package carries no provenance while the repository is private: npm accepts provenance only from public repositories. It runs when a GitHub release is published, or by hand on an existing version tag; it refuses a branch. Before anything is published, `release-checks.yml` checks that the tag names the `package.json` version and points at the commit being built, then runs every CI gate on that commit. A prerelease version (`0.2.0-alpha.1`) goes out under the `alpha` dist-tag, and a version already on npm is left alone. Nothing in the workflows bumps a version or creates a tag.
|
|
300
302
|
|
|
301
303
|
### The first publish
|
|
302
304
|
|
|
303
|
-
A brand new package cannot use trusted publishing: npm attaches a trusted publisher to a package that already exists. So `0.1.0
|
|
305
|
+
A brand new package cannot use trusted publishing: npm attaches a trusted publisher to a package that already exists. So the first version, `0.1.0`, was published once by hand, by an npm account in the `calliopelabs` organization with two-factor authentication on. In a fresh clone of `main`, tag it (a tag push starts no workflow) and publish that clean checkout of the tag:
|
|
304
306
|
|
|
305
307
|
```sh
|
|
306
308
|
git clone https://github.com/calliopeai/calliope-ui.git calliope-ui-v0.1.0 && cd calliope-ui-v0.1.0
|
|
@@ -92,3 +92,96 @@ export declare const zentinelleBrand: {
|
|
|
92
92
|
readonly light: "mist";
|
|
93
93
|
};
|
|
94
94
|
};
|
|
95
|
+
/**
|
|
96
|
+
* Calliope AI Workbench (JunoHub, the installer's default theme, the desktop
|
|
97
|
+
* splash): teal on navy. From junohub `custom.css` (--calliope-primary,
|
|
98
|
+
* --calliope-dark) and the installer's workbench theme. Dark only today.
|
|
99
|
+
*/
|
|
100
|
+
export declare const workbenchBrand: {
|
|
101
|
+
readonly id: "workbench";
|
|
102
|
+
readonly name: "Calliope AI Workbench";
|
|
103
|
+
readonly accent: {
|
|
104
|
+
readonly key: "workbench-teal";
|
|
105
|
+
readonly label: "Workbench teal";
|
|
106
|
+
readonly dark: "#0af0ce";
|
|
107
|
+
readonly onDark: "#0b1120";
|
|
108
|
+
readonly light: "#0b7a69";
|
|
109
|
+
readonly onLight: "#f3fbf7";
|
|
110
|
+
};
|
|
111
|
+
readonly sidebar: "#0b1120";
|
|
112
|
+
readonly grounds: readonly ["black", "charcoal", "graphite", "paper", "mist"];
|
|
113
|
+
readonly defaultGround: {
|
|
114
|
+
readonly dark: "charcoal";
|
|
115
|
+
readonly light: "mist";
|
|
116
|
+
};
|
|
117
|
+
};
|
|
118
|
+
/**
|
|
119
|
+
* Calliope AI Chat Studio: blue, from `sql-agent-ui/src/index.css` (--brand
|
|
120
|
+
* in :root and .dark, --sidebar-background in .dark).
|
|
121
|
+
*/
|
|
122
|
+
export declare const chatStudioBrand: {
|
|
123
|
+
readonly id: "chat-studio";
|
|
124
|
+
readonly name: "Calliope AI Chat Studio";
|
|
125
|
+
readonly accent: {
|
|
126
|
+
readonly key: "studio-blue";
|
|
127
|
+
readonly label: "Studio blue";
|
|
128
|
+
readonly dark: "#8ab4f8";
|
|
129
|
+
readonly onDark: "#0c0c0c";
|
|
130
|
+
readonly light: "#1d4ed8";
|
|
131
|
+
readonly onLight: "#ffffff";
|
|
132
|
+
};
|
|
133
|
+
readonly sidebar: "#080808";
|
|
134
|
+
readonly grounds: readonly ["black", "charcoal", "graphite", "paper", "mist"];
|
|
135
|
+
readonly defaultGround: {
|
|
136
|
+
readonly dark: "black";
|
|
137
|
+
readonly light: "paper";
|
|
138
|
+
};
|
|
139
|
+
};
|
|
140
|
+
/**
|
|
141
|
+
* Calliope AI Loadr: Catppuccin blue, from `frontend/src/index.css`
|
|
142
|
+
* (--ctp-blue for Latte and Mocha, --accent-strong-fg). Sidebar is Mocha's
|
|
143
|
+
* mantle. Dark by default.
|
|
144
|
+
*/
|
|
145
|
+
export declare const loadrBrand: {
|
|
146
|
+
readonly id: "loadr";
|
|
147
|
+
readonly name: "Calliope AI Loadr";
|
|
148
|
+
readonly accent: {
|
|
149
|
+
readonly key: "loadr-blue";
|
|
150
|
+
readonly label: "Loadr blue";
|
|
151
|
+
readonly dark: "#89b4fa";
|
|
152
|
+
readonly onDark: "#11111b";
|
|
153
|
+
readonly light: "#1e66f5";
|
|
154
|
+
readonly onLight: "#ffffff";
|
|
155
|
+
};
|
|
156
|
+
readonly sidebar: "#181825";
|
|
157
|
+
readonly grounds: readonly ["black", "charcoal", "graphite", "paper", "mist"];
|
|
158
|
+
readonly defaultGround: {
|
|
159
|
+
readonly dark: "charcoal";
|
|
160
|
+
readonly light: "paper";
|
|
161
|
+
};
|
|
162
|
+
};
|
|
163
|
+
/**
|
|
164
|
+
* Cykick: cyan on near-black with square corners, from
|
|
165
|
+
* `ui/theme/native-themes.json` (primary, background, radius 0). Cykick's
|
|
166
|
+
* own plugins read tokens, not these components; the brand keeps the family
|
|
167
|
+
* values in one place.
|
|
168
|
+
*/
|
|
169
|
+
export declare const cykickBrand: {
|
|
170
|
+
readonly id: "cykick";
|
|
171
|
+
readonly name: "Cykick";
|
|
172
|
+
readonly accent: {
|
|
173
|
+
readonly key: "cykick-cyan";
|
|
174
|
+
readonly label: "Cykick cyan";
|
|
175
|
+
readonly dark: "#22d3ee";
|
|
176
|
+
readonly onDark: "#07090e";
|
|
177
|
+
readonly light: "#0e7490";
|
|
178
|
+
readonly onLight: "#ffffff";
|
|
179
|
+
};
|
|
180
|
+
readonly sidebar: "#07090e";
|
|
181
|
+
readonly grounds: readonly ["black", "charcoal", "graphite", "paper", "mist"];
|
|
182
|
+
readonly defaultGround: {
|
|
183
|
+
readonly dark: "black";
|
|
184
|
+
readonly light: "mist";
|
|
185
|
+
};
|
|
186
|
+
readonly defaultCorners: 0;
|
|
187
|
+
};
|
|
@@ -59,3 +59,92 @@ export const zentinelleBrand = {
|
|
|
59
59
|
grounds: ["black", "charcoal", "graphite", "paper", "mist"],
|
|
60
60
|
defaultGround: { dark: "black", light: "mist" },
|
|
61
61
|
};
|
|
62
|
+
/*
|
|
63
|
+
* The brands below are copied from what each product ships today, so nothing
|
|
64
|
+
* changes when an app moves onto the library. Where a product has no value
|
|
65
|
+
* the model needs (usually a light-ground accent), the nearest one that
|
|
66
|
+
* passes the contrast tests is used and marked "derived" for the designer.
|
|
67
|
+
*/
|
|
68
|
+
/**
|
|
69
|
+
* Calliope AI Workbench (JunoHub, the installer's default theme, the desktop
|
|
70
|
+
* splash): teal on navy. From junohub `custom.css` (--calliope-primary,
|
|
71
|
+
* --calliope-dark) and the installer's workbench theme. Dark only today.
|
|
72
|
+
*/
|
|
73
|
+
export const workbenchBrand = {
|
|
74
|
+
id: "workbench",
|
|
75
|
+
name: "Calliope AI Workbench",
|
|
76
|
+
accent: {
|
|
77
|
+
key: "workbench-teal",
|
|
78
|
+
label: "Workbench teal",
|
|
79
|
+
dark: "#0af0ce",
|
|
80
|
+
onDark: "#0b1120",
|
|
81
|
+
// derived: the hub has no light ground
|
|
82
|
+
light: "#0b7a69",
|
|
83
|
+
onLight: "#f3fbf7",
|
|
84
|
+
},
|
|
85
|
+
sidebar: "#0b1120",
|
|
86
|
+
grounds: ["black", "charcoal", "graphite", "paper", "mist"],
|
|
87
|
+
defaultGround: { dark: "charcoal", light: "mist" },
|
|
88
|
+
};
|
|
89
|
+
/**
|
|
90
|
+
* Calliope AI Chat Studio: blue, from `sql-agent-ui/src/index.css` (--brand
|
|
91
|
+
* in :root and .dark, --sidebar-background in .dark).
|
|
92
|
+
*/
|
|
93
|
+
export const chatStudioBrand = {
|
|
94
|
+
id: "chat-studio",
|
|
95
|
+
name: "Calliope AI Chat Studio",
|
|
96
|
+
accent: {
|
|
97
|
+
key: "studio-blue",
|
|
98
|
+
label: "Studio blue",
|
|
99
|
+
dark: "#8ab4f8",
|
|
100
|
+
onDark: "#0c0c0c",
|
|
101
|
+
light: "#1d4ed8",
|
|
102
|
+
onLight: "#ffffff",
|
|
103
|
+
},
|
|
104
|
+
sidebar: "#080808",
|
|
105
|
+
grounds: ["black", "charcoal", "graphite", "paper", "mist"],
|
|
106
|
+
defaultGround: { dark: "black", light: "paper" },
|
|
107
|
+
};
|
|
108
|
+
/**
|
|
109
|
+
* Calliope AI Loadr: Catppuccin blue, from `frontend/src/index.css`
|
|
110
|
+
* (--ctp-blue for Latte and Mocha, --accent-strong-fg). Sidebar is Mocha's
|
|
111
|
+
* mantle. Dark by default.
|
|
112
|
+
*/
|
|
113
|
+
export const loadrBrand = {
|
|
114
|
+
id: "loadr",
|
|
115
|
+
name: "Calliope AI Loadr",
|
|
116
|
+
accent: {
|
|
117
|
+
key: "loadr-blue",
|
|
118
|
+
label: "Loadr blue",
|
|
119
|
+
dark: "#89b4fa",
|
|
120
|
+
onDark: "#11111b",
|
|
121
|
+
light: "#1e66f5",
|
|
122
|
+
onLight: "#ffffff",
|
|
123
|
+
},
|
|
124
|
+
sidebar: "#181825",
|
|
125
|
+
grounds: ["black", "charcoal", "graphite", "paper", "mist"],
|
|
126
|
+
defaultGround: { dark: "charcoal", light: "paper" },
|
|
127
|
+
};
|
|
128
|
+
/**
|
|
129
|
+
* Cykick: cyan on near-black with square corners, from
|
|
130
|
+
* `ui/theme/native-themes.json` (primary, background, radius 0). Cykick's
|
|
131
|
+
* own plugins read tokens, not these components; the brand keeps the family
|
|
132
|
+
* values in one place.
|
|
133
|
+
*/
|
|
134
|
+
export const cykickBrand = {
|
|
135
|
+
id: "cykick",
|
|
136
|
+
name: "Cykick",
|
|
137
|
+
accent: {
|
|
138
|
+
key: "cykick-cyan",
|
|
139
|
+
label: "Cykick cyan",
|
|
140
|
+
dark: "#22d3ee",
|
|
141
|
+
onDark: "#07090e",
|
|
142
|
+
// derived: no light accent in native-themes.json
|
|
143
|
+
light: "#0e7490",
|
|
144
|
+
onLight: "#ffffff",
|
|
145
|
+
},
|
|
146
|
+
sidebar: "#07090e",
|
|
147
|
+
grounds: ["black", "charcoal", "graphite", "paper", "mist"],
|
|
148
|
+
defaultGround: { dark: "black", light: "mist" },
|
|
149
|
+
defaultCorners: 0,
|
|
150
|
+
};
|
package/dist/index.d.ts
CHANGED
|
@@ -8,7 +8,7 @@ export { cn } from "./lib/cn.js";
|
|
|
8
8
|
export { ACCENTS, ACCENT_KEYS, DENSITIES, DENSITY_KEYS, GROUNDS, GROUND_KEYS, MODE_TOKENS, SURFACES, type AccentSpec, type Density, type FamilyAccent, type Ground, type Mode, type StatusName, } from "./theme/tokens.js";
|
|
9
9
|
export { MIN_NON_TEXT_CONTRAST, MIN_TEXT_CONTRAST, contrastRatio, luminance, } from "./theme/contrast.js";
|
|
10
10
|
export { CORNERS, defineProduct, type BrandAccent, type Corners, type Product, type ProductAccent, type ProductConfig, type ProductTheme, } from "./appearance/product.js";
|
|
11
|
-
export { astroliftBrand, zentinelleBrand } from "./appearance/brands.js";
|
|
11
|
+
export { astroliftBrand, chatStudioBrand, cykickBrand, loadrBrand, workbenchBrand, zentinelleBrand, } from "./appearance/brands.js";
|
|
12
12
|
export { accentContrast, appearanceFromServer, applyAppearance, clearAppearance, inkFor, isCustomAccent, modeFor, normalize, normalizePartial, parseCustomAccent, readAppearance, resolveAppearance, writeAppearance, type Appearance, type CustomAccent, type OrgAppearancePolicy, type ResolvedAppearance, } from "./appearance/appearance.js";
|
|
13
13
|
export { appearanceScript, productStyles } from "./appearance/boot.js";
|
|
14
14
|
export { AppearanceScript, type AppearanceScriptProps } from "./appearance/AppearanceScript.js";
|
package/dist/index.js
CHANGED
|
@@ -11,7 +11,7 @@ export { ACCENTS, ACCENT_KEYS, DENSITIES, DENSITY_KEYS, GROUNDS, GROUND_KEYS, MO
|
|
|
11
11
|
export { MIN_NON_TEXT_CONTRAST, MIN_TEXT_CONTRAST, contrastRatio, luminance, } from "./theme/contrast.js";
|
|
12
12
|
// Product and appearance
|
|
13
13
|
export { CORNERS, defineProduct, } from "./appearance/product.js";
|
|
14
|
-
export { astroliftBrand, zentinelleBrand } from "./appearance/brands.js";
|
|
14
|
+
export { astroliftBrand, chatStudioBrand, cykickBrand, loadrBrand, workbenchBrand, zentinelleBrand, } from "./appearance/brands.js";
|
|
15
15
|
export { accentContrast, appearanceFromServer, applyAppearance, clearAppearance, inkFor, isCustomAccent, modeFor, normalize, normalizePartial, parseCustomAccent, readAppearance, resolveAppearance, writeAppearance, } from "./appearance/appearance.js";
|
|
16
16
|
export { appearanceScript, productStyles } from "./appearance/boot.js";
|
|
17
17
|
export { AppearanceScript } from "./appearance/AppearanceScript.js";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@calliopelabs/ui",
|
|
3
|
-
"version": "0.1
|
|
3
|
+
"version": "0.3.1",
|
|
4
4
|
"description": "Calliope AI shared operator UI: app shell, navigation, page frame, data table and list patterns, status colours, design tokens and appearance for Astrolift AI and Zentinelle AI.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"calliope-ai",
|