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.
@@ -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
- /** The icon map to resolve `token` against — typically `runtime.icons`. */
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
- * pass it explicitly so this component stays framework/runtime-agnostic.
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,2EAA2E;IAC3E,OAAO,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,WAAW,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,gBAAgB,4BAoB1E"}
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"}
@@ -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
- * pass it explicitly so this component stays framework/runtime-agnostic.
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?.get(token);
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 —
@@ -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.0",
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.",
@@ -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
+ });
@@ -232,7 +232,11 @@ export function createIconMapRegistry(): IconMapRegistry {
232
232
 
233
233
  export interface DynamicIconProps {
234
234
  token?: IconToken;
235
- /** The icon map to resolve `token` against — typically `runtime.icons`. */
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
- * pass it explicitly so this component stays framework/runtime-agnostic.
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?.get(token);
267
+ const Icon = iconMap ? iconMap.get(token) : defaultIconMap[token];
258
268
  if (!Icon)
259
269
  return (
260
270
  <Tooltip content={token}>