@arbor-education/design-system.components 0.0.7 → 0.1.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 (143) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/components/button/Button.d.ts +3 -3
  3. package/dist/components/button/Button.d.ts.map +1 -1
  4. package/dist/components/button/Button.js +7 -6
  5. package/dist/components/button/Button.js.map +1 -1
  6. package/dist/components/button/Button.test.js +1 -1
  7. package/dist/components/button/Button.test.js.map +1 -1
  8. package/dist/components/dropdown/Dropdown.d.ts +15 -0
  9. package/dist/components/dropdown/Dropdown.d.ts.map +1 -0
  10. package/dist/components/dropdown/Dropdown.js +15 -0
  11. package/dist/components/dropdown/Dropdown.js.map +1 -0
  12. package/dist/components/dropdown/Dropdown.stories.d.ts +20 -0
  13. package/dist/components/dropdown/Dropdown.stories.d.ts.map +1 -0
  14. package/dist/components/dropdown/Dropdown.stories.js +30 -0
  15. package/dist/components/dropdown/Dropdown.stories.js.map +1 -0
  16. package/dist/components/dropdown/Dropdown.test.d.ts.map +1 -0
  17. package/dist/components/dropdown/Dropdown.test.js +136 -0
  18. package/dist/components/dropdown/Dropdown.test.js.map +1 -0
  19. package/dist/components/dropdown/DropdownContent.d.ts +9 -0
  20. package/dist/components/dropdown/DropdownContent.d.ts.map +1 -0
  21. package/dist/components/dropdown/DropdownContent.js +10 -0
  22. package/dist/components/dropdown/DropdownContent.js.map +1 -0
  23. package/dist/components/dropdown/DropdownTrigger.d.ts +5 -0
  24. package/dist/components/dropdown/DropdownTrigger.d.ts.map +1 -0
  25. package/dist/components/dropdown/DropdownTrigger.js +7 -0
  26. package/dist/components/dropdown/DropdownTrigger.js.map +1 -0
  27. package/dist/components/dropdown/items/DropdownItem.d.ts +3 -0
  28. package/dist/components/dropdown/items/DropdownItem.d.ts.map +1 -0
  29. package/dist/components/dropdown/items/DropdownItem.js +8 -0
  30. package/dist/components/dropdown/items/DropdownItem.js.map +1 -0
  31. package/dist/components/dropdown/items/DropdownSelectItem.d.ts +8 -0
  32. package/dist/components/dropdown/items/DropdownSelectItem.d.ts.map +1 -0
  33. package/dist/components/dropdown/items/DropdownSelectItem.js +11 -0
  34. package/dist/components/dropdown/items/DropdownSelectItem.js.map +1 -0
  35. package/dist/components/formField/inputs/selectDropdown/SelectDropdown.d.ts +11 -0
  36. package/dist/components/formField/inputs/selectDropdown/SelectDropdown.d.ts.map +1 -0
  37. package/dist/components/formField/inputs/{dropdown/Dropdown.js → selectDropdown/SelectDropdown.js} +20 -9
  38. package/dist/components/formField/inputs/selectDropdown/SelectDropdown.js.map +1 -0
  39. package/dist/components/formField/inputs/{dropdown/Dropdown.stories.d.ts → selectDropdown/SelectDropdown.stories.d.ts} +3 -3
  40. package/dist/components/formField/inputs/selectDropdown/SelectDropdown.stories.d.ts.map +1 -0
  41. package/dist/components/formField/inputs/{dropdown/Dropdown.stories.js → selectDropdown/SelectDropdown.stories.js} +4 -4
  42. package/dist/components/formField/inputs/selectDropdown/SelectDropdown.stories.js.map +1 -0
  43. package/dist/components/formField/inputs/selectDropdown/SelectDropdown.test.d.ts +2 -0
  44. package/dist/components/formField/inputs/selectDropdown/SelectDropdown.test.d.ts.map +1 -0
  45. package/dist/components/formField/inputs/{dropdown/Dropdown.test.js → selectDropdown/SelectDropdown.test.js} +14 -14
  46. package/dist/components/formField/inputs/selectDropdown/SelectDropdown.test.js.map +1 -0
  47. package/dist/components/formField/inputs/selectDropdown/items/item/SelectDropdownItem.d.ts +16 -0
  48. package/dist/components/formField/inputs/selectDropdown/items/item/SelectDropdownItem.d.ts.map +1 -0
  49. package/dist/components/formField/inputs/selectDropdown/items/item/SelectDropdownItem.js +13 -0
  50. package/dist/components/formField/inputs/selectDropdown/items/item/SelectDropdownItem.js.map +1 -0
  51. package/dist/components/heading/Heading.stories.js +3 -3
  52. package/dist/components/heading/Heading.stories.js.map +1 -1
  53. package/dist/components/section/Section.d.ts +2 -2
  54. package/dist/components/section/Section.d.ts.map +1 -1
  55. package/dist/components/section/Section.js +2 -2
  56. package/dist/components/section/Section.js.map +1 -1
  57. package/dist/components/section/Section.test.js +1 -1
  58. package/dist/components/section/Section.test.js.map +1 -1
  59. package/dist/components/slideover/Slideover.js +1 -1
  60. package/dist/components/slideover/Slideover.js.map +1 -1
  61. package/dist/components/slideoverManager/SlideoverManager.stories.js +7 -7
  62. package/dist/components/slideoverManager/SlideoverManager.stories.js.map +1 -1
  63. package/dist/components/table/BulkActionsDropdown.d.ts.map +1 -1
  64. package/dist/components/table/BulkActionsDropdown.js +3 -4
  65. package/dist/components/table/BulkActionsDropdown.js.map +1 -1
  66. package/dist/components/table/Table.stories.js +3 -3
  67. package/dist/components/table/Table.stories.js.map +1 -1
  68. package/dist/components/table/Table.test.js +5 -5
  69. package/dist/components/table/Table.test.js.map +1 -1
  70. package/dist/index.css +70 -159
  71. package/dist/index.css.map +1 -1
  72. package/dist/index.d.ts +2 -1
  73. package/dist/index.d.ts.map +1 -1
  74. package/dist/index.js +2 -1
  75. package/dist/index.js.map +1 -1
  76. package/package.json +1 -1
  77. package/release/design-system.components.tgz +0 -0
  78. package/src/components/button/Button.test.tsx +1 -1
  79. package/src/components/button/Button.tsx +10 -7
  80. package/src/components/dropdown/Dropdown.stories.tsx +62 -0
  81. package/src/components/dropdown/Dropdown.test.tsx +368 -0
  82. package/src/components/dropdown/Dropdown.tsx +19 -0
  83. package/src/components/dropdown/DropdownContent.tsx +22 -0
  84. package/src/components/dropdown/DropdownTrigger.tsx +10 -0
  85. package/src/components/dropdown/dropdown.scss +48 -0
  86. package/src/components/dropdown/items/DropdownItem.tsx +11 -0
  87. package/src/components/dropdown/items/DropdownSelectItem.tsx +28 -0
  88. package/src/components/formField/inputs/{dropdown/Dropdown.stories.tsx → selectDropdown/SelectDropdown.stories.tsx} +4 -4
  89. package/src/components/formField/inputs/{dropdown/Dropdown.test.tsx → selectDropdown/SelectDropdown.test.tsx} +13 -13
  90. package/src/components/formField/inputs/selectDropdown/SelectDropdown.tsx +102 -0
  91. package/src/components/formField/inputs/selectDropdown/items/item/SelectDropdownItem.tsx +46 -0
  92. package/src/components/formField/inputs/selectDropdown/selectDropdown.scss +22 -0
  93. package/src/components/heading/Heading.stories.tsx +3 -3
  94. package/src/components/icon/icon.scss +3 -0
  95. package/src/components/section/Section.test.tsx +1 -1
  96. package/src/components/section/Section.tsx +4 -4
  97. package/src/components/slideover/Slideover.tsx +1 -1
  98. package/src/components/slideoverManager/SlideoverManager.stories.tsx +14 -14
  99. package/src/components/table/BulkActionsDropdown.tsx +19 -23
  100. package/src/components/table/Table.stories.tsx +4 -4
  101. package/src/components/table/Table.test.tsx +5 -5
  102. package/src/index.scss +3 -5
  103. package/src/index.ts +2 -1
  104. package/src/tokens.scss +1 -0
  105. package/dist/components/formField/inputs/dropdown/Dropdown.d.ts +0 -11
  106. package/dist/components/formField/inputs/dropdown/Dropdown.d.ts.map +0 -1
  107. package/dist/components/formField/inputs/dropdown/Dropdown.js.map +0 -1
  108. package/dist/components/formField/inputs/dropdown/Dropdown.stories.d.ts.map +0 -1
  109. package/dist/components/formField/inputs/dropdown/Dropdown.stories.js.map +0 -1
  110. package/dist/components/formField/inputs/dropdown/Dropdown.test.d.ts.map +0 -1
  111. package/dist/components/formField/inputs/dropdown/Dropdown.test.js.map +0 -1
  112. package/dist/components/formField/inputs/dropdown/buttons/dropdownButton/DropdownButton.d.ts +0 -12
  113. package/dist/components/formField/inputs/dropdown/buttons/dropdownButton/DropdownButton.d.ts.map +0 -1
  114. package/dist/components/formField/inputs/dropdown/buttons/dropdownButton/DropdownButton.js +0 -15
  115. package/dist/components/formField/inputs/dropdown/buttons/dropdownButton/DropdownButton.js.map +0 -1
  116. package/dist/components/formField/inputs/dropdown/items/DropdownItemRenderer.d.ts +0 -10
  117. package/dist/components/formField/inputs/dropdown/items/DropdownItemRenderer.d.ts.map +0 -1
  118. package/dist/components/formField/inputs/dropdown/items/DropdownItemRenderer.js +0 -12
  119. package/dist/components/formField/inputs/dropdown/items/DropdownItemRenderer.js.map +0 -1
  120. package/dist/components/formField/inputs/dropdown/items/dropdownItem/DropdownItem.d.ts +0 -9
  121. package/dist/components/formField/inputs/dropdown/items/dropdownItem/DropdownItem.d.ts.map +0 -1
  122. package/dist/components/formField/inputs/dropdown/items/dropdownItem/DropdownItem.js +0 -21
  123. package/dist/components/formField/inputs/dropdown/items/dropdownItem/DropdownItem.js.map +0 -1
  124. package/dist/components/formField/inputs/dropdown/items/dropdownMultiLineItem/DropdownMultiLineItem.d.ts +0 -7
  125. package/dist/components/formField/inputs/dropdown/items/dropdownMultiLineItem/DropdownMultiLineItem.d.ts.map +0 -1
  126. package/dist/components/formField/inputs/dropdown/items/dropdownMultiLineItem/DropdownMultiLineItem.js +0 -16
  127. package/dist/components/formField/inputs/dropdown/items/dropdownMultiLineItem/DropdownMultiLineItem.js.map +0 -1
  128. package/dist/components/formField/inputs/dropdown/wrapper/DropdownWrapper.d.ts +0 -17
  129. package/dist/components/formField/inputs/dropdown/wrapper/DropdownWrapper.d.ts.map +0 -1
  130. package/dist/components/formField/inputs/dropdown/wrapper/DropdownWrapper.js +0 -151
  131. package/dist/components/formField/inputs/dropdown/wrapper/DropdownWrapper.js.map +0 -1
  132. package/src/components/formField/inputs/dropdown/Dropdown.tsx +0 -82
  133. package/src/components/formField/inputs/dropdown/buttons/dropdownButton/DropdownButton.tsx +0 -44
  134. package/src/components/formField/inputs/dropdown/buttons/dropdownButton/dropdownButton.scss +0 -12
  135. package/src/components/formField/inputs/dropdown/dropdown.scss +0 -24
  136. package/src/components/formField/inputs/dropdown/items/DropdownItemRenderer.tsx +0 -38
  137. package/src/components/formField/inputs/dropdown/items/dropdownItem/DropdownItem.tsx +0 -53
  138. package/src/components/formField/inputs/dropdown/items/dropdownItem/dropdownItem.scss +0 -62
  139. package/src/components/formField/inputs/dropdown/items/dropdownMultiLineItem/DropdownMultiLineItem.tsx +0 -48
  140. package/src/components/formField/inputs/dropdown/items/dropdownMultiLineItem/dropdownMultiLineItem.scss +0 -52
  141. package/src/components/formField/inputs/dropdown/wrapper/DropdownWrapper.tsx +0 -248
  142. package/src/components/formField/inputs/dropdown/wrapper/dropdownWrapper.scss +0 -37
  143. /package/dist/components/{formField/inputs/dropdown → dropdown}/Dropdown.test.d.ts +0 -0
