@archmap/icons 0.1.0

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.
@@ -0,0 +1,91 @@
1
+ import { generatedCloudIconCounts, generatedCloudIconEntries } from "./cloud-icons.generated.js";
2
+ export const cloudIconEntries = generatedCloudIconEntries;
3
+ export const cloudIconCounts = generatedCloudIconCounts;
4
+ const providerFallbackIcons = {
5
+ aws: badge("AWS", "FF9900"),
6
+ gcp: badge("GCP", "4285F4"),
7
+ azure: badge("AZ", "0078D4"),
8
+ };
9
+ function badge(label, color) {
10
+ return {
11
+ viewBox: "0 0 24 24",
12
+ body: `<rect width="24" height="24" rx="5" fill="#${color}" />` +
13
+ `<text x="12" y="13" font-family="system-ui, sans-serif" font-size="7.2" font-weight="700" ` +
14
+ `text-anchor="middle" dominant-baseline="central" fill="#ffffff">${label}</text>`,
15
+ };
16
+ }
17
+ function shouldInstall(provider, options) {
18
+ return !options.providers || options.providers.includes(provider);
19
+ }
20
+ function normalizeKey(value) {
21
+ return value
22
+ .replace(/&/g, " and ")
23
+ .toLowerCase()
24
+ .replace(/[^a-z0-9]+/g, "_")
25
+ .replace(/^_+|_+$/g, "")
26
+ .replace(/_{2,}/g, "_");
27
+ }
28
+ function entrySearchText(entry) {
29
+ return [entry.provider, entry.key, entry.title, entry.category, ...(entry.aliases ?? [])]
30
+ .map(normalizeKey)
31
+ .join(" ");
32
+ }
33
+ function registerCloudEntry(registerIcon, entry) {
34
+ registerIcon(`${entry.provider}/${entry.key}`, entry.icon);
35
+ for (const alias of entry.aliases ?? []) {
36
+ registerIcon(`${entry.provider}/${alias}`, entry.icon);
37
+ }
38
+ }
39
+ export function installCloudProviderIcons(registerIcon, options = {}) {
40
+ for (const provider of Object.keys(providerFallbackIcons)) {
41
+ if (shouldInstall(provider, options))
42
+ registerIcon(provider, providerFallbackIcons[provider]);
43
+ }
44
+ for (const entry of cloudIconEntries) {
45
+ if (shouldInstall(entry.provider, options))
46
+ registerCloudEntry(registerIcon, entry);
47
+ }
48
+ }
49
+ export function installAwsIcons(registerIcon) {
50
+ installCloudProviderIcons(registerIcon, { providers: ["aws"] });
51
+ }
52
+ export function installGcpIcons(registerIcon) {
53
+ installCloudProviderIcons(registerIcon, { providers: ["gcp"] });
54
+ }
55
+ export function installAzureIcons(registerIcon) {
56
+ installCloudProviderIcons(registerIcon, { providers: ["azure"] });
57
+ }
58
+ export function getCloudIconEntry(provider, kind) {
59
+ const normalized = normalizeKey(kind);
60
+ return cloudIconEntries.find((entry) => entry.provider === provider &&
61
+ (entry.key === normalized || (entry.aliases ?? []).includes(normalized)));
62
+ }
63
+ export function listCloudIconKeys(provider) {
64
+ const keys = [];
65
+ for (const entry of cloudIconEntries) {
66
+ if (provider && entry.provider !== provider)
67
+ continue;
68
+ keys.push(`${entry.provider}/${entry.key}`);
69
+ for (const alias of entry.aliases ?? [])
70
+ keys.push(`${entry.provider}/${alias}`);
71
+ }
72
+ return keys.sort();
73
+ }
74
+ export function searchCloudIconEntries(query, options = {}) {
75
+ const terms = normalizeKey(query).split("_").filter(Boolean);
76
+ const limit = options.limit ?? 20;
77
+ const scored = cloudIconEntries
78
+ .filter((entry) => !options.provider || entry.provider === options.provider)
79
+ .map((entry) => {
80
+ const text = entrySearchText(entry);
81
+ const exactKey = terms.length === 1 && entry.key === terms[0] ? 4 : 0;
82
+ const exactAlias = terms.some((term) => (entry.aliases ?? []).includes(term)) ? 3 : 0;
83
+ const score = exactKey +
84
+ exactAlias +
85
+ terms.reduce((sum, term) => sum + (text.includes(term) ? 1 : 0), 0);
86
+ return { entry, score };
87
+ })
88
+ .filter(({ score }) => score > 0)
89
+ .sort((a, b) => b.score - a.score || a.entry.key.localeCompare(b.entry.key));
90
+ return scored.slice(0, limit).map(({ entry }) => entry);
91
+ }
@@ -0,0 +1,227 @@
1
+ export interface RenderableIcon {
2
+ viewBox: string;
3
+ body: string;
4
+ }
5
+ export type RegisterIcon = (key: string, icon: RenderableIcon) => void;
6
+ export interface ServiceIconEntry {
7
+ /** Canonical ArchMap provider key. */
8
+ key: string;
9
+ /** Human-readable service name. */
10
+ title: string;
11
+ /** Diagram role this icon is usually used for. */
12
+ role: string;
13
+ /** Ranked row from the initial famous-services set. */
14
+ rank: number;
15
+ /** Additional provider spellings registered for the same icon. */
16
+ aliases?: readonly string[];
17
+ }
18
+ export declare const famousServiceIconEntries: readonly [{
19
+ readonly rank: 1;
20
+ readonly key: "datadog";
21
+ readonly title: "Datadog";
22
+ readonly role: "Observability / Monitoring";
23
+ }, {
24
+ readonly rank: 2;
25
+ readonly key: "cloudflare";
26
+ readonly title: "Cloudflare";
27
+ readonly role: "Edge / DNS / WAF";
28
+ }, {
29
+ readonly rank: 3;
30
+ readonly key: "okta";
31
+ readonly title: "Okta";
32
+ readonly role: "Identity Provider";
33
+ }, {
34
+ readonly rank: 4;
35
+ readonly key: "wiz";
36
+ readonly title: "Wiz";
37
+ readonly role: "Cloud Security / CNAPP";
38
+ }, {
39
+ readonly rank: 5;
40
+ readonly key: "sentry";
41
+ readonly title: "Sentry";
42
+ readonly role: "Error Tracking";
43
+ }, {
44
+ readonly rank: 6;
45
+ readonly key: "github";
46
+ readonly title: "GitHub";
47
+ readonly role: "Code / CI / Dev Platform";
48
+ }, {
49
+ readonly rank: 7;
50
+ readonly key: "pagerduty";
51
+ readonly title: "PagerDuty";
52
+ readonly role: "Incident / Alert Routing";
53
+ readonly aliases: readonly ["pager-duty", "pager_duty"];
54
+ }, {
55
+ readonly rank: 8;
56
+ readonly key: "newrelic";
57
+ readonly title: "New Relic";
58
+ readonly role: "Observability";
59
+ readonly aliases: readonly ["new-relic", "new_relic"];
60
+ }, {
61
+ readonly rank: 8;
62
+ readonly key: "dynatrace";
63
+ readonly title: "Dynatrace";
64
+ readonly role: "Observability";
65
+ }, {
66
+ readonly rank: 9;
67
+ readonly key: "splunk";
68
+ readonly title: "Splunk";
69
+ readonly role: "Log Analytics / SIEM";
70
+ }, {
71
+ readonly rank: 10;
72
+ readonly key: "servicenow";
73
+ readonly title: "ServiceNow";
74
+ readonly role: "ITSM / Ticketing";
75
+ readonly aliases: readonly ["service-now", "service_now"];
76
+ }, {
77
+ readonly rank: 10;
78
+ readonly key: "jira";
79
+ readonly title: "Jira";
80
+ readonly role: "ITSM / Ticketing";
81
+ }, {
82
+ readonly rank: 11;
83
+ readonly key: "kubernetes";
84
+ readonly title: "Kubernetes";
85
+ readonly role: "Container Orchestration";
86
+ readonly aliases: readonly ["k8s"];
87
+ }, {
88
+ readonly rank: 12;
89
+ readonly key: "docker";
90
+ readonly title: "Docker";
91
+ readonly role: "Containers";
92
+ }, {
93
+ readonly rank: 13;
94
+ readonly key: "terraform";
95
+ readonly title: "Terraform";
96
+ readonly role: "Infrastructure as Code";
97
+ readonly aliases: readonly ["iac"];
98
+ }, {
99
+ readonly rank: 14;
100
+ readonly key: "grafana";
101
+ readonly title: "Grafana";
102
+ readonly role: "Dashboards / Observability";
103
+ }, {
104
+ readonly rank: 15;
105
+ readonly key: "prometheus";
106
+ readonly title: "Prometheus";
107
+ readonly role: "Metrics / Monitoring";
108
+ }, {
109
+ readonly rank: 16;
110
+ readonly key: "postgresql";
111
+ readonly title: "PostgreSQL";
112
+ readonly role: "Relational Database";
113
+ readonly aliases: readonly ["postgres", "postgres_db"];
114
+ }, {
115
+ readonly rank: 17;
116
+ readonly key: "mysql";
117
+ readonly title: "MySQL";
118
+ readonly role: "Relational Database";
119
+ }, {
120
+ readonly rank: 18;
121
+ readonly key: "redis";
122
+ readonly title: "Redis";
123
+ readonly role: "Cache / Key-Value Store";
124
+ readonly aliases: readonly ["cache"];
125
+ }, {
126
+ readonly rank: 19;
127
+ readonly key: "mongodb";
128
+ readonly title: "MongoDB";
129
+ readonly role: "Document Database";
130
+ readonly aliases: readonly ["mongo", "document_db"];
131
+ }, {
132
+ readonly rank: 20;
133
+ readonly key: "kafka";
134
+ readonly title: "Apache Kafka";
135
+ readonly role: "Event Streaming";
136
+ readonly aliases: readonly ["apache_kafka", "event_streaming"];
137
+ }, {
138
+ readonly rank: 21;
139
+ readonly key: "elasticsearch";
140
+ readonly title: "Elasticsearch";
141
+ readonly role: "Search / Log Indexing";
142
+ readonly aliases: readonly ["elastic_search", "search"];
143
+ }, {
144
+ readonly rank: 22;
145
+ readonly key: "slack";
146
+ readonly title: "Slack";
147
+ readonly role: "ChatOps / Collaboration";
148
+ }, {
149
+ readonly rank: 23;
150
+ readonly key: "microsoftteams";
151
+ readonly title: "Microsoft Teams";
152
+ readonly role: "ChatOps / Collaboration";
153
+ readonly aliases: readonly ["microsoft-teams", "microsoft_teams", "teams"];
154
+ }, {
155
+ readonly rank: 24;
156
+ readonly key: "auth0";
157
+ readonly title: "Auth0";
158
+ readonly role: "Identity Provider";
159
+ }, {
160
+ readonly rank: 25;
161
+ readonly key: "keycloak";
162
+ readonly title: "Keycloak";
163
+ readonly role: "Identity Provider";
164
+ }, {
165
+ readonly rank: 26;
166
+ readonly key: "vercel";
167
+ readonly title: "Vercel";
168
+ readonly role: "Frontend Hosting / Deployment";
169
+ }, {
170
+ readonly rank: 27;
171
+ readonly key: "netlify";
172
+ readonly title: "Netlify";
173
+ readonly role: "Frontend Hosting / Deployment";
174
+ }, {
175
+ readonly rank: 28;
176
+ readonly key: "heroku";
177
+ readonly title: "Heroku";
178
+ readonly role: "PaaS / App Hosting";
179
+ }, {
180
+ readonly rank: 29;
181
+ readonly key: "supabase";
182
+ readonly title: "Supabase";
183
+ readonly role: "Backend Platform";
184
+ }, {
185
+ readonly rank: 30;
186
+ readonly key: "firebase";
187
+ readonly title: "Firebase";
188
+ readonly role: "Backend Platform";
189
+ }];
190
+ declare const iconsByKey: {
191
+ datadog: RenderableIcon;
192
+ cloudflare: RenderableIcon;
193
+ okta: RenderableIcon;
194
+ wiz: RenderableIcon;
195
+ sentry: RenderableIcon;
196
+ github: RenderableIcon;
197
+ pagerduty: RenderableIcon;
198
+ newrelic: RenderableIcon;
199
+ dynatrace: RenderableIcon;
200
+ splunk: RenderableIcon;
201
+ servicenow: RenderableIcon;
202
+ jira: RenderableIcon;
203
+ kubernetes: RenderableIcon;
204
+ docker: RenderableIcon;
205
+ terraform: RenderableIcon;
206
+ grafana: RenderableIcon;
207
+ prometheus: RenderableIcon;
208
+ postgresql: RenderableIcon;
209
+ mysql: RenderableIcon;
210
+ redis: RenderableIcon;
211
+ mongodb: RenderableIcon;
212
+ kafka: RenderableIcon;
213
+ elasticsearch: RenderableIcon;
214
+ slack: RenderableIcon;
215
+ microsoftteams: RenderableIcon;
216
+ auth0: RenderableIcon;
217
+ keycloak: RenderableIcon;
218
+ vercel: RenderableIcon;
219
+ netlify: RenderableIcon;
220
+ heroku: RenderableIcon;
221
+ supabase: RenderableIcon;
222
+ firebase: RenderableIcon;
223
+ };
224
+ export declare function installFamousServiceIcons(registerIcon: RegisterIcon): void;
225
+ export { iconsByKey as famousServiceIcons };
226
+ export { cloudIconCounts, cloudIconEntries, getCloudIconEntry, installAwsIcons, installAzureIcons, installCloudProviderIcons, installGcpIcons, listCloudIconKeys, searchCloudIconEntries, } from "./cloud-icons.js";
227
+ export type { CloudIconEntry, CloudProvider, InstallCloudIconsOptions, SearchCloudIconOptions, } from "./cloud-icons.js";
package/dist/index.js ADDED
@@ -0,0 +1,263 @@
1
+ import { siApachekafka, siAuth0, siCloudflare, siDatadog, siDocker, siDynatrace, siElasticsearch, siFirebase, siGrafana, siGithub, siJira, siKeycloak, siKubernetes, siMongodb, siMysql, siNewrelic, siNetlify, siOkta, siPagerduty, siPostgresql, siPrometheus, siRedis, siSentry, siSplunk, siSupabase, siTerraform, siVercel, } from "simple-icons";
2
+ export const famousServiceIconEntries = [
3
+ {
4
+ rank: 1,
5
+ key: "datadog",
6
+ title: "Datadog",
7
+ role: "Observability / Monitoring",
8
+ },
9
+ {
10
+ rank: 2,
11
+ key: "cloudflare",
12
+ title: "Cloudflare",
13
+ role: "Edge / DNS / WAF",
14
+ },
15
+ {
16
+ rank: 3,
17
+ key: "okta",
18
+ title: "Okta",
19
+ role: "Identity Provider",
20
+ },
21
+ {
22
+ rank: 4,
23
+ key: "wiz",
24
+ title: "Wiz",
25
+ role: "Cloud Security / CNAPP",
26
+ },
27
+ {
28
+ rank: 5,
29
+ key: "sentry",
30
+ title: "Sentry",
31
+ role: "Error Tracking",
32
+ },
33
+ {
34
+ rank: 6,
35
+ key: "github",
36
+ title: "GitHub",
37
+ role: "Code / CI / Dev Platform",
38
+ },
39
+ {
40
+ rank: 7,
41
+ key: "pagerduty",
42
+ title: "PagerDuty",
43
+ role: "Incident / Alert Routing",
44
+ aliases: ["pager-duty", "pager_duty"],
45
+ },
46
+ {
47
+ rank: 8,
48
+ key: "newrelic",
49
+ title: "New Relic",
50
+ role: "Observability",
51
+ aliases: ["new-relic", "new_relic"],
52
+ },
53
+ {
54
+ rank: 8,
55
+ key: "dynatrace",
56
+ title: "Dynatrace",
57
+ role: "Observability",
58
+ },
59
+ {
60
+ rank: 9,
61
+ key: "splunk",
62
+ title: "Splunk",
63
+ role: "Log Analytics / SIEM",
64
+ },
65
+ {
66
+ rank: 10,
67
+ key: "servicenow",
68
+ title: "ServiceNow",
69
+ role: "ITSM / Ticketing",
70
+ aliases: ["service-now", "service_now"],
71
+ },
72
+ {
73
+ rank: 10,
74
+ key: "jira",
75
+ title: "Jira",
76
+ role: "ITSM / Ticketing",
77
+ },
78
+ {
79
+ rank: 11,
80
+ key: "kubernetes",
81
+ title: "Kubernetes",
82
+ role: "Container Orchestration",
83
+ aliases: ["k8s"],
84
+ },
85
+ {
86
+ rank: 12,
87
+ key: "docker",
88
+ title: "Docker",
89
+ role: "Containers",
90
+ },
91
+ {
92
+ rank: 13,
93
+ key: "terraform",
94
+ title: "Terraform",
95
+ role: "Infrastructure as Code",
96
+ aliases: ["iac"],
97
+ },
98
+ {
99
+ rank: 14,
100
+ key: "grafana",
101
+ title: "Grafana",
102
+ role: "Dashboards / Observability",
103
+ },
104
+ {
105
+ rank: 15,
106
+ key: "prometheus",
107
+ title: "Prometheus",
108
+ role: "Metrics / Monitoring",
109
+ },
110
+ {
111
+ rank: 16,
112
+ key: "postgresql",
113
+ title: "PostgreSQL",
114
+ role: "Relational Database",
115
+ aliases: ["postgres", "postgres_db"],
116
+ },
117
+ {
118
+ rank: 17,
119
+ key: "mysql",
120
+ title: "MySQL",
121
+ role: "Relational Database",
122
+ },
123
+ {
124
+ rank: 18,
125
+ key: "redis",
126
+ title: "Redis",
127
+ role: "Cache / Key-Value Store",
128
+ aliases: ["cache"],
129
+ },
130
+ {
131
+ rank: 19,
132
+ key: "mongodb",
133
+ title: "MongoDB",
134
+ role: "Document Database",
135
+ aliases: ["mongo", "document_db"],
136
+ },
137
+ {
138
+ rank: 20,
139
+ key: "kafka",
140
+ title: "Apache Kafka",
141
+ role: "Event Streaming",
142
+ aliases: ["apache_kafka", "event_streaming"],
143
+ },
144
+ {
145
+ rank: 21,
146
+ key: "elasticsearch",
147
+ title: "Elasticsearch",
148
+ role: "Search / Log Indexing",
149
+ aliases: ["elastic_search", "search"],
150
+ },
151
+ {
152
+ rank: 22,
153
+ key: "slack",
154
+ title: "Slack",
155
+ role: "ChatOps / Collaboration",
156
+ },
157
+ {
158
+ rank: 23,
159
+ key: "microsoftteams",
160
+ title: "Microsoft Teams",
161
+ role: "ChatOps / Collaboration",
162
+ aliases: ["microsoft-teams", "microsoft_teams", "teams"],
163
+ },
164
+ {
165
+ rank: 24,
166
+ key: "auth0",
167
+ title: "Auth0",
168
+ role: "Identity Provider",
169
+ },
170
+ {
171
+ rank: 25,
172
+ key: "keycloak",
173
+ title: "Keycloak",
174
+ role: "Identity Provider",
175
+ },
176
+ {
177
+ rank: 26,
178
+ key: "vercel",
179
+ title: "Vercel",
180
+ role: "Frontend Hosting / Deployment",
181
+ },
182
+ {
183
+ rank: 27,
184
+ key: "netlify",
185
+ title: "Netlify",
186
+ role: "Frontend Hosting / Deployment",
187
+ },
188
+ {
189
+ rank: 28,
190
+ key: "heroku",
191
+ title: "Heroku",
192
+ role: "PaaS / App Hosting",
193
+ },
194
+ {
195
+ rank: 29,
196
+ key: "supabase",
197
+ title: "Supabase",
198
+ role: "Backend Platform",
199
+ },
200
+ {
201
+ rank: 30,
202
+ key: "firebase",
203
+ title: "Firebase",
204
+ role: "Backend Platform",
205
+ },
206
+ ];
207
+ function fromSimpleIcon(si) {
208
+ return { viewBox: "0 0 24 24", body: `<path fill="#${si.hex}" d="${si.path}" />` };
209
+ }
210
+ function letterBadge(label, color) {
211
+ return {
212
+ viewBox: "0 0 24 24",
213
+ body: `<rect width="24" height="24" rx="5" fill="#${color}" />` +
214
+ `<text x="12" y="13" font-family="system-ui, sans-serif" font-size="7.2" font-weight="700" ` +
215
+ `text-anchor="middle" dominant-baseline="central" fill="#ffffff">${label}</text>`,
216
+ };
217
+ }
218
+ function registerWithAliases(registerIcon, entry, icon) {
219
+ registerIcon(entry.key, icon);
220
+ for (const alias of entry.aliases ?? [])
221
+ registerIcon(alias, icon);
222
+ }
223
+ const iconsByKey = {
224
+ datadog: fromSimpleIcon(siDatadog),
225
+ cloudflare: fromSimpleIcon(siCloudflare),
226
+ okta: fromSimpleIcon(siOkta),
227
+ wiz: letterBadge("WIZ", "7C3AED"),
228
+ sentry: fromSimpleIcon(siSentry),
229
+ github: fromSimpleIcon(siGithub),
230
+ pagerduty: fromSimpleIcon(siPagerduty),
231
+ newrelic: fromSimpleIcon(siNewrelic),
232
+ dynatrace: fromSimpleIcon(siDynatrace),
233
+ splunk: fromSimpleIcon(siSplunk),
234
+ servicenow: letterBadge("SN", "00A13A"),
235
+ jira: fromSimpleIcon(siJira),
236
+ kubernetes: fromSimpleIcon(siKubernetes),
237
+ docker: fromSimpleIcon(siDocker),
238
+ terraform: fromSimpleIcon(siTerraform),
239
+ grafana: fromSimpleIcon(siGrafana),
240
+ prometheus: fromSimpleIcon(siPrometheus),
241
+ postgresql: fromSimpleIcon(siPostgresql),
242
+ mysql: fromSimpleIcon(siMysql),
243
+ redis: fromSimpleIcon(siRedis),
244
+ mongodb: fromSimpleIcon(siMongodb),
245
+ kafka: fromSimpleIcon(siApachekafka),
246
+ elasticsearch: fromSimpleIcon(siElasticsearch),
247
+ slack: letterBadge("SLK", "4A154B"),
248
+ microsoftteams: letterBadge("MS", "6264A7"),
249
+ auth0: fromSimpleIcon(siAuth0),
250
+ keycloak: fromSimpleIcon(siKeycloak),
251
+ vercel: fromSimpleIcon(siVercel),
252
+ netlify: fromSimpleIcon(siNetlify),
253
+ heroku: letterBadge("HKU", "430098"),
254
+ supabase: fromSimpleIcon(siSupabase),
255
+ firebase: fromSimpleIcon(siFirebase),
256
+ };
257
+ export function installFamousServiceIcons(registerIcon) {
258
+ for (const entry of famousServiceIconEntries) {
259
+ registerWithAliases(registerIcon, entry, iconsByKey[entry.key]);
260
+ }
261
+ }
262
+ export { iconsByKey as famousServiceIcons };
263
+ export { cloudIconCounts, cloudIconEntries, getCloudIconEntry, installAwsIcons, installAzureIcons, installCloudProviderIcons, installGcpIcons, listCloudIconKeys, searchCloudIconEntries, } from "./cloud-icons.js";
package/package.json ADDED
@@ -0,0 +1,38 @@
1
+ {
2
+ "name": "@archmap/icons",
3
+ "version": "0.1.0",
4
+ "description": "Opt-in third-party service icon pack for ArchMap diagrams.",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js"
13
+ }
14
+ },
15
+ "files": [
16
+ "dist",
17
+ "README.md"
18
+ ],
19
+ "scripts": {
20
+ "build": "tsc",
21
+ "generate:cloud-icons": "node scripts/generate-cloud-icons.mjs",
22
+ "test": "npm run typecheck && npm run build && node scripts/test-icons.mjs",
23
+ "typecheck": "tsc --noEmit"
24
+ },
25
+ "dependencies": {
26
+ "simple-icons": "^16.24.0"
27
+ },
28
+ "devDependencies": {
29
+ "typescript": "^5.6.3"
30
+ },
31
+ "keywords": [
32
+ "archmap",
33
+ "architecture",
34
+ "diagram",
35
+ "icons"
36
+ ],
37
+ "license": "MIT"
38
+ }