@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
@@ -153,12 +153,12 @@ const NtdGrid = /* @__PURE__ */ createIcon.createIcon({
153
153
  vivid: ({ primaryColor, secondaryColor }) => (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("rect", { x: "3", y: "3", width: "7", height: "7", rx: "1.5", fill: primaryColor }), jsxRuntime.jsx("rect", { x: "3", y: "3", width: "7", height: "7", rx: "1.5", fill: "white", opacity: "0.08" }), jsxRuntime.jsx("rect", { x: "14", y: "3", width: "7", height: "7", rx: "1.5", fill: secondaryColor }), jsxRuntime.jsx("rect", { x: "3", y: "14", width: "7", height: "7", rx: "1.5", fill: "#3B82F6" }), jsxRuntime.jsx("rect", { x: "14", y: "14", width: "7", height: "7", rx: "1.5", fill: "#F59E0B" })] })),
154
154
  },
155
155
  });
156
- // NtdList: in every variant but `outline` the lines are 1.5 × the stroke width and the dots r 2.25
157
- // — half again as heavy as they were; the lines start at 9 to keep clear of the bigger dots.
156
+ // NtdList: in every variant but `outline` the lines are 1.5 × the stroke width and the dots r 1.7
157
+ // (r 2.25 was too big, a quarter smaller); the lines start at 9 to keep clear of the dots.
158
158
  // Duotone and vivid: the lines primary, the dots secondary.
159
159
  const LIST_LINES = 'M9 6h12M9 12h12M9 18h12';
160
160
  function listFilled(lines, dots, strokeWidth) {
161
- return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("path", { d: LIST_LINES, stroke: lines, strokeWidth: strokeWidth * 1.5 }), jsxRuntime.jsxs("g", { fill: dots, children: [jsxRuntime.jsx("circle", { cx: "3.75", cy: "6", r: "2.25" }), jsxRuntime.jsx("circle", { cx: "3.75", cy: "12", r: "2.25" }), jsxRuntime.jsx("circle", { cx: "3.75", cy: "18", r: "2.25" })] })] }));
161
+ return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("path", { d: LIST_LINES, stroke: lines, strokeWidth: strokeWidth * 1.5 }), jsxRuntime.jsxs("g", { fill: dots, children: [jsxRuntime.jsx("circle", { cx: "3.75", cy: "6", r: "1.7" }), jsxRuntime.jsx("circle", { cx: "3.75", cy: "12", r: "1.7" }), jsxRuntime.jsx("circle", { cx: "3.75", cy: "18", r: "1.7" })] })] }));
162
162
  }
163
163
  const NtdList = /* @__PURE__ */ createIcon.createIcon({
164
164
  displayName: 'NtdList',
@@ -178,22 +178,32 @@ const NtdTable = /* @__PURE__ */ createIcon.createIcon({
178
178
  vivid: ({ primaryColor, secondaryColor }) => (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("rect", { x: "3", y: "3", width: "18", height: "18", rx: "2", fill: primaryColor, opacity: "0.15", stroke: primaryColor, strokeWidth: "2" }), jsxRuntime.jsx("rect", { x: "3", y: "3", width: "18", height: "18", rx: "2", fill: "white", opacity: "0.1" }), jsxRuntime.jsx("line", { x1: "3", y1: "9", x2: "21", y2: "9", stroke: secondaryColor, strokeWidth: "1.8" }), jsxRuntime.jsx("line", { x1: "3", y1: "15", x2: "21", y2: "15", stroke: "#3B82F6", strokeWidth: "1.5" }), jsxRuntime.jsx("line", { x1: "9", y1: "3", x2: "9", y2: "21", stroke: "#3B82F6", strokeWidth: "1.5" })] })),
179
179
  },
180
180
  });
181
+ // NtdSmartphone: filled, the case stays a primary frame round a screen in the accent colour, and
182
+ // the button is a primary dot on the screen — bigger and lower than the accent dot it was.
181
183
  const NtdSmartphone = /* @__PURE__ */ createIcon.createIcon({
182
184
  displayName: 'NtdSmartphone',
183
185
  paths: {
184
- solid: ({ primaryColor, accentColor, accentOpacity, strokeWidth }) => (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("rect", { x: "5", y: "2", width: "14", height: "20", rx: "2", fill: primaryColor }), jsxRuntime.jsx("line", { x1: "12", y1: "18", x2: "12.01", y2: "18", stroke: accentColor, strokeWidth: strokeWidth, opacity: accentOpacity })] })),
186
+ solid: ({ primaryColor, accentColor, accentOpacity }) => (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("rect", { x: "5", y: "2", width: "14", height: "20", rx: "2", fill: primaryColor }), jsxRuntime.jsx("rect", { x: "6.5", y: "3.5", width: "11", height: "17", rx: "0.75", fill: accentColor, opacity: accentOpacity }), jsxRuntime.jsx("circle", { cx: "12", cy: "18.4", r: "1.25", fill: primaryColor })] })),
185
187
  outline: ({ primaryColor, strokeWidth }) => (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("rect", { x: "5", y: "2", width: "14", height: "20", rx: "2", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsxRuntime.jsx("line", { x1: "12", y1: "18", x2: "12.01", y2: "18", stroke: primaryColor, strokeWidth: strokeWidth })] })),
186
188
  duotone: ({ primaryColor, secondaryColor, secondaryOpacity, strokeWidth }) => (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("rect", { x: "5", y: "2", width: "14", height: "20", rx: "2", fill: secondaryColor, opacity: secondaryOpacity }), jsxRuntime.jsx("rect", { x: "5", y: "2", width: "14", height: "20", rx: "2", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsxRuntime.jsx("line", { x1: "12", y1: "18", x2: "12.01", y2: "18", stroke: primaryColor, strokeWidth: strokeWidth })] })),
187
189
  vivid: ({ primaryColor, secondaryColor }) => (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("rect", { x: "5", y: "2", width: "14", height: "20", rx: "2", fill: primaryColor }), jsxRuntime.jsx("rect", { x: "5", y: "2", width: "14", height: "20", rx: "2", fill: "white", opacity: "0.1" }), jsxRuntime.jsx("line", { x1: "12", y1: "18", x2: "12.01", y2: "18", stroke: secondaryColor, strokeWidth: "1.8" })] })),
188
190
  },
189
191
  });
192
+ // NtdMonitor: the neck and the base are twice the stroke width in every variant but `outline`, and
193
+ // the base is 30% wider — 13 across with its caps (it was 10); it sits at 21.5 so the heavier line
194
+ // stays in the box. Vivid: the stand secondary (it had a fixed #3B82F6 neck).
195
+ const MONITOR_SCREEN = { x: 2, y: 3, width: 20, height: 14, rx: 2 };
196
+ /** Neck and base for a line twice the stroke width: base 9 long + 2 × 2 of cap = 13. */
197
+ const MONITOR_STAND = 'M12 17v4.5M7.5 21.5h9';
198
+ /** The outline's neck and base, at the stroke width: base 11 long + 2 × 1 of cap = 13. */
199
+ const MONITOR_STAND_LINE = 'M12 17v4M6.5 21h11';
190
200
  const NtdMonitor = /* @__PURE__ */ createIcon.createIcon({
191
201
  displayName: 'NtdMonitor',
192
202
  paths: {
193
- solid: ({ primaryColor, strokeWidth }) => (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("rect", { x: "2", y: "3", width: "20", height: "14", rx: "2", fill: primaryColor }), jsxRuntime.jsx("line", { x1: "8", y1: "21", x2: "16", y2: "21", stroke: primaryColor, strokeWidth: strokeWidth }), jsxRuntime.jsx("line", { x1: "12", y1: "17", x2: "12", y2: "21", stroke: primaryColor, strokeWidth: strokeWidth })] })),
194
- outline: ({ primaryColor, strokeWidth }) => (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("rect", { x: "2", y: "3", width: "20", height: "14", rx: "2", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsxRuntime.jsx("line", { x1: "8", y1: "21", x2: "16", y2: "21", stroke: primaryColor, strokeWidth: strokeWidth }), jsxRuntime.jsx("line", { x1: "12", y1: "17", x2: "12", y2: "21", stroke: primaryColor, strokeWidth: strokeWidth })] })),
195
- duotone: ({ primaryColor, secondaryColor, secondaryOpacity, strokeWidth }) => (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("rect", { x: "2", y: "3", width: "20", height: "14", rx: "2", fill: secondaryColor, opacity: secondaryOpacity }), jsxRuntime.jsx("rect", { x: "2", y: "3", width: "20", height: "14", rx: "2", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsxRuntime.jsx("line", { x1: "8", y1: "21", x2: "16", y2: "21", stroke: primaryColor, strokeWidth: strokeWidth }), jsxRuntime.jsx("line", { x1: "12", y1: "17", x2: "12", y2: "21", stroke: primaryColor, strokeWidth: strokeWidth })] })),
196
- vivid: ({ primaryColor, secondaryColor }) => (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("rect", { x: "2", y: "3", width: "20", height: "14", rx: "2", fill: primaryColor }), jsxRuntime.jsx("rect", { x: "2", y: "3", width: "20", height: "14", rx: "2", fill: "white", opacity: "0.1" }), jsxRuntime.jsx("line", { x1: "8", y1: "21", x2: "16", y2: "21", stroke: secondaryColor, strokeWidth: "1.8" }), jsxRuntime.jsx("line", { x1: "12", y1: "17", x2: "12", y2: "21", stroke: "#3B82F6", strokeWidth: "1.5" })] })),
203
+ solid: ({ primaryColor, strokeWidth }) => (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("rect", { ...MONITOR_SCREEN, fill: primaryColor }), jsxRuntime.jsx("path", { d: MONITOR_STAND, stroke: primaryColor, strokeWidth: strokeWidth * 2 })] })),
204
+ outline: ({ primaryColor, strokeWidth }) => (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("rect", { ...MONITOR_SCREEN, stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsxRuntime.jsx("path", { d: MONITOR_STAND_LINE, stroke: primaryColor, strokeWidth: strokeWidth })] })),
205
+ duotone: ({ primaryColor, secondaryColor, secondaryOpacity, strokeWidth }) => (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("rect", { ...MONITOR_SCREEN, fill: secondaryColor, opacity: secondaryOpacity }), jsxRuntime.jsx("rect", { ...MONITOR_SCREEN, stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsxRuntime.jsx("path", { d: MONITOR_STAND, stroke: primaryColor, strokeWidth: strokeWidth * 2 })] })),
206
+ vivid: ({ primaryColor, secondaryColor, strokeWidth }) => (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("rect", { ...MONITOR_SCREEN, fill: primaryColor }), jsxRuntime.jsx("path", { d: MONITOR_STAND, stroke: secondaryColor, strokeWidth: strokeWidth * 2 })] })),
197
207
  },
