@cloudscape-design/components 3.0.245 → 3.0.247

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 (341) hide show
  1. package/annotation-context/annotation/annotation-trigger.d.ts.map +1 -1
  2. package/annotation-context/annotation/annotation-trigger.js +1 -3
  3. package/annotation-context/annotation/annotation-trigger.js.map +1 -1
  4. package/annotation-context/annotation/styles.css.js +24 -24
  5. package/annotation-context/annotation/styles.scoped.css +30 -30
  6. package/annotation-context/annotation/styles.selectors.js +24 -24
  7. package/app-layout/drawer/index.d.ts +3 -21
  8. package/app-layout/drawer/index.d.ts.map +1 -1
  9. package/app-layout/drawer/index.js +25 -5
  10. package/app-layout/drawer/index.js.map +1 -1
  11. package/app-layout/drawer/interfaces.d.ts +84 -0
  12. package/app-layout/drawer/interfaces.d.ts.map +1 -0
  13. package/app-layout/drawer/interfaces.js +2 -0
  14. package/app-layout/drawer/interfaces.js.map +1 -0
  15. package/app-layout/drawer/resizable-drawer.d.ts +4 -0
  16. package/app-layout/drawer/resizable-drawer.d.ts.map +1 -0
  17. package/app-layout/drawer/resizable-drawer.js +51 -0
  18. package/app-layout/drawer/resizable-drawer.js.map +1 -0
  19. package/app-layout/drawer/styles.css.js +10 -5
  20. package/app-layout/drawer/styles.scoped.css +46 -10
  21. package/app-layout/drawer/styles.selectors.js +10 -5
  22. package/app-layout/index.d.ts.map +1 -1
  23. package/app-layout/index.js +142 -17
  24. package/app-layout/index.js.map +1 -1
  25. package/app-layout/mobile-toolbar/index.d.ts +10 -1
  26. package/app-layout/mobile-toolbar/index.d.ts.map +1 -1
  27. package/app-layout/mobile-toolbar/index.js +3 -2
  28. package/app-layout/mobile-toolbar/index.js.map +1 -1
  29. package/app-layout/mobile-toolbar/styles.css.js +5 -4
  30. package/app-layout/mobile-toolbar/styles.scoped.css +11 -7
  31. package/app-layout/mobile-toolbar/styles.selectors.js +5 -4
  32. package/app-layout/notifications/styles.css.js +3 -3
  33. package/app-layout/notifications/styles.scoped.css +7 -7
  34. package/app-layout/notifications/styles.selectors.js +3 -3
  35. package/app-layout/test-classes/styles.css.js +18 -13
  36. package/app-layout/test-classes/styles.scoped.css +33 -13
  37. package/app-layout/test-classes/styles.selectors.js +18 -13
  38. package/app-layout/toggles/index.d.ts.map +1 -1
  39. package/app-layout/toggles/index.js +2 -2
  40. package/app-layout/toggles/index.js.map +1 -1
  41. package/app-layout/toggles/interfaces.d.ts +3 -1
  42. package/app-layout/toggles/interfaces.d.ts.map +1 -1
  43. package/app-layout/toggles/interfaces.js.map +1 -1
  44. package/app-layout/utils/use-drawer-focus-control.d.ts +21 -0
  45. package/app-layout/utils/use-drawer-focus-control.d.ts.map +1 -0
  46. package/app-layout/utils/use-drawer-focus-control.js +65 -0
  47. package/app-layout/utils/use-drawer-focus-control.js.map +1 -0
  48. package/app-layout/visual-refresh/app-bar.d.ts.map +1 -1
  49. package/app-layout/visual-refresh/app-bar.js +8 -6
  50. package/app-layout/visual-refresh/app-bar.js.map +1 -1
  51. package/app-layout/visual-refresh/context.d.ts +13 -5
  52. package/app-layout/visual-refresh/context.d.ts.map +1 -1
  53. package/app-layout/visual-refresh/context.js +104 -49
  54. package/app-layout/visual-refresh/context.js.map +1 -1
  55. package/app-layout/visual-refresh/drawers.d.ts +47 -0
  56. package/app-layout/visual-refresh/drawers.d.ts.map +1 -0
  57. package/app-layout/visual-refresh/drawers.js +127 -0
  58. package/app-layout/visual-refresh/drawers.js.map +1 -0
  59. package/app-layout/visual-refresh/header.js +2 -2
  60. package/app-layout/visual-refresh/header.js.map +1 -1
  61. package/app-layout/visual-refresh/index.d.ts.map +1 -1
  62. package/app-layout/visual-refresh/index.js +3 -1
  63. package/app-layout/visual-refresh/index.js.map +1 -1
  64. package/app-layout/visual-refresh/layout.d.ts.map +1 -1
  65. package/app-layout/visual-refresh/layout.js +5 -42
  66. package/app-layout/visual-refresh/layout.js.map +1 -1
  67. package/app-layout/visual-refresh/main.d.ts.map +1 -1
  68. package/app-layout/visual-refresh/main.js +2 -3
  69. package/app-layout/visual-refresh/main.js.map +1 -1
  70. package/app-layout/visual-refresh/navigation.js +2 -2
  71. package/app-layout/visual-refresh/navigation.js.map +1 -1
  72. package/app-layout/visual-refresh/notifications.d.ts.map +1 -1
  73. package/app-layout/visual-refresh/notifications.js +2 -2
  74. package/app-layout/visual-refresh/notifications.js.map +1 -1
  75. package/app-layout/visual-refresh/split-panel.js +2 -2
  76. package/app-layout/visual-refresh/split-panel.js.map +1 -1
  77. package/app-layout/visual-refresh/styles.css.js +71 -61
  78. package/app-layout/visual-refresh/styles.scoped.css +437 -229
  79. package/app-layout/visual-refresh/styles.selectors.js +71 -61
  80. package/app-layout/visual-refresh/tools.d.ts.map +1 -1
  81. package/app-layout/visual-refresh/tools.js +7 -3
  82. package/app-layout/visual-refresh/tools.js.map +1 -1
  83. package/app-layout/visual-refresh/trigger-button.d.ts +4 -3
  84. package/app-layout/visual-refresh/trigger-button.d.ts.map +1 -1
  85. package/app-layout/visual-refresh/trigger-button.js +5 -6
  86. package/app-layout/visual-refresh/trigger-button.js.map +1 -1
  87. package/area-chart/internal.js +1 -1
  88. package/area-chart/internal.js.map +1 -1
  89. package/breadcrumb-group/item/item.d.ts.map +1 -1
  90. package/breadcrumb-group/item/item.js +2 -5
  91. package/breadcrumb-group/item/item.js.map +1 -1
  92. package/breadcrumb-group/item/styles.css.js +9 -9
  93. package/breadcrumb-group/item/styles.scoped.css +17 -17
  94. package/breadcrumb-group/item/styles.selectors.js +9 -9
  95. package/button/internal.d.ts.map +1 -1
  96. package/button/internal.js +2 -3
  97. package/button/internal.js.map +1 -1
  98. package/button/styles.css.js +19 -18
  99. package/button/styles.scoped.css +136 -136
  100. package/button/styles.selectors.js +19 -18
  101. package/calendar/grid/index.d.ts.map +1 -1
  102. package/calendar/grid/index.js +2 -4
  103. package/calendar/grid/index.js.map +1 -1
  104. package/calendar/styles.css.js +18 -18
  105. package/calendar/styles.scoped.css +38 -38
  106. package/calendar/styles.selectors.js +18 -18
  107. package/code-editor/styles.css.js +32 -32
  108. package/code-editor/styles.scoped.css +109 -109
  109. package/code-editor/styles.selectors.js +32 -32
  110. package/code-editor/tab-button.d.ts.map +1 -1
  111. package/code-editor/tab-button.js +2 -4
  112. package/code-editor/tab-button.js.map +1 -1
  113. package/date-picker/index.d.ts.map +1 -1
  114. package/date-picker/index.js +1 -3
  115. package/date-picker/index.js.map +1 -1
  116. package/date-picker/styles.css.js +7 -7
  117. package/date-picker/styles.scoped.css +9 -9
  118. package/date-picker/styles.selectors.js +7 -7
  119. package/date-range-picker/calendar/grids/grid.d.ts.map +1 -1
  120. package/date-range-picker/calendar/grids/grid.js +1 -3
  121. package/date-range-picker/calendar/grids/grid.js.map +1 -1
  122. package/date-range-picker/calendar/grids/index.d.ts.map +1 -1
  123. package/date-range-picker/calendar/grids/index.js +1 -3
  124. package/date-range-picker/calendar/grids/index.js.map +1 -1
  125. package/date-range-picker/calendar/grids/styles.css.js +25 -25
  126. package/date-range-picker/calendar/grids/styles.scoped.css +42 -42
  127. package/date-range-picker/calendar/grids/styles.selectors.js +25 -25
  128. package/date-range-picker/dropdown.d.ts.map +1 -1
  129. package/date-range-picker/dropdown.js +1 -3
  130. package/date-range-picker/dropdown.js.map +1 -1
  131. package/date-range-picker/styles.css.js +38 -38
  132. package/date-range-picker/styles.scoped.css +45 -45
  133. package/date-range-picker/styles.selectors.js +38 -38
  134. package/expandable-section/expandable-section-header.d.ts.map +1 -1
  135. package/expandable-section/expandable-section-header.js +3 -7
  136. package/expandable-section/expandable-section-header.js.map +1 -1
  137. package/expandable-section/styles.css.js +23 -23
  138. package/expandable-section/styles.scoped.css +44 -44
  139. package/expandable-section/styles.selectors.js +23 -23
  140. package/flashbar/collapsible-flashbar.d.ts.map +1 -1
  141. package/flashbar/collapsible-flashbar.js +1 -3
  142. package/flashbar/collapsible-flashbar.js.map +1 -1
  143. package/flashbar/flash.d.ts.map +1 -1
  144. package/flashbar/flash.js +1 -3
  145. package/flashbar/flash.js.map +1 -1
  146. package/flashbar/styles.css.js +45 -45
  147. package/flashbar/styles.scoped.css +169 -169
  148. package/flashbar/styles.selectors.js +45 -45
  149. package/internal/base-component/styles.scoped.css +24 -0
  150. package/internal/components/abstract-switch/index.d.ts.map +1 -1
  151. package/internal/components/abstract-switch/index.js +8 -4
  152. package/internal/components/abstract-switch/index.js.map +1 -1
  153. package/internal/components/abstract-switch/styles.css.js +13 -13
  154. package/internal/components/abstract-switch/styles.scoped.css +19 -19
  155. package/internal/components/abstract-switch/styles.selectors.js +13 -13
  156. package/internal/components/button-trigger/index.d.ts.map +1 -1
  157. package/internal/components/button-trigger/index.js +1 -3
  158. package/internal/components/button-trigger/index.js.map +1 -1
  159. package/internal/components/button-trigger/styles.css.js +9 -9
  160. package/internal/components/button-trigger/styles.scoped.css +23 -23
  161. package/internal/components/button-trigger/styles.selectors.js +9 -9
  162. package/internal/components/chart-legend/index.d.ts.map +1 -1
  163. package/internal/components/chart-legend/index.js +2 -4
  164. package/internal/components/chart-legend/index.js.map +1 -1
  165. package/internal/components/chart-legend/styles.css.js +6 -6
  166. package/internal/components/chart-legend/styles.scoped.css +15 -15
  167. package/internal/components/chart-legend/styles.selectors.js +6 -6
  168. package/internal/components/chart-plot/focus-outline.d.ts.map +1 -1
  169. package/internal/components/chart-plot/focus-outline.js +25 -3
  170. package/internal/components/chart-plot/focus-outline.js.map +1 -1
  171. package/internal/components/filtering-token/index.d.ts +2 -1
  172. package/internal/components/filtering-token/index.d.ts.map +1 -1
  173. package/internal/components/filtering-token/index.js +3 -5
  174. package/internal/components/filtering-token/index.js.map +1 -1
  175. package/internal/components/filtering-token/styles.css.js +7 -7
  176. package/internal/components/filtering-token/styles.scoped.css +13 -13
  177. package/internal/components/filtering-token/styles.selectors.js +7 -7
  178. package/internal/components/menu-dropdown/index.d.ts.map +1 -1
  179. package/internal/components/menu-dropdown/index.js +2 -4
  180. package/internal/components/menu-dropdown/index.js.map +1 -1
  181. package/internal/components/menu-dropdown/styles.css.js +7 -7
  182. package/internal/components/menu-dropdown/styles.scoped.css +13 -13
  183. package/internal/components/menu-dropdown/styles.selectors.js +7 -7
  184. package/internal/components/token-list/index.d.ts +1 -1
  185. package/internal/components/token-list/index.d.ts.map +1 -1
  186. package/internal/components/token-list/index.js +3 -3
  187. package/internal/components/token-list/index.js.map +1 -1
  188. package/internal/components/token-list/interfaces.d.ts +0 -1
  189. package/internal/components/token-list/interfaces.d.ts.map +1 -1
  190. package/internal/components/token-list/interfaces.js.map +1 -1
  191. package/internal/components/token-list/styles.css.js +9 -9
  192. package/internal/components/token-list/styles.scoped.css +20 -20
  193. package/internal/components/token-list/styles.selectors.js +9 -9
  194. package/internal/components/token-list/token-focus-controller.js +1 -1
  195. package/internal/components/token-list/token-focus-controller.js.map +1 -1
  196. package/internal/components/token-list/token-limit-toggle.d.ts.map +1 -1
  197. package/internal/components/token-list/token-limit-toggle.js +1 -3
  198. package/internal/components/token-list/token-limit-toggle.js.map +1 -1
  199. package/internal/environment.js +1 -1
  200. package/internal/generated/custom-css-properties/index.d.ts.map +1 -1
  201. package/internal/generated/custom-css-properties/index.js +31 -30
  202. package/internal/generated/custom-css-properties/index.js.map +1 -1
  203. package/internal/generated/styles/tokens.d.ts +2 -0
  204. package/internal/generated/styles/tokens.js +2 -0
  205. package/internal/generated/theming/index.cjs +140 -0
  206. package/internal/generated/theming/index.js +140 -0
  207. package/internal/hooks/focus-visible/index.d.ts +2 -5
  208. package/internal/hooks/focus-visible/index.d.ts.map +1 -1
  209. package/internal/hooks/focus-visible/index.js +42 -22
  210. package/internal/hooks/focus-visible/index.js.map +1 -1
  211. package/internal/hooks/use-base-component/index.d.ts.map +1 -1
  212. package/internal/hooks/use-base-component/index.js +2 -0
  213. package/internal/hooks/use-base-component/index.js.map +1 -1
  214. package/internal/manifest.json +1 -1
  215. package/link/internal.d.ts.map +1 -1
  216. package/link/internal.js +1 -3
  217. package/link/internal.js.map +1 -1
  218. package/link/styles.css.js +20 -20
  219. package/link/styles.scoped.css +71 -71
  220. package/link/styles.selectors.js +20 -20
  221. package/mixed-line-bar-chart/internal.js +1 -1
  222. package/mixed-line-bar-chart/internal.js.map +1 -1
  223. package/package.json +1 -1
  224. package/pagination/internal.d.ts.map +1 -1
  225. package/pagination/internal.js +1 -3
  226. package/pagination/internal.js.map +1 -1
  227. package/pagination/styles.css.js +9 -9
  228. package/pagination/styles.scoped.css +23 -23
  229. package/pagination/styles.selectors.js +9 -9
  230. package/pie-chart/index.js +1 -1
  231. package/pie-chart/index.js.map +1 -1
  232. package/popover/internal.d.ts.map +1 -1
  233. package/popover/internal.js +1 -3
  234. package/popover/internal.js.map +1 -1
  235. package/popover/styles.css.js +50 -50
  236. package/popover/styles.scoped.css +63 -63
  237. package/popover/styles.selectors.js +50 -50
  238. package/property-filter/index.d.ts.map +1 -1
  239. package/property-filter/index.js +2 -2
  240. package/property-filter/index.js.map +1 -1
  241. package/property-filter/token.d.ts.map +1 -1
  242. package/property-filter/token.js +1 -1
  243. package/property-filter/token.js.map +1 -1
  244. package/segmented-control/segment.d.ts.map +1 -1
  245. package/segmented-control/segment.js +1 -3
  246. package/segmented-control/segment.js.map +1 -1
  247. package/segmented-control/styles.css.js +14 -14
  248. package/segmented-control/styles.scoped.css +33 -33
  249. package/segmented-control/styles.selectors.js +14 -14
  250. package/side-navigation/internal.d.ts.map +1 -1
  251. package/side-navigation/internal.js +2 -5
  252. package/side-navigation/internal.js.map +1 -1
  253. package/side-navigation/styles.css.js +27 -27
  254. package/side-navigation/styles.scoped.css +37 -37
  255. package/side-navigation/styles.selectors.js +27 -27
  256. package/space-between/internal.js +1 -1
  257. package/space-between/internal.js.map +1 -1
  258. package/space-between/styles.css.js +20 -28
  259. package/space-between/styles.scoped.css +37 -101
  260. package/space-between/styles.selectors.js +20 -28
  261. package/split-panel/index.d.ts.map +1 -1
  262. package/split-panel/index.js +1 -3
  263. package/split-panel/index.js.map +1 -1
  264. package/split-panel/styles.css.js +59 -59
  265. package/split-panel/styles.scoped.css +81 -81
  266. package/split-panel/styles.selectors.js +59 -59
  267. package/table/body-cell/index.d.ts.map +1 -1
  268. package/table/body-cell/index.js +3 -3
  269. package/table/body-cell/index.js.map +1 -1
  270. package/table/body-cell/styles.css.js +18 -18
  271. package/table/body-cell/styles.scoped.css +57 -55
  272. package/table/body-cell/styles.selectors.js +18 -18
  273. package/table/header-cell/index.d.ts.map +1 -1
  274. package/table/header-cell/index.js +11 -9
  275. package/table/header-cell/index.js.map +1 -1
  276. package/table/header-cell/styles.css.js +19 -19
  277. package/table/header-cell/styles.scoped.css +32 -32
  278. package/table/header-cell/styles.selectors.js +19 -19
  279. package/table/internal.d.ts.map +1 -1
  280. package/table/internal.js +1 -3
  281. package/table/internal.js.map +1 -1
  282. package/table/resizer/styles.css.js +6 -6
  283. package/table/resizer/styles.scoped.css +11 -11
  284. package/table/resizer/styles.selectors.js +6 -6
  285. package/table/styles.css.js +33 -33
  286. package/table/styles.scoped.css +41 -41
  287. package/table/styles.selectors.js +33 -33
  288. package/tabs/index.d.ts.map +1 -1
  289. package/tabs/index.js +8 -3
  290. package/tabs/index.js.map +1 -1
  291. package/tabs/styles.css.js +21 -21
  292. package/tabs/styles.scoped.css +38 -38
  293. package/tabs/styles.selectors.js +21 -21
  294. package/tabs/tab-header-bar.d.ts.map +1 -1
  295. package/tabs/tab-header-bar.js +9 -3
  296. package/tabs/tab-header-bar.js.map +1 -1
  297. package/tag-editor/internal.d.ts.map +1 -1
  298. package/tag-editor/internal.js +2 -4
  299. package/tag-editor/internal.js.map +1 -1
  300. package/tag-editor/styles.css.js +3 -3
  301. package/tag-editor/styles.scoped.css +10 -10
  302. package/tag-editor/styles.selectors.js +3 -3
  303. package/token-group/dismiss-button.d.ts.map +1 -1
  304. package/token-group/dismiss-button.js +1 -3
  305. package/token-group/dismiss-button.js.map +1 -1
  306. package/token-group/internal.js +2 -2
  307. package/token-group/internal.js.map +1 -1
  308. package/token-group/styles.css.js +5 -5
  309. package/token-group/styles.scoped.css +12 -12
  310. package/token-group/styles.selectors.js +5 -5
  311. package/token-group/token.d.ts +3 -5
  312. package/token-group/token.d.ts.map +1 -1
  313. package/token-group/token.js +2 -2
  314. package/token-group/token.js.map +1 -1
  315. package/top-navigation/1.0-beta/internal.d.ts.map +1 -1
  316. package/top-navigation/1.0-beta/internal.js +1 -3
  317. package/top-navigation/1.0-beta/internal.js.map +1 -1
  318. package/top-navigation/1.0-beta/styles.css.js +25 -25
  319. package/top-navigation/1.0-beta/styles.scoped.css +42 -42
  320. package/top-navigation/1.0-beta/styles.selectors.js +25 -25
  321. package/top-navigation/internal.d.ts.map +1 -1
  322. package/top-navigation/internal.js +1 -3
  323. package/top-navigation/internal.js.map +1 -1
  324. package/top-navigation/parts/overflow-menu/menu-item.d.ts.map +1 -1
  325. package/top-navigation/parts/overflow-menu/menu-item.js +3 -7
  326. package/top-navigation/parts/overflow-menu/menu-item.js.map +1 -1
  327. package/top-navigation/styles.css.js +47 -47
  328. package/top-navigation/styles.scoped.css +66 -66
  329. package/top-navigation/styles.selectors.js +47 -47
  330. package/tutorial-panel/components/tutorial-list/index.d.ts.map +1 -1
  331. package/tutorial-panel/components/tutorial-list/index.js +1 -3
  332. package/tutorial-panel/components/tutorial-list/index.js.map +1 -1
  333. package/tutorial-panel/components/tutorial-list/styles.css.js +18 -18
  334. package/tutorial-panel/components/tutorial-list/styles.scoped.css +27 -27
  335. package/tutorial-panel/components/tutorial-list/styles.selectors.js +18 -18
  336. package/wizard/styles.css.js +32 -32
  337. package/wizard/styles.scoped.css +63 -63
  338. package/wizard/styles.selectors.js +32 -32
  339. package/wizard/wizard-form.d.ts.map +1 -1
  340. package/wizard/wizard-form.js +1 -3
  341. package/wizard/wizard-form.js.map +1 -1
