@nice2dev/icons 1.4.12 → 1.4.14

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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,64 @@
1
1
  # @nice2dev/icons — Changelog
2
2
 
3
+ ## 1.4.14
4
+
5
+ ### Patch Changes
6
+
7
+ - 5d1e7d0: Dragging tree rows (deferred since 1.4.5, and OmniVerk wishlist #4 and #6):
8
+
9
+ - `NiceTreeGrid`: new `rowDraggable`, `canDrop` and `onRowDrop(dragKey, dropKey, position)`.
10
+ - The pointer picks the spot: the top quarter of a row drops before it, the bottom quarter
11
+ after it, the middle inside it. A line or a lit row shows where.
12
+ - A closed row held under a drag opens. A row never drops into its own branch.
13
+ - Ctrl+Shift+↑ / ↓ moves the focused row past a sibling, → into the row above it, ← out a
14
+ level. Screen readers hear each move.
15
+ - The grid does not move rows itself; update `data`.
16
+ - `NiceTreeView`: `onNodeDrop` reports the real position from the pointer instead of always
17
+ `'inside'`. It gains the drop mark, `canDrop`, the same keyboard moves, and `dataTransfer` data,
18
+ which Firefox needs to start a drag. A leaf takes drops beside it only.
19
+ - New exports from `@nice2dev/ui`: `useTreeRowDrop`, `treeDropPosition`, `treeKeyboardMove`,
20
+ `treeKeyboardTarget` and `NiceTreeDropPosition`.
21
+ - `NiceDevelopmentStudio`: tree rows can be dragged.
22
+ - Entries go into folders, groups of their own group, and sections, or next to another entry,
23
+ which reorders them.
24
+ - Folders go into folders of their group, to the group's top, or into sections, together with
25
+ what they hold.
26
+ - New layout helpers `orderStudioEntries`, `moveStudioFolder` and `isStudioFolderWithin`.
27
+ - `placeStudioEntry` ignores a folder of another group.
28
+ - Icons:
29
+ - `NtdAward` duotone and vivid are fills: a secondary outline round primary middles, and in vivid
30
+ an accent ribbon.
31
+ - `NtdWallet` has a wider, rounded back strip, and the wireframe no longer draws the hidden part.
32
+ - `NtdWalletOpen` has a steeper wedge.
33
+ - `NtdUsers`: the two people behind sit lower.
34
+
35
+ ## 1.4.13
36
+
37
+ ### Patch Changes
38
+
39
+ - ac79f18: Icon review, round 43 (follow-up 3):
40
+
41
+ - New `NtdWalletOpen`: the wallet with its back pocket rising on a slant, now steeper. `NtdWallet`
42
+ shows a thin back pocket parallel to the body's edge instead.
43
+ - Battery set (`NtdBattery` … `NtdBatteryFull`): duotone and vivid show the battery's inside as a
44
+ secondary window slightly larger than the charge blocks. The blocks are primary in duotone and
45
+ accent in vivid.
46
+ - `NtdUnlock`: the shackle is open wider and swung 10° counter-clockwise.
47
+ - `NtdUsers`: the heads sit closer to the bodies; the two people behind lean outwards by 15°.
48
+ - `NtdWarehouse`: the bottom shelves sit just above the ground; two equal boxes on each level.
49
+ - `NtdForkKnife`: on their own the fork and knife are wider and further apart.
50
+ - `NtdChefHat`: no line under the puff; four pleats instead of two.
51
+ - `NtdAward`: the ribbon's primary border matches the medal's; a vertical line splits the ribbon.
52
+ - `NtdClipboard`: the sheet closes above the board's bottom edge; the text is higher and thinner.
53
+ - `NtdCalculatorEdu`: bigger keys and a wider, higher display.
54
+ - `NtdCookingPan`: the handle and its hole are twice as thick.
55
+ - `NtdTrash`: the lid's eaves and the handle are 1.5× thicker (filled variants).
56
+ - `NtdStore`: the cornice is thinner and square-cornered, so it meets the walls evenly.
57
+ - `NtdRecycle`: in `sharp`, the bands no longer poke out of the arrowheads.
58
+ - `NtdBeer`: the foam head is lower, cut from below.
59
+ - Smaller fixes: `NtdCalendar` (thinner accent line), `NtdMountain` (notch), `NtdWine` (thinner,
60
+ lower surface line).
61
+
3
62
  ## 1.4.12
4
63
 
5
64
  No changes in this release.
package/README.md CHANGED
@@ -528,7 +528,7 @@ Properties passed to every path renderer (pre-resolved from user props):
528
528
 
529
529
  ### Business & Finance (18 icons)
530
530
 
531
- `NtdBriefcase` · `NtdDollar` · `NtdWallet` · `NtdReceipt` · `NtdBank` · `NtdTrendUp` · `NtdTrendDown` · `NtdPercent` · `NtdInvoice` · `NtdStore` · `NtdBarcode` · `NtdCalculator` · `NtdPresentation` · `NtdClipboardCheck` · `NtdPiggyBank` · `NtdCoins` · `NtdCash` · `NtdCashStack`
531
+ `NtdBriefcase` · `NtdDollar` · `NtdWallet` · `NtdWalletOpen` · `NtdReceipt` · `NtdBank` · `NtdTrendUp` · `NtdTrendDown` · `NtdPercent` · `NtdInvoice` · `NtdStore` · `NtdBarcode` · `NtdCalculator` · `NtdPresentation` · `NtdClipboardCheck` · `NtdPiggyBank` · `NtdCoins` · `NtdCash` · `NtdCashStack`
532
532
 
533
533
  ### Social & Communication (8 icons)
534
534
 
@@ -158,13 +158,30 @@ const TRASH_HANDLE = "M9.5 3.8V2.4a1.2 1.2 0 011.2-1.2h2.6a1.2 1.2 0 011.2 1.2v1
158
158
  const TRASH_HANDLE_LINE = "M9.5 3.45V2.4a1.2 1.2 0 011.2-1.2h2.6a1.2 1.2 0 011.2 1.2v1.05";
159
159
  const TRASH_BIN = "M5 6l1 14a2 2 0 002 2h8a2 2 0 002-2l1-14H5z";
160
160
  const TRASH_GROOVES = "M10 10.5v7M14 10.5v7";
161
+ const TRASH_BOLD = 1.5;
161
162
  const NtdTrash = /* @__PURE__ */ createIcon.createIcon({
162
163
  displayName: "NtdTrash",
163
164
  paths: {
164
165
  solid: ({ primaryColor, accentColor, accentOpacity, strokeWidth }) => /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
165
- /* @__PURE__ */ jsxRuntime.jsx("path", { d: TRASH_LID, stroke: primaryColor, strokeWidth, fill: "none" }),
166
+ /* @__PURE__ */ jsxRuntime.jsx(
167
+ "path",
168
+ {
169
+ d: TRASH_LID,
170
+ stroke: primaryColor,
171
+ strokeWidth: strokeWidth * TRASH_BOLD,
172
+ fill: "none"
173
+ }
174
+ ),
166
175
  /* @__PURE__ */ jsxRuntime.jsx("path", { d: TRASH_DOME, fill: primaryColor }),
167
- /* @__PURE__ */ jsxRuntime.jsx("path", { d: TRASH_HANDLE, stroke: primaryColor, strokeWidth, fill: "none" }),
176
+ /* @__PURE__ */ jsxRuntime.jsx(
177
+ "path",
178
+ {
179
+ d: TRASH_HANDLE,
180
+ stroke: primaryColor,
181
+ strokeWidth: strokeWidth * TRASH_BOLD,
182
+ fill: "none"
183
+ }
184
+ ),
168
185
  /* @__PURE__ */ jsxRuntime.jsx("path", { d: TRASH_BIN, fill: primaryColor }),
169
186
  /* @__PURE__ */ jsxRuntime.jsx(
170
187
  "line",
@@ -208,9 +225,25 @@ const NtdTrash = /* @__PURE__ */ createIcon.createIcon({
208
225
  ] }),
209
226
  vivid: ({ primaryColor, secondaryColor, accentColor, accentOpacity, strokeWidth }) => /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
210
227
  /* @__PURE__ */ jsxRuntime.jsx("path", { d: TRASH_BIN, fill: primaryColor }),
211
- /* @__PURE__ */ jsxRuntime.jsx("path", { d: TRASH_LID, stroke: secondaryColor, strokeWidth, fill: "none" }),
228
+ /* @__PURE__ */ jsxRuntime.jsx(
229
+ "path",
230
+ {
231
+ d: TRASH_LID,
232
+ stroke: secondaryColor,
233
+ strokeWidth: strokeWidth * TRASH_BOLD,
234
+ fill: "none"
235
+ }
236
+ ),
212
237
  /* @__PURE__ */ jsxRuntime.jsx("path", { d: TRASH_DOME, fill: secondaryColor }),
213
- /* @__PURE__ */ jsxRuntime.jsx("path", { d: TRASH_HANDLE, stroke: secondaryColor, strokeWidth, fill: "none" }),
238
+ /* @__PURE__ */ jsxRuntime.jsx(
239
+ "path",
240
+ {
241
+ d: TRASH_HANDLE,
242
+ stroke: secondaryColor,
243
+ strokeWidth: strokeWidth * TRASH_BOLD,
244
+ fill: "none"
245
+ }
246
+ ),
214
247
  /* @__PURE__ */ jsxRuntime.jsx(
215
248
  "path",
216
249
  {
@@ -449,8 +482,9 @@ const NtdCopy = /* @__PURE__ */ createIcon.createIcon({
449
482
  vivid: ({ primaryColor, secondaryColor, strokeWidth }) => copyFilled(primaryColor, secondaryColor, strokeWidth)
450
483
  }
451
484
  });
452
- const CLIPBOARD_TEXT = "M8 11h8M8 14.5h5";
453
- const CLIPBOARD_SHEET = "M6 22V4h12V22";
485
+ const CLIPBOARD_TEXT = "M8 10h8M8 13h5";
486
+ const CLIPBOARD_TEXT_WIDTH = 1.2;
487
+ const CLIPBOARD_SHEET = "M6 4.5h12v16H6z";
454
488
  const NtdClipboard = /* @__PURE__ */ createIcon.createIcon({
455
489
  displayName: "NtdClipboard",
456
490
  perfectStackX: 12,
@@ -491,7 +525,15 @@ const NtdClipboard = /* @__PURE__ */ createIcon.createIcon({
491
525
  opacity: accentOpacity
492
526
  }
493
527
  ),
494
- /* @__PURE__ */ jsxRuntime.jsx("path", { d: CLIPBOARD_TEXT, stroke: accentColor, strokeWidth: "1.5", opacity: accentOpacity })
528
+ /* @__PURE__ */ jsxRuntime.jsx(
529
+ "path",
530
+ {
531
+ d: CLIPBOARD_TEXT,
532
+ stroke: accentColor,
533
+ strokeWidth: CLIPBOARD_TEXT_WIDTH,
534
+ opacity: accentOpacity
535
+ }
536
+ )
495
537
  ] }),
496
538
  outline: ({ primaryColor, strokeWidth }) => /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
497
539
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -551,7 +593,15 @@ const NtdClipboard = /* @__PURE__ */ createIcon.createIcon({
551
593
  strokeWidth
552
594
  }
553
595
  ),
554
- /* @__PURE__ */ jsxRuntime.jsx("path", { d: CLIPBOARD_TEXT, stroke: accentColor, strokeWidth: "1.5", opacity: accentOpacity })
596
+ /* @__PURE__ */ jsxRuntime.jsx(
597
+ "path",
598
+ {
599
+ d: CLIPBOARD_TEXT,
600
+ stroke: accentColor,
601
+ strokeWidth: CLIPBOARD_TEXT_WIDTH,
602
+ opacity: accentOpacity
603
+ }
604
+ )
555
605
  ] })
556
606
  }