198
208
  });
199
209
  // NtdCpu: filled, the body and its pins primary and the die in the accent colour (the body was a
@@ -230,11 +240,11 @@ const NtdKey = /* @__PURE__ */ createIcon.createIcon({
230
240
  },
231
241
  });
232
242
  // NtdAward: the ribbon has a secondary inside within its primary edge (it was open, so the page
233
- // showed through), and goes under the medal. The inside is the ribbon inset by 2 — it filled the
234
- // ribbon almost to its edge. Duotone is the same; vivid draws the ribbon's edge in the accent
235
- // colour.
243
+ // showed through), and goes under the medal. The inside is the ribbon inset by 1.5 — between the
244
+ // half stroke it filled to before (too full) and the 2 after (too small). Duotone is the same;
245
+ // vivid draws the ribbon's edge in the accent colour.
236
246
  const AWARD_RIBBON = 'M8.21 13.89L7 23l5-3 5 3-1.21-9.12';
237
- const AWARD_RIBBON_INNER = 'M10.17 14.3L13.83 14.3L14.47 19.15L12 17.67L9.53 19.15z';
247
+ const AWARD_RIBBON_INNER = 'M9.67 14.3L8.9 20.11L12 18.25L15.1 20.11L14.32 14.3z';
238
248
  function awardFilled({ primaryColor, secondaryColor, strokeWidth }, ribbonEdge) {
239
249
  return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("path", { d: AWARD_RIBBON, fill: ribbonEdge, stroke: ribbonEdge, strokeWidth: strokeWidth }), jsxRuntime.jsx("path", { d: AWARD_RIBBON_INNER, fill: secondaryColor }), jsxRuntime.jsx("circle", { cx: "12", cy: "8", r: "7", fill: primaryColor })] }));
240
250
  }
@@ -289,13 +299,22 @@ const NtdCreditCard = /* @__PURE__ */ createIcon.createIcon({
289
299
  vivid: ({ primaryColor, accentColor, accentOpacity, uid }) => (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("rect", { ...CARD_BODY, fill: primaryColor }), jsxRuntime.jsx("rect", { ...CARD_BODY, fill: "white", opacity: "0.1" }), iconParts.within(uid, 'stripe', jsxRuntime.jsx("rect", { ...CARD_BODY }), jsxRuntime.jsx("rect", { ...CARD_STRIPE, fill: "black", opacity: "0.35" })), jsxRuntime.jsx("rect", { ...CARD_SIGNATURE, fill: accentColor, opacity: accentOpacity }), jsxRuntime.jsx("rect", { ...CARD_CVV, fill: accentColor, opacity: accentOpacity })] })),
290
300
  },
291
301
  });
302
+ // NtdPieChart: filled, two sectors of one pie (r 10) pulled 0.7 apart along the small one's
303
+ // diagonal — a gap between them. The larger is the three-quarter sector from the centre; it was a
304
+ // segment cut off by a chord, which read as an odd shape. The outline keeps its open arc and the
305
+ // slice. Duotone, fills only: the larger sector secondary, the slice primary; vivid the other way.
306
+ const PIE_REST = 'M11.3 12.7V2.7A10 10 0 1 0 21.3 12.7Z';
307
+ const PIE_SLICE = 'M12.7 11.3V1.3A10 10 0 0 1 22.7 11.3Z';
308
+ function pieFilled(rest, slice) {
309
+ return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("path", { d: PIE_REST, fill: rest }), jsxRuntime.jsx("path", { d: PIE_SLICE, fill: slice })] }));
310
+ }
292
311
  const NtdPieChart = /* @__PURE__ */ createIcon.createIcon({
293
312
  displayName: 'NtdPieChart',
294
313
  paths: {
295
- solid: ({ primaryColor, secondaryColor: _secondaryColor, secondaryOpacity: _secondaryOpacity, strokeWidth, }) => (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("path", { d: "M21.21 15.89A10 10 0 118 2.83", fill: primaryColor, opacity: "0.3", stroke: primaryColor, strokeWidth: strokeWidth }), jsxRuntime.jsx("path", { d: "M22 12A10 10 0 0012 2v10h10z", fill: primaryColor })] })),
314
+ solid: ({ primaryColor }) => pieFilled(primaryColor, primaryColor),
296
315
  outline: ({ primaryColor, strokeWidth }) => (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("path", { d: "M21.21 15.89A10 10 0 118 2.83", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsxRuntime.jsx("path", { d: "M22 12A10 10 0 0012 2v10h10z", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" })] })),
297
- duotone: ({ primaryColor, secondaryColor, secondaryOpacity, strokeWidth }) => (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("path", { d: "M21.21 15.89A10 10 0 118 2.83", fill: secondaryColor, opacity: secondaryOpacity, stroke: primaryColor, strokeWidth: strokeWidth }), jsxRuntime.jsx("path", { d: "M22 12A10 10 0 0012 2v10h10z", fill: primaryColor, stroke: primaryColor, strokeWidth: strokeWidth })] })),
298
- vivid: ({ primaryColor, secondaryColor }) => (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("path", { d: "M21.21 15.89A10 10 0 118 2.83", fill: primaryColor, opacity: "0.3", stroke: primaryColor, strokeWidth: "2" }), jsxRuntime.jsx("path", { d: "M21.21 15.89A10 10 0 118 2.83", fill: "white", opacity: "0.08" }), jsxRuntime.jsx("path", { d: "M22 12A10 10 0 0012 2v10h10z", fill: secondaryColor })] })),
316
+ duotone: ({ primaryColor, secondaryColor }) => pieFilled(secondaryColor, primaryColor),
317
+ vivid: ({ primaryColor, secondaryColor }) => pieFilled(primaryColor, secondaryColor),
299
318
  },
300
319
  });
