@veracity/vui 2.18.3 → 2.20.0-beta.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 (263) hide show
  1. package/dist/cjs/button/button.d.ts.map +1 -1
  2. package/dist/cjs/button/button.js +3 -2
  3. package/dist/cjs/button/button.js.map +1 -1
  4. package/dist/cjs/checkbox/checkbox.d.ts.map +1 -1
  5. package/dist/cjs/checkbox/checkbox.js +7 -4
  6. package/dist/cjs/checkbox/checkbox.js.map +1 -1
  7. package/dist/cjs/checkbox/consts.d.ts +5 -3
  8. package/dist/cjs/checkbox/consts.d.ts.map +1 -1
  9. package/dist/cjs/checkbox/consts.js +5 -3
  10. package/dist/cjs/checkbox/consts.js.map +1 -1
  11. package/dist/cjs/checkbox/theme.d.ts +2 -2
  12. package/dist/cjs/checkbox/theme.js +1 -1
  13. package/dist/cjs/checkbox/theme.js.map +1 -1
  14. package/dist/cjs/index.d.ts +1 -0
  15. package/dist/cjs/index.d.ts.map +1 -1
  16. package/dist/cjs/index.js +1 -0
  17. package/dist/cjs/index.js.map +1 -1
  18. package/dist/cjs/input/consts.d.ts +27 -21
  19. package/dist/cjs/input/consts.d.ts.map +1 -1
  20. package/dist/cjs/input/consts.js +8 -2
  21. package/dist/cjs/input/consts.js.map +1 -1
  22. package/dist/cjs/input/helpText.d.ts +1 -1
  23. package/dist/cjs/input/helpText.d.ts.map +1 -1
  24. package/dist/cjs/input/helpText.js +2 -2
  25. package/dist/cjs/input/helpText.js.map +1 -1
  26. package/dist/cjs/input/input.d.ts.map +1 -1
  27. package/dist/cjs/input/input.js +22 -18
  28. package/dist/cjs/input/input.js.map +1 -1
  29. package/dist/cjs/input/input.types.d.ts +7 -3
  30. package/dist/cjs/input/input.types.d.ts.map +1 -1
  31. package/dist/cjs/input/inputInput.js +3 -2
  32. package/dist/cjs/input/inputInput.js.map +1 -1
  33. package/dist/cjs/input/theme.d.ts +20 -8
  34. package/dist/cjs/input/theme.d.ts.map +1 -1
  35. package/dist/cjs/input/theme.js +14 -2
  36. package/dist/cjs/input/theme.js.map +1 -1
  37. package/dist/cjs/label/index.d.ts +4 -0
  38. package/dist/cjs/label/index.d.ts.map +1 -0
  39. package/dist/cjs/label/index.js +25 -0
  40. package/dist/cjs/label/index.js.map +1 -0
  41. package/dist/cjs/label/label.d.ts +6 -0
  42. package/dist/cjs/label/label.d.ts.map +1 -0
  43. package/dist/cjs/label/label.js +41 -0
  44. package/dist/cjs/label/label.js.map +1 -0
  45. package/dist/cjs/label/label.types.d.ts +7 -0
  46. package/dist/cjs/label/label.types.d.ts.map +1 -0
  47. package/dist/cjs/label/label.types.js +3 -0
  48. package/dist/cjs/label/label.types.js.map +1 -0
  49. package/dist/cjs/label/theme.d.ts +23 -0
  50. package/dist/cjs/label/theme.d.ts.map +1 -0
  51. package/dist/cjs/label/theme.js +28 -0
  52. package/dist/cjs/label/theme.js.map +1 -0
  53. package/dist/cjs/list/list.d.ts.map +1 -1
  54. package/dist/cjs/list/list.js +64 -2
  55. package/dist/cjs/list/list.js.map +1 -1
  56. package/dist/cjs/menu/menuItem.d.ts.map +1 -1
  57. package/dist/cjs/menu/menuItem.js +1 -1
  58. package/dist/cjs/menu/menuItem.js.map +1 -1
  59. package/dist/cjs/menu/menuList.d.ts.map +1 -1
  60. package/dist/cjs/menu/menuList.js +1 -1
  61. package/dist/cjs/menu/menuList.js.map +1 -1
  62. package/dist/cjs/radio/consts.d.ts +5 -3
  63. package/dist/cjs/radio/consts.d.ts.map +1 -1
  64. package/dist/cjs/radio/consts.js +5 -3
  65. package/dist/cjs/radio/consts.js.map +1 -1
  66. package/dist/cjs/radio/radio.d.ts.map +1 -1
  67. package/dist/cjs/radio/radio.js +6 -2
  68. package/dist/cjs/radio/radio.js.map +1 -1
  69. package/dist/cjs/radio/theme.d.ts +2 -2
  70. package/dist/cjs/radio/theme.js +1 -1
  71. package/dist/cjs/radio/theme.js.map +1 -1
  72. package/dist/cjs/select/select.d.ts +11 -6
  73. package/dist/cjs/select/select.d.ts.map +1 -1
  74. package/dist/cjs/select/select.js +9 -2
  75. package/dist/cjs/select/select.js.map +1 -1
  76. package/dist/cjs/select/select.types.d.ts +8 -0
  77. package/dist/cjs/select/select.types.d.ts.map +1 -1
  78. package/dist/cjs/select/selectButton.d.ts.map +1 -1
  79. package/dist/cjs/select/selectButton.js +16 -5
  80. package/dist/cjs/select/selectButton.js.map +1 -1
  81. package/dist/cjs/select/selectGroup.js +1 -1
  82. package/dist/cjs/select/selectGroup.js.map +1 -1
  83. package/dist/cjs/select/selectOption.js +1 -1
  84. package/dist/cjs/select/selectOption.js.map +1 -1
  85. package/dist/cjs/select/theme.d.ts +32 -0
  86. package/dist/cjs/select/theme.d.ts.map +1 -1
  87. package/dist/cjs/select/theme.js +33 -1
  88. package/dist/cjs/select/theme.js.map +1 -1
  89. package/dist/cjs/switch/switchLabel.d.ts.map +1 -1
  90. package/dist/cjs/switch/switchLabel.js +4 -0
  91. package/dist/cjs/switch/switchLabel.js.map +1 -1
  92. package/dist/cjs/switch/theme.d.ts +17 -0
  93. package/dist/cjs/switch/theme.d.ts.map +1 -1
  94. package/dist/cjs/switch/theme.js +18 -0
  95. package/dist/cjs/switch/theme.js.map +1 -1
  96. package/dist/cjs/tabs/tabsNavBar.d.ts.map +1 -1
  97. package/dist/cjs/tabs/tabsNavBar.js +5 -1
  98. package/dist/cjs/tabs/tabsNavBar.js.map +1 -1
  99. package/dist/cjs/textarea/textarea.d.ts +1 -1
  100. package/dist/cjs/textarea/textarea.d.ts.map +1 -1
  101. package/dist/cjs/textarea/textarea.js +23 -17
  102. package/dist/cjs/textarea/textarea.js.map +1 -1
  103. package/dist/cjs/textarea/textarea.types.d.ts +8 -0
  104. package/dist/cjs/textarea/textarea.types.d.ts.map +1 -1
  105. package/dist/cjs/textarea/theme.d.ts +8 -8
  106. package/dist/cjs/textarea/theme.js +2 -2
  107. package/dist/cjs/textarea/theme.js.map +1 -1
  108. package/dist/cjs/theme/components.d.ts +101 -20
  109. package/dist/cjs/theme/components.d.ts.map +1 -1
  110. package/dist/cjs/theme/components.js +56 -54
  111. package/dist/cjs/theme/components.js.map +1 -1
  112. package/dist/cjs/theme/defaultTheme.d.ts +101 -20
  113. package/dist/cjs/theme/defaultTheme.d.ts.map +1 -1
  114. package/dist/esm/button/button.d.ts.map +1 -1
  115. package/dist/esm/button/button.js +3 -2
  116. package/dist/esm/button/button.js.map +1 -1
  117. package/dist/esm/checkbox/checkbox.d.ts.map +1 -1
  118. package/dist/esm/checkbox/checkbox.js +7 -4
  119. package/dist/esm/checkbox/checkbox.js.map +1 -1
  120. package/dist/esm/checkbox/consts.d.ts +5 -3
  121. package/dist/esm/checkbox/consts.d.ts.map +1 -1
  122. package/dist/esm/checkbox/consts.js +5 -3
  123. package/dist/esm/checkbox/consts.js.map +1 -1
  124. package/dist/esm/checkbox/theme.d.ts +2 -2
  125. package/dist/esm/checkbox/theme.js +1 -1
  126. package/dist/esm/checkbox/theme.js.map +1 -1
  127. package/dist/esm/index.d.ts +1 -0
  128. package/dist/esm/index.d.ts.map +1 -1
  129. package/dist/esm/index.js +1 -0
  130. package/dist/esm/index.js.map +1 -1
  131. package/dist/esm/input/consts.d.ts +27 -21
  132. package/dist/esm/input/consts.d.ts.map +1 -1
  133. package/dist/esm/input/consts.js +7 -1
  134. package/dist/esm/input/consts.js.map +1 -1
  135. package/dist/esm/input/helpText.d.ts +1 -1
  136. package/dist/esm/input/helpText.d.ts.map +1 -1
  137. package/dist/esm/input/helpText.js +2 -2
  138. package/dist/esm/input/helpText.js.map +1 -1
  139. package/dist/esm/input/input.d.ts.map +1 -1
  140. package/dist/esm/input/input.js +25 -21
  141. package/dist/esm/input/input.js.map +1 -1
  142. package/dist/esm/input/input.types.d.ts +7 -3
  143. package/dist/esm/input/input.types.d.ts.map +1 -1
  144. package/dist/esm/input/inputInput.js +3 -2
  145. package/dist/esm/input/inputInput.js.map +1 -1
  146. package/dist/esm/input/theme.d.ts +20 -8
  147. package/dist/esm/input/theme.d.ts.map +1 -1
  148. package/dist/esm/input/theme.js +14 -2
  149. package/dist/esm/input/theme.js.map +1 -1
  150. package/dist/esm/label/index.d.ts +4 -0
  151. package/dist/esm/label/index.d.ts.map +1 -0
  152. package/dist/esm/label/index.js +4 -0
  153. package/dist/esm/label/index.js.map +1 -0
  154. package/dist/esm/label/label.d.ts +6 -0
  155. package/dist/esm/label/label.d.ts.map +1 -0
  156. package/dist/esm/label/label.js +24 -0
  157. package/dist/esm/label/label.js.map +1 -0
  158. package/dist/esm/label/label.types.d.ts +7 -0
  159. package/dist/esm/label/label.types.d.ts.map +1 -0
  160. package/dist/esm/label/label.types.js +2 -0
  161. package/dist/esm/label/label.types.js.map +1 -0
  162. package/dist/esm/label/theme.d.ts +23 -0
  163. package/dist/esm/label/theme.d.ts.map +1 -0
  164. package/dist/esm/label/theme.js +26 -0
  165. package/dist/esm/label/theme.js.map +1 -0
  166. package/dist/esm/list/list.d.ts.map +1 -1
  167. package/dist/esm/list/list.js +40 -2
  168. package/dist/esm/list/list.js.map +1 -1
  169. package/dist/esm/menu/menuItem.d.ts.map +1 -1
  170. package/dist/esm/menu/menuItem.js +1 -1
  171. package/dist/esm/menu/menuItem.js.map +1 -1
  172. package/dist/esm/menu/menuList.d.ts.map +1 -1
  173. package/dist/esm/menu/menuList.js +1 -1
  174. package/dist/esm/menu/menuList.js.map +1 -1
  175. package/dist/esm/radio/consts.d.ts +5 -3
  176. package/dist/esm/radio/consts.d.ts.map +1 -1
  177. package/dist/esm/radio/consts.js +5 -3
  178. package/dist/esm/radio/consts.js.map +1 -1
  179. package/dist/esm/radio/radio.d.ts.map +1 -1
  180. package/dist/esm/radio/radio.js +6 -2
  181. package/dist/esm/radio/radio.js.map +1 -1
  182. package/dist/esm/radio/theme.d.ts +2 -2
  183. package/dist/esm/radio/theme.js +1 -1
  184. package/dist/esm/radio/theme.js.map +1 -1
  185. package/dist/esm/select/select.d.ts +11 -6
  186. package/dist/esm/select/select.d.ts.map +1 -1
  187. package/dist/esm/select/select.js +13 -6
  188. package/dist/esm/select/select.js.map +1 -1
  189. package/dist/esm/select/select.types.d.ts +8 -0
  190. package/dist/esm/select/select.types.d.ts.map +1 -1
  191. package/dist/esm/select/selectButton.d.ts.map +1 -1
  192. package/dist/esm/select/selectButton.js +16 -5
  193. package/dist/esm/select/selectButton.js.map +1 -1
  194. package/dist/esm/select/selectGroup.js +1 -1
  195. package/dist/esm/select/selectGroup.js.map +1 -1
  196. package/dist/esm/select/selectOption.js +2 -2
  197. package/dist/esm/select/selectOption.js.map +1 -1
  198. package/dist/esm/select/theme.d.ts +32 -0
  199. package/dist/esm/select/theme.d.ts.map +1 -1
  200. package/dist/esm/select/theme.js +33 -1
  201. package/dist/esm/select/theme.js.map +1 -1
  202. package/dist/esm/switch/switchLabel.d.ts.map +1 -1
  203. package/dist/esm/switch/switchLabel.js +4 -0
  204. package/dist/esm/switch/switchLabel.js.map +1 -1
  205. package/dist/esm/switch/theme.d.ts +17 -0
  206. package/dist/esm/switch/theme.d.ts.map +1 -1
  207. package/dist/esm/switch/theme.js +18 -0
  208. package/dist/esm/switch/theme.js.map +1 -1
  209. package/dist/esm/tabs/tabsNavBar.d.ts.map +1 -1
  210. package/dist/esm/tabs/tabsNavBar.js +4 -1
  211. package/dist/esm/tabs/tabsNavBar.js.map +1 -1
  212. package/dist/esm/textarea/textarea.d.ts +1 -1
  213. package/dist/esm/textarea/textarea.d.ts.map +1 -1
  214. package/dist/esm/textarea/textarea.js +27 -21
  215. package/dist/esm/textarea/textarea.js.map +1 -1
  216. package/dist/esm/textarea/textarea.types.d.ts +8 -0
  217. package/dist/esm/textarea/textarea.types.d.ts.map +1 -1
  218. package/dist/esm/textarea/theme.d.ts +8 -8
  219. package/dist/esm/textarea/theme.js +2 -2
  220. package/dist/esm/textarea/theme.js.map +1 -1
  221. package/dist/esm/theme/components.d.ts +101 -20
  222. package/dist/esm/theme/components.d.ts.map +1 -1
  223. package/dist/esm/theme/components.js +2 -0
  224. package/dist/esm/theme/components.js.map +1 -1
  225. package/dist/esm/theme/defaultTheme.d.ts +101 -20
  226. package/dist/esm/theme/defaultTheme.d.ts.map +1 -1
  227. package/dist/tsconfig.legacy.tsbuildinfo +1 -1
  228. package/dist/tsconfig.tsbuildinfo +1 -1
  229. package/package.json +1 -1
  230. package/src/button/button.tsx +11 -6
  231. package/src/checkbox/checkbox.tsx +7 -5
  232. package/src/checkbox/consts.ts +6 -4
  233. package/src/checkbox/theme.ts +1 -1
  234. package/src/index.ts +1 -0
  235. package/src/input/consts.ts +12 -5
  236. package/src/input/helpText.tsx +2 -2
  237. package/src/input/input.tsx +90 -67
  238. package/src/input/input.types.ts +7 -4
  239. package/src/input/inputInput.tsx +2 -2
  240. package/src/input/theme.ts +14 -2
  241. package/src/label/index.ts +3 -0
  242. package/src/label/label.tsx +31 -0
  243. package/src/label/label.types.ts +8 -0
  244. package/src/label/theme.ts +29 -0
  245. package/src/list/list.tsx +44 -3
  246. package/src/menu/menuItem.tsx +1 -10
  247. package/src/menu/menuList.tsx +1 -0
  248. package/src/radio/consts.ts +6 -4
  249. package/src/radio/radio.tsx +5 -3
  250. package/src/radio/theme.ts +1 -1
  251. package/src/select/select.tsx +30 -5
  252. package/src/select/select.types.ts +8 -0
  253. package/src/select/selectButton.tsx +18 -5
  254. package/src/select/selectGroup.tsx +1 -1
  255. package/src/select/selectOption.tsx +2 -2
  256. package/src/select/theme.ts +33 -1
  257. package/src/switch/switchLabel.tsx +5 -0
  258. package/src/switch/theme.ts +21 -0
  259. package/src/tabs/tabsNavBar.tsx +4 -1
  260. package/src/textarea/textarea.tsx +78 -45
  261. package/src/textarea/textarea.types.ts +8 -0
  262. package/src/textarea/theme.ts +2 -2
  263. package/src/theme/components.ts +2 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@veracity/vui",
