@instruments/taxonomy 0.1.0 → 0.3.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.
- package/README.md +62 -31
- package/dist/chunk-4ECRPD2I.js +7508 -0
- package/dist/chunk-CTKOLWGS.js +23 -0
- package/dist/chunk-FCMCKNQF.js +103 -0
- package/dist/chunk-WIRA24HM.js +42 -0
- package/dist/crosswalks/designshop.d.ts +33 -0
- package/dist/crosswalks/designshop.js +363 -0
- package/dist/crosswalks/materialgraph.d.ts +41 -0
- package/dist/crosswalks/materialgraph.js +178 -0
- package/dist/crosswalks/miu.d.ts +3 -0
- package/dist/crosswalks/miu.js +9 -3
- package/dist/estate/index.d.ts +233 -0
- package/dist/estate/index.js +1808 -0
- package/dist/index.d.ts +282 -10
- package/dist/index.js +168 -143
- package/dist/mapping-pvHk5VjC.d.ts +31 -0
- package/dist/match-CWzTEuL-.d.ts +403 -0
- package/dist/taste.d.ts +155 -0
- package/dist/taste.js +14 -0
- package/package.json +27 -8
|
@@ -0,0 +1,1808 @@
|
|
|
1
|
+
import {
|
|
2
|
+
defineAlternatives
|
|
3
|
+
} from "../chunk-4ECRPD2I.js";
|
|
4
|
+
|
|
5
|
+
// src/estate/rows/architizer.ts
|
|
6
|
+
var ARCHITIZER = "architizer.styles";
|
|
7
|
+
var OUT_OF_AXIS = "out-of-axis";
|
|
8
|
+
var DECOMPOSED = "decomposed";
|
|
9
|
+
var MED_REGION = "place.region.mediterranean";
|
|
10
|
+
var NORDIC_REGION = "place.region.nordic";
|
|
11
|
+
var MINIMALISM = "style.minimalism";
|
|
12
|
+
var CONTEMPORARY = "style.contemporary";
|
|
13
|
+
var TRADITIONAL = "style.traditional";
|
|
14
|
+
var RUSTIC = "style.rustic";
|
|
15
|
+
var INDUSTRIAL = "style.industrial";
|
|
16
|
+
var MCM = "style.mid_century_modern";
|
|
17
|
+
var ART_DECO = "style.art_deco";
|
|
18
|
+
var MODERNISM = "style.modernism";
|
|
19
|
+
var EVOKES_NORDIC = "evokes(place.region.nordic)";
|
|
20
|
+
var EVOKES_MED = "evokes(place.region.mediterranean)";
|
|
21
|
+
var ARCHITIZER_ROWS = [
|
|
22
|
+
// ─── architizer · STYLES (25) ──────────────────────────────────────────────────────────────
|
|
23
|
+
{
|
|
24
|
+
onto: [MODERNISM],
|
|
25
|
+
source: ARCHITIZER,
|
|
26
|
+
term: "Modernist",
|
|
27
|
+
verdict: DECOMPOSED
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
onto: [MCM],
|
|
31
|
+
source: ARCHITIZER,
|
|
32
|
+
term: "Mid-century modern",
|
|
33
|
+
verdict: DECOMPOSED
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
onto: ["style.brutalism"],
|
|
37
|
+
source: ARCHITIZER,
|
|
38
|
+
term: "Brutalist",
|
|
39
|
+
verdict: DECOMPOSED
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
onto: [MINIMALISM],
|
|
43
|
+
source: ARCHITIZER,
|
|
44
|
+
term: "Minimalist",
|
|
45
|
+
verdict: DECOMPOSED
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
onto: ["style.rationalism"],
|
|
49
|
+
source: ARCHITIZER,
|
|
50
|
+
term: "Rationalist",
|
|
51
|
+
verdict: DECOMPOSED
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
onto: ["style.postmodernism"],
|
|
55
|
+
source: ARCHITIZER,
|
|
56
|
+
term: "Postmodern",
|
|
57
|
+
verdict: DECOMPOSED
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
onto: ["style.deconstructivism"],
|
|
61
|
+
source: ARCHITIZER,
|
|
62
|
+
term: "Deconstructivist",
|
|
63
|
+
verdict: DECOMPOSED
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
onto: ["style.parametricism"],
|
|
67
|
+
source: ARCHITIZER,
|
|
68
|
+
term: "Parametric",
|
|
69
|
+
verdict: DECOMPOSED
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
onto: ["style.high_tech"],
|
|
73
|
+
source: ARCHITIZER,
|
|
74
|
+
term: "High-tech",
|
|
75
|
+
verdict: DECOMPOSED
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
onto: [INDUSTRIAL],
|
|
79
|
+
source: ARCHITIZER,
|
|
80
|
+
term: "Industrial",
|
|
81
|
+
verdict: DECOMPOSED
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
onto: ["style.constructivism"],
|
|
85
|
+
source: ARCHITIZER,
|
|
86
|
+
term: "Constructivist",
|
|
87
|
+
verdict: DECOMPOSED
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
note: "Carries no content until a place is supplied. It composes with PLACE rather than duplicating it, which is why the canon keeps both.",
|
|
91
|
+
onto: ["style.vernacular"],
|
|
92
|
+
source: ARCHITIZER,
|
|
93
|
+
term: "Vernacular",
|
|
94
|
+
verdict: DECOMPOSED
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
onto: ["style.critical_regionalism"],
|
|
98
|
+
source: ARCHITIZER,
|
|
99
|
+
term: "Critical regionalist",
|
|
100
|
+
verdict: DECOMPOSED
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
mintedAxis: ["place.landscape.tropical"],
|
|
104
|
+
onto: [MODERNISM, "evokes(place.landscape.tropical)"],
|
|
105
|
+
source: ARCHITIZER,
|
|
106
|
+
term: "Tropical modernism",
|
|
107
|
+
verdict: DECOMPOSED
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
mintedAxis: [NORDIC_REGION],
|
|
111
|
+
onto: [MODERNISM, EVOKES_NORDIC],
|
|
112
|
+
source: ARCHITIZER,
|
|
113
|
+
term: "Nordic modern",
|
|
114
|
+
verdict: DECOMPOSED
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
mintedAxis: ["place.region.japanese"],
|
|
118
|
+
onto: [CONTEMPORARY, "evokes(place.region.japanese)"],
|
|
119
|
+
source: ARCHITIZER,
|
|
120
|
+
term: "Japanese contemporary",
|
|
121
|
+
verdict: DECOMPOSED
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
mintedAxis: [MED_REGION],
|
|
125
|
+
note: "Sat in a STYLE enum with no style component at all. Pure place, and the clearest single piece of evidence that the place gap was real.",
|
|
126
|
+
onto: [EVOKES_MED],
|
|
127
|
+
source: ARCHITIZER,
|
|
128
|
+
term: "Mediterranean",
|
|
129
|
+
verdict: DECOMPOSED
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
onto: [TRADITIONAL],
|
|
133
|
+
source: ARCHITIZER,
|
|
134
|
+
term: "Traditional",
|
|
135
|
+
verdict: DECOMPOSED
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
onto: ["style.neoclassical"],
|
|
139
|
+
source: ARCHITIZER,
|
|
140
|
+
term: "Neoclassical",
|
|
141
|
+
verdict: DECOMPOSED
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
onto: ["style.gothic"],
|
|
145
|
+
source: ARCHITIZER,
|
|
146
|
+
term: "Gothic",
|
|
147
|
+
verdict: DECOMPOSED
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
onto: [ART_DECO],
|
|
151
|
+
source: ARCHITIZER,
|
|
152
|
+
term: "Art Deco",
|
|
153
|
+
verdict: DECOMPOSED
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
onto: ["style.organic_modernism"],
|
|
157
|
+
source: ARCHITIZER,
|
|
158
|
+
term: "Organic",
|
|
159
|
+
verdict: DECOMPOSED
|
|
160
|
+
},
|
|
161
|
+
{
|
|
162
|
+
note: "A design STRATEGY, not an idiom. Belongs on a strategy axis alongside architizer's own SUSTAINABILITY enum. Declared as a gap rather than absorbed into Style.",
|
|
163
|
+
onto: [],
|
|
164
|
+
reason: "axis-not-authored",
|
|
165
|
+
source: ARCHITIZER,
|
|
166
|
+
term: "Biophilic",
|
|
167
|
+
verdict: OUT_OF_AXIS
|
|
168
|
+
},
|
|
169
|
+
{
|
|
170
|
+
note: "A formal quality. architizer's own FORMAL_MOVE_EXAMPLES is where it belongs, and that file already separates the two - the enum did not.",
|
|
171
|
+
onto: [],
|
|
172
|
+
reason: "axis-not-authored",
|
|
173
|
+
source: ARCHITIZER,
|
|
174
|
+
term: "Sculptural",
|
|
175
|
+
verdict: OUT_OF_AXIS
|
|
176
|
+
},
|
|
177
|
+
{ onto: [RUSTIC], source: ARCHITIZER, term: "Rustic", verdict: DECOMPOSED }
|
|
178
|
+
];
|
|
179
|
+
|
|
180
|
+
// src/estate/rows/designround.ts
|
|
181
|
+
var DESIGNROUND = "designround.style_anchors";
|
|
182
|
+
var DECOMPOSED2 = "decomposed";
|
|
183
|
+
var NORDIC_REGION2 = "place.region.nordic";
|
|
184
|
+
var COASTAL_LANDSCAPE = "place.landscape.coastal";
|
|
185
|
+
var MOODY = "mood.moody";
|
|
186
|
+
var MINIMALISM2 = "style.minimalism";
|
|
187
|
+
var CONTEMPORARY2 = "style.contemporary";
|
|
188
|
+
var RUSTIC2 = "style.rustic";
|
|
189
|
+
var INDUSTRIAL2 = "style.industrial";
|
|
190
|
+
var MCM2 = "style.mid_century_modern";
|
|
191
|
+
var ART_DECO2 = "style.art_deco";
|
|
192
|
+
var LUXURIOUS = "mood.luxurious";
|
|
193
|
+
var WARM = "palette.temperature.warm";
|
|
194
|
+
var EVOKES_NORDIC2 = "evokes(place.region.nordic)";
|
|
195
|
+
var EVOKES_COASTAL = "evokes(place.landscape.coastal)";
|
|
196
|
+
var DESIGNROUND_ROWS = [
|
|
197
|
+
// ─── designround · STYLE_ANCHORS (12) ──────────────────────────────────────────────────────
|
|
198
|
+
{
|
|
199
|
+
note: "The label decomposes exactly. The ANCHOR PROSE behind it does not - it also carries limewash, linen, wabi-sabi and Japanese influence. That gap between label and prose is what an anchor is for, and is the argument for keeping anchors alongside concepts rather than instead of them.",
|
|
200
|
+
onto: [MINIMALISM2, WARM],
|
|
201
|
+
source: DESIGNROUND,
|
|
202
|
+
term: "Warm Minimalism",
|
|
203
|
+
verdict: DECOMPOSED2
|
|
204
|
+
},
|
|
205
|
+
{
|
|
206
|
+
mintedAxis: ["place.region.english_country"],
|
|
207
|
+
onto: ["evokes(place.region.english_country)"],
|
|
208
|
+
source: DESIGNROUND,
|
|
209
|
+
term: "English Country",
|
|
210
|
+
verdict: DECOMPOSED2
|
|
211
|
+
},
|
|
212
|
+
{
|
|
213
|
+
mintedTerm: ["style.maximalism"],
|
|
214
|
+
onto: ["style.maximalism", CONTEMPORARY2],
|
|
215
|
+
source: DESIGNROUND,
|
|
216
|
+
term: "Modern Maximalism",
|
|
217
|
+
verdict: DECOMPOSED2
|
|
218
|
+
},
|
|
219
|
+
{
|
|
220
|
+
mintedTerm: [LUXURIOUS],
|
|
221
|
+
onto: [CONTEMPORARY2, LUXURIOUS],
|
|
222
|
+
source: DESIGNROUND,
|
|
223
|
+
term: "Contemporary Luxury",
|
|
224
|
+
verdict: DECOMPOSED2
|
|
225
|
+
},
|
|
226
|
+
{
|
|
227
|
+
mintedAxis: [COASTAL_LANDSCAPE],
|
|
228
|
+
onto: [
|
|
229
|
+
EVOKES_COASTAL,
|
|
230
|
+
"palette.character.muted",
|
|
231
|
+
"ms_character.natural_reading (material axis)"
|
|
232
|
+
],
|
|
233
|
+
source: DESIGNROUND,
|
|
234
|
+
term: "Coastal & Natural",
|
|
235
|
+
verdict: DECOMPOSED2
|
|
236
|
+
},
|
|
237
|
+
{
|
|
238
|
+
onto: [MCM2],
|
|
239
|
+
source: DESIGNROUND,
|
|
240
|
+
term: "Mid-Century Modern",
|
|
241
|
+
verdict: DECOMPOSED2
|
|
242
|
+
},
|
|
243
|
+
{
|
|
244
|
+
note: '"Raw" is a finish claim on the material axis, not a second style.',
|
|
245
|
+
onto: [INDUSTRIAL2],
|
|
246
|
+
source: DESIGNROUND,
|
|
247
|
+
term: "Industrial & Raw",
|
|
248
|
+
verdict: DECOMPOSED2
|
|
249
|
+
},
|
|
250
|
+
{
|
|
251
|
+
onto: ["style.neoclassical", "mood.monumental"],
|
|
252
|
+
source: DESIGNROUND,
|
|
253
|
+
term: "Classical & Grand",
|
|
254
|
+
verdict: DECOMPOSED2
|
|
255
|
+
},
|
|
256
|
+
{
|
|
257
|
+
mintedAxis: [NORDIC_REGION2],
|
|
258
|
+
onto: [EVOKES_NORDIC2],
|
|
259
|
+
source: DESIGNROUND,
|
|
260
|
+
term: "Scandinavian",
|
|
261
|
+
verdict: DECOMPOSED2
|
|
262
|
+
},
|
|
263
|
+
{
|
|
264
|
+
onto: [RUSTIC2, "ms_character.crafted (material axis)"],
|
|
265
|
+
source: DESIGNROUND,
|
|
266
|
+
term: "Rustic & Artisan",
|
|
267
|
+
verdict: DECOMPOSED2
|
|
268
|
+
},
|
|
269
|
+
{
|
|
270
|
+
mintedTerm: [LUXURIOUS],
|
|
271
|
+
onto: [ART_DECO2, LUXURIOUS],
|
|
272
|
+
source: DESIGNROUND,
|
|
273
|
+
term: "Art Deco & Glamour",
|
|
274
|
+
verdict: DECOMPOSED2
|
|
275
|
+
},
|
|
276
|
+
{
|
|
277
|
+
mintedTerm: ["mood.dramatic"],
|
|
278
|
+
note: "Not one mood twice. A pale high-contrast gallery is dramatic and not moody; a dim snug is moody and not dramatic. materialgraph's ms_mood conflates them and this anchor needed both halves.",
|
|
279
|
+
onto: [MOODY, "mood.dramatic"],
|
|
280
|
+
source: DESIGNROUND,
|
|
281
|
+
term: "Moody & Dramatic",
|
|
282
|
+
verdict: DECOMPOSED2
|
|
283
|
+
}
|
|
284
|
+
];
|
|
285
|
+
|
|
286
|
+
// src/estate/rows/designshop.ts
|
|
287
|
+
var DS_SCHEMES = "designshop.scheme_styles";
|
|
288
|
+
var DS_PRODUCTS = "designshop.product_styles";
|
|
289
|
+
var DECOMPOSED3 = "decomposed";
|
|
290
|
+
var NORDIC_REGION3 = "place.region.nordic";
|
|
291
|
+
var COASTAL_LANDSCAPE2 = "place.landscape.coastal";
|
|
292
|
+
var MINIMALISM3 = "style.minimalism";
|
|
293
|
+
var CONTEMPORARY3 = "style.contemporary";
|
|
294
|
+
var TRADITIONAL2 = "style.traditional";
|
|
295
|
+
var RUSTIC3 = "style.rustic";
|
|
296
|
+
var INDUSTRIAL3 = "style.industrial";
|
|
297
|
+
var MCM3 = "style.mid_century_modern";
|
|
298
|
+
var ART_DECO3 = "style.art_deco";
|
|
299
|
+
var MODERNISM2 = "style.modernism";
|
|
300
|
+
var TRANSITIONAL = "style.transitional";
|
|
301
|
+
var ECLECTIC = "style.eclectic";
|
|
302
|
+
var EVOKES_NORDIC3 = "evokes(place.region.nordic)";
|
|
303
|
+
var EVOKES_COASTAL2 = "evokes(place.landscape.coastal)";
|
|
304
|
+
var EVOKES_FARMHOUSE = "evokes(typology.farmhouse)";
|
|
305
|
+
var MODERN_ALTERNATIVES = defineAlternatives(
|
|
306
|
+
[
|
|
307
|
+
[{ assertion: MODERNISM2, role: "constitutive" }],
|
|
308
|
+
[{ assertion: CONTEMPORARY3, role: "constitutive" }]
|
|
309
|
+
],
|
|
310
|
+
"source-ambiguous"
|
|
311
|
+
);
|
|
312
|
+
var COUNTRY_ALTERNATIVES = defineAlternatives(
|
|
313
|
+
[
|
|
314
|
+
[
|
|
315
|
+
{
|
|
316
|
+
assertion: "evokes(place.region.english_country)",
|
|
317
|
+
role: "constitutive"
|
|
318
|
+
}
|
|
319
|
+
],
|
|
320
|
+
[{ assertion: EVOKES_FARMHOUSE, role: "constitutive" }]
|
|
321
|
+
],
|
|
322
|
+
"source-ambiguous"
|
|
323
|
+
);
|
|
324
|
+
var DESIGNSHOP_ROWS = [
|
|
325
|
+
// ─── designshop · roomStyle, 1,922 schemes of usage (9) ────────────────────────────────────
|
|
326
|
+
{
|
|
327
|
+
onto: [CONTEMPORARY3],
|
|
328
|
+
source: DS_SCHEMES,
|
|
329
|
+
term: "Contemporary",
|
|
330
|
+
verdict: DECOMPOSED3
|
|
331
|
+
},
|
|
332
|
+
{
|
|
333
|
+
alternatives: MODERN_ALTERNATIVES,
|
|
334
|
+
note: "A dominant share of that corpus, sitting beside an almost identical share tagged Contemporary. The merchandisers plainly distinguish the two and nobody wrote down how. The canon preserves a typed disjunction over both readings rather than guessing or dropping the row.",
|
|
335
|
+
onto: [],
|
|
336
|
+
source: DS_SCHEMES,
|
|
337
|
+
term: "Modern",
|
|
338
|
+
verdict: "ambiguous"
|
|
339
|
+
},
|
|
340
|
+
{
|
|
341
|
+
onto: [TRADITIONAL2],
|
|
342
|
+
source: DS_SCHEMES,
|
|
343
|
+
term: "Traditional",
|
|
344
|
+
verdict: DECOMPOSED3
|
|
345
|
+
},
|
|
346
|
+
{
|
|
347
|
+
mintedTerm: [TRANSITIONAL],
|
|
348
|
+
note: "Defined only relative to two other styles, which was nearly grounds to refuse it. Its volume in that corpus is why it stays.",
|
|
349
|
+
onto: [TRANSITIONAL],
|
|
350
|
+
source: DS_SCHEMES,
|
|
351
|
+
term: "Transitional",
|
|
352
|
+
verdict: DECOMPOSED3
|
|
353
|
+
},
|
|
354
|
+
{
|
|
355
|
+
mintedTerm: [ECLECTIC],
|
|
356
|
+
onto: [ECLECTIC],
|
|
357
|
+
source: DS_SCHEMES,
|
|
358
|
+
term: "Eclectic",
|
|
359
|
+
verdict: DECOMPOSED3
|
|
360
|
+
},
|
|
361
|
+
{
|
|
362
|
+
onto: [MINIMALISM3],
|
|
363
|
+
source: DS_SCHEMES,
|
|
364
|
+
term: "Minimalist",
|
|
365
|
+
verdict: DECOMPOSED3
|
|
366
|
+
},
|
|
367
|
+
{
|
|
368
|
+
alternatives: COUNTRY_ALTERNATIVES,
|
|
369
|
+
note: "In a US catalogue this is not the English country idiom, and it sits beside a separate `Farmhouse` value at comparable volume. Two adjacent consumer terms, a meaningful share of the corpus between them, and no recorded difference. Declines.",
|
|
370
|
+
onto: [],
|
|
371
|
+
source: DS_SCHEMES,
|
|
372
|
+
term: "Country",
|
|
373
|
+
verdict: "ambiguous"
|
|
374
|
+
},
|
|
375
|
+
{
|
|
376
|
+
mintedAxis: ["typology.farmhouse"],
|
|
377
|
+
note: "A building type invoked as a look. The clearest case that typology-as-reference is a real mechanism and not a special case of place.",
|
|
378
|
+
onto: [EVOKES_FARMHOUSE, RUSTIC3],
|
|
379
|
+
source: DS_SCHEMES,
|
|
380
|
+
term: "Farmhouse",
|
|
381
|
+
verdict: DECOMPOSED3
|
|
382
|
+
},
|
|
383
|
+
{
|
|
384
|
+
mintedAxis: [COASTAL_LANDSCAPE2],
|
|
385
|
+
note: "The same term architizer carries in its CONTEXTS enum meaning `located-in`. One vocabulary, two predicates.",
|
|
386
|
+
onto: [EVOKES_COASTAL2],
|
|
387
|
+
source: DS_SCHEMES,
|
|
388
|
+
term: "Coastal",
|
|
389
|
+
verdict: DECOMPOSED3
|
|
390
|
+
},
|
|
391
|
+
// ─── designshop · product attributes.Style (14) ────────────────────────────────────────────
|
|
392
|
+
{
|
|
393
|
+
onto: [CONTEMPORARY3],
|
|
394
|
+
source: DS_PRODUCTS,
|
|
395
|
+
term: "Contemporary",
|
|
396
|
+
verdict: DECOMPOSED3
|
|
397
|
+
},
|
|
398
|
+
{
|
|
399
|
+
alternatives: MODERN_ALTERNATIVES,
|
|
400
|
+
onto: [],
|
|
401
|
+
source: DS_PRODUCTS,
|
|
402
|
+
term: "Modern",
|
|
403
|
+
verdict: "ambiguous"
|
|
404
|
+
},
|
|
405
|
+
{
|
|
406
|
+
onto: [MINIMALISM3],
|
|
407
|
+
source: DS_PRODUCTS,
|
|
408
|
+
term: "Minimalist",
|
|
409
|
+
verdict: DECOMPOSED3
|
|
410
|
+
},
|
|
411
|
+
{
|
|
412
|
+
mintedAxis: [NORDIC_REGION3],
|
|
413
|
+
onto: [EVOKES_NORDIC3],
|
|
414
|
+
source: DS_PRODUCTS,
|
|
415
|
+
term: "Scandinavian",
|
|
416
|
+
verdict: DECOMPOSED3
|
|
417
|
+
},
|
|
418
|
+
{
|
|
419
|
+
mintedTerm: [TRANSITIONAL],
|
|
420
|
+
onto: [TRANSITIONAL],
|
|
421
|
+
source: DS_PRODUCTS,
|
|
422
|
+
term: "Transitional",
|
|
423
|
+
verdict: DECOMPOSED3
|
|
424
|
+
},
|
|
425
|
+
{
|
|
426
|
+
note: "The stray space is verbatim. It stops this value string-matching the same company's own scheme-side `Traditional`, inside the same capture.",
|
|
427
|
+
onto: [TRADITIONAL2],
|
|
428
|
+
source: DS_PRODUCTS,
|
|
429
|
+
term: "Classic/ Traditional",
|
|
430
|
+
verdict: DECOMPOSED3
|
|
431
|
+
},
|
|
432
|
+
{
|
|
433
|
+
onto: [ART_DECO3],
|
|
434
|
+
source: DS_PRODUCTS,
|
|
435
|
+
term: "Art Deco",
|
|
436
|
+
verdict: DECOMPOSED3
|
|
437
|
+
},
|
|
438
|
+
{
|
|
439
|
+
mintedTerm: [ECLECTIC],
|
|
440
|
+
onto: [ECLECTIC],
|
|
441
|
+
source: DS_PRODUCTS,
|
|
442
|
+
term: "Eclectic",
|
|
443
|
+
verdict: DECOMPOSED3
|
|
444
|
+
},
|
|
445
|
+
{
|
|
446
|
+
mintedAxis: [COASTAL_LANDSCAPE2],
|
|
447
|
+
onto: [EVOKES_COASTAL2],
|
|
448
|
+
source: DS_PRODUCTS,
|
|
449
|
+
term: "Coastal",
|
|
450
|
+
verdict: DECOMPOSED3
|
|
451
|
+
},
|
|
452
|
+
{
|
|
453
|
+
onto: [RUSTIC3],
|
|
454
|
+
source: DS_PRODUCTS,
|
|
455
|
+
term: "Rustic",
|
|
456
|
+
verdict: DECOMPOSED3
|
|
457
|
+
},
|
|
458
|
+
{
|
|
459
|
+
mintedAxis: ["typology.cottage"],
|
|
460
|
+
note: "Resolves where the scheme-side `Country` does not, because `Cottage` pins it to a typology. The same company's two vocabularies are not equally mappable.",
|
|
461
|
+
onto: ["evokes(typology.cottage)", TRADITIONAL2],
|
|
462
|
+
source: DS_PRODUCTS,
|
|
463
|
+
term: "Country/ Cottage",
|
|
464
|
+
verdict: DECOMPOSED3
|
|
465
|
+
},
|
|
466
|
+
{
|
|
467
|
+
onto: [INDUSTRIAL3],
|
|
468
|
+
source: DS_PRODUCTS,
|
|
469
|
+
term: "Industrial",
|
|
470
|
+
verdict: DECOMPOSED3
|
|
471
|
+
},
|
|
472
|
+
{
|
|
473
|
+
onto: [MCM3],
|
|
474
|
+
source: DS_PRODUCTS,
|
|
475
|
+
term: "Mid-Century Modern",
|
|
476
|
+
verdict: DECOMPOSED3
|
|
477
|
+
},
|
|
478
|
+
{
|
|
479
|
+
mintedAxis: ["typology.farmhouse"],
|
|
480
|
+
onto: [EVOKES_FARMHOUSE, RUSTIC3],
|
|
481
|
+
source: DS_PRODUCTS,
|
|
482
|
+
term: "Farmhouse",
|
|
483
|
+
verdict: DECOMPOSED3
|
|
484
|
+
}
|
|
485
|
+
];
|
|
486
|
+
|
|
487
|
+
// src/estate/rows/materia.ts
|
|
488
|
+
var SCENE_MOOD = "materia.scene_mood";
|
|
489
|
+
var INTENT_KEYWORDS = "materia.intent_keywords";
|
|
490
|
+
var OUT_OF_AXIS2 = "out-of-axis";
|
|
491
|
+
var MATERIAL_PROPERTY = "material-property";
|
|
492
|
+
var QUERY_MARKER = "query-marker";
|
|
493
|
+
var DECOMPOSED4 = "decomposed";
|
|
494
|
+
var MED_REGION2 = "place.region.mediterranean";
|
|
495
|
+
var NORDIC_REGION4 = "place.region.nordic";
|
|
496
|
+
var COASTAL_LANDSCAPE3 = "place.landscape.coastal";
|
|
497
|
+
var PLAYFUL = "mood.playful";
|
|
498
|
+
var MOODY2 = "mood.moody";
|
|
499
|
+
var MINIMALISM4 = "style.minimalism";
|
|
500
|
+
var CONTEMPORARY4 = "style.contemporary";
|
|
501
|
+
var TRADITIONAL3 = "style.traditional";
|
|
502
|
+
var RUSTIC4 = "style.rustic";
|
|
503
|
+
var INDUSTRIAL4 = "style.industrial";
|
|
504
|
+
var MCM4 = "style.mid_century_modern";
|
|
505
|
+
var ART_DECO4 = "style.art_deco";
|
|
506
|
+
var MODERNISM3 = "style.modernism";
|
|
507
|
+
var LUXURIOUS2 = "mood.luxurious";
|
|
508
|
+
var SOFT_MOOD = "mood.soft";
|
|
509
|
+
var CALM = "mood.calm";
|
|
510
|
+
var WARM2 = "palette.temperature.warm";
|
|
511
|
+
var EVOKES_NORDIC4 = "evokes(place.region.nordic)";
|
|
512
|
+
var EVOKES_COASTAL3 = "evokes(place.landscape.coastal)";
|
|
513
|
+
var EVOKES_MED2 = "evokes(place.region.mediterranean)";
|
|
514
|
+
var FADED = "palette.character.faded";
|
|
515
|
+
var AUSTERE = "mood.austere";
|
|
516
|
+
var EVOKES_MONASTERY = "evokes(typology.monastery)";
|
|
517
|
+
var MODERN_ALTERNATIVES2 = defineAlternatives(
|
|
518
|
+
[
|
|
519
|
+
[{ assertion: MODERNISM3, role: "constitutive" }],
|
|
520
|
+
[{ assertion: CONTEMPORARY4, role: "constitutive" }]
|
|
521
|
+
],
|
|
522
|
+
"source-ambiguous"
|
|
523
|
+
);
|
|
524
|
+
var BOUTIQUE_ALTERNATIVES = defineAlternatives(
|
|
525
|
+
[
|
|
526
|
+
[{ assertion: "evokes(typology.hotel)", role: "constitutive" }],
|
|
527
|
+
[{ assertion: "evokes(typology.shop)", role: "constitutive" }]
|
|
528
|
+
],
|
|
529
|
+
"source-ambiguous"
|
|
530
|
+
);
|
|
531
|
+
var MATERIA_ROWS = [
|
|
532
|
+
// ─── materia · SceneMoodSchema (9) ─────────────────────────────────────────────────────────
|
|
533
|
+
{
|
|
534
|
+
onto: [MINIMALISM4, CALM],
|
|
535
|
+
source: SCENE_MOOD,
|
|
536
|
+
term: "serene-minimal",
|
|
537
|
+
verdict: DECOMPOSED4
|
|
538
|
+
},
|
|
539
|
+
{
|
|
540
|
+
note: "Temperature welded into a style enum. The exact failure `warm minimalism` exhibits, in a different pairing.",
|
|
541
|
+
onto: [TRADITIONAL3, WARM2],
|
|
542
|
+
source: SCENE_MOOD,
|
|
543
|
+
term: "warm-traditional",
|
|
544
|
+
verdict: DECOMPOSED4
|
|
545
|
+
},
|
|
546
|
+
{
|
|
547
|
+
mintedTerm: ["palette.character.saturated"],
|
|
548
|
+
onto: [MOODY2, "palette.character.saturated"],
|
|
549
|
+
source: SCENE_MOOD,
|
|
550
|
+
term: "moody-saturated",
|
|
551
|
+
verdict: DECOMPOSED4
|
|
552
|
+
},
|
|
553
|
+
{
|
|
554
|
+
mintedAxis: [MED_REGION2],
|
|
555
|
+
mintedTerm: [FADED],
|
|
556
|
+
note: "Four axes in one token. The single worst compound in the estate and it decomposes without residue.",
|
|
557
|
+
onto: [EVOKES_MED2, FADED, WARM2, "palette.character.light"],
|
|
558
|
+
source: SCENE_MOOD,
|
|
559
|
+
term: "sun-bleached-mediterranean",
|
|
560
|
+
verdict: DECOMPOSED4
|
|
561
|
+
},
|
|
562
|
+
{
|
|
563
|
+
mintedAxis: ["place.region.japanese", NORDIC_REGION4],
|
|
564
|
+
note: "Japandi is a named fusion with settled conventions of its own. The composition is necessary but not sufficient: it also matches rooms nobody would call japandi. Anchor required alongside.",
|
|
565
|
+
onto: [
|
|
566
|
+
MINIMALISM4,
|
|
567
|
+
"evokes(place.region.japanese)",
|
|
568
|
+
EVOKES_NORDIC4,
|
|
569
|
+
SOFT_MOOD
|
|
570
|
+
],
|
|
571
|
+
source: SCENE_MOOD,
|
|
572
|
+
term: "soft-japandi",
|
|
573
|
+
verdict: "lossy"
|
|
574
|
+
},
|
|
575
|
+
{
|
|
576
|
+
mintedAxis: ["typology.monastery"],
|
|
577
|
+
mintedTerm: [AUSTERE],
|
|
578
|
+
onto: [EVOKES_MONASTERY, AUSTERE, MINIMALISM4, "ms_texture (material axis)"],
|
|
579
|
+
source: SCENE_MOOD,
|
|
580
|
+
term: "tactile-monastic",
|
|
581
|
+
verdict: DECOMPOSED4
|
|
582
|
+
},
|
|
583
|
+
{
|
|
584
|
+
mintedTerm: [LUXURIOUS2],
|
|
585
|
+
onto: [ART_DECO4, LUXURIOUS2],
|
|
586
|
+
source: SCENE_MOOD,
|
|
587
|
+
term: "art-deco-luxe",
|
|
588
|
+
verdict: DECOMPOSED4
|
|
589
|
+
},
|
|
590
|
+
{
|
|
591
|
+
note: "A procurement claim, not an aesthetic: specified to commercial standards. Sits on SECTOR, and only appeared in a mood enum because the enum was the only field available.",
|
|
592
|
+
onto: [],
|
|
593
|
+
reason: "other-canonical-axis",
|
|
594
|
+
source: SCENE_MOOD,
|
|
595
|
+
term: "commercial-spec",
|
|
596
|
+
verdict: OUT_OF_AXIS2
|
|
597
|
+
},
|
|
598
|
+
{
|
|
599
|
+
note: "An instruction to the scene planner, not a description of a room. Nothing to classify.",
|
|
600
|
+
onto: [],
|
|
601
|
+
reason: QUERY_MARKER,
|
|
602
|
+
source: SCENE_MOOD,
|
|
603
|
+
term: "material-led",
|
|
604
|
+
verdict: OUT_OF_AXIS2
|
|
605
|
+
},
|
|
606
|
+
// ─── materia · INTENT_KEYWORDS (37) ────────────────────────────────────────────────────────
|
|
607
|
+
{
|
|
608
|
+
note: "ms_sheen.",
|
|
609
|
+
onto: [],
|
|
610
|
+
reason: MATERIAL_PROPERTY,
|
|
611
|
+
source: INTENT_KEYWORDS,
|
|
612
|
+
term: "chalky",
|
|
613
|
+
verdict: OUT_OF_AXIS2
|
|
614
|
+
},
|
|
615
|
+
{
|
|
616
|
+
mintedAxis: [COASTAL_LANDSCAPE3],
|
|
617
|
+
onto: [EVOKES_COASTAL3],
|
|
618
|
+
source: INTENT_KEYWORDS,
|
|
619
|
+
term: "coastal",
|
|
620
|
+
verdict: DECOMPOSED4
|
|
621
|
+
},
|
|
622
|
+
{
|
|
623
|
+
note: "A colour NAME, not a family. Resolves to a family; the name itself belongs in colorscope, not here.",
|
|
624
|
+
onto: ["palette.hue.brown"],
|
|
625
|
+
source: INTENT_KEYWORDS,
|
|
626
|
+
term: "cognac",
|
|
627
|
+
verdict: DECOMPOSED4
|
|
628
|
+
},
|
|
629
|
+
{
|
|
630
|
+
onto: ["palette.hue.brown", "palette.character.muted", WARM2],
|
|
631
|
+
source: INTENT_KEYWORDS,
|
|
632
|
+
term: "earthy",
|
|
633
|
+
verdict: DECOMPOSED4
|
|
634
|
+
},
|
|
635
|
+
{
|
|
636
|
+
onto: [],
|
|
637
|
+
reason: QUERY_MARKER,
|
|
638
|
+
source: INTENT_KEYWORDS,
|
|
639
|
+
term: "interesting",
|
|
640
|
+
verdict: OUT_OF_AXIS2
|
|
641
|
+
},
|
|
642
|
+
{
|
|
643
|
+
onto: [MOODY2],
|
|
644
|
+
source: INTENT_KEYWORDS,
|
|
645
|
+
term: "moody",
|
|
646
|
+
verdict: DECOMPOSED4
|
|
647
|
+
},
|
|
648
|
+
{
|
|
649
|
+
onto: [PLAYFUL],
|
|
650
|
+
source: INTENT_KEYWORDS,
|
|
651
|
+
term: "playful",
|
|
652
|
+
verdict: DECOMPOSED4
|
|
653
|
+
},
|
|
654
|
+
{ onto: [CALM], source: INTENT_KEYWORDS, term: "quiet", verdict: DECOMPOSED4 },
|
|
655
|
+
{
|
|
656
|
+
onto: [SOFT_MOOD],
|
|
657
|
+
source: INTENT_KEYWORDS,
|
|
658
|
+
term: "soft",
|
|
659
|
+
verdict: DECOMPOSED4
|
|
660
|
+
},
|
|
661
|
+
{
|
|
662
|
+
onto: [],
|
|
663
|
+
reason: MATERIAL_PROPERTY,
|
|
664
|
+
source: INTENT_KEYWORDS,
|
|
665
|
+
term: "performance",
|
|
666
|
+
verdict: OUT_OF_AXIS2
|
|
667
|
+
},
|
|
668
|
+
{
|
|
669
|
+
onto: [],
|
|
670
|
+
reason: MATERIAL_PROPERTY,
|
|
671
|
+
source: INTENT_KEYWORDS,
|
|
672
|
+
term: "cleanable",
|
|
673
|
+
verdict: OUT_OF_AXIS2
|
|
674
|
+
},
|
|
675
|
+
{
|
|
676
|
+
note: "Onto the already-published SECTOR axis.",
|
|
677
|
+
onto: ["sector.healthcare"],
|
|
678
|
+
source: INTENT_KEYWORDS,
|
|
679
|
+
term: "healthcare",
|
|
680
|
+
verdict: DECOMPOSED4
|
|
681
|
+
},
|
|
682
|
+
{
|
|
683
|
+
note: "ms_pattern_density.",
|
|
684
|
+
onto: [],
|
|
685
|
+
reason: MATERIAL_PROPERTY,
|
|
686
|
+
source: INTENT_KEYWORDS,
|
|
687
|
+
term: "patterned",
|
|
688
|
+
verdict: OUT_OF_AXIS2
|
|
689
|
+
},
|
|
690
|
+
{
|
|
691
|
+
mintedTerm: [FADED],
|
|
692
|
+
onto: [FADED],
|
|
693
|
+
source: INTENT_KEYWORDS,
|
|
694
|
+
term: "faded",
|
|
695
|
+
verdict: DECOMPOSED4
|
|
696
|
+
},
|
|
697
|
+
{
|
|
698
|
+
onto: [WARM2],
|
|
699
|
+
source: INTENT_KEYWORDS,
|
|
700
|
+
term: "warm",
|
|
701
|
+
verdict: DECOMPOSED4
|
|
702
|
+
},
|
|
703
|
+
{
|
|
704
|
+
onto: ["palette.temperature.cool"],
|
|
705
|
+
source: INTENT_KEYWORDS,
|
|
706
|
+
term: "cool",
|
|
707
|
+
verdict: DECOMPOSED4
|
|
708
|
+
},
|
|
709
|
+
{
|
|
710
|
+
alternatives: MODERN_ALTERNATIVES2,
|
|
711
|
+
note: "THE ambiguity of the whole corpus. See the designshop rows, where it carries a dominant share of that corpus.",
|
|
712
|
+
onto: [],
|
|
713
|
+
source: INTENT_KEYWORDS,
|
|
714
|
+
term: "modern",
|
|
715
|
+
verdict: "ambiguous"
|
|
716
|
+
},
|
|
717
|
+
{
|
|
718
|
+
onto: [RUSTIC4],
|
|
719
|
+
source: INTENT_KEYWORDS,
|
|
720
|
+
term: "rustic",
|
|
721
|
+
verdict: DECOMPOSED4
|
|
722
|
+
},
|
|
723
|
+
{
|
|
724
|
+
onto: [MINIMALISM4],
|
|
725
|
+
source: INTENT_KEYWORDS,
|
|
726
|
+
term: "minimalist",
|
|
727
|
+
verdict: DECOMPOSED4
|
|
728
|
+
},
|
|
729
|
+
{
|
|
730
|
+
onto: [INDUSTRIAL4],
|
|
731
|
+
source: INTENT_KEYWORDS,
|
|
732
|
+
term: "industrial",
|
|
733
|
+
verdict: DECOMPOSED4
|
|
734
|
+
},
|
|
735
|
+
{
|
|
736
|
+
mintedAxis: ["typology.hotel"],
|
|
737
|
+
onto: ["typology.hotel"],
|
|
738
|
+
reason: "other-canonical-axis",
|
|
739
|
+
source: INTENT_KEYWORDS,
|
|
740
|
+
term: "hotel",
|
|
741
|
+
verdict: DECOMPOSED4
|
|
742
|
+
},
|
|
743
|
+
{
|
|
744
|
+
note: "Onto SPACE, which already existed upstream as materialgraph ms_room.",
|
|
745
|
+
onto: ["space.hospitality_lobby"],
|
|
746
|
+
source: INTENT_KEYWORDS,
|
|
747
|
+
term: "lobby",
|
|
748
|
+
verdict: DECOMPOSED4
|
|
749
|
+
},
|
|
750
|
+
{
|
|
751
|
+
mintedAxis: ["typology.spa"],
|
|
752
|
+
onto: ["typology.spa", "space.spa_pool"],
|
|
753
|
+
source: INTENT_KEYWORDS,
|
|
754
|
+
term: "spa",
|
|
755
|
+
verdict: DECOMPOSED4
|
|
756
|
+
},
|
|
757
|
+
{
|
|
758
|
+
alternatives: BOUTIQUE_ALTERNATIVES,
|
|
759
|
+
note: "A boutique hotel and a boutique shop are different claims and the keyword set cannot tell them apart.",
|
|
760
|
+
onto: [],
|
|
761
|
+
source: INTENT_KEYWORDS,
|
|
762
|
+
term: "boutique",
|
|
763
|
+
verdict: "ambiguous"
|
|
764
|
+
},
|
|
765
|
+
{
|
|
766
|
+
note: "US spelling of a term the canon carries as `sheltering`, also called `cosy`.",
|
|
767
|
+
onto: ["mood.sheltering"],
|
|
768
|
+
source: INTENT_KEYWORDS,
|
|
769
|
+
term: "cozy",
|
|
770
|
+
verdict: DECOMPOSED4
|
|
771
|
+
},
|
|
772
|
+
{
|
|
773
|
+
mintedTerm: [LUXURIOUS2],
|
|
774
|
+
onto: [LUXURIOUS2],
|
|
775
|
+
source: INTENT_KEYWORDS,
|
|
776
|
+
term: "luxurious",
|
|
777
|
+
verdict: DECOMPOSED4
|
|
778
|
+
},
|
|
779
|
+
{
|
|
780
|
+
onto: [],
|
|
781
|
+
reason: QUERY_MARKER,
|
|
782
|
+
source: INTENT_KEYWORDS,
|
|
783
|
+
term: "vibe",
|
|
784
|
+
verdict: OUT_OF_AXIS2
|
|
785
|
+
},
|
|
786
|
+
{
|
|
787
|
+
onto: [],
|
|
788
|
+
reason: QUERY_MARKER,
|
|
789
|
+
source: INTENT_KEYWORDS,
|
|
790
|
+
term: "aesthetic",
|
|
791
|
+
verdict: OUT_OF_AXIS2
|
|
792
|
+
},
|
|
793
|
+
{
|
|
794
|
+
onto: [],
|
|
795
|
+
reason: QUERY_MARKER,
|
|
796
|
+
source: INTENT_KEYWORDS,
|
|
797
|
+
term: "feel",
|
|
798
|
+
verdict: OUT_OF_AXIS2
|
|
799
|
+
},
|
|
800
|
+
{
|
|
801
|
+
onto: [],
|
|
802
|
+
reason: QUERY_MARKER,
|
|
803
|
+
source: INTENT_KEYWORDS,
|
|
804
|
+
term: "style",
|
|
805
|
+
verdict: OUT_OF_AXIS2
|
|
806
|
+
},
|
|
807
|
+
{
|
|
808
|
+
onto: [],
|
|
809
|
+
reason: QUERY_MARKER,
|
|
810
|
+
source: INTENT_KEYWORDS,
|
|
811
|
+
term: "like",
|
|
812
|
+
verdict: OUT_OF_AXIS2
|
|
813
|
+
},
|
|
814
|
+
{
|
|
815
|
+
onto: [],
|
|
816
|
+
reason: QUERY_MARKER,
|
|
817
|
+
source: INTENT_KEYWORDS,
|
|
818
|
+
term: "similar",
|
|
819
|
+
verdict: OUT_OF_AXIS2
|
|
820
|
+
},
|
|
821
|
+
{
|
|
822
|
+
note: "Reads as the style, not the period, in every query context. `period.mid_century` is the other reading and the axis prefix keeps them apart.",
|
|
823
|
+
onto: [MCM4],
|
|
824
|
+
source: INTENT_KEYWORDS,
|
|
825
|
+
term: "mid-century",
|
|
826
|
+
verdict: DECOMPOSED4
|
|
827
|
+
},
|
|
828
|
+
{
|
|
829
|
+
onto: [CONTEMPORARY4],
|
|
830
|
+
source: INTENT_KEYWORDS,
|
|
831
|
+
term: "contemporary",
|
|
832
|
+
verdict: DECOMPOSED4
|
|
833
|
+
},
|
|
834
|
+
{
|
|
835
|
+
onto: [TRADITIONAL3],
|
|
836
|
+
source: INTENT_KEYWORDS,
|
|
837
|
+
term: "traditional",
|
|
838
|
+
verdict: DECOMPOSED4
|
|
839
|
+
},
|
|
840
|
+
{
|
|
841
|
+
mintedAxis: [NORDIC_REGION4],
|
|
842
|
+
onto: [EVOKES_NORDIC4],
|
|
843
|
+
source: INTENT_KEYWORDS,
|
|
844
|
+
term: "scandinavian",
|
|
845
|
+
verdict: DECOMPOSED4
|
|
846
|
+
},
|
|
847
|
+
{
|
|
848
|
+
mintedAxis: [MED_REGION2],
|
|
849
|
+
onto: [EVOKES_MED2],
|
|
850
|
+
source: INTENT_KEYWORDS,
|
|
851
|
+
term: "mediterranean",
|
|
852
|
+
verdict: DECOMPOSED4
|
|
853
|
+
}
|
|
854
|
+
];
|
|
855
|
+
|
|
856
|
+
// src/estate/rows/materialgraph.ts
|
|
857
|
+
var MS_STYLE = "materialgraph.ms_style";
|
|
858
|
+
var MS_MOOD = "materialgraph.ms_mood";
|
|
859
|
+
var MS_CHARACTER = "materialgraph.ms_character";
|
|
860
|
+
var OUT_OF_AXIS3 = "out-of-axis";
|
|
861
|
+
var MATERIAL_PROPERTY2 = "material-property";
|
|
862
|
+
var DECOMPOSED5 = "decomposed";
|
|
863
|
+
var NORDIC_REGION5 = "place.region.nordic";
|
|
864
|
+
var COASTAL_LANDSCAPE4 = "place.landscape.coastal";
|
|
865
|
+
var PLAYFUL2 = "mood.playful";
|
|
866
|
+
var MOODY3 = "mood.moody";
|
|
867
|
+
var MINIMALISM5 = "style.minimalism";
|
|
868
|
+
var CONTEMPORARY5 = "style.contemporary";
|
|
869
|
+
var TRADITIONAL4 = "style.traditional";
|
|
870
|
+
var RUSTIC5 = "style.rustic";
|
|
871
|
+
var INDUSTRIAL5 = "style.industrial";
|
|
872
|
+
var MCM5 = "style.mid_century_modern";
|
|
873
|
+
var LUXURIOUS3 = "mood.luxurious";
|
|
874
|
+
var SOFT_MOOD2 = "mood.soft";
|
|
875
|
+
var CALM2 = "mood.calm";
|
|
876
|
+
var WARM3 = "palette.temperature.warm";
|
|
877
|
+
var EVOKES_NORDIC5 = "evokes(place.region.nordic)";
|
|
878
|
+
var EVOKES_COASTAL4 = "evokes(place.landscape.coastal)";
|
|
879
|
+
var AUSTERE2 = "mood.austere";
|
|
880
|
+
var EVOKES_MONASTERY2 = "evokes(typology.monastery)";
|
|
881
|
+
var MATERIALGRAPH_ROWS = [
|
|
882
|
+
// ─── materialgraph · ms_style (17) ─────────────────────────────────────────────────────────
|
|
883
|
+
{
|
|
884
|
+
note: "One of the two independent mintings of `warm minimalism` across the estate. It composes here, which is the whole point of separating temperature from style.",
|
|
885
|
+
onto: [MINIMALISM5, WARM3],
|
|
886
|
+
source: MS_STYLE,
|
|
887
|
+
term: "minimal_warm",
|
|
888
|
+
verdict: DECOMPOSED5
|
|
889
|
+
},
|
|
890
|
+
{
|
|
891
|
+
onto: [MINIMALISM5, "palette.temperature.cool"],
|
|
892
|
+
source: MS_STYLE,
|
|
893
|
+
term: "minimal_cool",
|
|
894
|
+
verdict: DECOMPOSED5
|
|
895
|
+
},
|
|
896
|
+
{
|
|
897
|
+
note: "Reads as consumer-modern, not Modernism. Mapped to `contemporary` on the strength of the dictionary's own pairing with `classic_tailored`.",
|
|
898
|
+
onto: [CONTEMPORARY5, SOFT_MOOD2],
|
|
899
|
+
source: MS_STYLE,
|
|
900
|
+
term: "soft_modern",
|
|
901
|
+
verdict: DECOMPOSED5
|
|
902
|
+
},
|
|
903
|
+
{
|
|
904
|
+
onto: [TRADITIONAL4, "mood.crisp"],
|
|
905
|
+
source: MS_STYLE,
|
|
906
|
+
term: "classic_tailored",
|
|
907
|
+
verdict: DECOMPOSED5
|
|
908
|
+
},
|
|
909
|
+
{
|
|
910
|
+
mintedTerm: [LUXURIOUS3],
|
|
911
|
+
onto: ["sector.residential", LUXURIOUS3],
|
|
912
|
+
source: MS_STYLE,
|
|
913
|
+
term: "residential_luxury",
|
|
914
|
+
verdict: DECOMPOSED5
|
|
915
|
+
},
|
|
916
|
+
{
|
|
917
|
+
mintedTerm: [LUXURIOUS3],
|
|
918
|
+
note: "Sector welded into style. Both halves land on axes that already existed.",
|
|
919
|
+
onto: ["sector.hospitality", LUXURIOUS3],
|
|
920
|
+
source: MS_STYLE,
|
|
921
|
+
term: "hospitality_luxury",
|
|
922
|
+
verdict: DECOMPOSED5
|
|
923
|
+
},
|
|
924
|
+
{
|
|
925
|
+
onto: ["style.organic_modernism", CALM2],
|
|
926
|
+
source: MS_STYLE,
|
|
927
|
+
term: "quiet_organic",
|
|
928
|
+
verdict: DECOMPOSED5
|
|
929
|
+
},
|
|
930
|
+
{
|
|
931
|
+
mintedAxis: ["typology.monastery"],
|
|
932
|
+
mintedTerm: [AUSTERE2],
|
|
933
|
+
onto: [EVOKES_MONASTERY2, AUSTERE2, MINIMALISM5],
|
|
934
|
+
source: MS_STYLE,
|
|
935
|
+
term: "monastic",
|
|
936
|
+
verdict: DECOMPOSED5
|
|
937
|
+
},
|
|
938
|
+
{
|
|
939
|
+
onto: [INDUSTRIAL5, "ms_character.refined (material axis)"],
|
|
940
|
+
source: MS_STYLE,
|
|
941
|
+
term: "industrial_refined",
|
|
942
|
+
verdict: DECOMPOSED5
|
|
943
|
+
},
|
|
944
|
+
{
|
|
945
|
+
note: "ms_character.crafted. A claim about how a material was made, carried in a style enum.",
|
|
946
|
+
onto: [],
|
|
947
|
+
reason: MATERIAL_PROPERTY2,
|
|
948
|
+
source: MS_STYLE,
|
|
949
|
+
term: "craft_forward",
|
|
950
|
+
verdict: OUT_OF_AXIS3
|
|
951
|
+
},
|
|
952
|
+
{
|
|
953
|
+
onto: [TRADITIONAL4],
|
|
954
|
+
source: MS_STYLE,
|
|
955
|
+
term: "decorative_traditional",
|
|
956
|
+
verdict: DECOMPOSED5
|
|
957
|
+
},
|
|
958
|
+
{
|
|
959
|
+
onto: [PLAYFUL2, "ms_pattern_type.abstract_graphic (material axis)"],
|
|
960
|
+
source: MS_STYLE,
|
|
961
|
+
term: "playful_graphic",
|
|
962
|
+
verdict: DECOMPOSED5
|
|
963
|
+
},
|
|
964
|
+
{
|
|
965
|
+
mintedAxis: ["typology.gallery"],
|
|
966
|
+
onto: [MINIMALISM5, "evokes(typology.gallery)"],
|
|
967
|
+
source: MS_STYLE,
|
|
968
|
+
term: "gallery_minimal",
|
|
969
|
+
verdict: DECOMPOSED5
|
|
970
|
+
},
|
|
971
|
+
{
|
|
972
|
+
mintedAxis: [COASTAL_LANDSCAPE4],
|
|
973
|
+
onto: [EVOKES_COASTAL4, SOFT_MOOD2],
|
|
974
|
+
source: MS_STYLE,
|
|
975
|
+
term: "coastal_soft",
|
|
976
|
+
verdict: DECOMPOSED5
|
|
977
|
+
},
|
|
978
|
+
{
|
|
979
|
+
onto: ["sector.workplace", CONTEMPORARY5],
|
|
980
|
+
source: MS_STYLE,
|
|
981
|
+
term: "workplace_contemporary",
|
|
982
|
+
verdict: DECOMPOSED5
|
|
983
|
+
},
|
|
984
|
+
{
|
|
985
|
+
onto: [MCM5],
|
|
986
|
+
source: MS_STYLE,
|
|
987
|
+
term: "mid_century_modern",
|
|
988
|
+
verdict: DECOMPOSED5
|
|
989
|
+
},
|
|
990
|
+
{
|
|
991
|
+
mintedAxis: [NORDIC_REGION5],
|
|
992
|
+
onto: [EVOKES_NORDIC5, WARM3],
|
|
993
|
+
source: MS_STYLE,
|
|
994
|
+
term: "nordic_warm",
|
|
995
|
+
verdict: DECOMPOSED5
|
|
996
|
+
},
|
|
997
|
+
// ─── materialgraph · ms_mood (14) - the one axis that already worked ───────────────────────
|
|
998
|
+
{
|
|
999
|
+
onto: ["mood.grounded"],
|
|
1000
|
+
source: MS_MOOD,
|
|
1001
|
+
term: "grounded",
|
|
1002
|
+
verdict: DECOMPOSED5
|
|
1003
|
+
},
|
|
1004
|
+
{ onto: [CALM2], source: MS_MOOD, term: "calm", verdict: DECOMPOSED5 },
|
|
1005
|
+
{ onto: [SOFT_MOOD2], source: MS_MOOD, term: "soft", verdict: DECOMPOSED5 },
|
|
1006
|
+
{ onto: ["mood.crisp"], source: MS_MOOD, term: "crisp", verdict: DECOMPOSED5 },
|
|
1007
|
+
{ onto: [MOODY3], source: MS_MOOD, term: "moody", verdict: DECOMPOSED5 },
|
|
1008
|
+
{ onto: ["mood.airy"], source: MS_MOOD, term: "airy", verdict: DECOMPOSED5 },
|
|
1009
|
+
{
|
|
1010
|
+
onto: ["mood.sensual"],
|
|
1011
|
+
source: MS_MOOD,
|
|
1012
|
+
term: "sensual",
|
|
1013
|
+
verdict: DECOMPOSED5
|
|
1014
|
+
},
|
|
1015
|
+
{
|
|
1016
|
+
onto: ["mood.serious"],
|
|
1017
|
+
source: MS_MOOD,
|
|
1018
|
+
term: "serious",
|
|
1019
|
+
verdict: DECOMPOSED5
|
|
1020
|
+
},
|
|
1021
|
+
{
|
|
1022
|
+
onto: [PLAYFUL2],
|
|
1023
|
+
source: MS_MOOD,
|
|
1024
|
+
term: "playful",
|
|
1025
|
+
verdict: DECOMPOSED5
|
|
1026
|
+
},
|
|
1027
|
+
{
|
|
1028
|
+
onto: ["mood.sheltering"],
|
|
1029
|
+
source: MS_MOOD,
|
|
1030
|
+
term: "sheltering",
|
|
1031
|
+
verdict: DECOMPOSED5
|
|
1032
|
+
},
|
|
1033
|
+
{
|
|
1034
|
+
onto: ["mood.quiet_luxury"],
|
|
1035
|
+
source: MS_MOOD,
|
|
1036
|
+
term: "quiet_luxury",
|
|
1037
|
+
verdict: DECOMPOSED5
|
|
1038
|
+
},
|
|
1039
|
+
{
|
|
1040
|
+
onto: ["mood.editorial"],
|
|
1041
|
+
source: MS_MOOD,
|
|
1042
|
+
term: "editorial",
|
|
1043
|
+
verdict: DECOMPOSED5
|
|
1044
|
+
},
|
|
1045
|
+
{
|
|
1046
|
+
onto: ["mood.domestic"],
|
|
1047
|
+
source: MS_MOOD,
|
|
1048
|
+
term: "domestic",
|
|
1049
|
+
verdict: DECOMPOSED5
|
|
1050
|
+
},
|
|
1051
|
+
{
|
|
1052
|
+
onto: ["mood.monumental"],
|
|
1053
|
+
source: MS_MOOD,
|
|
1054
|
+
term: "monumental",
|
|
1055
|
+
verdict: DECOMPOSED5
|
|
1056
|
+
},
|
|
1057
|
+
// ─── materialgraph · ms_character (13) - a MATERIAL axis, swept into a style census ────────
|
|
1058
|
+
{
|
|
1059
|
+
onto: [CALM2],
|
|
1060
|
+
source: MS_CHARACTER,
|
|
1061
|
+
term: "quiet",
|
|
1062
|
+
verdict: DECOMPOSED5
|
|
1063
|
+
},
|
|
1064
|
+
{
|
|
1065
|
+
note: "A material can be expressive in a calm room. Mapping it to a room mood inverts the claim.",
|
|
1066
|
+
onto: [],
|
|
1067
|
+
reason: MATERIAL_PROPERTY2,
|
|
1068
|
+
source: MS_CHARACTER,
|
|
1069
|
+
term: "expressive",
|
|
1070
|
+
verdict: OUT_OF_AXIS3
|
|
1071
|
+
},
|
|
1072
|
+
{
|
|
1073
|
+
onto: [],
|
|
1074
|
+
reason: MATERIAL_PROPERTY2,
|
|
1075
|
+
source: MS_CHARACTER,
|
|
1076
|
+
term: "restrained",
|
|
1077
|
+
verdict: OUT_OF_AXIS3
|
|
1078
|
+
},
|
|
1079
|
+
{
|
|
1080
|
+
onto: [],
|
|
1081
|
+
reason: MATERIAL_PROPERTY2,
|
|
1082
|
+
source: MS_CHARACTER,
|
|
1083
|
+
term: "bold",
|
|
1084
|
+
verdict: OUT_OF_AXIS3
|
|
1085
|
+
},
|
|
1086
|
+
{
|
|
1087
|
+
note: "Genuinely does double duty at both scales.",
|
|
1088
|
+
onto: [RUSTIC5],
|
|
1089
|
+
source: MS_CHARACTER,
|
|
1090
|
+
term: "rustic",
|
|
1091
|
+
verdict: DECOMPOSED5
|
|
1092
|
+
},
|
|
1093
|
+
{
|
|
1094
|
+
onto: [],
|
|
1095
|
+
reason: MATERIAL_PROPERTY2,
|
|
1096
|
+
source: MS_CHARACTER,
|
|
1097
|
+
term: "crafted",
|
|
1098
|
+
verdict: OUT_OF_AXIS3
|
|
1099
|
+
},
|
|
1100
|
+
{
|
|
1101
|
+
onto: [],
|
|
1102
|
+
reason: MATERIAL_PROPERTY2,
|
|
1103
|
+
source: MS_CHARACTER,
|
|
1104
|
+
term: "refined",
|
|
1105
|
+
verdict: OUT_OF_AXIS3
|
|
1106
|
+
},
|
|
1107
|
+
{
|
|
1108
|
+
note: "A formal dining room is a real room-scale claim, but `serious` understates the social convention `formal` carries.",
|
|
1109
|
+
onto: ["mood.serious"],
|
|
1110
|
+
source: MS_CHARACTER,
|
|
1111
|
+
term: "formal",
|
|
1112
|
+
verdict: "lossy"
|
|
1113
|
+
},
|
|
1114
|
+
{
|
|
1115
|
+
onto: ["mood.domestic"],
|
|
1116
|
+
source: MS_CHARACTER,
|
|
1117
|
+
term: "casual",
|
|
1118
|
+
verdict: "lossy"
|
|
1119
|
+
},
|
|
1120
|
+
{
|
|
1121
|
+
onto: [],
|
|
1122
|
+
reason: MATERIAL_PROPERTY2,
|
|
1123
|
+
source: MS_CHARACTER,
|
|
1124
|
+
term: "natural_reading",
|
|
1125
|
+
verdict: OUT_OF_AXIS3
|
|
1126
|
+
},
|
|
1127
|
+
{
|
|
1128
|
+
onto: [],
|
|
1129
|
+
reason: MATERIAL_PROPERTY2,
|
|
1130
|
+
source: MS_CHARACTER,
|
|
1131
|
+
term: "synthetic_reading",
|
|
1132
|
+
verdict: OUT_OF_AXIS3
|
|
1133
|
+
},
|
|
1134
|
+
{
|
|
1135
|
+
onto: [],
|
|
1136
|
+
reason: MATERIAL_PROPERTY2,
|
|
1137
|
+
source: MS_CHARACTER,
|
|
1138
|
+
term: "soft_reading",
|
|
1139
|
+
verdict: OUT_OF_AXIS3
|
|
1140
|
+
},
|
|
1141
|
+
{
|
|
1142
|
+
onto: [],
|
|
1143
|
+
reason: MATERIAL_PROPERTY2,
|
|
1144
|
+
source: MS_CHARACTER,
|
|
1145
|
+
term: "hard_reading",
|
|
1146
|
+
verdict: OUT_OF_AXIS3
|
|
1147
|
+
}
|
|
1148
|
+
];
|
|
1149
|
+
|
|
1150
|
+
// src/estate/rows/samplize.ts
|
|
1151
|
+
var SAMPLIZE = "samplize.colour_collections";
|
|
1152
|
+
var DECOMPOSED6 = "decomposed";
|
|
1153
|
+
var SAMPLIZE_ROWS = [
|
|
1154
|
+
{
|
|
1155
|
+
onto: ["palette.hue.white"],
|
|
1156
|
+
source: SAMPLIZE,
|
|
1157
|
+
term: "white",
|
|
1158
|
+
verdict: DECOMPOSED6
|
|
1159
|
+
},
|
|
1160
|
+
{
|
|
1161
|
+
onto: ["palette.hue.beige"],
|
|
1162
|
+
source: SAMPLIZE,
|
|
1163
|
+
term: "beige",
|
|
1164
|
+
verdict: DECOMPOSED6
|
|
1165
|
+
},
|
|
1166
|
+
{
|
|
1167
|
+
onto: ["palette.hue.taupe"],
|
|
1168
|
+
source: SAMPLIZE,
|
|
1169
|
+
term: "taupe",
|
|
1170
|
+
verdict: DECOMPOSED6
|
|
1171
|
+
},
|
|
1172
|
+
{
|
|
1173
|
+
note: "US spelling. The canon's id is `gray`, following colorscope verbatim, with the label set in British English. Ids follow the upstream source of truth; the spelling preference lives in the label.",
|
|
1174
|
+
onto: ["palette.hue.gray"],
|
|
1175
|
+
source: SAMPLIZE,
|
|
1176
|
+
term: "gray",
|
|
1177
|
+
verdict: DECOMPOSED6
|
|
1178
|
+
},
|
|
1179
|
+
{
|
|
1180
|
+
onto: ["palette.hue.green"],
|
|
1181
|
+
source: SAMPLIZE,
|
|
1182
|
+
term: "green",
|
|
1183
|
+
verdict: DECOMPOSED6
|
|
1184
|
+
},
|
|
1185
|
+
{
|
|
1186
|
+
onto: ["palette.hue.blue"],
|
|
1187
|
+
source: SAMPLIZE,
|
|
1188
|
+
term: "blue",
|
|
1189
|
+
verdict: DECOMPOSED6
|
|
1190
|
+
},
|
|
1191
|
+
{
|
|
1192
|
+
onto: ["palette.hue.red"],
|
|
1193
|
+
source: SAMPLIZE,
|
|
1194
|
+
term: "red",
|
|
1195
|
+
verdict: DECOMPOSED6
|
|
1196
|
+
},
|
|
1197
|
+
{
|
|
1198
|
+
onto: ["palette.hue.yellow"],
|
|
1199
|
+
source: SAMPLIZE,
|
|
1200
|
+
term: "yellow",
|
|
1201
|
+
verdict: DECOMPOSED6
|
|
1202
|
+
},
|
|
1203
|
+
{
|
|
1204
|
+
onto: ["palette.hue.orange"],
|
|
1205
|
+
source: SAMPLIZE,
|
|
1206
|
+
term: "orange",
|
|
1207
|
+
verdict: DECOMPOSED6
|
|
1208
|
+
},
|
|
1209
|
+
{
|
|
1210
|
+
note: "Not a hue. A consumer browsing paint treats neutral as a shelf beside green and blue, and the canon files it as an absence of cast on a different facet - which is the right model and a worse shopping experience.",
|
|
1211
|
+
onto: ["palette.temperature.neutral"],
|
|
1212
|
+
source: SAMPLIZE,
|
|
1213
|
+
term: "neutral",
|
|
1214
|
+
verdict: DECOMPOSED6
|
|
1215
|
+
},
|
|
1216
|
+
{
|
|
1217
|
+
note: "The same compound materia spells `earthy`, arrived at independently by a shopping surface. Two repositories inventing one compound is the pattern this canon exists to stop.",
|
|
1218
|
+
onto: [
|
|
1219
|
+
"palette.hue.brown",
|
|
1220
|
+
"palette.character.muted",
|
|
1221
|
+
"palette.temperature.warm"
|
|
1222
|
+
],
|
|
1223
|
+
source: SAMPLIZE,
|
|
1224
|
+
term: "earthy-tones",
|
|
1225
|
+
verdict: DECOMPOSED6
|
|
1226
|
+
},
|
|
1227
|
+
{
|
|
1228
|
+
onto: ["palette.character.light"],
|
|
1229
|
+
source: SAMPLIZE,
|
|
1230
|
+
term: "light",
|
|
1231
|
+
verdict: DECOMPOSED6
|
|
1232
|
+
},
|
|
1233
|
+
{
|
|
1234
|
+
note: "The largest band in the catalogue. The canon had no midpoint until this row forced the check - and the check found colorscope already governs one, spelled `mid`. Samplize's `medium` is recorded as a variant rather than minted as a term.",
|
|
1235
|
+
onto: ["palette.character.mid"],
|
|
1236
|
+
source: SAMPLIZE,
|
|
1237
|
+
term: "medium",
|
|
1238
|
+
verdict: DECOMPOSED6
|
|
1239
|
+
},
|
|
1240
|
+
{
|
|
1241
|
+
onto: ["palette.character.dark"],
|
|
1242
|
+
source: SAMPLIZE,
|
|
1243
|
+
term: "dark",
|
|
1244
|
+
verdict: DECOMPOSED6
|
|
1245
|
+
}
|
|
1246
|
+
];
|
|
1247
|
+
|
|
1248
|
+
// src/estate/rows/index.ts
|
|
1249
|
+
var DECOMPOSITION = [
|
|
1250
|
+
...MATERIA_ROWS,
|
|
1251
|
+
...ARCHITIZER_ROWS,
|
|
1252
|
+
...DESIGNROUND_ROWS,
|
|
1253
|
+
...DESIGNSHOP_ROWS,
|
|
1254
|
+
...MATERIALGRAPH_ROWS,
|
|
1255
|
+
...SAMPLIZE_ROWS
|
|
1256
|
+
];
|
|
1257
|
+
|
|
1258
|
+
// src/estate/sources.ts
|
|
1259
|
+
var MS_AESTHETICS = "packages/schema/src/registry/value-dictionaries/material-semantics-aesthetics.ts";
|
|
1260
|
+
var CAPTURED = "captured-free-text";
|
|
1261
|
+
var MATERIALGRAPH = "materialgraph";
|
|
1262
|
+
var SNAPSHOT = "2026-08-21";
|
|
1263
|
+
var DESIGNSHOP_SNAPSHOT = "2026-08-18";
|
|
1264
|
+
var MATERIA_SCENE_MOOD = {
|
|
1265
|
+
file: "packages/vision/src/scene-planner.ts",
|
|
1266
|
+
id: "materia.scene_mood",
|
|
1267
|
+
kind: "enum",
|
|
1268
|
+
name: "materia \xB7 SceneMoodSchema",
|
|
1269
|
+
purpose: "The mood a generated room render should be planned in. Every value is a compound: place, palette and style welded into one token.",
|
|
1270
|
+
repo: "materia",
|
|
1271
|
+
snapshot: SNAPSHOT,
|
|
1272
|
+
terms: [
|
|
1273
|
+
"serene-minimal",
|
|
1274
|
+
"warm-traditional",
|
|
1275
|
+
"moody-saturated",
|
|
1276
|
+
"sun-bleached-mediterranean",
|
|
1277
|
+
"soft-japandi",
|
|
1278
|
+
"tactile-monastic",
|
|
1279
|
+
"art-deco-luxe",
|
|
1280
|
+
"commercial-spec",
|
|
1281
|
+
"material-led"
|
|
1282
|
+
]
|
|
1283
|
+
};
|
|
1284
|
+
var MATERIA_INTENT_KEYWORDS = {
|
|
1285
|
+
file: "packages/search/src/product-search/classify-query.ts",
|
|
1286
|
+
id: "materia.intent_keywords",
|
|
1287
|
+
kind: "keyword-set",
|
|
1288
|
+
name: "materia \xB7 INTENT_KEYWORDS",
|
|
1289
|
+
purpose: "Words that route a search query to vector retrieval rather than BM25 alone. Not authored as a vocabulary at all - it mixes style, mood, colour, sector, room and bare query-intent markers in one flat set, because any of them signals the same thing to the router.",
|
|
1290
|
+
repo: "materia",
|
|
1291
|
+
snapshot: SNAPSHOT,
|
|
1292
|
+
terms: [
|
|
1293
|
+
"chalky",
|
|
1294
|
+
"coastal",
|
|
1295
|
+
"cognac",
|
|
1296
|
+
"earthy",
|
|
1297
|
+
"interesting",
|
|
1298
|
+
"moody",
|
|
1299
|
+
"playful",
|
|
1300
|
+
"quiet",
|
|
1301
|
+
"soft",
|
|
1302
|
+
"performance",
|
|
1303
|
+
"cleanable",
|
|
1304
|
+
"healthcare",
|
|
1305
|
+
"patterned",
|
|
1306
|
+
"faded",
|
|
1307
|
+
"warm",
|
|
1308
|
+
"cool",
|
|
1309
|
+
"modern",
|
|
1310
|
+
"rustic",
|
|
1311
|
+
"minimalist",
|
|
1312
|
+
"industrial",
|
|
1313
|
+
"hotel",
|
|
1314
|
+
"lobby",
|
|
1315
|
+
"spa",
|
|
1316
|
+
"boutique",
|
|
1317
|
+
"cozy",
|
|
1318
|
+
"luxurious",
|
|
1319
|
+
"vibe",
|
|
1320
|
+
"aesthetic",
|
|
1321
|
+
"feel",
|
|
1322
|
+
"style",
|
|
1323
|
+
"like",
|
|
1324
|
+
"similar",
|
|
1325
|
+
"mid-century",
|
|
1326
|
+
"contemporary",
|
|
1327
|
+
"traditional",
|
|
1328
|
+
"scandinavian",
|
|
1329
|
+
"mediterranean"
|
|
1330
|
+
]
|
|
1331
|
+
};
|
|
1332
|
+
var ARCHITIZER_STYLES = {
|
|
1333
|
+
file: "packages/db/src/projects/qualities/vocab.ts",
|
|
1334
|
+
id: "architizer.styles",
|
|
1335
|
+
kind: "enum",
|
|
1336
|
+
name: "architizer \xB7 STYLES",
|
|
1337
|
+
purpose: "Architectural idiom, extracted from project prose by an LLM constrained to this enum. Periods, movements and regional schools, deliberately mixed: the prompt calls style the one soft dimension and asks for a defensible reading even where the prose names no movement.",
|
|
1338
|
+
repo: "architizer",
|
|
1339
|
+
snapshot: SNAPSHOT,
|
|
1340
|
+
terms: [
|
|
1341
|
+
"Modernist",
|
|
1342
|
+
"Mid-century modern",
|
|
1343
|
+
"Brutalist",
|
|
1344
|
+
"Minimalist",
|
|
1345
|
+
"Rationalist",
|
|
1346
|
+
"Postmodern",
|
|
1347
|
+
"Deconstructivist",
|
|
1348
|
+
"Parametric",
|
|
1349
|
+
"High-tech",
|
|
1350
|
+
"Industrial",
|
|
1351
|
+
"Constructivist",
|
|
1352
|
+
"Vernacular",
|
|
1353
|
+
"Critical regionalist",
|
|
1354
|
+
"Tropical modernism",
|
|
1355
|
+
"Nordic modern",
|
|
1356
|
+
"Japanese contemporary",
|
|
1357
|
+
"Mediterranean",
|
|
1358
|
+
"Traditional",
|
|
1359
|
+
"Neoclassical",
|
|
1360
|
+
"Gothic",
|
|
1361
|
+
"Art Deco",
|
|
1362
|
+
"Organic",
|
|
1363
|
+
"Biophilic",
|
|
1364
|
+
"Sculptural",
|
|
1365
|
+
"Rustic"
|
|
1366
|
+
]
|
|
1367
|
+
};
|
|
1368
|
+
var DESIGNROUND_STYLE_ANCHORS = {
|
|
1369
|
+
file: "packages/ingestion/src/seed-anchors.ts",
|
|
1370
|
+
id: "designround.style_anchors",
|
|
1371
|
+
kind: "embedding-anchor",
|
|
1372
|
+
name: "designround \xB7 STYLE_ANCHORS",
|
|
1373
|
+
purpose: "Editorial compounds seeded as embedding anchors for image retrieval. Each label fronts a paragraph of prose; the label is a handle for humans and the prose is what actually matches.",
|
|
1374
|
+
repo: "designround",
|
|
1375
|
+
snapshot: SNAPSHOT,
|
|
1376
|
+
terms: [
|
|
1377
|
+
"Warm Minimalism",
|
|
1378
|
+
"English Country",
|
|
1379
|
+
"Modern Maximalism",
|
|
1380
|
+
"Contemporary Luxury",
|
|
1381
|
+
"Coastal & Natural",
|
|
1382
|
+
"Mid-Century Modern",
|
|
1383
|
+
"Industrial & Raw",
|
|
1384
|
+
"Classical & Grand",
|
|
1385
|
+
"Scandinavian",
|
|
1386
|
+
"Rustic & Artisan",
|
|
1387
|
+
"Art Deco & Glamour",
|
|
1388
|
+
"Moody & Dramatic"
|
|
1389
|
+
]
|
|
1390
|
+
};
|
|
1391
|
+
var DESIGNSHOP_SCHEME_STYLES = {
|
|
1392
|
+
file: "derived/room-schemes.json (field `style`)",
|
|
1393
|
+
id: "designshop.scheme_styles",
|
|
1394
|
+
kind: CAPTURED,
|
|
1395
|
+
name: "designshop \xB7 roomStyle",
|
|
1396
|
+
// The scheme total is deliberately not repeated here. It lives in the comment on
|
|
1397
|
+
// `DESIGNSHOP_SCHEME_STYLE_COUNTS` below, which is the input the usage bands are computed from
|
|
1398
|
+
// and has to keep its numbers. This field is prose written for a reader, so it takes the band.
|
|
1399
|
+
purpose: "The single style a merchandiser assigned to a published room scheme. The only vocabulary in the estate with real consumer usage behind it, at the scale of a full merchandised catalogue.",
|
|
1400
|
+
repo: "designshop",
|
|
1401
|
+
snapshot: DESIGNSHOP_SNAPSHOT,
|
|
1402
|
+
terms: [
|
|
1403
|
+
"Contemporary",
|
|
1404
|
+
"Modern",
|
|
1405
|
+
"Traditional",
|
|
1406
|
+
"Transitional",
|
|
1407
|
+
"Eclectic",
|
|
1408
|
+
"Minimalist",
|
|
1409
|
+
"Country",
|
|
1410
|
+
"Farmhouse",
|
|
1411
|
+
"Coastal"
|
|
1412
|
+
]
|
|
1413
|
+
};
|
|
1414
|
+
var DESIGNSHOP_SCHEME_STYLE_COUNTS = {
|
|
1415
|
+
Coastal: 73,
|
|
1416
|
+
Contemporary: 366,
|
|
1417
|
+
Country: 117,
|
|
1418
|
+
Eclectic: 159,
|
|
1419
|
+
Farmhouse: 113,
|
|
1420
|
+
Minimalist: 130,
|
|
1421
|
+
Modern: 348,
|
|
1422
|
+
Traditional: 335,
|
|
1423
|
+
Transitional: 237
|
|
1424
|
+
};
|
|
1425
|
+
var DESIGNSHOP_PRODUCT_STYLES = {
|
|
1426
|
+
file: "derived/products.csv (column `style`)",
|
|
1427
|
+
id: "designshop.product_styles",
|
|
1428
|
+
kind: CAPTURED,
|
|
1429
|
+
name: "designshop \xB7 attributes.Style",
|
|
1430
|
+
purpose: "The styles a product may be tagged with, multi-valued. A DIFFERENT vocabulary from the same company's room schemes, inside the same capture: it is larger, multi-select, and two of its values carry a stray space that stops them string-matching anything.",
|
|
1431
|
+
repo: "designshop",
|
|
1432
|
+
snapshot: DESIGNSHOP_SNAPSHOT,
|
|
1433
|
+
terms: [
|
|
1434
|
+
"Contemporary",
|
|
1435
|
+
"Modern",
|
|
1436
|
+
"Minimalist",
|
|
1437
|
+
"Scandinavian",
|
|
1438
|
+
"Transitional",
|
|
1439
|
+
"Classic/ Traditional",
|
|
1440
|
+
"Art Deco",
|
|
1441
|
+
"Eclectic",
|
|
1442
|
+
"Coastal",
|
|
1443
|
+
"Rustic",
|
|
1444
|
+
"Country/ Cottage",
|
|
1445
|
+
"Industrial",
|
|
1446
|
+
"Mid-Century Modern",
|
|
1447
|
+
"Farmhouse"
|
|
1448
|
+
]
|
|
1449
|
+
};
|
|
1450
|
+
var MATERIALGRAPH_MS_STYLE = {
|
|
1451
|
+
file: MS_AESTHETICS,
|
|
1452
|
+
id: "materialgraph.ms_style",
|
|
1453
|
+
kind: "enum",
|
|
1454
|
+
name: "materialgraph \xB7 ms_style",
|
|
1455
|
+
purpose: `Coarse style families for retrieval. The dictionary's own description is unusually honest about what it is: "routing handles, not editorial truths".`,
|
|
1456
|
+
repo: MATERIALGRAPH,
|
|
1457
|
+
snapshot: SNAPSHOT,
|
|
1458
|
+
terms: [
|
|
1459
|
+
"minimal_warm",
|
|
1460
|
+
"minimal_cool",
|
|
1461
|
+
"soft_modern",
|
|
1462
|
+
"classic_tailored",
|
|
1463
|
+
"residential_luxury",
|
|
1464
|
+
"hospitality_luxury",
|
|
1465
|
+
"quiet_organic",
|
|
1466
|
+
"monastic",
|
|
1467
|
+
"industrial_refined",
|
|
1468
|
+
"craft_forward",
|
|
1469
|
+
"decorative_traditional",
|
|
1470
|
+
"playful_graphic",
|
|
1471
|
+
"gallery_minimal",
|
|
1472
|
+
"coastal_soft",
|
|
1473
|
+
"workplace_contemporary",
|
|
1474
|
+
"mid_century_modern",
|
|
1475
|
+
"nordic_warm"
|
|
1476
|
+
]
|
|
1477
|
+
};
|
|
1478
|
+
var MATERIALGRAPH_MS_MOOD = {
|
|
1479
|
+
file: MS_AESTHETICS,
|
|
1480
|
+
id: "materialgraph.ms_mood",
|
|
1481
|
+
kind: "enum",
|
|
1482
|
+
name: "materialgraph \xB7 ms_mood",
|
|
1483
|
+
purpose: "Atmospheric mood descriptors, multi-select. The best-separated axis in the estate.",
|
|
1484
|
+
repo: MATERIALGRAPH,
|
|
1485
|
+
snapshot: SNAPSHOT,
|
|
1486
|
+
terms: [
|
|
1487
|
+
"grounded",
|
|
1488
|
+
"calm",
|
|
1489
|
+
"soft",
|
|
1490
|
+
"crisp",
|
|
1491
|
+
"moody",
|
|
1492
|
+
"airy",
|
|
1493
|
+
"sensual",
|
|
1494
|
+
"serious",
|
|
1495
|
+
"playful",
|
|
1496
|
+
"sheltering",
|
|
1497
|
+
"quiet_luxury",
|
|
1498
|
+
"editorial",
|
|
1499
|
+
"domestic",
|
|
1500
|
+
"monumental"
|
|
1501
|
+
]
|
|
1502
|
+
};
|
|
1503
|
+
var MATERIALGRAPH_MS_CHARACTER = {
|
|
1504
|
+
file: MS_AESTHETICS,
|
|
1505
|
+
id: "materialgraph.ms_character",
|
|
1506
|
+
kind: "enum",
|
|
1507
|
+
name: "materialgraph \xB7 ms_character",
|
|
1508
|
+
purpose: "The material's presence and reading, held deliberately apart from mood. A material axis, not an interiors one - which is why four of its terms decompose nowhere on the room-scale axes.",
|
|
1509
|
+
repo: MATERIALGRAPH,
|
|
1510
|
+
snapshot: SNAPSHOT,
|
|
1511
|
+
terms: [
|
|
1512
|
+
"quiet",
|
|
1513
|
+
"expressive",
|
|
1514
|
+
"restrained",
|
|
1515
|
+
"bold",
|
|
1516
|
+
"rustic",
|
|
1517
|
+
"crafted",
|
|
1518
|
+
"refined",
|
|
1519
|
+
"formal",
|
|
1520
|
+
"casual",
|
|
1521
|
+
"natural_reading",
|
|
1522
|
+
"synthetic_reading",
|
|
1523
|
+
"soft_reading",
|
|
1524
|
+
"hard_reading"
|
|
1525
|
+
]
|
|
1526
|
+
};
|
|
1527
|
+
var SAMPLIZE_COLOUR_COLLECTIONS = {
|
|
1528
|
+
file: "raw/samplize-shopify-products.jsonl.gz (Shopify `collections`)",
|
|
1529
|
+
id: "samplize.colour_collections",
|
|
1530
|
+
kind: CAPTURED,
|
|
1531
|
+
name: "samplize \xB7 colour collections",
|
|
1532
|
+
purpose: "How a sampling channel groups its peel-and-stick paint samples for browsing. Not a style vocabulary at all, which is why the first census missed it - it is a COLOUR vocabulary, and the only one in the estate built from what consumers actually shop by rather than from what a designer would say.",
|
|
1533
|
+
repo: "samplize",
|
|
1534
|
+
snapshot: DESIGNSHOP_SNAPSHOT,
|
|
1535
|
+
terms: [
|
|
1536
|
+
"white",
|
|
1537
|
+
"beige",
|
|
1538
|
+
"taupe",
|
|
1539
|
+
"gray",
|
|
1540
|
+
"neutral",
|
|
1541
|
+
"green",
|
|
1542
|
+
"blue",
|
|
1543
|
+
"red",
|
|
1544
|
+
"yellow",
|
|
1545
|
+
"orange",
|
|
1546
|
+
"earthy-tones",
|
|
1547
|
+
"light",
|
|
1548
|
+
"medium",
|
|
1549
|
+
"dark"
|
|
1550
|
+
]
|
|
1551
|
+
};
|
|
1552
|
+
var ESTATE_VOCABULARIES = [
|
|
1553
|
+
MATERIA_SCENE_MOOD,
|
|
1554
|
+
MATERIA_INTENT_KEYWORDS,
|
|
1555
|
+
ARCHITIZER_STYLES,
|
|
1556
|
+
DESIGNROUND_STYLE_ANCHORS,
|
|
1557
|
+
DESIGNSHOP_SCHEME_STYLES,
|
|
1558
|
+
DESIGNSHOP_PRODUCT_STYLES,
|
|
1559
|
+
MATERIALGRAPH_MS_STYLE,
|
|
1560
|
+
MATERIALGRAPH_MS_MOOD,
|
|
1561
|
+
MATERIALGRAPH_MS_CHARACTER,
|
|
1562
|
+
SAMPLIZE_COLOUR_COLLECTIONS
|
|
1563
|
+
];
|
|
1564
|
+
|
|
1565
|
+
// src/estate/concepts.ts
|
|
1566
|
+
var ESTATE_REPOS = [
|
|
1567
|
+
"materia",
|
|
1568
|
+
"architizer",
|
|
1569
|
+
"designround",
|
|
1570
|
+
"designshop",
|
|
1571
|
+
"materialgraph",
|
|
1572
|
+
"samplize"
|
|
1573
|
+
];
|
|
1574
|
+
var REPO_OF = {
|
|
1575
|
+
"architizer.styles": "architizer",
|
|
1576
|
+
"designround.style_anchors": "designround",
|
|
1577
|
+
"designshop.product_styles": "designshop",
|
|
1578
|
+
"designshop.scheme_styles": "designshop",
|
|
1579
|
+
"materia.intent_keywords": "materia",
|
|
1580
|
+
"materia.scene_mood": "materia",
|
|
1581
|
+
"materialgraph.ms_character": "materialgraph",
|
|
1582
|
+
"materialgraph.ms_mood": "materialgraph",
|
|
1583
|
+
"materialgraph.ms_style": "materialgraph",
|
|
1584
|
+
"samplize.colour_collections": "samplize"
|
|
1585
|
+
};
|
|
1586
|
+
var wordForm = (term) => term.toLowerCase().replaceAll(/[_-]+/gu, " ").replaceAll(/[&/]/gu, " ").replaceAll(/\s+/gu, " ").trim();
|
|
1587
|
+
var EVOKES = /^evokes\((?<target>.+)\)$/u;
|
|
1588
|
+
var resolveHead = (assertion) => {
|
|
1589
|
+
if (assertion.includes("(material axis)")) {
|
|
1590
|
+
return void 0;
|
|
1591
|
+
}
|
|
1592
|
+
const match = EVOKES.exec(assertion);
|
|
1593
|
+
return match?.groups?.target === void 0 ? { canonical: assertion, viaEvokes: false } : { canonical: match.groups.target, viaEvokes: true };
|
|
1594
|
+
};
|
|
1595
|
+
var heads = (row) => {
|
|
1596
|
+
const [first] = row.onto;
|
|
1597
|
+
if (first !== void 0) {
|
|
1598
|
+
const resolved2 = resolveHead(first);
|
|
1599
|
+
return resolved2 === void 0 ? [] : [resolved2];
|
|
1600
|
+
}
|
|
1601
|
+
const resolved = row.alternatives?.alternatives.flatMap(
|
|
1602
|
+
(alternative) => alternative.members.flatMap(({ assertion }) => {
|
|
1603
|
+
const candidate = resolveHead(assertion);
|
|
1604
|
+
return candidate === void 0 ? [] : [candidate];
|
|
1605
|
+
})
|
|
1606
|
+
);
|
|
1607
|
+
return resolved ?? [];
|
|
1608
|
+
};
|
|
1609
|
+
var axisOf = (canonical) => canonical.split(".")[0] ?? canonical;
|
|
1610
|
+
var concepts = () => {
|
|
1611
|
+
const grouped = /* @__PURE__ */ new Map();
|
|
1612
|
+
for (const row of DECOMPOSITION) {
|
|
1613
|
+
const resolvedHeads = heads(row);
|
|
1614
|
+
if (resolvedHeads.length === 0) {
|
|
1615
|
+
continue;
|
|
1616
|
+
}
|
|
1617
|
+
const repo = REPO_OF[row.source];
|
|
1618
|
+
if (repo === void 0) {
|
|
1619
|
+
throw new Error(`estate source has no repository: ${row.source}`);
|
|
1620
|
+
}
|
|
1621
|
+
for (const resolved of resolvedHeads) {
|
|
1622
|
+
const existing = grouped.get(resolved.canonical) ?? {
|
|
1623
|
+
cells: [],
|
|
1624
|
+
viaEvokes: resolved.viaEvokes
|
|
1625
|
+
};
|
|
1626
|
+
existing.cells.push({ repo, row, source: row.source, term: row.term });
|
|
1627
|
+
grouped.set(resolved.canonical, existing);
|
|
1628
|
+
}
|
|
1629
|
+
}
|
|
1630
|
+
const reposByAxis = /* @__PURE__ */ new Map();
|
|
1631
|
+
for (const [canonical, { cells }] of grouped) {
|
|
1632
|
+
const axis = axisOf(canonical);
|
|
1633
|
+
const repos = reposByAxis.get(axis) ?? /* @__PURE__ */ new Set();
|
|
1634
|
+
for (const cell of cells) {
|
|
1635
|
+
repos.add(cell.repo);
|
|
1636
|
+
}
|
|
1637
|
+
reposByAxis.set(axis, repos);
|
|
1638
|
+
}
|
|
1639
|
+
return [...grouped].map(([canonical, { cells, viaEvokes }]) => ({
|
|
1640
|
+
anchors: cells.filter((cell) => cell.row.verdict === "lossy").length,
|
|
1641
|
+
canonical,
|
|
1642
|
+
cells,
|
|
1643
|
+
couldReach: reposByAxis.get(axisOf(canonical))?.size ?? 1,
|
|
1644
|
+
declines: cells.filter((cell) => cell.row.verdict === "ambiguous").length,
|
|
1645
|
+
reach: new Set(cells.map((cell) => cell.repo)).size,
|
|
1646
|
+
viaEvokes,
|
|
1647
|
+
wordings: new Set(cells.map((cell) => wordForm(cell.term))).size
|
|
1648
|
+
})).toSorted(
|
|
1649
|
+
(a, b) => b.reach - a.reach || b.cells.length - a.cells.length || a.canonical.localeCompare(b.canonical)
|
|
1650
|
+
);
|
|
1651
|
+
};
|
|
1652
|
+
var disagreementsByAxis = ({
|
|
1653
|
+
minConcepts = 4
|
|
1654
|
+
} = {}) => {
|
|
1655
|
+
const byAxis = /* @__PURE__ */ new Map();
|
|
1656
|
+
for (const concept of concepts()) {
|
|
1657
|
+
const axis = axisOf(concept.canonical);
|
|
1658
|
+
byAxis.set(axis, [...byAxis.get(axis) ?? [], concept]);
|
|
1659
|
+
}
|
|
1660
|
+
const reposSpeaking = (axisConcepts) => {
|
|
1661
|
+
const speaking = /* @__PURE__ */ new Set();
|
|
1662
|
+
for (const concept of axisConcepts) {
|
|
1663
|
+
for (const cell of concept.cells) {
|
|
1664
|
+
speaking.add(cell.repo);
|
|
1665
|
+
}
|
|
1666
|
+
}
|
|
1667
|
+
return ESTATE_REPOS.filter((repo) => speaking.has(repo));
|
|
1668
|
+
};
|
|
1669
|
+
return [...byAxis].map(([axis, axisConcepts]) => ({
|
|
1670
|
+
axis,
|
|
1671
|
+
concepts: axisConcepts,
|
|
1672
|
+
repos: reposSpeaking(axisConcepts),
|
|
1673
|
+
shared: axisConcepts.filter((concept) => concept.reach > 1).length
|
|
1674
|
+
})).filter(
|
|
1675
|
+
(entry) => entry.repos.length > 1 && entry.concepts.length >= minConcepts
|
|
1676
|
+
).toSorted(
|
|
1677
|
+
(a, b) => b.shared - a.shared || b.concepts.length - a.concepts.length
|
|
1678
|
+
);
|
|
1679
|
+
};
|
|
1680
|
+
var MATRIX_COLUMNS = ESTATE_VOCABULARIES.map((vocabulary) => {
|
|
1681
|
+
const repo = REPO_OF[vocabulary.id];
|
|
1682
|
+
if (repo === void 0) {
|
|
1683
|
+
throw new Error(`estate vocabulary has no repository: ${vocabulary.id}`);
|
|
1684
|
+
}
|
|
1685
|
+
return { id: vocabulary.id, label: vocabulary.name, repo };
|
|
1686
|
+
});
|
|
1687
|
+
var agreementSummary = () => {
|
|
1688
|
+
const all = concepts();
|
|
1689
|
+
const spellings = new Set(
|
|
1690
|
+
DECOMPOSITION.map((row) => row.term.toLowerCase().trim())
|
|
1691
|
+
);
|
|
1692
|
+
const byRepo = /* @__PURE__ */ new Map();
|
|
1693
|
+
for (const row of DECOMPOSITION) {
|
|
1694
|
+
const folded = row.term.toLowerCase().trim();
|
|
1695
|
+
const repos = byRepo.get(folded) ?? /* @__PURE__ */ new Set();
|
|
1696
|
+
const repo = REPO_OF[row.source];
|
|
1697
|
+
if (repo !== void 0) {
|
|
1698
|
+
repos.add(repo);
|
|
1699
|
+
}
|
|
1700
|
+
byRepo.set(folded, repos);
|
|
1701
|
+
}
|
|
1702
|
+
const shared = all.filter((concept) => concept.reach > 1);
|
|
1703
|
+
return {
|
|
1704
|
+
concepts: all.length,
|
|
1705
|
+
distinctSpellings: spellings.size,
|
|
1706
|
+
exactStringMatchesAcrossRepos: [...byRepo.values()].filter(
|
|
1707
|
+
(repos) => repos.size > 1
|
|
1708
|
+
).length,
|
|
1709
|
+
reachedByAll: all.filter((concept) => concept.reach === concept.couldReach).length,
|
|
1710
|
+
reachedByFourOrMore: all.filter((concept) => concept.reach >= 4).length,
|
|
1711
|
+
repos: ESTATE_REPOS.length,
|
|
1712
|
+
shared: shared.length,
|
|
1713
|
+
spellingOnly: shared.filter((concept) => concept.wordings === 1).length
|
|
1714
|
+
};
|
|
1715
|
+
};
|
|
1716
|
+
var ambiguousStyleShare = () => {
|
|
1717
|
+
const counts = Object.values(DESIGNSHOP_SCHEME_STYLE_COUNTS);
|
|
1718
|
+
const total = counts.reduce((sum, count) => sum + count, 0);
|
|
1719
|
+
const ambiguous = (DESIGNSHOP_SCHEME_STYLE_COUNTS.Modern ?? 0) + (DESIGNSHOP_SCHEME_STYLE_COUNTS.Contemporary ?? 0);
|
|
1720
|
+
return Math.round(ambiguous / total * 100);
|
|
1721
|
+
};
|
|
1722
|
+
|
|
1723
|
+
// src/estate/residue-report.ts
|
|
1724
|
+
var isExcluded = (row) => row.verdict === "out-of-axis" && (row.reason === "query-marker" || row.reason === "material-property");
|
|
1725
|
+
var AESTHETIC = DECOMPOSITION.filter(
|
|
1726
|
+
(row) => !isExcluded(row)
|
|
1727
|
+
);
|
|
1728
|
+
var countBy = (rows, verdict) => rows.filter((row) => row.verdict === verdict).length;
|
|
1729
|
+
var needsMinting = (row) => (row.mintedTerm?.length ?? 0) > 0 || (row.mintedAxis?.length ?? 0) > 0;
|
|
1730
|
+
var residueReport = () => {
|
|
1731
|
+
const aesthetic = AESTHETIC.length;
|
|
1732
|
+
const decomposed = countBy(AESTHETIC, "decomposed");
|
|
1733
|
+
const preExisting = AESTHETIC.filter(
|
|
1734
|
+
(row) => row.verdict === "decomposed" && !needsMinting(row)
|
|
1735
|
+
).length;
|
|
1736
|
+
return {
|
|
1737
|
+
aesthetic,
|
|
1738
|
+
ambiguous: countBy(AESTHETIC, "ambiguous"),
|
|
1739
|
+
cleanRate: decomposed / aesthetic,
|
|
1740
|
+
decomposed,
|
|
1741
|
+
excluded: DECOMPOSITION.length - aesthetic,
|
|
1742
|
+
lossy: countBy(AESTHETIC, "lossy"),
|
|
1743
|
+
neededMintedAxis: DECOMPOSITION.filter(
|
|
1744
|
+
(row) => (row.mintedAxis?.length ?? 0) > 0
|
|
1745
|
+
).length,
|
|
1746
|
+
neededMintedTerm: DECOMPOSITION.filter(
|
|
1747
|
+
(row) => (row.mintedTerm?.length ?? 0) > 0
|
|
1748
|
+
).length,
|
|
1749
|
+
outOfAxis: countBy(AESTHETIC, "out-of-axis"),
|
|
1750
|
+
preExisting,
|
|
1751
|
+
preExistingRate: preExisting / aesthetic,
|
|
1752
|
+
residue: countBy(AESTHETIC, "residue"),
|
|
1753
|
+
total: DECOMPOSITION.length
|
|
1754
|
+
};
|
|
1755
|
+
};
|
|
1756
|
+
var tally = (pick) => {
|
|
1757
|
+
const counts = /* @__PURE__ */ new Map();
|
|
1758
|
+
for (const row of DECOMPOSITION) {
|
|
1759
|
+
for (const target of pick(row) ?? []) {
|
|
1760
|
+
counts.set(target, (counts.get(target) ?? 0) + 1);
|
|
1761
|
+
}
|
|
1762
|
+
}
|
|
1763
|
+
return [...counts].toSorted((a, b) => b[1] - a[1]);
|
|
1764
|
+
};
|
|
1765
|
+
var mintingDemand = () => ({
|
|
1766
|
+
onExistingAxes: tally((row) => row.mintedTerm),
|
|
1767
|
+
onNewAxes: tally((row) => row.mintedAxis)
|
|
1768
|
+
});
|
|
1769
|
+
var rateBySource = () => {
|
|
1770
|
+
const sources = [...new Set(DECOMPOSITION.map((row) => row.source))];
|
|
1771
|
+
return sources.map((source) => {
|
|
1772
|
+
const rows = AESTHETIC.filter((row) => row.source === source);
|
|
1773
|
+
return {
|
|
1774
|
+
decomposed: rows.filter((row) => row.verdict === "decomposed").length,
|
|
1775
|
+
source,
|
|
1776
|
+
terms: rows.length
|
|
1777
|
+
};
|
|
1778
|
+
});
|
|
1779
|
+
};
|
|
1780
|
+
var unresolved = () => DECOMPOSITION.filter(
|
|
1781
|
+
(row) => row.verdict === "lossy" || row.verdict === "ambiguous" || row.verdict === "residue"
|
|
1782
|
+
);
|
|
1783
|
+
var declaredGaps = () => DECOMPOSITION.filter((row) => row.reason === "axis-not-authored");
|
|
1784
|
+
export {
|
|
1785
|
+
ARCHITIZER_STYLES,
|
|
1786
|
+
DECOMPOSITION,
|
|
1787
|
+
DESIGNROUND_STYLE_ANCHORS,
|
|
1788
|
+
DESIGNSHOP_PRODUCT_STYLES,
|
|
1789
|
+
DESIGNSHOP_SCHEME_STYLES,
|
|
1790
|
+
DESIGNSHOP_SCHEME_STYLE_COUNTS,
|
|
1791
|
+
ESTATE_REPOS,
|
|
1792
|
+
ESTATE_VOCABULARIES,
|
|
1793
|
+
MATERIALGRAPH_MS_CHARACTER,
|
|
1794
|
+
MATERIALGRAPH_MS_MOOD,
|
|
1795
|
+
MATERIALGRAPH_MS_STYLE,
|
|
1796
|
+
MATERIA_INTENT_KEYWORDS,
|
|
1797
|
+
MATERIA_SCENE_MOOD,
|
|
1798
|
+
MATRIX_COLUMNS,
|
|
1799
|
+
agreementSummary,
|
|
1800
|
+
ambiguousStyleShare,
|
|
1801
|
+
concepts,
|
|
1802
|
+
declaredGaps,
|
|
1803
|
+
disagreementsByAxis,
|
|
1804
|
+
mintingDemand,
|
|
1805
|
+
rateBySource,
|
|
1806
|
+
residueReport,
|
|
1807
|
+
unresolved
|
|
1808
|
+
};
|