@nice2dev/icons 1.3.5 → 1.3.7

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.
Files changed (46) hide show
  1. package/CHANGELOG.md +78 -0
  2. package/README.md +24 -4
  3. package/dist/cjs/NiceIconStacker.js +124 -58
  4. package/dist/cjs/client.js +5 -1
  5. package/dist/cjs/createIcon.js +2 -2
  6. package/dist/cjs/iconStack.js +113 -0
  7. package/dist/cjs/icons/actions.js +11 -4
  8. package/dist/cjs/icons/business.js +27 -17
  9. package/dist/cjs/icons/ecommerce.js +14 -4
  10. package/dist/cjs/icons/education.js +18 -11
  11. package/dist/cjs/icons/files.js +20 -12
  12. package/dist/cjs/icons/health.js +31 -15
  13. package/dist/cjs/icons/travel.js +4 -4
  14. package/dist/cjs/icons/ui.js +7 -6
  15. package/dist/cjs/icons/weather.js +4 -3
  16. package/dist/cjs/index.js +5 -1
  17. package/dist/cjs/nicetodev-icons.css +1 -1
  18. package/dist/cjs/rsc.js +1 -1
  19. package/dist/cjs/stacking.js +39 -11
  20. package/dist/esm/NiceIconStacker.js +125 -59
  21. package/dist/esm/client.js +2 -1
  22. package/dist/esm/createIcon.js +3 -3
  23. package/dist/esm/iconParts.js +1 -1
  24. package/dist/esm/iconStack.js +106 -0
  25. package/dist/esm/icons/actions.js +11 -4
  26. package/dist/esm/icons/business.js +27 -17
  27. package/dist/esm/icons/ecommerce.js +14 -4
  28. package/dist/esm/icons/education.js +18 -11
  29. package/dist/esm/icons/files.js +22 -14
  30. package/dist/esm/icons/health.js +31 -15
  31. package/dist/esm/icons/media.js +1 -1
  32. package/dist/esm/icons/travel.js +4 -4
  33. package/dist/esm/icons/ui.js +7 -6
  34. package/dist/esm/icons/weather.js +5 -4
  35. package/dist/esm/index.js +2 -1
  36. package/dist/esm/nicetodev-icons.css +1 -1
  37. package/dist/esm/rsc.js +1 -1
  38. package/dist/esm/smilAnimations.js +1 -1
  39. package/dist/esm/stacking.js +38 -12
  40. package/dist/types/NiceIconStacker.d.ts +18 -28
  41. package/dist/types/client.d.ts +4 -2
  42. package/dist/types/iconStack.d.ts +83 -0
  43. package/dist/types/index.d.ts +4 -2
  44. package/dist/types/stacking.d.ts +16 -3
  45. package/dist/types/types.d.ts +24 -5
  46. package/package.json +2 -2
@@ -3,7 +3,7 @@ import { forwardRef, useId, useSyncExternalStore } from 'react';
3
3
  import { sharpenTree, roundTree, wireTree, MINI_SCALE } from './sharpen.js';
4
4
  import { generateSmilAnimation } from './smilAnimations.js';
5
5
  import { renderStackChildren, NTD_ICON_MARK } from './stacking.js';
6
- import { SIZE_MAP, SEMANTIC_COLOR_VARS, SEMANTIC_COLOR_DEFAULTS, GRADIENT_PRESETS } from './types.js';
6
+ import { SEMANTIC_COLOR_VARS, SEMANTIC_COLOR_DEFAULTS, SIZE_MAP, GRADIENT_PRESETS } from './types.js';
7
7
 
8
8
  /* ── Dark mode detection hook ───────────────────────── */
9
9
  // No `matchMedia` (jsdom without a polyfill, some embedded webviews): light, and nothing to
@@ -114,11 +114,11 @@ function renderCutoutShape(shape, fill, maskId) {
114
114
  }
