@pagefront/lint-commerce 0.10.0 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,4883 @@
1
+ // Generated by scripts/bundle-schemas.mjs; do not edit, do not commit.
2
+ export const SCHEMAS = {
3
+ "https://themachineweb.org/pagefront/spec/commerce/organization/v0.3.0.json": {
4
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
5
+ "$id": "https://themachineweb.org/pagefront/spec/commerce/organization/v0.3.0.json",
6
+ "title": "Pagefront Commerce Organization Sheet 0.3.0",
7
+ "description": "Sheet spec version 0.3.0, a member of commerce release 0.3.0: the envelope carries release in place of format_version, and $schema names this sheet-spec version; a sheet carrying format_version belongs to the legacy draft line and validates against the legacy schema at .../organization/v0.9.json, which is otherwise identical. Formal schema for the Pagefront Commerce Organization Sheet — the sheet describing the entity behind products (brand owner, manufacturer, seller), introduced with commerce format 0.9 alongside the reference-capable legalEntity and the seller-sheet return/shipping model. The data block roots on Schema.org Organization (recognized subtypes permitted; @type is not constrained to a single value). pagefront:commerceRole is the required role discriminator, an array of one or more values from the closed enum brand_owner / manufacturer / seller. pagefront:fulfillmentTerms carries the store-wide shipping defaults as an array of Schema.org-native OfferShippingDetails objects; only the attachment shell is validated, the payload is Schema.org content. pagefront:socialAccount carries the organization's official social accounts (platform / url / handle; publisher-stated only), distinct from sameAs, which carries identity authority records only. pagefront:authorizedResellers carries the brand's authorization claim over its distribution — a pagefront:AuthorizedResellers object with an optional exhaustive flag and a reseller array whose entries name an Organization either as a reference stub (@id) or inline (name plus url and/or address), with optional Schema.org-native areaServed; valid only where commerceRole includes brand_owner (linter ORG-W-006). There is no GTIN-equivalent identifier requirement: identity is @id + name. Validates the envelope and pagefront-namespaced extensions strictly; Schema.org-typed blocks permit additional unspecified properties.",
8
+ "type": "object",
9
+ "required": [
10
+ "release",
11
+ "schema_org_version",
12
+ "canonical_url",
13
+ "sheet_url",
14
+ "generated_at",
15
+ "data"
16
+ ],
17
+ "properties": {
18
+ "$schema": {
19
+ "type": "string",
20
+ "format": "uri"
21
+ },
22
+ "release": {
23
+ "type": "string",
24
+ "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)$"
25
+ },
26
+ "schema_org_version": {
27
+ "type": "string",
28
+ "pattern": "^\\d+(\\.\\d+)?$"
29
+ },
30
+ "canonical_url": {
31
+ "type": "string",
32
+ "format": "uri"
33
+ },
34
+ "sheet_url": {
35
+ "type": "string",
36
+ "format": "uri"
37
+ },
38
+ "generated_at": {
39
+ "type": "string",
40
+ "format": "date-time"
41
+ },
42
+ "expires_at": {
43
+ "type": "string",
44
+ "format": "date-time"
45
+ },
46
+ "data": {
47
+ "$ref": "#/$defs/dataBlock"
48
+ }
49
+ },
50
+ "additionalProperties": false,
51
+ "$defs": {
52
+ "dataBlock": {
53
+ "type": "object",
54
+ "required": [
55
+ "@context",
56
+ "@type",
57
+ "@id",
58
+ "name",
59
+ "inLanguage",
60
+ "pagefront:commerceRole"
61
+ ],
62
+ "properties": {
63
+ "@context": {
64
+ "oneOf": [
65
+ {
66
+ "const": "https://schema.org"
67
+ },
68
+ {
69
+ "type": "array",
70
+ "items": {
71
+ "oneOf": [
72
+ {
73
+ "type": "string",
74
+ "format": "uri"
75
+ },
76
+ {
77
+ "type": "object"
78
+ }
79
+ ]
80
+ },
81
+ "minItems": 1
82
+ }
83
+ ]
84
+ },
85
+ "@type": {
86
+ "type": "string"
87
+ },
88
+ "@id": {
89
+ "type": "string",
90
+ "format": "uri"
91
+ },
92
+ "name": {
93
+ "type": "string",
94
+ "minLength": 1
95
+ },
96
+ "legalName": {
97
+ "type": "string"
98
+ },
99
+ "inLanguage": {
100
+ "type": "string"
101
+ },
102
+ "url": {
103
+ "type": "string",
104
+ "format": "uri"
105
+ },
106
+ "description": {
107
+ "type": "string"
108
+ },
109
+ "slogan": {
110
+ "type": "string"
111
+ },
112
+ "logo": {
113
+ "oneOf": [
114
+ {
115
+ "type": "string",
116
+ "format": "uri"
117
+ },
118
+ {
119
+ "type": "object"
120
+ }
121
+ ]
122
+ },
123
+ "iso6523Code": {
124
+ "type": "string"
125
+ },
126
+ "identifier": {
127
+ "oneOf": [
128
+ {
129
+ "type": "string"
130
+ },
131
+ {
132
+ "type": "object"
133
+ },
134
+ {
135
+ "type": "array",
136
+ "items": {
137
+ "oneOf": [
138
+ {
139
+ "type": "string"
140
+ },
141
+ {
142
+ "type": "object"
143
+ }
144
+ ]
145
+ }
146
+ }
147
+ ]
148
+ },
149
+ "sameAs": {
150
+ "oneOf": [
151
+ {
152
+ "type": "string",
153
+ "format": "uri"
154
+ },
155
+ {
156
+ "type": "array",
157
+ "items": {
158
+ "type": "string",
159
+ "format": "uri"
160
+ }
161
+ }
162
+ ]
163
+ },
164
+ "email": {
165
+ "type": "string",
166
+ "format": "email"
167
+ },
168
+ "address": {
169
+ "type": "object"
170
+ },
171
+ "contactPoint": {
172
+ "oneOf": [
173
+ {
174
+ "type": "object"
175
+ },
176
+ {
177
+ "type": "array",
178
+ "items": {
179
+ "type": "object"
180
+ }
181
+ }
182
+ ]
183
+ },
184
+ "foundingDate": {
185
+ "type": "string"
186
+ },
187
+ "numberOfEmployees": {
188
+ "type": "object"
189
+ },
190
+ "parentOrganization": {
191
+ "type": "object"
192
+ },
193
+ "subOrganization": {
194
+ "oneOf": [
195
+ {
196
+ "type": "object"
197
+ },
198
+ {
199
+ "type": "array",
200
+ "items": {
201
+ "type": "object"
202
+ }
203
+ }
204
+ ]
205
+ },
206
+ "location": {
207
+ "oneOf": [
208
+ {
209
+ "type": "object"
210
+ },
211
+ {
212
+ "type": "array",
213
+ "items": {
214
+ "type": "object"
215
+ }
216
+ }
217
+ ]
218
+ },
219
+ "brand": {
220
+ "type": "object"
221
+ },
222
+ "aggregateRating": {
223
+ "type": "object"
224
+ },
225
+ "hasCertification": {
226
+ "type": "array",
227
+ "items": {
228
+ "$ref": "#/$defs/certification"
229
+ }
230
+ },
231
+ "hasMerchantReturnPolicy": {
232
+ "type": "object"
233
+ },
234
+ "paymentAccepted": {
235
+ "oneOf": [
236
+ {
237
+ "type": "string"
238
+ },
239
+ {
240
+ "type": "array",
241
+ "items": {
242
+ "type": "string"
243
+ }
244
+ }
245
+ ]
246
+ },
247
+ "pagefront:commerceRole": {
248
+ "type": "array",
249
+ "minItems": 1,
250
+ "items": {
251
+ "type": "string",
252
+ "enum": [
253
+ "brand_owner",
254
+ "manufacturer",
255
+ "seller"
256
+ ]
257
+ }
258
+ },
259
+ "pagefront:fulfillmentTerms": {
260
+ "type": "array",
261
+ "items": {
262
+ "type": "object",
263
+ "required": [
264
+ "@type"
265
+ ],
266
+ "properties": {
267
+ "@type": {
268
+ "const": "OfferShippingDetails"
269
+ }
270
+ },
271
+ "additionalProperties": true
272
+ }
273
+ },
274
+ "pagefront:socialAccount": {
275
+ "type": "array",
276
+ "items": {
277
+ "type": "object",
278
+ "required": [
279
+ "platform",
280
+ "url"
281
+ ],
282
+ "properties": {
283
+ "@type": {
284
+ "const": "pagefront:SocialAccount"
285
+ },
286
+ "platform": {
287
+ "type": "string",
288
+ "minLength": 1
289
+ },
290
+ "url": {
291
+ "type": "string",
292
+ "format": "uri"
293
+ },
294
+ "handle": {
295
+ "type": "string",
296
+ "minLength": 1
297
+ }
298
+ },
299
+ "additionalProperties": true
300
+ }
301
+ },
302
+ "pagefront:authorizedResellers": {
303
+ "type": "object",
304
+ "required": [
305
+ "reseller"
306
+ ],
307
+ "properties": {
308
+ "@type": {
309
+ "const": "pagefront:AuthorizedResellers"
310
+ },
311
+ "exhaustive": {
312
+ "type": "boolean"
313
+ },
314
+ "reseller": {
315
+ "type": "array",
316
+ "minItems": 1,
317
+ "items": {
318
+ "type": "object",
319
+ "required": [
320
+ "organization"
321
+ ],
322
+ "properties": {
323
+ "organization": {
324
+ "type": "object",
325
+ "properties": {
326
+ "@type": {
327
+ "type": "string"
328
+ },
329
+ "@id": {
330
+ "type": "string",
331
+ "format": "uri"
332
+ },
333
+ "name": {
334
+ "type": "string",
335
+ "minLength": 1
336
+ },
337
+ "url": {
338
+ "type": "string",
339
+ "format": "uri"
340
+ },
341
+ "address": {
342
+ "type": "object"
343
+ }
344
+ },
345
+ "anyOf": [
346
+ {
347
+ "required": [
348
+ "@id"
349
+ ]
350
+ },
351
+ {
352
+ "required": [
353
+ "name",
354
+ "url"
355
+ ]
356
+ },
357
+ {
358
+ "required": [
359
+ "name",
360
+ "address"
361
+ ]
362
+ }
363
+ ],
364
+ "additionalProperties": true
365
+ },
366
+ "areaServed": {
367
+ "oneOf": [
368
+ {
369
+ "type": "object"
370
+ },
371
+ {
372
+ "type": "array",
373
+ "minItems": 1,
374
+ "items": {
375
+ "type": "object"
376
+ }
377
+ }
378
+ ]
379
+ }
380
+ },
381
+ "additionalProperties": false
382
+ }
383
+ }
384
+ },
385
+ "additionalProperties": false
386
+ },
387
+ "pagefront:availableLanguages": {
388
+ "type": "array",
389
+ "items": {
390
+ "type": "object",
391
+ "required": [
392
+ "lang",
393
+ "url"
394
+ ],
395
+ "properties": {
396
+ "lang": {
397
+ "type": "string"
398
+ },
399
+ "url": {
400
+ "type": "string",
401
+ "format": "uri"
402
+ }
403
+ },
404
+ "additionalProperties": false
405
+ }
406
+ }
407
+ },
408
+ "additionalProperties": true
409
+ },
410
+ "certification": {
411
+ "type": "object",
412
+ "required": [
413
+ "@type",
414
+ "name"
415
+ ],
416
+ "properties": {
417
+ "@type": {
418
+ "const": "Certification"
419
+ },
420
+ "name": {
421
+ "type": "string"
422
+ },
423
+ "issuedBy": {
424
+ "type": "object"
425
+ },
426
+ "about": {
427
+ "type": "string"
428
+ },
429
+ "additionalProperty": {
430
+ "type": "array"
431
+ }
432
+ },
433
+ "additionalProperties": true
434
+ }
435
+ }
436
+ },
437
+ "https://themachineweb.org/pagefront/spec/commerce/organization/v0.9.json": {
438
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
439
+ "$id": "https://themachineweb.org/pagefront/spec/commerce/organization/v0.9.json",
440
+ "title": "Pagefront Commerce Organization Sheet v0.9",
441
+ "description": "Formal schema for the Pagefront Commerce Organization Sheet — the sheet describing the entity behind products (brand owner, manufacturer, seller), introduced with commerce format 0.9 alongside the reference-capable legalEntity and the seller-sheet return/shipping model. The data block roots on Schema.org Organization (recognized subtypes permitted; @type is not constrained to a single value). pagefront:commerceRole is the required role discriminator, an array of one or more values from the closed enum brand_owner / manufacturer / seller. pagefront:fulfillmentTerms carries the store-wide shipping defaults as an array of Schema.org-native OfferShippingDetails objects; only the attachment shell is validated, the payload is Schema.org content. pagefront:socialAccount carries the organization's official social accounts (platform / url / handle; publisher-stated only), distinct from sameAs, which carries identity authority records only. pagefront:authorizedResellers carries the brand's authorization claim over its distribution — a pagefront:AuthorizedResellers object with an optional exhaustive flag and a reseller array whose entries name an Organization either as a reference stub (@id) or inline (name plus url and/or address), with optional Schema.org-native areaServed; valid only where commerceRole includes brand_owner (linter ORG-W-006). There is no GTIN-equivalent identifier requirement: identity is @id + name. Validates the envelope and pagefront-namespaced extensions strictly; Schema.org-typed blocks permit additional unspecified properties.",
442
+ "type": "object",
443
+ "required": [
444
+ "format_version",
445
+ "schema_org_version",
446
+ "canonical_url",
447
+ "sheet_url",
448
+ "generated_at",
449
+ "data"
450
+ ],
451
+ "properties": {
452
+ "$schema": {
453
+ "type": "string",
454
+ "format": "uri"
455
+ },
456
+ "format_version": {
457
+ "const": "0.9"
458
+ },
459
+ "schema_org_version": {
460
+ "type": "string",
461
+ "pattern": "^\\d+(\\.\\d+)?$"
462
+ },
463
+ "canonical_url": {
464
+ "type": "string",
465
+ "format": "uri"
466
+ },
467
+ "sheet_url": {
468
+ "type": "string",
469
+ "format": "uri"
470
+ },
471
+ "generated_at": {
472
+ "type": "string",
473
+ "format": "date-time"
474
+ },
475
+ "expires_at": {
476
+ "type": "string",
477
+ "format": "date-time"
478
+ },
479
+ "data": {
480
+ "$ref": "#/$defs/dataBlock"
481
+ }
482
+ },
483
+ "additionalProperties": false,
484
+ "$defs": {
485
+ "dataBlock": {
486
+ "type": "object",
487
+ "required": [
488
+ "@context",
489
+ "@type",
490
+ "@id",
491
+ "name",
492
+ "inLanguage",
493
+ "pagefront:commerceRole"
494
+ ],
495
+ "properties": {
496
+ "@context": {
497
+ "oneOf": [
498
+ {
499
+ "const": "https://schema.org"
500
+ },
501
+ {
502
+ "type": "array",
503
+ "items": {
504
+ "oneOf": [
505
+ {
506
+ "type": "string",
507
+ "format": "uri"
508
+ },
509
+ {
510
+ "type": "object"
511
+ }
512
+ ]
513
+ },
514
+ "minItems": 1
515
+ }
516
+ ]
517
+ },
518
+ "@type": {
519
+ "type": "string"
520
+ },
521
+ "@id": {
522
+ "type": "string",
523
+ "format": "uri"
524
+ },
525
+ "name": {
526
+ "type": "string",
527
+ "minLength": 1
528
+ },
529
+ "legalName": {
530
+ "type": "string"
531
+ },
532
+ "inLanguage": {
533
+ "type": "string"
534
+ },
535
+ "url": {
536
+ "type": "string",
537
+ "format": "uri"
538
+ },
539
+ "description": {
540
+ "type": "string"
541
+ },
542
+ "slogan": {
543
+ "type": "string"
544
+ },
545
+ "logo": {
546
+ "oneOf": [
547
+ {
548
+ "type": "string",
549
+ "format": "uri"
550
+ },
551
+ {
552
+ "type": "object"
553
+ }
554
+ ]
555
+ },
556
+ "iso6523Code": {
557
+ "type": "string"
558
+ },
559
+ "identifier": {
560
+ "oneOf": [
561
+ {
562
+ "type": "string"
563
+ },
564
+ {
565
+ "type": "object"
566
+ },
567
+ {
568
+ "type": "array",
569
+ "items": {
570
+ "oneOf": [
571
+ {
572
+ "type": "string"
573
+ },
574
+ {
575
+ "type": "object"
576
+ }
577
+ ]
578
+ }
579
+ }
580
+ ]
581
+ },
582
+ "sameAs": {
583
+ "oneOf": [
584
+ {
585
+ "type": "string",
586
+ "format": "uri"
587
+ },
588
+ {
589
+ "type": "array",
590
+ "items": {
591
+ "type": "string",
592
+ "format": "uri"
593
+ }
594
+ }
595
+ ]
596
+ },
597
+ "email": {
598
+ "type": "string",
599
+ "format": "email"
600
+ },
601
+ "address": {
602
+ "type": "object"
603
+ },
604
+ "contactPoint": {
605
+ "oneOf": [
606
+ {
607
+ "type": "object"
608
+ },
609
+ {
610
+ "type": "array",
611
+ "items": {
612
+ "type": "object"
613
+ }
614
+ }
615
+ ]
616
+ },
617
+ "foundingDate": {
618
+ "type": "string"
619
+ },
620
+ "numberOfEmployees": {
621
+ "type": "object"
622
+ },
623
+ "parentOrganization": {
624
+ "type": "object"
625
+ },
626
+ "subOrganization": {
627
+ "oneOf": [
628
+ {
629
+ "type": "object"
630
+ },
631
+ {
632
+ "type": "array",
633
+ "items": {
634
+ "type": "object"
635
+ }
636
+ }
637
+ ]
638
+ },
639
+ "location": {
640
+ "oneOf": [
641
+ {
642
+ "type": "object"
643
+ },
644
+ {
645
+ "type": "array",
646
+ "items": {
647
+ "type": "object"
648
+ }
649
+ }
650
+ ]
651
+ },
652
+ "brand": {
653
+ "type": "object"
654
+ },
655
+ "aggregateRating": {
656
+ "type": "object"
657
+ },
658
+ "hasCertification": {
659
+ "type": "array",
660
+ "items": {
661
+ "$ref": "#/$defs/certification"
662
+ }
663
+ },
664
+ "hasMerchantReturnPolicy": {
665
+ "type": "object"
666
+ },
667
+ "paymentAccepted": {
668
+ "oneOf": [
669
+ {
670
+ "type": "string"
671
+ },
672
+ {
673
+ "type": "array",
674
+ "items": {
675
+ "type": "string"
676
+ }
677
+ }
678
+ ]
679
+ },
680
+ "pagefront:commerceRole": {
681
+ "type": "array",
682
+ "minItems": 1,
683
+ "items": {
684
+ "type": "string",
685
+ "enum": [
686
+ "brand_owner",
687
+ "manufacturer",
688
+ "seller"
689
+ ]
690
+ }
691
+ },
692
+ "pagefront:fulfillmentTerms": {
693
+ "type": "array",
694
+ "items": {
695
+ "type": "object",
696
+ "required": [
697
+ "@type"
698
+ ],
699
+ "properties": {
700
+ "@type": {
701
+ "const": "OfferShippingDetails"
702
+ }
703
+ },
704
+ "additionalProperties": true
705
+ }
706
+ },
707
+ "pagefront:socialAccount": {
708
+ "type": "array",
709
+ "items": {
710
+ "type": "object",
711
+ "required": [
712
+ "platform",
713
+ "url"
714
+ ],
715
+ "properties": {
716
+ "@type": {
717
+ "const": "pagefront:SocialAccount"
718
+ },
719
+ "platform": {
720
+ "type": "string",
721
+ "minLength": 1
722
+ },
723
+ "url": {
724
+ "type": "string",
725
+ "format": "uri"
726
+ },
727
+ "handle": {
728
+ "type": "string",
729
+ "minLength": 1
730
+ }
731
+ },
732
+ "additionalProperties": true
733
+ }
734
+ },
735
+ "pagefront:authorizedResellers": {
736
+ "type": "object",
737
+ "required": [
738
+ "reseller"
739
+ ],
740
+ "properties": {
741
+ "@type": {
742
+ "const": "pagefront:AuthorizedResellers"
743
+ },
744
+ "exhaustive": {
745
+ "type": "boolean"
746
+ },
747
+ "reseller": {
748
+ "type": "array",
749
+ "minItems": 1,
750
+ "items": {
751
+ "type": "object",
752
+ "required": [
753
+ "organization"
754
+ ],
755
+ "properties": {
756
+ "organization": {
757
+ "type": "object",
758
+ "properties": {
759
+ "@type": {
760
+ "type": "string"
761
+ },
762
+ "@id": {
763
+ "type": "string",
764
+ "format": "uri"
765
+ },
766
+ "name": {
767
+ "type": "string",
768
+ "minLength": 1
769
+ },
770
+ "url": {
771
+ "type": "string",
772
+ "format": "uri"
773
+ },
774
+ "address": {
775
+ "type": "object"
776
+ }
777
+ },
778
+ "anyOf": [
779
+ {
780
+ "required": [
781
+ "@id"
782
+ ]
783
+ },
784
+ {
785
+ "required": [
786
+ "name",
787
+ "url"
788
+ ]
789
+ },
790
+ {
791
+ "required": [
792
+ "name",
793
+ "address"
794
+ ]
795
+ }
796
+ ],
797
+ "additionalProperties": true
798
+ },
799
+ "areaServed": {
800
+ "oneOf": [
801
+ {
802
+ "type": "object"
803
+ },
804
+ {
805
+ "type": "array",
806
+ "minItems": 1,
807
+ "items": {
808
+ "type": "object"
809
+ }
810
+ }
811
+ ]
812
+ }
813
+ },
814
+ "additionalProperties": false
815
+ }
816
+ }
817
+ },
818
+ "additionalProperties": false
819
+ },
820
+ "pagefront:availableLanguages": {
821
+ "type": "array",
822
+ "items": {
823
+ "type": "object",
824
+ "required": [
825
+ "lang",
826
+ "url"
827
+ ],
828
+ "properties": {
829
+ "lang": {
830
+ "type": "string"
831
+ },
832
+ "url": {
833
+ "type": "string",
834
+ "format": "uri"
835
+ }
836
+ },
837
+ "additionalProperties": false
838
+ }
839
+ }
840
+ },
841
+ "additionalProperties": true
842
+ },
843
+ "certification": {
844
+ "type": "object",
845
+ "required": [
846
+ "@type",
847
+ "name"
848
+ ],
849
+ "properties": {
850
+ "@type": {
851
+ "const": "Certification"
852
+ },
853
+ "name": {
854
+ "type": "string"
855
+ },
856
+ "issuedBy": {
857
+ "type": "object"
858
+ },
859
+ "about": {
860
+ "type": "string"
861
+ },
862
+ "additionalProperty": {
863
+ "type": "array"
864
+ }
865
+ },
866
+ "additionalProperties": true
867
+ }
868
+ }
869
+ },
870
+ "https://themachineweb.org/pagefront/spec/commerce/product/v0.9.0.json": {
871
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
872
+ "$id": "https://themachineweb.org/pagefront/spec/commerce/product/v0.9.0.json",
873
+ "title": "Pagefront Product Sheet 0.9.0",
874
+ "description": "Formal schema for the Pagefront Product Sheet, sheet spec version 0.9.0, a member of commerce release 0.3.0. The envelope carries release in place of format_version: release names the commerce release the sheet is written against, and $schema names this sheet-spec version. A sheet carrying format_version belongs to the legacy draft line and validates against the legacy schema at .../product/v0.9.json, which is otherwise identical. History, in legacy format versions: revision of 2026-10-01 (breaking, within v0.9): configurator pricing moves from pagefront:configurator to the offer. The configurator loses basePrice, basePriceCurrency and priceFormula, its options lose priceModifier and currency, and it gains an optional @id and an exclusions[] array; configurator dimensions gain affectsPrice, inputType (select or text, for free-text dimensions) and maxLength; Offer and AggregateOffer accept pagefront:configuratorPricing, which names the configurator it prices and carries baseConfiguration, basePrice, modifiers, optional adjustments[] and a pricing completeness flag; every amount field (Offer price, AggregateOffer lowPrice and highPrice, variant price hints, promotion discountAmount, and the pricing block's basePrice, modifiers and adjustment amounts) references a shared definition, a JSON number or a plain decimal string: nonNegativeAmount for prices, bounds, base prices, price hints and discount amounts, and the signed amount for modifiers and adjustment amounts. v0.9 sheets that carried prices inside the configurator no longer validate. v0.9 was otherwise an additive release on top of v0.8: the legalEntity entry's organization now also validates in reference-stub form (@type + @id, no name) so entries can reference a Commerce Organization Sheet; the inline form and all other constraints are unchanged, and v0.8 sheets remain valid once their format_version is updated. v0.8 is an additive release on top of v0.7: it adds a pagefront:featureGroup[] array for grouped, ordered technical specifications (groups of Schema.org PropertyValue entries, with an optional pagefront:presentationValue display variant per entry), a pagefront:productHighlights[] array of ordered publisher-authored selling-point strings, and a pagefront:legalEntity[] array for role-typed legal entities behind a product (closed role enum: brand_owner, licensee, authorized_representative, importer, manufacturer — EU GPSR responsible persons and similar). gtin and gtin13 now accept a string or an array of strings (regional packaging, re-releases); category now accepts the display string, a Schema.org CategoryCode object, or a mixed array of both. The pagefront:Document role enum gains repairability_index, recall_notice, and declaration_of_conformity; the pagefront:RelatedProduct relationship enum gains service. v0.8 also adds two GPSR-driven safety fields: a pagefront:safetyWarning[] array for typed, language-scoped safety warnings (text required; optional pictogram URL and open-vocabulary hazardCategory) and a pagefront:safetyNotice[] array for structured recall/safety notices (closed noticeType enum: recall, warning; closed remedy enum: repair, replacement, refund). v0.7 sheets remain valid under v0.8 once their format_version is updated. Validates the envelope and pagefront-namespaced extensions strictly; Schema.org-typed blocks permit additional unspecified properties.",
875
+ "type": "object",
876
+ "required": [
877
+ "release",
878
+ "schema_org_version",
879
+ "canonical_url",
880
+ "sheet_url",
881
+ "generated_at",
882
+ "data"
883
+ ],
884
+ "properties": {
885
+ "$schema": {
886
+ "type": "string",
887
+ "format": "uri"
888
+ },
889
+ "release": {
890
+ "type": "string",
891
+ "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)$"
892
+ },
893
+ "schema_org_version": {
894
+ "type": "string",
895
+ "pattern": "^\\d+(\\.\\d+)?$"
896
+ },
897
+ "canonical_url": {
898
+ "type": "string",
899
+ "format": "uri"
900
+ },
901
+ "sheet_url": {
902
+ "type": "string",
903
+ "format": "uri"
904
+ },
905
+ "generated_at": {
906
+ "type": "string",
907
+ "format": "date-time"
908
+ },
909
+ "expires_at": {
910
+ "type": "string",
911
+ "format": "date-time"
912
+ },
913
+ "data": {
914
+ "$ref": "#/$defs/dataBlock"
915
+ }
916
+ },
917
+ "additionalProperties": false,
918
+ "$defs": {
919
+ "dataBlock": {
920
+ "type": "object",
921
+ "required": [
922
+ "@context",
923
+ "@type",
924
+ "@id",
925
+ "name",
926
+ "inLanguage"
927
+ ],
928
+ "properties": {
929
+ "@context": {
930
+ "oneOf": [
931
+ {
932
+ "const": "https://schema.org"
933
+ },
934
+ {
935
+ "type": "array",
936
+ "items": {
937
+ "oneOf": [
938
+ {
939
+ "type": "string",
940
+ "format": "uri"
941
+ },
942
+ {
943
+ "type": "object"
944
+ }
945
+ ]
946
+ },
947
+ "minItems": 1
948
+ }
949
+ ]
950
+ },
951
+ "@type": {
952
+ "type": "string"
953
+ },
954
+ "@id": {
955
+ "type": "string",
956
+ "format": "uri"
957
+ },
958
+ "url": {
959
+ "type": "string",
960
+ "format": "uri"
961
+ },
962
+ "name": {
963
+ "type": "string",
964
+ "minLength": 1
965
+ },
966
+ "inLanguage": {
967
+ "type": "string"
968
+ },
969
+ "sku": {
970
+ "type": "string"
971
+ },
972
+ "gtin13": {
973
+ "$ref": "#/$defs/gtin13Value"
974
+ },
975
+ "gtin": {
976
+ "$ref": "#/$defs/gtinValue"
977
+ },
978
+ "mpn": {
979
+ "type": "string"
980
+ },
981
+ "productID": {
982
+ "type": "string"
983
+ },
984
+ "productGroupID": {
985
+ "type": "string"
986
+ },
987
+ "variesBy": {
988
+ "type": "array",
989
+ "items": {
990
+ "type": "string"
991
+ }
992
+ },
993
+ "hasVariant": {
994
+ "type": "array",
995
+ "items": {
996
+ "$ref": "#/$defs/variantEntry"
997
+ }
998
+ },
999
+ "brand": {
1000
+ "type": "object",
1001
+ "properties": {
1002
+ "pagefront:sheetUrl": {
1003
+ "type": "string",
1004
+ "format": "uri"
1005
+ }
1006
+ }
1007
+ },
1008
+ "description": {
1009
+ "type": "string"
1010
+ },
1011
+ "category": {
1012
+ "oneOf": [
1013
+ {
1014
+ "type": "string"
1015
+ },
1016
+ {
1017
+ "$ref": "#/$defs/categoryCode"
1018
+ },
1019
+ {
1020
+ "type": "array",
1021
+ "items": {
1022
+ "oneOf": [
1023
+ {
1024
+ "type": "string"
1025
+ },
1026
+ {
1027
+ "$ref": "#/$defs/categoryCode"
1028
+ }
1029
+ ]
1030
+ },
1031
+ "minItems": 1
1032
+ }
1033
+ ]
1034
+ },
1035
+ "color": {
1036
+ "type": "string"
1037
+ },
1038
+ "material": {
1039
+ "type": "string"
1040
+ },
1041
+ "weight": {
1042
+ "type": "object"
1043
+ },
1044
+ "height": {
1045
+ "type": "object"
1046
+ },
1047
+ "width": {
1048
+ "type": "object"
1049
+ },
1050
+ "depth": {
1051
+ "type": "object"
1052
+ },
1053
+ "countryOfOrigin": {
1054
+ "type": "string",
1055
+ "pattern": "^[A-Z]{2}$"
1056
+ },
1057
+ "image": {
1058
+ "type": "array",
1059
+ "items": {
1060
+ "$ref": "#/$defs/imageObject"
1061
+ }
1062
+ },
1063
+ "video": {
1064
+ "type": "array",
1065
+ "items": {
1066
+ "$ref": "#/$defs/videoObject"
1067
+ }
1068
+ },
1069
+ "additionalProperty": {
1070
+ "type": "array"
1071
+ },
1072
+ "hasCertification": {
1073
+ "type": "array",
1074
+ "items": {
1075
+ "$ref": "#/$defs/certification"
1076
+ }
1077
+ },
1078
+ "manufacturer": {
1079
+ "type": "object"
1080
+ },
1081
+ "offers": {
1082
+ "type": "array",
1083
+ "items": {
1084
+ "oneOf": [
1085
+ {
1086
+ "$ref": "#/$defs/offer"
1087
+ },
1088
+ {
1089
+ "$ref": "#/$defs/aggregateOffer"
1090
+ }
1091
+ ]
1092
+ },
1093
+ "minItems": 1
1094
+ },
1095
+ "aggregateRating": {
1096
+ "type": "object"
1097
+ },
1098
+ "review": {
1099
+ "type": "array"
1100
+ },
1101
+ "isVariantOf": {
1102
+ "type": "object"
1103
+ },
1104
+ "isRelatedTo": {
1105
+ "type": "array"
1106
+ },
1107
+ "isSimilarTo": {
1108
+ "type": "array"
1109
+ },
1110
+ "isPartOf": {
1111
+ "oneOf": [
1112
+ {
1113
+ "type": "object"
1114
+ },
1115
+ {
1116
+ "type": "array"
1117
+ }
1118
+ ]
1119
+ },
1120
+ "hasPart": {
1121
+ "oneOf": [
1122
+ {
1123
+ "type": "object"
1124
+ },
1125
+ {
1126
+ "type": "array"
1127
+ }
1128
+ ]
1129
+ },
1130
+ "question": {
1131
+ "type": "array",
1132
+ "items": {
1133
+ "$ref": "#/$defs/questionObject"
1134
+ }
1135
+ },
1136
+ "pagefront:document": {
1137
+ "type": "array",
1138
+ "items": {
1139
+ "$ref": "#/$defs/documentObject"
1140
+ }
1141
+ },
1142
+ "pagefront:relatedProduct": {
1143
+ "type": "array",
1144
+ "items": {
1145
+ "$ref": "#/$defs/relatedProductObject"
1146
+ }
1147
+ },
1148
+ "pagefront:featureGroup": {
1149
+ "type": "array",
1150
+ "items": {
1151
+ "$ref": "#/$defs/featureGroup"
1152
+ },
1153
+ "minItems": 1
1154
+ },
1155
+ "pagefront:productHighlights": {
1156
+ "type": "array",
1157
+ "items": {
1158
+ "type": "string"
1159
+ },
1160
+ "minItems": 1
1161
+ },
1162
+ "pagefront:legalEntity": {
1163
+ "type": "array",
1164
+ "items": {
1165
+ "$ref": "#/$defs/legalEntity"
1166
+ },
1167
+ "minItems": 1
1168
+ },
1169
+ "pagefront:safetyWarning": {
1170
+ "type": "array",
1171
+ "items": {
1172
+ "$ref": "#/$defs/safetyWarning"
1173
+ },
1174
+ "minItems": 1
1175
+ },
1176
+ "pagefront:safetyNotice": {
1177
+ "type": "array",
1178
+ "items": {
1179
+ "$ref": "#/$defs/safetyNotice"
1180
+ },
1181
+ "minItems": 1
1182
+ },
1183
+ "pagefront:sizeChart": {
1184
+ "$ref": "#/$defs/sizeChart"
1185
+ },
1186
+ "pagefront:sizeRecommendation": {
1187
+ "$ref": "#/$defs/sizeRecommendation"
1188
+ },
1189
+ "pagefront:materialComposition": {
1190
+ "type": "array",
1191
+ "items": {
1192
+ "$ref": "#/$defs/material"
1193
+ }
1194
+ },
1195
+ "pagefront:fabricComposition": {
1196
+ "type": "array",
1197
+ "items": {
1198
+ "$ref": "#/$defs/material"
1199
+ }
1200
+ },
1201
+ "pagefront:construction": {
1202
+ "$ref": "#/$defs/construction"
1203
+ },
1204
+ "pagefront:manufacturingChain": {
1205
+ "type": "array",
1206
+ "items": {
1207
+ "$ref": "#/$defs/manufacturingStage"
1208
+ }
1209
+ },
1210
+ "pagefront:gemstone": {
1211
+ "$ref": "#/$defs/gemstone"
1212
+ },
1213
+ "pagefront:configurator": {
1214
+ "$ref": "#/$defs/configurator"
1215
+ },
1216
+ "pagefront:madeToOrderTerms": {
1217
+ "$ref": "#/$defs/madeToOrderTerms"
1218
+ },
1219
+ "pagefront:manufacturerWarranty": {
1220
+ "type": "object"
1221
+ },
1222
+ "pagefront:careInstructions": {
1223
+ "type": "array",
1224
+ "items": {
1225
+ "type": "string"
1226
+ }
1227
+ },
1228
+ "pagefront:availableLanguages": {
1229
+ "type": "array",
1230
+ "items": {
1231
+ "type": "object",
1232
+ "required": [
1233
+ "lang",
1234
+ "url"
1235
+ ],
1236
+ "properties": {
1237
+ "lang": {
1238
+ "type": "string"
1239
+ },
1240
+ "url": {
1241
+ "type": "string",
1242
+ "format": "uri"
1243
+ }
1244
+ },
1245
+ "additionalProperties": false
1246
+ }
1247
+ }
1248
+ },
1249
+ "if": {
1250
+ "properties": {
1251
+ "@type": {
1252
+ "const": "ProductGroup"
1253
+ }
1254
+ },
1255
+ "required": [
1256
+ "@type"
1257
+ ]
1258
+ },
1259
+ "then": {
1260
+ "required": [
1261
+ "productGroupID"
1262
+ ]
1263
+ },
1264
+ "else": {
1265
+ "required": [
1266
+ "url"
1267
+ ],
1268
+ "anyOf": [
1269
+ {
1270
+ "required": [
1271
+ "sku"
1272
+ ]
1273
+ },
1274
+ {
1275
+ "required": [
1276
+ "gtin13"
1277
+ ]
1278
+ },
1279
+ {
1280
+ "required": [
1281
+ "gtin"
1282
+ ]
1283
+ },
1284
+ {
1285
+ "required": [
1286
+ "mpn"
1287
+ ]
1288
+ },
1289
+ {
1290
+ "required": [
1291
+ "productID"
1292
+ ]
1293
+ }
1294
+ ]
1295
+ },
1296
+ "additionalProperties": true
1297
+ },
1298
+ "amount": {
1299
+ "description": "A currency amount: a JSON number, or a decimal string with a dot as decimal point, no thousands separators and no currency symbol. A Sheet uses one of the two carriers for all its amounts.",
1300
+ "oneOf": [
1301
+ {
1302
+ "type": "number"
1303
+ },
1304
+ {
1305
+ "type": "string",
1306
+ "pattern": "^-?\\d+(\\.\\d+)?$"
1307
+ }
1308
+ ]
1309
+ },
1310
+ "nonNegativeAmount": {
1311
+ "description": "An amount that is zero or positive: the same two carriers as amount, with no leading minus. Used for prices, price bounds, base prices, price hints and discount amounts; only modifiers and adjustment amounts are signed.",
1312
+ "oneOf": [
1313
+ {
1314
+ "type": "number",
1315
+ "minimum": 0
1316
+ },
1317
+ {
1318
+ "type": "string",
1319
+ "pattern": "^\\d+(\\.\\d+)?$"
1320
+ }
1321
+ ]
1322
+ },
1323
+ "variantEntry": {
1324
+ "type": "object",
1325
+ "required": [
1326
+ "@type"
1327
+ ],
1328
+ "properties": {
1329
+ "@type": {
1330
+ "type": "string"
1331
+ },
1332
+ "@id": {
1333
+ "type": "string",
1334
+ "format": "uri"
1335
+ },
1336
+ "url": {
1337
+ "type": "string",
1338
+ "format": "uri"
1339
+ },
1340
+ "sheet_url": {
1341
+ "type": "string",
1342
+ "format": "uri"
1343
+ },
1344
+ "name": {
1345
+ "type": "string"
1346
+ },
1347
+ "sku": {
1348
+ "type": "string"
1349
+ },
1350
+ "gtin13": {
1351
+ "$ref": "#/$defs/gtin13Value"
1352
+ },
1353
+ "gtin": {
1354
+ "$ref": "#/$defs/gtinValue"
1355
+ },
1356
+ "mpn": {
1357
+ "type": "string"
1358
+ },
1359
+ "productID": {
1360
+ "type": "string"
1361
+ },
1362
+ "color": {
1363
+ "type": "string"
1364
+ },
1365
+ "size": {
1366
+ "type": "string"
1367
+ },
1368
+ "material": {
1369
+ "type": "string"
1370
+ },
1371
+ "price": {
1372
+ "$ref": "#/$defs/nonNegativeAmount"
1373
+ },
1374
+ "image": {
1375
+ "type": "string",
1376
+ "format": "uri"
1377
+ },
1378
+ "additionalProperty": {
1379
+ "type": "array"
1380
+ }
1381
+ },
1382
+ "additionalProperties": true
1383
+ },
1384
+ "imageObject": {
1385
+ "type": "object",
1386
+ "required": [
1387
+ "@type",
1388
+ "url"
1389
+ ],
1390
+ "properties": {
1391
+ "@type": {
1392
+ "const": "ImageObject"
1393
+ },
1394
+ "url": {
1395
+ "type": "string",
1396
+ "format": "uri"
1397
+ },
1398
+ "caption": {
1399
+ "type": "string"
1400
+ },
1401
+ "additionalProperty": {
1402
+ "type": "array",
1403
+ "items": {
1404
+ "type": "object",
1405
+ "properties": {
1406
+ "@type": {
1407
+ "const": "PropertyValue"
1408
+ },
1409
+ "name": {
1410
+ "type": "string"
1411
+ },
1412
+ "value": {
1413
+ "type": "string"
1414
+ }
1415
+ },
1416
+ "allOf": [
1417
+ {
1418
+ "if": {
1419
+ "properties": {
1420
+ "name": {
1421
+ "const": "role"
1422
+ }
1423
+ },
1424
+ "required": [
1425
+ "name"
1426
+ ]
1427
+ },
1428
+ "then": {
1429
+ "properties": {
1430
+ "value": {
1431
+ "enum": [
1432
+ "hero",
1433
+ "packshot",
1434
+ "lifestyle",
1435
+ "detail",
1436
+ "flatlay",
1437
+ "swatch",
1438
+ "size_chart",
1439
+ "context"
1440
+ ]
1441
+ }
1442
+ }
1443
+ }
1444
+ }
1445
+ ]
1446
+ }
1447
+ }
1448
+ },
1449
+ "additionalProperties": true
1450
+ },
1451
+ "videoObject": {
1452
+ "type": "object",
1453
+ "required": [
1454
+ "@type"
1455
+ ],
1456
+ "properties": {
1457
+ "@type": {
1458
+ "const": "VideoObject"
1459
+ },
1460
+ "url": {
1461
+ "type": "string",
1462
+ "format": "uri"
1463
+ },
1464
+ "contentUrl": {
1465
+ "type": "string",
1466
+ "format": "uri"
1467
+ },
1468
+ "embedUrl": {
1469
+ "type": "string",
1470
+ "format": "uri"
1471
+ },
1472
+ "thumbnailUrl": {
1473
+ "type": "string",
1474
+ "format": "uri"
1475
+ },
1476
+ "duration": {
1477
+ "type": "string",
1478
+ "pattern": "^P(?:\\d+Y)?(?:\\d+M)?(?:\\d+D)?(?:T(?:\\d+H)?(?:\\d+M)?(?:\\d+(?:\\.\\d+)?S)?)?$"
1479
+ },
1480
+ "uploadDate": {
1481
+ "type": "string"
1482
+ },
1483
+ "caption": {
1484
+ "type": "string"
1485
+ },
1486
+ "transcript": {
1487
+ "type": "string"
1488
+ },
1489
+ "description": {
1490
+ "type": "string"
1491
+ },
1492
+ "name": {
1493
+ "type": "string"
1494
+ },
1495
+ "additionalProperty": {
1496
+ "type": "array",
1497
+ "items": {
1498
+ "type": "object",
1499
+ "properties": {
1500
+ "@type": {
1501
+ "const": "PropertyValue"
1502
+ },
1503
+ "name": {
1504
+ "type": "string"
1505
+ },
1506
+ "value": {
1507
+ "type": "string"
1508
+ }
1509
+ },
1510
+ "allOf": [
1511
+ {
1512
+ "if": {
1513
+ "properties": {
1514
+ "name": {
1515
+ "const": "role"
1516
+ }
1517
+ },
1518
+ "required": [
1519
+ "name"
1520
+ ]
1521
+ },
1522
+ "then": {
1523
+ "properties": {
1524
+ "value": {
1525
+ "enum": [
1526
+ "overview",
1527
+ "tutorial",
1528
+ "lifestyle",
1529
+ "construction",
1530
+ "demonstration",
1531
+ "comparison",
1532
+ "unboxing",
1533
+ "spin"
1534
+ ]
1535
+ }
1536
+ }
1537
+ }
1538
+ }
1539
+ ]
1540
+ }
1541
+ }
1542
+ },
1543
+ "anyOf": [
1544
+ {
1545
+ "required": [
1546
+ "url"
1547
+ ]
1548
+ },
1549
+ {
1550
+ "required": [
1551
+ "contentUrl"
1552
+ ]
1553
+ },
1554
+ {
1555
+ "required": [
1556
+ "embedUrl"
1557
+ ]
1558
+ }
1559
+ ],
1560
+ "additionalProperties": true
1561
+ },
1562
+ "questionObject": {
1563
+ "type": "object",
1564
+ "required": [
1565
+ "@type",
1566
+ "name",
1567
+ "acceptedAnswer"
1568
+ ],
1569
+ "properties": {
1570
+ "@type": {
1571
+ "const": "Question"
1572
+ },
1573
+ "name": {
1574
+ "type": "string",
1575
+ "minLength": 1
1576
+ },
1577
+ "acceptedAnswer": {
1578
+ "type": "object",
1579
+ "required": [
1580
+ "@type",
1581
+ "text"
1582
+ ],
1583
+ "properties": {
1584
+ "@type": {
1585
+ "const": "Answer"
1586
+ },
1587
+ "text": {
1588
+ "type": "string",
1589
+ "minLength": 1
1590
+ }
1591
+ },
1592
+ "additionalProperties": true
1593
+ },
1594
+ "suggestedAnswer": {
1595
+ "type": "array",
1596
+ "items": {
1597
+ "type": "object",
1598
+ "required": [
1599
+ "@type",
1600
+ "text"
1601
+ ],
1602
+ "properties": {
1603
+ "@type": {
1604
+ "const": "Answer"
1605
+ },
1606
+ "text": {
1607
+ "type": "string",
1608
+ "minLength": 1
1609
+ }
1610
+ },
1611
+ "additionalProperties": true
1612
+ }
1613
+ }
1614
+ },
1615
+ "additionalProperties": true
1616
+ },
1617
+ "documentObject": {
1618
+ "type": "object",
1619
+ "required": [
1620
+ "@type",
1621
+ "url",
1622
+ "role"
1623
+ ],
1624
+ "properties": {
1625
+ "@type": {
1626
+ "const": "pagefront:Document"
1627
+ },
1628
+ "url": {
1629
+ "type": "string",
1630
+ "format": "uri"
1631
+ },
1632
+ "role": {
1633
+ "type": "string",
1634
+ "enum": [
1635
+ "manual",
1636
+ "assembly",
1637
+ "care_guide",
1638
+ "spec_sheet",
1639
+ "compatibility",
1640
+ "warranty",
1641
+ "certificate",
1642
+ "environmental_declaration",
1643
+ "audit_report",
1644
+ "lab_test",
1645
+ "safety_data_sheet",
1646
+ "installation_guide",
1647
+ "user_guide",
1648
+ "quick_start",
1649
+ "brochure",
1650
+ "repairability_index",
1651
+ "recall_notice",
1652
+ "declaration_of_conformity"
1653
+ ]
1654
+ },
1655
+ "name": {
1656
+ "type": "string"
1657
+ },
1658
+ "inLanguage": {
1659
+ "type": "string"
1660
+ },
1661
+ "description": {
1662
+ "type": "string"
1663
+ },
1664
+ "encodingFormat": {
1665
+ "type": "string"
1666
+ }
1667
+ },
1668
+ "additionalProperties": false
1669
+ },
1670
+ "relatedProductObject": {
1671
+ "type": "object",
1672
+ "required": [
1673
+ "@type",
1674
+ "relationship"
1675
+ ],
1676
+ "properties": {
1677
+ "@type": {
1678
+ "const": "pagefront:RelatedProduct"
1679
+ },
1680
+ "relationship": {
1681
+ "type": "string",
1682
+ "enum": [
1683
+ "accessory",
1684
+ "consumable",
1685
+ "required_part",
1686
+ "spare_part",
1687
+ "often_bought_with",
1688
+ "recommended_with",
1689
+ "replaces",
1690
+ "replaced_by",
1691
+ "bundle_component",
1692
+ "compatible_with",
1693
+ "service"
1694
+ ]
1695
+ },
1696
+ "@id": {
1697
+ "type": "string",
1698
+ "format": "uri"
1699
+ },
1700
+ "sku": {
1701
+ "type": "string"
1702
+ },
1703
+ "gtin": {
1704
+ "type": "string"
1705
+ },
1706
+ "gtin13": {
1707
+ "type": "string",
1708
+ "pattern": "^[0-9]{13}$"
1709
+ },
1710
+ "mpn": {
1711
+ "type": "string"
1712
+ },
1713
+ "name": {
1714
+ "type": "string"
1715
+ },
1716
+ "url": {
1717
+ "type": "string",
1718
+ "format": "uri"
1719
+ },
1720
+ "image": {
1721
+ "type": "string",
1722
+ "format": "uri"
1723
+ }
1724
+ },
1725
+ "anyOf": [
1726
+ {
1727
+ "required": [
1728
+ "@id"
1729
+ ]
1730
+ },
1731
+ {
1732
+ "required": [
1733
+ "sku"
1734
+ ]
1735
+ },
1736
+ {
1737
+ "required": [
1738
+ "gtin"
1739
+ ]
1740
+ },
1741
+ {
1742
+ "required": [
1743
+ "gtin13"
1744
+ ]
1745
+ },
1746
+ {
1747
+ "required": [
1748
+ "mpn"
1749
+ ]
1750
+ }
1751
+ ],
1752
+ "additionalProperties": false
1753
+ },
1754
+ "gtinValue": {
1755
+ "oneOf": [
1756
+ {
1757
+ "type": "string"
1758
+ },
1759
+ {
1760
+ "type": "array",
1761
+ "items": {
1762
+ "type": "string"
1763
+ },
1764
+ "minItems": 1
1765
+ }
1766
+ ]
1767
+ },
1768
+ "gtin13Value": {
1769
+ "oneOf": [
1770
+ {
1771
+ "type": "string",
1772
+ "pattern": "^[0-9]{13}$"
1773
+ },
1774
+ {
1775
+ "type": "array",
1776
+ "items": {
1777
+ "type": "string",
1778
+ "pattern": "^[0-9]{13}$"
1779
+ },
1780
+ "minItems": 1
1781
+ }
1782
+ ]
1783
+ },
1784
+ "categoryCode": {
1785
+ "type": "object",
1786
+ "required": [
1787
+ "@type",
1788
+ "codeValue"
1789
+ ],
1790
+ "properties": {
1791
+ "@type": {
1792
+ "const": "CategoryCode"
1793
+ },
1794
+ "codeValue": {
1795
+ "type": "string",
1796
+ "minLength": 1
1797
+ },
1798
+ "inCodeSet": {
1799
+ "oneOf": [
1800
+ {
1801
+ "type": "string",
1802
+ "format": "uri"
1803
+ },
1804
+ {
1805
+ "type": "object"
1806
+ }
1807
+ ]
1808
+ },
1809
+ "name": {
1810
+ "type": "string"
1811
+ }
1812
+ },
1813
+ "additionalProperties": true
1814
+ },
1815
+ "featureGroup": {
1816
+ "type": "object",
1817
+ "required": [
1818
+ "@type",
1819
+ "name",
1820
+ "feature"
1821
+ ],
1822
+ "properties": {
1823
+ "@type": {
1824
+ "const": "pagefront:FeatureGroup"
1825
+ },
1826
+ "name": {
1827
+ "type": "string",
1828
+ "minLength": 1
1829
+ },
1830
+ "sortOrder": {
1831
+ "type": "integer"
1832
+ },
1833
+ "feature": {
1834
+ "type": "array",
1835
+ "items": {
1836
+ "$ref": "#/$defs/featureEntry"
1837
+ },
1838
+ "minItems": 1
1839
+ }
1840
+ },
1841
+ "additionalProperties": false
1842
+ },
1843
+ "featureEntry": {
1844
+ "type": "object",
1845
+ "required": [
1846
+ "@type",
1847
+ "name",
1848
+ "value"
1849
+ ],
1850
+ "properties": {
1851
+ "@type": {
1852
+ "const": "PropertyValue"
1853
+ },
1854
+ "propertyID": {
1855
+ "type": "string"
1856
+ },
1857
+ "name": {
1858
+ "type": "string",
1859
+ "minLength": 1
1860
+ },
1861
+ "value": {
1862
+ "anyOf": [
1863
+ {
1864
+ "type": "string"
1865
+ },
1866
+ {
1867
+ "type": "number"
1868
+ },
1869
+ {
1870
+ "type": "boolean"
1871
+ }
1872
+ ]
1873
+ },
1874
+ "unitCode": {
1875
+ "type": "string"
1876
+ },
1877
+ "description": {
1878
+ "type": "string"
1879
+ },
1880
+ "pagefront:presentationValue": {
1881
+ "type": "string"
1882
+ }
1883
+ },
1884
+ "additionalProperties": true
1885
+ },
1886
+ "legalEntity": {
1887
+ "type": "object",
1888
+ "required": [
1889
+ "@type",
1890
+ "role",
1891
+ "organization"
1892
+ ],
1893
+ "properties": {
1894
+ "@type": {
1895
+ "const": "pagefront:LegalEntity"
1896
+ },
1897
+ "role": {
1898
+ "type": "string",
1899
+ "enum": [
1900
+ "brand_owner",
1901
+ "licensee",
1902
+ "authorized_representative",
1903
+ "importer",
1904
+ "manufacturer"
1905
+ ]
1906
+ },
1907
+ "organization": {
1908
+ "type": "object",
1909
+ "required": [
1910
+ "@type"
1911
+ ],
1912
+ "anyOf": [
1913
+ {
1914
+ "required": [
1915
+ "name"
1916
+ ]
1917
+ },
1918
+ {
1919
+ "required": [
1920
+ "@id"
1921
+ ]
1922
+ }
1923
+ ],
1924
+ "properties": {
1925
+ "@type": {
1926
+ "const": "Organization"
1927
+ },
1928
+ "@id": {
1929
+ "type": "string",
1930
+ "format": "uri"
1931
+ },
1932
+ "name": {
1933
+ "type": "string",
1934
+ "minLength": 1
1935
+ },
1936
+ "address": {
1937
+ "type": "object"
1938
+ },
1939
+ "url": {
1940
+ "type": "string",
1941
+ "format": "uri"
1942
+ },
1943
+ "email": {
1944
+ "type": "string",
1945
+ "format": "email"
1946
+ },
1947
+ "pagefront:sheetUrl": {
1948
+ "type": "string",
1949
+ "format": "uri"
1950
+ }
1951
+ },
1952
+ "additionalProperties": true
1953
+ }
1954
+ },
1955
+ "additionalProperties": false
1956
+ },
1957
+ "safetyWarning": {
1958
+ "type": "object",
1959
+ "required": [
1960
+ "@type",
1961
+ "text"
1962
+ ],
1963
+ "properties": {
1964
+ "@type": {
1965
+ "const": "pagefront:SafetyWarning"
1966
+ },
1967
+ "text": {
1968
+ "type": "string",
1969
+ "minLength": 1
1970
+ },
1971
+ "pictogram": {
1972
+ "type": "string",
1973
+ "format": "uri"
1974
+ },
1975
+ "hazardCategory": {
1976
+ "type": "string"
1977
+ }
1978
+ },
1979
+ "additionalProperties": false
1980
+ },
1981
+ "safetyNotice": {
1982
+ "type": "object",
1983
+ "required": [
1984
+ "@type",
1985
+ "noticeType"
1986
+ ],
1987
+ "properties": {
1988
+ "@type": {
1989
+ "const": "pagefront:SafetyNotice"
1990
+ },
1991
+ "noticeType": {
1992
+ "type": "string",
1993
+ "enum": [
1994
+ "recall",
1995
+ "warning"
1996
+ ]
1997
+ },
1998
+ "hazard": {
1999
+ "type": "string"
2000
+ },
2001
+ "remedy": {
2002
+ "type": "string",
2003
+ "enum": [
2004
+ "repair",
2005
+ "replacement",
2006
+ "refund"
2007
+ ]
2008
+ },
2009
+ "description": {
2010
+ "type": "string"
2011
+ },
2012
+ "reference": {
2013
+ "type": "string",
2014
+ "format": "uri"
2015
+ },
2016
+ "datePublished": {
2017
+ "type": "string",
2018
+ "format": "date"
2019
+ },
2020
+ "url": {
2021
+ "type": "string",
2022
+ "format": "uri"
2023
+ }
2024
+ },
2025
+ "additionalProperties": false
2026
+ },
2027
+ "certification": {
2028
+ "type": "object",
2029
+ "required": [
2030
+ "@type",
2031
+ "name"
2032
+ ],
2033
+ "properties": {
2034
+ "@type": {
2035
+ "const": "Certification"
2036
+ },
2037
+ "name": {
2038
+ "type": "string"
2039
+ },
2040
+ "issuedBy": {
2041
+ "type": "object"
2042
+ },
2043
+ "about": {
2044
+ "type": "string"
2045
+ },
2046
+ "additionalProperty": {
2047
+ "type": "array"
2048
+ }
2049
+ },
2050
+ "additionalProperties": true
2051
+ },
2052
+ "offer": {
2053
+ "type": "object",
2054
+ "required": [
2055
+ "@type"
2056
+ ],
2057
+ "properties": {
2058
+ "@type": {
2059
+ "const": "Offer"
2060
+ },
2061
+ "@id": {
2062
+ "type": "string"
2063
+ },
2064
+ "itemOffered": {
2065
+ "type": "object"
2066
+ },
2067
+ "price": {
2068
+ "$ref": "#/$defs/nonNegativeAmount"
2069
+ },
2070
+ "priceCurrency": {
2071
+ "type": "string",
2072
+ "pattern": "^[A-Z]{3}$"
2073
+ },
2074
+ "priceSpecification": {
2075
+ "oneOf": [
2076
+ {
2077
+ "type": "object"
2078
+ },
2079
+ {
2080
+ "type": "array",
2081
+ "items": {
2082
+ "type": "object"
2083
+ }
2084
+ }
2085
+ ]
2086
+ },
2087
+ "availability": {
2088
+ "type": "string",
2089
+ "pattern": "^https?://schema\\.org/(InStock|OutOfStock|PreOrder|BackOrder|InStoreOnly|LimitedAvailability|MadeToOrder|OnlineOnly|SoldOut|Discontinued|Reserved)$"
2090
+ },
2091
+ "itemCondition": {
2092
+ "type": "string",
2093
+ "pattern": "^https?://schema\\.org/(NewCondition|UsedCondition|RefurbishedCondition|DamagedCondition)$"
2094
+ },
2095
+ "seller": {
2096
+ "type": "object",
2097
+ "properties": {
2098
+ "pagefront:sheetUrl": {
2099
+ "type": "string",
2100
+ "format": "uri"
2101
+ }
2102
+ }
2103
+ },
2104
+ "shippingDetails": {
2105
+ "oneOf": [
2106
+ {
2107
+ "type": "object"
2108
+ },
2109
+ {
2110
+ "type": "array",
2111
+ "items": {
2112
+ "type": "object"
2113
+ }
2114
+ }
2115
+ ]
2116
+ },
2117
+ "hasMerchantReturnPolicy": {
2118
+ "type": "object"
2119
+ },
2120
+ "warranty": {
2121
+ "type": "object"
2122
+ },
2123
+ "areaServed": {},
2124
+ "eligibleRegion": {
2125
+ "type": "array"
2126
+ },
2127
+ "acceptedPaymentMethod": {
2128
+ "type": "array"
2129
+ },
2130
+ "pagefront:estimatedDelivery": {
2131
+ "$ref": "#/$defs/deliveryEstimate"
2132
+ },
2133
+ "pagefront:promotions": {
2134
+ "type": "array",
2135
+ "items": {
2136
+ "$ref": "#/$defs/promotion"
2137
+ }
2138
+ },
2139
+ "pagefront:priceOnRequest": {
2140
+ "$ref": "#/$defs/priceOnRequest"
2141
+ },
2142
+ "pagefront:configuratorPricing": {
2143
+ "$ref": "#/$defs/configuratorPricing"
2144
+ }
2145
+ },
2146
+ "anyOf": [
2147
+ {
2148
+ "required": [
2149
+ "price",
2150
+ "priceCurrency"
2151
+ ]
2152
+ },
2153
+ {
2154
+ "required": [
2155
+ "priceSpecification"
2156
+ ]
2157
+ },
2158
+ {
2159
+ "required": [
2160
+ "pagefront:priceOnRequest"
2161
+ ]
2162
+ }
2163
+ ],
2164
+ "dependentRequired": {
2165
+ "pagefront:configuratorPricing": [
2166
+ "price",
2167
+ "priceCurrency"
2168
+ ]
2169
+ },
2170
+ "additionalProperties": true
2171
+ },
2172
+ "aggregateOffer": {
2173
+ "type": "object",
2174
+ "required": [
2175
+ "@type",
2176
+ "lowPrice",
2177
+ "highPrice",
2178
+ "priceCurrency"
2179
+ ],
2180
+ "properties": {
2181
+ "@type": {
2182
+ "const": "AggregateOffer"
2183
+ },
2184
+ "@id": {
2185
+ "type": "string"
2186
+ },
2187
+ "lowPrice": {
2188
+ "$ref": "#/$defs/nonNegativeAmount"
2189
+ },
2190
+ "highPrice": {
2191
+ "$ref": "#/$defs/nonNegativeAmount"
2192
+ },
2193
+ "priceCurrency": {
2194
+ "type": "string",
2195
+ "pattern": "^[A-Z]{3}$"
2196
+ },
2197
+ "offerCount": {
2198
+ "type": "integer"
2199
+ },
2200
+ "availability": {
2201
+ "type": "string",
2202
+ "pattern": "^https?://schema\\.org/(InStock|OutOfStock|PreOrder|BackOrder|InStoreOnly|LimitedAvailability|MadeToOrder|OnlineOnly|SoldOut|Discontinued|Reserved)$"
2203
+ },
2204
+ "itemCondition": {
2205
+ "type": "string",
2206
+ "pattern": "^https?://schema\\.org/(NewCondition|UsedCondition|RefurbishedCondition|DamagedCondition)$"
2207
+ },
2208
+ "eligibleRegion": {
2209
+ "type": "array"
2210
+ },
2211
+ "areaServed": {},
2212
+ "validFrom": {
2213
+ "type": "string"
2214
+ },
2215
+ "validThrough": {
2216
+ "type": "string"
2217
+ },
2218
+ "seller": {
2219
+ "type": "object"
2220
+ },
2221
+ "pagefront:configuratorPricing": {
2222
+ "$ref": "#/$defs/configuratorPricing"
2223
+ }
2224
+ },
2225
+ "additionalProperties": true
2226
+ },
2227
+ "priceOnRequest": {
2228
+ "type": "object",
2229
+ "required": [
2230
+ "@type",
2231
+ "method"
2232
+ ],
2233
+ "properties": {
2234
+ "@type": {
2235
+ "const": "pagefront:PriceOnRequest"
2236
+ },
2237
+ "method": {
2238
+ "type": "string",
2239
+ "enum": [
2240
+ "authorized_retailer",
2241
+ "dealer_network",
2242
+ "quote_form",
2243
+ "email",
2244
+ "phone",
2245
+ "unspecified"
2246
+ ]
2247
+ },
2248
+ "contactUrl": {
2249
+ "type": "string",
2250
+ "format": "uri"
2251
+ },
2252
+ "contactEmail": {
2253
+ "type": "string",
2254
+ "format": "email"
2255
+ },
2256
+ "contactPhone": {
2257
+ "type": "string"
2258
+ },
2259
+ "note": {
2260
+ "type": "string"
2261
+ }
2262
+ },
2263
+ "additionalProperties": false
2264
+ },
2265
+ "sizeChart": {
2266
+ "type": "object",
2267
+ "required": [
2268
+ "@type",
2269
+ "unitCode",
2270
+ "sizes",
2271
+ "measurements"
2272
+ ],
2273
+ "properties": {
2274
+ "@type": {
2275
+ "const": "pagefront:SizeChart"
2276
+ },
2277
+ "unitCode": {
2278
+ "type": "string"
2279
+ },
2280
+ "sizes": {
2281
+ "type": "array",
2282
+ "items": {
2283
+ "type": "string"
2284
+ },
2285
+ "minItems": 1
2286
+ },
2287
+ "measurements": {
2288
+ "type": "array",
2289
+ "items": {
2290
+ "$ref": "#/$defs/measurement"
2291
+ },
2292
+ "minItems": 1
2293
+ },
2294
+ "modelReferences": {
2295
+ "type": "array",
2296
+ "items": {
2297
+ "$ref": "#/$defs/modelReference"
2298
+ }
2299
+ }
2300
+ },
2301
+ "additionalProperties": false
2302
+ },
2303
+ "measurement": {
2304
+ "type": "object",
2305
+ "required": [
2306
+ "@type",
2307
+ "name",
2308
+ "values"
2309
+ ],
2310
+ "properties": {
2311
+ "@type": {
2312
+ "const": "pagefront:Measurement"
2313
+ },
2314
+ "name": {
2315
+ "type": "string"
2316
+ },
2317
+ "values": {
2318
+ "type": "object",
2319
+ "additionalProperties": {
2320
+ "type": "number"
2321
+ }
2322
+ }
2323
+ },
2324
+ "additionalProperties": false
2325
+ },
2326
+ "modelReference": {
2327
+ "type": "object",
2328
+ "required": [
2329
+ "@type",
2330
+ "name"
2331
+ ],
2332
+ "properties": {
2333
+ "@type": {
2334
+ "const": "pagefront:ModelReference"
2335
+ },
2336
+ "name": {
2337
+ "type": "string"
2338
+ },
2339
+ "heightCm": {
2340
+ "type": "number",
2341
+ "minimum": 0
2342
+ },
2343
+ "wearsSize": {
2344
+ "type": "string"
2345
+ }
2346
+ },
2347
+ "additionalProperties": false
2348
+ },
2349
+ "sizeRecommendation": {
2350
+ "type": "object",
2351
+ "required": [
2352
+ "@type"
2353
+ ],
2354
+ "properties": {
2355
+ "@type": {
2356
+ "const": "pagefront:SizeRecommendation"
2357
+ },
2358
+ "fitProfile": {
2359
+ "type": "string",
2360
+ "enum": [
2361
+ "runs_small",
2362
+ "true_to_size",
2363
+ "runs_large"
2364
+ ]
2365
+ },
2366
+ "sizeAdjustment": {
2367
+ "$ref": "#/$defs/sizeAdjustment"
2368
+ },
2369
+ "description": {
2370
+ "type": "string"
2371
+ },
2372
+ "appliesTo": {
2373
+ "type": "string"
2374
+ }
2375
+ },
2376
+ "additionalProperties": false
2377
+ },
2378
+ "sizeAdjustment": {
2379
+ "type": "object",
2380
+ "required": [
2381
+ "@type",
2382
+ "direction",
2383
+ "magnitude"
2384
+ ],
2385
+ "properties": {
2386
+ "@type": {
2387
+ "const": "pagefront:SizeAdjustment"
2388
+ },
2389
+ "direction": {
2390
+ "type": "string",
2391
+ "enum": [
2392
+ "up",
2393
+ "down"
2394
+ ]
2395
+ },
2396
+ "magnitude": {
2397
+ "type": "number",
2398
+ "minimum": 0
2399
+ },
2400
+ "sizeSystem": {
2401
+ "type": "string"
2402
+ }
2403
+ },
2404
+ "additionalProperties": false
2405
+ },
2406
+ "material": {
2407
+ "type": "object",
2408
+ "required": [
2409
+ "@type",
2410
+ "material"
2411
+ ],
2412
+ "properties": {
2413
+ "@type": {
2414
+ "const": "pagefront:Material"
2415
+ },
2416
+ "material": {
2417
+ "type": "string"
2418
+ },
2419
+ "percentage": {
2420
+ "type": "number",
2421
+ "minimum": 0,
2422
+ "maximum": 100
2423
+ },
2424
+ "purity": {
2425
+ "type": "string"
2426
+ },
2427
+ "purityPercentage": {
2428
+ "type": "number",
2429
+ "minimum": 0,
2430
+ "maximum": 100
2431
+ },
2432
+ "provenance": {
2433
+ "type": "string",
2434
+ "enum": [
2435
+ "virgin",
2436
+ "recycled",
2437
+ "fair_mined",
2438
+ "lab_grown",
2439
+ "reclaimed",
2440
+ "deadstock"
2441
+ ]
2442
+ },
2443
+ "weightGrams": {
2444
+ "type": "number",
2445
+ "minimum": 0
2446
+ }
2447
+ },
2448
+ "additionalProperties": false
2449
+ },
2450
+ "construction": {
2451
+ "type": "object",
2452
+ "required": [
2453
+ "@type"
2454
+ ],
2455
+ "properties": {
2456
+ "@type": {
2457
+ "const": "pagefront:Construction"
2458
+ },
2459
+ "stitch": {
2460
+ "type": "string"
2461
+ },
2462
+ "gauge": {
2463
+ "type": "number"
2464
+ },
2465
+ "machine": {
2466
+ "type": "string"
2467
+ },
2468
+ "constructionNotes": {
2469
+ "type": "string"
2470
+ }
2471
+ },
2472
+ "additionalProperties": true
2473
+ },
2474
+ "manufacturingStage": {
2475
+ "type": "object",
2476
+ "required": [
2477
+ "@type",
2478
+ "stage",
2479
+ "country"
2480
+ ],
2481
+ "properties": {
2482
+ "@type": {
2483
+ "const": "pagefront:ManufacturingStage"
2484
+ },
2485
+ "stage": {
2486
+ "type": "string"
2487
+ },
2488
+ "country": {
2489
+ "type": "string",
2490
+ "pattern": "^[A-Z]{2}$"
2491
+ },
2492
+ "facility": {
2493
+ "type": "string"
2494
+ },
2495
+ "facilityCountry": {
2496
+ "type": "string",
2497
+ "pattern": "^[A-Z]{2}$"
2498
+ }
2499
+ },
2500
+ "additionalProperties": false
2501
+ },
2502
+ "gemstone": {
2503
+ "type": "object",
2504
+ "required": [
2505
+ "@type",
2506
+ "type"
2507
+ ],
2508
+ "properties": {
2509
+ "@type": {
2510
+ "const": "pagefront:Gemstone"
2511
+ },
2512
+ "type": {
2513
+ "type": "string"
2514
+ },
2515
+ "origin": {
2516
+ "type": "string",
2517
+ "enum": [
2518
+ "natural_mined",
2519
+ "lab_grown",
2520
+ "treated",
2521
+ "synthetic"
2522
+ ]
2523
+ },
2524
+ "shape": {
2525
+ "type": "string"
2526
+ },
2527
+ "caratWeight": {
2528
+ "type": "number",
2529
+ "minimum": 0
2530
+ },
2531
+ "colorGrade": {
2532
+ "type": "string"
2533
+ },
2534
+ "clarityGrade": {
2535
+ "type": "string"
2536
+ },
2537
+ "cutGrade": {
2538
+ "type": "string"
2539
+ },
2540
+ "certifyingBody": {
2541
+ "type": "string"
2542
+ }
2543
+ },
2544
+ "additionalProperties": false
2545
+ },
2546
+ "configurator": {
2547
+ "type": "object",
2548
+ "required": [
2549
+ "@type",
2550
+ "dimensions"
2551
+ ],
2552
+ "properties": {
2553
+ "@type": {
2554
+ "const": "pagefront:Configurator"
2555
+ },
2556
+ "@id": {
2557
+ "type": "string",
2558
+ "minLength": 1
2559
+ },
2560
+ "dimensions": {
2561
+ "type": "array",
2562
+ "items": {
2563
+ "$ref": "#/$defs/configuratorDimension"
2564
+ },
2565
+ "minItems": 1
2566
+ },
2567
+ "exclusions": {
2568
+ "type": "array",
2569
+ "items": {
2570
+ "$ref": "#/$defs/configurationSelection",
2571
+ "type": "object",
2572
+ "minProperties": 1
2573
+ }
2574
+ }
2575
+ },
2576
+ "additionalProperties": false
2577
+ },
2578
+ "configuratorDimension": {
2579
+ "type": "object",
2580
+ "required": [
2581
+ "name"
2582
+ ],
2583
+ "properties": {
2584
+ "name": {
2585
+ "type": "string"
2586
+ },
2587
+ "options": {
2588
+ "type": "array",
2589
+ "items": {
2590
+ "type": "object",
2591
+ "required": [
2592
+ "value"
2593
+ ],
2594
+ "properties": {
2595
+ "value": {
2596
+ "anyOf": [
2597
+ {
2598
+ "type": "string"
2599
+ },
2600
+ {
2601
+ "type": "number"
2602
+ },
2603
+ {
2604
+ "type": "boolean"
2605
+ }
2606
+ ]
2607
+ },
2608
+ "description": {
2609
+ "type": "string"
2610
+ },
2611
+ "priceModifier": false,
2612
+ "currency": false
2613
+ },
2614
+ "additionalProperties": true
2615
+ }
2616
+ },
2617
+ "affectsPrice": {
2618
+ "type": "boolean",
2619
+ "default": true
2620
+ },
2621
+ "inputType": {
2622
+ "type": "string",
2623
+ "enum": [
2624
+ "select",
2625
+ "text"
2626
+ ],
2627
+ "default": "select"
2628
+ },
2629
+ "maxLength": {
2630
+ "type": "integer",
2631
+ "minimum": 1
2632
+ },
2633
+ "system": {
2634
+ "type": "string"
2635
+ },
2636
+ "note": {
2637
+ "type": "string"
2638
+ }
2639
+ },
2640
+ "additionalProperties": false
2641
+ },
2642
+ "configurationSelection": {
2643
+ "type": "object",
2644
+ "additionalProperties": {
2645
+ "anyOf": [
2646
+ {
2647
+ "type": "string"
2648
+ },
2649
+ {
2650
+ "type": "number"
2651
+ },
2652
+ {
2653
+ "type": "boolean"
2654
+ }
2655
+ ]
2656
+ }
2657
+ },
2658
+ "configuratorPricing": {
2659
+ "type": "object",
2660
+ "required": [
2661
+ "@type",
2662
+ "configurator",
2663
+ "baseConfiguration",
2664
+ "basePrice",
2665
+ "modifiers"
2666
+ ],
2667
+ "properties": {
2668
+ "@type": {
2669
+ "const": "pagefront:ConfiguratorPricing"
2670
+ },
2671
+ "configurator": {
2672
+ "type": "object",
2673
+ "required": [
2674
+ "@id"
2675
+ ],
2676
+ "properties": {
2677
+ "@type": {
2678
+ "const": "pagefront:Configurator"
2679
+ },
2680
+ "@id": {
2681
+ "type": "string",
2682
+ "minLength": 1
2683
+ }
2684
+ },
2685
+ "additionalProperties": false
2686
+ },
2687
+ "baseConfiguration": {
2688
+ "$ref": "#/$defs/configurationSelection"
2689
+ },
2690
+ "basePrice": {
2691
+ "$ref": "#/$defs/nonNegativeAmount"
2692
+ },
2693
+ "modifiers": {
2694
+ "type": "object",
2695
+ "additionalProperties": {
2696
+ "type": "object",
2697
+ "additionalProperties": {
2698
+ "$ref": "#/$defs/amount"
2699
+ }
2700
+ }
2701
+ },
2702
+ "adjustments": {
2703
+ "type": "array",
2704
+ "items": {
2705
+ "type": "object",
2706
+ "required": [
2707
+ "when",
2708
+ "priceModifier"
2709
+ ],
2710
+ "properties": {
2711
+ "when": {
2712
+ "$ref": "#/$defs/configurationSelection",
2713
+ "type": "object",
2714
+ "minProperties": 1
2715
+ },
2716
+ "priceModifier": {
2717
+ "$ref": "#/$defs/amount"
2718
+ }
2719
+ },
2720
+ "additionalProperties": false
2721
+ }
2722
+ },
2723
+ "pricing": {
2724
+ "type": "string",
2725
+ "enum": [
2726
+ "complete",
2727
+ "partial"
2728
+ ],
2729
+ "default": "complete"
2730
+ }
2731
+ },
2732
+ "additionalProperties": false
2733
+ },
2734
+ "madeToOrderTerms": {
2735
+ "type": "object",
2736
+ "required": [
2737
+ "@type"
2738
+ ],
2739
+ "properties": {
2740
+ "@type": {
2741
+ "const": "pagefront:MadeToOrderTerms"
2742
+ },
2743
+ "productionLeadTime": {
2744
+ "$ref": "#/$defs/duration"
2745
+ },
2746
+ "cancellationPolicy": {
2747
+ "type": "string"
2748
+ },
2749
+ "returnsExceptions": {
2750
+ "type": "array",
2751
+ "items": {
2752
+ "type": "string"
2753
+ }
2754
+ },
2755
+ "aftermarketServices": {
2756
+ "type": "array",
2757
+ "items": {
2758
+ "$ref": "#/$defs/aftermarketService"
2759
+ }
2760
+ }
2761
+ },
2762
+ "additionalProperties": false
2763
+ },
2764
+ "duration": {
2765
+ "type": "object",
2766
+ "required": [
2767
+ "@type"
2768
+ ],
2769
+ "properties": {
2770
+ "@type": {
2771
+ "const": "pagefront:Duration"
2772
+ },
2773
+ "minDays": {
2774
+ "type": "integer",
2775
+ "minimum": 0
2776
+ },
2777
+ "maxDays": {
2778
+ "type": "integer",
2779
+ "minimum": 0
2780
+ },
2781
+ "description": {
2782
+ "type": "string"
2783
+ }
2784
+ },
2785
+ "additionalProperties": false
2786
+ },
2787
+ "deliveryEstimate": {
2788
+ "type": "object",
2789
+ "required": [
2790
+ "@type"
2791
+ ],
2792
+ "properties": {
2793
+ "@type": {
2794
+ "const": "pagefront:DeliveryEstimate"
2795
+ },
2796
+ "earliest": {
2797
+ "type": "string",
2798
+ "format": "date"
2799
+ },
2800
+ "latest": {
2801
+ "type": "string",
2802
+ "format": "date"
2803
+ },
2804
+ "description": {
2805
+ "type": "string"
2806
+ }
2807
+ },
2808
+ "additionalProperties": false
2809
+ },
2810
+ "aftermarketService": {
2811
+ "type": "object",
2812
+ "required": [
2813
+ "@type",
2814
+ "service"
2815
+ ],
2816
+ "properties": {
2817
+ "@type": {
2818
+ "const": "pagefront:AftermarketService"
2819
+ },
2820
+ "service": {
2821
+ "type": "string"
2822
+ },
2823
+ "limit": {
2824
+ "type": "string"
2825
+ },
2826
+ "description": {
2827
+ "type": "string"
2828
+ }
2829
+ },
2830
+ "additionalProperties": false
2831
+ },
2832
+ "promotion": {
2833
+ "type": "object",
2834
+ "required": [
2835
+ "@type",
2836
+ "scope"
2837
+ ],
2838
+ "properties": {
2839
+ "@type": {
2840
+ "const": "pagefront:Promotion"
2841
+ },
2842
+ "code": {
2843
+ "type": "string"
2844
+ },
2845
+ "discountPercentage": {
2846
+ "type": "number",
2847
+ "minimum": 0,
2848
+ "maximum": 100
2849
+ },
2850
+ "discountAmount": {
2851
+ "$ref": "#/$defs/nonNegativeAmount"
2852
+ },
2853
+ "discountCurrency": {
2854
+ "type": "string",
2855
+ "pattern": "^[A-Z]{3}$"
2856
+ },
2857
+ "scope": {
2858
+ "type": "string",
2859
+ "enum": [
2860
+ "product",
2861
+ "category",
2862
+ "site_wide"
2863
+ ]
2864
+ },
2865
+ "occasion": {
2866
+ "type": "string"
2867
+ },
2868
+ "validUntil": {
2869
+ "type": "string",
2870
+ "format": "date-time"
2871
+ }
2872
+ },
2873
+ "additionalProperties": false
2874
+ }
2875
+ }
2876
+ },
2877
+ "https://themachineweb.org/pagefront/spec/commerce/product/v0.9.json": {
2878
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
2879
+ "$id": "https://themachineweb.org/pagefront/spec/commerce/product/v0.9.json",
2880
+ "title": "Pagefront Product Sheet v0.9",
2881
+ "description": "Formal schema for the Pagefront product sheet. Revision of 2026-10-01 (breaking, within v0.9): configurator pricing moves from pagefront:configurator to the offer. The configurator loses basePrice, basePriceCurrency and priceFormula, its options lose priceModifier and currency, and it gains an optional @id and an exclusions[] array; configurator dimensions gain affectsPrice, inputType (select or text, for free-text dimensions) and maxLength; Offer and AggregateOffer accept pagefront:configuratorPricing, which names the configurator it prices and carries baseConfiguration, basePrice, modifiers, optional adjustments[] and a pricing completeness flag; every amount field (Offer price, AggregateOffer lowPrice and highPrice, variant price hints, promotion discountAmount, and the pricing block's basePrice, modifiers and adjustment amounts) references a shared definition, a JSON number or a plain decimal string: nonNegativeAmount for prices, bounds, base prices, price hints and discount amounts, and the signed amount for modifiers and adjustment amounts. v0.9 sheets that carried prices inside the configurator no longer validate. v0.9 was otherwise an additive release on top of v0.8: the legalEntity entry's organization now also validates in reference-stub form (@type + @id, no name) so entries can reference a Commerce Organization Sheet; the inline form and all other constraints are unchanged, and v0.8 sheets remain valid once their format_version is updated. v0.8 is an additive release on top of v0.7: it adds a pagefront:featureGroup[] array for grouped, ordered technical specifications (groups of Schema.org PropertyValue entries, with an optional pagefront:presentationValue display variant per entry), a pagefront:productHighlights[] array of ordered publisher-authored selling-point strings, and a pagefront:legalEntity[] array for role-typed legal entities behind a product (closed role enum: brand_owner, licensee, authorized_representative, importer, manufacturer — EU GPSR responsible persons and similar). gtin and gtin13 now accept a string or an array of strings (regional packaging, re-releases); category now accepts the display string, a Schema.org CategoryCode object, or a mixed array of both. The pagefront:Document role enum gains repairability_index, recall_notice, and declaration_of_conformity; the pagefront:RelatedProduct relationship enum gains service. v0.8 also adds two GPSR-driven safety fields: a pagefront:safetyWarning[] array for typed, language-scoped safety warnings (text required; optional pictogram URL and open-vocabulary hazardCategory) and a pagefront:safetyNotice[] array for structured recall/safety notices (closed noticeType enum: recall, warning; closed remedy enum: repair, replacement, refund). v0.7 sheets remain valid under v0.8 once their format_version is updated. Validates the envelope and pagefront-namespaced extensions strictly; Schema.org-typed blocks permit additional unspecified properties.",
2882
+ "type": "object",
2883
+ "required": [
2884
+ "format_version",
2885
+ "schema_org_version",
2886
+ "canonical_url",
2887
+ "sheet_url",
2888
+ "generated_at",
2889
+ "data"
2890
+ ],
2891
+ "properties": {
2892
+ "$schema": {
2893
+ "type": "string",
2894
+ "format": "uri"
2895
+ },
2896
+ "format_version": {
2897
+ "const": "0.9"
2898
+ },
2899
+ "schema_org_version": {
2900
+ "type": "string",
2901
+ "pattern": "^\\d+(\\.\\d+)?$"
2902
+ },
2903
+ "canonical_url": {
2904
+ "type": "string",
2905
+ "format": "uri"
2906
+ },
2907
+ "sheet_url": {
2908
+ "type": "string",
2909
+ "format": "uri"
2910
+ },
2911
+ "generated_at": {
2912
+ "type": "string",
2913
+ "format": "date-time"
2914
+ },
2915
+ "expires_at": {
2916
+ "type": "string",
2917
+ "format": "date-time"
2918
+ },
2919
+ "data": {
2920
+ "$ref": "#/$defs/dataBlock"
2921
+ }
2922
+ },
2923
+ "additionalProperties": false,
2924
+ "$defs": {
2925
+ "dataBlock": {
2926
+ "type": "object",
2927
+ "required": [
2928
+ "@context",
2929
+ "@type",
2930
+ "@id",
2931
+ "name",
2932
+ "inLanguage"
2933
+ ],
2934
+ "properties": {
2935
+ "@context": {
2936
+ "oneOf": [
2937
+ {
2938
+ "const": "https://schema.org"
2939
+ },
2940
+ {
2941
+ "type": "array",
2942
+ "items": {
2943
+ "oneOf": [
2944
+ {
2945
+ "type": "string",
2946
+ "format": "uri"
2947
+ },
2948
+ {
2949
+ "type": "object"
2950
+ }
2951
+ ]
2952
+ },
2953
+ "minItems": 1
2954
+ }
2955
+ ]
2956
+ },
2957
+ "@type": {
2958
+ "type": "string"
2959
+ },
2960
+ "@id": {
2961
+ "type": "string",
2962
+ "format": "uri"
2963
+ },
2964
+ "url": {
2965
+ "type": "string",
2966
+ "format": "uri"
2967
+ },
2968
+ "name": {
2969
+ "type": "string",
2970
+ "minLength": 1
2971
+ },
2972
+ "inLanguage": {
2973
+ "type": "string"
2974
+ },
2975
+ "sku": {
2976
+ "type": "string"
2977
+ },
2978
+ "gtin13": {
2979
+ "$ref": "#/$defs/gtin13Value"
2980
+ },
2981
+ "gtin": {
2982
+ "$ref": "#/$defs/gtinValue"
2983
+ },
2984
+ "mpn": {
2985
+ "type": "string"
2986
+ },
2987
+ "productID": {
2988
+ "type": "string"
2989
+ },
2990
+ "productGroupID": {
2991
+ "type": "string"
2992
+ },
2993
+ "variesBy": {
2994
+ "type": "array",
2995
+ "items": {
2996
+ "type": "string"
2997
+ }
2998
+ },
2999
+ "hasVariant": {
3000
+ "type": "array",
3001
+ "items": {
3002
+ "$ref": "#/$defs/variantEntry"
3003
+ }
3004
+ },
3005
+ "brand": {
3006
+ "type": "object",
3007
+ "properties": {
3008
+ "pagefront:sheetUrl": {
3009
+ "type": "string",
3010
+ "format": "uri"
3011
+ }
3012
+ }
3013
+ },
3014
+ "description": {
3015
+ "type": "string"
3016
+ },
3017
+ "category": {
3018
+ "oneOf": [
3019
+ {
3020
+ "type": "string"
3021
+ },
3022
+ {
3023
+ "$ref": "#/$defs/categoryCode"
3024
+ },
3025
+ {
3026
+ "type": "array",
3027
+ "items": {
3028
+ "oneOf": [
3029
+ {
3030
+ "type": "string"
3031
+ },
3032
+ {
3033
+ "$ref": "#/$defs/categoryCode"
3034
+ }
3035
+ ]
3036
+ },
3037
+ "minItems": 1
3038
+ }
3039
+ ]
3040
+ },
3041
+ "color": {
3042
+ "type": "string"
3043
+ },
3044
+ "material": {
3045
+ "type": "string"
3046
+ },
3047
+ "weight": {
3048
+ "type": "object"
3049
+ },
3050
+ "height": {
3051
+ "type": "object"
3052
+ },
3053
+ "width": {
3054
+ "type": "object"
3055
+ },
3056
+ "depth": {
3057
+ "type": "object"
3058
+ },
3059
+ "countryOfOrigin": {
3060
+ "type": "string",
3061
+ "pattern": "^[A-Z]{2}$"
3062
+ },
3063
+ "image": {
3064
+ "type": "array",
3065
+ "items": {
3066
+ "$ref": "#/$defs/imageObject"
3067
+ }
3068
+ },
3069
+ "video": {
3070
+ "type": "array",
3071
+ "items": {
3072
+ "$ref": "#/$defs/videoObject"
3073
+ }
3074
+ },
3075
+ "additionalProperty": {
3076
+ "type": "array"
3077
+ },
3078
+ "hasCertification": {
3079
+ "type": "array",
3080
+ "items": {
3081
+ "$ref": "#/$defs/certification"
3082
+ }
3083
+ },
3084
+ "manufacturer": {
3085
+ "type": "object"
3086
+ },
3087
+ "offers": {
3088
+ "type": "array",
3089
+ "items": {
3090
+ "oneOf": [
3091
+ {
3092
+ "$ref": "#/$defs/offer"
3093
+ },
3094
+ {
3095
+ "$ref": "#/$defs/aggregateOffer"
3096
+ }
3097
+ ]
3098
+ },
3099
+ "minItems": 1
3100
+ },
3101
+ "aggregateRating": {
3102
+ "type": "object"
3103
+ },
3104
+ "review": {
3105
+ "type": "array"
3106
+ },
3107
+ "isVariantOf": {
3108
+ "type": "object"
3109
+ },
3110
+ "isRelatedTo": {
3111
+ "type": "array"
3112
+ },
3113
+ "isSimilarTo": {
3114
+ "type": "array"
3115
+ },
3116
+ "isPartOf": {
3117
+ "oneOf": [
3118
+ {
3119
+ "type": "object"
3120
+ },
3121
+ {
3122
+ "type": "array"
3123
+ }
3124
+ ]
3125
+ },
3126
+ "hasPart": {
3127
+ "oneOf": [
3128
+ {
3129
+ "type": "object"
3130
+ },
3131
+ {
3132
+ "type": "array"
3133
+ }
3134
+ ]
3135
+ },
3136
+ "question": {
3137
+ "type": "array",
3138
+ "items": {
3139
+ "$ref": "#/$defs/questionObject"
3140
+ }
3141
+ },
3142
+ "pagefront:document": {
3143
+ "type": "array",
3144
+ "items": {
3145
+ "$ref": "#/$defs/documentObject"
3146
+ }
3147
+ },
3148
+ "pagefront:relatedProduct": {
3149
+ "type": "array",
3150
+ "items": {
3151
+ "$ref": "#/$defs/relatedProductObject"
3152
+ }
3153
+ },
3154
+ "pagefront:featureGroup": {
3155
+ "type": "array",
3156
+ "items": {
3157
+ "$ref": "#/$defs/featureGroup"
3158
+ },
3159
+ "minItems": 1
3160
+ },
3161
+ "pagefront:productHighlights": {
3162
+ "type": "array",
3163
+ "items": {
3164
+ "type": "string"
3165
+ },
3166
+ "minItems": 1
3167
+ },
3168
+ "pagefront:legalEntity": {
3169
+ "type": "array",
3170
+ "items": {
3171
+ "$ref": "#/$defs/legalEntity"
3172
+ },
3173
+ "minItems": 1
3174
+ },
3175
+ "pagefront:safetyWarning": {
3176
+ "type": "array",
3177
+ "items": {
3178
+ "$ref": "#/$defs/safetyWarning"
3179
+ },
3180
+ "minItems": 1
3181
+ },
3182
+ "pagefront:safetyNotice": {
3183
+ "type": "array",
3184
+ "items": {
3185
+ "$ref": "#/$defs/safetyNotice"
3186
+ },
3187
+ "minItems": 1
3188
+ },
3189
+ "pagefront:sizeChart": {
3190
+ "$ref": "#/$defs/sizeChart"
3191
+ },
3192
+ "pagefront:sizeRecommendation": {
3193
+ "$ref": "#/$defs/sizeRecommendation"
3194
+ },
3195
+ "pagefront:materialComposition": {
3196
+ "type": "array",
3197
+ "items": {
3198
+ "$ref": "#/$defs/material"
3199
+ }
3200
+ },
3201
+ "pagefront:fabricComposition": {
3202
+ "type": "array",
3203
+ "items": {
3204
+ "$ref": "#/$defs/material"
3205
+ }
3206
+ },
3207
+ "pagefront:construction": {
3208
+ "$ref": "#/$defs/construction"
3209
+ },
3210
+ "pagefront:manufacturingChain": {
3211
+ "type": "array",
3212
+ "items": {
3213
+ "$ref": "#/$defs/manufacturingStage"
3214
+ }
3215
+ },
3216
+ "pagefront:gemstone": {
3217
+ "$ref": "#/$defs/gemstone"
3218
+ },
3219
+ "pagefront:configurator": {
3220
+ "$ref": "#/$defs/configurator"
3221
+ },
3222
+ "pagefront:madeToOrderTerms": {
3223
+ "$ref": "#/$defs/madeToOrderTerms"
3224
+ },
3225
+ "pagefront:manufacturerWarranty": {
3226
+ "type": "object"
3227
+ },
3228
+ "pagefront:careInstructions": {
3229
+ "type": "array",
3230
+ "items": {
3231
+ "type": "string"
3232
+ }
3233
+ },
3234
+ "pagefront:availableLanguages": {
3235
+ "type": "array",
3236
+ "items": {
3237
+ "type": "object",
3238
+ "required": [
3239
+ "lang",
3240
+ "url"
3241
+ ],
3242
+ "properties": {
3243
+ "lang": {
3244
+ "type": "string"
3245
+ },
3246
+ "url": {
3247
+ "type": "string",
3248
+ "format": "uri"
3249
+ }
3250
+ },
3251
+ "additionalProperties": false
3252
+ }
3253
+ }
3254
+ },
3255
+ "if": {
3256
+ "properties": {
3257
+ "@type": {
3258
+ "const": "ProductGroup"
3259
+ }
3260
+ },
3261
+ "required": [
3262
+ "@type"
3263
+ ]
3264
+ },
3265
+ "then": {
3266
+ "required": [
3267
+ "productGroupID"
3268
+ ]
3269
+ },
3270
+ "else": {
3271
+ "required": [
3272
+ "url"
3273
+ ],
3274
+ "anyOf": [
3275
+ {
3276
+ "required": [
3277
+ "sku"
3278
+ ]
3279
+ },
3280
+ {
3281
+ "required": [
3282
+ "gtin13"
3283
+ ]
3284
+ },
3285
+ {
3286
+ "required": [
3287
+ "gtin"
3288
+ ]
3289
+ },
3290
+ {
3291
+ "required": [
3292
+ "mpn"
3293
+ ]
3294
+ },
3295
+ {
3296
+ "required": [
3297
+ "productID"
3298
+ ]
3299
+ }
3300
+ ]
3301
+ },
3302
+ "additionalProperties": true
3303
+ },
3304
+ "amount": {
3305
+ "description": "A currency amount: a JSON number, or a decimal string with a dot as decimal point, no thousands separators and no currency symbol. A Sheet uses one of the two carriers for all its amounts.",
3306
+ "oneOf": [
3307
+ {
3308
+ "type": "number"
3309
+ },
3310
+ {
3311
+ "type": "string",
3312
+ "pattern": "^-?\\d+(\\.\\d+)?$"
3313
+ }
3314
+ ]
3315
+ },
3316
+ "nonNegativeAmount": {
3317
+ "description": "An amount that is zero or positive: the same two carriers as amount, with no leading minus. Used for prices, price bounds, base prices, price hints and discount amounts; only modifiers and adjustment amounts are signed.",
3318
+ "oneOf": [
3319
+ {
3320
+ "type": "number",
3321
+ "minimum": 0
3322
+ },
3323
+ {
3324
+ "type": "string",
3325
+ "pattern": "^\\d+(\\.\\d+)?$"
3326
+ }
3327
+ ]
3328
+ },
3329
+ "variantEntry": {
3330
+ "type": "object",
3331
+ "required": [
3332
+ "@type"
3333
+ ],
3334
+ "properties": {
3335
+ "@type": {
3336
+ "type": "string"
3337
+ },
3338
+ "@id": {
3339
+ "type": "string",
3340
+ "format": "uri"
3341
+ },
3342
+ "url": {
3343
+ "type": "string",
3344
+ "format": "uri"
3345
+ },
3346
+ "sheet_url": {
3347
+ "type": "string",
3348
+ "format": "uri"
3349
+ },
3350
+ "name": {
3351
+ "type": "string"
3352
+ },
3353
+ "sku": {
3354
+ "type": "string"
3355
+ },
3356
+ "gtin13": {
3357
+ "$ref": "#/$defs/gtin13Value"
3358
+ },
3359
+ "gtin": {
3360
+ "$ref": "#/$defs/gtinValue"
3361
+ },
3362
+ "mpn": {
3363
+ "type": "string"
3364
+ },
3365
+ "productID": {
3366
+ "type": "string"
3367
+ },
3368
+ "color": {
3369
+ "type": "string"
3370
+ },
3371
+ "size": {
3372
+ "type": "string"
3373
+ },
3374
+ "material": {
3375
+ "type": "string"
3376
+ },
3377
+ "price": {
3378
+ "$ref": "#/$defs/nonNegativeAmount"
3379
+ },
3380
+ "image": {
3381
+ "type": "string",
3382
+ "format": "uri"
3383
+ },
3384
+ "additionalProperty": {
3385
+ "type": "array"
3386
+ }
3387
+ },
3388
+ "additionalProperties": true
3389
+ },
3390
+ "imageObject": {
3391
+ "type": "object",
3392
+ "required": [
3393
+ "@type",
3394
+ "url"
3395
+ ],
3396
+ "properties": {
3397
+ "@type": {
3398
+ "const": "ImageObject"
3399
+ },
3400
+ "url": {
3401
+ "type": "string",
3402
+ "format": "uri"
3403
+ },
3404
+ "caption": {
3405
+ "type": "string"
3406
+ },
3407
+ "additionalProperty": {
3408
+ "type": "array",
3409
+ "items": {
3410
+ "type": "object",
3411
+ "properties": {
3412
+ "@type": {
3413
+ "const": "PropertyValue"
3414
+ },
3415
+ "name": {
3416
+ "type": "string"
3417
+ },
3418
+ "value": {
3419
+ "type": "string"
3420
+ }
3421
+ },
3422
+ "allOf": [
3423
+ {
3424
+ "if": {
3425
+ "properties": {
3426
+ "name": {
3427
+ "const": "role"
3428
+ }
3429
+ },
3430
+ "required": [
3431
+ "name"
3432
+ ]
3433
+ },
3434
+ "then": {
3435
+ "properties": {
3436
+ "value": {
3437
+ "enum": [
3438
+ "hero",
3439
+ "packshot",
3440
+ "lifestyle",
3441
+ "detail",
3442
+ "flatlay",
3443
+ "swatch",
3444
+ "size_chart",
3445
+ "context"
3446
+ ]
3447
+ }
3448
+ }
3449
+ }
3450
+ }
3451
+ ]
3452
+ }
3453
+ }
3454
+ },
3455
+ "additionalProperties": true
3456
+ },
3457
+ "videoObject": {
3458
+ "type": "object",
3459
+ "required": [
3460
+ "@type"
3461
+ ],
3462
+ "properties": {
3463
+ "@type": {
3464
+ "const": "VideoObject"
3465
+ },
3466
+ "url": {
3467
+ "type": "string",
3468
+ "format": "uri"
3469
+ },
3470
+ "contentUrl": {
3471
+ "type": "string",
3472
+ "format": "uri"
3473
+ },
3474
+ "embedUrl": {
3475
+ "type": "string",
3476
+ "format": "uri"
3477
+ },
3478
+ "thumbnailUrl": {
3479
+ "type": "string",
3480
+ "format": "uri"
3481
+ },
3482
+ "duration": {
3483
+ "type": "string",
3484
+ "pattern": "^P(?:\\d+Y)?(?:\\d+M)?(?:\\d+D)?(?:T(?:\\d+H)?(?:\\d+M)?(?:\\d+(?:\\.\\d+)?S)?)?$"
3485
+ },
3486
+ "uploadDate": {
3487
+ "type": "string"
3488
+ },
3489
+ "caption": {
3490
+ "type": "string"
3491
+ },
3492
+ "transcript": {
3493
+ "type": "string"
3494
+ },
3495
+ "description": {
3496
+ "type": "string"
3497
+ },
3498
+ "name": {
3499
+ "type": "string"
3500
+ },
3501
+ "additionalProperty": {
3502
+ "type": "array",
3503
+ "items": {
3504
+ "type": "object",
3505
+ "properties": {
3506
+ "@type": {
3507
+ "const": "PropertyValue"
3508
+ },
3509
+ "name": {
3510
+ "type": "string"
3511
+ },
3512
+ "value": {
3513
+ "type": "string"
3514
+ }
3515
+ },
3516
+ "allOf": [
3517
+ {
3518
+ "if": {
3519
+ "properties": {
3520
+ "name": {
3521
+ "const": "role"
3522
+ }
3523
+ },
3524
+ "required": [
3525
+ "name"
3526
+ ]
3527
+ },
3528
+ "then": {
3529
+ "properties": {
3530
+ "value": {
3531
+ "enum": [
3532
+ "overview",
3533
+ "tutorial",
3534
+ "lifestyle",
3535
+ "construction",
3536
+ "demonstration",
3537
+ "comparison",
3538
+ "unboxing",
3539
+ "spin"
3540
+ ]
3541
+ }
3542
+ }
3543
+ }
3544
+ }
3545
+ ]
3546
+ }
3547
+ }
3548
+ },
3549
+ "anyOf": [
3550
+ {
3551
+ "required": [
3552
+ "url"
3553
+ ]
3554
+ },
3555
+ {
3556
+ "required": [
3557
+ "contentUrl"
3558
+ ]
3559
+ },
3560
+ {
3561
+ "required": [
3562
+ "embedUrl"
3563
+ ]
3564
+ }
3565
+ ],
3566
+ "additionalProperties": true
3567
+ },
3568
+ "questionObject": {
3569
+ "type": "object",
3570
+ "required": [
3571
+ "@type",
3572
+ "name",
3573
+ "acceptedAnswer"
3574
+ ],
3575
+ "properties": {
3576
+ "@type": {
3577
+ "const": "Question"
3578
+ },
3579
+ "name": {
3580
+ "type": "string",
3581
+ "minLength": 1
3582
+ },
3583
+ "acceptedAnswer": {
3584
+ "type": "object",
3585
+ "required": [
3586
+ "@type",
3587
+ "text"
3588
+ ],
3589
+ "properties": {
3590
+ "@type": {
3591
+ "const": "Answer"
3592
+ },
3593
+ "text": {
3594
+ "type": "string",
3595
+ "minLength": 1
3596
+ }
3597
+ },
3598
+ "additionalProperties": true
3599
+ },
3600
+ "suggestedAnswer": {
3601
+ "type": "array",
3602
+ "items": {
3603
+ "type": "object",
3604
+ "required": [
3605
+ "@type",
3606
+ "text"
3607
+ ],
3608
+ "properties": {
3609
+ "@type": {
3610
+ "const": "Answer"
3611
+ },
3612
+ "text": {
3613
+ "type": "string",
3614
+ "minLength": 1
3615
+ }
3616
+ },
3617
+ "additionalProperties": true
3618
+ }
3619
+ }
3620
+ },
3621
+ "additionalProperties": true
3622
+ },
3623
+ "documentObject": {
3624
+ "type": "object",
3625
+ "required": [
3626
+ "@type",
3627
+ "url",
3628
+ "role"
3629
+ ],
3630
+ "properties": {
3631
+ "@type": {
3632
+ "const": "pagefront:Document"
3633
+ },
3634
+ "url": {
3635
+ "type": "string",
3636
+ "format": "uri"
3637
+ },
3638
+ "role": {
3639
+ "type": "string",
3640
+ "enum": [
3641
+ "manual",
3642
+ "assembly",
3643
+ "care_guide",
3644
+ "spec_sheet",
3645
+ "compatibility",
3646
+ "warranty",
3647
+ "certificate",
3648
+ "environmental_declaration",
3649
+ "audit_report",
3650
+ "lab_test",
3651
+ "safety_data_sheet",
3652
+ "installation_guide",
3653
+ "user_guide",
3654
+ "quick_start",
3655
+ "brochure",
3656
+ "repairability_index",
3657
+ "recall_notice",
3658
+ "declaration_of_conformity"
3659
+ ]
3660
+ },
3661
+ "name": {
3662
+ "type": "string"
3663
+ },
3664
+ "inLanguage": {
3665
+ "type": "string"
3666
+ },
3667
+ "description": {
3668
+ "type": "string"
3669
+ },
3670
+ "encodingFormat": {
3671
+ "type": "string"
3672
+ }
3673
+ },
3674
+ "additionalProperties": false
3675
+ },
3676
+ "relatedProductObject": {
3677
+ "type": "object",
3678
+ "required": [
3679
+ "@type",
3680
+ "relationship"
3681
+ ],
3682
+ "properties": {
3683
+ "@type": {
3684
+ "const": "pagefront:RelatedProduct"
3685
+ },
3686
+ "relationship": {
3687
+ "type": "string",
3688
+ "enum": [
3689
+ "accessory",
3690
+ "consumable",
3691
+ "required_part",
3692
+ "spare_part",
3693
+ "often_bought_with",
3694
+ "recommended_with",
3695
+ "replaces",
3696
+ "replaced_by",
3697
+ "bundle_component",
3698
+ "compatible_with",
3699
+ "service"
3700
+ ]
3701
+ },
3702
+ "@id": {
3703
+ "type": "string",
3704
+ "format": "uri"
3705
+ },
3706
+ "sku": {
3707
+ "type": "string"
3708
+ },
3709
+ "gtin": {
3710
+ "type": "string"
3711
+ },
3712
+ "gtin13": {
3713
+ "type": "string",
3714
+ "pattern": "^[0-9]{13}$"
3715
+ },
3716
+ "mpn": {
3717
+ "type": "string"
3718
+ },
3719
+ "name": {
3720
+ "type": "string"
3721
+ },
3722
+ "url": {
3723
+ "type": "string",
3724
+ "format": "uri"
3725
+ },
3726
+ "image": {
3727
+ "type": "string",
3728
+ "format": "uri"
3729
+ }
3730
+ },
3731
+ "anyOf": [
3732
+ {
3733
+ "required": [
3734
+ "@id"
3735
+ ]
3736
+ },
3737
+ {
3738
+ "required": [
3739
+ "sku"
3740
+ ]
3741
+ },
3742
+ {
3743
+ "required": [
3744
+ "gtin"
3745
+ ]
3746
+ },
3747
+ {
3748
+ "required": [
3749
+ "gtin13"
3750
+ ]
3751
+ },
3752
+ {
3753
+ "required": [
3754
+ "mpn"
3755
+ ]
3756
+ }
3757
+ ],
3758
+ "additionalProperties": false
3759
+ },
3760
+ "gtinValue": {
3761
+ "oneOf": [
3762
+ {
3763
+ "type": "string"
3764
+ },
3765
+ {
3766
+ "type": "array",
3767
+ "items": {
3768
+ "type": "string"
3769
+ },
3770
+ "minItems": 1
3771
+ }
3772
+ ]
3773
+ },
3774
+ "gtin13Value": {
3775
+ "oneOf": [
3776
+ {
3777
+ "type": "string",
3778
+ "pattern": "^[0-9]{13}$"
3779
+ },
3780
+ {
3781
+ "type": "array",
3782
+ "items": {
3783
+ "type": "string",
3784
+ "pattern": "^[0-9]{13}$"
3785
+ },
3786
+ "minItems": 1
3787
+ }
3788
+ ]
3789
+ },
3790
+ "categoryCode": {
3791
+ "type": "object",
3792
+ "required": [
3793
+ "@type",
3794
+ "codeValue"
3795
+ ],
3796
+ "properties": {
3797
+ "@type": {
3798
+ "const": "CategoryCode"
3799
+ },
3800
+ "codeValue": {
3801
+ "type": "string",
3802
+ "minLength": 1
3803
+ },
3804
+ "inCodeSet": {
3805
+ "oneOf": [
3806
+ {
3807
+ "type": "string",
3808
+ "format": "uri"
3809
+ },
3810
+ {
3811
+ "type": "object"
3812
+ }
3813
+ ]
3814
+ },
3815
+ "name": {
3816
+ "type": "string"
3817
+ }
3818
+ },
3819
+ "additionalProperties": true
3820
+ },
3821
+ "featureGroup": {
3822
+ "type": "object",
3823
+ "required": [
3824
+ "@type",
3825
+ "name",
3826
+ "feature"
3827
+ ],
3828
+ "properties": {
3829
+ "@type": {
3830
+ "const": "pagefront:FeatureGroup"
3831
+ },
3832
+ "name": {
3833
+ "type": "string",
3834
+ "minLength": 1
3835
+ },
3836
+ "sortOrder": {
3837
+ "type": "integer"
3838
+ },
3839
+ "feature": {
3840
+ "type": "array",
3841
+ "items": {
3842
+ "$ref": "#/$defs/featureEntry"
3843
+ },
3844
+ "minItems": 1
3845
+ }
3846
+ },
3847
+ "additionalProperties": false
3848
+ },
3849
+ "featureEntry": {
3850
+ "type": "object",
3851
+ "required": [
3852
+ "@type",
3853
+ "name",
3854
+ "value"
3855
+ ],
3856
+ "properties": {
3857
+ "@type": {
3858
+ "const": "PropertyValue"
3859
+ },
3860
+ "propertyID": {
3861
+ "type": "string"
3862
+ },
3863
+ "name": {
3864
+ "type": "string",
3865
+ "minLength": 1
3866
+ },
3867
+ "value": {
3868
+ "anyOf": [
3869
+ {
3870
+ "type": "string"
3871
+ },
3872
+ {
3873
+ "type": "number"
3874
+ },
3875
+ {
3876
+ "type": "boolean"
3877
+ }
3878
+ ]
3879
+ },
3880
+ "unitCode": {
3881
+ "type": "string"
3882
+ },
3883
+ "description": {
3884
+ "type": "string"
3885
+ },
3886
+ "pagefront:presentationValue": {
3887
+ "type": "string"
3888
+ }
3889
+ },
3890
+ "additionalProperties": true
3891
+ },
3892
+ "legalEntity": {
3893
+ "type": "object",
3894
+ "required": [
3895
+ "@type",
3896
+ "role",
3897
+ "organization"
3898
+ ],
3899
+ "properties": {
3900
+ "@type": {
3901
+ "const": "pagefront:LegalEntity"
3902
+ },
3903
+ "role": {
3904
+ "type": "string",
3905
+ "enum": [
3906
+ "brand_owner",
3907
+ "licensee",
3908
+ "authorized_representative",
3909
+ "importer",
3910
+ "manufacturer"
3911
+ ]
3912
+ },
3913
+ "organization": {
3914
+ "type": "object",
3915
+ "required": [
3916
+ "@type"
3917
+ ],
3918
+ "anyOf": [
3919
+ {
3920
+ "required": [
3921
+ "name"
3922
+ ]
3923
+ },
3924
+ {
3925
+ "required": [
3926
+ "@id"
3927
+ ]
3928
+ }
3929
+ ],
3930
+ "properties": {
3931
+ "@type": {
3932
+ "const": "Organization"
3933
+ },
3934
+ "@id": {
3935
+ "type": "string",
3936
+ "format": "uri"
3937
+ },
3938
+ "name": {
3939
+ "type": "string",
3940
+ "minLength": 1
3941
+ },
3942
+ "address": {
3943
+ "type": "object"
3944
+ },
3945
+ "url": {
3946
+ "type": "string",
3947
+ "format": "uri"
3948
+ },
3949
+ "email": {
3950
+ "type": "string",
3951
+ "format": "email"
3952
+ },
3953
+ "pagefront:sheetUrl": {
3954
+ "type": "string",
3955
+ "format": "uri"
3956
+ }
3957
+ },
3958
+ "additionalProperties": true
3959
+ }
3960
+ },
3961
+ "additionalProperties": false
3962
+ },
3963
+ "safetyWarning": {
3964
+ "type": "object",
3965
+ "required": [
3966
+ "@type",
3967
+ "text"
3968
+ ],
3969
+ "properties": {
3970
+ "@type": {
3971
+ "const": "pagefront:SafetyWarning"
3972
+ },
3973
+ "text": {
3974
+ "type": "string",
3975
+ "minLength": 1
3976
+ },
3977
+ "pictogram": {
3978
+ "type": "string",
3979
+ "format": "uri"
3980
+ },
3981
+ "hazardCategory": {
3982
+ "type": "string"
3983
+ }
3984
+ },
3985
+ "additionalProperties": false
3986
+ },
3987
+ "safetyNotice": {
3988
+ "type": "object",
3989
+ "required": [
3990
+ "@type",
3991
+ "noticeType"
3992
+ ],
3993
+ "properties": {
3994
+ "@type": {
3995
+ "const": "pagefront:SafetyNotice"
3996
+ },
3997
+ "noticeType": {
3998
+ "type": "string",
3999
+ "enum": [
4000
+ "recall",
4001
+ "warning"
4002
+ ]
4003
+ },
4004
+ "hazard": {
4005
+ "type": "string"
4006
+ },
4007
+ "remedy": {
4008
+ "type": "string",
4009
+ "enum": [
4010
+ "repair",
4011
+ "replacement",
4012
+ "refund"
4013
+ ]
4014
+ },
4015
+ "description": {
4016
+ "type": "string"
4017
+ },
4018
+ "reference": {
4019
+ "type": "string",
4020
+ "format": "uri"
4021
+ },
4022
+ "datePublished": {
4023
+ "type": "string",
4024
+ "format": "date"
4025
+ },
4026
+ "url": {
4027
+ "type": "string",
4028
+ "format": "uri"
4029
+ }
4030
+ },
4031
+ "additionalProperties": false
4032
+ },
4033
+ "certification": {
4034
+ "type": "object",
4035
+ "required": [
4036
+ "@type",
4037
+ "name"
4038
+ ],
4039
+ "properties": {
4040
+ "@type": {
4041
+ "const": "Certification"
4042
+ },
4043
+ "name": {
4044
+ "type": "string"
4045
+ },
4046
+ "issuedBy": {
4047
+ "type": "object"
4048
+ },
4049
+ "about": {
4050
+ "type": "string"
4051
+ },
4052
+ "additionalProperty": {
4053
+ "type": "array"
4054
+ }
4055
+ },
4056
+ "additionalProperties": true
4057
+ },
4058
+ "offer": {
4059
+ "type": "object",
4060
+ "required": [
4061
+ "@type"
4062
+ ],
4063
+ "properties": {
4064
+ "@type": {
4065
+ "const": "Offer"
4066
+ },
4067
+ "@id": {
4068
+ "type": "string"
4069
+ },
4070
+ "itemOffered": {
4071
+ "type": "object"
4072
+ },
4073
+ "price": {
4074
+ "$ref": "#/$defs/nonNegativeAmount"
4075
+ },
4076
+ "priceCurrency": {
4077
+ "type": "string",
4078
+ "pattern": "^[A-Z]{3}$"
4079
+ },
4080
+ "priceSpecification": {
4081
+ "oneOf": [
4082
+ {
4083
+ "type": "object"
4084
+ },
4085
+ {
4086
+ "type": "array",
4087
+ "items": {
4088
+ "type": "object"
4089
+ }
4090
+ }
4091
+ ]
4092
+ },
4093
+ "availability": {
4094
+ "type": "string",
4095
+ "pattern": "^https?://schema\\.org/(InStock|OutOfStock|PreOrder|BackOrder|InStoreOnly|LimitedAvailability|MadeToOrder|OnlineOnly|SoldOut|Discontinued|Reserved)$"
4096
+ },
4097
+ "itemCondition": {
4098
+ "type": "string",
4099
+ "pattern": "^https?://schema\\.org/(NewCondition|UsedCondition|RefurbishedCondition|DamagedCondition)$"
4100
+ },
4101
+ "seller": {
4102
+ "type": "object",
4103
+ "properties": {
4104
+ "pagefront:sheetUrl": {
4105
+ "type": "string",
4106
+ "format": "uri"
4107
+ }
4108
+ }
4109
+ },
4110
+ "shippingDetails": {
4111
+ "oneOf": [
4112
+ {
4113
+ "type": "object"
4114
+ },
4115
+ {
4116
+ "type": "array",
4117
+ "items": {
4118
+ "type": "object"
4119
+ }
4120
+ }
4121
+ ]
4122
+ },
4123
+ "hasMerchantReturnPolicy": {
4124
+ "type": "object"
4125
+ },
4126
+ "warranty": {
4127
+ "type": "object"
4128
+ },
4129
+ "areaServed": {},
4130
+ "eligibleRegion": {
4131
+ "type": "array"
4132
+ },
4133
+ "acceptedPaymentMethod": {
4134
+ "type": "array"
4135
+ },
4136
+ "pagefront:estimatedDelivery": {
4137
+ "$ref": "#/$defs/deliveryEstimate"
4138
+ },
4139
+ "pagefront:promotions": {
4140
+ "type": "array",
4141
+ "items": {
4142
+ "$ref": "#/$defs/promotion"
4143
+ }
4144
+ },
4145
+ "pagefront:priceOnRequest": {
4146
+ "$ref": "#/$defs/priceOnRequest"
4147
+ },
4148
+ "pagefront:configuratorPricing": {
4149
+ "$ref": "#/$defs/configuratorPricing"
4150
+ }
4151
+ },
4152
+ "anyOf": [
4153
+ {
4154
+ "required": [
4155
+ "price",
4156
+ "priceCurrency"
4157
+ ]
4158
+ },
4159
+ {
4160
+ "required": [
4161
+ "priceSpecification"
4162
+ ]
4163
+ },
4164
+ {
4165
+ "required": [
4166
+ "pagefront:priceOnRequest"
4167
+ ]
4168
+ }
4169
+ ],
4170
+ "dependentRequired": {
4171
+ "pagefront:configuratorPricing": [
4172
+ "price",
4173
+ "priceCurrency"
4174
+ ]
4175
+ },
4176
+ "additionalProperties": true
4177
+ },
4178
+ "aggregateOffer": {
4179
+ "type": "object",
4180
+ "required": [
4181
+ "@type",
4182
+ "lowPrice",
4183
+ "highPrice",
4184
+ "priceCurrency"
4185
+ ],
4186
+ "properties": {
4187
+ "@type": {
4188
+ "const": "AggregateOffer"
4189
+ },
4190
+ "@id": {
4191
+ "type": "string"
4192
+ },
4193
+ "lowPrice": {
4194
+ "$ref": "#/$defs/nonNegativeAmount"
4195
+ },
4196
+ "highPrice": {
4197
+ "$ref": "#/$defs/nonNegativeAmount"
4198
+ },
4199
+ "priceCurrency": {
4200
+ "type": "string",
4201
+ "pattern": "^[A-Z]{3}$"
4202
+ },
4203
+ "offerCount": {
4204
+ "type": "integer"
4205
+ },
4206
+ "availability": {
4207
+ "type": "string",
4208
+ "pattern": "^https?://schema\\.org/(InStock|OutOfStock|PreOrder|BackOrder|InStoreOnly|LimitedAvailability|MadeToOrder|OnlineOnly|SoldOut|Discontinued|Reserved)$"
4209
+ },
4210
+ "itemCondition": {
4211
+ "type": "string",
4212
+ "pattern": "^https?://schema\\.org/(NewCondition|UsedCondition|RefurbishedCondition|DamagedCondition)$"
4213
+ },
4214
+ "eligibleRegion": {
4215
+ "type": "array"
4216
+ },
4217
+ "areaServed": {},
4218
+ "validFrom": {
4219
+ "type": "string"
4220
+ },
4221
+ "validThrough": {
4222
+ "type": "string"
4223
+ },
4224
+ "seller": {
4225
+ "type": "object"
4226
+ },
4227
+ "pagefront:configuratorPricing": {
4228
+ "$ref": "#/$defs/configuratorPricing"
4229
+ }
4230
+ },
4231
+ "additionalProperties": true
4232
+ },
4233
+ "priceOnRequest": {
4234
+ "type": "object",
4235
+ "required": [
4236
+ "@type",
4237
+ "method"
4238
+ ],
4239
+ "properties": {
4240
+ "@type": {
4241
+ "const": "pagefront:PriceOnRequest"
4242
+ },
4243
+ "method": {
4244
+ "type": "string",
4245
+ "enum": [
4246
+ "authorized_retailer",
4247
+ "dealer_network",
4248
+ "quote_form",
4249
+ "email",
4250
+ "phone",
4251
+ "unspecified"
4252
+ ]
4253
+ },
4254
+ "contactUrl": {
4255
+ "type": "string",
4256
+ "format": "uri"
4257
+ },
4258
+ "contactEmail": {
4259
+ "type": "string",
4260
+ "format": "email"
4261
+ },
4262
+ "contactPhone": {
4263
+ "type": "string"
4264
+ },
4265
+ "note": {
4266
+ "type": "string"
4267
+ }
4268
+ },
4269
+ "additionalProperties": false
4270
+ },
4271
+ "sizeChart": {
4272
+ "type": "object",
4273
+ "required": [
4274
+ "@type",
4275
+ "unitCode",
4276
+ "sizes",
4277
+ "measurements"
4278
+ ],
4279
+ "properties": {
4280
+ "@type": {
4281
+ "const": "pagefront:SizeChart"
4282
+ },
4283
+ "unitCode": {
4284
+ "type": "string"
4285
+ },
4286
+ "sizes": {
4287
+ "type": "array",
4288
+ "items": {
4289
+ "type": "string"
4290
+ },
4291
+ "minItems": 1
4292
+ },
4293
+ "measurements": {
4294
+ "type": "array",
4295
+ "items": {
4296
+ "$ref": "#/$defs/measurement"
4297
+ },
4298
+ "minItems": 1
4299
+ },
4300
+ "modelReferences": {
4301
+ "type": "array",
4302
+ "items": {
4303
+ "$ref": "#/$defs/modelReference"
4304
+ }
4305
+ }
4306
+ },
4307
+ "additionalProperties": false
4308
+ },
4309
+ "measurement": {
4310
+ "type": "object",
4311
+ "required": [
4312
+ "@type",
4313
+ "name",
4314
+ "values"
4315
+ ],
4316
+ "properties": {
4317
+ "@type": {
4318
+ "const": "pagefront:Measurement"
4319
+ },
4320
+ "name": {
4321
+ "type": "string"
4322
+ },
4323
+ "values": {
4324
+ "type": "object",
4325
+ "additionalProperties": {
4326
+ "type": "number"
4327
+ }
4328
+ }
4329
+ },
4330
+ "additionalProperties": false
4331
+ },
4332
+ "modelReference": {
4333
+ "type": "object",
4334
+ "required": [
4335
+ "@type",
4336
+ "name"
4337
+ ],
4338
+ "properties": {
4339
+ "@type": {
4340
+ "const": "pagefront:ModelReference"
4341
+ },
4342
+ "name": {
4343
+ "type": "string"
4344
+ },
4345
+ "heightCm": {
4346
+ "type": "number",
4347
+ "minimum": 0
4348
+ },
4349
+ "wearsSize": {
4350
+ "type": "string"
4351
+ }
4352
+ },
4353
+ "additionalProperties": false
4354
+ },
4355
+ "sizeRecommendation": {
4356
+ "type": "object",
4357
+ "required": [
4358
+ "@type"
4359
+ ],
4360
+ "properties": {
4361
+ "@type": {
4362
+ "const": "pagefront:SizeRecommendation"
4363
+ },
4364
+ "fitProfile": {
4365
+ "type": "string",
4366
+ "enum": [
4367
+ "runs_small",
4368
+ "true_to_size",
4369
+ "runs_large"
4370
+ ]
4371
+ },
4372
+ "sizeAdjustment": {
4373
+ "$ref": "#/$defs/sizeAdjustment"
4374
+ },
4375
+ "description": {
4376
+ "type": "string"
4377
+ },
4378
+ "appliesTo": {
4379
+ "type": "string"
4380
+ }
4381
+ },
4382
+ "additionalProperties": false
4383
+ },
4384
+ "sizeAdjustment": {
4385
+ "type": "object",
4386
+ "required": [
4387
+ "@type",
4388
+ "direction",
4389
+ "magnitude"
4390
+ ],
4391
+ "properties": {
4392
+ "@type": {
4393
+ "const": "pagefront:SizeAdjustment"
4394
+ },
4395
+ "direction": {
4396
+ "type": "string",
4397
+ "enum": [
4398
+ "up",
4399
+ "down"
4400
+ ]
4401
+ },
4402
+ "magnitude": {
4403
+ "type": "number",
4404
+ "minimum": 0
4405
+ },
4406
+ "sizeSystem": {
4407
+ "type": "string"
4408
+ }
4409
+ },
4410
+ "additionalProperties": false
4411
+ },
4412
+ "material": {
4413
+ "type": "object",
4414
+ "required": [
4415
+ "@type",
4416
+ "material"
4417
+ ],
4418
+ "properties": {
4419
+ "@type": {
4420
+ "const": "pagefront:Material"
4421
+ },
4422
+ "material": {
4423
+ "type": "string"
4424
+ },
4425
+ "percentage": {
4426
+ "type": "number",
4427
+ "minimum": 0,
4428
+ "maximum": 100
4429
+ },
4430
+ "purity": {
4431
+ "type": "string"
4432
+ },
4433
+ "purityPercentage": {
4434
+ "type": "number",
4435
+ "minimum": 0,
4436
+ "maximum": 100
4437
+ },
4438
+ "provenance": {
4439
+ "type": "string",
4440
+ "enum": [
4441
+ "virgin",
4442
+ "recycled",
4443
+ "fair_mined",
4444
+ "lab_grown",
4445
+ "reclaimed",
4446
+ "deadstock"
4447
+ ]
4448
+ },
4449
+ "weightGrams": {
4450
+ "type": "number",
4451
+ "minimum": 0
4452
+ }
4453
+ },
4454
+ "additionalProperties": false
4455
+ },
4456
+ "construction": {
4457
+ "type": "object",
4458
+ "required": [
4459
+ "@type"
4460
+ ],
4461
+ "properties": {
4462
+ "@type": {
4463
+ "const": "pagefront:Construction"
4464
+ },
4465
+ "stitch": {
4466
+ "type": "string"
4467
+ },
4468
+ "gauge": {
4469
+ "type": "number"
4470
+ },
4471
+ "machine": {
4472
+ "type": "string"
4473
+ },
4474
+ "constructionNotes": {
4475
+ "type": "string"
4476
+ }
4477
+ },
4478
+ "additionalProperties": true
4479
+ },
4480
+ "manufacturingStage": {
4481
+ "type": "object",
4482
+ "required": [
4483
+ "@type",
4484
+ "stage",
4485
+ "country"
4486
+ ],
4487
+ "properties": {
4488
+ "@type": {
4489
+ "const": "pagefront:ManufacturingStage"
4490
+ },
4491
+ "stage": {
4492
+ "type": "string"
4493
+ },
4494
+ "country": {
4495
+ "type": "string",
4496
+ "pattern": "^[A-Z]{2}$"
4497
+ },
4498
+ "facility": {
4499
+ "type": "string"
4500
+ },
4501
+ "facilityCountry": {
4502
+ "type": "string",
4503
+ "pattern": "^[A-Z]{2}$"
4504
+ }
4505
+ },
4506
+ "additionalProperties": false
4507
+ },
4508
+ "gemstone": {
4509
+ "type": "object",
4510
+ "required": [
4511
+ "@type",
4512
+ "type"
4513
+ ],
4514
+ "properties": {
4515
+ "@type": {
4516
+ "const": "pagefront:Gemstone"
4517
+ },
4518
+ "type": {
4519
+ "type": "string"
4520
+ },
4521
+ "origin": {
4522
+ "type": "string",
4523
+ "enum": [
4524
+ "natural_mined",
4525
+ "lab_grown",
4526
+ "treated",
4527
+ "synthetic"
4528
+ ]
4529
+ },
4530
+ "shape": {
4531
+ "type": "string"
4532
+ },
4533
+ "caratWeight": {
4534
+ "type": "number",
4535
+ "minimum": 0
4536
+ },
4537
+ "colorGrade": {
4538
+ "type": "string"
4539
+ },
4540
+ "clarityGrade": {
4541
+ "type": "string"
4542
+ },
4543
+ "cutGrade": {
4544
+ "type": "string"
4545
+ },
4546
+ "certifyingBody": {
4547
+ "type": "string"
4548
+ }
4549
+ },
4550
+ "additionalProperties": false
4551
+ },
4552
+ "configurator": {
4553
+ "type": "object",
4554
+ "required": [
4555
+ "@type",
4556
+ "dimensions"
4557
+ ],
4558
+ "properties": {
4559
+ "@type": {
4560
+ "const": "pagefront:Configurator"
4561
+ },
4562
+ "@id": {
4563
+ "type": "string",
4564
+ "minLength": 1
4565
+ },
4566
+ "dimensions": {
4567
+ "type": "array",
4568
+ "items": {
4569
+ "$ref": "#/$defs/configuratorDimension"
4570
+ },
4571
+ "minItems": 1
4572
+ },
4573
+ "exclusions": {
4574
+ "type": "array",
4575
+ "items": {
4576
+ "$ref": "#/$defs/configurationSelection",
4577
+ "type": "object",
4578
+ "minProperties": 1
4579
+ }
4580
+ }
4581
+ },
4582
+ "additionalProperties": false
4583
+ },
4584
+ "configuratorDimension": {
4585
+ "type": "object",
4586
+ "required": [
4587
+ "name"
4588
+ ],
4589
+ "properties": {
4590
+ "name": {
4591
+ "type": "string"
4592
+ },
4593
+ "options": {
4594
+ "type": "array",
4595
+ "items": {
4596
+ "type": "object",
4597
+ "required": [
4598
+ "value"
4599
+ ],
4600
+ "properties": {
4601
+ "value": {
4602
+ "anyOf": [
4603
+ {
4604
+ "type": "string"
4605
+ },
4606
+ {
4607
+ "type": "number"
4608
+ },
4609
+ {
4610
+ "type": "boolean"
4611
+ }
4612
+ ]
4613
+ },
4614
+ "description": {
4615
+ "type": "string"
4616
+ },
4617
+ "priceModifier": false,
4618
+ "currency": false
4619
+ },
4620
+ "additionalProperties": true
4621
+ }
4622
+ },
4623
+ "affectsPrice": {
4624
+ "type": "boolean",
4625
+ "default": true
4626
+ },
4627
+ "inputType": {
4628
+ "type": "string",
4629
+ "enum": [
4630
+ "select",
4631
+ "text"
4632
+ ],
4633
+ "default": "select"
4634
+ },
4635
+ "maxLength": {
4636
+ "type": "integer",
4637
+ "minimum": 1
4638
+ },
4639
+ "system": {
4640
+ "type": "string"
4641
+ },
4642
+ "note": {
4643
+ "type": "string"
4644
+ }
4645
+ },
4646
+ "additionalProperties": false
4647
+ },
4648
+ "configurationSelection": {
4649
+ "type": "object",
4650
+ "additionalProperties": {
4651
+ "anyOf": [
4652
+ {
4653
+ "type": "string"
4654
+ },
4655
+ {
4656
+ "type": "number"
4657
+ },
4658
+ {
4659
+ "type": "boolean"
4660
+ }
4661
+ ]
4662
+ }
4663
+ },
4664
+ "configuratorPricing": {
4665
+ "type": "object",
4666
+ "required": [
4667
+ "@type",
4668
+ "configurator",
4669
+ "baseConfiguration",
4670
+ "basePrice",
4671
+ "modifiers"
4672
+ ],
4673
+ "properties": {
4674
+ "@type": {
4675
+ "const": "pagefront:ConfiguratorPricing"
4676
+ },
4677
+ "configurator": {
4678
+ "type": "object",
4679
+ "required": [
4680
+ "@id"
4681
+ ],
4682
+ "properties": {
4683
+ "@type": {
4684
+ "const": "pagefront:Configurator"
4685
+ },
4686
+ "@id": {
4687
+ "type": "string",
4688
+ "minLength": 1
4689
+ }
4690
+ },
4691
+ "additionalProperties": false
4692
+ },
4693
+ "baseConfiguration": {
4694
+ "$ref": "#/$defs/configurationSelection"
4695
+ },
4696
+ "basePrice": {
4697
+ "$ref": "#/$defs/nonNegativeAmount"
4698
+ },
4699
+ "modifiers": {
4700
+ "type": "object",
4701
+ "additionalProperties": {
4702
+ "type": "object",
4703
+ "additionalProperties": {
4704
+ "$ref": "#/$defs/amount"
4705
+ }
4706
+ }
4707
+ },
4708
+ "adjustments": {
4709
+ "type": "array",
4710
+ "items": {
4711
+ "type": "object",
4712
+ "required": [
4713
+ "when",
4714
+ "priceModifier"
4715
+ ],
4716
+ "properties": {
4717
+ "when": {
4718
+ "$ref": "#/$defs/configurationSelection",
4719
+ "type": "object",
4720
+ "minProperties": 1
4721
+ },
4722
+ "priceModifier": {
4723
+ "$ref": "#/$defs/amount"
4724
+ }
4725
+ },
4726
+ "additionalProperties": false
4727
+ }
4728
+ },
4729
+ "pricing": {
4730
+ "type": "string",
4731
+ "enum": [
4732
+ "complete",
4733
+ "partial"
4734
+ ],
4735
+ "default": "complete"
4736
+ }
4737
+ },
4738
+ "additionalProperties": false
4739
+ },
4740
+ "madeToOrderTerms": {
4741
+ "type": "object",
4742
+ "required": [
4743
+ "@type"
4744
+ ],
4745
+ "properties": {
4746
+ "@type": {
4747
+ "const": "pagefront:MadeToOrderTerms"
4748
+ },
4749
+ "productionLeadTime": {
4750
+ "$ref": "#/$defs/duration"
4751
+ },
4752
+ "cancellationPolicy": {
4753
+ "type": "string"
4754
+ },
4755
+ "returnsExceptions": {
4756
+ "type": "array",
4757
+ "items": {
4758
+ "type": "string"
4759
+ }
4760
+ },
4761
+ "aftermarketServices": {
4762
+ "type": "array",
4763
+ "items": {
4764
+ "$ref": "#/$defs/aftermarketService"
4765
+ }
4766
+ }
4767
+ },
4768
+ "additionalProperties": false
4769
+ },
4770
+ "duration": {
4771
+ "type": "object",
4772
+ "required": [
4773
+ "@type"
4774
+ ],
4775
+ "properties": {
4776
+ "@type": {
4777
+ "const": "pagefront:Duration"
4778
+ },
4779
+ "minDays": {
4780
+ "type": "integer",
4781
+ "minimum": 0
4782
+ },
4783
+ "maxDays": {
4784
+ "type": "integer",
4785
+ "minimum": 0
4786
+ },
4787
+ "description": {
4788
+ "type": "string"
4789
+ }
4790
+ },
4791
+ "additionalProperties": false
4792
+ },
4793
+ "deliveryEstimate": {
4794
+ "type": "object",
4795
+ "required": [
4796
+ "@type"
4797
+ ],
4798
+ "properties": {
4799
+ "@type": {
4800
+ "const": "pagefront:DeliveryEstimate"
4801
+ },
4802
+ "earliest": {
4803
+ "type": "string",
4804
+ "format": "date"
4805
+ },
4806
+ "latest": {
4807
+ "type": "string",
4808
+ "format": "date"
4809
+ },
4810
+ "description": {
4811
+ "type": "string"
4812
+ }
4813
+ },
4814
+ "additionalProperties": false
4815
+ },
4816
+ "aftermarketService": {
4817
+ "type": "object",
4818
+ "required": [
4819
+ "@type",
4820
+ "service"
4821
+ ],
4822
+ "properties": {
4823
+ "@type": {
4824
+ "const": "pagefront:AftermarketService"
4825
+ },
4826
+ "service": {
4827
+ "type": "string"
4828
+ },
4829
+ "limit": {
4830
+ "type": "string"
4831
+ },
4832
+ "description": {
4833
+ "type": "string"
4834
+ }
4835
+ },
4836
+ "additionalProperties": false
4837
+ },
4838
+ "promotion": {
4839
+ "type": "object",
4840
+ "required": [
4841
+ "@type",
4842
+ "scope"
4843
+ ],
4844
+ "properties": {
4845
+ "@type": {
4846
+ "const": "pagefront:Promotion"
4847
+ },
4848
+ "code": {
4849
+ "type": "string"
4850
+ },
4851
+ "discountPercentage": {
4852
+ "type": "number",
4853
+ "minimum": 0,
4854
+ "maximum": 100
4855
+ },
4856
+ "discountAmount": {
4857
+ "$ref": "#/$defs/nonNegativeAmount"
4858
+ },
4859
+ "discountCurrency": {
4860
+ "type": "string",
4861
+ "pattern": "^[A-Z]{3}$"
4862
+ },
4863
+ "scope": {
4864
+ "type": "string",
4865
+ "enum": [
4866
+ "product",
4867
+ "category",
4868
+ "site_wide"
4869
+ ]
4870
+ },
4871
+ "occasion": {
4872
+ "type": "string"
4873
+ },
4874
+ "validUntil": {
4875
+ "type": "string",
4876
+ "format": "date-time"
4877
+ }
4878
+ },
4879
+ "additionalProperties": false
4880
+ }
4881
+ }
4882
+ }
4883
+ };