@manakind/manuia-ui 0.3.0 → 0.4.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 CHANGED
@@ -15,8 +15,10 @@ npm install @manakind/manuia-ui @manakind/manuia-tokens react react-dom
15
15
  ```
16
16
 
17
17
  `react` and `react-dom` (`^19`) are peer dependencies. `@manakind/ui-core` and
18
- `@manakind/manuia-tokens` are pulled in as exact-pinned dependencies and ship in
19
- lockstep — upgrade all `@manakind/*` packages together.
18
+ `@manakind/manuia-tokens` are pulled in as exact-pinned dependencies. Each
19
+ package carries its own version: when you upgrade `@manakind/manuia-ui`,
20
+ install the `@manakind/manuia-tokens` version it pins
21
+ (`npm view @manakind/manuia-ui dependencies`).
20
22
 
21
23
  ## Usage
22
24
 
@@ -0,0 +1,154 @@
1
+ @layer components {
2
+ .mui-category-card {
3
+ display: flex;
4
+ flex-direction: column;
5
+ /*
6
+ * The category's own colour, as a wash over the card surface. Only set
7
+ * when the product passed a real colour, so the fallback is the plain
8
+ * card; decoration, never the signal (see `color` on the props).
9
+ *
10
+ * 8% at the top, not more: the rating bands are measured against the bare
11
+ * card, and 8% of any colour, black included, leaves every band above
12
+ * 4.5:1 (10% took two of them to 4.4:1).
13
+ */
14
+ background-image: linear-gradient(
15
+ color-mix(in srgb, var(--mui-category-color, transparent) 8%, transparent),
16
+ color-mix(in srgb, var(--mui-category-color, transparent) 4%, transparent)
17
+ );
18
+
19
+ /* Tighter than the card's own gap, through the key ui-core's header reads. */
20
+ & .mui-category-card__header {
21
+ --ds-card-gap: var(--semantic-space-gap);
22
+ }
23
+
24
+ & .mui-category-card__meta {
25
+ display: flex;
26
+ align-items: flex-start;
27
+ justify-content: space-between;
28
+ gap: var(--semantic-space-gap);
29
+ }
30
+
31
+ & .mui-category-card__gap {
32
+ display: flex;
33
+ flex-direction: column;
34
+ align-items: flex-end;
35
+ margin: 0;
36
+ line-height: var(--primitives-line-height-tight);
37
+ }
38
+
39
+ & .mui-category-card__gap-value {
40
+ font-size: var(--component-category-card-gap-font-size);
41
+ font-weight: var(--primitives-font-weight-bold);
42
+ }
43
+
44
+ & .mui-category-card__gap-label {
45
+ color: var(--semantic-color-text-muted);
46
+ font-size: var(--primitives-font-size-xs);
47
+ font-weight: var(--primitives-font-weight-medium);
48
+ }
49
+
50
+ & .mui-category-card__title {
51
+ /* Two lines at most, then an ellipsis: a long name must not push the ratings off the card. */
52
+ display: -webkit-box;
53
+ -webkit-box-orient: vertical;
54
+ -webkit-line-clamp: 2;
55
+ overflow: hidden;
56
+ }
57
+
58
+ & .mui-category-card__content {
59
+ flex: 1;
60
+ justify-content: space-between;
61
+ }
62
+
63
+ & .mui-category-card__vision {
64
+ margin: 0;
65
+ color: var(--semantic-color-text-muted);
66
+ font-size: var(--primitives-font-size-sm);
67
+ font-style: italic;
68
+ line-height: var(--primitives-line-height-relaxed);
69
+ }
70
+
71
+ & .mui-category-card__roles {
72
+ display: flex;
73
+ flex-wrap: wrap;
74
+ gap: var(--semantic-space-gap-tight);
75
+ margin: 0;
76
+ padding: 0;
77
+ list-style: none;
78
+ }
79
+
80
+ & .mui-category-card__ratings {
81
+ display: flex;
82
+ flex-direction: column;
83
+ gap: var(--semantic-space-gap);
84
+ padding-block-start: var(--semantic-space-gap);
85
+ border-block-start: 1px solid var(--semantic-color-border-subtle);
86
+ }
87
+
88
+ /*
89
+ * Each bar is recoloured through the contract key `ui-core`'s Progress
90
+ * reads, re-declared on this class: current in the accent, ideal in the
91
+ * strong primary, the colour the goal state wears everywhere else.
92
+ */
93
+ & .mui-category-card__bar--current {
94
+ --ds-progress-indicator-bg: var(--component-category-card-bar-current);
95
+ }
96
+
97
+ & .mui-category-card__bar--ideal {
98
+ --ds-progress-indicator-bg: var(--component-category-card-bar-ideal);
99
+ }
100
+
101
+ /* Mirrors the product's small-caps labels, as GoalCard's milestone label does. */
102
+ & .mui-category-card__rating-label {
103
+ color: var(--semantic-color-text-muted);
104
+ font-size: var(--primitives-font-size-xs);
105
+ font-weight: var(--primitives-font-weight-semibold);
106
+ letter-spacing: 0.15em;
107
+ line-height: var(--primitives-line-height-tight);
108
+ text-transform: uppercase;
109
+ }
110
+
111
+ & .mui-category-card__rating-value {
112
+ color: var(--semantic-color-text-default);
113
+ font-size: var(--primitives-font-size-xl);
114
+ font-weight: var(--primitives-font-weight-bold);
115
+ }
116
+
117
+ & .mui-category-card__rating-max {
118
+ color: var(--semantic-color-text-muted);
119
+ font-size: var(--primitives-font-size-sm);
120
+ font-weight: var(--primitives-font-weight-regular);
121
+ }
122
+
123
+ /*
124
+ * The bands. The product's thresholds decide which applies; the card
125
+ * paints it. Every value clears 4.5:1 on the bare card in both themes
126
+ * (contrast-pairs.json) and stays above it under the 8% wash, which the
127
+ * product's own ramp did not: it ran from 2.14:1 to 4.05:1.
128
+ */
129
+ & .mui-category-card__gap--excellent,
130
+ & .mui-category-card__rating-value--excellent {
131
+ color: var(--component-category-card-rating-excellent);
132
+ }
133
+
134
+ & .mui-category-card__gap--good,
135
+ & .mui-category-card__rating-value--good {
136
+ color: var(--component-category-card-rating-good);
137
+ }
138
+
139
+ & .mui-category-card__gap--moderate,
140
+ & .mui-category-card__rating-value--moderate {
141
+ color: var(--component-category-card-rating-moderate);
142
+ }
143
+
144
+ & .mui-category-card__gap--poor,
145
+ & .mui-category-card__rating-value--poor {
146
+ color: var(--component-category-card-rating-poor);
147
+ }
148
+
149
+ & .mui-category-card__gap--critical,
150
+ & .mui-category-card__rating-value--critical {
151
+ color: var(--component-category-card-rating-critical);
152
+ }
153
+ }
154
+ }
@@ -0,0 +1,2 @@
1
+ /* AUTOGENERATED: types for the stylesheet beside it. */
2
+ export {};
@@ -0,0 +1,83 @@
1
+ import './category-card.css';
2
+ /** Manuia's two kinds of life category. */
3
+ export type CategoryType = 'Personal' | 'Professional';
4
+ /**
5
+ * How a rating, or the gap between two ratings, reads. The product decides
6
+ * the thresholds; the card only paints the band. `excellent` is the goal
7
+ * state and `critical` the furthest from it.
8
+ */
9
+ export type CategoryRatingBand = 'excellent' | 'good' | 'moderate' | 'poor' | 'critical';
10
+ export interface CategoryRole {
11
+ id: string;
12
+ name: string;
13
+ }
14
+ export interface CategoryCardProps {
15
+ /** Category name. Rendered as the card's heading. */
16
+ name: string;
17
+ /** Personal or professional. Shown as a badge; the two get different tints. */
18
+ type: CategoryType;
19
+ /**
20
+ * Resolved CSS colour for this category, applied as a faint wash over the
21
+ * card. Category colours are data, not design tokens: each category row
22
+ * stores a colour the user picked. Validated before it reaches the style
23
+ * attribute; a value that is not a recognisable CSS colour is ignored and
24
+ * the card keeps its plain surface. The wash is decoration: nothing on the
25
+ * card relies on it. It is capped at 8%, which keeps every rating band
26
+ * above 4.5:1 over any colour at all.
27
+ */
28
+ color?: string;
29
+ /** The vision statement, shown as an excerpt. */
30
+ vision?: string;
31
+ /** Where the category stands today, on the product's 0–10 scale. A value off the scale is clamped. */
32
+ currentRating: number;
33
+ /** Where the user wants it to be, on the same scale. A value off the scale is clamped. */
34
+ idealRating: number;
35
+ /** Band the current rating falls in. Colours its number. */
36
+ currentBand?: CategoryRatingBand;
37
+ /** Band the ideal rating falls in. Colours its number. */
38
+ idealBand?: CategoryRatingBand;
39
+ /** Band the gap between the two falls in. Colours the gap figure. */
40
+ gapBand?: CategoryRatingBand;
41
+ /** Roles the user plays in this category. */
42
+ roles?: CategoryRole[];
43
+ /** How many roles to show before collapsing into `+N more`. A non-finite value shows all. */
44
+ maxVisibleRoles?: number;
45
+ /** Characters (graphemes) of the vision to show before an ellipsis. */
46
+ visionLength?: number;
47
+ /**
48
+ * Heading level for the name. Defaults to `h3`: a grid of these usually
49
+ * sits under a section heading.
50
+ */
51
+ titleAs?: 'h2' | 'h3' | 'h4';
52
+ /** Extra class names. */
53
+ className?: string;
54
+ }
55
+ /**
56
+ * A Manuia life category, rendered as a card.
57
+ *
58
+ * Composes `ui-core`'s `Card`, `Badge` and `Progress` with Manuia's own
59
+ * concepts — category types, the current and ideal rating, the gap, roles —
60
+ * which is why it lives in the product package rather than in `ui-core`.
61
+ *
62
+ * The thresholds that turn a rating into a band are product rules, so the
63
+ * caller passes the bands in; the card never decides that a 7 is good.
64
+ *
65
+ * The card is styled as interactive but is **not** operable on its own: wrap
66
+ * it in a link so it is reachable by keyboard, as `Card`'s `interactive`
67
+ * prop documents.
68
+ *
69
+ * ```tsx
70
+ * <CategoryCard
71
+ * name="Health"
72
+ * type="Personal"
73
+ * color="#8fa878"
74
+ * currentRating={6}
75
+ * idealRating={9}
76
+ * currentBand="good"
77
+ * idealBand="excellent"
78
+ * gapBand="moderate"
79
+ * />
80
+ * ```
81
+ */
82
+ export declare function CategoryCard({ name, type, color, vision, currentRating, idealRating, currentBand, idealBand, gapBand, roles, maxVisibleRoles, visionLength, titleAs, className, }: CategoryCardProps): import("react/jsx-runtime").JSX.Element;
83
+ //# sourceMappingURL=category-card.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"category-card.d.ts","sourceRoot":"","sources":["../../src/category-card/category-card.tsx"],"names":[],"mappings":"AAGA,OAAO,qBAAqB,CAAC;AAE7B,2CAA2C;AAC3C,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,cAAc,CAAC;AAEvD;;;;GAIG;AACH,MAAM,MAAM,kBAAkB,GAAG,WAAW,GAAG,MAAM,GAAG,UAAU,GAAG,MAAM,GAAG,UAAU,CAAC;AAEzF,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,iBAAiB;IAChC,qDAAqD;IACrD,IAAI,EAAE,MAAM,CAAC;IACb,+EAA+E;IAC/E,IAAI,EAAE,YAAY,CAAC;IACnB;;;;;;;;OAQG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iDAAiD;IACjD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,sGAAsG;IACtG,aAAa,EAAE,MAAM,CAAC;IACtB,0FAA0F;IAC1F,WAAW,EAAE,MAAM,CAAC;IACpB,4DAA4D;IAC5D,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC,0DAA0D;IAC1D,SAAS,CAAC,EAAE,kBAAkB,CAAC;IAC/B,qEAAqE;IACrE,OAAO,CAAC,EAAE,kBAAkB,CAAC;IAC7B,6CAA6C;IAC7C,KAAK,CAAC,EAAE,YAAY,EAAE,CAAC;IACvB,6FAA6F;IAC7F,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,uEAAuE;IACvE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,OAAO,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC7B,yBAAyB;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA4CD;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,YAAY,CAAC,EAC3B,IAAI,EACJ,IAAI,EACJ,KAAK,EACL,MAAM,EACN,aAAa,EACb,WAAW,EACX,WAAW,EACX,SAAS,EACT,OAAO,EACP,KAAU,EACV,eAAmB,EACnB,YAAkB,EAClB,OAAc,EACd,SAAS,GACV,EAAE,iBAAiB,2CA4FnB"}
@@ -0,0 +1,79 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Badge, Card, CardContent, CardHeader, CardTitle, cx, Progress } from '@manakind/ui-core';
3
+ import { safeColor } from '../css-color';
4
+ import './category-card.css';
5
+ const TYPE_VARIANT = {
6
+ Personal: 'success',
7
+ Professional: 'info',
8
+ };
9
+ /** The scale every rating is on. */
10
+ const RATING_MAX = 10;
11
+ /*
12
+ * A rating outside the scale is data the card cannot draw: Ark's Progress
13
+ * throws on a value past `max` or below zero. Clamping here keeps the bar and
14
+ * the gap honest about the scale rather than about the input.
15
+ */
16
+ function clampRating(rating) {
17
+ if (!Number.isFinite(rating))
18
+ return 0;
19
+ return Math.min(Math.max(rating, 0), RATING_MAX);
20
+ }
21
+ /*
22
+ * Cut by grapheme, not by UTF-16 unit, so a flag or a skin-toned emoji at the
23
+ * boundary is kept whole rather than split into a replacement glyph.
24
+ */
25
+ const graphemes = new Intl.Segmenter(undefined, { granularity: 'grapheme' });
26
+ function excerpt(text, length) {
27
+ const limit = Math.max(Math.trunc(length), 0);
28
+ const units = Array.from(graphemes.segment(text), (segment) => segment.segment);
29
+ if (units.length <= limit)
30
+ return text;
31
+ return `${units.slice(0, limit).join('').trimEnd()}…`;
32
+ }
33
+ /*
34
+ * Same normalisation as GoalCategories' `maxVisible`: truncated toward zero,
35
+ * clamped at zero, and a non-finite value means no limit rather than no roles.
36
+ */
37
+ function visibleLimit(limit) {
38
+ return Number.isFinite(limit) ? Math.max(Math.trunc(limit), 0) : undefined;
39
+ }
40
+ const BAND_CLASS = (part, band) => band && `mui-category-card__${part}--${band}`;
41
+ /**
42
+ * A Manuia life category, rendered as a card.
43
+ *
44
+ * Composes `ui-core`'s `Card`, `Badge` and `Progress` with Manuia's own
45
+ * concepts — category types, the current and ideal rating, the gap, roles —
46
+ * which is why it lives in the product package rather than in `ui-core`.
47
+ *
48
+ * The thresholds that turn a rating into a band are product rules, so the
49
+ * caller passes the bands in; the card never decides that a 7 is good.
50
+ *
51
+ * The card is styled as interactive but is **not** operable on its own: wrap
52
+ * it in a link so it is reachable by keyboard, as `Card`'s `interactive`
53
+ * prop documents.
54
+ *
55
+ * ```tsx
56
+ * <CategoryCard
57
+ * name="Health"
58
+ * type="Personal"
59
+ * color="#8fa878"
60
+ * currentRating={6}
61
+ * idealRating={9}
62
+ * currentBand="good"
63
+ * idealBand="excellent"
64
+ * gapBand="moderate"
65
+ * />
66
+ * ```
67
+ */
68
+ export function CategoryCard({ name, type, color, vision, currentRating, idealRating, currentBand, idealBand, gapBand, roles = [], maxVisibleRoles = 3, visionLength = 100, titleAs = 'h3', className, }) {
69
+ const wash = safeColor(color);
70
+ const current = clampRating(currentRating);
71
+ const ideal = clampRating(idealRating);
72
+ const gap = ideal - current;
73
+ const limit = visibleLimit(maxVisibleRoles);
74
+ const visibleRoles = limit === undefined ? roles : roles.slice(0, limit);
75
+ const remainingRoles = roles.length - visibleRoles.length;
76
+ const visionText = vision?.trim();
77
+ return (_jsxs(Card, { interactive: true, className: cx('mui-category-card', className), style: wash ? { '--mui-category-color': wash } : undefined, children: [_jsxs(CardHeader, { className: "mui-category-card__header", children: [_jsxs("div", { className: "mui-category-card__meta", children: [_jsx(Badge, { variant: TYPE_VARIANT[type], appearance: "plain", children: type }), _jsxs("p", { className: cx('mui-category-card__gap', BAND_CLASS('gap', gapBand)), children: [_jsx("span", { className: "mui-category-card__gap-value", children: gap }), _jsx("span", { className: "mui-category-card__gap-label", children: "gap" })] })] }), _jsx(CardTitle, { as: titleAs, className: "mui-category-card__title", title: name, children: name })] }), _jsxs(CardContent, { className: "mui-category-card__content", children: [visionText && (_jsx("p", { className: "mui-category-card__vision", children: excerpt(visionText, visionLength) })), roles.length > 0 && (_jsxs("ul", { className: "mui-category-card__roles", "aria-label": "Roles", children: [visibleRoles.map((role) => (_jsx("li", { children: _jsx(Badge, { variant: "outline", children: role.name }) }, role.id))), remainingRoles > 0 && (_jsx("li", { children: _jsxs(Badge, { variant: "muted", children: ["+", remainingRoles, " more"] }) }))] })), _jsxs("div", { className: "mui-category-card__ratings", children: [_jsx(Progress, { size: "sm", className: "mui-category-card__bar mui-category-card__bar--current", value: current, max: RATING_MAX, label: _jsx("span", { className: "mui-category-card__rating-label", children: "Current" }), valueText: _jsxs("span", { className: cx('mui-category-card__rating-value', BAND_CLASS('rating-value', currentBand)), children: [current, _jsxs("span", { className: "mui-category-card__rating-max", children: ["/", RATING_MAX] })] }) }), _jsx(Progress, { size: "sm", className: "mui-category-card__bar mui-category-card__bar--ideal", value: ideal, max: RATING_MAX, label: _jsx("span", { className: "mui-category-card__rating-label", children: "Ideal" }), valueText: _jsxs("span", { className: cx('mui-category-card__rating-value', BAND_CLASS('rating-value', idealBand)), children: [ideal, _jsxs("span", { className: "mui-category-card__rating-max", children: ["/", RATING_MAX] })] }) })] })] })] }));
78
+ }
79
+ //# sourceMappingURL=category-card.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"category-card.js","sourceRoot":"","sources":["../../src/category-card/category-card.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export type { CategoryCardProps, CategoryRatingBand, CategoryRole, CategoryType, } from './category-card';
2
+ export { CategoryCard } from './category-card';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/category-card/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,iBAAiB,EACjB,kBAAkB,EAClB,YAAY,EACZ,YAAY,GACb,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { CategoryCard } from './category-card';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/category-card/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** The colour if it is real CSS colour syntax, otherwise `undefined`. */
2
+ export declare function safeColor(color: string | undefined): string | undefined;
3
+ //# sourceMappingURL=css-color.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"css-color.d.ts","sourceRoot":"","sources":["../src/css-color.ts"],"names":[],"mappings":"AAgDA,yEAAyE;AACzE,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAKvE"}
@@ -0,0 +1,54 @@
1
+ /*
2
+ * A colour that arrives from outside the token pipeline is validated before
3
+ * it reaches a style attribute. Two reasons, and the second is the one that
4
+ * bites in practice.
5
+ *
6
+ * **Injection, on the server.** React escapes HTML, not CSS. For a *custom*
7
+ * property `react-dom/server` serialises the string into the markup with only
8
+ * the five HTML entities replaced — the semicolon is not among them — so
9
+ * `red;position:fixed;inset:0` closes the declaration and the browser parses
10
+ * the tail as further rules. Enough to cover the page or hide a control.
11
+ * (React's client path goes through `style.setProperty()`, and CSSOM rejects
12
+ * a value containing `;`, so this is specifically an SSR exposure.)
13
+ *
14
+ * **Invisible marks, everywhere.** A value that is not a colour at all is the
15
+ * likelier input — a product mapping its own palette names through, say. Once
16
+ * it is *set*, a `var(--mui-…, fallback)` in the CSS no longer applies, and
17
+ * the property it feeds is invalid at computed-value time: the mark resolves
18
+ * to transparent rather than falling back. So the guard admits only real
19
+ * colour syntax; anything else is left unset, which is what makes the
20
+ * documented fallback actually happen.
21
+ */
22
+ const CSS_COLOR_FUNCTION = /^(?:rgb|hsl|hwb|lab|lch|oklab|oklch|color)a?\([^;(){}]*\)$/i;
23
+ const CSS_HEX = /^#(?:[0-9a-f]{3}|[0-9a-f]{4}|[0-9a-f]{6}|[0-9a-f]{8})$/i;
24
+ // The CSS named colours. A bare word outside this set is rejected rather than
25
+ // passed through, because an unrecognised keyword is what produces the
26
+ // invalid-colour case above.
27
+ const CSS_NAMED_COLORS = new Set(`aliceblue antiquewhite aqua aquamarine azure beige bisque black blanchedalmond blue
28
+ blueviolet brown burlywood cadetblue chartreuse chocolate coral cornflowerblue cornsilk
29
+ crimson cyan darkblue darkcyan darkgoldenrod darkgray darkgreen darkgrey darkkhaki
30
+ darkmagenta darkolivegreen darkorange darkorchid darkred darksalmon darkseagreen
31
+ darkslateblue darkslategray darkslategrey darkturquoise darkviolet deeppink deepskyblue
32
+ dimgray dimgrey dodgerblue firebrick floralwhite forestgreen fuchsia gainsboro ghostwhite
33
+ gold goldenrod gray green greenyellow grey honeydew hotpink indianred indigo ivory khaki
34
+ lavender lavenderblush lawngreen lemonchiffon lightblue lightcoral lightcyan
35
+ lightgoldenrodyellow lightgray lightgreen lightgrey lightpink lightsalmon lightseagreen
36
+ lightskyblue lightslategray lightslategrey lightsteelblue lightyellow lime limegreen linen
37
+ magenta maroon mediumaquamarine mediumblue mediumorchid mediumpurple mediumseagreen
38
+ mediumslateblue mediumspringgreen mediumturquoise mediumvioletred midnightblue mintcream
39
+ mistyrose moccasin navajowhite navy oldlace olive olivedrab orange orangered orchid
40
+ palegoldenrod palegreen paleturquoise palevioletred papayawhip peachpuff peru pink plum
41
+ powderblue purple rebeccapurple red rosybrown royalblue saddlebrown salmon sandybrown
42
+ seagreen seashell sienna silver skyblue slateblue slategray slategrey snow springgreen
43
+ steelblue tan teal thistle tomato transparent turquoise violet wheat white whitesmoke
44
+ yellow yellowgreen`.split(/\s+/));
45
+ /** The colour if it is real CSS colour syntax, otherwise `undefined`. */
46
+ export function safeColor(color) {
47
+ const trimmed = color?.trim();
48
+ if (!trimmed)
49
+ return undefined;
50
+ if (CSS_HEX.test(trimmed) || CSS_COLOR_FUNCTION.test(trimmed))
51
+ return trimmed;
52
+ return CSS_NAMED_COLORS.has(trimmed.toLowerCase()) ? trimmed : undefined;
53
+ }
54
+ //# sourceMappingURL=css-color.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"css-color.js","sourceRoot":"","sources":["../src/css-color.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,kBAAkB,GAAG,6DAA6D,CAAC;AACzF,MAAM,OAAO,GAAG,yDAAyD,CAAC;AAE1E,8EAA8E;AAC9E,uEAAuE;AACvE,6BAA6B;AAC7B,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAC9B;;;;;;;;;;;;;;;;;sBAiBoB,CAAC,KAAK,CAAC,KAAK,CAAC,CAClC,CAAC;AAEF,yEAAyE;AACzE,MAAM,UAAU,SAAS,CAAC,KAAyB;IACjD,MAAM,OAAO,GAAG,KAAK,EAAE,IAAI,EAAE,CAAC;IAC9B,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAC/B,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,OAAO,CAAC;IAC9E,OAAO,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;AAC3E,CAAC"}
@@ -13,8 +13,8 @@ export interface GoalCategory {
13
13
  * rather than an inline `background-color` so the CSS keeps ownership of
14
14
  * how the colour is used.
15
15
  *
16
- * Validated before it reaches the style attribute — see `safeColor` and the
17
- * comment above it. A value that is not a recognisable CSS colour is ignored.
16
+ * Validated before it reaches the style attribute — see `safeColor` in
17
+ * `css-color.ts`. A value that is not a recognisable CSS colour is ignored.
18
18
  *
19
19
  * When omitted or rejected the dot falls back to the product's primary
20
20
  * action colour.
@@ -1 +1 @@
1
- {"version":3,"file":"goal-categories.d.ts","sourceRoot":"","sources":["../../src/goal-categories/goal-categories.tsx"],"names":[],"mappings":"AAEA,OAAO,uBAAuB,CAAC;AA+D/B,MAAM,WAAW,YAAY;IAC3B,yBAAyB;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,0EAA0E;IAC1E,IAAI,EAAE,MAAM,CAAC;IACb;;;;;;;;;;;;;;OAcG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,mBAAmB;IAClC,sDAAsD;IACtD,UAAU,EAAE,YAAY,EAAE,CAAC;IAC3B;;;;;OAKG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yBAAyB;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,cAAc,CAAC,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,mBAAmB,kDA0CxF"}
1
+ {"version":3,"file":"goal-categories.d.ts","sourceRoot":"","sources":["../../src/goal-categories/goal-categories.tsx"],"names":[],"mappings":"AAGA,OAAO,uBAAuB,CAAC;AAE/B,MAAM,WAAW,YAAY;IAC3B,yBAAyB;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,0EAA0E;IAC1E,IAAI,EAAE,MAAM,CAAC;IACb;;;;;;;;;;;;;;OAcG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,mBAAmB;IAClC,sDAAsD;IACtD,UAAU,EAAE,YAAY,EAAE,CAAC;IAC3B;;;;;OAKG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yBAAyB;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,cAAc,CAAC,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,mBAAmB,kDA0CxF"}
@@ -1,64 +1,7 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { cx } from '@manakind/ui-core';
3
+ import { safeColor } from '../css-color';
3
4
  import './goal-categories.css';
4
- /*
5
- * The colour arrives from outside the token pipeline, so this component
6
- * validates it instead of trusting its caller.
7
- *
8
- * Two separate reasons, and the second is the one that bites in practice.
9
- *
10
- * **Injection, on the server.** React escapes HTML, not CSS. For a *custom*
11
- * property `react-dom/server` serialises the string into the markup with only
12
- * the five HTML entities replaced — the semicolon is not among them — so
13
- * `red;position:fixed;inset:0` closes the declaration and the browser parses
14
- * the tail as further rules. Enough to cover the page or hide a control.
15
- * (React's client path goes through `style.setProperty()`, and CSSOM rejects
16
- * a value containing `;`, so this is specifically an SSR exposure.)
17
- *
18
- * **Invisible dots, everywhere.** A value that is not a colour at all is the
19
- * likelier input — a product mapping its own palette names through, say. Once
20
- * it is *set*, the `var(--mui-goal-category, …)` fallback in the CSS no longer
21
- * applies, and the `background-color` it feeds is invalid at computed-value
22
- * time: the dot resolves to transparent rather than falling back. So the guard
23
- * admits only real colour syntax; anything else is left unset, which is what
24
- * makes the documented fallback actually happen.
25
- *
26
- * This outlived the pills-to-dots change. The mechanism moved — it was
27
- * `color-mix()` going invalid, now it is `background-color` — but "a bad value
28
- * silently paints nothing" is a property of the custom-property fallback, not
29
- * of whatever consumed it.
30
- */
31
- const CSS_COLOR_FUNCTION = /^(?:rgb|hsl|hwb|lab|lch|oklab|oklch|color)a?\([^;(){}]*\)$/i;
32
- const CSS_HEX = /^#(?:[0-9a-f]{3}|[0-9a-f]{4}|[0-9a-f]{6}|[0-9a-f]{8})$/i;
33
- // The CSS named colours. A bare word outside this set is rejected rather than
34
- // passed through, because an unrecognised keyword is what produces the
35
- // invalid-colour case above.
36
- const CSS_NAMED_COLORS = new Set(`aliceblue antiquewhite aqua aquamarine azure beige bisque black blanchedalmond blue
37
- blueviolet brown burlywood cadetblue chartreuse chocolate coral cornflowerblue cornsilk
38
- crimson cyan darkblue darkcyan darkgoldenrod darkgray darkgreen darkgrey darkkhaki
39
- darkmagenta darkolivegreen darkorange darkorchid darkred darksalmon darkseagreen
40
- darkslateblue darkslategray darkslategrey darkturquoise darkviolet deeppink deepskyblue
41
- dimgray dimgrey dodgerblue firebrick floralwhite forestgreen fuchsia gainsboro ghostwhite
42
- gold goldenrod gray green greenyellow grey honeydew hotpink indianred indigo ivory khaki
43
- lavender lavenderblush lawngreen lemonchiffon lightblue lightcoral lightcyan
44
- lightgoldenrodyellow lightgray lightgreen lightgrey lightpink lightsalmon lightseagreen
45
- lightskyblue lightslategray lightslategrey lightsteelblue lightyellow lime limegreen linen
46
- magenta maroon mediumaquamarine mediumblue mediumorchid mediumpurple mediumseagreen
47
- mediumslateblue mediumspringgreen mediumturquoise mediumvioletred midnightblue mintcream
48
- mistyrose moccasin navajowhite navy oldlace olive olivedrab orange orangered orchid
49
- palegoldenrod palegreen paleturquoise palevioletred papayawhip peachpuff peru pink plum
50
- powderblue purple rebeccapurple red rosybrown royalblue saddlebrown salmon sandybrown
51
- seagreen seashell sienna silver skyblue slateblue slategray slategrey snow springgreen
52
- steelblue tan teal thistle tomato transparent turquoise violet wheat white whitesmoke
53
- yellow yellowgreen`.split(/\s+/));
54
- function safeColor(color) {
55
- const trimmed = color?.trim();
56
- if (!trimmed)
57
- return undefined;
58
- if (CSS_HEX.test(trimmed) || CSS_COLOR_FUNCTION.test(trimmed))
59
- return trimmed;
60
- return CSS_NAMED_COLORS.has(trimmed.toLowerCase()) ? trimmed : undefined;
61
- }
62
5
  /**
63
6
  * The categories a Manuia goal belongs to, as dotted text.
64
7
  *
@@ -1 +1 @@
1
- {"version":3,"file":"goal-categories.js","sourceRoot":"","sources":["../../src/goal-categories/goal-categories.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,mBAAmB,CAAC;AAEvC,OAAO,uBAAuB,CAAC;AAE/B;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,kBAAkB,GAAG,6DAA6D,CAAC;AACzF,MAAM,OAAO,GAAG,yDAAyD,CAAC;AAE1E,8EAA8E;AAC9E,uEAAuE;AACvE,6BAA6B;AAC7B,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAC9B;;;;;;;;;;;;;;;;;sBAiBoB,CAAC,KAAK,CAAC,KAAK,CAAC,CAClC,CAAC;AAEF,SAAS,SAAS,CAAC,KAAyB;IAC1C,MAAM,OAAO,GAAG,KAAK,EAAE,IAAI,EAAE,CAAC;IAC9B,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAC/B,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,OAAO,CAAC;IAC9E,OAAO,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;AAC3E,CAAC;AAuCD;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,cAAc,CAAC,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAuB;IACvF,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEzC,uEAAuE;IACvE,4EAA4E;IAC5E,sEAAsE;IACtE,yEAAyE;IACzE,6EAA6E;IAC7E,wEAAwE;IACxE,sEAAsE;IACtE,wEAAwE;IACxE,4EAA4E;IAC5E,4EAA4E;IAC5E,OAAO;IACP,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC;QACvC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,UAAoB,CAAC,EAAE,CAAC,CAAC;QAC/C,CAAC,CAAC,SAAS,CAAC;IACd,MAAM,OAAO,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAC9E,MAAM,SAAS,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC;IAEnF,OAAO,CACL,cAAI,SAAS,EAAE,EAAE,CAAC,qBAAqB,EAAE,SAAS,CAAC,aAChD,OAAO,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE;gBACxB,MAAM,GAAG,GAAG,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;gBACtC,OAAO,CACL,cAEE,SAAS,EAAC,2BAA2B,EACrC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAE,EAAE,qBAAqB,EAAE,GAAG,EAAoB,CAAC,CAAC,CAAC,SAAS,aAE1E,eAAM,SAAS,EAAC,0BAA0B,iBAAa,MAAM,GAAG,EAC/D,QAAQ,CAAC,IAAI,KALT,QAAQ,CAAC,EAAE,CAMb,CACN,CAAC;YACJ,CAAC,CAAC,EACD,SAAS,GAAG,CAAC,IAAI,CAChB,cAAI,SAAS,EAAC,+DAA+D,kBACzE,SAAS,aACR,CACN,IACE,CACN,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"goal-categories.js","sourceRoot":"","sources":["../../src/goal-categories/goal-categories.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,mBAAmB,CAAC;AAEvC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,uBAAuB,CAAC;AAuC/B;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,cAAc,CAAC,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAuB;IACvF,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEzC,uEAAuE;IACvE,4EAA4E;IAC5E,sEAAsE;IACtE,yEAAyE;IACzE,6EAA6E;IAC7E,wEAAwE;IACxE,sEAAsE;IACtE,wEAAwE;IACxE,4EAA4E;IAC5E,4EAA4E;IAC5E,OAAO;IACP,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC;QACvC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,UAAoB,CAAC,EAAE,CAAC,CAAC;QAC/C,CAAC,CAAC,SAAS,CAAC;IACd,MAAM,OAAO,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAC9E,MAAM,SAAS,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC;IAEnF,OAAO,CACL,cAAI,SAAS,EAAE,EAAE,CAAC,qBAAqB,EAAE,SAAS,CAAC,aAChD,OAAO,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE;gBACxB,MAAM,GAAG,GAAG,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;gBACtC,OAAO,CACL,cAEE,SAAS,EAAC,2BAA2B,EACrC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAE,EAAE,qBAAqB,EAAE,GAAG,EAAoB,CAAC,CAAC,CAAC,SAAS,aAE1E,eAAM,SAAS,EAAC,0BAA0B,iBAAa,MAAM,GAAG,EAC/D,QAAQ,CAAC,IAAI,KALT,QAAQ,CAAC,EAAE,CAMb,CACN,CAAC;YACJ,CAAC,CAAC,EACD,SAAS,GAAG,CAAC,IAAI,CAChB,cAAI,SAAS,EAAC,+DAA+D,kBACzE,SAAS,aACR,CACN,IACE,CACN,CAAC;AACJ,CAAC"}
package/dist/index.d.ts CHANGED
@@ -9,6 +9,7 @@
9
9
  * `.storybook/preview.ts` for the canonical setup.
10
10
  */
11
11
  export * from '@manakind/ui-core';
12
+ export * from './category-card';
12
13
  export * from './goal-card';
13
14
  export * from './goal-categories';
14
15
  export * from './goal-tab-trigger';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC"}
package/dist/index.js CHANGED
@@ -9,6 +9,7 @@
9
9
  * `.storybook/preview.ts` for the canonical setup.
10
10
  */
11
11
  export * from '@manakind/ui-core';
12
+ export * from './category-card';
12
13
  export * from './goal-card';
13
14
  export * from './goal-categories';
14
15
  export * from './goal-tab-trigger';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@manakind/manuia-ui",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -37,8 +37,8 @@
37
37
  "vr": "playwright test"
38
38
  },
39
39
  "dependencies": {
40
- "@manakind/manuia-tokens": "0.3.0",
41
- "@manakind/ui-core": "0.3.0"
40
+ "@manakind/manuia-tokens": "0.4.0",
41
+ "@manakind/ui-core": "0.4.0"
42
42
  },
43
43
  "peerDependencies": {
44
44
  "react": "^19.0.0",