@uncinc/uncinc-react-kitchen-sink 2.3.6 → 2.4.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 (104) hide show
  1. package/dist/Context/ViewportContext.js +5 -5
  2. package/dist/components/AbbreviationAnnotation/stories.js +1 -1
  3. package/dist/components/AbbreviationAnnotation/stories.scss +1 -1
  4. package/dist/components/AbbreviationAnnotation/style.scss +0 -2
  5. package/dist/components/Accordion/AccordionItem/index.js +1 -0
  6. package/dist/components/Accordion/stories.js +1 -1
  7. package/dist/components/ApiAutocomplete/stories.js +1 -1
  8. package/dist/components/Button/index.js +11 -7
  9. package/dist/components/Button/stories.js +1 -1
  10. package/dist/components/Cookie/Checkbox/index.js +1 -1
  11. package/dist/components/Cookie/index.js +28 -13
  12. package/dist/components/Cookie/stories.js +16 -16
  13. package/dist/components/Dialog/index.js +89 -0
  14. package/dist/components/Dialog/stories.js +28 -0
  15. package/dist/components/Dialog/style.scss +72 -0
  16. package/dist/components/FontSizeSwitcher/index.js +10 -4
  17. package/dist/components/FontSizeSwitcher/stories.js +1 -1
  18. package/dist/components/Form/Checkbox/index.js +1 -1
  19. package/dist/components/Form/Checkboxes/index.js +1 -1
  20. package/dist/components/Form/Checkboxes/index.test.js +1 -1
  21. package/dist/components/Form/DatePicker/index.js +3 -3
  22. package/dist/components/Form/DateSelect/index.js +3 -4
  23. package/dist/components/Form/DateSelect/stories.js +1 -1
  24. package/dist/components/Form/GenericFormElement/index.js +2 -2
  25. package/dist/components/Form/Number/index.js +1 -1
  26. package/dist/components/Form/SearchField/index.js +2 -2
  27. package/dist/components/Form/Select/Input/index.js +21 -23
  28. package/dist/components/Form/Select/index.js +1 -1
  29. package/dist/components/Form/TextField/index.js +2 -2
  30. package/dist/components/Form/TextField/index.test.js +1 -1
  31. package/dist/components/Form/TextField/stories.js +1 -1
  32. package/dist/components/Form/Textarea/index.js +1 -1
  33. package/dist/components/Hamburger/stories.js +3 -3
  34. package/dist/components/Header/index.js +3 -3
  35. package/dist/components/Header/stories.js +1 -1
  36. package/dist/components/Image/Picture/index.js +0 -1
  37. package/dist/components/Image/stories.js +9 -9
  38. package/dist/components/InlineMenu/index.js +2 -4
  39. package/dist/components/InlineMenu/stories.js +1 -1
  40. package/dist/components/Layout/Container/stories.js +29 -29
  41. package/dist/components/Layout/QuickLayout/stories.js +1 -1
  42. package/dist/components/Lottie/LottieAnimation/index.js +21 -17
  43. package/dist/components/Lottie/LottieAnimationWithMousePosition.js +4 -4
  44. package/dist/components/Lottie/index.js +3 -2
  45. package/dist/components/Lottie/stories.js +1 -1
  46. package/dist/components/MagicLine/index.js +3 -3
  47. package/dist/components/MagicLine/stories.js +4 -4
  48. package/dist/components/NavigationScroll/index.js +8 -11
  49. package/dist/components/NavigationScroll/stories.js +1 -1
  50. package/dist/components/Pagination/index.js +6 -0
  51. package/dist/components/Pagination/stories.js +11 -11
  52. package/dist/components/SearchKit/Facets/ChipFacet/index.js +1 -1
  53. package/dist/components/SearchKit/Facets/ListFacet/index.js +1 -0
  54. package/dist/components/SearchKit/Facets/SelectFacet/index.js +2 -2
  55. package/dist/components/SearchKit/SearchFacets/index.js +1 -3
  56. package/dist/components/SearchKit/SearchField/index.js +4 -4
  57. package/dist/components/SearchKit/SearchPage/index.js +9 -2
  58. package/dist/components/SearchKit/SearchReset/index.js +20 -8
  59. package/dist/components/SearchKit/SearchResults/index.js +10 -6
  60. package/dist/components/SearchKit/SearchSelectedFilters/Filters/CustomValue/index.js +15 -0
  61. package/dist/components/SearchKit/SearchSelectedFilters/Filters/DateRange/index.js +17 -0
  62. package/dist/components/SearchKit/SearchSelectedFilters/Filters/NumericRange/index.js +17 -0
  63. package/dist/components/SearchKit/SearchSelectedFilters/Filters/Value/index.js +19 -0
  64. package/dist/components/SearchKit/SearchSelectedFilters/index.js +30 -23
  65. package/dist/components/SearchKit/SearchSelectedFilters/style.scss +4 -0
  66. package/dist/components/SearchKit/SearchSorting/index.js +1 -1
  67. package/dist/components/SearchKit/index.js +10 -3
  68. package/dist/components/SearchKit/stories.js +83 -77
  69. package/dist/components/Share/index.js +4 -4
  70. package/dist/components/Share/stories.js +1 -1
  71. package/dist/components/Sliders/SliderRelated/index.js +1 -1
  72. package/dist/components/Sliders/SliderRelated/stories.js +13 -13
  73. package/dist/components/Webform/WebformDate/index.js +5 -4
  74. package/dist/components/Webform/WebformNumber/index.js +1 -1
  75. package/dist/components/Webform/WebformTextField/index.js +1 -1
  76. package/dist/components/Webform/stories.actions.js +17 -17
  77. package/dist/components/Webform/stories.checkboxes.js +22 -22
  78. package/dist/components/Webform/stories.checked.js +35 -35
  79. package/dist/components/Webform/stories.container.js +29 -29
  80. package/dist/components/Webform/stories.date.js +17 -17
  81. package/dist/components/Webform/stories.filled.js +35 -35
  82. package/dist/components/Webform/stories.number.js +18 -18
  83. package/dist/components/Webform/stories.radiobuttons.js +22 -22
  84. package/dist/components/Webform/stories.select.js +22 -22
  85. package/dist/components/Webform/stories.textarea.js +1 -1
  86. package/dist/components/Webform/stories.textfield.js +1 -1
  87. package/dist/components/Webform/stories.wizard.js +115 -115
  88. package/dist/components/WysiwygField/index.js +0 -1
  89. package/dist/components/WysiwygField/stories.js +2 -2
  90. package/dist/config/i18next/locales/en.json +4 -0
  91. package/dist/config/i18next/locales/nl.json +7 -0
  92. package/dist/helpers/date.js +8 -0
  93. package/dist/hooks/useBoolean.ts +20 -0
  94. package/dist/hooks/useClickOutside.ts +38 -0
  95. package/dist/hooks/useDialog.ts +29 -0
  96. package/dist/hooks/useDialogHelpers.ts +95 -0
  97. package/dist/hooks/useEscape.ts +26 -0
  98. package/dist/hooks/usePrevious.js +1 -2
  99. package/dist/hooks/useTrapFocus.ts +80 -0
  100. package/dist/index.js +1 -0
  101. package/package.json +39 -17
  102. package/dist/components/Form/SearchField/stories.js +0 -0
  103. package/dist/components/SearchKit/Facets/HierarchicalFilterFacet/index.js +0 -60
  104. package/dist/components/SearchKit/Facets/HierarchicalMenuFacet/index.js +0 -60
