@nice2dev/icons 1.3.2 → 1.3.4

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 (47) hide show
  1. package/CHANGELOG.md +122 -0
  2. package/README.md +12 -4
  3. package/dist/cjs/createIcon.js +4 -2
  4. package/dist/cjs/figmaExport.js +1 -0
  5. package/dist/cjs/iconParts.js +34 -1
  6. package/dist/cjs/icons/actions.js +85 -64
  7. package/dist/cjs/icons/business.js +65 -28
  8. package/dist/cjs/icons/education.js +37 -13
  9. package/dist/cjs/icons/files.js +58 -18
  10. package/dist/cjs/icons/index.js +1 -0
  11. package/dist/cjs/icons/media.js +87 -30
  12. package/dist/cjs/icons/navigation.js +26 -7
  13. package/dist/cjs/icons/omniverk.js +2 -1
  14. package/dist/cjs/icons/realestate.js +48 -10
  15. package/dist/cjs/icons/science.js +10 -6
  16. package/dist/cjs/icons/shapes.js +46 -12
  17. package/dist/cjs/icons/social.js +3 -9
  18. package/dist/cjs/icons/travel.js +21 -4
  19. package/dist/cjs/icons/ui.js +80 -39
  20. package/dist/cjs/icons/weather.js +5 -4
  21. package/dist/cjs/index.js +1 -0
  22. package/dist/cjs/nicetodev-icons.css +1 -1
  23. package/dist/esm/createIcon.js +4 -2
  24. package/dist/esm/figmaExport.js +1 -0
  25. package/dist/esm/iconParts.js +34 -3
  26. package/dist/esm/icons/actions.js +87 -66
  27. package/dist/esm/icons/business.js +65 -28
  28. package/dist/esm/icons/education.js +37 -13
  29. package/dist/esm/icons/files.js +58 -18
  30. package/dist/esm/icons/index.js +1 -1
  31. package/dist/esm/icons/media.js +87 -30
  32. package/dist/esm/icons/navigation.js +26 -7
  33. package/dist/esm/icons/omniverk.js +2 -1
  34. package/dist/esm/icons/realestate.js +48 -10
  35. package/dist/esm/icons/science.js +10 -6
  36. package/dist/esm/icons/shapes.js +46 -12
  37. package/dist/esm/icons/social.js +3 -9
  38. package/dist/esm/icons/travel.js +21 -4
  39. package/dist/esm/icons/ui.js +81 -41
  40. package/dist/esm/icons/weather.js +5 -4
  41. package/dist/esm/index.js +1 -1
  42. package/dist/esm/nicetodev-icons.css +1 -1
  43. package/dist/types/iconParts.d.ts +14 -1
  44. package/dist/types/icons/index.d.ts +1 -1
  45. package/dist/types/icons/ui.d.ts +1 -0
  46. package/dist/types/types.d.ts +12 -3
  47. package/package.json +2 -2
@@ -78,8 +78,9 @@ const NtdMenu = /* @__PURE__ */ createIcon({
78
78
  paths: {
79
79
  solid: ({ primaryColor }) => (jsxs(Fragment, { children: [jsx("rect", { x: "3", y: "5", width: "18", height: "2", rx: "1", fill: primaryColor }), jsx("rect", { x: "3", y: "11", width: "18", height: "2", rx: "1", fill: primaryColor }), jsx("rect", { x: "3", y: "17", width: "18", height: "2", rx: "1", fill: primaryColor })] })),
80
80
  outline: ({ primaryColor, strokeWidth }) => (jsxs(Fragment, { children: [jsx("line", { x1: "3", y1: "6", x2: "21", y2: "6", stroke: primaryColor, strokeWidth: strokeWidth }), jsx("line", { x1: "3", y1: "12", x2: "21", y2: "12", stroke: primaryColor, strokeWidth: strokeWidth }), jsx("line", { x1: "3", y1: "18", x2: "21", y2: "18", stroke: primaryColor, strokeWidth: strokeWidth })] })),
81
- duotone: ({ primaryColor, secondaryColor, secondaryOpacity, strokeWidth }) => (jsxs(Fragment, { children: [jsx("rect", { x: "3", y: "11", width: "18", height: "2", rx: "1", fill: secondaryColor, opacity: secondaryOpacity }), jsx("line", { x1: "3", y1: "6", x2: "21", y2: "6", stroke: primaryColor, strokeWidth: strokeWidth }), jsx("line", { x1: "3", y1: "12", x2: "21", y2: "12", stroke: primaryColor, strokeWidth: strokeWidth }), jsx("line", { x1: "3", y1: "18", x2: "21", y2: "18", stroke: primaryColor, strokeWidth: strokeWidth })] })),
82
- vivid: ({ primaryColor, secondaryColor }) => (jsxs(Fragment, { children: [jsx("rect", { x: "3", y: "5", width: "18", height: "2", rx: "1", fill: primaryColor }), jsx("rect", { x: "3", y: "5", width: "18", height: "2", rx: "1", fill: "white", opacity: "0.08" }), jsx("rect", { x: "3", y: "11", width: "18", height: "2", rx: "1", fill: secondaryColor }), jsx("rect", { x: "3", y: "17", width: "18", height: "2", rx: "1", fill: "#3B82F6" })] })),
81
+ // the bars of solid, the middle one in secondary (the secondary underlay was drawn over)
82
+ duotone: ({ primaryColor, secondaryColor }) => (jsxs(Fragment, { children: [jsx("rect", { x: "3", y: "5", width: "18", height: "2", rx: "1", fill: primaryColor }), jsx("rect", { x: "3", y: "11", width: "18", height: "2", rx: "1", fill: secondaryColor }), jsx("rect", { x: "3", y: "17", width: "18", height: "2", rx: "1", fill: primaryColor })] })),
83
+ vivid: ({ primaryColor, secondaryColor }) => (jsxs(Fragment, { children: [jsx("rect", { x: "3", y: "5", width: "18", height: "2", rx: "1", fill: primaryColor }), jsx("rect", { x: "3", y: "11", width: "18", height: "2", rx: "1", fill: secondaryColor }), jsx("rect", { x: "3", y: "17", width: "18", height: "2", rx: "1", fill: primaryColor })] })),
83
84
  },
84
85
  });
85
86
  // The filled cross is drawn as two strokes at twice the stroke width, like NtdCheck: it was a
