@nice2dev/icons 1.3.3 → 1.3.5

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 (60) hide show
  1. package/CHANGELOG.md +75 -0
  2. package/README.md +43 -4
  3. package/dist/cjs/NiceIconStacker.js +120 -0
  4. package/dist/cjs/client.js +3 -0
  5. package/dist/cjs/createIcon.js +25 -4
  6. package/dist/cjs/figmaExport.js +1 -0
  7. package/dist/cjs/iconParts.js +6 -5
  8. package/dist/cjs/icons/actions.js +36 -7
  9. package/dist/cjs/icons/ai.js +3 -0
  10. package/dist/cjs/icons/business.js +8 -7
  11. package/dist/cjs/icons/education.js +18 -14
  12. package/dist/cjs/icons/files.js +34 -15
  13. package/dist/cjs/icons/index.js +3 -2
  14. package/dist/cjs/icons/media.js +41 -15
  15. package/dist/cjs/icons/navigation.js +8 -6
  16. package/dist/cjs/icons/realestate.js +5 -2
  17. package/dist/cjs/icons/shapes.js +18 -14
  18. package/dist/cjs/icons/sustainability.js +2 -11
  19. package/dist/cjs/icons/travel.js +15 -14
  20. package/dist/cjs/icons/ui.js +47 -6
  21. package/dist/cjs/icons/weather.js +3 -0
  22. package/dist/cjs/index.js +6 -2
  23. package/dist/cjs/nicetodev-icons.css +1 -1
  24. package/dist/cjs/stacking.js +100 -0
  25. package/dist/esm/NiceIconStacker.js +117 -0
  26. package/dist/esm/client.js +1 -0
  27. package/dist/esm/createIcon.js +26 -5
  28. package/dist/esm/figmaExport.js +1 -0
  29. package/dist/esm/iconParts.js +6 -5
  30. package/dist/esm/icons/actions.js +36 -7
  31. package/dist/esm/icons/ai.js +3 -1
  32. package/dist/esm/icons/business.js +9 -8
  33. package/dist/esm/icons/education.js +18 -14
  34. package/dist/esm/icons/files.js +34 -15
  35. package/dist/esm/icons/index.js +5 -5
  36. package/dist/esm/icons/media.js +41 -15
  37. package/dist/esm/icons/navigation.js +8 -6
  38. package/dist/esm/icons/realestate.js +5 -2
  39. package/dist/esm/icons/shapes.js +19 -14
  40. package/dist/esm/icons/sustainability.js +2 -10
  41. package/dist/esm/icons/travel.js +15 -14
  42. package/dist/esm/icons/ui.js +47 -7
  43. package/dist/esm/icons/weather.js +3 -1
  44. package/dist/esm/index.js +6 -5
  45. package/dist/esm/nicetodev-icons.css +1 -1
  46. package/dist/esm/stacking.js +92 -0
  47. package/dist/types/NiceIconStacker.d.ts +50 -0
  48. package/dist/types/client.d.ts +2 -0
  49. package/dist/types/createIcon.d.ts +5 -0
  50. package/dist/types/iconParts.d.ts +2 -1
  51. package/dist/types/icons/ai.d.ts +2 -0
  52. package/dist/types/icons/index.d.ts +5 -5
  53. package/dist/types/icons/shapes.d.ts +0 -1
  54. package/dist/types/icons/sustainability.d.ts +0 -1
  55. package/dist/types/icons/ui.d.ts +1 -0
  56. package/dist/types/icons/weather.d.ts +2 -0
  57. package/dist/types/index.d.ts +3 -1
  58. package/dist/types/stacking.d.ts +41 -0
  59. package/dist/types/types.d.ts +31 -3
  60. package/package.json +2 -2
@@ -102,22 +102,51 @@ const NtdUpload = /* @__PURE__ */ createIcon({
102
102
  vivid: ({ primaryColor, secondaryColor, strokeWidth }) => (jsxs(Fragment, { children: [jsx("path", { d: TRAY, stroke: secondaryColor, strokeWidth: strokeWidth * 2 }), jsx("path", { d: "M17 8l-5-5-5 5M12 5v10", stroke: primaryColor, strokeWidth: strokeWidth * 2 })] })),
103
103
  },
104
104
  });
105
+ // NtdShare: three nodes joined by two links, the links twice the stroke width in every variant but
106
+ // `outline`. Duotone and vivid, fills only: the nodes primary, the links secondary (vivid had a
107
+ // fixed #3B82F6 node and white links that vanished on a light page).
108
+ const SHARE_NODES = 'M18 2a3 3 0 110 6 3 3 0 110-6zM6 9a3 3 0 110 6 3 3 0 110-6zM18 16a3 3 0 110 6 3 3 0 110-6z';
109
+ const SHARE_LINKS = 'M8.59 13.51L15.42 17.49M15.41 6.51L8.59 10.49';
110
+ function shareFilled(nodes, links, strokeWidth) {
111
+ return (jsxs(Fragment, { children: [jsx("path", { d: SHARE_LINKS, stroke: links, strokeWidth: strokeWidth * 2 }), jsx("path", { d: SHARE_NODES, fill: nodes })] }));
112
+ }
105
113
  const NtdShare = /* @__PURE__ */ createIcon({
106
114
  displayName: 'NtdShare',
107
115
  paths: {
108
- solid: ({ primaryColor, strokeWidth }) => (jsxs(Fragment, { children: [jsx("circle", { cx: "18", cy: "5", r: "3", fill: primaryColor }), jsx("circle", { cx: "6", cy: "12", r: "3", fill: primaryColor }), jsx("circle", { cx: "18", cy: "19", r: "3", fill: primaryColor }), jsx("line", { x1: "8.59", y1: "13.51", x2: "15.42", y2: "17.49", stroke: primaryColor, strokeWidth: strokeWidth }), jsx("line", { x1: "15.41", y1: "6.51", x2: "8.59", y2: "10.49", stroke: primaryColor, strokeWidth: strokeWidth })] })),
116
+ solid: ({ primaryColor, strokeWidth }) => shareFilled(primaryColor, primaryColor, strokeWidth),
109
117
  outline: ({ primaryColor, strokeWidth }) => (jsxs(Fragment, { children: [jsx("circle", { cx: "18", cy: "5", r: "2.5", stroke: primaryColor, strokeWidth: strokeWidth * 0.75, fill: "none" }), jsx("circle", { cx: "6", cy: "12", r: "2.5", stroke: primaryColor, strokeWidth: strokeWidth * 0.75, fill: "none" }), jsx("circle", { cx: "18", cy: "19", r: "2.5", stroke: primaryColor, strokeWidth: strokeWidth * 0.75, fill: "none" }), jsx("line", { x1: "8.59", y1: "13.51", x2: "15.42", y2: "17.49", stroke: primaryColor, strokeWidth: strokeWidth * 0.75 }), jsx("line", { x1: "15.41", y1: "6.51", x2: "8.59", y2: "10.49", stroke: primaryColor, strokeWidth: strokeWidth * 0.75 })] })),
110
- duotone: ({ primaryColor, secondaryColor, secondaryOpacity, strokeWidth }) => (jsxs(Fragment, { children: [jsx("circle", { cx: "18", cy: "5", r: "3", fill: secondaryColor, opacity: secondaryOpacity }), jsx("circle", { cx: "6", cy: "12", r: "3", fill: secondaryColor, opacity: secondaryOpacity }), jsx("circle", { cx: "18", cy: "19", r: "3", fill: secondaryColor, opacity: secondaryOpacity }), jsx("circle", { cx: "18", cy: "5", r: "2.5", stroke: primaryColor, strokeWidth: strokeWidth * 0.75, fill: "none" }), jsx("circle", { cx: "6", cy: "12", r: "2.5", stroke: primaryColor, strokeWidth: strokeWidth * 0.75, fill: "none" }), jsx("circle", { cx: "18", cy: "19", r: "2.5", stroke: primaryColor, strokeWidth: strokeWidth * 0.75, fill: "none" }), jsx("line", { x1: "8.59", y1: "13.51", x2: "15.42", y2: "17.49", stroke: primaryColor, strokeWidth: strokeWidth * 0.75 }), jsx("line", { x1: "15.41", y1: "6.51", x2: "8.59", y2: "10.49", stroke: primaryColor, strokeWidth: strokeWidth * 0.75 })] })),
111
- vivid: ({ primaryColor, secondaryColor }) => (jsxs(Fragment, { children: [jsx("circle", { cx: "18", cy: "5", r: "3", fill: primaryColor }), jsx("circle", { cx: "18", cy: "5", r: "3", fill: "white", opacity: "0.08" }), jsx("circle", { cx: "6", cy: "12", r: "3", fill: secondaryColor }), jsx("circle", { cx: "18", cy: "19", r: "3", fill: "#3B82F6" }), jsx("line", { x1: "8.59", y1: "13.51", x2: "15.42", y2: "17.49", stroke: "white", strokeWidth: "1" }), jsx("line", { x1: "15.41", y1: "6.51", x2: "8.59", y2: "10.49", stroke: "white", strokeWidth: "1" })] })),
118
+ duotone: ({ primaryColor, secondaryColor, strokeWidth }) => shareFilled(primaryColor, secondaryColor, strokeWidth),
119
+ vivid: ({ primaryColor, secondaryColor, strokeWidth }) => shareFilled(primaryColor, secondaryColor, strokeWidth),
112
120
  },
113
121
  });
