@arbor-education/design-system.components 0.14.0 → 0.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.gather/skills/write-stories/SKILL.md +207 -271
- package/.storybook/preview.ts +5 -0
- package/CHANGELOG.md +27 -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/number/NumberInput.d.ts.map +1 -1
- package/dist/components/formField/inputs/number/NumberInput.js +14 -2
- package/dist/components/formField/inputs/number/NumberInput.js.map +1 -1
- package/dist/components/formField/inputs/number/NumberInput.test.js +21 -0
- package/dist/components/formField/inputs/number/NumberInput.test.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 +7 -1
- package/dist/components/table/Table.d.ts.map +1 -1
- package/dist/components/table/Table.js +12 -5
- 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 +445 -3
- package/dist/components/table/Table.stories.js.map +1 -1
- package/dist/components/table/Table.test.js +184 -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/cellEditors/NumberCellEditor.d.ts +13 -0
- package/dist/components/table/cellEditors/NumberCellEditor.d.ts.map +1 -0
- package/dist/components/table/cellEditors/NumberCellEditor.js +35 -0
- package/dist/components/table/cellEditors/NumberCellEditor.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/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 +27 -0
- package/dist/index.css.map +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/index.js.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/number/NumberInput.test.tsx +28 -0
- package/src/components/formField/inputs/number/NumberInput.tsx +15 -0
- 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 +504 -3
- package/src/components/table/Table.test.tsx +255 -0
- package/src/components/table/Table.tsx +15 -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/cellEditors/NumberCellEditor.tsx +83 -0
- package/src/components/table/cellEditors/numberCellEditor.scss +11 -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/table.scss +11 -0
- 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/index.scss +1 -0
- package/src/index.ts +3 -2
- 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,342 +0,0 @@
|
|
|
1
|
-
# Progress — Storybook Upgrade Project
|
|
2
|
-
|
|
3
|
-
## Project started: 2026-04-17
|
|
4
|
-
|
|
5
|
-
## 2026-04-24 — STORY-160 (RadioButtonInput)
|
|
6
|
-
|
|
7
|
-
- Wrote 10 comprehensive RadioButtonInput stories (session was interrupted before commit; quality-gated and committed on resume)
|
|
8
|
-
- Files changed: `src/components/formField/inputs/radio/RadioButtonInput.stories.tsx` (106 → 988 lines)
|
|
9
|
-
- Custom DocsPage with correct section ordering; covers RadioButtonGroup companion component
|
|
10
|
-
|
|
11
|
-
**Learnings:**
|
|
12
|
-
- **`hasError` is ARIA-only** — sets `aria-invalid="true"` on the native `<input>` but makes ZERO visual change to the indicator circle. No CSS rules exist for the error state. Consumers must render a visible error message themselves. Document as a Critical gotcha.
|
|
13
|
-
- **`name` is functionally mandatory** despite TypeScript not requiring it. Without it, the browser cannot enforce mutual exclusivity — multiple radios can be selected simultaneously.
|
|
14
|
-
- **`RadioButtonGroup` uses single `checkedValue` at group level** vs `CheckboxGroup` which uses per-item `checked` + `onChange`. A common consumer confusion point — documented with a side-by-side comparison.
|
|
15
|
-
- **Fieldset-level `disabled`** flows through `RadioButtonGroup` → `Fieldset` → native `<fieldset>` HTML attribute, disabling all child inputs at once. Zero extra JavaScript needed.
|
|
16
|
-
- **`option.id` is the React key** in `RadioButtonGroup` — omitting it causes key warnings.
|
|
17
|
-
- **Confluence page `2390720566`** — same Checkbox & Radio page as CheckboxInput. Good cross-reference source.
|
|
18
|
-
|
|
19
|
-
---
|
|
20
|
-
|
|
21
|
-
## 2026-04-23 — STORY-150 (CheckboxInput)
|
|
22
|
-
|
|
23
|
-
- Wrote 12 comprehensive CheckboxInput stories via full Golden Girls run (Sophia, Blanche, Rose, Dorothy)
|
|
24
|
-
- Files changed: `src/components/formField/inputs/checkbox/CheckboxInput.stories.tsx` (33 → ~1055 lines)
|
|
25
|
-
- Custom DocsPage with correct section ordering; covers CheckboxGroup companion component
|
|
26
|
-
- Confluence design guidance: page `2390720566` ("Checkbox & Radio") — current, rich content on use cases, label phrasing, disabled tooltip guidance, keyboard behaviour
|
|
27
|
-
|
|
28
|
-
**Learnings:**
|
|
29
|
-
- **CheckboxGroup IS public API** — exported from src/index.ts line 13 despite component-library.md marking it "internal". Stories correctly import from `'@arbor-education/design-system.components'`.
|
|
30
|
-
- **`aria-checked` spread order is COUNTER-INTUITIVE** — `{...rest}` comes AFTER the explicit `aria-checked` in CheckboxInput.tsx, so a consumer passing `aria-checked` via props would WIN and override the component's indeterminate logic. Document as "your value overrides the component's" not "will be overwritten".
|
|
31
|
-
- **Indeterminate DOM API gotcha** — `indeterminate` cannot be set as an HTML attribute; the component uses a `useEffect` to set `inputRef.current.indeterminate`. This is the #1 consumer confusion point and the SelectAllWithIndeterminate story is the canonical answer.
|
|
32
|
-
- **Controlled-only component** — `checked = false` default in destructuring means React always treats it as controlled. Must pair with `onChange` or the checkbox is frozen. Document prominently.
|
|
33
|
-
- **Focus ring changes shape without label** — CSS `:focus-within:not(:has(.ds-checkbox-label__text))` applies tighter `--checkbox-input-control-radius` (4px) vs pill `--checkbox-radius` (8px) when no label is present.
|
|
34
|
-
- **CheckboxGroup gap token** — `--checkbox-or-radio-button-group-spacing-gap-vertical` handles vertical spacing between options internally; don't add gap on story wrappers.
|
|
35
|
-
- **Confluence page ID** — `2390720566` is the correct current Checkbox & Radio design guidance page (not in write-stories skill mapping table — update it).
|
|
36
|
-
- **Dorothy's cleanest audit yet** — Rose delivered zero phantom classes, zero phantom tokens, all Storybook slugs correct, all prop names verified. Only fix was one inverted explanation sentence.
|
|
37
|
-
|
|
38
|
-
---
|
|
39
|
-
|
|
40
|
-
## 2026-04-23 — STORY-140 (TextArea)
|
|
41
|
-
|
|
42
|
-
- Wrote 7 focused TextArea stories via full Golden Girls run
|
|
43
|
-
- Files changed: `src/components/formField/inputs/textArea/TextArea.stories.tsx` (18 → ~673 lines)
|
|
44
|
-
- Custom DocsPage with correct section ordering
|
|
45
|
-
|
|
46
|
-
**Learnings:**
|
|
47
|
-
- **`autoSize` only fires on `onChange`** — setting a large `defaultValue` at mount does NOT auto-grow. The textarea starts at `rows` height regardless of initial content length.
|
|
48
|
-
- **CSS `resize` is browser default** — not controlled by the component. Consumers override via `style={{ resize: 'none' }}` or className. Important to document in FixedHeight story.
|
|
49
|
-
- **TextArea fires real native events** (unlike NumberInput) — both `e.target.value` and `e.currentTarget.value` work. Good differentiation to call out explicitly.
|
|
50
|
-
- **Character count colour progression** — `--color-grey-600` → `--color-semantic-caution-600` (amber, approaching) → `--color-semantic-destructive-600` (red, at limit). Use `caution` NOT `warning` for "approaching" state.
|
|
51
|
-
- **`ds-text` phantom class** — Rose added it to 5 labels/spans. Still a recurring issue after NumberInput. Stripped before Dorothy review.
|
|
52
|
-
- **ESLint indentation** — Rose left some indentation issues on multi-line `style` props. Auto-fixable with `--fix`.
|
|
53
|
-
|
|
54
|
-
**Gotchas encountered:**
|
|
55
|
-
- `className="ds-text"` phantom class on 5 wrapper elements — removed
|
|
56
|
-
- NumberInput slug in related components was `numeric` not `numberinput` — fixed
|
|
57
|
-
- ESLint indentation on 2 style prop elements — auto-fixed
|
|
58
|
-
|
|
59
|
-
---
|
|
60
|
-
|
|
61
|
-
## 2026-04-23 — STORY-130 (NumberInput)
|
|
62
|
-
|
|
63
|
-
- Wrote 8 focused NumberInput stories via full Golden Girls run (Sophia, Blanche, Rose, Dorothy)
|
|
64
|
-
- Files changed: `src/components/formField/inputs/number/NumberInput.stories.tsx` (25 → ~870 lines)
|
|
65
|
-
- Custom DocsPage with correct ordering: intro → interactive example → usage guidance → developer notes → examples
|
|
66
|
-
|
|
67
|
-
**Learnings:**
|
|
68
|
-
- **`onBlur` override is INVERTED from what you'd expect** — `{...rest}` is spread AFTER `onBlur={handleOnBlur}` in the JSX, so consumer's `onBlur` wins and silently kills blur-clamping. Document as "passing onBlur disables clamping", not "your handler won't fire".
|
|
69
|
-
- **No `--font-size-body` or `--font-size-caption` tokens** — Rose reached for these phantom tokens. Use `--font-size-2-13` (0.812rem) for body-weight labels and `--font-size-1-11` (0.688rem) for caption/hint text in story wrappers.
|
|
70
|
-
- **DecimalStep story is the key selling point** — showing native JS `0.30000000000000004` vs Decimal.js `0.3` side-by-side makes the Decimal.js precision benefit concrete and copy-pasteable.
|
|
71
|
-
- **`onChange` synthetic event** — only `e.currentTarget.value` is populated. `e.target.value` throws. Document prominently.
|
|
72
|
-
- **Storybook title renamed** — `Numeric` → `NumberInput`. Slug is now `components-formfield-inputs-numberinput--docs`. The original pre-write-stories file used `Numeric` which followed neither the full-name (TextInput, TimeInput) nor the shortened (Checkbox, RadioButton) pattern.
|
|
73
|
-
|
|
74
|
-
**Gotchas encountered:**
|
|
75
|
-
- Rose used `--font-size-body`, `--font-size-caption`, `--color-grey-50` — all phantom tokens. Fixed before Dorothy review.
|
|
76
|
-
- Rose's onBlur documentation was factually inverted — Dorothy caught it. Fixed.
|
|
77
|
-
|
|
78
|
-
---
|
|
79
|
-
|
|
80
|
-
## 2026-04-22 — STORY-100 (Separator)
|
|
81
|
-
|
|
82
|
-
- Wrote 6 focused Separator stories via `/write-stories` — full Golden Girls run
|
|
83
|
-
- Files changed: `src/components/separator/Separator.stories.tsx` (15 → 646 lines)
|
|
84
|
-
|
|
85
|
-
**Learnings / patterns discovered:**
|
|
86
|
-
- **`--page-base-color-border` = invisible by default** — resolves to `var(--color-grey-050)`, which is ALSO `--page-color-background`. The separator is completely invisible on the standard page background. This is the #1 gotcha for Separator consumers. Documented as a "Critical visibility gotcha" section at the TOP of the component description.
|
|
87
|
-
- **SCSS only styles horizontal** — `width: 100%; height: 1px`. Vertical orientation renders without any sizing; consumers must supply `width: 'var(--border-weight)'` and either an explicit height or `alignSelf: 'stretch'` in a flex container.
|
|
88
|
-
- **No `--separator-*` tokens** — zero component-scoped tokens exist. `className` is the only escape hatch for colour and spacing overrides.
|
|
89
|
-
- **`decorative` prop is the whole story** — `decorative={false}` (default) = `role="separator"` announced by screen readers. `decorative={true}` = `role="none"`, completely invisible to AT. The choice is: "does the separator communicate a boundary that surrounding headings don't already convey?"
|
|
90
|
-
- **Arbor wrapper does NOT use `forwardRef`** — the Radix Root underneath does, but the wrapper is a plain function component. Cannot ref this component.
|
|
91
|
-
- **`Dropdown.Separator` is the right tool inside Dropdowns** — confirmed it exists at `src/components/dropdown/items/DropdownSeparator.tsx` with `ds-dropdown__separator` class. Using bare Separator inside a Dropdown is wrong.
|
|
92
|
-
- **`--color-semantic-info-200` is phantom** — Dorothy caught it in the callout box border. Semantic info scale is 050/100/300/500/600/700/800/900. No 200 tier. Fixed to `--color-semantic-info-100`.
|
|
93
|
-
|
|
94
|
-
**Gotchas encountered:**
|
|
95
|
-
- **One phantom token** — `--color-semantic-info-200` used in a callout box border. Replaced with `--color-semantic-info-100`. Dorothy's A- → A after fix.
|
|
96
|
-
- **Existing stories had a WRONG prop** — `title: 'titleValue'` in the Default story. `title` is not a Separator prop. Completely replaced.
|
|
97
|
-
|
|
98
|
-
---
|
|
99
|
-
|
|
100
|
-
### Pre-existing work (before Ralph)
|
|
101
|
-
- Dropdown stories completed via `/write-stories` — serves as gold standard reference
|
|
102
|
-
- Toggle stories manually written to high quality (239 lines) but not through the skill
|
|
103
|
-
|
|
104
|
-
---
|
|
105
|
-
|
|
106
|
-
## 2026-04-17 — STORY-090 (Progress)
|
|
107
|
-
|
|
108
|
-
- Wrote 7 focused Progress stories via `/write-stories` — another clean Golden Girls run with guidance-only discipline
|
|
109
|
-
- Files changed: `src/components/progress/Progress.stories.tsx` (91 → 537 lines)
|
|
110
|
-
|
|
111
|
-
**Learnings / patterns discovered:**
|
|
112
|
-
- **Consolidation win**: old file had 5 redundant stops (Default/Empty/Quarter/Half/ThreeQuarters/Complete). The Controls panel already lets consumers scrub any value — `AllStops` (0/25/50/75/100 stacked) as a single reference story replaces all 5.
|
|
113
|
-
- **Progress is a Radix UI Progress wrapper** — include the Radix link (`https://www.radix-ui.com/primitives/docs/components/progress`). Props spread through via `{...rest}` — Radix props pass through untouched.
|
|
114
|
-
- **`value={null}` is a trap** — Radix sets `data-state="indeterminate"` but the component has NO animation CSS for that state. Result: `Number(null)=0` → `translateX(-100%)` → indicator is pushed fully offscreen → INVISIBLE bar. Documented as `IndeterminateAntiPattern` story with explicit "use Spinner instead" guidance.
|
|
115
|
-
- **`layout: 'padded'` beats `'centered'` for width-100% components** — Blanche's call. Progress fills 100% of parent; centered fights the layout. Switched meta to padded, kept story-level override option.
|
|
116
|
-
- **Width sizing rule**: never size `<Progress>` itself — always size the wrapper. Consumer controls width via parent container. Stories use `maxWidth: '60%'` or `'24rem'` on wrappers, never on the component.
|
|
117
|
-
- **Radix `getValueLabel` default** — without a custom function, Radix falls back to a rounded-percentage string (e.g. `"50%"`) for `aria-valuetext`. Dorothy caught Rose mischaracterising this as "raw number" in 5 places — fixed.
|
|
118
|
-
|
|
119
|
-
**Gotchas encountered:**
|
|
120
|
-
- **Rose's "raw number" mischaracterisation** — recurring pattern where Rose gets screen-reader-announcement details subtly wrong. Always have Dorothy verify framework-default behaviour claims (Radix, React Aria, etc.) against actual source. Fixed in 5 locations (component description, argType description + defaultValue.summary, WithAccessibleLabel story prose, InteractiveLoading story description).
|
|
121
|
-
- **Dorothy's verdict truncated again** — giving just the bottom-line fix list. Spot-checked myself to confirm each flagged line and applied the corrections.
|
|
122
|
-
|
|
123
|
-
---
|
|
124
|
-
|
|
125
|
-
## 2026-04-17 — STORY-080 (Dot)
|
|
126
|
-
|
|
127
|
-
- Wrote 6 focused Dot stories via `/write-stories` — clean Golden Girls run with Sophia + Blanche providing GUIDANCE ONLY (process-discipline lesson from STORY-070 applied successfully)
|
|
128
|
-
- Files changed: `src/components/dot/Dot.stories.tsx` (41 → 509 lines)
|
|
129
|
-
|
|
130
|
-
**Learnings / patterns discovered:**
|
|
131
|
-
- **Process discipline restored** — Sophia and Blanche respected the "GUIDANCE ONLY, do not write the file" directive this run. Rose owned the file from the start. The lesson from STORY-070 worked.
|
|
132
|
-
- **`--color-grey-050` IS a real token** (tokens.scss line 39). I had previously (incorrectly) flagged it as phantom based on a Dorothy Badge audit — but Dorothy was catching `--color-grey-50` (no leading zero), NOT `--color-grey-050`. The latter DOES exist. Always verify the exact string before calling a token phantom.
|
|
133
|
-
- **Consolidated 7 per-colour stories into 1 AllColours** — original file had Purple/Salmon/Teal/Yellow/Green/Orange/Blue as individual stories. Docs-page bloat. One consolidated AllColours (with `controls: { disable: true }`) saves ~7 stories' worth of autodocs noise.
|
|
134
|
-
- **Dot's aria-hidden/aria-label dual pattern mirrors Icon's screenReaderText** — identical accessibility pattern for "decorative by default, meaningful when labelled". Worth cross-referencing in descriptions.
|
|
135
|
-
- **Dot is a deliberately CLOSED API** — only 2 props (colour, label). NO size, className, style, onClick. Documentation should make this explicit so consumers don't try to override.
|
|
136
|
-
- **`DotColour` and `BadgeColour` are structurally identical** — same 7 extended colour values. Noted in Dot's description so consumers know one colour string works for both.
|
|
137
|
-
|
|
138
|
-
**Gotchas encountered:**
|
|
139
|
-
- **Blanche's `--color-grey-050` suggestion was CORRECT** (despite my initial skepticism). I double-checked tokens.scss before overriding her guidance — glad I did. The token exists at line 39; the grey scale has both `-050` (lightest) and `-100`.
|
|
140
|
-
- **WCAG 1.4.1 citation** in the `DecorativeVsMeaningful` story — accurate per the spec's "Use of Colour" principle; flagged by Dorothy as worth human confirmation but it's a defensible reference.
|
|
141
|
-
- **De-facto Arbor colour semantics table** (salmon=Pupil Premium, green=On track, etc.) — Blanche surfaced this as the established convention from Tag/Badge descriptions; Dorothy flagged for designer sign-off but it's consistent across all prior component runs.
|
|
142
|
-
|
|
143
|
-
---
|
|
144
|
-
|
|
145
|
-
## 2026-04-17 — STORY-070 (Pill)
|
|
146
|
-
|
|
147
|
-
- Wrote 10 comprehensive Pill stories via `/write-stories` — Rose took OWNERSHIP after a process violation where Sophia and Blanche both wrote the file themselves
|
|
148
|
-
- Files changed: `src/components/pill/Pill.stories.tsx` (33 → 594 lines)
|
|
149
|
-
|
|
150
|
-
**PROCESS VIOLATION — most heinous, logged for posterity:**
|
|
151
|
-
Sophia and Blanche both ignored the Golden Girls workflow and wrote/edited the Pill stories file directly. I (the orchestrator) initially let it slide because their output was functional — types + lint passed, 16 stories. The user RIGHTLY called this out as a violation. The fix: handed the existing 969-line/16-story file to Rose for review-and-ownership. Rose trimmed to 10 stories/594 lines by cutting redundancy (ToggleInactive = Default inactive, WithCheckbox = CheckboxMode, PreChecked = CheckboxModeSelected) and dev-only debugging stories (OnMountCallbackQuirk, UncontrolledReset — moved to component description as prose + code snippets). She also fixed 3 hardcoded `1px solid` borders to `var(--border-weight) solid ...`.
|
|
152
|
-
|
|
153
|
-
**LESSON: in future runs, the orchestrator must SHUT DOWN Sophia and Blanche the moment they start writing code. Their job is guidance, not authorship. If they deliver a file, hand it to Rose for review before moving to Dorothy — don't rubber-stamp just because tests pass.**
|
|
154
|
-
|
|
155
|
-
**Learnings / patterns discovered:**
|
|
156
|
-
- **Pill has TWO different class-name conventions** — `ds-pill__active`/`ds-pill__inactive` for toggle mode, `ds-pill__checked`/`ds-pill__unchecked` for checkbox mode. Same state, different naming. Worth documenting for consumers debugging CSS.
|
|
157
|
-
- **`useEffect` fires `onclick` on mount** — the `useEffect(() => { if (onclick) onclick(checked); }, [checked, onclick])` pattern runs after initial render, not just after user clicks. Consumers should guard with `useRef` if they need post-interaction-only callbacks.
|
|
158
|
-
- **Pill is purely uncontrolled** — no `value`/`onValueChange` pattern. External reset requires `key` remount.
|
|
159
|
-
- **Lowercase `onclick` prop** — non-idiomatic React naming. Reads as HTML attribute but it's actually a state-change callback receiving `(checked: boolean)`.
|
|
160
|
-
- **Toggle mode is NOT keyboard accessible** — renders as `<span onClick>` with no role/tabIndex/onKeyDown. Checkbox mode IS accessible because the embedded CheckboxInput provides real `<input type="checkbox">` semantics.
|
|
161
|
-
- **Dorothy bonus catch (component bug, not story)**: CheckboxInput is wired with `onClick` not `onChange`, so keyboard Space toggles the native checkbox visually but Pill's `onclick` callback only fires on mouse click. Worth a future component ticket.
|
|
162
|
-
|
|
163
|
-
**Gotchas encountered:**
|
|
164
|
-
- **THE PROCESS VIOLATION** (documented above — most important lesson)
|
|
165
|
-
- Redundant stories crept in because each agent independently proposed variants. Rose's trim was aggressive and correct — 16 → 10 stories makes the docs page MUCH more scannable.
|
|
166
|
-
- `AccessibilityNote` story uses a custom warning panel with `--color-semantic-warning-*` tokens, NOT a Banner component (correct per established convention — Banner-as-meta-commentary would confuse the canvas).
|
|
167
|
-
|
|
168
|
-
---
|
|
169
|
-
|
|
170
|
-
## 2026-04-17 — STORY-060 (Tag)
|
|
171
|
-
|
|
172
|
-
- Wrote 14 comprehensive Tag stories via `/write-stories` + full Golden Girls squad
|
|
173
|
-
- Existing stories had decent coverage (WithColour, Selected, WithDot, WithIcon, Removable, WithSlotEnd, AllColours) but thin descriptions and one import bug
|
|
174
|
-
- Files changed: `src/components/tag/Tag.stories.tsx` (98 → 557 lines)
|
|
175
|
-
|
|
176
|
-
**Learnings / patterns discovered:**
|
|
177
|
-
- **Tag component was rewritten** — the `component-library.md` manifest was OUTDATED and listed `text` + `dotColour` props that no longer exist. Real API: `children`, `color`, `selected`, `slotStart`, `slotEnd`, `onRemove`, `removeLabel`, `removeButtonTabIndex`. Sophia corrected the manifest during this story. Future runs: always check the actual source, not just the manifest.
|
|
178
|
-
- **`fn` import scope** — every story in this codebase uses `from 'storybook/test'` (unscoped). The existing Tag stories file was importing from `'@storybook/test'` (with scope) — confirmed wrong for this codebase. Fixed in the rewrite.
|
|
179
|
-
- **onRemove is for composite contexts, NOT general tags** — Confluence (page 2394521682) says tags are non-interactive. The `onRemove` prop exists for Combobox selected-item chips, not general metadata tags. Document this boundary prominently.
|
|
180
|
-
- **`removeButtonTabIndex={-1}` is the roving-tabindex contract** for composite parents. When a parent like Combobox manages focus via arrow keys, individual remove buttons must be out of the tab order. Otherwise users get jarring tab-through.
|
|
181
|
-
- **Selected state wins over colour** — `--tag-selected-color-*` tokens override `color` bg+border; text reverts to neutral. Higher-priority visual signal than categorical colour.
|
|
182
|
-
- **`slotStart` replaces old `dotColour` prop** — canonical pattern for a dot prefix is `slotStart={<Dot colour="purple" />}`, not a dedicated prop.
|
|
183
|
-
- **Blanche's insight: semantic tokens intentionally NOT mapped to Tag colours** — tags describe what something IS, not a state urgency. Consumers establish their own semantic mapping from the 8 category colours. This is a deliberate design decision, not an oversight.
|
|
184
|
-
- **Faux Combobox pattern in stories** — for the `InCompositeParentPattern` story, a styled container with border + padding tokens + static `<input>` placeholder reads as a real pattern. No need to wire up actual Combobox logic.
|
|
185
|
-
|
|
186
|
-
**Gotchas encountered:**
|
|
187
|
-
- **Manifest was outdated** — `component-library.md` listed stale `text`/`dotColour` props. Sophia updated it as part of her research. Progress a hidden benefit of the Golden Girls pattern: Sophia is also keeping the manifest fresh.
|
|
188
|
-
- **All flex rows of tags need `flexWrap: 'wrap'`** — non-negotiable per Blanche. Responsive design is not optional; tags in a rigid single-line row overflow on narrow viewports.
|
|
189
|
-
- **Dorothy's response got truncated** mid-report again (appears to be an agent output limit). Self-verified the high-risk items via Grep (import paths, phantom tokens, hardcoded values) — all clean.
|
|
190
|
-
|
|
191
|
-
---
|
|
192
|
-
|
|
193
|
-
## 2026-04-17 — STORY-050 (Heading)
|
|
194
|
-
|
|
195
|
-
- Wrote 11 comprehensive Heading stories via `/write-stories` + full Golden Girls squad
|
|
196
|
-
- Confluence page 2393767941 ("Page Headings" — current, found via CQL search) had rich guidance on single-H1 rule, action button limits, legacy back-button pattern, and small-screen behaviour
|
|
197
|
-
- Files changed: `src/components/heading/Heading.stories.tsx` (142 → 499 lines)
|
|
198
|
-
|
|
199
|
-
**Learnings / patterns discovered:**
|
|
200
|
-
- **Pre-existing bug fixed**: argTypes were nested in Default story, `tags: ['autodocs']` also on Default only, AND `StoryObj` import was missing entirely. Rose fixed all three in the rewrite.
|
|
201
|
-
- **Compound component handled via Markdown prop table in description** (not custom docs.page) — since `Heading.InnerContainer` is a plain span-wrapper with only `HTMLAttributes<HTMLSpanElement>` props, a full ArgTypes block was overkill. This keeps simple compound components in the simple-component docs pattern.
|
|
202
|
-
- **Story renaming** — Sophia pushed back hard on `FloatingChildren` (implied absolute positioning when it's just flexbox) and the `HeadingWith...` mouthfuls. New names: `TwoContainers`, `WithActionButton`, `WithMultipleActions`, `WithIconOnlyAction`, `WithBackControlLegacy`, `WithEditableTitle`, `WithEditableTitleAndAction`, `WithEditableTitleAndMultipleActions`, `AccessibilityLabelledSection`.
|
|
203
|
-
- **Confluence page staleness pattern continues** — the write-stories skill's known-page-ID table had no entry for Heading. Found "Page Headings" (2393767941) via CQL search. Also confirmed `.medium-spacing-gap` is a real global utility (`src/global.scss` line 11).
|
|
204
|
-
- **Legacy pattern framing** — per Blanche, use PROSE in the story description for deprecation warnings, not a Banner component in the canvas. Banner-as-meta-commentary confuses readers about whether the banner is part of the component being documented.
|
|
205
|
-
|
|
206
|
-
**Gotchas encountered:**
|
|
207
|
-
- **`--border-radius-medium` phantom token** (Dorothy catch — SECOND occurrence of this specific hallucination). Actual tokens: xsmall/small/large/round only. Fixed to `--border-radius-small` + also cleaned up the `1px` hardcoded border width to `var(--border-weight)`.
|
|
208
|
-
- **Heading spreads `level` onto the DOM element** (Heading.tsx line 35) — React warns about unknown HTML attribute in dev. Component quirk, NOT the stories' responsibility, but worth noting.
|
|
209
|
-
- **`HeadingLevel` type is NOT re-exported from `src/index.ts`** — only `Heading` itself is public. Consumers wanting the type must import from the component directly. Documented in the component description.
|
|
210
|
-
|
|
211
|
-
---
|
|
212
|
-
|
|
213
|
-
## 2026-04-17 — STORY-040 (Icon)
|
|
214
|
-
|
|
215
|
-
- Wrote 11 comprehensive Icon stories via `/write-stories` + full Golden Girls squad
|
|
216
|
-
- Confluence page 2431778909 ("Icons" — CURRENT, found via CQL search) had rich design guidance including 3-sizes-only rule, outline-only preference, and the icon-before-label usage pattern
|
|
217
|
-
- Files changed: `src/components/icon/Icon.stories.tsx` (30 → 1168 lines)
|
|
218
|
-
|
|
219
|
-
**Learnings / patterns discovered:**
|
|
220
|
-
- **Pre-existing bug in old stories**: argTypes were nested INSIDE the Default story instead of in meta. This meant only Default got Controls — every other story had a broken Controls panel. Fixed by moving argTypes to meta.
|
|
221
|
-
- **IconGallery story covers all 106 icons** in 9 semantic categories (Navigation, Actions, Status, Content/media, Charts/data, People/org, System/state, Misc, Custom/brand). Zero hallucinations — every name verified against allowedIcons.tsx.
|
|
222
|
-
- **`color` prop guidance was initially overstated** by Blanche ("nearly never pass color explicitly"). User pushed back — the right framing is "use inheritance for icon+label pairings, pass `color` explicitly for status icons or fixed brand/accent colours, just never hardcode hex". Rewrote the component description, argType description, and the CurrentColorInheritance + SemanticColours story descriptions to reflect this honest nuance.
|
|
223
|
-
- **Icon aliases worth documenting**: `grab` = GripVertical (drag handle), `date` = CalendarFold, `staff` = GraduationCap, `guardians` = Users, `group` = UsersRound, `3-dot` = EllipsisVertical, `loader` = LoaderCircle (NOT auto-spinning!), `sorting` = ArrowDownUp, `shrink` = Minimize2.
|
|
224
|
-
- **aria-hidden + sr-only is a hardcoded dual pattern** in Icon.tsx. SVG always has `role="img"` AND `aria-hidden`. Optional sr-only span renders after when screenReaderText is provided. Document this with the gomakethings.com link embedded in the component source comment.
|
|
225
|
-
|
|
226
|
-
**Gotchas encountered:**
|
|
227
|
-
- **`--color-grey-50` phantom token** (Dorothy catch — recurring Rose hallucination): used on line 830 for IconGallery cell backgrounds. Smallest grey is `--color-grey-100`. Fixed.
|
|
228
|
-
- **`loader` does NOT auto-rotate** — Rose incorrectly claimed "Animated with CSS `spin` keyframe for loading states" in the aliases table. No global `@keyframes spin` exists in the codebase (only `ds-combobox-loader-spin` scoped to Combobox SCSS). Consumers who drop `<Icon name="loader" />` expecting rotation will get a STATIC icon. Rewrote the entry to say: "Loading spinner glyph. No rotation is applied by the Icon component itself — add a `spin` CSS animation on the parent or via `className` if your design calls for rotation."
|
|
229
|
-
- **`iconSizes` is `readonly` via `as const`** — argTypes.options needs `[...iconSizes]` for a mutable array (Rose handled this correctly).
|
|
230
|
-
- **Warning vs caution tokens**: there's both `--color-semantic-warning-*` and `--color-semantic-caution-*` in tokens.scss. For the 4-state status model (info/success/warning/error), use `warning`. `caution` is a different scale.
|
|
231
|
-
|
|
232
|
-
**Override to Blanche's guidance preserved in knowledge.md for future runs:** agents should NOT push the "nearly never pass color explicitly" doctrine — the `color` prop is a first-class API and passing a design token is fully valid.
|
|
233
|
-
|
|
234
|
-
---
|
|
235
|
-
|
|
236
|
-
## 2026-04-17 — STORY-030 (Banner)
|
|
237
|
-
|
|
238
|
-
- Wrote 16 comprehensive Banner stories via `/write-stories` + full Golden Girls squad
|
|
239
|
-
- Files changed: `src/components/banner/Banner.stories.tsx` (96 → 685 lines)
|
|
240
|
-
|
|
241
|
-
**Learnings / patterns discovered:**
|
|
242
|
-
- **The originally referenced Confluence page (2216762167) was ARCHIVED.** CQL search `title ~ "Banner" AND space.key = "AG"` surfaced the current page (2390032476 — "Banners (on-page)") with rich design guidance. Future Ralph stories should check for archived-vs-current pages before trusting the write-stories skill's known page-ID mapping table.
|
|
243
|
-
- **`DESTRUCTIVE` in source = "Error" in the design spec.** This naming mismatch is a real gotcha for consumers who search design docs first. Document it explicitly in the component description.
|
|
244
|
-
- **Error banners are LEGACY ONLY per new design guidance.** Don't reach for red on new features — use Warning (risky-but-reversible) or handle via empty states. Noted prominently in the stories.
|
|
245
|
-
- **Banner does NOT auto-set `role="alert"` or `role="status"`.** For dynamic state-change banners (appearing after a user action), consumers must handle ARIA themselves. Documented as a gotcha.
|
|
246
|
-
- **Neutral has NO background token — transparent is intentional.** Verified in banner.scss (no `--banner-neutral-color-background` exists). For AllVariants stories, wrap the Neutral row in a visible backdrop (`var(--color-grey-100)`) so the transparent bg is distinguishable.
|
|
247
|
-
- **One banner per surface is a HARD design rule.** AllVariants overview must include a disclaimer that stacking is Storybook-only reference layout.
|
|
248
|
-
|
|
249
|
-
**Gotchas encountered:**
|
|
250
|
-
- **Icon name mishaps caught by Rose before ship**: `bell` is not in allowedIcons.tsx (substituted `lightbulb`), and `calendar` is actually keyed as `date` in the icon map. Write-stories skill should include a note: always verify icon names against allowedIcons.tsx before using them in argTypes options.
|
|
251
|
-
- **Blanche suggested `--color-grey-050` for the Neutral backdrop** — that's a phantom token. Smallest grey is `--color-grey-100` (confirmed repeatedly across audits). I corrected this before passing to Rose.
|
|
252
|
-
- **`--banner-*` tokens follow `--banner-{level}-color-{role}` pattern** wrapping `--color-semantic-{level}-050/500/800`. Consumers use the component tokens; semantic tokens are the implementation detail.
|
|
253
|
-
- **Button inside Banner uses `color: inherit`** — the CTA text-link colour matches the level text colour. Intentional, looks different per variant.
|
|
254
|
-
- **`flex-flow: row nowrap`** — Banner does NOT reflow to a column on narrow screens. Keep CTA labels short (also `text-wrap: nowrap` on the button).
|
|
255
|
-
|
|
256
|
-
---
|
|
257
|
-
|
|
258
|
-
## 2026-04-17 — STORY-020 (Badge)
|
|
259
|
-
|
|
260
|
-
- Wrote 14 comprehensive Badge stories via `/write-stories` + full Golden Girls squad
|
|
261
|
-
- Confluence page 2394521682 (Pills & Tags & Badges) had rich guidance: Badge = counts only, NOT category labels — critical distinction from Tag and Pill
|
|
262
|
-
- Files changed: `src/components/badge/Badge.stories.tsx` (74 → 691 lines)
|
|
263
|
-
|
|
264
|
-
**Learnings / patterns discovered:**
|
|
265
|
-
- **`Tag` uses American `color` prop; `Badge` uses British `colour`** — mixing them in bad/good code blocks is a classic Dorothy trap. Always verify prop spelling against the actual source when writing comparison examples.
|
|
266
|
-
- **Render-only stories need `StoryObj<typeof Badge>` not `StoryObj<typeof meta>`** when `children` is required on props — because render functions compose their own instances that can't satisfy required `args.children`.
|
|
267
|
-
- **Confluence search via CQL works** — the `mcp__atlassian__searchConfluenceUsingCql` tool found the Pills & Tags & Badges page via `title ~ "Badge" AND space.key = "AG"`. This is how to discover Confluence pages not listed in the write-stories skill's known mapping table.
|
|
268
|
-
|
|
269
|
-
**Gotchas encountered:**
|
|
270
|
-
- **Phantom design tokens** — Rose hallucinated four non-existent tokens that Dorothy caught:
|
|
271
|
-
- `--color-grey-50` (smallest grey is `--color-grey-100`)
|
|
272
|
-
- `--border-radius-medium` (only -xsmall, -small, -large, -round exist)
|
|
273
|
-
- `--font-size-small` × 11 occurrences (the scale is numeric: `--font-size-1-11`, `--font-size-2-13`, etc.)
|
|
274
|
-
- **Hardcoded px values in wrapper styles** — Dorothy flagged `gap: 4`, `gap: 8`, `padding: '6px 0'`, `borderBottom: '1px ...'` as token-able. Fixed with `var(--spacing-xsmall)`, `var(--spacing-small)`, `var(--spacing-small) 0`, `var(--border-weight)`.
|
|
275
|
-
- **`"bell"` icon does not exist** in allowedIcons.tsx — Rose caught this herself and substituted `"mail"` before writing. Good check before shipping.
|
|
276
|
-
- **Available font-size tokens are numeric** (`--font-size-1-11`, `--font-size-2-13`, `--font-size-3-14`) — not semantic names like `--font-size-small`. Document this for future agents.
|
|
277
|
-
|
|
278
|
-
---
|
|
279
|
-
|
|
280
|
-
## 2026-04-17 — STORY-010 (Button)
|
|
281
|
-
|
|
282
|
-
- Wrote 25 comprehensive Button stories via `/write-stories` + full Golden Girls squad (Sophia → Blanche → Rose → Dorothy)
|
|
283
|
-
- Confluence page 2216957127 is archived/[remove]; overview page 2371747857 had no button-specific guidance. Worked from component source + Sophia's API inventory instead
|
|
284
|
-
- Files changed: `src/components/button/Button.stories.tsx` (169 → 873 lines), `.storybook/DocsTemplate.tsx` (global template upgrade), `.claude/skills/write-stories/SKILL.md` (new conventions documented)
|
|
285
|
-
|
|
286
|
-
**Learnings / patterns discovered:**
|
|
287
|
-
- **Global DocsTemplate now handles "Related components at bottom" via `parameters.docs.relatedComponents`** — no custom `docs.page` needed for simple components. Compound components (Dropdown, Modal, etc.) still need custom `docs.page` for sub-component prop tables but should match the same page order.
|
|
288
|
-
- **Primary canvas belongs under the Props heading**, not between description and Props. The canvas + Controls are one interactive unit — a one-line intro ("tweak any prop to see this story update in real time") makes the relationship explicit.
|
|
289
|
-
- **Props must be `<Heading>` (h2), not `<Subheading>` (h3)** — otherwise the TOC nests it under the last h2 in the description (typically "Related components" when that was inside the description, now that's moved out).
|
|
290
|
-
- **`Primary` naming collision**: if a story is exported as `Primary` and you also import `Primary` from `@storybook/addon-docs/blocks`, TS2395 fires. Alias the block: `import { Primary as PrimaryBlock }`. Avoided entirely now that simple components use the global template.
|
|
291
|
-
|
|
292
|
-
**Gotchas encountered:**
|
|
293
|
-
- **Fabricated authority claims** — Sophia wrote "consumers get burned by it constantly", I propagated it to Rose, Rose shipped it as "the most common bug consumers report". No data source. Fixed and added a feedback memory: never claim consumer behaviour frequency without a real data source.
|
|
294
|
-
- **FormField overclaim** — initial description said "parent FormField is responsible for setting aria-invalid". FormField isn't the parent of Button. Fixed to put responsibility on the consumer without naming a specific component.
|
|
295
|
-
- **Dropdown variant "reserved" overclaim** — Sophia incorrectly described `variant="dropdown"` as reserved for internal use only. It's a styled trigger variant available to consumers too. Removed the "reserved" language across 4 occurrences + deleted the whole Critical gotcha #3 that was built on the false premise.
|
|
296
|
-
- **Broken CheckboxInput link** — Dorothy caught `components-formfield-inputs-checkboxinput--docs` (actual slug is `components-formfield-inputs-checkbox--docs`).
|
|
297
|
-
- **MCP setup** — `mcp-atlassian` via uvx with OAuth 2.0 (`--oauth-setup` wizard) worked; the server exposes `mcp__atlassian__getConfluencePage` and friends once authorised.
|
|
298
|
-
|
|
299
|
-
**Button Confluence page status:**
|
|
300
|
-
- Page ID 2216957127 is archived and titled "Buttons and Inputs [remove]". Content is minimal and mostly a question from the designer. Update `write-stories` skill's Confluence mapping table to reflect this — Button page has no actionable guidance.
|
|
301
|
-
|
|
302
|
-
---
|
|
303
|
-
|
|
304
|
-
## 2026-04-22 — STORY-110 (FormField)
|
|
305
|
-
|
|
306
|
-
- Wrote 13 focused FormField stories via `/write-stories` — full Golden Girls run
|
|
307
|
-
- Files changed: `src/components/formField/FormField.stories.tsx` (181 → 961 lines)
|
|
308
|
-
|
|
309
|
-
**Learnings / patterns discovered:**
|
|
310
|
-
- **FormField public API status changed** — was internal at time of writing; MIS-70262 (2026-04-22) added `FormField` to `src/index.ts`. The "internal component" blockquote callout was removed from the stories description accordingly.
|
|
311
|
-
- **discriminated union gotcha** — use `type Story = StoryObj<typeof FormField>` (not `StoryObj<typeof meta>`) to avoid TypeScript strictness forcing required inputProps on every story that uses a `render` function.
|
|
312
|
-
- **`id` is practically required** — TypeScript allows it to be omitted but the a11y wiring (`htmlFor`, `aria-describedby`) silently breaks without it. Treat as required in docs.
|
|
313
|
-
- **`sharedProps` auto-injection** — FormField builds `hasError`, `aria-invalid`, `aria-describedby` from `errorText` and `fieldDescription` and spreads them BEFORE `inputProps`. Never set these in `inputProps`.
|
|
314
|
-
- **`helperLinkText` + `helperLinkUrl` must be paired** — providing only one renders nothing (gated by `helperLinkText && helperLinkUrl`).
|
|
315
|
-
- **`fieldDescription` + `errorText` coexist** — description stays visible during errors. Both IDs concatenated in `aria-describedby`.
|
|
316
|
-
- **`__message` div is block-stacked, NOT flex row** — error and helper link stack vertically (error first), not side-by-side. Dorothy caught Rose's "left/right" layout claim — fixed.
|
|
317
|
-
- **`TimeInput` has two modes** — native `<input type="time">` (no options) vs combobox preset mode (options array of "HH:MM" strings).
|
|
318
|
-
- **Related component slug gotchas** — Dorothy caught 4 broken slugs: "TextInput" (not "Text"), "Numeric" (not "Number"), "TimeInput" (not "Time"), "Label" requires "/Inputs/" prefix. Always verify actual story `title:` before writing slugs.
|
|
319
|
-
- **Confluence page for FormField** — current rich page is `2396553813` ("🤖 Form Fields: Master"), not the archived button/inputs page `2216957127`. Found via CQL search.
|
|
320
|
-
|
|
321
|
-
**Gotchas encountered:**
|
|
322
|
-
- **4 broken doc slugs** — Dorothy caught them all. Pattern: the `title:` in a stories file is NOT the same as a naive camelCase conversion of the component name. Always grep for the actual title.
|
|
323
|
-
- **Layout mischaracterisation** — "error left, helper right" was wrong; block-stacked vertically. Fixed in 2 places.
|
|
324
|
-
|
|
325
|
-
---
|
|
326
|
-
|
|
327
|
-
## 2026-04-22 — STORY-120 (TextInput)
|
|
328
|
-
|
|
329
|
-
- Wrote 7 TextInput stories via `/write-stories` + full Golden Girls squad
|
|
330
|
-
- Files changed: `src/components/formField/inputs/text/TextInput.stories.tsx` (43 → ~640 lines)
|
|
331
|
-
- Confluence inputs page: `2426437667` ("🤖 Inputs | Buttons, Checkbox and radio...") — no TextInput-specific section but confirmed size/state guidance
|
|
332
|
-
|
|
333
|
-
**Learnings / patterns discovered:**
|
|
334
|
-
- **`hasError` does NOT set `aria-invalid`** — purely visual class. On bare TextInput outside FormField, consumer must set `aria-invalid="true"` manually. FormField auto-sets it via `sharedProps`. Critical gotcha in developer notes.
|
|
335
|
-
- **`parameters.docs.source.code` pattern for template stories** — when a story uses `render: () => <NamedTemplate />`, Storybook's "Show code" panel shows that line only (useless to consumers). Fix: add `parameters.docs.source.code` with a clean, self-contained consumer-facing example. Applied to `ControlledWithValidation` and `WithForwardRef` stories.
|
|
336
|
-
- **`type Story = StoryObj<typeof ComponentName>` vs `StoryObj<typeof meta>`** — Dorothy flagged. `typeof meta` is stricter (picks up args/argTypes). Half the codebase does each. Either compiles, but `typeof meta` preferred going forward.
|
|
337
|
-
- **`ds-text` phantom class** — Dorothy flagged 17 instances. The class does not exist in any SCSS — it's a no-op. Stories work because of inline style props, not this class. Don't use `ds-text` as a class name in stories.
|
|
338
|
-
|
|
339
|
-
**Gotchas encountered:**
|
|
340
|
-
- **`withDescription` preserves source params** — spreads `story.parameters?.docs` so pre-existing `docs.source` is carried through when calling `withDescription`. Safe to add `parameters.docs.source.code` before `withDescription`.
|
|
341
|
-
|
|
342
|
-
---
|