@wordpress/components 27.1.0 → 27.3.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 (223) hide show
  1. package/CHANGELOG.md +53 -3
  2. package/README.md +13 -0
  3. package/build/button/index.js +3 -4
  4. package/build/button/index.js.map +1 -1
  5. package/build/button/types.js.map +1 -1
  6. package/build/color-picker/component.js +2 -12
  7. package/build/color-picker/component.js.map +1 -1
  8. package/build/color-picker/picker.js +18 -77
  9. package/build/color-picker/picker.js.map +1 -1
  10. package/build/color-picker/types.js.map +1 -1
  11. package/build/custom-select-control-v2/default-component/index.js +4 -2
  12. package/build/custom-select-control-v2/default-component/index.js.map +1 -1
  13. package/build/custom-select-control-v2/index.js +1 -8
  14. package/build/custom-select-control-v2/index.js.map +1 -1
  15. package/build/custom-select-control-v2/{custom-select-item.js → item.js} +2 -1
  16. package/build/custom-select-control-v2/{custom-select-item.js.map → item.js.map} +1 -1
  17. package/build/custom-select-control-v2/legacy-component/index.js +5 -5
  18. package/build/custom-select-control-v2/legacy-component/index.js.map +1 -1
  19. package/build/date-time/date/styles.js +7 -7
  20. package/build/date-time/date/styles.js.map +1 -1
  21. package/build/form-token-field/index.js +1 -1
  22. package/build/form-token-field/index.js.map +1 -1
  23. package/build/input-control/index.js +1 -1
  24. package/build/input-control/index.js.map +1 -1
  25. package/build/input-control/input-field.js +2 -1
  26. package/build/input-control/input-field.js.map +1 -1
  27. package/build/mobile/color-settings/palette.screen.native.js +1 -0
  28. package/build/mobile/color-settings/palette.screen.native.js.map +1 -1
  29. package/build/navigable-container/container.js.map +1 -1
  30. package/build/navigator/navigator-provider/component.js +162 -120
  31. package/build/navigator/navigator-provider/component.js.map +1 -1
  32. package/build/navigator/navigator-screen/component.js +2 -2
  33. package/build/navigator/navigator-screen/component.js.map +1 -1
  34. package/build/palette-edit/index.js +18 -12
  35. package/build/palette-edit/index.js.map +1 -1
  36. package/build/popover/index.js +7 -34
  37. package/build/popover/index.js.map +1 -1
  38. package/build/range-control/styles/range-control-styles.js +29 -29
  39. package/build/range-control/styles/range-control-styles.js.map +1 -1
  40. package/build/text-control/types.js.map +1 -1
  41. package/build/toggle-group-control/toggle-group-control-option-base/component.js +5 -2
  42. package/build/toggle-group-control/toggle-group-control-option-base/component.js.map +1 -1
  43. package/build/tools-panel/tools-panel-header/component.js +1 -1
  44. package/build/tools-panel/tools-panel-header/component.js.map +1 -1
  45. package/build/utils/config-values.js +1 -1
  46. package/build/utils/config-values.js.map +1 -1
  47. package/build/utils/input/base.js +2 -2
  48. package/build/utils/input/base.js.map +1 -1
  49. package/build-module/button/index.js +3 -4
  50. package/build-module/button/index.js.map +1 -1
  51. package/build-module/button/types.js.map +1 -1
  52. package/build-module/color-picker/component.js +3 -13
  53. package/build-module/color-picker/component.js.map +1 -1
  54. package/build-module/color-picker/picker.js +19 -78
  55. package/build-module/color-picker/picker.js.map +1 -1
  56. package/build-module/color-picker/types.js.map +1 -1
  57. package/build-module/custom-select-control-v2/default-component/index.js +4 -2
  58. package/build-module/custom-select-control-v2/default-component/index.js.map +1 -1
  59. package/build-module/custom-select-control-v2/index.js +1 -2
  60. package/build-module/custom-select-control-v2/index.js.map +1 -1
  61. package/build-module/custom-select-control-v2/{custom-select-item.js → item.js} +2 -1
  62. package/build-module/custom-select-control-v2/{custom-select-item.js.map → item.js.map} +1 -1
  63. package/build-module/custom-select-control-v2/legacy-component/index.js +4 -4
  64. package/build-module/custom-select-control-v2/legacy-component/index.js.map +1 -1
  65. package/build-module/date-time/date/styles.js +7 -7
  66. package/build-module/date-time/date/styles.js.map +1 -1
  67. package/build-module/form-token-field/index.js +1 -1
  68. package/build-module/form-token-field/index.js.map +1 -1
  69. package/build-module/input-control/index.js +1 -1
  70. package/build-module/input-control/index.js.map +1 -1
  71. package/build-module/input-control/input-field.js +2 -1
  72. package/build-module/input-control/input-field.js.map +1 -1
  73. package/build-module/mobile/color-settings/palette.screen.native.js +1 -0
  74. package/build-module/mobile/color-settings/palette.screen.native.js.map +1 -1
  75. package/build-module/navigable-container/container.js.map +1 -1
  76. package/build-module/navigator/navigator-provider/component.js +163 -121
  77. package/build-module/navigator/navigator-provider/component.js.map +1 -1
  78. package/build-module/navigator/navigator-screen/component.js +2 -2
  79. package/build-module/navigator/navigator-screen/component.js.map +1 -1
  80. package/build-module/palette-edit/index.js +17 -11
  81. package/build-module/palette-edit/index.js.map +1 -1
  82. package/build-module/popover/index.js +9 -36
  83. package/build-module/popover/index.js.map +1 -1
  84. package/build-module/range-control/styles/range-control-styles.js +29 -29
  85. package/build-module/range-control/styles/range-control-styles.js.map +1 -1
  86. package/build-module/text-control/types.js.map +1 -1
  87. package/build-module/toggle-group-control/toggle-group-control-option-base/component.js +6 -3
  88. package/build-module/toggle-group-control/toggle-group-control-option-base/component.js.map +1 -1
  89. package/build-module/tools-panel/tools-panel-header/component.js +1 -1
  90. package/build-module/tools-panel/tools-panel-header/component.js.map +1 -1
  91. package/build-module/utils/config-values.js +1 -1
  92. package/build-module/utils/config-values.js.map +1 -1
  93. package/build-module/utils/input/base.js +2 -2
  94. package/build-module/utils/input/base.js.map +1 -1
  95. package/build-style/style-rtl.css +26 -29
  96. package/build-style/style.css +26 -29
  97. package/build-types/box-control/styles/box-control-styles.d.ts +1 -1
  98. package/build-types/button/deprecated.d.ts +4 -10
  99. package/build-types/button/deprecated.d.ts.map +1 -1
  100. package/build-types/button/index.d.ts +3 -3
  101. package/build-types/button/index.d.ts.map +1 -1
  102. package/build-types/button/stories/e2e/index.story.d.ts +1 -1
  103. package/build-types/button/stories/e2e/index.story.d.ts.map +1 -1
  104. package/build-types/button/stories/index.story.d.ts +7 -7
  105. package/build-types/button/stories/index.story.d.ts.map +1 -1
  106. package/build-types/button/types.d.ts +37 -8
  107. package/build-types/button/types.d.ts.map +1 -1
  108. package/build-types/color-picker/component.d.ts.map +1 -1
  109. package/build-types/color-picker/picker.d.ts +1 -1
  110. package/build-types/color-picker/picker.d.ts.map +1 -1
  111. package/build-types/color-picker/styles.d.ts +1 -1
  112. package/build-types/color-picker/types.d.ts +0 -3
  113. package/build-types/color-picker/types.d.ts.map +1 -1
  114. package/build-types/custom-select-control/stories/index.story.d.ts +35 -0
  115. package/build-types/custom-select-control/stories/index.story.d.ts.map +1 -0
  116. package/build-types/custom-select-control-v2/default-component/index.d.ts +5 -2
  117. package/build-types/custom-select-control-v2/default-component/index.d.ts.map +1 -1
  118. package/build-types/custom-select-control-v2/index.d.ts +1 -2
  119. package/build-types/custom-select-control-v2/index.d.ts.map +1 -1
  120. package/build-types/custom-select-control-v2/{custom-select-item.d.ts → item.d.ts} +4 -1
  121. package/build-types/custom-select-control-v2/item.d.ts.map +1 -0
  122. package/build-types/custom-select-control-v2/legacy-component/index.d.ts +2 -2
  123. package/build-types/custom-select-control-v2/legacy-component/index.d.ts.map +1 -1
  124. package/build-types/custom-select-control-v2/stories/default.story.d.ts +2 -2
  125. package/build-types/custom-select-control-v2/stories/default.story.d.ts.map +1 -1
  126. package/build-types/custom-select-control-v2/stories/legacy.story.d.ts +4 -2
  127. package/build-types/custom-select-control-v2/stories/legacy.story.d.ts.map +1 -1
  128. package/build-types/date-time/date/styles.d.ts +1 -1
  129. package/build-types/dropdown/stories/index.story.d.ts +1 -0
  130. package/build-types/dropdown/stories/index.story.d.ts.map +1 -1
  131. package/build-types/font-size-picker/styles.d.ts +1 -1
  132. package/build-types/form-token-field/index.d.ts +1 -1
  133. package/build-types/input-control/index.d.ts +1 -1
  134. package/build-types/input-control/input-field.d.ts.map +1 -1
  135. package/build-types/input-control/stories/index.story.d.ts.map +1 -1
  136. package/build-types/navigation/styles/navigation-styles.d.ts +1 -1
  137. package/build-types/navigator/navigator-back-button/component.d.ts +0 -1
  138. package/build-types/navigator/navigator-back-button/component.d.ts.map +1 -1
  139. package/build-types/navigator/navigator-back-button/hook.d.ts +1 -2
  140. package/build-types/navigator/navigator-back-button/hook.d.ts.map +1 -1
  141. package/build-types/navigator/navigator-button/component.d.ts +0 -1
  142. package/build-types/navigator/navigator-button/component.d.ts.map +1 -1
  143. package/build-types/navigator/navigator-button/hook.d.ts +1 -2
  144. package/build-types/navigator/navigator-button/hook.d.ts.map +1 -1
  145. package/build-types/navigator/navigator-provider/component.d.ts.map +1 -1
  146. package/build-types/navigator/navigator-screen/component.d.ts.map +1 -1
  147. package/build-types/navigator/navigator-to-parent-button/component.d.ts +0 -1
  148. package/build-types/navigator/navigator-to-parent-button/component.d.ts.map +1 -1
  149. package/build-types/number-control/styles/number-control-styles.d.ts +1 -1
  150. package/build-types/palette-edit/index.d.ts +6 -3
  151. package/build-types/palette-edit/index.d.ts.map +1 -1
  152. package/build-types/palette-edit/styles.d.ts +2 -2
  153. package/build-types/popover/index.d.ts.map +1 -1
  154. package/build-types/text-control/index.d.ts +1 -1
  155. package/build-types/text-control/types.d.ts +1 -1
  156. package/build-types/text-control/types.d.ts.map +1 -1
  157. package/build-types/toggle-group-control/toggle-group-control-option-base/component.d.ts.map +1 -1
  158. package/build-types/toolbar/toolbar-button/index.d.ts +4 -10
  159. package/build-types/toolbar/toolbar-button/index.d.ts.map +1 -1
  160. package/package.json +21 -21
  161. package/src/button/index.tsx +3 -4
  162. package/src/button/test/index.tsx +6 -6
  163. package/src/button/types.ts +37 -9
  164. package/src/color-picker/component.tsx +3 -25
  165. package/src/color-picker/picker.tsx +12 -96
  166. package/src/color-picker/types.ts +0 -3
  167. package/src/confirm-dialog/README.md +7 -0
  168. package/src/custom-select-control/stories/{index.story.js → index.story.tsx} +8 -3
  169. package/src/custom-select-control/test/index.js +24 -0
  170. package/src/custom-select-control-v2/README.md +27 -27
  171. package/src/custom-select-control-v2/default-component/index.tsx +5 -2
  172. package/src/custom-select-control-v2/index.tsx +1 -2
  173. package/src/custom-select-control-v2/{custom-select-item.tsx → item.tsx} +2 -0
  174. package/src/custom-select-control-v2/legacy-component/index.tsx +4 -6
  175. package/src/custom-select-control-v2/legacy-component/test/index.tsx +13 -10
  176. package/src/custom-select-control-v2/stories/default.story.tsx +16 -17
  177. package/src/custom-select-control-v2/stories/legacy.story.tsx +20 -35
  178. package/src/custom-select-control-v2/test/index.tsx +26 -16
  179. package/src/date-time/date/styles.ts +2 -2
  180. package/src/dimension-control/test/__snapshots__/index.test.js.snap +4 -4
  181. package/src/dropdown/stories/index.story.tsx +19 -0
  182. package/src/dropdown/style.scss +26 -0
  183. package/src/dropdown-menu/style.scss +0 -25
  184. package/src/flex/flex/README.md +2 -2
  185. package/src/form-token-field/README.md +1 -1
  186. package/src/form-token-field/index.tsx +1 -1
  187. package/src/grid/README.md +11 -11
  188. package/src/h-stack/README.md +6 -6
  189. package/src/heading/README.md +1 -1
  190. package/src/heading/test/__snapshots__/index.tsx.snap +3 -3
  191. package/src/input-control/README.md +1 -1
  192. package/src/input-control/index.tsx +1 -1
  193. package/src/input-control/input-field.tsx +2 -1
  194. package/src/input-control/stories/index.story.tsx +1 -0
  195. package/src/item-group/test/__snapshots__/index.js.snap +11 -11
  196. package/src/mobile/bottom-sheet-select-control/README.md +1 -1
  197. package/src/mobile/color-settings/palette.screen.native.js +5 -1
  198. package/src/navigable-container/container.tsx +1 -1
  199. package/src/navigator/navigator-provider/component.tsx +187 -188
  200. package/src/navigator/navigator-screen/component.tsx +2 -4
  201. package/src/palette-edit/index.tsx +21 -21
  202. package/src/palette-edit/test/index.tsx +21 -17
  203. package/src/placeholder/style.scss +5 -1
  204. package/src/popover/index.tsx +59 -99
  205. package/src/popover/style.scss +0 -9
  206. package/src/progress-bar/README.md +1 -1
  207. package/src/radio-control/README.md +3 -3
  208. package/src/range-control/styles/range-control-styles.ts +1 -1
  209. package/src/resizable-box/resize-tooltip/README.md +2 -2
  210. package/src/text/test/__snapshots__/index.tsx.snap +3 -3
  211. package/src/text-control/style.scss +2 -0
  212. package/src/text-control/types.ts +12 -1
  213. package/src/toggle-group-control/test/__snapshots__/index.tsx.snap +14 -10
  214. package/src/toggle-group-control/toggle-group-control-option-base/component.tsx +14 -12
  215. package/src/toolbar/toolbar/style.scss +1 -1
  216. package/src/tools-panel/tools-panel-header/component.tsx +1 -1
  217. package/src/truncate/README.md +5 -5
  218. package/src/utils/config-values.js +1 -1
  219. package/src/utils/input/base.js +1 -1
  220. package/src/v-stack/README.md +6 -6
  221. package/tsconfig.json +1 -0
  222. package/tsconfig.tsbuildinfo +1 -1
  223. package/build-types/custom-select-control-v2/custom-select-item.d.ts.map +0 -1
