@westpac/ui 0.4.0 → 0.6.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 (226) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/components/accordion/accordion.component.d.ts +2 -2
  3. package/dist/components/accordion/components/accordion-item/accordion-item.component.js +5 -3
  4. package/dist/components/accordion/components/accordion-item/accordion-item.styles.d.ts +16 -0
  5. package/dist/components/accordion/components/accordion-item/accordion-item.styles.js +17 -9
  6. package/dist/components/alert/alert.component.js +2 -1
  7. package/dist/components/alert/alert.styles.js +2 -2
  8. package/dist/components/autocomplete/autocomplete.styles.js +3 -3
  9. package/dist/components/button/button.component.d.ts +18 -2
  10. package/dist/components/button/button.component.js +6 -6
  11. package/dist/components/button/button.styles.d.ts +16 -0
  12. package/dist/components/button/button.styles.js +8 -0
  13. package/dist/components/button-dropdown/button-dropdown.styles.js +1 -1
  14. package/dist/components/button-dropdown/components/panel/panel.component.js +6 -3
  15. package/dist/components/button-dropdown/components/panel/panel.styles.d.ts +14 -2
  16. package/dist/components/button-dropdown/components/panel/panel.styles.js +8 -2
  17. package/dist/components/checkbox-group/components/checkbox/checkbox.component.js +2 -2
  18. package/dist/components/checkbox-group/components/checkbox/checkbox.styles.d.ts +2 -2
  19. package/dist/components/checkbox-group/components/checkbox/checkbox.styles.js +4 -4
  20. package/dist/components/collapsible/collapsible.styles.js +1 -1
  21. package/dist/components/compacta/compacta.component.js +4 -3
  22. package/dist/components/compacta/compacta.styles.js +1 -1
  23. package/dist/components/flexi-cell/flexi-cell.component.js +6 -3
  24. package/dist/components/flexi-cell/flexi-cell.styles.d.ts +10 -0
  25. package/dist/components/flexi-cell/flexi-cell.styles.js +7 -2
  26. package/dist/components/flexi-cell/flexi-cell.types.d.ts +4 -0
  27. package/dist/components/flexi-cell/index.d.ts +1 -0
  28. package/dist/components/flexi-cell/index.js +1 -0
  29. package/dist/components/icon/index.d.ts +1 -0
  30. package/dist/components/icon/index.js +1 -0
  31. package/dist/components/index.d.ts +3 -1
  32. package/dist/components/index.js +3 -1
  33. package/dist/components/input/input.component.d.ts +7 -1
  34. package/dist/components/input/input.component.js +5 -2
  35. package/dist/components/input/input.styles.d.ts +7 -1
  36. package/dist/components/input/input.styles.js +4 -1
  37. package/dist/components/link/link.component.d.ts +1 -1
  38. package/dist/components/link/link.component.js +5 -3
  39. package/dist/components/link/link.styles.d.ts +16 -0
  40. package/dist/components/link/link.styles.js +11 -3
  41. package/dist/components/list/components/item/item.component.d.ts +1 -1
  42. package/dist/components/list/components/item/item.component.js +6 -3
  43. package/dist/components/list/components/item/item.styles.d.ts +10 -0
  44. package/dist/components/list/components/item/item.styles.js +7 -2
  45. package/dist/components/list/list.component.d.ts +1 -1
  46. package/dist/components/list/list.stories.js +7 -1
  47. package/dist/components/list/list.styles.js +1 -1
  48. package/dist/components/list/list.utils.d.ts +1 -1
  49. package/dist/components/modal/components/backdrop/backdrop.styles.js +2 -2
  50. package/dist/components/modal/components/dialog/dialog.component.js +6 -4
  51. package/dist/components/modal/components/dialog/dialog.styles.d.ts +16 -0
  52. package/dist/components/modal/components/dialog/dialog.styles.js +11 -3
  53. package/dist/components/popover/components/panel/panel.styles.js +1 -1
  54. package/dist/components/popover/popover.component.js +0 -1
  55. package/dist/components/popover/popover.styles.d.ts +0 -2
  56. package/dist/components/popover/popover.styles.js +1 -2
  57. package/dist/components/radio-group/components/radio/radio.component.js +2 -2
  58. package/dist/components/radio-group/components/radio/radio.styles.d.ts +2 -2
  59. package/dist/components/radio-group/components/radio/radio.styles.js +5 -5
  60. package/dist/components/repeater/index.d.ts +2 -0
  61. package/dist/components/repeater/index.js +1 -0
  62. package/dist/components/repeater/repeater.component.d.ts +3 -0
  63. package/dist/components/repeater/repeater.component.js +144 -0
  64. package/dist/components/repeater/repeater.stories.d.ts +13 -0
  65. package/dist/components/repeater/repeater.stories.js +34 -0
  66. package/dist/components/repeater/repeater.styles.d.ts +49 -0
  67. package/dist/components/repeater/repeater.styles.js +36 -0
  68. package/dist/components/repeater/repeater.types.d.ts +19 -0
  69. package/dist/components/repeater/repeater.types.js +1 -0
  70. package/dist/components/repeater/repeater.utils.d.ts +2 -0
  71. package/dist/components/repeater/repeater.utils.js +2 -0
  72. package/dist/components/select/select.component.d.ts +11 -1
  73. package/dist/components/select/select.component.js +5 -2
  74. package/dist/components/select/select.styles.d.ts +11 -1
  75. package/dist/components/select/select.styles.js +6 -1
  76. package/dist/components/selector/components/index.d.ts +2 -0
  77. package/dist/components/selector/components/index.js +2 -0
  78. package/dist/components/selector/components/selector-checkbox-group/components/index.d.ts +1 -0
  79. package/dist/components/selector/components/selector-checkbox-group/components/index.js +1 -0
  80. package/dist/components/selector/components/selector-checkbox-group/components/selector-checkbox-group-option/index.d.ts +2 -0
  81. package/dist/components/selector/components/selector-checkbox-group/components/selector-checkbox-group-option/index.js +1 -0
  82. package/dist/components/selector/components/selector-checkbox-group/components/selector-checkbox-group-option/selector-checkbox-group-option.component.d.ts +12 -0
  83. package/dist/components/selector/components/selector-checkbox-group/components/selector-checkbox-group-option/selector-checkbox-group-option.component.js +67 -0
  84. package/dist/components/selector/components/selector-checkbox-group/components/selector-checkbox-group-option/selector-checkbox-group-option.styles.d.ts +59 -0
  85. package/dist/components/selector/components/selector-checkbox-group/components/selector-checkbox-group-option/selector-checkbox-group-option.styles.js +57 -0
  86. package/dist/components/selector/components/selector-checkbox-group/components/selector-checkbox-group-option/selector-checkbox-group-option.types.d.ts +10 -0
  87. package/dist/components/selector/components/selector-checkbox-group/components/selector-checkbox-group-option/selector-checkbox-group-option.types.js +1 -0
  88. package/dist/components/selector/components/selector-checkbox-group/index.d.ts +2 -0
  89. package/dist/components/selector/components/selector-checkbox-group/index.js +1 -0
  90. package/dist/components/selector/components/selector-checkbox-group/selector-checkbox-group.component.d.ts +15 -0
  91. package/dist/components/selector/components/selector-checkbox-group/selector-checkbox-group.component.js +49 -0
  92. package/dist/components/selector/components/selector-checkbox-group/selector-checkbox-group.styles.d.ts +3 -0
  93. package/dist/components/selector/components/selector-checkbox-group/selector-checkbox-group.styles.js +13 -0
  94. package/dist/components/selector/components/selector-checkbox-group/selector-checkbox-group.types.d.ts +20 -0
  95. package/dist/components/selector/components/selector-checkbox-group/selector-checkbox-group.types.js +1 -0
  96. package/dist/components/selector/components/selector-radio-group/components/index.d.ts +1 -0
  97. package/dist/components/selector/components/selector-radio-group/components/index.js +1 -0
  98. package/dist/components/selector/components/selector-radio-group/components/selector-radio-group-option/index.d.ts +2 -0
  99. package/dist/components/selector/components/selector-radio-group/components/selector-radio-group-option/index.js +1 -0
  100. package/dist/components/selector/components/selector-radio-group/components/selector-radio-group-option/selector-radio-group-option.component.d.ts +12 -0
  101. package/dist/components/selector/components/selector-radio-group/components/selector-radio-group-option/selector-radio-group-option.component.js +67 -0
  102. package/dist/components/selector/components/selector-radio-group/components/selector-radio-group-option/selector-radio-group-option.styles.d.ts +59 -0
  103. package/dist/components/selector/components/selector-radio-group/components/selector-radio-group-option/selector-radio-group-option.styles.js +57 -0
  104. package/dist/components/selector/components/selector-radio-group/components/selector-radio-group-option/selector-radio-group-option.types.d.ts +15 -0
  105. package/dist/components/selector/components/selector-radio-group/components/selector-radio-group-option/selector-radio-group-option.types.js +1 -0
  106. package/dist/components/selector/components/selector-radio-group/index.d.ts +2 -0
  107. package/dist/components/selector/components/selector-radio-group/index.js +1 -0
  108. package/dist/components/selector/components/selector-radio-group/selector-radio-group.component.d.ts +15 -0
  109. package/dist/components/selector/components/selector-radio-group/selector-radio-group.component.js +58 -0
  110. package/dist/components/selector/components/selector-radio-group/selector-radio-group.styles.d.ts +13 -0
  111. package/dist/components/selector/components/selector-radio-group/selector-radio-group.styles.js +18 -0
  112. package/dist/components/selector/components/selector-radio-group/selector-radio-group.types.d.ts +17 -0
  113. package/dist/components/selector/components/selector-radio-group/selector-radio-group.types.js +1 -0
  114. package/dist/components/selector/index.d.ts +2 -0
  115. package/dist/components/selector/index.js +1 -0
  116. package/dist/components/selector/selector.component.d.ts +30 -0
  117. package/dist/components/selector/selector.component.js +34 -0
  118. package/dist/components/selector/selector.stories.d.ts +57 -0
  119. package/dist/components/selector/selector.stories.js +515 -0
  120. package/dist/components/selector/selector.types.d.ts +20 -0
  121. package/dist/components/selector/selector.types.js +1 -0
  122. package/dist/components/switch/switch.component.d.ts +1 -1
  123. package/dist/components/switch/switch.component.js +11 -7
  124. package/dist/components/switch/switch.stories.js +1 -1
  125. package/dist/components/switch/switch.styles.d.ts +2 -2
  126. package/dist/components/switch/switch.styles.js +2 -2
  127. package/dist/components/switch/switch.types.d.ts +5 -1
  128. package/dist/components/tabs/components/tab/tab.component.js +5 -3
  129. package/dist/components/tabs/components/tab/tab.styles.d.ts +9 -1
  130. package/dist/components/tabs/components/tab/tab.styles.js +12 -8
  131. package/dist/components/tabs/components/tab-panel/tab-panel.component.js +5 -3
  132. package/dist/components/tabs/components/tab-panel/tab-panel.styles.d.ts +7 -1
  133. package/dist/components/tabs/components/tab-panel/tab-panel.styles.js +5 -2
  134. package/dist/components/textarea/textarea.component.d.ts +7 -1
  135. package/dist/components/textarea/textarea.component.js +5 -2
  136. package/dist/components/textarea/textarea.styles.d.ts +7 -1
  137. package/dist/components/textarea/textarea.styles.js +4 -1
  138. package/dist/css/westpac-ui.css +165 -3
  139. package/dist/css/westpac-ui.min.css +165 -3
  140. package/dist/tailwind/constants/colors.d.ts +9 -9
  141. package/dist/tailwind/themes/index.d.ts +11 -11
  142. package/dist/utils/generateId.d.ts +1 -0
  143. package/dist/utils/generateId.js +6 -0
  144. package/dist/utils/index.d.ts +1 -0
  145. package/dist/utils/index.js +1 -0
  146. package/package.json +7 -1
  147. package/src/components/accordion/components/accordion-item/accordion-item.component.tsx +4 -3
  148. package/src/components/accordion/components/accordion-item/accordion-item.styles.ts +17 -9
  149. package/src/components/alert/alert.component.tsx +1 -1
  150. package/src/components/alert/alert.styles.ts +2 -2
  151. package/src/components/autocomplete/autocomplete.styles.ts +3 -3
  152. package/src/components/button/button.component.tsx +9 -10
  153. package/src/components/button/button.styles.ts +4 -0
  154. package/src/components/button-dropdown/button-dropdown.styles.ts +1 -1
  155. package/src/components/button-dropdown/components/panel/panel.component.tsx +4 -3
  156. package/src/components/button-dropdown/components/panel/panel.styles.ts +8 -2
  157. package/src/components/checkbox-group/components/checkbox/checkbox.component.tsx +2 -2
  158. package/src/components/checkbox-group/components/checkbox/checkbox.styles.ts +4 -4
  159. package/src/components/collapsible/collapsible.styles.ts +1 -1
  160. package/src/components/compacta/compacta.component.tsx +4 -3
  161. package/src/components/compacta/compacta.styles.ts +1 -1
  162. package/src/components/flexi-cell/flexi-cell.component.tsx +5 -2
  163. package/src/components/flexi-cell/flexi-cell.styles.ts +5 -2
  164. package/src/components/flexi-cell/flexi-cell.types.ts +4 -0
  165. package/src/components/flexi-cell/index.ts +1 -0
  166. package/src/components/icon/index.ts +1 -0
  167. package/src/components/index.ts +3 -1
  168. package/src/components/input/input.component.tsx +10 -1
  169. package/src/components/input/input.styles.ts +4 -1
  170. package/src/components/link/link.component.tsx +10 -3
  171. package/src/components/link/link.styles.ts +7 -3
  172. package/src/components/list/components/item/item.component.tsx +4 -1
  173. package/src/components/list/components/item/item.styles.ts +5 -2
  174. package/src/components/list/list.stories.tsx +3 -3
  175. package/src/components/list/list.styles.ts +1 -1
  176. package/src/components/modal/components/backdrop/backdrop.styles.ts +2 -2
  177. package/src/components/modal/components/dialog/dialog.component.tsx +4 -3
  178. package/src/components/modal/components/dialog/dialog.styles.ts +7 -3
  179. package/src/components/popover/components/panel/panel.styles.ts +1 -1
  180. package/src/components/popover/popover.component.tsx +0 -1
  181. package/src/components/popover/popover.styles.ts +0 -1
  182. package/src/components/radio-group/components/radio/radio.component.tsx +2 -2
  183. package/src/components/radio-group/components/radio/radio.styles.ts +5 -5
  184. package/src/components/repeater/index.ts +2 -0
  185. package/src/components/repeater/repeater.component.tsx +124 -0
  186. package/src/components/repeater/repeater.stories.tsx +49 -0
  187. package/src/components/repeater/repeater.styles.ts +32 -0
  188. package/src/components/repeater/repeater.types.ts +20 -0
  189. package/src/components/repeater/repeater.utils.tsx +3 -0
  190. package/src/components/select/select.component.tsx +3 -1
  191. package/src/components/select/select.styles.ts +6 -1
  192. package/src/components/selector/components/index.ts +2 -0
  193. package/src/components/selector/components/selector-checkbox-group/components/index.ts +1 -0
  194. package/src/components/selector/components/selector-checkbox-group/components/selector-checkbox-group-option/index.ts +2 -0
  195. package/src/components/selector/components/selector-checkbox-group/components/selector-checkbox-group-option/selector-checkbox-group-option.component.tsx +96 -0
  196. package/src/components/selector/components/selector-checkbox-group/components/selector-checkbox-group-option/selector-checkbox-group-option.styles.ts +53 -0
  197. package/src/components/selector/components/selector-checkbox-group/components/selector-checkbox-group-option/selector-checkbox-group-option.types.ts +15 -0
  198. package/src/components/selector/components/selector-checkbox-group/index.ts +2 -0
  199. package/src/components/selector/components/selector-checkbox-group/selector-checkbox-group.component.tsx +46 -0
  200. package/src/components/selector/components/selector-checkbox-group/selector-checkbox-group.styles.ts +9 -0
  201. package/src/components/selector/components/selector-checkbox-group/selector-checkbox-group.types.ts +25 -0
  202. package/src/components/selector/components/selector-radio-group/components/index.ts +1 -0
  203. package/src/components/selector/components/selector-radio-group/components/selector-radio-group-option/index.ts +2 -0
  204. package/src/components/selector/components/selector-radio-group/components/selector-radio-group-option/selector-radio-group-option.component.tsx +90 -0
  205. package/src/components/selector/components/selector-radio-group/components/selector-radio-group-option/selector-radio-group-option.styles.ts +53 -0
  206. package/src/components/selector/components/selector-radio-group/components/selector-radio-group-option/selector-radio-group-option.types.ts +21 -0
  207. package/src/components/selector/components/selector-radio-group/index.ts +2 -0
  208. package/src/components/selector/components/selector-radio-group/selector-radio-group.component.tsx +48 -0
  209. package/src/components/selector/components/selector-radio-group/selector-radio-group.styles.ts +14 -0
  210. package/src/components/selector/components/selector-radio-group/selector-radio-group.types.ts +22 -0
  211. package/src/components/selector/index.ts +2 -0
  212. package/src/components/selector/selector.component.tsx +34 -0
  213. package/src/components/selector/selector.stories.tsx +621 -0
  214. package/src/components/selector/selector.types.ts +24 -0
  215. package/src/components/switch/switch.component.tsx +19 -7
  216. package/src/components/switch/switch.stories.tsx +1 -1
  217. package/src/components/switch/switch.styles.ts +2 -2
  218. package/src/components/switch/switch.types.ts +5 -1
  219. package/src/components/tabs/components/tab/tab.component.tsx +4 -3
  220. package/src/components/tabs/components/tab/tab.styles.ts +12 -8
  221. package/src/components/tabs/components/tab-panel/tab-panel.component.tsx +3 -2
  222. package/src/components/tabs/components/tab-panel/tab-panel.styles.ts +5 -2
  223. package/src/components/textarea/textarea.component.tsx +9 -1
  224. package/src/components/textarea/textarea.styles.ts +4 -1
  225. package/src/utils/generateId.ts +6 -0
  226. package/src/utils/index.ts +1 -0