115
115
  function createIcon(options) {
116
116
  const { displayName, viewBox = '0 0 24 24', paths, textCenter = BOX_CENTER } = options;
117
- const Icon = forwardRef(({ size = 'md', variant = 'solid', cutoutShape = 'rounded-square', color, lightColor, darkColor, primaryColor: propPrimaryColor = 'currentColor', secondaryColor, accentColor, primaryOpacity = 1, secondaryOpacity = 0.4, accentOpacity = 1, strokeWidth = 2, strokeLinecap: propLinecap, strokeLinejoin: propLinejoin, animation, animationDuration, smilAnimation, smilDuration = 1, smilRepeatCount = 'indefinite', smilEasing = 'ease-in-out', smilDelay = 0, gradient, gradientType = 'linear', gradientAngle = 135, gradientAnimation,
117
+ const Icon = forwardRef(({ size = 'md', variant = 'solid', cutoutShape = 'rounded-square', color, lightColor, darkColor, primaryColor: propPrimaryColor = 'currentColor', secondaryColor, accentColor, primaryOpacity = 1, secondaryOpacity = 0.4, accentOpacity = 1, strokeWidth = 1, strokeLinecap: propLinecap, strokeLinejoin: propLinejoin, animation, animationDuration, smilAnimation, smilDuration = 1, smilRepeatCount = 'indefinite', smilEasing = 'ease-in-out', smilDelay = 0, gradient, gradientType = 'linear', gradientAngle = 135, gradientAnimation,
118
118
  // Transform props
119
119
  rotate, flipX, flipY, scale, transition, transformOrigin = 'center center',
120
120
  // stacking (1.3.5): the parent icon reads a child's own align / size from its props
121
- children, stackAlign: _stackAlign, stackSize: _stackSize, textColor, textSize, title, className, style, ...rest }, ref) => {
121
+ children, stackAlign: _stackAlign, stackSize: _stackSize, stackRotation: _stackRotation, stackOffsetX: _stackOffsetX, stackOffsetY: _stackOffsetY, textColor, textSize, title, className, style, ...rest }, ref) => {
122
122
  var _a, _b, _c, _d, _e, _f, _g;
123
123
  const resolvedSize = typeof size === 'number' ? size : ((_a = SIZE_MAP[size]) !== null && _a !== void 0 ? _a : 24);
124
124
  const gradId = useId();
@@ -1,4 +1,4 @@
1
- import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
1
+ import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
2
2
  import { createIcon } from './createIcon.js';
3
3
 
4
4
  /**
@@ -0,0 +1,106 @@
1
+ import { jsx, Fragment } from 'react/jsx-runtime';
2
+ import { createElement } from 'react';
3
+
4
+ /** A name `textBinding` can take: a JavaScript identifier. */
5
+ function isValidTextBinding(name) {
6
+ return !!name && /^[A-Za-z_$][\w$]*$/.test(name);
7
+ }
8
+ /** The id of the layer `layer` sits in, `undefined` for the base. */
9
+ function stackParentId(layers, layer) {
10
+ var _a, _b;
11
+ return layer === layers[0] ? undefined : ((_a = layer.parent) !== null && _a !== void 0 ? _a : (_b = layers[0]) === null || _b === void 0 ? void 0 : _b.id);
12
+ }
13
+ /** The layers that sit directly in layer `id`, in order. */
14
+ function stackChildrenOf(layers, id) {
15
+ return layers.filter((l) => l !== layers[0] && stackParentId(layers, l) === id);
16
+ }
17
+ const COLOR_PROPS = ['primaryColor', 'secondaryColor', 'accentColor', 'textColor'];
18
+ /** The stack as JSX: every layer wrapping the layers that sit in it, text innermost. */
19
+ function niceIconStackCode(layers) {
20
+ const base = layers[0];
21
+ if (!base) {
22
+ return '';
23
+ }
24
+ const bound = layers.filter((l) => isValidTextBinding(l.textBinding));
25
+ const write = (layer, parent, indent) => {
26
+ var _a;
27
+ const attrs = [
28
+ parent ? `stackAlign="${(_a = layer.align) !== null && _a !== void 0 ? _a : 'center'}"` : '',
29
+ parent && layer.size !== undefined ? `stackSize={${layer.size}}` : '',
30
+ parent && layer.rotation ? `stackRotation={${layer.rotation}}` : '',
31
+ parent && layer.offsetX ? `stackOffsetX={${layer.offsetX}}` : '',
32
+ parent && layer.offsetY ? `stackOffsetY={${layer.offsetY}}` : '',
33
+ layer.variant && layer.variant !== (parent === null || parent === void 0 ? void 0 : parent.variant) ? `variant="${layer.variant}"` : '',
34
+ ...COLOR_PROPS.map((p) => (layer[p] ? `${p}="${layer[p]}"` : '')),
35
+ layer.textSize !== undefined ? `textSize={${layer.textSize}}` : '',
36
+ ]
37
+ .filter(Boolean)
38
+ .join(' ');
39
+ const open = `${layer.icon}${attrs ? ` ${attrs}` : ''}`;
40
+ const text = isValidTextBinding(layer.textBinding) ? `{${layer.textBinding}}` : layer.text;
41
+ const inner = stackChildrenOf(layers, layer.id);
42
+ if (inner.length === 0) {
43
+ return text ? `${indent}<${open}>${text}</${layer.icon}>` : `${indent}<${open} />`;
44
+ }
45
+ return [
46
+ `${indent}<${open}>`,
47
+ ...(text ? [`${indent} ${text}`] : []),
48
+ ...inner.map((child) => write(child, layer, `${indent} `)),
49
+ `${indent}</${layer.icon}>`,
50
+ ].join('\n');
51
+ };
52
+ const notes = bound.map((l) => `// {${l.textBinding}}: bound text${l.text ? `, e.g. "${l.text}"` : ''}`);
53
+ return [...notes, write(base, undefined, '')].join('\n');
54
+ }
55
+ /**
56
+ * The stack drawn as icons — the base wrapping the layers that sit in it, text innermost (1.3.6).
57
+ * One SVG, as nesting the icons by hand would give.
58
+ */
59
+ function renderIconStack(layers, icons, { baseProps, values } = {}) {
60
+ const resolve = (name) => (typeof icons === 'function' ? icons(name) : icons[name]);
61
+ const draw = (layer, parent) => {
62
+ var _a, _b;
63
+ const Icon = resolve(layer.icon);
64
+ if (!Icon) {
65
+ return null;
66
+ }
67
+ const bound = isValidTextBinding(layer.textBinding) ? values === null || values === void 0 ? void 0 : values[layer.textBinding] : undefined;
68
+ const text = bound !== null && bound !== void 0 ? bound : layer.text;
69
+ const own = {
70
+ primaryColor: layer.primaryColor,
71
+ secondaryColor: layer.secondaryColor,
72
+ accentColor: layer.accentColor,
73
+ textColor: layer.textColor,
74
+ textSize: layer.textSize,
75
+ };
76
+ const inner = stackChildrenOf(layers, layer.id).map((child) => draw(child, layer));
77
+ if (!parent) {
78
+ const props = { ...baseProps };
79
+ for (const [k, v] of Object.entries(own)) {
80
+ if (v !== undefined) {
81
+ props[k] = v;
82
+ }
83
+ }
84
+ return (createElement(Icon, { ...props, key: layer.id, variant: (_a = layer.variant) !== null && _a !== void 0 ? _a : baseProps === null || baseProps === void 0 ? void 0 : baseProps.variant },
85
+ inner,
86
+ text));
87
+ }
88
+ return (createElement(Icon, { ...own, key: layer.id, stackAlign: (_b = layer.align) !== null && _b !== void 0 ? _b : 'center', stackSize: layer.size, stackRotation: layer.rotation, stackOffsetX: layer.offsetX, stackOffsetY: layer.offsetY, variant: layer.variant !== parent.variant ? layer.variant : undefined },
89
+ inner,
90
+ text));
91
+ };
92
+ return layers[0] ? draw(layers[0], undefined) : null;
93
+ }
94
+ /**
95
+ * NiceIconStack (1.3.6) — draws a stack kept as data (NiceIconStacker's layers) as one icon, its
96
+ * bound text filled from `values`: `<NiceIconStack layers={stack} icons={icons} values={{ count }} />`.
97
+ * The rest of the props go to the base icon.
98
+ */
99
+ function NiceIconStack({ layers, icons, values, ...baseProps }) {
100
+ return jsx(Fragment, { children: renderIconStack(layers, icons, { baseProps, values }) });
101
+ }
102
+ if (process.env.NODE_ENV !== 'production') {
103
+ NiceIconStack.displayName = 'NiceIconStack';
104
+ }
105
+
106
+ export { NiceIconStack, isValidTextBinding, niceIconStackCode, renderIconStack, stackChildrenOf, stackParentId };
@@ -49,13 +49,20 @@ const NtdEditDetail = /* @__PURE__ */ createIcon({
49
49
  vivid: ({ primaryColor, secondaryColor, strokeWidth, uid }) => (jsxs(Fragment, { children: [jsx("path", { d: EDIT_DETAIL_FRAME, stroke: secondaryColor, strokeWidth: strokeWidth * 2, fill: "none" }), jsx("path", { d: EDIT_DETAIL_PENCIL, fill: primaryColor }), within(uid, 'band', jsx("path", { d: EDIT_DETAIL_PENCIL }), jsx("path", { d: EDIT_DETAIL_BAND, stroke: secondaryColor, strokeWidth: "1.3" }))] })),
50
50
  },
51
51
  });
52
+ // NtdTrash: the lid overhangs the bin by 1 a side (16 across; it was 18) and the handle is 6 by 3
53
+ // (it was 8 by 4). Vivid: the lid and the handle secondary, the grooves accent (they were a fixed
54
+ // #3B82F6).
55
+ const TRASH_LID = 'M4 6h16';
56
+ const TRASH_HANDLE = 'M9 6V4.5a1.5 1.5 0 011.5-1.5h3a1.5 1.5 0 011.5 1.5V6';
57
+ const TRASH_BIN = 'M5 6l1 14a2 2 0 002 2h8a2 2 0 002-2l1-14H5z';
58
+ const TRASH_GROOVES = 'M10 10.5v7M14 10.5v7';
52
59
  const NtdTrash = /* @__PURE__ */ createIcon({
53
60
  displayName: 'NtdTrash',
54
61
  paths: {
55
- solid: ({ primaryColor, accentColor, accentOpacity, strokeWidth }) => (jsxs(Fragment, { children: [jsx("path", { d: "M3 6h18", stroke: primaryColor, strokeWidth: strokeWidth }), jsx("path", { d: "M8 6V4a2 2 0 012-2h4a2 2 0 012 2v2", stroke: primaryColor, strokeWidth: strokeWidth }), jsx("path", { d: "M5 6l1 14a2 2 0 002 2h8a2 2 0 002-2l1-14H5z", fill: primaryColor }), jsx("line", { x1: "10", y1: "10.5", x2: "10", y2: "17.5", stroke: accentColor, strokeWidth: strokeWidth * 0.7, opacity: accentOpacity }), jsx("line", { x1: "14", y1: "10.5", x2: "14", y2: "17.5", stroke: accentColor, strokeWidth: strokeWidth * 0.7, opacity: accentOpacity })] })),
56
- outline: ({ primaryColor, strokeWidth }) => (jsxs(Fragment, { children: [jsx("path", { d: "M3 6h18", stroke: primaryColor, strokeWidth: strokeWidth }), jsx("path", { d: "M8 6V4a2 2 0 012-2h4a2 2 0 012 2v2", stroke: primaryColor, strokeWidth: strokeWidth }), jsx("path", { d: "M5 6l1 14a2 2 0 002 2h8a2 2 0 002-2l1-14", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsx("line", { x1: "10", y1: "10.5", x2: "10", y2: "17.5", stroke: primaryColor, strokeWidth: strokeWidth }), jsx("line", { x1: "14", y1: "10.5", x2: "14", y2: "17.5", stroke: primaryColor, strokeWidth: strokeWidth })] })),
57
- duotone: ({ primaryColor, secondaryColor, secondaryOpacity, strokeWidth }) => (jsxs(Fragment, { children: [jsx("path", { d: "M5 6l1 14a2 2 0 002 2h8a2 2 0 002-2l1-14H5z", fill: secondaryColor, opacity: secondaryOpacity }), jsx("path", { d: "M3 6h18", stroke: primaryColor, strokeWidth: strokeWidth }), jsx("path", { d: "M8 6V4a2 2 0 012-2h4a2 2 0 012 2v2", stroke: primaryColor, strokeWidth: strokeWidth }), jsx("path", { d: "M5 6l1 14a2 2 0 002 2h8a2 2 0 002-2l1-14", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsx("line", { x1: "10", y1: "10.5", x2: "10", y2: "17.5", stroke: primaryColor, strokeWidth: strokeWidth }), jsx("line", { x1: "14", y1: "10.5", x2: "14", y2: "17.5", stroke: primaryColor, strokeWidth: strokeWidth })] })),
58
- vivid: ({ primaryColor, secondaryColor }) => (jsxs(Fragment, { children: [jsx("path", { d: "M5 6l1 14a2 2 0 002 2h8a2 2 0 002-2l1-14H5z", fill: primaryColor }), jsx("path", { d: "M5 6l1 14a2 2 0 002 2h8a2 2 0 002-2l1-14H5z", fill: "white", opacity: "0.1" }), jsx("path", { d: "M3 6h18", stroke: secondaryColor, strokeWidth: "1.8" }), jsx("path", { d: "M8 6V4a2 2 0 012-2h4a2 2 0 012 2v2", stroke: "#3B82F6", strokeWidth: "1.5" }), jsx("line", { x1: "10", y1: "10.5", x2: "10", y2: "17.5", stroke: "#3B82F6", strokeWidth: "1.5" }), jsx("line", { x1: "14", y1: "10.5", x2: "14", y2: "17.5", stroke: "#3B82F6", strokeWidth: "1.5" })] })),
62
+ solid: ({ primaryColor, accentColor, accentOpacity, strokeWidth }) => (jsxs(Fragment, { children: [jsx("path", { d: TRASH_LID, stroke: primaryColor, strokeWidth: strokeWidth }), jsx("path", { d: TRASH_HANDLE, stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsx("path", { d: TRASH_BIN, fill: primaryColor }), jsx("line", { x1: "10", y1: "10.5", x2: "10", y2: "17.5", stroke: accentColor, strokeWidth: strokeWidth * 0.7, opacity: accentOpacity }), jsx("line", { x1: "14", y1: "10.5", x2: "14", y2: "17.5", stroke: accentColor, strokeWidth: strokeWidth * 0.7, opacity: accentOpacity })] })),
63
+ outline: ({ primaryColor, strokeWidth }) => (jsxs(Fragment, { children: [jsx("path", { d: TRASH_LID, stroke: primaryColor, strokeWidth: strokeWidth }), jsx("path", { d: TRASH_HANDLE, stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsx("path", { d: "M5 6l1 14a2 2 0 002 2h8a2 2 0 002-2l1-14", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsx("path", { d: TRASH_GROOVES, stroke: primaryColor, strokeWidth: strokeWidth })] })),
64
+ duotone: ({ primaryColor, secondaryColor, secondaryOpacity, strokeWidth }) => (jsxs(Fragment, { children: [jsx("path", { d: TRASH_BIN, fill: secondaryColor, opacity: secondaryOpacity }), jsx("path", { d: TRASH_LID, stroke: primaryColor, strokeWidth: strokeWidth }), jsx("path", { d: TRASH_HANDLE, stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsx("path", { d: "M5 6l1 14a2 2 0 002 2h8a2 2 0 002-2l1-14", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsx("path", { d: TRASH_GROOVES, stroke: primaryColor, strokeWidth: strokeWidth })] })),
65
+ vivid: ({ primaryColor, secondaryColor, accentColor, accentOpacity, strokeWidth }) => (jsxs(Fragment, { children: [jsx("path", { d: TRASH_BIN, fill: primaryColor }), jsx("path", { d: TRASH_LID, stroke: secondaryColor, strokeWidth: strokeWidth }), jsx("path", { d: TRASH_HANDLE, stroke: secondaryColor, strokeWidth: strokeWidth, fill: "none" }), jsx("path", { d: TRASH_GROOVES, stroke: accentColor, strokeWidth: strokeWidth * 0.7, opacity: accentOpacity })] })),
59
66
  },
60
67
  });
61
68
  // NtdSave: a 3.5" floppy — the clipped corner, a wide metal shutter at the top edge with its
@@ -2,23 +2,30 @@ import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
2
2
  import { createIcon } from '../createIcon.js';
3
3
  import { paperIcon, within } from '../iconParts.js';
4
4
 
5
- // The band sits halfway down the case and is a cut through it: kept inside the case it meets the
6
- // sides flush (its round caps stuck out of both). A clasp hangs from its middle: low and wide, in
7
- // the accent colour like the band on the filled case (secondary in duotone), with a primary lock
8
- // square in it where it had a slot showing the band through.
5
+ // The band sits a third of the way down the case (11.5; it was halfway, 12.5) and is a cut through
6
+ // it: kept inside the case it meets the sides flush (its round caps stuck out of both), in the
7
+ // outline too, where it ends on the sides' centre line. A clasp hangs from its middle: low and
8
+ // wide, in the accent colour like the band on the filled case (secondary in duotone), with a
9
+ // primary lock square in it where it had a slot showing the band through. Vivid: the clasp is all
10
+ // accent, without the square, which made it read as an accent ring round a primary middle.
9
11
  const BRIEFCASE_CASE = { x: 2, y: 7, width: 20, height: 14, rx: 2 };
10
12
  const BRIEFCASE_HANDLE = 'M16 7V5a2 2 0 00-2-2h-4a2 2 0 00-2 2v2';
13
+ const BRIEFCASE_BAND = 'M2 11.5h20';
11
14
  /** The clasp over the band, hanging down from it. */
12
- const BRIEFCASE_CLASP = 'M10.6 11.3h2.8a.8.8 0 01.8.8v2.6a.8.8 0 01-.8.8h-2.8a.8.8 0 01-.8-.8v-2.6a.8.8 0 01.8-.8z';
13
- const BRIEFCASE_LOCK = { x: 11.2, y: 12.6, width: 1.6, height: 1.6 };
15
+ const BRIEFCASE_CLASP = 'M10.6 10.3h2.8a.8.8 0 01.8.8v2.6a.8.8 0 01-.8.8h-2.8a.8.8 0 01-.8-.8v-2.6a.8.8 0 01.8-.8z';
16
+ const BRIEFCASE_LOCK = { x: 11.2, y: 11.6, width: 1.6, height: 1.6 };
17
+ /** The band, clipped to the case so it ends flush with the sides. */
18
+ function briefcaseBand(uid, color, width, opacity = 1) {
19
+ return within(uid, 'band', jsx("rect", { ...BRIEFCASE_CASE }), jsx("path", { d: BRIEFCASE_BAND, stroke: color, strokeWidth: width, opacity: opacity }));
20
+ }
14
21
  const NtdBriefcase = /* @__PURE__ */ createIcon({
15
22
  displayName: 'NtdBriefcase',
16
23
  paths: {
17
- solid: (props) => (jsxs(Fragment, { children: [jsx("rect", { ...BRIEFCASE_CASE, fill: props.primaryColor }), jsx("path", { d: BRIEFCASE_HANDLE, stroke: props.primaryColor, strokeWidth: props.strokeWidth, fill: "none" }), within(props.uid, 'band', jsx("rect", { ...BRIEFCASE_CASE }), jsx("line", { x1: "2", y1: "12.5", x2: "22", y2: "12.5", stroke: props.accentColor, strokeWidth: "1.5", opacity: props.accentOpacity })), jsx("path", { d: BRIEFCASE_CLASP, fill: props.accentColor, opacity: props.accentOpacity }), jsx("rect", { ...BRIEFCASE_LOCK, fill: props.primaryColor })] })),
18
- outline: ({ primaryColor, strokeWidth }) => (jsxs(Fragment, { children: [jsx("rect", { ...BRIEFCASE_CASE, stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsx("path", { d: BRIEFCASE_HANDLE, stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsx("line", { x1: "2", y1: "12.5", x2: "22", y2: "12.5", stroke: primaryColor, strokeWidth: "1.5" }), jsx("path", { d: BRIEFCASE_CLASP, fill: primaryColor })] })),
24
+ solid: (props) => (jsxs(Fragment, { children: [jsx("rect", { ...BRIEFCASE_CASE, fill: props.primaryColor }), jsx("path", { d: BRIEFCASE_HANDLE, stroke: props.primaryColor, strokeWidth: props.strokeWidth, fill: "none" }), briefcaseBand(props.uid, props.accentColor, props.strokeWidth * 1.5, props.accentOpacity), jsx("path", { d: BRIEFCASE_CLASP, fill: props.accentColor, opacity: props.accentOpacity }), jsx("rect", { ...BRIEFCASE_LOCK, fill: props.primaryColor })] })),
25
+ outline: ({ primaryColor, strokeWidth, uid }) => (jsxs(Fragment, { children: [jsx("rect", { ...BRIEFCASE_CASE, stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsx("path", { d: BRIEFCASE_HANDLE, stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), briefcaseBand(uid, primaryColor, strokeWidth), jsx("path", { d: BRIEFCASE_CLASP, fill: primaryColor })] })),
19
26
  // fills only: the case and the handle primary, the band and the clasp secondary
20
- duotone: ({ primaryColor, secondaryColor, strokeWidth, uid }) => (jsxs(Fragment, { children: [jsx("rect", { ...BRIEFCASE_CASE, fill: primaryColor }), jsx("path", { d: BRIEFCASE_HANDLE, stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), within(uid, 'band', jsx("rect", { ...BRIEFCASE_CASE }), jsx("line", { x1: "2", y1: "12.5", x2: "22", y2: "12.5", stroke: secondaryColor, strokeWidth: "1.5" })), jsx("path", { d: BRIEFCASE_CLASP, fill: secondaryColor }), jsx("rect", { ...BRIEFCASE_LOCK, fill: primaryColor })] })),
21
- vivid: ({ primaryColor, secondaryColor, accentColor, accentOpacity, strokeWidth, uid }) => (jsxs(Fragment, { children: [jsx("rect", { ...BRIEFCASE_CASE, fill: primaryColor }), jsx("path", { d: BRIEFCASE_HANDLE, stroke: secondaryColor, strokeWidth: strokeWidth, fill: "none" }), within(uid, 'band', jsx("rect", { ...BRIEFCASE_CASE }), jsx("line", { x1: "2", y1: "12.5", x2: "22", y2: "12.5", stroke: secondaryColor, strokeWidth: "1.5" })), jsx("path", { d: BRIEFCASE_CLASP, fill: accentColor, opacity: accentOpacity }), jsx("rect", { ...BRIEFCASE_LOCK, fill: primaryColor })] })),
27
+ duotone: ({ primaryColor, secondaryColor, strokeWidth, uid }) => (jsxs(Fragment, { children: [jsx("rect", { ...BRIEFCASE_CASE, fill: primaryColor }), jsx("path", { d: BRIEFCASE_HANDLE, stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), briefcaseBand(uid, secondaryColor, strokeWidth * 1.5), jsx("path", { d: BRIEFCASE_CLASP, fill: secondaryColor }), jsx("rect", { ...BRIEFCASE_LOCK, fill: primaryColor })] })),
28
+ vivid: ({ primaryColor, secondaryColor, accentColor, accentOpacity, strokeWidth, uid }) => (jsxs(Fragment, { children: [jsx("rect", { ...BRIEFCASE_CASE, fill: primaryColor }), jsx("path", { d: BRIEFCASE_HANDLE, stroke: secondaryColor, strokeWidth: strokeWidth, fill: "none" }), briefcaseBand(uid, secondaryColor, strokeWidth * 1.5), jsx("path", { d: BRIEFCASE_CLASP, fill: accentColor, opacity: accentOpacity })] })),
22
29
  },
23
30
  });
24
31
  // NtdDollar: a line glyph, twice the stroke width in every variant but `outline`; the stem runs
@@ -113,16 +120,19 @@ const NtdTrendDown = /* @__PURE__ */ createIcon({
113
120
  },
114
121
  });
115
122
  // NtdPercent: the dots are rings in every variant, a hole in each (they were plain discs when
116
- // filled).
117
- const PERCENT_DOT_TOP = 'M6.5 3.9a2.6 2.6 0 100 5.2 2.6 2.6 0 100-5.2zM6.5 5.4a1.1 1.1 0 100 2.2 1.1 1.1 0 100-2.2z';
118
- const PERCENT_DOT_BOTTOM = 'M17.5 14.9a2.6 2.6 0 100 5.2 2.6 2.6 0 100-5.2zM17.5 16.4a1.1 1.1 0 100 2.2 1.1 1.1 0 100-2.2z';
123
+ // filled), 20% bigger than they were (r 3.1 with a 1.3 hole; 3 in the outline). The slash is a
124
+ // line glyph: twice the stroke width in every variant but `outline`.
125
+ const PERCENT_DOT_TOP = 'M6.5 3.4a3.1 3.1 0 100 6.2 3.1 3.1 0 100-6.2zM6.5 5.2a1.3 1.3 0 100 2.6 1.3 1.3 0 100-2.6z';
126
+ const PERCENT_DOT_BOTTOM = 'M17.5 14.4a3.1 3.1 0 100 6.2 3.1 3.1 0 100-6.2zM17.5 16.2a1.3 1.3 0 100 2.6 1.3 1.3 0 100-2.6z';
127
+ const PERCENT_SLASH = 'M19 5L5 19';
119
128
  const NtdPercent = /* @__PURE__ */ createIcon({
120
129
  displayName: 'NtdPercent',
121
130
  paths: {
122
- solid: ({ primaryColor, strokeWidth }) => (jsxs(Fragment, { children: [jsx("line", { x1: "19", y1: "5", x2: "5", y2: "19", stroke: primaryColor, strokeWidth: strokeWidth }), jsx("path", { d: `${PERCENT_DOT_TOP}${PERCENT_DOT_BOTTOM}`, fillRule: "evenodd", fill: primaryColor })] })),
123
- outline: ({ primaryColor, strokeWidth }) => (jsxs(Fragment, { children: [jsx("line", { x1: "19", y1: "5", x2: "5", y2: "19", stroke: primaryColor, strokeWidth: strokeWidth }), jsx("circle", { cx: "6.5", cy: "6.5", r: "2.5", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsx("circle", { cx: "17.5", cy: "17.5", r: "2.5", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" })] })),
124
- duotone: ({ primaryColor, secondaryColor, secondaryOpacity, strokeWidth }) => (jsxs(Fragment, { children: [jsx("line", { x1: "19", y1: "5", x2: "5", y2: "19", stroke: secondaryColor, strokeWidth: strokeWidth, opacity: secondaryOpacity + 0.2 }), jsx("path", { d: `${PERCENT_DOT_TOP}${PERCENT_DOT_BOTTOM}`, fillRule: "evenodd", fill: primaryColor })] })),
125
- vivid: ({ primaryColor, secondaryColor, strokeWidth }) => (jsxs(Fragment, { children: [jsx("line", { x1: "19", y1: "5", x2: "5", y2: "19", stroke: primaryColor, strokeWidth: strokeWidth }), jsx("path", { d: PERCENT_DOT_TOP, fillRule: "evenodd", fill: primaryColor }), jsx("path", { d: PERCENT_DOT_BOTTOM, fillRule: "evenodd", fill: secondaryColor })] })),
131
+ solid: ({ primaryColor, strokeWidth }) => (jsxs(Fragment, { children: [jsx("path", { d: PERCENT_SLASH, stroke: primaryColor, strokeWidth: strokeWidth * 2 }), jsx("path", { d: `${PERCENT_DOT_TOP}${PERCENT_DOT_BOTTOM}`, fillRule: "evenodd", fill: primaryColor })] })),
132
+ outline: ({ primaryColor, strokeWidth }) => (jsxs(Fragment, { children: [jsx("path", { d: PERCENT_SLASH, stroke: primaryColor, strokeWidth: strokeWidth }), jsx("circle", { cx: "6.5", cy: "6.5", r: "3", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsx("circle", { cx: "17.5", cy: "17.5", r: "3", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" })] })),
133
+ // fills only: the slash secondary, the rings primary
134
+ duotone: ({ primaryColor, secondaryColor, strokeWidth }) => (jsxs(Fragment, { children: [jsx("path", { d: PERCENT_SLASH, stroke: secondaryColor, strokeWidth: strokeWidth * 2 }), jsx("path", { d: `${PERCENT_DOT_TOP}${PERCENT_DOT_BOTTOM}`, fillRule: "evenodd", fill: primaryColor })] })),
135
+ vivid: ({ primaryColor, secondaryColor, strokeWidth }) => (jsxs(Fragment, { children: [jsx("path", { d: PERCENT_SLASH, stroke: primaryColor, strokeWidth: strokeWidth * 2 }), jsx("path", { d: PERCENT_DOT_TOP, fillRule: "evenodd", fill: primaryColor }), jsx("path", { d: PERCENT_DOT_BOTTOM, fillRule: "evenodd", fill: secondaryColor })] })),
126
136
  },
127
137
  });
128
138
  // NtdInvoice: NtdFile's page with a short title, two rows of item and amount, and the total on
@@ -77,13 +77,23 @@ const NtdDiscount = /* @__PURE__ */ createIcon({
77
77
  vivid: ({ primaryColor, secondaryColor }) => (jsxs(Fragment, { children: [jsx("circle", { cx: "12", cy: "12", r: "10", fill: primaryColor }), jsx("circle", { cx: "12", cy: "12", r: "10", fill: "white", opacity: "0.08" }), jsx("circle", { cx: "8", cy: "8", r: "2", fill: secondaryColor }), jsx("circle", { cx: "16", cy: "16", r: "2", fill: "#F59E0B" }), jsx("path", { d: "M7 17L17 7", stroke: "white", strokeWidth: "1", opacity: "0.35" })] })),
78
78
  },
79
79
  });
80
+ // NtdPromoTag: a price tag with its hole and a percent sign on it, the sign turned 45° clockwise
81
+ // — its slash lies across and the two dots sit above and below it. Filled, the sign is in the
82
+ // accent colour like the hole (vivid: the hole secondary); duotone and the outline draw it primary.
83
+ const PROMO_TAG = 'M20.59 13.41l-7.17 7.17a2 2 0 01-2.83 0L2 12V2h10l8.59 8.59a2 2 0 010 2.82z';
84
+ const PROMO_PERCENT_SLASH = 'M10 13h6.4';
85
+ /** The percent sign's two dots, r 1.15, above and below the slash. */
86
+ const PROMO_PERCENT_DOTS = 'M13.2 8.95a1.15 1.15 0 100 2.3 1.15 1.15 0 100-2.3zM13.2 14.75a1.15 1.15 0 100 2.3 1.15 1.15 0 100-2.3z';
87
+ function promoPercent(color, width, opacity = 1) {
88
+ return (jsxs("g", { opacity: opacity, children: [jsx("path", { d: PROMO_PERCENT_SLASH, stroke: color, strokeWidth: width }), jsx("path", { d: PROMO_PERCENT_DOTS, fill: color })] }));
89
+ }
80
90
  const NtdPromoTag = /* @__PURE__ */ createIcon({
81
91
  displayName: 'NtdPromoTag',
82
92
  paths: {
83
- solid: ({ primaryColor, accentColor, accentOpacity }) => (jsxs(Fragment, { children: [jsx("path", { d: "M20.59 13.41l-7.17 7.17a2 2 0 01-2.83 0L2 12V2h10l8.59 8.59a2 2 0 010 2.82z", fill: primaryColor }), jsx("circle", { cx: "7", cy: "7", r: "2", fill: accentColor, opacity: accentOpacity })] })),
84
- outline: ({ primaryColor, strokeWidth }) => (jsxs(Fragment, { children: [jsx("path", { d: "M20.59 13.41l-7.17 7.17a2 2 0 01-2.83 0L2 12V2h10l8.59 8.59a2 2 0 010 2.82z", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsx("circle", { cx: "7", cy: "7", r: "1.5", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" })] })),
85
- duotone: ({ primaryColor, secondaryColor, secondaryOpacity, strokeWidth }) => (jsxs(Fragment, { children: [jsx("path", { d: "M20.59 13.41l-7.17 7.17a2 2 0 01-2.83 0L2 12V2h10l8.59 8.59a2 2 0 010 2.82z", fill: secondaryColor, opacity: secondaryOpacity }), jsx("path", { d: "M20.59 13.41l-7.17 7.17a2 2 0 01-2.83 0L2 12V2h10l8.59 8.59a2 2 0 010 2.82z", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsx("circle", { cx: "7", cy: "7", r: "1.5", fill: primaryColor })] })),
86
- vivid: ({ primaryColor, secondaryColor }) => (jsxs(Fragment, { children: [jsx("path", { d: "M20.59 13.41l-7.17 7.17a2 2 0 01-2.83 0L2 12V2h10l8.59 8.59a2 2 0 010 2.82z", fill: primaryColor }), jsx("path", { d: "M20.59 13.41l-7.17 7.17a2 2 0 01-2.83 0L2 12V2h10l8.59 8.59a2 2 0 010 2.82z", fill: "white", opacity: "0.08" }), jsx("circle", { cx: "7", cy: "7", r: "2", fill: secondaryColor })] })),
93
+ solid: ({ primaryColor, accentColor, accentOpacity, strokeWidth }) => (jsxs(Fragment, { children: [jsx("path", { d: PROMO_TAG, fill: primaryColor }), jsx("circle", { cx: "7", cy: "7", r: "2", fill: accentColor, opacity: accentOpacity }), promoPercent(accentColor, strokeWidth * 1.5, accentOpacity)] })),
94
+ outline: ({ primaryColor, strokeWidth }) => (jsxs(Fragment, { children: [jsx("path", { d: PROMO_TAG, stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsx("circle", { cx: "7", cy: "7", r: "1.5", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), promoPercent(primaryColor, strokeWidth)] })),
95
+ duotone: ({ primaryColor, secondaryColor, secondaryOpacity, strokeWidth }) => (jsxs(Fragment, { children: [jsx("path", { d: PROMO_TAG, fill: secondaryColor, opacity: secondaryOpacity }), jsx("path", { d: PROMO_TAG, stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsx("circle", { cx: "7", cy: "7", r: "1.5", fill: primaryColor }), promoPercent(primaryColor, strokeWidth * 1.5)] })),
96
+ vivid: ({ primaryColor, secondaryColor, accentColor, accentOpacity, strokeWidth }) => (jsxs(Fragment, { children: [jsx("path", { d: PROMO_TAG, fill: primaryColor }), jsx("path", { d: PROMO_TAG, fill: "white", opacity: "0.08" }), jsx("circle", { cx: "7", cy: "7", r: "2", fill: secondaryColor }), promoPercent(accentColor, strokeWidth * 1.5, accentOpacity)] })),
87
97
  },
88
98
  });
89
99
  const NtdGiftCard = /* @__PURE__ */ createIcon({
@@ -47,23 +47,30 @@ const NtdUniversity = /* @__PURE__ */ createIcon({
47
47
  // at the bottom between the front cover and the back cover. Down the right edge it is cover, then
48
48
  // a notch cut in 0.9 at the pages, then cover again: beside the pages only a narrow strip of cover
49
49
  // is left (it was a 2.5 wide bar). The outline ends the pages with a line short of the edge, the back
50
- // cover running on under the notch. The cover is plain, so another glyph can sit on it;
51
- // NtdBookBookmark adds a ribbon.
52
- const BOOK_SILHOUETTE = 'M7 2h12a1 1 0 011 1v14.2h-.9v2.1H20v.7a1 1 0 01-1 1H7a2.5 2.5 0 01-2.5-2.5v-14A2.5 2.5 0 017 2z';
53
- const BOOK_PAGES = 'M6.6 17.2h11.4v2.1H6.6a1.05 1.05 0 010-2.1z';
54
- const BOOK_RIBBON = 'M9.5 2v6.5l1.75-1.3L13 8.5V2z';
55
- const BOOK_OUTLINE = 'M4.5 18.5v-14A2.5 2.5 0 017 2h12a1 1 0 011 1v13H7a2.5 2.5 0 000 5h13M18.7 16v5';
50
+ // cover running on under the notch. The front cover is 12.2 high (3.5 → 15.7, 20% lower than it
51
+ // was) and the block of pages 50% thicker (3.15, it was 2.1), the book centred in the box. The
52
+ // cover carries one line of title, in the accent colour when filled, in its upper third (a quarter
53
+ // of the way down; it was halfway); NtdBookBookmark adds a ribbon there and keeps the title
54
+ // halfway, below it.
55
+ const BOOK_SILHOUETTE = 'M7 3.5h12a1 1 0 011 1v11.2h-.9v3.15H20v.65a1 1 0 01-1 1H7a2.5 2.5 0 01-2.5-2.5V6A2.5 2.5 0 017 3.5z';
56
+ const BOOK_PAGES = 'M6.6 15.7h11.4v3.15H6.6a1.575 1.575 0 010-3.15z';
57
+ const BOOK_RIBBON = 'M9.5 3.5V8l1.75-1.3L13 8V3.5z';
58
+ const BOOK_TITLE = 'M9.5 6.75h6.5';
59
+ /** The title below NtdBookBookmark's ribbon. */
60
+ const BOOK_TITLE_LOW = 'M9.5 10h6.5';
61
+ const BOOK_OUTLINE = 'M4.5 17.5V6A2.5 2.5 0 017 3.5h12a1 1 0 011 1v10H7.5a3 3 0 000 6H20M18.7 14.5v6';
56
62
  /** The inside of the outline, for duotone's fill under it. */
57
- const BOOK_OUTLINE_FILL = 'M7 2h12a1 1 0 011 1v13h-1.3v5H7a2.5 2.5 0 01-2.5-2.5v-14A2.5 2.5 0 017 2z';
63
+ const BOOK_OUTLINE_FILL = 'M7 3.5h12a1 1 0 011 1v10h-1.3v6H7.5a3 3 0 01-3-3V6A2.5 2.5 0 017 3.5z';
58
64
  /** The book, with the ribbon bookmark or without it. */
59
65
  function bookIcon(displayName, ribbon) {
66
+ const title = ribbon ? BOOK_TITLE_LOW : BOOK_TITLE;
60
67
  return createIcon({
61
68
  displayName,
62
69
  paths: {
63
- solid: ({ primaryColor, accentColor, accentOpacity }) => (jsxs(Fragment, { children: [jsx("path", { d: BOOK_SILHOUETTE, fill: primaryColor }), jsxs("g", { fill: accentColor, opacity: accentOpacity, children: [jsx("path", { d: BOOK_PAGES }), ribbon && jsx("path", { d: BOOK_RIBBON })] })] })),
64
- outline: ({ primaryColor, strokeWidth }) => (jsxs(Fragment, { children: [jsx("path", { d: BOOK_OUTLINE, stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), ribbon && (jsx("path", { d: "M9.5 2.5v6l1.75-1.3L13 8.5v-6", stroke: primaryColor, strokeWidth: strokeWidth * 0.75, fill: "none" }))] })),
65
- duotone: ({ primaryColor, secondaryColor, secondaryOpacity, strokeWidth }) => (jsxs(Fragment, { children: [jsx("path", { d: BOOK_OUTLINE_FILL, fill: secondaryColor, opacity: secondaryOpacity }), jsx("path", { d: BOOK_OUTLINE, stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), ribbon && jsx("path", { d: BOOK_RIBBON, fill: primaryColor })] })),
66
- vivid: ({ primaryColor, secondaryColor, accentColor, accentOpacity }) => (jsxs(Fragment, { children: [jsx("path", { d: BOOK_SILHOUETTE, fill: primaryColor }), jsx("path", { d: BOOK_PAGES, fill: accentColor, opacity: accentOpacity }), ribbon && jsx("path", { d: BOOK_RIBBON, fill: secondaryColor })] })),
70
+ solid: ({ primaryColor, accentColor, accentOpacity }) => (jsxs(Fragment, { children: [jsx("path", { d: BOOK_SILHOUETTE, fill: primaryColor }), jsxs("g", { fill: accentColor, opacity: accentOpacity, children: [jsx("path", { d: BOOK_PAGES }), ribbon && jsx("path", { d: BOOK_RIBBON }), jsx("path", { d: title, stroke: accentColor, strokeWidth: "1.5", fill: "none" })] })] })),
71
+ outline: ({ primaryColor, strokeWidth }) => (jsxs(Fragment, { children: [jsx("path", { d: `${BOOK_OUTLINE}${title}`, stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), ribbon && (jsx("path", { d: "M9.5 4v4l1.75-1.3L13 8V4", stroke: primaryColor, strokeWidth: strokeWidth * 0.75, fill: "none" }))] })),
72
+ duotone: ({ primaryColor, secondaryColor, secondaryOpacity, strokeWidth }) => (jsxs(Fragment, { children: [jsx("path", { d: BOOK_OUTLINE_FILL, fill: secondaryColor, opacity: secondaryOpacity }), jsx("path", { d: `${BOOK_OUTLINE}${title}`, stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), ribbon && jsx("path", { d: BOOK_RIBBON, fill: primaryColor })] })),
73
+ vivid: ({ primaryColor, secondaryColor, accentColor, accentOpacity }) => (jsxs(Fragment, { children: [jsx("path", { d: BOOK_SILHOUETTE, fill: primaryColor }), jsxs("g", { fill: accentColor, opacity: accentOpacity, children: [jsx("path", { d: BOOK_PAGES }), jsx("path", { d: title, stroke: accentColor, strokeWidth: "1.5", fill: "none" })] }), ribbon && jsx("path", { d: BOOK_RIBBON, fill: secondaryColor })] })),
67
74
  },
68
75
  });
69
76
  }
@@ -1,6 +1,6 @@
1
- import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
1
+ import { jsx, Fragment, jsxs } from 'react/jsx-runtime';
2
2
  import { createIcon } from '../createIcon.js';
3
- import { paperIcon, within } from '../iconParts.js';
3
+ import { within, paperIcon } from '../iconParts.js';
4
4
 
5
5
  // NtdFile is the page every paper icon is drawn on (`paperIcon` in iconParts.tsx): the fold is
6
6
  // 8 now (7 before — the duotone's stroked fold looked the largest), secondary when the page is
@@ -189,19 +189,25 @@ const NtdSmartphone = /* @__PURE__ */ createIcon({
189
189
  });
190
190
  // NtdMonitor: the neck and the base are twice the stroke width in every variant but `outline`, and
191
191
  // the base is 30% wider — 13 across with its caps (it was 10); it sits at 21.5 so the heavier line
192
- // stays in the box. Vivid: the stand secondary (it had a fixed #3B82F6 neck).
192
+ // stays in the box. Vivid: the stand secondary (it had a fixed #3B82F6 neck). The stand is clipped
193
+ // to below the screen's bottom edge: the neck's round cap reached up over the screen, which showed
194
+ // through duotone's see-through screen.
193
195
  const MONITOR_SCREEN = { x: 2, y: 3, width: 20, height: 14, rx: 2 };
194
196
  /** Neck and base for a line twice the stroke width: base 9 long + 2 × 2 of cap = 13. */
195
197
  const MONITOR_STAND = 'M12 17v4.5M7.5 21.5h9';
196
198
  /** The outline's neck and base, at the stroke width: base 11 long + 2 × 1 of cap = 13. */
197
199
  const MONITOR_STAND_LINE = 'M12 17v4M6.5 21h11';
200
+ /** The stand, drawn only below the screen's bottom edge (y 17). */
201
+ function monitorStand(uid, d, color, width) {
202
+ return within(uid, 'stand', jsx("rect", { x: "0", y: "17", width: "24", height: "7" }), jsx("path", { d: d, stroke: color, strokeWidth: width }));
203
+ }
198
204
  const NtdMonitor = /* @__PURE__ */ createIcon({
199
205
  displayName: 'NtdMonitor',
200
206
  paths: {
201
- solid: ({ primaryColor, strokeWidth }) => (jsxs(Fragment, { children: [jsx("rect", { ...MONITOR_SCREEN, fill: primaryColor }), jsx("path", { d: MONITOR_STAND, stroke: primaryColor, strokeWidth: strokeWidth * 2 })] })),
202
- outline: ({ primaryColor, strokeWidth }) => (jsxs(Fragment, { children: [jsx("rect", { ...MONITOR_SCREEN, stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsx("path", { d: MONITOR_STAND_LINE, stroke: primaryColor, strokeWidth: strokeWidth })] })),
203
- duotone: ({ primaryColor, secondaryColor, secondaryOpacity, strokeWidth }) => (jsxs(Fragment, { children: [jsx("rect", { ...MONITOR_SCREEN, fill: secondaryColor, opacity: secondaryOpacity }), jsx("rect", { ...MONITOR_SCREEN, stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsx("path", { d: MONITOR_STAND, stroke: primaryColor, strokeWidth: strokeWidth * 2 })] })),
204
- vivid: ({ primaryColor, secondaryColor, strokeWidth }) => (jsxs(Fragment, { children: [jsx("rect", { ...MONITOR_SCREEN, fill: primaryColor }), jsx("path", { d: MONITOR_STAND, stroke: secondaryColor, strokeWidth: strokeWidth * 2 })] })),
207
+ solid: ({ primaryColor, strokeWidth, uid }) => (jsxs(Fragment, { children: [jsx("rect", { ...MONITOR_SCREEN, fill: primaryColor }), monitorStand(uid, MONITOR_STAND, primaryColor, strokeWidth * 2)] })),
208
+ outline: ({ primaryColor, strokeWidth, uid }) => (jsxs(Fragment, { children: [jsx("rect", { ...MONITOR_SCREEN, stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), monitorStand(uid, MONITOR_STAND_LINE, primaryColor, strokeWidth)] })),
209
+ duotone: ({ primaryColor, secondaryColor, secondaryOpacity, strokeWidth, uid }) => (jsxs(Fragment, { children: [jsx("rect", { ...MONITOR_SCREEN, fill: secondaryColor, opacity: secondaryOpacity }), jsx("rect", { ...MONITOR_SCREEN, stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), monitorStand(uid, MONITOR_STAND, primaryColor, strokeWidth * 2)] })),
210
+ vivid: ({ primaryColor, secondaryColor, strokeWidth, uid }) => (jsxs(Fragment, { children: [jsx("rect", { ...MONITOR_SCREEN, fill: primaryColor }), monitorStand(uid, MONITOR_STAND, secondaryColor, strokeWidth * 2)] })),
205
211
  },
206
212
  });
207
213
  // NtdCpu: filled, the body and its pins primary and the die in the accent colour (the body was a
@@ -297,12 +303,14 @@ const NtdCreditCard = /* @__PURE__ */ createIcon({
297
303
  vivid: ({ primaryColor, accentColor, accentOpacity, uid }) => (jsxs(Fragment, { children: [jsx("rect", { ...CARD_BODY, fill: primaryColor }), jsx("rect", { ...CARD_BODY, fill: "white", opacity: "0.1" }), within(uid, 'stripe', jsx("rect", { ...CARD_BODY }), jsx("rect", { ...CARD_STRIPE, fill: "black", opacity: "0.35" })), jsx("rect", { ...CARD_SIGNATURE, fill: accentColor, opacity: accentOpacity }), jsx("rect", { ...CARD_CVV, fill: accentColor, opacity: accentOpacity })] })),
298
304
  },
299
305
  });
300
- // NtdPieChart: filled, two sectors of one pie (r 10) pulled 0.7 apart along the small one's
301
- // diagonal — a gap between them. The larger is the three-quarter sector from the centre; it was a
302
- // segment cut off by a chord, which read as an odd shape. The outline keeps its open arc and the
303
- // slice. Duotone, fills only: the larger sector secondary, the slice primary; vivid the other way.
304
- const PIE_REST = 'M11.3 12.7V2.7A10 10 0 1 0 21.3 12.7Z';
305
- const PIE_SLICE = 'M12.7 11.3V1.3A10 10 0 0 1 22.7 11.3Z';
306
+ // NtdPieChart: filled, two sectors of one pie (r 10) pulled 1 apart along the small one's middle
307
+ // — a gap between them. The larger is the three-quarter sector from the centre; it was a segment
308
+ // cut off by a chord, which read as an odd shape. The whole chart is turned 45° clockwise, so the
309
+ // slice points right (it filled the top-right quarter). The outline keeps its open arc and the
310
+ // slice, turned the same way. Duotone, fills only: the larger sector secondary, the slice primary;
311
+ // vivid the other way.
312
+ const PIE_REST = 'M11 12L18.07 4.93A10 10 0 1 0 18.07 19.07Z';
313
+ const PIE_SLICE = 'M13 12L20.07 4.93A10 10 0 0 1 20.07 19.07Z';
306
314
  function pieFilled(rest, slice) {
307
315
  return (jsxs(Fragment, { children: [jsx("path", { d: PIE_REST, fill: rest }), jsx("path", { d: PIE_SLICE, fill: slice })] }));
308
316
  }
@@ -310,7 +318,7 @@ const NtdPieChart = /* @__PURE__ */ createIcon({
310
318
  displayName: 'NtdPieChart',
311
319
  paths: {
312
320
  solid: ({ primaryColor }) => pieFilled(primaryColor, primaryColor),
313
- outline: ({ primaryColor, strokeWidth }) => (jsxs(Fragment, { children: [jsx("path", { d: "M21.21 15.89A10 10 0 118 2.83", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsx("path", { d: "M22 12A10 10 0 0012 2v10h10z", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" })] })),
321
+ outline: ({ primaryColor, strokeWidth }) => (jsxs(Fragment, { children: [jsx("path", { d: "M15.76 21.27A10 10 0 1 1 15.65 2.69", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsx("path", { d: "M19.07 19.07A10 10 0 0 0 19.07 4.93L12 12z", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" })] })),
314
322
  duotone: ({ primaryColor, secondaryColor }) => pieFilled(secondaryColor, primaryColor),
315
323
  vivid: ({ primaryColor, secondaryColor }) => pieFilled(primaryColor, secondaryColor),
316
324
  },
@@ -100,29 +100,45 @@ const NtdEgg = /* @__PURE__ */ createIcon({
100
100
  vivid: ({ primaryColor, secondaryColor: _secondaryColor }) => (jsxs(Fragment, { children: [jsx("ellipse", { cx: "12", cy: "14", rx: "7", ry: "8", fill: primaryColor }), jsx("ellipse", { cx: "12", cy: "14", rx: "7", ry: "8", fill: "white", opacity: "0.1" })] })),
101
101
  },
102
102
  });
103
- // NtdHamburger: even layers of one width — a low domed top bun, a thin wavy band of sauce, the
104
- // patty and the bottom bun — each standing apart. (The top was a tall half circle and the bottom
105
- // bun wider than everything above it.) The bun is plain and the sauce half as tall as before.
106
- const BURGER_TOP = 'M3 9.4C3 6.4 7 4 12 4s9 2.4 9 5.4a1 1 0 01-1 1H4a1 1 0 01-1-1z';
107
- const BURGER_SAUCE = 'M3 12c1.5-.5 3-.5 4.5 0s3 .5 4.5 0 3-.5 4.5 0 3 .5 4.5 0';
108
- const BURGER_PATTY = { x: 2.5, y: 13.6, width: 19, height: 2.9, rx: 1.45 };
109
- const BURGER_BOTTOM = 'M3 17.6h18v1.4a2 2 0 01-2 2H5a2 2 0 01-2-2z';
103
+ // NtdHamburger: three even layers of one width — a low domed top bun, the patty and the bottom bun
104
+ // — each standing apart by the same gap. (The top was a tall half circle and the bottom bun wider
105
+ // than everything above it; the wavy band of sauce between the bun and the patty is gone.)
106
+ // Duotone, fills only: the buns secondary, the patty primary; vivid the patty secondary.
107
+ const BURGER_TOP = 'M3 10C3 6.7 7 4 12 4s9 2.7 9 6a1 1 0 01-1 1H4a1 1 0 01-1-1z';
108
+ const BURGER_PATTY = { x: 2.5, y: 12.3, width: 19, height: 3.4, rx: 1.7 };
109
+ const BURGER_BOTTOM = 'M3 17h18v2a2 2 0 01-2 2H5a2 2 0 01-2-2z';
110
+ function burgerFilled(buns, patty) {
111
+ return (jsxs(Fragment, { children: [jsx("path", { d: BURGER_TOP, fill: buns }), jsx("rect", { ...BURGER_PATTY, fill: patty }), jsx("path", { d: BURGER_BOTTOM, fill: buns })] }));
112
+ }
110
113
  const NtdHamburger = /* @__PURE__ */ createIcon({
111
114
  displayName: 'NtdHamburger',
112
115
  paths: {
113
- solid: ({ primaryColor, secondaryColor }) => (jsxs(Fragment, { children: [jsx("path", { d: BURGER_TOP, fill: primaryColor }), jsx("path", { d: BURGER_SAUCE, stroke: secondaryColor, strokeWidth: "1.1", fill: "none" }), jsx("rect", { ...BURGER_PATTY, fill: primaryColor }), jsx("path", { d: BURGER_BOTTOM, fill: primaryColor })] })),
114
- outline: ({ primaryColor, strokeWidth }) => (jsxs(Fragment, { children: [jsx("path", { d: BURGER_TOP, stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsx("path", { d: BURGER_SAUCE, stroke: primaryColor, strokeWidth: strokeWidth * 0.55, fill: "none" }), jsx("rect", { ...BURGER_PATTY, stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsx("path", { d: BURGER_BOTTOM, stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" })] })),
115
- duotone: ({ primaryColor, secondaryColor, secondaryOpacity, strokeWidth }) => (jsxs(Fragment, { children: [jsx("path", { d: BURGER_TOP, fill: secondaryColor, opacity: secondaryOpacity }), jsx("path", { d: BURGER_TOP, stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsx("path", { d: BURGER_SAUCE, stroke: primaryColor, strokeWidth: strokeWidth * 0.55, fill: "none" }), jsx("rect", { ...BURGER_PATTY, fill: primaryColor }), jsx("path", { d: BURGER_BOTTOM, fill: secondaryColor, opacity: secondaryOpacity }), jsx("path", { d: BURGER_BOTTOM, stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" })] })),
116
- vivid: ({ primaryColor, secondaryColor }) => (jsxs(Fragment, { children: [jsx("path", { d: BURGER_TOP, fill: primaryColor }), jsx("path", { d: BURGER_TOP, fill: "white", opacity: "0.12" }), jsx("path", { d: BURGER_SAUCE, stroke: secondaryColor, strokeWidth: "1.1", fill: "none" }), jsx("rect", { ...BURGER_PATTY, fill: primaryColor }), jsx("rect", { ...BURGER_PATTY, fill: "black", opacity: "0.2" }), jsx("path", { d: BURGER_BOTTOM, fill: primaryColor })] })),
116
+ solid: ({ primaryColor }) => burgerFilled(primaryColor, primaryColor),
117
+ outline: ({ primaryColor, strokeWidth }) => (jsxs(Fragment, { children: [jsx("path", { d: BURGER_TOP, stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsx("rect", { ...BURGER_PATTY, stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsx("path", { d: BURGER_BOTTOM, stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" })] })),
118
+ duotone: ({ primaryColor, secondaryColor }) => burgerFilled(secondaryColor, primaryColor),
119
+ vivid: ({ primaryColor, secondaryColor }) => burgerFilled(primaryColor, secondaryColor),
117
120
  },
118
121
  });
122
+ // NtdDna: a double helix inside the box (the strands ran out of it, down to y 26) — two strands,
123
+ // x = 12 ± 6·cos(π(y − 2)/10), crossing at y 7 and 17, apart at the ends and in the middle; eight
124
+ // base pairs (it had three of odd lengths), two units apart and none near a crossing, each running
125
+ // exactly from strand to strand. Line glyph: the strands twice the stroke width in every variant
126
+ // but `outline`, the pairs at the stroke width, drawn under the strands so their ends hide in them.
127
+ const DNA_STRAND_A = 'M18 2C18 3.67 15.14 5.33 12 7S6 10.33 6 12S8.86 15.33 12 17S18 20.33 18 22';
128
+ const DNA_STRAND_B = 'M6 2C6 3.67 8.86 5.33 12 7S18 10.33 18 12S15.14 15.33 12 17S6 20.33 6 22';
129
+ const DNA_PAIRS = 'M6.29 3h11.42M8.47 5h7.06M8.47 9h7.06M6.29 11h11.42M6.29 13h11.42M8.47 15h7.06M8.47 19h7.06M6.29 21h11.42';
130
+ function dnaHelix(strandA, strandB, pairs, strand, pair) {
131
+ return (jsxs(Fragment, { children: [jsx("path", { d: DNA_PAIRS, stroke: pairs, strokeWidth: pair }), jsx("path", { d: DNA_STRAND_B, stroke: strandB, strokeWidth: strand, fill: "none" }), jsx("path", { d: DNA_STRAND_A, stroke: strandA, strokeWidth: strand, fill: "none" })] }));
132
+ }
119
133
  const NtdDna = /* @__PURE__ */ createIcon({
120
134
  displayName: 'NtdDna',
121
135
  paths: {
122
- solid: ({ primaryColor, secondaryColor, strokeWidth }) => (jsxs(Fragment, { children: [jsx("path", { d: "M6 2c0 5 12 7 12 12s-12 7-12 12", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsx("path", { d: "M18 2c0 5-12 7-12 12s12 7 12 12", stroke: secondaryColor, strokeWidth: strokeWidth, fill: "none", opacity: 0.6 }), jsx("line", { x1: "7", y1: "7", x2: "17", y2: "7", stroke: primaryColor, strokeWidth: "1.5" }), jsx("line", { x1: "7", y1: "17", x2: "17", y2: "17", stroke: primaryColor, strokeWidth: "1.5" }), jsx("line", { x1: "6", y1: "12", x2: "18", y2: "12", stroke: primaryColor, strokeWidth: "1.5" })] })),
123
- outline: ({ primaryColor, strokeWidth }) => (jsxs(Fragment, { children: [jsx("path", { d: "M6 2c0 5 12 7 12 12s-12 7-12 12", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsx("path", { d: "M18 2c0 5-12 7-12 12s12 7 12 12", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsx("line", { x1: "7", y1: "7", x2: "17", y2: "7", stroke: primaryColor, strokeWidth: "1.5" }), jsx("line", { x1: "7", y1: "17", x2: "17", y2: "17", stroke: primaryColor, strokeWidth: "1.5" })] })),
124
- duotone: ({ primaryColor, secondaryColor, secondaryOpacity, strokeWidth }) => (jsxs(Fragment, { children: [jsx("path", { d: "M18 2c0 5-12 7-12 12s12 7 12 12", stroke: secondaryColor, strokeWidth: strokeWidth, fill: "none", opacity: secondaryOpacity + 0.2 }), jsx("path", { d: "M6 2c0 5 12 7 12 12s-12 7-12 12", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsx("line", { x1: "7", y1: "7", x2: "17", y2: "7", stroke: primaryColor, strokeWidth: "1.5" }), jsx("line", { x1: "7", y1: "17", x2: "17", y2: "17", stroke: primaryColor, strokeWidth: "1.5" })] })),
125
- vivid: ({ primaryColor, secondaryColor }) => (jsxs(Fragment, { children: [jsx("path", { d: "M6 2c0 5 12 7 12 12s-12 7-12 12", stroke: primaryColor, strokeWidth: "2", fill: "none" }), jsx("path", { d: "M18 2c0 5-12 7-12 12s12 7 12 12", stroke: secondaryColor, strokeWidth: "1.8", fill: "none" }), jsx("line", { x1: "7", y1: "7", x2: "17", y2: "7", stroke: "#EF4444", strokeWidth: "1.5" }), jsx("line", { x1: "7", y1: "17", x2: "17", y2: "17", stroke: secondaryColor, strokeWidth: "1.5" }), jsx("line", { x1: "6", y1: "12", x2: "18", y2: "12", stroke: secondaryColor, strokeWidth: "1.5" })] })),
136
+ solid: ({ primaryColor, strokeWidth }) => dnaHelix(primaryColor, primaryColor, primaryColor, strokeWidth * 2, strokeWidth),
137
+ outline: ({ primaryColor, strokeWidth }) => dnaHelix(primaryColor, primaryColor, primaryColor, strokeWidth, strokeWidth),
138
+ // the strands primary, the pairs secondary
139
+ duotone: ({ primaryColor, secondaryColor, strokeWidth }) => dnaHelix(primaryColor, primaryColor, secondaryColor, strokeWidth * 2, strokeWidth),
140
+ // one strand primary, the other and the pairs secondary
141
+ vivid: ({ primaryColor, secondaryColor, strokeWidth }) => dnaHelix(primaryColor, secondaryColor, secondaryColor, strokeWidth * 2, strokeWidth),
126
142
  },
127
143
  });
128
144
 
@@ -1,4 +1,4 @@
1
- import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
1
+ import { jsx, Fragment, jsxs } from 'react/jsx-runtime';
2
2
  import { createIcon } from '../createIcon.js';
3
3
  import { within } from '../iconParts.js';
4
4
 
@@ -44,15 +44,15 @@ const NtdCar = /* @__PURE__ */ createIcon({
44
44
  // NtdBus: seen from the front — the body with a big windscreen (its top frame 1.75, 30% less than
45
45
  // the side view's), the driver (NtdUser's head and shoulders) in it on the left, two headlights and
46
46
  // a bumper line below it, and the wheels as rectangles under the body (round side-view wheels
47
- // read oddly). Filled, the windscreen, the headlights and the bumper are in the accent colour and
48
- // the driver primary.
47
+ // read oddly), showing 2 below it — low-floor (they showed 3). Filled, the windscreen, the
48
+ // headlights and the bumper are in the accent colour and the driver primary.
49
49
  const BUS_BODY = { x: 3, y: 2, width: 18, height: 17, rx: 2.5 };
50
50
  const BUS_WINDOW = { x: 4.75, y: 3.75, width: 14.5, height: 7.5, rx: 1 };
51
51
  /** The driver, cut off by the windscreen's bottom edge. */
52
52
  const BUS_DRIVER = 'M8.4 5.3a1.6 1.6 0 110 3.2 1.6 1.6 0 110-3.2zM5.6 11.5v-.1a2.3 2.3 0 012.3-2.3h1a2.3 2.3 0 012.3 2.3v.1z';
53
53
  const BUS_LIGHTS = 'M6.6 13.7a1.3 1.3 0 110 2.6 1.3 1.3 0 110-2.6zM17.4 13.7a1.3 1.3 0 110 2.6 1.3 1.3 0 110-2.6z';
54
54
  const BUS_BUMPER = 'M3 17.4h18';
55
- const BUS_WHEELS = 'M5.5 18h3v3a1 1 0 01-1 1h-1a1 1 0 01-1-1zM15.5 18h3v3a1 1 0 01-1 1h-1a1 1 0 01-1-1z';
55
+ const BUS_WHEELS = 'M5.5 18h3v2a1 1 0 01-1 1h-1a1 1 0 01-1-1zM15.5 18h3v2a1 1 0 01-1 1h-1a1 1 0 01-1-1z';
56
56
  function busFilled({ primaryColor, uid }, glass, details, detailOpacity) {
57
57
  return (jsxs(Fragment, { children: [jsx("path", { d: BUS_WHEELS, fill: primaryColor }), jsx("rect", { ...BUS_BODY, fill: primaryColor }), jsxs("g", { opacity: detailOpacity, children: [jsx("path", { d: BUS_LIGHTS, fill: details }), within(uid, 'body', jsx("rect", { ...BUS_BODY }), jsx("path", { d: BUS_BUMPER, stroke: details, strokeWidth: "1.2" }))] }), jsx("rect", { ...BUS_WINDOW, fill: glass }), within(uid, 'window', jsx("rect", { ...BUS_WINDOW }), jsx("path", { d: BUS_DRIVER, fill: primaryColor }))] }));
58
58
  }
@@ -60,7 +60,7 @@ const NtdBus = /* @__PURE__ */ createIcon({
60
60
  displayName: 'NtdBus',
61
61
  paths: {
62
62
  solid: (props) => busFilled(props, props.accentColor, props.accentColor, props.accentOpacity),
63
- outline: ({ primaryColor, strokeWidth, uid }) => (jsxs(Fragment, { children: [jsx("rect", { ...BUS_BODY, stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsx("rect", { ...BUS_WINDOW, stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), within(uid, 'window', jsx("rect", { ...BUS_WINDOW }), jsx("path", { d: BUS_DRIVER, fill: primaryColor })), jsx("path", { d: "M6.6 14a1 1 0 110 2 1 1 0 110-2zM17.4 14a1 1 0 110 2 1 1 0 110-2z", fill: primaryColor }), jsx("path", { d: "M6 19v2a1 1 0 001 1h1a1 1 0 001-1v-2M15 19v2a1 1 0 001 1h1a1 1 0 001-1v-2", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" })] })),
63
+ outline: ({ primaryColor, strokeWidth, uid }) => (jsxs(Fragment, { children: [jsx("rect", { ...BUS_BODY, stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsx("rect", { ...BUS_WINDOW, stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), within(uid, 'window', jsx("rect", { ...BUS_WINDOW }), jsx("path", { d: BUS_DRIVER, fill: primaryColor })), jsx("path", { d: "M6.6 14a1 1 0 110 2 1 1 0 110-2zM17.4 14a1 1 0 110 2 1 1 0 110-2z", fill: primaryColor }), jsx("path", { d: "M6 19v1a1 1 0 001 1h1a1 1 0 001-1v-1M15 19v1a1 1 0 001 1h1a1 1 0 001-1v-1", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" })] })),
64
64
  // fills only: the body and the driver primary, the windscreen and the details secondary
65
65
  duotone: (props) => busFilled(props, props.secondaryColor, props.secondaryColor, 1),
66
66
  vivid: (props) => busFilled(props, props.secondaryColor, props.accentColor, props.accentOpacity),
@@ -34,9 +34,9 @@ const NtdUser = /* @__PURE__ */ createIcon({
34
34
  });
35
35
  // NtdAdmin: NtdUser in a tie — the same head and shoulders, a knot at the collar and a blade that
36
36
  // runs down the chest to the bottom edge, cut off there (a whole short tie with its tip read
37
- // comic).
37
+ // comic). The tie is twice as wide as it was, knot and blade: 5.2 at the collar, 6.8 at the edge.
38
38
  const ADMIN_BODY = 'M20.8 21.9v-2.2a4.4 4.4 0 00-4.4-4.4H7.6a4.4 4.4 0 00-4.4 4.4v2.2';
39
- const ADMIN_TIE = 'M10.7 15.3h2.6l-.65 1.8 1.05 4.8h-3.4l1.05-4.8z';
39
+ const ADMIN_TIE = 'M9.4 15.3h5.2l-1.3 1.8 2.1 4.8H8.6l2.1-4.8z';
40
40
  const NtdAdmin = /* @__PURE__ */ createIcon({
41
41
  displayName: 'NtdAdmin',
42
42
  paths: {
@@ -214,13 +214,14 @@ const NtdCalendar = /* @__PURE__ */ createIcon({
214
214
  vivid: calendarFilled,
215
215
  },
216
216
  });
217
+ // NtdTag: the hole sits on the tag's axis close to the point (5.5, 5.5; it was 7, 7).
217
218
  const NtdTag = /* @__PURE__ */ createIcon({
218
219
  displayName: 'NtdTag',
219
220
  paths: {
220
- solid: ({ primaryColor, accentColor, accentOpacity, strokeWidth: _strokeWidth }) => (jsxs(Fragment, { children: [jsx("path", { d: "M20.59 13.41l-7.17 7.17a2 2 0 01-2.83 0L2 12V2h10l8.59 8.59a2 2 0 010 2.82z", fill: primaryColor }), jsx("circle", { cx: "7", cy: "7", r: "1.5", fill: accentColor, opacity: accentOpacity })] })),
221
- outline: ({ primaryColor, strokeWidth }) => (jsxs(Fragment, { children: [jsx("path", { d: "M20.59 13.41l-7.17 7.17a2 2 0 01-2.83 0L2 12V2h10l8.59 8.59a2 2 0 010 2.82z", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsx("circle", { cx: "7", cy: "7", r: "1", fill: primaryColor })] })),
222
- duotone: ({ primaryColor, secondaryColor, secondaryOpacity, strokeWidth }) => (jsxs(Fragment, { children: [jsx("path", { d: "M20.59 13.41l-7.17 7.17a2 2 0 01-2.83 0L2 12V2h10l8.59 8.59a2 2 0 010 2.82z", fill: secondaryColor, opacity: secondaryOpacity }), jsx("path", { d: "M20.59 13.41l-7.17 7.17a2 2 0 01-2.83 0L2 12V2h10l8.59 8.59a2 2 0 010 2.82z", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsx("circle", { cx: "7", cy: "7", r: "1.5", fill: primaryColor })] })),
223
- vivid: ({ primaryColor, secondaryColor }) => (jsxs(Fragment, { children: [jsx("path", { d: "M20.59 13.41l-7.17 7.17a2 2 0 01-2.83 0L2 12V2h10l8.59 8.59a2 2 0 010 2.82z", fill: primaryColor }), jsx("path", { d: "M20.59 13.41l-7.17 7.17a2 2 0 01-2.83 0L2 12V2h10l8.59 8.59a2 2 0 010 2.82z", fill: "white", opacity: "0.08" }), jsx("circle", { cx: "7", cy: "7", r: "1.5", fill: secondaryColor })] })),
221
+ solid: ({ primaryColor, accentColor, accentOpacity, strokeWidth: _strokeWidth }) => (jsxs(Fragment, { children: [jsx("path", { d: "M20.59 13.41l-7.17 7.17a2 2 0 01-2.83 0L2 12V2h10l8.59 8.59a2 2 0 010 2.82z", fill: primaryColor }), jsx("circle", { cx: "5.5", cy: "5.5", r: "1.5", fill: accentColor, opacity: accentOpacity })] })),
222
+ outline: ({ primaryColor, strokeWidth }) => (jsxs(Fragment, { children: [jsx("path", { d: "M20.59 13.41l-7.17 7.17a2 2 0 01-2.83 0L2 12V2h10l8.59 8.59a2 2 0 010 2.82z", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsx("circle", { cx: "5.5", cy: "5.5", r: "1", fill: primaryColor })] })),
223
+ duotone: ({ primaryColor, secondaryColor, secondaryOpacity, strokeWidth }) => (jsxs(Fragment, { children: [jsx("path", { d: "M20.59 13.41l-7.17 7.17a2 2 0 01-2.83 0L2 12V2h10l8.59 8.59a2 2 0 010 2.82z", fill: secondaryColor, opacity: secondaryOpacity }), jsx("path", { d: "M20.59 13.41l-7.17 7.17a2 2 0 01-2.83 0L2 12V2h10l8.59 8.59a2 2 0 010 2.82z", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsx("circle", { cx: "5.5", cy: "5.5", r: "1.5", fill: primaryColor })] })),
224
+ vivid: ({ primaryColor, secondaryColor }) => (jsxs(Fragment, { children: [jsx("path", { d: "M20.59 13.41l-7.17 7.17a2 2 0 01-2.83 0L2 12V2h10l8.59 8.59a2 2 0 010 2.82z", fill: primaryColor }), jsx("path", { d: "M20.59 13.41l-7.17 7.17a2 2 0 01-2.83 0L2 12V2h10l8.59 8.59a2 2 0 010 2.82z", fill: "white", opacity: "0.08" }), jsx("circle", { cx: "5.5", cy: "5.5", r: "1.5", fill: secondaryColor })] })),
224
225
  },
225
226
  });
226
227
  /** The backspace key: a key shape pointing left with a cross inside (delete the last character). */