@@ -6,7 +6,7 @@ import { createElement } from "react";
6
6
  /**
7
7
  * WordPress dependencies
8
8
  */
9
- import { useMemo, useState, useCallback, useReducer, useRef, useEffect } from '@wordpress/element';
9
+ import { useMemo, useReducer } from '@wordpress/element';
10
10
  import isShallowEqual from '@wordpress/is-shallow-equal';
11
11
 
12
12
  /**
@@ -20,14 +20,127 @@ import { View } from '../../view';
20
20
  import { NavigatorContext } from '../context';
21
21
  import * as styles from '../styles';
22
22
  const MAX_HISTORY_LENGTH = 50;
23
- function screensReducer(state = [], action) {
23
+ function addScreen({
24
+ screens
25
+ }, screen) {
26
+ return [...screens, screen];
27
+ }
28
+ function removeScreen({
29
+ screens
30
+ }, screen) {
31
+ return screens.filter(s => s.id !== screen.id);
32
+ }
33
+ function goBack({
34
+ locationHistory
35
+ }) {
36
+ if (locationHistory.length <= 1) {
37
+ return locationHistory;
38
+ }
39
+ return [...locationHistory.slice(0, -2), {
40
+ ...locationHistory[locationHistory.length - 2],
41
+ isBack: true,
42
+ hasRestoredFocus: false
43
+ }];
44
+ }
45
+ function goTo(state, path, options = {}) {
46
+ const {
47
+ locationHistory
48
+ } = state;
49
+ const {
50
+ focusTargetSelector,
51
+ isBack = false,
52
+ skipFocus = false,
53
+ replace = false,
54
+ ...restOptions
55
+ } = options;
56
+ const isNavigatingToPreviousPath = isBack && locationHistory.length > 1 && locationHistory[locationHistory.length - 2].path === path;
57
+ if (isNavigatingToPreviousPath) {
58
+ return goBack(state);
59
+ }
60
+ const newLocation = {
61
+ ...restOptions,
62
+ path,
63
+ isBack,
64
+ hasRestoredFocus: false,
65
+ skipFocus
66
+ };
67
+ if (locationHistory.length === 0) {
68
+ return replace ? [] : [newLocation];
69
+ }
70
+ const newLocationHistory = locationHistory.slice(locationHistory.length > MAX_HISTORY_LENGTH - 1 ? 1 : 0, -1);
71
+ if (!replace) {
72
+ newLocationHistory.push(
73
+ // Assign `focusTargetSelector` to the previous location in history
74
+ // (the one we just navigated from).
75
+ {
76
+ ...locationHistory[locationHistory.length - 1],
77
+ focusTargetSelector
78
+ });
79
+ }
80
+ newLocationHistory.push(newLocation);
81
+ return newLocationHistory;
82
+ }
83
+ function goToParent(state, options = {}) {
84
+ const {
85
+ locationHistory,
86
+ screens
87
+ } = state;
88
+ const currentPath = locationHistory[locationHistory.length - 1].path;
89
+ if (currentPath === undefined) {
90
+ return locationHistory;
91
+ }
92
+ const parentPath = findParent(currentPath, screens);
93
+ if (parentPath === undefined) {
94
+ return locationHistory;
95
+ }
96
+ return goTo(state, parentPath, {
97
+ ...options,
98
+ isBack: true
99
+ });
100
+ }
101
+ function routerReducer(state, action) {
102
+ let {
103
+ screens,
104
+ locationHistory,
105
+ matchedPath
106
+ } = state;
24
107
  switch (action.type) {
25
108
  case 'add':
26
- return [...state, action.screen];
109
+ screens = addScreen(state, action.screen);
110
+ break;
27
111
  case 'remove':
28
- return state.filter(s => s.id !== action.screen.id);
112
+ screens = removeScreen(state, action.screen);
113
+ break;
114
+ case 'goback':
115
+ locationHistory = goBack(state);
116
+ break;
117
+ case 'goto':
118
+ locationHistory = goTo(state, action.path, action.options);
119
+ break;
120
+ case 'gotoparent':
121
+ locationHistory = goToParent(state, action.options);
122
+ break;
123
+ }
124
+
125
+ // Return early in case there is no change
126
+ if (screens === state.screens && locationHistory === state.locationHistory) {
127
+ return state;
29
128
  }
30
- return state;
129
+
130
+ // Compute the matchedPath
131
+ const currentPath = locationHistory.length > 0 ? locationHistory[locationHistory.length - 1].path : undefined;
132
+ matchedPath = currentPath !== undefined ? patternMatch(currentPath, screens) : undefined;
133
+
134
+ // If the new match is the same as the previous match,
135
+ // return the previous one to keep immutability.
136
+ if (matchedPath && state.matchedPath && matchedPath.id === state.matchedPath.id && isShallowEqual(matchedPath.params, state.matchedPath.params)) {
137
+ matchedPath = state.matchedPath;
138
+ }
139
+ return {
140
+ screens,
141
+ locationHistory,
142
+ matchedPath
143
+ };
31
144
  }
32
145
  function UnconnectedNavigatorProvider(props, forwardedRef) {
33
146
  const {
@@ -36,124 +149,53 @@ function UnconnectedNavigatorProvider(props, forwardedRef) {
36
149
  className,
37
150
  ...otherProps
38
151
  } = useContextSystem(props, 'NavigatorProvider');
39
- const [locationHistory, setLocationHistory] = useState([{
40
- path: initialPath
41
- }]);
42
- const currentLocationHistory = useRef([]);
43
- const [screens, dispatch] = useReducer(screensReducer, []);
44
- const currentScreens = useRef([]);
45
- useEffect(() => {
46
- currentScreens.current = screens;
47
- }, [screens]);
48
- useEffect(() => {
49
- currentLocationHistory.current = locationHistory;
50
- }, [locationHistory]);
51
- const currentMatch = useRef();
52
- const matchedPath = useMemo(() => {
53
- let currentPath;
54
- if (locationHistory.length === 0 || (currentPath = locationHistory[locationHistory.length - 1].path) === undefined) {
55
- currentMatch.current = undefined;
56
- return undefined;
57
- }
58
- const resolvePath = path => {
59
- const newMatch = patternMatch(path, screens);
152
+ const [routerState, dispatch] = useReducer(routerReducer, initialPath, path => ({
153
+ screens: [],
154
+ locationHistory: [{
155
+ path
156
+ }],
157
+ matchedPath: undefined
158
+ }));
60
159
 
61
- // If the new match is the same as the current match,
62
- // return the previous one for performance reasons.
63
- if (currentMatch.current && newMatch && isShallowEqual(newMatch.params, currentMatch.current.params) && newMatch.id === currentMatch.current.id) {
64
- return currentMatch.current;
65
- }
66
- return newMatch;
67
- };
68
- const newMatch = resolvePath(currentPath);
69
- currentMatch.current = newMatch;
70
- return newMatch;
71
- }, [screens, locationHistory]);
72
- const addScreen = useCallback(screen => dispatch({
73
- type: 'add',
74
- screen
160
+ // The methods are constant forever, create stable references to them.
161
+ const methods = useMemo(() => ({
162
+ goBack: () => dispatch({
163
+ type: 'goback'
164
+ }),
165
+ goTo: (path, options) => dispatch({
166
+ type: 'goto',
167
+ path,
168
+ options
169
+ }),
170
+ goToParent: options => dispatch({
171
+ type: 'gotoparent',
172
+ options
173
+ }),
174
+ addScreen: screen => dispatch({
175
+ type: 'add',
176
+ screen
177
+ }),
178
+ removeScreen: screen => dispatch({
179
+ type: 'remove',
180
+ screen
181
+ })
75
182
  }), []);
76
- const removeScreen = useCallback(screen => dispatch({
77
- type: 'remove',
78
- screen
79
- }), []);
80
- const goBack = useCallback(() => {
81
- setLocationHistory(prevLocationHistory => {
82
- if (prevLocationHistory.length <= 1) {
83
- return prevLocationHistory;
84
- }
85
- return [...prevLocationHistory.slice(0, -2), {
86
- ...prevLocationHistory[prevLocationHistory.length - 2],
87
- isBack: true,
88
- hasRestoredFocus: false
89
- }];
90
- });
91
- }, []);
92
- const goTo = useCallback((path, options = {}) => {
93
- const {
94
- focusTargetSelector,
95
- isBack = false,
96
- skipFocus = false,
97
- replace = false,
98
- ...restOptions
99
- } = options;
100
- const isNavigatingToPreviousPath = isBack && currentLocationHistory.current.length > 1 && currentLocationHistory.current[currentLocationHistory.current.length - 2].path === path;
101
- if (isNavigatingToPreviousPath) {
102
- goBack();
103
- return;
104
- }
105
- setLocationHistory(prevLocationHistory => {
106
- const newLocation = {
107
- ...restOptions,
108
- path,
109
- isBack,
110
- hasRestoredFocus: false,
111
- skipFocus
112
- };
113
- if (prevLocationHistory.length === 0) {
114
- return replace ? [] : [newLocation];
115
- }
116
- const newLocationHistory = prevLocationHistory.slice(prevLocationHistory.length > MAX_HISTORY_LENGTH - 1 ? 1 : 0, -1);
117
- if (!replace) {
118
- newLocationHistory.push(
119
- // Assign `focusTargetSelector` to the previous location in history
120
- // (the one we just navigated from).
121
- {
122
- ...prevLocationHistory[prevLocationHistory.length - 1],
123
- focusTargetSelector
124
- });
125
- }
126
- newLocationHistory.push(newLocation);
127
- return newLocationHistory;
128
- });
129
- }, [goBack]);
130
- const goToParent = useCallback((options = {}) => {
131
- const currentPath = currentLocationHistory.current[currentLocationHistory.current.length - 1].path;
132
- if (currentPath === undefined) {
133
- return;
134
- }
135
- const parentPath = findParent(currentPath, currentScreens.current);
136
- if (parentPath === undefined) {
137
- return;
138
- }
139
- goTo(parentPath, {
140
- ...options,
141
- isBack: true
142
- });
143
- }, [goTo]);
144
- const navigatorContextValue = useMemo(() => ({
145
- location: {
146
- ...locationHistory[locationHistory.length - 1],
147
- isInitial: locationHistory.length === 1
148
- },
149
- params: matchedPath ? matchedPath.params : {},
150
- match: matchedPath ? matchedPath.id : undefined,
151
- goTo,
152
- goBack,
153
- goToParent,
154
- addScreen,
155
- removeScreen
156
- }), [locationHistory, matchedPath, goTo, goBack, goToParent, addScreen, removeScreen]);
183
+ const {
184
+ locationHistory,
185
+ matchedPath
186
+ } = routerState;
187
+ const navigatorContextValue = useMemo(() => {
188
+ var _matchedPath$params;
189
+ return {
190
+ location: {
191
+ ...locationHistory[locationHistory.length - 1],
192
+ isInitial: locationHistory.length === 1
193
+ },
194
+ params: (_matchedPath$params = matchedPath?.params) !== null && _matchedPath$params !== void 0 ? _matchedPath$params : {},
195
+ match: matchedPath?.id,
196
+ ...methods
197
+ };
198
+ }, [locationHistory, matchedPath, methods]);
157
199
  const cx = useCx();
158
200
  const classes = useMemo(() => cx(styles.navigatorProviderWrapper, className), [className, cx]);
159
201
  return createElement(View, {
@@ -1 +1 @@
1
- {"version":3,"names":["useMemo","useState","useCallback","useReducer","useRef","useEffect","isShallowEqual","contextConnect","useContextSystem","useCx","patternMatch","findParent","View","NavigatorContext","styles","MAX_HISTORY_LENGTH","screensReducer","state","action","type","screen","filter","s","id","UnconnectedNavigatorProvider","props","forwardedRef","initialPath","children","className","otherProps","locationHistory","setLocationHistory","path","currentLocationHistory","screens","dispatch","currentScreens","current","currentMatch","matchedPath","currentPath","length","undefined","resolvePath","newMatch","params","addScreen","removeScreen","goBack","prevLocationHistory","slice","isBack","hasRestoredFocus","goTo","options","focusTargetSelector","skipFocus","replace","restOptions","isNavigatingToPreviousPath","newLocation","newLocationHistory","push","goToParent","parentPath","navigatorContextValue","location","isInitial","match","cx","classes","navigatorProviderWrapper","createElement","ref","Provider","value","NavigatorProvider"],"sources":["@wordpress/components/src/navigator/navigator-provider/component.tsx"],"sourcesContent":["/**\n * External dependencies\n */\nimport type { ForwardedRef } from 'react';\n\n/**\n * WordPress dependencies\n */\nimport {\n\tuseMemo,\n\tuseState,\n\tuseCallback,\n\tuseReducer,\n\tuseRef,\n\tuseEffect,\n} from '@wordpress/element';\nimport isShallowEqual from '@wordpress/is-shallow-equal';\n\n/**\n * Internal dependencies\n */\nimport type { WordPressComponentProps } from '../../context';\nimport { contextConnect, useContextSystem } from '../../context';\nimport { useCx } from '../../utils/hooks/use-cx';\nimport { patternMatch, findParent } from '../utils/router';\nimport { View } from '../../view';\nimport { NavigatorContext } from '../context';\nimport * as styles from '../styles';\nimport type {\n\tNavigatorProviderProps,\n\tNavigatorLocation,\n\tNavigatorContext as NavigatorContextType,\n\tScreen,\n} from '../types';\n\ntype MatchedPath = ReturnType< typeof patternMatch >;\ntype ScreenAction = { type: string; screen: Screen };\n\nconst MAX_HISTORY_LENGTH = 50;\n\nfunction screensReducer(\n\tstate: Screen[] = [],\n\taction: ScreenAction\n): Screen[] {\n\tswitch ( action.type ) {\n\t\tcase 'add':\n\t\t\treturn [ ...state, action.screen ];\n\t\tcase 'remove':\n\t\t\treturn state.filter( ( s: Screen ) => s.id !== action.screen.id );\n\t}\n\n\treturn state;\n}\n\nfunction UnconnectedNavigatorProvider(\n\tprops: WordPressComponentProps< NavigatorProviderProps, 'div' >,\n\tforwardedRef: ForwardedRef< any >\n) {\n\tconst { initialPath, children, className, ...otherProps } =\n\t\tuseContextSystem( props, 'NavigatorProvider' );\n\n\tconst [ locationHistory, setLocationHistory ] = useState<\n\t\tNavigatorLocation[]\n\t>( [\n\t\t{\n\t\t\tpath: initialPath,\n\t\t},\n\t] );\n\tconst currentLocationHistory = useRef< NavigatorLocation[] >( [] );\n\tconst [ screens, dispatch ] = useReducer( screensReducer, [] );\n\tconst currentScreens = useRef< Screen[] >( [] );\n\tuseEffect( () => {\n\t\tcurrentScreens.current = screens;\n\t}, [ screens ] );\n\tuseEffect( () => {\n\t\tcurrentLocationHistory.current = locationHistory;\n\t}, [ locationHistory ] );\n\tconst currentMatch = useRef< MatchedPath >();\n\tconst matchedPath = useMemo( () => {\n\t\tlet currentPath: string | undefined;\n\t\tif (\n\t\t\tlocationHistory.length === 0 ||\n\t\t\t( currentPath =\n\t\t\t\tlocationHistory[ locationHistory.length - 1 ].path ) ===\n\t\t\t\tundefined\n\t\t) {\n\t\t\tcurrentMatch.current = undefined;\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst resolvePath = ( path: string ) => {\n\t\t\tconst newMatch = patternMatch( path, screens );\n\n\t\t\t// If the new match is the same as the current match,\n\t\t\t// return the previous one for performance reasons.\n\t\t\tif (\n\t\t\t\tcurrentMatch.current &&\n\t\t\t\tnewMatch &&\n\t\t\t\tisShallowEqual(\n\t\t\t\t\tnewMatch.params,\n\t\t\t\t\tcurrentMatch.current.params\n\t\t\t\t) &&\n\t\t\t\tnewMatch.id === currentMatch.current.id\n\t\t\t) {\n\t\t\t\treturn currentMatch.current;\n\t\t\t}\n\n\t\t\treturn newMatch;\n\t\t};\n\n\t\tconst newMatch = resolvePath( currentPath );\n\t\tcurrentMatch.current = newMatch;\n\t\treturn newMatch;\n\t}, [ screens, locationHistory ] );\n\n\tconst addScreen = useCallback(\n\t\t( screen: Screen ) => dispatch( { type: 'add', screen } ),\n\t\t[]\n\t);\n\n\tconst removeScreen = useCallback(\n\t\t( screen: Screen ) => dispatch( { type: 'remove', screen } ),\n\t\t[]\n\t);\n\n\tconst goBack: NavigatorContextType[ 'goBack' ] = useCallback( () => {\n\t\tsetLocationHistory( ( prevLocationHistory ) => {\n\t\t\tif ( prevLocationHistory.length <= 1 ) {\n\t\t\t\treturn prevLocationHistory;\n\t\t\t}\n\t\t\treturn [\n\t\t\t\t...prevLocationHistory.slice( 0, -2 ),\n\t\t\t\t{\n\t\t\t\t\t...prevLocationHistory[ prevLocationHistory.length - 2 ],\n\t\t\t\t\tisBack: true,\n\t\t\t\t\thasRestoredFocus: false,\n\t\t\t\t},\n\t\t\t];\n\t\t} );\n\t}, [] );\n\n\tconst goTo: NavigatorContextType[ 'goTo' ] = useCallback(\n\t\t( path, options = {} ) => {\n\t\t\tconst {\n\t\t\t\tfocusTargetSelector,\n\t\t\t\tisBack = false,\n\t\t\t\tskipFocus = false,\n\t\t\t\treplace = false,\n\t\t\t\t...restOptions\n\t\t\t} = options;\n\n\t\t\tconst isNavigatingToPreviousPath =\n\t\t\t\tisBack &&\n\t\t\t\tcurrentLocationHistory.current.length > 1 &&\n\t\t\t\tcurrentLocationHistory.current[\n\t\t\t\t\tcurrentLocationHistory.current.length - 2\n\t\t\t\t].path === path;\n\n\t\t\tif ( isNavigatingToPreviousPath ) {\n\t\t\t\tgoBack();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tsetLocationHistory( ( prevLocationHistory ) => {\n\t\t\t\tconst newLocation = {\n\t\t\t\t\t...restOptions,\n\t\t\t\t\tpath,\n\t\t\t\t\tisBack,\n\t\t\t\t\thasRestoredFocus: false,\n\t\t\t\t\tskipFocus,\n\t\t\t\t};\n\n\t\t\t\tif ( prevLocationHistory.length === 0 ) {\n\t\t\t\t\treturn replace ? [] : [ newLocation ];\n\t\t\t\t}\n\n\t\t\t\tconst newLocationHistory = prevLocationHistory.slice(\n\t\t\t\t\tprevLocationHistory.length > MAX_HISTORY_LENGTH - 1 ? 1 : 0,\n\t\t\t\t\t-1\n\t\t\t\t);\n\n\t\t\t\tif ( ! replace ) {\n\t\t\t\t\tnewLocationHistory.push(\n\t\t\t\t\t\t// Assign `focusTargetSelector` to the previous location in history\n\t\t\t\t\t\t// (the one we just navigated from).\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t...prevLocationHistory[\n\t\t\t\t\t\t\t\tprevLocationHistory.length - 1\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tfocusTargetSelector,\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tnewLocationHistory.push( newLocation );\n\n\t\t\t\treturn newLocationHistory;\n\t\t\t} );\n\t\t},\n\t\t[ goBack ]\n\t);\n\n\tconst goToParent: NavigatorContextType[ 'goToParent' ] = useCallback(\n\t\t( options = {} ) => {\n\t\t\tconst currentPath =\n\t\t\t\tcurrentLocationHistory.current[\n\t\t\t\t\tcurrentLocationHistory.current.length - 1\n\t\t\t\t].path;\n\t\t\tif ( currentPath === undefined ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst parentPath = findParent(\n\t\t\t\tcurrentPath,\n\t\t\t\tcurrentScreens.current\n\t\t\t);\n\t\t\tif ( parentPath === undefined ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tgoTo( parentPath, { ...options, isBack: true } );\n\t\t},\n\t\t[ goTo ]\n\t);\n\n\tconst navigatorContextValue: NavigatorContextType = useMemo(\n\t\t() => ( {\n\t\t\tlocation: {\n\t\t\t\t...locationHistory[ locationHistory.length - 1 ],\n\t\t\t\tisInitial: locationHistory.length === 1,\n\t\t\t},\n\t\t\tparams: matchedPath ? matchedPath.params : {},\n\t\t\tmatch: matchedPath ? matchedPath.id : undefined,\n\t\t\tgoTo,\n\t\t\tgoBack,\n\t\t\tgoToParent,\n\t\t\taddScreen,\n\t\t\tremoveScreen,\n\t\t} ),\n\t\t[\n\t\t\tlocationHistory,\n\t\t\tmatchedPath,\n\t\t\tgoTo,\n\t\t\tgoBack,\n\t\t\tgoToParent,\n\t\t\taddScreen,\n\t\t\tremoveScreen,\n\t\t]\n\t);\n\n\tconst cx = useCx();\n\tconst classes = useMemo(\n\t\t() => cx( styles.navigatorProviderWrapper, className ),\n\t\t[ className, cx ]\n\t);\n\n\treturn (\n\t\t<View ref={ forwardedRef } className={ classes } { ...otherProps }>\n\t\t\t<NavigatorContext.Provider value={ navigatorContextValue }>\n\t\t\t\t{ children }\n\t\t\t</NavigatorContext.Provider>\n\t\t</View>\n\t);\n}\n\n/**\n * The `NavigatorProvider` component allows rendering nested views/panels/menus\n * (via the `NavigatorScreen` component and navigate between these different\n * view (via the `NavigatorButton` and `NavigatorBackButton` components or the\n * `useNavigator` hook).\n *\n * ```jsx\n * import {\n * __experimentalNavigatorProvider as NavigatorProvider,\n * __experimentalNavigatorScreen as NavigatorScreen,\n * __experimentalNavigatorButton as NavigatorButton,\n * __experimentalNavigatorBackButton as NavigatorBackButton,\n * } from '@wordpress/components';\n *\n * const MyNavigation = () => (\n * <NavigatorProvider initialPath=\"/\">\n * <NavigatorScreen path=\"/\">\n * <p>This is the home screen.</p>\n * <NavigatorButton path=\"/child\">\n * Navigate to child screen.\n * </NavigatorButton>\n * </NavigatorScreen>\n *\n * <NavigatorScreen path=\"/child\">\n * <p>This is the child screen.</p>\n * <NavigatorBackButton>\n * Go back\n * </NavigatorBackButton>\n * </NavigatorScreen>\n * </NavigatorProvider>\n * );\n * ```\n */\nexport const NavigatorProvider = contextConnect(\n\tUnconnectedNavigatorProvider,\n\t'NavigatorProvider'\n);\n\nexport default NavigatorProvider;\n"],"mappings":"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"}
1
+ {"version":3,"names":["useMemo","useReducer","isShallowEqual","contextConnect","useContextSystem","useCx","patternMatch","findParent","View","NavigatorContext","styles","MAX_HISTORY_LENGTH","addScreen","screens","screen","removeScreen","filter","s","id","goBack","locationHistory","length","slice","isBack","hasRestoredFocus","goTo","state","path","options","focusTargetSelector","skipFocus","replace","restOptions","isNavigatingToPreviousPath","newLocation","newLocationHistory","push","goToParent","currentPath","undefined","parentPath","routerReducer","action","matchedPath","type","params","UnconnectedNavigatorProvider","props","forwardedRef","initialPath","children","className","otherProps","routerState","dispatch","methods","navigatorContextValue","_matchedPath$params","location","isInitial","match","cx","classes","navigatorProviderWrapper","createElement","ref","Provider","value","NavigatorProvider"],"sources":["@wordpress/components/src/navigator/navigator-provider/component.tsx"],"sourcesContent":["/**\n * External dependencies\n */\nimport type { ForwardedRef } from 'react';\n\n/**\n * WordPress dependencies\n */\nimport { useMemo, useReducer } from '@wordpress/element';\nimport isShallowEqual from '@wordpress/is-shallow-equal';\n\n/**\n * Internal dependencies\n */\nimport type { WordPressComponentProps } from '../../context';\nimport { contextConnect, useContextSystem } from '../../context';\nimport { useCx } from '../../utils/hooks/use-cx';\nimport { patternMatch, findParent } from '../utils/router';\nimport { View } from '../../view';\nimport { NavigatorContext } from '../context';\nimport * as styles from '../styles';\nimport type {\n\tNavigatorProviderProps,\n\tNavigatorLocation,\n\tNavigatorContext as NavigatorContextType,\n\tNavigateOptions,\n\tScreen,\n\tNavigateToParentOptions,\n} from '../types';\n\ntype MatchedPath = ReturnType< typeof patternMatch >;\n\ntype RouterAction =\n\t| { type: 'add' | 'remove'; screen: Screen }\n\t| { type: 'goback' }\n\t| { type: 'goto'; path: string; options?: NavigateOptions }\n\t| { type: 'gotoparent'; options?: NavigateToParentOptions };\n\ntype RouterState = {\n\tscreens: Screen[];\n\tlocationHistory: NavigatorLocation[];\n\tmatchedPath: MatchedPath;\n};\n\nconst MAX_HISTORY_LENGTH = 50;\n\nfunction addScreen( { screens }: RouterState, screen: Screen ) {\n\treturn [ ...screens, screen ];\n}\n\nfunction removeScreen( { screens }: RouterState, screen: Screen ) {\n\treturn screens.filter( ( s ) => s.id !== screen.id );\n}\n\nfunction goBack( { locationHistory }: RouterState ) {\n\tif ( locationHistory.length <= 1 ) {\n\t\treturn locationHistory;\n\t}\n\treturn [\n\t\t...locationHistory.slice( 0, -2 ),\n\t\t{\n\t\t\t...locationHistory[ locationHistory.length - 2 ],\n\t\t\tisBack: true,\n\t\t\thasRestoredFocus: false,\n\t\t},\n\t];\n}\n\nfunction goTo(\n\tstate: RouterState,\n\tpath: string,\n\toptions: NavigateOptions = {}\n) {\n\tconst { locationHistory } = state;\n\tconst {\n\t\tfocusTargetSelector,\n\t\tisBack = false,\n\t\tskipFocus = false,\n\t\treplace = false,\n\t\t...restOptions\n\t} = options;\n\n\tconst isNavigatingToPreviousPath =\n\t\tisBack &&\n\t\tlocationHistory.length > 1 &&\n\t\tlocationHistory[ locationHistory.length - 2 ].path === path;\n\n\tif ( isNavigatingToPreviousPath ) {\n\t\treturn goBack( state );\n\t}\n\n\tconst newLocation = {\n\t\t...restOptions,\n\t\tpath,\n\t\tisBack,\n\t\thasRestoredFocus: false,\n\t\tskipFocus,\n\t};\n\n\tif ( locationHistory.length === 0 ) {\n\t\treturn replace ? [] : [ newLocation ];\n\t}\n\n\tconst newLocationHistory = locationHistory.slice(\n\t\tlocationHistory.length > MAX_HISTORY_LENGTH - 1 ? 1 : 0,\n\t\t-1\n\t);\n\n\tif ( ! replace ) {\n\t\tnewLocationHistory.push(\n\t\t\t// Assign `focusTargetSelector` to the previous location in history\n\t\t\t// (the one we just navigated from).\n\t\t\t{\n\t\t\t\t...locationHistory[ locationHistory.length - 1 ],\n\t\t\t\tfocusTargetSelector,\n\t\t\t}\n\t\t);\n\t}\n\n\tnewLocationHistory.push( newLocation );\n\n\treturn newLocationHistory;\n}\n\nfunction goToParent(\n\tstate: RouterState,\n\toptions: NavigateToParentOptions = {}\n) {\n\tconst { locationHistory, screens } = state;\n\tconst currentPath = locationHistory[ locationHistory.length - 1 ].path;\n\tif ( currentPath === undefined ) {\n\t\treturn locationHistory;\n\t}\n\tconst parentPath = findParent( currentPath, screens );\n\tif ( parentPath === undefined ) {\n\t\treturn locationHistory;\n\t}\n\treturn goTo( state, parentPath, {\n\t\t...options,\n\t\tisBack: true,\n\t} );\n}\n\nfunction routerReducer(\n\tstate: RouterState,\n\taction: RouterAction\n): RouterState {\n\tlet { screens, locationHistory, matchedPath } = state;\n\n\tswitch ( action.type ) {\n\t\tcase 'add':\n\t\t\tscreens = addScreen( state, action.screen );\n\t\t\tbreak;\n\t\tcase 'remove':\n\t\t\tscreens = removeScreen( state, action.screen );\n\t\t\tbreak;\n\t\tcase 'goback':\n\t\t\tlocationHistory = goBack( state );\n\t\t\tbreak;\n\t\tcase 'goto':\n\t\t\tlocationHistory = goTo( state, action.path, action.options );\n\t\t\tbreak;\n\t\tcase 'gotoparent':\n\t\t\tlocationHistory = goToParent( state, action.options );\n\t\t\tbreak;\n\t}\n\n\t// Return early in case there is no change\n\tif (\n\t\tscreens === state.screens &&\n\t\tlocationHistory === state.locationHistory\n\t) {\n\t\treturn state;\n\t}\n\n\t// Compute the matchedPath\n\tconst currentPath =\n\t\tlocationHistory.length > 0\n\t\t\t? locationHistory[ locationHistory.length - 1 ].path\n\t\t\t: undefined;\n\tmatchedPath =\n\t\tcurrentPath !== undefined\n\t\t\t? patternMatch( currentPath, screens )\n\t\t\t: undefined;\n\n\t// If the new match is the same as the previous match,\n\t// return the previous one to keep immutability.\n\tif (\n\t\tmatchedPath &&\n\t\tstate.matchedPath &&\n\t\tmatchedPath.id === state.matchedPath.id &&\n\t\tisShallowEqual( matchedPath.params, state.matchedPath.params )\n\t) {\n\t\tmatchedPath = state.matchedPath;\n\t}\n\n\treturn { screens, locationHistory, matchedPath };\n}\n\nfunction UnconnectedNavigatorProvider(\n\tprops: WordPressComponentProps< NavigatorProviderProps, 'div' >,\n\tforwardedRef: ForwardedRef< any >\n) {\n\tconst { initialPath, children, className, ...otherProps } =\n\t\tuseContextSystem( props, 'NavigatorProvider' );\n\n\tconst [ routerState, dispatch ] = useReducer(\n\t\trouterReducer,\n\t\tinitialPath,\n\t\t( path ) => ( {\n\t\t\tscreens: [],\n\t\t\tlocationHistory: [ { path } ],\n\t\t\tmatchedPath: undefined,\n\t\t} )\n\t);\n\n\t// The methods are constant forever, create stable references to them.\n\tconst methods = useMemo(\n\t\t() => ( {\n\t\t\tgoBack: () => dispatch( { type: 'goback' } ),\n\t\t\tgoTo: ( path: string, options?: NavigateOptions ) =>\n\t\t\t\tdispatch( { type: 'goto', path, options } ),\n\t\t\tgoToParent: ( options: NavigateToParentOptions | undefined ) =>\n\t\t\t\tdispatch( { type: 'gotoparent', options } ),\n\t\t\taddScreen: ( screen: Screen ) =>\n\t\t\t\tdispatch( { type: 'add', screen } ),\n\t\t\tremoveScreen: ( screen: Screen ) =>\n\t\t\t\tdispatch( { type: 'remove', screen } ),\n\t\t} ),\n\t\t[]\n\t);\n\n\tconst { locationHistory, matchedPath } = routerState;\n\n\tconst navigatorContextValue: NavigatorContextType = useMemo(\n\t\t() => ( {\n\t\t\tlocation: {\n\t\t\t\t...locationHistory[ locationHistory.length - 1 ],\n\t\t\t\tisInitial: locationHistory.length === 1,\n\t\t\t},\n\t\t\tparams: matchedPath?.params ?? {},\n\t\t\tmatch: matchedPath?.id,\n\t\t\t...methods,\n\t\t} ),\n\t\t[ locationHistory, matchedPath, methods ]\n\t);\n\n\tconst cx = useCx();\n\tconst classes = useMemo(\n\t\t() => cx( styles.navigatorProviderWrapper, className ),\n\t\t[ className, cx ]\n\t);\n\n\treturn (\n\t\t<View ref={ forwardedRef } className={ classes } { ...otherProps }>\n\t\t\t<NavigatorContext.Provider value={ navigatorContextValue }>\n\t\t\t\t{ children }\n\t\t\t</NavigatorContext.Provider>\n\t\t</View>\n\t);\n}\n\n/**\n * The `NavigatorProvider` component allows rendering nested views/panels/menus\n * (via the `NavigatorScreen` component and navigate between these different\n * view (via the `NavigatorButton` and `NavigatorBackButton` components or the\n * `useNavigator` hook).\n *\n * ```jsx\n * import {\n * __experimentalNavigatorProvider as NavigatorProvider,\n * __experimentalNavigatorScreen as NavigatorScreen,\n * __experimentalNavigatorButton as NavigatorButton,\n * __experimentalNavigatorBackButton as NavigatorBackButton,\n * } from '@wordpress/components';\n *\n * const MyNavigation = () => (\n * <NavigatorProvider initialPath=\"/\">\n * <NavigatorScreen path=\"/\">\n * <p>This is the home screen.</p>\n * <NavigatorButton path=\"/child\">\n * Navigate to child screen.\n * </NavigatorButton>\n * </NavigatorScreen>\n *\n * <NavigatorScreen path=\"/child\">\n * <p>This is the child screen.</p>\n * <NavigatorBackButton>\n * Go back\n * </NavigatorBackButton>\n * </NavigatorScreen>\n * </NavigatorProvider>\n * );\n * ```\n */\nexport const NavigatorProvider = contextConnect(\n\tUnconnectedNavigatorProvider,\n\t'NavigatorProvider'\n);\n\nexport default NavigatorProvider;\n"],"mappings":"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"}
@@ -84,14 +84,14 @@ function UnconnectedNavigatorScreen(props, forwardedRef) {
84
84
 
85
85
  // When navigating back, if a selector is provided, use it to look for the
86
86
  // target element (assumed to be a node inside the current NavigatorScreen)
87
- if (location.isBack && location?.focusTargetSelector) {
87
+ if (location.isBack && location.focusTargetSelector) {
88
88
  elementToFocus = wrapperRef.current.querySelector(location.focusTargetSelector);
89
89
  }
90
90
 
91
91
  // If the previous query didn't run or find any element to focus, fallback
92
92
  // to the first tabbable element in the screen (or the screen itself).
93
93
  if (!elementToFocus) {
94
- const firstTabbable = focus.tabbable.find(wrapperRef.current)[0];
94
+ const [firstTabbable] = focus.tabbable.find(wrapperRef.current);
95
95
  elementToFocus = firstTabbable !== null && firstTabbable !== void 0 ? firstTabbable : wrapperRef.current;
96
96
  }
97
97
  locationRef.current.hasRestoredFocus = true;
@@ -1 +1 @@
1
- {"version":3,"names":["focus","useContext","useEffect","useMemo","useRef","useId","useMergeRefs","isRTL","isRTLFn","escapeAttribute","contextConnect","useContextSystem","useCx","View","NavigatorContext","styles","UnconnectedNavigatorScreen","props","forwardedRef","screenId","children","className","path","otherProps","location","match","addScreen","removeScreen","isMatch","wrapperRef","screen","id","isInitial","isBack","cx","classes","navigatorScreen","locationRef","current","isInitialLocation","hasRestoredFocus","skipFocus","activeElement","ownerDocument","contains","elementToFocus","focusTargetSelector","querySelector","firstTabbable","tabbable","find","mergedWrapperRef","createElement","ref","NavigatorScreen"],"sources":["@wordpress/components/src/navigator/navigator-screen/component.tsx"],"sourcesContent":["/**\n * External dependencies\n */\nimport type { ForwardedRef } from 'react';\n\n/**\n * WordPress dependencies\n */\nimport { focus } from '@wordpress/dom';\nimport {\n\tuseContext,\n\tuseEffect,\n\tuseMemo,\n\tuseRef,\n\tuseId,\n} from '@wordpress/element';\nimport { useMergeRefs } from '@wordpress/compose';\nimport { isRTL as isRTLFn } from '@wordpress/i18n';\nimport { escapeAttribute } from '@wordpress/escape-html';\n\n/**\n * Internal dependencies\n */\nimport type { WordPressComponentProps } from '../../context';\nimport { contextConnect, useContextSystem } from '../../context';\nimport { useCx } from '../../utils/hooks/use-cx';\nimport { View } from '../../view';\nimport { NavigatorContext } from '../context';\nimport * as styles from '../styles';\nimport type { NavigatorScreenProps } from '../types';\n\nfunction UnconnectedNavigatorScreen(\n\tprops: WordPressComponentProps< NavigatorScreenProps, 'div', false >,\n\tforwardedRef: ForwardedRef< any >\n) {\n\tconst screenId = useId();\n\tconst { children, className, path, ...otherProps } = useContextSystem(\n\t\tprops,\n\t\t'NavigatorScreen'\n\t);\n\n\tconst { location, match, addScreen, removeScreen } =\n\t\tuseContext( NavigatorContext );\n\tconst isMatch = match === screenId;\n\tconst wrapperRef = useRef< HTMLDivElement >( null );\n\n\tuseEffect( () => {\n\t\tconst screen = {\n\t\t\tid: screenId,\n\t\t\tpath: escapeAttribute( path ),\n\t\t};\n\t\taddScreen( screen );\n\t\treturn () => removeScreen( screen );\n\t}, [ screenId, path, addScreen, removeScreen ] );\n\n\tconst isRTL = isRTLFn();\n\tconst { isInitial, isBack } = location;\n\tconst cx = useCx();\n\tconst classes = useMemo(\n\t\t() =>\n\t\t\tcx(\n\t\t\t\tstyles.navigatorScreen( {\n\t\t\t\t\tisInitial,\n\t\t\t\t\tisBack,\n\t\t\t\t\tisRTL,\n\t\t\t\t} ),\n\t\t\t\tclassName\n\t\t\t),\n\t\t[ className, cx, isInitial, isBack, isRTL ]\n\t);\n\n\tconst locationRef = useRef( location );\n\n\tuseEffect( () => {\n\t\tlocationRef.current = location;\n\t}, [ location ] );\n\n\t// Focus restoration\n\tconst isInitialLocation = location.isInitial && ! location.isBack;\n\tuseEffect( () => {\n\t\t// Only attempt to restore focus:\n\t\t// - if the current location is not the initial one (to avoid moving focus on page load)\n\t\t// - when the screen becomes visible\n\t\t// - if the wrapper ref has been assigned\n\t\t// - if focus hasn't already been restored for the current location\n\t\t// - if the `skipFocus` option is not set to `true`. This is useful when we trigger the navigation outside of NavigatorScreen.\n\t\tif (\n\t\t\tisInitialLocation ||\n\t\t\t! isMatch ||\n\t\t\t! wrapperRef.current ||\n\t\t\tlocationRef.current.hasRestoredFocus ||\n\t\t\tlocation.skipFocus\n\t\t) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst activeElement = wrapperRef.current.ownerDocument.activeElement;\n\n\t\t// If an element is already focused within the wrapper do not focus the\n\t\t// element. This prevents inputs or buttons from losing focus unnecessarily.\n\t\tif ( wrapperRef.current.contains( activeElement ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet elementToFocus: HTMLElement | null = null;\n\n\t\t// When navigating back, if a selector is provided, use it to look for the\n\t\t// target element (assumed to be a node inside the current NavigatorScreen)\n\t\tif ( location.isBack && location?.focusTargetSelector ) {\n\t\t\telementToFocus = wrapperRef.current.querySelector(\n\t\t\t\tlocation.focusTargetSelector\n\t\t\t);\n\t\t}\n\n\t\t// If the previous query didn't run or find any element to focus, fallback\n\t\t// to the first tabbable element in the screen (or the screen itself).\n\t\tif ( ! elementToFocus ) {\n\t\t\tconst firstTabbable = (\n\t\t\t\tfocus.tabbable.find( wrapperRef.current ) as HTMLElement[]\n\t\t\t )[ 0 ];\n\t\t\telementToFocus = firstTabbable ?? wrapperRef.current;\n\t\t}\n\n\t\tlocationRef.current.hasRestoredFocus = true;\n\t\telementToFocus.focus();\n\t}, [\n\t\tisInitialLocation,\n\t\tisMatch,\n\t\tlocation.isBack,\n\t\tlocation.focusTargetSelector,\n\t\tlocation.skipFocus,\n\t] );\n\n\tconst mergedWrapperRef = useMergeRefs( [ forwardedRef, wrapperRef ] );\n\n\treturn isMatch ? (\n\t\t<View ref={ mergedWrapperRef } className={ classes } { ...otherProps }>\n\t\t\t{ children }\n\t\t</View>\n\t) : null;\n}\n\n/**\n * The `NavigatorScreen` component represents a single view/screen/panel and\n * should be used in combination with the `NavigatorProvider`, the\n * `NavigatorButton` and the `NavigatorBackButton` components (or the `useNavigator`\n * hook).\n *\n * @example\n * ```jsx\n * import {\n * __experimentalNavigatorProvider as NavigatorProvider,\n * __experimentalNavigatorScreen as NavigatorScreen,\n * __experimentalNavigatorButton as NavigatorButton,\n * __experimentalNavigatorBackButton as NavigatorBackButton,\n * } from '@wordpress/components';\n *\n * const MyNavigation = () => (\n * <NavigatorProvider initialPath=\"/\">\n * <NavigatorScreen path=\"/\">\n * <p>This is the home screen.</p>\n * <NavigatorButton path=\"/child\">\n * Navigate to child screen.\n * </NavigatorButton>\n * </NavigatorScreen>\n *\n * <NavigatorScreen path=\"/child\">\n * <p>This is the child screen.</p>\n * <NavigatorBackButton>\n * Go back\n * </NavigatorBackButton>\n * </NavigatorScreen>\n * </NavigatorProvider>\n * );\n * ```\n */\nexport const NavigatorScreen = contextConnect(\n\tUnconnectedNavigatorScreen,\n\t'NavigatorScreen'\n);\n\nexport default NavigatorScreen;\n"],"mappings":"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"}
1
+ {"version":3,"names":["focus","useContext","useEffect","useMemo","useRef","useId","useMergeRefs","isRTL","isRTLFn","escapeAttribute","contextConnect","useContextSystem","useCx","View","NavigatorContext","styles","UnconnectedNavigatorScreen","props","forwardedRef","screenId","children","className","path","otherProps","location","match","addScreen","removeScreen","isMatch","wrapperRef","screen","id","isInitial","isBack","cx","classes","navigatorScreen","locationRef","current","isInitialLocation","hasRestoredFocus","skipFocus","activeElement","ownerDocument","contains","elementToFocus","focusTargetSelector","querySelector","firstTabbable","tabbable","find","mergedWrapperRef","createElement","ref","NavigatorScreen"],"sources":["@wordpress/components/src/navigator/navigator-screen/component.tsx"],"sourcesContent":["/**\n * External dependencies\n */\nimport type { ForwardedRef } from 'react';\n\n/**\n * WordPress dependencies\n */\nimport { focus } from '@wordpress/dom';\nimport {\n\tuseContext,\n\tuseEffect,\n\tuseMemo,\n\tuseRef,\n\tuseId,\n} from '@wordpress/element';\nimport { useMergeRefs } from '@wordpress/compose';\nimport { isRTL as isRTLFn } from '@wordpress/i18n';\nimport { escapeAttribute } from '@wordpress/escape-html';\n\n/**\n * Internal dependencies\n */\nimport type { WordPressComponentProps } from '../../context';\nimport { contextConnect, useContextSystem } from '../../context';\nimport { useCx } from '../../utils/hooks/use-cx';\nimport { View } from '../../view';\nimport { NavigatorContext } from '../context';\nimport * as styles from '../styles';\nimport type { NavigatorScreenProps } from '../types';\n\nfunction UnconnectedNavigatorScreen(\n\tprops: WordPressComponentProps< NavigatorScreenProps, 'div', false >,\n\tforwardedRef: ForwardedRef< any >\n) {\n\tconst screenId = useId();\n\tconst { children, className, path, ...otherProps } = useContextSystem(\n\t\tprops,\n\t\t'NavigatorScreen'\n\t);\n\n\tconst { location, match, addScreen, removeScreen } =\n\t\tuseContext( NavigatorContext );\n\tconst isMatch = match === screenId;\n\tconst wrapperRef = useRef< HTMLDivElement >( null );\n\n\tuseEffect( () => {\n\t\tconst screen = {\n\t\t\tid: screenId,\n\t\t\tpath: escapeAttribute( path ),\n\t\t};\n\t\taddScreen( screen );\n\t\treturn () => removeScreen( screen );\n\t}, [ screenId, path, addScreen, removeScreen ] );\n\n\tconst isRTL = isRTLFn();\n\tconst { isInitial, isBack } = location;\n\tconst cx = useCx();\n\tconst classes = useMemo(\n\t\t() =>\n\t\t\tcx(\n\t\t\t\tstyles.navigatorScreen( {\n\t\t\t\t\tisInitial,\n\t\t\t\t\tisBack,\n\t\t\t\t\tisRTL,\n\t\t\t\t} ),\n\t\t\t\tclassName\n\t\t\t),\n\t\t[ className, cx, isInitial, isBack, isRTL ]\n\t);\n\n\tconst locationRef = useRef( location );\n\n\tuseEffect( () => {\n\t\tlocationRef.current = location;\n\t}, [ location ] );\n\n\t// Focus restoration\n\tconst isInitialLocation = location.isInitial && ! location.isBack;\n\tuseEffect( () => {\n\t\t// Only attempt to restore focus:\n\t\t// - if the current location is not the initial one (to avoid moving focus on page load)\n\t\t// - when the screen becomes visible\n\t\t// - if the wrapper ref has been assigned\n\t\t// - if focus hasn't already been restored for the current location\n\t\t// - if the `skipFocus` option is not set to `true`. This is useful when we trigger the navigation outside of NavigatorScreen.\n\t\tif (\n\t\t\tisInitialLocation ||\n\t\t\t! isMatch ||\n\t\t\t! wrapperRef.current ||\n\t\t\tlocationRef.current.hasRestoredFocus ||\n\t\t\tlocation.skipFocus\n\t\t) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst activeElement = wrapperRef.current.ownerDocument.activeElement;\n\n\t\t// If an element is already focused within the wrapper do not focus the\n\t\t// element. This prevents inputs or buttons from losing focus unnecessarily.\n\t\tif ( wrapperRef.current.contains( activeElement ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet elementToFocus: HTMLElement | null = null;\n\n\t\t// When navigating back, if a selector is provided, use it to look for the\n\t\t// target element (assumed to be a node inside the current NavigatorScreen)\n\t\tif ( location.isBack && location.focusTargetSelector ) {\n\t\t\telementToFocus = wrapperRef.current.querySelector(\n\t\t\t\tlocation.focusTargetSelector\n\t\t\t);\n\t\t}\n\n\t\t// If the previous query didn't run or find any element to focus, fallback\n\t\t// to the first tabbable element in the screen (or the screen itself).\n\t\tif ( ! elementToFocus ) {\n\t\t\tconst [ firstTabbable ] = focus.tabbable.find( wrapperRef.current );\n\t\t\telementToFocus = firstTabbable ?? wrapperRef.current;\n\t\t}\n\n\t\tlocationRef.current.hasRestoredFocus = true;\n\t\telementToFocus.focus();\n\t}, [\n\t\tisInitialLocation,\n\t\tisMatch,\n\t\tlocation.isBack,\n\t\tlocation.focusTargetSelector,\n\t\tlocation.skipFocus,\n\t] );\n\n\tconst mergedWrapperRef = useMergeRefs( [ forwardedRef, wrapperRef ] );\n\n\treturn isMatch ? (\n\t\t<View ref={ mergedWrapperRef } className={ classes } { ...otherProps }>\n\t\t\t{ children }\n\t\t</View>\n\t) : null;\n}\n\n/**\n * The `NavigatorScreen` component represents a single view/screen/panel and\n * should be used in combination with the `NavigatorProvider`, the\n * `NavigatorButton` and the `NavigatorBackButton` components (or the `useNavigator`\n * hook).\n *\n * @example\n * ```jsx\n * import {\n * __experimentalNavigatorProvider as NavigatorProvider,\n * __experimentalNavigatorScreen as NavigatorScreen,\n * __experimentalNavigatorButton as NavigatorButton,\n * __experimentalNavigatorBackButton as NavigatorBackButton,\n * } from '@wordpress/components';\n *\n * const MyNavigation = () => (\n * <NavigatorProvider initialPath=\"/\">\n * <NavigatorScreen path=\"/\">\n * <p>This is the home screen.</p>\n * <NavigatorButton path=\"/child\">\n * Navigate to child screen.\n * </NavigatorButton>\n * </NavigatorScreen>\n *\n * <NavigatorScreen path=\"/child\">\n * <p>This is the child screen.</p>\n * <NavigatorBackButton>\n * Go back\n * </NavigatorBackButton>\n * </NavigatorScreen>\n * </NavigatorProvider>\n * );\n * ```\n */\nexport const NavigatorScreen = contextConnect(\n\tUnconnectedNavigatorScreen,\n\t'NavigatorScreen'\n);\n\nexport default NavigatorScreen;\n"],"mappings":"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"}
@@ -45,7 +45,7 @@ function NameInput({
45
45
  }
46
46
 
47
47
  /**
48
- * Returns a name for a palette item in the format "Color + id".
48
+ * Returns a name and slug for a palette item. The name takes the format "Color + id".
49
49
  * To ensure there are no duplicate ids, this function checks all slugs.
50
50
  * It expects slugs to be in the format: slugPrefix + color- + number.
51
51
  * It then sets the id component of the new name based on the incremented id of the highest existing slug id.
@@ -53,9 +53,9 @@ function NameInput({
53
53
  * @param elements An array of color palette items.
54
54
  * @param slugPrefix The slug prefix used to match the element slug.
55
55
  *
56
- * @return A unique name for a palette item.
56
+ * @return A name and slug for the new palette item.
57
57
  */
58
- export function getNameForPosition(elements, slugPrefix) {
58
+ export function getNameAndSlugForPosition(elements, slugPrefix) {
59
59
  const nameRegex = new RegExp(`^${slugPrefix}color-([\\d]+)$`);
60
60
  const position = elements.reduce((previousValue, currentValue) => {
61
61
  if (typeof currentValue?.slug === 'string') {
@@ -69,8 +69,11 @@ export function getNameForPosition(elements, slugPrefix) {
69
69
  }
70
70
  return previousValue;
71
71
  }, 1);
72
- return sprintf( /* translators: %s: is an id for a custom color */
73
- __('Color %s'), position);
72
+ return {
73
+ name: sprintf( /* translators: %s: is an id for a custom color */
74
+ __('Color %s'), position),
75
+ slug: `${slugPrefix}color-${position}`
76
+ };
74
77
  }
75
78
  function ColorPickerPopover({
76
79
  isGradient,
@@ -298,18 +301,21 @@ export function PaletteEdit({
298
301
  icon: plus,
299
302
  label: isGradient ? __('Add gradient') : __('Add color'),
300
303
  onClick: () => {
301
- const optionName = getNameForPosition(elements, slugPrefix);
304
+ const {
305
+ name,
306
+ slug
307
+ } = getNameAndSlugForPosition(elements, slugPrefix);
302
308
  if (!!gradients) {
303
309
  onChange([...gradients, {
304
310
  gradient: DEFAULT_GRADIENT,
305
- name: optionName,
306
- slug: slugPrefix + kebabCase(optionName)
311
+ name,
312
+ slug
307
313
  }]);
308
314
  } else {
309
315
  onChange([...colors, {
310
316
  color: DEFAULT_COLOR,
311
- name: optionName,
312
- slug: slugPrefix + kebabCase(optionName)
317
+ name,
318
+ slug
313
319
  }]);
314
320
  }
315
321
  setIsEditing(true);
@@ -319,7 +325,7 @@ export function PaletteEdit({
319
325
  icon: moreVertical,
320
326
  label: isGradient ? __('Gradient options') : __('Color options'),
321
327
  toggleProps: {
322
- isSmall: true
328
+ size: 'small'
323
329
  }
324
330
  }, ({
325
331
  onClose