@dava96/osrs-icons 1.0.15 → 1.0.17

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/LICENSE +25 -0
  2. package/README.md +170 -5
  3. package/dist/cjs/animateCursor.d.ts +72 -0
  4. package/dist/cjs/animateCursor.d.ts.map +1 -0
  5. package/dist/cjs/animateCursor.js +94 -0
  6. package/dist/cjs/applyCursors.d.ts +64 -0
  7. package/dist/cjs/applyCursors.d.ts.map +1 -0
  8. package/dist/cjs/applyCursors.js +82 -0
  9. package/dist/cjs/flip.d.ts +55 -0
  10. package/dist/cjs/flip.d.ts.map +1 -0
  11. package/dist/cjs/flip.js +117 -0
  12. package/dist/cjs/generated/icons.d.ts +1 -0
  13. package/dist/cjs/generated/icons.d.ts.map +1 -0
  14. package/dist/cjs/generated/meta.d.ts +15 -0
  15. package/dist/cjs/generated/meta.d.ts.map +1 -0
  16. package/dist/cjs/generated/meta.js +14 -0
  17. package/dist/cjs/index.d.ts +16 -0
  18. package/dist/cjs/index.d.ts.map +1 -0
  19. package/dist/cjs/index.js +20 -1
  20. package/dist/cjs/packs.d.ts +142 -0
  21. package/dist/cjs/packs.d.ts.map +1 -0
  22. package/dist/cjs/packs.js +192 -0
  23. package/dist/esm/animateCursor.d.ts +72 -0
  24. package/dist/esm/animateCursor.d.ts.map +1 -0
  25. package/dist/esm/animateCursor.js +91 -0
  26. package/dist/esm/applyCursors.d.ts +64 -0
  27. package/dist/esm/applyCursors.d.ts.map +1 -0
  28. package/dist/esm/applyCursors.js +79 -0
  29. package/dist/esm/flip.d.ts +55 -0
  30. package/dist/esm/flip.d.ts.map +1 -0
  31. package/dist/esm/flip.js +114 -0
  32. package/dist/esm/generated/icons.d.ts +1 -0
  33. package/dist/esm/generated/icons.d.ts.map +1 -0
  34. package/dist/esm/generated/meta.d.ts +15 -0
  35. package/dist/esm/generated/meta.d.ts.map +1 -0
  36. package/dist/esm/generated/meta.js +14 -0
  37. package/dist/esm/index.d.ts +16 -0
  38. package/dist/esm/index.d.ts.map +1 -0
  39. package/dist/esm/index.js +18 -1
  40. package/dist/esm/packs.d.ts +142 -0
  41. package/dist/esm/packs.d.ts.map +1 -0
  42. package/dist/esm/packs.js +189 -0
  43. package/package.json +2 -2
  44. package/dist/cjs/index_test.d.ts +0 -1
  45. package/dist/cjs/index_test.js +0 -110
  46. package/dist/esm/index_test.d.ts +0 -1
  47. package/dist/esm/index_test.js +0 -105
