@doswiftly/storefront-operations 7.0.0 → 7.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/fragments.graphql CHANGED
@@ -4,9 +4,10 @@
4
4
  # ============================================
5
5
 
6
6
  # ============================================
7
- # Common Fragments
7
+ # Common
8
8
  # ============================================
9
9
 
10
+ # Standard Relay Connection page metadata. Spread on every paginated query's `pageInfo`.
10
11
  fragment PageInfo on PageInfo {
11
12
  hasNextPage
12
13
  hasPreviousPage
@@ -14,19 +15,21 @@ fragment PageInfo on PageInfo {
14
15
  endCursor
15
16
  }
16
17
 
18
+ # Generic mutation error envelope — included in every mutation's `userErrors[]` field. Always check before consuming the happy-path payload.
17
19
  fragment UserError on UserError {
18
20
  message
19
21
  code
20
22
  field
21
23
  }
22
24
 
25
+ # Non-blocking cart warning (e.g. low stock, partial availability). Cart mutations succeed but surface these for UI hints.
23
26
  fragment CartWarning on CartWarning {
24
27
  message
25
28
  code
26
29
  target
27
30
  }
28
31
 
29
- # Base Image — no transform (for logos, favicons, branding assets that are already small)
32
+ # Base imageoriginal size, no transform. Use for logos, favicons, branding assets that are already sized correctly. ~few KB.
30
33
  fragment Image on Image {
31
34
  id
32
35
  url
@@ -35,8 +38,7 @@ fragment Image on Image {
35
38
  height
36
39
  }
37
40
 
38
- # Thumbnail — cart items, variant swatches, author avatars (rendered at ~96px, 300px covers 3x DPI)
39
- # No preferredContentType — imgproxy auto-negotiates AVIF/WEBP from Accept header
41
+ # Thumbnail — cart line items, variant swatches, author avatars (rendered ~96px on screen, transform delivers up to 300px for 3x DPI). Includes `thumbhash` for blurred placeholder. Format auto-negotiated from the `Accept` header.
40
42
  fragment ImageThumbnail on Image {
41
43
  id
42
44
  url(transform: { maxWidth: 300 })
@@ -46,7 +48,7 @@ fragment ImageThumbnail on Image {
46
48
  thumbhash
47
49
  }
48
50
 
49
- # Card — product cards, collection/category cards, blog posts (rendered at ~400px, 800px covers 2x DPI)
51
+ # Card — product cards, collection / category tiles, blog post previews (rendered ~400px, transform delivers up to 800px for 2x DPI). Includes `thumbhash` placeholder.
50
52
  fragment ImageCard on Image {
51
53
  id
52
54
  url(transform: { maxWidth: 800 })
@@ -56,7 +58,7 @@ fragment ImageCard on Image {
56
58
  thumbhash
57
59
  }
58
60
 
59
- # Full — product detail gallery, hero images (rendered at ~800px, 1600px covers 2x DPI)
61
+ # Full — product detail gallery, hero banners (rendered ~800px, transform delivers up to 1600px for 2x DPI). Includes `thumbhash` placeholder.
60
62
  fragment ImageFull on Image {
61
63
  id
62
64
  url(transform: { maxWidth: 1600 })
@@ -66,19 +68,19 @@ fragment ImageFull on Image {
66
68
  thumbhash
67
69
  }
68
70
 
69
- # Simple money (for originalPrice fields and non-converted prices)
71
+ # Plain `{ amount, currencyCode }` price. Use for `compareAtPrice`, totals, and any field where currency conversion transparency is not needed. `amount` is a String.
70
72
  fragment Money on Money {
71
73
  amount
72
74
  currencyCode
73
75
  }
74
76
 
75
- # Lightweight price for listing views (cards, grids, search results)
77
+ # Lightweight price for listing views (cards, grids, search results) — same shape as `Money`. Spread when full conversion metadata is overkill.
76
78
  fragment Price on PriceMoney {
77
79
  amount
78
80
  currencyCode
79
81
  }
80
82
 
81
- # Full price with conversion transparency (for price fields that support currency conversion)
83
+ # Full price with currency-conversion transparency adds `baseAmount`, `baseCurrencyCode`, `exchangeRate`, `marginApplied`, `rateTimestamp`, `isConverted`. Spread on PDP / cart / checkout where the customer needs to see the original price + applied conversion.
82
84
  fragment PriceMoney on PriceMoney {
83
85
  ...Price
84
86
  baseAmount
@@ -89,15 +91,17 @@ fragment PriceMoney on PriceMoney {
89
91
  isConverted
90
92
  }
91
93
 
94
+ # Selected variant option (e.g. `{ name: "Color", value: "Red" }`) on a `ProductVariant`. Use to render variant labels in cart / order summaries.
92
95
  fragment SelectedOption on SelectedOption {
93
96
  name
94
97
  value
95
98
  }
96
99
 
97
100
  # ============================================
98
- # Product Fragments
101
+ # Products
99
102
  # ============================================
100
103
 
104
+ # Single variant of a product — price, compare-at, stock flags, sort, image, selected options. Spread on cart line items, PDP variant selectors, search result rows that need price.
101
105
  fragment ProductVariant on ProductVariant {
102
106
  id
103
107
  title
@@ -124,8 +128,7 @@ fragment ProductVariant on ProductVariant {
124
128
  sortOrder
125
129
  }
126
130
 
127
- # Minimal product data for listing views (cards, grids, search results).
128
- # Matches template-local ProductCardFields for consistent typing.
131
+ # Minimal product shape for listing views (collection grids, search results, "you may also like"). Includes price range, featured image (card size), rating + review count, vendor, tags. Use for any list of products where you don't need variants/description.
129
132
  fragment ProductCard on Product {
130
133
  id
131
134
  handle
@@ -157,7 +160,7 @@ fragment ProductCard on Product {
157
160
  }
158
161
  }
159
162
 
160
- # Full product data for detail views and pages that need all fields.
163
+ # `ProductCard` plus textual content (description, descriptionHtml), stock total, type, visibility flags, and timestamps. Use when you need full product copy but not the heavy variants/images lists. Sweet spot for blog post embeds, related-product cards with description.
161
164
  fragment ProductBase on Product {
162
165
  ...ProductCard
163
166
  description
@@ -165,13 +168,13 @@ fragment ProductBase on Product {
165
168
  stockTotal
166
169
  type
167
170
  requiresRecipientInfo
168
- # Faza 1.5 (Decision D-A v3 + D-B)
169
171
  visibility
170
172
  attributeSetId
171
173
  createdAt
172
174
  updatedAt
173
175
  }
174
176
 
177
+ # Full product shape for the PDP — `ProductBase` plus the full image gallery (up to 20, full-size) and all variants (up to 100) with their pricing/stock. Spread on the product detail page.
175
178
  fragment ProductFull on Product {
176
179
  ...ProductBase
177
180
  images(first: 20) {
@@ -211,9 +214,10 @@ fragment ProductFull on Product {
211
214
  }
212
215
 
213
216
  # ============================================
214
- # Collection Fragments
217
+ # Collections
215
218
  # ============================================
216
219
 
220
+ # Collection (manual or rule-based product grouping) — title, description, hero image, SEO. Spread on collection landing pages and collection cards. Does NOT include products — query `collection(id, handle).products` separately for those.
217
221
  fragment Collection on Collection {
218
222
  id
219
223
  handle
@@ -232,9 +236,10 @@ fragment Collection on Collection {
232
236
  }
233
237
 
234
238
  # ============================================
235
- # Category Fragments
239
+ # Categories
236
240
  # ============================================
237
241
 
242
+ # Category node in the shop's taxonomy — name, slug, hero image, depth `level`, materialized `path`, product count, sort order. Spread on category cards and breadcrumb segments. Does NOT include parent / children — query those fields separately and let the server batch them.
238
243
  fragment Category on Category {
239
244
  id
240
245
  name
@@ -250,9 +255,10 @@ fragment Category on Category {
250
255
  }
251
256
 
252
257
  # ============================================
253
- # Customer Fragments
258
+ # Customer
254
259
  # ============================================
255
260
 
261
+ # Customer mailing address — full street/city/state/country/postal code with names and phone. `isDefault` flips when this address is the default for shipping. Spread on the address book UI and order summaries.
256
262
  fragment MailingAddress on MailingAddress {
257
263
  id
258
264
  streetLine1
@@ -270,11 +276,13 @@ fragment MailingAddress on MailingAddress {
270
276
  isDefault
271
277
  }
272
278
 
279
+ # Customer access token returned by `customerLogin` / `customerSignup` / `customerActivate` / `customerResetPassword` / `customerRefreshToken`. The token's JWT TTL is 24h; cookie max-age is 30d.
273
280
  fragment CustomerAccessToken on CustomerAccessToken {
274
281
  accessToken
275
282
  expiresAt
276
283
  }
277
284
 
285
+ # Customer profile — basic info plus B2B fields (`taxId`, `vatNumber`, `regon`, `companyName`), default address, lifetime stats (`orderCount`, `totalSpent`), marketing preferences. Use on profile / settings pages.
278
286
  fragment Customer on Customer {
279
287
  id
280
288
  email
@@ -301,6 +309,7 @@ fragment Customer on Customer {
301
309
  updatedAt
302
310
  }
303
311
 
312
+ # Order summary — number, totals (cost / tax / shipping), payment + fulfillment status, shipping address, item count, lifecycle timestamps. Spread on the order list and order detail pages. Line items are not included here.
304
313
  fragment Order on Order {
305
314
  id
306
315
  orderNumber
@@ -332,9 +341,10 @@ fragment Order on Order {
332
341
  }
333
342
 
334
343
  # ============================================
335
- # Cart Fragments
344
+ # Cart
336
345
  # ============================================
337
346
 
347
+ # Cart-level totals — subtotal, total, tax, duty, checkout charge. Spread inside the `Cart` fragment.
338
348
  fragment CartCost on CartCost {
339
349
  total {
340
350
  ...Money
@@ -353,6 +363,7 @@ fragment CartCost on CartCost {
353
363
  }
354
364
  }
355
365
 
366
+ # Per-line cost breakdown — unit price, line subtotal/total, compare-at unit price (for showing strikethroughs). Spread inside `CartLine`.
356
367
  fragment CartLineCost on CartLineCost {
357
368
  pricePerUnit {
358
369
  ...Money
@@ -368,8 +379,7 @@ fragment CartLineCost on CartLineCost {
368
379
  }
369
380
  }
370
381
 
371
- # Typed customer-filled attribute snapshot (Faza 1 R5 + Decision D-A v3 + D-I).
372
- # Distinct from CartLine.attributes (raw KV line item properties).
382
+ # Typed snapshot of a customer-filled product attribute (configurator selection) on a cart line. Includes the chosen option / text value, fillingMode, billingMode, surcharge, tax class, and any linked variant. Distinct from `CartLine.attributes` which holds raw key-value line item properties (free-form, untyped).
373
383
  fragment AttributeSelection on AttributeSelection {
374
384
  attributeDefinitionId
375
385
  attributeName
@@ -386,6 +396,7 @@ fragment AttributeSelection on AttributeSelection {
386
396
  linkedVariantId
387
397
  }
388
398
 
399
+ # A single line in the cart — variant + quantity + per-line cost, plus dual attribute storage: `attributes[]` for free-form key-value properties (gift wrap, engraving notes), `attributeSelections[]` for typed configurator answers.
389
400
  fragment CartLine on CartLine {
390
401
  id
391
402
  quantity
@@ -408,17 +419,20 @@ fragment CartLine on CartLine {
408
419
  productType
409
420
  }
410
421
 
422
+ # Buyer identity associated with the cart. Note: only `customerId` is currently persisted server-side; `email`, `phone`, `countryCode` are accepted in the input but ignored.
411
423
  fragment CartBuyerIdentity on CartBuyerIdentity {
412
424
  email
413
425
  phone
414
426
  countryCode
415
427
  }
416
428
 
429
+ # Discount code applied to the cart with its `isApplicable` flag — false means the code was kept on the cart but does not currently qualify (e.g. minimum spend not reached).
417
430
  fragment CartDiscountCode on CartDiscountCode {
418
431
  code
419
432
  isApplicable
420
433
  }
421
434
 
435
+ # Allocation of a discount code to the cart total — pairs the code with the actual money discounted. Use to show "saved X with code Y" in cart UI.
422
436
  fragment CartDiscountAllocation on CartDiscountAllocation {
423
437
  discountCode
424
438
  amount {
@@ -426,6 +440,7 @@ fragment CartDiscountAllocation on CartDiscountAllocation {
426
440
  }
427
441
  }
428
442
 
443
+ # Full cart shape — totals, line items (paginated up to 100), buyer identity, applied discount codes + allocations, note, custom attributes. Spread on the cart drawer / cart page; refetch after every cart mutation.
429
444
  fragment Cart on Cart {
430
445
  id
431
446
  checkoutUrl
@@ -471,9 +486,10 @@ fragment Cart on Cart {
471
486
  }
472
487
 
473
488
  # ============================================
474
- # Shop Fragments
489
+ # Shop
475
490
  # ============================================
476
491
 
492
+ # Shop branding colors — primary, secondary, accent, background, text. Use to theme the storefront from server-side config.
477
493
  fragment ShopColors on ShopColors {
478
494
  primary
479
495
  secondary
@@ -482,11 +498,13 @@ fragment ShopColors on ShopColors {
482
498
  text
483
499
  }
484
500
 
501
+ # Shop branding fonts — body (`primary`) and `heading` font families.
485
502
  fragment ShopFonts on ShopFonts {
486
503
  primary
487
504
  heading
488
505
  }
489
506
 
507
+ # Social media links configured for the shop. Spread on the footer.
490
508
  fragment SocialLinks on SocialLinks {
491
509
  facebook
492
510
  instagram
@@ -497,6 +515,7 @@ fragment SocialLinks on SocialLinks {
497
515
  pinterest
498
516
  }
499
517
 
518
+ # Shop's physical / business address. Use on the contact page and footer.
500
519
  fragment ShopAddress on ShopAddress {
501
520
  streetLine1
502
521
  streetLine2
@@ -506,6 +525,7 @@ fragment ShopAddress on ShopAddress {
506
525
  country
507
526
  }
508
527
 
528
+ # One day's business hours window. Spread inside `Shop.businessHours[]`.
509
529
  fragment BusinessHour on BusinessHour {
510
530
  day
511
531
  openTime
@@ -513,6 +533,7 @@ fragment BusinessHour on BusinessHour {
513
533
  isClosed
514
534
  }
515
535
 
536
+ # Full shop branding bundle — logo + favicon + colors + fonts + social links. Spread inside the `Shop` fragment.
516
537
  fragment ShopBranding on ShopBranding {
517
538
  logo {
518
539
  ...Image
@@ -531,12 +552,14 @@ fragment ShopBranding on ShopBranding {
531
552
  }
532
553
  }
533
554
 
555
+ # Bot-protection provider config (provider name, site key, script URL) for storefront-side challenge widgets.
534
556
  fragment BotProtectionProvider on BotProtectionProviderInfo {
535
557
  provider
536
558
  siteKey
537
559
  scriptUrl
538
560
  }
539
561
 
562
+ # Bot-protection setup for the shop — primary + fallback provider, and the list of `protectedOperations` (mutation names that require a challenge token). Spread inside `Shop`.
540
563
  fragment BotProtection on BotProtectionInfo {
541
564
  primary {
542
565
  ...BotProtectionProvider
@@ -547,6 +570,7 @@ fragment BotProtection on BotProtectionInfo {
547
570
  protectedOperations
548
571
  }
549
572
 
573
+ # The shop itself — name, primary domain, currencies + locales, branding, contact info, business hours, bot-protection config. Spread on the root `shop` query; cache for the session.
550
574
  fragment Shop on Shop {
551
575
  id
552
576
  name
@@ -581,9 +605,10 @@ fragment Shop on Shop {
581
605
  }
582
606
 
583
607
  # ============================================
584
- # Payment Method Fragments (R23 - Payment Methods)
608
+ # Payment Methods
585
609
  # ============================================
586
610
 
611
+ # Single payment method enabled for the shop — type (CARD / BANK_TRANSFER / BLIK / PAYPAL / APPLE_PAY / GOOGLE_PAY / CASH_ON_DELIVERY / OTHER), provider, icon, supported currencies, default flag, sort position. Spread on the checkout payment step.
587
612
  fragment PaymentMethod on PaymentMethod {
588
613
  id
589
614
  name
@@ -596,6 +621,7 @@ fragment PaymentMethod on PaymentMethod {
596
621
  position
597
622
  }
598
623
 
624
+ # Active payment methods list with the merchant's `defaultMethod`. Returned by the `availablePaymentMethods` query.
599
625
  fragment AvailablePaymentMethods on AvailablePaymentMethods {
600
626
  methods {
601
627
  ...PaymentMethod
@@ -606,9 +632,10 @@ fragment AvailablePaymentMethods on AvailablePaymentMethods {
606
632
  }
607
633
 
608
634
  # ============================================
609
- # Checkout Fragments
635
+ # Checkout
610
636
  # ============================================
611
637
 
638
+ # Single shipping rate option — `handle` is the stable id you pass to `checkoutShippingLineUpdate`, plus title and price.
612
639
  fragment ShippingRate on ShippingRate {
613
640
  handle
614
641
  title
@@ -617,6 +644,7 @@ fragment ShippingRate on ShippingRate {
617
644
  }
618
645
  }
619
646
 
647
+ # One tax line on the checkout — title, rate (decimal, e.g. 0.23 for 23%), computed amount. Spread on the order summary.
620
648
  fragment TaxLine on TaxLine {
621
649
  title
622
650
  rate
@@ -625,6 +653,7 @@ fragment TaxLine on TaxLine {
625
653
  }
626
654
  }
627
655
 
656
+ # Item affected by a discount — the discounted product/variant with original + discounted prices and savings. Used on Buy-X-Get-Y promotions to highlight which items the discount applies to.
628
657
  fragment DiscountAffectedItem on DiscountAffectedItem {
629
658
  productId
630
659
  variantId
@@ -642,6 +671,7 @@ fragment DiscountAffectedItem on DiscountAffectedItem {
642
671
  isFreeItem
643
672
  }
644
673
 
674
+ # A discount currently applied to the checkout — code, type, value, plus BXGY (Buy X Get Y) metadata when applicable (`buyQuantity`, `getQuantity`, `getDiscountPercent`, `affectedItems`). Use to render a "Discounts applied" panel.
645
675
  fragment DiscountApplication on DiscountApplication {
646
676
  code
647
677
  isApplicable
@@ -650,7 +680,6 @@ fragment DiscountApplication on DiscountApplication {
650
680
  ...Money
651
681
  }
652
682
  title
653
- # BXGY (Buy X Get Y) specific fields
654
683
  affectedItems {
655
684
  ...DiscountAffectedItem
656
685
  }
@@ -659,11 +688,13 @@ fragment DiscountApplication on DiscountApplication {
659
688
  getDiscountPercent
660
689
  }
661
690
 
691
+ # Lightweight discount code entry on the checkout — code + applicability flag.
662
692
  fragment DiscountCode on DiscountCode {
663
693
  code
664
694
  isApplicable
665
695
  }
666
696
 
697
+ # Single line item in the checkout — variant snapshot, quantity, unit + total prices, image. Use on the order summary panel.
667
698
  fragment CheckoutLineItem on CheckoutLineItem {
668
699
  id
669
700
  title
@@ -683,7 +714,7 @@ fragment CheckoutLineItem on CheckoutLineItem {
683
714
  }
684
715
  }
685
716
 
686
- # GAP-001: Gift Card Checkout Integration
717
+ # Gift card applied to the checkout — `maskedCode` (first + last 4 chars), `lastCharacters` (for display matching), the amount applied to this checkout, and remaining balance after this order would complete.
687
718
  fragment AppliedGiftCard on AppliedGiftCard {
688
719
  maskedCode
689
720
  lastCharacters
@@ -695,6 +726,7 @@ fragment AppliedGiftCard on AppliedGiftCard {
695
726
  }
696
727
  }
697
728
 
729
+ # Full checkout shape — line items, shipping + billing addresses, selected + available shipping rates, available payment methods, applied discounts + gift cards, tax lines, totals (`cost`, `paymentDue`, `totalGiftCardAmount`). Spread on the checkout flow; refetch after every checkout mutation. `isReady` flips to true when the checkout has all required fields to call `checkoutComplete`.
698
730
  fragment Checkout on Checkout {
699
731
  id
700
732
  isReady
@@ -741,7 +773,6 @@ fragment Checkout on Checkout {
741
773
  taxLines {
742
774
  ...TaxLine
743
775
  }
744
- # GAP-001: Gift Card Checkout Integration
745
776
  appliedGiftCards {
746
777
  ...AppliedGiftCard
747
778
  }
@@ -758,9 +789,10 @@ fragment Checkout on Checkout {
758
789
  }
759
790
 
760
791
  # ============================================
761
- # Shipment Fragments (R29 - Shipment Tracking)
792
+ # Shipments / Tracking
762
793
  # ============================================
763
794
 
795
+ # One tracking event in the shipment timeline — status, description, location, timestamp. Spread on the tracking page timeline.
764
796
  fragment ShipmentEvent on ShipmentEvent {
765
797
  id
766
798
  status
@@ -770,6 +802,7 @@ fragment ShipmentEvent on ShipmentEvent {
770
802
  providerEventCode
771
803
  }
772
804
 
805
+ # Physical package metadata (weight + dimensions). Used in the merchant's label generation; storefronts rarely render this directly.
773
806
  fragment ShipmentPackage on ShipmentPackage {
774
807
  weight
775
808
  length
@@ -777,6 +810,7 @@ fragment ShipmentPackage on ShipmentPackage {
777
810
  height
778
811
  }
779
812
 
813
+ # One item in a shipment — title, variant, sku, quantity, image URL. Spread inside `Shipment.items[]` for the tracking page item list.
780
814
  fragment ShipmentItem on ShipmentItem {
781
815
  id
782
816
  title
@@ -786,6 +820,7 @@ fragment ShipmentItem on ShipmentItem {
786
820
  imageUrl
787
821
  }
788
822
 
823
+ # Full shipment shape — provider, tracking number + URL, label URL, status, ETA, recipient address, packages, items, full event timeline. Spread on the tracking page.
789
824
  fragment Shipment on Shipment {
790
825
  id
791
826
  orderId
@@ -814,6 +849,7 @@ fragment Shipment on Shipment {
814
849
  updatedAt
815
850
  }
816
851
 
852
+ # Lightweight shipment shape — id, tracking number + URL, status, dates. No items / events / address. Use for order summary cards or on the public `shipmentByTrackingNumber` query.
817
853
  fragment ShipmentBasic on Shipment {
818
854
  id
819
855
  orderId
@@ -828,9 +864,10 @@ fragment ShipmentBasic on Shipment {
828
864
  }
829
865
 
830
866
  # ============================================
831
- # Return Fragments (R30 - Returns/RMA)
867
+ # Returns / RMA
832
868
  # ============================================
833
869
 
870
+ # Return shipping label generated by the carrier — URL to download, carrier name, tracking number, expiry. Spread on the return detail page.
834
871
  fragment ReturnShippingLabel on ReturnShippingLabel {
835
872
  url
836
873
  carrier
@@ -838,6 +875,7 @@ fragment ReturnShippingLabel on ReturnShippingLabel {
838
875
  expiresAt
839
876
  }
840
877
 
878
+ # Photo evidence attached to a return item (e.g. damage photo). Spread inside `ReturnItem.photos[]`.
841
879
  fragment ReturnItemPhoto on ReturnItemPhoto {
842
880
  id
843
881
  url
@@ -846,6 +884,7 @@ fragment ReturnItemPhoto on ReturnItemPhoto {
846
884
  createdAt
847
885
  }
848
886
 
887
+ # Single line in a return request — variant identity, quantity requested, reason, condition, photos, status, approved quantity (set by merchant after review). Spread inside `Return.items[]`.
849
888
  fragment ReturnItem on ReturnItem {
850
889
  id
851
890
  variantId
@@ -866,6 +905,7 @@ fragment ReturnItem on ReturnItem {
866
905
  approvedQuantity
867
906
  }
868
907
 
908
+ # Full return shape — number, parent order, status, reason, customer note, compensation type (`REFUND` / `STORE_CREDIT`), items, refund amount, shipping label, lifecycle timestamps. Spread on the return detail page.
869
909
  fragment Return on Return {
870
910
  id
871
911
  returnNumber
@@ -893,6 +933,7 @@ fragment Return on Return {
893
933
  updatedAt
894
934
  }
895
935
 
936
+ # Single option in the return reasons dropdown — `value` enum, human-readable `label`, optional `description`. Returned by `returnReasons` query.
896
937
  fragment ReturnReasonOption on ReturnReasonOption {
897
938
  value
898
939
  label
@@ -900,9 +941,10 @@ fragment ReturnReasonOption on ReturnReasonOption {
900
941
  }
901
942
 
902
943
  # ============================================
903
- # Gift Card Fragments (R32 - Gift Cards)
944
+ # Gift Cards
904
945
  # ============================================
905
946
 
947
+ # Gift card detail — masked code (first + last 4 chars), status, initial + remaining balance, expiry, recipient/message. Returned by `giftCard($code)` query.
906
948
  fragment GiftCard on GiftCard {
907
949
  id
908
950
  maskedCode
@@ -919,11 +961,13 @@ fragment GiftCard on GiftCard {
919
961
  createdAt
920
962
  }
921
963
 
964
+ # Validation error on a gift card check — code (`NOT_FOUND` / `DISABLED` / `ALREADY_USED` / `EXPIRED` / `INSUFFICIENT_BALANCE`) + human message.
922
965
  fragment GiftCardError on GiftCardError {
923
966
  code
924
967
  message
925
968
  }
926
969
 
970
+ # Result of `giftCardValidate($code, $amount)` — `isValid` flag, available balance, optional `error` (when invalid), and the matched gift card (when found). Use to inline-validate gift card inputs before applying.
927
971
  fragment GiftCardValidation on GiftCardValidation {
928
972
  isValid
929
973
  availableBalance {
@@ -938,9 +982,10 @@ fragment GiftCardValidation on GiftCardValidation {
938
982
  }
939
983
 
940
984
  # ============================================
941
- # Shipping Method Fragments (R33 - Shipping Methods)
985
+ # Shipping Methods
942
986
  # ============================================
943
987
 
988
+ # Carrier offering the shipping method — id, display name, logo URL, internal service code.
944
989
  fragment ShippingCarrier on ShippingCarrier {
945
990
  id
946
991
  name
@@ -948,12 +993,14 @@ fragment ShippingCarrier on ShippingCarrier {
948
993
  serviceCode
949
994
  }
950
995
 
996
+ # Estimated delivery window — `minDays` to `maxDays` plus a human-readable description (e.g. "2-4 business days").
951
997
  fragment DeliveryEstimate on DeliveryEstimate {
952
998
  minDays
953
999
  maxDays
954
1000
  description
955
1001
  }
956
1002
 
1003
+ # Free-shipping progress info — `qualifies` flag, current cart amount, threshold, remaining to qualify, percent progress, and a localized message ("Add 20 PLN more for free shipping"). Use to render a free-shipping progress bar in the cart drawer.
957
1004
  fragment FreeShippingProgress on FreeShippingProgress {
958
1005
  qualifies
959
1006
  currentAmount {
@@ -969,6 +1016,7 @@ fragment FreeShippingProgress on FreeShippingProgress {
969
1016
  message
970
1017
  }
971
1018
 
1019
+ # One shipping method offered for the destination + cart — id, name, carrier, price, free-shipping progress, estimated delivery, sort order. Spread on the checkout shipping step.
972
1020
  fragment AvailableShippingMethod on AvailableShippingMethod {
973
1021
  id
974
1022
  name
@@ -990,20 +1038,23 @@ fragment AvailableShippingMethod on AvailableShippingMethod {
990
1038
  }
991
1039
 
992
1040
  # ============================================
993
- # Attribute Filter Fragments (R35 - Dynamic Attributes)
1041
+ # Attribute Filters
994
1042
  # ============================================
995
1043
 
1044
+ # Visual swatch for an attribute filter value — color hex (for color filters) or image URL (for pattern/material swatches).
996
1045
  fragment AttributeSwatch on AttributeSwatch {
997
1046
  colorHex
998
1047
  imageUrl
999
1048
  }
1000
1049
 
1050
+ # Numeric range bounds for slider-style filters — min, max, currency code (when relevant).
1001
1051
  fragment AttributeRangeBounds on AttributeRangeBounds {
1002
1052
  min
1003
1053
  max
1004
1054
  currencyCode
1005
1055
  }
1006
1056
 
1057
+ # One discrete value in a filterable attribute (e.g. "Red" for the Color filter). Includes `productCount` in the current listing context (for "(12)" badges next to filter values), optional swatch and price modifier.
1007
1058
  fragment AttributeFilterValue on AttributeFilterValue {
1008
1059
  id
1009
1060
  value
@@ -1018,6 +1069,7 @@ fragment AttributeFilterValue on AttributeFilterValue {
1018
1069
  sortOrder
1019
1070
  }
1020
1071
 
1072
+ # Filterable attribute exposed on the storefront — name, type (SELECT / CHECKBOX / SLIDER / etc.), filterability flags, display order, and either discrete `filterValues[]` or numeric `rangeBounds`. Spread inside `availableFilters.attributes[]`.
1021
1073
  fragment AttributeDefinition on AttributeDefinition {
1022
1074
  id
1023
1075
  name
@@ -1034,6 +1086,7 @@ fragment AttributeDefinition on AttributeDefinition {
1034
1086
  }
1035
1087
  }
1036
1088
 
1089
+ # Min / max price range across products in the current listing context. Use to bound the price slider.
1037
1090
  fragment PriceRangeFilter on PriceRange {
1038
1091
  min {
1039
1092
  ...Money
@@ -1043,6 +1096,7 @@ fragment PriceRangeFilter on PriceRange {
1043
1096
  }
1044
1097
  }
1045
1098
 
1099
+ # One category option in the categories filter — id, name, slug, count of products in this category within the current listing context, level + parentId for tree rendering.
1046
1100
  fragment CategoryFilterOption on CategoryFilterOption {
1047
1101
  id
1048
1102
  name
@@ -1052,6 +1106,7 @@ fragment CategoryFilterOption on CategoryFilterOption {
1052
1106
  parentId
1053
1107
  }
1054
1108
 
1109
+ # Full result of the `availableFilters($input)` query — attribute filters, price range, category filters, count of currently active filters, total products matching the context. Spread on listing pages to render filter sidebars.
1055
1110
  fragment AvailableFilters on AvailableFilters {
1056
1111
  attributes {
1057
1112
  ...AttributeDefinition
@@ -1067,9 +1122,10 @@ fragment AvailableFilters on AvailableFilters {
1067
1122
  }
1068
1123
 
1069
1124
  # ============================================
1070
- # Loyalty Program Fragments
1125
+ # Loyalty Program
1071
1126
  # ============================================
1072
1127
 
1128
+ # Page metadata for the loyalty transactions connection (separate type from generic `PageInfo` for legacy reasons; identical shape).
1073
1129
  fragment LoyaltyPageInfo on LoyaltyPageInfo {
1074
1130
  hasNextPage
1075
1131
  hasPreviousPage
@@ -1077,6 +1133,7 @@ fragment LoyaltyPageInfo on LoyaltyPageInfo {
1077
1133
  endCursor
1078
1134
  }
1079
1135
 
1136
+ # Loyalty tier definition — name, type enum (`BRONZE` / `SILVER` / `GOLD` / `PLATINUM` / `DIAMOND`), entry threshold (`minPoints` and/or `minAnnualSpend`), points multiplier, custom benefits list. Returned by `loyaltyTiers` and embedded in member tier data.
1080
1137
  fragment LoyaltyTier on LoyaltyTier {
1081
1138
  id
1082
1139
  name
@@ -1093,6 +1150,7 @@ fragment LoyaltyTier on LoyaltyTier {
1093
1150
  }
1094
1151
  }
1095
1152
 
1153
+ # Customer's points breakdown — total earned, currently spendable, pending (not yet vested), redeemed lifetime, expired lifetime, expiring soon, and the next expiry date. Spread inside `LoyaltyMember`.
1096
1154
  fragment LoyaltyPointsSummary on LoyaltyPointsSummary {
1097
1155
  totalPoints
1098
1156
  currentPoints
@@ -1103,6 +1161,7 @@ fragment LoyaltyPointsSummary on LoyaltyPointsSummary {
1103
1161
  nextExpiryDate
1104
1162
  }
1105
1163
 
1164
+ # Customer's progress toward the next tier — current tier, next tier, points + spend remaining, percent progress. Use to render the "X points to GOLD" tracker.
1106
1165
  fragment TierProgress on TierProgress {
1107
1166
  currentTier {
1108
1167
  ...LoyaltyTier
@@ -1117,6 +1176,7 @@ fragment TierProgress on TierProgress {
1117
1176
  }
1118
1177
  }
1119
1178
 
1179
+ # Customer's loyalty membership — points summary, current tier, tier progress, annual spend, last activity. Returned by `loyaltyMember` (null if not enrolled).
1120
1180
  fragment LoyaltyMember on LoyaltyMember {
1121
1181
  id
1122
1182
  customerId
@@ -1136,6 +1196,7 @@ fragment LoyaltyMember on LoyaltyMember {
1136
1196
  enrolledAt
1137
1197
  }
1138
1198
 
1199
+ # One row in the loyalty points history — type (`EARN_PURCHASE` / `EARN_SIGNUP` / `EARN_REFERRAL` / `EARN_REVIEW` / `EARN_BIRTHDAY` / `EARN_BONUS` / `REDEEM` / `EXPIRE` / `ADJUST` / `REFUND_REVERSAL`), points delta, balance after, source order, expiry. Spread on the loyalty dashboard transaction list.
1139
1200
  fragment LoyaltyTransaction on LoyaltyTransaction {
1140
1201
  id
1141
1202
  type
@@ -1147,6 +1208,7 @@ fragment LoyaltyTransaction on LoyaltyTransaction {
1147
1208
  createdAt
1148
1209
  }
1149
1210
 
1211
+ # Reward customers can redeem — name, type, points cost, discount value (% or fixed), tier requirement, availability flag, remaining redemptions. Spread on the rewards page.
1150
1212
  fragment LoyaltyReward on LoyaltyReward {
1151
1213
  id
1152
1214
  name
@@ -1168,6 +1230,7 @@ fragment LoyaltyReward on LoyaltyReward {
1168
1230
  redemptionsRemaining
1169
1231
  }
1170
1232
 
1233
+ # Estimated points for an order — base points, bonus points (tier multiplier applied), total, multiplier used. Returned by `estimatePoints($orderTotal)` for "Earn X points" UI on cart/checkout.
1171
1234
  fragment PointsEstimate on PointsEstimate {
1172
1235
  basePoints
1173
1236
  bonusPoints
@@ -1175,12 +1238,14 @@ fragment PointsEstimate on PointsEstimate {
1175
1238
  multiplier
1176
1239
  }
1177
1240
 
1241
+ # One earn action configured in the loyalty program — type (`PURCHASE` / `SIGNUP` / `REFERRAL` / `REVIEW` / `BIRTHDAY`), enabled flag, points granted.
1178
1242
  fragment LoyaltyAction on LoyaltyAction {
1179
1243
  type
1180
1244
  isEnabled
1181
1245
  points
1182
1246
  }
1183
1247
 
1248
+ # Loyalty program configuration — `isEnabled` (use to gate UI rendering), points name (e.g. "stars"), earn rate, expiry policy, available actions, referral settings. Returned by `loyaltySettings`.
1184
1249
  fragment LoyaltySettings on LoyaltySettings {
1185
1250
  isEnabled
1186
1251
  pointsName
@@ -1194,6 +1259,7 @@ fragment LoyaltySettings on LoyaltySettings {
1194
1259
  referralBonusPoints
1195
1260
  }
1196
1261
 
1262
+ # Customer referral statistics — code, share URL, counts of referred / completed / pending, lifetime points earned. Returned by `referralStats`.
1197
1263
  fragment ReferralStats on ReferralStats {
1198
1264
  referralCode
1199
1265
  shareUrl
@@ -1203,7 +1269,7 @@ fragment ReferralStats on ReferralStats {
1203
1269
  totalPointsEarned
1204
1270
  }
1205
1271
 
1206
- # GAP-003: PRODUCT and GIFT_CARD Reward Types
1272
+ # Result of `redeemLoyaltyReward` depending on the reward type, exactly one of `discountCode`, `productDiscountCode`, `giftCardCode` is populated. Apply the returned code on cart/checkout.
1207
1273
  fragment RedeemRewardPayload on RedeemRewardPayload {
1208
1274
  success
1209
1275
  discountCode
@@ -1212,6 +1278,7 @@ fragment RedeemRewardPayload on RedeemRewardPayload {
1212
1278
  userErrors
1213
1279
  }
1214
1280
 
1281
+ # Result of `generateReferralCode` — the customer's referral code and shareable URL.
1215
1282
  fragment GenerateReferralCodePayload on GenerateReferralCodePayload {
1216
1283
  success
1217
1284
  referralCode
@@ -1220,9 +1287,10 @@ fragment GenerateReferralCodePayload on GenerateReferralCodePayload {
1220
1287
  }
1221
1288
 
1222
1289
  # ============================================
1223
- # Review Fragments
1290
+ # Reviews
1224
1291
  # ============================================
1225
1292
 
1293
+ # Single product review — rating, title, body, optional pros/cons, image attachments, author, verified-purchase flag, helpful/unhelpful counts, optional merchant response. Only `APPROVED` reviews are exposed to the storefront.
1226
1294
  fragment ProductReview on ProductReview {
1227
1295
  id
1228
1296
  productId
@@ -1241,6 +1309,7 @@ fragment ProductReview on ProductReview {
1241
1309
  createdAt
1242
1310
  }
1243
1311
 
1312
+ # Aggregate review stats for a product — average rating, total count, distribution per star (1-5). Returned by `reviewStats($productId)`.
1244
1313
  fragment ReviewStats on ReviewStats {
1245
1314
  averageRating
1246
1315
  totalCount
@@ -1252,9 +1321,10 @@ fragment ReviewStats on ReviewStats {
1252
1321
  }
1253
1322
 
1254
1323
  # ============================================
1255
- # Wishlist Fragments
1324
+ # Wishlists
1256
1325
  # ============================================
1257
1326
 
1327
+ # One item in a wishlist — references the product and (optionally) a specific variant, snapshots the price at the time it was added, plus notification preferences (`notifyOnSale`, `notifyOnRestock`).
1258
1328
  fragment WishlistItem on WishlistItem {
1259
1329
  id
1260
1330
  productId
@@ -1270,6 +1340,7 @@ fragment WishlistItem on WishlistItem {
1270
1340
  addedAt
1271
1341
  }
1272
1342
 
1343
+ # A customer's wishlist — name, public/private flag, share token (when public), items, item count. Spread on the wishlists page.
1273
1344
  fragment Wishlist on Wishlist {
1274
1345
  id
1275
1346
  name
@@ -1284,9 +1355,10 @@ fragment Wishlist on Wishlist {
1284
1355
  }
1285
1356
 
1286
1357
  # ============================================
1287
- # Blog Fragments
1358
+ # Blog
1288
1359
  # ============================================
1289
1360
 
1361
+ # Blog category — name, slug, description, post count. Spread on category navigation and post category labels.
1290
1362
  fragment BlogCategory on BlogCategory {
1291
1363
  id
1292
1364
  name
@@ -1295,6 +1367,7 @@ fragment BlogCategory on BlogCategory {
1295
1367
  postCount
1296
1368
  }
1297
1369
 
1370
+ # Blog tag — name, slug, post count. Spread on tag clouds and post tag labels.
1298
1371
  fragment BlogTag on BlogTag {
1299
1372
  id
1300
1373
  name
@@ -1302,6 +1375,7 @@ fragment BlogTag on BlogTag {
1302
1375
  postCount
1303
1376
  }
1304
1377
 
1378
+ # Full blog post — title, slug, excerpt, content (with `contentFormat` indicating HTML/Markdown), featured image, author, category, tags, publish date, reading time, view + comment counts, SEO metadata. Spread on the post detail page.
1305
1379
  fragment BlogPost on BlogPost {
1306
1380
  id
1307
1381
  title
@@ -1342,9 +1416,10 @@ fragment BlogPost on BlogPost {
1342
1416
  }
1343
1417
 
1344
1418
  # ============================================
1345
- # Recommendation Fragments
1419
+ # Recommendations
1346
1420
  # ============================================
1347
1421
 
1422
+ # One recommended product — the product itself (card-level), recommendation type (e.g. SIMILAR / FREQUENTLY_BOUGHT_TOGETHER), score (0-100), human reason text. Spread on PDP "You may also like" sections.
1348
1423
  fragment ProductRecommendation on ProductRecommendation {
1349
1424
  product {
1350
1425
  ...ProductCard
@@ -1354,6 +1429,7 @@ fragment ProductRecommendation on ProductRecommendation {
1354
1429
  reason
1355
1430
  }
1356
1431
 
1432
+ # Recommendations bundle for the cart drawer — `frequentlyBoughtTogether` (cross-sell) and `youMayAlsoLike` (related). Each entry has the same shape as `ProductRecommendation`.
1357
1433
  fragment CartRecommendation on CartRecommendations {
1358
1434
  frequentlyBoughtTogether {
1359
1435
  product {
@@ -1374,14 +1450,15 @@ fragment CartRecommendation on CartRecommendations {
1374
1450
  }
1375
1451
 
1376
1452
  # ============================================
1377
- # Store Availability Fragments (BOPIS / multi-location)
1453
+ # Store Availability (BOPIS / multi-location)
1378
1454
  # ============================================
1379
- # Field access:
1380
- # - `available: Boolean!` — always public.
1381
- # - `pickupTime: String` — public, localized merchant-configured string.
1382
- # - `quantityAvailable: Int` — TOKEN-GATED (null for anonymous, Int for authenticated).
1383
- # - `location: Location!` — public, includes coords + businessHours when configured.
1455
+ # Field-access notes:
1456
+ # - `isAvailable` — always public.
1457
+ # - `pickupTime` — public, localized merchant-configured string.
1458
+ # - `availableStock` — token-gated (null for anonymous, integer for authenticated customers).
1459
+ # - `location` — public, includes coords + business hours when configured.
1384
1460
 
1461
+ # Physical location address — street, city, country, state, postal code, phone, lat/lng, formatted single-line representation. Spread inside `Location.address`.
1385
1462
  fragment LocationAddress on LocationAddress {
1386
1463
  streetLine1
1387
1464
  streetLine2
@@ -1397,11 +1474,13 @@ fragment LocationAddress on LocationAddress {
1397
1474
  formatted
1398
1475
  }
1399
1476
 
1477
+ # One day's open/close window inside `BusinessHours` (24h clock).
1400
1478
  fragment BusinessHoursWindow on BusinessHoursWindow {
1401
1479
  openHour
1402
1480
  closeHour
1403
1481
  }
1404
1482
 
1483
+ # Weekly business hours — one window per day. Spread inside `Location.businessHours`.
1405
1484
  fragment BusinessHours on BusinessHours {
1406
1485
  monday { ...BusinessHoursWindow }
1407
1486
  tuesday { ...BusinessHoursWindow }
@@ -1412,6 +1491,7 @@ fragment BusinessHours on BusinessHours {
1412
1491
  sunday { ...BusinessHoursWindow }
1413
1492
  }
1414
1493
 
1494
+ # Physical store / pickup location — name, type (RETAIL / WAREHOUSE / PICKUP_POINT), address, business hours, pickup support flag + instructions, timezone. Spread on the store picker and location detail pages.
1415
1495
  fragment Location on Location {
1416
1496
  id
1417
1497
  name
@@ -1427,6 +1507,7 @@ fragment Location on Location {
1427
1507
  }
1428
1508
  }
1429
1509
 
1510
+ # Per-location stock entry for one variant — availability flag, stock quantity (token-gated), pickup time, full location detail. Spread inside `StoreAvailabilityConnection.edges[].node`.
1430
1511
  fragment StoreAvailability on StoreAvailability {
1431
1512
  isAvailable
1432
1513
  availableStock
@@ -1436,6 +1517,7 @@ fragment StoreAvailability on StoreAvailability {
1436
1517
  }
1437
1518
  }
1438
1519
 
1520
+ # Relay connection of `StoreAvailability` entries for a variant — used inside the `VariantStoreAvailability` fragment. Pre-paginated to 10 by default.
1439
1521
  fragment StoreAvailabilityConnection on StoreAvailabilityConnection {
1440
1522
  totalCount
1441
1523
  pageInfo {
@@ -1449,6 +1531,7 @@ fragment StoreAvailabilityConnection on StoreAvailabilityConnection {
1449
1531
  }
1450
1532
  }
1451
1533
 
1534
+ # Slim variant projection optimized for the store-picker UI — id, title, sku, isAvailable, total `availableStock` plus per-location `storeAvailability` connection. Use in `productStoreAvailability` query.
1452
1535
  fragment VariantStoreAvailability on ProductVariant {
1453
1536
  id
1454
1537
  title
@@ -1461,9 +1544,10 @@ fragment VariantStoreAvailability on ProductVariant {
1461
1544
  }
1462
1545
 
1463
1546
  # ============================================
1464
- # Content: Pages
1547
+ # Pages
1465
1548
  # ============================================
1466
1549
 
1550
+ # CMS page — handle (URL slug), title, body (HTML), excerpt, SEO metadata, publish date. Spread on About / Privacy / Terms / Returns Policy pages.
1467
1551
  fragment ShopPage on ShopPage {
1468
1552
  id
1469
1553
  handle
@@ -1480,9 +1564,10 @@ fragment ShopPage on ShopPage {
1480
1564
  }
1481
1565
 
1482
1566
  # ============================================
1483
- # Content: Navigation Menus
1567
+ # Navigation Menus
1484
1568
  # ============================================
1485
1569
 
1570
+ # One menu item with up to 3 levels of nested children — title, URL, type (`HTTP` / `FRONTPAGE` / `SEARCH` / `CATALOG` / `BLOG` / `PRODUCT` / `COLLECTION` / `CATEGORY` / `PAGE`), `resourceId` for typed items, optional image. Switch on `type` to render the right link target.
1486
1571
  fragment MenuItem on MenuItem {
1487
1572
  id
1488
1573
  title
@@ -1508,6 +1593,7 @@ fragment MenuItem on MenuItem {
1508
1593
  }
1509
1594
  }
1510
1595
 
1596
+ # Navigation menu — handle (e.g. "main-menu", "footer", "mobile"), title, nested item tree. Returned by `menu($handle)` query.
1511
1597
  fragment Menu on Menu {
1512
1598
  id
1513
1599
  handle
@@ -1518,24 +1604,20 @@ fragment Menu on Menu {
1518
1604
  }
1519
1605
 
1520
1606
  # ============================================
1521
- # Content: URL Redirects
1607
+ # URL Redirects
1522
1608
  # ============================================
1523
1609
 
1610
+ # Single legacy `path` → new `target` redirect entry. Use on the server / edge to issue 301 redirects for migrated routes.
1524
1611
  fragment UrlRedirect on UrlRedirect {
1525
1612
  path
1526
1613
  target
1527
1614
  }
1528
1615
 
1529
1616
  # ============================================
1530
- # Unified Product Configurator (Faza 1 + Faza 1.5 — Decision D-A v3 + D-I)
1617
+ # Product Configurator (per-product attributes)
1531
1618
  # ============================================
1532
- # Hybrid AttributeSet binding:
1533
- # - Product.attributes returns UNION of set definitions (via Product.attributeSetId)
1534
- # and per-product scoped definitions (AttributeDefinition.scopeProductId = product.id)
1535
- # - CUSTOMER fillingMode → rendered in storefront configurator UX
1536
- # - MERCHANT fillingMode → product metadata (filtering, display)
1537
- # - BOTH fillingMode → admin default + customer override in cart
1538
1619
 
1620
+ # Slim variant snapshot linked from a configurator option — when an attribute option (e.g. "256 GB" storage) maps to a specific variant, this fragment exposes that variant's id, title, sku, stock flags. Spread inside `ProductAttributeOption.linkedVariant`.
1539
1621
  fragment LinkedVariantSummary on LinkedVariantSummary {
1540
1622
  id
1541
1623
  productId
@@ -1546,6 +1628,7 @@ fragment LinkedVariantSummary on LinkedVariantSummary {
1546
1628
  trackQuantity
1547
1629
  }
1548
1630
 
1631
+ # One option (choice) within a configurator attribute — value, label, sort order, optional color hex, surcharge (amount + type), default flag, optional linked variant for variant-mapped options.
1549
1632
  fragment ProductAttributeOption on ProductAttributeOption {
1550
1633
  id
1551
1634
  value
@@ -1561,6 +1644,7 @@ fragment ProductAttributeOption on ProductAttributeOption {
1561
1644
  }
1562
1645
  }
1563
1646
 
1647
+ # Configurator attribute definition — name, type, fillingMode (CUSTOMER / MERCHANT / BOTH), billingMode, tax class, validation bounds, options (for choice-type attributes), required + visibility flags. Returned by `product.attributes(filter)` for the configurator UI.
1564
1648
  fragment ProductAttributeDefinition on ProductAttributeDefinition {
1565
1649
  id
1566
1650
  name