@arbor-education/design-system.components 0.25.0 → 0.25.1

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 (195) hide show
  1. package/.gather/instructions/changesets.md +12 -0
  2. package/.gather/instructions/read-contributing.md +14 -0
  3. package/.storybook/DocsTemplate.tsx +3 -1
  4. package/.storybook/preview.ts +6 -2
  5. package/CHANGELOG.md +6 -0
  6. package/CONTRIBUTING.md +20 -0
  7. package/dist/components/avatarGroup/AvatarGroup.stories.d.ts.map +1 -1
  8. package/dist/components/avatarGroup/AvatarGroup.stories.js +4 -2
  9. package/dist/components/avatarGroup/AvatarGroup.stories.js.map +1 -1
  10. package/dist/components/card/Card.d.ts.map +1 -1
  11. package/dist/components/card/Card.js +2 -1
  12. package/dist/components/card/Card.js.map +1 -1
  13. package/dist/components/combobox/Combobox.d.ts.map +1 -1
  14. package/dist/components/combobox/Combobox.js +10 -5
  15. package/dist/components/combobox/Combobox.js.map +1 -1
  16. package/dist/components/combobox/Combobox.stories.d.ts.map +1 -1
  17. package/dist/components/combobox/Combobox.stories.js +2 -1
  18. package/dist/components/combobox/Combobox.stories.js.map +1 -1
  19. package/dist/components/combobox/Combobox.test.js +18 -9
  20. package/dist/components/combobox/Combobox.test.js.map +1 -1
  21. package/dist/components/combobox/ComboboxButtonTrigger.d.ts.map +1 -1
  22. package/dist/components/combobox/ComboboxButtonTrigger.js +3 -1
  23. package/dist/components/combobox/ComboboxButtonTrigger.js.map +1 -1
  24. package/dist/components/combobox/ComboboxListbox.d.ts.map +1 -1
  25. package/dist/components/combobox/ComboboxListbox.js +8 -4
  26. package/dist/components/combobox/ComboboxListbox.js.map +1 -1
  27. package/dist/components/combobox/buildListboxDisplayOptions.d.ts.map +1 -1
  28. package/dist/components/combobox/buildListboxDisplayOptions.js +4 -2
  29. package/dist/components/combobox/buildListboxDisplayOptions.js.map +1 -1
  30. package/dist/components/combobox/highlightLabel.d.ts.map +1 -1
  31. package/dist/components/combobox/highlightLabel.js +2 -1
  32. package/dist/components/combobox/highlightLabel.js.map +1 -1
  33. package/dist/components/combobox/useChipSelection.d.ts.map +1 -1
  34. package/dist/components/combobox/useChipSelection.js +2 -1
  35. package/dist/components/combobox/useChipSelection.js.map +1 -1
  36. package/dist/components/combobox/useComboboxListboxKeyboard.d.ts.map +1 -1
  37. package/dist/components/combobox/useComboboxListboxKeyboard.js +8 -4
  38. package/dist/components/combobox/useComboboxListboxKeyboard.js.map +1 -1
  39. package/dist/components/combobox/useComboboxPopoverBehavior.d.ts.map +1 -1
  40. package/dist/components/combobox/useComboboxPopoverBehavior.js +16 -8
  41. package/dist/components/combobox/useComboboxPopoverBehavior.js.map +1 -1
  42. package/dist/components/combobox/useComboboxState.d.ts.map +1 -1
  43. package/dist/components/combobox/useComboboxState.js +22 -11
  44. package/dist/components/combobox/useComboboxState.js.map +1 -1
  45. package/dist/components/datePicker/DatePickerCalendarHeader.d.ts.map +1 -1
  46. package/dist/components/datePicker/DatePickerCalendarHeader.js +4 -2
  47. package/dist/components/datePicker/DatePickerCalendarHeader.js.map +1 -1
  48. package/dist/components/dateTimePicker/DateTimePicker.d.ts.map +1 -1
  49. package/dist/components/dateTimePicker/DateTimePicker.js +2 -1
  50. package/dist/components/dateTimePicker/DateTimePicker.js.map +1 -1
  51. package/dist/components/dateTimePicker/DateTimePicker.test.js.map +1 -1
  52. package/dist/components/dropdown/Dropdown.stories.d.ts.map +1 -1
  53. package/dist/components/dropdown/Dropdown.stories.js +10 -5
  54. package/dist/components/dropdown/Dropdown.stories.js.map +1 -1
  55. package/dist/components/filterBar/FilterBar.d.ts.map +1 -1
  56. package/dist/components/filterBar/FilterBar.js +4 -2
  57. package/dist/components/filterBar/FilterBar.js.map +1 -1
  58. package/dist/components/filterBar/FilterBar.stories.d.ts.map +1 -1
  59. package/dist/components/filterBar/FilterBar.stories.js +6 -3
  60. package/dist/components/filterBar/FilterBar.stories.js.map +1 -1
  61. package/dist/components/filterBar/FilterBar.test.js +6 -3
  62. package/dist/components/filterBar/FilterBar.test.js.map +1 -1
  63. package/dist/components/formField/fieldset/Fieldset.stories.d.ts.map +1 -1
  64. package/dist/components/formField/fieldset/Fieldset.stories.js.map +1 -1
  65. package/dist/components/formField/inputs/radio/RadioButtonGroup.d.ts +1 -1
  66. package/dist/components/formField/inputs/radio/RadioButtonGroup.d.ts.map +1 -1
  67. package/dist/components/formField/inputs/radio/RadioButtonGroup.js +1 -1
  68. package/dist/components/formField/inputs/radio/RadioButtonGroup.js.map +1 -1
  69. package/dist/components/formField/inputs/selectDropdown/SelectDropdown.d.ts.map +1 -1
  70. package/dist/components/formField/inputs/selectDropdown/SelectDropdown.js +2 -1
  71. package/dist/components/formField/inputs/selectDropdown/SelectDropdown.js.map +1 -1
  72. package/dist/components/formField/inputs/textArea/TextArea.stories.d.ts.map +1 -1
  73. package/dist/components/formField/inputs/textArea/TextArea.stories.js +10 -5
  74. package/dist/components/formField/inputs/textArea/TextArea.stories.js.map +1 -1
  75. package/dist/components/formField/inputs/time/TimeInput.js +3 -4
  76. package/dist/components/formField/inputs/time/TimeInput.js.map +1 -1
  77. package/dist/components/formField/inputs/time/TimeInput.test.js.map +1 -1
  78. package/dist/components/heading/Heading.stories.d.ts.map +1 -1
  79. package/dist/components/heading/Heading.stories.js.map +1 -1
  80. package/dist/components/modal/Modal.stories.d.ts.map +1 -1
  81. package/dist/components/modal/Modal.stories.js.map +1 -1
  82. package/dist/components/progress/Progress.stories.d.ts.map +1 -1
  83. package/dist/components/progress/Progress.stories.js +2 -1
  84. package/dist/components/progress/Progress.stories.js.map +1 -1
  85. package/dist/components/sidebarNav/SidebarNavItem.d.ts.map +1 -1
  86. package/dist/components/sidebarNav/SidebarNavItem.js +12 -11
  87. package/dist/components/sidebarNav/SidebarNavItem.js.map +1 -1
  88. package/dist/components/sidebarNav/SidebarNavRailItem.d.ts.map +1 -1
  89. package/dist/components/sidebarNav/SidebarNavRailItem.js +11 -10
  90. package/dist/components/sidebarNav/SidebarNavRailItem.js.map +1 -1
  91. package/dist/components/sidebarNav/useControllableBoolean.d.ts.map +1 -1
  92. package/dist/components/sidebarNav/useControllableBoolean.js +2 -1
  93. package/dist/components/sidebarNav/useControllableBoolean.js.map +1 -1
  94. package/dist/components/table/Table.d.ts.map +1 -1
  95. package/dist/components/table/Table.js +11 -1
  96. package/dist/components/table/Table.js.map +1 -1
  97. package/dist/components/table/Table.stories.d.ts.map +1 -1
  98. package/dist/components/table/Table.stories.js +6 -2
  99. package/dist/components/table/Table.stories.js.map +1 -1
  100. package/dist/components/table/Table.test.js +9 -3
  101. package/dist/components/table/Table.test.js.map +1 -1
  102. package/dist/components/table/cellRenderers/ComboboxCellRenderer.d.ts.map +1 -1
  103. package/dist/components/table/cellRenderers/ComboboxCellRenderer.js +16 -8
  104. package/dist/components/table/cellRenderers/ComboboxCellRenderer.js.map +1 -1
  105. package/dist/components/table/columnFilters/TimeFilter/TimeFilter.d.ts.map +1 -1
  106. package/dist/components/table/columnFilters/TimeFilter/TimeFilter.js +2 -1
  107. package/dist/components/table/columnFilters/TimeFilter/TimeFilter.js.map +1 -1
  108. package/dist/components/table/tableControls/HideColumnsDropdown.d.ts.map +1 -1
  109. package/dist/components/table/tableControls/HideColumnsDropdown.js +2 -1
  110. package/dist/components/table/tableControls/HideColumnsDropdown.js.map +1 -1
  111. package/dist/components/table/tableControls/TableControls.d.ts.map +1 -1
  112. package/dist/components/table/tableControls/TableControls.js +2 -1
  113. package/dist/components/table/tableControls/TableControls.js.map +1 -1
  114. package/dist/components/tag/Tag.test.js.map +1 -1
  115. package/dist/components/tagList/TagList.d.ts.map +1 -1
  116. package/dist/components/tagList/TagList.js +8 -4
  117. package/dist/components/tagList/TagList.js.map +1 -1
  118. package/dist/components/tagList/TagList.test.js +6 -3
  119. package/dist/components/tagList/TagList.test.js.map +1 -1
  120. package/dist/components/treeRow/TreeRowSection.d.ts.map +1 -1
  121. package/dist/components/treeRow/TreeRowSection.js +2 -1
  122. package/dist/components/treeRow/TreeRowSection.js.map +1 -1
  123. package/dist/components/userDropdown/UserDropdown.stories.d.ts.map +1 -1
  124. package/dist/components/userDropdown/UserDropdown.stories.js +66 -22
  125. package/dist/components/userDropdown/UserDropdown.stories.js.map +1 -1
  126. package/dist/components/userDropdown/internal/UserDropdownCollapsibleSection.d.ts.map +1 -1
  127. package/dist/components/userDropdown/internal/UserDropdownCollapsibleSection.js +3 -1
  128. package/dist/components/userDropdown/internal/UserDropdownCollapsibleSection.js.map +1 -1
  129. package/dist/utils/getTextContrast.d.ts.map +1 -1
  130. package/dist/utils/getTextContrast.js +4 -2
  131. package/dist/utils/getTextContrast.js.map +1 -1
  132. package/dist/utils/hooks/useElementWidth.d.ts.map +1 -1
  133. package/dist/utils/hooks/useElementWidth.js +2 -1
  134. package/dist/utils/hooks/useElementWidth.js.map +1 -1
  135. package/dist/utils/hooks/useMeasuredChildWidths.d.ts.map +1 -1
  136. package/dist/utils/hooks/useMeasuredChildWidths.js +4 -2
  137. package/dist/utils/hooks/useMeasuredChildWidths.js.map +1 -1
  138. package/dist/utils/hooks/useRovingFocus.d.ts.map +1 -1
  139. package/dist/utils/hooks/useRovingFocus.js +8 -4
  140. package/dist/utils/hooks/useRovingFocus.js.map +1 -1
  141. package/dist/utils/spacedWidths.d.ts.map +1 -1
  142. package/dist/utils/spacedWidths.js +6 -3
  143. package/dist/utils/spacedWidths.js.map +1 -1
  144. package/eslint.config.mts +32 -1
  145. package/package.json +1 -1
  146. package/src/components/avatarGroup/AvatarGroup.stories.tsx +6 -2
  147. package/src/components/card/Card.tsx +3 -1
  148. package/src/components/combobox/Combobox.stories.tsx +3 -1
  149. package/src/components/combobox/Combobox.test.tsx +39 -11
  150. package/src/components/combobox/Combobox.tsx +15 -5
  151. package/src/components/combobox/ComboboxButtonTrigger.tsx +3 -1
  152. package/src/components/combobox/ComboboxListbox.tsx +12 -4
  153. package/src/components/combobox/buildListboxDisplayOptions.ts +6 -2
  154. package/src/components/combobox/highlightLabel.tsx +2 -1
  155. package/src/components/combobox/useChipSelection.ts +3 -1
  156. package/src/components/combobox/useComboboxListboxKeyboard.ts +12 -4
  157. package/src/components/combobox/useComboboxPopoverBehavior.ts +24 -8
  158. package/src/components/combobox/useComboboxState.ts +28 -11
  159. package/src/components/datePicker/DatePickerCalendarHeader.tsx +6 -2
  160. package/src/components/dateTimePicker/DateTimePicker.test.tsx +2 -0
  161. package/src/components/dateTimePicker/DateTimePicker.tsx +3 -1
  162. package/src/components/dropdown/Dropdown.stories.tsx +19 -8
  163. package/src/components/filterBar/FilterBar.stories.tsx +9 -3
  164. package/src/components/filterBar/FilterBar.test.tsx +9 -3
  165. package/src/components/filterBar/FilterBar.tsx +6 -2
  166. package/src/components/formField/fieldset/Fieldset.stories.tsx +18 -3
  167. package/src/components/formField/inputs/radio/RadioButtonGroup.tsx +1 -1
  168. package/src/components/formField/inputs/selectDropdown/SelectDropdown.tsx +3 -1
  169. package/src/components/formField/inputs/textArea/TextArea.stories.tsx +10 -5
  170. package/src/components/formField/inputs/time/TimeInput.test.tsx +2 -0
  171. package/src/components/formField/inputs/time/TimeInput.tsx +4 -4
  172. package/src/components/heading/Heading.stories.tsx +12 -3
  173. package/src/components/modal/Modal.stories.tsx +15 -5
  174. package/src/components/progress/Progress.stories.tsx +3 -1
  175. package/src/components/sidebarNav/SidebarNavItem.tsx +27 -25
  176. package/src/components/sidebarNav/SidebarNavRailItem.tsx +34 -35
  177. package/src/components/sidebarNav/useControllableBoolean.ts +3 -1
  178. package/src/components/table/Table.stories.tsx +16 -12
  179. package/src/components/table/Table.test.tsx +10 -4
  180. package/src/components/table/Table.tsx +15 -5
  181. package/src/components/table/cellRenderers/ComboboxCellRenderer.tsx +19 -8
  182. package/src/components/table/columnFilters/TimeFilter/TimeFilter.tsx +3 -1
  183. package/src/components/table/tableControls/HideColumnsDropdown.tsx +3 -1
  184. package/src/components/table/tableControls/TableControls.tsx +3 -1
  185. package/src/components/tag/Tag.test.tsx +40 -8
  186. package/src/components/tagList/TagList.test.tsx +9 -3
  187. package/src/components/tagList/TagList.tsx +12 -4
  188. package/src/components/treeRow/TreeRowSection.tsx +3 -1
  189. package/src/components/userDropdown/UserDropdown.stories.tsx +66 -22
  190. package/src/components/userDropdown/internal/UserDropdownCollapsibleSection.tsx +3 -1
  191. package/src/utils/getTextContrast.ts +6 -2
  192. package/src/utils/hooks/useElementWidth.ts +3 -1
  193. package/src/utils/hooks/useMeasuredChildWidths.ts +6 -2
  194. package/src/utils/hooks/useRovingFocus.ts +12 -4
  195. package/src/utils/spacedWidths.ts +9 -3