557
607
  });
@@ -1168,7 +1218,8 @@ const NtdLock = /* @__PURE__ */ createIcon.createIcon({
1168
1218
  vivid: ({ primaryColor, secondaryColor, accentColor, accentOpacity, strokeWidth }) => lockFilled(primaryColor, secondaryColor, accentColor, accentOpacity, strokeWidth * 2)
1169
1219
  }
1170
1220
  });
1171
- const UNLOCK_SHACKLE = "M6 10.5V7a6 6 0 0112 0v0.5";
1221
+ const UNLOCK_SHACKLE = "M6 10.5V8.2a6 6 0 0 1 11.91-1.04";
1222
+ const UNLOCK_SWING = "rotate(-10 6 10)";
1172
1223
  const NtdUnlock = /* @__PURE__ */ createIcon.createIcon({
1173
1224
  displayName: "NtdUnlock",
1174
1225
  perfectStackX: 12,
@@ -1176,14 +1227,23 @@ const NtdUnlock = /* @__PURE__ */ createIcon.createIcon({
1176
1227
  perfectStackSize: 0.4,
1177
1228
  paths: {
1178
1229
  solid: ({ primaryColor, accentColor, accentOpacity, strokeWidth }) => /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
1179
- /* @__PURE__ */ jsxRuntime.jsx("path", { d: UNLOCK_SHACKLE, stroke: primaryColor, strokeWidth: strokeWidth * 2, fill: "none" }),
1230
+ /* @__PURE__ */ jsxRuntime.jsx(
1231
+ "path",
1232
+ {
1233
+ d: UNLOCK_SHACKLE,
1234
+ transform: UNLOCK_SWING,
1235
+ stroke: primaryColor,
1236
+ strokeWidth: strokeWidth * 2,
1237
+ fill: "none"
1238
+ }
1239
+ ),
1180
1240
  /* @__PURE__ */ jsxRuntime.jsx("rect", { ...LOCK_BODY, fill: primaryColor }),
1181
1241
  /* @__PURE__ */ jsxRuntime.jsx("path", { d: LOCK_KEYHOLE, fill: accentColor, opacity: accentOpacity })
1182
1242
  ] }),
1183
1243
  outline: ({ primaryColor, strokeWidth }) => /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
1184
1244
  /* @__PURE__ */ jsxRuntime.jsxs("g", { stroke: primaryColor, strokeWidth, fill: "none", children: [
1185
1245
  /* @__PURE__ */ jsxRuntime.jsx("rect", { ...LOCK_BODY }),
1186
- /* @__PURE__ */ jsxRuntime.jsx("path", { d: UNLOCK_SHACKLE })
1246
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: UNLOCK_SHACKLE, transform: UNLOCK_SWING })
1187
1247
  ] }),
