@skyscanner/backpack-web 42.0.0 → 42.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.
Files changed (39) hide show
  1. package/bpk-component-button/src/BpkButton.d.ts +1 -1
  2. package/bpk-component-button/src/BpkButton.js +17 -3
  3. package/bpk-component-button/src/BpkButton.module.css +1 -1
  4. package/bpk-component-button/src/common-types.d.ts +2 -0
  5. package/bpk-component-checkbox/index.d.ts +7 -1
  6. package/bpk-component-checkbox/index.js +3 -1
  7. package/bpk-component-checkbox/src/BpkCheckboxV2/BpkCheckbox.d.ts +9 -0
  8. package/bpk-component-checkbox/src/BpkCheckboxV2/BpkCheckbox.js +33 -0
  9. package/bpk-component-checkbox/src/BpkCheckboxV2/BpkCheckbox.module.css +18 -0
  10. package/bpk-component-checkbox/src/BpkCheckboxV2/BpkCheckboxControl.d.ts +6 -0
  11. package/bpk-component-checkbox/src/BpkCheckboxV2/BpkCheckboxControl.js +30 -0
  12. package/bpk-component-checkbox/src/BpkCheckboxV2/BpkCheckboxDescription.d.ts +6 -0
  13. package/bpk-component-checkbox/src/BpkCheckboxV2/BpkCheckboxDescription.js +32 -0
  14. package/bpk-component-checkbox/src/BpkCheckboxV2/BpkCheckboxHiddenInput.d.ts +2 -0
  15. package/bpk-component-checkbox/src/BpkCheckboxV2/BpkCheckboxHiddenInput.js +25 -0
  16. package/bpk-component-checkbox/src/BpkCheckboxV2/BpkCheckboxIndicator.d.ts +2 -0
  17. package/bpk-component-checkbox/src/BpkCheckboxV2/BpkCheckboxIndicator.js +23 -0
  18. package/bpk-component-checkbox/src/BpkCheckboxV2/BpkCheckboxLabel.d.ts +6 -0
  19. package/bpk-component-checkbox/src/BpkCheckboxV2/BpkCheckboxLabel.js +30 -0
  20. package/bpk-component-checkbox/src/BpkCheckboxV2/BpkCheckboxRoot.d.ts +16 -0
  21. package/bpk-component-checkbox/src/BpkCheckboxV2/BpkCheckboxRoot.js +49 -0
  22. package/bpk-component-checkbox/src/BpkCheckboxV2/themeAttributes.d.ts +2 -0
  23. package/bpk-component-checkbox/src/BpkCheckboxV2/themeAttributes.js +20 -0
  24. package/bpk-component-checkbox-card/index.d.ts +3 -0
  25. package/bpk-component-checkbox-card/index.js +20 -0
  26. package/bpk-component-checkbox-card/src/BpkCheckboxCard.d.ts +128 -0
  27. package/bpk-component-checkbox-card/src/BpkCheckboxCard.js +216 -0
  28. package/bpk-component-checkbox-card/src/BpkCheckboxCard.module.css +18 -0
  29. package/bpk-component-checkbox-card/src/BpkCheckboxCardRoot.d.ts +95 -0
  30. package/bpk-component-checkbox-card/src/BpkCheckboxCardRoot.js +101 -0
  31. package/bpk-component-checkbox-card/src/CheckboxCardContext.d.ts +27 -0
  32. package/bpk-component-checkbox-card/src/CheckboxCardContext.js +47 -0
  33. package/bpk-component-checkbox-card/src/common-types.d.ts +27 -0
  34. package/bpk-component-checkbox-card/src/common-types.js +43 -0
  35. package/bpk-component-checkbox-card/src/themeAttributes.d.ts +46 -0
  36. package/bpk-component-checkbox-card/src/themeAttributes.js +87 -0
  37. package/bpk-component-scrollable-calendar/src/BpkScrollableCalendarGridList.js +40 -22
  38. package/bpk-component-scrollable-calendar/src/BpkScrollableCalendarGridList.module.css +1 -1
  39. package/package.json +1 -1