301
320
  const NtdBarChart = /* @__PURE__ */ createIcon.createIcon({
@@ -91,6 +91,7 @@ exports.NtdGlobe = ui.NtdGlobe;
91
91
  exports.NtdHeart = ui.NtdHeart;
92
92
  exports.NtdHelp = ui.NtdHelp;
93
93
  exports.NtdHome = ui.NtdHome;
94
+ exports.NtdHourglass = ui.NtdHourglass;
94
95
  exports.NtdInfo = ui.NtdInfo;
95
96
  exports.NtdMap = ui.NtdMap;
96
97
  exports.NtdMoon = ui.NtdMoon;
@@ -112,7 +113,6 @@ exports.NtdCo2 = sustainability.NtdCo2;
112
113
  exports.NtdCompost = sustainability.NtdCompost;
113
114
  exports.NtdEcoFriendly = sustainability.NtdEcoFriendly;
114
115
  exports.NtdEvCharger = sustainability.NtdEvCharger;
115
- exports.NtdHydropower = sustainability.NtdHydropower;
116
116
  exports.NtdNetZero = sustainability.NtdNetZero;
117
117
  exports.NtdOrganic = sustainability.NtdOrganic;
118
118
  exports.NtdPlantTree = sustainability.NtdPlantTree;
@@ -228,6 +228,7 @@ exports.NtdDroplet = weather.NtdDroplet;
228
228
  exports.NtdFeather = weather.NtdFeather;
229
229
  exports.NtdFire = weather.NtdFire;
230
230
  exports.NtdFlower = weather.NtdFlower;
231
+ exports.NtdHydropower = weather.NtdHydropower;
231
232
  exports.NtdLeaf = weather.NtdLeaf;
232
233
  exports.NtdMountain = weather.NtdMountain;
233
234
  exports.NtdRain = weather.NtdRain;
@@ -267,7 +268,6 @@ exports.NtdRepeat = shapes.NtdRepeat;
267
268
  exports.NtdSegment = shapes.NtdSegment;
268
269
  exports.NtdShuffle = shapes.NtdShuffle;
269
270
  exports.NtdSquare = shapes.NtdSquare;
270
- exports.NtdStar4 = shapes.NtdStar4;
271
271
  exports.NtdTriangle = shapes.NtdTriangle;
272
272
  exports.NtdBank = business.NtdBank;
273
273
  exports.NtdBarcode = business.NtdBarcode;
@@ -431,6 +431,7 @@ exports.NtdNeuralNetwork = ai.NtdNeuralNetwork;
431
431
  exports.NtdPrompt = ai.NtdPrompt;
432
432
  exports.NtdRobot = ai.NtdRobot;
433
433
  exports.NtdSparkle = ai.NtdSparkle;
434
+ exports.NtdStar4 = ai.NtdStar4;
434
435
  exports.NtdTensor = ai.NtdTensor;
435
436
  exports.NtdTraining = ai.NtdTraining;
436
437
  exports.aiIcons = ai.aiIcons;
@@ -133,17 +133,30 @@ const NtdMicrophoneOff = /* @__PURE__ */ createIcon.createIcon({
133
133
  // NtdMusic: the note heads are tilted ellipses whose right edge is the stem's right edge, and the
134
134
  // stems end where that edge is vertical, so stem and head meet without a step (the heads stuck
135
135
  // out right of the stems). The outline heads are the filled ones moved in by half a stroke, so
136
- // their stroke meets the stem the same way.
136
+ // their stroke meets the stem the same way. Every variant but `outline` draws the stems and the
137
+ // beam twice the stroke width; the stems move left by the extra half width, so their right edge
138
+ // stays on the heads' (9.3 and 21.3), and the beam drops half a unit to keep a mitred corner in
139
+ // the box.
137
140
  const MUSIC_STEMS = 'M8.3 17.22V5l12-2v12.22';
141
+ /** The stems and the beam for a line `width` wide; `sharp` stops them half a width higher. */
142
+ function musicStems(width, sharp = false) {
143
+ const left = 9.3 - width / 2;
144
+ const right = 21.3 - width / 2;
145
+ const end = sharp ? width / 2 : 0;
146
+ return `M${left} ${17.22 - end}V5.5L${right} 3.5V${15.22 - end}`;
147
+ }
148
+ function musicFilled(stems, heads, strokeWidth, sharp = false) {
149
+ return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("path", { d: musicStems(strokeWidth * 2, sharp), stroke: stems, strokeWidth: strokeWidth * 2, fill: "none" }), jsxRuntime.jsx("ellipse", { cx: "5.97", cy: "18", rx: "3.5", ry: "2.3", transform: "rotate(-24 5.97 18)", fill: heads[0] }), jsxRuntime.jsx("ellipse", { cx: "17.97", cy: "16", rx: "3.5", ry: "2.3", transform: "rotate(-24 17.97 16)", fill: heads[1] })] }));
150
+ }
138
151
  const NtdMusic = /* @__PURE__ */ createIcon.createIcon({
139
152
  displayName: 'NtdMusic',
140
153
  paths: {
141
- solid: ({ primaryColor, strokeWidth }) => (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("path", { d: MUSIC_STEMS, stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsxRuntime.jsxs("g", { fill: primaryColor, children: [jsxRuntime.jsx("ellipse", { cx: "5.97", cy: "18", rx: "3.5", ry: "2.3", transform: "rotate(-24 5.97 18)" }), jsxRuntime.jsx("ellipse", { cx: "17.97", cy: "16", rx: "3.5", ry: "2.3", transform: "rotate(-24 17.97 16)" })] })] })),
142
- // the stems stop a unit higher: the square caps of `sharp` then end at the heads' edge
143
- sharp: ({ primaryColor, strokeWidth }) => (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("path", { d: "M8.3 16.22V5l12-2v11.22", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsxRuntime.jsxs("g", { fill: primaryColor, children: [jsxRuntime.jsx("ellipse", { cx: "5.97", cy: "18", rx: "3.5", ry: "2.3", transform: "rotate(-24 5.97 18)" }), jsxRuntime.jsx("ellipse", { cx: "17.97", cy: "16", rx: "3.5", ry: "2.3", transform: "rotate(-24 17.97 16)" })] })] })),
154
+ solid: ({ primaryColor, strokeWidth }) => musicFilled(primaryColor, [primaryColor, primaryColor], strokeWidth),
155
+ // the square caps of `sharp` then end at the heads' edge
156
+ sharp: ({ primaryColor, strokeWidth }) => musicFilled(primaryColor, [primaryColor, primaryColor], strokeWidth, true),
144
157
  outline: ({ primaryColor, strokeWidth }) => (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("path", { d: MUSIC_STEMS, stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsxRuntime.jsxs("g", { stroke: primaryColor, strokeWidth: strokeWidth, fill: "none", children: [jsxRuntime.jsx("ellipse", { cx: "5.97", cy: "18", rx: "2.5", ry: "1.3", transform: "rotate(-24 5.97 18)" }), jsxRuntime.jsx("ellipse", { cx: "17.97", cy: "16", rx: "2.5", ry: "1.3", transform: "rotate(-24 17.97 16)" })] })] })),
145
- duotone: ({ primaryColor, secondaryColor, secondaryOpacity, strokeWidth }) => (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("path", { d: "M8.3 5l12-2v12.22", stroke: secondaryColor, strokeWidth: strokeWidth, fill: "none", opacity: secondaryOpacity + 0.2 }), jsxRuntime.jsx("path", { d: MUSIC_STEMS, stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsxRuntime.jsxs("g", { fill: primaryColor, children: [jsxRuntime.jsx("ellipse", { cx: "5.97", cy: "18", rx: "3.5", ry: "2.3", transform: "rotate(-24 5.97 18)" }), jsxRuntime.jsx("ellipse", { cx: "17.97", cy: "16", rx: "3.5", ry: "2.3", transform: "rotate(-24 17.97 16)" })] })] })),
146
- vivid: ({ primaryColor, secondaryColor, strokeWidth }) => (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("path", { d: MUSIC_STEMS, stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsxRuntime.jsx("ellipse", { cx: "5.97", cy: "18", rx: "3.5", ry: "2.3", transform: "rotate(-24 5.97 18)", fill: primaryColor }), jsxRuntime.jsx("ellipse", { cx: "17.97", cy: "16", rx: "3.5", ry: "2.3", transform: "rotate(-24 17.97 16)", fill: secondaryColor })] })),
158
+ duotone: ({ primaryColor, strokeWidth }) => musicFilled(primaryColor, [primaryColor, primaryColor], strokeWidth),
159
+ vivid: ({ primaryColor, secondaryColor, strokeWidth }) => musicFilled(primaryColor, [primaryColor, secondaryColor], strokeWidth),
147
160
  },
148
161
  });
149
162
  // The flap is a cut through the envelope, kept inside it: its ends meet the sides flush (the
@@ -223,12 +236,13 @@ const NtdNotification = /* @__PURE__ */ createIcon.createIcon({
223
236
  vivid: ({ primaryColor, secondaryColor }) => (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("path", { d: "M18 8A6 6 0 006 8c0 7-3 9-3 9h18s-3-2-3-9z", fill: primaryColor }), jsxRuntime.jsx("path", { d: "M18 8A6 6 0 006 8c0 7-3 9-3 9h18s-3-2-3-9z", fill: "white", opacity: "0.08" }), jsxRuntime.jsx("circle", { cx: "18", cy: "4", r: "3.5", fill: secondaryColor }), jsxRuntime.jsx("path", { d: "M13.73 21a2 2 0 01-3.46 0", stroke: "white", strokeWidth: "1" })] })),
224
237
  },
225
238
  });
226
- // NtdWifi: three arcs round the dot (r 4.4 / 9.1 / 13.8 about 12,19.5, ±45°), 1.5 × the stroke
239
+ // NtdWifi: three arcs round the dot (r 5.2 / 9.5 / 13.8 about 12,19.5, ±45°), 1.5 × the stroke
227
240
  // width in every variant but `outline` — half again as heavy. Concentric, so the heavier arcs keep