@@ -53,13 +53,20 @@ describe('Tag', () => {
53
53
 
54
54
  describe('onRemove', () => {
55
55
  test('renders remove button when onRemove is provided', () => {
56
- render(<Tag onRemove={() => {}}>Removable</Tag>);
56
+ render(
57
+ <Tag onRemove={() => {}}>
58
+ Removable
59
+ </Tag>,
60
+ );
57
61
  expect(screen.getByRole('button', { name: 'Remove' })).toBeInTheDocument();
58
62
  });
59
63
 
60
64
  test('uses a custom remove label when provided', () => {
61
65
  render(
62
- <Tag onRemove={() => {}} removeLabel="Remove Alice Johnson">
66
+ <Tag
67
+ onRemove={() => {}}
68
+ removeLabel="Remove Alice Johnson"
69
+ >
63
70
  Removable
64
71
  </Tag>,
65
72
  );
@@ -67,13 +74,20 @@ describe('Tag', () => {
67
74
  });
68
75
 
69
76
  test('keeps the remove button in the tab order by default', () => {
70
- render(<Tag onRemove={() => {}}>Removable</Tag>);
77
+ render(
78
+ <Tag onRemove={() => {}}>
79
+ Removable
80
+ </Tag>,
81
+ );
71
82
  expect(screen.getByRole('button', { name: 'Remove' })).toHaveAttribute('tabindex', '0');
72
83
  });
73
84
 
74
85
  test('allows composite parents to remove the button from the tab order', () => {
75
86
  render(
76
- <Tag onRemove={() => {}} removeButtonTabIndex={-1}>
87
+ <Tag
88
+ onRemove={() => {}}
89
+ removeButtonTabIndex={-1}
90
+ >
77
91
  Removable
78
92
  </Tag>,
79
93
  );
@@ -110,18 +124,32 @@ describe('Tag', () => {
110
124
 
111
125
  describe('onClick', () => {
112
126
  test('renders a primary action button when onClick is provided', () => {
113
- render(<Tag onClick={() => {}}>Clickable</Tag>);
127
+ render(
128
+ <Tag onClick={() => {}}>
129
+ Clickable
130
+ </Tag>,
131
+ );
114
132
  expect(screen.getByRole('button', { name: 'Clickable' })).toBeInTheDocument();
115
133
  });
116
134
 
117
135
  test('uses a custom action label when provided', () => {
118
- render(<Tag onClick={() => {}} actionLabel="Open filter for Alice Johnson">Alice Johnson</Tag>);
136
+ render(
137
+ <Tag
138
+ onClick={() => {}}
139
+ actionLabel="Open filter for Alice Johnson"
140
+ >
141
+ Alice Johnson
142
+ </Tag>,
143
+ );
119
144
  expect(screen.getByRole('button', { name: 'Open filter for Alice Johnson' })).toBeInTheDocument();
120
145
  });
121
146
 
122
147
  test('allows composite parents to remove the primary action from the tab order', () => {
123
148
  render(
124
- <Tag onClick={() => {}} actionButtonTabIndex={-1}>
149
+ <Tag
150
+ onClick={() => {}}
151
+ actionButtonTabIndex={-1}
152
+ >
125
153
  Clickable
126
154
  </Tag>,
127
155
  );
@@ -138,7 +166,11 @@ describe('Tag', () => {
138
166
 
139
167
  test('forwards aria-controls and aria-expanded to the primary action button', () => {
140
168
  render(
141
- <Tag onClick={() => {}} ariaControls="filter-modal" ariaExpanded={true}>
169
+ <Tag
170
+ onClick={() => {}}
171
+ ariaControls="filter-modal"
172
+ ariaExpanded={true}
173
+ >
142
174
  Clickable
143
175
  </Tag>,
144
176
  );
@@ -10,9 +10,15 @@ const mockTagListCollapseRects = () =>
10
10
  vi.spyOn(HTMLElement.prototype, 'getBoundingClientRect').mockImplementation(function mockRect(this: HTMLElement) {
11
11
  let width = 0;
12
12
 
13
- if (this.classList.contains('ds-tag-list__viewport')) width = 220;
14
- else if (this.classList.contains('ds-tag-list__item')) width = 72;
15
- else if (this.classList.contains('ds-tag-list__overflow')) width = 76;
13
+ if (this.classList.contains('ds-tag-list__viewport')) {
14
+ width = 220;
15
+ }
16
+ else if (this.classList.contains('ds-tag-list__item')) {
17
+ width = 72;
18
+ }
19
+ else if (this.classList.contains('ds-tag-list__overflow')) {
20
+ width = 76;
21
+ }
16
22
 
17
23
  return {
18
24
  width,
@@ -99,7 +99,9 @@ export const TagList = ({
99
99
  [
100
100
  ...visibleItemIndices.flatMap((index) => {
101
101
  const item = items[index];
102
- if (!item) return [];
102
+ if (!item) {
103
+ return [];
104
+ }
103
105
 
104
106
  const targets: TagListTarget[] = [];
105
107
  if (item.onClick) {
@@ -117,7 +119,9 @@ export const TagList = ({
117
119
  const hasInteractiveItems = visibleInteractiveTargets.length > 0;
118
120
 
119
121
  const getHighlightedIndexForTarget = useCallback((target: TagListTarget | null): number | null => {
120
- if (!target || target === 'overflow') return null;
122
+ if (!target || target === 'overflow') {
123
+ return null;
124
+ }
121
125
 
122
126
  return itemIndexById.get(getTargetItemId(target)) ?? null;
123
127
  }, [itemIndexById]);
@@ -127,7 +131,9 @@ export const TagList = ({
127
131
  }, [getHighlightedIndexForTarget, onHighlightedItemIndexChange]);
128
132
 
129
133
  const handleDeleteKey = useCallback((target: TagListTarget, event: React.KeyboardEvent<HTMLElement>): boolean => {
130
- if (target === 'overflow') return false;
134
+ if (target === 'overflow') {
135
+ return false;
136
+ }
131
137
 
132
138
  const item = items[getHighlightedIndexForTarget(target) ?? -1];
133
139
  if (item?.onRemove) {
@@ -229,7 +235,9 @@ export const TagList = ({
229
235
  : null;
230
236
 
231
237
  if (items.length === 0) {
232
- if (!emptyState) return null;
238
+ if (!emptyState) {
239
+ return null;
240
+ }
233
241
  return <div className={classNames('ds-tag-list', 'ds-tag-list--empty', className)}>{emptyState}</div>;
234
242
  }
235
243
 
@@ -7,7 +7,9 @@ import { Icon } from 'Components/icon/Icon';
7
7
  export const DepthContext = createContext(0);
8
8
 
9
9
  export function getDepthPadding(depth: number): string {
10
- if (depth === 0) return 'var(--section-list-row-spacing-horizontal)';
10
+ if (depth === 0) {
11
+ return 'var(--section-list-row-spacing-horizontal)';
12
+ }
11
13
  return `calc(var(--spacing-xxlarge, 32px) * ${depth})`;
12
14
  }
13
15
 
@@ -45,17 +45,23 @@ export const Default: Story = {
45
45
  {
46
46
  logo: <AppLogo src={logoArborWorkflows} alt="Arbor Workflows" />,
47
47
  name: 'Arbor Workflows',
48
- onClick: () => { console.log('Open Arbor Workflows'); },
48
+ onClick: () => {
49
+ console.log('Open Arbor Workflows');
50
+ },
49
51
  },
50
52
  {
51
53
  logo: <AppLogo src={logoGovernorHub} alt="GovernorHub" />,
52
54
  name: 'GovernorHub',
53
- onClick: () => { console.log('Open GovernorHub'); },
55
+ onClick: () => {
56
+ console.log('Open GovernorHub');
57
+ },
54
58
  },
55
59
  {
56
60
  logo: <AppLogo src={logoTheKey} alt="The Key" />,
57
61
  name: 'The Key',
58
- onClick: () => { console.log('Open The Key'); },
62
+ onClick: () => {
63
+ console.log('Open The Key');
64
+ },
59
65
  },
60
66
  ],
61
67
  },
@@ -68,30 +74,42 @@ export const Default: Story = {
68
74
  logo: <AppLogo src={logoArborWorkflows} alt="Arbor Finance" />,
69
75
  name: 'Arbor Finance',
70
76
  description: 'Cloud-based accounting',
71
- onClick: () => { console.log('Open Arbor Finance'); },
77
+ onClick: () => {
78
+ console.log('Open Arbor Finance');
79
+ },
72
80
  },
73
81
  {
74
82
  logo: <AppLogo src={logoRobin} alt="Robin" />,
75
83
  name: 'Robin',
76
84
  description: 'AI website compliance checks',
77
- onClick: () => { console.log('Open Robin'); },
85
+ onClick: () => {
86
+ console.log('Open Robin');
87
+ },
78
88
  },
79
89
  {
80
90
  logo: <AppLogo src={logoSamPeople} alt="SAMPeople" />,
81
91
  name: 'SAMPeople',
82
92
  description: 'HR and recruitment',
83
- onClick: () => { console.log('Open SAMPeople'); },
93
+ onClick: () => {
94
+ console.log('Open SAMPeople');
95
+ },
84
96
  },
85
97
  {
86
98
  logo: <AppLogo src={logoTimetabler} alt="Timetabler" />,
87
99
  name: 'Timetabler',
88
100
  description: 'Schedule timetables and more',
89
- onClick: () => { console.log('Open Timetabler'); },
101
+ onClick: () => {
102
+ console.log('Open Timetabler');
103
+ },
90
104
  },
91
105
  ],
92
106
  },
93
- userInfoAction: { type: 'link', onClick: () => { console.log('View profile'); } },
94
- onSignOut: () => { console.log('Sign out'); },
107
+ userInfoAction: { type: 'link', onClick: () => {
108
+ console.log('View profile');
109
+ } },
110
+ onSignOut: () => {
111
+ console.log('Sign out');
112
+ },
95
113
  signOutLabel: 'Sign out of Arbor',
96
114
  },
97
115
  };
@@ -107,12 +125,18 @@ export const WithApps: Story = {
107
125
  {
108
126
  label: 'Quick Actions',
109
127
  apps: [
110
- { name: 'Settings', onClick: () => { console.log('Settings'); } },
111
- { name: 'Help', onClick: () => { console.log('Help'); } },
128
+ { name: 'Settings', onClick: () => {
129
+ console.log('Settings');
130
+ } },
131
+ { name: 'Help', onClick: () => {
132
+ console.log('Help');
133
+ } },
112
134
  ],
113
135
  },
114
136
  ],
115
- onSignOut: () => { console.log('Sign out'); },
137
+ onSignOut: () => {
138
+ console.log('Sign out');
139
+ },
116
140
  },
117
141
  };
118
142
 
@@ -123,7 +147,9 @@ export const Minimal: Story = {
123
147
  avatarInitials: 'CM',
124
148
  avatarAlt: 'Christine Montgomery',
125
149
  },
126
- onSignOut: () => { console.log('Sign out'); },
150
+ onSignOut: () => {
151
+ console.log('Sign out');
152
+ },
127
153
  },
128
154
  };
129
155
 
@@ -144,7 +170,9 @@ export const WithMenu: Story = {
144
170
  {
145
171
  logo: <AppLogo src={logoArborWorkflows} alt="Arbor Workflows" />,
146
172
  name: 'Arbor Workflows',
147
- onClick: () => { console.log('Open Arbor Workflows'); },
173
+ onClick: () => {
174
+ console.log('Open Arbor Workflows');
175
+ },
148
176
  },
149
177
  ],
150
178
  },
@@ -152,12 +180,20 @@ export const WithMenu: Story = {
152
180
  userInfoAction: {
153
181
  type: 'menu',
154
182
  items: [
155
- { label: 'Help centre', onClick: () => { console.log('Help centre'); } },
156
- { label: 'About', onClick: () => { console.log('About'); } },
157
- { label: 'Leave feedback', onClick: () => { console.log('Leave feedback'); } },
183
+ { label: 'Help centre', onClick: () => {
184
+ console.log('Help centre');
185
+ } },
186
+ { label: 'About', onClick: () => {
187
+ console.log('About');
188
+ } },
189
+ { label: 'Leave feedback', onClick: () => {
190
+ console.log('Leave feedback');
191
+ } },
158
192
  ],
159
193
  },
160
- onSignOut: () => { console.log('Sign out'); },
194
+ onSignOut: () => {
195
+ console.log('Sign out');
196
+ },
161
197
  signOutLabel: 'Sign out of Arbor',
162
198
  },
163
199
  };
@@ -180,12 +216,16 @@ export const DarkVariant: Story = {
180
216
  {
181
217
  logo: <AppLogo src={logoArborWorkflows} alt="Arbor Workflows" />,
182
218
  name: 'Arbor Workflows',
183
- onClick: () => { console.log('Open Arbor Workflows'); },
219
+ onClick: () => {
220
+ console.log('Open Arbor Workflows');
221
+ },
184
222
  },
185
223
  ],
186
224
  },
187
225
  ],
188
- onSignOut: () => { console.log('Sign out'); },
226
+ onSignOut: () => {
227
+ console.log('Sign out');
228
+ },
189
229
  signOutLabel: 'Sign out of Arbor',
190
230
  },
191
231
  parameters: {
@@ -216,12 +256,16 @@ export const LightVariant: Story = {
216
256
  {
217
257
  logo: <AppLogo src={logoArborWorkflows} alt="Arbor Workflows" />,
218
258
  name: 'Arbor Workflows',
219
- onClick: () => { console.log('Open Arbor Workflows'); },
259
+ onClick: () => {
260
+ console.log('Open Arbor Workflows');
261
+ },
220
262
  },
221
263
  ],
222
264
  },
223
265
  ],
224
- onSignOut: () => { console.log('Sign out'); },
266
+ onSignOut: () => {
267
+ console.log('Sign out');
268
+ },
225
269
  signOutLabel: 'Sign out of Arbor',
226
270
  },
227
271
  parameters: {
@@ -18,7 +18,9 @@ export const UserDropdownCollapsibleSection = (props: UserDropdownCollapsibleSec
18
18
  <div className="ds-user-dropdown__collapsible-section">
19
19
  <div
20
20
  className="ds-user-dropdown__collapsible-section-header"
21
- onClick={() => { setIsOpen(!isOpen); }}
21
+ onClick={() => {
22
+ setIsOpen(!isOpen);
23
+ }}
22
24
  role="button"
23
25
  tabIndex={0}
24
26
  aria-expanded={isOpen}
@@ -4,8 +4,12 @@ export const getTextContrast = (color: string): TextContrast => {
4
4
  const CONTRAST_THRESHOLD = 128;
5
5
 
6
6
  let hex = color.trim().replace('#', '');
7
- if (hex.length === 3) hex = hex.split('').map(c => c + c).join('');
8
- if (hex.length !== 6 || /[^0-9a-f]/i.test(hex)) return 'dark';
7
+ if (hex.length === 3) {
8
+ hex = hex.split('').map(c => c + c).join('');
9
+ }
10
+ if (hex.length !== 6 || /[^0-9a-f]/i.test(hex)) {
11
+ return 'dark';
12
+ }
9
13
  const r = parseInt(hex.slice(0, 2), 16);
10
14
  const g = parseInt(hex.slice(2, 4), 16);
11
15
  const b = parseInt(hex.slice(4, 6), 16);
@@ -25,7 +25,9 @@ export const useElementWidth = (
25
25
  }, [update, watchKey]);
26
26
 
27
27
  useLayoutEffect(() => {
28
- if (!element) return;
28
+ if (!element) {
29
+ return;
30
+ }
29
31
 
30
32
  const observer = new ResizeObserver(update);
31
33
  observer.observe(element);
@@ -7,7 +7,9 @@ type MeasuredChildWidths = {
7
7
  };
8
8
 
9
9
  const getTrackGap = (trackElement: HTMLElement | null): number => {
10
- if (!trackElement) return 0;
10
+ if (!trackElement) {
11
+ return 0;
12
+ }
11
13
 
12
14
  const styles = getComputedStyle(trackElement);
13
15
  const parsedGap = Number.parseFloat(styles.columnGap || styles.gap || '0');
@@ -15,7 +17,9 @@ const getTrackGap = (trackElement: HTMLElement | null): number => {
15
17
  };
16
18
 
17
19
  const getChildWidths = (trackElement: HTMLElement | null): number[] => {
18
- if (!trackElement) return [];
20
+ if (!trackElement) {
21
+ return [];
22
+ }
19
23
 
20
24
  return Array.from(trackElement.children).map((child) => {
21
25
  const width = (child as HTMLElement).getBoundingClientRect().width;
@@ -49,7 +49,9 @@ export const useRovingFocus = <Target extends string>({
49
49
 
50
50
  const queueFocusRecovery = useCallback((target: Target) => {
51
51
  const targetIndex = targets.indexOf(target);
52
- if (targetIndex < 0) return;
52
+ if (targetIndex < 0) {
53
+ return;
54
+ }
53
55
 
54
56
  pendingFocusRecoveryRef.current = { targetIndex };
55
57
  }, [targets]);
@@ -69,7 +71,9 @@ export const useRovingFocus = <Target extends string>({
69
71
 
70
72
  useLayoutEffect(() => {
71
73
  const pendingFocusRecovery = pendingFocusRecoveryRef.current;
72
- if (!pendingFocusRecovery) return;
74
+ if (!pendingFocusRecovery) {
75
+ return;
76
+ }
73
77
 
74
78
  pendingFocusRecoveryRef.current = null;
75
79
 
@@ -87,7 +91,9 @@ export const useRovingFocus = <Target extends string>({
87
91
  }, [moveFocus, returnFocusRef, setActiveTarget, targets]);
88
92
 
89
93
  useLayoutEffect(() => () => {
90
- if (!pendingFocusRecoveryRef.current) return;
94
+ if (!pendingFocusRecoveryRef.current) {
95
+ return;
96
+ }
91
97
 
92
98
  pendingFocusRecoveryRef.current = null;
93
99
  returnFocusRefRef.current?.current?.focus();
@@ -95,7 +101,9 @@ export const useRovingFocus = <Target extends string>({
95
101
 
96
102
  const handleTargetKeyDown = useCallback((event: React.KeyboardEvent<HTMLElement>, target: Target) => {
97
103
  const targetIndex = targets.indexOf(target);
98
- if (targetIndex < 0) return;
104
+ if (targetIndex < 0) {
105
+ return;
106
+ }
99
107
 
100
108
  switch (event.key) {
101
109
  case 'ArrowLeft':
@@ -4,7 +4,9 @@ export const sumSpacedWidths = (
4
4
  visibleCount: number = widths.length,
5
5
  ): number => {
6
6
  const boundedCount = Math.max(0, Math.min(visibleCount, widths.length));
7
- if (boundedCount === 0) return 0;
7
+ if (boundedCount === 0) {
8
+ return 0;
9
+ }
8
10
 
9
11
  let usedWidth = 0;
10
12
  for (let index = 0; index < boundedCount; index += 1) {
@@ -22,13 +24,17 @@ export const fitSpacedWidths = (
22
24
  widths: number[],
23
25
  gap: number,
24
26
  ): number => {
25
- if (availableWidth <= 0 || widths.length === 0) return 0;
27
+ if (availableWidth <= 0 || widths.length === 0) {
28
+ return 0;
29
+ }
26
30
 
27
31
  let usedWidth = 0;
28
32
  let visibleCount = 0;
29
33
  for (let index = 0; index < widths.length; index += 1) {
30
34
  const requiredWidth = (widths[index] ?? 0) + (index > 0 ? gap : 0);
31
- if (usedWidth + requiredWidth > availableWidth) break;
35
+ if (usedWidth + requiredWidth > availableWidth) {
36
+ break;
37
+ }
32
38
  usedWidth += requiredWidth;
33
39
  visibleCount += 1;
34
40
  }