@@ -0,0 +1,117 @@
1
+ "use strict";
2
+ /**
3
+ * Horizontally flips CSS cursor icons so they point in the opposite direction.
4
+ *
5
+ * Many OSRS inventory icons face right, but cursor conventions typically
6
+ * expect left-facing images. This helper mirrors the embedded base64 PNG
7
+ * using the Canvas API and returns new, ready-to-use CSS cursor strings.
8
+ *
9
+ * Results are cached internally — flipping the same icon twice returns
10
+ * the cached value instantly.
11
+ *
12
+ * **Browser-only** — requires the Canvas API. In non-browser environments
13
+ * (Node.js, SSR) the original cursor strings are returned unchanged.
14
+ *
15
+ * Supports three input shapes:
16
+ * - **Single string** → returns a single flipped string.
17
+ * - **Array of strings** → returns an array of flipped strings (same order).
18
+ * - **Record of strings** → returns a record with the same keys, values flipped.
19
+ * Perfect for flipping an entire pack in one call.
20
+ *
21
+ * @example
22
+ * ```ts
23
+ * import { abyssalWhip, flipCursor } from '@dava96/osrs-icons';
24
+ *
25
+ * // Single icon
26
+ * const flipped = await flipCursor(abyssalWhip);
27
+ * document.body.style.cursor = flipped;
28
+ * ```
29
+ *
30
+ * @example
31
+ * ```ts
32
+ * import { coinsPack, flipCursor } from '@dava96/osrs-icons';
33
+ *
34
+ * // Flip an entire pack
35
+ * const flippedPack = await flipCursor(coinsPack);
36
+ * // flippedPack._1, flippedPack._2, ... are all flipped
37
+ * // flippedPack.stages is a flipped array
38
+ * ```
39
+ *
40
+ * @example
41
+ * ```ts
42
+ * import { airRune, fireRune, flipCursor } from '@dava96/osrs-icons';
43
+ *
44
+ * // Flip an array of cursors
45
+ * const [flippedAir, flippedFire] = await flipCursor([airRune, fireRune]);
46
+ * ```
47
+ */
48
+ Object.defineProperty(exports, "__esModule", { value: true });
49
+ exports.flipCursor = flipCursor;
50
+ /** Matches `url('...')` in a CSS cursor value. Precompiled to avoid re-creation per call. */
51
+ const FLIP_URL_REGEX = /url\('(.*?)'\)/;
52
+ /** Internal cache to avoid re-processing the same icon. */
53
+ const flipCache = new Map();
54
+ // ── Implementation ─────────────────────────────────────────────────
55
+ async function flipCursor(input) {
56
+ if (typeof input === 'string') {
57
+ return flipSingleCursor(input);
58
+ }
59
+ if (Array.isArray(input)) {
60
+ return Promise.all(input.map(flipSingleCursor));
61
+ }
62
+ const entries = Object.entries(input);
63
+ const flippedEntries = await Promise.all(entries.map(async ([key, value]) => {
64
+ if (typeof value === 'string') {
65
+ return [key, await flipSingleCursor(value)];
66
+ }
67
+ if (Array.isArray(value) && value.every((v) => typeof v === 'string')) {
68
+ return [key, await Promise.all(value.map(flipSingleCursor))];
69
+ }
70
+ return [key, value];
71
+ }));
72
+ return Object.fromEntries(flippedEntries);
73
+ }
74
+ // ── Internal helpers ───────────────────────────────────────────────
75
+ /** Flips a single CSS cursor string, using the cache. */
76
+ async function flipSingleCursor(cursorValue) {
77
+ if (flipCache.has(cursorValue)) {
78
+ return flipCache.get(cursorValue);
79
+ }
80
+ if (typeof document === 'undefined') {
81
+ return cursorValue;
82
+ }
83
+ const dataUrlMatch = cursorValue.match(FLIP_URL_REGEX);
84
+ if (!dataUrlMatch) {
85
+ return cursorValue;
86
+ }
87
+ const originalDataUrl = dataUrlMatch[1];
88
+ const flippedDataUrl = await mirrorImage(originalDataUrl);
89
+ const flippedCursor = cursorValue.replace(originalDataUrl, flippedDataUrl);
90
+ flipCache.set(cursorValue, flippedCursor);
91
+ return flippedCursor;
92
+ }
93
+ /**
94
+ * Loads a data URL into an off-screen canvas, mirrors it horizontally,
95
+ * and returns the flipped image as a new data URL.
96
+ */
97
+ function mirrorImage(dataUrl) {
98
+ return new Promise((resolve, reject) => {
99
+ const img = new Image();
100
+ img.onload = () => {
101
+ const canvas = document.createElement('canvas');
102
+ canvas.width = img.width;
103
+ canvas.height = img.height;
104
+ const ctx = canvas.getContext('2d');
105
+ if (!ctx) {
106
+ resolve(dataUrl);
107
+ return;
108
+ }
109
+ ctx.translate(canvas.width, 0);
110
+ ctx.scale(-1, 1);
111
+ ctx.drawImage(img, 0, 0);
112
+ resolve(canvas.toDataURL('image/png'));
113
+ };
114
+ img.onerror = () => reject(new Error('Failed to load cursor image for flipping'));
115
+ img.src = dataUrl;
116
+ });
117
+ }
@@ -17413,3 +17413,4 @@ export declare const zurielsStaff = "url('data:image/png;base64,iVBORw0KGgoAAAAN
17413
17413
  export declare const zurielsStaffLastManStanding = "url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB0AAAAeCAMAAADn2eWTAAAAulBMVEVMaXFsZGRdV1dYUlJnYGBza2tOSUgAAAFIQ0NMRkZbVVV5cXCEenpqYmI8NzdWUFBjXFs5NDSJYF1dNzWkcm9UMC50Q0KFTkqKUU6JgH8/OjpwaWlFQEBQLiyHUExUTU2PVVGTZWNnPTpxQj99V1VkOjl/SkhmMi5hOTeMUlB5SEVXNDB2OjdzOTVcPz1CPT1MJCI1MDBmbmZye3JITkh2RkOU2sS75thboIx807mK1sBwxaxrvaWP2MLZgia+AAAAAXRSTlMAQObYZgAAAAlwSFlzAAALEwAACxMBAJqcGAAAAKxJREFUeNp902cCgyAMBWCU6lPr1qrde++973+t9gBJ+PsRHgRQih2AEvD15BgK9++HUWQ4394P0IEoytOFzkWaZpV2jqRi2AByNymqK8FYAeVh959C1k6Rx3tgQcfOJts1MKKPg56eb5aDLqNGNAbAoc03GJbLNx91CeFIlRJaEgYS1niEiIaEcdQSlvXckHti8Jt2wmHbt0w2FGbgCTvSdodHs++E0r3w3+kHfw4LUj07+AMAAAAASUVORK5CYII='), auto";
