@vmz/ui-icons 0.3.12 → 0.3.13

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 (57) hide show
  1. package/README.md +22 -3
  2. package/dist/icons/action.d.ts +7 -0
  3. package/dist/icons/action.js +203 -0
  4. package/dist/icons/brand.d.ts +7 -0
  5. package/dist/icons/brand.js +11 -0
  6. package/dist/icons/commerce.d.ts +7 -0
  7. package/dist/icons/commerce.js +36 -0
  8. package/dist/icons/data.d.ts +3 -0
  9. package/dist/icons/data.js +23 -0
  10. package/dist/icons/develop.d.ts +3 -0
  11. package/dist/icons/develop.js +25 -0
  12. package/dist/icons/device.d.ts +3 -0
  13. package/dist/icons/device.js +46 -0
  14. package/dist/icons/editor.d.ts +6 -0
  15. package/dist/icons/editor.js +59 -0
  16. package/dist/icons/feature.d.ts +3 -0
  17. package/dist/icons/feature.js +15 -0
  18. package/dist/icons/file.d.ts +6 -0
  19. package/dist/icons/file.js +36 -0
  20. package/dist/icons/git.d.ts +3 -0
  21. package/dist/icons/git.js +52 -0
  22. package/dist/icons/media.d.ts +3 -0
  23. package/dist/icons/media.js +89 -0
  24. package/dist/icons/navigation.d.ts +3 -0
  25. package/dist/icons/navigation.js +25 -0
  26. package/dist/icons/social.d.ts +8 -0
  27. package/dist/icons/social.js +52 -0
  28. package/dist/icons/status.d.ts +3 -0
  29. package/dist/icons/status.js +45 -0
  30. package/dist/icons/tool.d.ts +7 -0
  31. package/dist/icons/tool.js +102 -0
  32. package/dist/registry.d.ts +4 -0
  33. package/dist/registry.js +35 -5
  34. package/package.json +2 -2
  35. package/src/Icon.vmz +4 -4
  36. package/src/icons/action.ts +205 -0
  37. package/src/icons/brand.ts +13 -0
  38. package/src/icons/commerce.ts +38 -0
  39. package/src/icons/data.ts +25 -0
  40. package/src/icons/develop.ts +27 -0
  41. package/src/icons/device.ts +48 -0
  42. package/src/icons/editor.ts +61 -0
  43. package/src/icons/feature.ts +17 -0
  44. package/src/icons/file.ts +38 -0
  45. package/src/icons/git.ts +54 -0
  46. package/src/icons/media.ts +91 -0
  47. package/src/icons/navigation.ts +27 -0
  48. package/src/icons/social.ts +54 -0
  49. package/src/icons/status.ts +47 -0
  50. package/src/icons/tool.ts +104 -0
  51. package/src/registry.ts +35 -6
  52. package/dist/icons-stroke.d.ts +0 -3
  53. package/dist/icons-stroke.js +0 -258
  54. package/dist/icons-text-badge.d.ts +0 -3
  55. package/dist/icons-text-badge.js +0 -15
  56. package/src/icons-stroke.ts +0 -260
  57. package/src/icons-text-badge.ts +0 -17
