@cloudgrid-io/ui 0.4.0 → 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/README.md +1 -1
- package/dist/blocks/onboarding-question.d.ts +128 -0
- package/dist/blocks/onboarding-question.d.ts.map +1 -0
- package/dist/blocks/onboarding-question.js +86 -0
- package/dist/blocks/onboarding-question.js.map +1 -0
- package/dist/blocks/page-heading.d.ts.map +1 -1
- package/dist/blocks/page-heading.js +1 -1
- package/dist/blocks/page-heading.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/tokens/base.json +53 -0
- package/dist/tokens/surface-ink.json +13 -0
- package/dist/tokens/surface-panel.json +13 -0
- package/dist/tokens.css +68 -0
- package/dist/tokens.json +10 -3
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
The CloudGrid design system: CSS custom properties, a Tailwind v4 theme, self-hosted
|
|
4
4
|
fonts, and the same values as machine-readable JSON.
|
|
5
5
|
|
|
6
|
-
|
|
6
|
+
47 React components, built on [Base UI](https://base-ui.com), styled only through tokens
|
|
7
7
|
and carrying no hardcoded colour.
|
|
8
8
|
|
|
9
9
|
## Install
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import { PageHeading } from "./page-heading.js";
|
|
3
|
+
/**
|
|
4
|
+
* A question screen: a heading, a line saying how to answer it, a set of
|
|
5
|
+
* selectable option cards, and the button that moves on.
|
|
6
|
+
*
|
|
7
|
+
* The shape the console's onboarding asks every question in (#119). Read from
|
|
8
|
+
* Figma, the four channel flows reuse five screens and three of them are this
|
|
9
|
+
* one — "How did you find us", "What you usually build", "Let's know each other
|
|
10
|
+
* better" — differing in exactly one respect: whether you may pick more than
|
|
11
|
+
* one. So this is one component with a `mode`, not three screens and not two
|
|
12
|
+
* components. Everything else about them is identical, and duplicating it would
|
|
13
|
+
* mean a designer retuning the option card in two places and finding one.
|
|
14
|
+
*
|
|
15
|
+
* ## Presentation only
|
|
16
|
+
*
|
|
17
|
+
* The same line #117 drew for the entity card. This component carries no
|
|
18
|
+
* CloudGrid question, no channel logic and no idea what comes next. It knows
|
|
19
|
+
* nothing about "invite link" or "website"; it renders the options it is handed
|
|
20
|
+
* and reports what was picked. The strings, the sequence, the persistence and
|
|
21
|
+
* the meaning all stay in the console.
|
|
22
|
+
*
|
|
23
|
+
* ## One `mode`, two ARIA patterns
|
|
24
|
+
*
|
|
25
|
+
* These are not the same control with a different limit, and that is why they
|
|
26
|
+
* are Base UI's rather than a `role` attribute and a `keydown` handler:
|
|
27
|
+
*
|
|
28
|
+
* | | `single` | `multi` |
|
|
29
|
+
* |---|---|---|
|
|
30
|
+
* | container | `role="radiogroup"` | `role="group"` |
|
|
31
|
+
* | option | `role="radio"` | `role="checkbox"` |
|
|
32
|
+
* | tab stops | ONE for the group | one per option |
|
|
33
|
+
* | keys | arrows move and select, Space selects | Space toggles the focused one |
|
|
34
|
+
*
|
|
35
|
+
* A radio group has a single tab stop and roving focus; a checkbox group does
|
|
36
|
+
* not. Hand-rolling that reads correct in review and ships a group a keyboard
|
|
37
|
+
* cannot traverse, with nothing anywhere going red.
|
|
38
|
+
*
|
|
39
|
+
* ## The option IS the library's OptionCard
|
|
40
|
+
*
|
|
41
|
+
* Each option renders through `OptionCard` as Base UI's `render` element, so the
|
|
42
|
+
* card a designer tunes in `option-card.tsx` is the card this screen shows, and
|
|
43
|
+
* the selection behaviour is layered on top rather than a second card being
|
|
44
|
+
* grown here. `OptionCard` itself stays what it is — a static card or a link —
|
|
45
|
+
* because "a card that navigates" and "a card that holds an answer" are
|
|
46
|
+
* different controls, and a `selected` prop on the former would mean nothing
|
|
47
|
+
* most of the time.
|
|
48
|
+
*
|
|
49
|
+
* ## Selection is never colour alone
|
|
50
|
+
*
|
|
51
|
+
* Three independent signals, because the palette alone cannot carry it. Each
|
|
52
|
+
* option has an indicator that changes SHAPE when picked — an empty ring gains a
|
|
53
|
+
* dot, an empty box gains a tick — drawn in `currentColor`, which is `text-ink`
|
|
54
|
+
* and therefore legible on every surface. The card's border goes from hairline
|
|
55
|
+
* to strong. `aria-checked` carries the same fact to assistive tech.
|
|
56
|
+
*
|
|
57
|
+
* ## Surfaces, and the token that would have broken this
|
|
58
|
+
*
|
|
59
|
+
* On the panel scope `tokens.css` declares text, three line colours, the focus
|
|
60
|
+
* ring, a transparent card, the link pair and the state palette, and nothing
|
|
61
|
+
* else. `--cg-border-accent` is NOT among them, so it inherits `:root`, which is
|
|
62
|
+
* `var(--cg-primary)` — the panel's own purple. A selected card outlined in the
|
|
63
|
+
* accent is invisible on the panel, and looks perfect everywhere anyone would
|
|
64
|
+
* check. `--cg-primary-tint` is base-only and would paint near-white on purple.
|
|
65
|
+
*
|
|
66
|
+
* So the selected state is `--cg-border-strong` (ink on the page, white on both
|
|
67
|
+
* dark surfaces) plus the drawn indicator. No accent border, no tint, no fill.
|
|
68
|
+
*/
|
|
69
|
+
export interface OnboardingOption {
|
|
70
|
+
/** What `onValueChange` reports. Stable, and never shown. */
|
|
71
|
+
value: string;
|
|
72
|
+
/** The words on the card. */
|
|
73
|
+
label: string;
|
|
74
|
+
/**
|
|
75
|
+
* An outline SVG at 26 to 30px — `OptionCard`'s glyph contract, unchanged.
|
|
76
|
+
* Icons in this system are monoline: never filled, never on a chip.
|
|
77
|
+
*/
|
|
78
|
+
icon?: React.ReactNode;
|
|
79
|
+
/** A line under the label, when the label alone is not enough. */
|
|
80
|
+
description?: string;
|
|
81
|
+
disabled?: boolean;
|
|
82
|
+
}
|
|
83
|
+
/** Two columns is the Figma arrangement. One reads as a list, three as a picker. */
|
|
84
|
+
declare const COLUMNS: {
|
|
85
|
+
readonly 1: "grid-cols-1";
|
|
86
|
+
readonly 2: "grid-cols-1 sm:grid-cols-2";
|
|
87
|
+
readonly 3: "grid-cols-1 sm:grid-cols-2 lg:grid-cols-3";
|
|
88
|
+
};
|
|
89
|
+
/** Everything both modes share. The mode-specific half is the union below. */
|
|
90
|
+
type OnboardingQuestionBaseProps = Omit<React.ComponentProps<"section">, "ref" | "title" | "defaultValue" | "onChange"> & {
|
|
91
|
+
title: string;
|
|
92
|
+
/** How to answer it: "Pick one", "Pick all that apply". */
|
|
93
|
+
sub?: string;
|
|
94
|
+
eyebrow?: string;
|
|
95
|
+
options: OnboardingOption[];
|
|
96
|
+
columns?: keyof typeof COLUMNS;
|
|
97
|
+
/** Forwarded to `PageHeading`. `h2` for a question inside a larger page. */
|
|
98
|
+
level?: 1 | 2;
|
|
99
|
+
headingSize?: React.ComponentProps<typeof PageHeading>["size"];
|
|
100
|
+
continueLabel?: string;
|
|
101
|
+
onContinue?: () => void;
|
|
102
|
+
/**
|
|
103
|
+
* Overrides when the button is live. Left alone it enables as soon as there is
|
|
104
|
+
* an answer, which is the only rule this component can know. Anything else —
|
|
105
|
+
* a minimum, a question that may be skipped — is the console's to decide.
|
|
106
|
+
*/
|
|
107
|
+
canContinue?: boolean;
|
|
108
|
+
/** Under the button. The console puts "Skip for now" here. */
|
|
109
|
+
footer?: React.ReactNode;
|
|
110
|
+
/** Submitted with a surrounding form, when there is one. */
|
|
111
|
+
name?: string;
|
|
112
|
+
};
|
|
113
|
+
type OnboardingQuestionProps = OnboardingQuestionBaseProps & ({
|
|
114
|
+
/** One answer. A radio group: one tab stop, arrows move and select. */
|
|
115
|
+
mode?: "single";
|
|
116
|
+
value?: string | null;
|
|
117
|
+
defaultValue?: string | null;
|
|
118
|
+
onValueChange?: (value: string | null) => void;
|
|
119
|
+
} | {
|
|
120
|
+
/** Any number of answers. A checkbox group: each option is a tab stop. */
|
|
121
|
+
mode: "multi";
|
|
122
|
+
value?: string[];
|
|
123
|
+
defaultValue?: string[];
|
|
124
|
+
onValueChange?: (value: string[]) => void;
|
|
125
|
+
});
|
|
126
|
+
declare function OnboardingQuestion(props: OnboardingQuestionProps): React.JSX.Element;
|
|
127
|
+
export { OnboardingQuestion };
|
|
128
|
+
//# sourceMappingURL=onboarding-question.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"onboarding-question.d.ts","sourceRoot":"","sources":["../../src/blocks/onboarding-question.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAS9B,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAA;AAGxD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiEG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,6DAA6D;IAC7D,KAAK,EAAE,MAAM,CAAA;IACb,6BAA6B;IAC7B,KAAK,EAAE,MAAM,CAAA;IACb;;;OAGG;IACH,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACtB,kEAAkE;IAClE,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED,oFAAoF;AACpF,QAAA,MAAM,OAAO;;;;CAIH,CAAA;AAsFV,8EAA8E;AAC9E,KAAK,2BAA2B,GAAG,IAAI,CACrC,KAAK,CAAC,cAAc,CAAC,SAAS,CAAC,EAC/B,KAAK,GAAG,OAAO,GAAG,cAAc,GAAG,UAAU,CAC9C,GAAG;IACF,KAAK,EAAE,MAAM,CAAA;IACb,2DAA2D;IAC3D,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,gBAAgB,EAAE,CAAA;IAC3B,OAAO,CAAC,EAAE,MAAM,OAAO,OAAO,CAAA;IAC9B,4EAA4E;IAC5E,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,CAAA;IACb,WAAW,CAAC,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAA;IAC9D,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,UAAU,CAAC,EAAE,MAAM,IAAI,CAAA;IACvB;;;;OAIG;IACH,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,8DAA8D;IAC9D,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IACxB,4DAA4D;IAC5D,IAAI,CAAC,EAAE,MAAM,CAAA;CACd,CAAA;AAED,KAAK,uBAAuB,GAAG,2BAA2B,GACxD,CACI;IACE,uEAAuE;IACvE,IAAI,CAAC,EAAE,QAAQ,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAA;CAC/C,GACD;IACE,0EAA0E;IAC1E,IAAI,EAAE,OAAO,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;IAChB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;IACvB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,CAAA;CAC1C,CACJ,CAAA;AAEH,iBAAS,kBAAkB,CAAC,KAAK,EAAE,uBAAuB,qBA8GzD;AAED,OAAO,EAAE,kBAAkB,EAAE,CAAA"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import { Checkbox } from "@base-ui/react/checkbox";
|
|
5
|
+
import { CheckboxGroup } from "@base-ui/react/checkbox-group";
|
|
6
|
+
import { Radio } from "@base-ui/react/radio";
|
|
7
|
+
import { RadioGroup } from "@base-ui/react/radio-group";
|
|
8
|
+
import { CheckIcon } from "lucide-react";
|
|
9
|
+
import { Button } from "../ui/button.js";
|
|
10
|
+
import { OptionCard } from "./option-card.js";
|
|
11
|
+
import { PageHeading } from "./page-heading.js";
|
|
12
|
+
import { cn } from "../lib/cloudgrid-cn.js";
|
|
13
|
+
/** Two columns is the Figma arrangement. One reads as a list, three as a picker. */
|
|
14
|
+
const COLUMNS = {
|
|
15
|
+
1: "grid-cols-1",
|
|
16
|
+
2: "grid-cols-1 sm:grid-cols-2",
|
|
17
|
+
3: "grid-cols-1 sm:grid-cols-2 lg:grid-cols-3",
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* The card, in both modes. Every class here is a utility over a `--cg-*` token,
|
|
21
|
+
* so the whole thing flips with the surface.
|
|
22
|
+
*
|
|
23
|
+
* `group` is what lets the indicator inside react to the root's `data-checked`.
|
|
24
|
+
* `pe-11` reserves the indicator's corner so a long label cannot run under it;
|
|
25
|
+
* tailwind-merge resolves it against `OptionCard`'s own `p-5` rather than
|
|
26
|
+
* fighting it.
|
|
27
|
+
*/
|
|
28
|
+
const OPTION_CLASS = cn("group relative cursor-pointer pe-11 text-start transition-colors select-none", "hover:border-line", "focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring focus-visible:outline-none", "data-checked:border-line-strong data-checked:ring-1 data-checked:ring-(--cg-border-strong)", "data-disabled:pointer-events-none data-disabled:opacity-50");
|
|
29
|
+
/** The indicator's frame. Round for one-of, square for many-of: shape says which. */
|
|
30
|
+
const INDICATOR_CLASS = cn("pointer-events-none absolute end-4 top-4 flex size-4 shrink-0 items-center justify-center", "border border-line text-ink transition-colors group-data-checked:border-line-strong");
|
|
31
|
+
function OnboardingQuestionOption({ option, mode, name, }) {
|
|
32
|
+
// `render` rather than children: Base UI merges its own role, aria-checked,
|
|
33
|
+
// data-checked, tabIndex, handlers and ref INTO this element, so the option is
|
|
34
|
+
// literally an OptionCard with radio or checkbox semantics rather than a
|
|
35
|
+
// lookalike. className is concatenated, and OptionCard runs the result through
|
|
36
|
+
// cn() last, so these utilities win the conflicts they are meant to win.
|
|
37
|
+
const card = (_jsx(OptionCard, { title: option.label, body: option.description, glyph: option.icon }));
|
|
38
|
+
if (mode === "multi") {
|
|
39
|
+
return (_jsx(Checkbox.Root, { value: option.value, name: name, disabled: option.disabled, "data-slot": "onboarding-question-option", className: OPTION_CLASS, render: card, children: _jsx("span", { "aria-hidden": "true", "data-slot": "onboarding-question-indicator", className: cn(INDICATOR_CLASS, "rounded-[4px]"), children: _jsx(Checkbox.Indicator, { className: "flex [&>svg]:size-3", children: _jsx(CheckIcon, { strokeWidth: 3 }) }) }) }));
|
|
40
|
+
}
|
|
41
|
+
return (_jsx(Radio.Root, { value: option.value, disabled: option.disabled, "data-slot": "onboarding-question-option", className: OPTION_CLASS, render: card, children: _jsx("span", { "aria-hidden": "true", "data-slot": "onboarding-question-indicator", className: cn(INDICATOR_CLASS, "rounded-pill"), children: _jsx(Radio.Indicator, { className: "size-2 rounded-pill bg-current" }) }) }));
|
|
42
|
+
}
|
|
43
|
+
function OnboardingQuestion(props) {
|
|
44
|
+
// Narrowed on the discriminant BEFORE destructuring, which is what keeps the
|
|
45
|
+
// value types honest: `single` answers with `string | null` and `multi` with
|
|
46
|
+
// `string[]`, and a consumer never has to narrow what came back. Destructuring
|
|
47
|
+
// first would collapse both into one union and hand the console a value it has
|
|
48
|
+
// to unpick at every call site.
|
|
49
|
+
const isMulti = props.mode === "multi";
|
|
50
|
+
const { title, sub, eyebrow, options, columns = 2, level = 1, headingSize = "md", continueLabel = "Continue", onContinue, canContinue, footer, name, className,
|
|
51
|
+
// Held back so they cannot reach the DOM as attributes.
|
|
52
|
+
mode: _mode, value: _value, defaultValue: _defaultValue, onValueChange: _onValueChange, ...rest } = props;
|
|
53
|
+
// A mirror, kept for ONE reason: to know whether the button should be live.
|
|
54
|
+
// The group below stays the source of truth in both directions — controlled
|
|
55
|
+
// through `value`, uncontrolled through `defaultValue` — so this never becomes
|
|
56
|
+
// a second place the answer lives. `canContinue` overrides it outright.
|
|
57
|
+
const [picked, setPicked] = React.useState(() => {
|
|
58
|
+
const initial = props.value ?? props.defaultValue;
|
|
59
|
+
if (initial == null)
|
|
60
|
+
return [];
|
|
61
|
+
return Array.isArray(initial) ? initial : [initial];
|
|
62
|
+
});
|
|
63
|
+
const answered = (props.value !== undefined
|
|
64
|
+
? Array.isArray(props.value)
|
|
65
|
+
? props.value
|
|
66
|
+
: props.value == null
|
|
67
|
+
? []
|
|
68
|
+
: [props.value]
|
|
69
|
+
: picked).length > 0;
|
|
70
|
+
// The group is labelled by the whole lockup, deliberately. The subline is the
|
|
71
|
+
// instruction — "Pick all that apply" — and a group's label is exactly where a
|
|
72
|
+
// screen reader user needs to hear it. Labelling by the title alone would drop
|
|
73
|
+
// the one sentence that says how many answers are allowed.
|
|
74
|
+
const headingId = React.useId();
|
|
75
|
+
const grid = cn("grid gap-4", COLUMNS[columns]);
|
|
76
|
+
return (_jsxs("section", { "data-slot": "onboarding-question", className: cn("flex flex-col gap-8", className), ...rest, children: [_jsx(PageHeading, { id: headingId, eyebrow: eyebrow, title: title, sub: sub, size: headingSize, level: level }), isMulti ? (_jsx(CheckboxGroup, { "aria-labelledby": headingId, "data-slot": "onboarding-question-options", className: grid, defaultValue: props.defaultValue ?? undefined, value: props.value, onValueChange: (next) => {
|
|
77
|
+
setPicked(next);
|
|
78
|
+
props.onValueChange?.(next);
|
|
79
|
+
}, children: options.map((option) => (_jsx(OnboardingQuestionOption, { option: option, mode: "multi", name: name }, option.value))) })) : (_jsx(RadioGroup, { "aria-labelledby": headingId, "data-slot": "onboarding-question-options", className: grid, name: name, defaultValue: props.defaultValue ?? undefined, value: props.value === null ? "" : props.value, onValueChange: (next) => {
|
|
80
|
+
const answer = typeof next === "string" && next !== "" ? next : null;
|
|
81
|
+
setPicked(answer == null ? [] : [answer]);
|
|
82
|
+
props.onValueChange?.(answer);
|
|
83
|
+
}, children: options.map((option) => (_jsx(OnboardingQuestionOption, { option: option, mode: "single" }, option.value))) })), _jsxs("div", { "data-slot": "onboarding-question-actions", className: "flex flex-col items-start gap-4", children: [_jsx(Button, { type: "button", size: "lg", "data-slot": "onboarding-question-continue", onClick: onContinue, disabled: !(canContinue ?? answered), children: continueLabel }), footer] })] }));
|
|
84
|
+
}
|
|
85
|
+
export { OnboardingQuestion };
|
|
86
|
+
//# sourceMappingURL=onboarding-question.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"onboarding-question.js","sourceRoot":"","sources":["../../src/blocks/onboarding-question.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"page-heading.d.ts","sourceRoot":"","sources":["../../src/blocks/page-heading.tsx"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;GAeG;AACH,QAAA,MAAM,KAAK;;;;;CAKD,CAAA;AAEV,iBAAS,WAAW,CAAC,EACnB,OAAO,EACP,KAAK,EACL,GAAG,EACH,IAAW,EACX,KAAe,EACf,KAAS,EACT,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,GAAG;IAClC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,OAAO,KAAK,CAAA;IACzB,KAAK,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAA;IAC1B,8EAA8E;IAC9E,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,CAAA;CACd,+
|
|
1
|
+
{"version":3,"file":"page-heading.d.ts","sourceRoot":"","sources":["../../src/blocks/page-heading.tsx"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;GAeG;AACH,QAAA,MAAM,KAAK;;;;;CAKD,CAAA;AAEV,iBAAS,WAAW,CAAC,EACnB,OAAO,EACP,KAAK,EACL,GAAG,EACH,IAAW,EACX,KAAe,EACf,KAAS,EACT,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,GAAG;IAClC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,OAAO,KAAK,CAAA;IACzB,KAAK,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAA;IAC1B,8EAA8E;IAC9E,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,CAAA;CACd,+BAuCA;AAED,OAAO,EAAE,WAAW,EAAE,CAAA"}
|
|
@@ -24,7 +24,7 @@ const SIZES = {
|
|
|
24
24
|
};
|
|
25
25
|
function PageHeading({ eyebrow, title, sub, size = "lg", align = "start", level = 1, className, ...props }) {
|
|
26
26
|
const Heading = level === 1 ? "h1" : "h2";
|
|
27
|
-
return (_jsxs("header", { "data-slot": "page-heading", className: cn("flex flex-col gap-3", align === "center" && "items-center text-center", className), ...props, children: [eyebrow ? (_jsx("p", { className: "text-label font-medium text-faint", children: eyebrow })) : null, _jsx(Heading, { className: cn("font-display font-heavy tracking-display uppercase leading-display text-balance text-
|
|
27
|
+
return (_jsxs("header", { "data-slot": "page-heading", className: cn("flex flex-col gap-3", align === "center" && "items-center text-center", className), ...props, children: [eyebrow ? (_jsx("p", { className: "text-label font-medium text-faint", children: eyebrow })) : null, _jsx(Heading, { className: cn("font-display font-heavy tracking-display uppercase leading-display text-balance text-(--cg-text-accent)", SIZES[size]), children: title }), sub ? _jsx("p", { className: "text-body-lg text-body", children: sub }) : null] }));
|
|
28
28
|
}
|
|
29
29
|
export { PageHeading };
|
|
30
30
|
//# sourceMappingURL=page-heading.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"page-heading.js","sourceRoot":"","sources":["../../src/blocks/page-heading.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,oBAAoB,CAAA;AAEvC;;;;;;;;;;;;;;;GAeG;AACH,MAAM,KAAK,GAAG;IACZ,EAAE,EAAE,iBAAiB;IACrB,EAAE,EAAE,oCAAoC;IACxC,EAAE,EAAE,oCAAoC;IACxC,EAAE,EAAE,oCAAoC;CAChC,CAAA;AAEV,SAAS,WAAW,CAAC,EACnB,OAAO,EACP,KAAK,EACL,GAAG,EACH,IAAI,GAAG,IAAI,EACX,KAAK,GAAG,OAAO,EACf,KAAK,GAAG,CAAC,EACT,SAAS,EACT,GAAG,KAAK,EAST;IACC,MAAM,OAAO,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAA;IAEzC,OAAO,CACL,+BACY,cAAc,EACxB,SAAS,EAAE,EAAE,CACX,qBAAqB,EACrB,KAAK,KAAK,QAAQ,IAAI,0BAA0B,EAChD,SAAS,CACV,KACG,KAAK,aAER,OAAO,CAAC,CAAC,CAAC,CACT,YAAG,SAAS,EAAC,mCAAmC,YAAE,OAAO,GAAK,CAC/D,CAAC,CAAC,CAAC,IAAI,
|
|
1
|
+
{"version":3,"file":"page-heading.js","sourceRoot":"","sources":["../../src/blocks/page-heading.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,oBAAoB,CAAA;AAEvC;;;;;;;;;;;;;;;GAeG;AACH,MAAM,KAAK,GAAG;IACZ,EAAE,EAAE,iBAAiB;IACrB,EAAE,EAAE,oCAAoC;IACxC,EAAE,EAAE,oCAAoC;IACxC,EAAE,EAAE,oCAAoC;CAChC,CAAA;AAEV,SAAS,WAAW,CAAC,EACnB,OAAO,EACP,KAAK,EACL,GAAG,EACH,IAAI,GAAG,IAAI,EACX,KAAK,GAAG,OAAO,EACf,KAAK,GAAG,CAAC,EACT,SAAS,EACT,GAAG,KAAK,EAST;IACC,MAAM,OAAO,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAA;IAEzC,OAAO,CACL,+BACY,cAAc,EACxB,SAAS,EAAE,EAAE,CACX,qBAAqB,EACrB,KAAK,KAAK,QAAQ,IAAI,0BAA0B,EAChD,SAAS,CACV,KACG,KAAK,aAER,OAAO,CAAC,CAAC,CAAC,CACT,YAAG,SAAS,EAAC,mCAAmC,YAAE,OAAO,GAAK,CAC/D,CAAC,CAAC,CAAC,IAAI,EAaR,KAAC,OAAO,IACN,SAAS,EAAE,EAAE,CACX,yGAAyG,EACzG,KAAK,CAAC,IAAI,CAAC,CACZ,YAEA,KAAK,GACE,EACT,GAAG,CAAC,CAAC,CAAC,YAAG,SAAS,EAAC,wBAAwB,YAAE,GAAG,GAAK,CAAC,CAAC,CAAC,IAAI,IACtD,CACV,CAAA;AACH,CAAC;AAED,OAAO,EAAE,WAAW,EAAE,CAAA"}
|
package/dist/index.d.ts
CHANGED
|
@@ -33,6 +33,7 @@ export * from "./blocks/entity-status.js";
|
|
|
33
33
|
export * from "./blocks/feature-cells.js";
|
|
34
34
|
export * from "./blocks/hub-index.js";
|
|
35
35
|
export * from "./blocks/logo.js";
|
|
36
|
+
export * from "./blocks/onboarding-question.js";
|
|
36
37
|
export * from "./blocks/option-card.js";
|
|
37
38
|
export * from "./blocks/page-heading.js";
|
|
38
39
|
export * from "./blocks/plug-method.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAiBA,cAAc,mBAAmB,CAAA;AACjC,cAAc,eAAe,CAAA;AAC7B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,cAAc,CAAA;AAC5B,cAAc,kBAAkB,CAAA;AAChC,cAAc,kBAAkB,CAAA;AAChC,cAAc,oBAAoB,CAAA;AAClC,cAAc,kBAAkB,CAAA;AAChC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,uBAAuB,CAAA;AACrC,cAAc,qBAAqB,CAAA;AACnC,cAAc,eAAe,CAAA;AAC7B,cAAc,sBAAsB,CAAA;AACpC,cAAc,eAAe,CAAA;AAC7B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,mBAAmB,CAAA;AACjC,cAAc,kBAAkB,CAAA;AAChC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,eAAe,CAAA;AAC7B,cAAc,cAAc,CAAA;AAC5B,cAAc,kBAAkB,CAAA;AAChC,cAAc,iBAAiB,CAAA;AAG/B,cAAc,0BAA0B,CAAA;AACxC,cAAc,uBAAuB,CAAA;AACrC,cAAc,2BAA2B,CAAA;AACzC,cAAc,2BAA2B,CAAA;AACzC,cAAc,wBAAwB,CAAA;AACtC,cAAc,uBAAuB,CAAA;AACrC,cAAc,yBAAyB,CAAA;AACvC,cAAc,6BAA6B,CAAA;AAC3C,cAAc,2BAA2B,CAAA;AACzC,cAAc,2BAA2B,CAAA;AACzC,cAAc,uBAAuB,CAAA;AACrC,cAAc,kBAAkB,CAAA;AAChC,cAAc,yBAAyB,CAAA;AACvC,cAAc,0BAA0B,CAAA;AACxC,cAAc,yBAAyB,CAAA;AACvC,cAAc,gCAAgC,CAAA;AAC9C,cAAc,2BAA2B,CAAA;AACzC,cAAc,mBAAmB,CAAA;AACjC,cAAc,uBAAuB,CAAA;AACrC,cAAc,yBAAyB,CAAA;AACvC,cAAc,uBAAuB,CAAA;AACrC,cAAc,uBAAuB,CAAA;AACrC,cAAc,wBAAwB,CAAA;AAGtC,cAAc,uBAAuB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAiBA,cAAc,mBAAmB,CAAA;AACjC,cAAc,eAAe,CAAA;AAC7B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,cAAc,CAAA;AAC5B,cAAc,kBAAkB,CAAA;AAChC,cAAc,kBAAkB,CAAA;AAChC,cAAc,oBAAoB,CAAA;AAClC,cAAc,kBAAkB,CAAA;AAChC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,uBAAuB,CAAA;AACrC,cAAc,qBAAqB,CAAA;AACnC,cAAc,eAAe,CAAA;AAC7B,cAAc,sBAAsB,CAAA;AACpC,cAAc,eAAe,CAAA;AAC7B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,mBAAmB,CAAA;AACjC,cAAc,kBAAkB,CAAA;AAChC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,eAAe,CAAA;AAC7B,cAAc,cAAc,CAAA;AAC5B,cAAc,kBAAkB,CAAA;AAChC,cAAc,iBAAiB,CAAA;AAG/B,cAAc,0BAA0B,CAAA;AACxC,cAAc,uBAAuB,CAAA;AACrC,cAAc,2BAA2B,CAAA;AACzC,cAAc,2BAA2B,CAAA;AACzC,cAAc,wBAAwB,CAAA;AACtC,cAAc,uBAAuB,CAAA;AACrC,cAAc,yBAAyB,CAAA;AACvC,cAAc,6BAA6B,CAAA;AAC3C,cAAc,2BAA2B,CAAA;AACzC,cAAc,2BAA2B,CAAA;AACzC,cAAc,uBAAuB,CAAA;AACrC,cAAc,kBAAkB,CAAA;AAChC,cAAc,iCAAiC,CAAA;AAC/C,cAAc,yBAAyB,CAAA;AACvC,cAAc,0BAA0B,CAAA;AACxC,cAAc,yBAAyB,CAAA;AACvC,cAAc,gCAAgC,CAAA;AAC9C,cAAc,2BAA2B,CAAA;AACzC,cAAc,mBAAmB,CAAA;AACjC,cAAc,uBAAuB,CAAA;AACrC,cAAc,yBAAyB,CAAA;AACvC,cAAc,uBAAuB,CAAA;AACrC,cAAc,uBAAuB,CAAA;AACrC,cAAc,wBAAwB,CAAA;AAGtC,cAAc,uBAAuB,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
// The public surface of @cloudgrid-io/ui.
|
|
2
2
|
//
|
|
3
3
|
// GENERATED shape, hand-committed: one `export *` per component module. Flat is
|
|
4
|
-
// safe here — the exported names across all
|
|
4
|
+
// safe here — the exported names across all 47 components collide zero times,
|
|
5
5
|
// asserted by a test so a future addition cannot break it silently.
|
|
6
6
|
//
|
|
7
7
|
// Per-module re-exports rather than a bundle, deliberately. 20 of these carry a
|
|
8
8
|
// "use client" directive, and the client boundary is a property of the MODULE.
|
|
9
9
|
// tsc emits file-per-file and preserves the directive, so a React Server
|
|
10
10
|
// Component consumer keeps exactly the boundaries the source declares. Bundling
|
|
11
|
-
// them into one file would collapse
|
|
11
|
+
// them into one file would collapse 47 modules into a single client island.
|
|
12
12
|
//
|
|
13
13
|
// The CSS is NOT imported here. It ships as separate entry points
|
|
14
14
|
// (@cloudgrid-io/ui/tokens.css and friends) so a consumer with no React — the
|
|
@@ -50,6 +50,7 @@ export * from "./blocks/entity-status.js";
|
|
|
50
50
|
export * from "./blocks/feature-cells.js";
|
|
51
51
|
export * from "./blocks/hub-index.js";
|
|
52
52
|
export * from "./blocks/logo.js";
|
|
53
|
+
export * from "./blocks/onboarding-question.js";
|
|
53
54
|
export * from "./blocks/option-card.js";
|
|
54
55
|
export * from "./blocks/page-heading.js";
|
|
55
56
|
export * from "./blocks/plug-method.js";
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,0CAA0C;AAC1C,EAAE;AACF,gFAAgF;AAChF,8EAA8E;AAC9E,oEAAoE;AACpE,EAAE;AACF,gFAAgF;AAChF,+EAA+E;AAC/E,yEAAyE;AACzE,gFAAgF;AAChF,4EAA4E;AAC5E,EAAE;AACF,kEAAkE;AAClE,8EAA8E;AAC9E,uEAAuE;AAEvE,cAAc;AACd,cAAc,mBAAmB,CAAA;AACjC,cAAc,eAAe,CAAA;AAC7B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,cAAc,CAAA;AAC5B,cAAc,kBAAkB,CAAA;AAChC,cAAc,kBAAkB,CAAA;AAChC,cAAc,oBAAoB,CAAA;AAClC,cAAc,kBAAkB,CAAA;AAChC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,uBAAuB,CAAA;AACrC,cAAc,qBAAqB,CAAA;AACnC,cAAc,eAAe,CAAA;AAC7B,cAAc,sBAAsB,CAAA;AACpC,cAAc,eAAe,CAAA;AAC7B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,mBAAmB,CAAA;AACjC,cAAc,kBAAkB,CAAA;AAChC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,eAAe,CAAA;AAC7B,cAAc,cAAc,CAAA;AAC5B,cAAc,kBAAkB,CAAA;AAChC,cAAc,iBAAiB,CAAA;AAE/B,mBAAmB;AACnB,cAAc,0BAA0B,CAAA;AACxC,cAAc,uBAAuB,CAAA;AACrC,cAAc,2BAA2B,CAAA;AACzC,cAAc,2BAA2B,CAAA;AACzC,cAAc,wBAAwB,CAAA;AACtC,cAAc,uBAAuB,CAAA;AACrC,cAAc,yBAAyB,CAAA;AACvC,cAAc,6BAA6B,CAAA;AAC3C,cAAc,2BAA2B,CAAA;AACzC,cAAc,2BAA2B,CAAA;AACzC,cAAc,uBAAuB,CAAA;AACrC,cAAc,kBAAkB,CAAA;AAChC,cAAc,yBAAyB,CAAA;AACvC,cAAc,0BAA0B,CAAA;AACxC,cAAc,yBAAyB,CAAA;AACvC,cAAc,gCAAgC,CAAA;AAC9C,cAAc,2BAA2B,CAAA;AACzC,cAAc,mBAAmB,CAAA;AACjC,cAAc,uBAAuB,CAAA;AACrC,cAAc,yBAAyB,CAAA;AACvC,cAAc,uBAAuB,CAAA;AACrC,cAAc,uBAAuB,CAAA;AACrC,cAAc,wBAAwB,CAAA;AAEtC,0EAA0E;AAC1E,cAAc,uBAAuB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,0CAA0C;AAC1C,EAAE;AACF,gFAAgF;AAChF,8EAA8E;AAC9E,oEAAoE;AACpE,EAAE;AACF,gFAAgF;AAChF,+EAA+E;AAC/E,yEAAyE;AACzE,gFAAgF;AAChF,4EAA4E;AAC5E,EAAE;AACF,kEAAkE;AAClE,8EAA8E;AAC9E,uEAAuE;AAEvE,cAAc;AACd,cAAc,mBAAmB,CAAA;AACjC,cAAc,eAAe,CAAA;AAC7B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,cAAc,CAAA;AAC5B,cAAc,kBAAkB,CAAA;AAChC,cAAc,kBAAkB,CAAA;AAChC,cAAc,oBAAoB,CAAA;AAClC,cAAc,kBAAkB,CAAA;AAChC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,uBAAuB,CAAA;AACrC,cAAc,qBAAqB,CAAA;AACnC,cAAc,eAAe,CAAA;AAC7B,cAAc,sBAAsB,CAAA;AACpC,cAAc,eAAe,CAAA;AAC7B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,mBAAmB,CAAA;AACjC,cAAc,kBAAkB,CAAA;AAChC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,eAAe,CAAA;AAC7B,cAAc,cAAc,CAAA;AAC5B,cAAc,kBAAkB,CAAA;AAChC,cAAc,iBAAiB,CAAA;AAE/B,mBAAmB;AACnB,cAAc,0BAA0B,CAAA;AACxC,cAAc,uBAAuB,CAAA;AACrC,cAAc,2BAA2B,CAAA;AACzC,cAAc,2BAA2B,CAAA;AACzC,cAAc,wBAAwB,CAAA;AACtC,cAAc,uBAAuB,CAAA;AACrC,cAAc,yBAAyB,CAAA;AACvC,cAAc,6BAA6B,CAAA;AAC3C,cAAc,2BAA2B,CAAA;AACzC,cAAc,2BAA2B,CAAA;AACzC,cAAc,uBAAuB,CAAA;AACrC,cAAc,kBAAkB,CAAA;AAChC,cAAc,iCAAiC,CAAA;AAC/C,cAAc,yBAAyB,CAAA;AACvC,cAAc,0BAA0B,CAAA;AACxC,cAAc,yBAAyB,CAAA;AACvC,cAAc,gCAAgC,CAAA;AAC9C,cAAc,2BAA2B,CAAA;AACzC,cAAc,mBAAmB,CAAA;AACjC,cAAc,uBAAuB,CAAA;AACrC,cAAc,yBAAyB,CAAA;AACvC,cAAc,uBAAuB,CAAA;AACrC,cAAc,uBAAuB,CAAA;AACrC,cAAc,wBAAwB,CAAA;AAEtC,0EAA0E;AAC1E,cAAc,uBAAuB,CAAA"}
|
package/dist/tokens/base.json
CHANGED
|
@@ -1138,5 +1138,58 @@
|
|
|
1138
1138
|
}
|
|
1139
1139
|
}
|
|
1140
1140
|
}
|
|
1141
|
+
},
|
|
1142
|
+
"indicator": {
|
|
1143
|
+
"$description": "indicator + chrome: taken from the Console so the system holds every value in\none place, 2026-08-24 (#96).\n\nPENDING A DESIGNER. These are adopted as-is, not designed. They are here so the\nConsole can stop carrying private copies and so there is a single thing to edit;\nthe values themselves are the Console's current ones and are expected to change.\nMeasurements are recorded beside each so the decision is informed rather than\ninherited.",
|
|
1144
|
+
"volt": {
|
|
1145
|
+
"$value": "#b6ff2e",
|
|
1146
|
+
"$type": "color",
|
|
1147
|
+
"$description": "The live/current INDICATOR — the dot in its halo, and the brand mark. Never\ndecorative, never a fill.\n\nMEASURED 1.21:1 on white, which is below every bar there is. It works on the\npanel (4.82:1) and on ink (13.13:1); on the page ground it reads only because\nit is paired with the ring and, in a pill, with volt-ink. Recorded rather than\nsilently corrected: darkening it would change the Console's appearance, which\nis a design decision and not a contrast fix.\n\nNote it is a SECOND lime beside --cg-secondary (#b6de68), 36 dE away. Which one\nthe brand owns is the open question here.\n\nIt is also a second LIVE. state.online (#00a05c) is the same idea in the state\nscale, and EntityStatus (#116) already paints the live dot with it. They are not\ninterchangeable at any bar — online is 3.40:1 on white, volt is 1.21:1 — so a\nsurface must not swap one for the other on the assumption that both mean\n'serving'. Which name the brand keeps for live belongs to the same open question,\nand until it is answered volt is the Console's brand mark and online is the\nentity's state.",
|
|
1148
|
+
"$extensions": {
|
|
1149
|
+
"io.cloudgrid": {
|
|
1150
|
+
"css": "--cg-volt"
|
|
1151
|
+
}
|
|
1152
|
+
}
|
|
1153
|
+
},
|
|
1154
|
+
"volt-ring": {
|
|
1155
|
+
"$value": "rgba(182, 255, 46, 0.32)",
|
|
1156
|
+
"$type": "color",
|
|
1157
|
+
"$description": "The halo behind a volt dot. Its job is to make the dot findable on a light ground, which is what carries the 1.21:1 above.",
|
|
1158
|
+
"$extensions": {
|
|
1159
|
+
"io.cloudgrid": {
|
|
1160
|
+
"css": "--cg-volt-ring"
|
|
1161
|
+
}
|
|
1162
|
+
}
|
|
1163
|
+
},
|
|
1164
|
+
"volt-ink": {
|
|
1165
|
+
"$value": "#243d00",
|
|
1166
|
+
"$type": "color",
|
|
1167
|
+
"$description": "Text and glyphs ON volt. 9.95:1 against it — the one part of the volt family that\nis comfortably legible.\n\nThis is NOT the state -ink that EntityStatus (#116) says the library lacks. That\nnote wants a foreground for the WORD on a state chip, and the arrangement it\nshipped instead — dot carries the colour, word is text-ink — already measures\n14.33:1 on online-fill, against 10.86:1 for this olive. volt-ink is tuned to volt\nand belongs to volt. Adding a state -ink is still a brand decision and still\nopen.",
|
|
1168
|
+
"$extensions": {
|
|
1169
|
+
"io.cloudgrid": {
|
|
1170
|
+
"css": "--cg-volt-ink"
|
|
1171
|
+
}
|
|
1172
|
+
}
|
|
1173
|
+
},
|
|
1174
|
+
"scrim": {
|
|
1175
|
+
"$value": "rgba(34, 34, 34, 0.4)",
|
|
1176
|
+
"$type": "color",
|
|
1177
|
+
"$description": "The wash behind a modal or overlay. Uses the BRAND ink (#222222) rather than the\nConsole's (#16181d) — a scrim sits above content and belongs to the system, not\nto one surface's ink scale.\n\nDoes NOT flip per surface, deliberately: it composites over whatever is beneath\nit, so a panel-scoped override would darken a scrim that is already dark.",
|
|
1178
|
+
"$extensions": {
|
|
1179
|
+
"io.cloudgrid": {
|
|
1180
|
+
"css": "--cg-scrim"
|
|
1181
|
+
}
|
|
1182
|
+
}
|
|
1183
|
+
},
|
|
1184
|
+
"hover": {
|
|
1185
|
+
"$value": "rgba(34, 34, 34, 0.045)",
|
|
1186
|
+
"$type": "color",
|
|
1187
|
+
"$description": "The wash under a hovered row or control. The system had no hover token; components were each inventing one.",
|
|
1188
|
+
"$extensions": {
|
|
1189
|
+
"io.cloudgrid": {
|
|
1190
|
+
"css": "--cg-hover"
|
|
1191
|
+
}
|
|
1192
|
+
}
|
|
1193
|
+
}
|
|
1141
1194
|
}
|
|
1142
1195
|
}
|
|
@@ -213,5 +213,18 @@
|
|
|
213
213
|
}
|
|
214
214
|
}
|
|
215
215
|
}
|
|
216
|
+
},
|
|
217
|
+
"indicator": {
|
|
218
|
+
"$description": "indicator + chrome: only hover flips. A dark wash is invisible on a dark ground.",
|
|
219
|
+
"hover": {
|
|
220
|
+
"$value": "rgba(255, 255, 255, 0.06)",
|
|
221
|
+
"$type": "color",
|
|
222
|
+
"$description": "Translucent white — the base wash is a dark ink and would not register on the ink ground.",
|
|
223
|
+
"$extensions": {
|
|
224
|
+
"io.cloudgrid": {
|
|
225
|
+
"css": "--cg-hover"
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
216
229
|
}
|
|
217
230
|
}
|
|
@@ -197,5 +197,18 @@
|
|
|
197
197
|
}
|
|
198
198
|
}
|
|
199
199
|
}
|
|
200
|
+
},
|
|
201
|
+
"indicator": {
|
|
202
|
+
"$description": "indicator + chrome: only hover flips. A dark wash is invisible on a dark ground.",
|
|
203
|
+
"hover": {
|
|
204
|
+
"$value": "rgba(255, 255, 255, 0.10)",
|
|
205
|
+
"$type": "color",
|
|
206
|
+
"$description": "Translucent white — the base wash is a dark ink and would not register on the panel ground.",
|
|
207
|
+
"$extensions": {
|
|
208
|
+
"io.cloudgrid": {
|
|
209
|
+
"css": "--cg-hover"
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
}
|
|
200
213
|
}
|
|
201
214
|
}
|
package/dist/tokens.css
CHANGED
|
@@ -302,6 +302,62 @@
|
|
|
302
302
|
--cg-transition-control: background-color var(--cg-duration) var(--cg-ease-out), border-color var(--cg-duration) var(--cg-ease-out), color var(--cg-duration) var(--cg-ease-out), box-shadow var(--cg-duration) var(--cg-ease-out);
|
|
303
303
|
--cg-lift-hover: translateY(-1px);
|
|
304
304
|
--cg-press-scale: 0.985;
|
|
305
|
+
|
|
306
|
+
/* ---- indicator ----
|
|
307
|
+
indicator + chrome: taken from the Console so the system holds every value in
|
|
308
|
+
one place, 2026-08-24 (#96).
|
|
309
|
+
|
|
310
|
+
PENDING A DESIGNER. These are adopted as-is, not designed. They are here so the
|
|
311
|
+
Console can stop carrying private copies and so there is a single thing to edit;
|
|
312
|
+
the values themselves are the Console's current ones and are expected to change.
|
|
313
|
+
Measurements are recorded beside each so the decision is informed rather than
|
|
314
|
+
inherited. */
|
|
315
|
+
/*
|
|
316
|
+
The live/current INDICATOR — the dot in its halo, and the brand mark. Never
|
|
317
|
+
decorative, never a fill.
|
|
318
|
+
|
|
319
|
+
MEASURED 1.21:1 on white, which is below every bar there is. It works on the
|
|
320
|
+
panel (4.82:1) and on ink (13.13:1); on the page ground it reads only because
|
|
321
|
+
it is paired with the ring and, in a pill, with volt-ink. Recorded rather than
|
|
322
|
+
silently corrected: darkening it would change the Console's appearance, which
|
|
323
|
+
is a design decision and not a contrast fix.
|
|
324
|
+
|
|
325
|
+
Note it is a SECOND lime beside --cg-secondary (#b6de68), 36 dE away. Which one
|
|
326
|
+
the brand owns is the open question here.
|
|
327
|
+
|
|
328
|
+
It is also a second LIVE. state.online (#00a05c) is the same idea in the state
|
|
329
|
+
scale, and EntityStatus (#116) already paints the live dot with it. They are not
|
|
330
|
+
interchangeable at any bar — online is 3.40:1 on white, volt is 1.21:1 — so a
|
|
331
|
+
surface must not swap one for the other on the assumption that both mean
|
|
332
|
+
'serving'. Which name the brand keeps for live belongs to the same open question,
|
|
333
|
+
and until it is answered volt is the Console's brand mark and online is the
|
|
334
|
+
entity's state. */
|
|
335
|
+
--cg-volt: #b6ff2e;
|
|
336
|
+
/*
|
|
337
|
+
The halo behind a volt dot. Its job is to make the dot findable on a light ground, which is what carries the 1.21:1 above. */
|
|
338
|
+
--cg-volt-ring: rgba(182, 255, 46, 0.32);
|
|
339
|
+
/*
|
|
340
|
+
Text and glyphs ON volt. 9.95:1 against it — the one part of the volt family that
|
|
341
|
+
is comfortably legible.
|
|
342
|
+
|
|
343
|
+
This is NOT the state -ink that EntityStatus (#116) says the library lacks. That
|
|
344
|
+
note wants a foreground for the WORD on a state chip, and the arrangement it
|
|
345
|
+
shipped instead — dot carries the colour, word is text-ink — already measures
|
|
346
|
+
14.33:1 on online-fill, against 10.86:1 for this olive. volt-ink is tuned to volt
|
|
347
|
+
and belongs to volt. Adding a state -ink is still a brand decision and still
|
|
348
|
+
open. */
|
|
349
|
+
--cg-volt-ink: #243d00;
|
|
350
|
+
/*
|
|
351
|
+
The wash behind a modal or overlay. Uses the BRAND ink (#222222) rather than the
|
|
352
|
+
Console's (#16181d) — a scrim sits above content and belongs to the system, not
|
|
353
|
+
to one surface's ink scale.
|
|
354
|
+
|
|
355
|
+
Does NOT flip per surface, deliberately: it composites over whatever is beneath
|
|
356
|
+
it, so a panel-scoped override would darken a scrim that is already dark. */
|
|
357
|
+
--cg-scrim: rgba(34, 34, 34, 0.4);
|
|
358
|
+
/*
|
|
359
|
+
The wash under a hovered row or control. The system had no hover token; components were each inventing one. */
|
|
360
|
+
--cg-hover: rgba(34, 34, 34, 0.045);
|
|
305
361
|
}
|
|
306
362
|
|
|
307
363
|
[data-cg-surface='panel'] {
|
|
@@ -357,6 +413,12 @@
|
|
|
357
413
|
/*
|
|
358
414
|
Translucent white rather than a tint; the panel foreground measures 3.35:1 on it. */
|
|
359
415
|
--cg-danger-fill: rgba(255, 255, 255, 0.16);
|
|
416
|
+
|
|
417
|
+
/* ---- indicator ----
|
|
418
|
+
indicator + chrome: only hover flips. A dark wash is invisible on a dark ground. */
|
|
419
|
+
/*
|
|
420
|
+
Translucent white — the base wash is a dark ink and would not register on the panel ground. */
|
|
421
|
+
--cg-hover: rgba(255, 255, 255, 0.10);
|
|
360
422
|
}
|
|
361
423
|
|
|
362
424
|
[data-cg-surface='ink'] {
|
|
@@ -409,4 +471,10 @@
|
|
|
409
471
|
--cg-pending-fill: var(--cg-expired-fill);
|
|
410
472
|
/* Translucent white; the ink foreground measures 5.45:1 on it. */
|
|
411
473
|
--cg-danger-fill: rgba(255, 255, 255, 0.08);
|
|
474
|
+
|
|
475
|
+
/* ---- indicator ----
|
|
476
|
+
indicator + chrome: only hover flips. A dark wash is invisible on a dark ground. */
|
|
477
|
+
/*
|
|
478
|
+
Translucent white — the base wash is a dark ink and would not register on the ink ground. */
|
|
479
|
+
--cg-hover: rgba(255, 255, 255, 0.06);
|
|
412
480
|
}
|
package/dist/tokens.json
CHANGED
|
@@ -123,7 +123,12 @@
|
|
|
123
123
|
"--cg-ease-in-out": "cubic-bezier(0.4, 0, 0.2, 1)",
|
|
124
124
|
"--cg-transition-control": "background-color var(--cg-duration) var(--cg-ease-out), border-color var(--cg-duration) var(--cg-ease-out), color var(--cg-duration) var(--cg-ease-out), box-shadow var(--cg-duration) var(--cg-ease-out)",
|
|
125
125
|
"--cg-lift-hover": "translateY(-1px)",
|
|
126
|
-
"--cg-press-scale": "0.985"
|
|
126
|
+
"--cg-press-scale": "0.985",
|
|
127
|
+
"--cg-volt": "#b6ff2e",
|
|
128
|
+
"--cg-volt-ring": "rgba(182, 255, 46, 0.32)",
|
|
129
|
+
"--cg-volt-ink": "#243d00",
|
|
130
|
+
"--cg-scrim": "rgba(34, 34, 34, 0.4)",
|
|
131
|
+
"--cg-hover": "rgba(34, 34, 34, 0.045)"
|
|
127
132
|
},
|
|
128
133
|
"panel": {
|
|
129
134
|
"--cg-text-primary": "#ffffff",
|
|
@@ -145,7 +150,8 @@
|
|
|
145
150
|
"--cg-online-fill": "rgba(255, 255, 255, 0.16)",
|
|
146
151
|
"--cg-expired-fill": "rgba(255, 255, 255, 0.16)",
|
|
147
152
|
"--cg-pending-fill": "var(--cg-expired-fill)",
|
|
148
|
-
"--cg-danger-fill": "rgba(255, 255, 255, 0.16)"
|
|
153
|
+
"--cg-danger-fill": "rgba(255, 255, 255, 0.16)",
|
|
154
|
+
"--cg-hover": "rgba(255, 255, 255, 0.10)"
|
|
149
155
|
},
|
|
150
156
|
"ink": {
|
|
151
157
|
"--cg-text-primary": "#ffffff",
|
|
@@ -169,7 +175,8 @@
|
|
|
169
175
|
"--cg-online-fill": "rgba(255, 255, 255, 0.08)",
|
|
170
176
|
"--cg-expired-fill": "rgba(255, 255, 255, 0.08)",
|
|
171
177
|
"--cg-pending-fill": "var(--cg-expired-fill)",
|
|
172
|
-
"--cg-danger-fill": "rgba(255, 255, 255, 0.08)"
|
|
178
|
+
"--cg-danger-fill": "rgba(255, 255, 255, 0.08)",
|
|
179
|
+
"--cg-hover": "rgba(255, 255, 255, 0.06)"
|
|
173
180
|
}
|
|
174
181
|
}
|
|
175
182
|
}
|
package/package.json
CHANGED