17414
17414
  export declare const zurielsStaffBh = "url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB0AAAAeCAMAAADn2eWTAAAAulBMVEVMaXFsZGRdV1dYUlJnYGBza2tOSUgAAAFIQ0NMRkZbVVV5cXCEenpqYmI8NzdWUFBjXFs5NDSJYF1dNzWkcm9UMC50Q0KFTkqKUU6JgH8/OjpwaWlFQEBQLiyHUExUTU2PVVGTZWNnPTpxQj99V1VkOjl/SkhmMi5hOTeMUlB5SEVXNDB2OjdzOTVcPz1CPT1MJCI1MDBmbmZye3JITkh2RkOU2sS75thboIx807mK1sBwxaxrvaWP2MLZgia+AAAAAXRSTlMAQObYZgAAAAlwSFlzAAALEwAACxMBAJqcGAAAAKxJREFUeNp902cCgyAMBWCU6lPr1qrde++973+t9gBJ+PsRHgRQih2AEvD15BgK9++HUWQ4394P0IEoytOFzkWaZpV2jqRi2AByNymqK8FYAeVh959C1k6Rx3tgQcfOJts1MKKPg56eb5aDLqNGNAbAoc03GJbLNx91CeFIlRJaEgYS1niEiIaEcdQSlvXckHti8Jt2wmHbt0w2FGbgCTvSdodHs++E0r3w3+kHfw4LUj07+AMAAAAASUVORK5CYII='), auto";
17415
17415
  export declare const zurielsStaffBhinactive = "url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB0AAAAeCAMAAADn2eWTAAAAsVBMVEVMaXFFQEA5NDQ3IB0oJiZjXFtMRkYAAAEyLi5UTU15SEVhOTdhWlpqYmI1MDBza2ssKipYUlJCPT1bVVU/OjpRSkpMLCpIKihmMi6VZ2V4VFE8NzdWUFBIQ0MkIiJOSUh5cXB/Skh2RkNUMC5dNzVuQD1xQj9nSEZALCqAWFZnPTo/JCRUKCY0GBh0Q0JVW1UgHR1kbGQ0OTRxx65uwahDdmdWmYWW2sZvw6tcoo5mtJ6pW+hyAAAAAXRSTlMAQObYZgAAAAlwSFlzAAALEwAACxMBAJqcGAAAAK9JREFUeNp901cCgyAMBmBU9K9oa7VaR4fde+/2/gerB0jCCw8fISGAUuwAlICPH8dQeH9ejCLH9f59gk6I4HS+0XlRVbnx7Aup2DpAmerABARjB6yOm2YJGdtHmWk0E5l2uS72wJw+DmbWoTBTh9FesgDAoc03GG6Hbz7aEqIlRUoYShhL6PMIEUMJh6OusG090NwTQzRJxhy6keuxSZHFllCRlwoV+ZatpXvhv9Mfx6IK2oVBcCAAAAAASUVORK5CYII='), auto";
17416
+ //# sourceMappingURL=icons.d.ts.map