@@ -89,8 +90,9 @@ const NtdClose = /* @__PURE__ */ createIcon({
89
90
  paths: {
90
91
  solid: ({ primaryColor, strokeWidth }) => (jsx("path", { d: "M18 6L6 18M6 6l12 12", stroke: primaryColor, strokeWidth: strokeWidth * 2 })),
91
92
  outline: ({ primaryColor, strokeWidth }) => (jsxs(Fragment, { children: [jsx("line", { x1: "6", y1: "6", x2: "18", y2: "18", stroke: primaryColor, strokeWidth: strokeWidth }), jsx("line", { x1: "18", y1: "6", x2: "6", y2: "18", stroke: primaryColor, strokeWidth: strokeWidth })] })),
92
- duotone: ({ primaryColor, secondaryColor, secondaryOpacity, strokeWidth }) => (jsxs(Fragment, { children: [jsx("circle", { cx: "12", cy: "12", r: "9", fill: secondaryColor, opacity: secondaryOpacity }), jsx("line", { x1: "8", y1: "8", x2: "16", y2: "16", stroke: primaryColor, strokeWidth: strokeWidth }), jsx("line", { x1: "16", y1: "8", x2: "8", y2: "16", stroke: primaryColor, strokeWidth: strokeWidth })] })),
93
- vivid: ({ primaryColor, strokeWidth }) => (jsx("path", { d: "M18 6L6 18M6 6l12 12", stroke: primaryColor, strokeWidth: strokeWidth * 2 })),
93
+ // like NtdPlus: one stroke per colour, no backing disc; vivid adds the crossing in accent
94
+ duotone: ({ primaryColor, secondaryColor, strokeWidth }) => (jsxs(Fragment, { children: [jsx("path", { d: "M6 6l12 12", stroke: secondaryColor, strokeWidth: strokeWidth * 2 }), jsx("path", { d: "M18 6L6 18", stroke: primaryColor, strokeWidth: strokeWidth * 2 })] })),
95
+ vivid: ({ primaryColor, secondaryColor, accentColor, accentOpacity, strokeWidth }) => (jsxs(Fragment, { children: [jsx("path", { d: "M6 6l12 12", stroke: secondaryColor, strokeWidth: strokeWidth * 2 }), jsx("path", { d: "M18 6L6 18", stroke: primaryColor, strokeWidth: strokeWidth * 2 }), jsx("rect", { x: 12 - strokeWidth, y: 12 - strokeWidth, width: strokeWidth * 2, height: strokeWidth * 2, transform: "rotate(45 12 12)", fill: accentColor, opacity: accentOpacity })] })),
94
96
  },
95
97
  });
96
98
  const NtdMoreHorizontal = /* @__PURE__ */ createIcon({
@@ -120,13 +122,30 @@ const NtdExternalLink = /* @__PURE__ */ createIcon({
120
122
  vivid: ({ primaryColor, secondaryColor }) => (jsxs(Fragment, { children: [jsx("path", { d: "M18 13v6a2 2 0 01-2 2H5a2 2 0 01-2-2V8a2 2 0 012-2h6", stroke: primaryColor, strokeWidth: "2" }), jsx("polyline", { points: "16,3 21,3 21,8", stroke: secondaryColor, strokeWidth: "1.8", fill: "none" }), jsx("line", { x1: "21", y1: "3", x2: "12", y2: "12", stroke: "#3B82F6", strokeWidth: "1.5" })] })),
121
123
  },
122
124
  });
125
+ // NtdRefresh: two arcs round 12,12 (r 7), each ending in a filled head — a line glyph twice the
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). 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.
131
+ const REFRESH_TOP = {
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',
134
+ };
135
+ const REFRESH_BOTTOM = {
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',
138
+ };
139
+ function refreshArrows(top, bottom, strokeWidth) {
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 })] }));
141
+ }
123
142
  const NtdRefresh = /* @__PURE__ */ createIcon({
124
143
  displayName: 'NtdRefresh',
125
144
  paths: {
126
- solid: ({ primaryColor, strokeWidth }) => (jsx("path", { d: "M4 4v5h5M20 20v-5h-5M20.49 9A9 9 0 005.64 5.64L4 9m16 6l-1.64 3.36A9 9 0 013.51 15", stroke: primaryColor, strokeWidth: strokeWidth })),
145
+ solid: ({ primaryColor, strokeWidth }) => refreshArrows(primaryColor, primaryColor, strokeWidth),
127
146
  outline: ({ primaryColor, strokeWidth }) => (jsx("path", { d: "M4 4v5h5M20 20v-5h-5M20.49 9A9 9 0 005.64 5.64L4 9m16 6l-1.64 3.36A9 9 0 013.51 15", stroke: primaryColor, strokeWidth: strokeWidth })),
128
- duotone: ({ primaryColor, secondaryColor, secondaryOpacity, strokeWidth }) => (jsxs(Fragment, { children: [jsx("circle", { cx: "12", cy: "12", r: "8", fill: secondaryColor, opacity: secondaryOpacity }), jsx("path", { d: "M4 4v5h5M20 20v-5h-5M20.49 9A9 9 0 005.64 5.64L4 9m16 6l-1.64 3.36A9 9 0 013.51 15", stroke: primaryColor, strokeWidth: strokeWidth })] })),
129
- vivid: ({ primaryColor, secondaryColor: _secondaryColor }) => (jsx(Fragment, { children: jsx("path", { d: "M4 4v5h5M20 20v-5h-5M20.49 9A9 9 0 005.64 5.64L4 9m16 6l-1.64 3.36A9 9 0 013.51 15", stroke: primaryColor, strokeWidth: "2.2" }) })),
147
+ duotone: ({ primaryColor, secondaryColor, strokeWidth }) => refreshArrows(primaryColor, secondaryColor, strokeWidth),
148
+ vivid: ({ primaryColor, secondaryColor, strokeWidth }) => refreshArrows(primaryColor, secondaryColor, strokeWidth),
130
149
  },
131
150
  });
132
151
 
