agent-robot-avatar 0.6.0 → 0.7.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.
Files changed (39) hide show
  1. package/CHANGELOG.md +11 -1
  2. package/README.md +84 -19
  3. package/agent-robot-avatar-lite.js +44 -0
  4. package/agent-robot-avatar.js +2 -1
  5. package/index.d.ts +64 -0
  6. package/lite.d.ts +5 -0
  7. package/package.json +11 -6
  8. package/src/agent-robot-avatar-core.js +5 -2
  9. package/src/agent-robot-avatar-runtime.js +4 -1
  10. package/src/agent-robot-avatar-skin-patterns.js +234 -0
  11. package/src/agent-robot-avatar-skins.js +256 -0
  12. package/src/agent-robot-avatar-version.js +1 -1
  13. package/src/skins/catalog.js +218 -0
  14. package/src/skins/collection-materials.js +118 -0
  15. package/src/skins/eyelids.js +32 -0
  16. package/src/skins/glaze-variants.js +29 -0
  17. package/src/skins/layered-texture.js +162 -0
  18. package/src/skins/material-data.js +111 -0
  19. package/src/skins/material-library.js +302 -0
  20. package/src/skins/metal-tint.js +11 -0
  21. package/src/skins/more-materials.js +69 -0
  22. package/src/skins/native.js +754 -0
  23. package/src/skins/paints.js +3 -0
  24. package/src/skins/revised-materials.js +44 -0
  25. package/src/skins/second-pass-materials.js +71 -0
  26. package/src/skins/soft-materials.js +111 -0
  27. package/src/skins/sports-materials.js +38 -0
  28. package/src/skins/wood-materials.js +68 -0
  29. package/assets/support/alipay.png +0 -0
  30. package/assets/support/wechat-pay.png +0 -0
  31. package/docs/README.de.md +0 -185
  32. package/docs/README.es.md +0 -185
  33. package/docs/README.fr.md +0 -185
  34. package/docs/README.ja.md +0 -185
  35. package/docs/README.ko.md +0 -185
  36. package/docs/README.pt.md +0 -185
  37. package/docs/README.ru.md +0 -185
  38. package/docs/README.zh-CN.md +0 -202
  39. package/docs/README.zh-TW.md +0 -185