1188
1248
  /* @__PURE__ */ jsxRuntime.jsx("path", { d: LOCK_KEYHOLE, fill: primaryColor })
1189
1249
  ] }),
@@ -1192,6 +1252,7 @@ const NtdUnlock = /* @__PURE__ */ createIcon.createIcon({
1192
1252
  "path",
1193
1253
  {
1194
1254
  d: UNLOCK_SHACKLE,
1255
+ transform: UNLOCK_SWING,
1195
1256
  stroke: secondaryColor,
1196
1257
  strokeWidth: strokeWidth * 2,
1197
1258
  fill: "none"
@@ -101,40 +101,46 @@ const NtdDollar = /* @__PURE__ */ createIcon.createIcon({
101
101
  }
102
102
  });
103
103
  const WALLET_BODY = { x: 2, y: 6.5, width: 20, height: 14.5, rx: 2.5 };
104
- const WALLET_BACK = "M6 8V5.9L19 5a1 1 0 011.1 1V8z";
105
- const WALLET_BACK_LINE = "M6 6.5V5.9L19 5a1 1 0 011.1 1V6.5";
106
104
  const WALLET_POCKET = "M22 10.5h-4.5a2.5 2.5 0 000 5H22z";
107
105
  const WALLET_POCKET_LINE = "M22 10.5h-4.5a2.5 2.5 0 000 5H22";
108
- const NtdWallet = /* @__PURE__ */ createIcon.createIcon({
109
- displayName: "NtdWallet",
110
- paths: {
106
+ function walletIcon(displayName, back, backLine, backSharp) {
107
+ return createIcon.createIcon({
108
+ displayName,
109
+ paths: walletPaths(back, backLine, backSharp)
110
+ });
111
+ }
112
+ function walletPaths(WALLET_BACK, WALLET_BACK_LINE, WALLET_BACK_SHARP) {
113
+ return {
111
114
  // the back pocket is primary like the body: an accent gap (the body's edge, clipped to the pocket)
112
115
  // parts the two
113
- solid: ({ primaryColor, accentColor, accentOpacity, strokeWidth, uid }) => /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
114
- /* @__PURE__ */ jsxRuntime.jsx("path", { d: WALLET_BACK, fill: primaryColor }),
115
- iconParts.within(
116
- uid,
117
- "back",
118
- /* @__PURE__ */ jsxRuntime.jsx("path", { d: WALLET_BACK }),
119
- /* @__PURE__ */ jsxRuntime.jsx(
120
- "rect",
121
- {
122
- ...WALLET_BODY,
123
- stroke: accentColor,
124
- strokeWidth: strokeWidth * 0.9,
125
- fill: "none"
126
- }
127
- )
128
- ),
129
- /* @__PURE__ */ jsxRuntime.jsx("rect", { ...WALLET_BODY, fill: primaryColor }),
130
- iconParts.within(
131
- uid,
132
- "pocket",
133
- /* @__PURE__ */ jsxRuntime.jsx("rect", { ...WALLET_BODY }),
134
- /* @__PURE__ */ jsxRuntime.jsx("path", { d: WALLET_POCKET, fill: accentColor, opacity: accentOpacity })
135
- ),
136
- /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "17.6", cy: "13", r: "1.1", fill: primaryColor })
137
- ] }),
116
+ solid: ({ primaryColor, accentColor, accentOpacity, strokeWidth, uid, variant }) => {
117
+ const back = variant === "sharp" ? WALLET_BACK_SHARP : WALLET_BACK;
118
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
119
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: back, fill: primaryColor }),
120
+ iconParts.within(
121
+ uid,
122
+ "back",
123
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: back }),
124
+ /* @__PURE__ */ jsxRuntime.jsx(
125
+ "rect",
126
+ {
127
+ ...WALLET_BODY,
128
+ stroke: accentColor,
129
+ strokeWidth: strokeWidth * 0.9,
130
+ fill: "none"
131
+ }
132
+ )
133
+ ),
134
+ /* @__PURE__ */ jsxRuntime.jsx("rect", { ...WALLET_BODY, fill: primaryColor }),
135
+ iconParts.within(
136
+ uid,
137
+ "pocket",
138
+ /* @__PURE__ */ jsxRuntime.jsx("rect", { ...WALLET_BODY }),
139
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: WALLET_POCKET, fill: accentColor, opacity: accentOpacity })
140
+ ),
141
+ /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "17.6", cy: "13", r: "1.1", fill: primaryColor })
142
+ ] });
143
+ },
138
144
  outline: ({ primaryColor, strokeWidth }) => /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