@@ -0,0 +1,43 @@
1
+ /*
2
+ * Backpack - Skyscanner's Design System
3
+ *
4
+ * Copyright 2016 Skyscanner Ltd
5
+ *
6
+ * Licensed under the Apache License, Version 2.0 (the "License");
7
+ * you may not use this file except in compliance with the License.
8
+ * You may obtain a copy of the License at
9
+ *
10
+ * http://www.apache.org/licenses/LICENSE-2.0
11
+ *
12
+ * Unless required by applicable law or agreed to in writing, software
13
+ * distributed under the License is distributed on an "AS IS" BASIS,
14
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ * See the License for the specific language governing permissions and
16
+ * limitations under the License.
17
+ */
18
+
19
+ /**
20
+ * Variant types for visual presentation based on canvas/surface background
21
+ * - onCanvasDefault: For use on default/white backgrounds (selected: dark blue #05203C)
22
+ * - onCanvasContrast: For use on contrast/colored backgrounds (selected: dark blue #05203C)
23
+ * - onSurfaceContrast: For use on contrast surfaces (selected: accent blue #0062E3)
24
+ * - cars: For use in cars product context — same styling as onCanvasDefault but with
25
+ * the corner Indicator automatically rendered (no need to add <BpkCheckboxCard.Indicator />)
26
+ */
27
+ export const CHECKBOX_CARD_VARIANTS = {
28
+ onCanvasDefault: 'on-canvas-default',
29
+ onCanvasContrast: 'on-canvas-contrast',
30
+ onSurfaceContrast: 'on-surface-contrast',
31
+ cars: 'cars'
32
+ };
33
+ /**
34
+ * Radius types for border-radius
35
+ */
36
+ export const CHECKBOX_CARD_RADIUS = {
37
+ square: 'square',
38
+ rounded: 'rounded'
39
+ };
40
+
41
+ /**
42
+ * Change handler signature for checkbox card
43
+ */
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Theme attributes for BpkCheckboxCard component.
3
+ *
4
+ * These attributes can be customized using BpkThemeProvider to override
5
+ * the default colors and styles of the checkbox card.
6
+ *
7
+ * Use `createCheckboxCardTheme` to build a partial theme — only specify
8
+ * the attributes you want to change; the rest fall back to design tokens.
9
+ *
10
+ * @example
11
+ * import BpkThemeProvider from '@skyscanner/backpack-web/bpk-theming';
12
+ * import {
13
+ * BpkCheckboxCard,
14
+ * CHECKBOX_CARD_THEME_ATTRIBUTES,
15
+ * createCheckboxCardTheme,
16
+ * } from '@skyscanner/backpack-web/bpk-component-checkbox-card';
17
+ *
18
+ * const theme = createCheckboxCardTheme({
19
+ * checkboxCardCheckedBackgroundColor: '#FFFFFF',
20
+ * checkboxCardCheckedTextColor: '#111236',
21
+ * checkboxCardCheckedBorderColor: '#111236',
22
+ * checkboxCardIndicatorBackgroundColor: '#111236',
23
+ * });
24
+ *
25
+ * <BpkThemeProvider theme={theme} themeAttributes={CHECKBOX_CARD_THEME_ATTRIBUTES}>
26
+ * <BpkCheckboxCard.Root>
27
+ * ...
28
+ * </BpkCheckboxCard.Root>
29
+ * </BpkThemeProvider>
30
+ */
31
+ declare const CHECKBOX_CARD_THEME_ATTRIBUTES: readonly ["checkboxCardDefaultBackgroundColor", "checkboxCardDefaultTextColor", "checkboxCardSecondaryTextColor", "checkboxCardHoverBackgroundColor", "checkboxCardDefaultBorderColor", "checkboxCardHoverBorderColor", "checkboxCardCheckedBackgroundColor", "checkboxCardCheckedTextColor", "checkboxCardCheckedBorderColor", "checkboxCardDisabledBackgroundColor", "checkboxCardDisabledTextColor", "checkboxCardIndicatorBackgroundColor", "checkboxCardIndicatorTextColor"];
32
+ type CheckboxCardThemeKey = (typeof CHECKBOX_CARD_THEME_ATTRIBUTES)[number];
33
+ type CheckboxCardTheme = Record<CheckboxCardThemeKey, string>;
34
+ /**
35
+ * Creates a complete BpkCheckboxCard theme by merging your overrides with the
36
+ * default design-token values. Pass only the attributes you want to change.
37
+ *
38
+ * @example
39
+ * const theme = createCheckboxCardTheme({
40
+ * checkboxCardCheckedBackgroundColor: '#FFFFFF',
41
+ * checkboxCardCheckedBorderColor: '#111236',
42
+ * checkboxCardIndicatorBackgroundColor: '#111236',
43
+ * });
44
+ */
45
+ export declare function createCheckboxCardTheme(overrides?: Partial<CheckboxCardTheme>): CheckboxCardTheme;
46
+ export default CHECKBOX_CARD_THEME_ATTRIBUTES;
@@ -0,0 +1,87 @@
1
+ /*
2
+ * Backpack - Skyscanner's Design System
3
+ *
4
+ * Copyright 2016 Skyscanner Ltd
5
+ *
6
+ * Licensed under the Apache License, Version 2.0 (the "License");
7
+ * you may not use this file except in compliance with the License.
8
+ * You may obtain a copy of the License at
9
+ *
10
+ * http://www.apache.org/licenses/LICENSE-2.0
11
+ *
12
+ * Unless required by applicable law or agreed to in writing, software
13
+ * distributed under the License is distributed on an "AS IS" BASIS,
14
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ * See the License for the specific language governing permissions and
16
+ * limitations under the License.
17
+ */
18
+
19
+ import { canvasDay, coreAccentDay, colorWhite, lineDay, surfaceContrastDay, surfaceLowContrastDay, textDisabledDay, textOnDarkDay, textPrimaryDay, textSecondaryDay } from '@skyscanner/bpk-foundations-web/tokens/base.es6';
20
+
21
+ /**
22
+ * Theme attributes for BpkCheckboxCard component.
23
+ *
24
+ * These attributes can be customized using BpkThemeProvider to override
25
+ * the default colors and styles of the checkbox card.
26
+ *
27
+ * Use `createCheckboxCardTheme` to build a partial theme — only specify
28
+ * the attributes you want to change; the rest fall back to design tokens.
29
+ *
30
+ * @example
31
+ * import BpkThemeProvider from '@skyscanner/backpack-web/bpk-theming';
32
+ * import {
33
+ * BpkCheckboxCard,
34
+ * CHECKBOX_CARD_THEME_ATTRIBUTES,
35
+ * createCheckboxCardTheme,
36
+ * } from '@skyscanner/backpack-web/bpk-component-checkbox-card';
37
+ *
38
+ * const theme = createCheckboxCardTheme({
39
+ * checkboxCardCheckedBackgroundColor: '#FFFFFF',
40
+ * checkboxCardCheckedTextColor: '#111236',
41
+ * checkboxCardCheckedBorderColor: '#111236',
42
+ * checkboxCardIndicatorBackgroundColor: '#111236',
43
+ * });
44
+ *
45
+ * <BpkThemeProvider theme={theme} themeAttributes={CHECKBOX_CARD_THEME_ATTRIBUTES}>
46
+ * <BpkCheckboxCard.Root>
47
+ * ...
48
+ * </BpkCheckboxCard.Root>
49
+ * </BpkThemeProvider>
50
+ */
51
+ const CHECKBOX_CARD_THEME_ATTRIBUTES = ['checkboxCardDefaultBackgroundColor', 'checkboxCardDefaultTextColor', 'checkboxCardSecondaryTextColor', 'checkboxCardHoverBackgroundColor', 'checkboxCardDefaultBorderColor', 'checkboxCardHoverBorderColor', 'checkboxCardCheckedBackgroundColor', 'checkboxCardCheckedTextColor', 'checkboxCardCheckedBorderColor', 'checkboxCardDisabledBackgroundColor', 'checkboxCardDisabledTextColor', 'checkboxCardIndicatorBackgroundColor', 'checkboxCardIndicatorTextColor'];
52
+ /** Default theme values matching the SCSS token fallbacks */
53
+ const CHECKBOX_CARD_DEFAULT_THEME = {
54
+ checkboxCardDefaultBackgroundColor: canvasDay,
55
+ checkboxCardDefaultTextColor: textPrimaryDay,
56
+ checkboxCardSecondaryTextColor: textSecondaryDay,
57
+ checkboxCardHoverBackgroundColor: surfaceLowContrastDay,
58
+ checkboxCardDefaultBorderColor: lineDay,
59
+ checkboxCardHoverBorderColor: lineDay,
60
+ checkboxCardCheckedBackgroundColor: surfaceContrastDay,
61
+ checkboxCardCheckedTextColor: textOnDarkDay,
62
+ checkboxCardCheckedBorderColor: 'transparent',
63
+ checkboxCardDisabledBackgroundColor: canvasDay,
64
+ checkboxCardDisabledTextColor: textDisabledDay,
65
+ checkboxCardIndicatorBackgroundColor: coreAccentDay,
66
+ checkboxCardIndicatorTextColor: colorWhite
67
+ };
68
+
69
+ /**
70
+ * Creates a complete BpkCheckboxCard theme by merging your overrides with the
71
+ * default design-token values. Pass only the attributes you want to change.
72
+ *
73
+ * @example
74
+ * const theme = createCheckboxCardTheme({
75
+ * checkboxCardCheckedBackgroundColor: '#FFFFFF',
76
+ * checkboxCardCheckedBorderColor: '#111236',
77
+ * checkboxCardIndicatorBackgroundColor: '#111236',
78
+ * });
79
+ */
80
+
81
+ export function createCheckboxCardTheme(overrides = {}) {
82
+ return {
83
+ ...CHECKBOX_CARD_DEFAULT_THEME,
84
+ ...overrides
85
+ };
86
+ }
87
+ export default CHECKBOX_CARD_THEME_ATTRIBUTES;
@@ -25,7 +25,7 @@ import { cssModules, getDataComponentAttribute } from "../../bpk-react-utils";
25
25
  import BpkScrollableCalendarGrid from "./BpkScrollableCalendarGrid";