228
- // even gaps, and small enough that the outer one's square caps in `sharp` stay in the box.
229
- // Duotone and vivid: the dot and the inner arc primary, the outer arcs secondary.
230
- const WIFI_INNER = 'M8.89 16.39A4.4 4.4 0 0 1 15.11 16.39';
231
- 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';
241
+ // even gaps, and small enough that the outer one's square caps in `sharp` stay in the box. The
242
+ // inner arc sits further from the dot (it was r 4.4) and the arcs closer together, the outer one
243
+ // where it was. Duotone and vivid: the dot and the inner arc primary, the outer arcs secondary.
244
+ const WIFI_INNER = 'M8.32 15.82A5.2 5.2 0 0 1 15.68 15.82';
245
+ 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';
232
246
  function wifiFilled(near, far, strokeWidth) {
233
247
  return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("path", { d: WIFI_OUTER, stroke: far, strokeWidth: strokeWidth * 1.5, fill: "none" }), jsxRuntime.jsx("path", { d: WIFI_INNER, stroke: near, strokeWidth: strokeWidth * 1.5, fill: "none" }), jsxRuntime.jsx("circle", { cx: "12", cy: "19.5", r: "1.5", fill: near })] }));
234
248
  }
@@ -260,13 +274,25 @@ const NtdPalette = /* @__PURE__ */ createIcon.createIcon({
260
274
  vivid: ({ primaryColor, secondaryColor }) => (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.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" }), jsxRuntime.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" }), jsxRuntime.jsx("circle", { cx: "7", cy: "9", r: "1.2", fill: secondaryColor }), jsxRuntime.jsx("circle", { cx: "10", cy: "7", r: "1.2", fill: "#8B5CF6" }), jsxRuntime.jsx("circle", { cx: "7", cy: "13", r: "1.2", fill: "#EF4444" })] })),
261
275
  },
262
276
  });
277
+ // NtdBrush: a paintbrush lying at 45° — a tapering handle with a round end, the metal ferrule, and
278
+ // the bristles swelling out of it to a point at the bottom left (it was a pencil-like wedge with a
279
+ // blob). Filled, the ferrule is set off from the handle and the bristles by two accent cuts.
280
+ // Duotone, fills only: the handle and the ferrule primary, the bristles secondary; vivid puts the
281
+ // ferrule in the accent colour.
282
+ const BRUSH_HANDLE = 'M19.35 2.81A1.3 1.3 0 0 1 21.19 4.65L13.91 12.49L11.51 10.09Z';
283
+ const BRUSH_FERRULE = 'M11.08 9.67L14.33 12.92L11.36 15.89L8.11 12.64Z';
284
+ 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';
285
+ const BRUSH_CUTS = 'M10.37 8.96L15.04 13.63M7.4 11.93L12.07 16.6';
286
+ function brushFilled(handle, ferrule, bristles, ferruleOpacity = 1) {
287
+ return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("path", { d: BRUSH_HANDLE, fill: handle }), jsxRuntime.jsx("path", { d: BRUSH_FERRULE, fill: ferrule, opacity: ferruleOpacity }), jsxRuntime.jsx("path", { d: BRUSH_BRISTLES, fill: bristles })] }));
288
+ }
263
289
  const NtdBrush = /* @__PURE__ */ createIcon.createIcon({
264
290
  displayName: 'NtdBrush',
265
291
  paths: {
266
- solid: ({ primaryColor, strokeWidth }) => (jsxRuntime.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
- outline: ({ primaryColor, strokeWidth }) => (jsxRuntime.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" })),
268
- duotone: ({ primaryColor, secondaryColor, secondaryOpacity, strokeWidth }) => (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("path", { d: "M14 4l6 6-8 8-6 2 2-6z", fill: secondaryColor, opacity: secondaryOpacity }), jsxRuntime.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" })] })),
269
- vivid: ({ primaryColor, secondaryColor: _secondaryColor }) => (jsxRuntime.jsx(jsxRuntime.Fragment, { children: jsxRuntime.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" }) })),
292
+ solid: ({ primaryColor, accentColor, accentOpacity, uid }) => (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [brushFilled(primaryColor, primaryColor, primaryColor), iconParts.within(uid, 'brush', jsxRuntime.jsx("path", { d: `${BRUSH_HANDLE}${BRUSH_FERRULE}${BRUSH_BRISTLES}` }), jsxRuntime.jsx("path", { d: BRUSH_CUTS, stroke: accentColor, strokeWidth: "1", opacity: accentOpacity }))] })),
293
+ outline: ({ primaryColor, strokeWidth }) => (jsxRuntime.jsx("path", { d: `${BRUSH_HANDLE}${BRUSH_FERRULE}${BRUSH_BRISTLES}`, stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" })),
294
+ duotone: ({ primaryColor, secondaryColor }) => brushFilled(primaryColor, primaryColor, secondaryColor),
295
+ vivid: ({ primaryColor, secondaryColor, accentColor, accentOpacity }) => brushFilled(primaryColor, accentColor, secondaryColor, accentOpacity),
270
296
  },
271
297
  });
272
298
  const NtdPenTool = /* @__PURE__ */ createIcon.createIcon({
@@ -126,15 +126,17 @@ const NtdExternalLink = /* @__PURE__ */ createIcon.createIcon({
126
126
  });
127
127
  // NtdRefresh: two arcs round 12,12 (r 7), each ending in a filled head — a line glyph twice the
128
128
  // stroke width in every variant but `outline`. The tail stops inside its head, so no cap sticks
129
- // out of it in `sharp` (the old tails ran into the heads' corners). Duotone and vivid: the top
130
- // arrow primary, the bottom one secondary.
129
+ // out of it in `sharp` (the old tails ran into the heads' corners). Each head (7.2 wide, 4.2 long)
130
+ // points along the chord to the start of the other arrow's tail, with a clear gap before it — the
131
+ // bigger heads pointed past the tails and nearly touched them. Duotone and vivid: the top arrow
132
+ // primary, the bottom one secondary.
131
133
  const REFRESH_TOP = {
132
- tail: 'M5.82 8.71A7 7 0 0 1 18 8.39',
133
- head: 'M22.25 7L20.75 13.96L14.34 10.86z',
134
+ tail: 'M6.34 7.89A7 7 0 0 1 17.98 8.37',
135
+ head: 'M14.59 8.46L17.89 12.9L21.77 8.96z',
134
136
  };
135
137
  const REFRESH_BOTTOM = {
136
- tail: 'M18.18 15.29A7 7 0 0 1 6 15.61',
137
- head: 'M1.75 17L3.25 10.04L9.66 13.14z',
138
+ tail: 'M17.66 16.11A7 7 0 0 1 6.02 15.63',
139
+ head: 'M9.41 15.54L6.11 11.1L2.23 15.04z',
138
140
  };
139
141
  function refreshArrows(top, bottom, strokeWidth) {
140
142
  return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("path", { d: REFRESH_TOP.tail, stroke: top, strokeWidth: strokeWidth * 2, fill: "none" }), jsxRuntime.jsx("path", { d: REFRESH_TOP.head, fill: top }), jsxRuntime.jsx("path", { d: REFRESH_BOTTOM.tail, stroke: bottom, strokeWidth: strokeWidth * 2, fill: "none" }), jsxRuntime.jsx("path", { d: REFRESH_BOTTOM.head, fill: bottom })] }));
@@ -28,11 +28,14 @@ const APARTMENT_WINDOWS = [
28
28
  { x: 14, y: 13 },
29
29
  ];
30
30
  const APARTMENT_DOOR = { x: 10, y: 18, width: 4, height: 4 };
31
+ /** The door of the solid variants: it stops short of the ground, leaving a thin primary sill. */
32
+ const APARTMENT_DOOR_SILL = { ...APARTMENT_DOOR, height: 3.25 };
31
33
  const NtdApartment = /* @__PURE__ */ createIcon.createIcon({
32
34
  displayName: 'NtdApartment',
33
35
  paths: {
34
- // the windows and the door filled in the accent colour, no frames (round 33)
35
- solid: ({ primaryColor, accentColor, accentOpacity, uid }) => (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("rect", { ...APARTMENT, fill: primaryColor }), jsxRuntime.jsxs("g", { fill: accentColor, opacity: accentOpacity, children: [APARTMENT_WINDOWS.map((w) => (jsxRuntime.jsx("rect", { ...w, width: "3", height: "3", rx: "0.5" }, `${w.x}-${w.y}`))), iconParts.within(uid, 'door', jsxRuntime.jsx("rect", { ...APARTMENT }), jsxRuntime.jsx("rect", { ...APARTMENT_DOOR }))] })] })),
36
+ // the windows and the door filled in the accent colour, no frames (round 33), a sill under the
37
+ // door (round 34)
38
+ solid: ({ primaryColor, accentColor, accentOpacity }) => (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("rect", { ...APARTMENT, fill: primaryColor }), jsxRuntime.jsxs("g", { fill: accentColor, opacity: accentOpacity, children: [APARTMENT_WINDOWS.map((w) => (jsxRuntime.jsx("rect", { ...w, width: "3", height: "3", rx: "0.5" }, `${w.x}-${w.y}`))), jsxRuntime.jsx("rect", { ...APARTMENT_DOOR_SILL })] })] })),
36
39
  outline: ({ primaryColor, strokeWidth }) => (jsxRuntime.jsxs("g", { stroke: primaryColor, strokeWidth: strokeWidth, fill: "none", children: [jsxRuntime.jsx("rect", { ...APARTMENT }), APARTMENT_WINDOWS.map((w) => (jsxRuntime.jsx("rect", { ...w, width: "3", height: "3", rx: "0.5" }, `${w.x}-${w.y}`))), jsxRuntime.jsx("rect", { ...APARTMENT_DOOR })] })),
37
40
  duotone: ({ primaryColor, secondaryColor }) => (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("rect", { ...APARTMENT, fill: primaryColor }), jsxRuntime.jsxs("g", { fill: secondaryColor, children: [APARTMENT_WINDOWS.map((w) => (jsxRuntime.jsx("rect", { ...w, width: "3", height: "3", rx: "0.5" }, `${w.x}-${w.y}`))), jsxRuntime.jsx("rect", { ...APARTMENT_DOOR })] })] })),