139
145
  /* @__PURE__ */ jsxRuntime.jsx(
140
146
  "path",
@@ -173,8 +179,20 @@ const NtdWallet = /* @__PURE__ */ createIcon.createIcon({
173
179
  ),
174
180
  /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "17.6", cy: "13", r: "1.1", fill: secondaryColor })
175
181
  ] })
176
- }
177
- });
182
+ };
183
+ }
184
+ const NtdWallet = /* @__PURE__ */ walletIcon(
185
+ "NtdWallet",
186
+ "M4.5 6.5V5.4a0.8 0.8 0 0 1 0.8-0.8h13.4a0.8 0.8 0 0 1 0.8 0.8V6.5Z",
187
+ "M4.5 6.5V5.4a0.8 0.8 0 0 1 0.8-0.8h13.4a0.8 0.8 0 0 1 0.8 0.8V6.5",
188
+ "M4.5 6.5V4.6h15V6.5Z"
189
+ );
190
+ const NtdWalletOpen = /* @__PURE__ */ walletIcon(
191
+ "NtdWalletOpen",
192
+ "M6 6.5V5.9L19 2.6a1 1 0 0 1 1.1 1V6.5Z",
193
+ "M6 6.5V5.9L19 2.6a1 1 0 0 1 1.1 1V6.5",
194
+ "M6 6.5V5.9L20.1 2.32V6.5Z"
195
+ );
178
196
  const RECEIPT = "M4 2v20l3-2 3 2 3-2 3 2 3-2 3 2V2H4z";
179
197
  const RECEIPT_TEXT = "M7 7.5h6.5M16.4 7.5h2M7 11.5h6.5M16.4 11.5h2M14.4 15.5h4";
180
198
  const NtdReceipt = /* @__PURE__ */ createIcon.createIcon({
@@ -378,7 +396,7 @@ const NtdInvoice = /* @__PURE__ */ iconParts.paperIcon(
378
396
  );
379
397
  const NtdInvoiceDoc = NtdInvoice;
380
398
  const STORE_BODY = "M2.5 5H21.5V21H2.5Z";
381
- const STORE_CORNICE = { x: 1.5, y: 3, width: 21, height: 2.4, rx: 0.6 };
399
+ const STORE_CORNICE = { x: 1.5, y: 3.5, width: 21, height: 1.9 };
382
400
  const STORE_CUT = "M2.5 5.4H21.5";
383
401
  const STORE_SIGN = { x: 3.8, y: 6.7, width: 16.4, height: 3.9, rx: 0.5 };
384
402
  const STORE_GLASS = "M4.2 11.9h4.8v6.8H4.2zM15 11.9h4.8v6.8H15zM10.2 12.2h3.6V21h-3.6z";
@@ -1226,3 +1244,4 @@ exports.NtdStore = NtdStore;
1226
1244
  exports.NtdTrendDown = NtdTrendDown;
1227
1245
  exports.NtdTrendUp = NtdTrendUp;
1228
1246
  exports.NtdWallet = NtdWallet;
1247
+ exports.NtdWalletOpen = NtdWalletOpen;
@@ -263,13 +263,15 @@ const BATTERY_BODY = { x: 1.5, y: 6.5, width: 18.5, height: 11, rx: 2 };
263
263
  const BATTERY_TERMINAL = "M19.5 9.5h2a1 1 0 011 1v3a1 1 0 01-1 1h-2z";
264
264
  const BATTERY_TERMINAL_LINE = "M20 9.5h1.5a1 1 0 011 1v3a1 1 0 01-1 1H20";
265
265
  const BATTERY_BLOCKS = [3.5, 7.35, 11.2, 15.05];
266
+ const BATTERY_WINDOW = { x: 2.9, y: 7.9, width: 15.7, height: 8.2 };
266
267
  function batteryBlocks(count, fill) {
267
268
  return BATTERY_BLOCKS.slice(0, count).map((x) => /* @__PURE__ */ jsxRuntime.jsx("rect", { x, y: "8.5", width: "2.95", height: "7", fill }, x));
268
269
  }
269
270
  function batteryIcon(displayName, count) {
270
- const filled = (body, blocks) => /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
271
+ const filled = (body, blocks, window) => /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
271
272
  /* @__PURE__ */ jsxRuntime.jsx("rect", { ...BATTERY_BODY, fill: body }),
272
273
  /* @__PURE__ */ jsxRuntime.jsx("path", { d: BATTERY_TERMINAL, fill: body }),
274
+ window && /* @__PURE__ */ jsxRuntime.jsx("rect", { ...BATTERY_WINDOW, fill: window }),
273
275
  batteryBlocks(count, blocks)
274
276
  ] });