@@ -0,0 +1,80 @@
1
+ import { RefObject, useEffect } from 'react';
2
+
3
+ export interface UseTrapFocusOptions<T extends HTMLElement> {
4
+ ref: RefObject<T>;
5
+ isActive?: boolean;
6
+ }
7
+
8
+ /**
9
+ * Helper to trap focus within a certain component,
10
+ * which is useful for canvas menu lists or modals
11
+ */
12
+ export default function useTrapFocus<T extends HTMLElement>(
13
+ options: UseTrapFocusOptions<T>,
14
+ ) {
15
+ const {
16
+ ref,
17
+ isActive = false,
18
+ } = options;
19
+
20
+ useEffect(() => {
21
+ function onKeyDown(e: KeyboardEvent) {
22
+ if (ref.current && isActive) {
23
+ const { first, last } = getFocusableElements(ref.current);
24
+ const isTabPressed = e.key === 'Tab';
25
+
26
+ if (!isTabPressed) {
27
+ return;
28
+ }
29
+
30
+ if (e.shiftKey && document.activeElement === first) {
31
+ if (last) last.focus();
32
+ e.preventDefault();
33
+ return;
34
+ }
35
+
36
+ if (!e.shiftKey && document.activeElement === last) {
37
+ if (first) first.focus();
38
+ e.preventDefault();
39
+ }
40
+ }
41
+ }
42
+
43
+ if (ref.current) {
44
+ ref.current.addEventListener('keydown', onKeyDown);
45
+ }
46
+
47
+ return () => {
48
+ if (ref.current) {
49
+ ref.current.removeEventListener('keydown', onKeyDown);
50
+ }
51
+ };
52
+ }, [ref, isActive]);
53
+
54
+ function getFocusableElements(element: Element) {
55
+ const focusableElementTags = [
56
+ 'a[href]',
57
+ 'area[href]',
58
+ 'button',
59
+ 'input',
60
+ 'textarea',
61
+ 'select',
62
+ 'details',
63
+ '[tabindex]:not([tabindex="-1"])',
64
+ ];
65
+
66
+ const focusableElements = [
67
+ ...element.querySelectorAll(focusableElementTags.join(', ')),
68
+ ].filter(
69
+ (el) => !el.hasAttribute('disabled') && !el.hasAttribute('aria-hidden'),
70
+ ) as HTMLElement[];
71
+
72
+ return {
73
+ focusableElements,
74
+ first: focusableElements.length ? focusableElements[0] : null,
75
+ last: focusableElements.length
76
+ ? focusableElements[focusableElements.length - 1]
77
+ : null,
78
+ } as const;
79
+ }
80
+ }
package/dist/index.js CHANGED
@@ -18,6 +18,7 @@ export { default as Image } from './components/Image';
18
18
  export { default as ImageBackground } from './components/Image/Background';