122
+ // NtdCopy: the front sheet at the top right (it was at the bottom right), the back one showing at
123
+ // the bottom left as a line that stops 1 short of the front — closer than before. The gap is
124
+ // worked out from the stroke width, so it stays the same at any weight; `sharp` draws the back
125
+ // sheet with square corners (the derived one kept their arcs). Duotone, fills only: the back sheet
126
+ // secondary under the primary front one; vivid: the back line secondary.
127
+ const COPY_FRONT = { x: 8.5, y: 3, width: 12.5, height: 12.5, rx: 2.5 };
128
+ const COPY_BACK = { x: 3, y: 8.5, width: 12.5, height: 12.5, rx: 2.5 };
129
+ /** What shows of the back sheet: its edges outside the front one, `gap` short of it. */
130
+ function copyBack(gap, square = false) {
131
+ const top = COPY_FRONT.x - gap;
132
+ const right = COPY_FRONT.y + COPY_FRONT.height + gap;
133
+ return square
134
+ ? `M${top} 8.5H3V21h12.5V${right}`
135
+ : `M${top} 8.5H5.5a2.5 2.5 0 00-2.5 2.5v7.5a2.5 2.5 0 002.5 2.5h7.5a2.5 2.5 0 002.5-2.5V${right}`;
136
+ }
137
+ /** The front sheet filled and the back one as a line 1 short of it (past its round cap). */
138
+ function copyFilled(front, back, strokeWidth, square = false) {
139
+ return (jsxs(Fragment, { children: [jsx("rect", { ...COPY_FRONT, fill: front }), jsx("path", { d: copyBack(1 + strokeWidth / 2, square), stroke: back, strokeWidth: strokeWidth, fill: "none" })] }));
140
+ }
114
141
  const NtdCopy = /* @__PURE__ */ createIcon({
115
142
  displayName: 'NtdCopy',
116
143
  paths: {
117
- solid: ({ primaryColor, strokeWidth }) => (jsxs(Fragment, { children: [jsx("rect", { x: "9", y: "9", width: "12", height: "12", rx: "2.5", fill: primaryColor }), jsx("path", { d: "M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1", stroke: primaryColor, strokeWidth: strokeWidth })] })),
118
- outline: ({ primaryColor, strokeWidth }) => (jsxs(Fragment, { children: [jsx("rect", { x: "9", y: "9", width: "12", height: "12", rx: "2.5", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsx("path", { d: "M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1", stroke: primaryColor, strokeWidth: strokeWidth })] })),
119
- duotone: ({ primaryColor, secondaryColor, secondaryOpacity, strokeWidth }) => (jsxs(Fragment, { children: [jsx("rect", { x: "2", y: "2", width: "13", height: "13", rx: "2.5", fill: secondaryColor, opacity: secondaryOpacity }), jsx("rect", { x: "9", y: "9", width: "12", height: "12", rx: "2.5", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsx("path", { d: "M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1", stroke: primaryColor, strokeWidth: strokeWidth })] })),
120
- vivid: ({ primaryColor, secondaryColor }) => (jsxs(Fragment, { children: [jsx("rect", { x: "9", y: "9", width: "12", height: "12", rx: "2.5", fill: primaryColor }), jsx("rect", { x: "9", y: "9", width: "12", height: "12", rx: "2.5", fill: "white", opacity: "0.1" }), jsx("path", { d: "M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1", stroke: secondaryColor, strokeWidth: "1.8" })] })),
144
+ solid: ({ primaryColor, strokeWidth }) => copyFilled(primaryColor, primaryColor, strokeWidth),
145
+ sharp: ({ primaryColor, strokeWidth }) => copyFilled(primaryColor, primaryColor, strokeWidth, true),
146
+ // both sheets stroked: the back line stops 1 short of the front sheet's line
147
+ outline: ({ primaryColor, strokeWidth }) => (jsxs(Fragment, { children: [jsx("rect", { ...COPY_FRONT, stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsx("path", { d: copyBack(1 + strokeWidth), stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" })] })),
148
+ duotone: ({ primaryColor, secondaryColor }) => (jsxs(Fragment, { children: [jsx("rect", { ...COPY_BACK, fill: secondaryColor }), jsx("rect", { ...COPY_FRONT, fill: primaryColor })] })),
149
+ vivid: ({ primaryColor, secondaryColor, strokeWidth }) => copyFilled(primaryColor, secondaryColor, strokeWidth),
121
150
  },
122
151
  });
123
152
  /** NtdClipboard's two lines of text, high on the board (they sat below its middle). */
@@ -130,6 +130,8 @@ const NtdSparkle = /* @__PURE__ */ createIcon({
130
130
  vivid: ({ primaryColor, secondaryColor: _secondaryColor }) => (jsxs(Fragment, { children: [jsx("path", { d: "M12 2l2.4 7.2L22 12l-7.6 2.8L12 22l-2.4-7.2L2 12l7.6-2.8L12 2z", fill: primaryColor }), jsx("path", { d: "M12 2l2.4 7.2L22 12l-7.6 2.8L12 22l-2.4-7.2L2 12l7.6-2.8L12 2z", fill: "white", opacity: "0.1" })] })),
131
131
  },
132
132
  });
133
+ /** @deprecated The same four-pointed star as {@link NtdSparkle} — use that. */
134
+ const NtdStar4 = NtdSparkle;
133
135
  const NtdMagicWand = /* @__PURE__ */ createIcon({
134
136
  displayName: 'NtdMagicWand',
135
137
  paths: {
@@ -170,4 +172,4 @@ const aiIcons = {
170
172
  NtdPrompt,
171
173
  };
172
174
 
173
- export { NtdBrain, NtdChatbot, NtdDataset, NtdDeepLearning, NtdGradient, NtdInference, NtdMagicWand, NtdModel, NtdNeuralNetwork, NtdPrompt, NtdRobot, NtdSparkle, NtdTensor, NtdTraining, NtdVoiceAssistant, aiIcons };
175
+ export { NtdBrain, NtdChatbot, NtdDataset, NtdDeepLearning, NtdGradient, NtdInference, NtdMagicWand, NtdModel, NtdNeuralNetwork, NtdPrompt, NtdRobot, NtdSparkle, NtdStar4, NtdTensor, NtdTraining, NtdVoiceAssistant, aiIcons };
@@ -1,23 +1,24 @@
1
1
  import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
2
2
  import { createIcon } from '../createIcon.js';
3
- import { paperIcon, within, detailColor } from '../iconParts.js';
3
+ import { paperIcon, within } from '../iconParts.js';
4
4
 
5
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,
7
- // secondary on the filled case (the accent colour in vivid, its third colour).
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.
8
9
  const BRIEFCASE_CASE = { x: 2, y: 7, width: 20, height: 14, rx: 2 };
9
10
  const BRIEFCASE_HANDLE = 'M16 7V5a2 2 0 00-2-2h-4a2 2 0 00-2 2v2';
10
- /** The clasp over the band, hanging down from it, with its slot (even-odd). */
11
+ /** The clasp over the band, hanging down from it. */
11
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';
12
- const BRIEFCASE_SLOT = 'M11.2 13.2h1.6v.9h-1.6z';
13
+ const BRIEFCASE_LOCK = { x: 11.2, y: 12.6, width: 1.6, height: 1.6 };
13
14
  const NtdBriefcase = /* @__PURE__ */ createIcon({
14
15
  displayName: 'NtdBriefcase',
15
16
  paths: {
16
- 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}${BRIEFCASE_SLOT}`, fillRule: "evenodd", fill: detailColor(props) })] })),
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 })] })),
17
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 })] })),
18
19
  // fills only: the case and the handle primary, the band and the clasp secondary
19
- 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}${BRIEFCASE_SLOT}`, fillRule: "evenodd", fill: secondaryColor })] })),
20
- 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}${BRIEFCASE_SLOT}`, fillRule: "evenodd", fill: accentColor, opacity: accentOpacity })] })),
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 })] })),
21
22
  },
22
23
  });
23
24
  // NtdDollar: a line glyph, twice the stroke width in every variant but `outline`; the stem runs
@@ -44,14 +44,17 @@ const NtdUniversity = /* @__PURE__ */ createIcon({
44
44
  LEARNING TOOLS
45
45
  ───────────────────────────────────────────────────────────────────────────── */
46
46
  // NtdBook: a closed book, not a page — the rounded spine on the left, the block of pages showing
47
- // at the bottom between the front cover and the line of the back cover. Down the right edge it is
48
- // cover, then the pages set in 2.5 from that edge (the cover showing beside them), then cover
49
- // again; the outline marks where the pages end with a line. The cover is plain, so another glyph
50
- // can sit on it; NtdBookBookmark adds a ribbon.
51
- const BOOK_SILHOUETTE = 'M7 2h12a1 1 0 011 1v17a1 1 0 01-1 1H7a2.5 2.5 0 01-2.5-2.5v-14A2.5 2.5 0 017 2z';
52
- const BOOK_PAGES = 'M6.6 17.6h10.9v2.3H6.6a1.15 1.15 0 010-2.3z';
47
+ // at the bottom between the front cover and the back cover. Down the right edge it is cover, then
48
+ // a notch cut in 0.9 at the pages, then cover again: beside the pages only a narrow strip of cover
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';
53
54
  const BOOK_RIBBON = 'M9.5 2v6.5l1.75-1.3L13 8.5V2z';
54
- const BOOK_OUTLINE = 'M4.5 18.5v-14A2.5 2.5 0 017 2h12a1 1 0 011 1v17a1 1 0 01-1 1H7a2.5 2.5 0 010-5h13M17.5 16v5';
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';
56
+ /** 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';
55
58
  /** The book, with the ribbon bookmark or without it. */
56
59
  function bookIcon(displayName, ribbon) {
57
60
  return createIcon({
@@ -59,7 +62,7 @@ function bookIcon(displayName, ribbon) {
59
62
  paths: {
60
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 })] })] })),
61
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" }))] })),
62
- duotone: ({ primaryColor, secondaryColor, secondaryOpacity, strokeWidth }) => (jsxs(Fragment, { children: [jsx("path", { d: BOOK_SILHOUETTE, fill: secondaryColor, opacity: secondaryOpacity }), jsx("path", { d: BOOK_OUTLINE, stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), ribbon && jsx("path", { d: BOOK_RIBBON, fill: primaryColor })] })),
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 })] })),
63
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 })] })),
64
67
  },
65
68
  });
@@ -76,12 +79,13 @@ const NtdOpenBook = /* @__PURE__ */ createIcon({
76
79
  },
77
80
  });
78
81
  // NtdNotebook: a cover with short binder rings across its left edge (they stuck out further) and
79
- // three lines of writing — in the accent colour when filled, as the outline draws them. Duotone,
80
- // fills only: the cover primary, the rings and the writing secondary; vivid: the rings secondary,
81
- // the writing in the accent colour.
82
- const NOTEBOOK_COVER = { x: 5, y: 2, width: 15, height: 20, rx: 2 };
83
- const NOTEBOOK_RINGS = 'M3.5 6h3M3.5 10h3M3.5 14h3M3.5 18h3';
84
- const NOTEBOOK_TEXT = 'M9 7h7M9 11h7M9 15h4';
82
+ // three lines of writing — in the accent colour when filled, as the outline draws them. The cover
83
+ // is 16.5 × 19 (it was 15 × 20, tall and slim for an exercise book). Duotone, fills only: the
84
+ // cover primary, the rings and the writing secondary; vivid: the rings secondary, the writing in
85
+ // the accent colour.
86
+ const NOTEBOOK_COVER = { x: 4.5, y: 2.5, width: 16.5, height: 19, rx: 2 };
87
+ const NOTEBOOK_RINGS = 'M3 6h3M3 10h3M3 14h3M3 18h3';
88
+ const NOTEBOOK_TEXT = 'M9 7.5h8.5M9 11.5h8.5M9 15.5h4.5';
85
89
  const NtdNotebook = /* @__PURE__ */ createIcon({
86
90
  displayName: 'NtdNotebook',
87
91
  paths: {
@@ -151,12 +151,12 @@ const NtdGrid = /* @__PURE__ */ createIcon({
151
151
  vivid: ({ primaryColor, secondaryColor }) => (jsxs(Fragment, { children: [jsx("rect", { x: "3", y: "3", width: "7", height: "7", rx: "1.5", fill: primaryColor }), jsx("rect", { x: "3", y: "3", width: "7", height: "7", rx: "1.5", fill: "white", opacity: "0.08" }), jsx("rect", { x: "14", y: "3", width: "7", height: "7", rx: "1.5", fill: secondaryColor }), jsx("rect", { x: "3", y: "14", width: "7", height: "7", rx: "1.5", fill: "#3B82F6" }), jsx("rect", { x: "14", y: "14", width: "7", height: "7", rx: "1.5", fill: "#F59E0B" })] })),
152
152
  },
153
153
  });
154
- // NtdList: in every variant but `outline` the lines are 1.5 × the stroke width and the dots r 2.25
155
- // — half again as heavy as they were; the lines start at 9 to keep clear of the bigger dots.
154
+ // NtdList: in every variant but `outline` the lines are 1.5 × the stroke width and the dots r 1.7
155
+ // (r 2.25 was too big, a quarter smaller); the lines start at 9 to keep clear of the dots.
156
156
  // Duotone and vivid: the lines primary, the dots secondary.
157
157
  const LIST_LINES = 'M9 6h12M9 12h12M9 18h12';
158
158
  function listFilled(lines, dots, strokeWidth) {
159
- return (jsxs(Fragment, { children: [jsx("path", { d: LIST_LINES, stroke: lines, strokeWidth: strokeWidth * 1.5 }), jsxs("g", { fill: dots, children: [jsx("circle", { cx: "3.75", cy: "6", r: "2.25" }), jsx("circle", { cx: "3.75", cy: "12", r: "2.25" }), jsx("circle", { cx: "3.75", cy: "18", r: "2.25" })] })] }));
159
+ return (jsxs(Fragment, { children: [jsx("path", { d: LIST_LINES, stroke: lines, strokeWidth: strokeWidth * 1.5 }), jsxs("g", { fill: dots, children: [jsx("circle", { cx: "3.75", cy: "6", r: "1.7" }), jsx("circle", { cx: "3.75", cy: "12", r: "1.7" }), jsx("circle", { cx: "3.75", cy: "18", r: "1.7" })] })] }));
160
160
  }
161
161
  const NtdList = /* @__PURE__ */ createIcon({
162
162
  displayName: 'NtdList',
@@ -176,22 +176,32 @@ const NtdTable = /* @__PURE__ */ createIcon({
176
176
  vivid: ({ primaryColor, secondaryColor }) => (jsxs(Fragment, { children: [jsx("rect", { x: "3", y: "3", width: "18", height: "18", rx: "2", fill: primaryColor, opacity: "0.15", stroke: primaryColor, strokeWidth: "2" }), jsx("rect", { x: "3", y: "3", width: "18", height: "18", rx: "2", fill: "white", opacity: "0.1" }), jsx("line", { x1: "3", y1: "9", x2: "21", y2: "9", stroke: secondaryColor, strokeWidth: "1.8" }), jsx("line", { x1: "3", y1: "15", x2: "21", y2: "15", stroke: "#3B82F6", strokeWidth: "1.5" }), jsx("line", { x1: "9", y1: "3", x2: "9", y2: "21", stroke: "#3B82F6", strokeWidth: "1.5" })] })),
177
177
  },
178
178
  });
179
+ // NtdSmartphone: filled, the case stays a primary frame round a screen in the accent colour, and
180
+ // the button is a primary dot on the screen — bigger and lower than the accent dot it was.
179
181
  const NtdSmartphone = /* @__PURE__ */ createIcon({
180
182
  displayName: 'NtdSmartphone',
181
183
  paths: {
182
- solid: ({ primaryColor, accentColor, accentOpacity, strokeWidth }) => (jsxs(Fragment, { children: [jsx("rect", { x: "5", y: "2", width: "14", height: "20", rx: "2", fill: primaryColor }), jsx("line", { x1: "12", y1: "18", x2: "12.01", y2: "18", stroke: accentColor, strokeWidth: strokeWidth, opacity: accentOpacity })] })),
184
+ solid: ({ primaryColor, accentColor, accentOpacity }) => (jsxs(Fragment, { children: [jsx("rect", { x: "5", y: "2", width: "14", height: "20", rx: "2", fill: primaryColor }), jsx("rect", { x: "6.5", y: "3.5", width: "11", height: "17", rx: "0.75", fill: accentColor, opacity: accentOpacity }), jsx("circle", { cx: "12", cy: "18.4", r: "1.25", fill: primaryColor })] })),
183
185
  outline: ({ primaryColor, strokeWidth }) => (jsxs(Fragment, { children: [jsx("rect", { x: "5", y: "2", width: "14", height: "20", rx: "2", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsx("line", { x1: "12", y1: "18", x2: "12.01", y2: "18", stroke: primaryColor, strokeWidth: strokeWidth })] })),
184
186
  duotone: ({ primaryColor, secondaryColor, secondaryOpacity, strokeWidth }) => (jsxs(Fragment, { children: [jsx("rect", { x: "5", y: "2", width: "14", height: "20", rx: "2", fill: secondaryColor, opacity: secondaryOpacity }), jsx("rect", { x: "5", y: "2", width: "14", height: "20", rx: "2", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsx("line", { x1: "12", y1: "18", x2: "12.01", y2: "18", stroke: primaryColor, strokeWidth: strokeWidth })] })),
185
187
  vivid: ({ primaryColor, secondaryColor }) => (jsxs(Fragment, { children: [jsx("rect", { x: "5", y: "2", width: "14", height: "20", rx: "2", fill: primaryColor }), jsx("rect", { x: "5", y: "2", width: "14", height: "20", rx: "2", fill: "white", opacity: "0.1" }), jsx("line", { x1: "12", y1: "18", x2: "12.01", y2: "18", stroke: secondaryColor, strokeWidth: "1.8" })] })),
186
188
  },
187
189
  });
190
+ // NtdMonitor: the neck and the base are twice the stroke width in every variant but `outline`, and
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).
193
+ const MONITOR_SCREEN = { x: 2, y: 3, width: 20, height: 14, rx: 2 };
194
+ /** Neck and base for a line twice the stroke width: base 9 long + 2 × 2 of cap = 13. */
195
+ const MONITOR_STAND = 'M12 17v4.5M7.5 21.5h9';
196
+ /** The outline's neck and base, at the stroke width: base 11 long + 2 × 1 of cap = 13. */
197
+ const MONITOR_STAND_LINE = 'M12 17v4M6.5 21h11';
188
198
  const NtdMonitor = /* @__PURE__ */ createIcon({
189
199
  displayName: 'NtdMonitor',
190
200
  paths: {
191
- solid: ({ primaryColor, strokeWidth }) => (jsxs(Fragment, { children: [jsx("rect", { x: "2", y: "3", width: "20", height: "14", rx: "2", fill: primaryColor }), jsx("line", { x1: "8", y1: "21", x2: "16", y2: "21", stroke: primaryColor, strokeWidth: strokeWidth }), jsx("line", { x1: "12", y1: "17", x2: "12", y2: "21", stroke: primaryColor, strokeWidth: strokeWidth })] })),
192
- outline: ({ primaryColor, strokeWidth }) => (jsxs(Fragment, { children: [jsx("rect", { x: "2", y: "3", width: "20", height: "14", rx: "2", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsx("line", { x1: "8", y1: "21", x2: "16", y2: "21", stroke: primaryColor, strokeWidth: strokeWidth }), jsx("line", { x1: "12", y1: "17", x2: "12", y2: "21", stroke: primaryColor, strokeWidth: strokeWidth })] })),
193
- duotone: ({ primaryColor, secondaryColor, secondaryOpacity, strokeWidth }) => (jsxs(Fragment, { children: [jsx("rect", { x: "2", y: "3", width: "20", height: "14", rx: "2", fill: secondaryColor, opacity: secondaryOpacity }), jsx("rect", { x: "2", y: "3", width: "20", height: "14", rx: "2", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsx("line", { x1: "8", y1: "21", x2: "16", y2: "21", stroke: primaryColor, strokeWidth: strokeWidth }), jsx("line", { x1: "12", y1: "17", x2: "12", y2: "21", stroke: primaryColor, strokeWidth: strokeWidth })] })),
194
- vivid: ({ primaryColor, secondaryColor }) => (jsxs(Fragment, { children: [jsx("rect", { x: "2", y: "3", width: "20", height: "14", rx: "2", fill: primaryColor }), jsx("rect", { x: "2", y: "3", width: "20", height: "14", rx: "2", fill: "white", opacity: "0.1" }), jsx("line", { x1: "8", y1: "21", x2: "16", y2: "21", stroke: secondaryColor, strokeWidth: "1.8" }), jsx("line", { x1: "12", y1: "17", x2: "12", y2: "21", stroke: "#3B82F6", strokeWidth: "1.5" })] })),
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 })] })),
195
205
  },
196
206
  });
197
207
  // NtdCpu: filled, the body and its pins primary and the die in the accent colour (the body was a
@@ -228,11 +238,11 @@ const NtdKey = /* @__PURE__ */ createIcon({
228
238
  },
229
239
  });
230
240
  // NtdAward: the ribbon has a secondary inside within its primary edge (it was open, so the page
231
- // showed through), and goes under the medal. The inside is the ribbon inset by 2 — it filled the
232
- // ribbon almost to its edge. Duotone is the same; vivid draws the ribbon's edge in the accent
233
- // colour.
241
+ // showed through), and goes under the medal. The inside is the ribbon inset by 1.5 — between the
242
+ // half stroke it filled to before (too full) and the 2 after (too small). Duotone is the same;
243
+ // vivid draws the ribbon's edge in the accent colour.
234
244
  const AWARD_RIBBON = 'M8.21 13.89L7 23l5-3 5 3-1.21-9.12';
235
- const AWARD_RIBBON_INNER = 'M10.17 14.3L13.83 14.3L14.47 19.15L12 17.67L9.53 19.15z';
245
+ const AWARD_RIBBON_INNER = 'M9.67 14.3L8.9 20.11L12 18.25L15.1 20.11L14.32 14.3z';
236
246
  function awardFilled({ primaryColor, secondaryColor, strokeWidth }, ribbonEdge) {
237
247
  return (jsxs(Fragment, { children: [jsx("path", { d: AWARD_RIBBON, fill: ribbonEdge, stroke: ribbonEdge, strokeWidth: strokeWidth }), jsx("path", { d: AWARD_RIBBON_INNER, fill: secondaryColor }), jsx("circle", { cx: "12", cy: "8", r: "7", fill: primaryColor })] }));
238
248
  }
@@ -287,13 +297,22 @@ const NtdCreditCard = /* @__PURE__ */ createIcon({
287
297
  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 })] })),
288
298
  },
289
299
  });
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
+ function pieFilled(rest, slice) {
307
+ return (jsxs(Fragment, { children: [jsx("path", { d: PIE_REST, fill: rest }), jsx("path", { d: PIE_SLICE, fill: slice })] }));
308
+ }
290
309
  const NtdPieChart = /* @__PURE__ */ createIcon({
291
310
  displayName: 'NtdPieChart',
292
311
  paths: {
293
- solid: ({ primaryColor, secondaryColor: _secondaryColor, secondaryOpacity: _secondaryOpacity, strokeWidth, }) => (jsxs(Fragment, { children: [jsx("path", { d: "M21.21 15.89A10 10 0 118 2.83", fill: primaryColor, opacity: "0.3", stroke: primaryColor, strokeWidth: strokeWidth }), jsx("path", { d: "M22 12A10 10 0 0012 2v10h10z", fill: primaryColor })] })),
312
+ solid: ({ primaryColor }) => pieFilled(primaryColor, primaryColor),
294
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" })] })),
295
- duotone: ({ primaryColor, secondaryColor, secondaryOpacity, strokeWidth }) => (jsxs(Fragment, { children: [jsx("path", { d: "M21.21 15.89A10 10 0 118 2.83", fill: secondaryColor, opacity: secondaryOpacity, stroke: primaryColor, strokeWidth: strokeWidth }), jsx("path", { d: "M22 12A10 10 0 0012 2v10h10z", fill: primaryColor, stroke: primaryColor, strokeWidth: strokeWidth })] })),
296
- vivid: ({ primaryColor, secondaryColor }) => (jsxs(Fragment, { children: [jsx("path", { d: "M21.21 15.89A10 10 0 118 2.83", fill: primaryColor, opacity: "0.3", stroke: primaryColor, strokeWidth: "2" }), jsx("path", { d: "M21.21 15.89A10 10 0 118 2.83", fill: "white", opacity: "0.08" }), jsx("path", { d: "M22 12A10 10 0 0012 2v10h10z", fill: secondaryColor })] })),
314
+ duotone: ({ primaryColor, secondaryColor }) => pieFilled(secondaryColor, primaryColor),
315
+ vivid: ({ primaryColor, secondaryColor }) => pieFilled(primaryColor, secondaryColor),
297
316
  },
298
317
  });
299
318
  const NtdBarChart = /* @__PURE__ */ createIcon({
@@ -1,14 +1,14 @@
1
1
  export { NtdArrowDown, NtdArrowLeft, NtdArrowRight, NtdArrowUp, NtdChevronDown, NtdChevronLeft, NtdChevronRight, NtdChevronUp, NtdClose, NtdExternalLink, NtdMenu, NtdMoreHorizontal, NtdMoreVertical, NtdRefresh } from './navigation.js';
2
2
  export { NtdCheck, NtdClipboard, NtdCopy, NtdDownload, NtdEdit, NtdEditDetail, NtdFilter, NtdGroup, NtdLink, NtdLock, NtdLogIn, NtdLogOut, NtdMinus, NtdPlus, NtdPrint, NtdRedo, NtdReply, NtdSave, NtdSearch, NtdSettings, NtdShare, NtdSort, NtdTrash, NtdUndo, NtdUngroup, NtdUnlock, NtdUpload, NtdZoomIn, NtdZoomOut } from './actions.js';
3
- export { NtdAdmin, NtdBackspace, NtdBell, NtdBookmark, NtdCalendar, NtdClock, NtdCursor, NtdError, NtdEye, NtdEyeOff, NtdFlag, NtdGlobe, NtdHeart, NtdHelp, NtdHome, NtdInfo, NtdMap, NtdMoon, NtdPin, NtdShield, NtdStar, NtdSuccess, NtdSun, NtdTag, NtdThumbDown, NtdThumbUp, NtdUser, NtdUsers, NtdWarning, NtdWireframe } from './ui.js';
4
- export { NtdBiodegradable, NtdCarbonFootprint, NtdCo2, NtdCompost, NtdEcoFriendly, NtdEvCharger, NtdHydropower, NtdNetZero, NtdOrganic, NtdPlantTree, NtdRecycle, NtdSolarPanel, NtdTrashSort, NtdWildlife, NtdWindTurbine, sustainabilityIcons } from './sustainability.js';
3
+ export { NtdAdmin, NtdBackspace, NtdBell, NtdBookmark, NtdCalendar, NtdClock, NtdCursor, NtdError, NtdEye, NtdEyeOff, NtdFlag, NtdGlobe, NtdHeart, NtdHelp, NtdHome, NtdHourglass, NtdInfo, NtdMap, NtdMoon, NtdPin, NtdShield, NtdStar, NtdSuccess, NtdSun, NtdTag, NtdThumbDown, NtdThumbUp, NtdUser, NtdUsers, NtdWarning, NtdWireframe } from './ui.js';
4
+ export { NtdBiodegradable, NtdCarbonFootprint, NtdCo2, NtdCompost, NtdEcoFriendly, NtdEvCharger, NtdNetZero, NtdOrganic, NtdPlantTree, NtdRecycle, NtdSolarPanel, NtdTrashSort, NtdWildlife, NtdWindTurbine, sustainabilityIcons } from './sustainability.js';
5
5
  export { NtdAccessibility, NtdAssistiveTech, NtdAudioDescription, NtdBlind, NtdBraille, NtdClosedCaptions, NtdDeaf, NtdDyslexia, NtdEasyRead, NtdHearingAid, NtdScreenReader, NtdSignLanguage, NtdWheelchair, accessibilityIcons } from './accessibility.js';
6
6
  export { NtdAudit, NtdCcpa, NtdCertified, NtdCompliance, NtdContract, NtdCookieConsent, NtdCopyright, NtdGdpr, NtdLegalDocument, NtdPatent, NtdPrivacyPolicy, NtdTermsOfService, NtdTrademark, legalIcons } from './legal.js';
7
7
  export { NtdBluetooth, NtdBrush, NtdCamera, NtdChat, NtdImage, NtdInbox, NtdMail, NtdMicrophone, NtdMicrophoneOff, NtdMusic, NtdNotification, NtdPalette, NtdPause, NtdPenTool, NtdPhone, NtdPlay, NtdSend, NtdSkipBack, NtdSkipForward, NtdSpline, NtdStop, NtdVideo, NtdVolume, NtdVolumeMute, NtdWifi } from './media.js';
8
8
  export { NtdActivity, NtdArchive, NtdAward, NtdBarChart, NtdCart, NtdCloud, NtdCloudDownload, NtdCloudUpload, NtdCode, NtdCoffee, NtdCpu, NtdCreditCard, NtdDatabase, NtdFile, NtdFileText, NtdFolder, NtdFolderOpen, NtdGit, NtdGrid, NtdKey, NtdLayers, NtdList, NtdMonitor, NtdPackage, NtdPieChart, NtdShoppingCart, NtdSmartphone, NtdTable, NtdTarget, NtdTerminal, NtdTruck } from './files.js';
9
9
  export { NtdCrown, NtdDice, NtdDumpsterFire, NtdGamepadOldschool, NtdGhost, NtdLightning, NtdPartyPopper, NtdPuzzle, NtdRocket, NtdSad, NtdSkull, NtdSmile, NtdSmiley, NtdTrophy, NtdZap } from './fun.js';
10
- export { NtdAnchor, NtdBug, NtdCompass, NtdDroplet, NtdFeather, NtdFire, NtdFlower, NtdLeaf, NtdMountain, NtdRain, NtdSnow, NtdSnowflake, NtdSunrise, NtdSunset, NtdThermometer, NtdThunderstorm, NtdTree, NtdUmbrella, NtdWave, NtdWind } from './weather.js';
11
- export { NtdAngleBisector, NtdArrowDownCircle, NtdArrowLeftCircle, NtdArrowRightCircle, NtdArrowUpCircle, NtdCircle, NtdCornerDownLeft, NtdCornerDownRight, NtdCornerUpLeft, NtdCornerUpRight, NtdCross, NtdDiamond, NtdHexagon, NtdMaximize, NtdMidpoint, NtdMinimize, NtdMove, NtdOctagon, NtdParallel, NtdPentagon, NtdPerpendicular, NtdPoint, NtdRepeat, NtdSegment, NtdShuffle, NtdSquare, NtdStar4, NtdTriangle } from './shapes.js';
10
+ export { NtdAnchor, NtdBug, NtdCompass, NtdDroplet, NtdFeather, NtdFire, NtdFlower, NtdHydropower, NtdLeaf, NtdMountain, NtdRain, NtdSnow, NtdSnowflake, NtdSunrise, NtdSunset, NtdThermometer, NtdThunderstorm, NtdTree, NtdUmbrella, NtdWave, NtdWind } from './weather.js';
11
+ export { NtdAngleBisector, NtdArrowDownCircle, NtdArrowLeftCircle, NtdArrowRightCircle, NtdArrowUpCircle, NtdCircle, NtdCornerDownLeft, NtdCornerDownRight, NtdCornerUpLeft, NtdCornerUpRight, NtdCross, NtdDiamond, NtdHexagon, NtdMaximize, NtdMidpoint, NtdMinimize, NtdMove, NtdOctagon, NtdParallel, NtdPentagon, NtdPerpendicular, NtdPoint, NtdRepeat, NtdSegment, NtdShuffle, NtdSquare, NtdTriangle } from './shapes.js';
12
12
  export { NtdBank, NtdBarcode, NtdBriefcase, NtdCalculator, NtdClipboardCheck, NtdCoins, NtdDollar, NtdInvoice, NtdInvoiceDoc, NtdKanban, NtdMilestone, NtdPercent, NtdPiggyBank, NtdPresentation, NtdReceipt, NtdStore, NtdTrendDown, NtdTrendUp, NtdWallet } from './business.js';
13
13
  export { NtdAtSign, NtdBellRing, NtdBubble, NtdMegaphone, NtdPhoneOff, NtdQrCode, NtdThumbsDown, NtdThumbsUp } from './social.js';
14
14
  export { NtdAIBrain, NtdAstroLogo, NtdBattery, NtdBlueprint, NtdBrackets, NtdBugDev, NtdBunLogo, NtdComponent, NtdDataMesh, NtdDenoLogo, NtdDeploy, NtdFeatureFlag, NtdFlow, NtdForge, NtdGateway, NtdGitBranch, NtdGitCommit, NtdGitMerge, NtdHash, NtdNeural, NtdNextJsLogo, NtdNodes, NtdPipeline, NtdPrototype, NtdQwikLogo, NtdServer, NtdSlash, NtdSolidJsLogo, NtdSvelteLogo, NtdTauriLogo, NtdViteLogo } from './devtech.js';
@@ -19,7 +19,7 @@ export { NtdDoorbell, NtdMotionSensor, NtdRouter, NtdSmartBulb, NtdSmartCamera,
19
19
  export { NtdApple, NtdBandaid, NtdCake, NtdDna, NtdEgg, NtdGlass, NtdHamburger, NtdHeartPulse, NtdPill, NtdPizza, NtdStethoscope, NtdSyringe, NtdWeight } from './health.js';
20
20
  export { NtdNiceToDev, NtdOmniVerk, NtdOmniVerkAnimated, NtdOmniVerkBadge, NtdOmniVerkLogo, NtdOmniVerkSpinner, NtdOmniVerkWatermark } from './brand.js';
21
21
  export { NtdDice as NtdDiceGaming, NtdDiscord, NtdGamepad, NtdGamepadController, NtdHealthBar, NtdJoystick, NtdLeaderboard, NtdPotion, NtdShield as NtdShieldGaming, NtdStar as NtdStarGaming, NtdSword, NtdTrophy as NtdTrophyGaming, NtdTwitch, NtdVrHeadset, NtdXpBar, NtdYoutubeLive, gamingIcons } from './gaming.js';
22
- export { NtdVoiceAssistant as NtdAIAssistant, NtdBrain, NtdChatbot, NtdDataset, NtdDeepLearning, NtdGradient, NtdInference, NtdMagicWand, NtdModel, NtdNeuralNetwork, NtdPrompt, NtdRobot, NtdSparkle, NtdTensor, NtdTraining, aiIcons } from './ai.js';
22
+ export { NtdVoiceAssistant as NtdAIAssistant, NtdBrain, NtdChatbot, NtdDataset, NtdDeepLearning, NtdGradient, NtdInference, NtdMagicWand, NtdModel, NtdNeuralNetwork, NtdPrompt, NtdRobot, NtdSparkle, NtdStar4, NtdTensor, NtdTraining, aiIcons } from './ai.js';
23
23
  export { NtdBackpack, NtdBook, NtdBookBookmark, NtdCalculator as NtdCalculatorEdu, NtdCertificate, NtdDiploma, NtdExam, NtdFlashcard, NtdGraduationCap, NtdNotebook, NtdOnlineCourse, NtdOpenBook, NtdPen, NtdPencil, NtdQuiz, NtdSchool, NtdUniversity, NtdWebinar, educationIcons } from './education.js';
24
24
  export { NtdAtom, NtdBeaker, NtdDna as NtdDnaScience, NtdExperiment, NtdFlask, NtdHypothesis, NtdMagnet, NtdMicroscope, NtdMolecule, NtdPeriodictable, NtdPetriDish, NtdPlanet, NtdResearch, NtdRocket as NtdRocketScience, NtdTelescope, NtdTestTube, scienceIcons } from './science.js';
25
25
  export { NtdApartment, NtdBathroom, NtdBedroom, NtdCondo, NtdFloorPlan, NtdForRent, NtdForSale, NtdGarage, NtdHouse as NtdHouseRealEstate, NtdKey as NtdKeyRealEstate, NtdMortgage, NtdOfficeBuilding, NtdPool, NtdSold, NtdSquareMeters, NtdVilla, NtdWarehouse, realestateIcons } from './realestate.js';
@@ -131,17 +131,30 @@ const NtdMicrophoneOff = /* @__PURE__ */ createIcon({
131
131
  // NtdMusic: the note heads are tilted ellipses whose right edge is the stem's right edge, and the
132
132
  // stems end where that edge is vertical, so stem and head meet without a step (the heads stuck
133
133
  // out right of the stems). The outline heads are the filled ones moved in by half a stroke, so
134
- // their stroke meets the stem the same way.
134
+ // their stroke meets the stem the same way. Every variant but `outline` draws the stems and the
135
+ // beam twice the stroke width; the stems move left by the extra half width, so their right edge
136
+ // stays on the heads' (9.3 and 21.3), and the beam drops half a unit to keep a mitred corner in
137
+ // the box.
135
138
  const MUSIC_STEMS = 'M8.3 17.22V5l12-2v12.22';
139
+ /** The stems and the beam for a line `width` wide; `sharp` stops them half a width higher. */
140
+ function musicStems(width, sharp = false) {
141
+ const left = 9.3 - width / 2;
142
+ const right = 21.3 - width / 2;
143
+ const end = sharp ? width / 2 : 0;
144
+ return `M${left} ${17.22 - end}V5.5L${right} 3.5V${15.22 - end}`;
145
+ }
146
+ function musicFilled(stems, heads, strokeWidth, sharp = false) {
147
+ return (jsxs(Fragment, { children: [jsx("path", { d: musicStems(strokeWidth * 2, sharp), stroke: stems, strokeWidth: strokeWidth * 2, fill: "none" }), jsx("ellipse", { cx: "5.97", cy: "18", rx: "3.5", ry: "2.3", transform: "rotate(-24 5.97 18)", fill: heads[0] }), jsx("ellipse", { cx: "17.97", cy: "16", rx: "3.5", ry: "2.3", transform: "rotate(-24 17.97 16)", fill: heads[1] })] }));
148
+ }
136
149
  const NtdMusic = /* @__PURE__ */ createIcon({
137
150
  displayName: 'NtdMusic',
138
151
  paths: {
139
- solid: ({ primaryColor, strokeWidth }) => (jsxs(Fragment, { children: [jsx("path", { d: MUSIC_STEMS, stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsxs("g", { fill: primaryColor, children: [jsx("ellipse", { cx: "5.97", cy: "18", rx: "3.5", ry: "2.3", transform: "rotate(-24 5.97 18)" }), jsx("ellipse", { cx: "17.97", cy: "16", rx: "3.5", ry: "2.3", transform: "rotate(-24 17.97 16)" })] })] })),
140
- // the stems stop a unit higher: the square caps of `sharp` then end at the heads' edge
141
- sharp: ({ primaryColor, strokeWidth }) => (jsxs(Fragment, { children: [jsx("path", { d: "M8.3 16.22V5l12-2v11.22", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsxs("g", { fill: primaryColor, children: [jsx("ellipse", { cx: "5.97", cy: "18", rx: "3.5", ry: "2.3", transform: "rotate(-24 5.97 18)" }), jsx("ellipse", { cx: "17.97", cy: "16", rx: "3.5", ry: "2.3", transform: "rotate(-24 17.97 16)" })] })] })),
152
+ solid: ({ primaryColor, strokeWidth }) => musicFilled(primaryColor, [primaryColor, primaryColor], strokeWidth),
153
+ // the square caps of `sharp` then end at the heads' edge
154
+ sharp: ({ primaryColor, strokeWidth }) => musicFilled(primaryColor, [primaryColor, primaryColor], strokeWidth, true),
142
155
  outline: ({ primaryColor, strokeWidth }) => (jsxs(Fragment, { children: [jsx("path", { d: MUSIC_STEMS, stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsxs("g", { stroke: primaryColor, strokeWidth: strokeWidth, fill: "none", children: [jsx("ellipse", { cx: "5.97", cy: "18", rx: "2.5", ry: "1.3", transform: "rotate(-24 5.97 18)" }), jsx("ellipse", { cx: "17.97", cy: "16", rx: "2.5", ry: "1.3", transform: "rotate(-24 17.97 16)" })] })] })),
143
- duotone: ({ primaryColor, secondaryColor, secondaryOpacity, strokeWidth }) => (jsxs(Fragment, { children: [jsx("path", { d: "M8.3 5l12-2v12.22", stroke: secondaryColor, strokeWidth: strokeWidth, fill: "none", opacity: secondaryOpacity + 0.2 }), jsx("path", { d: MUSIC_STEMS, stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsxs("g", { fill: primaryColor, children: [jsx("ellipse", { cx: "5.97", cy: "18", rx: "3.5", ry: "2.3", transform: "rotate(-24 5.97 18)" }), jsx("ellipse", { cx: "17.97", cy: "16", rx: "3.5", ry: "2.3", transform: "rotate(-24 17.97 16)" })] })] })),
144
- vivid: ({ primaryColor, secondaryColor, strokeWidth }) => (jsxs(Fragment, { children: [jsx("path", { d: MUSIC_STEMS, stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsx("ellipse", { cx: "5.97", cy: "18", rx: "3.5", ry: "2.3", transform: "rotate(-24 5.97 18)", fill: primaryColor }), jsx("ellipse", { cx: "17.97", cy: "16", rx: "3.5", ry: "2.3", transform: "rotate(-24 17.97 16)", fill: secondaryColor })] })),
156
+ duotone: ({ primaryColor, strokeWidth }) => musicFilled(primaryColor, [primaryColor, primaryColor], strokeWidth),
157
+ vivid: ({ primaryColor, secondaryColor, strokeWidth }) => musicFilled(primaryColor, [primaryColor, secondaryColor], strokeWidth),
145
158
  },
146
159
  });
147
160
  // The flap is a cut through the envelope, kept inside it: its ends meet the sides flush (the
@@ -221,12 +234,13 @@ const NtdNotification = /* @__PURE__ */ createIcon({
221
234
  vivid: ({ primaryColor, secondaryColor }) => (jsxs(Fragment, { children: [jsx("path", { d: "M18 8A6 6 0 006 8c0 7-3 9-3 9h18s-3-2-3-9z", fill: primaryColor }), jsx("path", { d: "M18 8A6 6 0 006 8c0 7-3 9-3 9h18s-3-2-3-9z", fill: "white", opacity: "0.08" }), jsx("circle", { cx: "18", cy: "4", r: "3.5", fill: secondaryColor }), jsx("path", { d: "M13.73 21a2 2 0 01-3.46 0", stroke: "white", strokeWidth: "1" })] })),
222
235
  },
223
236
  });
224
- // NtdWifi: three arcs round the dot (r 4.4 / 9.1 / 13.8 about 12,19.5, ±45°), 1.5 × the stroke
237
+ // NtdWifi: three arcs round the dot (r 5.2 / 9.5 / 13.8 about 12,19.5, ±45°), 1.5 × the stroke
225
238
  // width in every variant but `outline` — half again as heavy. Concentric, so the heavier arcs keep
226
- // even gaps, and small enough that the outer one's square caps in `sharp` stay in the box.
227
- // Duotone and vivid: the dot and the inner arc primary, the outer arcs secondary.
228
- const WIFI_INNER = 'M8.89 16.39A4.4 4.4 0 0 1 15.11 16.39';
229
- const WIFI_OUTER = 'M5.57 13.07A9.1 9.1 0 0 1 18.43 13.07M2.24 9.74A13.8 13.8 0 0 1 21.76 9.74';
239
+ // even gaps, and small enough that the outer one's square caps in `sharp` stay in the box. The
240
+ // inner arc sits further from the dot (it was r 4.4) and the arcs closer together, the outer one
241
+ // where it was. Duotone and vivid: the dot and the inner arc primary, the outer arcs secondary.
242
+ const WIFI_INNER = 'M8.32 15.82A5.2 5.2 0 0 1 15.68 15.82';
243
+ const WIFI_OUTER = 'M5.28 12.78A9.5 9.5 0 0 1 18.72 12.78M2.24 9.74A13.8 13.8 0 0 1 21.76 9.74';
230
244
  function wifiFilled(near, far, strokeWidth) {
231
245
  return (jsxs(Fragment, { children: [jsx("path", { d: WIFI_OUTER, stroke: far, strokeWidth: strokeWidth * 1.5, fill: "none" }), jsx("path", { d: WIFI_INNER, stroke: near, strokeWidth: strokeWidth * 1.5, fill: "none" }), jsx("circle", { cx: "12", cy: "19.5", r: "1.5", fill: near })] }));
232
246
  }
@@ -258,13 +272,25 @@ const NtdPalette = /* @__PURE__ */ createIcon({
258
272
  vivid: ({ primaryColor, secondaryColor }) => (jsxs(Fragment, { children: [jsx("path", { d: "M12 3a9 9 0 100 18h1a2 2 0 000-4h-1a2 2 0 110-4h1a3 3 0 103-3 3 3 0 01-3-3V6a3 3 0 00-1-3z", fill: primaryColor, opacity: "0.25" }), jsx("path", { d: "M12 3a9 9 0 100 18h1a2 2 0 000-4h-1a2 2 0 110-4h1a3 3 0 103-3 3 3 0 01-3-3V6a3 3 0 00-1-3z", fill: "white", opacity: "0.08" }), jsx("circle", { cx: "7", cy: "9", r: "1.2", fill: secondaryColor }), jsx("circle", { cx: "10", cy: "7", r: "1.2", fill: "#8B5CF6" }), jsx("circle", { cx: "7", cy: "13", r: "1.2", fill: "#EF4444" })] })),
259
273
  },
260
274
  });
275
+ // NtdBrush: a paintbrush lying at 45° — a tapering handle with a round end, the metal ferrule, and
276
+ // the bristles swelling out of it to a point at the bottom left (it was a pencil-like wedge with a
277
+ // blob). Filled, the ferrule is set off from the handle and the bristles by two accent cuts.
278
+ // Duotone, fills only: the handle and the ferrule primary, the bristles secondary; vivid puts the
279
+ // ferrule in the accent colour.
280
+ const BRUSH_HANDLE = 'M19.35 2.81A1.3 1.3 0 0 1 21.19 4.65L13.91 12.49L11.51 10.09Z';
281
+ const BRUSH_FERRULE = 'M11.08 9.67L14.33 12.92L11.36 15.89L8.11 12.64Z';
282
+ const BRUSH_BRISTLES = 'M8.11 12.64L11.36 15.89C9.95 18.43 7.76 20.49 2.81 21.19C3.51 16.24 5.57 14.05 8.11 12.64Z';
283
+ const BRUSH_CUTS = 'M10.37 8.96L15.04 13.63M7.4 11.93L12.07 16.6';
284
+ function brushFilled(handle, ferrule, bristles, ferruleOpacity = 1) {
285
+ return (jsxs(Fragment, { children: [jsx("path", { d: BRUSH_HANDLE, fill: handle }), jsx("path", { d: BRUSH_FERRULE, fill: ferrule, opacity: ferruleOpacity }), jsx("path", { d: BRUSH_BRISTLES, fill: bristles })] }));
286
+ }
261
287
  const NtdBrush = /* @__PURE__ */ createIcon({
262
288
  displayName: 'NtdBrush',
263
289
  paths: {
264
- solid: ({ primaryColor, strokeWidth }) => (jsx("path", { d: "M14 4l6 6-8 8-6 2 2-6zM4 20c1.5 0 3-.8 3-2.5S6 15 4.5 15 2 16.2 2 18s.5 2 2 2z", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" })),
265
- outline: ({ primaryColor, strokeWidth }) => (jsx("path", { d: "M14 4l6 6-8 8-6 2 2-6zM4 20c1.5 0 3-.8 3-2.5S6 15 4.5 15 2 16.2 2 18s.5 2 2 2z", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" })),
266
- duotone: ({ primaryColor, secondaryColor, secondaryOpacity, strokeWidth }) => (jsxs(Fragment, { children: [jsx("path", { d: "M14 4l6 6-8 8-6 2 2-6z", fill: secondaryColor, opacity: secondaryOpacity }), jsx("path", { d: "M14 4l6 6-8 8-6 2 2-6zM4 20c1.5 0 3-.8 3-2.5S6 15 4.5 15 2 16.2 2 18s.5 2 2 2z", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" })] })),
267
- vivid: ({ primaryColor, secondaryColor: _secondaryColor }) => (jsx(Fragment, { children: jsx("path", { d: "M14 4l6 6-8 8-6 2 2-6zM4 20c1.5 0 3-.8 3-2.5S6 15 4.5 15 2 16.2 2 18s.5 2 2 2z", stroke: primaryColor, strokeWidth: "2.2", fill: "none" }) })),
290
+ solid: ({ primaryColor, accentColor, accentOpacity, uid }) => (jsxs(Fragment, { children: [brushFilled(primaryColor, primaryColor, primaryColor), within(uid, 'brush', jsx("path", { d: `${BRUSH_HANDLE}${BRUSH_FERRULE}${BRUSH_BRISTLES}` }), jsx("path", { d: BRUSH_CUTS, stroke: accentColor, strokeWidth: "1", opacity: accentOpacity }))] })),
291
+ outline: ({ primaryColor, strokeWidth }) => (jsx("path", { d: `${BRUSH_HANDLE}${BRUSH_FERRULE}${BRUSH_BRISTLES}`, stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" })),
292
+ duotone: ({ primaryColor, secondaryColor }) => brushFilled(primaryColor, primaryColor, secondaryColor),
293
+ vivid: ({ primaryColor, secondaryColor, accentColor, accentOpacity }) => brushFilled(primaryColor, accentColor, secondaryColor, accentOpacity),
268
294
  },
269
295
  });
270
296
  const NtdPenTool = /* @__PURE__ */ createIcon({
@@ -124,15 +124,17 @@ const NtdExternalLink = /* @__PURE__ */ createIcon({
124
124
  });
125
125
  // NtdRefresh: two arcs round 12,12 (r 7), each ending in a filled head — a line glyph twice the
126
126
  // stroke width in every variant but `outline`. The tail stops inside its head, so no cap sticks
127
- // out of it in `sharp` (the old tails ran into the heads' corners). Duotone and vivid: the top
128
- // arrow primary, the bottom one secondary.
127
+ // out of it in `sharp` (the old tails ran into the heads' corners). Each head (7.2 wide, 4.2 long)
128
+ // points along the chord to the start of the other arrow's tail, with a clear gap before it — the
129
+ // bigger heads pointed past the tails and nearly touched them. Duotone and vivid: the top arrow
130
+ // primary, the bottom one secondary.
129
131
  const REFRESH_TOP = {
130
- tail: 'M5.82 8.71A7 7 0 0 1 18 8.39',
131
- head: 'M22.25 7L20.75 13.96L14.34 10.86z',
132
+ tail: 'M6.34 7.89A7 7 0 0 1 17.98 8.37',
133
+ head: 'M14.59 8.46L17.89 12.9L21.77 8.96z',
132
134
  };
133
135
  const REFRESH_BOTTOM = {
134
- tail: 'M18.18 15.29A7 7 0 0 1 6 15.61',
135
- head: 'M1.75 17L3.25 10.04L9.66 13.14z',
136
+ tail: 'M17.66 16.11A7 7 0 0 1 6.02 15.63',
137
+ head: 'M9.41 15.54L6.11 11.1L2.23 15.04z',
136
138
  };
137
139
  function refreshArrows(top, bottom, strokeWidth) {
138
140
  return (jsxs(Fragment, { children: [jsx("path", { d: REFRESH_TOP.tail, stroke: top, strokeWidth: strokeWidth * 2, fill: "none" }), jsx("path", { d: REFRESH_TOP.head, fill: top }), jsx("path", { d: REFRESH_BOTTOM.tail, stroke: bottom, strokeWidth: strokeWidth * 2, fill: "none" }), jsx("path", { d: REFRESH_BOTTOM.head, fill: bottom })] }));
@@ -26,11 +26,14 @@ const APARTMENT_WINDOWS = [
26
26
  { x: 14, y: 13 },
27
27
  ];
28
28
  const APARTMENT_DOOR = { x: 10, y: 18, width: 4, height: 4 };
29
+ /** The door of the solid variants: it stops short of the ground, leaving a thin primary sill. */
30
+ const APARTMENT_DOOR_SILL = { ...APARTMENT_DOOR, height: 3.25 };
29
31
  const NtdApartment = /* @__PURE__ */ createIcon({
30
32
  displayName: 'NtdApartment',
31
33
  paths: {
32
- // the windows and the door filled in the accent colour, no frames (round 33)
33
- solid: ({ primaryColor, accentColor, accentOpacity, uid }) => (jsxs(Fragment, { children: [jsx("rect", { ...APARTMENT, fill: primaryColor }), jsxs("g", { fill: accentColor, opacity: accentOpacity, children: [APARTMENT_WINDOWS.map((w) => (jsx("rect", { ...w, width: "3", height: "3", rx: "0.5" }, `${w.x}-${w.y}`))), within(uid, 'door', jsx("rect", { ...APARTMENT }), jsx("rect", { ...APARTMENT_DOOR }))] })] })),
34
+ // the windows and the door filled in the accent colour, no frames (round 33), a sill under the
35
+ // door (round 34)
36
+ solid: ({ primaryColor, accentColor, accentOpacity }) => (jsxs(Fragment, { children: [jsx("rect", { ...APARTMENT, fill: primaryColor }), jsxs("g", { fill: accentColor, opacity: accentOpacity, children: [APARTMENT_WINDOWS.map((w) => (jsx("rect", { ...w, width: "3", height: "3", rx: "0.5" }, `${w.x}-${w.y}`))), jsx("rect", { ...APARTMENT_DOOR_SILL })] })] })),
34
37
  outline: ({ primaryColor, strokeWidth }) => (jsxs("g", { stroke: primaryColor, strokeWidth: strokeWidth, fill: "none", children: [jsx("rect", { ...APARTMENT }), APARTMENT_WINDOWS.map((w) => (jsx("rect", { ...w, width: "3", height: "3", rx: "0.5" }, `${w.x}-${w.y}`))), jsx("rect", { ...APARTMENT_DOOR })] })),
35
38
  duotone: ({ primaryColor, secondaryColor }) => (jsxs(Fragment, { children: [jsx("rect", { ...APARTMENT, fill: primaryColor }), jsxs("g", { fill: secondaryColor, children: [APARTMENT_WINDOWS.map((w) => (jsx("rect", { ...w, width: "3", height: "3", rx: "0.5" }, `${w.x}-${w.y}`))), jsx("rect", { ...APARTMENT_DOOR })] })] })),
36
39
  vivid: ({ primaryColor, secondaryColor, accentColor, accentOpacity }) => (jsxs(Fragment, { children: [jsx("rect", { ...APARTMENT, fill: primaryColor }), jsx("g", { fill: secondaryColor, children: APARTMENT_WINDOWS.map((w) => (jsx("rect", { ...w, width: "3", height: "3", rx: "0.5" }, `${w.x}-${w.y}`))) }), jsx("rect", { ...APARTMENT_DOOR, fill: accentColor, opacity: accentOpacity })] })),
@@ -65,6 +65,8 @@ const TRIANGLE_LINE = 'M12 4.24L20.38 21H3.62Z';
65
65
  const TRIANGLE_ROUND = 'M9.76 6.47A2.5 2.5 0 0 1 14.24 6.47L20.19 18.38A2.5 2.5 0 0 1 17.95 22L6.05 22A2.5 2.5 0 0 1 3.81 18.38Z';
66
66
  const NtdTriangle = /* @__PURE__ */ createIcon({
67
67
  displayName: 'NtdTriangle',
68
+ // text children centre on the centroid, low in the box (stacking, 1.3.5)
69
+ textCenter: [12, 15.3],
68
70
  paths: {
69
71
  solid: ({ primaryColor }) => jsx("polygon", { points: "12,2 22,22 2,22", fill: primaryColor }),
70
72
  rounded: ({ primaryColor }) => jsx("path", { d: TRIANGLE_ROUND, fill: primaryColor }),
@@ -124,15 +126,6 @@ const NtdCross = /* @__PURE__ */ createIcon({
124
126
  rounded: ({ primaryColor }) => (jsx("path", { d: "M10.5 2h3a1.5 1.5 0 011.5 1.5V8a1 1 0 001 1h4.5a1.5 1.5 0 011.5 1.5v3a1.5 1.5 0 01-1.5 1.5H16a1 1 0 00-1 1v4.5a1.5 1.5 0 01-1.5 1.5h-3A1.5 1.5 0 019 20.5V16a1 1 0 00-1-1H3.5A1.5 1.5 0 012 13.5v-3A1.5 1.5 0 013.5 9H8a1 1 0 001-1V3.5A1.5 1.5 0 0110.5 2z", fill: primaryColor })),
125
127
  },
126
128
  });
127
- const NtdStar4 = /* @__PURE__ */ createIcon({
128
- displayName: 'NtdStar4',
129
- paths: {
130
- solid: ({ primaryColor, strokeWidth: _strokeWidth }) => (jsx("path", { d: "M12 2l2.5 7.5L22 12l-7.5 2.5L12 22l-2.5-7.5L2 12l7.5-2.5z", fill: primaryColor })),
131
- outline: ({ primaryColor, strokeWidth }) => (jsx("path", { d: "M12 2l2.5 7.5L22 12l-7.5 2.5L12 22l-2.5-7.5L2 12l7.5-2.5z", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" })),
132
- duotone: ({ primaryColor, secondaryColor, secondaryOpacity, strokeWidth }) => (jsxs(Fragment, { children: [jsx("path", { d: "M12 2l2.5 7.5L22 12l-7.5 2.5L12 22l-2.5-7.5L2 12l7.5-2.5z", fill: secondaryColor, opacity: secondaryOpacity }), jsx("path", { d: "M12 2l2.5 7.5L22 12l-7.5 2.5L12 22l-2.5-7.5L2 12l7.5-2.5z", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" })] })),
133
- vivid: ({ primaryColor, secondaryColor: _secondaryColor }) => (jsxs(Fragment, { children: [jsx("path", { d: "M12 2l2.5 7.5L22 12l-7.5 2.5L12 22l-2.5-7.5L2 12l7.5-2.5z", fill: primaryColor }), jsx("path", { d: "M12 2l2.5 7.5L22 12l-7.5 2.5L12 22l-2.5-7.5L2 12l7.5-2.5z", fill: "white", opacity: "0.1" })] })),
134
- },
135
- });
136
129
  // The four corner arrows: the tail's level run sits at the height of the arrowhead's tip, so the
137
130
  // two meet (it ran 2 units off the tip and the head looked stuck on beside the tail). It stops 2
138
131
  // short of the tip: with the square caps of `sharp` it stuck out of the point. The filled variants
@@ -238,13 +231,25 @@ const NtdMove = /* @__PURE__ */ createIcon({
238
231
  vivid: ({ primaryColor, strokeWidth }) => (jsxs(Fragment, { children: [jsx("path", { d: moveShape(strokeWidth), fill: primaryColor }), jsx("path", { d: moveShape(strokeWidth), fill: "white", opacity: "0.1" })] })),
239
232
  },
240
233
  });
234
+ // NtdRepeat: two hooked arrows, a line glyph twice the stroke width in every variant but `outline`
235
+ // — redrawn tighter (shafts at y 6 and 18, heads 3 long) so the heavier lines stay in the box. As
236
+ // in NtdMaximize, each shaft stops 0.35 × the line width short of its head's point, so the square
237
+ // cap of `sharp` stays inside the head (it stuck out of both points). Duotone and vivid: one arrow
238
+ // primary, the other secondary (vivid had a fixed #3B82F6 head).
239
+ const REPEAT_HEADS = ['M17 3L20 6L17 9', 'M7 21L4 18L7 15'];
240
+ const REPEAT_OUTLINE = 'M17 1l4 4-4 4M3 11V9a4 4 0 014-4h14M7 23l-4-4 4-4M21 13v2a4 4 0 01-4 4H3';
241
+ function repeatArrows(first, second, strokeWidth) {
242
+ const width = strokeWidth * 2;
243
+ const back = width * 0.35;
244
+ return (jsxs(Fragment, { children: [jsx("path", { d: `${REPEAT_HEADS[0]}M4 10V9a3 3 0 013-3H${20 - back}`, stroke: first, strokeWidth: width, fill: "none" }), jsx("path", { d: `${REPEAT_HEADS[1]}M20 14v1a3 3 0 01-3 3H${4 + back}`, stroke: second, strokeWidth: width, fill: "none" })] }));
245
+ }
241
246
  const NtdRepeat = /* @__PURE__ */ createIcon({
242
247
  displayName: 'NtdRepeat',
243
248
  paths: {
244
- solid: ({ primaryColor, strokeWidth }) => (jsxs(Fragment, { children: [jsx("polyline", { points: "17,1 21,5 17,9", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsx("path", { d: "M3 11V9a4 4 0 014-4h14", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsx("polyline", { points: "7,23 3,19 7,15", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsx("path", { d: "M21 13v2a4 4 0 01-4 4H3", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" })] })),
245
- outline: ({ primaryColor, strokeWidth }) => (jsxs(Fragment, { children: [jsx("polyline", { points: "17,1 21,5 17,9", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsx("path", { d: "M3 11V9a4 4 0 014-4h14", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsx("polyline", { points: "7,23 3,19 7,15", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsx("path", { d: "M21 13v2a4 4 0 01-4 4H3", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" })] })),
246
- duotone: ({ primaryColor, secondaryColor, secondaryOpacity, strokeWidth }) => (jsxs(Fragment, { children: [jsx("path", { d: "M3 11V9a4 4 0 014-4h14", stroke: secondaryColor, strokeWidth: strokeWidth, fill: "none", opacity: secondaryOpacity + 0.2 }), jsx("path", { d: "M21 13v2a4 4 0 01-4 4H3", stroke: secondaryColor, strokeWidth: strokeWidth, fill: "none", opacity: secondaryOpacity + 0.2 }), jsx("polyline", { points: "17,1 21,5 17,9", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsx("polyline", { points: "7,23 3,19 7,15", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" })] })),
247
- vivid: ({ primaryColor, secondaryColor }) => (jsxs(Fragment, { children: [jsx("polyline", { points: "17,1 21,5 17,9", stroke: primaryColor, strokeWidth: "2", fill: "none" }), jsx("path", { d: "M3 11V9a4 4 0 014-4h14", stroke: secondaryColor, strokeWidth: "1.8", fill: "none" }), jsx("polyline", { points: "7,23 3,19 7,15", stroke: "#3B82F6", strokeWidth: "1.5", fill: "none" }), jsx("path", { d: "M21 13v2a4 4 0 01-4 4H3", stroke: secondaryColor, strokeWidth: "1.5", fill: "none" })] })),
249
+ solid: ({ primaryColor, strokeWidth }) => repeatArrows(primaryColor, primaryColor, strokeWidth),
250
+ outline: ({ primaryColor, strokeWidth }) => (jsx("path", { d: REPEAT_OUTLINE, stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" })),
251
+ duotone: ({ primaryColor, secondaryColor, strokeWidth }) => repeatArrows(primaryColor, secondaryColor, strokeWidth),
252
+ vivid: ({ primaryColor, secondaryColor, strokeWidth }) => repeatArrows(primaryColor, secondaryColor, strokeWidth),
248
253
  },
249
254
  });
250
255
  const NtdShuffle = /* @__PURE__ */ createIcon({
@@ -318,4 +323,4 @@ const NtdAngleBisector = /* @__PURE__ */ createIcon({
318
323
  },
319
324
  });
320
325
 
321
- export { NtdAngleBisector, NtdArrowDownCircle, NtdArrowLeftCircle, NtdArrowRightCircle, NtdArrowUpCircle, NtdCircle, NtdCornerDownLeft, NtdCornerDownRight, NtdCornerUpLeft, NtdCornerUpRight, NtdCross, NtdDiamond, NtdHexagon, NtdMaximize, NtdMidpoint, NtdMinimize, NtdMove, NtdOctagon, NtdParallel, NtdPentagon, NtdPerpendicular, NtdPoint, NtdRepeat, NtdSegment, NtdShuffle, NtdSquare, NtdStar4, NtdTriangle };
326
+ export { NtdAngleBisector, NtdArrowDownCircle, NtdArrowLeftCircle, NtdArrowRightCircle, NtdArrowUpCircle, NtdCircle, NtdCornerDownLeft, NtdCornerDownRight, NtdCornerUpLeft, NtdCornerUpRight, NtdCross, NtdDiamond, NtdHexagon, NtdMaximize, NtdMidpoint, NtdMinimize, NtdMove, NtdOctagon, NtdParallel, NtdPentagon, NtdPerpendicular, NtdPoint, NtdRepeat, NtdSegment, NtdShuffle, NtdSquare, NtdTriangle };