@nok-integration/storefront-react 0.17.0 → 0.17.1

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/dist/index.mjs CHANGED
@@ -9035,17 +9035,17 @@ function useCartCount() {
9035
9035
  }, [subscribe]);
9036
9036
  return count2;
9037
9037
  }
9038
- const header$1 = "_header_1hcuj_25";
9039
- const floating = "_floating_1hcuj_65";
9040
- const scrolled = "_scrolled_1hcuj_72";
9041
- const title$1 = "_title_1hcuj_121";
9042
- const right = "_right_1hcuj_134";
9043
- const spacer = "_spacer_1hcuj_147";
9044
- const iconBtn = "_iconBtn_1hcuj_152";
9045
- const menuBtn = "_menuBtn_1hcuj_179";
9046
- const badge = "_badge_1hcuj_207";
9047
- const closeSlot = "_closeSlot_1hcuj_234";
9048
- const centred = "_centred_1hcuj_249";
9038
+ const header$1 = "_header_oq0bd_25";
9039
+ const floating = "_floating_oq0bd_44";
9040
+ const scrolled = "_scrolled_oq0bd_87";
9041
+ const title$1 = "_title_oq0bd_161";
9042
+ const right = "_right_oq0bd_174";
9043
+ const spacer = "_spacer_oq0bd_187";
9044
+ const iconBtn = "_iconBtn_oq0bd_192";
9045
+ const menuBtn = "_menuBtn_oq0bd_219";
9046
+ const badge = "_badge_oq0bd_247";
9047
+ const closeSlot = "_closeSlot_oq0bd_274";
9048
+ const centred = "_centred_oq0bd_289";
9049
9049
  const styles$1 = {
9050
9050
  header: header$1,
9051
9051
  floating,
@@ -9035,17 +9035,17 @@ function useCartCount() {
9035
9035
  }, [subscribe]);
9036
9036
  return count2;
9037
9037
  }
