@canonical/react-components 2.14.0 → 2.15.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 (61) hide show
  1. package/dist/components/ScrollableContainer/ScrollableContainer.d.ts +27 -0
  2. package/dist/components/ScrollableContainer/ScrollableContainer.js +51 -0
  3. package/dist/components/ScrollableContainer/ScrollableContainer.scss +7 -0
  4. package/dist/components/ScrollableContainer/ScrollableContainer.stories.d.ts +6 -0
  5. package/dist/components/ScrollableContainer/ScrollableContainer.stories.js +36 -0
  6. package/dist/components/ScrollableContainer/ScrollableContainer.test.d.ts +1 -0
  7. package/dist/components/ScrollableContainer/index.d.ts +2 -0
  8. package/dist/components/ScrollableContainer/index.js +13 -0
  9. package/dist/components/ScrollableTable/ScrollableTable.d.ts +27 -0
  10. package/dist/components/ScrollableTable/ScrollableTable.js +44 -0
  11. package/dist/components/ScrollableTable/ScrollableTable.scss +58 -0
  12. package/dist/components/ScrollableTable/ScrollableTable.stories.d.ts +6 -0
  13. package/dist/components/ScrollableTable/ScrollableTable.stories.js +69 -0
  14. package/dist/components/ScrollableTable/ScrollableTable.test.d.ts +1 -0
  15. package/dist/components/ScrollableTable/index.d.ts +2 -0
  16. package/dist/components/ScrollableTable/index.js +13 -0
  17. package/dist/components/SidePanel/SidePanel.js +1 -1
  18. package/dist/components/TablePagination/TablePagination.scss +6 -6
  19. package/dist/components/TablePagination/TablePagination.stories.d.ts +8 -0
  20. package/dist/components/TablePagination/TablePagination.stories.js +53 -1
  21. package/dist/components/TablePagination/TablePaginationControls/TablePaginationControls.js +7 -4
  22. package/dist/components/TablePagination/utils.d.ts +2 -1
  23. package/dist/components/TablePagination/utils.js +10 -3
  24. package/dist/esm/components/ScrollableContainer/ScrollableContainer.d.ts +27 -0
  25. package/dist/esm/components/ScrollableContainer/ScrollableContainer.js +43 -0
  26. package/dist/esm/components/ScrollableContainer/ScrollableContainer.scss +7 -0
  27. package/dist/esm/components/ScrollableContainer/ScrollableContainer.stories.d.ts +6 -0
  28. package/dist/esm/components/ScrollableContainer/ScrollableContainer.stories.js +29 -0
  29. package/dist/esm/components/ScrollableContainer/ScrollableContainer.test.d.ts +1 -0
  30. package/dist/esm/components/ScrollableContainer/index.d.ts +2 -0
  31. package/dist/esm/components/ScrollableContainer/index.js +1 -0
  32. package/dist/esm/components/ScrollableTable/ScrollableTable.d.ts +27 -0
  33. package/dist/esm/components/ScrollableTable/ScrollableTable.js +37 -0
  34. package/dist/esm/components/ScrollableTable/ScrollableTable.scss +58 -0
  35. package/dist/esm/components/ScrollableTable/ScrollableTable.stories.d.ts +6 -0
  36. package/dist/esm/components/ScrollableTable/ScrollableTable.stories.js +62 -0
  37. package/dist/esm/components/ScrollableTable/ScrollableTable.test.d.ts +1 -0
  38. package/dist/esm/components/ScrollableTable/index.d.ts +2 -0
  39. package/dist/esm/components/ScrollableTable/index.js +1 -0
  40. package/dist/esm/components/SidePanel/SidePanel.js +1 -1
  41. package/dist/esm/components/TablePagination/TablePagination.scss +6 -6
  42. package/dist/esm/components/TablePagination/TablePagination.stories.d.ts +8 -0
  43. package/dist/esm/components/TablePagination/TablePagination.stories.js +52 -0
  44. package/dist/esm/components/TablePagination/TablePaginationControls/TablePaginationControls.js +7 -4
  45. package/dist/esm/components/TablePagination/utils.d.ts +2 -1
  46. package/dist/esm/components/TablePagination/utils.js +10 -3
  47. package/dist/esm/hooks/useId.d.ts +1 -1
  48. package/dist/esm/hooks/useId.js +1 -1
  49. package/dist/esm/hooks/useListener.js +8 -7
  50. package/dist/esm/index.d.ts +5 -1
  51. package/dist/esm/index.js +3 -1
  52. package/dist/esm/utils.d.ts +4 -0
  53. package/dist/esm/utils.js +32 -1
  54. package/dist/hooks/useId.d.ts +1 -1
  55. package/dist/hooks/useId.js +1 -1
  56. package/dist/hooks/useListener.js +8 -7
  57. package/dist/index.d.ts +5 -1
  58. package/dist/index.js +37 -0
  59. package/dist/utils.d.ts +4 -0
  60. package/dist/utils.js +37 -2
  61. package/package.json +2 -2