@@ -2,18 +2,23 @@
2
2
  // es-module interop with Babel and Typescript
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
4
  module.exports.default = {
5
- "root": "awsui_root_1fj9k_avnjw_5",
6
- "navigation": "awsui_navigation_1fj9k_avnjw_9",
7
- "navigation-toggle": "awsui_navigation-toggle_1fj9k_avnjw_13",
8
- "navigation-close": "awsui_navigation-close_1fj9k_avnjw_17",
9
- "content": "awsui_content_1fj9k_avnjw_21",
10
- "notifications": "awsui_notifications_1fj9k_avnjw_25",
11
- "breadcrumbs": "awsui_breadcrumbs_1fj9k_avnjw_29",
12
- "tools": "awsui_tools_1fj9k_avnjw_33",
13
- "tools-close": "awsui_tools-close_1fj9k_avnjw_37",
14
- "tools-toggle": "awsui_tools-toggle_1fj9k_avnjw_41",
15
- "drawer-closed": "awsui_drawer-closed_1fj9k_avnjw_45",
16
- "mobile-bar": "awsui_mobile-bar_1fj9k_avnjw_49",
17
- "disable-body-scroll-root": "awsui_disable-body-scroll-root_1fj9k_avnjw_53"
5
+ "root": "awsui_root_1fj9k_tjzk8_5",
6
+ "navigation": "awsui_navigation_1fj9k_tjzk8_9",
7
+ "navigation-toggle": "awsui_navigation-toggle_1fj9k_tjzk8_13",
8
+ "navigation-close": "awsui_navigation-close_1fj9k_tjzk8_17",
9
+ "content": "awsui_content_1fj9k_tjzk8_21",
10
+ "notifications": "awsui_notifications_1fj9k_tjzk8_25",
11
+ "breadcrumbs": "awsui_breadcrumbs_1fj9k_tjzk8_29",
12
+ "tools": "awsui_tools_1fj9k_tjzk8_33",
13
+ "tools-close": "awsui_tools-close_1fj9k_tjzk8_37",
14
+ "tools-toggle": "awsui_tools-toggle_1fj9k_tjzk8_41",
15
+ "drawer-closed": "awsui_drawer-closed_1fj9k_tjzk8_45",
16
+ "mobile-bar": "awsui_mobile-bar_1fj9k_tjzk8_49",
17
+ "disable-body-scroll-root": "awsui_disable-body-scroll-root_1fj9k_tjzk8_53",
18
+ "drawers-desktop-triggers-container": "awsui_drawers-desktop-triggers-container_1fj9k_tjzk8_57",
19
+ "drawers-mobile-triggers-container": "awsui_drawers-mobile-triggers-container_1fj9k_tjzk8_61",
20
+ "drawers-trigger": "awsui_drawers-trigger_1fj9k_tjzk8_65",
21
+ "active-drawer": "awsui_active-drawer_1fj9k_tjzk8_69",
22
+ "active-drawer-close-button": "awsui_active-drawer-close-button_1fj9k_tjzk8_73"
18
23
  };