@@ -108,7 +108,8 @@ const NtdLab = /* @__PURE__ */ createIcon({
108
108
  solid: ({ primaryColor, accentColor, accentOpacity }) => (jsxs(Fragment, { children: [jsx("path", { d: LAB_FLASK, fill: primaryColor }), jsx("path", { d: LAB_LIQUID, fill: accentColor, opacity: accentOpacity })] })),
109
109
  vivid: ({ primaryColor, secondaryColor, accentColor, accentOpacity }) => (jsxs(Fragment, { children: [jsx("path", { d: LAB_FLASK, fill: primaryColor }), jsx("path", { d: LAB_LIQUID, fill: secondaryColor }), jsxs("g", { fill: accentColor, opacity: accentOpacity, children: [jsx("circle", { cx: "10.5", cy: "17.6", r: "0.9" }), jsx("circle", { cx: "13.6", cy: "18.7", r: "0.7" })] })] })),
110
110
  outline: ({ primaryColor, strokeWidth }) => (jsxs(Fragment, { children: [jsx("path", { d: "M9 2h6v2h-1v5l5.2 9a2 2 0 01-1.7 3H6.5a2 2 0 01-1.7-3L10 9V4H9V2z", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none", strokeLinejoin: "round" }), jsx("line", { x1: "6.3", y1: "15.5", x2: "17.7", y2: "15.5", stroke: primaryColor, strokeWidth: "1.4" })] })),
111
- duotone: ({ primaryColor, secondaryColor, secondaryOpacity, strokeWidth }) => (jsxs(Fragment, { children: [jsx("path", { d: LAB_LIQUID, fill: secondaryColor, opacity: secondaryOpacity }), jsx("path", { d: "M9 2h6v2h-1v5l5.2 9a2 2 0 01-1.7 3H6.5a2 2 0 01-1.7-3L10 9V4H9V2z", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none", strokeLinejoin: "round" }), jsx("line", { x1: "6.3", y1: "15.5", x2: "17.7", y2: "15.5", stroke: primaryColor, strokeWidth: "1.4" })] })),
111
+ // vivid without the bubbles: the flask primary, the liquid secondary, no outline
112
+ duotone: ({ primaryColor, secondaryColor }) => (jsxs(Fragment, { children: [jsx("path", { d: LAB_FLASK, fill: primaryColor }), jsx("path", { d: LAB_LIQUID, fill: secondaryColor })] })),
112
113
  },
113
114
  });
114
115
 
@@ -14,13 +14,29 @@ const NtdHouse = /* @__PURE__ */ createIcon({
14
14
  vivid: ({ primaryColor, secondaryColor: _secondaryColor }) => (jsxs(Fragment, { children: [jsx("path", { d: "M12 2L3 10v10a2 2 0 002 2h14a2 2 0 002-2V10L12 2z", fill: primaryColor }), jsx("path", { d: "M12 2L3 10v10a2 2 0 002 2h14a2 2 0 002-2V10L12 2z", fill: "white", opacity: "0.08" }), jsx("path", { d: "M9 22V14h6v8", stroke: "white", strokeWidth: "1.5", fill: "white", opacity: "0.3" })] })),
15
15
  },
16
16
  });
17
+ // NtdApartment: filled, the windows and the door are drawn as in the outline — frames — in the
18
+ // accent colour (they were 50% white patches), the door kept inside the building. Duotone is fills
19
+ // only: the building primary, the windows and the door secondary; vivid puts the door in the
20
+ // accent colour.
21
+ const APARTMENT = { x: 4, y: 4, width: 16, height: 18, rx: 2 };
22
+ const APARTMENT_WINDOWS = [
23
+ { x: 7, y: 7 },
24
+ { x: 14, y: 7 },
25
+ { x: 7, y: 13 },
26
+ { x: 14, y: 13 },
27
+ ];
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 };
17
31
  const NtdApartment = /* @__PURE__ */ createIcon({
18
32
  displayName: 'NtdApartment',
19
33
  paths: {
20
- solid: ({ primaryColor }) => (jsxs(Fragment, { children: [jsx("rect", { x: "4", y: "4", width: "16", height: "18", rx: "2", fill: primaryColor }), jsx("rect", { x: "7", y: "7", width: "3", height: "3", rx: "0.5", fill: "white", opacity: "0.5" }), jsx("rect", { x: "14", y: "7", width: "3", height: "3", rx: "0.5", fill: "white", opacity: "0.5" }), jsx("rect", { x: "7", y: "13", width: "3", height: "3", rx: "0.5", fill: "white", opacity: "0.5" }), jsx("rect", { x: "14", y: "13", width: "3", height: "3", rx: "0.5", fill: "white", opacity: "0.5" }), jsx("rect", { x: "10", y: "18", width: "4", height: "4", fill: "white", opacity: "0.3" })] })),
21
- outline: ({ primaryColor, strokeWidth }) => (jsxs(Fragment, { children: [jsx("rect", { x: "4", y: "4", width: "16", height: "18", rx: "2", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsx("rect", { x: "7", y: "7", width: "3", height: "3", rx: "0.5", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsx("rect", { x: "14", y: "7", width: "3", height: "3", rx: "0.5", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsx("rect", { x: "7", y: "13", width: "3", height: "3", rx: "0.5", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsx("rect", { x: "14", y: "13", width: "3", height: "3", rx: "0.5", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsx("rect", { x: "10", y: "18", width: "4", height: "4", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" })] })),
22
- duotone: ({ primaryColor, secondaryColor, secondaryOpacity, strokeWidth }) => (jsxs(Fragment, { children: [jsx("rect", { x: "4", y: "4", width: "16", height: "18", rx: "2", fill: secondaryColor, opacity: secondaryOpacity }), jsx("rect", { x: "4", y: "4", width: "16", height: "18", rx: "2", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsx("rect", { x: "7", y: "7", width: "3", height: "3", rx: "0.5", fill: primaryColor }), jsx("rect", { x: "14", y: "7", width: "3", height: "3", rx: "0.5", fill: primaryColor }), jsx("rect", { x: "7", y: "13", width: "3", height: "3", rx: "0.5", fill: primaryColor }), jsx("rect", { x: "14", y: "13", width: "3", height: "3", rx: "0.5", fill: primaryColor }), jsx("rect", { x: "10", y: "18", width: "4", height: "4", fill: primaryColor })] })),
23
- vivid: ({ primaryColor, secondaryColor: _secondaryColor }) => (jsxs(Fragment, { children: [jsx("rect", { x: "4", y: "4", width: "16", height: "18", rx: "2", fill: primaryColor }), jsx("rect", { x: "4", y: "4", width: "16", height: "18", rx: "2", fill: "white", opacity: "0.08" }), jsx("rect", { x: "7", y: "7", width: "3", height: "3", rx: "0.5", fill: "white", opacity: "0.5" }), jsx("rect", { x: "14", y: "7", width: "3", height: "3", rx: "0.5", fill: "white", opacity: "0.5" }), jsx("rect", { x: "7", y: "13", width: "3", height: "3", rx: "0.5", fill: "white", opacity: "0.5" }), jsx("rect", { x: "14", y: "13", width: "3", height: "3", rx: "0.5", fill: "white", opacity: "0.5" }), jsx("rect", { x: "10", y: "18", width: "4", height: "4", fill: "white", opacity: "0.3" })] })),
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 })] })] })),
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 })] })),
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 })] })] })),
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 })] })),
24
40
  },
25
41
  });