275
277
  return createIcon.createIcon({
@@ -292,8 +294,8 @@ function batteryIcon(displayName, count) {
292
294
  ),
293
295
  batteryBlocks(count, primaryColor)
294
296
  ] }),
295
- duotone: ({ primaryColor, secondaryColor }) => filled(primaryColor, secondaryColor),
296
- vivid: ({ primaryColor, secondaryColor }) => filled(primaryColor, secondaryColor)
297
+ duotone: ({ primaryColor, secondaryColor }) => filled(primaryColor, primaryColor, secondaryColor),
298
+ vivid: ({ primaryColor, secondaryColor, accentColor }) => filled(primaryColor, accentColor, secondaryColor)
297
299
  }
298
300
  });
299
301
  }
@@ -930,16 +930,16 @@ const NtdBackpack = /* @__PURE__ */ createIcon.createIcon({
930
930
  }
931
931
  });
932
932
  const CALC_BODY = { x: 4.6, y: 2, width: 14.8, height: 20, rx: 2 };
933
- const CALC_DISPLAY = { x: 6.8, y: 4.5, width: 10.4, height: 4.5, rx: 1 };
934
- const CALC_KEYS = "M6.8 11h2.8v2.4H6.8zM10.6 11h2.8v2.4h-2.8zM14.4 11h2.8v2.4h-2.8zM6.8 14.4h2.8v2.4H6.8zM10.6 14.4h2.8v2.4h-2.8zM14.4 14.4h2.8v2.4h-2.8zM6.8 17.8h2.8v2.4H6.8zM10.6 17.8h6.6v2.4h-6.6z";
933
+ const CALC_DISPLAY = { x: 6, y: 3.4, width: 12, height: 4.8, rx: 1 };
934
+ const CALC_KEYS = "M6 9.4h3.6v3.3H6zM10.2 9.4h3.6v3.3h-3.6zM14.4 9.4h3.6v3.3h-3.6zM6 13.3h3.6v3.3H6zM10.2 13.3h3.6v3.3h-3.6zM14.4 13.3h3.6v3.3h-3.6zM6 17.2h3.6v3.3H6zM10.2 17.2h7.8v3.3h-7.8z";
935
935
  const CALC_DOTS = [
936
- [8.2, 12.2],
937
- [12, 12.2],
938
- [15.8, 12.2],
939
- [8.2, 15.6],
940
- [12, 15.6],
941
- [15.8, 15.6],
942
- [8.2, 19]
936
+ [7.8, 11.05],
937
+ [12, 11.05],
938
+ [16.2, 11.05],
939
+ [7.8, 14.95],
940
+ [12, 14.95],
941
+ [16.2, 14.95],
942
+ [7.8, 18.85]
943
943
  ];
944
944
  function calculatorFilled({ primaryColor, accentColor, accentOpacity, strokeWidth }, display, displayOpacity) {
945
945
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
@@ -969,7 +969,7 @@ const NtdCalculator = /* @__PURE__ */ createIcon.createIcon({
969
969
  ] }),
970
970
  /* @__PURE__ */ jsxRuntime.jsxs("g", { fill: primaryColor, children: [
971
971
  CALC_DOTS.map(([cx, cy]) => /* @__PURE__ */ jsxRuntime.jsx("circle", { cx, cy, r: "1" }, `${cx},${cy}`)),
972
- /* @__PURE__ */ jsxRuntime.jsx("rect", { x: "10.6", y: "18.4", width: "6.6", height: "1.2", rx: "0.5" })
972
+ /* @__PURE__ */ jsxRuntime.jsx("rect", { x: "10.6", y: "18.25", width: "7", height: "1.2", rx: "0.5" })
973
973
  ] })
974
974
  ] }),
975
975
  vivid: (props) => calculatorFilled(props, props.secondaryColor, 1)
@@ -956,7 +956,36 @@ const NtdKey = /* @__PURE__ */ createIcon.createIcon({
956
956
  }
957
957
  });
958
958
  const AWARD_RIBBON = "M8.21 13.89L7 23l5-3 5 3-1.21-9.12";
