diff --git a/ghost/admin-x-settings/src/admin-x-ds/global/Dropdown.stories.tsx b/ghost/admin-x-settings/src/admin-x-ds/global/Dropdown.stories.tsx new file mode 100644 index 0000000000..17548227ae --- /dev/null +++ b/ghost/admin-x-settings/src/admin-x-ds/global/Dropdown.stories.tsx @@ -0,0 +1,43 @@ +import type {Meta, StoryObj} from '@storybook/react'; + +import Dropdown from './Dropdown'; +import {DropdownOption} from './Dropdown'; + +const meta = { + title: 'Global / Input / Dropdown', + component: Dropdown, + tags: ['autodocs'], + decorators: [(_story: any) => (
{_story()}
)] +} satisfies Meta; + +export default meta; +type Story = StoryObj; + +const dropdownOptions: DropdownOption[] = [ + {value: 'Option 1', label: 'option-1'}, + {value: 'Option 2', label: 'option-2'}, + {value: 'Option 3', label: 'option-3'}, + {value: 'Option 4', label: 'option-4'}, + {value: 'Option 5', label: 'option-5'} +]; + +export const Default: Story = { + args: { + options: dropdownOptions + } +}; + +export const WithHeading: Story = { + args: { + title: 'Title', + options: dropdownOptions + } +}; + +export const WithHelp: Story = { + args: { + title: 'Title', + options: dropdownOptions, + help: 'Here\'s some help' + } +}; \ No newline at end of file diff --git a/ghost/admin-x-settings/src/admin-x-ds/global/Dropdown.tsx b/ghost/admin-x-settings/src/admin-x-ds/global/Dropdown.tsx new file mode 100644 index 0000000000..81652b5d40 --- /dev/null +++ b/ghost/admin-x-settings/src/admin-x-ds/global/Dropdown.tsx @@ -0,0 +1,45 @@ +import React, {useState} from 'react'; + +import Heading from './Heading'; + +export interface DropdownOption { + value: string; + label: string; +} + +interface DropdownProps { + title?: string; + options: DropdownOption[]; + onSelect: (value: string) => void; + help?: React.ReactNode; +} + +const Dropdown: React.FC = ({title, options, onSelect, help}) => { + const [selectedOption, setSelectedOption] = useState(''); + + const handleOptionChange = (event: React.ChangeEvent) => { + const selectedValue = event.target.value; + setSelectedOption(selectedValue); + onSelect(selectedValue); + }; + + return ( +
+ {title && {title}} + + {help} +
+ ); +}; + +export default Dropdown; \ No newline at end of file diff --git a/ghost/admin-x-settings/src/admin-x-ds/global/TextField.stories.tsx b/ghost/admin-x-settings/src/admin-x-ds/global/TextField.stories.tsx index 68ad604a4b..9cfdbba44e 100644 --- a/ghost/admin-x-settings/src/admin-x-ds/global/TextField.stories.tsx +++ b/ghost/admin-x-settings/src/admin-x-ds/global/TextField.stories.tsx @@ -5,7 +5,8 @@ import TextField from './TextField'; const meta = { title: 'Global / Input / Textfield', component: TextField, - tags: ['autodocs'] + tags: ['autodocs'], + decorators: [(_story: any) => (
{_story()}
)] } satisfies Meta; export default meta; diff --git a/ghost/admin-x-settings/src/admin-x-ds/global/TextField.tsx b/ghost/admin-x-settings/src/admin-x-ds/global/TextField.tsx index 26ac52da6a..03a1979331 100644 --- a/ghost/admin-x-settings/src/admin-x-ds/global/TextField.tsx +++ b/ghost/admin-x-settings/src/admin-x-ds/global/TextField.tsx @@ -17,7 +17,7 @@ const TextField: React.FC = ({inputRef, title, value, placeholder, h {title && {title}} = ({state, children}) => { switch (state) { case 'edit': - styles = 'border-grey-400'; + styles = 'border-grey-500'; break; case 'unsaved': - styles = 'border-yellow'; + styles = 'border-green'; break; case 'error':