@@ -1,7 +1,7 @@
1
1
  import { useAccordionItem } from '@react-aria/accordion';
2
2
  import { AnimatePresence, LazyMotion, m } from 'framer-motion';
3
3
  import React, { useRef } from 'react';
4
- import { mergeProps, useHover, useLocale } from 'react-aria';
4
+ import { mergeProps, useFocusRing, useHover, useLocale } from 'react-aria';
5
5
 
6
6
  import { ArrowLeftIcon, ArrowRightIcon } from '../../../icon/index.js';
7
7
 
@@ -20,11 +20,12 @@ export function AccordionItem<T = any>({
20
20
  const ref = useRef<HTMLButtonElement>(null);
21
21
  const { state, item } = props;
22
22
  const { buttonProps, regionProps } = useAccordionItem<T>(props, state, ref);
23
+ const { isFocusVisible, focusProps } = useFocusRing();
23
24
  const isOpen = state.expandedKeys.has(item.key);
24
25
  const isDisabled = state.disabledKeys.has(item.key);
25
26
  const { hoverProps } = useHover({ isDisabled });
26
27
  const { direction } = useLocale();
27
- const styles = accordionItemStyles({ isOpen, isDisabled, className, color, look });
28
+ const styles = accordionItemStyles({ isOpen, isDisabled, className, color, look, isFocusVisible });
28
29
 
29
30
  return (
30
31
  <Tag className={styles.base()}>
@@ -33,7 +34,7 @@ export function AccordionItem<T = any>({
33
34
  https://www.w3.org/WAI/ARIA/apg/patterns/accordion/examples/accordion/
34
35
  */}
35
36
  <h3>
36
- <button {...mergeProps(buttonProps, hoverProps)} ref={ref} className={styles.itemHeader()}>
37
+ <button {...mergeProps(buttonProps, hoverProps, focusProps)} ref={ref} className={styles.itemHeader()}>
37
38
  <span>{item.props.title}</span>
38
39
  {look === 'material' && <div aria-hidden="true" className={styles.indicator()} />}
39
40
  {look === 'default' &&
@@ -4,33 +4,33 @@ export const styles = tv(
4
4
  {
5
5
  slots: {
6
6
  base: '',
7
- itemHeader: 'typography-body-9 flex w-full items-center justify-between px-3 py-2 focus:focus-outline',
7
+ itemHeader: 'typography-body-9 flex w-full items-center justify-between px-3 py-2',
8
8
  indicator: '',
9
9
  content: 'hidden',
10
10
  },
11
11
  variants: {
12
12
  look: {
13
13
  material: {
14
- itemHeader: 'bg-white transition-colors hover:bg-light',
14
+ itemHeader: 'hover:bg-light bg-white transition-colors',
15
15
  indicator:
16
- 'relative h-2 w-2 before:absolute before:left-1/2 before:top-1/2 before:block before:h-[2px] before:w-full before:-translate-x-1/2 before:-translate-y-1/2 before:bg-muted after:absolute after:left-1/2 after:top-1/2 after:block after:h-full after:w-[2px] after:-translate-x-1/2 after:-translate-y-1/2 after:bg-muted after:transition-transform',
16
+ 'before:bg-muted after:bg-muted relative h-2 w-2 before:absolute before:left-1/2 before:top-1/2 before:block before:h-[2px] before:w-full before:-translate-x-1/2 before:-translate-y-1/2 after:absolute after:left-1/2 after:top-1/2 after:block after:h-full after:w-[2px] after:-translate-x-1/2 after:-translate-y-1/2 after:transition-transform',
17
17
  },
18
18
  default: {
19
- itemHeader: 'border-t border-border bg-light',
19
+ itemHeader: 'border-border bg-light border-t',
20
20
  indicator: 'h-3 w-3 -rotate-90 transition-transform',
21
21
  },
22
22
  },
23
23
  color: {
24
24
  hero: {
25
- itemHeader: 'border-l-[0.375rem] border-l-border transition-colors',
25
+ itemHeader: 'border-l-border border-l-[0.375rem] transition-colors',
26
26
  },
27
27
  primary: {
28
- itemHeader: 'border-l-[0.375rem] border-l-border transition-colors',
28
+ itemHeader: 'border-l-border border-l-[0.375rem] transition-colors',
29
29
  },
30
30
  },
31
31
  isOpen: {
32
32
  true: {
33
- content: 'block border-t border-border p-3',
33
+ content: 'border-border block border-t p-3',
34
34
  },
35
35
  false: {
36
36
  base: '',
@@ -40,6 +40,14 @@ export const styles = tv(
40
40
  true: '',
41
41
  false: '',
42
42
  },
43
+ isFocusVisible: {
44
+ true: {
45
+ itemHeader: 'focus-outline',
46
+ },
47
+ false: {
48
+ itemHeader: 'outline-none',
49
+ },
50
+ },
43
51
  },
44
52
  compoundSlots: [
45
53
  {
@@ -69,12 +77,12 @@ export const styles = tv(
69
77
  {
70
78
  slots: ['content'],
71
79
  color: 'hero',
72
- className: 'border-l-[0.375rem] border-l-border',
80
+ className: 'border-l-border border-l-[0.375rem]',
73
81
  },
74
82
  {
75
83
  slots: ['content'],
76
84
  color: 'primary',
77
- className: 'border-l-[0.375rem] border-l-border',
85
+ className: 'border-l-border border-l-[0.375rem]',
78
86
  },
79
87
  ],
80
88
  },
@@ -59,7 +59,7 @@ export function Alert({
59
59
  >
60
60
  <Tag className={styles.base({ className })} {...props}>
61
61
  <span className={styles.icon()}>
62
- <Icon size={{ initial: 'small', xsl: 'medium' }} />
62
+ <Icon size={{ initial: 'small', xsl: 'medium' }} look="outlined" />
63
63
  </span>
64
64
  <div className={styles.body()}>
65
65
  {!!heading && <HeadingTag className={styles.heading()}>{heading}</HeadingTag>}
@@ -3,7 +3,7 @@ import { tv } from 'tailwind-variants';
3
3
  export const styles = tv(
4
4
  {
5
5
  slots: {
6
- base: 'typography-body-10 relative mb-4 p-3 xsl:flex',
6
+ base: 'typography-body-10 relative mb-4 xsl:flex',
7
7
  icon: 'float-left mr-1 flex-none xsl:mr-2',
8
8
  body: 'relative flex-1 xsl:top-[0.125rem] [&_a]:underline',
9
9
  heading: 'typography-body-9 mb-2 font-bold',
@@ -29,7 +29,7 @@ export const styles = tv(
29
29
  },
30
30
  mode: {
31
31
  box: {
32
- base: 'border-y',
32
+ base: 'border-y p-3',
33
33
  },
34
34
  text: {
35
35
  base: 'bg-[transparent]',
@@ -4,11 +4,11 @@ export const styles = tv(
4
4
  {
5
5
  slots: {
6
6
  base: 'relative flex flex-col',
7
- label: 'block text-left text-sm font-medium text-text',
7
+ label: 'text-text block text-left text-sm font-medium',
8
8
  outerWrapper:
9
- 'form-control relative flex w-full flex-row items-center overflow-hidden pr-2 disabled:form-control-disabled focus:focus-outline',
9
+ 'form-control disabled:form-control-disabled relative flex w-full flex-row items-center overflow-hidden pr-2',
10
10
  input: 'w-full appearance-none bg-[transparent] outline-none',
11
- clearButton: 'flex cursor-default items-center justify-center text-text-50 hover:text-border-60',
11
+ clearButton: 'text-text-50 hover:text-border-60 flex cursor-default items-center justify-center',
12
12
  },
13
13
  variants: {
14
14
  invalid: {
@@ -1,7 +1,5 @@
1
1
  import React, { forwardRef, useMemo } from 'react';
2
- import { FocusRing } from 'react-aria';
3
-
4
- import { DropDownIcon } from '../icon/index.js';
2
+ import { mergeProps, useFocusRing } from 'react-aria';
5
3
 
6
4
  import { styles as buttonStyles } from './button.styles.js';
7
5
  import { type ButtonProps } from './button.types.js';
@@ -24,6 +22,7 @@ function BaseButton(
24
22
  }: ButtonProps,
25
23
  ref: any,
26
24
  ) {
25
+ const { isFocusVisible, focusProps } = useFocusRing();
27
26
  const iconSize = useMemo(() => getIconSize(size), [size]);
28
27
  const styles = buttonStyles({
29
28
  size,
@@ -31,16 +30,16 @@ function BaseButton(
31
30
  soft,
32
31
  block,
33
32
  justify,
33
+ isFocusVisible,
34
34
  hasChildren: !!children,
35
35
  });
36
+
36
37
  return (
37
- <FocusRing focusRingClass="focus-outline">
38
- <Tag ref={ref} className={styles.base({ className })} {...props}>
39
- {IconBefore && <IconBefore size={iconSize} className={styles.iconBefore()} color={iconColor} />}
40
- <span className={styles.text()}>{children}</span>
41
- {IconAfter && <IconAfter size={iconSize} className={styles.iconAfter()} color={iconColor} />}
42
- </Tag>
43
- </FocusRing>
38
+ <Tag ref={ref} className={styles.base({ className })} {...mergeProps(props, focusProps)}>
39
+ {IconBefore && <IconBefore size={iconSize} className={styles.iconBefore()} color={iconColor} />}
40
+ <span className={styles.text()}>{children}</span>
41
+ {IconAfter && <IconAfter size={iconSize} className={styles.iconAfter()} color={iconColor} />}
42
+ </Tag>
44
43
  );
45
44
  }
46
45
 
@@ -37,6 +37,10 @@ export const styles = tv(
37
37
  hasChildren: {
38
38
  true: '',
39
39
  },
40
+ isFocusVisible: {
41
+ true: { base: 'focus-outline' },
42
+ false: { base: 'outline-none' },
43
+ },
40
44
  },
41
45
  compoundSlots: [
42
46
  {
@@ -3,7 +3,7 @@ import { tv } from 'tailwind-variants';
3
3
  export const styles = tv(
4
4
  {
5
5
  slots: {
6
- base: 'focus:focus-outline',
6
+ base: '',
7
7
  panel: 'overflow-hidden',
8
8
  },
9
9
  variants: {
@@ -1,5 +1,5 @@
1
1
  import React, { useCallback, useEffect, useRef } from 'react';
2
- import { DismissButton, Overlay, mergeProps, useOverlay, usePopover } from 'react-aria';
2
+ import { DismissButton, Overlay, mergeProps, useFocusRing, useOverlay, usePopover } from 'react-aria';
3
3
 
4
4
  import { styles as panelStyles } from './panel.styles.js';
5
5
  import { type PanelProps } from './panel.types.js';
@@ -8,7 +8,8 @@ export function Panel({ className, children, state, block, id, ...props }: Panel
8
8
  const popoverRef = useRef<HTMLDivElement>(null);
9
9
  const { overlayProps } = useOverlay({ shouldCloseOnBlur: true, onClose: state.close }, popoverRef);
10
10
  const { popoverProps } = usePopover({ popoverRef, shouldFlip: false, ...props }, state);
11
- const styles = panelStyles({});
11
+ const { isFocused, focusProps } = useFocusRing();
12
+ const styles = panelStyles({ isFocused });
12
13
  const width = props.triggerRef.current?.getBoundingClientRect().width;
13
14
 
14
15
  // Added this based on accessibility features seen https://gel.westpacgroup.com.au/design-system/components/button-dropdowns?b=WBC&tab=accessibility and React Aria doesn't do this
@@ -30,7 +31,7 @@ export function Panel({ className, children, state, block, id, ...props }: Panel
30
31
  return (
31
32
  <Overlay>
32
33
  <div
33
- {...mergeProps(popoverProps, overlayProps)}
34
+ {...mergeProps(popoverProps, overlayProps, focusProps)}
34
35
  id={id}
35
36
  data-testid="panel-dialog"
36
37
  style={{ ...popoverProps.style, width: block && width ? `${width}px` : undefined }}
@@ -5,9 +5,15 @@ export const styles = tv(
5
5
  {
6
6
  slots: {
7
7
  base: 'border-border mt-[0.1875rem] rounded-[3px] border bg-white p-2 shadow-[0_0.375rem_0.75rem_rgba(0,0,0,0.175)]',
8
- dialog: 'focus:outline-none',
8
+ dialog: '',
9
+ },
10
+ variants: {
11
+ isFocused: {
12
+ true: {
13
+ dialog: 'outline-none',
14
+ },
15
+ },
9
16
  },
10
- variants: {},
11
17
  },
12
18
  { responsiveVariants: ['xsl', 'sm', 'md', 'lg', 'xl'] },
13
19
  );
@@ -25,8 +25,8 @@ function BaseCheckbox({ className, hint, children, value, ...props }: CheckboxPr
25
25
  const { size, orientation } = state;
26
26
  const localRef = useRef(null);
27
27
  const { inputProps, isDisabled, isSelected } = useCheckboxGroupItem({ ...props, value, children }, state, localRef);
28
- const { isFocusVisible, focusProps } = useFocusRing();
29
- const styles = checkboxItemStyles({ isDisabled, size, orientation, isFocusVisible });
28
+ const { isFocused, focusProps } = useFocusRing();
29
+ const styles = checkboxItemStyles({ isDisabled, size, orientation, isFocused });
30
30
 
31
31
  return (
32
32
  <label className={styles.base({ className })} ref={ref}>
@@ -7,8 +7,8 @@ export const styles = tv(
7
7
  checkIcon: 'overflow-visible',
8
8
  textWrapper: 'flex flex-col justify-center',
9
9
  labelText: 'typography-body-10 py-[2px] pl-1',
10
- hintText: 'typography-body-10 pl-1 text-muted',
11
- checkbox: 'flex h-4 w-4 items-center justify-center rounded border border-hero',
10
+ hintText: 'typography-body-10 text-muted pl-1',
11
+ checkbox: 'border-hero flex h-4 w-4 items-center justify-center rounded border',
12
12
  },
13
13
  variants: {
14
14
  isDisabled: {
@@ -20,8 +20,8 @@ export const styles = tv(
20
20
  base: 'hover:cursor-pointer',
21
21
  },
22
22
  },
23
- isFocusVisible: {
24
- true: { checkbox: 'rounded focus-outline' },
23
+ isFocused: {
24
+ true: { checkbox: 'focus-outline' },
25
25
  },
26
26
  orientation: {
27
27
  horizontal: {
@@ -3,7 +3,7 @@ import { tv } from 'tailwind-variants';
3
3
  export const styles = tv(
4
4
  {
5
5
  slots: {
6
- base: 'px-0 text-text no-underline hover:underline focus:focus-outline',
6
+ base: 'text-text px-0 no-underline hover:underline',
7
7
  content: 'typography-body-10 mb-2 block',
8
8
  },
9
9
  variants: {
@@ -1,12 +1,13 @@
1
1
  import { AnimatePresence, LazyMotion, m } from 'framer-motion';
2
2
  import React, { useCallback, useEffect, useId, useRef, useState } from 'react';
3
3
 
4
+ import { generateID } from '../../utils/index.js';
5
+ import { Button } from '../button/index.js';
4
6
  import { AddCircleIcon, ExpandLessIcon, ExpandMoreIcon, IconProps, RemoveCircleIcon } from '../icon/index.js';
5
- import { Button, VisuallyHidden } from '../index.js';
7
+ import { VisuallyHidden } from '../index.js';
6
8
 
7
9
  import { styles as compactaStyles } from './compacta.styles.js';
8
10
  import { type CompactaProps } from './compacta.types.js';
9
- import { generateID } from './compacta.utils.js';
10
11
 
11
12
  interface Action {
12
13
  id?: string;
@@ -97,7 +98,7 @@ export function Compacta({
97
98
  setTimeout(() => {
98
99
  headingRefs?.current[action.index]?.focus();
99
100
  }, 1);
100
- setStatus(`Item ${action.index + 1} added`);
101
+ setStatus(`Item added`);
101
102
  }
102
103
 
103
104
  if (action.type === 'remove') {
@@ -12,7 +12,7 @@ export const styles = tv(
12
12
  itemIndex: 'mr-2 w-4 flex-none font-bold',
13
13
  removeBtn: 'mt-[0.875rem] h-auto p-0 no-underline hover:underline',
14
14
  addBtn: 'h-auto p-0 no-underline hover:underline',
15
- toggleBtn: 'focus:outline-focus ml-auto p-0',
15
+ toggleBtn: 'ml-auto p-0',
16
16
  collapsible: '',
17
17
  content: 'xsl:pl-[3.375rem] p-[0_1.125rem_1.875rem]',
18
18
  footer: 'pt-[0.5rem]',
@@ -1,4 +1,5 @@
1
1
  import React, { forwardRef } from 'react';
2
+ import { mergeProps, useFocusRing } from 'react-aria';
2
3
 
3
4
  import { ArrowRightIcon } from '../icon/index.js';
4
5
 
@@ -26,13 +27,15 @@ function FlexiCellBase(
26
27
  withArrow,
27
28
  withBorder = false,
28
29
  href,
30
+ withHoverEffect = false,
29
31
  ...props
30
32
  }: FlexiCellProps,
31
33
  ref: any,
32
34
  ) {
33
- const styles = flexiCellStyles({ className, withBorder, isLink: !!href });
35
+ const { isFocusVisible, focusProps } = useFocusRing();
36
+ const styles = flexiCellStyles({ className, withBorder, isLink: !!href || withHoverEffect, isFocusVisible });
34
37
  return (
35
- <Tag {...({ ref } as any)} className={styles.base({ className })} href={href} {...props}>
38
+ <Tag {...({ ref } as any)} className={styles.base({ className })} href={href} {...mergeProps(props, focusProps)}>
36
39
  {badge && <div className={styles.badge()}>{badge}</div>}
37
40
  {before}
38
41
  <div className={styles.bodyWrapper()}>{body ? <FlexiCellBody>{children}</FlexiCellBody> : children}</div>
@@ -3,14 +3,14 @@ import { tv } from 'tailwind-variants';
3
3
  export const styles = tv(
4
4
  {
5
5
  slots: {
6
- base: 'relative flex gap-2 bg-white px-2 py-3 transition-colors focus:focus-outline',
6
+ base: 'relative flex gap-2 bg-white p-2 transition-colors md:p-3',
7
7
  bodyWrapper: 'flex flex-1 flex-col',
8
8
  badge: 'absolute right-0 top-0',
9
9
  },
10
10
  variants: {
11
11
  withBorder: {
12
12
  true: {
13
- base: 'rounded border border-borderDark',
13
+ base: 'border-borderDark rounded border',
14
14
  },
15
15
  false: {},
16
16
  },
@@ -20,6 +20,9 @@ export const styles = tv(
20
20
  },
21
21
  false: {},
22
22
  },
23
+ isFocusVisible: {
24
+ true: { base: 'focus-outline' },
25
+ },
23
26
  },
24
27
  },
25
28
  { responsiveVariants: ['xsl', 'sm', 'md', 'lg', 'xl'] },
@@ -44,6 +44,10 @@ type BaseFlexiCellProps = {
44
44
  * Adds a border radius and a border
45
45
  */
46
46
  withBorder?: boolean;
47
+ /**
48
+ * With hover style
49
+ */
50
+ withHoverEffect?: boolean;
47
51
  } & HTMLAttributes<HTMLOrSVGElement>;
48
52
 
49
53
  type FlexiCellAsLinkProps = {
@@ -1,2 +1,3 @@
1
+ export * from './components/index.js';
1
2
  export { FlexiCell } from './flexi-cell.component.js';
2
3
  export { type FlexiCellProps } from './flexi-cell.types.js';
@@ -233,4 +233,5 @@ export { STGLogoIcon } from './components/stg-logo-icon.js';
233
233
  export { WBCLogoIcon } from './components/wbc-logo-icon.js';
234
234
  export { WBGLogoIcon } from './components/wbg-logo-icon.js';
235
235
 
236
+ export { Icon } from './icon.component.js';
236
237
  export { type IconProps } from './icon.types.js';
@@ -23,7 +23,7 @@ export * from './panel/index.js';
23
23
  export * from './collapsible/index.js';
24
24
  export * from './list/index.js';
25
25
  export * from './circle/index.js';
26
- export * from './flexi-cell/index.js';
26
+ export { FlexiCell, type FlexiCellProps } from './flexi-cell/index.js';
27
27
  export * from './autocomplete/index.js';
28
28
  export * from './button-dropdown/index.js';
29
29
  export * from './form/index.js';
@@ -32,4 +32,6 @@ export * from './modal/index.js';
32
32
  export * from './pagination/index.js';
33
33
  export * from './popover/index.js';
34
34
  export * from './progress-rope/index.js';
35
+ export * from './selector/index.js';
35
36
  export * from './compacta/index.js';
37
+ export * from './repeater/index.js';
@@ -1,4 +1,5 @@
1
1
  import React, { ForwardedRef, forwardRef } from 'react';
2
+ import { mergeProps, useFocusRing } from 'react-aria';
2
3
 
3
4
  import { styles } from './input.styles.js';
4
5
  import { type InputProps } from './input.types.js';
@@ -7,7 +8,15 @@ export function BaseInput(
7
8
  { className, size = 'medium', invalid = false, ...props }: InputProps,
8
9
  ref: ForwardedRef<HTMLInputElement>,
9
10
  ) {
10
- return <input ref={ref} className={styles({ className, size, invalid })} aria-invalid={invalid} {...props} />;
11
+ const { isFocused, focusProps } = useFocusRing();
12
+ return (
13
+ <input
14
+ ref={ref}
15
+ className={styles({ className, size, invalid, isFocused })}
16
+ aria-invalid={invalid}
17
+ {...mergeProps(props, focusProps)}
18
+ />
19
+ );
11
20
  }
12
21
 
13
22
  export const Input = forwardRef<HTMLInputElement, InputProps>(BaseInput);
@@ -2,7 +2,7 @@ import { tv } from 'tailwind-variants';
2
2
 
3
3
  export const styles = tv(
4
4
  {
5
- base: 'form-control flex-1 read-only:form-control-disabled disabled:form-control-disabled focus:focus-outline group-[.input-field-after]:rounded-r-none group-[.input-field-before]:rounded-l-none group-[.input-field-after]:border-r-0 group-[.input-field-before]:border-l-0',
5
+ base: 'form-control read-only:form-control-disabled disabled:form-control-disabled flex-1 group-[.input-field-after]:rounded-r-none group-[.input-field-before]:rounded-l-none group-[.input-field-after]:border-r-0 group-[.input-field-before]:border-l-0',
6
6
  variants: {
7
7
  size: {
8
8
  small: 'form-control-small group-[.input-field-inset-after]:pr-6 group-[.input-field-inset-before]:pl-6',
@@ -14,6 +14,9 @@ export const styles = tv(
14
14
  true: 'border-danger',
15
15
  false: 'border-borderDark',
16
16
  },
17
+ isFocused: {
18
+ true: 'focus-outline',
19
+ },
17
20
  },
18
21
  },
19
22
  { responsiveVariants: ['xsl', 'sm', 'md', 'lg', 'xl'] },
@@ -1,5 +1,5 @@
1
1
  import React, { forwardRef, useRef } from 'react';
2
- import { useLink } from 'react-aria';
2
+ import { mergeProps, useFocusRing, useLink } from 'react-aria';
3
3
 
4
4
  import { ArrowRightIcon } from '../icon/index.js';
5
5
 
@@ -23,14 +23,21 @@ export function BaseLink(
23
23
  ) {
24
24
  const ref = useRef(propRef);
25
25
  const { linkProps } = useLink({ ...props }, ref);
26
- const styles = linkStyles({ type, underline });
26
+ const { isFocusVisible, focusProps } = useFocusRing();
27
+ const styles = linkStyles({ type, underline, isFocusVisible });
27
28
 
28
29
  if (type === 'standalone' && !IconBefore && !IconAfter) {
29
30
  IconBefore = ArrowRightIcon;
30
31
  }
31
32
 
32
33
  return (
33
- <a {...linkProps} ref={propRef} href={href} target={target} className={styles.base({ className })}>
34
+ <a
35
+ {...mergeProps(linkProps, focusProps)}
36
+ ref={propRef}
37
+ href={href}
38
+ target={target}
39
+ className={styles.base({ className })}
40
+ >
34
41
  {IconBefore && <IconBefore size={iconSize} color="link" className={styles.iconBefore()} />}
35
42
  <span className={styles.text()}>{children}</span>
36
43
  {IconAfter && <IconAfter size={iconSize} color="link" className={styles.iconAfter()} />}
@@ -3,7 +3,7 @@ import { tv } from 'tailwind-variants';
3
3
  export const styles = tv(
4
4
  {
5
5
  slots: {
6
- base: 'inline-flex bg-[transparent] hover:underline focus:focus-outline',
6
+ base: 'inline-flex bg-[transparent] hover:underline',
7
7
  text: 'typography-body-10',
8
8
  iconBefore: 'mr-1',
9
9
  iconAfter: 'ml-1',
@@ -11,17 +11,21 @@ export const styles = tv(
11
11
  variants: {
12
12
  type: {
13
13
  inline: {
14
- base: 'items-baseline text-link',
14
+ base: 'text-link items-baseline',
15
15
  iconBefore: 'self-center',
16
16
  iconAfter: 'self-center',
17
17
  },
18
18
  standalone: {
19
- base: 'items-center text-text',
19
+ base: 'text-text items-center',
20
20
  },
21
21
  },
22
22
  underline: {
23
23
  true: '',
24
24
  },
25
+ isFocusVisible: {
26
+ true: { base: 'focus-outline' },
27
+ false: { base: 'outline-none' },
28
+ },
25
29
  },
26
30
  compoundSlots: [
27
31
  {
@@ -1,4 +1,5 @@
1
1
  import React, { forwardRef, useContext } from 'react';
2
+ import { useFocusRing } from 'react-aria';
2
3
 
3
4
  import { ListContext } from '../../list.component.js';
4
5
  import { getStateValues } from '../../list.utils.js';
@@ -14,6 +15,7 @@ export function BaseItem({ className, children, href, look, type, spacing, icon,
14
15
  look = stateValues.look;
15
16
  type = stateValues.type;
16
17
  const Icon = stateValues.icon;
18
+ const { isFocusVisible, focusProps } = useFocusRing();
17
19
 
18
20
  const styles = itemStyles({
19
21
  look,
@@ -21,6 +23,7 @@ export function BaseItem({ className, children, href, look, type, spacing, icon,
21
23
  spacing: stateValues.spacing,
22
24
  icon: !!Icon,
23
25
  nested: (state.nested && state.nested > 0) || false,
26
+ isFocusVisible,
24
27
  });
25
28
 
26
29
  const bulletToRender = () => {
@@ -38,7 +41,7 @@ export function BaseItem({ className, children, href, look, type, spacing, icon,
38
41
  {bulletToRender()}
39
42
  <li className={styles.base({ className })} {...props}>
40
43
  {type === 'link' ? (
41
- <a href={href} className={styles.link()} ref={ref}>
44
+ <a href={href} className={styles.link()} ref={ref} {...focusProps}>
42
45
  {children}
43
46
  </a>
44
47
  ) : (
@@ -3,9 +3,9 @@ import { tv } from 'tailwind-variants';
3
3
  export const styles = tv(
4
4
  {
5
5
  slots: {
6
- base: 'typography-body-10 pl-[1.1875rem]',
6
+ base: 'pl-[1.1875rem]',
7
7
  bullet: 'absolute block border',
8
- link: 'text-text hover:cursor-pointer hover:underline focus:focus-outline',
8
+ link: 'text-text hover:cursor-pointer hover:underline',
9
9
  wrapper: 'relative',
10
10
  },
11
11
  variants: {
@@ -71,6 +71,9 @@ export const styles = tv(
71
71
  nested: {
72
72
  true: { bullet: 'bg-[transparent]' },
73
73
  },
74
+ isFocusVisible: {
75
+ true: { link: 'focus-outline' },
76
+ },
74
77
  },
75
78
  compoundSlots: [
76
79
  {
@@ -47,9 +47,9 @@ export const ListTypes = () =>
47
47
  <div className="mb-2" key={type}>
48
48
  <h1 className="typography-body-8">{type}</h1>
49
49
  <List type={type} icon={type === 'icon' ? AndroidIcon : undefined}>
50
- <List.Item>Styled {type} list</List.Item>
51
- <List.Item>Styled {type} list</List.Item>
52
- <List.Item>Styled {type} list</List.Item>
50
+ <List.Item href={type === 'link' ? '#' : undefined}>Styled {type} list</List.Item>
51
+ <List.Item href={type === 'link' ? '#' : undefined}>Styled {type} list</List.Item>
52
+ <List.Item href={type === 'link' ? '#' : undefined}>Styled {type} list</List.Item>
53
53
  <List icon={type === 'link' ? AndroidIcon : undefined}>
54
54
  <List.Item>Styled {type} list</List.Item>
55
55
  <List.Item>Styled {type} list</List.Item>
@@ -3,7 +3,7 @@ import { tv } from 'tailwind-variants';
3
3
  export const styles = tv(
4
4
  {
5
5
  slots: {
6
- base: 'list-none',
6
+ base: 'typography-body-10 list-none',
7
7
  },
8
8
  variants: {
9
9
  type: {
@@ -2,7 +2,7 @@ import { tv } from 'tailwind-variants';
2
2
 
3
3
  export const styles = tv({
4
4
  slots: {
5
- base: 'fixed inset-0 z-50 flex animate-fadeIn justify-center overflow-y-auto bg-black/50 p-2',
6
- modal: 'relative top-5 z-10 h-fit w-full animate-fadeInDown focus:outline-none',
5
+ base: 'animate-fadeIn fixed inset-0 z-50 flex justify-center overflow-y-auto bg-black/50 p-2',
6
+ modal: 'animate-fadeInDown relative top-5 z-10 h-fit w-full',
7
7
  },
8
8
  });