@@ -0,0 +1,256 @@
1
+ import AgentRobotAvatar, { registerAvatarExtension } from './agent-robot-avatar-extension-host.js';
2
+ import { SKIN_CATALOG, SKIN_SERIES } from './skins/catalog.js';
3
+
4
+ // The painters are large, so they load the first time a skin needs them. A page
5
+ // that never uses a skin never downloads them.
6
+ const painters = {};
7
+ const loading = {};
8
+ function loadPainter(kind) {
9
+ loading[kind] ??= Promise.all([
10
+ import('./skins/paints.js'),
11
+ kind === 'native' ? import('./skins/native.js') : import('./skins/material-library.js'),
12
+ import('./skins/eyelids.js'),
13
+ ]).then(([paints, painter, eyelids]) => {
14
+ painters.paints = paints.SKIN_PAINTS;
15
+ painters.maskEyelids = eyelids.maskEyelids;
16
+ painters[kind] = painter;
17
+ });
18
+ return loading[kind];
19
+ }
20
+
21
+ /** Loads every skin painter now, so later skins show on the same frame they are set. */
22
+ function loadSkins() {
23
+ return Promise.all([loadPainter('native'), loadPainter('material')]).then(() => undefined);
24
+ }
25
+
26
+ const proto = AgentRobotAvatar.prototype;
27
+ const baseApplyColor = proto._applyColor;
28
+
29
+ // Skins are numbered. The number is the permanent public name; the Chinese and
30
+ // English titles are for display and may be reworded later. SKIN_NAMES lists
31
+ // them in display order, series by series.
32
+ const SKIN_NAMES = Object.freeze(SKIN_SERIES.flatMap(series => series.skins));
33
+ const SKINS = Object.freeze(Object.fromEntries(Object.entries(SKIN_CATALOG).map(([id, skin]) => [id,
34
+ Object.freeze({ series: skin.series, title: skin.zh, titleEn: skin.en, base: Object.freeze([...skin.base]) })])));
35
+ const SERIES = Object.freeze(SKIN_SERIES.map(series => Object.freeze({
36
+ id: series.id, number: series.number, title: series.zh, titleEn: series.en, skins: Object.freeze([...series.skins]),
37
+ })));
38
+
39
+ const REST_LIGHT = Object.freeze({ x: -0.5, y: -0.5 });
40
+ const clamp = (value, min, max) => Math.max(min, Math.min(max, value));
41
+
42
+ function normalizeSkin(value) {
43
+ const text = String(value ?? '').trim().toLowerCase();
44
+ if (!text || text === 'none') return null;
45
+ const name = /^\d+$/.test(text) ? String(Number(text)) : text;
46
+ return Object.hasOwn(SKIN_CATALOG, name) ? name : undefined;
47
+ }
48
+
49
+ // Hand adjustments from the skin workshop, applied after a skin is painted.
50
+ // A record names an element by id or selector, optionally a child path, and the
51
+ // attributes to set on it.
52
+ function findPainted(root, record) {
53
+ let node = record.id ? root.getElementById(record.id) : root.querySelector(record.selector);
54
+ for (const index of record.path || []) node = node?.children[index];
55
+ return node;
56
+ }
57
+
58
+ // Some adjustments touch layers every skin shares, so each change is recorded
59
+ // and undone before the next skin is painted.
60
+ function paintAdjustments(instance, name) {
61
+ const records = painters.paints[name]?.paint || [];
62
+ const root = instance.shadowRoot;
63
+ const undo = instance._skinUndo ??= [];
64
+ for (const record of records) {
65
+ const node = findPainted(root, record);
66
+ if (!node) continue;
67
+ for (const [attribute, value] of Object.entries(record.attributes)) {
68
+ undo.push(() => {
69
+ if (old === null) node.removeAttribute(attribute);
70
+ else node.setAttribute(attribute, old);
71
+ });
72
+ const old = node.getAttribute(attribute);
73
+ node.setAttribute(attribute, value);
74
+ }
75
+ }
76
+ for (const [property, value] of Object.entries(painters.paints[name]?.properties || {})) {
77
+ const old = instance.style.getPropertyValue(property);
78
+ undo.push(() => old ? instance.style.setProperty(property, old) : instance.style.removeProperty(property));
79
+ instance.style.setProperty(property, value);
80
+ }
81
+ }
82
+
83
+ function undoAdjustments(instance) {
84
+ const undo = instance._skinUndo;
85
+ while (undo?.length) undo.pop()();
86
+ }
87
+
88
+ // Adjustments to light-driven attributes were made with the light at rest. They
89
+ // become offsets so they move with the light instead of being overwritten.
90
+ function adjustNative(instance, skin, name) {
91
+ const { lightNative } = painters.native;
92
+ const { x, y } = skin.light;
93
+ lightNative(instance, REST_LIGHT.x, REST_LIGHT.y);
94
+ const resting = Object.entries(skin.nodes).map(([key, node]) => {
95
+ const attribute = key.slice(key.lastIndexOf('.') + 1);
96
+ return { key, node, attribute, value: parseFloat(node.getAttribute(attribute)) };
97
+ });
98
+ paintAdjustments(instance, name);
99
+ for (const { key, node, attribute, value } of resting) {
100
+ const adjusted = parseFloat(node.getAttribute(attribute));
101
+ if (Number.isFinite(adjusted) && Number.isFinite(value) && adjusted !== value) skin.offsets[key] = adjusted - value;
102
+ }
103
+ skin.shown = {};
104
+ lightNative(instance, x, y);
105
+ }
106
+
107
+ function adjustMaterial(instance, material, name) {
108
+ const records = painters.paints[name]?.paint || [];
109
+ const root = instance.shadowRoot;
110
+ const key = SKIN_CATALOG[name].material;
111
+ const offsets = [];
112
+ for (const lightKey of material.lightKeys || []) {
113
+ const [suffix, attribute] = lightKey.split(':');
114
+ const record = records.find(r => r.id === `material-${key}-${suffix}` && !r.path?.length);
115
+ const node = record && findPainted(root, record);
116
+ const value = record?.attributes[attribute];
117
+ if (node && value != null) offsets.push({ node, attribute, delta: parseFloat(value) - parseFloat(node.getAttribute(attribute)) });
118
+ }
119
+ paintAdjustments(instance, name);
120
+ const light = material.light.bind(material);
121
+ material.light = (x, y) => {
122
+ light(x, y);
123
+ for (const { node, attribute, delta } of offsets) node.setAttribute(attribute, parseFloat(node.getAttribute(attribute)) + delta);
124
+ };
125
+ }
126
+
127
+ function render(instance) {
128
+ const name = instance._skinName ?? null;
129
+ if (instance._skinShown === name || !instance._head) return;
130
+ const entry = name ? SKIN_CATALOG[name] : null;
131
+ const kind = entry ? (entry.native ? 'native' : 'material') : null;
132
+ if (kind && !painters[kind]) {
133
+ // Draw it once the painter arrives, unless another skin was chosen meanwhile.
134
+ if (instance._skinPending !== name) {
135
+ instance._skinPending = name;
136
+ loadPainter(kind).then(() => {
137
+ instance._skinPending = undefined;
138
+ if ((instance._skinName ?? null) === name) render(instance);
139
+ });
140
+ }
141
+ return;
142
+ }
143
+ const { showNative } = painters.native || {};
144
+ undoAdjustments(instance);
145
+ instance._material?.dispose();
146
+ instance._material = null;
147
+ if (!entry?.native) showNative?.(instance, null);
148
+ instance._skinShown = name;
149
+ // Without a skin the head takes the current color attribute again.
150
+ if (!entry) {
151
+ baseApplyColor.call(instance, instance.getAttribute('color'));
152
+ return;
153
+ }
154
+ if (entry.native) {
155
+ // Frames may stop as soon as love ends, so the joined heart is split here.
156
+ if (!instance._skinLoveEnd) {
157
+ instance._skinLoveEnd = event => {
158
+ if (event.detail?.state !== 'love') painters.native?.separateNativeEyes(instance);
159
+ };
160
+ instance.addEventListener('face-state', instance._skinLoveEnd);
161
+ }
162
+ const skin = showNative(instance, entry.native);
163
+ if (skin) {
164
+ const light = instance._skinLight;
165
+ if (light) { skin.light.x = light.x; skin.light.y = light.y; }
166
+ adjustNative(instance, skin, name);
167
+ }
168
+ } else {
169
+ // The lids cut the eyes through a mask, so the head paint shows behind them.
170
+ painters.maskEyelids(instance);
171
+ const material = painters.material.applyMaterial(instance, entry.material);
172
+ adjustMaterial(instance, material, name);
173
+ instance._material = material;
174
+ instance._materialLight = null;
175
+ }
176
+ }
177
+
178
+ // The light follows the pointer the same way the eyes do, and rests at the
179
+ // upper left when the pointer is away, following is off, or motion is reduced.
180
+ function updateLight(instance) {
181
+ const name = instance._skinShown;
182
+ if (!name) return;
183
+ const pointer = instance._pointer;
184
+ const reduced = instance._isReducedMotion?.();
185
+ const follows = instance._pointerFollowEnabled !== false && !reduced && pointer?.active && pointer.lastMove > 0;
186
+ const pull = follows ? Math.pow(clamp(pointer.influence || 0, 0, 1), .7) : 0;
187
+ // Pages can pin the light with _skinFixedLight = { x, y } in [-1, 1].
188
+ const fixed = instance._skinFixedLight;
189
+ const tx = fixed ? fixed.x : REST_LIGHT.x + (clamp(pointer?.x / 48, -1, 1) - REST_LIGHT.x) * pull;
190
+ const ty = fixed ? fixed.y : REST_LIGHT.y + (clamp(pointer?.y / 34, -1, 1) - REST_LIGHT.y) * pull;
191
+ const light = instance._skinLight ??= { ...REST_LIGHT };
192
+ if (reduced) {
193
+ light.x = tx;
194
+ light.y = ty;
195
+ } else {
196
+ light.x += ((Number.isFinite(tx) ? tx : REST_LIGHT.x) - light.x) * .18;
197
+ light.y += ((Number.isFinite(ty) ? ty : REST_LIGHT.y) - light.y) * .18;
198
+ }
199
+ if (SKIN_CATALOG[name].native) {
200
+ painters.native.joinNativeEyes(instance);
201
+ painters.native.lightNative(instance, light.x, light.y);
202
+ } else if (instance._material) {
203
+ const last = instance._materialLight;
204
+ if (last && Math.abs(last.x - light.x) < .0005 && Math.abs(last.y - light.y) < .0005) return;
205
+ instance._materialLight = { x: light.x, y: light.y };
206
+ instance._material.light(light.x, light.y);
207
+ }
208
+ }
209
+
210
+ // The runtime's attribute observer calls this when the skin attribute changes
211
+ // and once on connect. An unknown name in markup falls back to no skin with a
212
+ // console notice, so an invalid attribute never breaks the page; setSkin()
213
+ // throws instead.
214
+ proto._applySkinAttribute = function() {
215
+ const value = this.getAttribute('skin');
216
+ if (normalizeSkin(value) === undefined) {
217
+ console.warn(`agent-robot-avatar: unknown skin "${value}". Use a skin number such as ${SKIN_NAMES[0]}, or none.`);
218
+ this.setSkin(null);
219
+ } else {
220
+ this.setSkin(value);
221
+ }
222
+ };
223
+
224
+ proto.setSkin = function(value = null) {
225
+ const name = normalizeSkin(value);
226
+ if (name === undefined) throw new Error(`Unknown Agent Robot Avatar skin: ${value}`);
227
+ this._skinName = name;
228
+ render(this);
229
+ this._resumeFrames?.();
230
+ return this;
231
+ };
232
+
233
+ proto.getSkin = function() {
234
+ return this._skinName ?? null;
235
+ };
236
+
237
+ // A skin keeps the head paint even when the color attribute changes; removing
238
+ // the skin brings the color back.
239
+ proto._applyColor = function(value) {
240
+ baseApplyColor.call(this, value);
241
+ const entry = this._skinShown ? SKIN_CATALOG[this._skinShown] : null;
242
+ if (!entry || !this._head) return;
243
+ this._head.setAttribute('fill', entry.native ? 'url(#skin-base)' : `url(#material-${entry.material}-base)`);
244
+ };
245
+
246
+ registerAvatarExtension({
247
+ name: 'skins',
248
+ draw() {
249
+ // A skin set before the avatar was ready is shown on its first frame.
250
+ if ((this._skinName ?? null) !== (this._skinShown ?? null)) render(this);
251
+ updateLight(this);
252
+ },
253
+ });
254
+
255
+ export { AgentRobotAvatar, SKINS, SKIN_NAMES, SERIES as SKIN_SERIES, loadSkins };
256
+ export default AgentRobotAvatar;
@@ -1,3 +1,3 @@
1
- const VERSION = '0.6.0';
1
+ const VERSION = '0.7.0';
2
2
 
