cursedbelt 5.15.0 → 5.15.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/dist/react/icons.d.ts +13 -3
- package/dist/react/icons.d.ts.map +1 -1
- package/dist/react/icons.js +9 -3
- package/dist/react/icons.js.map +1 -1
- package/package.json +1 -1
- package/src/react/icons.spec.ts +19 -0
- package/src/react/icons.tsx +14 -4
package/dist/react/icons.d.ts
CHANGED
|
@@ -75,7 +75,11 @@ export declare const defaultIconMap: Record<IconToken, IconComponent>;
|
|
|
75
75
|
export declare function createIconMapRegistry(): IconMapRegistry;
|
|
76
76
|
export interface DynamicIconProps {
|
|
77
77
|
token?: IconToken;
|
|
78
|
-
/**
|
|
78
|
+
/**
|
|
79
|
+
* The icon map to resolve `token` against — typically `runtime.icons`. Omitted, the token
|
|
80
|
+
* resolves against `defaultIconMap`, so a plain `<DynamicIcon token="settings" />` draws the
|
|
81
|
+
* settings icon.
|
|
82
|
+
*/
|
|
79
83
|
iconMap?: IconMapRegistry | null;
|
|
80
84
|
className?: string;
|
|
81
85
|
}
|
|
@@ -91,8 +95,14 @@ export interface DynamicIconProps {
|
|
|
91
95
|
* element and visually overflows into neighboring content instead of
|
|
92
96
|
* respecting the icon's slot.
|
|
93
97
|
*
|
|
94
|
-
* The `iconMap` is typically the `runtime.icons` registry from the host shell
|
|
95
|
-
*
|
|
98
|
+
* The `iconMap` is typically the `runtime.icons` registry from the host shell.
|
|
99
|
+
*
|
|
100
|
+
* 🔴 Omitted, it is `defaultIconMap` — NOT "nothing registered". Until 5.15.1 a missing
|
|
101
|
+
* `iconMap` resolved every token to the letter fallback, so vault's header, which renders
|
|
102
|
+
* `<DynamicIcon token="unlock" />` and its neighbours with no map, painted the letters
|
|
103
|
+
* "U W S" where its lock, generator and settings icons belonged, on every screen, from the
|
|
104
|
+
* day it adopted the component. A registry that was never passed is not a registry that was
|
|
105
|
+
* cleared; only an explicit map may leave a token unresolved.
|
|
96
106
|
*/
|
|
97
107
|
export declare function DynamicIcon({ token, iconMap, className }: DynamicIconProps): React.JSX.Element | null;
|
|
98
108
|
//# sourceMappingURL=icons.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"icons.d.ts","sourceRoot":"","sources":["../../src/react/icons.tsx"],"names":[],"mappings":"AAyDA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,8DAA8D;AAC9D,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8Ef,CAAC;AAEX,MAAM,MAAM,SAAS,GAAG,MAAM,OAAO,YAAY,CAAC;AAElD,MAAM,MAAM,aAAa,GAAG,KAAK,CAAC,aAAa,CAAC;IAC9C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC,CAAC;AAEH,MAAM,WAAW,eAAe;IAC9B,kFAAkF;IAClF,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC,GAAG,IAAI,CAAC;IAC/D,GAAG,CAAC,KAAK,EAAE,SAAS,GAAG,aAAa,GAAG,SAAS,CAAC;IACjD,KAAK,IAAI,IAAI,CAAC;CACf;AAED;;0EAE0E;AAC1E,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,SAAS,EAAE,aAAa,CAwD3D,CAAC;AAEF,wBAAgB,qBAAqB,IAAI,eAAe,CAavD;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB
|
|
1
|
+
{"version":3,"file":"icons.d.ts","sourceRoot":"","sources":["../../src/react/icons.tsx"],"names":[],"mappings":"AAyDA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,8DAA8D;AAC9D,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8Ef,CAAC;AAEX,MAAM,MAAM,SAAS,GAAG,MAAM,OAAO,YAAY,CAAC;AAElD,MAAM,MAAM,aAAa,GAAG,KAAK,CAAC,aAAa,CAAC;IAC9C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC,CAAC;AAEH,MAAM,WAAW,eAAe;IAC9B,kFAAkF;IAClF,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC,GAAG,IAAI,CAAC;IAC/D,GAAG,CAAC,KAAK,EAAE,SAAS,GAAG,aAAa,GAAG,SAAS,CAAC;IACjD,KAAK,IAAI,IAAI,CAAC;CACf;AAED;;0EAE0E;AAC1E,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,SAAS,EAAE,aAAa,CAwD3D,CAAC;AAEF,wBAAgB,qBAAqB,IAAI,eAAe,CAavD;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB;;;;OAIG;IACH,OAAO,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,WAAW,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,gBAAgB,4BAoB1E"}
|
package/dist/react/icons.js
CHANGED
|
@@ -168,13 +168,19 @@ export function createIconMapRegistry() {
|
|
|
168
168
|
* element and visually overflows into neighboring content instead of
|
|
169
169
|
* respecting the icon's slot.
|
|
170
170
|
*
|
|
171
|
-
* The `iconMap` is typically the `runtime.icons` registry from the host shell
|
|
172
|
-
*
|
|
171
|
+
* The `iconMap` is typically the `runtime.icons` registry from the host shell.
|
|
172
|
+
*
|
|
173
|
+
* 🔴 Omitted, it is `defaultIconMap` — NOT "nothing registered". Until 5.15.1 a missing
|
|
174
|
+
* `iconMap` resolved every token to the letter fallback, so vault's header, which renders
|
|
175
|
+
* `<DynamicIcon token="unlock" />` and its neighbours with no map, painted the letters
|
|
176
|
+
* "U W S" where its lock, generator and settings icons belonged, on every screen, from the
|
|
177
|
+
* day it adopted the component. A registry that was never passed is not a registry that was
|
|
178
|
+
* cleared; only an explicit map may leave a token unresolved.
|
|
173
179
|
*/
|
|
174
180
|
export function DynamicIcon({ token, iconMap, className }) {
|
|
175
181
|
if (!token)
|
|
176
182
|
return null;
|
|
177
|
-
const Icon = iconMap
|
|
183
|
+
const Icon = iconMap ? iconMap.get(token) : defaultIconMap[token];
|
|
178
184
|
if (!Icon)
|
|
179
185
|
return (_jsx(Tooltip, { content: token, children: _jsx("span", { className: cn(
|
|
180
186
|
// guardrails-ignore micro-typography-floor: 0.6em is RELATIVE to the avatar box —
|
package/dist/react/icons.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"icons.js","sourceRoot":"","sources":["../../src/react/icons.tsx"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"icons.js","sourceRoot":"","sources":["../../src/react/icons.tsx"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cursedbelt",
|
|
3
|
-
"version": "5.15.
|
|
3
|
+
"version": "5.15.1",
|
|
4
4
|
"license": "ISC",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"description": "The React design system of the cursedbelt split — components, styles, theme. cursedbelt-core below it; server tier in cursedbelt-server.",
|
package/src/react/icons.spec.ts
CHANGED
|
@@ -42,3 +42,22 @@ describe('DynamicIcon fallback', () => {
|
|
|
42
42
|
expect(container.innerHTML).toBe('');
|
|
43
43
|
});
|
|
44
44
|
});
|
|
45
|
+
|
|
46
|
+
describe('DynamicIcon with no iconMap', () => {
|
|
47
|
+
// 🔴 vault rendered `<DynamicIcon token="unlock" />` with no map, and every token fell to the
|
|
48
|
+
// letter fallback — "U W S" in its header where three icons belonged (2026-09-28).
|
|
49
|
+
test('draws the default icon, never the letter fallback', () => {
|
|
50
|
+
for (const token of ['unlock', 'wand', 'settings', 'search'] as const) {
|
|
51
|
+
const { container } = render(DynamicIcon({ token }));
|
|
52
|
+
expect(container.querySelector('[data-icon]'), `${token} fell back to a letter`).toBeNull();
|
|
53
|
+
expect(container.querySelector('svg'), `${token} drew no icon`).not.toBeNull();
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
test('an explicit map that lacks the token still falls back to its letter', () => {
|
|
58
|
+
const icons = createIconMapRegistry();
|
|
59
|
+
icons.clear();
|
|
60
|
+
const { container } = render(DynamicIcon({ token: 'settings', iconMap: icons }));
|
|
61
|
+
expect(container.querySelector('[data-icon="settings"]')?.textContent).toBe('s');
|
|
62
|
+
});
|
|
63
|
+
});
|
package/src/react/icons.tsx
CHANGED
|
@@ -232,7 +232,11 @@ export function createIconMapRegistry(): IconMapRegistry {
|
|
|
232
232
|
|
|
233
233
|
export interface DynamicIconProps {
|
|
234
234
|
token?: IconToken;
|
|
235
|
-
/**
|
|
235
|
+
/**
|
|
236
|
+
* The icon map to resolve `token` against — typically `runtime.icons`. Omitted, the token
|
|
237
|
+
* resolves against `defaultIconMap`, so a plain `<DynamicIcon token="settings" />` draws the
|
|
238
|
+
* settings icon.
|
|
239
|
+
*/
|
|
236
240
|
iconMap?: IconMapRegistry | null;
|
|
237
241
|
className?: string;
|
|
238
242
|
}
|
|
@@ -249,12 +253,18 @@ export interface DynamicIconProps {
|
|
|
249
253
|
* element and visually overflows into neighboring content instead of
|
|
250
254
|
* respecting the icon's slot.
|
|
251
255
|
*
|
|
252
|
-
* The `iconMap` is typically the `runtime.icons` registry from the host shell
|
|
253
|
-
*
|
|
256
|
+
* The `iconMap` is typically the `runtime.icons` registry from the host shell.
|
|
257
|
+
*
|
|
258
|
+
* 🔴 Omitted, it is `defaultIconMap` — NOT "nothing registered". Until 5.15.1 a missing
|
|
259
|
+
* `iconMap` resolved every token to the letter fallback, so vault's header, which renders
|
|
260
|
+
* `<DynamicIcon token="unlock" />` and its neighbours with no map, painted the letters
|
|
261
|
+
* "U W S" where its lock, generator and settings icons belonged, on every screen, from the
|
|
262
|
+
* day it adopted the component. A registry that was never passed is not a registry that was
|
|
263
|
+
* cleared; only an explicit map may leave a token unresolved.
|
|
254
264
|
*/
|
|
255
265
|
export function DynamicIcon({ token, iconMap, className }: DynamicIconProps) {
|
|
256
266
|
if (!token) return null;
|
|
257
|
-
const Icon = iconMap
|
|
267
|
+
const Icon = iconMap ? iconMap.get(token) : defaultIconMap[token];
|
|
258
268
|
if (!Icon)
|
|
259
269
|
return (
|
|
260
270
|
<Tooltip content={token}>
|