26
26
  import { getMonthsArray, getMonthItemHeights } from "./utils";
27
27
  import STYLES from "./BpkScrollableCalendarGridList.module.css";
28
- import { jsx as _jsx } from "react/jsx-runtime";
28
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
29
29
  const getClassName = cssModules(STYLES);
30
30
 
31
31
  // These constants are here to facilitate calculating the height
@@ -46,6 +46,7 @@ const BpkScrollableCalendarGridList = props => {
46
46
  ...rest
47
47
  } = props;
48
48
  const listRef = useRef(null);
49
+ const sentinelRef = useRef(null);
49
50
  const startDate = startOfDay(startOfMonth(minDate));
50
51
  const endDate = startOfDay(startOfMonth(rest.maxDate));
51
52
  const monthsCount = DateUtils.differenceInCalendarMonths(endDate, startDate);
@@ -54,11 +55,13 @@ const BpkScrollableCalendarGridList = props => {
54
55
  const rowHeight = customRowHeight;
55
56
  // Most calendar grids have 5 rows. Calculate height in px as this is what react-window expects.
56
57
  const estimatedMonthItemHeight = (BASE_MONTH_ITEM_HEIGHT + 5 * rowHeight) * DEFAULT_ROOT_FONT_SIZE;
57
- const getInitialRootFontSize = () => parseFloat(getComputedStyle(document.documentElement).fontSize) || DEFAULT_ROOT_FONT_SIZE;
58
58
 
59
59
  // The `react-window` API requires the height in pixels to be specified
60
60
  // To be able to scale text size, we use rem and then we get the root font size so that we can calculate the final value in px
61
- const [rootFontSize, setRootFontSize] = useState(getInitialRootFontSize);
61
+ // Initialise to the default; the sentinel ResizeObserver corrects this to the true rendered
62
+ // value immediately on mount, so we never rely on getComputedStyle which can be stale under
63
+ // browser font scaling.
64
+ const [rootFontSize, setRootFontSize] = useState(DEFAULT_ROOT_FONT_SIZE);
62
65
  const months = useMemo(() => getMonthsArray(startDate, monthsCount), [minDate, monthsCount]);
63
66
  const monthItemHeights = useMemo(() => getMonthItemHeights(months, rest.weekStartsOn, COLUMN_COUNT, rowHeight * rootFontSize, BASE_MONTH_ITEM_HEIGHT * rootFontSize), [rootFontSize, months, rest.weekStartsOn]);
64
67
  useEffect(() => {
@@ -67,8 +70,35 @@ const BpkScrollableCalendarGridList = props => {
67
70
  listRef.current.resetAfterIndex(0);
68
71
  }
69
72
  }, [monthItemHeights]);
73
+ useEffect(() => {
74
+ // Some browsers apply font scaling at the rendering level without updating getComputedStyle.
75
+ // A sentinel element sized to 1rem lets us measure the true rendered px-per-rem directly,
76
+ // so that react-window item heights stay accurate regardless of browser font scaling.
77
+ const sentinel = sentinelRef.current;
78
+ if (!sentinel || typeof ResizeObserver === 'undefined') return undefined;
79
+ const observer = new ResizeObserver(entries => {
80
+ const entry = entries[0];
81
+ if (entry) {
82
+ const newRootFontSize = entry.contentRect.width || DEFAULT_ROOT_FONT_SIZE;
83
+ setRootFontSize(newRootFontSize);
84
+ }
85
+ });
86
+ observer.observe(sentinel);
87
+ return () => observer.disconnect();
88
+ }, []);
70
89
  const getHtmlElement = () => typeof document !== 'undefined' ? document.querySelector('html') : {};
71
90
  const getItemSize = index => monthItemHeights[index] || estimatedMonthItemHeight;
91
+ const calculateOffsetInPixels = numberOfMonths => {
92
+ // The `react-window` API requires the scroll offset to be provided in pixels.
93
+ // Here we use the pre-calculated item heights to find the correct pixel offset
94
+ let result = 0;
95
+ for (let i = 0; i < numberOfMonths; i += 1) {
96
+ result += getItemSize(i);
97
+ }
98
+ return result;
99
+ };
100
+ const date = selectionConfiguration?.type === CALENDAR_SELECTION_TYPE.single ? selectionConfiguration?.date : selectionConfiguration?.startDate;
101
+ const selectedDate = focusedDate || date;
72
102
  const rowRenderer = ({
73
103
  index,
74
104
  style
@@ -85,26 +115,14 @@ const BpkScrollableCalendarGridList = props => {
85
115
  "aria-hidden": index !== 1
86
116
  })
87
117
  });
