@arbor-education/design-system.components 0.0.4 → 0.0.5

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 (245) hide show
  1. package/README.md +1 -1
  2. package/dist/components/button/Button.d.ts +5 -2
  3. package/dist/components/button/Button.d.ts.map +1 -1
  4. package/dist/components/button/Button.js +3 -1
  5. package/dist/components/button/Button.js.map +1 -1
  6. package/dist/components/card/Card.d.ts +1 -2
  7. package/dist/components/card/Card.d.ts.map +1 -1
  8. package/dist/components/card/Card.js +3 -3
  9. package/dist/components/card/Card.js.map +1 -1
  10. package/dist/components/card/Card.test.js +0 -5
  11. package/dist/components/card/Card.test.js.map +1 -1
  12. package/dist/components/formField/FormField.d.ts +4 -0
  13. package/dist/components/formField/FormField.d.ts.map +1 -1
  14. package/dist/components/formField/FormField.js +2 -1
  15. package/dist/components/formField/FormField.js.map +1 -1
  16. package/dist/components/formField/FormField.stories.d.ts.map +1 -1
  17. package/dist/components/formField/FormField.stories.js +3 -1
  18. package/dist/components/formField/FormField.stories.js.map +1 -1
  19. package/dist/components/formField/FormField.test.js +5 -0
  20. package/dist/components/formField/FormField.test.js.map +1 -1
  21. package/dist/components/formField/inputs/checkbox/CheckboxInput.d.ts +7 -0
  22. package/dist/components/formField/inputs/checkbox/CheckboxInput.d.ts.map +1 -0
  23. package/dist/components/formField/inputs/checkbox/CheckboxInput.js +31 -0
  24. package/dist/components/formField/inputs/checkbox/CheckboxInput.js.map +1 -0
  25. package/dist/components/formField/inputs/checkbox/CheckboxInput.stories.d.ts +17 -0
  26. package/dist/components/formField/inputs/checkbox/CheckboxInput.stories.d.ts.map +1 -0
  27. package/dist/components/formField/inputs/checkbox/CheckboxInput.stories.js +19 -0
  28. package/dist/components/formField/inputs/checkbox/CheckboxInput.stories.js.map +1 -0
  29. package/dist/components/formField/inputs/checkbox/CheckboxInput.test.d.ts +2 -0
  30. package/dist/components/formField/inputs/checkbox/CheckboxInput.test.d.ts.map +1 -0
  31. package/dist/components/formField/inputs/checkbox/CheckboxInput.test.js +30 -0
  32. package/dist/components/formField/inputs/checkbox/CheckboxInput.test.js.map +1 -0
  33. package/dist/components/formField/inputs/dropdown/Dropdown.d.ts +11 -0
  34. package/dist/components/formField/inputs/dropdown/Dropdown.d.ts.map +1 -0
  35. package/dist/components/formField/inputs/dropdown/Dropdown.js +43 -0
  36. package/dist/components/formField/inputs/dropdown/Dropdown.js.map +1 -0
  37. package/dist/components/formField/inputs/dropdown/Dropdown.stories.d.ts +161 -0
  38. package/dist/components/formField/inputs/dropdown/Dropdown.stories.d.ts.map +1 -0
  39. package/dist/components/formField/inputs/dropdown/Dropdown.stories.js +172 -0
  40. package/dist/components/formField/inputs/dropdown/Dropdown.stories.js.map +1 -0
  41. package/dist/components/formField/inputs/dropdown/Dropdown.test.d.ts +2 -0
  42. package/dist/components/formField/inputs/dropdown/Dropdown.test.d.ts.map +1 -0
  43. package/dist/components/formField/inputs/dropdown/Dropdown.test.js +93 -0
  44. package/dist/components/formField/inputs/dropdown/Dropdown.test.js.map +1 -0
  45. package/dist/components/formField/inputs/dropdown/buttons/dropdownButton/DropdownButton.d.ts +11 -0
  46. package/dist/components/formField/inputs/dropdown/buttons/dropdownButton/DropdownButton.d.ts.map +1 -0
  47. package/dist/components/formField/inputs/dropdown/buttons/dropdownButton/DropdownButton.js +15 -0
  48. package/dist/components/formField/inputs/dropdown/buttons/dropdownButton/DropdownButton.js.map +1 -0
  49. package/dist/components/formField/inputs/dropdown/items/DropdownItemRenderer.d.ts +10 -0
  50. package/dist/components/formField/inputs/dropdown/items/DropdownItemRenderer.d.ts.map +1 -0
  51. package/dist/components/formField/inputs/dropdown/items/DropdownItemRenderer.js +12 -0
  52. package/dist/components/formField/inputs/dropdown/items/DropdownItemRenderer.js.map +1 -0
  53. package/dist/components/formField/inputs/dropdown/items/dropdownItem/DropdownItem.d.ts +9 -0
  54. package/dist/components/formField/inputs/dropdown/items/dropdownItem/DropdownItem.d.ts.map +1 -0
  55. package/dist/components/formField/inputs/dropdown/items/dropdownItem/DropdownItem.js +17 -0
  56. package/dist/components/formField/inputs/dropdown/items/dropdownItem/DropdownItem.js.map +1 -0
  57. package/dist/components/formField/inputs/dropdown/items/dropdownMultiLineItem/DropdownMultiLineItem.d.ts +7 -0
  58. package/dist/components/formField/inputs/dropdown/items/dropdownMultiLineItem/DropdownMultiLineItem.d.ts.map +1 -0
  59. package/dist/components/formField/inputs/dropdown/items/dropdownMultiLineItem/DropdownMultiLineItem.js +16 -0
  60. package/dist/components/formField/inputs/dropdown/items/dropdownMultiLineItem/DropdownMultiLineItem.js.map +1 -0
  61. package/dist/components/formField/inputs/dropdown/wrapper/DropdownWrapper.d.ts +16 -0
  62. package/dist/components/formField/inputs/dropdown/wrapper/DropdownWrapper.d.ts.map +1 -0
  63. package/dist/components/formField/inputs/dropdown/wrapper/DropdownWrapper.js +73 -0
  64. package/dist/components/formField/inputs/dropdown/wrapper/DropdownWrapper.js.map +1 -0
  65. package/dist/components/formField/inputs/number/NumberInput.d.ts +6 -0
  66. package/dist/components/formField/inputs/number/NumberInput.d.ts.map +1 -0
  67. package/dist/components/formField/inputs/number/NumberInput.js +39 -0
  68. package/dist/components/formField/inputs/number/NumberInput.js.map +1 -0
  69. package/dist/components/formField/inputs/number/NumberInput.stories.d.ts +20 -0
  70. package/dist/components/formField/inputs/number/NumberInput.stories.d.ts.map +1 -0
  71. package/dist/components/formField/inputs/number/NumberInput.stories.js +22 -0
  72. package/dist/components/formField/inputs/number/NumberInput.stories.js.map +1 -0
  73. package/dist/components/formField/inputs/number/NumberInput.test.d.ts +2 -0
  74. package/dist/components/formField/inputs/number/NumberInput.test.d.ts.map +1 -0
  75. package/dist/components/formField/inputs/number/NumberInput.test.js +30 -0
  76. package/dist/components/formField/inputs/number/NumberInput.test.js.map +1 -0
  77. package/dist/components/formField/inputs/radio/RadioButtonInput.d.ts +7 -0
  78. package/dist/components/formField/inputs/radio/RadioButtonInput.d.ts.map +1 -0
  79. package/dist/components/formField/inputs/radio/RadioButtonInput.js +9 -0
  80. package/dist/components/formField/inputs/radio/RadioButtonInput.js.map +1 -0
  81. package/dist/components/formField/inputs/radio/RadioButtonInput.stories.d.ts +46 -0
  82. package/dist/components/formField/inputs/radio/RadioButtonInput.stories.d.ts.map +1 -0
  83. package/dist/components/formField/inputs/radio/RadioButtonInput.stories.js +83 -0
  84. package/dist/components/formField/inputs/radio/RadioButtonInput.stories.js.map +1 -0
  85. package/dist/components/formField/inputs/radio/RadioButtonInput.test.d.ts +2 -0
  86. package/dist/components/formField/inputs/radio/RadioButtonInput.test.d.ts.map +1 -0
  87. package/dist/components/formField/inputs/radio/RadioButtonInput.test.js +34 -0
  88. package/dist/components/formField/inputs/radio/RadioButtonInput.test.js.map +1 -0
  89. package/dist/components/heading/Heading.d.ts +392 -388
  90. package/dist/components/heading/Heading.d.ts.map +1 -1
  91. package/dist/components/heading/Heading.js +8 -1
  92. package/dist/components/heading/Heading.js.map +1 -1
  93. package/dist/components/heading/Heading.stories.d.ts.map +1 -1
  94. package/dist/components/heading/Heading.stories.js +7 -8
  95. package/dist/components/heading/Heading.stories.js.map +1 -1
  96. package/dist/components/heading/HeadingInnerContainer.d.ts +2 -2
  97. package/dist/components/heading/HeadingInnerContainer.js +4 -4
  98. package/dist/components/icon/Icon.d.ts +2 -2
  99. package/dist/components/icon/Icon.d.ts.map +1 -1
  100. package/dist/components/icon/Icon.js.map +1 -1
  101. package/dist/components/icon/allowedIcons.d.ts +1 -0
  102. package/dist/components/icon/allowedIcons.d.ts.map +1 -1
  103. package/dist/components/section/Section.d.ts +18 -0
  104. package/dist/components/section/Section.d.ts.map +1 -0
  105. package/dist/components/section/Section.js +36 -0
  106. package/dist/components/section/Section.js.map +1 -0
  107. package/dist/components/section/Section.stories.d.ts +18 -0
  108. package/dist/components/section/Section.stories.d.ts.map +1 -0
  109. package/dist/components/section/Section.stories.js +27 -0
  110. package/dist/components/section/Section.stories.js.map +1 -0
  111. package/dist/components/section/Section.test.d.ts +2 -0
  112. package/dist/components/section/Section.test.d.ts.map +1 -0
  113. package/dist/components/section/Section.test.js +157 -0
  114. package/dist/components/section/Section.test.js.map +1 -0
  115. package/dist/components/slideover/Slideover.d.ts +11 -0
  116. package/dist/components/slideover/Slideover.d.ts.map +1 -0
  117. package/dist/components/slideover/Slideover.js +11 -0
  118. package/dist/components/slideover/Slideover.js.map +1 -0
  119. package/dist/components/slideover/Slideover.test.d.ts +2 -0
  120. package/dist/components/slideover/Slideover.test.d.ts.map +1 -0
  121. package/dist/components/slideover/Slideover.test.js +33 -0
  122. package/dist/components/slideover/Slideover.test.js.map +1 -0
  123. package/dist/components/slideoverManager/SlideoverManager.d.ts +7 -0
  124. package/dist/components/slideoverManager/SlideoverManager.d.ts.map +1 -0
  125. package/dist/components/slideoverManager/SlideoverManager.js +29 -0
  126. package/dist/components/slideoverManager/SlideoverManager.js.map +1 -0
  127. package/dist/components/slideoverManager/SlideoverManager.stories.d.ts +15 -0
  128. package/dist/components/slideoverManager/SlideoverManager.stories.d.ts.map +1 -0
  129. package/dist/components/slideoverManager/SlideoverManager.stories.js +102 -0
  130. package/dist/components/slideoverManager/SlideoverManager.stories.js.map +1 -0
  131. package/dist/components/slideoverManager/SlideoverManager.test.d.ts +2 -0
  132. package/dist/components/slideoverManager/SlideoverManager.test.d.ts.map +1 -0
  133. package/dist/components/slideoverManager/SlideoverManager.test.js +53 -0
  134. package/dist/components/slideoverManager/SlideoverManager.test.js.map +1 -0
  135. package/dist/index.css +1948 -1334
  136. package/dist/index.css.map +1 -1
  137. package/dist/index.d.ts +7 -1
  138. package/dist/index.d.ts.map +1 -1
  139. package/dist/index.js +7 -1
  140. package/dist/index.js.map +1 -1
  141. package/dist/utils/Constants.d.ts +6 -0
  142. package/dist/utils/Constants.d.ts.map +1 -0
  143. package/dist/utils/Constants.js +6 -0
  144. package/dist/utils/Constants.js.map +1 -0
  145. package/dist/utils/PopupParentContext.d.ts +3 -0
  146. package/dist/utils/PopupParentContext.d.ts.map +1 -0
  147. package/dist/utils/PopupParentContext.js +6 -0
  148. package/dist/utils/PopupParentContext.js.map +1 -0
  149. package/dist/utils/PubSub.d.ts +11 -0
  150. package/dist/utils/PubSub.d.ts.map +1 -0
  151. package/dist/utils/PubSub.js +27 -0
  152. package/dist/utils/PubSub.js.map +1 -0
  153. package/dist/utils/PubSub.test.d.ts +2 -0
  154. package/dist/utils/PubSub.test.d.ts.map +1 -0
  155. package/dist/utils/PubSub.test.js +229 -0
  156. package/dist/utils/PubSub.test.js.map +1 -0
  157. package/dist/utils/SlideoverUtils.d.ts +7 -0
  158. package/dist/utils/SlideoverUtils.d.ts.map +1 -0
  159. package/dist/utils/SlideoverUtils.js +8 -0
  160. package/dist/utils/SlideoverUtils.js.map +1 -0
  161. package/dist/utils/getDefaultPopupParent.d.ts +2 -0
  162. package/dist/utils/getDefaultPopupParent.d.ts.map +1 -0
  163. package/dist/utils/getDefaultPopupParent.js +13 -0
  164. package/dist/utils/getDefaultPopupParent.js.map +1 -0
  165. package/dist/utils/hooks/useComponentDidMount.d.ts +3 -0
  166. package/dist/utils/hooks/useComponentDidMount.d.ts.map +1 -0
  167. package/dist/utils/hooks/useComponentDidMount.js +5 -0
  168. package/dist/utils/hooks/useComponentDidMount.js.map +1 -0
  169. package/dist/utils/hooks/usePubSub.d.ts +2 -0
  170. package/dist/utils/hooks/usePubSub.d.ts.map +1 -0
  171. package/dist/utils/hooks/usePubSub.js +12 -0
  172. package/dist/utils/hooks/usePubSub.js.map +1 -0
  173. package/package.json +3 -3
  174. package/src/components/button/Button.story.tsx +9 -0
  175. package/src/components/button/Button.tsx +10 -2
  176. package/src/components/button/button.scss +75 -33
  177. package/src/components/card/Card.test.tsx +0 -6
  178. package/src/components/card/Card.tsx +12 -7
  179. package/src/components/card/card.scss +32 -18
  180. package/src/components/formField/FormField.stories.tsx +9 -1
  181. package/src/components/formField/FormField.test.tsx +6 -0
  182. package/src/components/formField/FormField.tsx +5 -0
  183. package/src/components/formField/formField.scss +20 -8
  184. package/src/components/formField/inputs/checkbox/CheckboxInput.stories.tsx +22 -0
  185. package/src/components/formField/inputs/checkbox/CheckboxInput.test.tsx +35 -0
  186. package/src/components/formField/inputs/checkbox/CheckboxInput.tsx +79 -0
  187. package/src/components/formField/inputs/checkbox/checkboxInput.scss +96 -0
  188. package/src/components/formField/inputs/dropdown/Dropdown.stories.tsx +185 -0
  189. package/src/components/formField/inputs/dropdown/Dropdown.test.tsx +185 -0
  190. package/src/components/formField/inputs/dropdown/Dropdown.tsx +82 -0
  191. package/src/components/formField/inputs/dropdown/buttons/dropdownButton/DropdownButton.tsx +41 -0
  192. package/src/components/formField/inputs/dropdown/buttons/dropdownButton/dropdownButton.scss +12 -0
  193. package/src/components/formField/inputs/dropdown/dropdown.scss +24 -0
  194. package/src/components/formField/inputs/dropdown/items/DropdownItemRenderer.tsx +38 -0
  195. package/src/components/formField/inputs/dropdown/items/dropdownItem/DropdownItem.tsx +49 -0
  196. package/src/components/formField/inputs/dropdown/items/dropdownItem/dropdownItem.scss +62 -0
  197. package/src/components/formField/inputs/dropdown/items/dropdownMultiLineItem/DropdownMultiLineItem.tsx +48 -0
  198. package/src/components/formField/inputs/dropdown/items/dropdownMultiLineItem/dropdownMultiLineItem.scss +52 -0
  199. package/src/components/formField/inputs/dropdown/wrapper/DropdownWrapper.tsx +138 -0
  200. package/src/components/formField/inputs/dropdown/wrapper/dropdownWrapper.scss +32 -0
  201. package/src/components/formField/inputs/input.scss +25 -26
  202. package/src/components/formField/inputs/number/NumberInput.stories.tsx +25 -0
  203. package/src/components/formField/inputs/number/NumberInput.test.tsx +33 -0
  204. package/src/components/formField/inputs/number/NumberInput.tsx +107 -0
  205. package/src/components/formField/inputs/number/numberInput.scss +68 -0
  206. package/src/components/formField/inputs/radio/RadioButtonInput.stories.tsx +97 -0
  207. package/src/components/formField/inputs/radio/RadioButtonInput.test.tsx +37 -0
  208. package/src/components/formField/inputs/radio/RadioButtonInput.tsx +46 -0
  209. package/src/components/formField/inputs/radio/radioButtonInput.scss +100 -0
  210. package/src/components/formField/label/label.scss +5 -1
  211. package/src/components/heading/Heading.stories.tsx +11 -12
  212. package/src/components/heading/Heading.tsx +21 -2
  213. package/src/components/heading/heading.scss +4 -0
  214. package/src/components/icon/Icon.tsx +2 -2
  215. package/src/components/icon/allowedIcons.tsx +2 -0
  216. package/src/components/pill/pill.scss +7 -7
  217. package/src/components/section/Section.stories.tsx +34 -0
  218. package/src/components/section/Section.test.tsx +308 -0
  219. package/src/components/section/Section.tsx +131 -0
  220. package/src/components/section/section.scss +42 -0
  221. package/src/components/slideover/Slideover.test.tsx +36 -0
  222. package/src/components/slideover/Slideover.tsx +38 -0
  223. package/src/components/slideover/slideover.scss +50 -0
  224. package/src/components/slideoverManager/SlideoverManager.stories.tsx +374 -0
  225. package/src/components/slideoverManager/SlideoverManager.test.tsx +64 -0
  226. package/src/components/slideoverManager/SlideoverManager.tsx +51 -0
  227. package/src/components/slideoverManager/slideoverManager.scss +13 -0
  228. package/src/components/tabs/tabs.scss +8 -7
  229. package/src/global.scss +10 -1
  230. package/src/index.scss +14 -3
  231. package/src/index.ts +9 -3
  232. package/src/tokens.scss +1321 -1239
  233. package/src/utils/Constants.ts +5 -0
  234. package/src/utils/PopupParentContext.ts +6 -0
  235. package/src/utils/PubSub.test.ts +303 -0
  236. package/src/utils/PubSub.ts +34 -0
  237. package/src/utils/SlideoverUtils.ts +9 -0
  238. package/src/utils/getDefaultPopupParent.ts +14 -0
  239. package/src/utils/hooks/useComponentDidMount.ts +5 -0
  240. package/src/utils/hooks/usePubSub.ts +12 -0
  241. package/tokens/export-config.json +32 -0
  242. package/tokens/json/$metadata.json +5 -0
  243. package/tokens/json/$themes.json +1333 -0
  244. package/tokens/json/Arbor.json +6329 -0
  245. package/src/components/heading/HeadingInnerContainer.tsx +0 -18