@@ -1,52 +0,0 @@
1
-
2
- .ds-dropdown-item-multiline {
3
- display: inline-flex;
4
- padding: var(--form-dropdown-multi-line-form-drop-item-multi-base-spacing-padding);
5
- flex-direction: column;
6
- justify-content: center;
7
- align-items: flex-start;
8
- gap: var(--form-dropdown-multi-line-spacing-gap-vertical);
9
-
10
- &.ds-dropdown-item {
11
- &:focus-visible {
12
- outline: none;
13
- box-shadow: 0 0 0 3px var(--color-brand-500);
14
- background: var(--button-medium-secondary-default-color-background);
15
- }
16
- }
17
-
18
- h4 {
19
- margin: 0;
20
- }
21
-
22
- &--header {
23
- align-self: stretch;
24
- font-family: var(--type-body-bold-family);
25
- font-size: var(--type-body-bold-size);
26
- font-style: normal;
27
- font-weight: var(--type-body-bold-weight);
28
- line-height: 150%;
29
- position: relative;
30
- display: flex;
31
- justify-content: space-between;
32
- align-items: center;
33
- }
34
-
35
- &--content {
36
- align-self: stretch;
37
- font-family: var(--type-body-p-family);
38
- font-size: var(--type-body-p-size);
39
- font-style: normal;
40
- font-weight: var(--type-body-p-weight);
41
- line-height: 150%;
42
- }
43
-
44
- &--check-icon {
45
- position: absolute;
46
- right: 0;
47
- top: 50%;
48
- transform: translateY(-50%);
49
- width: 12px;
50
- height: 12px;
51
- }
52
- }
@@ -1,248 +0,0 @@
1
- import React, {
2
- type SelectHTMLAttributes,
3
- useState,
4
- type ReactNode,
5
- cloneElement,
6
- useEffect,
7
- useRef,
8
- useContext,
9
- } from 'react';
10
- import { DropdownButton } from 'Components/formField/inputs/dropdown/buttons/dropdownButton/DropdownButton';
11
- import { PopupParentContext } from 'Utils/PopupParentContext';
12
- import { createPortal } from 'react-dom';
13
- import { getFloatingElementPosition, type FloatingElementPosition } from 'Utils/getFloatingElementPosition';
14
- import useResizeObserver from '@react-hook/resize-observer';
15
- import { useComponentDidMount } from 'Utils/hooks/useComponentDidMount';
16
-
17
- export type DropdownItemBaseProps = {
18
- value: string;
19
- selected?: boolean;
20
- onSelection?: (value: string) => void;
21
- } & React.HTMLAttributes<HTMLDivElement>;
22
-
23
- export type DropdownWrapperProps = {
24
- placeholder?: string;
25
- multiple?: boolean;
26
- disabled?: boolean;
27
- errorText?: string;
28
- children: ReactNode;
29
- onSelectionChange: (value: string[]) => void;
30
- dropdownWidth?: string;
31
- } & SelectHTMLAttributes<HTMLSelectElement>;
32
-
33
- export const DropdownWrapper = (props: DropdownWrapperProps) => {
34
- const {
35
- placeholder,
36
- disabled,
37
- errorText,
38
- multiple,
39
- children,
40
- onSelectionChange,
41
- dropdownWidth = '200px',
42
- } = props;
43
-
44
- const [dropdownOpen, setDropdownOpen] = useState(false);
45
- const [selected, setSelected] = useState<string[]>([]);
46
- const [focusedIndex, setFocusedIndex] = useState<number>(-1);
47
- const dropdownFieldRef = useRef<HTMLButtonElement>(null);
48
- const dropdownContentsRef = useRef<HTMLDivElement>(null);
49
- const [dropdownPosition, setDropdownPosition] = useState<FloatingElementPosition | null>(null);
50
-
51
- useComponentDidMount(() => {
52
- const clickListener = (e: MouseEvent) => {
53
- // Listen for clicks outside the dropdown and close the dropdown
54
- if (
55
- !(
56
- dropdownFieldRef.current?.contains(e.target as Node)
57
- || dropdownContentsRef.current?.contains(e.target as Node)
58
- )
59
- ) {
60
- setDropdownOpen(false);
61
- }
62
- };
63
-
64
- document.addEventListener('click', clickListener);
65
- return () => {
66
- document.removeEventListener('click', clickListener);
67
- };
68
- });
69
-
70
- const repositionDropdown = () => {
71
- if (dropdownFieldRef.current && dropdownContentsRef.current) {
72
- setDropdownPosition(
73
- getFloatingElementPosition(
74
- dropdownFieldRef.current,
75
- dropdownContentsRef.current,
76
- {
77
- offset: 4,
78
- allowHorizontal: false,
79
- },
80
- ),
81
- );
82
- };
83
- };
84
-
85
- useResizeObserver(dropdownFieldRef.current, () => {
86
- if (dropdownOpen) {
87
- repositionDropdown();
88
- }
89
- });
90
-
91
- useEffect(() => {
92
- const onScroll: EventListener = (e) => {
93
- if (dropdownContentsRef.current?.contains(e.target as Node)) {
94
- // Don't reposition on scrolls inside the dropdown contents, so that
95
- // dropdowns can scroll internally without affecting anything
96
- return;
97
- }
98
- repositionDropdown();
99
- };
100
- const onResize: EventListener = () => {
101
- repositionDropdown();
102
- };
103
-
104
- if (dropdownOpen) {
105
- // While dropdown was closed, the screen may have been resized, scrolled, and so
106
- // positioning twice helps us ensure that the position is accurate.
107
- repositionDropdown();
108
- setTimeout(() => {
109
- repositionDropdown();
110
- });
111
-
112
- document.addEventListener('scroll', onScroll, true);
113
- window.addEventListener('resize', onResize);
114
- }
115
- else {
116
- document.removeEventListener('scroll', onScroll, true);
117
- window.removeEventListener('resize', onResize);
118
- }
119
- }, [dropdownOpen]);
120
-
121
- const popupParentRef = useContext(PopupParentContext);
122
-
123
- const toggleDropdown = (e: React.MouseEvent) => {
124
- e.preventDefault();
125
- e.stopPropagation();
126
- if (!disabled) {
127
- setDropdownOpen(!dropdownOpen);
128
- }
129
- };
130
-
131
- const handleItemClick = (value: string) => {
132
- if (!multiple) {
133
- setSelected([value]);
134
- setDropdownOpen(false);
135
- }
136
- else {
137
- setSelected(prev =>
138
- prev.includes(value) ? prev.filter(sel => sel !== value) : [...prev, value],
139
- );
140
- }
141
- };
142
-
143
- const handleKeyDown = (e: React.KeyboardEvent) => {
144
- if (!dropdownOpen) {
145
- if (e.key === 'ArrowDown' || e.key === 'Enter') {
146
- e.preventDefault();
147
- setDropdownOpen(true);
148
- setFocusedIndex(0);
149
- }
150
- return;
151
- }
152
-
153
- const items = React.Children.toArray(children).filter(child =>
154
- React.isValidElement<DropdownItemBaseProps>(child),
155
- );
156
-
157
- switch (e.key) {
158
- case 'ArrowDown':
159
- e.preventDefault();
160
- setFocusedIndex(prev => (prev + 1) % items.length);
161
- break;
162
- case 'ArrowUp':
163
- e.preventDefault();
164
- setFocusedIndex(prev => (prev - 1 + items.length) % items.length);
165
- break;
166
- case 'Enter':
167
- e.preventDefault();
168
- if (focusedIndex >= 0 && focusedIndex < items.length) {
169
- const item = items[focusedIndex] as React.ReactElement<DropdownItemBaseProps>;
170
- handleItemClick(item.props.value);
171
- }
172
- break;
173
- case 'Escape':
174
- e.preventDefault();
175
- setDropdownOpen(false);
176
- break;
177
- default:
178
- break;
179
- }
180
- };
181
-
182
- useEffect(() => {
183
- onSelectionChange(selected);
184
- }, [selected]);
185
-
186
- return (
187
- <div
188
- className="ds-dropdown-wrapper"
189
- onKeyDown={handleKeyDown}
190
- role="combobox"
191
- aria-expanded={dropdownOpen}
192
- aria-haspopup="listbox"
193
- aria-disabled={disabled}
194
- >
195
-
196
- <DropdownButton
197
- label={placeholder ?? ''}
198
- disabled={disabled}
199
- error={!!errorText}
200
- pressed={dropdownOpen}
201
- onClick={toggleDropdown}
202
- ref={dropdownFieldRef}
203
- />
204
-
205
- {dropdownOpen && popupParentRef.current && createPortal(
206
- <div
207
- role="listbox"
208
- id="dropdownList"
209
- className="ds-dropdown-wrapper--items"
210
- aria-activedescendant={
211
- focusedIndex >= 0 ? `dropdown-item-${focusedIndex}` : undefined
212
- }
213
- ref={dropdownContentsRef}
214
- style={{
215
- ...(dropdownWidth
216
- ? { minWidth: `min(100vw, ${dropdownWidth})` }
217
- : {}
218
- ),
219
- ...(dropdownPosition !== null && typeof dropdownPosition !== 'undefined'
220
- ? {
221
- left: `${dropdownPosition.x}px`,
222
- ...(dropdownPosition.position === 'top'
223
- ? { bottom: dropdownPosition.bottom }
224
- : { top: `${dropdownPosition.y}px` }
225
- ),
226
- maxWidth: dropdownPosition.maxWidth,
227
- maxHeight: dropdownPosition.maxHeight,
228
- width: dropdownPosition.fixedElementWidth,
229
- }
230
- : {}),
231
- }}
232
- >
233
- {React.Children.map(children, (child, index) => {
234
- if (React.isValidElement<DropdownItemBaseProps>(child)) {
235
- return cloneElement(child, {
236
- selected: selected.includes(child.props.value),
237
- onSelection: handleItemClick,
238
- id: `dropdown-item-${index}`,
239
- });
240
- }
241
- return child;
242
- })}
243
- </div>,
244
- popupParentRef.current,
245
- )}
246
- </div>
247
- );
248
- };
@@ -1,37 +0,0 @@
1
-
2
- .ds-dropdown-wrapper {
3
- color: var(--color-grey-600, #595959);
4
-
5
- /* typography/body/p1-regular */
6
- font-family: var(--type-body-p-family, Inter);
7
- font-size: var(--type-body-p-size, 13px);
8
- font-style: normal;
9
- font-weight: var(--type-body-p-weight, 400);
10
- line-height: 150%;
11
-
12
-
13
- &--items {
14
- padding: var(--form-dropdown-spacing-vertical) var(--form-dropdown-spacing-horizontal);
15
- box-shadow: 0 4px 12px 0 rgb(32 32 32 / 8%);
16
- border-radius: var(--banner-radius);
17
- background-color: var(--form-dropdown-color-background);
18
-
19
- h3 {
20
- margin: 0;
21
- }
22
-
23
- &--header {
24
- color: var(--form-dropdown-form-drop-item-title-color-text);
25
- font-size: var(--type-body-bold-size);
26
- font-style: normal;
27
- font-weight: var(--type-body-bold-weight);
28
- line-height: 150%;
29
- display: flex;
30
- padding: var(--spacing-xsmall) var(--spacing-small) var(--spacing-medium) var(--spacing-small);
31
- align-items: center;
32
- gap: 8px;
33
- align-self: stretch;
34
- border-bottom: 1px solid var(--page-base-color-border);
35
- }
36
- }
37
- }