19
19
  export { default as InlineMenu } from './components/InlineMenu';
20
20
  export { default as Picture } from './components/Image/Picture';
21
+ export { default as Dialog } from './components/Dialog';
21
22
  export { default as Share } from './components/Share';
22
23
  export { default as SliderRelated } from './components/Sliders/SliderRelated';
23
24
  export { default as FormikWrapper } from './components/Form/FormikWrapper';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@uncinc/uncinc-react-kitchen-sink",
3
- "version": "2.3.6",
3
+ "version": "2.4.0",
4
4
  "description": "Default React components that are easily extended.",
5
5
  "author": "uncinc",
6
6
  "license": "MIT",
@@ -22,27 +22,37 @@
22
22
  "access": "public"
23
23
  },
24
24
  "scripts": {
25
+ "stylelint": "stylelint **/*.scss",
26
+ "stylelint:fix": "stylelint --fix **/*.scss",
25
27
  "start": "yarn run storybook",
26
28
  "build": "react-scripts build",
27
29
  "test": "jest",
28
30
  "eject": "react-scripts eject",
29
31
  "prepare": "yarn run publish:npm",
30
- "storybook": "start-storybook -p 9009 -s public",
31
- "build-storybook": "build-storybook -s public && npx sb extract",
32
+ "storybook": "storybook dev -p 6006",
33
+ "build-storybook": "storybook build",
32
34
  "yalc-watch": "nodemon -e js,jsx --ignore dist --exec \"yalc publish && yalc push\"",
33
35
  "publish:npm": "cross-env NODE_ENV=production && rm -rf dist && mkdir dist && npx babel src --out-dir dist --copy-files",
34
- "extract": "sb extract"
36
+ "extract": "sb extract",
37
+ "eslint": "NODE_ENV=development eslint './src/**/*.{js,jsx,ts,tsx}'",
38
+ "eslint:fix": "NODE_ENV=development eslint --fix './src/**/*.{js,jsx,ts,tsx}'"
35
39
  },