@@ -7,7 +7,7 @@ exports.useId = void 0;
7
7
  var _react = require("react");
8
8
  var _utils = require("../utils");
9
9
  /**
10
- * @deprecated Code component is deprecated. Use CodeSnippet component or inline `<code>` instead.
10
+ * @deprecated Code component is deprecated. Use useId from React directly instead.
11
11
  */
12
12
  const useId = () => {
13
13
  const id = (0, _react.useId)();
@@ -45,13 +45,14 @@ const useListener = function (targetNode, callback, eventType) {
45
45
  targetNode.addEventListener(eventType, eventListener.current, options);
46
46
  isListening.current = true;
47
47
  }
48
+ return () => {
49
+ // Unattach the listener if the component gets unmounted while
50
+ // listening.
51
+ if (targetNode && eventListener.current && isListening.current) {
52
+ targetNode.removeEventListener(eventType, eventListener.current, options);
53
+ isListening.current = false;
54
+ }
55
+ };
48
56
  }, [callback, eventType, options, previousCallback, previousEventType, previousOptions, previousShouldThrottle, previousTargetNode, shouldListen, shouldThrottle, targetNode, throttle]);
49
- (0, _react.useEffect)(() => () => {
50
- // Unattach the listener if the component gets unmounted while
51
- // listening.
52
- if (targetNode && isListening.current) {
53
- targetNode.removeEventListener(eventType, eventListener.current, options);
54
- }
55
- }, [eventType, targetNode, options]);
56
57
  };
57
58
  exports.useListener = useListener;
package/dist/index.d.ts CHANGED
@@ -44,6 +44,8 @@ export { default as Panel } from "./components/Panel";
44
44
  export { default as PasswordToggle } from "./components/PasswordToggle";
45
45
  export { default as RadioInput } from "./components/RadioInput";
46
46
  export { default as Row } from "./components/Row";
47
+ export { default as ScrollableContainer } from "./components/ScrollableContainer";
48
+ export { default as ScrollableTable } from "./components/ScrollableTable";
47
49
  export { default as SearchAndFilter } from "./components/SearchAndFilter";
48
50
  export { default as SearchBox } from "./components/SearchBox";
49
51
  export { default as Select } from "./components/Select";
@@ -116,6 +118,8 @@ export type { PaginationProps } from "./components/Pagination";
116
118
  export type { PanelProps } from "./components/Panel";
117
119
  export type { RadioInputProps } from "./components/RadioInput";
118
120
  export type { RowProps } from "./components/Row";
121
+ export type { ScrollableTableProps } from "./components/ScrollableTable";
122
+ export type { ScrollableContainerProps } from "./components/ScrollableContainer";
119
123
  export type { SearchAndFilterProps } from "./components/SearchAndFilter";
120
124
  export type { SearchBoxProps } from "./components/SearchBox";
121
125
  export type { SelectProps } from "./components/Select";