38
41
  vivid: ({ primaryColor, secondaryColor, accentColor, accentOpacity }) => (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("rect", { ...APARTMENT, fill: primaryColor }), jsxRuntime.jsx("g", { fill: secondaryColor, children: APARTMENT_WINDOWS.map((w) => (jsxRuntime.jsx("rect", { ...w, width: "3", height: "3", rx: "0.5" }, `${w.x}-${w.y}`))) }), jsxRuntime.jsx("rect", { ...APARTMENT_DOOR, fill: accentColor, opacity: accentOpacity })] })),
@@ -67,6 +67,8 @@ const TRIANGLE_LINE = 'M12 4.24L20.38 21H3.62Z';
67
67
  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';
68
68
  const NtdTriangle = /* @__PURE__ */ createIcon.createIcon({
69
69
  displayName: 'NtdTriangle',
70
+ // text children centre on the centroid, low in the box (stacking, 1.3.5)
71
+ textCenter: [12, 15.3],
70
72
  paths: {
71
73
  solid: ({ primaryColor }) => jsxRuntime.jsx("polygon", { points: "12,2 22,22 2,22", fill: primaryColor }),
72
74
  rounded: ({ primaryColor }) => jsxRuntime.jsx("path", { d: TRIANGLE_ROUND, fill: primaryColor }),
@@ -126,15 +128,6 @@ const NtdCross = /* @__PURE__ */ createIcon.createIcon({
126
128
  rounded: ({ primaryColor }) => (jsxRuntime.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 })),
127
129
  },
128
130
  });
129
- const NtdStar4 = /* @__PURE__ */ createIcon.createIcon({
130
- displayName: 'NtdStar4',
131
- paths: {
132
- solid: ({ primaryColor, strokeWidth: _strokeWidth }) => (jsxRuntime.jsx("path", { d: "M12 2l2.5 7.5L22 12l-7.5 2.5L12 22l-2.5-7.5L2 12l7.5-2.5z", fill: primaryColor })),
133
- outline: ({ primaryColor, strokeWidth }) => (jsxRuntime.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" })),
134
- duotone: ({ primaryColor, secondaryColor, secondaryOpacity, strokeWidth }) => (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.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 }), jsxRuntime.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" })] })),
135
- vivid: ({ primaryColor, secondaryColor: _secondaryColor }) => (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("path", { d: "M12 2l2.5 7.5L22 12l-7.5 2.5L12 22l-2.5-7.5L2 12l7.5-2.5z", fill: primaryColor }), jsxRuntime.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" })] })),
136
- },
137
- });
138
131
  // The four corner arrows: the tail's level run sits at the height of the arrowhead's tip, so the
139
132
  // two meet (it ran 2 units off the tip and the head looked stuck on beside the tail). It stops 2
140
133
  // short of the tip: with the square caps of `sharp` it stuck out of the point. The filled variants
@@ -240,13 +233,25 @@ const NtdMove = /* @__PURE__ */ createIcon.createIcon({
240
233
  vivid: ({ primaryColor, strokeWidth }) => (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("path", { d: moveShape(strokeWidth), fill: primaryColor }), jsxRuntime.jsx("path", { d: moveShape(strokeWidth), fill: "white", opacity: "0.1" })] })),
241
234
  },
242
235
  });
