@guardian/interactive-component-library 0.4.4 → 0.5.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.
@@ -7,7 +7,10 @@ function MapProvider({ map, children }) {
7
7
  const registerLayer = (layer, comp) => {
8
8
  if (!layers.includes(layer)) {
9
9
  const position = getCompTreePosition(comp, children);
10
- if (position === null) return;
10
+ if (position === null) {
11
+ console.warn(`failed to find target component in component tree`, comp);
12
+ return;
13
+ }
11
14
  setLayers((prevLayers) => {
12
15
  const newLayers = [...prevLayers];
13
16
  newLayers.splice(position, 0, layer);
@@ -26,27 +29,42 @@ function MapProvider({ map, children }) {
26
29
  }, [map, layers]);
27
30
  return /* @__PURE__ */ jsx(MapContext.Provider, { value: { registerLayer, unregisterLayer }, children });
28
31
  }
29
- function getCompTreePosition(targetComponent, children) {
32
+ function getCompTreePosition(targetComponent, children, debug = false) {
30
33
  let index = 0;
34
+ let debugComponentPath = [];
31
35
  function traverse(nodes) {
32
- var _a, _b;
36
+ var _a, _b, _c, _d;
33
37
  for (const node of nodes) {
34
- const childNodes = (_b = (_a = node == null ? void 0 : node.__c) == null ? void 0 : _a.__v) == null ? void 0 : _b.__k;
35
- if (childNodes && childNodes.length > 1 && childNodes[0] !== null) {
36
- const result = traverse(childNodes);
37
- if (result !== null) {
38
- return result;
38
+ if (!node) continue;
39
+ const childNodes = (_b = (_a = node.__c) == null ? void 0 : _a.__v) == null ? void 0 : _b.__k;
40
+ if (debug) {
41
+ let name = ((_c = node.__c) == null ? void 0 : _c.constructor.displayName) || ((_d = node.__c) == null ? void 0 : _d.constructor.name);
42
+ if (name === "m") {
43
+ name = "";
39
44
  }
40
- } else {
41
- if ((node == null ? void 0 : node.__c) === targetComponent) {
42
- return index;
45
+ debugComponentPath.push(name);
46
+ }
47
+ if (childNodes && childNodes.length > 0) {
48
+ const result2 = traverse(childNodes);
49
+ if (result2 !== null) {
50
+ return result2;
43
51
  }
44
- index++;
45
52
  }
53
+ if ((node == null ? void 0 : node.__c) === targetComponent) {
54
+ return index;
55
+ }
56
+ if (debug) {
57
+ debugComponentPath.pop();
58
+ }
59
+ index++;
46
60
  }
47
61
  return null;
48
62
  }
49
- return traverse(Array.isArray(children) ? children : [children]);
63
+ const result = traverse(Array.isArray(children) ? children : [children]);
64
+ if (debug && result) {
65
+ console.log(`<${debugComponentPath.join("/> → <")}/>`);
66
+ }
67
+ return result;
50
68
  }
51
69
  export {
52
70
  MapContext,
@@ -5,8 +5,6 @@ import { Dispatcher } from '../events/Dispatcher';
5
5
  /** @typedef {Omit<ConstructorParameters<typeof TextLayer>[0], "source">} TextLayerOptions */
6
6
  /** @typedef {TextLayerOptions & { features: import("../Feature").Feature[] | import("../FeatureCollection").FeatureCollection }} TextLayerComponentProps */
7
7
  export class TextLayer {
8
- /** @param {TextLayerComponentProps} props */
9
- static Component({ features: featureCollection, style, minZoom, opacity, declutter, drawCollisionBoxes, }: TextLayerComponentProps): boolean;
10
8
  /**
11
9
  * @param {import("../Feature").Feature[]} features
12
10
  * @param {TextLayerOptions} options
@@ -46,6 +44,13 @@ export class TextLayer {
46
44
  getStyleFunction(): () => Style;
47
45
  renderFrame(frameState: any, targetElement: any): any;
48
46
  }
47
+ export namespace TextLayer {
48
+ /** @param {TextLayerComponentProps} props */
49
+ function Component({ features: featureCollection, style, minZoom, opacity, declutter, drawCollisionBoxes, }: TextLayerComponentProps): boolean;
50
+ namespace Component {
51
+ let displayName: string;
52
+ }
53
+ }
49
54
  export type TextLayerOptions = Omit<ConstructorParameters<typeof TextLayer>[0], "source">;
50
55
  export type TextLayerComponentProps = TextLayerOptions & {
51
56
  features: import('../Feature').Feature[] | import('../FeatureCollection').FeatureCollection;
@@ -118,6 +118,7 @@ class TextLayer {
118
118
  return this.renderer.renderFrame(frameState, targetElement);
119
119
  }
120
120
  }
121
+ TextLayer.Component.displayName = "TextLayer";
121
122
  export {
122
123
  TextLayer
123
124
  };
@@ -5,8 +5,6 @@ import { VectorSource } from '../sources/VectorSource';
5
5
  /** @typedef {Omit<ConstructorParameters<typeof VectorLayer>[0], "source">} VectorLayerOptions */
6
6
  /** @typedef {VectorLayerOptions & { features: import("../Feature").Feature[] | import("../FeatureCollection").FeatureCollection }} VectorLayerComponentProps */
7
7
  export class VectorLayer {
8
- /** @param {VectorLayerComponentProps} props */
9
- static Component({ features: featureCollection, style, minZoom, opacity, hitDetectionEnabled, }: VectorLayerComponentProps): boolean;
10
8
  /**
11
9
  * @param {import("../Feature").Feature[]} features
12
10
  * @param {VectorLayerOptions} options
@@ -51,6 +49,13 @@ export class VectorLayer {
51
49
  findFeatures(coordinate: any): any;
52
50
  renderFrame(frameState: any, targetElement: any): any;
53
51
  }
52
+ export namespace VectorLayer {
53
+ /** @param {VectorLayerComponentProps} props */
54
+ function Component({ features: featureCollection, style, minZoom, opacity, hitDetectionEnabled, }: VectorLayerComponentProps): boolean;
55
+ namespace Component {
56
+ let displayName: string;
57
+ }
58
+ }
54
59
  export type VectorLayerOptions = Omit<ConstructorParameters<typeof VectorLayer>[0], "source">;
55
60
  export type VectorLayerComponentProps = VectorLayerOptions & {
56
61
  features: import('../Feature').Feature[] | import('../FeatureCollection').FeatureCollection;
@@ -136,6 +136,7 @@ class VectorLayer {
136
136
  return this.renderer.renderFrame(frameState, targetElement);
137
137
  }
138
138
  }
139
+ VectorLayer.Component.displayName = "VectorLayer";
139
140
  export {
140
141
  VectorLayer
141
142
  };
@@ -18,7 +18,7 @@ class FeatureRenderer {
18
18
  }
19
19
  const feature = this.feature;
20
20
  const { projection, transform, pixelRatio } = frameState.viewState;
21
- const { stroke, fill } = this.style;
21
+ const { stroke, fill, pointRadius } = this.style;
22
22
  const geometries = feature.getProjectedGeometries(projection);
23
23
  if (frameState.debug) {
24
24
  try {
@@ -31,6 +31,11 @@ class FeatureRenderer {
31
31
  );
32
32
  }
33
33
  }
34
+ if (pointRadius) {
35
+ this.drawingFunction.pointRadius(
36
+ projection.scale() * pointRadius / transform.k
37
+ );
38
+ }
34
39
  this.drawPath(geometries, context);
35
40
  if (fill) {
36
41
  fill.drawInContext(context, transform.k);
@@ -36,14 +36,13 @@ class MapRenderer {
36
36
  }
37
37
  viewState.projection = projection;
38
38
  };
39
- const baseLayers = visibleLayers.filter((layer) => !layer.declutter);
40
- for (const layer of baseLayers) {
41
- renderLayer(layer);
42
- }
43
39
  const declutterTree = new RBush();
44
- const layersToDeclutter = [...visibleLayers].filter((layer) => !!layer.declutter).reverse();
45
- for (const layer of layersToDeclutter) {
46
- renderLayer(layer, declutterTree);
40
+ for (const layer of visibleLayers) {
41
+ if (layer.declutter) {
42
+ renderLayer(layer, declutterTree);
43
+ } else {
44
+ renderLayer(layer);
45
+ }
47
46
  }
48
47
  replaceChildren(this._element, mapElements);
49
48
  }
@@ -43,10 +43,12 @@ class TextLayerRenderer {
43
43
  x: relativeX * viewPortSize[0],
44
44
  y: relativeY * viewPortSize[1]
45
45
  });
46
- if (declutterTree.collides(bbox)) {
47
- continue;
46
+ if (declutterTree) {
47
+ if (declutterTree.collides(bbox)) {
48
+ continue;
49
+ }
50
+ declutterTree.insert(bbox);
48
51
  }
49
- declutterTree.insert(bbox);
50
52
  if (this.layer.drawCollisionBoxes) {
51
53
  const collisionBoxDebugElement = this.getCollisionBoxElement(bbox);
52
54
  textElements.push(collisionBoxDebugElement);
@@ -10,12 +10,14 @@
10
10
  * @property {Object} properties.stroke - The stroke color of the style
11
11
  * @property {Fill} properties.fill - The fill color of the style
12
12
  * @property {Object} properties.text - The text color of the style
13
+ * @property {number} properties.pointRadius - Radius of drawn "Point"-type geometries, if present
13
14
  */
14
15
  export class Style {
15
16
  constructor(properties: any);
16
17
  stroke: any;
17
18
  fill: any;
18
19
  text: any;
20
+ pointRadius: any;
19
21
  clone(): Style;
20
22
  }
21
23
  /**
@@ -3,12 +3,14 @@ class Style {
3
3
  this.stroke = properties == null ? void 0 : properties.stroke;
4
4
  this.fill = properties == null ? void 0 : properties.fill;
5
5
  this.text = properties == null ? void 0 : properties.text;
6
+ this.pointRadius = properties == null ? void 0 : properties.pointRadius;
6
7
  }
7
8
  clone() {
8
9
  return new Style({
9
10
  stroke: this.stroke,
10
11
  fill: this.fill,
11
- text: this.text
12
+ text: this.text,
13
+ pointRadius: this.pointRadius
12
14
  });
13
15
  }
14
16
  }
@@ -1,13 +1,13 @@
1
- const optionPicker = "_optionPicker_1b561_1";
2
- const title = "_title_1b561_13";
3
- const options = "_options_1b561_20";
4
- const option = "_option_1b561_1";
5
- const selected = "_selected_1b561_46";
6
- const optionIconContainer = "_optionIconContainer_1b561_55";
7
- const optionIcon = "_optionIcon_1b561_55";
8
- const optionTitle = "_optionTitle_1b561_67";
9
- const checkmark = "_checkmark_1b561_78";
10
- const checkmarkPath = "_checkmarkPath_1b561_82";
1
+ const optionPicker = "_optionPicker_1c1rh_1";
2
+ const title = "_title_1c1rh_13";
3
+ const options = "_options_1c1rh_20";
4
+ const option = "_option_1c1rh_1";
5
+ const selected = "_selected_1c1rh_47";
6
+ const optionIconContainer = "_optionIconContainer_1c1rh_56";
7
+ const optionIcon = "_optionIcon_1c1rh_56";
8
+ const optionTitle = "_optionTitle_1c1rh_68";
9
+ const checkmark = "_checkmark_1c1rh_79";
10
+ const checkmarkPath = "_checkmarkPath_1c1rh_83";
11
11
  const defaultStyles = {
12
12
  optionPicker,
13
13
  title,
@@ -15,10 +15,10 @@ import "../svg-map/index.js";
15
15
  import "../canvas-map/lib/Map.js";
16
16
  import "d3-polygon";
17
17
  import "../canvas-map/lib/projection/index.js";
18
- import "d3-geo";
18
+ import "../canvas-map/lib/layers/TextLayer.js";
19
+ import "../canvas-map/lib/layers/VectorLayer.js";
19
20
  import "rbush";
20
21
  import "rbush-knn";
21
- import "../canvas-map/context/MapContext.js";
22
22
  import "../canvas-map/Map.js";
23
23
  function ResultSummary({
24
24
  previous,
@@ -1,15 +1,15 @@
1
- const tickerVertical = "_tickerVertical_ozku7_9";
2
- const ticker = "_ticker_ozku7_9";
3
- const tickerItems = "_tickerItems_ozku7_27";
4
- const tickerScrollVertical = "_tickerScrollVertical_ozku7_32";
5
- const tickerScroll = "_tickerScroll_ozku7_32";
6
- const tickerItem = "_tickerItem_ozku7_27";
7
- const controls = "_controls_ozku7_75";
8
- const gradient = "_gradient_ozku7_90";
9
- const gradientHorizontal = "_gradientHorizontal_ozku7_102";
10
- const buttons = "_buttons_ozku7_116";
11
- const button = "_button_ozku7_116";
12
- const buttonInner = "_buttonInner_ozku7_142";
1
+ const tickerVertical = "_tickerVertical_1at7j_9";
2
+ const ticker = "_ticker_1at7j_9";
3
+ const tickerItems = "_tickerItems_1at7j_28";
4
+ const tickerScrollVertical = "_tickerScrollVertical_1at7j_33";
5
+ const tickerScroll = "_tickerScroll_1at7j_33";
6
+ const tickerItem = "_tickerItem_1at7j_28";
7
+ const controls = "_controls_1at7j_76";
8
+ const gradient = "_gradient_1at7j_91";
9
+ const gradientHorizontal = "_gradientHorizontal_1at7j_103";
10
+ const buttons = "_buttons_1at7j_118";
11
+ const button = "_button_1at7j_118";
12
+ const buttonInner = "_buttonInner_1at7j_144";
13
13
  const styles = {
14
14
  tickerVertical,
15
15
  ticker,
@@ -2,7 +2,7 @@ import { jsx } from "preact/jsx-runtime";
2
2
  import defaultStyles from "./style.module.css.js";
3
3
  import { mergeStyles } from "../../../styles/helpers/mergeStyles.js";
4
4
  import dayjs from "dayjs";
5
- import relativeTime from "dayjs/plugin/relativeTime";
5
+ import relativeTime from "dayjs/plugin/relativeTime.js";
6
6
  dayjs.extend(relativeTime);
7
7
  const RelativeTimeSentence = ({ timeStamp, styles }) => {
8
8
  styles = mergeStyles({ ...defaultStyles }, styles);
package/dist/style.css CHANGED
@@ -3009,7 +3009,7 @@ body.android {
3009
3009
  cursor: auto;
3010
3010
  background-color: var(--tertiary-bg-color);
3011
3011
  }
3012
- ._optionPicker_1b561_1 {
3012
+ ._optionPicker_1c1rh_1 {
3013
3013
  background-color: rgba(255, 255, 255, 0.6);
3014
3014
  border: 1px solid var(--border-divider-color);
3015
3015
  border-radius: 8px;
@@ -3021,31 +3021,32 @@ body.android {
3021
3021
  row-gap: 4px;
3022
3022
  }
3023
3023
 
3024
- ._title_1b561_13 {
3024
+ ._title_1c1rh_13 {
3025
3025
  color: var(--secondary-text-color);
3026
3026
  font-family: var(--text-sans);
3027
3027
  font-size: var(--sans-xxsmall);
3028
3028
  line-height: var(--sans-line-height);
3029
3029
  }
3030
3030
 
3031
- ._options_1b561_20 {
3031
+ ._options_1c1rh_20 {
3032
3032
  display: flex;
3033
3033
  flex-direction: row;
3034
3034
  justify-content: stretch;
3035
3035
  gap: var(--space-2);
3036
3036
  }
3037
3037
 
3038
- ._options_1b561_20.vertical {
3038
+ ._options_1c1rh_20.vertical {
3039
3039
  flex-direction: column;
3040
3040
  }
3041
3041
 
3042
- ._option_1b561_1 {
3042
+ ._option_1c1rh_1 {
3043
+ flex: 1;
3044
+
3043
3045
  display: flex;
3044
3046
  flex-direction: column;
3045
3047
  align-items: center;
3046
3048
  gap: var(--space-2);
3047
3049
  min-height: 70px;
3048
- max-width: 124px;
3049
3050
 
3050
3051
  border: 1px solid var(--border-divider-color);
3051
3052
  border-radius: 8px;
@@ -3054,16 +3055,16 @@ body.android {
3054
3055
  background-color: var(--primary-bg-color);
3055
3056
  }
3056
3057
 
3057
- ._option_1b561_1._selected_1b561_46 {
3058
+ ._option_1c1rh_1._selected_1c1rh_47 {
3058
3059
  border: 1px solid var(--primary-text-color);
3059
3060
  }
3060
3061
 
3061
- ._option_1b561_1:hover:enabled {
3062
+ ._option_1c1rh_1:hover:enabled {
3062
3063
  background-color: var(--news-grey-05);
3063
3064
  cursor: pointer;
3064
3065
  }
3065
3066
 
3066
- ._optionIconContainer_1b561_55 {
3067
+ ._optionIconContainer_1c1rh_56 {
3067
3068
  width: 100%;
3068
3069
  display: flex;
3069
3070
  flex-direction: row;
@@ -3071,26 +3072,26 @@ body.android {
3071
3072
  gap: var(--space-1);
3072
3073
  }
3073
3074
 
3074
- ._optionIcon_1b561_55 {
3075
+ ._optionIcon_1c1rh_56 {
3075
3076
  width: 100%;
3076
3077
  }
3077
3078
 
3078
- ._optionTitle_1b561_67 {
3079
+ ._optionTitle_1c1rh_68 {
3079
3080
  color: var(--primary-text-color);
3080
3081
  font-family: var(--text-sans);
3081
3082
  font-size: var(--sans-xxsmall);
3082
3083
  line-height: var(--sans-line-height);
3083
3084
  }
3084
3085
 
3085
- ._option_1b561_1._selected_1b561_46 ._optionTitle_1b561_67 {
3086
+ ._option_1c1rh_1._selected_1c1rh_47 ._optionTitle_1c1rh_68 {
3086
3087
  font-weight: 700;
3087
3088
  }
3088
3089
 
3089
- ._checkmark_1b561_78 {
3090
+ ._checkmark_1c1rh_79 {
3090
3091
  width: 11px;
3091
3092
  }
3092
3093
 
3093
- ._checkmarkPath_1b561_82 {
3094
+ ._checkmarkPath_1c1rh_83 {
3094
3095
  fill: var(--primary-text-color);
3095
3096
  }
3096
3097
  body {
@@ -3199,30 +3200,31 @@ body.android {
3199
3200
  --top-inset: 58px;
3200
3201
  }
3201
3202
 
3202
- ._tickerVertical_ozku7_9 {
3203
+ ._tickerVertical_1at7j_9 {
3203
3204
  position: relative;
3204
3205
  padding-bottom: 44px;
3205
3206
  --ticker-item-width: 100%;
3206
3207
  }
3207
3208
  @media (min-width: 30em) {
3208
- ._tickerVertical_ozku7_9 {
3209
+ ._tickerVertical_1at7j_9 {
3209
3210
  --ticker-item-width: auto;
3210
3211
  padding: 0;
3211
3212
  }
3212
3213
  }
3213
3214
 
3214
- ._ticker_ozku7_9 {
3215
+ ._ticker_1at7j_9 {
3215
3216
  position: relative;
3216
3217
  --ticker-item-width: 200px;
3217
3218
  padding: 0;
3219
+ cursor: default;
3218
3220
  }
3219
3221
 
3220
- ._tickerItems_ozku7_27 {
3222
+ ._tickerItems_1at7j_28 {
3221
3223
  width: 100%;
3222
3224
  overflow: clip;
3223
3225
  }
3224
3226
 
3225
- ._tickerScrollVertical_ozku7_32 {
3227
+ ._tickerScrollVertical_1at7j_33 {
3226
3228
  display: flex;
3227
3229
  flex-direction: column;
3228
3230
  row-gap: var(--space-2);
@@ -3231,7 +3233,7 @@ body.android {
3231
3233
  overflow: visible;
3232
3234
  }
3233
3235
  @media (min-width: 30em) {
3234
- ._tickerScrollVertical_ozku7_32 {
3236
+ ._tickerScrollVertical_1at7j_33 {
3235
3237
  flex-direction: row;
3236
3238
  column-gap: var(--space-2);
3237
3239
  transform: translateX(var(--ticker-offset));
@@ -3239,7 +3241,7 @@ body.android {
3239
3241
  }
3240
3242
  }
3241
3243
 
3242
- ._tickerScroll_ozku7_32 {
3244
+ ._tickerScroll_1at7j_33 {
3243
3245
  display: flex;
3244
3246
  flex-direction: row;
3245
3247
  flex-wrap: nowrap;
@@ -3251,28 +3253,28 @@ body.android {
3251
3253
  width: auto;
3252
3254
  padding-right: 50px;
3253
3255
  }
3254
- ._tickerScroll_ozku7_32:-webkit-scrollbar {
3256
+ ._tickerScroll_1at7j_33:-webkit-scrollbar {
3255
3257
  display: none; /* for Chrome, Safari, and Opera */
3256
3258
  }
3257
3259
  @media (min-width: 30em) {
3258
- ._tickerScroll_ozku7_32 {
3260
+ ._tickerScroll_1at7j_33 {
3259
3261
  width: fit-content;
3260
3262
  }
3261
3263
  }
3262
3264
 
3263
- ._tickerItem_ozku7_27 {
3265
+ ._tickerItem_1at7j_28 {
3264
3266
  width: var(--ticker-item-width);
3265
3267
  flex-shrink: 0;
3266
3268
  }
3267
3269
 
3268
- ._controls_ozku7_75 {
3270
+ ._controls_1at7j_76 {
3269
3271
  position: absolute;
3270
3272
  bottom: 0;
3271
3273
  width: 100%;
3272
3274
  height: 130px;
3273
3275
  }
3274
3276
  @media (min-width: 30em) {
3275
- ._controls_ozku7_75 {
3277
+ ._controls_1at7j_76 {
3276
3278
  top: 0;
3277
3279
  right: 0;
3278
3280
  width: 86px;
@@ -3280,19 +3282,20 @@ body.android {
3280
3282
  }
3281
3283
  }
3282
3284
 
3283
- ._gradient_ozku7_90 {
3285
+ ._gradient_1at7j_91 {
3284
3286
  width: 100%;
3285
3287
  height: 86px;
3286
3288
  }
3287
3289
  @media (min-width: 30em) {
3288
- ._gradient_ozku7_90 {
3290
+ ._gradient_1at7j_91 {
3289
3291
  width: auto;
3290
3292
  height: 100%;
3291
3293
  right: 0;
3292
3294
  }
3293
3295
  }
3294
3296
 
3295
- ._gradientHorizontal_ozku7_102 {
3297
+ ._gradientHorizontal_1at7j_103 {
3298
+ pointer-events: none;
3296
3299
  width: 60px;
3297
3300
  height: 100%;
3298
3301
  right: 0;
@@ -3301,16 +3304,16 @@ body.android {
3301
3304
  background: linear-gradient(to right, transparent 0%, var(--tertiary-bg-color) 80%, var(--tertiary-bg-color));
3302
3305
  }
3303
3306
  @media (min-width: 30em) {
3304
- ._gradientHorizontal_ozku7_102 {
3307
+ ._gradientHorizontal_1at7j_103 {
3305
3308
  width: auto;
3306
3309
  }
3307
3310
  }
3308
3311
 
3309
- ._buttons_ozku7_116 {
3312
+ ._buttons_1at7j_118 {
3310
3313
  display: none;
3311
3314
  }
3312
3315
  @media (min-width: 30em) {
3313
- ._buttons_ozku7_116 {
3316
+ ._buttons_1at7j_118 {
3314
3317
  position: absolute;
3315
3318
  top: 0;
3316
3319
  right: var(--space-5);
@@ -3321,36 +3324,36 @@ body.android {
3321
3324
  }
3322
3325
  }
3323
3326
 
3324
- ._button_ozku7_116 {
3327
+ ._button_1at7j_118 {
3325
3328
  min-height: 40px;
3326
3329
  background-color: var(--tertiary-bg-color);
3327
3330
  padding-bottom: 20px;
3328
3331
  }
3329
3332
  @media (min-width: 30em) {
3330
- ._button_ozku7_116 {
3333
+ ._button_1at7j_118 {
3331
3334
  display: none;
3332
3335
  }
3333
3336
  }
3334
3337
 
3335
- ._buttonInner_ozku7_142 {
3338
+ ._buttonInner_1at7j_144 {
3336
3339
  background-color: var(--tertiary-bg-color);
3337
3340
  }
3338
3341
 
3339
- ._tickerVertical_ozku7_9[data-expanded=true] {
3342
+ ._tickerVertical_1at7j_9[data-expanded=true] {
3340
3343
  padding-bottom: 0;
3341
3344
  }
3342
3345
 
3343
- ._tickerVertical_ozku7_9[data-expanded=true] ._tickerScrollVertical_ozku7_32 {
3346
+ ._tickerVertical_1at7j_9[data-expanded=true] ._tickerScrollVertical_1at7j_33 {
3344
3347
  max-height: fit-content;
3345
3348
  margin-bottom: -40px;
3346
3349
  }
3347
3350
 
3348
- ._tickerVertical_ozku7_9[data-expanded=true] ._controls_ozku7_75 {
3351
+ ._tickerVertical_1at7j_9[data-expanded=true] ._controls_1at7j_76 {
3349
3352
  position: sticky;
3350
3353
  margin-top: -40px;
3351
3354
  }
3352
3355
 
3353
- ._tickerVertical_ozku7_9[data-expanded=true] ._button_ozku7_116 {
3356
+ ._tickerVertical_1at7j_9[data-expanded=true] ._button_1at7j_118 {
3354
3357
  position: absolute;
3355
3358
  width: 100%;
3356
3359
  left: 0;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@guardian/interactive-component-library",
3
3
  "private": false,
4
- "version": "0.4.4",
4
+ "version": "0.5.0",
5
5
  "packageManager": "pnpm@8.4.0",
6
6
  "repository": {
7
7
  "type": "git",