3
- "version": "2.18.3",
3
+ "version": "2.20.0-beta.0",
4
4
  "description": "Veracity UI is a React component library crafted for use within Veracity applications and pages. Based on Styled Components and @xstyled.",
5
5
  "module": "./dist/esm/index.js",
6
6
  "main": "./dist/cjs/index.js",
@@ -55,7 +55,7 @@ export const Button = vui<'button', ButtonProps>((props, ref) => {
55
55
  dropDownIcon = 'falAngleDown',
56
56
  icon,
57
57
  iconLeft,
58
- iconRight,
58
+ iconRight: iconRightProp,
59
59
  isActive,
60
60
  isDropDown,
61
61
  isElevated,
@@ -77,6 +77,8 @@ export const Button = vui<'button', ButtonProps>((props, ref) => {
77
77
 
78
78
  const { iconProps: stateIconProps, ...stateProps } = states[state] ?? {}
79
79
 
80
+ const iconRight = isDropDown ? 'falAngleDown' : iconRightProp
81
+
80
82
  const variant = filterUndefined({
81
83
  variant: states[state]?.variant ?? variantProp,
82
84
  })
@@ -138,7 +140,7 @@ export const Button = vui<'button', ButtonProps>((props, ref) => {
138
140
  focusRing={3}
139
141
  h={h}
140
142
  pl={pl}
141
- pr={isDropDown ? 0 : pr}
143
+ pr={pr}
142
144
  ref={ref}
143
145
  title={title || ariaLabel}
144
146
  type="button"
@@ -159,19 +161,22 @@ export const Button = vui<'button', ButtonProps>((props, ref) => {
159
161
  {!icon && (
160
162
  <>
161
163
  {isLoading ? (
162
- <ButtonIcon mr={isDropDown ? 0 : iconLeftMr} {...loadingIconProps} />
164
+ <ButtonIcon mr={iconLeftMr} {...loadingIconProps} />
163
165
  ) : isString(iconLeft) ? (
164
- <ButtonIcon mr={isDropDown ? 0 : iconLeftMr} name={iconLeft} />
166
+ <ButtonIcon mr={iconLeftMr} name={iconLeft} />
165
167
  ) : (
166
168
  iconLeft
167
169
  )}
168
170
 
169
171
  {children ?? (isReactText(text) ? <ButtonText {...{ isTruncated, text }} /> : text)}
170
172
 
171
- {isString(iconRight) ? <ButtonIcon ml={iconRightMl} name={iconRight} /> : iconRight}
173
+ {isString(iconRight) ? (
174
+ <ButtonIcon ml={!children && !text ? 0 : iconRightMl} name={iconRight} />
175
+ ) : (
176
+ iconRight
177
+ )}
172
178
  </>
173
179
  )}
174
- {isDropDown && <ButtonIcon name={dropDownIcon} />}
175
180
  </Content>
176
181
  </ButtonBase>
177
182
  </ButtonProvider>
@@ -1,4 +1,4 @@
1
- import React, { useEffect, useState } from 'react'
1
+ import { useEffect, useState } from 'react'
2
2
 
3
3
  import { omitThemingProps, styled, th, useStyleConfig, vui } from '../core'
4
4
  import Icon from '../icon'
@@ -38,8 +38,11 @@ export const CheckboxBase = styled.labelBox<CheckboxStyleProps>`
38
38
  color: ${p => th.color(p.controlHoverColor)};
39
39
  }
40
40
 
41
+ .vui-checkboxControl:focus-within {
42
+ color: ${checkboxColors.focus};
43
+ }
44
+
41
45
  &[aria-disabled='true'] {
42
- color: ${checkboxColors.disabled};
43
46
  cursor: not-allowed;
44
47
 
45
48
  .vui-checkboxControl {
@@ -81,8 +84,8 @@ export const Checkbox = vui<'span', CheckboxProps>((props, ref) => {
81
84
  const { color: controlColor, hoverColor, ...controlStyles } = styles.control
82
85
 
83
86
  const icon = isIndeterminate ? iconIndeterminate : isChecked ? iconChecked : iconProp
84
- const controlMr = children || label ? '12px' : 0
85
- const color = controlColor ? controlColor : checkboxColors.main
87
+ const controlMr = children || label ? 1 : 0
88
+ const color = isChecked || isIndeterminate ? checkboxColors.checked : controlColor
86
89
  const controlHoverColor = hoverColor ? hoverColor : checkboxColors.hover
87
90
  const isLongLabel = label && label?.length >= 60
88
91
 
@@ -119,7 +122,6 @@ export const Checkbox = vui<'span', CheckboxProps>((props, ref) => {
119
122
  {...controlStyles}
120
123
  >
121
124
  <CheckboxInput
122
- aria-label={label ? label : 'input-checkbox'}
123
125
  className="vui-checkboxInput"
124
126
  onChange={handleOnChange}
125
127
  ref={inputRef}
@@ -1,5 +1,7 @@
1
1
  export const checkboxColors = {
2
- main: 'seaBlue.main',
3
- hover: 'seaBlue.40',
4
- disabled: 'sandstone.main',
5
- }
2
+ unchecked: 'sandstone.60',
3
+ checked: 'seaBlue.28',
4
+ hover: 'seaBlue.20',
5
+ focus: 'seaBlue.35',
6
+ disabled: 'sandstone.90',
7
+ } as const
@@ -2,7 +2,7 @@ import { checkboxColors } from './consts'
2
2
 
3
3
  const baseStyle = {
4
4
  control: {
5
- color: checkboxColors.main,
5
+ color: checkboxColors.unchecked,
6
6
  hoverColor: checkboxColors.hover,
7
7
  },
8
8
  }
package/src/index.ts CHANGED
@@ -25,6 +25,7 @@ export * from './icon'
25
25
  export * from './icons'
26
26
  export * from './image'
27
27
  export * from './input'
28
+ export * from './label'
28
29
  export * from './link'
29
30
  export * from './list'
30
31
  export * from './logo'
@@ -7,17 +7,17 @@ export const inputColors = {
7
7
  helpText: 'sandstone.30',
8
8
  icons: 'seaBlue.main',
9
9
  disabled: 'sandstone.95',
10
- focus: 'seaBlue.main',
10
+ focus: 'focusColor',
11
11
  error: 'energyRed.45',
12
12
  loading: 'seaBlue.80',
13
13
  success: 'landGreen.35',
14
- }
14
+ } as const
15
15
 
16
16
  export const stateIcons = {
17
17
  error: 'falExclamationTriangle',
18
18
  loading: 'fadSpinnerThird',
19
19
  success: 'falCheck',
20
- }
20
+ } as const
21
21
 
22
22
  export const inputStateMapping: InputStateMapping = {
23
23
  error: {
@@ -49,11 +49,18 @@ export const displayValueOnlyTextSize = {
49
49
  md: 'sm',
50
50
  lg: 'md',
51
51
  xl: 'lg',
52
- }
52
+ } as const
53
53
 
54
54
  export const clearIconSize = {
55
55
  sm: 'sm',
56
56
  md: 'sm',
57
57
  lg: 'sm',
58
58
  xl: 'md',
59
- }
59
+ } as const
60
+
61
+ export const helpTextSize = {
62
+ sm: 'sm',
63
+ md: 'sm',
64
+ lg: 'md',
65
+ xl: 'md',
66
+ } as const
@@ -8,7 +8,7 @@ import { inputColors } from './consts'
8
8
  import { useInputContext } from './context'
9
9
  import { HelpTextProps } from './input.types'
10
10
 
11
- /** Displaying help text bellow the input. */
11
+ /** Displaying help text below the input. */
12
12
  export const HelpText = vui<'div', HelpTextProps>((props, ref) => {
13
13
  const { className, children, isError, ...rest } = props
14
14
  const inputProps = useInputContext()
@@ -23,7 +23,7 @@ export const HelpText = vui<'div', HelpTextProps>((props, ref) => {
23
23
  className={cs('vui-inputHelpText', className)}
24
24
  color={color}
25
25
  display="flex"
26
- py={1}
26
+ pt={0.5}
27
27
  ref={ref}
28
28
  {...styles.helpText}
29
29
  {...rest}
@@ -1,11 +1,12 @@
1
- import React, { useEffect, useMemo, useState } from 'react'
1
+ import { useEffect, useId, useMemo, useState } from 'react'
2
2
 
3
3
  import { IconButton } from '../button'
4
4
  import { styled, useStyleConfig, vui, VuiComponent } from '../core'
5
+ import Label from '../label'
5
6
  import { T } from '../t'
6
7
  import { ChangeEvent, cs, filterUndefined, isString } from '../utils'
7
8
  import AutoCompletePopover from './autoCompletePopover'
8
- import { clearIconSize, displayValueOnlyTextSize, inputColors, inputStateMapping } from './consts'
9
+ import { clearIconSize, displayValueOnlyTextSize, helpTextSize, inputColors, inputStateMapping } from './consts'
9
10
  import { InputProvider } from './context'
10
11
  import { getInitialCount } from './helpers'
11
12
  import HelpText from './helpText'
@@ -43,24 +44,27 @@ export const InputBase = styled.divBox`
43
44
  export const Input = vui<'div', InputProps>((props, ref) => {
44
45
  const {
45
46
  allowClear,
47
+ ariaLabel,
46
48
  autoComplete,
47
- autoCompleteOptions,
48
49
  autoCompleteMaxHeight,
50
+ autoCompleteOptions,
49
51
  autoFocus,
50
52
  children,
51
53
  className,
52
54
  defaultValue,
53
55
  disabled,
56
+ displayValueOnly,
54
57
  errorText,
58
+ helpText,
55
59
  iconLeft,
56
60
  iconRight,
57
- id,
61
+ id: idProp,
58
62
  input,
59
63
  inputProps,
60
64
  inputRef,
61
65
  itemLeft,
62
66
  itemRight,
63
- helpText,
67
+ label,
64
68
  max,
65
69
  maxLength,
66
70
  min,
@@ -73,7 +77,6 @@ export const Input = vui<'div', InputProps>((props, ref) => {
73
77
  readOnly,
74
78
  required,
75
79
  showCount,
76
- displayValueOnly,
77
80
  size = 'lg',
78
81
  state = '',
79
82
  stateMapping,
@@ -84,10 +87,13 @@ export const Input = vui<'div', InputProps>((props, ref) => {
84
87
  ...rest
85
88
  } = props
86
89
 
90
+ const generatedId = useId()
87
91
  const [count, setCount] = useState(getInitialCount(props))
88
92
  const [valueInternal, setValueInternal] = useState(defaultValue || '')
89
93
  const states = { ...inputStateMapping, ...stateMapping }
90
94
 
95
+ const id = idProp || generatedId
96
+
91
97
  const styles = useStyleConfig('Input', props)
92
98
 
93
99
  const context = useMemo(() => filterUndefined({ disabled, size, variant }), [disabled, size, variant])
@@ -130,10 +136,7 @@ export const Input = vui<'div', InputProps>((props, ref) => {
130
136
  return (
131
137
  <InputProvider value={context}>
132
138
  {displayValueOnly ? (
133
- <T
134
- className={cs('vui-input-value', className)}
135
- size={displayValueOnlyTextSize[size] as 'xs' | 'md' | 'sm' | 'lg'}
136
- >
139
+ <T className={cs('vui-input-value', className)} size={displayValueOnlyTextSize[size]}>
137
140
  {value || defaultValue}
138
141
  </T>
139
142
  ) : (
@@ -143,67 +146,87 @@ export const Input = vui<'div', InputProps>((props, ref) => {
143
146
  filterAutoCompleteOptions={filterAutoCompleteOptions}
144
147
  onAutoCompleteSelect={onAutoCompleteSelect}
145
148
  >
146
- <InputBase className={cs('vui-input', className)} ref={ref} {...styles.container} {...aliasedProps} {...rest}>
147
- {itemLeft}
148
- {isString(iconLeft) ? <InputIcon ml={1} name={iconLeft} /> : iconLeft}
149
- {children ?? input ?? (
150
- <InputInput
151
- ref={inputRef}
152
- {...{
153
- autoFocus,
154
- defaultValue,
155
- disabled,
156
- id,
157
- max,
158
- maxLength,
159
- min,
160
- name,
161
- onBlur,
162
- onChange,
163
- onFocus,
164
- pattern,
165
- placeholder,
166
- readOnly,
167
- required,
168
- step,
169
- type,
170
- }}
171
- autoComplete={autoCompleteOptions?.length ? 'off' : autoComplete}
172
- value={valueInternal}
173
- {...inputProps}
174
- />
175
- )}
176
- {isString(iconRight) ? <InputIcon mr={1} name={iconRight} /> : iconRight}
177
- {itemRight}
178
- {state && <InputIcon mr={1} {...states[state]?.iconProps} />}
179
- {allowClear && (
180
- <IconButton
181
- disabled={!valueInternal}
182
- icon="falTimes"
183
- mr={0.5}
184
- onClick={onClear}
185
- size={clearIconSize[size] as 'md' | 'sm' | 'lg'}
186
- title="Clear"
187
- />
149
+ <>
150
+ {isString(label) ? (
151
+ <Label aria-disabled={disabled} className="vui-input-label" htmlFor={id} mb={0.5} {...styles.label}>
152
+ {label}
153
+ </Label>
154
+ ) : (
155
+ label
188
156
  )}
189
- {showCount && (
190
- <T
191
- className="vui-inputCount"
192
- color={maxLength && count > maxLength ? inputColors.error : inputColors.helpText}
193
- position="absolute"
194
- right={0}
195
- size="sm"
196
- top="calc(100% + 1px)"
197
- >
198
- {count} {maxLength ? `/ ${maxLength}` : null}
199
- </T>
200
- )}
201
- </InputBase>
157
+ <InputBase
158
+ className={cs('vui-input', className)}
159
+ ref={ref}
160
+ {...styles.container}
161
+ {...aliasedProps}
162
+ {...rest}
163
+ >
164
+ {itemLeft}
165
+ {isString(iconLeft) ? <InputIcon ml={1} name={iconLeft} /> : iconLeft}
166
+ {children ?? input ?? (
167
+ <InputInput
168
+ ref={inputRef}
169
+ {...{
170
+ autoFocus,
171
+ ariaLabel,
172
+ defaultValue,
173
+ disabled,
174
+ id,
175
+ max,
176
+ maxLength,
177
+ min,
178
+ name,
179
+ onBlur,
180
+ onChange,
181
+ onFocus,
182
+ pattern,
183
+ placeholder,
184
+ readOnly,
185
+ required,
186
+ step,
187
+ type,
188
+ }}
189
+ autoComplete={autoCompleteOptions?.length ? 'off' : autoComplete}
190
+ value={valueInternal}
191
+ {...inputProps}
192
+ />
193
+ )}
194
+ {isString(iconRight) ? <InputIcon mr={1} name={iconRight} /> : iconRight}
195
+ {itemRight}
196
+ {state && <InputIcon mr={1} {...states[state]?.iconProps} />}
197
+ {allowClear && (
198
+ <IconButton
199
+ disabled={!valueInternal}
200
+ icon="falTimes"
201
+ mr={0.5}
202
+ onClick={onClear}
203
+ size={clearIconSize[size]}
204
+ title="Clear"
205
+ />
206
+ )}
207
+ {showCount && (
208
+ <T
209
+ className="vui-inputCount"
210
+ color={maxLength && count > maxLength ? inputColors.error : inputColors.helpText}
211
+ position="absolute"
212
+ right={0}
213
+ size="sm"
214
+ top="calc(100% + 1px)"
215
+ >
216
+ {count} {maxLength ? `/ ${maxLength}` : null}
217
+ </T>
218
+ )}
219
+ </InputBase>
220
+ </>
202
221
  </AutoCompletePopover>
203
222
  )}
204
223
 
205
- {!!helpText && <HelpText>{helpText}</HelpText>}
206
- {!!errorText && <HelpText isError>{errorText}</HelpText>}
224
+ {!!helpText && <HelpText size={helpTextSize[size]}>{helpText}</HelpText>}
225
+ {!!errorText && (
226
+ <HelpText isError size={helpTextSize[size]}>
227
+ {errorText}
228
+ </HelpText>
229
+ )}
207
230
  </InputProvider>
208
231
  )
209
232
  }) as VuiComponent<'div', InputProps> & {
@@ -7,7 +7,6 @@ import { ThemingProps } from '../theme'
7
7
  import { ChangeEventHandler, FocusEventHandler, PropsOf } from '../utils'
8
8
 
9
9
  export type InputInputProps = PropsOf<'input', SystemProps>
10
-
11
10
  export type InputProps = SystemProps &
12
11
  ThemingProps<'Input'> & {
13
12
  /** Allow to remove input content with clear icon. */
@@ -20,14 +19,18 @@ export type InputProps = SystemProps &
20
19
  autoCompleteMaxHeight?: number
21
20
  /** Passed to the inner input. */
22
21
  autoFocus?: boolean
22
+ /** ARIA label for the input element. */
23
+ ariaLabel?: string
23
24
  /** Deprecated. Please use variant instead. @deprecated */
24
25
  colorScheme?: 'green' | 'grey' | 'red'
25
26
  /** Passed to the inner input. */
26
27
  defaultValue?: number | string
27
28
  /** Passed to the inner input. */
28
29
  disabled?: boolean
29
- /** Socket displaying error text bellow an input. */
30
+ /** Socket displaying error text below an input. */
30
31
  errorText?: string | React.ReactNode
32
+ /** Socket displaying help text below an input. */
33
+ helpText?: React.ReactNode | string
31
34
  /** Socket displaying an icon on the left. */
32
35
  iconLeft?: IconProp | JSX.Element
33
36
  /** Socket displaying an icon on the right. */
@@ -44,8 +47,8 @@ export type InputProps = SystemProps &
44
47
  itemLeft?: React.ReactNode
45
48
  /** Socket displaying a custom element on the right. */
46
49
  itemRight?: React.ReactNode
47
- /** Socket displaying help text bellow an input. */
48
- helpText?: React.ReactNode | string
50
+ /** The label. */
51
+ label?: string | React.ReactNode
49
52
  /** Passed to the inner input. */
50
53
  max?: number | string
51
54
  /** Passed to the inner input. */
@@ -25,18 +25,18 @@ export const InputInputBase = styled.input`
25
25
 
26
26
  /** Displays an input element within the Input component. */
27
27
  export const InputInput = vui<'input', InputInputProps>((props, ref) => {
28
- const { className, autoComplete, ...rest } = props
28
+ const { type, className, autoComplete, ...rest } = props
29
29
  const inputProps = useInputContext()
30
30
  const mergedProps = { ...inputProps, ...props }
31
31
  const styles = useStyleConfig('Input', mergedProps)
32
32
 
33
33
  const aliasedProps = filterUndefined({
34
34
  'aria-disabled': mergedProps.disabled,
35
+ 'aria-label': mergedProps.ariaLabel,
35
36
  })
36
37
 
37
38
  return (
38
39
  <InputInputBase
39
- aria-label="input-text"
40
40
  autoComplete={autoComplete}
41
41
  className={cs('vui-inputInput', className)}
42
42
  ref={ref}
@@ -2,7 +2,7 @@ import { inputColors } from './consts'
2
2
 
3
3
  const baseStyle = {
4
4
  container: {
5
- focusWithinRing: 2,
5
+ focusWithinRing: 3,
6
6
  color: inputColors.inputText,
7
7
  },
8
8
  input: {
@@ -15,7 +15,7 @@ const defaultProps = {
15
15
  variant: 'grey',
16
16
  }
17
17
 
18
- const parts = ['container', 'icon', 'input']
18
+ const parts = ['container', 'icon', 'input', 'label']
19
19
 
20
20
  const sizes = {
21
21
  sm: {
@@ -27,6 +27,9 @@ const sizes = {
27
27
  size: 'xs',
28
28
  },
29
29
  input: {},
30
+ label: {
31
+ fontSize: 'sm',
32
+ },
30
33
  },
31
34
  md: {
32
35
  container: {
@@ -37,6 +40,9 @@ const sizes = {
37
40
  size: 'sm',
38
41
  },
39
42
  input: {},
43
+ label: {
44
+ fontSize: 'sm',
45
+ },
40
46
  },
41
47
  lg: {
42
48
  container: {
@@ -47,6 +53,9 @@ const sizes = {
47
53
  size: 'md',
48
54
  },
49
55
  input: {},
56
+ label: {
57
+ fontSize: 'md',
58
+ },
50
59
  },
51
60
  xl: {
52
61
  container: {
@@ -57,6 +66,9 @@ const sizes = {
57
66
  size: 'md',
58
67
  },
59
68
  input: {},
69
+ label: {
70
+ fontSize: 'lg',
71
+ },
60
72
  },
61
73
  }
62
74
 
@@ -0,0 +1,3 @@
1
+ export * from './label'
2
+ export { default } from './label'
3
+ export * from './label.types'
@@ -0,0 +1,31 @@
1
+ import { omitThemingProps, styled, useStyleConfig, vui } from '../core'
2
+ import T from '../t'
3
+ import { cs } from '../utils'
4
+ import { LabelProps } from './label.types'
5
+
6
+ export const LabelBase = styled.labelBox`
7
+ display: block;
8
+ font-weight: 600;
9
+ width: 100%;
10
+ color: darkBlue.main;
11
+
12
+ &[aria-disabled='true'] {
13
+ color: sandstone.75;
14
+ cursor: not-allowed;
15
+ }
16
+ `
17
+
18
+ /** Displays a paragraph of text. */
19
+ export const Label = vui<'label', LabelProps>((props, ref) => {
20
+ const { children, className, text, ...rest } = omitThemingProps(props)
21
+ const styles = useStyleConfig('Label', props)
22
+
23
+ return (
24
+ <T as={LabelBase} className={cs('vui-label', className)} ref={ref} {...styles} {...rest}>
25
+ {children ?? text}
26
+ </T>
27
+ )
28
+ })
29
+
30
+ Label.displayName = 'Label'
31
+ export default Label
@@ -0,0 +1,8 @@
1
+ import { SystemProps, TypographyProps } from '../system'
2
+ import { ThemingProps } from '../theme'
3
+
4
+ export type LabelProps = SystemProps &
5
+ ThemingProps<'P'> & {
6
+ /** Displays given text if no children are provided. */
7
+ text?: number | string
8
+ }
@@ -0,0 +1,29 @@
1
+ const baseStyle = {}
2
+
3
+ const defaultProps = {
4
+ size: 'md',
5
+ }
6
+
7
+ const sizes = {
8
+ xs: {
9
+ fontSize: 'xs',
10
+ },
11
+ sm: {
12
+ fontSize: 'sm',
13
+ },
14
+ md: {
15
+ fontSize: 'md',
16
+ },
17
+ lg: {
18
+ fontSize: 'lg',
19
+ },
20
+ }
21
+
22
+ const variants = {}
23
+
24
+ export default {
25
+ baseStyle,
26
+ defaultProps,
27
+ sizes,
28
+ variants,
29
+ }
package/src/list/list.tsx CHANGED
@@ -1,4 +1,5 @@
1
- import React, { useMemo } from 'react'
1
+ import { is } from '@xstyled/util'
2
+ import React, { useEffect, useMemo, useRef } from 'react'
2
3
 
3
4
  import { styled, useStyleConfig, vui, VuiComponent } from '../core'
4
5
  import { cs, filterUndefined, isArray, isReactText } from '../utils'
@@ -10,6 +11,10 @@ import ListIcon from './listIcon'
10
11
  import ListItem from './listItem'
11
12
  import ListText from './listText'
12
13
 
14
+ const clickKeys = ['Enter', ' ']
15
+ const nextKeys = ['ArrowDown', 'Tab']
16
+ const prevKeys = ['ArrowUp']
17
+
13
18
  export const ListBase = styled.ulBox``
14
19
 
15
20
  /** Displays a list of list link items and optional heading. Exposes some props to the children via context. */
@@ -19,11 +24,47 @@ export const List = vui<'ul', ListProps>((props, ref) => {
19
24
 
20
25
  const context = useMemo(() => filterUndefined({ isInteractive, size, variant }), [isInteractive, size, variant])
21
26
 
27
+ const listRef = useRef<HTMLUListElement>(null)
28
+
29
+ const [_, setActive] = React.useState(-1)
30
+
31
+ const onKeydown = (event: KeyboardEvent) => {
32
+ if ([...prevKeys, ...nextKeys, ...clickKeys].includes(event.key)) {
33
+ event.preventDefault()
34
+ setActive((a: number) => {
35
+ let active = a
36
+ if (listRef.current) {
37
+ const allChildren = Array.from(listRef.current.childNodes)
38
+ const tabIndexedChildren = allChildren.filter(child => (child as HTMLElement).tabIndex === 0)
39
+
40
+ if (nextKeys.includes(event.key) && active < tabIndexedChildren.length - 1) active++
41
+ if (prevKeys.includes(event.key)) active = active > 0 ? active - 1 : 0
42
+
43
+ tabIndexedChildren.forEach((node, index) => {
44
+ if (index === active) {
45
+ if (clickKeys.includes(event.key)) (node as HTMLElement)?.click()
46
+ else (node as HTMLElement)?.focus()
47
+ }
48
+ })
49
+ }
50
+ return active
51
+ })
52
+ }
53
+ }
54
+
55
+ useEffect(() => {
56
+ if (listRef.current && isInteractive) {
57
+ listRef.current.addEventListener('keydown', onKeydown)
58
+ return () => {
59
+ listRef.current?.removeEventListener('keydown', onKeydown)
60
+ }
61
+ }
62
+ }, [listRef.current, isInteractive])
63
+
22
64
  return (
23
65
  <ListProvider value={context}>
24
- <ListBase className={cs('vui-list', className)} ref={ref} {...styles.container} {...rest}>
66
+ <ListBase className={cs('vui-list', className)} ref={ref || listRef} {...styles.container} {...rest}>
25
67
  {isReactText(heading) ? <ListHeading text={heading} /> : heading}
26
-
27
68
  {children ??
28
69
  (isArray<ListItemProps>(items)
29
70
  ? items.map(({ key, ...props }, index) => <ListItem key={key ?? index} {...props} />)