@@ -143,7 +147,7 @@ export type { TablePaginationProps } from "./components/TablePagination";
143
147
  export type { CustomSelectProps, CustomSelectDropdownProps, CustomSelectOption, } from "./components/CustomSelect";
144
148
  export { useOnClickOutside, useClickOutside, useId, useListener, useOnEscapePressed, usePagination, usePrevious, usePrefersReducedMotion, useThrottle, useWindowFitment, } from "./hooks";
145
149
  export type { WindowFitment } from "./hooks";
146
- export { isNavigationAnchor, isNavigationButton } from "./utils";
150
+ export { isNavigationAnchor, isNavigationButton, getElementAbsoluteHeight, getAbsoluteHeightBelowById, getParentsBottomSpacing, } from "./utils";
147
151
  export type { ClassName, Headings, PropsWithSpread, SortDirection, SubComponentProps, TSFixMe, ValueOf, } from "./types";
148
152
  export { Theme } from "./enums";
149
153
  export type { UsePortalOptions } from "./external";
package/dist/index.js CHANGED
@@ -63,6 +63,8 @@ var _exportNames = {
63
63
  PasswordToggle: true,
64
64
  RadioInput: true,
65
65
  Row: true,
66
+ ScrollableContainer: true,
67
+ ScrollableTable: true,
66
68
  SearchAndFilter: true,
67
69
  SearchBox: true,
68
70
  Select: true,
@@ -108,6 +110,9 @@ var _exportNames = {
108
110
  useWindowFitment: true,
109
111
  isNavigationAnchor: true,
110
112
  isNavigationButton: true,
113
+ getElementAbsoluteHeight: true,
114
+ getAbsoluteHeightBelowById: true,
115
+ getParentsBottomSpacing: true,
111
116
  Theme: true,
112
117
  usePortal: true
113
118
  };
@@ -417,6 +422,18 @@ Object.defineProperty(exports, "Row", {
417
422
  return _Row.default;
418
423
  }
419
424
  });