236
+ // NtdRepeat: two hooked arrows, a line glyph twice the stroke width in every variant but `outline`
237
+ // — redrawn tighter (shafts at y 6 and 18, heads 3 long) so the heavier lines stay in the box. As
238
+ // in NtdMaximize, each shaft stops 0.35 × the line width short of its head's point, so the square
239
+ // cap of `sharp` stays inside the head (it stuck out of both points). Duotone and vivid: one arrow
240
+ // primary, the other secondary (vivid had a fixed #3B82F6 head).
241
+ const REPEAT_HEADS = ['M17 3L20 6L17 9', 'M7 21L4 18L7 15'];
242
+ const REPEAT_OUTLINE = 'M17 1l4 4-4 4M3 11V9a4 4 0 014-4h14M7 23l-4-4 4-4M21 13v2a4 4 0 01-4 4H3';
243
+ function repeatArrows(first, second, strokeWidth) {
244
+ const width = strokeWidth * 2;
245
+ const back = width * 0.35;
246
+ return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("path", { d: `${REPEAT_HEADS[0]}M4 10V9a3 3 0 013-3H${20 - back}`, stroke: first, strokeWidth: width, fill: "none" }), jsxRuntime.jsx("path", { d: `${REPEAT_HEADS[1]}M20 14v1a3 3 0 01-3 3H${4 + back}`, stroke: second, strokeWidth: width, fill: "none" })] }));
247
+ }
243
248
  const NtdRepeat = /* @__PURE__ */ createIcon.createIcon({
244
249
  displayName: 'NtdRepeat',
245
250
  paths: {
246
- solid: ({ primaryColor, strokeWidth }) => (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("polyline", { points: "17,1 21,5 17,9", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsxRuntime.jsx("path", { d: "M3 11V9a4 4 0 014-4h14", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsxRuntime.jsx("polyline", { points: "7,23 3,19 7,15", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsxRuntime.jsx("path", { d: "M21 13v2a4 4 0 01-4 4H3", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" })] })),
247
- outline: ({ primaryColor, strokeWidth }) => (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("polyline", { points: "17,1 21,5 17,9", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsxRuntime.jsx("path", { d: "M3 11V9a4 4 0 014-4h14", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsxRuntime.jsx("polyline", { points: "7,23 3,19 7,15", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsxRuntime.jsx("path", { d: "M21 13v2a4 4 0 01-4 4H3", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" })] })),
248
- duotone: ({ primaryColor, secondaryColor, secondaryOpacity, strokeWidth }) => (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("path", { d: "M3 11V9a4 4 0 014-4h14", stroke: secondaryColor, strokeWidth: strokeWidth, fill: "none", opacity: secondaryOpacity + 0.2 }), jsxRuntime.jsx("path", { d: "M21 13v2a4 4 0 01-4 4H3", stroke: secondaryColor, strokeWidth: strokeWidth, fill: "none", opacity: secondaryOpacity + 0.2 }), jsxRuntime.jsx("polyline", { points: "17,1 21,5 17,9", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsxRuntime.jsx("polyline", { points: "7,23 3,19 7,15", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" })] })),
249
- vivid: ({ primaryColor, secondaryColor }) => (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("polyline", { points: "17,1 21,5 17,9", stroke: primaryColor, strokeWidth: "2", fill: "none" }), jsxRuntime.jsx("path", { d: "M3 11V9a4 4 0 014-4h14", stroke: secondaryColor, strokeWidth: "1.8", fill: "none" }), jsxRuntime.jsx("polyline", { points: "7,23 3,19 7,15", stroke: "#3B82F6", strokeWidth: "1.5", fill: "none" }), jsxRuntime.jsx("path", { d: "M21 13v2a4 4 0 01-4 4H3", stroke: secondaryColor, strokeWidth: "1.5", fill: "none" })] })),
251
+ solid: ({ primaryColor, strokeWidth }) => repeatArrows(primaryColor, primaryColor, strokeWidth),
252
+ outline: ({ primaryColor, strokeWidth }) => (jsxRuntime.jsx("path", { d: REPEAT_OUTLINE, stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" })),
253
+ duotone: ({ primaryColor, secondaryColor, strokeWidth }) => repeatArrows(primaryColor, secondaryColor, strokeWidth),
254
+ vivid: ({ primaryColor, secondaryColor, strokeWidth }) => repeatArrows(primaryColor, secondaryColor, strokeWidth),
250
255
  },
251
256
  });
252
257
  const NtdShuffle = /* @__PURE__ */ createIcon.createIcon({
@@ -346,5 +351,4 @@ exports.NtdRepeat = NtdRepeat;
346
351
  exports.NtdSegment = NtdSegment;
347
352
  exports.NtdShuffle = NtdShuffle;
348
353
  exports.NtdSquare = NtdSquare;
349
- exports.NtdStar4 = NtdStar4;
350
354
  exports.NtdTriangle = NtdTriangle;
@@ -2,6 +2,7 @@
2
2
 
3
3
  var jsxRuntime = require('react/jsx-runtime');
4
4
  var createIcon = require('../createIcon.js');
5
+ var weather = require('./weather.js');
5
6
 
6
7
  /* ────────────────────────────────────────────────────────────────────────────
7
8
  RECYCLING & WASTE
@@ -63,15 +64,6 @@ const NtdEvCharger = /* @__PURE__ */ createIcon.createIcon({
63
64
  vivid: ({ primaryColor, secondaryColor: _secondaryColor }) => (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("rect", { x: "4", y: "2", width: "12", height: "18", rx: "2", fill: primaryColor }), jsxRuntime.jsx("rect", { x: "4", y: "2", width: "12", height: "18", rx: "2", fill: "white", opacity: "0.08" }), jsxRuntime.jsx("path", { d: "M8 8h4v4H8z", fill: "white" }), jsxRuntime.jsx("circle", { cx: "10", cy: "16", r: "1", fill: "white" }), jsxRuntime.jsx("path", { d: "M10 6v2M10 12v2M8 10h4", stroke: "white", strokeWidth: "1", strokeLinecap: "round" }), jsxRuntime.jsx("path", { d: "M16 10h2a2 2 0 012 2v4a2 2 0 01-2 2h-2", stroke: "white", strokeWidth: "1", strokeLinecap: "round" })] })),
64
65
  },
65
66
  });
66
- const NtdHydropower = /* @__PURE__ */ createIcon.createIcon({
67
- displayName: 'NtdHydropower',
68
- paths: {
69
- solid: ({ primaryColor }) => (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("path", { d: "M12 2c-4 4-6 7-6 10a6 6 0 1012 0c0-3-2-6-6-10z", fill: primaryColor }), jsxRuntime.jsx("path", { d: "M12 8v4l2-2M12 12l-2-2", stroke: "white", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round" })] })),
70
- outline: ({ primaryColor, strokeWidth }) => (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("path", { d: "M12 2c-4 4-6 7-6 10a6 6 0 1012 0c0-3-2-6-6-10z", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsxRuntime.jsx("path", { d: "M12 8v4l2-2M12 12l-2-2", stroke: primaryColor, strokeWidth: strokeWidth, strokeLinecap: "round", strokeLinejoin: "round" })] })),
71
- duotone: ({ primaryColor, secondaryColor, secondaryOpacity, strokeWidth }) => (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("path", { d: "M12 2c-4 4-6 7-6 10a6 6 0 1012 0c0-3-2-6-6-10z", fill: secondaryColor, opacity: secondaryOpacity }), jsxRuntime.jsx("path", { d: "M12 2c-4 4-6 7-6 10a6 6 0 1012 0c0-3-2-6-6-10z", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsxRuntime.jsx("path", { d: "M12 8v4l2-2M12 12l-2-2", stroke: primaryColor, strokeWidth: strokeWidth, strokeLinecap: "round", strokeLinejoin: "round" })] })),
72
- vivid: ({ primaryColor, secondaryColor: _secondaryColor }) => (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("path", { d: "M12 2c-4 4-6 7-6 10a6 6 0 1012 0c0-3-2-6-6-10z", fill: primaryColor }), jsxRuntime.jsx("path", { d: "M12 2c-4 4-6 7-6 10a6 6 0 1012 0c0-3-2-6-6-10z", fill: "white", opacity: "0.1" }), jsxRuntime.jsx("path", { d: "M12 8v4l2-2M12 12l-2-2", stroke: "white", strokeWidth: "1.8", strokeLinecap: "round", strokeLinejoin: "round" })] })),
73
- },
74
- });
75
67
  /* ────────────────────────────────────────────────────────────────────────────
76
68
  CARBON & CLIMATE
77
69
  ───────────────────────────────────────────────────────────────────────────── */
@@ -163,7 +155,7 @@ const sustainabilityIcons = {
163
155
  NtdSolarPanel,
164
156
  NtdWindTurbine,
165
157
  NtdEvCharger,
166
- NtdHydropower,
158
+ NtdHydropower: weather.NtdHydropower,
167
159
  NtdCarbonFootprint,
168
160
  NtdCo2,
169
161
  NtdNetZero,
@@ -180,7 +172,6 @@ exports.NtdCo2 = NtdCo2;
180
172
  exports.NtdCompost = NtdCompost;
181
173
  exports.NtdEcoFriendly = NtdEcoFriendly;
182
174
  exports.NtdEvCharger = NtdEvCharger;
183
- exports.NtdHydropower = NtdHydropower;
184
175
  exports.NtdNetZero = NtdNetZero;
185
176
  exports.NtdOrganic = NtdOrganic;
186
177
  exports.NtdPlantTree = NtdPlantTree;
@@ -43,26 +43,27 @@ const NtdCar = /* @__PURE__ */ createIcon.createIcon({
43
43
  vivid: ({ primaryColor, secondaryColor: _secondaryColor }) => (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("path", { d: "M5 11l2-5h10l2 5M3 14v4a1 1 0 001 1h2a1 1 0 001-1v-1h10v1a1 1 0 001 1h2a1 1 0 001-1v-4a2 2 0 00-2-2H5a2 2 0 00-2 2z", fill: primaryColor }), jsxRuntime.jsx("path", { d: "M5 11l2-5h10l2 5M3 14v4a1 1 0 001 1h2a1 1 0 001-1v-1h10v1a1 1 0 001 1h2a1 1 0 001-1v-4a2 2 0 00-2-2H5a2 2 0 00-2 2z", fill: "white", opacity: "0.08" }), jsxRuntime.jsx("circle", { cx: "7", cy: "15", r: "1.5", fill: "white", opacity: "0.5" }), jsxRuntime.jsx("circle", { cx: "17", cy: "15", r: "1.5", fill: "white", opacity: "0.5" })] })),
44
44
  },
45
45
  });
46
- // NtdBus: a side view — the body with one long window, a passenger (NtdUser's head and shoulders)
47
- // in it on the left, a stripe below, and wheels set in arches. Filled, the window, the stripe, the
48
- // arches and the hubs are in the accent colour (fixed 50% white before) and the passenger primary.
49
- const BUS_BODY = { x: 2, y: 4, width: 20, height: 13, rx: 2.5 };
50
- const BUS_WINDOW = { x: 4, y: 6.5, width: 16, height: 4.5, rx: 1 };
51
- /** The passenger, cut off by the window's bottom edge. */
52
- const BUS_PASSENGER = 'M7 7.4a1.25 1.25 0 110 2.5 1.25 1.25 0 110-2.5zM4.9 11.6v-.3a1.9 1.9 0 011.9-1.9h.4a1.9 1.9 0 011.9 1.9v.3z';
53
- const BUS_STRIPE = 'M2 13.5h20';
54
- const BUS_WHEELS = 'M7 14.5a2.5 2.5 0 110 5 2.5 2.5 0 110-5zM17 14.5a2.5 2.5 0 110 5 2.5 2.5 0 110-5z';
55
- const BUS_ARCHES = 'M7 13.7a3.3 3.3 0 110 6.6 3.3 3.3 0 110-6.6zM17 13.7a3.3 3.3 0 110 6.6 3.3 3.3 0 110-6.6z';
56
- const BUS_HUBS = 'M7 16.1a.9.9 0 110 1.8.9.9 0 110-1.8zM17 16.1a.9.9 0 110 1.8.9.9 0 110-1.8z';
46
+ // NtdBus: seen from the front — the body with a big windscreen (its top frame 1.75, 30% less than
47
+ // the side view's), the driver (NtdUser's head and shoulders) in it on the left, two headlights and
48
+ // a bumper line below it, and the wheels as rectangles under the body (round side-view wheels
49
+ // read oddly). Filled, the windscreen, the headlights and the bumper are in the accent colour and
50
+ // the driver primary.
51
+ const BUS_BODY = { x: 3, y: 2, width: 18, height: 17, rx: 2.5 };
52
+ const BUS_WINDOW = { x: 4.75, y: 3.75, width: 14.5, height: 7.5, rx: 1 };
53
+ /** The driver, cut off by the windscreen's bottom edge. */
54
+ 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';
55
+ 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';
56
+ const BUS_BUMPER = 'M3 17.4h18';
57
+ 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';
57
58
  function busFilled({ primaryColor, uid }, glass, details, detailOpacity) {
58
- return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("rect", { ...BUS_BODY, fill: primaryColor }), iconParts.within(uid, 'body', jsxRuntime.jsx("rect", { ...BUS_BODY }), jsxRuntime.jsxs("g", { opacity: detailOpacity, children: [jsxRuntime.jsx("path", { d: BUS_ARCHES, fill: details }), jsxRuntime.jsx("path", { d: BUS_STRIPE, stroke: details, strokeWidth: "1.2" })] })), jsxRuntime.jsx("rect", { ...BUS_WINDOW, fill: glass }), iconParts.within(uid, 'window', jsxRuntime.jsx("rect", { ...BUS_WINDOW }), jsxRuntime.jsx("path", { d: BUS_PASSENGER, fill: primaryColor })), jsxRuntime.jsx("path", { d: BUS_WHEELS, fill: primaryColor }), jsxRuntime.jsx("path", { d: BUS_HUBS, fill: details, opacity: detailOpacity })] }));
59
+ return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("path", { d: BUS_WHEELS, fill: primaryColor }), jsxRuntime.jsx("rect", { ...BUS_BODY, fill: primaryColor }), jsxRuntime.jsxs("g", { opacity: detailOpacity, children: [jsxRuntime.jsx("path", { d: BUS_LIGHTS, fill: details }), iconParts.within(uid, 'body', jsxRuntime.jsx("rect", { ...BUS_BODY }), jsxRuntime.jsx("path", { d: BUS_BUMPER, stroke: details, strokeWidth: "1.2" }))] }), jsxRuntime.jsx("rect", { ...BUS_WINDOW, fill: glass }), iconParts.within(uid, 'window', jsxRuntime.jsx("rect", { ...BUS_WINDOW }), jsxRuntime.jsx("path", { d: BUS_DRIVER, fill: primaryColor }))] }));
59
60
  }
60
61
  const NtdBus = /* @__PURE__ */ createIcon.createIcon({
61
62
  displayName: 'NtdBus',
62
63
  paths: {
63
64
  solid: (props) => busFilled(props, props.accentColor, props.accentColor, props.accentOpacity),
64
- outline: ({ primaryColor, strokeWidth }) => (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("rect", { ...BUS_BODY, stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsxRuntime.jsx("rect", { ...BUS_WINDOW, stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsxRuntime.jsx("path", { d: BUS_PASSENGER, fill: primaryColor }), jsxRuntime.jsx("path", { d: "M4 13.5h16", stroke: primaryColor, strokeWidth: strokeWidth }), jsxRuntime.jsx("path", { d: BUS_WHEELS, stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" })] })),
65
- // fills only: the body and the passenger primary, the window and the details secondary
65
+ outline: ({ primaryColor, strokeWidth, uid }) => (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("rect", { ...BUS_BODY, stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsxRuntime.jsx("rect", { ...BUS_WINDOW, stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), iconParts.within(uid, 'window', jsxRuntime.jsx("rect", { ...BUS_WINDOW }), jsxRuntime.jsx("path", { d: BUS_DRIVER, fill: primaryColor })), jsxRuntime.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 }), jsxRuntime.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" })] })),
66
+ // fills only: the body and the driver primary, the windscreen and the details secondary
66
67
  duotone: (props) => busFilled(props, props.secondaryColor, props.secondaryColor, 1),
67
68
  vivid: (props) => busFilled(props, props.secondaryColor, props.accentColor, props.accentOpacity),
68
69
  },
@@ -59,19 +59,24 @@ const NtdUsers = /* @__PURE__ */ createIcon.createIcon({
59
59
  },
60
60
  });
61
61
  // NtdHeart: duotone fills the heart primary inside a secondary outline (the other way round
62
- // before); vivid splits it down the middle — primary left, secondary right — with an accent seam.
62
+ // before); vivid splits it down the middle — primary left, secondary right — inside an accent
63
+ // outline (it was an accent seam between the halves).
63
64
  const HEART = 'M20.84 4.61a5.5 5.5 0 00-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 00-7.78 7.78l1.06 1.06L12 21.23l7.78-7.78 1.06-1.06a5.5 5.5 0 000-7.78z';
64
65
  const NtdHeart = /* @__PURE__ */ createIcon.createIcon({
65
66
  displayName: 'NtdHeart',
67
+ // text children centre on the middle of the lobes and the point (stacking, 1.3.5)
68
+ textCenter: [12, 11.2],
66
69
  paths: {
67
70
  solid: ({ primaryColor, strokeWidth: _strokeWidth }) => (jsxRuntime.jsx("path", { d: "M20.84 4.61a5.5 5.5 0 00-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 00-7.78 7.78l1.06 1.06L12 21.23l7.78-7.78 1.06-1.06a5.5 5.5 0 000-7.78z", fill: primaryColor })),
68
71
  outline: ({ primaryColor, strokeWidth }) => (jsxRuntime.jsx("path", { d: "M20.84 4.61a5.5 5.5 0 00-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 00-7.78 7.78l1.06 1.06L12 21.23l7.78-7.78 1.06-1.06a5.5 5.5 0 000-7.78z", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" })),
69
72
  duotone: ({ primaryColor, secondaryColor, strokeWidth }) => (jsxRuntime.jsx("path", { d: HEART, fill: primaryColor, stroke: secondaryColor, strokeWidth: strokeWidth })),
70
- vivid: ({ primaryColor, secondaryColor, accentColor, accentOpacity, uid }) => (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("path", { d: HEART, fill: secondaryColor }), iconParts.within(uid, 'left', jsxRuntime.jsx("rect", { x: "0", y: "0", width: "12", height: "24" }), jsxRuntime.jsx("path", { d: HEART, fill: primaryColor })), iconParts.within(uid, 'seam', jsxRuntime.jsx("path", { d: HEART }), jsxRuntime.jsx("path", { d: "M12 2v21", stroke: accentColor, strokeWidth: "1.5", opacity: accentOpacity }))] })),
73
+ vivid: ({ primaryColor, secondaryColor, accentColor, accentOpacity, strokeWidth, uid }) => (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("path", { d: HEART, fill: secondaryColor }), iconParts.within(uid, 'left', jsxRuntime.jsx("rect", { x: "0", y: "0", width: "12", height: "24" }), jsxRuntime.jsx("path", { d: HEART, fill: primaryColor })), jsxRuntime.jsx("path", { d: HEART, stroke: accentColor, strokeWidth: strokeWidth, opacity: accentOpacity, fill: "none" })] })),
71
74
  },
72
75
  });
73
76
  const NtdStar = /* @__PURE__ */ createIcon.createIcon({
74
77
  displayName: 'NtdStar',
78
+ // text children centre on the middle of the body, below the box centre (stacking, 1.3.5)
79
+ textCenter: [12, 12.6],
75
80
  paths: {
76
81
  solid: ({ primaryColor, strokeWidth: _strokeWidth }) => (jsxRuntime.jsx("path", { d: "M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z", fill: primaryColor })),
77
82
  outline: ({ primaryColor, strokeWidth }) => (jsxRuntime.jsx("path", { d: "M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" })),
@@ -147,15 +152,48 @@ const NtdHelp = /* @__PURE__ */ createIcon.createIcon({
147
152
  vivid: ({ primaryColor, secondaryColor }) => (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("circle", { cx: "12", cy: "12", r: "10", fill: primaryColor }), jsxRuntime.jsx("circle", { cx: "12", cy: "12", r: "10", fill: "white", opacity: "0.08" }), jsxRuntime.jsx("circle", { cx: "12", cy: "17", r: "1", fill: secondaryColor }), jsxRuntime.jsx("path", { d: "M9.09 9a3 3 0 015.83 1c0 2-3 3-3 3", stroke: "white", strokeWidth: "1", fill: "none", opacity: "0.4" })] })),
148
153
  },
149
154
  });
150
- /** The hands: minute 6.8 long, hour 5.4 (were 6 and 4.5). */
155
+ /**
156
+ * The hands: minute 6.8 long, hour 5.4 (were 6 and 4.5) — twice the stroke width in every variant
157
+ * but `outline`.
158
+ */
151
159
  const CLOCK_HANDS = 'M12 5.2V12l4.83 2.41';
152
160
  const NtdClock = /* @__PURE__ */ createIcon.createIcon({
153
161
  displayName: 'NtdClock',
154
162
  paths: {
155
- solid: ({ primaryColor, accentColor, accentOpacity, strokeWidth }) => (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("circle", { cx: "12", cy: "12", r: "10", fill: primaryColor }), jsxRuntime.jsx("path", { d: CLOCK_HANDS, stroke: accentColor, strokeWidth: strokeWidth, opacity: accentOpacity })] })),
163
+ solid: ({ primaryColor, accentColor, accentOpacity, strokeWidth }) => (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("circle", { cx: "12", cy: "12", r: "10", fill: primaryColor }), jsxRuntime.jsx("path", { d: CLOCK_HANDS, stroke: accentColor, strokeWidth: strokeWidth * 2, opacity: accentOpacity })] })),
156
164
  outline: ({ primaryColor, strokeWidth }) => (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("circle", { cx: "12", cy: "12", r: "10", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsxRuntime.jsx("path", { d: CLOCK_HANDS, stroke: primaryColor, strokeWidth: strokeWidth })] })),
157
- duotone: ({ primaryColor, secondaryColor, secondaryOpacity, strokeWidth }) => (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("circle", { cx: "12", cy: "12", r: "10", fill: secondaryColor, opacity: secondaryOpacity }), jsxRuntime.jsx("circle", { cx: "12", cy: "12", r: "10", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsxRuntime.jsx("path", { d: CLOCK_HANDS, stroke: primaryColor, strokeWidth: strokeWidth })] })),
158
- vivid: ({ primaryColor, secondaryColor }) => (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("circle", { cx: "12", cy: "12", r: "10", fill: primaryColor }), jsxRuntime.jsx("circle", { cx: "12", cy: "12", r: "10", fill: "white", opacity: "0.1" }), jsxRuntime.jsx("path", { d: CLOCK_HANDS, stroke: secondaryColor, strokeWidth: "1.8" })] })),
165
+ duotone: ({ primaryColor, secondaryColor, secondaryOpacity, strokeWidth }) => (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("circle", { cx: "12", cy: "12", r: "10", fill: secondaryColor, opacity: secondaryOpacity }), jsxRuntime.jsx("circle", { cx: "12", cy: "12", r: "10", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsxRuntime.jsx("path", { d: CLOCK_HANDS, stroke: primaryColor, strokeWidth: strokeWidth * 2 })] })),
166
+ vivid: ({ primaryColor, secondaryColor, strokeWidth }) => (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("circle", { cx: "12", cy: "12", r: "10", fill: primaryColor }), jsxRuntime.jsx("circle", { cx: "12", cy: "12", r: "10", fill: "white", opacity: "0.1" }), jsxRuntime.jsx("path", { d: CLOCK_HANDS, stroke: secondaryColor, strokeWidth: strokeWidth * 2 })] })),
167
+ },
168
+ });
169
+ // NtdHourglass: two plates and the curved glass between them, the sand running from the top bulb
170
+ // (resting at the neck) through a thread onto a pile in the bottom one. Under the `turn` animation
171
+ // the sand pours while the glass holds, in step with the turns (animations.css): each bulb draws
172
+ // its sand twice — at the neck and piled on the base — both scaled from a full bulb, which the
173
+ // CSS swaps between; at rest they are drawn here part way through. Duotone and vivid: the sand
174
+ // secondary.
175
+ const HOURGLASS_PLATES = [
176
+ { x: 4, y: 2, width: 16, height: 2.5, rx: 1 },
177
+ { x: 4, y: 19.5, width: 16, height: 2.5, rx: 1 },
178
+ ];
179
+ const HOURGLASS_GLASS = 'M6.5 4.5v1.3c0 2.9 2.1 4.6 4.1 6.2-2 1.6-4.1 3.3-4.1 6.2v1.3M17.5 4.5v1.3c0 2.9-2.1 4.6-4.1 6.2 2 1.6 4.1 3.3 4.1 6.2v1.3';
180
+ /** A full bulb of sand: the top one (apex at the neck 12,11.4, base at 5.8) and the bottom one. */
181
+ const HOURGLASS_SAND_TOP = 'M8.2 5.8h7.6c0 2.3-1.5 3.9-3.8 5.6-2.3-1.7-3.8-3.3-3.8-5.6z';
182
+ const HOURGLASS_SAND_BOTTOM = 'M8.2 18.2h7.6c0-2.3-1.5-3.9-3.8-5.6-2.3 1.7-3.8 3.3-3.8 5.6z';
183
+ function hourglassSand(fill, strokeWidth) {
184
+ const part = (name) => `ntd-hourglass-sand ntd-hourglass-sand--${name}`;
185
+ return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("path", { className: part('top-neck'), d: HOURGLASS_SAND_TOP, fill: fill, transform: "translate(12 11.4) scale(0.6) translate(-12 -11.4)" }), jsxRuntime.jsx("path", { className: part('top-base'), d: HOURGLASS_SAND_TOP, fill: fill, transform: "scale(0)" }), jsxRuntime.jsx("path", { className: part('bottom-neck'), d: HOURGLASS_SAND_BOTTOM, fill: fill, transform: "scale(0)" }), jsxRuntime.jsx("path", { className: part('bottom-base'), d: HOURGLASS_SAND_BOTTOM, fill: fill, transform: "translate(0 18.2) scale(1 0.45) translate(0 -18.2)" }), jsxRuntime.jsx("path", { className: part('stream-up'), d: "M12 11.6V6.4", stroke: fill, strokeWidth: strokeWidth * 0.5, opacity: "0" }), jsxRuntime.jsx("path", { className: part('stream-down'), d: "M12 12.4V17.6", stroke: fill, strokeWidth: strokeWidth * 0.5 })] }));
186
+ }
187
+ function hourglassFilled(frame, sand, strokeWidth) {
188
+ return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [HOURGLASS_PLATES.map((p) => (jsxRuntime.jsx("rect", { ...p, fill: frame }, p.y))), jsxRuntime.jsx("path", { d: HOURGLASS_GLASS, stroke: frame, strokeWidth: strokeWidth, fill: "none" }), hourglassSand(sand, strokeWidth)] }));
189
+ }
190
+ const NtdHourglass = /* @__PURE__ */ createIcon.createIcon({
191
+ displayName: 'NtdHourglass',
192
+ paths: {
193
+ solid: ({ primaryColor, strokeWidth }) => hourglassFilled(primaryColor, primaryColor, strokeWidth),
194
+ outline: ({ primaryColor, strokeWidth }) => (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("path", { d: `M4.5 3.25h15M4.5 20.75h15${HOURGLASS_GLASS}`, stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), hourglassSand(primaryColor, strokeWidth)] })),
195
+ duotone: ({ primaryColor, secondaryColor, strokeWidth }) => hourglassFilled(primaryColor, secondaryColor, strokeWidth),
196
+ vivid: ({ primaryColor, secondaryColor, strokeWidth }) => hourglassFilled(primaryColor, secondaryColor, strokeWidth),
159
197
  },
