@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 @@
1
+ {"version":3,"file":"meta.d.ts","sourceRoot":"","sources":["../../../src/generated/meta.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,SAAS,yx4VAwgiBZ,CAAC;AAEX,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC"}
@@ -1,4 +1,18 @@
1
1
  // Auto-generated OSRS Icon metadata
2
+ /**
3
+ * Alphabetically sorted array of every available OSRS icon export name.
4
+ *
5
+ * Use this list for search/autocomplete UIs, icon pickers, or validation.
6
+ * Each entry corresponds to a named export from `@dava96/osrs-icons`.
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * import { iconNames } from '@dava96/osrs-icons';
11
+ *
12
+ * console.log(iconNames.length); // 17,000+
13
+ * const matches = iconNames.filter(n => n.includes('dragon'));
14
+ * ```
15
+ */
2
16
  export const iconNames = [
3
17
  '_10thBirthdayBalloons',
4
18
  '_10thBirthdayCape',
@@ -1,5 +1,20 @@
1
1
  export * from './generated/icons';
2
2
  export * from './generated/meta';
3
+ export * from './packs';
4
+ export * from './flip';
5
+ export * from './applyCursors';
6
+ export * from './animateCursor';
7
+ /**
8
+ * A fun easter-egg cursor for error states — the OSRS Red Herring icon.
9
+ *
10
+ * @example
11
+ * ```ts
12
+ * import { errorCursor } from '@dava96/osrs-icons';
13
+ *
14
+ * document.body.style.cursor = errorCursor;
15
+ * ```
16
+ */
17
+ export { redHerring as errorCursor } from './generated/icons';
3
18
  /**
4
19
  * Extracts the raw `data:image/png;base64,...` URL from one or more
5
20
  * CSS cursor values.
@@ -29,3 +44,4 @@ export declare function toDataUrl(cursorValue: string): string;
29
44
  export declare function toDataUrl<T extends Record<string, string>>(cursorValues: T): {
30
45
  [K in keyof T]: string;
31
46
  };
47
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,SAAS,CAAC;AACxB,cAAc,QAAQ,CAAC;AACvB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC;;;;;;;;;GASG;AACH,OAAO,EAAE,UAAU,IAAI,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAE9D;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAAC;AACvD,wBAAgB,SAAS,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACxD,YAAY,EAAE,CAAC,GACd;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,MAAM;CAAE,CAAC"}
package/dist/esm/index.js CHANGED
@@ -1,13 +1,30 @@
1
1
  export * from './generated/icons';
2
2
  export * from './generated/meta';
3
+ export * from './packs';
4
+ export * from './flip';
5
+ export * from './applyCursors';
6
+ export * from './animateCursor';
7
+ /**
8
+ * A fun easter-egg cursor for error states — the OSRS Red Herring icon.
9
+ *
10
+ * @example
11
+ * ```ts
12
+ * import { errorCursor } from '@dava96/osrs-icons';
13
+ *
14
+ * document.body.style.cursor = errorCursor;
15
+ * ```
16
+ */
17
+ export { redHerring as errorCursor } from './generated/icons';
3
18
  export function toDataUrl(input) {
4
19
  if (typeof input === 'string') {
5
20
  return extractUrl(input);
6
21
  }
7
22
  return Object.fromEntries(Object.entries(input).map(([key, value]) => [key, extractUrl(value)]));
8
23
  }
24
+ /** Matches `url('...')` in a CSS cursor value. Precompiled for use in loops. */
25
+ const CURSOR_URL_REGEX = /url\('(.*)'\)/;
9
26
  /** Extracts the URL from a single `url('...')` CSS value. */
10
27
  function extractUrl(cursorValue) {
11
- const match = cursorValue.match(/url\('(.*)'\)/);
28
+ const match = cursorValue.match(CURSOR_URL_REGEX);
12
29
  return match ? match[1] : cursorValue;
13
30
  }
@@ -0,0 +1,142 @@
1
+ /**
2
+ * Metadata for a cursor pack, used by the documentation site to
3
+ * automatically display all available packs.
4
+ *
5
+ * When adding a new pack, push it onto the {@link allPacks} array
6
+ * so it appears on the site with zero extra work.
7
+ */
8
+ export interface PackInfo {
9
+ /** Display name shown on the site (e.g. "Coins"). */
10
+ name: string;
11
+ /** CSS cursor string for a representative icon displayed beside the name. */
12
+ icon: string;
13
+ /** The variable name consumers import (e.g. "coinsPack"). */
14
+ importName: string;
15
+ /** Short description of what the pack represents. */
16
+ description: string;
17
+ /** Human-readable labels for each stage, in order. */
18
+ stageLabels: string[];
19
+ /** Ordered cursor strings for each stage. */
20
+ stages: readonly string[];
21
+ }
22
+ /**
23
+ * A cursor pack groups related OSRS icons by their in-game state.
24
+ *
25
+ * Each key is a semantic label and each value is the corresponding
26
+ * CSS cursor string, ready to apply to any element's `cursor` property.
27
+ *
28
+ * **Want to add a new pack?** See the
29
+ * {@link https://github.com/Dava96/osrs-icons/blob/main/CONTRIBUTING.md | Contributing Guide}
30
+ * for instructions on assembling and submitting your own cursor packs.
31
+ *
32
+ * @example
33
+ * ```ts
34
+ * import { coinsPack, animateCursor } from '@dava96/osrs-icons';
35
+ *
36
+ * // Animate the coin stack growing
37
+ * const stop = animateCursor(coinsPack.stages, { duration: 1200 });
38
+ * ```
39
+ */
40
+ /**
41
+ * Coins cursor pack — represents increasing wealth from 1gp to 10,000gp.
42
+ *
43
+ * In OSRS, the coin stack sprite changes based on the amount.
44
+ * Great for progress indicators, score displays, or loading states.
45
+ *
46
+ * @example
47
+ * ```ts
48
+ * import { coinsPack } from '@dava96/osrs-icons';
49
+ *
50
+ * // Map a 0–100 progress value to a coin stack
51
+ * const stages = coinsPack.stages;
52
+ * const index = Math.min(Math.floor(progress / 100 * stages.length), stages.length - 1);
53
+ * element.style.cursor = stages[index];
54
+ * ```
55
+ */
56
+ export declare const coinsPack: {
57
+ readonly _1: "url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAICAMAAAD6Ou7DAAAAOVBMVEVMaXFbSgmfgRGOdBH70EL70UhwWw0AAAGxkBX70k37zzW3lRWoiRXdtBr2yB3luhrswR3QqRj7zSbkOlBfAAAAAXRSTlMAQObYZgAAAAlwSFlzAAALEwAACxMBAJqcGAAAADhJREFUeNpjYAACdjCAsjjAAMiDstA5QB47F5TJxAbksLBycgoJ8HIzM4LUcbKy8PEL8sCNg5oMAHx9Anyrx+YNAAAAAElFTkSuQmCC'), auto";
58
+ readonly _2: "url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAMAAACDi47UAAAARVBMVEVMaXHktAD+yADXqQD/0QD/0ABeSgAAAAG3kAD/0hfzwQD/zQDsugD/zwCkgQC9lQB0WwCSdACtiQCdfADDmgCzjgD1wgBsovB2AAAAAXRSTlMAQObYZgAAAAlwSFlzAAALEwAACxMBAJqcGAAAAFVJREFUeNpdj0kOwCAMA8Nq0n3//1MLNBKhvmWksRyiHNSQSj5TjaJCBOIPU3G+HsyClq0pCJ55HMy6R9UD9sFO7gC6clmErFhznVGPK8rj7n5w++EFukYET+thchsAAAAASUVORK5CYII='), auto";
59
+ readonly _3: "url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABsAAAALCAMAAAC53Ab8AAAAV1BMVEVMaXH/zwBeSgD+yAD/0hf/0ybktAAAAAG3kAD/0QDXqQD/0ADzwQD/zQB0WwDIngCqhgCaeQDwvgD/ygDsugCkgQC9lQCSdACtiQCdfADDmgCzjgD1wgCZ+KI0AAAAAXRSTlMAQObYZgAAAAlwSFlzAAALEwAACxMBAJqcGAAAAHlJREFUeNptkFkWgyAQBIclNKAx7prl/ufMQEAx2l/Uq3kNA9E5CDkANrAhkZHA/mSCyOWZzc5N6WxoAG6ce21ayU4kMzV5xrmh9x3XoHJa89y8yOyEUOYRb4d2lRr9ChTd+dVIK4ALlHk9JS5W5oKPf+NC/X0BEX0B4u0GeCgCBnYAAAAASUVORK5CYII='), auto";
60
+ readonly _4: "url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABsAAAANCAMAAABvheXhAAAAYFBMVEVMaXH2yB3QqRj70EL70k3701LdtBoAAAGxkBX70UhbSgn7zzylhhXCnhj7zSbswR1wWw3uwh2VeRHpvh34yh2Eaw3luhq0kxX7zzW3lRWfgRGoiRWOdBGYfBG9mhiujhUvxeaWAAAAAXRSTlMAQObYZgAAAAlwSFlzAAALEwAACxMBAJqcGAAAAIlJREFUeNp1kFcSwyAMREUxC9hJ7PSe+98yEgFMZuz9At6yKkSNAFoR4P0KZSKCmDB70sVnlk+J1ufQKbcZTr4IJUqYmfSl/vdjy1Ic0LG2OzdEZtdM7mMNCMeD3ktTJljLvtszFtb3XDg1ChuMOuvHXKmZAT8ROEC59ysuzC8Bk/4srwZ/CyH6AiYkB7WkpPmdAAAAAElFTkSuQmCC'), auto";
61
+ readonly _5: "url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABsAAAAOCAMAAADpEZdPAAAAYFBMVEVMaXHdtBqfgRH70k3701JbSgnQqRgAAAGxkBX70EK3lRX2yB2OdBFwWw370UjluhrswR37zSarixXuwh2oiRX7zi6bfxFpVQmRdhGVeRF0Xg34yh2Hbg3xxB3pvh3CnhjfHVeAAAAAAXRSTlMAQObYZgAAAAlwSFlzAAALEwAACxMBAJqcGAAAAJBJREFUeNptUFkWwyAING6A2dp03+9/y6LGSNPMByAD80aUEgDIEdQaAIjc54iCTmXsCRSNVOIadR4oJZ0TusjVeWvbJnTW2v2uueEvh3TwrE15c+qZO82M7mEReIz+7JijwRhWCZ2rFhOiTTNQO/pjcarvIP+cx7LTcL38n0UBW3z56ek2OF6k92frmkVdvL+7OQiYUyofJwAAAABJRU5ErkJggg=='), auto";
62
+ readonly _25: "url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABsAAAATCAMAAABWWYYKAAAAXVBMVEVMaXFbSgn70k370Uj70EL2yB1wWw0AAAGxkBX701LQqRjdtBqOdBGVeRGfgRHswR23lRX7zSbluhqoiRWlhhXuwh2Hbg10Xg20kxW6lxXpvh37zCDIoxj7zzX4yh1F/w8cAAAAAXRSTlMAQObYZgAAAAlwSFlzAAALEwAACxMBAJqcGAAAAKtJREFUeNptkVcWhCAMRSkBjGAbnV72v8wJRZED+aB4ycuLYawIE4LVQV+7EDVMoMUyqmBA4JfHTbcY4vv1dHfeYh2oz9DQRERlh2WKBc3JfGEl09DV3toIcddB+EgQQtnZkfQy2Y17lrUkXHvKB1CXngzpok48Shm2jRox30RGvb9B/FGmLwdSCKowO54t7sMwQvoK6+H0/MdMehe7p/zm/ICcrs3RJoV8/wOJmwrmIGvH+wAAAABJRU5ErkJggg=='), auto";
63
+ readonly _100: "url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABsAAAAXCAMAAADNyMQcAAAAhFBMVEVMaXFwWw37zSb70k32yB3701Luwh0AAAGxkBX70EL7zzWfgRGOdBFbSgm3lRXQqRj7zCDdtBrxxB34yh370UiHbg1WRgmbfxGVeRHzxh3luhrswR3nvB3pvh2oiRX7zi6lhhV0Xg20kxW6lxXIoxi9mhiLcRHgthrLpRj7zzx4Yg1pVQmh/vD3AAAAAXRSTlMAQObYZgAAAAlwSFlzAAALEwAACxMBAJqcGAAAANtJREFUeNp1ktkCQzAQRRExiZ3SVkvpvv3//3XIQtB5iMjJ3LmZxLImASqseQAwFXM4kgU00AwaLLBN5jubypOs3MK6EcZ2htN/1YYTiTXeD5dSVxPL9TBSmjbX8ByBoZajFTf3uHvbj5q6UptWzZNJddE3EAmvjrGFH3i3Kc7uMj/g4msPulqUEDeLQ0qpc8y6qE8cT1ZwL2FQc+4eEjT0mTImpr7szReZr/ur9qToLX5gS4EXhGCFOIx0vr58IEVf4aT6ZtyP2gZosXcaLZ8LbuLo9ARrSCqM/z+0HhDka2pQNQAAAABJRU5ErkJggg=='), auto";
64
+ readonly _250: "url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB8AAAAWCAMAAAAPf7fDAAAAwFBMVEVMaXH7zSbxxB37zCD2yB3uwh3zxh0AAAGxkBXswR3iuRrluhrnvB34yh0dGADpvh3FoBiVeRHYsBrVrhrashrdtBqrixXIoxi3lRWLcRGbfxHTrBrCnhjLpRjQqRi6lxW9mhhwWw20kxV0Xg18ZQ3NqBilhhXgthpIOgltWA1pVQmoiRVgTQmujhW/nBiHbg2RdhH7zzz7zi6fgRGihBFCNQCAZw01KgBkUQkmIACYfBFbSgmEaw0uJgA8MAD7zzWLXbQwAAAAAXRSTlMAQObYZgAAAAlwSFlzAAALEwAACxMBAJqcGAAAAUZJREFUeNp1klWWwzAMRWO2w4xlZhrG7n9Xo6YnSdtp9Wdf+UlPlqZpmqhCuxtCViHq5LvcFvXhMkEYDRfyHxeC7S1mhB3XFrVUUwSu+NFSut9OL3gjAlf4QNW004tBnlGiu8srbkqJuBm0ZA6SlhqvvWs/fG+paeHaF8KKYex380XZgjhw02/FDR29YKacjtzOSoXa3pxwZUTBZP7mmIbuPss0H544RtiMiuTzHQH3E2/xQWkUdiM3zlYnzgi4H/eyL8SdsN3NVrbkUCHo5cNZOVFwD+1/W5QSysyp7/1KKNCOyxGBfwrP0gnMTCHg0Xj7c2pnsDv7V6yeqQSuF62RTZDuTl7PnBCCnGCzzEAJUcdP0qFgOEi9vqj+B0fJetcXjip1PXGzBNX6cGoRPYmzR3sEBni4eRo94KCjVDGo6t7PuF3TP1rgG9GlMDsaAAAAAElFTkSuQmCC'), auto";
65
+ readonly _1000: "url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAVCAMAAABmKa5TAAAAulBMVEVMaXHluhrYsBouJgDFoBgdGADuwh0AAAGxkBXpvh3VrhrswR3LpRiLcRHiuRqHbg2OdBGrixXashrnvB3zxh34yh2RdhGujhX2yB26lxXgthrQqRiEaw14Yg23lRXCnhjxxB2fgRGYfBHdtBrTrBptWA2AZw3NqBjIoxhwWw2VeRGoiRWlhhX7zCD7zSabfxFbSglCNQA1KgBWRgk8MABpVQl0Xg20kxV8ZQ2ihBG9mhhIOgn7zzVkUQk7597mAAAAAXRSTlMAQObYZgAAAAlwSFlzAAALEwAACxMBAJqcGAAAASxJREFUeNp1ktd2wjAQRC1jaZAb7p1O6DUhPfn/34pkGSeHwL6t7pnRNk27HZCh3Qt0ZeCWqKUU13aNBvwaK0HjCSubpT2FlSGYJIwEk0+BOVv41bn9R7ywLxYYrCi9k0gIX27nT2hNARa7djc0DecsMbFT70HiyCLTpKPwxpraByGCS8x8PBefIyKm0RPYioN8HbmlX4tIYfjJUeCY6zXmo1k3OYVmXj2K15DP8nFV91jjugLvyPWlIzEPy8F43mCn04xJJbJxshgc3lr1aFcM3yn2ykq06S5eJ/2mtD7N4uBjQpGJ5FtqLNHl+gXNrLGLzIFHYelDh8qcF8s0WV2GjoyVaUVx2QvCqeHXc1F4xO1t/3eXQDDcOM/4dx1qNbh7Ltjr/ur+HWl/ZT+/jxj+uQYGegAAAABJRU5ErkJggg=='), auto";
66
+ readonly _10000: "url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAdCAMAAACKeiw+AAAAwFBMVEVMaXEdGADnvB3swR3pvh3uwh3FoBgAAAGxkBXluhrYsBqVeRHxxB3ashrQqRifgRG3lRXzxh3LpRj2yB2ujhXIoxjiuRrgthpwWw3dtBrVrhr4yh2YfBGbfxGoiRWOdBGrixWRdhGLcREuJgC6lxVtWA3NqBh4Yg29mhg1KgCAZw10Xg20kxWihBFWRglpVQnTrBqEaw1CNQClhhWHbg2/nBj7zCB8ZQ08MAD7zSbCnhhMPQn7zi5kUQn7zzVgTQng0mzuAAAAAXRSTlMAQObYZgAAAAlwSFlzAAALEwAACxMBAJqcGAAAAapJREFUeNp1k2uXmjAQhjUkGSMEhOWygCJQL6irq9Vu99LL//9XnSRQpD07n+bMEzLvDG9Goz5AxeizgIkK6E/C/3QMfT6558B+kSBsMe2Pdtj/IaKixZafPS2H2HmL+bHFzHHD+h4DYS/Jt4URBJa1KW8DTJ1cruZGEBASFZfdEGO/VjAIwa/7D+hm1GqYGzIh5181Dsrbb+hmBIVpUDBxrl41difVI/QbAPYg+JGlQY0tIRbZbLFX2KGxuhAxCqdTvvzQWDbX2uDUXb4iRuG2JaPFT1UVCQ/tseqZnHl1Ul9PZ7aTbIqD0baZeXg7+EQG3npn8ANKup1ADX5eeaZ57IaXE1gKP5OssddfALE7W3zXk5FsZa93zEd8oNPIe0RMe4yl42HHnLTx9lRyg8Xmab5tsS6xmJe1ZXKwhrhbDu1wHEzsg5Lmi4zblrFHTjBXyjXGrUJOZVRu/Ze0mY8BByu3+gclUaiWDrjmVQU5joXucWRTKRcARbxcQ+fZHN1zGcPfoCkvNW6NRoPrFnq3k5QX9TP8+0I6t4N8v8e9qd6S9yN8/qIG5T9OGikrB+sX9AAAAABJRU5ErkJggg=='), auto";
67
+ /** Ordered array of all coin stages, from 1gp to 10,000gp. */
68
+ readonly stages: readonly string[];
69
+ };
70
+ /**
71
+ * Bucket cursor pack — represents a filling progression from empty to full.
72
+ *
73
+ * Perfect for loading indicators, progress bars, or upload states.
74
+ * The `stages` array orders them from empty → full for easy indexing.
75
+ *
76
+ * @example
77
+ * ```ts
78
+ * import { bucketPack } from '@dava96/osrs-icons';
79
+ *
80
+ * // Map a 0–100 progress value to a bucket fill state
81
+ * const stages = bucketPack.stages;
82
+ * const index = Math.min(Math.floor(progress / 100 * stages.length), stages.length - 1);
83
+ * element.style.cursor = stages[index];
84
+ * ```
85
+ */
86
+ export declare const bucketPack: {
87
+ readonly empty: "url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAdCAMAAACdWLz3AAAA5FBMVEVMaXGLckCWe0WUeUNcRhWOdEKRdkMAAAFkTRhgSRiEenqbf0hXQxWghEpwVhpnYGCJgH+IcD+mh01OPBFSPxWjhUyDazxqYmJdV1duZmZ9ZjlzXjWPhYWegkmZfUaBeHiFfHuAaTplXl19dHSHfn1pUBp6Yzl3b25wXDSQhoZ7cnJza2s/MA1JORFsZGRjXFt1bWyFbT12YTdtWDJwaWmLgoGoik05LA00JgksIgmViomNg4N7Xh1sVBqaj49FNBFCPT1bVVVOSUhWUFBUTU2PbiR5cXCIaSKWjIt/dnaTiIirjE4aNStaAAAAAXRSTlMAQObYZgAAAAlwSFlzAAALEwAACxMBAJqcGAAAAVlJREFUeNpd0teWgjAQBmBIIEMEBAREBMGO2Hvd3sv7v8+GYFn97/KdzMxJEYQ8ACDcBl5eK7cKpgfNybVCgVWP/eb/FtDyn4bDx+nAGF0UBolBFWXZmo6d02aI+3FdYanHnqRRzpCs6jQzhT54HYkqHRBAur+jR4yNim1LEkOtQ3OkVGLoOJShrUhnbD6/jZys3KEX1CqVplTMyjWNI83KJ94y6Wfo2PYJx/60L2a46AXaaLjZbLe73eDDksVChsG8W20UeSxRlq0Vw17QrZZnliUyEAk5FPiJjEaZCyGY4NRscwyqfsgJI2SGEebY65ZF1G63TdMM9yomZ8SRWtPdUklHWOa4mDcsgji6ESY5+kF1JuOo5pbeVUTq/JZh4rXKItuqrz9Raq7yqwdjmXwfwvRn/5WGKjrivNEq5NH1M7KWKFKz4W7t/MoAmM0urX/XV38Hjjmu/wC2oyMiAJCBbAAAAABJRU5ErkJggg=='), auto";
88
+ readonly fifth: "url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAdCAMAAACdWLz3AAAA5FBMVEVMaXGLckCWe0WUeUNcRhWOdEKRdkMAAAFkTRhgSRiEenqbf0hXQxWghEpwVhpnYGCJgH+IcD+mh01OPBFSPxWjhUyDazxqYmJdV1duZmZ9ZjlzXjWPhYWegkmZfUaBeHiFfHuAaTplXl19dHSHfn1pUBp6Yzl3b25wXDSQhoZ7cnJza2s/MA1JORFsZGRjXFt1bWyFbT12YTdtWDJwaWmLgoGoik05LA00JgksIgmViomNg4N7Xh1sVBqaj49FNBFCPT1bVVVOSUhWUFBUTU2PbiR5cXCIaSKWjIt/dnaTiIirjE4aNStaAAAAAXRSTlMAQObYZgAAAAlwSFlzAAALEwAACxMBAJqcGAAAAVlJREFUeNpd0teWgjAQBmBIIEMEBAREBMGO2Hvd3sv7v8+GYFn97/KdzMxJEYQ8ACDcBl5eK7cKpgfNybVCgVWP/eb/FtDyn4bDx+nAGF0UBolBFWXZmo6d02aI+3FdYanHnqRRzpCs6jQzhT54HYkqHRBAur+jR4yNim1LEkOtQ3OkVGLoOJShrUhnbD6/jZys3KEX1CqVplTMyjWNI83KJ94y6Wfo2PYJx/60L2a46AXaaLjZbLe73eDDksVChsG8W20UeSxRlq0Vw17QrZZnliUyEAk5FPiJjEaZCyGY4NRscwyqfsgJI2SGEebY65ZF1G63TdMM9yomZ8SRWtPdUklHWOa4mDcsgji6ESY5+kF1JuOo5pbeVUTq/JZh4rXKItuqrz9Raq7yqwdjmXwfwvRn/5WGKjrivNEq5NH1M7KWKFKz4W7t/MoAmM0urX/XV38Hjjmu/wC2oyMiAJCBbAAAAABJRU5ErkJggg=='), auto";
89
+ readonly twoFifths: "url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAdCAMAAACdWLz3AAAA5FBMVEVMaXGLckCWe0WUeUNcRhWOdEKRdkMAAAFkTRhgSRiEenqbf0hXQxWghEpwVhpnYGCJgH+IcD+mh01OPBFSPxWjhUyDazxqYmJdV1duZmZ9ZjlzXjWPhYWegkmZfUaBeHiFfHuAaTplXl19dHSHfn1pUBp6Yzl3b25wXDSQhoZ7cnJza2s/MA1JORFsZGRjXFt1bWyFbT12YTdtWDJwaWmLgoGoik05LA00JgksIgmViomNg4N7Xh1sVBqaj49FNBFCPT1bVVVOSUhWUFBUTU2PbiR5cXCIaSKWjIt/dnaTiIirjE4aNStaAAAAAXRSTlMAQObYZgAAAAlwSFlzAAALEwAACxMBAJqcGAAAAVlJREFUeNpd0teWgjAQBmBIIEMEBAREBMGO2Hvd3sv7v8+GYFn97/KdzMxJEYQ8ACDcBl5eK7cKpgfNybVCgVWP/eb/FtDyn4bDx+nAGF0UBolBFWXZmo6d02aI+3FdYanHnqRRzpCs6jQzhT54HYkqHRBAur+jR4yNim1LEkOtQ3OkVGLoOJShrUhnbD6/jZys3KEX1CqVplTMyjWNI83KJ94y6Wfo2PYJx/60L2a46AXaaLjZbLe73eDDksVChsG8W20UeSxRlq0Vw17QrZZnliUyEAk5FPiJjEaZCyGY4NRscwyqfsgJI2SGEebY65ZF1G63TdMM9yomZ8SRWtPdUklHWOa4mDcsgji6ESY5+kF1JuOo5pbeVUTq/JZh4rXKItuqrz9Raq7yqwdjmXwfwvRn/5WGKjrivNEq5NH1M7KWKFKz4W7t/MoAmM0urX/XV38Hjjmu/wC2oyMiAJCBbAAAAABJRU5ErkJggg=='), auto";
90
+ readonly threeFifths: "url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAdCAMAAACdWLz3AAAA6lBMVEVMaXFJORGWe0Wbf0iEenqDazx6YzkJOmQAAAFcRhVSPxWghEqAaTpwVhp9ZjlzXjV9dHR1bWyUeUOmh012YTdOPBFnYGBwXDRgSRijhUyFbT1qYmJdV1dlXl1waWmRdkNtWDKegkmOdEKZfUaLckBFNBE/MA1sZGR/dnZkTRhXQxVuZmaIcD+BeHh5cXCJgH80Jglza2tjXFuQhoaPhYWoik0sIgk5LA2FfHuViolpUBp3b26LgoF7cnKaj49bVVVCPT1OSUhWUFB7Xh1UTU1sVBqPbiSIaSKWjIuTiIiNg4OrjE6Hfn1mVC6FCO42AAAAAXRSTlMAQObYZgAAAAlwSFlzAAALEwAACxMBAJqcGAAAAVJJREFUeNpd0teWgjAUQFHpN4BSFEQQUFGKBexldHpv//87EwLq6Hljr5tkEahUigCgch08PrWvFTIH3PmlAotXRyP3/xagRg9hONBmJnVW8DTXshJP1SLxOAxxqsYIt504aGgRBi2bDKk8485JkJXcQAXQ67MRToW8idkeUAhhFBNqI5RhFEULo2EJp9z7F0rMl4vojEK77aIqxqF4NnPuePtbgoZxxGik3Y5TjJ2mgoxBuJlO1+tZatv8JEelwdfkKonjOP73UEzmytnjfg+bxpI3Ms8s82z2Q1CpjbySeXUZ6ASbPNen2VhNtRm7Y3T/hHrAdKVWvS7Reo9gpyGPfZpgK9D9AkdKze7pQbdVf2Nof0tuGeaOyvXxqLR6pxfZobh6ML19/LVcfO4+FkuGLrEhq2yRJJ0Qb0kHTH54q3v6ygA6Pru++l5d/DtQVj7/AW6fJZqMVLzGAAAAAElFTkSuQmCC'), auto";
91
+ readonly fourFifths: "url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAdCAMAAACdWLz3AAAA6lBMVEVMaXFJORGWe0Wbf0iEenqDazx6YzkJOmQAAAFcRhVSPxWghEqAaTpwVhp9ZjlzXjV9dHR1bWyUeUOmh012YTdOPBFnYGBwXDRgSRijhUyFbT1qYmJdV1dlXl1waWmRdkNtWDKegkmOdEKZfUaLckBFNBE/MA1sZGR/dnZkTRhXQxVuZmaIcD+BeHh5cXCJgH80Jglza2tjXFuQhoaPhYWoik0sIgk5LA2FfHuViolpUBp3b26LgoF7cnKaj49bVVVCPT1OSUhWUFB7Xh1UTU1sVBqPbiSIaSKWjIuTiIiNg4OrjE6Hfn1mVC6FCO42AAAAAXRSTlMAQObYZgAAAAlwSFlzAAALEwAACxMBAJqcGAAAAVJJREFUeNpd0teWgjAUQFHpN4BSFEQQUFGKBexldHpv//87EwLq6Hljr5tkEahUigCgch08PrWvFTIH3PmlAotXRyP3/xagRg9hONBmJnVW8DTXshJP1SLxOAxxqsYIt504aGgRBi2bDKk8485JkJXcQAXQ67MRToW8idkeUAhhFBNqI5RhFEULo2EJp9z7F0rMl4vojEK77aIqxqF4NnPuePtbgoZxxGik3Y5TjJ2mgoxBuJlO1+tZatv8JEelwdfkKonjOP73UEzmytnjfg+bxpI3Ms8s82z2Q1CpjbySeXUZ6ASbPNen2VhNtRm7Y3T/hHrAdKVWvS7Reo9gpyGPfZpgK9D9AkdKze7pQbdVf2Nof0tuGeaOyvXxqLR6pxfZobh6ML19/LVcfO4+FkuGLrEhq2yRJJ0Qb0kHTH54q3v6ygA6Pru++l5d/DtQVj7/AW6fJZqMVLzGAAAAAElFTkSuQmCC'), auto";
92
+ readonly full: "url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAdCAMAAACdWLz3AAAA6lBMVEVMaXFJORGWe0Wbf0iEenqDazx6Yzl7e5sAAAFcRhVSPxWghEqAaTpwVhp9ZjlzXjV9dHR1bWyUeUOmh012YTdOPBFnYGBwXDRgSRijhUyFbT1qYmJdV1dlXl1waWmRdkNtWDKegkmOdEKZfUaLckBFNBE/MA1sZGR/dnZkTRhXQxVuZmaIcD+BeHh5cXCJgH80Jglza2tjXFuQhoaPhYWoik0sIgk5LA2FfHuViolpUBp3b26LgoF7cnKaj49bVVVCPT1OSUhWUFB7Xh1UTU1sVBqPbiSIaSKWjIuTiIiNg4OrjE6Hfn1mVC6Nk9sLAAAAAXRSTlMAQObYZgAAAAlwSFlzAAALEwAACxMBAJqcGAAAAVJJREFUeNpd0teWgjAUQFHpN4BSFEQQUFGKBexldHpv//87EwLq6Hljr5tkEahUigCgch08PrWvFTIH3PmlAotXRyP3/xagRg9hONBmJnVW8DTXshJP1SLxOAxxqsYIt504aGgRBi2bDKk8485JkJXcQAXQ67MRToW8idkeUAhhFBNqI5RhFEULo2EJp9z7F0rMl4vojEK77aIqxqF4NnPuePtbgoZxxGik3Y5TjJ2mgoxBuJlO1+tZatv8JEelwdfkKonjOP73UEzmytnjfg+bxpI3Ms8s82z2Q1CpjbySeXUZ6ASbPNen2VhNtRm7Y3T/hHrAdKVWvS7Reo9gpyGPfZpgK9D9AkdKze7pQbdVf2Nof0tuGeaOyvXxqLR6pxfZobh6ML19/LVcfO4+FkuGLrEhq2yRJJ0Qb0kHTH54q3v6ygA6Pru++l5d/DtQVj7/AW6fJZqMVLzGAAAAAElFTkSuQmCC'), auto";
93
+ /** Ordered array of all bucket stages, from empty to full. */
94
+ readonly stages: readonly string[];
95
+ };
96
+ /**
97
+ * Free-to-Play Rune cursor pack — the 10 runes available to F2P players.
98
+ *
99
+ * Ordered by the four elemental runes, then combat/utility runes.
100
+ * Great for magic-themed UIs, tooltips, or decorative hover effects.
101
+ *
102
+ * @example
103
+ * ```ts
104
+ * import { runePack } from '@dava96/osrs-icons';
105
+ *
106
+ * // Pick a random rune cursor
107
+ * const randomIndex = Math.floor(Math.random() * runePack.stages.length);
108
+ * element.style.cursor = runePack.stages[randomIndex];
109
+ * ```
110
+ */
111
+ export declare const runePack: {
112
+ readonly air: "url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB0AAAAcCAMAAACqEUSYAAAAz1BMVEVMaXGPhYWonJtza2tsZGR1bWyVionk4eEAAAFwaWl3b259dHR5cXCEenqdkpKbkJB7cnK/trakmZiaj4+QhoaNg4OFfHuLgoF/dnavoqKmm5qpnp2rn5+WjItuZmaJgH/Cubm8srK6r6+soKC3rKy0qaiflJSjl5aYjo2TiIiBeHiHfn2xpaWvpKRbVVW2q6qhlZXFvLyyqKdlXl25rq27sbFjXFtqYmJnYGBRSkpMRka+tLRFQEBUTU1YUlJIQ0NhWlrGvr7BuLddV1dWUFArijJsAAAAAXRSTlMAQObYZgAAAAlwSFlzAAALEwAACxMBAJqcGAAAAcdJREFUeNpt02mbmkAMAGBBJUEEXOQ+pCtyyCHUe92z7f7/39QMSO3W5oOPT95JMgzDYHAL7GNwH4jVtl4tD48P3+4c0YucMq5X+yXx9y+OmGi8H1XlNo5XLf+4MQrzRHM9P3KcqrzyH0WONNV43qMFkbP9whiSKk2aaq7LA/h+WTPuFKWCVFWUpGlSoOA9J973jJJpBEGWzVWAhCm4blSunh+YojgzDX29FoIAgK2gSDWvqg+McTGVLcMA0NcCQJa1nDS8Ey9/4gBHk7woQkpxHP0IAVPaBV+tnklPYzuXTZNyVt+BJihaFB9Id0PJzkFumRroOv3J5krqlXvSD3EmSZSRAQoAo+0fZIrmOjXp22gynVEmB6B6i7Wn6Qqd+5b09TyeTClj26w8DBmvBdXl/Yr0chyOyWd9d7Z9XVB5z3fYA29EcdiWSzZ0u6NiNXX59rAuxwUxAJtOD8eQ09Wk0bqDfj0RUzl05TTc0DNVub6k981oIV7L2XQztDghmPcv+Ok4GrHuk3bzuVxYnL7uLwe+vJ1PLbd7t2WzoOrb1Xl52uy67sTkufz3pUR8Z86iW4H/3ufL52bz62N3ph7/+RoQ77+U36KNMyU1Bh/+AAAAAElFTkSuQmCC'), auto";
113
+ readonly fire: "url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB0AAAAcCAMAAACqEUSYAAAAz1BMVEVMaXGaj4+kmZibkJCdkpKonJtsZGQAAAGoIhVwaWlza2uPhYWViol1bWyflJS/trajl5apnp2mm5qQhoZ9dHR3b26rn5+voqJuZmaLgoGEenqBeHiHfn2WjIvCubmYjo17cnKhlZW8srK6r695cXCsoKC3rKy0qaiFfHuNg4N/dnavpKSxpaVbVVWJgH+TiIi2q6rFvLyyqKdlXl25rq27sbFjXFtqYmJRSkpnYGBMRka+tLRFQEBUTU1YUlJIQ0NhWlrGvr7BuLddV1dWUFD3A8DAAAAAAXRSTlMAQObYZgAAAAlwSFlzAAALEwAACxMBAJqcGAAAAaRJREFUeNpt0+mSojAQAGAJYEdBhkuQa5FVLgFhPUfnntn3f6btoKyjTlflD1/TlXQ6vd4loIvefQAUqyaZbX8//LpzAC22y7RJNjPkP1cOoBDRiotylaZJyx8XBplTiK5ZsW0X5Zn/K0ioKhFFDRNie3XFsEQVIlUluo4ZllU2jE8Kpo/KC4ISRSohLMFONx2DmeVBEIYczwsKPZWIy+TpgSkMpllu1LUc0JDjqNBmEK1otoxhMnedPJcMg8ptBk+pokSinc4+oQf9sef7S8ehVDIopUFAKduFWCRPqPvRwnOzzEfJcdW4GJM43aKuh+bC81z2Ef+n7H+sL6hauUF9H0xNdHoVoUB0u0F97Y/nU5PehIB9X6G+HEbj+fwGZV4XrQL1uBuORuM7xZba7MDVYDC8YanmVV1sm3XcTZCv1eCViJwa/bJHHl7MX+ZGyAvnS3qr+hOs3qGbLR1JDrjugh93ffQzY+d8RzLqbjjg+fWwZ4x7x6Mv3Az7Ll1G5/mxWrfVGaN77vehBHhjzuKUAbfzfPxbVV/v6wPW+OE1ANy/lH+KczGeQmrIpwAAAABJRU5ErkJggg=='), auto";
114
+ readonly water: "url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB0AAAAcCAMAAACqEUSYAAAAz1BMVEVMaXGaj4+onJt1bWydkpJwaWmPhYUVGqgAAAGViolsZGR9dHSQhoaWjIubkJB3b26Eenp5cXCkmZhza2uBeHiHfn17cnKTiIh/dnaFfHuLgoGNg4O/traYjo2flJSjl5amm5qpnp2JgH+hlZWrn5+voqJuZmbCubm8srK6r6+soKC3rKy0qaixpaWvpKRbVVW2q6rFvLyyqKdlXl25rq27sbFjXFtqYmJRSkpnYGBMRka+tLRFQEBUTU1YUlJIQ0NhWlrGvr7BuLddV1dWUFDUeke0AAAAAXRSTlMAQObYZgAAAAlwSFlzAAALEwAACxMBAJqcGAAAAapJREFUeNpt02mDmjAQBmDBSAbEKHiAsnII2Mpdz9U9e/z/37STAEu3dr4+kxdmCL1eV9BW774Ain2V7k7fH77dOUCQxHlWpccd8o8vDuCacpQU+T7LUsE/OwZVck0/iJI4LvKGPxUUVM+U5QAbknj/hWGDSkLPM30fO6IorzjXCsM5KiPEDUOPmrwhzo4tw3DpjEbrtcQYcWkdkeTp0wNXGCyWjm5ZKnZIEq0jzKCoTpxha0xWjqPouqWqlNYRbijH2e4X9EAbz+bzzWrlKIpOKRUR+BZykT6hXvr2bLJcigbU+hGMmEl2Qj1Mh/YMHQMoL3wCMvGC/Ij6PlgM0SfotGNi+nGF+qqNjcZpxwT3vkd9ufbHBrptzxpVkJkvRwXq7Tzt98XxBimOpzJcacwHLgeDqThOO7aY58tiWbfzlvPYaHGzUnTmhma96JcLMnqDOLqjrxlpPtJbqW1FukAcHQ+rI6n9wI9nTePpQnG0OUZb7eWA59frRbB4d3vC16p0V+f5sTw06cZiwTfz96UEeOPOq+6Af+/z7U9Z/n4/XDHjP38DwP2f8gHHtzWW+3HO1QAAAABJRU5ErkJggg=='), auto";
115
+ readonly earth: "url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB0AAAAcCAMAAACqEUSYAAAAz1BMVEVMaXFsZGSEenqPhYVwaWmdkpKonJttSQ0AAAF9dHSViol5cXCbkJCkmZh/dnaBeHh7cnJ3b251bWyHfn2LgoGFfHuaj49za2uJgH+Ng4OQhoa/traflJSjl5amm5qpnp2WjIuTiIirn5+voqJuZmbCubmYjo2hlZW8srK6r6+soKC3rKy0qaixpaWvpKRbVVW2q6rFvLyyqKdlXl25rq27sbFqYmJjXFtRSkpnYGBMRka+tLRFQEBYUlJUTU1IQ0NhWlrGvr7BuLddV1dWUFAr/HOAAAAAAXRSTlMAQObYZgAAAAlwSFlzAAALEwAACxMBAJqcGAAAAZxJREFUeNpt0+liokAMAGAVBiIyXtyUQ8DVyl3Pau923/+ZNgOiRTd/v5BkMkOncw1oonMfAPm6TFa7x4c/dw7gx1GWlsl2hfzUcgCHCmGcZ+s0TSr+ujJIukM9P4yjKM/OfFHgUF0qCD4mxNG6xWCikqXrUs/DjDDMSsa1Ql9BlQlxlkuXUpYQpduGoa9Zs9liocsycZy6RJwlLw9MgR9rlh0EEmbolxJ+Xu4Yw3zQUy2Ls+1AkpoSoihE6eobOtCdjBTFVFVL/B1EyJMX1P10OOppWstEmdA43aFujP5wNGqjqBPXz7aon/y4j97raayBxXE4wGxBqBeVqG/dyeDirH/FBPe+Rn0/TicD9CFrr5gmGy+QZE8Ic9TTwZiit9rakowrjdiBC543bobiAtn1hGpZp8Ocv1Vbdpa0XvT7fs4bxrQZDptb9kIm50v6KLpzrH4eDtlUOWmmNxf8fOiiI09qVlQ8VfM44PXtuK+4qj6szs1dn87rc7Fpqo+rz38/SoAP5izqDLh9z6e/RfHzuTlijf/8DQD3f8o/qkc1EyGPx1YAAAAASUVORK5CYII='), auto";
116
+ readonly chaos: "url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB0AAAAcCAMAAACqEUSYAAAA2FBMVEVMaXF1bWxsZGSonJt5cXB3b25waWngqBoAAAHk4eGkmZh9dHRza2t7cnKPhYWdkpKbkJC/traViompnp2mm5qEenqBeHiLgoGaj49uZmavoqKrn59IRgmHfn1/dnaFfHvCubm8srK6r6+3rKy0qaiQhoasoKCflJSWjIujl5aJgH+Ng4OxpaWvpKRbVVWhlZW2q6qTiIiYjo3FvLyyqKdlXl0VERG5rq27sbFjXFtqYmJnYGBRSkpMRka+tLRFQEBUTU1YUlJIQ0NhWlrGvr7BuLddV1dWUFAAM/I5AAAAAXRSTlMAQObYZgAAAAlwSFlzAAALEwAACxMBAJqcGAAAAbBJREFUeNpt01ljojAQAGAFlWmUoxyiIGUrt9xU61V7btv//492wrGua+eBB75kkpkkvd45oIvedQCk68JZ7u5vf105gOIbiVs42yXyw4UDBIQ1/TRZu65T8+8zgzwLiKqYvmGkSct/FQTUiLCsggN8Y33BsEIV8ygiqoojTDMpKDcKYwtVEsUgzyNC6ADD3XYMYzsOw6qaSRJXB6bwE+f5liqMeDv2ylIOQ64NTKGkxY4yzAeaHseC53HcDQ3kIMhZw11+Qg+Y4dSyVrre4GJBGXfBps4z6qF/N9VsG//dLDrFTRLf3aFuJuO76VS70GomRkqyRf0Y8WN0rl22XjisRKIaBeobMxygN/r4WKscitj3NerrsT8coFOlSLmUJZU1U9TTftJH57lzRYInS9hSgxacjUYTOr1h/OqxUEqRytbNOu3nlIeDtlVYvOBJQU6aRr8ekOn0GjXbWsVeJYntIb1nzLzJjkhbg5PlcNYd8NOeYdrsPJauWZi67C4HvLwdDzX3a6a5deF8dV6esk2Xna+n/3spAd6p02hGwP/3+fSdZV8fmyPm+OE1AFy/lD+qgjWJ67gidwAAAABJRU5ErkJggg=='), auto";
117
+ readonly mind: "url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB0AAAAcCAMAAACqEUSYAAAA0lBMVEVMaXGLgoFwaWlsZGR5cXB7cnJ9dHQAAAFIRgngiBqEenqFfHuHfn2onJuPhYV1bWyViomdkpKbkJCBeHikmZiQhoaflJSJgH+Ng4OTiIi/trZ3b26aj49uZmZ/dnZza2ujl5ahlZXCubm8srK6r6+3rKyvoqKrn5+soKCpnp2mm5q0qaixpaWvpKRbVVWWjIuYjo3FvLy2q6qyqKdlXl27sbG5rq1jXFtqYmJRSkpMRkZnYGBFQEC+tLRYUlJUTU1IQ0NhWlrGvr7BuLdWUFBdV1d4dGkXAAAAAXRSTlMAQObYZgAAAAlwSFlzAAALEwAACxMBAJqcGAAAAcRJREFUeNpt0+eCmkAQAGDBMrMivQiHBRNFQFBjP72a8v6vlJnljLmY+cnHTtnSaNwCrtG4D4Bqu5lN918fvtw5QJ6l5WIzO0yJv31ygMDT51lVbheLmeTvNwZrEHhFPs/StCo/+I+CQZp4up4LkWXp9hNDn9SeJIlXCKHn83kpmGuFTo9UCDuYTITwCl0XQhyuDB0tXNEH4Th2EFAKIYqsnD0/sILa1kI/Yl4PEJFTJF5ebfbMMGx1lTA0fD9CGXUKPV1Mf0ADmrHb6/UVJSSJIgtxPRg4tq1Xs2fSkzlyu5rWQ6QffKQMqzWxly32pLtxZ+SSI/YVZEeLm0zy8kD6rra5pS4iFwgNym+t1rZXpBvSl2bcanc6I8SuxvURfWKb9n1L+nox4xY5osvcr9kp9HlFej6OTTO+ssbNGb7l0JamPPBSVcdyeT2vLB45SaHLzTofh8RCyOVcXAjDd4KJV2/062moctuyOVeyWDv2xyG9LZvMdXPMfcWwVoPrAT8em03OHsc19xTDj66XA55eLifJJmcfybmN29V5elzuiNUxF5fL/76UAG/sHHK6Nvx7n88/l8tf77sL5fjPawC4fym/AWbpNUTFnNo2AAAAAElFTkSuQmCC'), auto";
118
+ readonly death: "url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB0AAAAcCAMAAACqEUSYAAAA0lBMVEVMaXGPhYWHfn1waWmLgoFsZGR5cXDk4eEAAAF7cnKViomdkpJ3b26Ng4OQhoaJgH91bWx9dHSaj4+WjIuonJu/traEenqkmZiFfHubkJCTiIhza2uvoqJuZmYVERHCubm8srKYjo2flJSpnp20qairn5+3rKy6r6+BeHijl5asoKCmm5qvpKSxpaVbVVV/dna2q6rFvLyhlZWyqKdlXl27sbFjXFtqYmK5rq1nYGBRSkpMRka+tLRFQEBUTU1YUlJIQ0NhWlrGvr7BuLddV1dWUFBUSRUMAAAAAXRSTlMAQObYZgAAAAlwSFlzAAALEwAACxMBAJqcGAAAAbFJREFUeNpt0+di2jAQAGCMMTpb2MEjeGBoPMETl03IbNr3f6WeBAZSej/1Sac7jU7nGtBG5z4AylWTzjZPjz/uHCDK/Spu0v0M+ec3BwhtK8nLahXHKedfVwbFCO0iSnLfL6szXxQE1My2rIgQkvurbwwPqHSZZTZhkSRVw/ikoHdRXUpDZtMpsSI/3rcMuqOaZhAYSFxJUeRV+vLIFETZUTXPU0yuLJaZHZXNhjFM+qOeqgqaRtqgYbi0/Hj2BR2QBvNu96HXU/m2hJiBwaqwyvQFdTdczEeOc5owJbgFukvtPN6grsf6Yo6OCdhqTUMPDJpF1R71U5R19BH3nioInKld+A3quzToo+OykXPZ36R47ivUt8Nw0O/LvFrnnN1T3MJKStTjdjxEly8NEWxPca0o8VnDtSiOr8sJYZt7blZY/LCO2wnjwQ0Lmhsu7dNBv+2Qx0Nyk1sLXHq+pI9amogiH5bbxYpptBf8vJWkCRtmvWFnXUzttY8DXt8PO8a8dn3B+xauT+f1uV6z7Kx2WWYnd/soAT6YszjNgH/f8/FPXf/+XB8wx39+A8D9T/kLRWwzl3aLm/YAAAAASUVORK5CYII='), auto";
119
+ readonly law: "url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB0AAAAcCAMAAACqEUSYAAAAz1BMVEVMaXFsZGSPhYWdkpJwaWmLgoGFfHsaIuAAAAGHfn13b251bWyEenqJgH9za2uonJt9dHR5cXCkmZiViom/trZ7cnKNg4OQhoapnp1uZmabkJCvoqKaj4+rn5/CubmBeHi8srK6r6+mm5qjl5a3rKysoKC0qaiflJShlZV/dnZbVVWvpKSTiIixpaWWjIu2q6rFvLxlXl2yqKeYjo27sbFjXFtqYmJRSkpnYGBMRka5rq1FQEC+tLRUTU1YUlJIQ0NhWlrGvr7BuLddV1dWUFAdIpvGAAAAAXRSTlMAQObYZgAAAAlwSFlzAAALEwAACxMBAJqcGAAAAbhJREFUeNpt0+eCmkAQAGAFYQZFaUeREiNNpMZ66tUk9/7PdLMIMRcz/+DbnZltg8EtsI/BfSAW2yZe7r8/fLtzRCfxqrSJL0viH18ccaUrQVJU2zSNW/55YzT8lR46QeJ5RdXxH0WONNIVxaEBibf9wjgl5bMo0sOQRgRB1TC+KqoSqcvzqyyLdKBwvPTSM6qiVde7HdwiTKr4+YEpjkzRssuygy6FUzR7xjjXZMGyONsuDQNg57vAwypTvHT5Cwc4HC8kaQqCxXE2gFHX4AN1oRTxM+lxsl7IoiiBIFgANpWogVhP0j3pZqauFyCLIE0FgHY+gM9HTnUhfR+Zqtp2xApYXNedHnoN6etwrJntH7lN36sSbElfTpOxBj1Ppx2HSlCQng+zyWRM31ReBrGtDoZLW+qxBeej0Yyma6a6pv+MLa50o1BpN+t8mDOm6mqXXeBsd5Xp141+ORLP+uqMLXvn8t0hveXDeZu9VdoammzUfn/Aj4ch+aw7iIUsUeqyvxz49Ho6MqbeWW/X0rer8/SYb7rsmmmypf19KRHfmLO4jsB/7/P5I89/v29OlOM/rwHx/qV8AsWdMoqwxBK4AAAAAElFTkSuQmCC'), auto";
120
+ readonly nature: "url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB0AAAAcCAMAAACqEUSYAAAAz1BMVEVMaXFsZGR1bWyEenp9dHRwaWmViokAAAERixWPhYV7cnKLgoF5cXCbkJCdkpKNg4N3b26Hfn2aj4+WjIuQhoZza2uFfHuJgH9/dnaTiIiBeHi/trakmZionJuflJSYjo2voqJuZmbCubm8srK6r6+3rKyjl5a0qaisoKCpnp2vpKSrn59bVVW2q6qmm5qxpaXFvLyhlZWyqKdlXl25rq27sbFjXFtqYmJnYGBRSkpMRka+tLRFQEBUTU1YUlJIQ0NhWlrGvr7BuLddV1dWUFA3NRYCAAAAAXRSTlMAQObYZgAAAAlwSFlzAAALEwAACxMBAJqcGAAAAb1JREFUeNpt03ebmkAQBnARZQYVkCICR/OiNCmxe15N+f6f6WYXjLmY+YuHH/POsiy93q3gWr37Aii21Wp5+PbweOcAeRY3abXaL4m/f3GA0A/WWdFs03TF+ceNQTJCv87XWRwXTcd/FGTSxA+CnB7I4u0XhjmpukkSH7uqGLcKA51UUfFWcbq/MgxszTQjuqmoYbhJ6KLOmtXzA1MYjmzNcumeGRkUoYaIiZ8X1YExLCbiWNNIXUkyo8hQFMRwE8Tp8if0QJh6uj4nlWXLdSXTRGQRQbF6Jj31HU+0bcTxWJMtNoNGKKqfpQfS3WzgeOSIc5ogUwgNMNQkb/akH8PRgFwUbV3HMc8nVv06rkjfhOmkc2pHFk+s0r5vSV/P/emE3HE8RJ3FM1bqYF2QXo6zfr9tR7RR5ywpQb6O2QuXw+GsbUekcM6uktQB36zLccGY2hFZO7FsKeHGbzf69UTM2hFZO7FmRYrafaT3UljwdERqp1enZsk0rh/46SgILB2Rrd0TdYp2r4cDXt7OJ8587Y7IR9+OzstTuevSJyPe/vehBHhnzqp9Av49z5ffZfnrY3emjP/8DQD3f8onci40NjYnZ7EAAAAASUVORK5CYII='), auto";
121
+ readonly body: "url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB0AAAAcCAMAAACqEUSYAAAA0lBMVEVMaXF5cXCNg4NsZGSPhYV9dHR7cnIAAAEYINAVERGHfn2QhoaonJtwaWl/dnaEenqFfHuViomkmZidkpKbkJB1bWyBeHiJgH+LgoGaj493b26flJS/traWjIuTiIijl5Zza2vCubm8srK6r6+3rKyrn5+pnp2voqKsoKBuZmahlZW0qaivpKSmm5qYjo1bVVWxpaXFvLy2q6qyqKdlXl25rq27sbFjXFtqYmJRSkpMRkZnYGBFQEC+tLRYUlJUTU1IQ0NhWlrGvr7BuLdWUFBdV1esApB5AAAAAXRSTlMAQObYZgAAAAlwSFlzAAALEwAACxMBAJqcGAAAAcpJREFUeNpt0+uamkAMBmAFJAkHQUAFWcGtclBBrefVPbbb+7+lZkBrt3b+wfvkS2YYGo3bgutq3C+AYrOejPffHh7vHCDNs9V8PdmNmb9/cYDQMZK8WG3m80nFP24MnSB0yjTJs6xYXfiPgsIaO4aRIuZ5tvnC0Gd1Z3HslIhGmiSIgmuFlsaK6IazGaJTGgYi7q4MLVsa8ovA89wwFBGcv5q8PAgFU7UlPWIeLgIi4giMnbRY7wXDtGn5kqToetQhWhDVEUY2H/+EBsiDnqb1fV9SiKKIiCMCz3WNYvLCeuy2e5Zta30ikcDM7rlOPt+zbketdo+dqF91IOqIIeN0tWP9MFV+QIsn4gaczwMMF65TZmvWV3nQVFtcb1mCRTyzy+e+YX07dwdN9na7R6K7X7FXGknBejqMut26nKjurugdj480ExtemuaoLieqmqOkRF5cGtVhnQ5TZh5MrdTWEBXdC2dOfdBvx6nJeB1OMC489/KR3pfylF9chmPm4s4wuH7gp4Mso2g+qFnzeezr5YDn1/NRFs27KJiz+75yuzrPT8stszlC5qr870sJ8C5crGp3Kvx7n0+fy+Wvj+2ZM/7zNwDc/ym/ARuUNYt5kjXZAAAAAElFTkSuQmCC'), auto";
122
+ /** Ordered array of all F2P runes: elementals first, then combat/utility. */
123
+ readonly stages: readonly string[];
124
+ };
125
+ /**
126
+ * Registry of all available cursor packs.
127
+ *
128
+ * The documentation site reads this array to automatically render
129
+ * every pack. To add a new pack to the site, simply push your
130
+ * {@link PackInfo} entry here — no site code changes needed.
131
+ *
132
+ * @example
133
+ * ```ts
134
+ * import { allPacks } from '@dava96/osrs-icons';
135
+ *
136
+ * allPacks.forEach(pack => {
137
+ * console.log(`${pack.name}: ${pack.stages.length} stages`);
138
+ * });
139
+ * ```
140
+ */
141
+ export declare const allPacks: PackInfo[];
142
+ //# sourceMappingURL=packs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"packs.d.ts","sourceRoot":"","sources":["../../src/packs.ts"],"names":[],"mappings":"AA6BA;;;;;;GAMG;AACH,MAAM,WAAW,QAAQ;IACvB,qDAAqD;IACrD,IAAI,EAAE,MAAM,CAAC;IACb,6EAA6E;IAC7E,IAAI,EAAE,MAAM,CAAC;IACb,6DAA6D;IAC7D,UAAU,EAAE,MAAM,CAAC;IACnB,qDAAqD;IACrD,WAAW,EAAE,MAAM,CAAC;IACpB,sDAAsD;IACtD,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,6CAA6C;IAC7C,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;CAC3B;AAED;;;;;;;;;;;;;;;;;GAiBG;AAIH;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,SAAS;;;;;;;;;;;IAWpB,8DAA8D;qBAYzD,SAAS,MAAM,EAAE;CACd,CAAC;AAEX;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,UAAU;;;;;;;IAOrB,8DAA8D;qBAQzD,SAAS,MAAM,EAAE;CACd,CAAC;AAIX;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,QAAQ;;;;;;;;;;;IAWnB,6EAA6E;qBAYxE,SAAS,MAAM,EAAE;CACd,CAAC;AAIX;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,QAAQ,EAAE,QAAQ,EAoC9B,CAAC"}
@@ -0,0 +1,189 @@
1
+ import { coins1, coins2, coins3, coins4, coins5, coins25, coins100, coins250, coins1000, coins10000, bucket, _15thsFullBucket, _25thsFullBucket, _35thsFullBucket, _45thsFullBucket, bucketOfWater, airRune, fireRune, waterRune, earthRune, chaosRune, mindRune, deathRune, lawRune, natureRune, bodyRune, } from './generated/icons';
2
+ /**
3
+ * A cursor pack groups related OSRS icons by their in-game state.
4
+ *
5
+ * Each key is a semantic label and each value is the corresponding
6
+ * CSS cursor string, ready to apply to any element's `cursor` property.
7
+ *
8
+ * **Want to add a new pack?** See the
9
+ * {@link https://github.com/Dava96/osrs-icons/blob/main/CONTRIBUTING.md | Contributing Guide}
10
+ * for instructions on assembling and submitting your own cursor packs.
11
+ *
12
+ * @example
13
+ * ```ts
14
+ * import { coinsPack, animateCursor } from '@dava96/osrs-icons';
15
+ *
16
+ * // Animate the coin stack growing
17
+ * const stop = animateCursor(coinsPack.stages, { duration: 1200 });
18
+ * ```
19
+ */
20
+ // ── Progression Packs ──────────────────────────────────────────────
21
+ /**
22
+ * Coins cursor pack — represents increasing wealth from 1gp to 10,000gp.
23
+ *
24
+ * In OSRS, the coin stack sprite changes based on the amount.
25
+ * Great for progress indicators, score displays, or loading states.
26
+ *
27
+ * @example
28
+ * ```ts
29
+ * import { coinsPack } from '@dava96/osrs-icons';
30
+ *
31
+ * // Map a 0–100 progress value to a coin stack
32
+ * const stages = coinsPack.stages;
33
+ * const index = Math.min(Math.floor(progress / 100 * stages.length), stages.length - 1);
34
+ * element.style.cursor = stages[index];
35
+ * ```
36
+ */
37
+ export const coinsPack = {
38
+ _1: coins1,
39
+ _2: coins2,
40
+ _3: coins3,
41
+ _4: coins4,
42
+ _5: coins5,
43
+ _25: coins25,
44
+ _100: coins100,
45
+ _250: coins250,
46
+ _1000: coins1000,
47
+ _10000: coins10000,
48
+ /** Ordered array of all coin stages, from 1gp to 10,000gp. */
49
+ stages: [
50
+ coins1,
51
+ coins2,
52
+ coins3,
53
+ coins4,
54
+ coins5,
55
+ coins25,
56
+ coins100,
57
+ coins250,
58
+ coins1000,
59
+ coins10000,
60
+ ],
61
+ };
62
+ /**
63
+ * Bucket cursor pack — represents a filling progression from empty to full.
64
+ *
65
+ * Perfect for loading indicators, progress bars, or upload states.
66
+ * The `stages` array orders them from empty → full for easy indexing.
67
+ *
68
+ * @example
69
+ * ```ts
70
+ * import { bucketPack } from '@dava96/osrs-icons';
71
+ *
72
+ * // Map a 0–100 progress value to a bucket fill state
73
+ * const stages = bucketPack.stages;
74
+ * const index = Math.min(Math.floor(progress / 100 * stages.length), stages.length - 1);
75
+ * element.style.cursor = stages[index];
76
+ * ```
77
+ */
78
+ export const bucketPack = {
79
+ empty: bucket,
80
+ fifth: _15thsFullBucket,
81
+ twoFifths: _25thsFullBucket,
82
+ threeFifths: _35thsFullBucket,
83
+ fourFifths: _45thsFullBucket,
84
+ full: bucketOfWater,
85
+ /** Ordered array of all bucket stages, from empty to full. */
86
+ stages: [
87
+ bucket,
88
+ _15thsFullBucket,
89
+ _25thsFullBucket,
90
+ _35thsFullBucket,
91
+ _45thsFullBucket,
92
+ bucketOfWater,
93
+ ],
94
+ };
95
+ // ── Collection Packs ───────────────────────────────────────────────
96
+ /**
97
+ * Free-to-Play Rune cursor pack — the 10 runes available to F2P players.
98
+ *
99
+ * Ordered by the four elemental runes, then combat/utility runes.
100
+ * Great for magic-themed UIs, tooltips, or decorative hover effects.
101
+ *
102
+ * @example
103
+ * ```ts
104
+ * import { runePack } from '@dava96/osrs-icons';
105
+ *
106
+ * // Pick a random rune cursor
107
+ * const randomIndex = Math.floor(Math.random() * runePack.stages.length);
108
+ * element.style.cursor = runePack.stages[randomIndex];
109
+ * ```
110
+ */
111
+ export const runePack = {
112
+ air: airRune,
113
+ fire: fireRune,
114
+ water: waterRune,
115
+ earth: earthRune,
116
+ chaos: chaosRune,
117
+ mind: mindRune,
118
+ death: deathRune,
119
+ law: lawRune,
120
+ nature: natureRune,
121
+ body: bodyRune,
122
+ /** Ordered array of all F2P runes: elementals first, then combat/utility. */
123
+ stages: [
124
+ airRune,
125
+ fireRune,
126
+ waterRune,
127
+ earthRune,
128
+ chaosRune,
129
+ mindRune,
130
+ deathRune,
131
+ lawRune,
132
+ natureRune,
133
+ bodyRune,
134
+ ],
135
+ };
136
+ // ── Pack Registry ──────────────────────────────────────────────────
137
+ /**
138
+ * Registry of all available cursor packs.
139
+ *
140
+ * The documentation site reads this array to automatically render
141
+ * every pack. To add a new pack to the site, simply push your
142
+ * {@link PackInfo} entry here — no site code changes needed.
143
+ *
144
+ * @example
145
+ * ```ts
146
+ * import { allPacks } from '@dava96/osrs-icons';
147
+ *
148
+ * allPacks.forEach(pack => {
149
+ * console.log(`${pack.name}: ${pack.stages.length} stages`);
150
+ * });
151
+ * ```
152
+ */
153
+ export const allPacks = [
154
+ {
155
+ name: 'Coins',
156
+ icon: coins10000,
157
+ importName: 'coinsPack',
158
+ description: 'Stack grows from 1gp to 10,000gp — great for progress or score displays',
159
+ stageLabels: ['1', '2', '3', '4', '5', '25', '100', '250', '1K', '10K'],
160
+ stages: coinsPack.stages,
161
+ },
162
+ {
163
+ name: 'Bucket',
164
+ icon: bucket,
165
+ importName: 'bucketPack',
166
+ description: 'Empty → Full — perfect for loading indicators or upload progress',
167
+ stageLabels: ['Empty', '1/5', '2/5', '3/5', '4/5', 'Full'],
168
+ stages: bucketPack.stages,
169
+ },
170
+ {
171
+ name: 'F2P Runes',
172
+ icon: airRune,
173
+ importName: 'runePack',
174
+ description: 'All 10 free-to-play runes — perfect for magic-themed UIs or hover effects',
175
+ stageLabels: [
176
+ 'Air',
177
+ 'Fire',
178
+ 'Water',
179
+ 'Earth',
180
+ 'Chaos',
181
+ 'Mind',
182
+ 'Death',
183
+ 'Law',
184
+ 'Nature',
185
+ 'Body',
186
+ ],
187
+ stages: runePack.stages,
188
+ },
189
+ ];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dava96/osrs-icons",
3
- "version": "1.0.15",
3
+ "version": "1.0.17",
4
4
  "description": "Old School RuneScape inventory icons as ready-to-use CSS cursor values. Tree-shakeable, zero runtime dependencies.",
5
5
  "keywords": [
6
6
  "osrs",
@@ -40,7 +40,7 @@
40
40
  "build": "tsc -p tsconfig.json && tsc -p tsconfig.esm.json",
41
41
  "prepublishOnly": "npm run build",
42
42
  "lint": "eslint .",
43
- "test": "ts-node src/index_test.ts",
43
+ "test": "ts-node src/index_test.ts && ts-node src/packs_test.ts && ts-node src/flip_test.ts && ts-node src/applyCursors_test.ts && ts-node src/animateCursor_test.ts",
44
44
  "format": "prettier --write ."
45
45
  },
46
46
  "devDependencies": {
@@ -1 +0,0 @@
1
- export {};
@@ -1,110 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- const index_1 = require("./index");
7
- const meta_1 = require("./generated/meta");
8
- const node_assert_1 = __importDefault(require("node:assert"));
9
- const VALID_CURSOR = "url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAA'), auto";
10
- const EXPECTED_DATA_URL = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAA';
11
- // ── Single-value mode ──────────────────────────────────────────────
12
- function testExtractsDataUrlFromValidCursorValue() {
13
- const result = (0, index_1.toDataUrl)(VALID_CURSOR);
14
- node_assert_1.default.strictEqual(result, EXPECTED_DATA_URL);
15
- console.log('✓ single: extracts data URL from a valid cursor value');
16
- }
17
- function testReturnsOriginalStringWhenNoUrlPatternFound() {
18
- const plainString = 'not-a-cursor-value';
19
- const result = (0, index_1.toDataUrl)(plainString);
20
- node_assert_1.default.strictEqual(result, plainString);
21
- console.log('✓ single: returns original string when no url() pattern found');
22
- }
23
- function testHandlesEmptyString() {
24
- const result = (0, index_1.toDataUrl)('');
25
- node_assert_1.default.strictEqual(result, '');
26
- console.log('✓ single: handles empty string gracefully');
27
- }
28
- function testExtractsFromMinimalUrlPattern() {
29
- const minimal = "url('https://example.com/icon.png'), auto";
30
- const result = (0, index_1.toDataUrl)(minimal);
31
- node_assert_1.default.strictEqual(result, 'https://example.com/icon.png');
32
- console.log('✓ single: extracts URL from minimal url() pattern');
33
- }
34
- function testDoesNotMatchDoubleQuotedUrls() {
35
- const doubleQuoted = 'url("data:image/png;base64,abc123"), auto';
36
- const result = (0, index_1.toDataUrl)(doubleQuoted);
37
- node_assert_1.default.strictEqual(result, doubleQuoted);
38
- console.log('✓ single: does not match double-quoted url() (single-quote only)');
39
- }
40
- // ── Batch mode ─────────────────────────────────────────────────────
41
- function testBatchExtractsMultipleIcons() {
42
- const secondCursor = "url('data:image/png;base64,AAAA'), auto";
43
- const result = (0, index_1.toDataUrl)({
44
- first: VALID_CURSOR,
45
- second: secondCursor,
46
- });
47
- node_assert_1.default.deepStrictEqual(result, {
48
- first: EXPECTED_DATA_URL,
49
- second: 'data:image/png;base64,AAAA',
50
- });
51
- console.log('✓ batch: extracts data URLs from multiple icons');
52
- }
53
- function testBatchHandlesMixedValues() {
54
- const result = (0, index_1.toDataUrl)({
55
- valid: VALID_CURSOR,
56
- invalid: 'not-a-cursor',
57
- });
58
- node_assert_1.default.deepStrictEqual(result, {
59
- valid: EXPECTED_DATA_URL,
60
- invalid: 'not-a-cursor',
61
- });
62
- console.log('✓ batch: handles mixed valid and invalid values');
63
- }
64
- function testBatchHandlesEmptyObject() {
65
- const result = (0, index_1.toDataUrl)({});
66
- node_assert_1.default.deepStrictEqual(result, {});
67
- console.log('✓ batch: handles empty object');
68
- }
69
- // ── iconNames & IconName ───────────────────────────────────────────
70
- function testIconNamesIsNonEmptyArray() {
71
- node_assert_1.default.ok(Array.isArray(meta_1.iconNames), 'iconNames should be an array');
72
- node_assert_1.default.ok(meta_1.iconNames.length > 0, 'iconNames should not be empty');
73
- console.log(`✓ iconNames: is a non-empty array (${meta_1.iconNames.length} entries)`);
74
- }
75
- function testIconNamesContainsKnownIcons() {
76
- const knownIcons = ['abyssalWhip', '_24CaratSword', 'dragonScimitar'];
77
- for (const name of knownIcons) {
78
- node_assert_1.default.ok(meta_1.iconNames.includes(name), `iconNames should contain "${name}"`);
79
- }
80
- console.log('✓ iconNames: contains known icon names');
81
- }
82
- function testIconNamesEntriesAreStrings() {
83
- const sample = meta_1.iconNames.slice(0, 100);
84
- for (const name of sample) {
85
- node_assert_1.default.strictEqual(typeof name, 'string', `Expected string, got ${typeof name}`);
86
- node_assert_1.default.ok(name.length > 0, 'Icon name should not be empty');
87
- }
88
- console.log('✓ iconNames: all sampled entries are non-empty strings');
89
- }
90
- function testIconNamesIsSorted() {
91
- for (let i = 1; i < meta_1.iconNames.length; i++) {
92
- node_assert_1.default.ok(meta_1.iconNames[i] >= meta_1.iconNames[i - 1], `iconNames[${i}] ("${meta_1.iconNames[i]}") should come after iconNames[${i - 1}] ("${meta_1.iconNames[i - 1]}")`);
93
- }
94
- console.log('✓ iconNames: is sorted alphabetically');
95
- }
96
- // ── Runner ─────────────────────────────────────────────────────────
97
- console.log('\nRunning toDataUrl tests...\n');
98
- testExtractsDataUrlFromValidCursorValue();
99
- testReturnsOriginalStringWhenNoUrlPatternFound();
100
- testHandlesEmptyString();
101
- testExtractsFromMinimalUrlPattern();
102
- testDoesNotMatchDoubleQuotedUrls();
103
- testBatchExtractsMultipleIcons();
104
- testBatchHandlesMixedValues();
105
- testBatchHandlesEmptyObject();
106
- testIconNamesIsNonEmptyArray();
107
- testIconNamesContainsKnownIcons();
108
- testIconNamesEntriesAreStrings();
109
- testIconNamesIsSorted();
110
- console.log('\nAll tests passed!\n');
@@ -1 +0,0 @@
1
- export {};