36
40
  "dependencies": {
37
41
  "@apollo/client": "^3.4.16",
38
42
  "@elastic/datemath": "^5.0.3",
39
- "@elastic/eui": "^40.0.0",
40
43
  "@loadable/component": "^5.15.0",
41
44
  "@searchkit/client": "^3.0.0-canary.45",
42
45
  "@searchkit/elastic-ui": "^3.0.0-canary.45",
46
+ "@types/jest": "^29.5.1",
47
+ "@types/node": "^20.1.0",
48
+ "@types/react": "^18.2.6",
49
+ "@types/react-dom": "^18.2.4",
50
+ "@types/react-router": "^5.1.20",
51
+ "@types/webpack-env": "^1.18.0",
43
52
  "@uncinc/react-drupal-core": "^2.3.4",
44
53
  "apollo-server-micro": "^3.4.0",
45
54
  "bootstrap": "^4",
55
+ "eslint-webpack-plugin": "^2",
46
56
  "fork-ts-checker-webpack-plugin-alt": "0.4.14",
47
57
  "formik": "^2.2.6",
48
58
  "graphql": "^15.7.0",
@@ -57,6 +67,7 @@
57
67
  "next-with-apollo": "^5.2.1",
58
68
  "ola": "^1.1.1",
59
69
  "path": "^0.12.7",
70
+ "postcss": "^8.4.24",
60
71
  "react": "^16 || ^17 || ^18",
61
72
  "react-animate-height": "^2.0.23",
62
73
  "react-autosuggest": "^10.0.2",
@@ -69,6 +80,7 @@
69
80
  "react-lazyload": "^3.0.0",
70
81
  "react-paginate": "^7.1.3",
71
82
  "react-redux": "^7.2.4",
83
+ "react-remove-scroll": "^2.5.5",
72
84
  "react-router": "5.2.0",
73
85
  "react-router-dom": "5.2.0",
74
86
  "react-select": "^3.1.0",
@@ -78,7 +90,9 @@
78
90
  "redux": "^4.0.5",
79
91
  "sass": "^1.55.0",
80
92
  "sass-loader": "^8.0.2",
81
- "slick-carousel": "^1.8.1"
93
+ "slick-carousel": "^1.8.1",
94
+ "typescript": "^5.0.4",
95
+ "uuid": "^9.0.0"
82
96
  },
83
97
  "devDependencies": {
84
98
  "@babel/cli": "^7.0.0-beta.44",
@@ -87,30 +101,38 @@
87
101
  "@babel/preset-env": "^7.20.2",
88
102
  "@babel/preset-react": "^7.18.6",
89
103
  "@babel/runtime": "^7.9.6",
90
- "@storybook/addon-actions": "^6.2.8",
91
- "@storybook/addon-info": "^5.3.21",
92
- "@storybook/addon-links": "^6.2.8",
93
- "@storybook/addons": "^6.2.8",
94
- "@storybook/react": "^6.2.8",
95
- "@storybook/theming": "^6.2.8",
104
+ "@storybook/addon-actions": "^7.0.18",
105
+ "@storybook/addon-essentials": "^7.0.18",
106
+ "@storybook/addon-interactions": "^7.0.18",
107
+ "@storybook/addon-links": "^7.0.18",
108
+ "@storybook/addons": "^7.0.18",
109
+ "@storybook/blocks": "^7.0.18",
110
+ "@storybook/preset-create-react-app": "^7.0.18",
111
+ "@storybook/react": "^7.0.18",
112
+ "@storybook/react-webpack5": "^7.0.18",
113
+ "@storybook/testing-library": "^0.0.14-next.2",
114
+ "@storybook/theming": "^7.0.18",
96
115
  "@testing-library/jest-dom": "^4.2.4",
97
116
  "@testing-library/react": "^9.3.2",
98
117
  "@testing-library/user-event": "^7.1.2",
118
+ "@uncinc/eslint-config": "^1.0.5",
119
+ "@uncinc/stylelint-config": "^1.0.2",
99
120
  "babel-jest": "^29.4.3",
121
+ "babel-plugin-named-exports-order": "^0.0.2",
100
122
  "chai": "^4.2.0",
101
123
  "cross-env": "^7.0.2",
102
124
  "enzyme": "^3.11.0",
103
125
  "enzyme-adapter-react-16": "^1.15.2",
104
126
  "jest": "^29.4.3",
105
- "react-scripts": "3.4.1",
127
+ "prop-types": "^15.8.1",
128
+ "react-scripts": "^5.0.1",
106
129
  "react-test-renderer": "^18.2.0",
107
130
  "sinon": "^9.0.2",
108
131
  "sinon-chai": "^3.5.0",
132
+ "storybook": "^7.0.18",
109
133
  "storybook-addon-export-stories": "^1.0.0",
110
- "storybook-react-i18next": "^1.1.3"
111
- },
112
- "eslintConfig": {
113
- "extends": "react-app"
134
+ "storybook-react-i18next": "^1.1.3",
135
+ "webpack": "^5.85.1"
114
136
  },