425
+ Object.defineProperty(exports, "ScrollableContainer", {
426
+ enumerable: true,
427
+ get: function () {
428
+ return _ScrollableContainer.default;
429
+ }
430
+ });
431
+ Object.defineProperty(exports, "ScrollableTable", {
432
+ enumerable: true,
433
+ get: function () {
434
+ return _ScrollableTable.default;
435
+ }
436
+ });
420
437
  Object.defineProperty(exports, "SearchAndFilter", {
421
438
  enumerable: true,
422
439
  get: function () {
@@ -627,6 +644,24 @@ Object.defineProperty(exports, "failure", {
627
644
  return _NotificationProvider.failure;
628
645
  }
629
646
  });
647
+ Object.defineProperty(exports, "getAbsoluteHeightBelowById", {
648
+ enumerable: true,
649
+ get: function () {
650
+ return _utils.getAbsoluteHeightBelowById;
651
+ }
652
+ });
653
+ Object.defineProperty(exports, "getElementAbsoluteHeight", {
654
+ enumerable: true,
655
+ get: function () {
656
+ return _utils.getElementAbsoluteHeight;
657
+ }
658
+ });
659
+ Object.defineProperty(exports, "getParentsBottomSpacing", {
660
+ enumerable: true,
661
+ get: function () {
662
+ return _utils.getParentsBottomSpacing;
663
+ }
664
+ });
630
665
  Object.defineProperty(exports, "info", {
631
666
  enumerable: true,
632
667
  get: function () {
@@ -804,6 +839,8 @@ var _Panel = _interopRequireDefault(require("./components/Panel"));
804
839
  var _PasswordToggle = _interopRequireDefault(require("./components/PasswordToggle"));
805
840
  var _RadioInput = _interopRequireDefault(require("./components/RadioInput"));
806
841
  var _Row = _interopRequireDefault(require("./components/Row"));
842
+ var _ScrollableContainer = _interopRequireDefault(require("./components/ScrollableContainer"));
843
+ var _ScrollableTable = _interopRequireDefault(require("./components/ScrollableTable"));
807
844
  var _SearchAndFilter = _interopRequireDefault(require("./components/SearchAndFilter"));
808
845
  var _SearchBox = _interopRequireDefault(require("./components/SearchBox"));
809
846
  var _Select = _interopRequireDefault(require("./components/Select"));
package/dist/utils.d.ts CHANGED
@@ -25,3 +25,7 @@ export declare const isNavigationButton: (link: NavLink) => link is NavLinkButto
25
25
  * A typeguard for whether an element is a ReactNode.
26
26
  */
27
27
  export declare const isReactNode: (element: unknown) => element is ReactNode;
28
+ export declare const getElementAbsoluteHeight: (element: HTMLElement) => number;
29
+ export declare const getAbsoluteHeightBelowById: (belowId: string) => number;
30
+ export declare const getParentsBottomSpacing: (element: Element) => number;
31
+ export declare const toFloat: (value: string) => number;
package/dist/utils.js CHANGED
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.isReactNode = exports.isNavigationButton = exports.isNavigationAnchor = exports.highlightSubString = exports.IS_DEV = void 0;
6
+ exports.toFloat = exports.isReactNode = exports.isNavigationButton = exports.isNavigationAnchor = exports.highlightSubString = exports.getParentsBottomSpacing = exports.getElementAbsoluteHeight = exports.getAbsoluteHeightBelowById = exports.IS_DEV = void 0;
7
7
  var _react = require("react");
8
8
  const IS_DEV = exports.IS_DEV = process.env.NODE_ENV === "development";
9
9
 
@@ -48,4 +48,39 @@ const isNavigationButton = link => !link.url;
48
48
  */
49
49
  exports.isNavigationButton = isNavigationButton;
50
50
  const isReactNode = element => /*#__PURE__*/(0, _react.isValidElement)(element);
51
- exports.isReactNode = isReactNode;
51
+ exports.isReactNode = isReactNode;
52
+ const getElementAbsoluteHeight = element => {
53
+ if (!element) {
54
+ return 0;
55
+ }
56
+ const style = window.getComputedStyle(element);
57
+ const margin = toFloat(style.marginTop) + toFloat(style.marginBottom);
58
+ const padding = toFloat(style.paddingTop) + toFloat(style.paddingBottom);
59
+ return element.offsetHeight + margin + padding + 1;
60
+ };
61
+ exports.getElementAbsoluteHeight = getElementAbsoluteHeight;
62
+ const getAbsoluteHeightBelowById = belowId => {
63
+ const element = belowId ? document.getElementById(belowId) : undefined;
64
+ if (!element) {
65
+ return 0;
66
+ }
67
+ return getElementAbsoluteHeight(element);
68
+ };
69
+ exports.getAbsoluteHeightBelowById = getAbsoluteHeightBelowById;
70
+ const getParentsBottomSpacing = element => {
71
+ let sum = 0;
72
+ while (element.parentElement) {
73
+ element = element.parentElement;
74
+ const style = window.getComputedStyle(element);
75
+ const margin = toFloat(style.marginBottom);
76
+ const padding = toFloat(style.paddingBottom);
77
+ sum += margin + padding;
78
+ }
79
+ return sum;
80
+ };
81
+ exports.getParentsBottomSpacing = getParentsBottomSpacing;
82
+ const toFloat = value => {
83
+ const result = parseFloat(value);
84
+ return Number.isNaN(result) ? 0 : result;
85
+ };
86
+ exports.toFloat = toFloat;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@canonical/react-components",
3
- "version": "2.14.0",
3
+ "version": "2.15.0",
4
4
  "main": "dist/index.js",
5
5
  "module": "dist/index.js",
6
6
  "author": {
@@ -93,7 +93,7 @@
93
93
  "tsc-alias": "1.8.10",
94
94
  "typescript": "5.7.3",
95
95
  "typescript-eslint": "8.24.1",
96
- "vanilla-framework": "4.28.0",
96
+ "vanilla-framework": "4.29.0",
97
97
  "wait-on": "8.0.2",
98
98
  "webpack": "5.98.0"
99
99
  },