@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.
- package/.gather/instructions/changesets.md +12 -0
- package/.gather/instructions/read-contributing.md +14 -0
- package/.storybook/DocsTemplate.tsx +3 -1
- package/.storybook/preview.ts +6 -2
- package/CHANGELOG.md +6 -0
- package/CONTRIBUTING.md +20 -0
- package/dist/components/avatarGroup/AvatarGroup.stories.d.ts.map +1 -1
- package/dist/components/avatarGroup/AvatarGroup.stories.js +4 -2
- package/dist/components/avatarGroup/AvatarGroup.stories.js.map +1 -1
- package/dist/components/card/Card.d.ts.map +1 -1
- package/dist/components/card/Card.js +2 -1
- package/dist/components/card/Card.js.map +1 -1
- package/dist/components/combobox/Combobox.d.ts.map +1 -1
- package/dist/components/combobox/Combobox.js +10 -5
- package/dist/components/combobox/Combobox.js.map +1 -1
- package/dist/components/combobox/Combobox.stories.d.ts.map +1 -1
- package/dist/components/combobox/Combobox.stories.js +2 -1
- package/dist/components/combobox/Combobox.stories.js.map +1 -1
- package/dist/components/combobox/Combobox.test.js +18 -9
- package/dist/components/combobox/Combobox.test.js.map +1 -1
- package/dist/components/combobox/ComboboxButtonTrigger.d.ts.map +1 -1
- package/dist/components/combobox/ComboboxButtonTrigger.js +3 -1
- package/dist/components/combobox/ComboboxButtonTrigger.js.map +1 -1
- package/dist/components/combobox/ComboboxListbox.d.ts.map +1 -1
- package/dist/components/combobox/ComboboxListbox.js +8 -4
- package/dist/components/combobox/ComboboxListbox.js.map +1 -1
- package/dist/components/combobox/buildListboxDisplayOptions.d.ts.map +1 -1
- package/dist/components/combobox/buildListboxDisplayOptions.js +4 -2
- package/dist/components/combobox/buildListboxDisplayOptions.js.map +1 -1
- package/dist/components/combobox/highlightLabel.d.ts.map +1 -1
- package/dist/components/combobox/highlightLabel.js +2 -1
- package/dist/components/combobox/highlightLabel.js.map +1 -1
- package/dist/components/combobox/useChipSelection.d.ts.map +1 -1
- package/dist/components/combobox/useChipSelection.js +2 -1
- package/dist/components/combobox/useChipSelection.js.map +1 -1
- package/dist/components/combobox/useComboboxListboxKeyboard.d.ts.map +1 -1
- package/dist/components/combobox/useComboboxListboxKeyboard.js +8 -4
- package/dist/components/combobox/useComboboxListboxKeyboard.js.map +1 -1
- package/dist/components/combobox/useComboboxPopoverBehavior.d.ts.map +1 -1
- package/dist/components/combobox/useComboboxPopoverBehavior.js +16 -8
- package/dist/components/combobox/useComboboxPopoverBehavior.js.map +1 -1
- package/dist/components/combobox/useComboboxState.d.ts.map +1 -1
- package/dist/components/combobox/useComboboxState.js +22 -11
- package/dist/components/combobox/useComboboxState.js.map +1 -1
- package/dist/components/datePicker/DatePickerCalendarHeader.d.ts.map +1 -1
- package/dist/components/datePicker/DatePickerCalendarHeader.js +4 -2
- package/dist/components/datePicker/DatePickerCalendarHeader.js.map +1 -1
- package/dist/components/dateTimePicker/DateTimePicker.d.ts.map +1 -1
- package/dist/components/dateTimePicker/DateTimePicker.js +2 -1
- package/dist/components/dateTimePicker/DateTimePicker.js.map +1 -1
- package/dist/components/dateTimePicker/DateTimePicker.test.js.map +1 -1
- package/dist/components/dropdown/Dropdown.stories.d.ts.map +1 -1
- package/dist/components/dropdown/Dropdown.stories.js +10 -5
- package/dist/components/dropdown/Dropdown.stories.js.map +1 -1
- package/dist/components/filterBar/FilterBar.d.ts.map +1 -1
- package/dist/components/filterBar/FilterBar.js +4 -2
- package/dist/components/filterBar/FilterBar.js.map +1 -1
- package/dist/components/filterBar/FilterBar.stories.d.ts.map +1 -1
- package/dist/components/filterBar/FilterBar.stories.js +6 -3
- package/dist/components/filterBar/FilterBar.stories.js.map +1 -1
- package/dist/components/filterBar/FilterBar.test.js +6 -3
- package/dist/components/filterBar/FilterBar.test.js.map +1 -1
- package/dist/components/formField/fieldset/Fieldset.stories.d.ts.map +1 -1
- package/dist/components/formField/fieldset/Fieldset.stories.js.map +1 -1
- package/dist/components/formField/inputs/radio/RadioButtonGroup.d.ts +1 -1
- package/dist/components/formField/inputs/radio/RadioButtonGroup.d.ts.map +1 -1
- package/dist/components/formField/inputs/radio/RadioButtonGroup.js +1 -1
- package/dist/components/formField/inputs/radio/RadioButtonGroup.js.map +1 -1
- package/dist/components/formField/inputs/selectDropdown/SelectDropdown.d.ts.map +1 -1
- package/dist/components/formField/inputs/selectDropdown/SelectDropdown.js +2 -1
- package/dist/components/formField/inputs/selectDropdown/SelectDropdown.js.map +1 -1
- package/dist/components/formField/inputs/textArea/TextArea.stories.d.ts.map +1 -1
- package/dist/components/formField/inputs/textArea/TextArea.stories.js +10 -5
- package/dist/components/formField/inputs/textArea/TextArea.stories.js.map +1 -1
- package/dist/components/formField/inputs/time/TimeInput.js +3 -4
- package/dist/components/formField/inputs/time/TimeInput.js.map +1 -1
- package/dist/components/formField/inputs/time/TimeInput.test.js.map +1 -1
- package/dist/components/heading/Heading.stories.d.ts.map +1 -1
- package/dist/components/heading/Heading.stories.js.map +1 -1
- package/dist/components/modal/Modal.stories.d.ts.map +1 -1
- package/dist/components/modal/Modal.stories.js.map +1 -1
- package/dist/components/progress/Progress.stories.d.ts.map +1 -1
- package/dist/components/progress/Progress.stories.js +2 -1
- package/dist/components/progress/Progress.stories.js.map +1 -1
- package/dist/components/sidebarNav/SidebarNavItem.d.ts.map +1 -1
- package/dist/components/sidebarNav/SidebarNavItem.js +12 -11
- package/dist/components/sidebarNav/SidebarNavItem.js.map +1 -1
- package/dist/components/sidebarNav/SidebarNavRailItem.d.ts.map +1 -1
- package/dist/components/sidebarNav/SidebarNavRailItem.js +11 -10
- package/dist/components/sidebarNav/SidebarNavRailItem.js.map +1 -1
- package/dist/components/sidebarNav/useControllableBoolean.d.ts.map +1 -1
- package/dist/components/sidebarNav/useControllableBoolean.js +2 -1
- package/dist/components/sidebarNav/useControllableBoolean.js.map +1 -1
- package/dist/components/table/Table.d.ts.map +1 -1
- package/dist/components/table/Table.js +11 -1
- package/dist/components/table/Table.js.map +1 -1
- package/dist/components/table/Table.stories.d.ts.map +1 -1
- package/dist/components/table/Table.stories.js +6 -2
- package/dist/components/table/Table.stories.js.map +1 -1
- package/dist/components/table/Table.test.js +9 -3
- package/dist/components/table/Table.test.js.map +1 -1
- package/dist/components/table/cellRenderers/ComboboxCellRenderer.d.ts.map +1 -1
- package/dist/components/table/cellRenderers/ComboboxCellRenderer.js +16 -8
- package/dist/components/table/cellRenderers/ComboboxCellRenderer.js.map +1 -1
- package/dist/components/table/columnFilters/TimeFilter/TimeFilter.d.ts.map +1 -1
- package/dist/components/table/columnFilters/TimeFilter/TimeFilter.js +2 -1
- package/dist/components/table/columnFilters/TimeFilter/TimeFilter.js.map +1 -1
- package/dist/components/table/tableControls/HideColumnsDropdown.d.ts.map +1 -1
- package/dist/components/table/tableControls/HideColumnsDropdown.js +2 -1
- package/dist/components/table/tableControls/HideColumnsDropdown.js.map +1 -1
- package/dist/components/table/tableControls/TableControls.d.ts.map +1 -1
- package/dist/components/table/tableControls/TableControls.js +2 -1
- package/dist/components/table/tableControls/TableControls.js.map +1 -1
- package/dist/components/tag/Tag.test.js.map +1 -1
- package/dist/components/tagList/TagList.d.ts.map +1 -1
- package/dist/components/tagList/TagList.js +8 -4
- package/dist/components/tagList/TagList.js.map +1 -1
- package/dist/components/tagList/TagList.test.js +6 -3
- package/dist/components/tagList/TagList.test.js.map +1 -1
- package/dist/components/treeRow/TreeRowSection.d.ts.map +1 -1
- package/dist/components/treeRow/TreeRowSection.js +2 -1
- package/dist/components/treeRow/TreeRowSection.js.map +1 -1
- package/dist/components/userDropdown/UserDropdown.stories.d.ts.map +1 -1
- package/dist/components/userDropdown/UserDropdown.stories.js +66 -22
- package/dist/components/userDropdown/UserDropdown.stories.js.map +1 -1
- package/dist/components/userDropdown/internal/UserDropdownCollapsibleSection.d.ts.map +1 -1
- package/dist/components/userDropdown/internal/UserDropdownCollapsibleSection.js +3 -1
- package/dist/components/userDropdown/internal/UserDropdownCollapsibleSection.js.map +1 -1
- package/dist/utils/getTextContrast.d.ts.map +1 -1
- package/dist/utils/getTextContrast.js +4 -2
- package/dist/utils/getTextContrast.js.map +1 -1
- package/dist/utils/hooks/useElementWidth.d.ts.map +1 -1
- package/dist/utils/hooks/useElementWidth.js +2 -1
- package/dist/utils/hooks/useElementWidth.js.map +1 -1
- package/dist/utils/hooks/useMeasuredChildWidths.d.ts.map +1 -1
- package/dist/utils/hooks/useMeasuredChildWidths.js +4 -2
- package/dist/utils/hooks/useMeasuredChildWidths.js.map +1 -1
- package/dist/utils/hooks/useRovingFocus.d.ts.map +1 -1
- package/dist/utils/hooks/useRovingFocus.js +8 -4
- package/dist/utils/hooks/useRovingFocus.js.map +1 -1
- package/dist/utils/spacedWidths.d.ts.map +1 -1
- package/dist/utils/spacedWidths.js +6 -3
- package/dist/utils/spacedWidths.js.map +1 -1
- package/eslint.config.mts +32 -1
- package/package.json +1 -1
- package/src/components/avatarGroup/AvatarGroup.stories.tsx +6 -2
- package/src/components/card/Card.tsx +3 -1
- package/src/components/combobox/Combobox.stories.tsx +3 -1
- package/src/components/combobox/Combobox.test.tsx +39 -11
- package/src/components/combobox/Combobox.tsx +15 -5
- package/src/components/combobox/ComboboxButtonTrigger.tsx +3 -1
- package/src/components/combobox/ComboboxListbox.tsx +12 -4
- package/src/components/combobox/buildListboxDisplayOptions.ts +6 -2
- package/src/components/combobox/highlightLabel.tsx +2 -1
- package/src/components/combobox/useChipSelection.ts +3 -1
- package/src/components/combobox/useComboboxListboxKeyboard.ts +12 -4
- package/src/components/combobox/useComboboxPopoverBehavior.ts +24 -8
- package/src/components/combobox/useComboboxState.ts +28 -11
- package/src/components/datePicker/DatePickerCalendarHeader.tsx +6 -2
- package/src/components/dateTimePicker/DateTimePicker.test.tsx +2 -0
- package/src/components/dateTimePicker/DateTimePicker.tsx +3 -1
- package/src/components/dropdown/Dropdown.stories.tsx +19 -8
- package/src/components/filterBar/FilterBar.stories.tsx +9 -3
- package/src/components/filterBar/FilterBar.test.tsx +9 -3
- package/src/components/filterBar/FilterBar.tsx +6 -2
- package/src/components/formField/fieldset/Fieldset.stories.tsx +18 -3
- package/src/components/formField/inputs/radio/RadioButtonGroup.tsx +1 -1
- package/src/components/formField/inputs/selectDropdown/SelectDropdown.tsx +3 -1
- package/src/components/formField/inputs/textArea/TextArea.stories.tsx +10 -5
- package/src/components/formField/inputs/time/TimeInput.test.tsx +2 -0
- package/src/components/formField/inputs/time/TimeInput.tsx +4 -4
- package/src/components/heading/Heading.stories.tsx +12 -3
- package/src/components/modal/Modal.stories.tsx +15 -5
- package/src/components/progress/Progress.stories.tsx +3 -1
- package/src/components/sidebarNav/SidebarNavItem.tsx +27 -25
- package/src/components/sidebarNav/SidebarNavRailItem.tsx +34 -35
- package/src/components/sidebarNav/useControllableBoolean.ts +3 -1
- package/src/components/table/Table.stories.tsx +16 -12
- package/src/components/table/Table.test.tsx +10 -4
- package/src/components/table/Table.tsx +15 -5
- package/src/components/table/cellRenderers/ComboboxCellRenderer.tsx +19 -8
- package/src/components/table/columnFilters/TimeFilter/TimeFilter.tsx +3 -1
- package/src/components/table/tableControls/HideColumnsDropdown.tsx +3 -1
- package/src/components/table/tableControls/TableControls.tsx +3 -1
- package/src/components/tag/Tag.test.tsx +40 -8
- package/src/components/tagList/TagList.test.tsx +9 -3
- package/src/components/tagList/TagList.tsx +12 -4
- package/src/components/treeRow/TreeRowSection.tsx +3 -1
- package/src/components/userDropdown/UserDropdown.stories.tsx +66 -22
- package/src/components/userDropdown/internal/UserDropdownCollapsibleSection.tsx +3 -1
- package/src/utils/getTextContrast.ts +6 -2
- package/src/utils/hooks/useElementWidth.ts +3 -1
- package/src/utils/hooks/useMeasuredChildWidths.ts +6 -2
- package/src/utils/hooks/useRovingFocus.ts +12 -4
- 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(
|
|
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
|
|
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(
|
|
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
|
|
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(
|
|
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(
|
|
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
|
|
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
|
|
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'))
|
|
14
|
-
|
|
15
|
-
|
|
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)
|
|
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')
|
|
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')
|
|
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)
|
|
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)
|
|
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: () => {
|
|
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: () => {
|
|
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: () => {
|
|
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: () => {
|
|
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: () => {
|
|
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: () => {
|
|
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: () => {
|
|
101
|
+
onClick: () => {
|
|
102
|
+
console.log('Open Timetabler');
|
|
103
|
+
},
|
|
90
104
|
},
|
|
91
105
|
],
|
|
92
106
|
},
|
|
93
|
-
userInfoAction: { type: 'link', onClick: () => {
|
|
94
|
-
|
|
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: () => {
|
|
111
|
-
|
|
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: () => {
|
|
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: () => {
|
|
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: () => {
|
|
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: () => {
|
|
156
|
-
|
|
157
|
-
|
|
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: () => {
|
|
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: () => {
|
|
219
|
+
onClick: () => {
|
|
220
|
+
console.log('Open Arbor Workflows');
|
|
221
|
+
},
|
|
184
222
|
},
|
|
185
223
|
],
|
|
186
224
|
},
|
|
187
225
|
],
|
|
188
|
-
onSignOut: () => {
|
|
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: () => {
|
|
259
|
+
onClick: () => {
|
|
260
|
+
console.log('Open Arbor Workflows');
|
|
261
|
+
},
|
|
220
262
|
},
|
|
221
263
|
],
|
|
222
264
|
},
|
|
223
265
|
],
|
|
224
|
-
onSignOut: () => {
|
|
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={() => {
|
|
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)
|
|
8
|
-
|
|
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);
|
|
@@ -7,7 +7,9 @@ type MeasuredChildWidths = {
|
|
|
7
7
|
};
|
|
8
8
|
|
|
9
9
|
const getTrackGap = (trackElement: HTMLElement | null): number => {
|
|
10
|
-
if (!trackElement)
|
|
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)
|
|
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)
|
|
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)
|
|
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)
|
|
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)
|
|
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)
|
|
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)
|
|
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)
|
|
35
|
+
if (usedWidth + requiredWidth > availableWidth) {
|
|
36
|
+
break;
|
|
37
|
+
}
|
|
32
38
|
usedWidth += requiredWidth;
|
|
33
39
|
visibleCount += 1;
|
|
34
40
|
}
|