959
- const AWARD_RIBBON_INNER = "M9.67 13.42L8.9 20.11L12 18.25L15.1 20.11L14.32 13.43";
959
+ const AWARD_RIBBON_INNER = "M8.93 13.04L7.76 21.85L12 19.3L16.24 21.85L15.07 13.04M12 13.9V19.3";
960
+ const AWARD_RIBBON_INSIDE = "M8.93 13.04L7.76 21.85L12 19.3L16.24 21.85L15.07 13.04Z";
961
+ const AWARD_RIBBON_SPLIT = "M12 13.9V19.3";
962
+ function awardTwoTone({ primaryColor, secondaryColor, strokeWidth }, inside, insideOpacity, joined) {
963
+ const ribbonInside = /* @__PURE__ */ jsxRuntime.jsx("path", { d: AWARD_RIBBON_INSIDE, fill: inside, opacity: insideOpacity });
964
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
965
+ /* @__PURE__ */ jsxRuntime.jsx(
966
+ "path",
967
+ {
968
+ d: AWARD_RIBBON,
969
+ fill: secondaryColor,
970
+ stroke: secondaryColor,
971
+ strokeWidth
972
+ }
973
+ ),
974
+ !joined && ribbonInside,
975
+ /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "12", cy: "8", r: "7", fill: secondaryColor }),
976
+ /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "12", cy: "8", r: "5.9", fill: primaryColor }),
977
+ joined && ribbonInside,
978
+ /* @__PURE__ */ jsxRuntime.jsx(
979
+ "path",
980
+ {
981
+ d: AWARD_RIBBON_SPLIT,
982
+ stroke: secondaryColor,
983
+ strokeWidth: strokeWidth * 0.6,
984
+ strokeLinecap: "butt"
985
+ }
986
+ )
987
+ ] });
988
+ }
960
989
  function awardInsets(color, opacity, width) {
961
990
  return /* @__PURE__ */ jsxRuntime.jsxs("g", { stroke: color, strokeWidth: width, opacity, fill: "none", children: [
962
991
  /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "12", cy: "8", r: "5.9" }),
@@ -990,8 +1019,8 @@ const NtdAward = /* @__PURE__ */ createIcon.createIcon({
990
1019
  ),
991
1020
  awardInsets(primaryColor, 1, strokeWidth * 0.6)
992
1021
  ] }),
993
- duotone: (p) => awardFilled(p, p.secondaryColor),
994
- vivid: (p) => awardFilled(p, p.secondaryColor)
1022
+ duotone: (p) => awardTwoTone(p, p.primaryColor, 1, true),
1023
+ vivid: (p) => awardTwoTone(p, p.accentColor, p.accentOpacity, false)
995
1024
  }
996
1025
  });
997
1026
  const CART_FRAME = "M2 3.5h2.3l3.3 12.9H19.3";
@@ -417,7 +417,8 @@ const NtdCoffee = /* @__PURE__ */ createIcon.createIcon({
417
417
  }
418
418
  });
419
419
  const WINE_BOWL = "M8 3h8c.9 1.8 1.3 3.5 1.3 5a5.3 5.3 0 01-10.6 0c0-1.5.4-3.2 1.3-5z";
420
- const WINE_LIQUID = "M5 8.5h14V15H5z";
420
+ const WINE_LIQUID = "M5 9.5h14V15H5z";
421
+ const WINE_SURFACE = "M5 9.5h14";
421
422
  const WINE_STEM = { x: 11.2, y: 12.8, width: 1.6, height: 6.7 };
422
423
  const WINE_FOOT = { x: 8, y: 19.25, width: 8, height: 1.5, rx: 0.75 };