3
3
  export { VERSION };
@@ -0,0 +1,218 @@
1
+ // The public skin catalog. A skin's number is permanent: the series number
2
+ // followed by two digits, so 305 is the fifth skin of series 3. A new skin takes
3
+ // the next free number in its series; a removed skin's number is never reused.
4
+ // Titles may be reworded at any time, and the order in each series' list is the
5
+ // display order, independent of the numbers.
6
+ export const SKIN_SERIES = [
7
+ {"number": 1, "id": "glaze", "zh": "彩色玻璃", "en": "Glaze", "skins": ["101", "102", "103", "104", "105", "106"]},
8
+ {"number": 2, "id": "ice", "zh": "淡彩玻璃", "en": "Ice glass", "skins": ["201", "202", "203", "204", "205", "206"]},
9
+ {"number": 3, "id": "gummy", "zh": "软糖", "en": "Gummy", "skins": ["301", "302", "303", "304", "305", "306", "307", "308", "309", "310", "311", "312"]},
10
+ {"number": 4, "id": "candy", "zh": "糖果玻璃", "en": "Candy glass", "skins": ["401", "402", "403", "404", "405", "406"]},
11
+ {"number": 5, "id": "acrylic", "zh": "亚克力", "en": "Acrylic", "skins": ["501", "502", "503", "504", "505", "506", "507", "508", "509", "510", "511", "512"]},
12
+ {"number": 6, "id": "jelly", "zh": "果冻", "en": "Jelly", "skins": ["601", "602", "603", "604", "605", "606", "607", "608", "609", "610", "611", "612"]},
13
+ {"number": 7, "id": "gradient", "zh": "渐变", "en": "Gradient", "skins": ["701", "702", "703", "704", "705", "706", "707", "708", "709", "710", "711", "712"]},
14
+ {"number": 8, "id": "frosted", "zh": "磨砂玻璃系列", "en": "Frosted glass", "skins": ["801", "802", "803", "804", "805", "806"]},
15
+ {"number": 9, "id": "metal", "zh": "磨砂金属", "en": "Metal", "skins": ["901", "902", "903", "904", "905", "906", "907", "908", "909", "910", "911", "912", "913", "914", "915", "916", "917", "918", "919", "920", "921", "922", "923", "924", "925", "926", "927", "928", "929", "930"]},
16
+ {"number": 10, "id": "gem", "zh": "宝石与陶瓷", "en": "Gems and ceramics", "skins": ["1001", "1002", "1003", "1004", "1005", "1006", "1007", "1008", "1009", "1010", "1011", "1012"]},
17
+ {"number": 11, "id": "wood", "zh": "木系列", "en": "Wood", "skins": ["1101", "1102", "1103", "1104", "1105", "1106"]},
18
+ {"number": 12, "id": "ball", "zh": "球类", "en": "Balls", "skins": ["1201", "1202", "1203", "1204", "1205", "1206", "1207", "1208", "1209", "1210"]},
19
+ {"number": 13, "id": "gloss", "zh": "透明与流光", "en": "Clear and shimmer", "skins": ["1301", "1302", "1303", "1304", "1305"]},
20
+ {"number": 14, "id": "fabric", "zh": "织物与皮革", "en": "Fabric and leather", "skins": ["1401", "1402", "1403", "1404", "1405", "1406", "1407", "1408", "1409", "1410", "1411", "1412"]},
21
+ {"number": 15, "id": "food", "zh": "甜点与水果", "en": "Sweets and fruit", "skins": ["1501", "1502", "1503", "1504", "1505", "1506", "1507", "1508", "1509", "1510", "1511", "1512"]},
22
+ {"number": 16, "id": "nature", "zh": "自然", "en": "Nature", "skins": ["1601", "1602", "1603", "1604", "1605", "1606", "1607", "1608", "1609", "1610", "1611", "1612"]},
23
+ {"number": 17, "id": "pattern", "zh": "图案与科技", "en": "Patterns and tech", "skins": ["1701", "1702", "1703", "1704", "1705", "1706", "1707", "1708", "1709", "1710", "1711", "1712", "1713", "1714", "1715", "1716", "1717"]},
24
+ ];
25
+
26
+ // Numbers that were once published and must not be used again.
27
+ export const RETIRED_SKINS = [];
28
+
29
+ export const SKIN_CATALOG = {
30
+ '101': {"series":"glaze","zh":"曜石黑","en":"Glaze · Black","base":["#39434f","#39434f","#101923","#090d14"],"material":"blackglaze"},
31
+ '102': {"series":"glaze","zh":"湖蓝","en":"Glaze · Blue","base":["#58b7eb","#2c98e2","#2674da","#2939bf"],"material":"blueglaze"},
32
+ '103': {"series":"glaze","zh":"翡翠绿","en":"Glaze · Jade","base":["#40c49b","#40c49b","#12856c","#086953"],"material":"jadeglaze"},
33
+ '104': {"series":"glaze","zh":"莓果粉","en":"Glaze · Berry","base":["#ec77ac","#ec77ac","#c13b7b","#9e285f"],"material":"berryglaze"},
34
+ '105': {"series":"glaze","zh":"琥珀橙","en":"Glaze · Amber","base":["#f4b053","#f4b053","#db762b","#ae531b"],"material":"amberglaze"},
35
+ '106': {"series":"glaze","zh":"鸢尾紫","en":"Glaze · Iris","base":["#aa83ef","#aa83ef","#7846cf","#5831a8"],"material":"irisglaze"},
36
+ '201': {"series":"ice","zh":"冰透蓝","en":"Ice glass · Blue","base":["#d5e4f5","#bfd2e9","#a9c2de","#8ba9cb"],"material":"iceglaze"},
37
+ '202': {"series":"ice","zh":"冰透薄荷绿","en":"Ice glass · Mint","base":["#d7f0e5","#d7f0e5","#b3d8c9","#8bbcae"],"material":"mintice"},
38
+ '203': {"series":"ice","zh":"冰透樱花粉","en":"Ice glass · Blush","base":["#f5dfe9","#f5dfe9","#e2bed0","#c093ab"],"material":"blushice"},
39
+ '204': {"series":"ice","zh":"冰透香槟金","en":"Ice glass · Champagne","base":["#f4e9d2","#f4e9d2","#e0cda8","#c2ac81"],"material":"champagneice"},
40
+ '205': {"series":"ice","zh":"冰透薰衣紫","en":"Ice glass · Lavender","base":["#e8e1f6","#e8e1f6","#cec1e8","#a89ac9"],"material":"lavenderice"},
41
+ '206': {"series":"ice","zh":"冰透霜白","en":"Ice glass · White","base":["#f6fbff","#f6fbff","#dce8ef","#c0cdd6"],"material":"whiteice"},
42
+ '301': {"series":"gummy","zh":"软糖 · 蓝","en":"Gummy · Blue","base":["#90b9fe","#619bff","#4287ff","#5295ff"],"native":"glow-blue"},
43
+ '302': {"series":"gummy","zh":"软糖 · 红","en":"Gummy · Red","base":["#fe9590","#ff6961","#ff4c42","#ff5752"],"native":"glow-red"},
44
+ '303': {"series":"gummy","zh":"软糖 · 嫩绿","en":"Gummy · Lime","base":["#b9ff94","#92ec55","#72d232","#57c200"],"native":"custom-1793262923292"},
45
+ '304': {"series":"gummy","zh":"软糖 · 紫","en":"Gummy · Purple","base":["#ca90fe","#b561ff","#a742ff","#ab52ff"],"native":"glow-purple"},
46
+ '305': {"series":"gummy","zh":"软糖 · 粉","en":"Gummy · Pink","base":["#fe90c8","#ff61b0","#ff42a0","#ff52ac"],"native":"glow-pink"},
47
+ '306': {"series":"gummy","zh":"软糖 · 橙","en":"Gummy · Orange","base":["#febb89","#ffa159","#ff8f39","#ff9449"],"native":"glow-orange"},
48
+ '307': {"series":"gummy","zh":"软糖 · 淡蓝","en":"Gummy · Light Blue","base":["#90d4fe","#80d9ff","#4dc9ff","#38a9ff"],"native":"custom-1793262553386"},
49
+ '308': {"series":"gummy","zh":"软糖 · 灰","en":"Gummy · Gray","base":["#b9cad4","#9bb8c5","#8198a2","#8a959e"],"native":"custom-1793262790531"},
50
+ '309': {"series":"gummy","zh":"软糖 · 粉红","en":"Gummy · Rose","base":["#ff94fb","#ff1f1f","#fe5881","#c20000"],"native":"custom-1793263007260"},
51
+ '310': {"series":"gummy","zh":"软糖 · 蓝绿","en":"Gummy · Teal","base":["#47c8ff","#27ecbb","#30cfb4","#0f4bff"],"native":"custom-1793263221394"},
52
+ '311': {"series":"gummy","zh":"软糖 · 黄","en":"Gummy · Yellow","base":["#ffe014","#ffd642","#ffbd2e","#ffd35c"],"native":"custom-1793263313834"},
53
+ '312': {"series":"gummy","zh":"软糖 · 绿","en":"Gummy · Green","base":["#90d89e","#61c876","#42bd5b","#52c267"],"native":"glow-green"},
54
+ '401': {"series":"candy","zh":"糖果蓝","en":"Candy glass · Blue","base":["#2e7bff","#337aff","#0056f5","#023bca"],"native":"gem-blue"},
55
+ '402': {"series":"candy","zh":"糖果红","en":"Candy glass · Red","base":["#ff312e","#ff3a33","#f50700","#ca1502"],"native":"gem-red"},
56
+ '403': {"series":"candy","zh":"糖果绿","en":"Candy glass · Green","base":["#14ce29","#15d42e","#0f9620","#0d7621"],"native":"gem-green"},
57
+ '404': {"series":"candy","zh":"糖果紫","en":"Candy glass · Purple","base":["#992eff","#a033ff","#8200f5","#7902ca"],"native":"gem-purple"},
58
+ '405': {"series":"candy","zh":"糖果粉红","en":"Candy glass · Pink","base":["#ff2e94","#ff3392","#f50073","#ca0253"],"native":"gem-pink"},
59
+ '406': {"series":"candy","zh":"糖果橙","en":"Candy glass · Orange","base":["#ff7f25","#ff862a","#eb6500","#c16102"],"native":"gem-orange"},
60
+ '501': {"series":"acrylic","zh":"亮光蓝","en":"Acrylic · Gloss Blue","base":["#5a9dff","#2f7cf6","#286fea","#1c5ed8"],"native":"gleam-blue"},
61
+ '502': {"series":"acrylic","zh":"亮光红","en":"Acrylic · Gloss Red","base":["#ff5c5a","#f6362f","#ea3328","#d8291c"],"native":"gleam-red"},
62
+ '503': {"series":"acrylic","zh":"亮光绿","en":"Acrylic · Gloss Green","base":["#2cea41","#1bbf31","#20a434","#1e8630"],"native":"gleam-green"},
63
+ '504': {"series":"acrylic","zh":"亮光黄","en":"Acrylic · Gloss Yellow","base":["#ffe35a","#f6d82f","#ead128","#d8c31c"],"native":"gleam-yellow"},
64
+ '505': {"series":"acrylic","zh":"亮光紫","en":"Acrylic · Gloss Purple","base":["#af5aff","#992ff6","#9428ea","#871cd8"],"native":"gleam-purple"},
65
+ '506': {"series":"acrylic","zh":"亮光粉","en":"Acrylic · Gloss Pink","base":["#ff5ab0","#f62f92","#ea2885","#d81c73"],"native":"gleam-pink"},
66
+ '507': {"series":"acrylic","zh":"清透蓝","en":"Acrylic · Clear Blue","base":["#75acff","#428eff","#337aff","#001442"],"native":"clear-blue"},
67
+ '508': {"series":"acrylic","zh":"清透红","en":"Acrylic · Clear Red","base":["#ff7a75","#ff4842","#ff4533","#420900"],"native":"clear-red"},
68
+ '509': {"series":"acrylic","zh":"清透绿","en":"Acrylic · Clear Green","base":["#48ed5f","#16e332","#15d439","#010d04"],"native":"clear-green"},
69
+ '510': {"series":"acrylic","zh":"清透紫","en":"Acrylic · Clear Purple","base":["#bf75ff","#a742ff","#ab33ff","#2a0042"],"native":"clear-purple"},
70
+ '511': {"series":"acrylic","zh":"清透粉红","en":"Acrylic · Clear Pink","base":["#ff75b5","#ff429a","#ff3387","#420018"],"native":"clear-pink"},
71
+ '512': {"series":"acrylic","zh":"清透橙","en":"Acrylic · Clear Orange","base":["#ffad6d","#ff8f39","#ff922a","#3c2000"],"native":"clear-orange"},
72
+ '601': {"series":"jelly","zh":"果冻蓝","en":"Jelly · Blue","base":["#3cabec","#2a67d0","#1e3cb4","#12228a"],"native":"slab-blue"},
73
+ '602': {"series":"jelly","zh":"果冻红","en":"Jelly · Red","base":["#ec3c64","#d0302a","#b43c1e","#8a3212"],"native":"slab-red"},
74
+ '603': {"series":"jelly","zh":"果冻绿","en":"Jelly · Green","base":["#a6ec3c","#62d02a","#38b41e","#1e8a12"],"native":"slab-green"},
75
+ '604': {"series":"jelly","zh":"果冻紫","en":"Jelly · Purple","base":["#6b3cec","#832ad0","#871eb4","#6e128a"],"native":"slab-purple"},
76
+ '605': {"series":"jelly","zh":"果冻粉","en":"Jelly · Pink","base":["#ec3cc3","#d02a7d","#b41e50","#8a1232"],"native":"slab-pink"},
77
+ '606': {"series":"jelly","zh":"果冻橙","en":"Jelly · Orange","base":["#f1856f","#de9259","#dc962e","#b68218"],"native":"slab-orange"},
78
+ '607': {"series":"jelly","zh":"渐变靛","en":"Jelly · Prism Indigo","base":["#3f81f0","#4034c9","#bb30e8","#ff1f8b"],"native":"prism-indigo"},
79
+ '608': {"series":"jelly","zh":"渐变红","en":"Jelly · Prism Red","base":["#f03f8a","#c93934","#e8b230","#97ff1f"],"native":"prism-red"},
80
+ '609': {"series":"jelly","zh":"渐变青柠","en":"Jelly · Prism Lime","base":["#cfe537","#6ab237","#29dc57","#18eff3"],"native":"prism-lime"},
81
+ '610': {"series":"jelly","zh":"渐变玫红","en":"Jelly · Prism Rose","base":["#f03fbc","#c93459","#e87e30","#d6ff1f"],"native":"prism-rose"},
82
+ '611': {"series":"jelly","zh":"渐变天蓝","en":"Jelly · Prism Sky","base":["#3ff0da","#3497c9","#3130e8","#cb1fff"],"native":"prism-sky"},
83
+ '612': {"series":"jelly","zh":"渐变紫","en":"Jelly · Prism Purple","base":["#9a3ff0","#c534c9","#e83071","#ff7a1f"],"native":"prism-purple"},
84
+ '701': {"series":"gradient","zh":"海洋","en":"Gradient · Ocean","base":["#7ff0e4","#3cc3e0","#2b7fd4","#3b3fb0"],"native":"ocean"},
85
+ '702': {"series":"gradient","zh":"森林","en":"Gradient · Forest","base":["#d9f99d","#7bd389","#2f9e7a","#1e5f6b"],"native":"forest"},
86
+ '703': {"series":"gradient","zh":"渐变 · 黄","en":"Gradient · Yellow","base":["#f0bf7f","#e0c73c","#b6d42b","#65b03b"],"native":"gradient-yellow"},
87
+ '704': {"series":"gradient","zh":"渐变 · 紫","en":"Gradient · Purple","base":["#a29aeb","#c592f1","#eb95cf","#e7c49b"],"native":"gradient-purple"},
88
+ '705': {"series":"gradient","zh":"糖果","en":"Gradient · Candy","base":["#ffe1f0","#ff9cc8","#b18cff","#7fd4ff"],"native":"candy"},
89
+ '706': {"series":"gradient","zh":"流光","en":"Gradient · Aurora","base":["#9aebea","#92c9f1","#a795eb","#e79bc7"],"native":"aurora"},
90
+ '707': {"series":"gradient","zh":"珍珠","en":"Gradient · Pearl","base":["#ffffff","#eaf2ff","#f4e9ff","#e2f6ee"],"native":"pearl"},
91
+ '708': {"series":"gradient","zh":"樱花","en":"Gradient · Sakura","base":["#ffffff","#fdeaf0","#f3c7d4","#d697ab"],"native":"sakura"},
92
+ '709': {"series":"gradient","zh":"薰衣草","en":"Gradient · Lavender","base":["#ffffff","#ece6ff","#cbbcf2","#9c88d6"],"native":"lavender"},
93
+ '710': {"series":"gradient","zh":"柠檬","en":"Gradient · Lemon","base":["#fffef0","#fff2a8","#f5d757","#c9a21d"],"native":"lemon"},
94
+ '711': {"series":"gradient","zh":"天空","en":"Gradient · Sky","base":["#ffffff","#dff1ff","#a9d6f7","#5ea4d8"],"native":"sky"},
95
+ '712': {"series":"gradient","zh":"薄荷","en":"Gradient · Mint","base":["#f5fffb","#cdf3e5","#93dcc3","#52ad90"],"native":"mint"},
96
+ '801': {"series":"frosted","zh":"雾白透银","en":"Frosted glass · Mist","base":["#ffffff","#eff5f7","#d8e4ea","#b3c5d0"],"material":"clearwhite"},
97
+ '802': {"series":"frosted","zh":"透光液态银","en":"Frosted glass · Silver","base":["#fcfaf6","#d3dbdf","#98a6ae","#66767f"],"material":"clearsilver"},
98
+ '803': {"series":"frosted","zh":"厚底透银","en":"Frosted glass · Weighted","base":["#fcfaf6","#d3dbdf","#98a6ae","#66767f"],"material":"clearweighted"},
99
+ '804': {"series":"frosted","zh":"硬光透银","en":"Frosted glass · Hard Light","base":["#fcfaf6","#d3dbdf","#98a6ae","#66767f"],"material":"clearhard"},
100
+ '805': {"series":"frosted","zh":"烟灰透银","en":"Frosted glass · Smoke","base":["#dce5e9","#abbac3","#778e9d","#485f70"],"material":"clearsmoke"},
101
+ '806': {"series":"frosted","zh":"墨灰透银","en":"Frosted glass · Ink","base":["#bacbd6","#7e97a8","#4b687e","#2a4257"],"material":"clearink"},
102
+ '901': {"series":"metal","zh":"液态金","en":"Metal · Liquid Gold","base":["#fcfbf6","#f0e4c5","#dcc37d","#c69f35"],"material":"golddrop"},
103
+ '902': {"series":"metal","zh":"钛金","en":"Metal · Titanium Gold","base":["#f6e1b8","#d4a446","#a57009","#704a00"],"material":"deepmetalgold"},
104
+ '903': {"series":"metal","zh":"深玫瑰金","en":"Metal · Deep Rose Gold","base":["#fcdcd9","#e19991","#b3645b","#833f38"],"material":"deepmetalrose"},
105
+ '904': {"series":"metal","zh":"深铜","en":"Metal · Deep Copper","base":["#f0ded4","#d29c7e","#ac663d","#734428"],"material":"copperdeep"},
106
+ '905': {"series":"metal","zh":"红铜","en":"Metal · Red Copper","base":["#ffddc9","#ec9969","#c0652f","#8d4012"],"material":"deepmetalcopper"},
107
+ '906': {"series":"metal","zh":"星宇橙","en":"Metal · Cosmic Orange","base":["#ffdecc","#ff9962","#e3611c","#ae3d01"],"material":"iphonecosmicorange"},
108
+ '907': {"series":"metal","zh":"青铜","en":"Metal · Bronze","base":["#e8e5bc","#b5ac51","#827a14","#585100"],"material":"deepmetalbronze"},
109
+ '908': {"series":"metal","zh":"黑钛","en":"Metal · Black Titanium","base":["#dbe4ee","#97aac2","#627791","#3d4f66"],"material":"deepmetaltitanium"},
110
+ '909': {"series":"metal","zh":"铂金白","en":"Metal · Platinum White","base":["#eff0f2","#cacdd2","#a5aab0","#848990"],"material":"deepmetalplatinum"},
111
+ '910': {"series":"metal","zh":"浅香槟","en":"Metal · Champagne","base":["#f1eadc","#cebb97","#a78f61","#816a3c"],"material":"deepmetalchampagne"},
112
+ '911': {"series":"metal","zh":"冰蓝钛","en":"Metal · Ice Blue","base":["#d4ecf8","#86bfdc","#4d92b6","#2a6b8d"],"material":"deepmetaliceblue"},
113
+ '912': {"series":"metal","zh":"群青","en":"Metal · Ultramarine","base":["#dae0ff","#8ea0ff","#576bd6","#34459c"],"material":"iphoneultramarine"},
114
+ '913': {"series":"metal","zh":"紫钛","en":"Metal · Violet","base":["#efd8ff","#ce88ff","#9e4fd5","#6c2e98"],"material":"deepmetalviolet"},
115
+ '914': {"series":"metal","zh":"勃艮第酒红","en":"Metal · Burgundy","base":["#fbbfd3","#be5f7e","#702b42","#38131f"],"material":"iphoneburgundy"},
116
+ '915': {"series":"metal","zh":"深青","en":"Metal · Teal","base":["#cdeae9","#76bab7","#3d8986","#1d605e"],"material":"iphoneteal"},
117
+ '916': {"series":"metal","zh":"深墨绿","en":"Metal · Forest","base":["#bad4ca","#588272","#26453a","#10221b"],"material":"deepmetalforest"},
118
+ '917': {"series":"metal","zh":"原色钛","en":"Metal · Natural Titanium","base":["#eceae7","#c1bcb4","#969085","#716b60"],"material":"iphonenatural"},
119
+ '918': {"series":"metal","zh":"暗紫","en":"Metal · Deep Purple","base":["#d7ccdc","#86748f","#4a3c50","#251d28"],"material":"iphonedeepurple"},
120
+ '919': {"series":"metal","zh":"浅粉","en":"Metal · Pink","base":["#f8eff1","#e5ccd1","#cda8b0","#b28890"],"material":"iphonepink"},
121
+ '920': {"series":"metal","zh":"鼠尾草绿","en":"Metal · Sage","base":["#e8ece4","#b8c2ac","#8b987b","#667357"],"material":"iphonesage"},
122
+ '921': {"series":"metal","zh":"薰衣草紫","en":"Metal · Lavender","base":["#eeebf6","#c8bfdb","#a095ba","#7d7198"],"material":"iphonelavender"},
123
+ '922': {"series":"metal","zh":"铂金银","en":"Metal · Platinum","base":["#bcc0c4","#7e868e","#5b6269","#44494e"],"material":"satinplatinum"},
124
+ '923': {"series":"metal","zh":"玫瑰金","en":"Metal · Rose Gold","base":["#d5aca1","#ac604d","#774235","#512d24"],"material":"satinrose"},
125
+ '924': {"series":"metal","zh":"暖红铜","en":"Metal · Warm Copper","base":["#dba483","#a65c30","#6a3a1f","#412413"],"material":"satinredcopper"},
126
+ '925': {"series":"metal","zh":"暖青铜","en":"Metal · Warm Bronze","base":["#c6b680","#7f6f39","#4d4322","#2d2714"],"material":"satinbronze"},
127
+ '926': {"series":"metal","zh":"枪灰钛","en":"Metal · Gunmetal","base":["#7a8a9b","#353e46","#1a1e22","#0c0e10"],"material":"satingunmetal"},
128
+ '927': {"series":"metal","zh":"亮银","en":"Metal · Bright Silver","base":["#ffffff","#f0f3f3","#d5dee2","#a5b5bf"],"material":"silverbright"},
129
+ '928': {"series":"metal","zh":"液态银","en":"Metal · Liquid Silver","base":["#fcfaf6","#d5dde0","#a3afb6","#71818a"],"material":"silverdrop"},
130
+ '929': {"series":"metal","zh":"深银","en":"Metal · Deep Silver","base":["#dce4e8","#9baab4","#657784","#3d505e"],"material":"silverdeep"},
131
+ '930': {"series":"metal","zh":"石墨银","en":"Metal · Graphite","base":["#aabac5","#647987","#3b505f","#213440"],"material":"silvergraphite"},
132
+ '1001': {"series":"gem","zh":"黑曜石","en":"Gems · Obsidian","base":["#7b8796","#313a47","#101722","#05080e"],"native":"obsidian"},
133
+ '1002': {"series":"gem","zh":"午夜蓝","en":"Gems · Midnight","base":["#7f98d4","#2c4381","#111e4a","#060b22"],"native":"midnight"},
134
+ '1003': {"series":"gem","zh":"墨玉","en":"Gems · Jade","base":["#7fb5a3","#2f6d5b","#123e33","#06201a"],"native":"jade"},
135
+ '1004': {"series":"gem","zh":"琥珀","en":"Gems · Amber","base":["#ffe2a6","#f2a73c","#c46812","#6b3005"],"native":"amber"},
136
+ '1005': {"series":"gem","zh":"红宝石","en":"Gems · Ruby","base":["#ff8a9a","#d0243f","#7a0d22","#3a0410"],"native":"ruby"},
137
+ '1006': {"series":"gem","zh":"蓝宝石","en":"Gems · Sapphire","base":["#8fc0ff","#2a6fd6","#103f8c","#071d44"],"native":"sapphire"},
138
+ '1007': {"series":"gem","zh":"祖母绿","en":"Gems · Emerald","base":["#8ff0c0","#1fae74","#0b6a45","#033321"],"native":"emerald"},
139
+ '1008': {"series":"gem","zh":"曜石釉","en":"Gems · Obsidian","base":["#7b8796","#313a47","#101722","#05080e"],"material":"obsidian"},
140
+ '1009': {"series":"gem","zh":"白瓷","en":"Gems · Porcelain","base":["#ffffff","#f5f4ec","#d9dad3","#a3aaab"],"material":"porcelain"},
141
+ '1010': {"series":"gem","zh":"磨砂陶土","en":"Gems · Clay","base":["#e6b59a","#d9997d","#c58065","#ad674e"],"material":"clay"},
142
+ '1011': {"series":"gem","zh":"彩色水磨石","en":"Gems · Terrazzo","base":["#fff9ed","#f1e7d7","#e1d3c1","#cab9a8"],"material":"terrazzo"},
143
+ '1012': {"series":"gem","zh":"青花小瓷","en":"Gems · Blue Floral","base":["#fffaf0","#eee5d3","#d5c5aa","#b5a58b"],"material":"ceramicblue"},
144
+ '1101': {"series":"wood","zh":"浅枫木","en":"Wood · Maple","base":["#f7e8ca","#e4c999","#c9a575","#a87d50"],"material":"woodmaple"},
145
+ '1102': {"series":"wood","zh":"暖橡木","en":"Wood · Oak","base":["#efd3a0","#cea065","#ad7844","#82532e"],"material":"woodoak"},
146
+ '1103': {"series":"wood","zh":"深胡桃木","en":"Wood · Walnut","base":["#b58d67","#865b3c","#5e3b28","#38251c"],"material":"woodwalnut"},
147
+ '1104': {"series":"wood","zh":"红木","en":"Wood · Rosewood","base":["#cf9376","#a65d42","#773d2c","#48251e"],"material":"woodrose"},
148
+ '1105': {"series":"wood","zh":"黑檀木","en":"Wood · Ebony","base":["#696052","#42382d","#2a221c","#171411"],"material":"woodebony"},
149
+ '1106': {"series":"wood","zh":"软木积木","en":"Wood · Cork","base":["#e8cb99","#cfad76","#b99159","#9c7646"],"material":"cork"},
150
+ '1201': {"series":"ball","zh":"足球 · 沟槽","en":"Balls · Soccer","base":["#4a4d55","#24262b","#131417","#060607"],"native":"soccer-grooves"},
151
+ '1202': {"series":"ball","zh":"橘子篮球","en":"Balls · Orange Basketball","base":["#ffbd63","#ed8836","#d26320","#93421c"],"material":"basketball"},
152
+ '1203': {"series":"ball","zh":"篮球","en":"Balls · Basketball","base":["#ffb066","#f07a1e","#c95a0e","#7a3305"],"native":"basketball"},
153
+ '1204': {"series":"ball","zh":"橄榄球","en":"Balls · Football","base":["#c07a4a","#8f4a22","#6a3112","#3a1606"],"native":"football"},
154
+ '1205': {"series":"ball","zh":"网球","en":"Balls · Tennis","base":["#f4ff8a","#d7f43a","#aacb10","#66800a"],"native":"tennis"},
155
+ '1206': {"series":"ball","zh":"棒球","en":"Balls · Baseball","base":["#fffdf7","#f6f1e6","#e2d9c7","#b5a98f"],"native":"baseball"},
156
+ '1207': {"series":"ball","zh":"经典棒球","en":"Balls · Classic Baseball","base":["#fffdf4","#f3eee0","#e2dccb","#bfb7a4"],"material":"baseball"},
157
+ '1208': {"series":"ball","zh":"垒球","en":"Balls · Softball","base":["#fbff9a","#eef55a","#cfd61f","#8a8f0a"],"native":"softball"},
158
+ '1209': {"series":"ball","zh":"板球","en":"Balls · Cricket","base":["#e05a4f","#b52a22","#851812","#470806"],"native":"cricket"},
159
+ '1210': {"series":"ball","zh":"高尔夫","en":"Balls · Golf","base":["#ffffff","#f6f6f4","#e2e2de","#acaca6"],"native":"golf"},
160
+ '1301': {"series":"gloss","zh":"流光彩色","en":"Clear · Aurora","base":["#9aebea","#92c9f1","#a795eb","#e79bc7"],"material":"aurora"},
161
+ '1302': {"series":"gloss","zh":"贝壳珍珠","en":"Clear · Nacre","base":["#fff8eb","#ecd8e6","#c6ddd8","#b5afcf"],"material":"pearl"},
162
+ '1303': {"series":"gloss","zh":"镭射糖纸","en":"Clear · Hologram","base":["#88e9df","#c5b6f5","#f6b8d0","#f5ebad","#9adce0"],"material":"hologram"},
163
+ '1304': {"series":"gloss","zh":"冰川水晶","en":"Clear · Glacier","base":["#f0ffff","#b6e9f2","#71b9d4","#437baf"],"material":"ice"},
164
+ '1305': {"series":"gloss","zh":"彩虹泡泡","en":"Clear · Bubble","base":["#f9eafa","#bfe6ed","#ded1f0","#bad9e6"],"material":"soap"},
165
+ '1401': {"series":"fabric","zh":"复古牛仔","en":"Fabric · Denim","base":["#698ba3","#456d8b","#315775","#244460"],"material":"denim"},
166
+ '1402': {"series":"fabric","zh":"焦糖皮革","en":"Fabric · Leather","base":["#c79665","#ab784c","#8f5d38","#6a432b"],"material":"leather"},
167
+ '1403': {"series":"fabric","zh":"莓果毛衣","en":"Fabric · Knit","base":["#d5a4b6","#b5809b","#925d7c","#70465f"],"material":"knit"},
168
+ '1404': {"series":"fabric","zh":"午夜蕾丝","en":"Fabric · Lace","base":["#4d526f","#353a57","#252b46","#1c2138"],"material":"lace"},
169
+ '1405': {"series":"fabric","zh":"苏格兰格纹","en":"Fabric · Tartan","base":["#ffbcc7","#ef899e","#d86383","#b34364"],"material":"tartan"},
170
+ '1406': {"series":"fabric","zh":"菱格背心","en":"Fabric · Argyle","base":["#e4d6ef","#bcabd5","#9a88bc","#776397"],"material":"argyle"},
171
+ '1407': {"series":"fabric","zh":"靛蓝刺子绣","en":"Fabric · Sashiko","base":["#546b8b","#394f71","#273b5b","#1a2a43"],"material":"sashiko"},
172
+ '1408': {"series":"fabric","zh":"拼布小被","en":"Fabric · Patchwork","base":["#ffe7db","#f3bfb9","#df969f","#bd738c"],"material":"quilt"},
173
+ '1409': {"series":"fabric","zh":"灯芯绒衣","en":"Fabric · Corduroy","base":["#ffd5a0","#f5b267","#de8941","#b5672d"],"material":"corduroy"},
174
+ '1410': {"series":"fabric","zh":"亚麻布袋","en":"Fabric · Linen","base":["#fffaf0","#eee5d3","#d5c5aa","#b5a58b"],"material":"linen"},
175
+ '1411': {"series":"fabric","zh":"苏格兰格","en":"Fabric · Plaid","base":["#d04848","#a82d30","#7d1c20","#4a0e12"],"native":"tartan"},
176
+ '1412': {"series":"fabric","zh":"竹编小篮","en":"Fabric · Bamboo","base":["#e7d49b","#ceb574","#b79b5b","#937a40"],"material":"bamboo"},
177
+ '1501': {"series":"food","zh":"糖果条纹","en":"Sweets · Candy Stripe","base":["#ffd5df","#f4a2bf","#e782a7","#c85d89"],"material":"candy"},
178
+ '1502': {"series":"food","zh":"奶牛软糖","en":"Sweets · Milk Candy","base":["#fffdf5","#f4f0e6","#deded5","#bfc8c6"],"material":"cow"},
179
+ '1503': {"series":"food","zh":"西瓜汽水","en":"Sweets · Watermelon","base":["#ffb5ad","#f68d8f","#e9747f","#cc5267"],"material":"watermelon"},
180
+ '1504': {"series":"food","zh":"草莓奶冻","en":"Sweets · Strawberry","base":["#ffbcc7","#ef899e","#d86383","#b34364"],"material":"strawberry"},
181
+ '1505': {"series":"food","zh":"奇异果切片","en":"Sweets · Kiwi","base":["#e2efb0","#bdd574","#94b94e","#627f35"],"material":"kiwi"},
182
+ '1506': {"series":"food","zh":"柠檬切片","en":"Sweets · Lemon","base":["#fff3ac","#f6d657","#eab62c","#c58c22"],"material":"lemon"},
183
+ '1507': {"series":"food","zh":"橘皮软糖","en":"Sweets · Orange Peel","base":["#ffd5a0","#f5b267","#de8941","#b5672d"],"material":"orangepeel"},
184
+ '1508': {"series":"food","zh":"火龙果点点","en":"Sweets · Dragon Fruit","base":["#fffefa","#f6f4ec","#e6e4df","#c4cccb"],"material":"dragonfruit"},
185
+ '1509': {"series":"food","zh":"巧克力方砖","en":"Sweets · Chocolate","base":["#b38a69","#8a6046","#6a4334","#493027"],"material":"chocolate"},
186
+ '1510': {"series":"food","zh":"蜂格华夫","en":"Sweets · Waffle","base":["#ffd5a0","#f5b267","#de8941","#b5672d"],"material":"waffle"},
187
+ '1511': {"series":"food","zh":"曲奇碎碎","en":"Sweets · Cookie","base":["#fff2a4","#efcf61","#d9a438","#b97b25"],"material":"cookie"},
188
+ '1512': {"series":"food","zh":"糖针甜甜圈","en":"Sweets · Sprinkles","base":["#ffbcc7","#ef899e","#d86383","#b34364"],"material":"donut"},
189
+ '1601': {"series":"nature","zh":"大理石","en":"Nature · Marble","base":["#ffffff","#f6f6f4","#e6e6e2","#bcbcb6"],"native":"marble"},
190
+ '1602': {"series":"nature","zh":"黑金大理石","en":"Nature · Black Marble","base":["#4a4a4f","#25252a","#141417","#050506"],"native":"black-marble"},
191
+ '1603': {"series":"nature","zh":"树叶","en":"Nature · Leaves","base":["#f0fbe6","#cfeeb2","#97d37b","#4f9a45"],"native":"leaves"},
192
+ '1604': {"series":"nature","zh":"樱瓣","en":"Nature · Blossoms","base":["#fffafd","#ffeaf2","#ffd0e0","#f0a3c0"],"native":"blossoms"},
193
+ '1605': {"series":"nature","zh":"仙人掌球","en":"Nature · Cactus","base":["#d4e6a0","#a9c568","#7f9d47","#597538"],"material":"cactus"},
194
+ '1606': {"series":"nature","zh":"口袋星空","en":"Nature · Galaxy","base":["#6545ad","#45277f","#193b70","#101b3a"],"material":"galaxy"},
195
+ '1607': {"series":"nature","zh":"青芽绒绒","en":"Nature · Sprout","base":["#d1ef9b","#96c953","#6ba737","#3e6e29"],"material":"matcharib"},
196
+ '1608': {"series":"nature","zh":"云朵棉花","en":"Nature · Clouds","base":["#b5e0f2","#86bfe0","#5f9bc9","#3e73a4"],"material":"cloud"},
197
+ '1609': {"series":"nature","zh":"青海波纹","en":"Nature · Waves","base":["#5b7fa5","#3f648e","#2b4c77","#20395d"],"material":"wave"},
198
+ '1610': {"series":"nature","zh":"雨窗水滴","en":"Nature · Raindrops","base":["#dbd9d0","#b9bbb4","#919a97","#6b7b7c"],"material":"raindrop"},
199
+ '1611': {"series":"nature","zh":"雪花毛毯","en":"Nature · Snowflakes","base":["#546b8b","#394f71","#273b5b","#1a2a43"],"material":"snowflake"},
200
+ '1612': {"series":"nature","zh":"霓虹","en":"Nature · Neon","base":["#5b3df5","#2a1673","#120a3a","#06041a"],"native":"neon"},
201
+ '1701': {"series":"pattern","zh":"奶油波点","en":"Patterns · Cream Dots","base":["#af9beb","#8c72d9","#7860c4","#5a469e"],"material":"polka"},
202
+ '1702': {"series":"pattern","zh":"碳纤维","en":"Patterns · Carbon","base":["#4a5557","#2c3639","#1b2428","#10191e"],"material":"carbon"},
203
+ '1703': {"series":"pattern","zh":"工程蓝图","en":"Patterns · Blueprint","base":["#6a9ed4","#477ebc","#2d609f","#244a85"],"material":"blueprint"},
204
+ '1704': {"series":"pattern","zh":"折纸山谷","en":"Patterns · Origami","base":["#f5e5d3","#e6c7b0","#b9c7c1","#a0a8bb"],"material":"origami"},
205
+ '1705': {"series":"pattern","zh":"电路精灵","en":"Patterns · Circuit","base":["#3c6c61","#235347","#163b34","#102b29"],"material":"circuit"},
206
+ '1706': {"series":"pattern","zh":"森林迷彩","en":"Patterns · Camo","base":["#b0b594","#8e9e75","#71835e","#4c6247"],"material":"camo"},
207
+ '1707': {"series":"pattern","zh":"等高线地图","en":"Patterns · Topo","base":["#7dbbb6","#519a98","#347b80","#235d68"],"material":"topo"},
208
+ '1708': {"series":"pattern","zh":"金线扇影","en":"Patterns · Art Deco","base":["#546b8b","#394f71","#273b5b","#1a2a43"],"material":"artdeco"},
209
+ '1709': {"series":"pattern","zh":"孟菲斯派对","en":"Patterns · Memphis","base":["#e4d6ef","#bcabd5","#9a88bc","#776397"],"material":"memphis"},
210
+ '1710': {"series":"pattern","zh":"彩色人字纹","en":"Patterns · Chevron","base":["#f3e8cd","#e4d5b3","#c8b48f","#9e8e70"],"material":"chevron"},
211
+ '1711': {"series":"pattern","zh":"六角装甲","en":"Patterns · Hex Armor","base":["#dbd9d0","#b9bbb4","#919a97","#6b7b7c"],"material":"hexbolt"},
212
+ '1712': {"series":"pattern","zh":"铆钉机甲","en":"Patterns · Rivets","base":["#546b8b","#394f71","#273b5b","#1a2a43"],"material":"rivet"},
213
+ '1713': {"series":"pattern","zh":"波点","en":"Patterns · Polka","base":["#ff9db2","#ff5d84","#e03a64","#9b1c3e"],"native":"polka"},
214
+ '1714': {"series":"pattern","zh":"彩纸","en":"Patterns · Confetti","base":["#ffffff","#fbfaf7","#efece6","#c9c4bb"],"native":"confetti"},
215
+ '1715': {"series":"pattern","zh":"网点","en":"Patterns · Halftone","base":["#ffe6ee","#ffb3c7","#ff7aa0","#d6406c"],"native":"halftone"},
216
+ '1716': {"series":"pattern","zh":"水磨石","en":"Patterns · Terrazzo","base":["#ffffff","#fbfaf7","#efece6","#c9c4bb"],"native":"terrazzo"},
217
+ '1717': {"series":"pattern","zh":"像素","en":"Patterns · Pixel","base":["#3a3a4a","#24242f","#16161d","#0a0a10"],"native":"pixel"},
218
+ };