9038
- const header$1 = "_header_1hcuj_25";
9039
- const floating = "_floating_1hcuj_65";
9040
- const scrolled = "_scrolled_1hcuj_72";
9041
- const title$1 = "_title_1hcuj_121";
9042
- const right = "_right_1hcuj_134";
9043
- const spacer = "_spacer_1hcuj_147";
9044
- const iconBtn = "_iconBtn_1hcuj_152";
9045
- const menuBtn = "_menuBtn_1hcuj_179";
9046
- const badge = "_badge_1hcuj_207";
9047
- const closeSlot = "_closeSlot_1hcuj_234";
9048
- const centred = "_centred_1hcuj_249";
9038
+ const header$1 = "_header_oq0bd_25";
9039
+ const floating = "_floating_oq0bd_44";
9040
+ const scrolled = "_scrolled_oq0bd_87";
9041
+ const title$1 = "_title_oq0bd_161";
9042
+ const right = "_right_oq0bd_174";
9043
+ const spacer = "_spacer_oq0bd_187";
9044
+ const iconBtn = "_iconBtn_oq0bd_192";
9045
+ const menuBtn = "_menuBtn_oq0bd_219";
9046
+ const badge = "_badge_oq0bd_247";
9047
+ const closeSlot = "_closeSlot_oq0bd_274";
9048
+ const centred = "_centred_oq0bd_289";
9049
9049
  const styles$1 = {
9050
9050
  header: header$1,
9051
9051
  floating,
@@ -4014,7 +4014,7 @@
4014
4014
  * the sticky CTA bar (50), the size-guide sheet (60), the bottom sheets (900) and the
4015
4015
  * toast (1000).
4016
4016
  */
4017
- ._header_1hcuj_25 {
4017
+ ._header_oq0bd_25 {
4018
4018
  position: sticky;
4019
4019
  top: 0;
4020
4020
  z-index: 40;
@@ -4023,7 +4023,22 @@
4023
4023
  justify-content: space-between;
4024
4024
  height: var(--header-height);
4025
4025
  padding: 0 var(--space-16);
4026
- background: var(--color-surface-default);
4026
+ /*
4027
+ * A fixed palette, not the inverting tokens, and this is the rule for the whole bar.
4028
+ *
4029
+ * There is no light/dark mode in this product. DAZN settled it on 7 Aug 2026: the
4030
+ * palette follows the design, not the device, and `theme` was withdrawn in 0.6.0 because
4031
+ * an override implied two designs where there is one. Each screen is drawn in the
4032
+ * palette its frame carries, statically.
4033
+ *
4034
+ * So the bar has exactly two appearances and both come from the design system's
4035
+ * `full-color` set, the one that does NOT invert with a mode: on a page it is #f9fafa with a #dddedf rule and #0c161c
4036
+ * contents (the product, cart and order frames); over artwork it is `.floating` below.
4037
+ * Reading `--color-surface-default` here made it a third thing — whatever the host's
4038
+ * palette happened to be — which is exactly how DAZN got a white bar over the hero.
4039
+ */
4040
+ background: #f9fafa;
4041
+ color: #0c161c;
4027
4042
  /*
4028
4043
  * semantic/base/border/full-color/default, drawn under the bar in the current frame
4029
4044
  * (5295:75116). It is what separates the header from a white PDP, which otherwise runs
@@ -4035,7 +4050,7 @@
4035
4050
  * up by one takes the difference from the frame from 5.7 of 255 to 3.6. It also put the
4036
4051
  * menu sheet 15px below the bar where `--header-height` plus `--space-16` says 16.
4037
4052
  */
4038
- box-shadow: inset 0 -1px 0 var(--color-border-default);
4053
+ box-shadow: inset 0 -1px 0 #dddedf;
4039
4054
  }
4040
4055
 
4041
4056
  /*
@@ -4054,7 +4069,7 @@
4054
4069
  * Declared after `.header` so it wins the background: both are one class, so the later
4055
4070
  * rule takes it.
4056
4071
  */
4057
- ._floating_1hcuj_65 {
4072
+ ._floating_oq0bd_44 {
4058
4073
  position: absolute;
4059
4074
  top: 0;
4060
4075
  left: 0;
@@ -4064,6 +4079,29 @@
4064
4079
  * Clear at rest. The scrim belongs to `.scrolled` below.
4065
4080
  */
4066
4081
  background: none;
4082
+ /*
4083
+ * Over artwork, the bar's contents are light. Always, and not because of a theme.
4084
+ *
4085
+ * `floating` means the bar is drawn over a photograph, and every frame that draws it that
4086
+ * way draws the chevron, the cart, the overflow and the title in
4087
+ * `semantic/base/text/static-light` #f9fafa. Everywhere else they take `text/default` and
4088
+ * follow the surface, which is right for the white product header.
4089
+ *
4090
+ * This was a real bug and DAZN found it (20 Aug 2026). `ShopHeader` mounts OUTSIDE
4091
+ * `ShopSurface` — that is what lets it sit above a screen rather than inside one — so it
4092
+ * inherits the HOST's tokens, and in a host with no dark palette `--color-text-default`
4093
+ * is #0c161c. Transparent bar, near-black glyphs, dark photograph: invisible.
4094
+ *
4095
+ * Our own storefront hid it completely, and that is the part worth remembering. Its
4096
+ * `ThemeController` sets `data-theme="dark"` on <html> for the dark routes, so the header
4097
+ * inherited a dark palette by accident of the host rather than by anything the package
4098
+ * does. Every screenshot we took was of the one host where it happened to work. It is the
4099
+ * same failure `ShopSurface` exists to prevent, one layer up in the chrome.
4100
+ *
4101
+ * A fixed hex rather than a token, for the reason the badge and the hero title are fixed:
4102
+ * it is read against a photograph, so it must not follow the surface palette.
4103
+ */
4104
+ color: #f9fafa;
4067
4105
  transition: background-color 160ms ease;
4068
4106
  /* No rule over artwork: it exists to separate the bar from the page below it, and there
4069
4107
  is no page below it here. */
@@ -4087,16 +4125,18 @@
4087
4125
  * Fixed rather than tokenised, like the hero's own palette: it is drawn over a photograph
4088
4126
  * and does not follow the surface.
4089
4127
  */
4090
- ._floating_1hcuj_65._scrolled_1hcuj_72 {
4128
+ ._floating_oq0bd_44._scrolled_oq0bd_87 {
4091
4129
  background: rgba(8, 14, 18, 0.6);
4092
4130
  }
4093
4131
 
4094
4132
  @media (prefers-reduced-motion: reduce) {
4095
- ._floating_1hcuj_65 {
4133
+ ._floating_oq0bd_44 {
4096
4134
  transition: none;
4097
4135
  }
4098
4136
  }
4099
4137
 
4138
+
4139
+
4100
4140
  /*
4101
4141
  * `DAZN Shop`, at the width the frame gives it.
4102
4142
  *
@@ -4110,20 +4150,20 @@
4110
4150
  * the dark screens, and the light PDP header (5295:75116) has an empty title slot. Written
4111
4151
  * as a static white it would be invisible the first time a host passed one on a light page.
4112
4152
  */
4113
- ._title_1hcuj_121 {
4153
+ ._title_oq0bd_161 {
4114
4154
  flex: 0 0 auto;
4115
4155
  width: 222px;
4116
4156
  min-width: 0;
4117
4157
  font-size: var(--type-caption-sm-size);
4118
4158
  line-height: var(--type-caption-sm-line);
4119
4159
  font-weight: var(--font-weight-bold);
4120
- color: var(--color-text-default);
4160
+ color: inherit;
4121
4161
  overflow: hidden;
4122
4162
  text-overflow: ellipsis;
4123
4163
  white-space: nowrap;
4124
4164
  }
4125
4165
 
4126
- ._right_1hcuj_134 {
4166
+ ._right_oq0bd_174 {
4127
4167
  display: flex;
4128
4168
  align-items: center;
4129
4169
  gap: var(--space-16);
@@ -4136,12 +4176,12 @@
4136
4176
  * header without a back button would silently re-lay-out rather than simply losing one
4137
4177
  * icon. 24px is the icon box it stands in for.
4138
4178
  */
4139
- ._spacer_1hcuj_147 {
4179
+ ._spacer_oq0bd_187 {
4140
4180
  width: 24px;
4141
4181
  height: 24px;
4142
4182
  }
4143
4183
 
4144
- ._iconBtn_1hcuj_152 {
4184
+ ._iconBtn_oq0bd_192 {
4145
4185
  position: relative;
4146
4186
  display: inline-flex;
4147
4187
  align-items: center;
@@ -4151,13 +4191,13 @@
4151
4191
  padding: 0;
4152
4192
  border: none;
4153
4193
  background: none;
4154
- color: var(--color-text-default);
4194
+ color: inherit;
4155
4195
  cursor: pointer;
4156
4196
  text-decoration: none;
4157
4197
  }
4158
4198
 
4159
4199
  /* Expand the hit area to >=44px without moving the 24px icon off the 16px inset. */
4160
- ._iconBtn_1hcuj_152::after {
4200
+ ._iconBtn_oq0bd_192::after {
4161
4201
  content: '';
4162
4202
  position: absolute;
4163
4203
  inset: -10px;
@@ -4168,12 +4208,12 @@
4168
4208
  * its glyph on the design's centre line — 16px from the right edge, not 12. Its own icon
4169
4209
  * stays 24px.
4170
4210
  */
4171
- ._menuBtn_1hcuj_179 {
4211
+ ._menuBtn_oq0bd_219 {
4172
4212
  width: 32px;
4173
4213
  height: 32px;
4174
4214
  }
4175
4215
 
4176
- ._menuBtn_1hcuj_179::after {
4216
+ ._menuBtn_oq0bd_219::after {
4177
4217
  inset: -6px;
4178
4218
  }
4179
4219
 
@@ -4196,7 +4236,7 @@
4196
4236
  *
4197
4237
  * Sits above the ::after hit area so the number is never painted underneath it.
4198
4238
  */
4199
- ._badge_1hcuj_207 {
4239
+ ._badge_oq0bd_247 {
4200
4240
  position: absolute;
4201
4241
  top: -6px;
4202
4242
  left: 14px;
@@ -4223,13 +4263,13 @@
4223
4263
  * `context=checkout` (5295:74075). Both side slots are the 32px box the frame draws — the
4224
4264
  * left one empty, so the title centres on the screen rather than on what is left over.
4225
4265
  */
4226
- ._closeSlot_1hcuj_234 {
4266
+ ._closeSlot_oq0bd_274 {
4227
4267
  flex: 0 0 auto;
4228
4268
  width: 32px;
4229
4269
  height: 32px;
4230
4270
  }
4231
4271
 
4232
- ._closeSlot_1hcuj_234._iconBtn_1hcuj_152::after {
4272
+ ._closeSlot_oq0bd_274._iconBtn_oq0bd_192::after {
4233
4273
  inset: -6px;
4234
4274
  }
4235
4275
 
@@ -4238,7 +4278,7 @@
4238
4278
  * centres "Order #2304" between two equal slots, so it is the free space, not a measured
4239
4279
  * width. Same size, weight and colour as the shop entry's — one text style, two positions.
4240
4280
  */
4241
- ._centred_1hcuj_249 {
4281
+ ._centred_oq0bd_289 {
4242
4282
  flex: 1 1 auto;
4243
4283
  width: auto;
4244
4284
  text-align: center;
package/dist/styles.css CHANGED
@@ -4014,7 +4014,7 @@
4014
4014
  * the sticky CTA bar (50), the size-guide sheet (60), the bottom sheets (900) and the
4015
4015
  * toast (1000).
4016
4016
  */
4017
- ._header_1hcuj_25 {
4017
+ ._header_oq0bd_25 {
4018
4018
  position: sticky;
4019
4019
  top: 0;
4020
4020
  z-index: 40;
@@ -4023,7 +4023,22 @@
4023
4023
  justify-content: space-between;
4024
4024
  height: var(--header-height);
4025
4025
  padding: 0 var(--space-16);
4026
- background: var(--color-surface-default);
4026
+ /*
4027
+ * A fixed palette, not the inverting tokens, and this is the rule for the whole bar.
4028
+ *
4029
+ * There is no light/dark mode in this product. DAZN settled it on 7 Aug 2026: the
4030
+ * palette follows the design, not the device, and `theme` was withdrawn in 0.6.0 because
4031
+ * an override implied two designs where there is one. Each screen is drawn in the
4032
+ * palette its frame carries, statically.
4033
+ *
4034
+ * So the bar has exactly two appearances and both come from the design system's
4035
+ * `full-color` set, the one that does NOT invert with a mode: on a page it is #f9fafa with a #dddedf rule and #0c161c
4036
+ * contents (the product, cart and order frames); over artwork it is `.floating` below.
4037
+ * Reading `--color-surface-default` here made it a third thing — whatever the host's
4038
+ * palette happened to be — which is exactly how DAZN got a white bar over the hero.
4039
+ */
4040
+ background: #f9fafa;
4041
+ color: #0c161c;
4027
4042
  /*
4028
4043
  * semantic/base/border/full-color/default, drawn under the bar in the current frame
4029
4044
  * (5295:75116). It is what separates the header from a white PDP, which otherwise runs
@@ -4035,7 +4050,7 @@
4035
4050
  * up by one takes the difference from the frame from 5.7 of 255 to 3.6. It also put the
4036
4051
  * menu sheet 15px below the bar where `--header-height` plus `--space-16` says 16.
4037
4052
  */
4038
- box-shadow: inset 0 -1px 0 var(--color-border-default);
4053
+ box-shadow: inset 0 -1px 0 #dddedf;
4039
4054
  }
4040
4055
 
4041
4056
  /*
@@ -4054,7 +4069,7 @@
4054
4069
  * Declared after `.header` so it wins the background: both are one class, so the later
4055
4070
  * rule takes it.
4056
4071
  */
4057
- ._floating_1hcuj_65 {
4072
+ ._floating_oq0bd_44 {
4058
4073
  position: absolute;
4059
4074
  top: 0;
4060
4075
  left: 0;
@@ -4064,6 +4079,29 @@
4064
4079
  * Clear at rest. The scrim belongs to `.scrolled` below.
4065
4080
  */
4066
4081
  background: none;
4082
+ /*
4083
+ * Over artwork, the bar's contents are light. Always, and not because of a theme.
4084
+ *
4085
+ * `floating` means the bar is drawn over a photograph, and every frame that draws it that
4086
+ * way draws the chevron, the cart, the overflow and the title in
4087
+ * `semantic/base/text/static-light` #f9fafa. Everywhere else they take `text/default` and
4088
+ * follow the surface, which is right for the white product header.
4089
+ *
4090
+ * This was a real bug and DAZN found it (20 Aug 2026). `ShopHeader` mounts OUTSIDE
4091
+ * `ShopSurface` — that is what lets it sit above a screen rather than inside one — so it
4092
+ * inherits the HOST's tokens, and in a host with no dark palette `--color-text-default`
4093
+ * is #0c161c. Transparent bar, near-black glyphs, dark photograph: invisible.
4094
+ *
4095
+ * Our own storefront hid it completely, and that is the part worth remembering. Its
4096
+ * `ThemeController` sets `data-theme="dark"` on <html> for the dark routes, so the header
4097
+ * inherited a dark palette by accident of the host rather than by anything the package
4098
+ * does. Every screenshot we took was of the one host where it happened to work. It is the
4099
+ * same failure `ShopSurface` exists to prevent, one layer up in the chrome.
4100
+ *
4101
+ * A fixed hex rather than a token, for the reason the badge and the hero title are fixed:
4102
+ * it is read against a photograph, so it must not follow the surface palette.
4103
+ */
4104
+ color: #f9fafa;
4067
4105
  transition: background-color 160ms ease;
4068
4106
  /* No rule over artwork: it exists to separate the bar from the page below it, and there
4069
4107
  is no page below it here. */
@@ -4087,16 +4125,18 @@
4087
4125
  * Fixed rather than tokenised, like the hero's own palette: it is drawn over a photograph
4088
4126
  * and does not follow the surface.
4089
4127
  */
4090
- ._floating_1hcuj_65._scrolled_1hcuj_72 {
4128
+ ._floating_oq0bd_44._scrolled_oq0bd_87 {
4091
4129
  background: rgba(8, 14, 18, 0.6);
4092
4130
  }
4093
4131
 
4094
4132
  @media (prefers-reduced-motion: reduce) {
4095
- ._floating_1hcuj_65 {
4133
+ ._floating_oq0bd_44 {
4096
4134
  transition: none;
4097
4135
  }
4098
4136
  }
4099
4137
 
4138
+
4139
+
4100
4140
  /*
4101
4141
  * `DAZN Shop`, at the width the frame gives it.
4102
4142
  *
@@ -4110,20 +4150,20 @@
4110
4150
  * the dark screens, and the light PDP header (5295:75116) has an empty title slot. Written
4111
4151
  * as a static white it would be invisible the first time a host passed one on a light page.
4112
4152
  */
4113
- ._title_1hcuj_121 {
4153
+ ._title_oq0bd_161 {
4114
4154
  flex: 0 0 auto;
4115
4155
  width: 222px;
4116
4156
  min-width: 0;
4117
4157
  font-size: var(--type-caption-sm-size);
4118
4158
  line-height: var(--type-caption-sm-line);
4119
4159
  font-weight: var(--font-weight-bold);
4120
- color: var(--color-text-default);
4160
+ color: inherit;
4121
4161
  overflow: hidden;
4122
4162
  text-overflow: ellipsis;
4123
4163
  white-space: nowrap;
4124
4164
  }
4125
4165
 
4126
- ._right_1hcuj_134 {
4166
+ ._right_oq0bd_174 {
4127
4167
  display: flex;
4128
4168
  align-items: center;
4129
4169
  gap: var(--space-16);
@@ -4136,12 +4176,12 @@
4136
4176
  * header without a back button would silently re-lay-out rather than simply losing one
4137
4177
  * icon. 24px is the icon box it stands in for.
4138
4178
  */
4139
- ._spacer_1hcuj_147 {
4179
+ ._spacer_oq0bd_187 {
4140
4180
  width: 24px;
4141
4181
  height: 24px;
4142
4182
  }
4143
4183
 
4144
- ._iconBtn_1hcuj_152 {
4184
+ ._iconBtn_oq0bd_192 {
4145
4185
  position: relative;
4146
4186
  display: inline-flex;
4147
4187
  align-items: center;
@@ -4151,13 +4191,13 @@
4151
4191
  padding: 0;
4152
4192
  border: none;
4153
4193
  background: none;
4154
- color: var(--color-text-default);
4194
+ color: inherit;
4155
4195
  cursor: pointer;
4156
4196
  text-decoration: none;
4157
4197
  }
4158
4198
 
4159
4199
  /* Expand the hit area to >=44px without moving the 24px icon off the 16px inset. */
4160
- ._iconBtn_1hcuj_152::after {
4200
+ ._iconBtn_oq0bd_192::after {
4161
4201
  content: '';
4162
4202
  position: absolute;
4163
4203
  inset: -10px;
@@ -4168,12 +4208,12 @@
4168
4208
  * its glyph on the design's centre line — 16px from the right edge, not 12. Its own icon
4169
4209
  * stays 24px.
4170
4210
  */
4171
- ._menuBtn_1hcuj_179 {
4211
+ ._menuBtn_oq0bd_219 {
4172
4212
  width: 32px;
4173
4213
  height: 32px;
4174
4214
  }
4175
4215
 
4176
- ._menuBtn_1hcuj_179::after {
4216
+ ._menuBtn_oq0bd_219::after {
4177
4217
  inset: -6px;
4178
4218
  }
4179
4219
 
@@ -4196,7 +4236,7 @@
4196
4236
  *
4197
4237
  * Sits above the ::after hit area so the number is never painted underneath it.
4198
4238
  */
4199
- ._badge_1hcuj_207 {
4239
+ ._badge_oq0bd_247 {
4200
4240
  position: absolute;
4201
4241
  top: -6px;
4202
4242
  left: 14px;
@@ -4223,13 +4263,13 @@
4223
4263
  * `context=checkout` (5295:74075). Both side slots are the 32px box the frame draws — the
4224
4264
  * left one empty, so the title centres on the screen rather than on what is left over.
4225
4265
  */
4226
- ._closeSlot_1hcuj_234 {
4266
+ ._closeSlot_oq0bd_274 {
4227
4267
  flex: 0 0 auto;
4228
4268
  width: 32px;
4229
4269
  height: 32px;
4230
4270
  }
4231
4271
 
4232
- ._closeSlot_1hcuj_234._iconBtn_1hcuj_152::after {
4272
+ ._closeSlot_oq0bd_274._iconBtn_oq0bd_192::after {
4233
4273
  inset: -6px;
4234
4274
  }
4235
4275
 
@@ -4238,7 +4278,7 @@
4238
4278
  * centres "Order #2304" between two equal slots, so it is the free space, not a measured
4239
4279
  * width. Same size, weight and colour as the shop entry's — one text style, two positions.
4240
4280
  */
4241
- ._centred_1hcuj_249 {
4281
+ ._centred_oq0bd_289 {
4242
4282
  flex: 1 1 auto;
4243
4283
  width: auto;
4244
4284
  text-align: center;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nok-integration/storefront-react",
3
- "version": "0.17.0",
3
+ "version": "0.17.1",
4
4
  "description": "Mountable React storefront components: catalogue, product detail and cart, mounted directly into a host DOM tree. No iframe.",
5
5
  "license": "UNLICENSED",
6
6
  "type": "module",