26
42
  const NtdCondo = /* @__PURE__ */ createIcon({
@@ -112,16 +128,38 @@ const NtdBathroom = /* @__PURE__ */ createIcon({
112
128
  });
113
129
  // NtdGarage: the door is drawn as in the outline — frame and two slats — in the accent colour on
114
130
  // the filled building (it was a 30% white patch with white lines), kept inside the building. The
115
- // duotone is fills only: building primary, door secondary, its frame and slats primary.
131
+ // duotone is fills only: building primary, door secondary, its frame and slats primary. `sharp`
132
+ // has its own building, square at the bottom (the derived one kept the path's round corners).
116
133
  const GARAGE = 'M12 2L2 8v12a2 2 0 002 2h16a2 2 0 002-2V8L12 2z';
117
- const GARAGE_DOOR = 'M5 22V12h14v10M5 15h14M5 18h14';
134
+ const GARAGE_SHARP = 'M12 2L2 8v14h20V8L12 2z';
135
+ /**
136
+ * The door of the filled garage: no line closes it at the bottom, where the building ends, so the
137
+ * slats are spaced from the stroke for three panels of the same visible height (spaced evenly,
138
+ * the bottom panel showed taller).
139
+ */
140
+ function garageDoor(strokeWidth) {
141
+ const panel = (10 - 2.5 * strokeWidth) / 3;
142
+ const first = 12 + strokeWidth + panel;
143
+ const second = first + strokeWidth + panel;
144
+ return `M5 22V12h14v10M5 ${first}h14M5 ${second}h14`;
145
+ }
146
+ /** The outline's door: closed at the bottom, so its slats sit at even thirds. */
147
+ const GARAGE_DOOR_CLOSED = 'M5 12h14v10H5zM5 15.33h14M5 18.67h14';
148
+ function garageFilled(building, { variant, primaryColor, accentColor, accentOpacity, strokeWidth, uid }) {
149
+ return (jsxs(Fragment, { children: [jsx("path", { d: building, fill: primaryColor }), within(uid, 'door', jsx("path", { d: building }), jsx("path", {
150
+ // `wireframe` (thin lines, from this layer) draws the outline's door, whose slats it
151
+ // should match
152
+ d: variant === 'wireframe' ? GARAGE_DOOR_CLOSED : garageDoor(strokeWidth), stroke: accentColor, strokeWidth: strokeWidth, opacity: accentOpacity, fill: "none" }))] }));
153
+ }
118
154
  const NtdGarage = /* @__PURE__ */ createIcon({
119
155
  displayName: 'NtdGarage',
120
156
  paths: {
121
- solid: ({ primaryColor, accentColor, accentOpacity, strokeWidth, uid }) => (jsxs(Fragment, { children: [jsx("path", { d: GARAGE, fill: primaryColor }), within(uid, 'door', jsx("path", { d: GARAGE }), jsx("path", { d: GARAGE_DOOR, stroke: accentColor, strokeWidth: strokeWidth, opacity: accentOpacity, fill: "none" }))] })),
122
- outline: ({ primaryColor, strokeWidth }) => (jsxs(Fragment, { children: [jsx("path", { d: GARAGE, stroke: primaryColor, strokeWidth: strokeWidth, fill: "none", strokeLinejoin: "round" }), jsx("rect", { x: "5", y: "12", width: "14", height: "10", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsx("path", { d: "M5 15h14M5 18h14", stroke: primaryColor, strokeWidth: strokeWidth })] })),
123
- duotone: ({ primaryColor, secondaryColor, strokeWidth, uid }) => (jsxs(Fragment, { children: [jsx("path", { d: GARAGE, fill: primaryColor }), jsx("rect", { x: "5", y: "12", width: "14", height: "10", fill: secondaryColor }), within(uid, 'door', jsx("path", { d: GARAGE }), jsx("path", { d: GARAGE_DOOR, stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }))] })),
124
- vivid: ({ primaryColor, secondaryColor, strokeWidth, uid }) => (jsxs(Fragment, { children: [jsx("path", { d: GARAGE, fill: primaryColor }), jsx("path", { d: GARAGE, fill: "white", opacity: "0.08" }), within(uid, 'door', jsx("path", { d: GARAGE }), jsx("path", { d: GARAGE_DOOR, stroke: secondaryColor, strokeWidth: strokeWidth, fill: "none" }))] })),
157
+ solid: (props) => garageFilled(GARAGE, props),
158
+ sharp: (props) => garageFilled(GARAGE_SHARP, props),
159
+ // the door is closed at the bottom here, so its slats sit at even thirds
160
+ outline: ({ primaryColor, strokeWidth }) => (jsxs(Fragment, { children: [jsx("path", { d: GARAGE, stroke: primaryColor, strokeWidth: strokeWidth, fill: "none", strokeLinejoin: "round" }), jsx("rect", { x: "5", y: "12", width: "14", height: "10", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsx("path", { d: "M5 15.33h14M5 18.67h14", stroke: primaryColor, strokeWidth: strokeWidth })] })),
161
+ duotone: ({ primaryColor, secondaryColor, strokeWidth, uid }) => (jsxs(Fragment, { children: [jsx("path", { d: GARAGE, fill: primaryColor }), jsx("rect", { x: "5", y: "12", width: "14", height: "10", fill: secondaryColor }), within(uid, 'door', jsx("path", { d: GARAGE }), jsx("path", { d: garageDoor(strokeWidth), stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }))] })),
162
+ vivid: ({ primaryColor, secondaryColor, strokeWidth, uid }) => (jsxs(Fragment, { children: [jsx("path", { d: GARAGE, fill: primaryColor }), within(uid, 'door', jsx("path", { d: GARAGE }), jsx("path", { d: garageDoor(strokeWidth), stroke: secondaryColor, strokeWidth: strokeWidth, fill: "none" }))] })),
125
163
  },
126
164
  });
127
165
  const NtdPool = /* @__PURE__ */ createIcon({
@@ -62,15 +62,19 @@ const NtdDna = /* @__PURE__ */ createIcon({
62
62
  CHEMISTRY
63
63
  ───────────────────────────────────────────────────────────────────────────── */
64
64
  // The filled atom draws its orbits at 0.75 of the stroke width around a smaller nucleus: at 2 the
65
- // three orbits and the nucleus ran together into one heavy blob in the middle. The nucleus is in
66
- // the accent colour in every variant that fills it.
65
+ // three orbits and the nucleus ran together into one heavy blob in the middle. The nucleus is
66
+ // primary when filled, secondary in duotone and vivid; vivid also gives the orbits a glow in the
67
+ // accent colour.
68
+ function atomOrbits(stroke, width, opacity) {
69
+ return (jsxs("g", { stroke: stroke, strokeWidth: width, opacity: opacity, fill: "none", children: [jsx("ellipse", { cx: "12", cy: "12", rx: "10", ry: "4" }), jsx("ellipse", { cx: "12", cy: "12", rx: "10", ry: "4", transform: "rotate(60 12 12)" }), jsx("ellipse", { cx: "12", cy: "12", rx: "10", ry: "4", transform: "rotate(-60 12 12)" })] }));
70
+ }
67
71
  const NtdAtom = /* @__PURE__ */ createIcon({
68
72
  displayName: 'NtdAtom',
69
73
  paths: {
70
- solid: ({ primaryColor, accentColor, accentOpacity, strokeWidth }) => (jsxs(Fragment, { children: [jsx("circle", { cx: "12", cy: "12", r: "2.4", fill: accentColor, opacity: accentOpacity }), jsxs("g", { stroke: primaryColor, strokeWidth: strokeWidth * 0.75, fill: "none", children: [jsx("ellipse", { cx: "12", cy: "12", rx: "10", ry: "4" }), jsx("ellipse", { cx: "12", cy: "12", rx: "10", ry: "4", transform: "rotate(60 12 12)" }), jsx("ellipse", { cx: "12", cy: "12", rx: "10", ry: "4", transform: "rotate(-60 12 12)" })] })] })),
71
- outline: ({ primaryColor, strokeWidth }) => (jsxs(Fragment, { children: [jsx("circle", { cx: "12", cy: "12", r: "3", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsx("ellipse", { cx: "12", cy: "12", rx: "10", ry: "4", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsx("ellipse", { cx: "12", cy: "12", rx: "10", ry: "4", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none", transform: "rotate(60 12 12)" }), jsx("ellipse", { cx: "12", cy: "12", rx: "10", ry: "4", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none", transform: "rotate(-60 12 12)" })] })),
72
- duotone: ({ primaryColor, secondaryColor, secondaryOpacity, accentColor, accentOpacity, strokeWidth, }) => (jsxs(Fragment, { children: [jsx("ellipse", { cx: "12", cy: "12", rx: "10", ry: "4", stroke: secondaryColor, strokeWidth: strokeWidth * 2, fill: "none", opacity: secondaryOpacity }), jsx("ellipse", { cx: "12", cy: "12", rx: "10", ry: "4", stroke: secondaryColor, strokeWidth: strokeWidth * 2, fill: "none", opacity: secondaryOpacity, transform: "rotate(60 12 12)" }), jsx("ellipse", { cx: "12", cy: "12", rx: "10", ry: "4", stroke: secondaryColor, strokeWidth: strokeWidth * 2, fill: "none", opacity: secondaryOpacity, transform: "rotate(-60 12 12)" }), jsx("circle", { cx: "12", cy: "12", r: "2.4", fill: accentColor, opacity: accentOpacity }), jsx("ellipse", { cx: "12", cy: "12", rx: "10", ry: "4", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsx("ellipse", { cx: "12", cy: "12", rx: "10", ry: "4", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none", transform: "rotate(60 12 12)" }), jsx("ellipse", { cx: "12", cy: "12", rx: "10", ry: "4", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none", transform: "rotate(-60 12 12)" })] })),
73
- vivid: ({ secondaryColor, accentColor, accentOpacity }) => (jsxs(Fragment, { children: [jsx("circle", { cx: "12", cy: "12", r: "2.6", fill: accentColor, opacity: accentOpacity }), jsx("ellipse", { cx: "12", cy: "12", rx: "10", ry: "4", stroke: secondaryColor, strokeWidth: "1.8", fill: "none" }), jsx("ellipse", { cx: "12", cy: "12", rx: "10", ry: "4", stroke: "#8B5CF6", strokeWidth: "1.5", fill: "none", transform: "rotate(60 12 12)" }), jsx("ellipse", { cx: "12", cy: "12", rx: "10", ry: "4", stroke: "#8B5CF6", strokeWidth: "1.5", fill: "none", transform: "rotate(-60 12 12)" })] })),
74
+ solid: ({ primaryColor, strokeWidth }) => (jsxs(Fragment, { children: [jsx("circle", { cx: "12", cy: "12", r: "2.4", fill: primaryColor }), atomOrbits(primaryColor, strokeWidth * 0.75)] })),
75
+ outline: ({ primaryColor, strokeWidth }) => (jsxs(Fragment, { children: [jsx("circle", { cx: "12", cy: "12", r: "3", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), atomOrbits(primaryColor, strokeWidth)] })),
76
+ duotone: ({ primaryColor, secondaryColor, strokeWidth }) => (jsxs(Fragment, { children: [atomOrbits(primaryColor, strokeWidth * 0.75), jsx("circle", { cx: "12", cy: "12", r: "2.4", fill: secondaryColor })] })),
77
+ vivid: ({ primaryColor, secondaryColor, accentColor, accentOpacity, strokeWidth }) => (jsxs(Fragment, { children: [atomOrbits(accentColor, strokeWidth * 1.75, accentOpacity), atomOrbits(primaryColor, strokeWidth * 0.75), jsx("circle", { cx: "12", cy: "12", r: "2.4", fill: secondaryColor })] })),
74
78
  },
75
79
  });
76
80
  const NtdMolecule = /* @__PURE__ */ createIcon({
@@ -173,22 +173,44 @@ const NtdCornerDownRight = /* @__PURE__ */ createIcon({
173
173
  vivid: ({ primaryColor, secondaryColor, strokeWidth }) => (jsxs(Fragment, { children: [jsx("polyline", { points: "15,10 20,15 15,20", stroke: primaryColor, strokeWidth: strokeWidth * 2, fill: "none" }), jsx("path", { d: "M4 4v7a4 4 0 004 4h10", stroke: secondaryColor, strokeWidth: strokeWidth * 2, fill: "none" })] })),
174
174
  },
175
175
  });
176
+ // NtdMaximize / NtdMinimize: line glyphs, twice the stroke width in every variant but `outline`.
177
+ // A shaft that ran into its head's corner stuck out of it in `sharp` (its square cap passed the
178
+ // corner), so it stops 0.35 × the line width short of the corner on each axis — far enough for
179
+ // the cap to stay inside the head's arms, close enough to meet them.
180
+ /** The four strokes of the glyph: two corner heads and two shafts, `back` short of the corners. */
181
+ function maximizeLines(back) {
182
+ return `M15 3h6v6M9 21H3v-6M${21 - back} ${3 + back}L14 10M${3 + back} ${21 - back}L10 14`;
183
+ }
184
+ function minimizeLines(back) {
185
+ return `M4 14h6v6M20 10h-6V4M${10 - back} ${14 + back}L3 21M${14 + back} ${10 - back}L21 3`;
186
+ }
187
+ /** The two arrows of either glyph, each in one colour: [first head + shaft, second]. */
188
+ function splitLines(lines) {
189
+ const parts = lines.split('M').filter(Boolean);
190
+ return [`M${parts[0]}M${parts[2]}`, `M${parts[1]}M${parts[3]}`];
191
+ }
192
+ function cornerArrows(lines, first, second, strokeWidth) {
193
+ const width = strokeWidth * 2;
194
+ const [a, b] = splitLines(lines(width * 0.35));
195
+ return (jsxs(Fragment, { children: [jsx("path", { d: a, stroke: first, strokeWidth: width, fill: "none" }), jsx("path", { d: b, stroke: second, strokeWidth: width, fill: "none" })] }));
196
+ }
176
197
  const NtdMaximize = /* @__PURE__ */ createIcon({
177
198
  displayName: 'NtdMaximize',
178
199
  paths: {
179
- solid: ({ primaryColor, strokeWidth }) => (jsxs(Fragment, { children: [jsx("polyline", { points: "15,3 21,3 21,9", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsx("polyline", { points: "9,21 3,21 3,15", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsx("line", { x1: "21", y1: "3", x2: "14", y2: "10", stroke: primaryColor, strokeWidth: strokeWidth }), jsx("line", { x1: "3", y1: "21", x2: "10", y2: "14", stroke: primaryColor, strokeWidth: strokeWidth })] })),
180
- outline: ({ primaryColor, strokeWidth }) => (jsxs(Fragment, { children: [jsx("polyline", { points: "15,3 21,3 21,9", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsx("polyline", { points: "9,21 3,21 3,15", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsx("line", { x1: "21", y1: "3", x2: "14", y2: "10", stroke: primaryColor, strokeWidth: strokeWidth }), jsx("line", { x1: "3", y1: "21", x2: "10", y2: "14", stroke: primaryColor, strokeWidth: strokeWidth })] })),
181
- duotone: ({ primaryColor, secondaryColor, secondaryOpacity, strokeWidth }) => (jsxs(Fragment, { children: [jsx("line", { x1: "21", y1: "3", x2: "14", y2: "10", stroke: secondaryColor, strokeWidth: strokeWidth, opacity: secondaryOpacity + 0.2 }), jsx("line", { x1: "3", y1: "21", x2: "10", y2: "14", stroke: secondaryColor, strokeWidth: strokeWidth, opacity: secondaryOpacity + 0.2 }), jsx("polyline", { points: "15,3 21,3 21,9", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsx("polyline", { points: "9,21 3,21 3,15", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" })] })),
182
- vivid: ({ primaryColor, secondaryColor }) => (jsxs(Fragment, { children: [jsx("polyline", { points: "15,3 21,3 21,9", stroke: primaryColor, strokeWidth: "2", fill: "none" }), jsx("polyline", { points: "9,21 3,21 3,15", stroke: secondaryColor, strokeWidth: "1.8", fill: "none" }), jsx("line", { x1: "21", y1: "3", x2: "14", y2: "10", stroke: "#3B82F6", strokeWidth: "1.5" }), jsx("line", { x1: "3", y1: "21", x2: "10", y2: "14", stroke: secondaryColor, strokeWidth: "1.5" })] })),
200
+ solid: ({ primaryColor, strokeWidth }) => cornerArrows(maximizeLines, primaryColor, primaryColor, strokeWidth),
201
+ outline: ({ primaryColor, strokeWidth }) => (jsx("path", { d: maximizeLines(0), stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" })),
202
+ // one arrow per colour
203
+ duotone: ({ primaryColor, secondaryColor, strokeWidth }) => cornerArrows(maximizeLines, primaryColor, secondaryColor, strokeWidth),
204
+ vivid: ({ primaryColor, secondaryColor, strokeWidth }) => cornerArrows(maximizeLines, primaryColor, secondaryColor, strokeWidth),
183
205
  },
184
206
  });
185
207
  const NtdMinimize = /* @__PURE__ */ createIcon({
186
208
  displayName: 'NtdMinimize',
187
209
  paths: {
188
- solid: ({ primaryColor, strokeWidth }) => (jsxs(Fragment, { children: [jsx("polyline", { points: "4,14 10,14 10,20", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsx("polyline", { points: "20,10 14,10 14,4", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsx("line", { x1: "14", y1: "10", x2: "21", y2: "3", stroke: primaryColor, strokeWidth: strokeWidth }), jsx("line", { x1: "3", y1: "21", x2: "10", y2: "14", stroke: primaryColor, strokeWidth: strokeWidth })] })),
189
- outline: ({ primaryColor, strokeWidth }) => (jsxs(Fragment, { children: [jsx("polyline", { points: "4,14 10,14 10,20", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsx("polyline", { points: "20,10 14,10 14,4", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsx("line", { x1: "14", y1: "10", x2: "21", y2: "3", stroke: primaryColor, strokeWidth: strokeWidth }), jsx("line", { x1: "3", y1: "21", x2: "10", y2: "14", stroke: primaryColor, strokeWidth: strokeWidth })] })),
190
- duotone: ({ primaryColor, secondaryColor, secondaryOpacity, strokeWidth }) => (jsxs(Fragment, { children: [jsx("line", { x1: "14", y1: "10", x2: "21", y2: "3", stroke: secondaryColor, strokeWidth: strokeWidth, opacity: secondaryOpacity + 0.2 }), jsx("line", { x1: "3", y1: "21", x2: "10", y2: "14", stroke: secondaryColor, strokeWidth: strokeWidth, opacity: secondaryOpacity + 0.2 }), jsx("polyline", { points: "4,14 10,14 10,20", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsx("polyline", { points: "20,10 14,10 14,4", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" })] })),
191
- vivid: ({ primaryColor, secondaryColor }) => (jsxs(Fragment, { children: [jsx("polyline", { points: "4,14 10,14 10,20", stroke: primaryColor, strokeWidth: "2", fill: "none" }), jsx("polyline", { points: "20,10 14,10 14,4", stroke: secondaryColor, strokeWidth: "1.8", fill: "none" }), jsx("line", { x1: "14", y1: "10", x2: "21", y2: "3", stroke: "#3B82F6", strokeWidth: "1.5" }), jsx("line", { x1: "3", y1: "21", x2: "10", y2: "14", stroke: secondaryColor, strokeWidth: "1.5" })] })),
210
+ solid: ({ primaryColor, strokeWidth }) => cornerArrows(minimizeLines, primaryColor, primaryColor, strokeWidth),
211
+ outline: ({ primaryColor, strokeWidth }) => (jsx("path", { d: minimizeLines(0), stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" })),
212
+ duotone: ({ primaryColor, secondaryColor, strokeWidth }) => cornerArrows(minimizeLines, primaryColor, secondaryColor, strokeWidth),
213
+ vivid: ({ primaryColor, secondaryColor, strokeWidth }) => cornerArrows(minimizeLines, primaryColor, secondaryColor, strokeWidth),
192
214
  },
193
215
  });
194
216
  // NtdMove: the line variants stop the cross 2 short of each arrowhead's point — with the square
@@ -216,13 +238,25 @@ const NtdMove = /* @__PURE__ */ createIcon({
216
238
  vivid: ({ primaryColor, strokeWidth }) => (jsxs(Fragment, { children: [jsx("path", { d: moveShape(strokeWidth), fill: primaryColor }), jsx("path", { d: moveShape(strokeWidth), fill: "white", opacity: "0.1" })] })),
217
239
  },
218
240
  });
241
+ // NtdRepeat: two hooked arrows, a line glyph twice the stroke width in every variant but `outline`
242
+ // — redrawn tighter (shafts at y 6 and 18, heads 3 long) so the heavier lines stay in the box. As
243
+ // in NtdMaximize, each shaft stops 0.35 × the line width short of its head's point, so the square
244
+ // cap of `sharp` stays inside the head (it stuck out of both points). Duotone and vivid: one arrow
245
+ // primary, the other secondary (vivid had a fixed #3B82F6 head).
246
+ const REPEAT_HEADS = ['M17 3L20 6L17 9', 'M7 21L4 18L7 15'];
247
+ const REPEAT_OUTLINE = 'M17 1l4 4-4 4M3 11V9a4 4 0 014-4h14M7 23l-4-4 4-4M21 13v2a4 4 0 01-4 4H3';
248
+ function repeatArrows(first, second, strokeWidth) {
249
+ const width = strokeWidth * 2;
250
+ const back = width * 0.35;
251
+ 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" })] }));
252
+ }
219
253
  const NtdRepeat = /* @__PURE__ */ createIcon({
220
254
  displayName: 'NtdRepeat',
221
255
  paths: {
222
- 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" })] })),
223
- 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" })] })),
224
- 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" })] })),
225
- 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" })] })),
256
+ solid: ({ primaryColor, strokeWidth }) => repeatArrows(primaryColor, primaryColor, strokeWidth),
257
+ outline: ({ primaryColor, strokeWidth }) => (jsx("path", { d: REPEAT_OUTLINE, stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" })),
258
+ duotone: ({ primaryColor, secondaryColor, strokeWidth }) => repeatArrows(primaryColor, secondaryColor, strokeWidth),
259
+ vivid: ({ primaryColor, secondaryColor, strokeWidth }) => repeatArrows(primaryColor, secondaryColor, strokeWidth),
226
260
  },
227
261
  });
228
262
  const NtdShuffle = /* @__PURE__ */ createIcon({
@@ -1,5 +1,6 @@
1
1
  import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
2
2
  import { createIcon } from '../createIcon.js';
3
+ import { bellIcon } from '../iconParts.js';
3
4
 
4
5
  const NtdAtSign = /* @__PURE__ */ createIcon({
5
6
  displayName: 'NtdAtSign',
@@ -46,15 +47,8 @@ const NtdThumbsDown = /* @__PURE__ */ createIcon({
46
47
  vivid: ({ primaryColor, secondaryColor }) => (jsxs(Fragment, { children: [jsx("path", { d: "M10 15v4a3 3 0 003 3l4-9V2H5.72a2 2 0 00-2 1.7l-1.38 9a2 2 0 002 2.3H10z", fill: primaryColor }), jsx("path", { d: "M10 15v4a3 3 0 003 3l4-9V2H5.72a2 2 0 00-2 1.7l-1.38 9a2 2 0 002 2.3H10z", fill: "white", opacity: "0.08" }), jsx("rect", { x: "17", y: "2", width: "4", height: "11", rx: "1", fill: secondaryColor })] })),
47
48
  },
48
49
  });
49
- const NtdBellRing = /* @__PURE__ */ createIcon({
50
- displayName: 'NtdBellRing',
51
- paths: {
52
- solid: ({ primaryColor, secondaryColor, strokeWidth }) => (jsxs(Fragment, { children: [jsx("path", { d: "M18 8A6 6 0 006 8c0 7-3 9-3 9h18s-3-2-3-9", fill: primaryColor }), jsx("path", { d: "M13.73 21a2 2 0 01-3.46 0", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsx("path", { d: "M2 4l1.5 1.5", stroke: secondaryColor, strokeWidth: strokeWidth }), jsx("path", { d: "M22 4l-1.5 1.5", stroke: secondaryColor, strokeWidth: strokeWidth })] })),
53
- outline: ({ primaryColor, strokeWidth }) => (jsxs(Fragment, { children: [jsx("path", { d: "M18 8A6 6 0 006 8c0 7-3 9-3 9h18s-3-2-3-9", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsx("path", { d: "M13.73 21a2 2 0 01-3.46 0", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsx("path", { d: "M2 4l1.5 1.5", stroke: primaryColor, strokeWidth: strokeWidth }), jsx("path", { d: "M22 4l-1.5 1.5", stroke: primaryColor, strokeWidth: strokeWidth })] })),
54
- duotone: ({ primaryColor, secondaryColor, secondaryOpacity, strokeWidth }) => (jsxs(Fragment, { children: [jsx("path", { d: "M18 8A6 6 0 006 8c0 7-3 9-3 9h18s-3-2-3-9", fill: secondaryColor, opacity: secondaryOpacity }), jsx("path", { d: "M18 8A6 6 0 006 8c0 7-3 9-3 9h18s-3-2-3-9", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsx("path", { d: "M13.73 21a2 2 0 01-3.46 0", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsx("path", { d: "M2 4l1.5 1.5", stroke: primaryColor, strokeWidth: strokeWidth }), jsx("path", { d: "M22 4l-1.5 1.5", stroke: primaryColor, strokeWidth: strokeWidth })] })),
55
- vivid: ({ primaryColor, secondaryColor }) => (jsxs(Fragment, { children: [jsx("path", { d: "M18 8A6 6 0 006 8c0 7-3 9-3 9h18s-3-2-3-9", fill: primaryColor }), jsx("path", { d: "M18 8A6 6 0 006 8c0 7-3 9-3 9h18s-3-2-3-9", fill: "white", opacity: "0.1" }), jsx("path", { d: "M13.73 21a2 2 0 01-3.46 0", stroke: secondaryColor, strokeWidth: "1.8", fill: "none" }), jsx("path", { d: "M2 4l1.5 1.5", stroke: "#3B82F6", strokeWidth: "1.5" }), jsx("path", { d: "M22 4l-1.5 1.5", stroke: "#3B82F6", strokeWidth: "1.5" })] })),
56
- },
57
- });
50
+ // NtdBell's bell (iconParts' bellIcon) with ring marks
51
+ const NtdBellRing = /* @__PURE__ */ bellIcon('NtdBellRing', true);
58
52
  const NtdMegaphone = /* @__PURE__ */ createIcon({
59
53
  displayName: 'NtdMegaphone',
60
54
  paths: {
@@ -1,5 +1,6 @@
1
1
  import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
2
2
  import { createIcon } from '../createIcon.js';
3
+ import { within } from '../iconParts.js';
3
4
 
4
5
  /* ────────────────────────────────────────────────────────────────────────────
5
6
  TRANSPORTATION
@@ -40,13 +41,29 @@ const NtdCar = /* @__PURE__ */ createIcon({
40
41
  vivid: ({ primaryColor, secondaryColor: _secondaryColor }) => (jsxs(Fragment, { children: [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 }), 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" }), jsx("circle", { cx: "7", cy: "15", r: "1.5", fill: "white", opacity: "0.5" }), jsx("circle", { cx: "17", cy: "15", r: "1.5", fill: "white", opacity: "0.5" })] })),
41
42
  },
42
43
  });
44
+ // NtdBus: seen from the front — the body with a big windscreen (its top frame 1.75, 30% less than
45
+ // the side view's), the driver (NtdUser's head and shoulders) in it on the left, two headlights and
46
+ // a bumper line below it, and the wheels as rectangles under the body (round side-view wheels
47
+ // read oddly). Filled, the windscreen, the headlights and the bumper are in the accent colour and
48
+ // the driver primary.
49
+ const BUS_BODY = { x: 3, y: 2, width: 18, height: 17, rx: 2.5 };
50
+ const BUS_WINDOW = { x: 4.75, y: 3.75, width: 14.5, height: 7.5, rx: 1 };
51
+ /** The driver, cut off by the windscreen's bottom edge. */
52
+ const BUS_DRIVER = 'M8.4 5.3a1.6 1.6 0 110 3.2 1.6 1.6 0 110-3.2zM5.6 11.5v-.1a2.3 2.3 0 012.3-2.3h1a2.3 2.3 0 012.3 2.3v.1z';
53
+ const BUS_LIGHTS = 'M6.6 13.7a1.3 1.3 0 110 2.6 1.3 1.3 0 110-2.6zM17.4 13.7a1.3 1.3 0 110 2.6 1.3 1.3 0 110-2.6z';
54
+ const BUS_BUMPER = 'M3 17.4h18';
55
+ const BUS_WHEELS = 'M5.5 18h3v3a1 1 0 01-1 1h-1a1 1 0 01-1-1zM15.5 18h3v3a1 1 0 01-1 1h-1a1 1 0 01-1-1z';
56
+ function busFilled({ primaryColor, uid }, glass, details, detailOpacity) {
57
+ return (jsxs(Fragment, { children: [jsx("path", { d: BUS_WHEELS, fill: primaryColor }), jsx("rect", { ...BUS_BODY, fill: primaryColor }), jsxs("g", { opacity: detailOpacity, children: [jsx("path", { d: BUS_LIGHTS, fill: details }), within(uid, 'body', jsx("rect", { ...BUS_BODY }), jsx("path", { d: BUS_BUMPER, stroke: details, strokeWidth: "1.2" }))] }), jsx("rect", { ...BUS_WINDOW, fill: glass }), within(uid, 'window', jsx("rect", { ...BUS_WINDOW }), jsx("path", { d: BUS_DRIVER, fill: primaryColor }))] }));
58
+ }
43
59
  const NtdBus = /* @__PURE__ */ createIcon({
44
60
  displayName: 'NtdBus',
45
61
  paths: {
46
- solid: ({ primaryColor }) => (jsxs(Fragment, { children: [jsx("rect", { x: "3", y: "4", width: "18", height: "14", rx: "2", fill: primaryColor }), jsx("rect", { x: "5", y: "6", width: "5", height: "4", rx: "1", fill: "white", opacity: "0.5" }), jsx("rect", { x: "11", y: "6", width: "5", height: "4", rx: "1", fill: "white", opacity: "0.5" }), jsx("rect", { x: "5", y: "12", width: "14", height: "2", rx: "0.5", fill: "white", opacity: "0.3" }), jsx("circle", { cx: "7", cy: "18", r: "2", fill: primaryColor }), jsx("circle", { cx: "17", cy: "18", r: "2", fill: primaryColor })] })),
47
- outline: ({ primaryColor, strokeWidth }) => (jsxs(Fragment, { children: [jsx("rect", { x: "3", y: "4", width: "18", height: "14", rx: "2", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsx("rect", { x: "5", y: "6", width: "5", height: "4", rx: "1", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsx("rect", { x: "11", y: "6", width: "5", height: "4", rx: "1", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsx("path", { d: "M5 12h14", stroke: primaryColor, strokeWidth: strokeWidth }), jsx("circle", { cx: "7", cy: "18", r: "2", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsx("circle", { cx: "17", cy: "18", r: "2", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" })] })),
48
- duotone: ({ primaryColor, secondaryColor, secondaryOpacity, strokeWidth }) => (jsxs(Fragment, { children: [jsx("rect", { x: "3", y: "4", width: "18", height: "14", rx: "2", fill: secondaryColor, opacity: secondaryOpacity }), jsx("rect", { x: "3", y: "4", width: "18", height: "14", rx: "2", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsx("rect", { x: "5", y: "6", width: "5", height: "4", rx: "1", fill: primaryColor }), jsx("rect", { x: "11", y: "6", width: "5", height: "4", rx: "1", fill: primaryColor }), jsx("path", { d: "M5 12h14", stroke: primaryColor, strokeWidth: strokeWidth }), jsx("circle", { cx: "7", cy: "18", r: "2", fill: primaryColor }), jsx("circle", { cx: "17", cy: "18", r: "2", fill: primaryColor })] })),
49
- vivid: ({ primaryColor, secondaryColor: _secondaryColor }) => (jsxs(Fragment, { children: [jsx("rect", { x: "3", y: "4", width: "18", height: "14", rx: "2", fill: primaryColor }), jsx("rect", { x: "3", y: "4", width: "18", height: "14", rx: "2", fill: "white", opacity: "0.08" }), jsx("rect", { x: "5", y: "6", width: "5", height: "4", rx: "1", fill: "white", opacity: "0.5" }), jsx("rect", { x: "11", y: "6", width: "5", height: "4", rx: "1", fill: "white", opacity: "0.5" }), jsx("rect", { x: "5", y: "12", width: "14", height: "2", rx: "0.5", fill: "white", opacity: "0.3" }), jsx("circle", { cx: "7", cy: "18", r: "2", fill: "#F59E0B" }), jsx("circle", { cx: "17", cy: "18", r: "2", fill: "#F59E0B" })] })),
62
+ solid: (props) => busFilled(props, props.accentColor, props.accentColor, props.accentOpacity),
63
+ outline: ({ primaryColor, strokeWidth, uid }) => (jsxs(Fragment, { children: [jsx("rect", { ...BUS_BODY, stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), jsx("rect", { ...BUS_WINDOW, stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" }), within(uid, 'window', jsx("rect", { ...BUS_WINDOW }), jsx("path", { d: BUS_DRIVER, fill: primaryColor })), jsx("path", { d: "M6.6 14a1 1 0 110 2 1 1 0 110-2zM17.4 14a1 1 0 110 2 1 1 0 110-2z", fill: primaryColor }), jsx("path", { d: "M6 19v2a1 1 0 001 1h1a1 1 0 001-1v-2M15 19v2a1 1 0 001 1h1a1 1 0 001-1v-2", stroke: primaryColor, strokeWidth: strokeWidth, fill: "none" })] })),
64
+ // fills only: the body and the driver primary, the windscreen and the details secondary
65
+ duotone: (props) => busFilled(props, props.secondaryColor, props.secondaryColor, 1),
66
+ vivid: (props) => busFilled(props, props.secondaryColor, props.accentColor, props.accentOpacity),
50
67
  },
51
68
  });
52
69
  const NtdShip = /* @__PURE__ */ createIcon({