88
- const calculateOffsetInPixels = numberOfMonths => {
89
- // The `react-window` API requires the scroll offset to be provided in pixels.
90
- // Here we use the pre-calculated item heights to find the correct pixel offset
91
- let result = 0;
92
- for (let i = 0; i < numberOfMonths; i += 1) {
93
- result += getItemSize(i);
94
- }
95
- return result;
96
- };
97
- const onResize = () => {
98
- const newRootFontSize = parseFloat(getComputedStyle(document.documentElement).fontSize) || DEFAULT_ROOT_FONT_SIZE;
99
- setRootFontSize(newRootFontSize);
100
- };
101
- const date = selectionConfiguration?.type === CALENDAR_SELECTION_TYPE.single ? selectionConfiguration?.date : selectionConfiguration?.startDate;
102
- const selectedDate = focusedDate || date;
103
- return /*#__PURE__*/_jsx("div", {
118
+ return /*#__PURE__*/_jsxs("div", {
104
119
  className: getClassName('bpk-scrollable-calendar-grid-list', className),
105
120
  ...getDataComponentAttribute('ScrollableCalendarGridList'),
106
- children: /*#__PURE__*/_jsx(AutoSizer, {
107
- onResize: onResize,
121
+ children: [/*#__PURE__*/_jsx("div", {
122
+ ref: sentinelRef,
123
+ className: getClassName('bpk-scrollable-calendar-grid-list__font-sentinel'),
124
+ "aria-hidden": "true"
125
+ }), /*#__PURE__*/_jsx(AutoSizer, {
108
126
  defaultHeight: estimatedMonthItemHeight,
109
127
  defaultWidth: ESTIMATED_MONTH_ITEM_WIDTH,
110
128
  children: ({
@@ -124,7 +142,7 @@ const BpkScrollableCalendarGridList = props => {
124
142
  ref: listRef,
125
143
  children: rowRenderer
126
144
  })
127
- })
145
+ })]
128
146
  });
129
147
  };
130
148
  export default BpkScrollableCalendarGridList;
@@ -15,4 +15,4 @@
15
15
  * See the License for the specific language governing permissions and
16
16
  * limitations under the License.
17
17
  */
18
- .bpk-scrollable-calendar-grid-list{position:relative;width:100%;height:100%;min-height:26.25rem;overflow-x:hidden;box-sizing:border-box;-ms-overflow-style:-ms-autohiding-scrollbar}
18
+ .bpk-scrollable-calendar-grid-list{position:relative;width:100%;height:100%;min-height:26.25rem;overflow-x:hidden;box-sizing:border-box;-ms-overflow-style:-ms-autohiding-scrollbar}.bpk-scrollable-calendar-grid-list__font-sentinel{position:absolute;visibility:hidden;width:1rem;height:1rem;overflow:hidden;pointer-events:none}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@skyscanner/backpack-web",
3
- "version": "42.0.0",
3
+ "version": "42.1.0",
4
4
  "description": "Backpack Design System web library",
5
5
  "repository": {
6
6
  "type": "git",