@arbor-education/design-system.components 0.15.0 → 0.16.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/skills/write-stories/SKILL.md +207 -271
- package/.storybook/preview.ts +5 -0
- package/CHANGELOG.md +23 -0
- package/README.md +8 -0
- package/component-library.md +144 -13
- package/dist/components/articleCard/ArticleCard.stories.d.ts +137 -11
- package/dist/components/articleCard/ArticleCard.stories.d.ts.map +1 -1
- package/dist/components/articleCard/ArticleCard.stories.js +358 -91
- package/dist/components/articleCard/ArticleCard.stories.js.map +1 -1
- package/dist/components/avatar/Avatar.stories.d.ts +6 -6
- package/dist/components/avatar/Avatar.stories.d.ts.map +1 -1
- package/dist/components/avatar/Avatar.stories.js +393 -49
- package/dist/components/avatar/Avatar.stories.js.map +1 -1
- package/dist/components/avatarGroup/AvatarGroup.stories.d.ts +9 -7
- package/dist/components/avatarGroup/AvatarGroup.stories.d.ts.map +1 -1
- package/dist/components/avatarGroup/AvatarGroup.stories.js +688 -65
- package/dist/components/avatarGroup/AvatarGroup.stories.js.map +1 -1
- package/dist/components/banner/Banner.stories.d.ts.map +1 -1
- package/dist/components/banner/Banner.stories.js +7 -3
- package/dist/components/banner/Banner.stories.js.map +1 -1
- package/dist/components/card/Card.stories.d.ts +105 -4
- package/dist/components/card/Card.stories.d.ts.map +1 -1
- package/dist/components/card/Card.stories.js +336 -18
- package/dist/components/card/Card.stories.js.map +1 -1
- package/dist/components/combobox/Combobox.stories.d.ts +134 -21
- package/dist/components/combobox/Combobox.stories.d.ts.map +1 -1
- package/dist/components/combobox/Combobox.stories.js +676 -175
- package/dist/components/combobox/Combobox.stories.js.map +1 -1
- package/dist/components/datePicker/DatePicker.stories.d.ts +119 -27
- package/dist/components/datePicker/DatePicker.stories.d.ts.map +1 -1
- package/dist/components/datePicker/DatePicker.stories.js +575 -47
- package/dist/components/datePicker/DatePicker.stories.js.map +1 -1
- package/dist/components/dateTimePicker/DateTimePicker.stories.d.ts +155 -39
- package/dist/components/dateTimePicker/DateTimePicker.stories.d.ts.map +1 -1
- package/dist/components/dateTimePicker/DateTimePicker.stories.js +674 -103
- package/dist/components/dateTimePicker/DateTimePicker.stories.js.map +1 -1
- package/dist/components/editableText/EditableText.stories.d.ts +53 -12
- package/dist/components/editableText/EditableText.stories.d.ts.map +1 -1
- package/dist/components/editableText/EditableText.stories.js +401 -64
- package/dist/components/editableText/EditableText.stories.js.map +1 -1
- package/dist/components/formField/FormField.d.ts +4 -0
- package/dist/components/formField/FormField.d.ts.map +1 -1
- package/dist/components/formField/FormField.js +2 -1
- package/dist/components/formField/FormField.js.map +1 -1
- package/dist/components/formField/FormField.test.js +5 -0
- package/dist/components/formField/FormField.test.js.map +1 -1
- package/dist/components/formField/fieldset/Fieldset.stories.d.ts +56 -4
- package/dist/components/formField/fieldset/Fieldset.stories.d.ts.map +1 -1
- package/dist/components/formField/fieldset/Fieldset.stories.js +534 -28
- package/dist/components/formField/fieldset/Fieldset.stories.js.map +1 -1
- package/dist/components/formField/inputs/checkbox/CheckboxGroup.d.ts +3 -1
- package/dist/components/formField/inputs/checkbox/CheckboxGroup.d.ts.map +1 -1
- package/dist/components/formField/inputs/checkbox/CheckboxInput.js +1 -1
- package/dist/components/formField/inputs/checkbox/CheckboxInput.js.map +1 -1
- package/dist/components/formField/inputs/colourPickerDropdown/ColourPickerDropdown.stories.d.ts +95 -1
- package/dist/components/formField/inputs/colourPickerDropdown/ColourPickerDropdown.stories.d.ts.map +1 -1
- package/dist/components/formField/inputs/colourPickerDropdown/ColourPickerDropdown.stories.js +386 -9
- package/dist/components/formField/inputs/colourPickerDropdown/ColourPickerDropdown.stories.js.map +1 -1
- package/dist/components/formField/inputs/radio/RadioButtonGroup.d.ts +6 -2
- package/dist/components/formField/inputs/radio/RadioButtonGroup.d.ts.map +1 -1
- package/dist/components/formField/inputs/radio/RadioButtonGroup.js.map +1 -1
- package/dist/components/formField/inputs/radio/RadioButtonInput.stories.d.ts.map +1 -1
- package/dist/components/formField/inputs/radio/RadioButtonInput.stories.js +61 -49
- package/dist/components/formField/inputs/radio/RadioButtonInput.stories.js.map +1 -1
- package/dist/components/formField/inputs/selectDropdown/SelectDropdown.stories.d.ts +188 -166
- package/dist/components/formField/inputs/selectDropdown/SelectDropdown.stories.d.ts.map +1 -1
- package/dist/components/formField/inputs/selectDropdown/SelectDropdown.stories.js +821 -160
- package/dist/components/formField/inputs/selectDropdown/SelectDropdown.stories.js.map +1 -1
- package/dist/components/formField/inputs/time/TimeInput.stories.d.ts +176 -22
- package/dist/components/formField/inputs/time/TimeInput.stories.d.ts.map +1 -1
- package/dist/components/formField/inputs/time/TimeInput.stories.js +851 -92
- package/dist/components/formField/inputs/time/TimeInput.stories.js.map +1 -1
- package/dist/components/formField/label/Label.stories.d.ts +54 -5
- package/dist/components/formField/label/Label.stories.d.ts.map +1 -1
- package/dist/components/formField/label/Label.stories.js +238 -4
- package/dist/components/formField/label/Label.stories.js.map +1 -1
- package/dist/components/icoText/IcoText.stories.d.ts +32 -6
- package/dist/components/icoText/IcoText.stories.d.ts.map +1 -1
- package/dist/components/icoText/IcoText.stories.js +309 -14
- package/dist/components/icoText/IcoText.stories.js.map +1 -1
- package/dist/components/kpiCard/KPICard.stories.d.ts +100 -2
- package/dist/components/kpiCard/KPICard.stories.d.ts.map +1 -1
- package/dist/components/kpiCard/KPICard.stories.js +354 -10
- package/dist/components/kpiCard/KPICard.stories.js.map +1 -1
- package/dist/components/kvpList/KVPList.stories.d.ts +57 -4
- package/dist/components/kvpList/KVPList.stories.d.ts.map +1 -1
- package/dist/components/kvpList/KVPList.stories.js +403 -10
- package/dist/components/kvpList/KVPList.stories.js.map +1 -1
- package/dist/components/modal/Modal.stories.d.ts +113 -9
- package/dist/components/modal/Modal.stories.d.ts.map +1 -1
- package/dist/components/modal/Modal.stories.js +633 -13
- package/dist/components/modal/Modal.stories.js.map +1 -1
- package/dist/components/modal/modalManager/ModalManager.stories.d.ts +34 -10
- package/dist/components/modal/modalManager/ModalManager.stories.d.ts.map +1 -1
- package/dist/components/modal/modalManager/ModalManager.stories.js +463 -85
- package/dist/components/modal/modalManager/ModalManager.stories.js.map +1 -1
- package/dist/components/pill/Pill.d.ts.map +1 -1
- package/dist/components/pill/Pill.js +1 -1
- package/dist/components/pill/Pill.js.map +1 -1
- package/dist/components/pill/Pill.stories.d.ts.map +1 -1
- package/dist/components/pill/Pill.stories.js +11 -13
- package/dist/components/pill/Pill.stories.js.map +1 -1
- package/dist/components/row/Row.stories.d.ts +1 -2
- package/dist/components/row/Row.stories.d.ts.map +1 -1
- package/dist/components/row/Row.stories.js +360 -50
- package/dist/components/row/Row.stories.js.map +1 -1
- package/dist/components/searchBar/SearchBar.stories.d.ts +52 -4
- package/dist/components/searchBar/SearchBar.stories.d.ts.map +1 -1
- package/dist/components/searchBar/SearchBar.stories.js +428 -36
- package/dist/components/searchBar/SearchBar.stories.js.map +1 -1
- package/dist/components/section/Section.stories.d.ts +11 -41
- package/dist/components/section/Section.stories.d.ts.map +1 -1
- package/dist/components/section/Section.stories.js +494 -56
- package/dist/components/section/Section.stories.js.map +1 -1
- package/dist/components/singleUser/SingleUser.stories.d.ts +5 -4
- package/dist/components/singleUser/SingleUser.stories.d.ts.map +1 -1
- package/dist/components/singleUser/SingleUser.stories.js +303 -31
- package/dist/components/singleUser/SingleUser.stories.js.map +1 -1
- package/dist/components/slideoverManager/SlideoverManager.stories.d.ts +32 -11
- package/dist/components/slideoverManager/SlideoverManager.stories.d.ts.map +1 -1
- package/dist/components/slideoverManager/SlideoverManager.stories.js +380 -84
- package/dist/components/slideoverManager/SlideoverManager.stories.js.map +1 -1
- package/dist/components/table/DSDefaultColDef.d.ts.map +1 -1
- package/dist/components/table/DSDefaultColDef.js +4 -3
- package/dist/components/table/DSDefaultColDef.js.map +1 -1
- package/dist/components/table/Table.d.ts +6 -1
- package/dist/components/table/Table.d.ts.map +1 -1
- package/dist/components/table/Table.js +8 -3
- package/dist/components/table/Table.js.map +1 -1
- package/dist/components/table/Table.stories.d.ts +3 -0
- package/dist/components/table/Table.stories.d.ts.map +1 -1
- package/dist/components/table/Table.stories.js +384 -5
- package/dist/components/table/Table.stories.js.map +1 -1
- package/dist/components/table/Table.test.js +30 -0
- package/dist/components/table/Table.test.js.map +1 -1
- package/dist/components/table/TableFooter.stories.d.ts +49 -0
- package/dist/components/table/TableFooter.stories.d.ts.map +1 -0
- package/dist/components/table/TableFooter.stories.js +137 -0
- package/dist/components/table/TableFooter.stories.js.map +1 -0
- package/dist/components/table/TableHeader.stories.d.ts +93 -0
- package/dist/components/table/TableHeader.stories.d.ts.map +1 -0
- package/dist/components/table/TableHeader.stories.js +176 -0
- package/dist/components/table/TableHeader.stories.js.map +1 -0
- package/dist/components/table/cellEditors/DateCellEditor.stories.d.ts +44 -0
- package/dist/components/table/cellEditors/DateCellEditor.stories.d.ts.map +1 -0
- package/dist/components/table/cellEditors/DateCellEditor.stories.js +186 -0
- package/dist/components/table/cellEditors/DateCellEditor.stories.js.map +1 -0
- package/dist/components/table/cellRenderers/BooleanCellRenderer.stories.d.ts +40 -0
- package/dist/components/table/cellRenderers/BooleanCellRenderer.stories.d.ts.map +1 -0
- package/dist/components/table/cellRenderers/BooleanCellRenderer.stories.js +209 -0
- package/dist/components/table/cellRenderers/BooleanCellRenderer.stories.js.map +1 -0
- package/dist/components/table/cellRenderers/ButtonCellRenderer.stories.d.ts +48 -0
- package/dist/components/table/cellRenderers/ButtonCellRenderer.stories.d.ts.map +1 -0
- package/dist/components/table/cellRenderers/ButtonCellRenderer.stories.js +244 -0
- package/dist/components/table/cellRenderers/ButtonCellRenderer.stories.js.map +1 -0
- package/dist/components/table/cellRenderers/CheckboxCellRenderer.d.ts.map +1 -1
- package/dist/components/table/cellRenderers/CheckboxCellRenderer.js +3 -1
- package/dist/components/table/cellRenderers/CheckboxCellRenderer.js.map +1 -1
- package/dist/components/table/cellRenderers/CheckboxCellRenderer.stories.d.ts +64 -0
- package/dist/components/table/cellRenderers/CheckboxCellRenderer.stories.d.ts.map +1 -0
- package/dist/components/table/cellRenderers/CheckboxCellRenderer.stories.js +241 -0
- package/dist/components/table/cellRenderers/CheckboxCellRenderer.stories.js.map +1 -0
- package/dist/components/table/cellRenderers/DefaultCellRenderer.stories.d.ts +55 -0
- package/dist/components/table/cellRenderers/DefaultCellRenderer.stories.d.ts.map +1 -0
- package/dist/components/table/cellRenderers/DefaultCellRenderer.stories.js +245 -0
- package/dist/components/table/cellRenderers/DefaultCellRenderer.stories.js.map +1 -0
- package/dist/components/table/cellRenderers/InlineTextCellRenderer.stories.d.ts +67 -0
- package/dist/components/table/cellRenderers/InlineTextCellRenderer.stories.d.ts.map +1 -0
- package/dist/components/table/cellRenderers/InlineTextCellRenderer.stories.js +221 -0
- package/dist/components/table/cellRenderers/InlineTextCellRenderer.stories.js.map +1 -0
- package/dist/components/table/cellRenderers/SelectDropdownCellRenderer.stories.d.ts +75 -0
- package/dist/components/table/cellRenderers/SelectDropdownCellRenderer.stories.d.ts.map +1 -0
- package/dist/components/table/cellRenderers/SelectDropdownCellRenderer.stories.js +270 -0
- package/dist/components/table/cellRenderers/SelectDropdownCellRenderer.stories.js.map +1 -0
- package/dist/components/table/columnFilters/BooleanFilter.stories.d.ts +57 -0
- package/dist/components/table/columnFilters/BooleanFilter.stories.d.ts.map +1 -0
- package/dist/components/table/columnFilters/BooleanFilter.stories.js +198 -0
- package/dist/components/table/columnFilters/BooleanFilter.stories.js.map +1 -0
- package/dist/components/table/columnFilters/TimeFilter.stories.d.ts +58 -0
- package/dist/components/table/columnFilters/TimeFilter.stories.d.ts.map +1 -0
- package/dist/components/table/columnFilters/TimeFilter.stories.js +207 -0
- package/dist/components/table/columnFilters/TimeFilter.stories.js.map +1 -0
- package/dist/components/table/pagination/PaginationPanel.stories.d.ts +113 -0
- package/dist/components/table/pagination/PaginationPanel.stories.d.ts.map +1 -0
- package/dist/components/table/pagination/PaginationPanel.stories.js +272 -0
- package/dist/components/table/pagination/PaginationPanel.stories.js.map +1 -0
- package/dist/components/table/tableControls/HideColumnsDropdown.d.ts.map +1 -1
- package/dist/components/table/tableControls/HideColumnsDropdown.js +9 -3
- package/dist/components/table/tableControls/HideColumnsDropdown.js.map +1 -1
- package/dist/components/table/tableControls/TableControls.stories.d.ts +151 -0
- package/dist/components/table/tableControls/TableControls.stories.d.ts.map +1 -0
- package/dist/components/table/tableControls/TableControls.stories.js +356 -0
- package/dist/components/table/tableControls/TableControls.stories.js.map +1 -0
- package/dist/components/table/tableControls/TableSettingsDropdown.d.ts +27 -1
- package/dist/components/table/tableControls/TableSettingsDropdown.d.ts.map +1 -1
- package/dist/components/table/tableControls/TableSettingsDropdown.js +53 -26
- package/dist/components/table/tableControls/TableSettingsDropdown.js.map +1 -1
- package/dist/components/table/tableControls/TableSettingsDropdown.test.d.ts +2 -0
- package/dist/components/table/tableControls/TableSettingsDropdown.test.d.ts.map +1 -0
- package/dist/components/table/tableControls/TableSettingsDropdown.test.js +178 -0
- package/dist/components/table/tableControls/TableSettingsDropdown.test.js.map +1 -0
- package/dist/components/tabs/Tabs.stories.d.ts +22 -4
- package/dist/components/tabs/Tabs.stories.d.ts.map +1 -1
- package/dist/components/tabs/Tabs.stories.js +398 -22
- package/dist/components/tabs/Tabs.stories.js.map +1 -1
- package/dist/components/tabs/TabsItem.stories.d.ts +54 -1
- package/dist/components/tabs/TabsItem.stories.d.ts.map +1 -1
- package/dist/components/tabs/TabsItem.stories.js +61 -9
- package/dist/components/tabs/TabsItem.stories.js.map +1 -1
- package/dist/components/toast/Toast.stories.d.ts +103 -10
- package/dist/components/toast/Toast.stories.d.ts.map +1 -1
- package/dist/components/toast/Toast.stories.js +409 -47
- package/dist/components/toast/Toast.stories.js.map +1 -1
- package/dist/components/toggle/Toggle.stories.d.ts +61 -46
- package/dist/components/toggle/Toggle.stories.d.ts.map +1 -1
- package/dist/components/toggle/Toggle.stories.js +311 -122
- package/dist/components/toggle/Toggle.stories.js.map +1 -1
- package/dist/components/tooltip/Tooltip.stories.d.ts +78 -6
- package/dist/components/tooltip/Tooltip.stories.d.ts.map +1 -1
- package/dist/components/tooltip/Tooltip.stories.js +413 -7
- package/dist/components/tooltip/Tooltip.stories.js.map +1 -1
- package/dist/components/tooltip/TooltipWrapper.stories.d.ts +71 -7
- package/dist/components/tooltip/TooltipWrapper.stories.d.ts.map +1 -1
- package/dist/components/tooltip/TooltipWrapper.stories.js +238 -10
- package/dist/components/tooltip/TooltipWrapper.stories.js.map +1 -1
- package/dist/index.css +8 -0
- package/dist/index.css.map +1 -1
- package/dist/utils/PopupParentContext.stories.d.ts +17 -0
- package/dist/utils/PopupParentContext.stories.d.ts.map +1 -0
- package/dist/utils/PopupParentContext.stories.js +266 -0
- package/dist/utils/PopupParentContext.stories.js.map +1 -0
- package/dist/utils/getDefaultPopupParent.d.ts.map +1 -1
- package/dist/utils/getDefaultPopupParent.js +6 -0
- package/dist/utils/getDefaultPopupParent.js.map +1 -1
- package/package.json +1 -1
- package/src/components/articleCard/ArticleCard.stories.tsx +524 -111
- package/src/components/avatar/Avatar.stories.tsx +504 -59
- package/src/components/avatarGroup/AvatarGroup.stories.tsx +977 -175
- package/src/components/banner/Banner.stories.tsx +7 -3
- package/src/components/card/Card.stories.tsx +466 -36
- package/src/components/combobox/Combobox.stories.tsx +867 -260
- package/src/components/datePicker/DatePicker.stories.tsx +777 -60
- package/src/components/dateTimePicker/DateTimePicker.stories.tsx +910 -132
- package/src/components/editableText/EditableText.stories.tsx +567 -91
- package/src/components/formField/FormField.test.tsx +6 -0
- package/src/components/formField/FormField.tsx +5 -0
- package/src/components/formField/fieldset/Fieldset.stories.tsx +761 -51
- package/src/components/formField/inputs/checkbox/CheckboxGroup.tsx +1 -1
- package/src/components/formField/inputs/checkbox/CheckboxInput.tsx +1 -1
- package/src/components/formField/inputs/colourPickerDropdown/ColourPickerDropdown.stories.tsx +504 -11
- package/src/components/formField/inputs/radio/RadioButtonGroup.tsx +17 -4
- package/src/components/formField/inputs/radio/RadioButtonInput.stories.tsx +71 -59
- package/src/components/formField/inputs/selectDropdown/SelectDropdown.stories.tsx +1079 -168
- package/src/components/formField/inputs/time/TimeInput.stories.tsx +1140 -104
- package/src/components/formField/label/Label.stories.tsx +317 -8
- package/src/components/icoText/IcoText.stories.tsx +442 -31
- package/src/components/kpiCard/KPICard.stories.tsx +475 -30
- package/src/components/kvpList/KVPList.stories.tsx +593 -26
- package/src/components/modal/Modal.stories.tsx +963 -26
- package/src/components/modal/modalManager/ModalManager.stories.tsx +612 -454
- package/src/components/pill/Pill.stories.tsx +11 -13
- package/src/components/pill/Pill.tsx +1 -0
- package/src/components/row/Row.stories.tsx +474 -58
- package/src/components/searchBar/SearchBar.stories.tsx +570 -38
- package/src/components/section/Section.stories.tsx +723 -70
- package/src/components/singleUser/SingleUser.stories.tsx +393 -34
- package/src/components/slideoverManager/SlideoverManager.stories.tsx +572 -342
- package/src/components/table/DSDefaultColDef.ts +25 -5
- package/src/components/table/Table.stories.tsx +460 -5
- package/src/components/table/Table.test.tsx +53 -0
- package/src/components/table/Table.tsx +9 -2
- package/src/components/table/TableFooter.stories.tsx +196 -0
- package/src/components/table/TableHeader.stories.tsx +251 -0
- package/src/components/table/cellEditors/DateCellEditor.stories.tsx +245 -0
- package/src/components/table/cellRenderers/BooleanCellRenderer.stories.tsx +278 -0
- package/src/components/table/cellRenderers/ButtonCellRenderer.stories.tsx +333 -0
- package/src/components/table/cellRenderers/CheckboxCellRenderer.stories.tsx +337 -0
- package/src/components/table/cellRenderers/CheckboxCellRenderer.tsx +5 -1
- package/src/components/table/cellRenderers/DefaultCellRenderer.stories.tsx +342 -0
- package/src/components/table/cellRenderers/InlineTextCellRenderer.stories.tsx +292 -0
- package/src/components/table/cellRenderers/SelectDropdownCellRenderer.stories.tsx +369 -0
- package/src/components/table/columnFilters/BooleanFilter.stories.tsx +268 -0
- package/src/components/table/columnFilters/TimeFilter.stories.tsx +281 -0
- package/src/components/table/pagination/PaginationPanel.stories.tsx +327 -0
- package/src/components/table/tableControls/HideColumnsDropdown.tsx +11 -2
- package/src/components/table/tableControls/TableControls.stories.tsx +415 -0
- package/src/components/table/tableControls/TableSettingsDropdown.test.tsx +207 -0
- package/src/components/table/tableControls/TableSettingsDropdown.tsx +103 -39
- package/src/components/tabs/Tabs.stories.tsx +540 -60
- package/src/components/tabs/TabsItem.stories.tsx +82 -8
- package/src/components/toast/Toast.stories.tsx +539 -77
- package/src/components/toggle/Toggle.stories.tsx +371 -135
- package/src/components/tooltip/Tooltip.stories.tsx +606 -15
- package/src/components/tooltip/TooltipWrapper.stories.tsx +348 -12
- package/src/docs/Contributing.mdx +241 -0
- package/src/docs/UsingComponents.mdx +93 -0
- package/src/docs/Welcome.mdx +68 -0
- package/src/global.scss +7 -0
- package/src/utils/PopupParentContext.stories.tsx +367 -0
- package/src/utils/getDefaultPopupParent.ts +6 -0
- package/.ralph/storybook-upgrade/knowledge.md +0 -308
- package/.ralph/storybook-upgrade/prd.json +0 -777
- package/.ralph/storybook-upgrade/progress.md +0 -342
- package/src/components/table/TableWIP.mdx +0 -3
|
@@ -1,63 +1,422 @@
|
|
|
1
1
|
import type { Meta, StoryObj } from '@storybook/react-vite';
|
|
2
|
+
import {
|
|
3
|
+
Controls,
|
|
4
|
+
Heading as DocHeading,
|
|
5
|
+
Markdown,
|
|
6
|
+
Primary as DocPrimary,
|
|
7
|
+
Stories,
|
|
8
|
+
Subtitle,
|
|
9
|
+
Title,
|
|
10
|
+
} from '@storybook/addon-docs/blocks';
|
|
11
|
+
|
|
2
12
|
import { SingleUser } from './SingleUser';
|
|
3
13
|
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
// Content strings for the custom DocsPage
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
|
|
18
|
+
const DESCRIPTION_INTRO = [
|
|
19
|
+
'`SingleUser` renders a user identity pill — an avatar paired with a visible name label.',
|
|
20
|
+
'The avatar is always decorative (`aria-hidden="true"`) so the `label` prop is the sole accessible name for the element.',
|
|
21
|
+
'The component is built on top of the [`Avatar`](?path=/docs/components-avatar--docs) component and inherits its `src` and `initials` props.',
|
|
22
|
+
].join(' ');
|
|
23
|
+
|
|
24
|
+
const PROPS_INTRO
|
|
25
|
+
= 'The preview below is wired to the **Controls** panel — tweak any prop to see the story update in real time.';
|
|
26
|
+
|
|
27
|
+
const USAGE_GUIDANCE = [
|
|
28
|
+
'### When to use',
|
|
29
|
+
'',
|
|
30
|
+
'- Displaying a named user inline — in a table cell, a row label, a card header, or a list of assignees.',
|
|
31
|
+
'- Anywhere a bare avatar would lack context — the label removes ambiguity about who the avatar represents.',
|
|
32
|
+
'- As a compact, non-interactive identity chip (e.g. "Assigned to · Sarah Okafor").',
|
|
33
|
+
'',
|
|
34
|
+
'---',
|
|
35
|
+
'',
|
|
36
|
+
'### When NOT to use',
|
|
37
|
+
'',
|
|
38
|
+
'| Situation | Use instead |',
|
|
39
|
+
'|---|---|',
|
|
40
|
+
'| Multiple users side by side | [`AvatarGroup`](?path=/docs/components-avatargroup--docs) |',
|
|
41
|
+
'| Avatar without a text label | [`Avatar`](?path=/docs/components-avatar--docs) directly |',
|
|
42
|
+
'| Clickable user link | Wrap `SingleUser` in an anchor or use a `Row` with `onClick` |',
|
|
43
|
+
'| User selection | A dropdown or autocomplete input |',
|
|
44
|
+
].join('\n');
|
|
45
|
+
|
|
46
|
+
const DEVELOPER_NOTES = [
|
|
47
|
+
'### Avatar is always decorative',
|
|
48
|
+
'',
|
|
49
|
+
'The inner `Avatar` is always rendered with `aria-hidden="true"` and `alt=""`. This means:',
|
|
50
|
+
'',
|
|
51
|
+
"- The `label` prop is the **only** accessible name — ensure it contains the user's full name.",
|
|
52
|
+
'- Screen readers announce the label text only; they will not announce initials or image alt text.',
|
|
53
|
+
'- You **cannot** override this behaviour via props — it is intentional design.',
|
|
54
|
+
'',
|
|
55
|
+
'---',
|
|
56
|
+
'',
|
|
57
|
+
'### Two className props',
|
|
58
|
+
'',
|
|
59
|
+
'`SingleUser` accepts two distinct `className` props:',
|
|
60
|
+
'',
|
|
61
|
+
'| Prop | Target element | Use case |',
|
|
62
|
+
'|---|---|---|',
|
|
63
|
+
'| `className` | Root `<span>` | Outer layout, margins, flex order |',
|
|
64
|
+
'| `avatarClassName` | Inner `<Avatar>` | Avatar-specific overrides |',
|
|
65
|
+
'',
|
|
66
|
+
'---',
|
|
67
|
+
'',
|
|
68
|
+
'### Default size is `"small"`',
|
|
69
|
+
'',
|
|
70
|
+
'> **Important:** `SingleUser` defaults to `size="small"`, not `"medium"` (which is `Avatar`\'s own default).',
|
|
71
|
+
'> Always pass `size` explicitly when a specific size is required.',
|
|
72
|
+
'',
|
|
73
|
+
'---',
|
|
74
|
+
'',
|
|
75
|
+
'### forwardRef',
|
|
76
|
+
'',
|
|
77
|
+
'`SingleUser` uses `React.forwardRef` and exposes a ref to the root `<span>` element.',
|
|
78
|
+
'',
|
|
79
|
+
'---',
|
|
80
|
+
'',
|
|
81
|
+
'### TypeScript types',
|
|
82
|
+
'',
|
|
83
|
+
'```ts',
|
|
84
|
+
"import { SingleUser } from '@arbor-education/design-system.components';",
|
|
85
|
+
"import type { SingleUserProps } from '@arbor-education/design-system.components';",
|
|
86
|
+
'',
|
|
87
|
+
'type SingleUserProps = {',
|
|
88
|
+
' label: string; // required — also the only accessible name',
|
|
89
|
+
' className?: string; // applied to the root <span>',
|
|
90
|
+
' avatarClassName?: string; // applied to the inner <Avatar>',
|
|
91
|
+
" size?: 'small' | 'medium' | 'large' | 'extra-large'; // default: 'small'",
|
|
92
|
+
' src?: string; // avatar image URL',
|
|
93
|
+
' initials?: string; // shown when src is absent or fails to load',
|
|
94
|
+
' // ...plus remaining AvatarProps (excluding className, alt, size)',
|
|
95
|
+
'};',
|
|
96
|
+
'```',
|
|
97
|
+
].join('\n');
|
|
98
|
+
|
|
99
|
+
const RELATED_COMPONENTS = [
|
|
100
|
+
'## Related components',
|
|
101
|
+
'',
|
|
102
|
+
'[Avatar](?path=/docs/components-avatar--docs) · [AvatarGroup](?path=/docs/components-avatargroup--docs) · [Row](?path=/docs/components-row--docs)',
|
|
103
|
+
].join('\n');
|
|
104
|
+
|
|
105
|
+
// ---------------------------------------------------------------------------
|
|
106
|
+
// Custom DocsPage
|
|
107
|
+
// ---------------------------------------------------------------------------
|
|
108
|
+
|
|
109
|
+
function SingleUserDocsPage() {
|
|
110
|
+
return (
|
|
111
|
+
<>
|
|
112
|
+
<Title />
|
|
113
|
+
<Subtitle />
|
|
114
|
+
<Markdown>{DESCRIPTION_INTRO}</Markdown>
|
|
115
|
+
<DocHeading>Interactive example</DocHeading>
|
|
116
|
+
<Markdown>{PROPS_INTRO}</Markdown>
|
|
117
|
+
<DocPrimary />
|
|
118
|
+
<Controls />
|
|
119
|
+
<DocHeading>Usage guidance</DocHeading>
|
|
120
|
+
<Markdown>{USAGE_GUIDANCE}</Markdown>
|
|
121
|
+
<DocHeading>Developer notes</DocHeading>
|
|
122
|
+
<Markdown>{DEVELOPER_NOTES}</Markdown>
|
|
123
|
+
<DocHeading>Examples</DocHeading>
|
|
124
|
+
<Stories title="" />
|
|
125
|
+
<Markdown>{RELATED_COMPONENTS}</Markdown>
|
|
126
|
+
</>
|
|
127
|
+
);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// ---------------------------------------------------------------------------
|
|
131
|
+
// Meta
|
|
132
|
+
// ---------------------------------------------------------------------------
|
|
133
|
+
|
|
4
134
|
const meta: Meta<typeof SingleUser> = {
|
|
5
135
|
title: 'Components/SingleUser',
|
|
6
136
|
component: SingleUser,
|
|
7
137
|
tags: ['autodocs'],
|
|
138
|
+
parameters: {
|
|
139
|
+
layout: 'padded',
|
|
140
|
+
docs: {
|
|
141
|
+
page: SingleUserDocsPage,
|
|
142
|
+
},
|
|
143
|
+
},
|
|
144
|
+
argTypes: {
|
|
145
|
+
label: {
|
|
146
|
+
description: [
|
|
147
|
+
'The visible name label rendered alongside the avatar.',
|
|
148
|
+
'This is also the **only** accessible name — the inner avatar is always `aria-hidden`.',
|
|
149
|
+
"Always pass the user's full name.",
|
|
150
|
+
].join(' '),
|
|
151
|
+
control: 'text',
|
|
152
|
+
table: {
|
|
153
|
+
type: { summary: 'string' },
|
|
154
|
+
defaultValue: { summary: 'undefined' },
|
|
155
|
+
},
|
|
156
|
+
},
|
|
157
|
+
size: {
|
|
158
|
+
description: [
|
|
159
|
+
'Controls the size of the inner avatar.',
|
|
160
|
+
"Defaults to `\"small\"` — note this differs from `Avatar`'s own default of `\"medium\"`.",
|
|
161
|
+
].join(' '),
|
|
162
|
+
control: 'select',
|
|
163
|
+
options: ['small', 'medium', 'large', 'extra-large'],
|
|
164
|
+
table: {
|
|
165
|
+
type: { summary: "'small' | 'medium' | 'large' | 'extra-large'" },
|
|
166
|
+
defaultValue: { summary: "'small'" },
|
|
167
|
+
},
|
|
168
|
+
},
|
|
169
|
+
src: {
|
|
170
|
+
description: [
|
|
171
|
+
'URL of the avatar image.',
|
|
172
|
+
'When absent or broken, `initials` are used as a fallback.',
|
|
173
|
+
].join(' '),
|
|
174
|
+
control: 'text',
|
|
175
|
+
table: {
|
|
176
|
+
type: { summary: 'string' },
|
|
177
|
+
defaultValue: { summary: 'undefined' },
|
|
178
|
+
},
|
|
179
|
+
},
|
|
180
|
+
initials: {
|
|
181
|
+
description:
|
|
182
|
+
'One or two initials shown inside the avatar when no `src` is provided or when the image fails to load.',
|
|
183
|
+
control: 'text',
|
|
184
|
+
table: {
|
|
185
|
+
type: { summary: 'string' },
|
|
186
|
+
defaultValue: { summary: 'undefined' },
|
|
187
|
+
},
|
|
188
|
+
},
|
|
189
|
+
className: {
|
|
190
|
+
description: [
|
|
191
|
+
'Additional CSS class names applied to the **root** `<span>` wrapper.',
|
|
192
|
+
'Use `avatarClassName` to target the inner avatar specifically.',
|
|
193
|
+
].join(' '),
|
|
194
|
+
control: 'text',
|
|
195
|
+
table: {
|
|
196
|
+
type: { summary: 'string' },
|
|
197
|
+
defaultValue: { summary: 'undefined' },
|
|
198
|
+
},
|
|
199
|
+
},
|
|
200
|
+
avatarClassName: {
|
|
201
|
+
description: [
|
|
202
|
+
'Additional CSS class names applied only to the **inner** `<Avatar>` element.',
|
|
203
|
+
'Useful for avatar-specific overrides without affecting the root layout.',
|
|
204
|
+
].join(' '),
|
|
205
|
+
control: 'text',
|
|
206
|
+
table: {
|
|
207
|
+
type: { summary: 'string' },
|
|
208
|
+
defaultValue: { summary: 'undefined' },
|
|
209
|
+
},
|
|
210
|
+
},
|
|
211
|
+
},
|
|
8
212
|
};
|
|
9
213
|
|
|
10
214
|
export default meta;
|
|
11
|
-
|
|
12
215
|
type Story = StoryObj<typeof SingleUser>;
|
|
13
216
|
|
|
217
|
+
// ---------------------------------------------------------------------------
|
|
218
|
+
// Helper
|
|
219
|
+
// ---------------------------------------------------------------------------
|
|
220
|
+
|
|
14
221
|
const withDescription = (story: Story, description: string): Story => ({
|
|
15
222
|
...story,
|
|
16
223
|
parameters: {
|
|
17
224
|
...story.parameters,
|
|
18
|
-
docs: {
|
|
19
|
-
...story.parameters?.docs,
|
|
20
|
-
description: {
|
|
21
|
-
story: description,
|
|
22
|
-
},
|
|
23
|
-
},
|
|
225
|
+
docs: { ...story.parameters?.docs, description: { story: description } },
|
|
24
226
|
},
|
|
25
227
|
});
|
|
26
228
|
|
|
27
|
-
|
|
229
|
+
// ---------------------------------------------------------------------------
|
|
230
|
+
// Stories
|
|
231
|
+
// ---------------------------------------------------------------------------
|
|
28
232
|
|
|
29
|
-
export const
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
233
|
+
export const Default: Story = withDescription(
|
|
234
|
+
{
|
|
235
|
+
args: {
|
|
236
|
+
label: 'Sarah Okafor',
|
|
237
|
+
initials: 'SO',
|
|
238
|
+
size: 'small',
|
|
239
|
+
},
|
|
240
|
+
render: args => <SingleUser {...args} />,
|
|
33
241
|
},
|
|
34
|
-
|
|
242
|
+
'The default story is wired to the Controls panel. Adjust `label`, `initials`, `src`, and `size` to see the component update in real time.',
|
|
243
|
+
);
|
|
244
|
+
|
|
245
|
+
export const WithPhoto: Story = withDescription(
|
|
246
|
+
{
|
|
247
|
+
parameters: {
|
|
248
|
+
controls: { disable: true },
|
|
249
|
+
docs: {
|
|
250
|
+
source: {
|
|
251
|
+
language: 'tsx',
|
|
252
|
+
code: `
|
|
253
|
+
import { SingleUser } from '@arbor-education/design-system.components';
|
|
35
254
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
255
|
+
function TeacherIdentity() {
|
|
256
|
+
return (
|
|
257
|
+
<SingleUser
|
|
258
|
+
label="Miss Clara Jones"
|
|
259
|
+
src="https://i.pravatar.cc/150?img=47"
|
|
260
|
+
size="medium"
|
|
261
|
+
/>
|
|
262
|
+
);
|
|
263
|
+
}
|
|
264
|
+
export default TeacherIdentity;
|
|
265
|
+
`.trim(),
|
|
266
|
+
},
|
|
267
|
+
},
|
|
268
|
+
},
|
|
269
|
+
render: () => (
|
|
270
|
+
<SingleUser
|
|
271
|
+
label="Miss Clara Jones"
|
|
272
|
+
src="https://i.pravatar.cc/150?img=47"
|
|
273
|
+
size="medium"
|
|
274
|
+
/>
|
|
275
|
+
),
|
|
40
276
|
},
|
|
41
|
-
|
|
277
|
+
'When a `src` URL is provided the avatar displays the photo. If the image fails to load, the component falls back to `initials` if supplied. The avatar is still `aria-hidden` regardless — `label` remains the only accessible name.',
|
|
278
|
+
);
|
|
279
|
+
|
|
280
|
+
export const AllSizes: Story = withDescription(
|
|
281
|
+
{
|
|
282
|
+
parameters: {
|
|
283
|
+
controls: { disable: true },
|
|
284
|
+
docs: {
|
|
285
|
+
source: {
|
|
286
|
+
language: 'tsx',
|
|
287
|
+
code: `
|
|
288
|
+
import { SingleUser } from '@arbor-education/design-system.components';
|
|
42
289
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
290
|
+
function SizeShowcase() {
|
|
291
|
+
return (
|
|
292
|
+
<div style={{ display: 'flex', flexDirection: 'column', gap: 'var(--spacing-medium)' }}>
|
|
293
|
+
<SingleUser label="James Okafor" initials="JO" size="small" />
|
|
294
|
+
<SingleUser label="James Okafor" initials="JO" size="medium" />
|
|
295
|
+
<SingleUser label="James Okafor" initials="JO" size="large" />
|
|
296
|
+
<SingleUser label="James Okafor" initials="JO" size="extra-large" />
|
|
297
|
+
</div>
|
|
298
|
+
);
|
|
299
|
+
}
|
|
300
|
+
export default SizeShowcase;
|
|
301
|
+
`.trim(),
|
|
302
|
+
},
|
|
303
|
+
},
|
|
304
|
+
},
|
|
305
|
+
render: () => (
|
|
306
|
+
<div style={{ display: 'flex', flexDirection: 'column', gap: 'var(--spacing-medium)' }}>
|
|
307
|
+
<SingleUser label="James Okafor" initials="JO" size="small" />
|
|
308
|
+
<SingleUser label="James Okafor" initials="JO" size="medium" />
|
|
309
|
+
<SingleUser label="James Okafor" initials="JO" size="large" />
|
|
310
|
+
<SingleUser label="James Okafor" initials="JO" size="extra-large" />
|
|
311
|
+
</div>
|
|
312
|
+
),
|
|
313
|
+
},
|
|
314
|
+
"All four supported sizes. `\"small\"` is the **default** — which differs from the underlying `Avatar` component's own default of `\"medium\"`. Always pass `size` explicitly when a specific size is required.",
|
|
315
|
+
);
|
|
316
|
+
|
|
317
|
+
export const InitialsFallback: Story = withDescription(
|
|
318
|
+
{
|
|
319
|
+
parameters: {
|
|
320
|
+
controls: { disable: true },
|
|
321
|
+
docs: {
|
|
322
|
+
source: {
|
|
323
|
+
language: 'tsx',
|
|
324
|
+
code: `
|
|
325
|
+
import { SingleUser } from '@arbor-education/design-system.components';
|
|
326
|
+
|
|
327
|
+
function StaffList() {
|
|
328
|
+
return (
|
|
329
|
+
<div style={{ display: 'flex', flexDirection: 'column', gap: 'var(--spacing-small)' }}>
|
|
330
|
+
<SingleUser label="Dorothy Zbornak" initials="DZ" />
|
|
331
|
+
<SingleUser label="Rose Nylund" initials="RN" />
|
|
332
|
+
<SingleUser label="Blanche Devereaux" initials="BD" />
|
|
333
|
+
<SingleUser label="Sophia Petrillo" initials="SP" />
|
|
334
|
+
</div>
|
|
335
|
+
);
|
|
336
|
+
}
|
|
337
|
+
export default StaffList;
|
|
338
|
+
`.trim(),
|
|
339
|
+
},
|
|
340
|
+
},
|
|
341
|
+
},
|
|
342
|
+
render: () => (
|
|
343
|
+
<div style={{ display: 'flex', flexDirection: 'column', gap: 'var(--spacing-small)' }}>
|
|
344
|
+
<SingleUser label="Dorothy Zbornak" initials="DZ" />
|
|
345
|
+
<SingleUser label="Rose Nylund" initials="RN" />
|
|
346
|
+
<SingleUser label="Blanche Devereaux" initials="BD" />
|
|
347
|
+
<SingleUser label="Sophia Petrillo" initials="SP" />
|
|
348
|
+
</div>
|
|
349
|
+
),
|
|
46
350
|
},
|
|
47
|
-
|
|
351
|
+
'When no `src` is provided, the avatar falls back to `initials`. One or two characters are recommended for legibility across all sizes.',
|
|
352
|
+
);
|
|
48
353
|
|
|
49
|
-
export const
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
354
|
+
export const TwoClassNameProps: Story = withDescription(
|
|
355
|
+
{
|
|
356
|
+
parameters: {
|
|
357
|
+
controls: { disable: true },
|
|
358
|
+
docs: {
|
|
359
|
+
source: {
|
|
360
|
+
language: 'tsx',
|
|
361
|
+
code: `
|
|
362
|
+
import { SingleUser } from '@arbor-education/design-system.components';
|
|
363
|
+
|
|
364
|
+
function AssignedUser() {
|
|
365
|
+
return (
|
|
366
|
+
<SingleUser
|
|
367
|
+
label="Amara Osei-Bonsu"
|
|
368
|
+
initials="AO"
|
|
369
|
+
className="my-root-override"
|
|
370
|
+
avatarClassName="my-avatar-override"
|
|
371
|
+
/>
|
|
372
|
+
);
|
|
373
|
+
}
|
|
374
|
+
export default AssignedUser;
|
|
375
|
+
`.trim(),
|
|
376
|
+
},
|
|
377
|
+
},
|
|
378
|
+
},
|
|
379
|
+
render: () => (
|
|
380
|
+
<SingleUser
|
|
381
|
+
label="Amara Osei-Bonsu"
|
|
382
|
+
initials="AO"
|
|
383
|
+
className="my-root-override"
|
|
384
|
+
avatarClassName="my-avatar-override"
|
|
385
|
+
/>
|
|
386
|
+
),
|
|
55
387
|
},
|
|
56
|
-
|
|
388
|
+
'`SingleUser` exposes two separate `className` props: `className` targets the **root `<span>`** and `avatarClassName` targets only the **inner `<Avatar>`**. Use them independently to avoid unintended style bleed.',
|
|
389
|
+
);
|
|
57
390
|
|
|
58
|
-
export const LongLabel: Story = withDescription(
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
391
|
+
export const LongLabel: Story = withDescription(
|
|
392
|
+
{
|
|
393
|
+
parameters: {
|
|
394
|
+
controls: { disable: true },
|
|
395
|
+
docs: {
|
|
396
|
+
source: {
|
|
397
|
+
language: 'tsx',
|
|
398
|
+
code: `
|
|
399
|
+
import { SingleUser } from '@arbor-education/design-system.components';
|
|
400
|
+
|
|
401
|
+
function LongNameExample() {
|
|
402
|
+
return (
|
|
403
|
+
<div style={{ display: 'flex', flexDirection: 'column', gap: 'var(--spacing-small)' }}>
|
|
404
|
+
<SingleUser label="Mrs Jacqueline Abernathy-Thornton" initials="JA" />
|
|
405
|
+
<SingleUser label="Mr Bartholomew Featherington-Smythe" initials="BF" size="medium" />
|
|
406
|
+
</div>
|
|
407
|
+
);
|
|
408
|
+
}
|
|
409
|
+
export default LongNameExample;
|
|
410
|
+
`.trim(),
|
|
411
|
+
},
|
|
412
|
+
},
|
|
413
|
+
},
|
|
414
|
+
render: () => (
|
|
415
|
+
<div style={{ display: 'flex', flexDirection: 'column', gap: 'var(--spacing-small)' }}>
|
|
416
|
+
<SingleUser label="Mrs Jacqueline Abernathy-Thornton" initials="JA" />
|
|
417
|
+
<SingleUser label="Mr Bartholomew Featherington-Smythe" initials="BF" size="medium" />
|
|
418
|
+
</div>
|
|
419
|
+
),
|
|
62
420
|
},
|
|
63
|
-
|
|
421
|
+
'Long display names flow naturally — the label has no enforced max-width and extends the pill as needed. Apply a width constraint via `className` if truncation is required.',
|
|
422
|
+
);
|