160
198
  });
161
199
  // The binder rings are 1.6x the stroke wide; the header line is a cut across the page, kept
@@ -242,6 +280,8 @@ const NtdThumbDown = /* @__PURE__ */ createIcon.createIcon({
242
280
  });
243
281
  const NtdShield = /* @__PURE__ */ createIcon.createIcon({
244
282
  displayName: 'NtdShield',
283
+ // text children centre on the wide upper part of the shield (stacking, 1.3.5)
284
+ textCenter: [12, 11],
245
285
  paths: {
246
286
  solid: ({ primaryColor, strokeWidth: _strokeWidth }) => (jsxRuntime.jsx("path", { d: "M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z", fill: primaryColor })),
247
287
  outline: ({ primaryColor, strokeWidth }) => (jsxRuntime.jsx("path", { d: "M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" })),
@@ -333,6 +373,7 @@ exports.NtdGlobe = NtdGlobe;
333
373
  exports.NtdHeart = NtdHeart;
334
374
  exports.NtdHelp = NtdHelp;
335
375
  exports.NtdHome = NtdHome;
376
+ exports.NtdHourglass = NtdHourglass;
336
377
  exports.NtdInfo = NtdInfo;
337
378
  exports.NtdMap = NtdMap;
338
379
  exports.NtdMoon = NtdMoon;
@@ -74,6 +74,8 @@ const NtdDroplet = /* @__PURE__ */ createIcon.createIcon({
74
74
  vivid: ({ primaryColor, secondaryColor: _secondaryColor }) => (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("path", { d: "M12 2.5C13.1 6.2 17.6 9.4 17.6 14.4a5.6 6.2 0 1 1-11.2 0C6.4 9.4 10.9 6.2 12 2.5z", fill: primaryColor }), jsxRuntime.jsx("path", { d: "M12 2.5C13.1 6.2 17.6 9.4 17.6 14.4a5.6 6.2 0 1 1-11.2 0C6.4 9.4 10.9 6.2 12 2.5z", fill: "white", opacity: "0.1" })] })),
75
75
  },
76
76
  });
77
+ /** @deprecated The same drop as {@link NtdDroplet} — use that. */
78
+ const NtdHydropower = NtdDroplet;
77
79
  const NtdThermometer = /* @__PURE__ */ createIcon.createIcon({
78
80
  displayName: 'NtdThermometer',
79
81
  paths: {
@@ -215,6 +217,7 @@ exports.NtdDroplet = NtdDroplet;
215
217
  exports.NtdFeather = NtdFeather;
216
218
  exports.NtdFire = NtdFire;
217
219
  exports.NtdFlower = NtdFlower;
220
+ exports.NtdHydropower = NtdHydropower;
218
221
  exports.NtdLeaf = NtdLeaf;
219
222
  exports.NtdMountain = NtdMountain;
220
223
  exports.NtdRain = NtdRain;