115
137
  "browserslist": {
116
138
  "production": [
File without changes
@@ -1,60 +0,0 @@
1
- import React, { Fragment, useRef } from 'react';
2
- import { EuiFacetGroup, EuiTitle, EuiFacetButton } from '@elastic/eui';
3
- import { useSearchkit, FilterLink } from '@searchkit/client';
4
- const EntriesList = ({
5
- entries,
6
- loading,
7
- facet
8
- }) => {
9
- console.log('entries', entries);
10
- const api = useSearchkit();
11
- const entriesElements = entries.map(entry => {
12
- const ref = useRef();
13
- return /*#__PURE__*/React.createElement(Fragment, {
14
- key: entry.label
15
- }, /*#__PURE__*/React.createElement(EuiFacetButton, {
16
- style: {
17
- height: '28px',
18
- marginTop: 0,
19
- marginBottom: 0
20
- },
21
- quantity: entry.count,
22
- isSelected: api.isFilterSelected({
23
- identifier: facet.identifier,
24
- value: entry.label,
25
- level: entry.level
26
- }),
27
- isLoading: loading,
28
- onClick: e => {
29
- ref.current.onClick(e);
30
- }
31
- }, /*#__PURE__*/React.createElement(FilterLink, {
32
- ref: ref,
33
- filter: {
34
- identifier: facet.identifier,
35
- value: entry.label,
36
- level: entry.level
37
- }
38
- }, entry.label)), /*#__PURE__*/React.createElement("div", {
39
- style: {
40
- marginLeft: '10px'
41
- }
42
- }, entry.entries && /*#__PURE__*/React.createElement(EntriesList, {
43
- entries: entry.entries,
44
- loading: loading,
45
- facet: facet
46
- })));
47
- });
48
- return /*#__PURE__*/React.createElement(EuiFacetGroup, null, entriesElements);
49
- };
50
- export const HierarchicalFilterFacet = ({
51
- facet,
52
- loading
53
- }) => /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(EuiTitle, {
54
- size: "xxs"
55
- }, /*#__PURE__*/React.createElement("h3", null, facet.label)), /*#__PURE__*/React.createElement(EntriesList, {
56
- entries: facet.entries,
57
- facet: facet,
58
- loading: loading
59
- }));
60
- HierarchicalFilterFacet.DISPLAY = 'HierarchicalFilterFacet';
@@ -1,60 +0,0 @@
1
- import React, { Fragment, useRef } from 'react';
2
- import { EuiFacetGroup, EuiTitle, EuiFacetButton } from '@elastic/eui';
3
- import { useSearchkit, FilterLink } from '@searchkit/client';
4
- const EntriesList = ({
5
- entries,
6
- loading,
7
- facet
8
- }) => {
9
- console.log('entries', entries);
10
- const api = useSearchkit();
11
- const entriesElements = entries.map(entry => {
12
- const ref = useRef();
13
- return /*#__PURE__*/React.createElement(Fragment, {
14
- key: entry.label
15
- }, /*#__PURE__*/React.createElement(EuiFacetButton, {
16
- style: {
17
- height: '28px',
18
- marginTop: 0,
19
- marginBottom: 0
20
- },
21
- quantity: entry.count,
22
- isSelected: api.isFilterSelected({
23
- identifier: facet.identifier,
24
- value: entry.label,
25
- level: entry.level
26
- }),
27
- isLoading: loading,
28
- onClick: e => {
29
- ref.current.onClick(e);
30
- }
31
- }, /*#__PURE__*/React.createElement(FilterLink, {
32
- ref: ref,
33
- filter: {
34
- identifier: facet.identifier,
35
- value: entry.label,
36
- level: entry.level
37
- }
38
- }, entry.label)), /*#__PURE__*/React.createElement("div", {
39
- style: {
40
- marginLeft: '10px'
41
- }
42
- }, entry.entries && /*#__PURE__*/React.createElement(EntriesList, {
43
- entries: entry.entries,
44
- loading: loading,
45
- facet: facet
46
- })));
47
- });
48
- return /*#__PURE__*/React.createElement(EuiFacetGroup, null, entriesElements);
49
- };
50
- export const HierarchicalMenuFacet = ({
51
- facet,
52
- loading
53
- }) => /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(EuiTitle, {
54
- size: "xxs"
55
- }, /*#__PURE__*/React.createElement("h3", null, facet.label)), /*#__PURE__*/React.createElement(EntriesList, {
56
- entries: facet.entries,
57
- facet: facet,
58
- loading: loading
59
- }));
60
- HierarchicalMenuFacet.DISPLAY = 'HierarchicalMenuFacet';