423
424
  function wineFilled({ primaryColor, accentColor, accentOpacity, strokeWidth, uid }, wine, surface) {
@@ -432,9 +433,9 @@ function wineFilled({ primaryColor, accentColor, accentOpacity, strokeWidth, uid
432
433
  surface && /* @__PURE__ */ jsxRuntime.jsx(
433
434
  "path",
434
435
  {
435
- d: "M5 8.5h14",
436
+ d: WINE_SURFACE,
436
437
  stroke: accentColor,
437
- strokeWidth: strokeWidth * 0.6,
438
+ strokeWidth: strokeWidth * 0.4,
438
439
  opacity: accentOpacity
439
440
  }
440
441
  )
@@ -450,7 +451,7 @@ const NtdWine = /* @__PURE__ */ createIcon.createIcon({
450
451
  solid: (p) => wineFilled(p, p.primaryColor, true),
451
452
  outline: ({ primaryColor, strokeWidth }) => /* @__PURE__ */ jsxRuntime.jsxs("g", { stroke: primaryColor, strokeWidth, fill: "none", children: [
452
453
  /* @__PURE__ */ jsxRuntime.jsx("path", { d: WINE_BOWL, strokeLinejoin: "miter" }),
453
- /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M6.75 8.5h10.5M12 13.3v6.2M8.5 20h7" })
454
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M6.95 9.5h10.1M12 13.3v6.2M8.5 20h7" })
454
455
  ] }),
455
456
  duotone: (p) => wineFilled(p, p.secondaryColor, false),
456
457
  vivid: (p) => wineFilled(p, p.secondaryColor, true)
@@ -458,7 +459,7 @@ const NtdWine = /* @__PURE__ */ createIcon.createIcon({
458
459
  });
459
460
  const BEER_GLASS = "M4.5 8H15.5C16.45 11 16.45 17 15.6 19.9A2.1 2.1 0 0 1 13.6 21.5H6.4A2.1 2.1 0 0 1 4.4 19.9C3.55 17 3.55 11 4.5 8Z";
460
461
  const BEER_GLASS_SHARP = "M4.5 8H15.5C16.45 11 16.45 17 15.6 21.5H4.4C3.55 17 3.55 11 4.5 8Z";
461
- const BEER_FOAM = "M4.6 7.55A1.71 1.71 0 0 1 6.49 4.95A2.07 2.07 0 0 1 10.23 4.05A2.07 2.07 0 0 1 13.69 4.95A1.71 1.71 0 0 1 15.4 7.55Z";
462
+ const BEER_FOAM = "M4.6 7.55V6.34A1.71 1.71 0 0 1 6.49 5.65A2.07 2.07 0 0 1 10.23 4.75A2.07 2.07 0 0 1 13.69 5.65A1.71 1.71 0 0 1 15.4 6.43V7.55Z";
462
463
  const BEER_HANDLE = "M16 11H17.5A2 2 0 0 1 19.5 13V16A2 2 0 0 1 17.5 18H16";
463
464
  const BEER_RIBS = "M8 11V18.5M12 11V18.5";
464
465
  function beer(p, width, glassPath = BEER_GLASS) {
@@ -645,7 +646,8 @@ const NtdSoda = /* @__PURE__ */ createIcon.createIcon({
645
646
  const CHEF_PUFF = "M6 8a4 4 0 014-4h4a4 4 0 014 4c2 0 4 1.5 4 4s-2 4-4 4H6c-2 0-4-1.5-4-4s2-4 4-4z";
646
647
  const CHEF_BAND = "M6 16h12v5a1 1 0 01-1 1H7a1 1 0 01-1-1z";
647
648
  const CHEF_BAND_SHARP = "M6 16h12v6H6z";
648
- const CHEF_LINES = "M6 16.25h12M9.5 18v2.5M14.5 18v2.5";
649
+ const CHEF_LINES = "M8.4 16.9v4.2M10.8 16.9v4.2M13.2 16.9v4.2M15.6 16.9v4.2";
650
+ const CHEF_LINES_OUTLINE = "M8.4 17.3v3.4M10.8 17.3v3.4M13.2 17.3v3.4M15.6 17.3v3.4";
649
651
  function chefHatFilled({ primaryColor, accentColor, accentOpacity, strokeWidth }, band, lines, bandPath = CHEF_BAND) {
650
652
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
651
653
  /* @__PURE__ */ jsxRuntime.jsx("path", { d: CHEF_PUFF, fill: primaryColor }),
@@ -672,16 +674,17 @@ const NtdChefHat = /* @__PURE__ */ createIcon.createIcon({
672
674
  outline: ({ primaryColor, strokeWidth }) => /* @__PURE__ */ jsxRuntime.jsxs("g", { stroke: primaryColor, strokeWidth, fill: "none", strokeLinejoin: "miter", children: [
673
675
  /* @__PURE__ */ jsxRuntime.jsx("path", { d: CHEF_PUFF }),
674
676
  /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M6 16v5a1 1 0 001 1h10a1 1 0 001-1v-5" }),
675
- /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M9.5 18v2.5M14.5 18v2.5" })
677
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: CHEF_LINES_OUTLINE })
676
678
  ] }),
677
679
  duotone: (p) => chefHatFilled(p, p.secondaryColor, false),
678
680
  vivid: (p) => chefHatFilled(p, p.secondaryColor, true)
679
681
  }
680
682
  });
681
683
  const FORK_KNIFE_SCALE = 1.15;
684
+ const FORK_KNIFE_WIDEN = 1.3;
682
685
  const FORK_KNIFE_FRAME = `translate(12 12) scale(${FORK_KNIFE_SCALE}) translate(-12 -12)`;
683
- const FORK_KNIFE_FORK_AT = "translate(6.3 0)";
684
- const FORK_KNIFE_KNIFE_AT = "translate(-6.55 0)";
686
+ const FORK_KNIFE_FORK_AT = `translate(7.913 0) scale(${FORK_KNIFE_WIDEN} 1) translate(-2.1 0)`;
687
+ const FORK_KNIFE_KNIFE_AT = `translate(16.609 0) scale(${FORK_KNIFE_WIDEN} 1) translate(-22.3 0)`;
685
688
  function forkKnifeFilled(fork, knife) {
686
689
  return /* @__PURE__ */ jsxRuntime.jsxs("g", { transform: FORK_KNIFE_FRAME, children: [
687
690
  /* @__PURE__ */ jsxRuntime.jsx("path", { d: iconParts.CUTLERY_FORK, transform: FORK_KNIFE_FORK_AT, fill: fork }),
@@ -700,7 +703,7 @@ const NtdForkKnife = /* @__PURE__ */ createIcon.createIcon({
700
703
  d: iconParts.CUTLERY_KNIFE,
701
704
  transform: FORK_KNIFE_KNIFE_AT,
702
705
  stroke: primaryColor,
703
- strokeWidth: strokeWidth / FORK_KNIFE_SCALE,
706
+ strokeWidth: strokeWidth / (FORK_KNIFE_SCALE * FORK_KNIFE_WIDEN),
704
707
  strokeLinejoin: "miter",
705
708
  fill: "none"
706
709
  }
@@ -747,8 +750,8 @@ const NtdKnife = /* @__PURE__ */ createIcon.createIcon({
747
750
  });
748
751
  const PAN_TURN = "rotate(45 12 12)";
749
752
  const PAN_CENTER = { cx: 9.5, cy: 12 };
750
- const PAN_HANDLE = "M16.6 10.8H21.8A1.2 1.2 0 0 1 21.8 13.2H16.6Z";
751
- const PAN_HOLE = { cx: 21.55, cy: 12, r: 0.55 };
753
+ const PAN_HANDLE = "M16 9.6H21A2.4 2.4 0 0 1 21 14.4H16Z";
754
+ const PAN_HOLE = { cx: 21, cy: 12, r: 1.1 };
752
755
  function panFilled({ primaryColor, accentColor, accentOpacity, strokeWidth }, handle, rings, ringsOpacity) {
753
756
  return /* @__PURE__ */ jsxRuntime.jsxs("g", { transform: PAN_TURN, children: [
754
757
  /* @__PURE__ */ jsxRuntime.jsx("path", { d: PAN_HANDLE, fill: handle }),
@@ -774,7 +777,7 @@ const NtdCookingPan = /* @__PURE__ */ createIcon.createIcon({
774
777
  outline: ({ primaryColor, strokeWidth }) => /* @__PURE__ */ jsxRuntime.jsxs("g", { transform: PAN_TURN, stroke: primaryColor, strokeWidth, fill: "none", children: [
775
778
  /* @__PURE__ */ jsxRuntime.jsx("circle", { ...PAN_CENTER, r: "7.5" }),
776
779
  /* @__PURE__ */ jsxRuntime.jsx("circle", { ...PAN_CENTER, r: "6.2" }),
777
- /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M17 10.8H21.8A1.2 1.2 0 0 1 21.8 13.2H17" }),
780
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M16.6 9.6H21A2.4 2.4 0 0 1 21 14.4H16.6" }),
778
781
  /* @__PURE__ */ jsxRuntime.jsx("circle", { ...PAN_HOLE })
779
782
  ] }),
780
783
  duotone: (p) => panFilled(p, p.secondaryColor, p.secondaryColor, 1),
@@ -302,6 +302,7 @@ exports.NtdStore = business.NtdStore;
302
302
  exports.NtdTrendDown = business.NtdTrendDown;
303
303
  exports.NtdTrendUp = business.NtdTrendUp;
304
304
  exports.NtdWallet = business.NtdWallet;
305
+ exports.NtdWalletOpen = business.NtdWalletOpen;
305
306
  exports.NtdAtSign = social.NtdAtSign;
306
307
  exports.NtdBellRing = social.NtdBellRing;
307
308
  exports.NtdBubble = social.NtdBubble;
@@ -430,7 +430,7 @@ const RACK_SLOTS = [
430
430
  [6.9, 6.2, 4.2]
431
431
  ];
432
432
  const round = (n) => Math.round(n * 1e3) / 1e3;
433
- function rackGeometry(f, width, boxes) {
433
+ function rackGeometry(f, width, boxes, even = false) {
434
434
  const heavy = width * 1.35;
435
435
  const topEdge = f.top - heavy / 2;
436
436
  const bottomEdge = f.bottom - heavy / 2;
@@ -451,16 +451,22 @@ function rackGeometry(f, width, boxes) {
451
451
  { floor: shelf - half, ceiling: topEdge + width }
452
452
  ];
453
453
  const scale = (f.right - f.left) / 16;
454
+ const gap = 0.6 * scale;
455
+ const evenWidth = (f.right - f.left - width - 3 * gap) / 2;
454
456
  const rects = RACK_SLOTS.slice(0, boxes).map(([x, w, h], i) => {
455
457
  const level = levels[Math.floor(i / 2)];
456
- const gap = 0.6 * scale;
457
- const bh = Math.min(h * scale, level.floor - level.ceiling - gap - 0.4 * scale);
458
+ const room = level.floor - level.ceiling - gap - 0.4 * scale;
459
+ if (even) {
460
+ const left = f.left + half + gap + i % 2 * (evenWidth + gap);
461
+ return rect(left, level.floor - gap - room, evenWidth, room);
462
+ }
463
+ const bh = Math.min(h * scale, room);
458
464
  return rect(f.left + half + x * scale, level.floor - gap - bh, w * scale, bh);
459
465
  }).join("");
460
466
  return { lines, frame, rects };
461
467
  }
462
- function rackDrawing(f, boxes, frame, fill, width, outline) {
463
- const g = rackGeometry(f, width, boxes);
468
+ function rackDrawing(f, boxes, frame, fill, width, outline, even = false) {
469
+ const g = rackGeometry(f, width, boxes, even);
464
470
  if (outline) {
465
471
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
466
472
  /* @__PURE__ */ jsxRuntime.jsx("path", { d: g.lines, stroke: frame, strokeWidth: width, strokeLinecap: "butt", fill: "none" }),
@@ -505,13 +511,13 @@ function shelfRackIconFor(level) {
505
511
  }
506
512
  const WAREHOUSE = "M1.5 9.2L12 3.5L22.5 9.2V21H20.4V11H3.6V21H1.5Z";
507
513
  const WAREHOUSE_RACKS = [
508
- { left: 4.75, right: 11.15, top: 12.3, bottom: 19.25, floor: 21 },
509
- { left: 12.85, right: 19.25, top: 12.3, bottom: 19.25, floor: 21 }
514
+ { left: 4.75, right: 11.15, top: 12.3, bottom: 20.3, floor: 21 },
515
+ { left: 12.85, right: 19.25, top: 12.3, bottom: 20.3, floor: 21 }
510
516
  ];
511
517
  function warehouseDrawing(hall, rackFrame, boxes, width, outline) {
512
518
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
513
519
  outline ? /* @__PURE__ */ jsxRuntime.jsx("path", { d: WAREHOUSE, stroke: hall, strokeWidth: width, strokeLinejoin: "miter", fill: "none" }) : /* @__PURE__ */ jsxRuntime.jsx("path", { d: WAREHOUSE, fill: hall }),
514
- WAREHOUSE_RACKS.map((f) => /* @__PURE__ */ jsxRuntime.jsx("g", { children: rackDrawing(f, 4, rackFrame, boxes, outline ? width * 0.7 : width * 0.35, outline) }, f.left))
520
+ WAREHOUSE_RACKS.map((f) => /* @__PURE__ */ jsxRuntime.jsx("g", { children: rackDrawing(f, 4, rackFrame, boxes, outline ? width * 0.7 : width * 0.35, outline, true) }, f.left))
515
521
  ] });
516
522
  }
517
523
  const NtdWarehouse = /* @__PURE__ */ createIcon.createIcon({
@@ -5,7 +5,7 @@ const createIcon = require("../createIcon.js");
5
5
  const iconParts = require("../iconParts.js");
6
6
  const weather = require("./weather.js");
7
7
  const RECYCLE_TURNS = [0, 120, 240];
8
- const RECYCLE_BAND = "M7.82 12.85L5.42 17H9.5";
8
+ const RECYCLE_BAND = "M7.82 12.85L5.42 17H9.25";
9
9
  const RECYCLE_HEAD = "M9.22 14.7L11.82 17L9.22 19.3Z";
10
10
  function recycleArrows(colors, width, filled) {
11
11
  return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: RECYCLE_TURNS.map((turn, i) => /* @__PURE__ */ jsxRuntime.jsxs("g", { transform: `rotate(${turn} 12 13.2)`, children: [