19
24
 
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"lib/default/","sources":["app-layout/toggles/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAEtD,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAGpD,eAAO,MAAM,aAAa;;;;sCAIF,eAAe,MAAM;;;;;;;;;sCASrB,eAAe,MAAM;;;;;;CAMnC,CAAC;AAEX,eAAO,MAAM,eAAe,8FAoB3B,CAAC;AAEF,UAAU,gBAAgB;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,eAAO,MAAM,WAAW,0FAevB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"lib/default/","sources":["app-layout/toggles/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAEtD,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAGpD,eAAO,MAAM,aAAa;;;;sCAIF,eAAe,MAAM;;;;;;;;;sCASrB,eAAe,MAAM;;;;;;CAMnC,CAAC;AAEX,eAAO,MAAM,eAAe,8FAqB3B,CAAC;AAEF,UAAU,gBAAgB;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,eAAO,MAAM,WAAW,0FAevB,CAAC"}
@@ -23,8 +23,8 @@ export const togglesConfig = {
23
23
  }),
24
24
  },
25
25
  };
26
- export const AppLayoutButton = React.forwardRef(({ className, ariaLabel, ariaExpanded, iconName, disabled, onClick }, ref) => {
27
- return (React.createElement(InternalButton, { ref: ref, className: className, ariaLabel: ariaLabel, variant: "icon", formAction: "none", onClick: onClick, iconName: iconName, disabled: disabled, ariaExpanded: ariaExpanded ? undefined : false, __nativeAttributes: { 'aria-haspopup': ariaExpanded ? undefined : true } }));
26
+ export const AppLayoutButton = React.forwardRef(({ className, ariaLabel, ariaExpanded, iconName, iconSvg, disabled, onClick }, ref) => {
27
+ return (React.createElement(InternalButton, { ref: ref, className: className, ariaLabel: ariaLabel, variant: "icon", formAction: "none", onClick: onClick, iconName: iconName, iconSvg: iconSvg, disabled: disabled, ariaExpanded: ariaExpanded ? undefined : false, __nativeAttributes: { 'aria-haspopup': ariaExpanded ? undefined : true } }));
28
28
  });
29
29
  export const CloseButton = React.forwardRef(({ className, ariaLabel, onClick }, ref) => {
30
30
  return (React.createElement("span", { className: styles['close-button'] },
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"lib/default/","sources":["app-layout/toggles/index.tsx"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,sCAAsC;AACtC,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAGvD,OAAO,MAAM,MAAM,iBAAiB,CAAC;AAErC,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,UAAU,EAAE;QACV,OAAO,EAAE,KAAK;QACd,QAAQ,EAAE,MAAM;QAChB,SAAS,EAAE,CAAC,SAAgC,EAAE,EAAE,EAAE,CAAC,CAAC;YAClD,SAAS,EAAE,MAAM,CAAC,UAAU;YAC5B,SAAS,EAAE,MAAM,CAAC,gBAAgB;YAClC,UAAU,EAAE,MAAM,CAAC,eAAe;SACnC,CAAC;KACH;IACD,KAAK,EAAE;QACL,OAAO,EAAE,OAAO;QAChB,QAAQ,EAAE,aAAa;QACvB,SAAS,EAAE,CAAC,SAAgC,EAAE,EAAE,EAAE,CAAC,CAAC;YAClD,SAAS,EAAE,MAAM,CAAC,KAAK;YACvB,SAAS,EAAE,MAAM,CAAC,WAAW;YAC7B,UAAU,EAAE,MAAM,CAAC,UAAU;SAC9B,CAAC;KACH;CACO,CAAC;AAEX,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,CAAC,UAAU,CAC7C,CACE,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAwB,EACzF,GAA+B,EAC/B,EAAE;IACF,OAAO,CACL,oBAAC,cAAc,IACb,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,SAAS,EACpB,SAAS,EAAE,SAAS,EACpB,OAAO,EAAC,MAAM,EACd,UAAU,EAAC,MAAM,EACjB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,QAAQ,EAClB,YAAY,EAAE,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,EAC9C,kBAAkB,EAAE,EAAE,eAAe,EAAE,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,GACxE,CACH,CAAC;AACJ,CAAC,CACF,CAAC;AAQF,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,CAAC,UAAU,CACzC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAoB,EAAE,GAA+B,EAAE,EAAE;IACvF,OAAO,CACL,8BAAM,SAAS,EAAE,MAAM,CAAC,cAAc,CAAC;QACrC,oBAAC,eAAe,IACd,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,SAAS,EACpB,YAAY,EAAE,IAAI,EAClB,SAAS,EAAE,SAAS,EACpB,QAAQ,EAAC,OAAO,EAChB,OAAO,EAAE,OAAO,GAChB,CACG,CACR,CAAC;AACJ,CAAC,CACF,CAAC","sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimport React from 'react';\nimport { ButtonProps } from '../../button/interfaces';\nimport { InternalButton } from '../../button/internal';\nimport { AppLayoutProps } from '../interfaces';\nimport { AppLayoutButtonProps } from './interfaces';\nimport styles from './styles.css.js';\n\nexport const togglesConfig = {\n navigation: {\n TagName: 'nav',\n iconName: 'menu',\n getLabels: (labels: AppLayoutProps.Labels = {}) => ({\n mainLabel: labels.navigation,\n openLabel: labels.navigationToggle,\n closeLabel: labels.navigationClose,\n }),\n },\n tools: {\n TagName: 'aside',\n iconName: 'status-info',\n getLabels: (labels: AppLayoutProps.Labels = {}) => ({\n mainLabel: labels.tools,\n openLabel: labels.toolsToggle,\n closeLabel: labels.toolsClose,\n }),\n },\n} as const;\n\nexport const AppLayoutButton = React.forwardRef(\n (\n { className, ariaLabel, ariaExpanded, iconName, disabled, onClick }: AppLayoutButtonProps,\n ref: React.Ref<ButtonProps.Ref>\n ) => {\n return (\n <InternalButton\n ref={ref}\n className={className}\n ariaLabel={ariaLabel}\n variant=\"icon\"\n formAction=\"none\"\n onClick={onClick}\n iconName={iconName}\n disabled={disabled}\n ariaExpanded={ariaExpanded ? undefined : false}\n __nativeAttributes={{ 'aria-haspopup': ariaExpanded ? undefined : true }}\n />\n );\n }\n);\n\ninterface CloseButtonProps {\n className?: string;\n ariaLabel: string | undefined;\n onClick: () => void;\n}\n\nexport const CloseButton = React.forwardRef(\n ({ className, ariaLabel, onClick }: CloseButtonProps, ref: React.Ref<ButtonProps.Ref>) => {\n return (\n <span className={styles['close-button']}>\n <AppLayoutButton\n ref={ref}\n className={className}\n ariaExpanded={true}\n ariaLabel={ariaLabel}\n iconName=\"close\"\n onClick={onClick}\n />\n </span>\n );\n }\n);\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"lib/default/","sources":["app-layout/toggles/index.tsx"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,sCAAsC;AACtC,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAGvD,OAAO,MAAM,MAAM,iBAAiB,CAAC;AAErC,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,UAAU,EAAE;QACV,OAAO,EAAE,KAAK;QACd,QAAQ,EAAE,MAAM;QAChB,SAAS,EAAE,CAAC,SAAgC,EAAE,EAAE,EAAE,CAAC,CAAC;YAClD,SAAS,EAAE,MAAM,CAAC,UAAU;YAC5B,SAAS,EAAE,MAAM,CAAC,gBAAgB;YAClC,UAAU,EAAE,MAAM,CAAC,eAAe;SACnC,CAAC;KACH;IACD,KAAK,EAAE;QACL,OAAO,EAAE,OAAO;QAChB,QAAQ,EAAE,aAAa;QACvB,SAAS,EAAE,CAAC,SAAgC,EAAE,EAAE,EAAE,CAAC,CAAC;YAClD,SAAS,EAAE,MAAM,CAAC,KAAK;YACvB,SAAS,EAAE,MAAM,CAAC,WAAW;YAC7B,UAAU,EAAE,MAAM,CAAC,UAAU;SAC9B,CAAC;KACH;CACO,CAAC;AAEX,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,CAAC,UAAU,CAC7C,CACE,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAwB,EAClG,GAA+B,EAC/B,EAAE;IACF,OAAO,CACL,oBAAC,cAAc,IACb,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,SAAS,EACpB,SAAS,EAAE,SAAS,EACpB,OAAO,EAAC,MAAM,EACd,UAAU,EAAC,MAAM,EACjB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,QAAQ,EAClB,YAAY,EAAE,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,EAC9C,kBAAkB,EAAE,EAAE,eAAe,EAAE,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,GACxE,CACH,CAAC;AACJ,CAAC,CACF,CAAC;AAQF,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,CAAC,UAAU,CACzC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAoB,EAAE,GAA+B,EAAE,EAAE;IACvF,OAAO,CACL,8BAAM,SAAS,EAAE,MAAM,CAAC,cAAc,CAAC;QACrC,oBAAC,eAAe,IACd,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,SAAS,EACpB,YAAY,EAAE,IAAI,EAClB,SAAS,EAAE,SAAS,EACpB,QAAQ,EAAC,OAAO,EAChB,OAAO,EAAE,OAAO,GAChB,CACG,CACR,CAAC;AACJ,CAAC,CACF,CAAC","sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimport React from 'react';\nimport { ButtonProps } from '../../button/interfaces';\nimport { InternalButton } from '../../button/internal';\nimport { AppLayoutProps } from '../interfaces';\nimport { AppLayoutButtonProps } from './interfaces';\nimport styles from './styles.css.js';\n\nexport const togglesConfig = {\n navigation: {\n TagName: 'nav',\n iconName: 'menu',\n getLabels: (labels: AppLayoutProps.Labels = {}) => ({\n mainLabel: labels.navigation,\n openLabel: labels.navigationToggle,\n closeLabel: labels.navigationClose,\n }),\n },\n tools: {\n TagName: 'aside',\n iconName: 'status-info',\n getLabels: (labels: AppLayoutProps.Labels = {}) => ({\n mainLabel: labels.tools,\n openLabel: labels.toolsToggle,\n closeLabel: labels.toolsClose,\n }),\n },\n} as const;\n\nexport const AppLayoutButton = React.forwardRef(\n (\n { className, ariaLabel, ariaExpanded, iconName, iconSvg, disabled, onClick }: AppLayoutButtonProps,\n ref: React.Ref<ButtonProps.Ref>\n ) => {\n return (\n <InternalButton\n ref={ref}\n className={className}\n ariaLabel={ariaLabel}\n variant=\"icon\"\n formAction=\"none\"\n onClick={onClick}\n iconName={iconName}\n iconSvg={iconSvg}\n disabled={disabled}\n ariaExpanded={ariaExpanded ? undefined : false}\n __nativeAttributes={{ 'aria-haspopup': ariaExpanded ? undefined : true }}\n />\n );\n }\n);\n\ninterface CloseButtonProps {\n className?: string;\n ariaLabel: string | undefined;\n onClick: () => void;\n}\n\nexport const CloseButton = React.forwardRef(\n ({ className, ariaLabel, onClick }: CloseButtonProps, ref: React.Ref<ButtonProps.Ref>) => {\n return (\n <span className={styles['close-button']}>\n <AppLayoutButton\n ref={ref}\n className={className}\n ariaExpanded={true}\n ariaLabel={ariaLabel}\n iconName=\"close\"\n onClick={onClick}\n />\n </span>\n );\n }\n);\n"]}
@@ -1,9 +1,11 @@
1
+ /// <reference types="react" />
1
2
  import { IconProps } from '../../icon/interfaces';
2
3
  export interface AppLayoutButtonProps {
3
4
  className?: string;
4
5
  ariaLabel: string | undefined;
5
6
  ariaExpanded?: boolean;
6
- iconName: IconProps.Name;
7
+ iconName?: IconProps.Name;
8
+ iconSvg?: React.ReactNode;
7
9
  onClick: () => void;
8
10
  disabled?: boolean;
9
11
  }
@@ -1 +1 @@
1
- {"version":3,"file":"interfaces.d.ts","sourceRoot":"lib/default/","sources":["app-layout/toggles/interfaces.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElD,MAAM,WAAW,oBAAoB;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,QAAQ,EAAE,SAAS,CAAC,IAAI,CAAC;IACzB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB"}
1
+ {"version":3,"file":"interfaces.d.ts","sourceRoot":"lib/default/","sources":["app-layout/toggles/interfaces.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElD,MAAM,WAAW,oBAAoB;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,EAAE,SAAS,CAAC,IAAI,CAAC;IAC1B,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB"}
@@ -1 +1 @@
1
- {"version":3,"file":"interfaces.js","sourceRoot":"lib/default/","sources":["app-layout/toggles/interfaces.ts"],"names":[],"mappings":"","sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimport { IconProps } from '../../icon/interfaces';\n\nexport interface AppLayoutButtonProps {\n className?: string;\n ariaLabel: string | undefined;\n ariaExpanded?: boolean;\n iconName: IconProps.Name;\n onClick: () => void;\n disabled?: boolean;\n}\n"]}
1
+ {"version":3,"file":"interfaces.js","sourceRoot":"lib/default/","sources":["app-layout/toggles/interfaces.ts"],"names":[],"mappings":"","sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimport { IconProps } from '../../icon/interfaces';\n\nexport interface AppLayoutButtonProps {\n className?: string;\n ariaLabel: string | undefined;\n ariaExpanded?: boolean;\n iconName?: IconProps.Name;\n iconSvg?: React.ReactNode;\n onClick: () => void;\n disabled?: boolean;\n}\n"]}
@@ -0,0 +1,21 @@
1
+ import { DependencyList, RefObject } from 'react';
2
+ import { ButtonProps } from '../../button/interfaces';
3
+ export type DrawerLastInteraction = {
4
+ type: 'open';
5
+ } | {
6
+ type: 'close';
7
+ };
8
+ export interface DrawerFocusControlRefs {
9
+ toggle: RefObject<ButtonProps.Ref>;
10
+ close: RefObject<ButtonProps.Ref>;
11
+ slider: RefObject<HTMLDivElement>;
12
+ }
13
+ interface FocusControlState {
14
+ refs: DrawerFocusControlRefs;
15
+ setFocus: (force?: boolean) => void;
16
+ loseFocus: () => void;
17
+ setLastInteraction: (interaction: DrawerLastInteraction) => void;
18
+ }
19
+ export declare function useDrawerFocusControl(dependencies: DependencyList, isOpen: boolean, restoreFocus?: boolean): FocusControlState;
20
+ export {};
21
+ //# sourceMappingURL=use-drawer-focus-control.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-drawer-focus-control.d.ts","sourceRoot":"lib/default/","sources":["app-layout/utils/use-drawer-focus-control.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,SAAS,EAAkC,MAAM,OAAO,CAAC;AAClF,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAEtD,MAAM,MAAM,qBAAqB,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC;AAEzE,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACnC,KAAK,EAAE,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAClC,MAAM,EAAE,SAAS,CAAC,cAAc,CAAC,CAAC;CACnC;AAED,UAAU,iBAAiB;IACzB,IAAI,EAAE,sBAAsB,CAAC;IAC7B,QAAQ,EAAE,CAAC,KAAK,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IACpC,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,kBAAkB,EAAE,CAAC,WAAW,EAAE,qBAAqB,KAAK,IAAI,CAAC;CAClE;AAED,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,cAAc,EAC5B,MAAM,EAAE,OAAO,EACf,YAAY,UAAQ,GACnB,iBAAiB,CA6DnB"}
@@ -0,0 +1,65 @@
1
+ // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ import { useEffect, useRef, useCallback } from 'react';
4
+ export function useDrawerFocusControl(dependencies, isOpen, restoreFocus = false) {
5
+ const refs = {
6
+ toggle: useRef(null),
7
+ close: useRef(null),
8
+ slider: useRef(null),
9
+ };
10
+ const previousFocusedElement = useRef();
11
+ const shouldFocus = useRef(false);
12
+ const lastInteraction = useRef(null);
13
+ useEffect(() => {
14
+ var _a, _b, _c;
15
+ switch ((_a = lastInteraction.current) === null || _a === void 0 ? void 0 : _a.type) {
16
+ case 'open':
17
+ (_b = refs.slider.current) === null || _b === void 0 ? void 0 : _b.focus();
18
+ break;
19
+ case 'close':
20
+ (_c = refs.toggle.current) === null || _c === void 0 ? void 0 : _c.focus();
21
+ break;
22
+ }
23
+ lastInteraction.current = null;
24
+ // eslint-disable-next-line react-hooks/exhaustive-deps
25
+ }, dependencies);
26
+ const doFocus = () => {
27
+ var _a, _b;
28
+ if (!shouldFocus.current) {
29
+ return;
30
+ }
31
+ if (isOpen) {
32
+ previousFocusedElement.current =
33
+ document.activeElement !== document.body ? document.activeElement : undefined;
34
+ (_a = refs.close.current) === null || _a === void 0 ? void 0 : _a.focus();
35
+ }
36
+ else {
37
+ if (restoreFocus && previousFocusedElement.current && document.contains(previousFocusedElement.current)) {
38
+ previousFocusedElement.current.focus();
39
+ previousFocusedElement.current = undefined;
40
+ }
41
+ else {
42
+ (_b = refs.toggle.current) === null || _b === void 0 ? void 0 : _b.focus();
43
+ }
44
+ }
45
+ shouldFocus.current = false;
46
+ };
47
+ // We explictly want this effect to run when only `isOpen` changes
48
+ // eslint-disable-next-line react-hooks/exhaustive-deps
49
+ useEffect(doFocus, [isOpen]);
50
+ const loseFocus = useCallback(() => {
51
+ previousFocusedElement.current = undefined;
52
+ }, []);
53
+ return {
54
+ refs,
55
+ setFocus: force => {
56
+ shouldFocus.current = true;
57
+ if (force && isOpen) {
58
+ doFocus();
59
+ }
60
+ },
61
+ loseFocus,
62
+ setLastInteraction: (interaction) => (lastInteraction.current = interaction),
63
+ };
64
+ }
65
+ //# sourceMappingURL=use-drawer-focus-control.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-drawer-focus-control.js","sourceRoot":"lib/default/","sources":["app-layout/utils/use-drawer-focus-control.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,sCAAsC;AACtC,OAAO,EAA6B,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAkBlF,MAAM,UAAU,qBAAqB,CACnC,YAA4B,EAC5B,MAAe,EACf,YAAY,GAAG,KAAK;IAEpB,MAAM,IAAI,GAAG;QACX,MAAM,EAAE,MAAM,CAAkB,IAAI,CAAC;QACrC,KAAK,EAAE,MAAM,CAAkB,IAAI,CAAC;QACpC,MAAM,EAAE,MAAM,CAAiB,IAAI,CAAC;KACrC,CAAC;IACF,MAAM,sBAAsB,GAAG,MAAM,EAAe,CAAC;IACrD,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAClC,MAAM,eAAe,GAAG,MAAM,CAA+B,IAAI,CAAC,CAAC;IAEnE,SAAS,CAAC,GAAG,EAAE;;QACb,QAAQ,MAAA,eAAe,CAAC,OAAO,0CAAE,IAAI,EAAE;YACrC,KAAK,MAAM;gBACT,MAAA,IAAI,CAAC,MAAM,CAAC,OAAO,0CAAE,KAAK,EAAE,CAAC;gBAC7B,MAAM;YACR,KAAK,OAAO;gBACV,MAAA,IAAI,CAAC,MAAM,CAAC,OAAO,0CAAE,KAAK,EAAE,CAAC;gBAC7B,MAAM;SACT;QACD,eAAe,CAAC,OAAO,GAAG,IAAI,CAAC;QAC/B,uDAAuD;IACzD,CAAC,EAAE,YAAY,CAAC,CAAC;IAEjB,MAAM,OAAO,GAAG,GAAG,EAAE;;QACnB,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE;YACxB,OAAO;SACR;QACD,IAAI,MAAM,EAAE;YACV,sBAAsB,CAAC,OAAO;gBAC5B,QAAQ,CAAC,aAAa,KAAK,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAE,QAAQ,CAAC,aAA6B,CAAC,CAAC,CAAC,SAAS,CAAC;YACjG,MAAA,IAAI,CAAC,KAAK,CAAC,OAAO,0CAAE,KAAK,EAAE,CAAC;SAC7B;aAAM;YACL,IAAI,YAAY,IAAI,sBAAsB,CAAC,OAAO,IAAI,QAAQ,CAAC,QAAQ,CAAC,sBAAsB,CAAC,OAAO,CAAC,EAAE;gBACvG,sBAAsB,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;gBACvC,sBAAsB,CAAC,OAAO,GAAG,SAAS,CAAC;aAC5C;iBAAM;gBACL,MAAA,IAAI,CAAC,MAAM,CAAC,OAAO,0CAAE,KAAK,EAAE,CAAC;aAC9B;SACF;QACD,WAAW,CAAC,OAAO,GAAG,KAAK,CAAC;IAC9B,CAAC,CAAC;IAEF,kEAAkE;IAClE,uDAAuD;IACvD,SAAS,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAE7B,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE;QACjC,sBAAsB,CAAC,OAAO,GAAG,SAAS,CAAC;IAC7C,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO;QACL,IAAI;QACJ,QAAQ,EAAE,KAAK,CAAC,EAAE;YAChB,WAAW,CAAC,OAAO,GAAG,IAAI,CAAC;YAC3B,IAAI,KAAK,IAAI,MAAM,EAAE;gBACnB,OAAO,EAAE,CAAC;aACX;QACH,CAAC;QACD,SAAS;QACT,kBAAkB,EAAE,CAAC,WAAkC,EAAE,EAAE,CAAC,CAAC,eAAe,CAAC,OAAO,GAAG,WAAW,CAAC;KACpG,CAAC;AACJ,CAAC","sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimport { DependencyList, RefObject, useEffect, useRef, useCallback } from 'react';\nimport { ButtonProps } from '../../button/interfaces';\n\nexport type DrawerLastInteraction = { type: 'open' } | { type: 'close' };\n\nexport interface DrawerFocusControlRefs {\n toggle: RefObject<ButtonProps.Ref>;\n close: RefObject<ButtonProps.Ref>;\n slider: RefObject<HTMLDivElement>;\n}\n\ninterface FocusControlState {\n refs: DrawerFocusControlRefs;\n setFocus: (force?: boolean) => void;\n loseFocus: () => void;\n setLastInteraction: (interaction: DrawerLastInteraction) => void;\n}\n\nexport function useDrawerFocusControl(\n dependencies: DependencyList,\n isOpen: boolean,\n restoreFocus = false\n): FocusControlState {\n const refs = {\n toggle: useRef<ButtonProps.Ref>(null),\n close: useRef<ButtonProps.Ref>(null),\n slider: useRef<HTMLDivElement>(null),\n };\n const previousFocusedElement = useRef<HTMLElement>();\n const shouldFocus = useRef(false);\n const lastInteraction = useRef<DrawerLastInteraction | null>(null);\n\n useEffect(() => {\n switch (lastInteraction.current?.type) {\n case 'open':\n refs.slider.current?.focus();\n break;\n case 'close':\n refs.toggle.current?.focus();\n break;\n }\n lastInteraction.current = null;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, dependencies);\n\n const doFocus = () => {\n if (!shouldFocus.current) {\n return;\n }\n if (isOpen) {\n previousFocusedElement.current =\n document.activeElement !== document.body ? (document.activeElement as HTMLElement) : undefined;\n refs.close.current?.focus();\n } else {\n if (restoreFocus && previousFocusedElement.current && document.contains(previousFocusedElement.current)) {\n previousFocusedElement.current.focus();\n previousFocusedElement.current = undefined;\n } else {\n refs.toggle.current?.focus();\n }\n }\n shouldFocus.current = false;\n };\n\n // We explictly want this effect to run when only `isOpen` changes\n // eslint-disable-next-line react-hooks/exhaustive-deps\n useEffect(doFocus, [isOpen]);\n\n const loseFocus = useCallback(() => {\n previousFocusedElement.current = undefined;\n }, []);\n\n return {\n refs,\n setFocus: force => {\n shouldFocus.current = true;\n if (force && isOpen) {\n doFocus();\n }\n },\n loseFocus,\n setLastInteraction: (interaction: DrawerLastInteraction) => (lastInteraction.current = interaction),\n };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"app-bar.d.ts","sourceRoot":"lib/default/","sources":["app-layout/visual-refresh/app-bar.tsx"],"names":[],"mappings":";AASA;;;GAGG;AACH,MAAM,CAAC,OAAO,UAAU,MAAM,uBA6F7B"}
1
+ {"version":3,"file":"app-bar.d.ts","sourceRoot":"lib/default/","sources":["app-layout/visual-refresh/app-bar.tsx"],"names":[],"mappings":";AAUA;;;GAGG;AACH,MAAM,CAAC,OAAO,UAAU,MAAM,uBAgG7B"}
@@ -2,8 +2,9 @@
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
  import React from 'react';
4
4
  import clsx from 'clsx';
5
- import { useAppLayoutInternals } from './context';
6
5
  import { InternalButton } from '../../button/internal';
6
+ import { MobileTriggers as DrawersMobileTriggers } from './drawers';
7
+ import { useAppLayoutInternals } from './context';
7
8
  import styles from './styles.css.js';
8
9
  import testutilStyles from '../test-classes/styles.css.js';
9
10
  /**
@@ -12,24 +13,25 @@ import testutilStyles from '../test-classes/styles.css.js';
12
13
  */
13
14
  export default function AppBar() {
14
15
  var _a, _b, _c;
15
- const { ariaLabels, breadcrumbs, contentHeader, contentType, dynamicOverlapHeight, handleNavigationClick, handleToolsClick, hasNotificationsContent, hasStickyBackground, isMobile, navigationHide, isNavigationOpen, isToolsOpen, toolsHide, isAnyPanelOpen, navigationRefs, toolsRefs, } = useAppLayoutInternals();
16
+ const { ariaLabels, breadcrumbs, contentHeader, contentType, drawers, dynamicOverlapHeight, handleNavigationClick, handleToolsClick, hasDrawerViewportOverlay, hasNotificationsContent, hasStickyBackground, isMobile, navigationHide, isNavigationOpen, isToolsOpen, toolsHide, navigationRefs, toolsRefs, } = useAppLayoutInternals();
16
17
  if (navigationHide && !breadcrumbs && toolsHide) {
17
18
  return null;
18
19
  }
19
20
  return (React.createElement("section", { "aria-hidden": !isMobile && !breadcrumbs ? true : undefined, className: clsx(styles.appbar, {
20
21
  [styles['has-breadcrumbs']]: breadcrumbs,
21
- [styles.unfocusable]: isMobile && isAnyPanelOpen,
22
+ [styles.unfocusable]: hasDrawerViewportOverlay,
22
23
  [testutilStyles['mobile-bar']]: isMobile,
23
24
  }, 'awsui-context-content-header') },
24
25
  !navigationHide && isMobile && (React.createElement("nav", { className: clsx(styles['appbar-nav'], { [testutilStyles['drawer-closed']]: !isNavigationOpen }), "aria-hidden": isNavigationOpen },
25
- React.createElement(InternalButton, { ariaLabel: (_a = ariaLabels === null || ariaLabels === void 0 ? void 0 : ariaLabels.navigationToggle) !== null && _a !== void 0 ? _a : undefined, ariaExpanded: isNavigationOpen ? undefined : false, iconName: "menu", formAction: "none", onClick: () => handleNavigationClick(true), variant: "icon", className: testutilStyles['navigation-toggle'], ref: navigationRefs.toggle, disabled: isAnyPanelOpen, __nativeAttributes: { 'aria-haspopup': isNavigationOpen ? undefined : true } }))),
26
+ React.createElement(InternalButton, { ariaLabel: (_a = ariaLabels === null || ariaLabels === void 0 ? void 0 : ariaLabels.navigationToggle) !== null && _a !== void 0 ? _a : undefined, ariaExpanded: isNavigationOpen ? undefined : false, iconName: "menu", formAction: "none", onClick: () => handleNavigationClick(true), variant: "icon", className: testutilStyles['navigation-toggle'], ref: navigationRefs.toggle, disabled: hasDrawerViewportOverlay, __nativeAttributes: { 'aria-haspopup': isNavigationOpen ? undefined : true } }))),
26
27
  breadcrumbs && (React.createElement("div", { className: clsx(styles.breadcrumbs, styles[`content-type-${contentType}`], testutilStyles.breadcrumbs, {
27
28
  [styles['has-dynamic-overlap-height']]: dynamicOverlapHeight > 0,
28
29
  [styles['has-header']]: contentHeader,
29
30
  [styles['has-notifications-content']]: hasNotificationsContent,
30
31
  [styles['has-sticky-background']]: hasStickyBackground,
31
32
  }) }, breadcrumbs)),
32
- !toolsHide && isMobile && (React.createElement("aside", { className: clsx(styles['appbar-tools'], { [testutilStyles['drawer-closed']]: !isToolsOpen }), "aria-hidden": isToolsOpen, "aria-label": (_b = ariaLabels === null || ariaLabels === void 0 ? void 0 : ariaLabels.tools) !== null && _b !== void 0 ? _b : undefined },
33
- React.createElement(InternalButton, { className: testutilStyles['tools-toggle'], ariaExpanded: isToolsOpen, disabled: isAnyPanelOpen, ariaLabel: (_c = ariaLabels === null || ariaLabels === void 0 ? void 0 : ariaLabels.toolsToggle) !== null && _c !== void 0 ? _c : undefined, iconName: "status-info", formAction: "none", onClick: () => handleToolsClick(true), variant: "icon", ref: toolsRefs.toggle, __nativeAttributes: { 'aria-haspopup': true } })))));
33
+ isMobile && !toolsHide && !drawers && (React.createElement("aside", { className: clsx(styles['appbar-tools'], { [testutilStyles['drawer-closed']]: !isToolsOpen }), "aria-hidden": isToolsOpen, "aria-label": (_b = ariaLabels === null || ariaLabels === void 0 ? void 0 : ariaLabels.tools) !== null && _b !== void 0 ? _b : undefined },
34
+ React.createElement(InternalButton, { className: testutilStyles['tools-toggle'], ariaExpanded: isToolsOpen, disabled: hasDrawerViewportOverlay, ariaLabel: (_c = ariaLabels === null || ariaLabels === void 0 ? void 0 : ariaLabels.toolsToggle) !== null && _c !== void 0 ? _c : undefined, iconName: "status-info", formAction: "none", onClick: () => handleToolsClick(true), variant: "icon", ref: toolsRefs.toggle, __nativeAttributes: { 'aria-haspopup': true } }))),
35
+ React.createElement(DrawersMobileTriggers, null)));
34
36
  }
35
37
  //# sourceMappingURL=app-bar.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"app-bar.js","sourceRoot":"lib/default/","sources":["app-layout/visual-refresh/app-bar.tsx"],"names":[],"mappings":"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","sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimport React from 'react';\nimport clsx from 'clsx';\nimport { useAppLayoutInternals } from './context';\nimport { InternalButton } from '../../button/internal';\nimport styles from './styles.css.js';\nimport testutilStyles from '../test-classes/styles.css.js';\n\n/**\n * The CSS class 'awsui-context-content-header' needs to be added to the root element so\n * that the design tokens used are overridden with the appropriate values.\n */\nexport default function AppBar() {\n const {\n ariaLabels,\n breadcrumbs,\n contentHeader,\n contentType,\n dynamicOverlapHeight,\n handleNavigationClick,\n handleToolsClick,\n hasNotificationsContent,\n hasStickyBackground,\n isMobile,\n navigationHide,\n isNavigationOpen,\n isToolsOpen,\n toolsHide,\n isAnyPanelOpen,\n navigationRefs,\n toolsRefs,\n } = useAppLayoutInternals();\n\n if (navigationHide && !breadcrumbs && toolsHide) {\n return null;\n }\n\n return (\n <section\n aria-hidden={!isMobile && !breadcrumbs ? true : undefined}\n className={clsx(\n styles.appbar,\n {\n [styles['has-breadcrumbs']]: breadcrumbs,\n [styles.unfocusable]: isMobile && isAnyPanelOpen,\n [testutilStyles['mobile-bar']]: isMobile,\n },\n 'awsui-context-content-header'\n )}\n >\n {!navigationHide && isMobile && (\n <nav\n className={clsx(styles['appbar-nav'], { [testutilStyles['drawer-closed']]: !isNavigationOpen })}\n aria-hidden={isNavigationOpen}\n >\n <InternalButton\n ariaLabel={ariaLabels?.navigationToggle ?? undefined}\n ariaExpanded={isNavigationOpen ? undefined : false}\n iconName=\"menu\"\n formAction=\"none\"\n onClick={() => handleNavigationClick(true)}\n variant=\"icon\"\n className={testutilStyles['navigation-toggle']}\n ref={navigationRefs.toggle}\n disabled={isAnyPanelOpen}\n __nativeAttributes={{ 'aria-haspopup': isNavigationOpen ? undefined : true }}\n />\n </nav>\n )}\n\n {breadcrumbs && (\n <div\n className={clsx(styles.breadcrumbs, styles[`content-type-${contentType}`], testutilStyles.breadcrumbs, {\n [styles['has-dynamic-overlap-height']]: dynamicOverlapHeight > 0,\n [styles['has-header']]: contentHeader,\n [styles['has-notifications-content']]: hasNotificationsContent,\n [styles['has-sticky-background']]: hasStickyBackground,\n })}\n >\n {breadcrumbs}\n </div>\n )}\n\n {!toolsHide && isMobile && (\n <aside\n className={clsx(styles['appbar-tools'], { [testutilStyles['drawer-closed']]: !isToolsOpen })}\n aria-hidden={isToolsOpen}\n aria-label={ariaLabels?.tools ?? undefined}\n >\n <InternalButton\n className={testutilStyles['tools-toggle']}\n ariaExpanded={isToolsOpen}\n disabled={isAnyPanelOpen}\n ariaLabel={ariaLabels?.toolsToggle ?? undefined}\n iconName=\"status-info\"\n formAction=\"none\"\n onClick={() => handleToolsClick(true)}\n variant=\"icon\"\n ref={toolsRefs.toggle}\n __nativeAttributes={{ 'aria-haspopup': true }}\n />\n </aside>\n )}\n </section>\n );\n}\n"]}
1
+ {"version":3,"file":"app-bar.js","sourceRoot":"lib/default/","sources":["app-layout/visual-refresh/app-bar.tsx"],"names":[],"mappings":"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","sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimport React from 'react';\nimport clsx from 'clsx';\nimport { InternalButton } from '../../button/internal';\nimport { MobileTriggers as DrawersMobileTriggers } from './drawers';\nimport { useAppLayoutInternals } from './context';\nimport styles from './styles.css.js';\nimport testutilStyles from '../test-classes/styles.css.js';\n\n/**\n * The CSS class 'awsui-context-content-header' needs to be added to the root element so\n * that the design tokens used are overridden with the appropriate values.\n */\nexport default function AppBar() {\n const {\n ariaLabels,\n breadcrumbs,\n contentHeader,\n contentType,\n drawers,\n dynamicOverlapHeight,\n handleNavigationClick,\n handleToolsClick,\n hasDrawerViewportOverlay,\n hasNotificationsContent,\n hasStickyBackground,\n isMobile,\n navigationHide,\n isNavigationOpen,\n isToolsOpen,\n toolsHide,\n navigationRefs,\n toolsRefs,\n } = useAppLayoutInternals();\n\n if (navigationHide && !breadcrumbs && toolsHide) {\n return null;\n }\n\n return (\n <section\n aria-hidden={!isMobile && !breadcrumbs ? true : undefined}\n className={clsx(\n styles.appbar,\n {\n [styles['has-breadcrumbs']]: breadcrumbs,\n [styles.unfocusable]: hasDrawerViewportOverlay,\n [testutilStyles['mobile-bar']]: isMobile,\n },\n 'awsui-context-content-header'\n )}\n >\n {!navigationHide && isMobile && (\n <nav\n className={clsx(styles['appbar-nav'], { [testutilStyles['drawer-closed']]: !isNavigationOpen })}\n aria-hidden={isNavigationOpen}\n >\n <InternalButton\n ariaLabel={ariaLabels?.navigationToggle ?? undefined}\n ariaExpanded={isNavigationOpen ? undefined : false}\n iconName=\"menu\"\n formAction=\"none\"\n onClick={() => handleNavigationClick(true)}\n variant=\"icon\"\n className={testutilStyles['navigation-toggle']}\n ref={navigationRefs.toggle}\n disabled={hasDrawerViewportOverlay}\n __nativeAttributes={{ 'aria-haspopup': isNavigationOpen ? undefined : true }}\n />\n </nav>\n )}\n\n {breadcrumbs && (\n <div\n className={clsx(styles.breadcrumbs, styles[`content-type-${contentType}`], testutilStyles.breadcrumbs, {\n [styles['has-dynamic-overlap-height']]: dynamicOverlapHeight > 0,\n [styles['has-header']]: contentHeader,\n [styles['has-notifications-content']]: hasNotificationsContent,\n [styles['has-sticky-background']]: hasStickyBackground,\n })}\n >\n {breadcrumbs}\n </div>\n )}\n\n {isMobile && !toolsHide && !drawers && (\n <aside\n className={clsx(styles['appbar-tools'], { [testutilStyles['drawer-closed']]: !isToolsOpen })}\n aria-hidden={isToolsOpen}\n aria-label={ariaLabels?.tools ?? undefined}\n >\n <InternalButton\n className={testutilStyles['tools-toggle']}\n ariaExpanded={isToolsOpen}\n disabled={hasDrawerViewportOverlay}\n ariaLabel={ariaLabels?.toolsToggle ?? undefined}\n iconName=\"status-info\"\n formAction=\"none\"\n onClick={() => handleToolsClick(true)}\n variant=\"icon\"\n ref={toolsRefs.toggle}\n __nativeAttributes={{ 'aria-haspopup': true }}\n />\n </aside>\n )}\n\n <DrawersMobileTriggers />\n </section>\n );\n}\n"]}
@@ -1,21 +1,29 @@
1
1
  import React from 'react';
2
2
  import { AppLayoutProps } from '../interfaces';
3
+ import { DrawersProps } from './drawers';
3
4
  import { FocusControlRefs } from '../utils/use-focus-control';
4
- import { SplitPanelSideToggleProps } from '../../internal/context/split-panel-context';
5
5
  import { SplitPanelFocusControlRefs } from '../utils/use-split-panel-focus-control';
6
+ import { SplitPanelSideToggleProps } from '../../internal/context/split-panel-context';
6
7
  interface AppLayoutInternals extends AppLayoutProps {
8
+ activeDrawerId: string | null;
9
+ activeDrawerWidth: number;
10
+ drawers: DrawersProps;
11
+ drawersRefs: FocusControlRefs;
12
+ drawersTriggerCount: number;
7
13
  dynamicOverlapHeight: number;
14
+ handleDrawersClick: (activeDrawerId: string | null, skipFocusControl?: boolean) => void;
8
15
  handleSplitPanelClick: () => void;
9
16
  handleNavigationClick: (isOpen: boolean) => void;
10
17
  handleSplitPanelPreferencesChange: (detail: AppLayoutProps.SplitPanelPreferences) => void;
11
18
  handleSplitPanelResize: (detail: {
12
19
  size: number;
13
20
  }) => void;
14
- handleToolsClick: (value: boolean) => void;
21
+ handleToolsClick: (value: boolean, skipFocusControl?: boolean) => void;
15
22
  hasDefaultToolsWidth: boolean;
23
+ hasDrawerViewportOverlay: boolean;
16
24
  hasNotificationsContent: boolean;
25
+ hasOpenDrawer: boolean;
17
26
  hasStickyBackground: boolean;
18
- isAnyPanelOpen: boolean;
19
27
  isMobile: boolean;
20
28
  isNavigationOpen: boolean;
21
29
  isSplitPanelForcedPosition: boolean;
@@ -23,8 +31,10 @@ interface AppLayoutInternals extends AppLayoutProps {
23
31
  isToolsOpen: boolean;
24
32
  layoutElement: React.Ref<HTMLElement>;
25
33
  layoutWidth: number;
34
+ loseToolsFocus: () => void;
26
35
  mainElement: React.Ref<HTMLDivElement>;
27
36
  mainOffsetLeft: number;
37
+ navigationRefs: FocusControlRefs;
28
38
  notificationsElement: React.Ref<HTMLDivElement>;
29
39
  notificationsHeight: number;
30
40
  offsetBottom: number;
@@ -43,9 +53,7 @@ interface AppLayoutInternals extends AppLayoutProps {
43
53
  setSplitPanelToggle: (toggle: SplitPanelSideToggleProps) => void;
44
54
  splitPanelDisplayed: boolean;
45
55
  splitPanelRefs: SplitPanelFocusControlRefs;
46
- navigationRefs: FocusControlRefs;
47
56
  toolsRefs: FocusControlRefs;
48
- loseToolsFocus: () => void;
49
57
  }
50
58
  interface AppLayoutProviderInternalsProps extends AppLayoutProps {
51
59
  children: React.ReactNode;
@@ -1 +1 @@
1
- {"version":3,"file":"context.d.ts","sourceRoot":"lib/default/","sources":["app-layout/visual-refresh/context.tsx"],"names":[],"mappings":"AAEA,OAAO,KASN,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAW/C,OAAO,EAAE,gBAAgB,EAAmB,MAAM,4BAA4B,CAAC;AAG/E,OAAO,EAAE,yBAAyB,EAAE,MAAM,4CAA4C,CAAC;AACvF,OAAO,EAAE,0BAA0B,EAA6B,MAAM,wCAAwC,CAAC;AAE/G,UAAU,kBAAmB,SAAQ,cAAc;IACjD,oBAAoB,EAAE,MAAM,CAAC;IAC7B,qBAAqB,EAAE,MAAM,IAAI,CAAC;IAClC,qBAAqB,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IACjD,iCAAiC,EAAE,CAAC,MAAM,EAAE,cAAc,CAAC,qBAAqB,KAAK,IAAI,CAAC;IAC1F,sBAAsB,EAAE,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IAC3D,gBAAgB,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IAC3C,oBAAoB,EAAE,OAAO,CAAC;IAC9B,uBAAuB,EAAE,OAAO,CAAC;IACjC,mBAAmB,EAAE,OAAO,CAAC;IAC7B,cAAc,EAAE,OAAO,CAAC;IACxB,QAAQ,EAAE,OAAO,CAAC;IAClB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,0BAA0B,EAAE,OAAO,CAAC;IACpC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,WAAW,EAAE,OAAO,CAAC;IACrB,aAAa,EAAE,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IACvC,cAAc,EAAE,MAAM,CAAC;IACvB,oBAAoB,EAAE,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAChD,mBAAmB,EAAE,MAAM,CAAC;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,uBAAuB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACjD,sBAAsB,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACjD,yBAAyB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnD,iCAAiC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3D,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,kBAAkB,EAAE,cAAc,CAAC,kBAAkB,CAAC;IACtD,sBAAsB,EAAE,MAAM,CAAC;IAC/B,8BAA8B,EAAE,MAAM,CAAC;IACvC,gBAAgB,EAAE,yBAAyB,CAAC;IAC5C,mBAAmB,EAAE,CAAC,MAAM,EAAE,yBAAyB,KAAK,IAAI,CAAC;IACjE,mBAAmB,EAAE,OAAO,CAAC;IAC7B,cAAc,EAAE,0BAA0B,CAAC;IAC3C,cAAc,EAAE,gBAAgB,CAAC;IACjC,SAAS,EAAE,gBAAgB,CAAC;IAC5B,cAAc,EAAE,MAAM,IAAI,CAAC;CAC5B;AASD,UAAU,+BAAgC,SAAQ,cAAc;IAC9D,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAED,wBAAgB,qBAAqB,uBAMpC;AAED,eAAO,MAAM,0BAA0B,4GAwdtC,CAAC"}
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"lib/default/","sources":["app-layout/visual-refresh/context.tsx"],"names":[],"mappings":"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"}
@@ -2,20 +2,20 @@ import { __rest } from "tslib";
2
2
  // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3
3
  // SPDX-License-Identifier: Apache-2.0
4
4
  import React, { createContext, useCallback, useEffect, useLayoutEffect, useImperativeHandle, useRef, useState, useContext, } from 'react';
5
+ import { applyDefaults } from '../defaults';
6
+ import { AppLayoutContext } from '../../internal/context/app-layout-context';
5
7
  import { fireNonCancelableEvent } from '../../internal/events';
8
+ import { useFocusControl } from '../utils/use-focus-control';
9
+ import { getSplitPanelDefaultSize } from '../../split-panel/utils/size-utils';
10
+ import { isDevelopment } from '../../internal/is-development';
6
11
  import { getSplitPanelPosition } from './split-panel';
12
+ import { useContainerQuery } from '../../internal/hooks/container-queries';
7
13
  import { useControllable } from '../../internal/hooks/use-controllable';
14
+ import { useSplitPanelFocusControl } from '../utils/use-split-panel-focus-control';
15
+ import { useObservedElement } from '../utils/use-observed-element';
8
16
  import { useMobile } from '../../internal/hooks/use-mobile';
9
- import { useContainerQuery } from '../../internal/hooks/container-queries';
10
- import { getSplitPanelDefaultSize } from '../../split-panel/utils/size-utils';
11
- import styles from './styles.css.js';
12
- import { isDevelopment } from '../../internal/is-development';
13
17
  import { warnOnce } from '../../internal/logging';
14
- import { applyDefaults } from '../defaults';
15
- import { useFocusControl } from '../utils/use-focus-control';
16
- import { useObservedElement } from '../utils/use-observed-element';
17
- import { AppLayoutContext } from '../../internal/context/app-layout-context';
18
- import { useSplitPanelFocusControl } from '../utils/use-split-panel-focus-control';
18
+ import styles from './styles.css.js';
19
19
  /**
20
20
  * The default values are destructured in the context instantiation to
21
21
  * prevent downstream Typescript errors. This could likely be replaced
@@ -30,7 +30,7 @@ export function useAppLayoutInternals() {
30
30
  return ctx;
31
31
  }
32
32
  export const AppLayoutInternalsProvider = React.forwardRef((_a, forwardRef) => {
33
- var _b, _c, _d;
33
+ var _b, _c, _d, _e;
34
34
  var { toolsHide, toolsOpen: controlledToolsOpen, navigationHide, navigationOpen: controlledNavigationOpen, contentType = 'default', headerSelector = '#b #h', footerSelector = '#b #h', children, splitPanel } = _a, props = __rest(_a, ["toolsHide", "toolsOpen", "navigationHide", "navigationOpen", "contentType", "headerSelector", "footerSelector", "children", "splitPanel"]);
35
35
  const isMobile = useMobile();
36
36
  if (isDevelopment) {
@@ -98,14 +98,11 @@ export const AppLayoutInternalsProvider = React.forwardRef((_a, forwardRef) => {
98
98
  const hasDefaultToolsWidth = props.toolsWidth === undefined;
99
99
  const [isToolsOpen = false, setIsToolsOpen] = useControllable(controlledToolsOpen, props.onToolsChange, isMobile ? false : contentTypeDefaults.toolsOpen, { componentName: 'AppLayout', controlledProp: 'toolsOpen', changeHandler: 'onToolsChange' });
100
100
  const { refs: toolsRefs, setFocus: focusToolsButtons, loseFocus: loseToolsFocus, } = useFocusControl(isToolsOpen, true);
101
- const handleToolsClick = useCallback(function handleToolsChange(isOpen) {
101
+ const handleToolsClick = useCallback(function handleToolsChange(isOpen, skipFocusControl) {
102
102
  setIsToolsOpen(isOpen);
103
- focusToolsButtons();
103
+ !skipFocusControl && focusToolsButtons();
104
104
  fireNonCancelableEvent(props.onToolsChange, { open: isOpen });
105
105
  }, [props.onToolsChange, setIsToolsOpen, focusToolsButtons]);
106
- const navigationVisible = !navigationHide && isNavigationOpen;
107
- const toolsVisible = !toolsHide && isToolsOpen;
108
- const isAnyPanelOpen = navigationVisible || toolsVisible;
109
106
  /**
110
107
  * On mobile viewports the navigation and tools drawers are adjusted to a fixed position
111
108
  * that consumes 100% of the viewport height and width. The body content could potentially
@@ -231,6 +228,41 @@ export const AppLayoutInternalsProvider = React.forwardRef((_a, forwardRef) => {
231
228
  setSplitPanelLastInteraction({ type: 'position' });
232
229
  fireNonCancelableEvent(props.onSplitPanelPreferencesChange, detail);
233
230
  }, [props.onSplitPanelPreferencesChange, setSplitPanelPreferences, setSplitPanelLastInteraction]);
231
+ /**
232
+ * The activeDrawerWidth is required in JavaScript to acccurately calculate whether a SplitPanel
233
+ * in the side position should be forced to the bottom based on available horiziontal space.
234
+ *
235
+ * The handleDrawersClick will either open a new drawer or close the currently open drawer by setting
236
+ * the activeDrawerId value. The active drawer can also be closed if a user clicks the Tools trigger
237
+ * button. This will skip the focus handling because the focus should be going to the Tools close
238
+ * button and not one of the drawers trigger buttons.
239
+ *
240
+ * The drawersTriggerCount is computed in order to determine whether the triggers should be persistent
241
+ * in the UI when a drawer is open. The trigger button container is suppressed when a drawer is open
242
+ * and their is only one trigger button.
243
+ *
244
+ * The hasDrawerViewportOverlay property is used to determine if any drawer is obscuring the entire
245
+ * viewport. This currently applies to Navigation, Tools, and Drawers in mobile viewports.
246
+ */
247
+ const drawers = props.drawers;
248
+ const [activeDrawerId, setActiveDrawerId] = useControllable(drawers === null || drawers === void 0 ? void 0 : drawers.activeDrawerId, drawers === null || drawers === void 0 ? void 0 : drawers.onChange, null, {
249
+ componentName: 'AppLayout',
250
+ controlledProp: 'drawers.activeDrawerId',
251
+ changeHandler: 'onChange',
252
+ });
253
+ const activeDrawerWidth = 290;
254
+ const { refs: drawersRefs, setFocus: focusDrawersButtons } = useFocusControl(activeDrawerId);
255
+ const handleDrawersClick = useCallback(function handleDrawersChange(id, skipFocusControl) {
256
+ const newActiveDrawerId = id !== activeDrawerId ? id : null;
257
+ setActiveDrawerId(newActiveDrawerId);
258
+ !skipFocusControl && focusDrawersButtons();
259
+ fireNonCancelableEvent(drawers === null || drawers === void 0 ? void 0 : drawers.onChange, newActiveDrawerId);
260
+ }, [activeDrawerId, drawers === null || drawers === void 0 ? void 0 : drawers.onChange, focusDrawersButtons, setActiveDrawerId]);
261
+ const drawersTriggerCount = ((_e = drawers === null || drawers === void 0 ? void 0 : drawers.items.length) !== null && _e !== void 0 ? _e : 0) +
262
+ (splitPanelDisplayed && splitPanelPosition === 'side' ? 1 : 0) +
263
+ (!toolsHide ? 1 : 0);
264
+ const hasOpenDrawer = activeDrawerId || isToolsOpen || (splitPanelDisplayed && splitPanelPosition === 'side' && isSplitPanelOpen);
265
+ const hasDrawerViewportOverlay = isMobile && (!!activeDrawerId || (!navigationHide && isNavigationOpen) || (!toolsHide && isToolsOpen));
234
266
  /**
235
267
  * The Layout element is not necessarily synonymous with the client
236
268
  * viewport width. There can be content in the horizontal viewport
@@ -254,35 +286,6 @@ export const AppLayoutInternalsProvider = React.forwardRef((_a, forwardRef) => {
254
286
  var _a, _b;
255
287
  setMainOffsetLeft((_b = (_a = mainElement === null || mainElement === void 0 ? void 0 : mainElement.current) === null || _a === void 0 ? void 0 : _a.offsetLeft) !== null && _b !== void 0 ? _b : 0);
256
288
  }, [layoutWidth, isNavigationOpen, isToolsOpen, splitPanelReportedSize]);
257
- useLayoutEffect(function handleSplitPanelMaxWidth() {
258
- /**
259
- * Warning! This is a hack! In order to accurately calculate if there is adequate
260
- * horizontal space for the Split Panel to be in the side position we need two values
261
- * that are not available in JavaScript.
262
- *
263
- * The first is the the content gap on the right which is stored in a design token
264
- * and applied in the Layout CSS:
265
- *
266
- * $contentGapRight: #{awsui.$space-scaled-2x-xxxl};
267
- *
268
- * The second is the width of the element that has the circular buttons for the
269
- * Tools and Split Panel. This could be suppressed given the state of the Tools
270
- * drawer returning a zero value. It would, however, be rendered if the Split Panel
271
- * were to move into the side position. This is calculated in the Tools CSS and
272
- * the Trigger button CSS with design tokens:
273
- *
274
- * padding: awsui.$space-scaled-s awsui.$space-layout-toggle-padding;
275
- * width: awsui.$space-layout-toggle-diameter;
276
- *
277
- * These values will be defined below as static integers that are rough approximations
278
- * of their computed width when rendered in the DOM, but doubled to ensure adequate
279
- * spacing for the Split Panel to be in side position.
280
- */
281
- const contentGapRight = 80; // Approximately 40px when rendered but doubled for safety
282
- const toolsFormOffsetWidth = 160; // Approximately 80px when rendered but doubled for safety
283
- const toolsOffsetWidth = isToolsOpen ? toolsWidth : 0;
284
- setSplitPanelMaxWidth(layoutWidth - mainOffsetLeft - minContentWidth - contentGapRight - toolsOffsetWidth - toolsFormOffsetWidth);
285
- }, [isNavigationOpen, isToolsOpen, layoutWidth, mainOffsetLeft, minContentWidth, toolsWidth]);
286
289
  /**
287
290
  * Because the notifications slot does not give us any direction insight into
288
291
  * what the state of the child content is we need to have a mechanism for
@@ -316,29 +319,83 @@ export const AppLayoutInternalsProvider = React.forwardRef((_a, forwardRef) => {
316
319
  offsetBottom += splitPanelReportedHeaderHeight;
317
320
  }
318
321
  }
319
- return (React.createElement(AppLayoutInternalsContext.Provider, { value: Object.assign(Object.assign({}, props), { contentType,
322
+ /**
323
+ * Warning! This is a hack! In order to accurately calculate if there is adequate
324
+ * horizontal space for the Split Panel to be in the side position we need two values
325
+ * that are not available in JavaScript.
326
+ *
327
+ * The first is the the content gap on the right which is stored in a design token
328
+ * and applied in the Layout CSS:
329
+ *
330
+ * $contentGapRight: #{awsui.$space-scaled-2x-xxxl};
331
+ *
332
+ * The second is the width of the element that has the circular buttons for the
333
+ * Tools and Split Panel. This could be suppressed given the state of the Tools
334
+ * drawer returning a zero value. It would, however, be rendered if the Split Panel
335
+ * were to move into the side position. This is calculated in the Tools CSS and
336
+ * the Trigger button CSS with design tokens:
337
+ *
338
+ * padding: awsui.$space-scaled-s awsui.$space-layout-toggle-padding;
339
+ * width: awsui.$space-layout-toggle-diameter;
340
+ *
341
+ * These values will be defined below as static integers that are rough approximations
342
+ * of their computed width when rendered in the DOM, but doubled to ensure adequate
343
+ * spacing for the Split Panel to be in side position.
344
+ */
345
+ useLayoutEffect(function handleSplitPanelMaxWidth() {
346
+ const contentGapRight = 80; // Approximately 40px when rendered but doubled for safety
347
+ const toolsFormOffsetWidth = 160; // Approximately 80px when rendered but doubled for safety
348
+ const toolsOffsetWidth = isToolsOpen ? toolsWidth : 0;
349
+ const activeDrawerOffsetWidth = activeDrawerId ? activeDrawerWidth : 0;
350
+ setSplitPanelMaxWidth(layoutWidth -
351
+ mainOffsetLeft -
352
+ minContentWidth -
353
+ contentGapRight -
354
+ toolsOffsetWidth -
355
+ toolsFormOffsetWidth -
356
+ activeDrawerOffsetWidth);
357
+ }, [
358
+ activeDrawerId,
359
+ activeDrawerWidth,
360
+ isNavigationOpen,
361
+ isToolsOpen,
362
+ layoutWidth,
363
+ mainOffsetLeft,
364
+ minContentWidth,
365
+ toolsWidth,
366
+ ]);
367
+ return (React.createElement(AppLayoutInternalsContext.Provider, { value: Object.assign(Object.assign({}, props), { activeDrawerId,
368
+ activeDrawerWidth,
369
+ contentType,
370
+ drawers,
371
+ drawersRefs,
372
+ drawersTriggerCount,
320
373
  dynamicOverlapHeight,
321
374
  headerHeight,
322
375
  footerHeight,
323
376
  hasDefaultToolsWidth,
377
+ hasDrawerViewportOverlay,
378
+ handleDrawersClick,
324
379
  handleNavigationClick,
325
380
  handleSplitPanelClick,
326
381
  handleSplitPanelPreferencesChange,
327
382
  handleSplitPanelResize,
328
383
  handleToolsClick,
329
384
  hasNotificationsContent,
385
+ hasOpenDrawer,
330
386
  hasStickyBackground,
331
- isAnyPanelOpen,
332
387
  isMobile, isNavigationOpen: isNavigationOpen !== null && isNavigationOpen !== void 0 ? isNavigationOpen : false, isSplitPanelForcedPosition,
333
388
  isSplitPanelOpen,
334
389
  isToolsOpen,
335
390
  layoutElement,
336
391
  layoutWidth,
392
+ loseToolsFocus,
337
393
  mainElement,
338
394
  mainOffsetLeft,
339
395
  maxContentWidth,
340
396
  minContentWidth,
341
397
  navigationHide,
398
+ navigationRefs,
342
399
  notificationsElement,
343
400
  notificationsHeight,
344
401
  offsetBottom,
@@ -359,9 +416,7 @@ export const AppLayoutInternalsProvider = React.forwardRef((_a, forwardRef) => {
359
416
  setSplitPanelToggle,
360
417
  splitPanelRefs,
361
418
  toolsHide, toolsOpen: isToolsOpen, toolsWidth,
362
- toolsRefs,
363
- navigationRefs,
364
- loseToolsFocus }) },
419
+ toolsRefs }) },
365
420
  React.createElement(AppLayoutContext.Provider, { value: {
366
421
  stickyOffsetBottom: offsetBottom,
367
422
  stickyOffsetTop: 0,