@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
|
@@ -2,7 +2,7 @@ import { Fieldset, type FieldsetProps } from 'Components/formField/fieldset/Fiel
|
|
|
2
2
|
import { CheckboxInput, type CheckboxInputProps } from './CheckboxInput';
|
|
3
3
|
|
|
4
4
|
export type CheckboxGroupProps = {
|
|
5
|
-
options: CheckboxInputProps[];
|
|
5
|
+
options: (CheckboxInputProps & { id: string })[];
|
|
6
6
|
} & FieldsetProps;
|
|
7
7
|
|
|
8
8
|
export const CheckboxGroup = (props: CheckboxGroupProps) => {
|
package/src/components/formField/inputs/colourPickerDropdown/ColourPickerDropdown.stories.tsx
CHANGED
|
@@ -1,29 +1,522 @@
|
|
|
1
|
+
import { useState } from 'react';
|
|
1
2
|
import type { Meta, StoryObj } from '@storybook/react-vite';
|
|
3
|
+
import {
|
|
4
|
+
Controls,
|
|
5
|
+
Heading as DocHeading,
|
|
6
|
+
Markdown,
|
|
7
|
+
Primary as DocPrimary,
|
|
8
|
+
Stories,
|
|
9
|
+
Subtitle,
|
|
10
|
+
Title,
|
|
11
|
+
} from '@storybook/addon-docs/blocks';
|
|
12
|
+
import type { ColorResult } from '@uiw/color-convert';
|
|
13
|
+
import { FormField } from 'Components/formField/FormField';
|
|
2
14
|
import { ColourPickerDropdown } from './ColourPickerDropdown';
|
|
3
|
-
|
|
15
|
+
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
// Docs page content
|
|
18
|
+
// ---------------------------------------------------------------------------
|
|
19
|
+
|
|
20
|
+
const DESCRIPTION_INTRO = [
|
|
21
|
+
'ColourPickerDropdown is a dropdown-triggered colour picker that lets users select any colour from a',
|
|
22
|
+
'full-spectrum palette, with Hex and RGB input fields for precise entry.',
|
|
23
|
+
'Built on the [`@uiw/react-color` Sketch picker](https://uiwjs.github.io/react-color/), which provides',
|
|
24
|
+
'the colour plane, hue slider, Hex/RGB inputs, and preset swatches.',
|
|
25
|
+
'The dropdown panel renders via a Radix UI portal —',
|
|
26
|
+
'**do not place inside a container with `overflow: hidden`**.',
|
|
27
|
+
'',
|
|
28
|
+
'The trigger renders as a small circular colour swatch inside a dropdown-variant button.',
|
|
29
|
+
'Selection applies immediately — the swatch updates live as the user picks.',
|
|
30
|
+
'The panel closes on click outside or `Escape`.',
|
|
31
|
+
].join('\n');
|
|
32
|
+
|
|
33
|
+
const USAGE_GUIDANCE = [
|
|
34
|
+
'### When to use',
|
|
35
|
+
'',
|
|
36
|
+
'- Data-driven formatting where users assign a colour to a record — for example, background colours for conditional formatting bands in a marksheet.',
|
|
37
|
+
'- When users need to match a specific colour exactly by Hex or RGB value.',
|
|
38
|
+
'- When freedom of colour choice is appropriate and available colours are not predefined.',
|
|
39
|
+
'',
|
|
40
|
+
'---',
|
|
41
|
+
'',
|
|
42
|
+
'### When NOT to use',
|
|
43
|
+
'',
|
|
44
|
+
'| Situation | Use instead |',
|
|
45
|
+
'|---|---|',
|
|
46
|
+
'| Status choices ("On track / At risk / Off track") | `SelectDropdown` with named labels — colour alone is not sufficient to communicate status |',
|
|
47
|
+
'| Small fixed set of meaningful colours | `SelectDropdown` with colour swatches as option labels |',
|
|
48
|
+
'| Colour could reduce readability (e.g. text colour without contrast checks) | Constrain choices via `SelectDropdown` with an approved palette |',
|
|
49
|
+
].join('\n');
|
|
50
|
+
|
|
51
|
+
const DEVELOPER_NOTES = [
|
|
52
|
+
'### Critical usage patterns',
|
|
53
|
+
'',
|
|
54
|
+
'**`onChange` receives a `ColorResult` object, not a plain hex string.** Read the format you need:',
|
|
55
|
+
'',
|
|
56
|
+
'```tsx',
|
|
57
|
+
"import type { ColorResult } from '@uiw/color-convert';",
|
|
58
|
+
'',
|
|
59
|
+
'<ColourPickerDropdown',
|
|
60
|
+
' value={colour}',
|
|
61
|
+
' onChange={(result: ColorResult) => {',
|
|
62
|
+
" const hex = result.hex; // '#3cad51'",
|
|
63
|
+
' const { r, g, b } = result.rgb; // { r: 60, g: 173, b: 81 }',
|
|
64
|
+
' setColour(hex);',
|
|
65
|
+
' }}',
|
|
66
|
+
'/>',
|
|
67
|
+
'```',
|
|
68
|
+
'',
|
|
69
|
+
'**`id` is dual-purpose** — it sets the `name` on the hidden `<input>` (for native form submission) AND',
|
|
70
|
+
'the `id` on the trigger button (for label association via `htmlFor`).',
|
|
71
|
+
'',
|
|
72
|
+
'**`hasError` is visual-only.** It changes the trigger button\'s border colour but tells screen readers',
|
|
73
|
+
'nothing. Always pair it with `aria-invalid={true}`.',
|
|
74
|
+
'',
|
|
75
|
+
'**No alpha / transparency support** — `disableAlpha` is hardcoded. The picker never shows an opacity slider.',
|
|
76
|
+
'',
|
|
77
|
+
'**Semi-controlled pattern** — the component holds internal state via `useState`, but syncs from the',
|
|
78
|
+
'`value` prop via `useEffect`. Changing `value` externally (e.g. a form reset) will update the picker.',
|
|
79
|
+
'',
|
|
80
|
+
'**`onChange` fires on every picker interaction**, including while sliders are dragged.',
|
|
81
|
+
'If you update server state in `onChange`, consider debouncing.',
|
|
82
|
+
'',
|
|
83
|
+
'**Portal rendering** — the dropdown panel renders via a Radix UI portal outside the trigger\'s DOM subtree.',
|
|
84
|
+
'Do not place inside `overflow: hidden` or `position: relative` containers.',
|
|
85
|
+
'',
|
|
86
|
+
'---',
|
|
87
|
+
'',
|
|
88
|
+
'### Accessibility',
|
|
89
|
+
'',
|
|
90
|
+
'- The trigger button includes a visually-hidden "Toggle colour picker." label for screen readers.',
|
|
91
|
+
'- The swatch inside the trigger includes a visually-hidden "current colour: #hex" label that updates live.',
|
|
92
|
+
'- Always pair `hasError` with `aria-invalid={true}` — one is visual, one is for assistive technology.',
|
|
93
|
+
'- Use `aria-describedBy` pointing to the `id` of a `FormField.Error` element to provide the error message.',
|
|
94
|
+
'- The recommended pattern is `<FormField inputType="colourPicker" inputProps={{...}} />` — this wires `hasError`, `aria-invalid`, and `aria-describedby` automatically.',
|
|
95
|
+
'',
|
|
96
|
+
'---',
|
|
97
|
+
'',
|
|
98
|
+
'### TypeScript types',
|
|
99
|
+
'',
|
|
100
|
+
'```tsx',
|
|
101
|
+
"import type { ColorResult } from '@uiw/color-convert';",
|
|
102
|
+
"import { ColourPickerDropdown } from '@arbor-education/design-system.components';",
|
|
103
|
+
'',
|
|
104
|
+
'// Access colour values in onChange:',
|
|
105
|
+
'onChange={(result: ColorResult) => {',
|
|
106
|
+
" const hex = result.hex; // '#3cad51'",
|
|
107
|
+
' const { r, g, b } = result.rgb; // { r: 60, g: 173, b: 81 }',
|
|
108
|
+
'}}',
|
|
109
|
+
'',
|
|
110
|
+
'// Type your own props using the exported namespace:',
|
|
111
|
+
'function MyField(props: ColourPickerDropdown.Props) { ... }',
|
|
112
|
+
'```',
|
|
113
|
+
].join('\n');
|
|
114
|
+
|
|
115
|
+
const RELATED_COMPONENTS = [
|
|
116
|
+
'## Related components',
|
|
117
|
+
'',
|
|
118
|
+
'[FormField](?path=/docs/components-formfield--docs) · [SelectDropdown](?path=/docs/components-formfield-inputs-selectdropdown--docs) · [Combobox](?path=/docs/components-combobox--docs)',
|
|
119
|
+
].join('\n');
|
|
120
|
+
|
|
121
|
+
const PROPS_INTRO = 'The preview below is wired to the **Controls** panel — tweak any prop to see the story update in real time.';
|
|
122
|
+
|
|
123
|
+
function ColourPickerDropdownDocsPage() {
|
|
124
|
+
return (
|
|
125
|
+
<>
|
|
126
|
+
<Title />
|
|
127
|
+
<Subtitle />
|
|
128
|
+
<Markdown>{DESCRIPTION_INTRO}</Markdown>
|
|
129
|
+
<DocHeading>Interactive example</DocHeading>
|
|
130
|
+
<Markdown>{PROPS_INTRO}</Markdown>
|
|
131
|
+
<DocPrimary />
|
|
132
|
+
<Controls />
|
|
133
|
+
<DocHeading>Usage guidance</DocHeading>
|
|
134
|
+
<Markdown>{USAGE_GUIDANCE}</Markdown>
|
|
135
|
+
<DocHeading>Developer notes</DocHeading>
|
|
136
|
+
<Markdown>{DEVELOPER_NOTES}</Markdown>
|
|
137
|
+
<DocHeading>Examples</DocHeading>
|
|
138
|
+
<Stories title="" />
|
|
139
|
+
<Markdown>{RELATED_COMPONENTS}</Markdown>
|
|
140
|
+
</>
|
|
141
|
+
);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// ---------------------------------------------------------------------------
|
|
145
|
+
// Meta
|
|
146
|
+
// ---------------------------------------------------------------------------
|
|
4
147
|
|
|
5
148
|
const meta = {
|
|
6
149
|
title: 'Components/FormField/Inputs/ColourPickerDropdown',
|
|
7
150
|
component: ColourPickerDropdown,
|
|
8
151
|
tags: ['autodocs'],
|
|
152
|
+
parameters: {
|
|
153
|
+
layout: 'padded',
|
|
154
|
+
docs: {
|
|
155
|
+
page: ColourPickerDropdownDocsPage,
|
|
156
|
+
},
|
|
157
|
+
},
|
|
158
|
+
argTypes: {
|
|
159
|
+
'value': {
|
|
160
|
+
description: [
|
|
161
|
+
'The current colour value as a hex string (e.g. `\'#3cad51\'`).',
|
|
162
|
+
'The component holds internal state but syncs from this prop via `useEffect` —',
|
|
163
|
+
'changing it externally (e.g. a form reset) will update the picker.',
|
|
164
|
+
].join(' '),
|
|
165
|
+
control: { type: 'color' },
|
|
166
|
+
table: {
|
|
167
|
+
type: { summary: 'string' },
|
|
168
|
+
defaultValue: { summary: "'#3cad51'" },
|
|
169
|
+
},
|
|
170
|
+
},
|
|
171
|
+
'onChange': {
|
|
172
|
+
description: [
|
|
173
|
+
'Callback fired on every colour change (including while sliders are dragged).',
|
|
174
|
+
'Receives a `ColorResult` object — read `.hex`, `.rgb`, or `.hsl` off it.',
|
|
175
|
+
].join(' '),
|
|
176
|
+
action: 'onChange',
|
|
177
|
+
control: false,
|
|
178
|
+
table: {
|
|
179
|
+
type: { summary: '(value: ColorResult) => void' },
|
|
180
|
+
},
|
|
181
|
+
},
|
|
182
|
+
'hasError': {
|
|
183
|
+
description: [
|
|
184
|
+
'Applies error styling (red border) to the trigger button.',
|
|
185
|
+
'Visual only — always pair with `aria-invalid` for screen-reader coverage.',
|
|
186
|
+
].join(' '),
|
|
187
|
+
control: 'boolean',
|
|
188
|
+
table: {
|
|
189
|
+
type: { summary: 'boolean' },
|
|
190
|
+
defaultValue: { summary: 'false' },
|
|
191
|
+
},
|
|
192
|
+
},
|
|
193
|
+
'disabled': {
|
|
194
|
+
description: 'When true, the trigger is non-interactive and visually muted.',
|
|
195
|
+
control: 'boolean',
|
|
196
|
+
table: {
|
|
197
|
+
type: { summary: 'boolean' },
|
|
198
|
+
defaultValue: { summary: 'false' },
|
|
199
|
+
},
|
|
200
|
+
},
|
|
201
|
+
'id': {
|
|
202
|
+
description: [
|
|
203
|
+
'Dual-purpose: sets the `name` on the hidden `<input>` for native form submission AND',
|
|
204
|
+
'the `id` on the trigger button for label association via `htmlFor`.',
|
|
205
|
+
].join(' '),
|
|
206
|
+
control: 'text',
|
|
207
|
+
table: {
|
|
208
|
+
type: { summary: 'string' },
|
|
209
|
+
},
|
|
210
|
+
},
|
|
211
|
+
'aria-describedBy': {
|
|
212
|
+
description: [
|
|
213
|
+
'ID of the element describing this field (e.g. a `FormField.Error`).',
|
|
214
|
+
'Note the capital B — the component maps this to the lowercase `aria-describedby` DOM attribute.',
|
|
215
|
+
].join(' '),
|
|
216
|
+
control: 'text',
|
|
217
|
+
table: {
|
|
218
|
+
type: { summary: 'string' },
|
|
219
|
+
},
|
|
220
|
+
},
|
|
221
|
+
'aria-invalid': {
|
|
222
|
+
description: 'Marks the trigger as invalid for screen readers. Use alongside `hasError` and `aria-describedBy`.',
|
|
223
|
+
control: 'boolean',
|
|
224
|
+
table: {
|
|
225
|
+
type: { summary: 'boolean' },
|
|
226
|
+
defaultValue: { summary: 'false' },
|
|
227
|
+
},
|
|
228
|
+
},
|
|
229
|
+
},
|
|
9
230
|
} satisfies Meta<typeof ColourPickerDropdown>;
|
|
10
231
|
|
|
11
232
|
export default meta;
|
|
12
|
-
type Story = StoryObj<typeof
|
|
233
|
+
type Story = StoryObj<typeof ColourPickerDropdown>;
|
|
234
|
+
|
|
235
|
+
// ---------------------------------------------------------------------------
|
|
236
|
+
// Helper: attach a per-story description to docs
|
|
237
|
+
// ---------------------------------------------------------------------------
|
|
238
|
+
|
|
239
|
+
const withDescription = (story: Story, description: string): Story => ({
|
|
240
|
+
...story,
|
|
241
|
+
parameters: {
|
|
242
|
+
...story.parameters,
|
|
243
|
+
docs: {
|
|
244
|
+
...story.parameters?.docs,
|
|
245
|
+
description: {
|
|
246
|
+
story: description,
|
|
247
|
+
},
|
|
248
|
+
},
|
|
249
|
+
},
|
|
250
|
+
});
|
|
251
|
+
|
|
252
|
+
// ---------------------------------------------------------------------------
|
|
253
|
+
// Template components for stateful and composite stories
|
|
254
|
+
// ---------------------------------------------------------------------------
|
|
255
|
+
|
|
256
|
+
const ControlledTemplate = () => {
|
|
257
|
+
const [colour, setColour] = useState('#3cad51');
|
|
258
|
+
return (
|
|
259
|
+
<div style={{ display: 'flex', flexDirection: 'column', gap: '1rem', maxWidth: '20rem' }}>
|
|
260
|
+
<ColourPickerDropdown
|
|
261
|
+
value={colour}
|
|
262
|
+
onChange={(result: ColorResult) => setColour(result.hex)}
|
|
263
|
+
id="controlled-colour"
|
|
264
|
+
/>
|
|
265
|
+
<p style={{ margin: 0, fontSize: '0.875rem', color: 'var(--color-grey-600)' }}>
|
|
266
|
+
Selected colour:
|
|
267
|
+
{' '}
|
|
268
|
+
<code>{colour}</code>
|
|
269
|
+
</p>
|
|
270
|
+
</div>
|
|
271
|
+
);
|
|
272
|
+
};
|
|
273
|
+
|
|
274
|
+
const InFormFieldTemplate = () => (
|
|
275
|
+
<div style={{ maxWidth: '20rem' }}>
|
|
276
|
+
<FormField
|
|
277
|
+
label="Category colour"
|
|
278
|
+
id="category-colour"
|
|
279
|
+
inputType="colourPicker"
|
|
280
|
+
inputProps={{ value: '#3cad51' }}
|
|
281
|
+
/>
|
|
282
|
+
</div>
|
|
283
|
+
);
|
|
284
|
+
|
|
285
|
+
const WithFormFieldAndErrorTemplate = () => (
|
|
286
|
+
<div style={{ maxWidth: '20rem' }}>
|
|
287
|
+
<FormField
|
|
288
|
+
label="Background colour"
|
|
289
|
+
id="background-colour"
|
|
290
|
+
inputType="colourPicker"
|
|
291
|
+
errorText="Please choose a background colour."
|
|
292
|
+
inputProps={{ value: '#3cad51' }}
|
|
293
|
+
/>
|
|
294
|
+
</div>
|
|
295
|
+
);
|
|
296
|
+
|
|
297
|
+
// ---------------------------------------------------------------------------
|
|
298
|
+
// Stories
|
|
299
|
+
// ---------------------------------------------------------------------------
|
|
13
300
|
|
|
14
301
|
export const Default: Story = {
|
|
15
302
|
args: {
|
|
16
303
|
value: '#3cad51',
|
|
17
|
-
onChange: (value: ColorResult) => { console.log(value); },
|
|
18
304
|
},
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
305
|
+
render: args => (
|
|
306
|
+
<div style={{ maxWidth: '20rem' }}>
|
|
307
|
+
<ColourPickerDropdown {...args} />
|
|
308
|
+
</div>
|
|
309
|
+
),
|
|
310
|
+
};
|
|
311
|
+
|
|
312
|
+
export const WithCustomValue: Story = withDescription(
|
|
313
|
+
{
|
|
314
|
+
parameters: {
|
|
315
|
+
controls: { disable: true },
|
|
316
|
+
docs: {
|
|
317
|
+
source: {
|
|
318
|
+
language: 'tsx',
|
|
319
|
+
code: `
|
|
320
|
+
import { ColourPickerDropdown } from '@arbor-education/design-system.components';
|
|
321
|
+
|
|
322
|
+
function WithCustomValueExample() {
|
|
323
|
+
return (
|
|
324
|
+
<div style={{ maxWidth: '20rem' }}>
|
|
325
|
+
<ColourPickerDropdown value="#e84393" id="highlight-colour" />
|
|
326
|
+
</div>
|
|
327
|
+
);
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
export default WithCustomValueExample;
|
|
331
|
+
`.trim(),
|
|
332
|
+
},
|
|
333
|
+
},
|
|
23
334
|
},
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
335
|
+
render: () => (
|
|
336
|
+
<div style={{ maxWidth: '20rem' }}>
|
|
337
|
+
<ColourPickerDropdown value="#e84393" id="highlight-colour" />
|
|
338
|
+
</div>
|
|
339
|
+
),
|
|
340
|
+
},
|
|
341
|
+
'Pass any valid hex string to `value` to pre-seed the picker with a specific colour. The swatch in the trigger updates immediately.',
|
|
342
|
+
);
|
|
343
|
+
|
|
344
|
+
export const Disabled: Story = withDescription(
|
|
345
|
+
{
|
|
346
|
+
parameters: {
|
|
347
|
+
controls: { disable: true },
|
|
348
|
+
docs: {
|
|
349
|
+
source: {
|
|
350
|
+
language: 'tsx',
|
|
351
|
+
code: `
|
|
352
|
+
import { ColourPickerDropdown } from '@arbor-education/design-system.components';
|
|
353
|
+
|
|
354
|
+
function DisabledExample() {
|
|
355
|
+
return (
|
|
356
|
+
<div style={{ maxWidth: '20rem' }}>
|
|
357
|
+
<ColourPickerDropdown value="#3cad51" disabled id="disabled-colour" />
|
|
358
|
+
</div>
|
|
359
|
+
);
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
export default DisabledExample;
|
|
363
|
+
`.trim(),
|
|
364
|
+
},
|
|
365
|
+
},
|
|
27
366
|
},
|
|
367
|
+
render: () => (
|
|
368
|
+
<div style={{ maxWidth: '20rem' }}>
|
|
369
|
+
<ColourPickerDropdown value="#3cad51" disabled id="disabled-colour" />
|
|
370
|
+
</div>
|
|
371
|
+
),
|
|
28
372
|
},
|
|
29
|
-
|
|
373
|
+
'When `disabled` is true the trigger is non-interactive and visually muted. The colour swatch is still visible so the current value remains clear.',
|
|
374
|
+
);
|
|
375
|
+
|
|
376
|
+
export const WithError: Story = withDescription(
|
|
377
|
+
{
|
|
378
|
+
parameters: {
|
|
379
|
+
controls: { disable: true },
|
|
380
|
+
docs: {
|
|
381
|
+
source: {
|
|
382
|
+
language: 'tsx',
|
|
383
|
+
code: `
|
|
384
|
+
import { ColourPickerDropdown } from '@arbor-education/design-system.components';
|
|
385
|
+
|
|
386
|
+
function WithErrorExample() {
|
|
387
|
+
return (
|
|
388
|
+
<div style={{ maxWidth: '20rem' }}>
|
|
389
|
+
<ColourPickerDropdown
|
|
390
|
+
value="#3cad51"
|
|
391
|
+
hasError
|
|
392
|
+
aria-invalid
|
|
393
|
+
id="colour-with-error"
|
|
394
|
+
/>
|
|
395
|
+
</div>
|
|
396
|
+
);
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
export default WithErrorExample;
|
|
400
|
+
`.trim(),
|
|
401
|
+
},
|
|
402
|
+
},
|
|
403
|
+
},
|
|
404
|
+
render: () => (
|
|
405
|
+
<div style={{ maxWidth: '20rem' }}>
|
|
406
|
+
<ColourPickerDropdown
|
|
407
|
+
value="#3cad51"
|
|
408
|
+
hasError
|
|
409
|
+
aria-invalid
|
|
410
|
+
id="colour-with-error"
|
|
411
|
+
/>
|
|
412
|
+
</div>
|
|
413
|
+
),
|
|
414
|
+
},
|
|
415
|
+
'Both `hasError` (red border on the trigger) and `aria-invalid` (screen-reader announcement) must be set together for a complete error treatment. Neither alone is sufficient.',
|
|
416
|
+
);
|
|
417
|
+
|
|
418
|
+
export const Controlled: Story = withDescription(
|
|
419
|
+
{
|
|
420
|
+
parameters: {
|
|
421
|
+
controls: { disable: true },
|
|
422
|
+
docs: {
|
|
423
|
+
source: {
|
|
424
|
+
language: 'tsx',
|
|
425
|
+
code: `
|
|
426
|
+
import { useState } from 'react';
|
|
427
|
+
import type { ColorResult } from '@uiw/color-convert';
|
|
428
|
+
import { ColourPickerDropdown } from '@arbor-education/design-system.components';
|
|
429
|
+
|
|
430
|
+
function ControlledExample() {
|
|
431
|
+
const [colour, setColour] = useState('#3cad51');
|
|
432
|
+
|
|
433
|
+
return (
|
|
434
|
+
<div style={{ display: 'flex', flexDirection: 'column', gap: '1rem', maxWidth: '20rem' }}>
|
|
435
|
+
<ColourPickerDropdown
|
|
436
|
+
value={colour}
|
|
437
|
+
onChange={(result: ColorResult) => setColour(result.hex)}
|
|
438
|
+
id="controlled-colour"
|
|
439
|
+
/>
|
|
440
|
+
<p style={{ margin: 0, fontSize: '0.875rem' }}>
|
|
441
|
+
Selected colour: <code>{colour}</code>
|
|
442
|
+
</p>
|
|
443
|
+
</div>
|
|
444
|
+
);
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
export default ControlledExample;
|
|
448
|
+
`.trim(),
|
|
449
|
+
},
|
|
450
|
+
},
|
|
451
|
+
},
|
|
452
|
+
render: () => <ControlledTemplate />,
|
|
453
|
+
},
|
|
454
|
+
'`onChange` receives a `ColorResult` object — read `.hex` off it to keep your own state in sync. The selected hex value is reflected live beneath the picker.',
|
|
455
|
+
);
|
|
456
|
+
|
|
457
|
+
export const InFormField: Story = withDescription(
|
|
458
|
+
{
|
|
459
|
+
parameters: {
|
|
460
|
+
controls: { disable: true },
|
|
461
|
+
docs: {
|
|
462
|
+
source: {
|
|
463
|
+
language: 'tsx',
|
|
464
|
+
code: `
|
|
465
|
+
import { FormField } from '@arbor-education/design-system.components';
|
|
466
|
+
|
|
467
|
+
function InFormFieldExample() {
|
|
468
|
+
return (
|
|
469
|
+
<div style={{ maxWidth: '20rem' }}>
|
|
470
|
+
<FormField
|
|
471
|
+
label="Category colour"
|
|
472
|
+
id="category-colour"
|
|
473
|
+
inputType="colourPicker"
|
|
474
|
+
inputProps={{ value: '#3cad51' }}
|
|
475
|
+
/>
|
|
476
|
+
</div>
|
|
477
|
+
);
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
export default InFormFieldExample;
|
|
481
|
+
`.trim(),
|
|
482
|
+
},
|
|
483
|
+
},
|
|
484
|
+
},
|
|
485
|
+
render: () => <InFormFieldTemplate />,
|
|
486
|
+
},
|
|
487
|
+
'The recommended usage pattern — `FormField` with `inputType="colourPicker"` auto-wires the label, `hasError`, `aria-invalid`, and `aria-describedby`. No manual prop threading required.',
|
|
488
|
+
);
|
|
489
|
+
|
|
490
|
+
export const WithFormFieldAndError: Story = withDescription(
|
|
491
|
+
{
|
|
492
|
+
parameters: {
|
|
493
|
+
controls: { disable: true },
|
|
494
|
+
docs: {
|
|
495
|
+
source: {
|
|
496
|
+
language: 'tsx',
|
|
497
|
+
code: `
|
|
498
|
+
import { FormField } from '@arbor-education/design-system.components';
|
|
499
|
+
|
|
500
|
+
function WithFormFieldAndErrorExample() {
|
|
501
|
+
return (
|
|
502
|
+
<div style={{ maxWidth: '20rem' }}>
|
|
503
|
+
<FormField
|
|
504
|
+
label="Background colour"
|
|
505
|
+
id="background-colour"
|
|
506
|
+
inputType="colourPicker"
|
|
507
|
+
errorText="Please choose a background colour."
|
|
508
|
+
inputProps={{ value: '#3cad51' }}
|
|
509
|
+
/>
|
|
510
|
+
</div>
|
|
511
|
+
);
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
export default WithFormFieldAndErrorExample;
|
|
515
|
+
`.trim(),
|
|
516
|
+
},
|
|
517
|
+
},
|
|
518
|
+
},
|
|
519
|
+
render: () => <WithFormFieldAndErrorTemplate />,
|
|
520
|
+
},
|
|
521
|
+
'The full error treatment via `FormField` — setting `errorText` automatically passes `hasError`, `aria-invalid`, and `aria-describedby` to the picker. No manual prop threading required.',
|
|
522
|
+
);
|
|
@@ -1,10 +1,16 @@
|
|
|
1
1
|
import type { ChangeEvent } from 'react';
|
|
2
|
-
import { RadioButtonInput
|
|
2
|
+
import { RadioButtonInput } from './RadioButtonInput';
|
|
3
3
|
import { Fieldset, type FieldsetProps } from '../../fieldset/Fieldset';
|
|
4
4
|
|
|
5
|
+
export type RadioGroupOption = {
|
|
6
|
+
id: string;
|
|
7
|
+
value?: string | number | readonly string[];
|
|
8
|
+
label?: string;
|
|
9
|
+
};
|
|
10
|
+
|
|
5
11
|
export type RadioButtonGroupProps = {
|
|
6
12
|
name: string;
|
|
7
|
-
options:
|
|
13
|
+
options: RadioGroupOption[];
|
|
8
14
|
checkedValue: string;
|
|
9
15
|
onChange: (event: ChangeEvent<HTMLInputElement>) => void;
|
|
10
16
|
} & Omit<FieldsetProps, 'onChange'>;
|
|
@@ -14,8 +20,15 @@ export const RadioButtonGroup = (props: RadioButtonGroupProps) => {
|
|
|
14
20
|
|
|
15
21
|
return (
|
|
16
22
|
<Fieldset legend={legend} {...rest}>
|
|
17
|
-
{options.map((option:
|
|
18
|
-
<RadioButtonInput
|
|
23
|
+
{options.map((option: RadioGroupOption) => (
|
|
24
|
+
<RadioButtonInput
|
|
25
|
+
key={option.id}
|
|
26
|
+
name={name}
|
|
27
|
+
value={option.value}
|
|
28
|
+
label={option.label}
|
|
29
|
+
checked={checkedValue === option.value}
|
|
30
|
+
onChange={onChange}
|
|
31
|
+
/>
|
|
19
32
|
))}
|
|
20
33
|
</Fieldset>
|
|
21
34
|
);
|