@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 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
- 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://calliopeai.github.io/calliope-ui/**.
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, and the package carries provenance. 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.
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` is 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:
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.0",
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",