@@ -0,0 +1,89 @@
1
+ /** Media glyphs (`media.*`) — playback transport, capture devices and audio state. */
2
+ export const MEDIA_ICONS = {
3
+ 'media.play': {
4
+ kind: 'stroke',
5
+ paths: ['M8.77 6.04L17.65 11.47Q18.5 12 17.65 12.53L8.77 17.96Q8 18.5 8 17.6V6.4Q8 5.5 8.77 6.04Z'],
6
+ },
7
+ 'media.pause': {
8
+ kind: 'stroke',
9
+ paths: ['M8.5 5V19', 'M15.5 5V19'],
10
+ },
11
+ 'media.stop': {
12
+ kind: 'stroke',
13
+ paths: ['M7 7H17V17H7Z'],
14
+ },
15
+ 'media.next': {
16
+ kind: 'stroke',
17
+ paths: ['M7.06 6.42L13.78 11.4Q14.5 12 13.78 12.6L7.06 17.58Q6.5 18 6.5 17.3V6.7Q6.5 6 7.06 6.42Z', 'M17.5 6V18'],
18
+ },
19
+ 'media.previous': {
20
+ kind: 'stroke',
21
+ paths: ['M16.94 6.42L10.22 11.4Q9.5 12 10.22 12.6L16.94 17.58Q17.5 18 17.5 17.3V6.7Q17.5 6 16.94 6.42Z', 'M6.5 6V18'],
22
+ },
23
+ 'media.seek-back': {
24
+ kind: 'stroke',
25
+ paths: ['M10.5 6.5L4 12L10.5 17.5V6.5Z', 'M19.5 6.5L13 12L19.5 17.5V6.5Z'],
26
+ },
27
+ 'media.seek-forward': {
28
+ kind: 'stroke',
29
+ paths: ['M4.5 6.5L11 12L4.5 17.5V6.5Z', 'M13.5 6.5L20 12L13.5 17.5V6.5Z'],
30
+ },
31
+ 'media.fullscreen': {
32
+ kind: 'stroke',
33
+ paths: ['M4 9V4H9', 'M15 4H20V9', 'M20 15V20H15', 'M9 20H4V15'],
34
+ },
35
+ 'media.fullscreen-exit': {
36
+ kind: 'stroke',
37
+ paths: ['M8 3V10H3', 'M16 3V10H21', 'M16 21V14H21', 'M8 21V14H3'],
38
+ },
39
+ 'media.pip': {
40
+ kind: 'stroke',
41
+ paths: ['M3 6H21V18H3Z', 'M13 12H18V16H13Z'],
42
+ },
43
+ 'media.subtitle': {
44
+ kind: 'stroke',
45
+ paths: ['M3 6H21V18H3Z', 'M6 12H14', 'M6 15H11'],
46
+ },
47
+ 'media.cast': {
48
+ kind: 'stroke',
49
+ paths: ['M4 8V5H20V19H14', 'M4 12A8 8 0 0 1 12 19', 'M4 15.5A4 4 0 0 1 7.5 19'],
50
+ },
51
+ 'media.repeat': {
52
+ kind: 'stroke',
53
+ paths: ['M17 4L20 7L17 10', 'M4 11V9C4 7.6 5.1 7 6.5 7H20', 'M7 20L4 17L7 14', 'M20 13V15C20 16.4 19 17 17.5 17H4'],
54
+ },
55
+ 'media.shuffle': {
56
+ kind: 'stroke',
57
+ paths: ['M3 7H6L18 17H21', 'M3 17H6L8 15', 'M16 9L18 7H21', 'M18 4L21 7L18 10', 'M18 14L21 17L18 20'],
58
+ },
59
+ 'media.audio-track': {
60
+ kind: 'stroke',
61
+ circles: [
62
+ { cx: 6.5, cy: 18, r: 2.5 },
63
+ { cx: 18.5, cy: 16, r: 2.5 },
64
+ ],
65
+ paths: ['M9 18V5.5L21 3.5V16'],
66
+ },
67
+ 'media.volume': {
68
+ kind: 'stroke',
69
+ paths: ['M11 5L6 9H3V15H6L11 19V5Z', 'M15.5 8.5A5 5 0 0 1 15.5 15.5', 'M18.5 5.5A10 10 0 0 1 18.5 18.5'],
70
+ },
71
+ 'media.volume-muted': {
72
+ kind: 'stroke',
73
+ paths: ['M11 5L6 9H3V15H6L11 19V5Z', 'M16 9.5L21 14.5', 'M21 9.5L16 14.5'],
74
+ },
75
+ 'media.microphone': {
76
+ kind: 'stroke',
77
+ paths: ['M9 4A3 3 0 0 1 15 4V11A3 3 0 0 1 9 11V4Z', 'M6 11A6 6 0 0 0 18 11', 'M12 17V20', 'M9 20H15'],
78
+ },
79
+ 'media.camera': {
80
+ kind: 'stroke',
81
+ paths: ['M4 8H7L9 5.5H15L17 8H20V18H4Z'],
82
+ circles: [{ cx: 12, cy: 12.5, r: 3 }],
83
+ },
84
+ 'media.image': {
85
+ kind: 'stroke',
86
+ paths: ['M4 5H20V19H4Z', 'M4 16L9.5 10.5L13 14L16 11L20 15'],
87
+ circles: [{ cx: 15.5, cy: 8.5, r: 1.5 }],
88
+ },
89
+ };
@@ -0,0 +1,3 @@
1
+ import type { IconDef } from '../icon-types.ts';
2
+ /** Navigation glyphs (`nav.*`) — wayfinding landmarks such as home and locale. */
3
+ export declare const NAVIGATION_ICONS: Record<string, IconDef>;
@@ -0,0 +1,25 @@
1
+ /** Navigation glyphs (`nav.*`) — wayfinding landmarks such as home and locale. */
2
+ export const NAVIGATION_ICONS = {
3
+ 'nav.home': {
4
+ kind: 'stroke',
5
+ paths: ['M4 10.5L12 4L20 10.5', 'M6 10V19H18V10', 'M10 19V13H14V19'],
6
+ },
7
+ 'nav.language': {
8
+ kind: 'stroke',
9
+ circles: [{ cx: 12, cy: 12, r: 9 }],
10
+ paths: ['M3 12H21', 'M12 3C14.4 5.6 15.4 8.7 15.4 12C15.4 15.3 14.4 18.4 12 21C9.6 18.4 8.6 15.3 8.6 12C8.6 8.7 9.6 5.6 12 3Z'],
11
+ },
12
+ 'nav.anchor': {
13
+ kind: 'stroke',
14
+ paths: ['M9.5 4L7.5 20', 'M16.5 4L14.5 20', 'M4.5 9H19.5', 'M4 15H19'],
15
+ },
16
+ 'nav.bookmark': {
17
+ kind: 'stroke',
18
+ paths: ['M6 3.5H18V20.5L12 16L6 20.5V3.5Z'],
19
+ },
20
+ 'nav.compass': {
21
+ kind: 'stroke',
22
+ circles: [{ cx: 12, cy: 12, r: 9 }],
23
+ paths: ['M15.17 9.34L13.5 13.5L8.83 14.67Q8.5 15.5 9.34 15.17L10.5 10.5L14.67 8.83Q15.5 8.5 15.17 9.34Z'],
24
+ },
25
+ };
@@ -0,0 +1,8 @@
1
+ import type { IconDef } from '../icon-types.ts';
2
+ /**
3
+ * Social platform glyphs (`social.*`) — brand silhouettes use the `fill` kind because
4
+ * brand marks are silhouette language, not outline strokes. Geometry follows the official
5
+ * paths published by Simple Icons (https://simpleicons.org), licensed CC0-1.0; trademarks
6
+ * remain the property of their respective owners. Marks are rendered in `currentColor`.
7
+ */
8
+ export declare const SOCIAL_ICONS: Record<string, IconDef>;
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Social platform glyphs (`social.*`) — brand silhouettes use the `fill` kind because
3
+ * brand marks are silhouette language, not outline strokes. Geometry follows the official
4
+ * paths published by Simple Icons (https://simpleicons.org), licensed CC0-1.0; trademarks
5
+ * remain the property of their respective owners. Marks are rendered in `currentColor`.
6
+ */
7
+ export const SOCIAL_ICONS = {
8
+ 'social.github': {
9
+ kind: 'fill',
10
+ d: 'M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12',
11
+ },
12
+ 'social.x': {
13
+ kind: 'fill',
14
+ d: 'M14.234 10.162 22.977 0h-2.072l-7.591 8.824L7.251 0H.258l9.168 13.343L.258 24H2.33l8.016-9.318L16.749 24h6.993zm-2.837 3.299-.929-1.329L3.076 1.56h3.182l5.965 8.532.929 1.329 7.754 11.09h-3.182z',
15
+ },
16
+ 'social.linkedin': {
17
+ kind: 'fill',
18
+ d: 'M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z',
19
+ },
20
+ 'social.discord': {
21
+ kind: 'fill',
22
+ d: 'M20.317 4.3698a19.7913 19.7913 0 00-4.8851-1.5152.0741.0741 0 00-.0785.0371c-.211.3753-.4447.8648-.6083 1.2495-1.8447-.2762-3.68-.2762-5.4868 0-.1636-.3933-.4058-.8742-.6177-1.2495a.077.077 0 00-.0785-.037 19.7363 19.7363 0 00-4.8852 1.515.0699.0699 0 00-.0321.0277C.5334 9.0458-.319 13.5799.0992 18.0578a.0824.0824 0 00.0312.0561c2.0528 1.5076 4.0413 2.4228 5.9929 3.0294a.0777.0777 0 00.0842-.0276c.4616-.6304.8731-1.2952 1.226-1.9942a.076.076 0 00-.0416-.1057c-.6528-.2476-1.2743-.5495-1.8722-.8923a.077.077 0 01-.0076-.1277c.1258-.0943.2517-.1923.3718-.2914a.0743.0743 0 01.0776-.0105c3.9278 1.7933 8.18 1.7933 12.0614 0a.0739.0739 0 01.0785.0095c.1202.099.246.1981.3728.2924a.077.077 0 01-.0066.1276 12.2986 12.2986 0 01-1.873.8914.0766.0766 0 00-.0407.1067c.3604.698.7719 1.3628 1.225 1.9932a.076.076 0 00.0842.0286c1.961-.6067 3.9495-1.5219 6.0023-3.0294a.077.077 0 00.0313-.0552c.5004-5.177-.8382-9.6739-3.5485-13.6604a.061.061 0 00-.0312-.0286zM8.02 15.3312c-1.1825 0-2.1569-1.0857-2.1569-2.419 0-1.3332.9555-2.4189 2.157-2.4189 1.2108 0 2.1757 1.0952 2.1568 2.419 0 1.3332-.9555 2.4189-2.1569 2.4189zm7.9748 0c-1.1825 0-2.1569-1.0857-2.1569-2.419 0-1.3332.9554-2.4189 2.1569-2.4189 1.2108 0 2.1757 1.0952 2.1568 2.419 0 1.3332-.946 2.4189-2.1568 2.4189Z',
23
+ },
24
+ 'social.youtube': {
25
+ kind: 'fill',
26
+ d: 'M23.498 6.186a3.016 3.016 0 0 0-2.122-2.136C19.505 3.545 12 3.545 12 3.545s-7.505 0-9.377.505A3.017 3.017 0 0 0 .502 6.186C0 8.07 0 12 0 12s0 3.93.502 5.814a3.016 3.016 0 0 0 2.122 2.136c1.871.505 9.376.505 9.376.505s7.505 0 9.377-.505a3.015 3.015 0 0 0 2.122-2.136C24 15.93 24 12 24 12s0-3.93-.502-5.814zM9.545 15.568V8.432L15.818 12l-6.273 3.568z',
27
+ },
28
+ 'social.bluesky': {
29
+ kind: 'fill',
30
+ d: 'M5.202 2.857C7.954 4.922 10.913 9.11 12 11.358c1.087-2.247 4.046-6.436 6.798-8.501C20.783 1.366 24 .213 24 3.883c0 .732-.42 6.156-.667 7.037-.856 3.061-3.978 3.842-6.755 3.37 4.854.826 6.089 3.562 3.422 6.299-5.065 5.196-7.28-1.304-7.847-2.97-.104-.305-.152-.448-.153-.327 0-.121-.05.022-.153.327-.568 1.666-2.782 8.166-7.847 2.97-2.667-2.737-1.432-5.473 3.422-6.3-2.777.473-5.899-.308-6.755-3.369C.42 10.04 0 4.615 0 3.883c0-3.67 3.217-2.517 5.202-1.026',
31
+ },
32
+ 'social.mastodon': {
33
+ kind: 'fill',
34
+ d: 'M23.268 5.313c-.35-2.578-2.617-4.61-5.304-5.004C17.51.242 15.792 0 11.813 0h-.03c-3.98 0-4.835.242-5.288.309C3.882.692 1.496 2.518.917 5.127.64 6.412.61 7.837.661 9.143c.074 1.874.088 3.745.26 5.611.118 1.24.325 2.47.62 3.68.55 2.237 2.777 4.098 4.96 4.857 2.336.792 4.849.923 7.256.38.265-.061.527-.132.786-.213.585-.184 1.27-.39 1.774-.753a.057.057 0 0 0 .023-.043v-1.809a.052.052 0 0 0-.02-.041.053.053 0 0 0-.046-.01 20.282 20.282 0 0 1-4.709.545c-2.73 0-3.463-1.284-3.674-1.818a5.593 5.593 0 0 1-.319-1.433.053.053 0 0 1 .066-.054c1.517.363 3.072.546 4.632.546.376 0 .75 0 1.125-.01 1.57-.044 3.224-.124 4.768-.422.038-.008.077-.015.11-.024 2.435-.464 4.753-1.92 4.989-5.604.008-.145.03-1.52.03-1.67.002-.512.167-3.63-.024-5.545zm-3.748 9.195h-2.561V8.29c0-1.309-.55-1.976-1.67-1.976-1.23 0-1.846.79-1.846 2.35v3.403h-2.546V8.663c0-1.56-.617-2.35-1.848-2.35-1.112 0-1.668.668-1.67 1.977v6.218H4.822V8.102c0-1.31.337-2.35 1.011-3.12.696-.77 1.608-1.164 2.74-1.164 1.311 0 2.302.5 2.962 1.498l.638 1.06.638-1.06c.66-.999 1.65-1.498 2.96-1.498 1.13 0 2.043.395 2.74 1.164.675.77 1.012 1.81 1.012 3.12z',
35
+ },
36
+ 'social.bilibili': {
37
+ kind: 'fill',
38
+ d: 'M17.813 4.653h.854c1.51.054 2.769.578 3.773 1.574 1.004.995 1.524 2.249 1.56 3.76v7.36c-.036 1.51-.556 2.769-1.56 3.773s-2.262 1.524-3.773 1.56H5.333c-1.51-.036-2.769-.556-3.773-1.56S.036 18.858 0 17.347v-7.36c.036-1.511.556-2.765 1.56-3.76 1.004-.996 2.262-1.52 3.773-1.574h.774l-1.174-1.12a1.234 1.234 0 0 1-.373-.906c0-.356.124-.658.373-.907l.027-.027c.267-.249.573-.373.92-.373.347 0 .653.124.92.373L9.653 4.44c.071.071.134.142.187.213h4.267a.836.836 0 0 1 .16-.213l2.853-2.747c.267-.249.573-.373.92-.373.347 0 .662.151.929.4.267.249.391.551.391.907 0 .355-.124.657-.373.906zM5.333 7.24c-.746.018-1.373.276-1.88.773-.506.498-.769 1.13-.786 1.894v7.52c.017.764.28 1.395.786 1.893.507.498 1.134.756 1.88.773h13.334c.746-.017 1.373-.275 1.88-.773.506-.498.769-1.129.786-1.893v-7.52c-.017-.765-.28-1.396-.786-1.894-.507-.497-1.134-.755-1.88-.773zM8 11.107c.373 0 .684.124.933.373.25.249.383.569.4.96v1.173c-.017.391-.15.711-.4.96-.249.25-.56.374-.933.374s-.684-.125-.933-.374c-.25-.249-.383-.569-.4-.96V12.44c0-.373.129-.689.386-.947.258-.257.574-.386.947-.386zm8 0c.373 0 .684.124.933.373.25.249.383.569.4.96v1.173c-.017.391-.15.711-.4.96-.249.25-.56.374-.933.374s-.684-.125-.933-.374c-.25-.249-.383-.569-.4-.96V12.44c.017-.391.15-.711.4-.96.249-.249.56-.373.933-.373Z',
39
+ },
40
+ 'social.wechat': {
41
+ kind: 'fill',
42
+ d: 'M8.691 2.188C3.891 2.188 0 5.476 0 9.53c0 2.212 1.17 4.203 3.002 5.55a.59.59 0 0 1 .213.665l-.39 1.48c-.019.07-.048.141-.048.213 0 .163.13.295.29.295a.326.326 0 0 0 .167-.054l1.903-1.114a.864.864 0 0 1 .717-.098 10.16 10.16 0 0 0 2.837.403c.276 0 .543-.027.811-.05-.857-2.578.157-4.972 1.932-6.446 1.703-1.415 3.882-1.98 5.853-1.838-.576-3.583-4.196-6.348-8.596-6.348zM5.785 5.991c.642 0 1.162.529 1.162 1.18a1.17 1.17 0 0 1-1.162 1.178A1.17 1.17 0 0 1 4.623 7.17c0-.651.52-1.18 1.162-1.18zm5.813 0c.642 0 1.162.529 1.162 1.18a1.17 1.17 0 0 1-1.162 1.178 1.17 1.17 0 0 1-1.162-1.178c0-.651.52-1.18 1.162-1.18zm5.34 2.867c-1.797-.052-3.746.512-5.28 1.786-1.72 1.428-2.687 3.72-1.78 6.22.942 2.453 3.666 4.229 6.884 4.229.826 0 1.622-.12 2.361-.336a.722.722 0 0 1 .598.082l1.584.926a.272.272 0 0 0 .14.047c.134 0 .24-.111.24-.247 0-.06-.023-.12-.038-.177l-.327-1.233a.582.582 0 0 1-.023-.156.49.49 0 0 1 .201-.398C23.024 18.48 24 16.82 24 14.98c0-3.21-2.931-5.837-6.656-6.088V8.89c-.135-.01-.27-.027-.407-.03zm-2.53 3.274c.535 0 .969.44.969.982a.976.976 0 0 1-.969.983.976.976 0 0 1-.969-.983c0-.542.434-.982.97-.982zm4.844 0c.535 0 .969.44.969.982a.976.976 0 0 1-.969.983.976.976 0 0 1-.969-.983c0-.542.434-.982.969-.982z',
43
+ },
44
+ 'social.zhihu': {
45
+ kind: 'fill',
46
+ d: 'M5.721 0C2.251 0 0 2.25 0 5.719V18.28C0 21.751 2.252 24 5.721 24h12.56C21.751 24 24 21.75 24 18.281V5.72C24 2.249 21.75 0 18.281 0zm1.964 4.078c-.271.73-.5 1.434-.68 2.11h4.587c.545-.006.445 1.168.445 1.171H9.384a58.104 58.104 0 01-.112 3.797h2.712c.388.023.393 1.251.393 1.266H9.183a9.223 9.223 0 01-.408 2.102l.757-.604c.452.456 1.512 1.712 1.906 2.177.473.681.063 2.081.063 2.081l-2.794-3.382c-.653 2.518-1.845 3.607-1.845 3.607-.523.468-1.58.82-2.64.516 2.218-1.73 3.44-3.917 3.667-6.497H4.491c0-.015.197-1.243.806-1.266h2.71c.024-.32.086-3.254.086-3.797H6.598c-.136.406-.158.447-.268.753-.594 1.095-1.603 1.122-1.907 1.155.906-1.821 1.416-3.6 1.591-4.064.425-1.124 1.671-1.125 1.671-1.125zM13.078 6h6.377v11.33h-2.573l-2.184 1.373-.401-1.373h-1.219zm1.313 1.219v8.86h.623l.263.937 1.455-.938h1.456v-8.86z',
47
+ },
48
+ 'social.rss': {
49
+ kind: 'fill',
50
+ d: 'M19.199 24C19.199 13.467 10.533 4.8 0 4.8V0c13.165 0 24 10.835 24 24h-4.801zM3.291 17.415c1.814 0 3.293 1.479 3.293 3.295 0 1.813-1.485 3.29-3.301 3.29C1.47 24 0 22.526 0 20.71s1.475-3.294 3.291-3.295zM15.909 24h-4.665c0-6.169-5.075-11.245-11.244-11.245V8.09c8.727 0 15.909 7.184 15.909 15.91z',
51
+ },
52
+ };
@@ -0,0 +1,3 @@
1
+ import type { IconDef } from '../icon-types.ts';
2
+ /** Status glyphs (`status.*`) — alert and outcome semantics, never color-only signals. */
3
+ export declare const STATUS_ICONS: Record<string, IconDef>;
@@ -0,0 +1,45 @@
1
+ /** Status glyphs (`status.*`) — alert and outcome semantics, never color-only signals. */
2
+ export const STATUS_ICONS = {
3
+ 'status.info': {
4
+ kind: 'stroke',
5
+ circles: [{ cx: 12, cy: 12, r: 9 }],
6
+ paths: ['M12 11V16'],
7
+ dots: [{ cx: 12, cy: 8, r: 1.5 }],
8
+ },
9
+ 'status.warning': {
10
+ kind: 'stroke',
11
+ paths: ['M12.5 5.1L19.5 18.9Q20 20 18.8 20H5.2Q4 20 4.5 18.9L11.5 5.1Q12 4 12.5 5.1Z', 'M12 9V13'],
12
+ dots: [{ cx: 12, cy: 16.5, r: 1.5 }],
13
+ },
14
+ 'status.success': {
15
+ kind: 'stroke',
16
+ circles: [{ cx: 12, cy: 12, r: 9 }],
17
+ paths: ['M7 12L10.5 15.5L17 9'],
18
+ },
19
+ 'status.danger': {
20
+ kind: 'stroke',
21
+ circles: [{ cx: 12, cy: 12, r: 9 }],
22
+ paths: ['M12 7.5V13.5'],
23
+ dots: [{ cx: 12, cy: 17, r: 1.5 }],
24
+ },
25
+ 'status.question': {
26
+ kind: 'stroke',
27
+ circles: [{ cx: 12, cy: 12, r: 9 }],
28
+ paths: ['M9.5 9.2A2.6 2.6 0 0 1 12 7.5C13.4 7.5 14.5 8.6 14.5 9.8C14.5 11 13.6 11.6 12.7 12.1C12.3 12.4 12 12.7 12 13.2V14'],
29
+ dots: [{ cx: 12, cy: 16.8, r: 1.5 }],
30
+ },
31
+ 'status.offline': {
32
+ kind: 'stroke',
33
+ paths: ['M3 9A13 13 0 0 1 21 9', 'M6.5 12.5A8.5 8.5 0 0 1 17.5 12.5', 'M4 20L20 4'],
34
+ dots: [{ cx: 12, cy: 16, r: 1.5 }],
35
+ },
36
+ 'status.spinner': {
37
+ kind: 'stroke',
38
+ paths: ['M20.5 12A8.5 8.5 0 1 1 12 3.5'],
39
+ },
40
+ 'status.error': {
41
+ kind: 'stroke',
42
+ circles: [{ cx: 12, cy: 12, r: 9 }],
43
+ paths: ['M9 9L15 15', 'M15 9L9 15'],
44
+ },
45
+ };
@@ -0,0 +1,7 @@
1
+ import type { IconDef } from '../icon-types.ts';
2
+ /**
3
+ * Tool glyphs (`tool.*`) — converter and calculator landmarks on tool surfaces.
4
+ * Proprietary converter names that have no honest silhouette use `text-badge`:
5
+ * the mark is real text content in a bounded chip, not a font glyph or emoji.
6
+ */
7
+ export declare const TOOL_ICONS: Record<string, IconDef>;
@@ -0,0 +1,102 @@
1
+ /**
2
+ * Tool glyphs (`tool.*`) — converter and calculator landmarks on tool surfaces.
3
+ * Proprietary converter names that have no honest silhouette use `text-badge`:
4
+ * the mark is real text content in a bounded chip, not a font glyph or emoji.
5
+ */
6
+ export const TOOL_ICONS = {
7
+ 'tool.url': {
8
+ kind: 'stroke',
9
+ paths: ['M10 8H8A4 4 0 0 0 8 16H10', 'M14 8H16A4 4 0 0 1 16 16H14', 'M9 12H15'],
10
+ },
11
+ 'tool.temperature': {
12
+ kind: 'stroke',
13
+ circles: [{ cx: 12, cy: 16.5, r: 3.5 }],
14
+ paths: ['M10 5A2 2 0 0 1 14 5', 'M10 5V14', 'M14 5V14', 'M12 8V14'],
15
+ },
16
+ 'tool.length': {
17
+ kind: 'stroke',
18
+ paths: ['M4 8.5H20V15.5H4Z', 'M8 8.5V12', 'M12 8.5V13.5', 'M16 8.5V12'],
19
+ },
20
+ 'tool.weight': {
21
+ kind: 'stroke',
22
+ paths: ['M4 9V15', 'M7 7V17', 'M17 7V17', 'M20 9V15', 'M7 12H17'],
23
+ },
24
+ 'tool.time-units': {
25
+ kind: 'stroke',
26
+ circles: [{ cx: 12, cy: 12, r: 9 }],
27
+ paths: ['M12 7V12L15.5 14'],
28
+ },
29
+ 'tool.color': {
30
+ kind: 'stroke',
31
+ paths: ['M12 3C10 5.5 6 10.5 6 14A6 6 0 0 0 18 14C18 10.5 14 5.5 12 3Z'],
32
+ },
33
+ 'tool.percentage': {
34
+ kind: 'stroke',
35
+ circles: [
36
+ { cx: 8.5, cy: 8.5, r: 2.6 },
37
+ { cx: 15.5, cy: 15.5, r: 2.6 },
38
+ ],
39
+ paths: ['M17.2 6.8L6.8 17.2'],
40
+ },
41
+ 'tool.area': {
42
+ kind: 'stroke',
43
+ paths: ['M4 4H20V20H4Z', 'M8 8H16V16H8Z'],
44
+ },
45
+ 'tool.volume': {
46
+ kind: 'stroke',
47
+ paths: ['M12 4L20 8.5V15.5L12 20L4 15.5V8.5Z', 'M4 8.5L12 12L20 8.5', 'M12 12V20'],
48
+ },
49
+ 'tool.data-size': {
50
+ kind: 'stroke',
51
+ paths: [
52
+ 'M5 6C5 4.3 8.1 3 12 3C15.9 3 19 4.3 19 6V18C19 19.7 15.9 21 12 21C8.1 21 5 19.7 5 18V6Z',
53
+ 'M5 6C5 7.7 8.1 9 12 9C15.9 9 19 7.7 19 6',
54
+ 'M5 12C5 13.7 8.1 15 12 15C15.9 15 19 13.7 19 12',
55
+ ],
56
+ },
57
+ 'tool.ratio': {
58
+ kind: 'stroke',
59
+ paths: ['M4 10H10V16H4Z', 'M12 8H20V16H12Z'],
60
+ },
61
+ 'tool.average': {
62
+ kind: 'stroke',
63
+ paths: ['M6 6H18', 'M7.5 10L16.5 19', 'M16.5 10L7.5 19'],
64
+ },
65
+ 'tool.tip': {
66
+ kind: 'stroke',
67
+ paths: ['M12 4C9.5 4 8 6 8 8.5C8 10.3 9 11.7 10.5 12.5V15H13.5V12.5C15 11.7 16 10.3 16 8.5C16 6 14.5 4 12 4Z', 'M9.5 18H14.5', 'M10 20H14'],
68
+ },
69
+ 'tool.aspect-ratio': {
70
+ kind: 'stroke',
71
+ paths: ['M4 7H20V17H4Z', 'M8 7V11H4', 'M16 17V13H20'],
72
+ },
73
+ 'tool.bandwidth': {
74
+ kind: 'stroke',
75
+ paths: ['M4 20H20', 'M5 20V16', 'M9 20V12', 'M13 20V8', 'M17 20V4'],
76
+ },
77
+ 'tool.percent-change': {
78
+ kind: 'stroke',
79
+ paths: ['M4 17L9 12L12 15L20 6', 'M15.5 6H20V10.5'],
80
+ },
81
+ 'tool.ohm': {
82
+ kind: 'stroke',
83
+ paths: ['M7 14.5C7 10.8 9.2 7.5 12 7.5C14.8 7.5 17 10.8 17 14.5', 'M7 14.5V17', 'M17 14.5V17', 'M4.5 17H9.5', 'M14.5 17H19.5'],
84
+ },
85
+ 'tool.speed': {
86
+ kind: 'stroke',
87
+ paths: ['M5 14A7 7 0 0 1 19 14', 'M12 14L16 10'],
88
+ dots: [{ cx: 12, cy: 14, r: 1.5 }],
89
+ },
90
+ 'tool.base64': { kind: 'text-badge', label: 'B64' },
91
+ 'tool.base36': { kind: 'text-badge', label: 'B36' },
92
+ 'tool.hex': { kind: 'text-badge', label: 'HEX' },
93
+ 'tool.radix': { kind: 'text-badge', label: 'RAD' },
94
+ 'tool.html-entities': { kind: 'text-badge', label: 'ENT' },
95
+ 'tool.ascii': { kind: 'text-badge', label: 'ASC' },
96
+ 'tool.binary-text': { kind: 'text-badge', label: '01' },
97
+ 'tool.rgb-hsl': { kind: 'text-badge', label: 'HSL' },
98
+ 'tool.px-rem': { kind: 'text-badge', label: 'px' },
99
+ 'tool.gpa': { kind: 'text-badge', label: 'GPA' },
100
+ 'tool.nearest-tenth': { kind: 'text-badge', label: '.1' },
101
+ 'tool.grade-curve': { kind: 'text-badge', label: 'CV' },
102
+ };
@@ -2,5 +2,9 @@
2
2
  import type { IconDef } from './icon-types.ts';
3
3
  export type { IconDef, IconFillDef, IconMixedDef, IconMixedNode, IconStrokeDef, IconTextBadgeDef } from './icon-types.ts';
4
4
  export { DEFAULT_STROKE_WIDTH } from './icon-types.ts';
5
+ /**
6
+ * One registry, one silhouette per concept. Category modules under `./icons/` are the
7
+ * only sources; keys stay stable, and unknown names throw instead of falling back.
8
+ */
5
9
  export declare const REGISTRY: Record<string, IconDef>;
6
10
  export declare function resolveIconDef(name: string): IconDef | null;
package/dist/registry.js CHANGED
@@ -1,9 +1,39 @@
1
- import { STROKE_ICONS } from "./icons-stroke.js";
2
- import { TEXT_BADGE_ICONS } from "./icons-text-badge.js";
1
+ import { ACTION_ICONS } from "./icons/action.js";
2
+ import { BRAND_ICONS } from "./icons/brand.js";
3
+ import { COMMERCE_ICONS } from "./icons/commerce.js";
4
+ import { DATA_ICONS } from "./icons/data.js";
5
+ import { DEVELOP_ICONS } from "./icons/develop.js";
6
+ import { DEVICE_ICONS } from "./icons/device.js";
7
+ import { EDITOR_ICONS } from "./icons/editor.js";
8
+ import { FEATURE_ICONS } from "./icons/feature.js";
9
+ import { FILE_ICONS } from "./icons/file.js";
10
+ import { GIT_ICONS } from "./icons/git.js";
11
+ import { MEDIA_ICONS } from "./icons/media.js";
12
+ import { NAVIGATION_ICONS } from "./icons/navigation.js";
13
+ import { SOCIAL_ICONS } from "./icons/social.js";
14
+ import { STATUS_ICONS } from "./icons/status.js";
15
+ import { TOOL_ICONS } from "./icons/tool.js";
3
16
  export { DEFAULT_STROKE_WIDTH } from "./icon-types.js";
17
+ /**
18
+ * One registry, one silhouette per concept. Category modules under `./icons/` are the
19
+ * only sources; keys stay stable, and unknown names throw instead of falling back.
20
+ */
4
21
  export const REGISTRY = {
5
- ...STROKE_ICONS,
6
- ...TEXT_BADGE_ICONS,
22
+ ...ACTION_ICONS,
23
+ ...BRAND_ICONS,
24
+ ...COMMERCE_ICONS,
25
+ ...DATA_ICONS,
26
+ ...DEVELOP_ICONS,
27
+ ...DEVICE_ICONS,
28
+ ...EDITOR_ICONS,
29
+ ...FEATURE_ICONS,
30
+ ...FILE_ICONS,
31
+ ...GIT_ICONS,
32
+ ...MEDIA_ICONS,
33
+ ...NAVIGATION_ICONS,
34
+ ...SOCIAL_ICONS,
35
+ ...STATUS_ICONS,
36
+ ...TOOL_ICONS,
7
37
  };
8
38
  export function resolveIconDef(name) {
9
39
  const key = String(name || '').trim();
@@ -11,7 +41,7 @@ export function resolveIconDef(name) {
11
41
  return null;
12
42
  const def = REGISTRY[key];
13
43
  if (!def) {
14
- throw new Error(`@vmz/ui-icons: unknown icon name "${key}" — expected a dotted semantic name from the registry (action.*, nav.*, status.*, tool.*, feature.*)`);
44
+ throw new Error(`@vmz/ui-icons: unknown icon name "${key}" — expected a dotted semantic name from the registry (action.*, brand.*, commerce.*, data.*, develop.*, device.*, editor.*, feature.*, file.*, git.*, media.*, nav.*, social.*, status.*, tool.*)`);
15
45
  }
16
46
  return def;
17
47
  }
package/package.json CHANGED
@@ -25,7 +25,7 @@
25
25
  "license": "MIT",
26
26
  "name": "@vmz/ui-icons",
27
27
  "peerDependencies": {
28
- "@vmz/ui": "0.3.12"
28
+ "@vmz/ui": "0.3.13"
29
29
  },
30
30
  "publishConfig": {
31
31
  "access": "public"
@@ -39,5 +39,5 @@
39
39
  "build": "tsc -p tsconfig.json"
40
40
  },
41
41
  "type": "module",
42
- "version": "0.3.12"
42
+ "version": "0.3.13"
43
43
  }
package/src/Icon.vmz CHANGED
@@ -42,14 +42,14 @@
42
42
  align-items: center;
43
43
  justify-content: center;
44
44
  box-sizing: border-box;
45
- min-width: 1.65em;
46
- padding: 0.12em 0.22em;
45
+ min-width: 1.7em;
46
+ padding: 0.1em 0.2em;
47
47
  border: 1.5px solid currentColor;
48
48
  border-radius: 0.2em;
49
49
  font-family: var(--vmz-font-mono, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace);
50
- font-size: 0.52em;
50
+ font-size: 0.56em;
51
51
  font-weight: 600;
52
- letter-spacing: -0.03em;
52
+ letter-spacing: -0.02em;
53
53
  line-height: 1.1;
54
54
  text-align: center;
55
55
  text-transform: uppercase;
@@ -0,0 +1,205 @@
1
+ import type { IconDef } from '../icon-types.ts';
2
+
3
+ /**
4
+ * Action glyphs (`action.*`) — interactive chrome: search, close, chevrons, edit, sort.
5
+ * Geometry follows the shared rules in `../icon-types.ts` companions: 4–20 optical box,
6
+ * one 1.75 stroke, round caps and joins, filled dots at r=1.35.
7
+ */
8
+ export const ACTION_ICONS: Record<string, IconDef> = {
9
+ 'action.search': {
10
+ kind: 'stroke',
11
+ circles: [{ cx: 11, cy: 11, r: 7 }],
12
+ paths: ['M16 16L20 20'],
13
+ },
14
+ 'action.close': {
15
+ kind: 'stroke',
16
+ paths: ['M6 6L18 18', 'M18 6L6 18'],
17
+ },
18
+ 'action.check': {
19
+ kind: 'stroke',
20
+ paths: ['M5 12L10 17L19 7'],
21
+ },
22
+ 'action.chevron-down': {
23
+ kind: 'stroke',
24
+ paths: ['M6 9L12 15L18 9'],
25
+ },
26
+ 'action.chevron-right': {
27
+ kind: 'stroke',
28
+ paths: ['M9 6L15 12L9 18'],
29
+ },
30
+ 'action.menu': {
31
+ kind: 'stroke',
32
+ paths: ['M4 7H20', 'M4 12H20', 'M4 17H20'],
33
+ },
34
+ 'action.plus': {
35
+ kind: 'stroke',
36
+ paths: ['M12 5V19', 'M5 12H19'],
37
+ },
38
+ 'action.copy': {
39
+ kind: 'stroke',
40
+ paths: ['M8 8H20V20H8Z', 'M16 8V4H4V16H8'],
41
+ },
42
+ 'action.chevron-up': {
43
+ kind: 'stroke',
44
+ paths: ['M6 15L12 9L18 15'],
45
+ },
46
+ 'action.chevron-left': {
47
+ kind: 'stroke',
48
+ paths: ['M15 6L9 12L15 18'],
49
+ },
50
+ 'action.minus': {
51
+ kind: 'stroke',
52
+ paths: ['M5 12H19'],
53
+ },
54
+ 'action.more': {
55
+ kind: 'stroke',
56
+ paths: [],
57
+ dots: [
58
+ { cx: 5, cy: 12, r: 1.5 },
59
+ { cx: 12, cy: 12, r: 1.5 },
60
+ { cx: 19, cy: 12, r: 1.5 },
61
+ ],
62
+ },
63
+ 'action.filter': {
64
+ kind: 'stroke',
65
+ paths: ['M4 6H20L14 13V19L10 17V13L4 6Z'],
66
+ },
67
+ 'action.calendar': {
68
+ kind: 'stroke',
69
+ paths: ['M4 8H20V20H4Z', 'M4 12H20', 'M8 4V8', 'M16 4V8'],
70
+ },
71
+ 'action.upload': {
72
+ kind: 'stroke',
73
+ paths: ['M12 15V4', 'M7 9L12 4L17 9', 'M4 16V20H20V16'],
74
+ },
75
+ 'action.download': {
76
+ kind: 'stroke',
77
+ paths: ['M12 4V15', 'M7 10L12 15L17 10', 'M4 16V20H20V16'],
78
+ },
79
+ 'action.sort': {
80
+ kind: 'stroke',
81
+ paths: ['M8 18V6', 'M5 9L8 6L11 9', 'M16 6V18', 'M13 15L16 18L19 15'],
82
+ },
83
+ 'action.sort-asc': {
84
+ kind: 'stroke',
85
+ paths: ['M8 18V6', 'M5 9L8 6L11 9', 'M14 14V18', 'M17 11V18', 'M20 8V18'],
86
+ },
87
+ 'action.sort-desc': {
88
+ kind: 'stroke',
89
+ paths: ['M8 6V18', 'M5 15L8 18L11 15', 'M14 8V18', 'M17 11V18', 'M20 14V18'],
90
+ },
91
+ 'action.external': {
92
+ kind: 'stroke',
93
+ paths: ['M14 4H20V10', 'M20 4L11 13', 'M18 14V20H4V6H10'],
94
+ },
95
+ 'action.arrow-right': {
96
+ kind: 'stroke',
97
+ paths: ['M4 12H20', 'M14 6L20 12L14 18'],
98
+ },
99
+ 'action.arrow-left': {
100
+ kind: 'stroke',
101
+ paths: ['M20 12H4', 'M10 6L4 12L10 18'],
102
+ },
103
+ 'action.trash': {
104
+ kind: 'stroke',
105
+ paths: ['M4 7H20', 'M9 7V4H15V7', 'M6 7L7 20H17L18 7', 'M10 11V16', 'M14 11V16'],
106
+ },
107
+ 'action.edit': {
108
+ kind: 'stroke',
109
+ paths: ['M4 20L5 16L16 5L19 8L8 19L4 20Z', 'M13.5 7.5L16.5 10.5'],
110
+ },
111
+ 'action.refresh': {
112
+ kind: 'stroke',
113
+ paths: ['M20 12A8 8 0 1 1 17.1 5.9L20 8', 'M15.5 8H20V3.5'],
114
+ },
115
+ 'action.history': {
116
+ kind: 'stroke',
117
+ paths: ['M4 12A8 8 0 1 0 6.9 5.9L4 8', 'M4 3.5V8H8.5', 'M12 7V12L15.5 14'],
118
+ },
119
+ 'action.moon': {
120
+ kind: 'stroke',
121
+ paths: ['M20 14.5A8.5 8.5 0 0 1 9.5 4 8.5 8.5 0 1 0 20 14.5Z'],
122
+ },
123
+ 'action.sun': {
124
+ kind: 'stroke',
125
+ circles: [{ cx: 12, cy: 12, r: 4 }],
126
+ paths: [
127
+ 'M12 3V6',
128
+ 'M12 18V21',
129
+ 'M3 12H6',
130
+ 'M18 12H21',
131
+ 'M5.6 5.6L7.8 7.8',
132
+ 'M16.2 16.2L18.4 18.4',
133
+ 'M18.4 5.6L16.2 7.8',
134
+ 'M7.8 16.2L5.6 18.4',
135
+ ],
136
+ },
137
+ 'action.monitor': {
138
+ kind: 'stroke',
139
+ paths: ['M4 5H20V17H4Z', 'M9 20H15', 'M12 17V20'],
140
+ },
141
+ 'action.search-document': {
142
+ kind: 'stroke',
143
+ paths: ['M4 3.5H12L16.5 8V20.5H4Z', 'M12 3.5V8H16.5', 'M16.5 16.5L20.5 20.5'],
144
+ circles: [{ cx: 14.2, cy: 14.2, r: 3.2 }],
145
+ },
146
+ 'action.save': {
147
+ kind: 'stroke',
148
+ paths: ['M4 4H16L20 8V20H4Z', 'M8 20V13H16V20', 'M8 4V8.5H14V4'],
149
+ },
150
+ 'action.undo': {
151
+ kind: 'stroke',
152
+ paths: ['M9 14L4 9L9 4', 'M4 9H14A6.5 6.5 0 0 1 20.5 15.5V18'],
153
+ },
154
+ 'action.redo': {
155
+ kind: 'stroke',
156
+ paths: ['M15 14L20 9L15 4', 'M20 9H10A6.5 6.5 0 0 0 3.5 15.5V18'],
157
+ },
158
+ 'action.cut': {
159
+ kind: 'stroke',
160
+ paths: ['M7.9 7.5L20 19', 'M7.9 16.5L20 5'],
161
+ circles: [
162
+ { cx: 6, cy: 6, r: 2.2 },
163
+ { cx: 6, cy: 18, r: 2.2 },
164
+ ],
165
+ },
166
+ 'action.paste': {
167
+ kind: 'stroke',
168
+ paths: ['M16 5H19V20H5V5H8', 'M8 3.5H16V7H8Z'],
169
+ },
170
+ 'action.eye': {
171
+ kind: 'stroke',
172
+ paths: ['M2.5 12C4.5 7.5 8 5 12 5C16 5 19.5 7.5 21.5 12C19.5 16.5 16 19 12 19C8 19 4.5 16.5 2.5 12Z'],
173
+ circles: [{ cx: 12, cy: 12, r: 3 }],
174
+ },
175
+ 'action.eye-off': {
176
+ kind: 'stroke',
177
+ paths: ['M2.5 12C4.5 7.5 8 5 12 5C16 5 19.5 7.5 21.5 12C19.5 16.5 16 19 12 19C8 19 4.5 16.5 2.5 12Z', 'M4 19L20 5'],
178
+ circles: [{ cx: 12, cy: 12, r: 3 }],
179
+ },
180
+ 'action.mail': {
181
+ kind: 'stroke',
182
+ paths: ['M3 6H21V18H3Z', 'M3 7L12 13L21 7'],
183
+ },
184
+ 'action.sync': {
185
+ kind: 'stroke',
186
+ paths: ['M8 4L4 8L8 12', 'M4 8H20', 'M16 12L20 16L16 20', 'M20 16H4'],
187
+ },
188
+ 'action.archive': {
189
+ kind: 'stroke',
190
+ paths: ['M4 4H20V8H4Z', 'M5 8H19V20H5Z', 'M10 12H14'],
191
+ },
192
+ 'action.share': {
193
+ kind: 'stroke',
194
+ circles: [
195
+ { cx: 18, cy: 5.5, r: 2.5 },
196
+ { cx: 6, cy: 12, r: 2.5 },
197
+ { cx: 18, cy: 18.5, r: 2.5 },
198
+ ],
199
+ paths: ['M8.2 10.9L15.8 6.6', 'M8.2 13.1L15.8 17.4'],
200
+ },
201
+ 'action.move': {
202
+ kind: 'stroke',
203
+ paths: ['M12 4L15 7H13V11H17V9L20 12L17 15V13H13V17H15L12 20L9 17H11V13H7V15L4 12L7 9V11H11V7H9L12 4Z'],
204
+ },
205
+ };