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':