@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"}
@@ -2,6 +2,20 @@
2
2
  // Auto-generated OSRS Icon metadata
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
4
  exports.iconNames = void 0;
5
+ /**
6
+ * Alphabetically sorted array of every available OSRS icon export name.
7
+ *
8
+ * Use this list for search/autocomplete UIs, icon pickers, or validation.
9
+ * Each entry corresponds to a named export from `@dava96/osrs-icons`.
10
+ *
11
+ * @example
12
+ * ```ts
13
+ * import { iconNames } from '@dava96/osrs-icons';
14
+ *
15
+ * console.log(iconNames.length); // 17,000+
16
+ * const matches = iconNames.filter(n => n.includes('dragon'));
17
+ * ```
18
+ */
5
19
  exports.iconNames = [
6
20
  '_10thBirthdayBalloons',
7
21
  '_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/cjs/index.js CHANGED
@@ -14,17 +14,36 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.errorCursor = void 0;
17
18
  exports.toDataUrl = toDataUrl;
18
19
  __exportStar(require("./generated/icons"), exports);
19
20
  __exportStar(require("./generated/meta"), exports);
21
+ __exportStar(require("./packs"), exports);
22
+ __exportStar(require("./flip"), exports);
23
+ __exportStar(require("./applyCursors"), exports);
24
+ __exportStar(require("./animateCursor"), exports);
25
+ /**
26
+ * A fun easter-egg cursor for error states — the OSRS Red Herring icon.
27
+ *
28
+ * @example
29
+ * ```ts
30
+ * import { errorCursor } from '@dava96/osrs-icons';
31
+ *
32
+ * document.body.style.cursor = errorCursor;
33
+ * ```
34
+ */
35
+ var icons_1 = require("./generated/icons");
36
+ Object.defineProperty(exports, "errorCursor", { enumerable: true, get: function () { return icons_1.redHerring; } });
20
37
  function toDataUrl(input) {
21
38
  if (typeof input === 'string') {
22
39
  return extractUrl(input);
23
40
  }
24
41
  return Object.fromEntries(Object.entries(input).map(([key, value]) => [key, extractUrl(value)]));
25
42
  }
43
+ /** Matches `url('...')` in a CSS cursor value. Precompiled for use in loops. */
44
+ const CURSOR_URL_REGEX = /url\('(.*)'\)/;
26
45
  /** Extracts the URL from a single `url('...')` CSS value. */
27
46
  function extractUrl(cursorValue) {
28
- const match = cursorValue.match(/url\('(.*)'\)/);
47
+ const match = cursorValue.match(CURSOR_URL_REGEX);
29
48
  return match ? match[1] : cursorValue;
30
49
  }
@@ -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,192 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.allPacks = exports.runePack = exports.bucketPack = exports.coinsPack = void 0;
4
+ const icons_1 = require("./generated/icons");
5
+ /**
6
+ * A cursor pack groups related OSRS icons by their in-game state.
7
+ *
8
+ * Each key is a semantic label and each value is the corresponding
9
+ * CSS cursor string, ready to apply to any element's `cursor` property.
10
+ *
11
+ * **Want to add a new pack?** See the
12
+ * {@link https://github.com/Dava96/osrs-icons/blob/main/CONTRIBUTING.md | Contributing Guide}
13
+ * for instructions on assembling and submitting your own cursor packs.
14
+ *
15
+ * @example
16
+ * ```ts
17
+ * import { coinsPack, animateCursor } from '@dava96/osrs-icons';
18
+ *
19
+ * // Animate the coin stack growing
20
+ * const stop = animateCursor(coinsPack.stages, { duration: 1200 });
21
+ * ```
22
+ */
23
+ // ── Progression Packs ──────────────────────────────────────────────
24
+ /**
25
+ * Coins cursor pack — represents increasing wealth from 1gp to 10,000gp.
26
+ *
27
+ * In OSRS, the coin stack sprite changes based on the amount.
28
+ * Great for progress indicators, score displays, or loading states.
29
+ *
30
+ * @example
31
+ * ```ts
32
+ * import { coinsPack } from '@dava96/osrs-icons';
33
+ *
34
+ * // Map a 0–100 progress value to a coin stack
35
+ * const stages = coinsPack.stages;
36
+ * const index = Math.min(Math.floor(progress / 100 * stages.length), stages.length - 1);
37
+ * element.style.cursor = stages[index];
38
+ * ```
39
+ */
40
+ exports.coinsPack = {
41
+ _1: icons_1.coins1,
42
+ _2: icons_1.coins2,
43
+ _3: icons_1.coins3,
44
+ _4: icons_1.coins4,
45
+ _5: icons_1.coins5,
46
+ _25: icons_1.coins25,
47
+ _100: icons_1.coins100,
48
+ _250: icons_1.coins250,
49
+ _1000: icons_1.coins1000,
50
+ _10000: icons_1.coins10000,
51
+ /** Ordered array of all coin stages, from 1gp to 10,000gp. */
52
+ stages: [
53
+ icons_1.coins1,
54
+ icons_1.coins2,
55
+ icons_1.coins3,
56
+ icons_1.coins4,
57
+ icons_1.coins5,
58
+ icons_1.coins25,
59
+ icons_1.coins100,
60
+ icons_1.coins250,
61
+ icons_1.coins1000,
62
+ icons_1.coins10000,
63
+ ],
64
+ };
65
+ /**
66
+ * Bucket cursor pack — represents a filling progression from empty to full.
67
+ *
68
+ * Perfect for loading indicators, progress bars, or upload states.
69
+ * The `stages` array orders them from empty → full for easy indexing.
70
+ *
71
+ * @example
72
+ * ```ts
73
+ * import { bucketPack } from '@dava96/osrs-icons';
74
+ *
75
+ * // Map a 0–100 progress value to a bucket fill state
76
+ * const stages = bucketPack.stages;
77
+ * const index = Math.min(Math.floor(progress / 100 * stages.length), stages.length - 1);
78
+ * element.style.cursor = stages[index];
79
+ * ```
80
+ */
81
+ exports.bucketPack = {
82
+ empty: icons_1.bucket,
83
+ fifth: icons_1._15thsFullBucket,
84
+ twoFifths: icons_1._25thsFullBucket,
85
+ threeFifths: icons_1._35thsFullBucket,
86
+ fourFifths: icons_1._45thsFullBucket,
87
+ full: icons_1.bucketOfWater,
88
+ /** Ordered array of all bucket stages, from empty to full. */
89
+ stages: [
90
+ icons_1.bucket,
91
+ icons_1._15thsFullBucket,
92
+ icons_1._25thsFullBucket,
93
+ icons_1._35thsFullBucket,
94
+ icons_1._45thsFullBucket,
95
+ icons_1.bucketOfWater,
96
+ ],
97
+ };
98
+ // ── Collection Packs ───────────────────────────────────────────────
99
+ /**
100
+ * Free-to-Play Rune cursor pack — the 10 runes available to F2P players.
101
+ *
102
+ * Ordered by the four elemental runes, then combat/utility runes.
103
+ * Great for magic-themed UIs, tooltips, or decorative hover effects.
104
+ *
105
+ * @example
106
+ * ```ts
107
+ * import { runePack } from '@dava96/osrs-icons';
108
+ *
109
+ * // Pick a random rune cursor
110
+ * const randomIndex = Math.floor(Math.random() * runePack.stages.length);
111
+ * element.style.cursor = runePack.stages[randomIndex];
112
+ * ```
113
+ */
114
+ exports.runePack = {
115
+ air: icons_1.airRune,
116
+ fire: icons_1.fireRune,
117
+ water: icons_1.waterRune,
118
+ earth: icons_1.earthRune,
119
+ chaos: icons_1.chaosRune,
120
+ mind: icons_1.mindRune,
121
+ death: icons_1.deathRune,
122
+ law: icons_1.lawRune,
123
+ nature: icons_1.natureRune,
124
+ body: icons_1.bodyRune,
125
+ /** Ordered array of all F2P runes: elementals first, then combat/utility. */
126
+ stages: [
127
+ icons_1.airRune,
128
+ icons_1.fireRune,
129
+ icons_1.waterRune,
130
+ icons_1.earthRune,
131
+ icons_1.chaosRune,
132
+ icons_1.mindRune,
133
+ icons_1.deathRune,
134
+ icons_1.lawRune,
135
+ icons_1.natureRune,
136
+ icons_1.bodyRune,
137
+ ],
138
+ };
139
+ // ── Pack Registry ──────────────────────────────────────────────────
140
+ /**
141
+ * Registry of all available cursor packs.
142
+ *
143
+ * The documentation site reads this array to automatically render
144
+ * every pack. To add a new pack to the site, simply push your
145
+ * {@link PackInfo} entry here — no site code changes needed.
146
+ *
147
+ * @example
148
+ * ```ts
149
+ * import { allPacks } from '@dava96/osrs-icons';
150
+ *
151
+ * allPacks.forEach(pack => {
152
+ * console.log(`${pack.name}: ${pack.stages.length} stages`);
153
+ * });
154
+ * ```
155
+ */
156
+ exports.allPacks = [
157
+ {
158
+ name: 'Coins',
159
+ icon: icons_1.coins10000,
160
+ importName: 'coinsPack',
161
+ description: 'Stack grows from 1gp to 10,000gp — great for progress or score displays',
162
+ stageLabels: ['1', '2', '3', '4', '5', '25', '100', '250', '1K', '10K'],
163
+ stages: exports.coinsPack.stages,
164
+ },
165
+ {
166
+ name: 'Bucket',
167
+ icon: icons_1.bucket,
168
+ importName: 'bucketPack',
169
+ description: 'Empty → Full — perfect for loading indicators or upload progress',
170
+ stageLabels: ['Empty', '1/5', '2/5', '3/5', '4/5', 'Full'],
171
+ stages: exports.bucketPack.stages,
172
+ },
173
+ {
174
+ name: 'F2P Runes',
175
+ icon: icons_1.airRune,
176
+ importName: 'runePack',
177
+ description: 'All 10 free-to-play runes — perfect for magic-themed UIs or hover effects',
178
+ stageLabels: [
179
+ 'Air',
180
+ 'Fire',
181
+ 'Water',
182
+ 'Earth',
183
+ 'Chaos',
184
+ 'Mind',
185
+ 'Death',
186
+ 'Law',
187
+ 'Nature',
188
+ 'Body',
189
+ ],
190
+ stages: exports.runePack.stages,
191
+ },
192
+ ];
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Options for {@link animateCursor}.
3
+ */
4
+ export interface AnimateCursorOptions {
5
+ /**
6
+ * Total duration of one full animation cycle in milliseconds.
7
+ * Each frame occupies `duration / frames.length` of the cycle.
8
+ *
9
+ * @default 1000
10
+ */
11
+ duration?: number;
12
+ /**
13
+ * Element to scope the animated cursor to.
14
+ * When omitted the cursor animates on the entire page (`*`).
15
+ */
16
+ target?: HTMLElement;
17
+ /**
18
+ * How many times the cycle should repeat.
19
+ * Use `Infinity` (the default) for a continuous loop.
20
+ *
21
+ * @default Infinity
22
+ */
23
+ iterations?: number;
24
+ }
25
+ /**
26
+ * Animates a cursor by cycling through an ordered array of OSRS icon
27
+ * strings using a pure‑CSS `@keyframes` rule.
28
+ *
29
+ * Each frame is assigned an equal slice of the total `duration` and
30
+ * transitions are **discrete** (`step-end`), producing a clean
31
+ * frame‑by‑frame sprite animation — no JavaScript timers required.
32
+ *
33
+ * **Browser‑only** — in non‑browser environments (Node / SSR) this
34
+ * is a no‑op that returns an empty cleanup function.
35
+ *
36
+ * @param frames - An ordered array of CSS cursor strings (≥ 2).
37
+ * @param options - Optional configuration for duration, target, and iterations.
38
+ * @returns A cleanup function that removes the injected styles and
39
+ * stops the animation.
40
+ *
41
+ * @throws {Error} If fewer than 2 frames are provided.
42
+ *
43
+ * @example
44
+ * ```ts
45
+ * import {
46
+ * coins1, coins2, coins3, coins4, coins5,
47
+ * animateCursor,
48
+ * } from '@dava96/osrs-icons';
49
+ *
50
+ * // Animate a growing coin stack on the whole page
51
+ * const stop = animateCursor(
52
+ * [coins1, coins2, coins3, coins4, coins5],
53
+ * { duration: 1200 },
54
+ * );
55
+ *
56
+ * // Later, stop the animation and clean up
57
+ * stop();
58
+ * ```
59
+ *
60
+ * @example
61
+ * ```ts
62
+ * import { lobsterRaw, lobsterCooked, lobsterBurnt, animateCursor } from '@dava96/osrs-icons';
63
+ *
64
+ * // Scope to a specific element, play 3 times
65
+ * const stop = animateCursor(
66
+ * [lobsterRaw, lobsterCooked, lobsterBurnt],
67
+ * { duration: 900, target: document.getElementById('cooking')!, iterations: 3 },
68
+ * );
69
+ * ```
70
+ */
71
+ export declare function animateCursor(frames: string[], options?: AnimateCursorOptions): () => void;
72
+ //# sourceMappingURL=animateCursor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"animateCursor.d.ts","sourceRoot":"","sources":["../../src/animateCursor.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;;OAGG;IACH,MAAM,CAAC,EAAE,WAAW,CAAC;IAErB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,OAAO,GAAE,oBAAyB,GAAG,MAAM,IAAI,CAiD9F"}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * Animates a cursor by cycling through an ordered array of OSRS icon
3
+ * strings using a pure‑CSS `@keyframes` rule.
4
+ *
5
+ * Each frame is assigned an equal slice of the total `duration` and
6
+ * transitions are **discrete** (`step-end`), producing a clean
7
+ * frame‑by‑frame sprite animation — no JavaScript timers required.
8
+ *
9
+ * **Browser‑only** — in non‑browser environments (Node / SSR) this
10
+ * is a no‑op that returns an empty cleanup function.
11
+ *
12
+ * @param frames - An ordered array of CSS cursor strings (≥ 2).
13
+ * @param options - Optional configuration for duration, target, and iterations.
14
+ * @returns A cleanup function that removes the injected styles and
15
+ * stops the animation.
16
+ *
17
+ * @throws {Error} If fewer than 2 frames are provided.
18
+ *
19
+ * @example
20
+ * ```ts
21
+ * import {
22
+ * coins1, coins2, coins3, coins4, coins5,
23
+ * animateCursor,
24
+ * } from '@dava96/osrs-icons';
25
+ *
26
+ * // Animate a growing coin stack on the whole page
27
+ * const stop = animateCursor(
28
+ * [coins1, coins2, coins3, coins4, coins5],
29
+ * { duration: 1200 },
30
+ * );
31
+ *
32
+ * // Later, stop the animation and clean up
33
+ * stop();
34
+ * ```
35
+ *
36
+ * @example
37
+ * ```ts
38
+ * import { lobsterRaw, lobsterCooked, lobsterBurnt, animateCursor } from '@dava96/osrs-icons';
39
+ *
40
+ * // Scope to a specific element, play 3 times
41
+ * const stop = animateCursor(
42
+ * [lobsterRaw, lobsterCooked, lobsterBurnt],
43
+ * { duration: 900, target: document.getElementById('cooking')!, iterations: 3 },
44
+ * );
45
+ * ```
46
+ */
47
+ export function animateCursor(frames, options = {}) {
48
+ if (frames.length < 2) {
49
+ throw new Error(`animateCursor requires at least 2 frames, received ${frames.length}.`);
50
+ }
51
+ if (typeof document === 'undefined') {
52
+ return () => { };
53
+ }
54
+ const { duration = 1000, target, iterations = Infinity } = options;
55
+ const animationName = generateAnimationName();
56
+ const scopeId = `${animationName}-scope`;
57
+ const selector = target ? `[data-osrs-anim-id="${scopeId}"]` : '*';
58
+ if (target) {
59
+ target.setAttribute('data-osrs-anim-id', scopeId);
60
+ }
61
+ const keyframeSteps = frames
62
+ .map((cursorValue, index) => {
63
+ const percentage = ((index / frames.length) * 100).toFixed(2);
64
+ return ` ${percentage}% { cursor: ${cursorValue}; }`;
65
+ })
66
+ .join('\n');
67
+ const iterationCount = iterations === Infinity ? 'infinite' : String(iterations);
68
+ const css = [
69
+ `@keyframes ${animationName} {`,
70
+ keyframeSteps,
71
+ '}',
72
+ `${selector} {`,
73
+ ` animation: ${animationName} ${duration}ms step-end ${iterationCount};`,
74
+ '}',
75
+ ].join('\n');
76
+ const styleElement = document.createElement('style');
77
+ styleElement.textContent = css;
78
+ styleElement.setAttribute('data-osrs-animate', 'true');
79
+ document.head.appendChild(styleElement);
80
+ return () => {
81
+ styleElement.remove();
82
+ if (target) {
83
+ target.removeAttribute('data-osrs-anim-id');
84
+ }
85
+ };
86
+ }
87
+ /** Generates a short unique ID for animation scoping. */
88
+ let animCounter = 0;
89
+ function generateAnimationName() {
90
+ return `osrs-anim-${++animCounter}-${Date.now().toString(36)}`;
91
+ }