@@ -1,11 +1,16 @@
1
1
  import classNames from 'classnames';
2
2
  import React, { type ButtonHTMLAttributes } from 'react';
3
3
 
4
+ export type ButtonType = 'primary' | 'secondary' | 'tertiary' | 'primary-destructive' | 'secondary-destructive' | 'text-link' | 'dropdown';
5
+
6
+ export type ButtonSize = 'M' | 'S';
7
+
4
8
  export type ButtonProps = {
5
- type?: 'primary' | 'secondary' | 'tertiary' | 'primary-destructive' | 'secondary-destructive' | 'text-link';
6
- size?: 'M' | 'S';
9
+ type?: ButtonType;
10
+ size?: ButtonSize;
7
11
  children?: React.ReactNode;
8
12
  className?: string;
13
+ error?: boolean;
9
14
  [key: string]: unknown;
10
15
  } & Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'type'>;
11
16
 
@@ -25,6 +30,9 @@ export const Button = (props: ButtonProps) => {
25
30
  className={classNames('ds-button',
26
31
  `ds-button--${type}`,
27
32
  `ds-button--${size}`,
33
+ {
34
+ 'ds-button--error': props.error,
35
+ },
28
36
  className,
29
37
  )}
30
38
  onClick={onClick}
@@ -3,11 +3,11 @@
3
3
  display: flex;
4
4
  align-items: center;
5
5
  justify-content: center;
6
- gap: var(--button-medium-spacing-gap-y);
6
+ gap: var(--button-medium-spacing-gap-vertical);
7
7
  border-radius: var(--button-medium-radius);
8
8
  font-family: var(--font-family-standard);
9
- font-weight: var(--font-weight-regular);
10
- padding: var(--button-medium-spacing-y) var(--button-medium-spacing-x);
9
+ font-weight: var(--font-weight-semi-bold);
10
+ padding: var(--button-medium-spacing-vertical) var(--button-medium-spacing-horizontal);
11
11
  border: none;
12
12
  cursor: pointer;
13
13
  transition: background-color 0.2s, color 0.2s, border-color 0.2s, box-shadow 0.2s;
@@ -38,12 +38,12 @@
38
38
  &--primary {
39
39
  background-color: var(--button-medium-primary-default-color-background);
40
40
  color: var(--button-medium-primary-default-color-text);
41
- border: 1px solid var(--button-medium-primary-default-color-border);
41
+ border: 1px solid var(--button-medium-primary-default-color-background);
42
42
 
43
43
  &:focus {
44
44
  background-color: var(--button-medium-primary-focus-color-background);
45
45
  color: var(--button-medium-primary-focus-color-text);
46
- outline: 2px solid var(--button-medium-primary-focus-color-focus);
46
+ outline: var(--focus-border) solid var(--button-medium-primary-focus-color-focus);
47
47
  }
48
48
 
49
49
  &:hover {
@@ -61,12 +61,12 @@
61
61
  &--secondary {
62
62
  background-color: var(--button-medium-secondary-default-color-background);
63
63
  color: var(--button-medium-secondary-default-color-text);
64
- border: 1px solid var(--button-medium-secondary-default-color-border);
64
+ border: var(--border-weight) solid var(--button-medium-secondary-default-color-border);
65
65
 
66
66
  &:focus {
67
67
  background-color: var(--button-medium-secondary-focus-color-background);
68
68
  color: var(--button-medium-secondary-focus-color-text);
69
- outline: 2px solid var(--button-medium-secondary-focus-color-focus);
69
+ outline: var(--focus-border) solid var(--button-medium-secondary-focus-color-focus);
70
70
  }
71
71
 
72
72
  &:hover {
@@ -75,31 +75,69 @@
75
75
  }
76
76
 
77
77
  &:active {
78
- background-color: var(--button-medium-secondary-pressed-color-background);
79
- color: var(--button-medium-secondary-pressed-color-text);
78
+ background-color: var(--button-medium-secondary-active-color-background);
79
+ color: var(--button-medium-secondary-active-color-text);
80
80
  }
81
81
  }
82
82
 
83
- // Tertiary Button
83
+ // dropdown
84
+
85
+ &--dropdown {
86
+ color: var(--color-grey-900, #2F2F2F);
87
+
88
+ /* typography/body/p1-regular */
89
+ font-family: var(--type-body-p-family, Inter);
90
+ font-size: var(--type-body-p-size, 13px);
91
+ font-style: normal;
92
+ font-weight: var(--type-body-p-weight, 400);
93
+ line-height: 150%; /* 19.5px */
94
+ display: flex;
95
+ padding: var(--spacing-small) var(--spacing-small) var(--spacing-small) var(--spacing-medium);
96
+ justify-content: space-between;
97
+ align-items: center;
98
+ flex-shrink: 0;
99
+ border-radius: var(--border-radius-small);
100
+ border: 1px solid var(--color-grey-200);
101
+ background: var(--button-medium-secondary-default-color-background);
102
+ cursor: pointer;
103
+
104
+ &:focus {
105
+ outline: none;
106
+ box-shadow: 0 0 0 3px var(--color-brand-500);
107
+ background: var(--button-medium-secondary-default-color-background);
108
+ }
109
+
110
+ &:hover {
111
+ border: 1px solid var(--color-grey-500);
112
+ background: var(--color-mono-white);
113
+ }
114
+
115
+ &--error {
116
+ border: 1px solid var(--color-semantic-destructive-500);
117
+ }
118
+ }
119
+
120
+
121
+ // Tertiary Button
84
122
  &--tertiary {
85
- background-color: var(--button-medium-tertiary-default-color-background);
86
- color: var(--button-medium-tertiary-default-color-text);
87
- border: 1px solid var(--button-medium-tertiary-default-color-border);
123
+ background-color: var(--button-small-tertiary-default-color-background);
124
+ color: var(--button-small-tertiary-default-color-text);
125
+ border: var(--border-weight) solid var(--button-small-tertiary-default-color-border);
88
126
 
89
127
  &:focus {
90
- background-color: var(--button-medium-tertiary-focus-color-background);
91
- color: var(--button-medium-tertiary-focus-color-text);
92
- outline: 2px solid var(--button-medium-tertiary-focus-color-focus);
128
+ background-color: var(--button-small-tertiary-focus-color-background);
129
+ color: var(--button-small-tertiary-focus-color-text);
130
+ outline: var(--focus-border) solid var(--button-small-tertiary-focus-color-focus);
93
131
  }
94
132
 
95
133
  &:hover {
96
- background-color: var(--button-medium-tertiary-hover-color-background);
97
- color: var(--button-medium-tertiary-hover-color-text);
134
+ background-color: var(--button-small-tertiary-hover-color-background);
135
+ color: var(--button-small-tertiary-hover-color-text);
98
136
  }
99
137
 
100
138
  &:active {
101
- background-color: var(--button-medium-tertiary-pressed-color-background);
102
- color: var(--button-medium-tertiary-pressed-color-text);
139
+ background-color: var(--button-small-tertiary-active-color-background);
140
+ color: var(--button-small-tertiary-active-color-text);
103
141
  }
104
142
  }
105
143
 
@@ -107,12 +145,12 @@
107
145
  &--primary-destructive {
108
146
  background-color: var(--button-medium-primary-destructive-default-color-background);
109
147
  color: var(--button-medium-primary-destructive-default-color-text);
110
- border: 1px solid var(--button-medium-primary-destructive-default-color-border);
148
+ border: var(--border-weight) solid var(--button-medium-primary-destructive-default-color-border);
111
149
 
112
150
  &:focus {
113
151
  background-color: var(--button-medium-primary-destructive-focus-color-background);
114
152
  color: var(--button-medium-primary-destructive-focus-color-text);
115
- outline: 2px solid var(--button-medium-primary-destructive-focus-color-focus);
153
+ outline: var(--focus-border) solid var(--button-medium-primary-destructive-focus-color-focus);
116
154
  }
117
155
 
118
156
  &:hover {
@@ -121,8 +159,8 @@
121
159
  }
122
160
 
123
161
  &:active {
124
- background-color: var(--button-medium-primary-destructive-pressed-color-background);
125
- color: var(--button-medium-primary-destructive-pressed-color-text);
162
+ background-color: var(--button-medium-primary-destructive-active-color-background);
163
+ color: var(--button-medium-primary-destructive-active-color-text);
126
164
  }
127
165
  }
128
166
 
@@ -130,12 +168,12 @@
130
168
  &--secondary-destructive {
131
169
  background-color: var(--button-medium-secondary-destructive-default-color-background);
132
170
  color: var(--button-medium-secondary-destructive-default-color-text);
133
- border: 1px solid var(--button-medium-secondary-destructive-default-color-border);
171
+ border: var(--border-weight) solid var(--button-medium-secondary-destructive-default-color-border);
134
172
 
135
173
  &:focus {
136
174
  background-color: var(--button-medium-secondary-destructive-focus-color-background);
137
175
  color: var(--button-medium-secondary-destructive-focus-color-text);
138
- outline: 2px solid var(--button-medium-secondary-destructive-focus-color-focus);
176
+ outline: var(--focus-border) solid var(--button-medium-secondary-destructive-focus-color-focus);
139
177
  }
140
178
 
141
179
  &:hover {
@@ -144,8 +182,8 @@
144
182
  }
145
183
 
146
184
  &:active{
147
- background-color: var(--button-medium-secondary-destructive-pressed-color-background);
148
- color: var(--button-medium-secondary-destructive-pressed-color-text);
185
+ background-color: var(--button-medium-secondary-destructive-active-color-background);
186
+ color: var(--button-medium-secondary-destructive-active-color-text);
149
187
  }
150
188
  }
151
189
 
@@ -153,25 +191,29 @@
153
191
  &--text-link {
154
192
  background-color: var(--button-medium-text-link-default-color-background);
155
193
  color: var(--button-medium-text-link-default-color-text);
156
- border: 1px solid var(--button-medium-text-link-default-color-border);
194
+ border: var(--border-weight) solid var(--button-medium-text-link-default-color-border);
157
195
 
158
196
  &:focus {
159
- background-color: var(--button-medium-text-link-focus-color-background);
197
+ background-color: var(--button-medium-text-link-default-color-background);
160
198
  color: var(--button-medium-text-link-focus-color-text);
161
- outline: 2px solid var(--button-medium-text-link-focus-color-focus);
199
+ outline: var(--focus-border) solid var(--button-medium-text-link-focus-color-focus);
162
200
  }
163
201
 
164
202
  &:hover {
165
- background-color: var(--button-medium-text-link-hover-color-background);
203
+ background-color: var(--button-medium-text-link-default-color-background);
166
204
  color: var(--button-medium-text-link-hover-color-text);
167
205
  }
168
206
 
169
207
  &:active{
170
- background-color: var(--button-medium-text-link-pressed-color-background);
208
+ background-color: var(--button-medium-text-link-default-color-background);
171
209
  color: var(--button-medium-text-link-pressed-color-text);
172
210
  }
173
211
  }
174
212
 
213
+ &--error {
214
+ border: 1px solid var(--color-semantic-destructive-500);
215
+ }
216
+
175
217
  // Disabled state
176
218
  &:disabled {
177
219
  opacity: 0.5;
@@ -103,12 +103,6 @@ describe('Card Component', () => {
103
103
 
104
104
  expect(container.querySelector('.ds-icon-chevron-right')).not.toBeInTheDocument();
105
105
  });
106
-
107
- test('uses arrow type when specified', () => {
108
- const mockClick = vi.fn();
109
- const { container } = render(<Card title="Clickable Card" onClick={mockClick} arrowType="arrow" />);
110
- expect(container.querySelector('.ds-icon-arrow-right')).toBeInTheDocument();
111
- });
112
106
  });
113
107
 
114
108
  describe('Keyboard interactions', () => {
@@ -14,7 +14,6 @@ type CardProps = {
14
14
  pillColor?: PillColor;
15
15
  onClick?: (e: React.MouseEvent<HTMLElement>) => void;
16
16
  onKeyDown?: (e: React.KeyboardEvent<HTMLElement>) => void;
17
- arrowType?: 'chevron' | 'arrow';
18
17
  iconScreenReaderText?: string;
19
18
  };
20
19
 
@@ -29,7 +28,6 @@ export const Card = ({
29
28
  disabled,
30
29
  pillText,
31
30
  pillColor,
32
- arrowType = 'chevron',
33
31
  }: CardProps) => {
34
32
  const handleClick = (e: React.MouseEvent<HTMLElement>) => {
35
33
  if (onClick) {
@@ -84,11 +82,18 @@ export const Card = ({
84
82
  {pillText && <Pill text={pillText} color={pillColor} />}
85
83
  </div>
86
84
  {isCardClickable && (
87
- <Icon
88
- name={`${arrowType}-right`}
89
- className="ds-card__icon-click"
90
- size={24}
91
- />
85
+ <>
86
+ <Icon
87
+ name="chevron-right"
88
+ className="ds-card__icon-click"
89
+ size={24}
90
+ />
91
+ <Icon
92
+ name="arrow-right"
93
+ className="ds-card__icon-click"
94
+ size={24}
95
+ />
96
+ </>
92
97
  )}
93
98
  </div>
94
99
  </article>
@@ -1,27 +1,45 @@
1
1
  .ds-card__container {
2
2
  display: flex;
3
3
  width: 100%;
4
- padding: var(--card-spacing-y, 24px) var(--card-spacing-x, 24px);
4
+ padding: var(--card-spacing-vertical) var(--card-spacing-horizontal);
5
5
  flex-direction: column;
6
6
  align-items: flex-start;
7
- gap: var(--card-spacing-gap-y, 16px);
8
- border-radius: var(--card-radius, 8px);
9
- border: 1px solid var(--card-default-color-border, #efefef);
10
- background: var(--card-default-color-background, #fff);
7
+ gap: var(--card-spacing-gap-vertical) var(--card-spacing-gap-horizontal);
8
+ border-radius: var(--card-radius);
9
+ border: var(--border-weight) solid var(--card-default-color-border);
10
+ background: var(--card-default-color-background);
11
11
  color: var(--card-default-color-text);
12
- line-height: 1.5;
12
+ line-height: var(--line-height-default);
13
+ box-sizing: border-box;
14
+
15
+ .ds-card__icon-click {
16
+ flex-shrink: 0;
17
+
18
+ &.ds-icon-arrow-right {
19
+ display: none;
20
+ }
21
+ }
13
22
 
14
23
  &:hover:not(.ds-card__container--disabled) {
15
- border: 1px solid var(--card-hover-color-border, #efefef);
16
- background: var(--card-hover-color-background, #fff);
24
+ border: var(--border-weight) solid var(--card-hover-color-border);
25
+ background: var(--card-hover-color-background);
17
26
  box-shadow: 0 4px 12px 0 rgb(32 32 32 / 8%);
27
+
28
+ .ds-card__icon-click {
29
+ &.ds-icon-chevron-right {
30
+ display: none;
31
+ }
32
+
33
+ &.ds-icon-arrow-right {
34
+ display: block;
35
+ }
36
+ }
18
37
  }
19
38
 
20
39
  &:focus:not(.ds-card__container--disabled) {
21
- border: 1px solid var(--card-focus-color-border, #efefef);
22
- background: var(--card-focus-color-background, #fff);
23
- box-shadow: 0 0 0 3px
24
- var(--button-medium-primary-focus-color-focus, #3cad51);
40
+ border: var(--border-weight) solid var(--card-focus-color-border);
41
+ background: var(--card-focus-color-background);
42
+ outline: var(--focus-border) solid var(--button-medium-primary-focus-color-focus);
25
43
  }
26
44
 
27
45
  &--clickable {
@@ -33,7 +51,7 @@
33
51
  display: flex;
34
52
  flex-direction: row;
35
53
  align-items: flex-start;
36
- gap: var(--spacing-large, 16px);
54
+ gap: var(--card-spacing-gap-horizontal);
37
55
  width: 100%;
38
56
 
39
57
  .ds-card__icon-left {
@@ -44,7 +62,7 @@
44
62
  display: flex;
45
63
  flex-direction: column;
46
64
  justify-content: space-between;
47
- gap: var(--card-spacing-gap-x);
65
+ gap: var(--card-spacing-gap-vertical);
48
66
  flex-grow: 1;
49
67
 
50
68
  .ds-card__title {
@@ -61,8 +79,4 @@
61
79
  font-weight: var(--type-body-p-weight);
62
80
  }
63
81
  }
64
-
65
- .ds-card__icon-click {
66
- flex-shrink: 0;
67
- }
68
82
  }
@@ -41,7 +41,7 @@ export const Default = {
41
41
  },
42
42
  'inputType': {
43
43
  control: 'select',
44
- options: ['text', 'textarea'],
44
+ options: ['text', 'textarea', 'number'],
45
45
  description: 'Input type',
46
46
  },
47
47
  'inputProps.size': {
@@ -105,6 +105,14 @@ export const FormExample: Story = {
105
105
  placeholder: 'Enter a lovely message',
106
106
  }}
107
107
  />
108
+ <FormField
109
+ id="age"
110
+ label="Age"
111
+ inputType="number"
112
+ inputProps={{
113
+ placeholder: 'Enter your age',
114
+ }}
115
+ />
108
116
  </div>
109
117
  ),
110
118
  };
@@ -38,4 +38,10 @@ describe('Input component', () => {
38
38
  const input = screen.getByPlaceholderText('Enter text');
39
39
  expect(input).toHaveClass('ds-textarea');
40
40
  });
41
+
42
+ test('renders a number input when inputType is number', () => {
43
+ render(<FormField id="niceid" inputType="number" inputProps={{ placeholder: 'Enter a number' }} />);
44
+ const input = screen.getByPlaceholderText('Enter a number');
45
+ expect(input).toHaveClass('ds-number-input');
46
+ });
41
47
  });
@@ -3,6 +3,7 @@ import { Label } from './label/Label';
3
3
  import { Icon } from '../icon/Icon';
4
4
  import { TextInput, type TextInputProps } from './inputs/text/TextInput';
5
5
  import { TextArea, type TextAreaProps } from './inputs/textArea/TextArea';
6
+ import { NumberInput, type NumberInputProps } from './inputs/number/NumberInput';
6
7
 
7
8
  type FormFieldProps = {
8
9
  className?: string;
@@ -15,6 +16,7 @@ type FormFieldProps = {
15
16
  } & (
16
17
  | { inputType?: 'text'; inputProps?: TextInputProps }
17
18
  | { inputType?: 'textarea'; inputProps?: TextAreaProps }
19
+ | { inputType?: 'number'; inputProps?: NumberInputProps }
18
20
  );
19
21
 
20
22
  export const FormField = (props: FormFieldProps) => {
@@ -51,6 +53,9 @@ export const FormField = (props: FormFieldProps) => {
51
53
  {inputType === 'textarea' && (
52
54
  <TextArea {...sharedProps} {...(inputProps as TextAreaProps)} />
53
55
  )}
56
+ {inputType === 'number' && (
57
+ <NumberInput {...sharedProps} {...(inputProps as NumberInputProps)} />
58
+ )}
54
59
  {((helperLinkText && helperLinkUrl) || errorText) && (
55
60
  <div className="ds-form-field__message">
56
61
  {errorText && (
@@ -6,35 +6,47 @@
6
6
  box-sizing: border-box;
7
7
 
8
8
  &__description {
9
- margin-bottom: var(--form-field-spacing-y);
10
- color: var(--form-field-description-color-text);
9
+ margin-bottom: var(--form-field-spacing-vertical);
10
+ color: var(--form-field-color-label-description-text);
11
11
  display: block;
12
12
  }
13
13
 
14
14
  &__message {
15
- margin-top: var(--form-field-spacing-y);
15
+ margin-top: var(--form-field-spacing-vertical);
16
16
 
17
17
  &--error, &--helper {
18
18
  display: flex;
19
19
  align-items: center;
20
- margin-top: var(--form-field-spacing-y);
20
+ margin-top: var(--form-field-spacing-vertical);
21
21
  }
22
-
22
+
23
23
  &--error {
24
- gap: var(--form-field-spacing-x);
25
- color: var(--form-field-error-color-error-text);
24
+ gap: var(--form-field-spacing-horizontal);
25
+ color: var(--form-field-text-error-color-error-text);
26
26
 
27
27
  .ds-icon {
28
- color: var(--form-field-error-color-error-icon);
28
+ color: var(--form-field-text-error-color-error-icon);
29
29
  }
30
30
  }
31
31
 
32
32
  &--helper {
33
33
  color: var(--form-field-help-text-default-color-text);
34
34
 
35
+ .ds-icon {
36
+ color: var(--form-field-help-text-default-color-icon);
37
+ }
38
+
35
39
  a {
36
40
  color: var(--form-field-help-text-default-color-text);
37
41
  text-decoration: underline;
42
+
43
+ &:hover {
44
+ color: var(--form-field-help-text-hover-color-text);
45
+
46
+ .ds-icon {
47
+ color: var(--form-field-help-text-hover-color-icon);
48
+ }
49
+ }
38
50
  }
39
51
  }
40
52
  }
@@ -0,0 +1,22 @@
1
+ import type { Meta } from '@storybook/react-vite';
2
+ import { CheckboxInput } from './CheckboxInput';
3
+
4
+ const meta: Meta<typeof CheckboxInput> = {
5
+ title: 'Components/FormField/Inputs/Checkbox',
6
+ component: CheckboxInput,
7
+ };
8
+
9
+ export const Default = {
10
+ parameters: {
11
+ layout: 'centered',
12
+ },
13
+ tags: ['autodocs'],
14
+ args: {
15
+ disabled: false,
16
+ checked: false,
17
+ indeterminate: false,
18
+ label: 'Label text',
19
+ },
20
+ };
21
+
22
+ export default meta;
@@ -0,0 +1,35 @@
1
+ import { describe, expect, test } from 'vitest';
2
+ import { render, screen } from '@testing-library/react';
3
+ import { CheckboxInput } from './CheckboxInput';
4
+ import '@testing-library/jest-dom/vitest';
5
+
6
+ describe('CheckboxInput component', () => {
7
+ test('CheckboxInput renders', () => {
8
+ render(<CheckboxInput label="Checkbox" />);
9
+ expect(screen.getByText('Checkbox')).toBeInTheDocument();
10
+ });
11
+
12
+ test('CheckboxInput is checked when checked is true', () => {
13
+ render(<CheckboxInput label="Checkbox" checked={true} />);
14
+
15
+ const checkboxElement = screen.getByRole('checkbox') as HTMLInputElement;
16
+ expect(checkboxElement).toBeChecked();
17
+ expect(checkboxElement.matches(':checked')).toBe(true);
18
+ });
19
+
20
+ test('CheckboxInput is indeterminate when indeterminate is true', () => {
21
+ render(<CheckboxInput label="Checkbox" indeterminate={true} />);
22
+
23
+ const checkboxElement = screen.getByRole('checkbox') as HTMLInputElement;
24
+ expect(checkboxElement.indeterminate).toBe(true);
25
+ expect(checkboxElement.matches(':indeterminate')).toBe(true);
26
+ });
27
+
28
+ test('CheckboxInput is disabled when disabled is true', () => {
29
+ render(<CheckboxInput label="Checkbox" disabled={true} />);
30
+
31
+ const checkboxElement = screen.getByRole('checkbox') as HTMLInputElement;
32
+ expect(checkboxElement).toBeDisabled();
33
+ expect(checkboxElement.matches(':disabled')).toBe(true);
34
+ });
35
+ });
@@ -0,0 +1,79 @@
1
+ import classNames from 'classnames';
2
+ import { useRef, useEffect, type InputHTMLAttributes } from 'react';
3
+ import { Icon } from '../../../..';
4
+
5
+ export type CheckboxInputProps = {
6
+ indeterminate?: boolean;
7
+ label: string;
8
+ } & InputHTMLAttributes<HTMLInputElement>;
9
+
10
+ export const CheckboxInput = (props: CheckboxInputProps) => {
11
+ const {
12
+ className,
13
+ onChange,
14
+ disabled,
15
+ checked = false,
16
+ indeterminate = false,
17
+ label,
18
+ ...rest
19
+ } = props;
20
+
21
+ const inputRef = useRef<HTMLInputElement>(null);
22
+
23
+ useEffect(() => {
24
+ if (inputRef.current) {
25
+ inputRef.current.indeterminate = indeterminate;
26
+ }
27
+ }, [indeterminate]);
28
+
29
+ const containerClasses = classNames(
30
+ 'ds-checkbox-input__container',
31
+ className,
32
+ );
33
+
34
+ const iconName = indeterminate ? 'minus' : 'check';
35
+
36
+ let iconColor = 'var(--checkbox-input-control-checked-default-color-icon)';
37
+ if (disabled) {
38
+ if (indeterminate) {
39
+ iconColor
40
+ = 'var(--checkbox-input-control-indeterminate-disabled-color-icon)';
41
+ }
42
+ else {
43
+ iconColor = 'var(--checkbox-input-control-checked-disabled-color-icon)';
44
+ }
45
+ }
46
+ else if (indeterminate) {
47
+ iconColor
48
+ = 'var(--checkbox-input-control-indeterminate-default-color-icon)';
49
+ }
50
+
51
+ return (
52
+ <label className={containerClasses}>
53
+ <input
54
+ ref={inputRef}
55
+ type="checkbox"
56
+ disabled={disabled}
57
+ checked={checked}
58
+ onChange={onChange}
59
+ aria-checked={indeterminate ? 'mixed' : checked}
60
+ {...rest}
61
+ />
62
+ <span
63
+ className="ds-input ds-checkbox-input"
64
+ aria-hidden="true"
65
+ data-testid="checkbox-custom-input"
66
+ >
67
+ {(checked || indeterminate) && (
68
+ <Icon
69
+ name={iconName}
70
+ size={12}
71
+ color={iconColor}
72
+ className="ds-checkbox-input__icon"
73
+ />
74
+ )}
75
+ </span>
76
+ <span className="ds-checkbox-label__text">{label}</span>
77
+ </label>
78
+ );
79
+ };