import type { Meta, StoryObj } from '@storybook/nextjs-vite'
import { useState } from 'react'
import { ScriptArguments, type ScriptArgument } from '../components/platform/ScriptArguments'
const meta = {
title: 'Platform/ScriptArguments',
component: ScriptArguments,
parameters: {
layout: 'padded',
docs: {
description: {
component:
'Displays and manages script arguments as key-value pairs. Each argument has a name (key) and value input field with delete button. Includes an "Add Script Argument" button to add new entries.'
}
}
},
tags: ['autodocs'],
argTypes: {
arguments: {
control: 'object',
description: 'Array of script arguments with id, key, and value'
},
onArgumentsChange: {
action: 'argumentsChanged',
description: 'Callback when arguments change'
},
keyPlaceholder: {
control: 'text',
description: 'Placeholder for key input'
},
valuePlaceholder: {
control: 'text',
description: 'Placeholder for value input'
},
addButtonLabel: {
control: 'text',
description: 'Label for the add button'
},
disabled: {
control: 'boolean',
description: 'Whether the component is disabled'
},
className: {
control: 'text',
description: 'Additional CSS classes'
}
},
decorators: [
(Story) => (
)
]
} satisfies Meta
export default meta
type Story = StoryObj
/**
* Default ScriptArguments with example data matching the Figma design.
*/
export const Default: Story = {
args: {
arguments: [
{ id: '1', key: 'port', value: '3000' },
{ id: '2', key: 'verbose', value: '' },
{ id: '3', key: 'config', value: 'production' }
],
titleLabel: 'Script Arguments'
}
}
/**
* Empty state - no arguments yet.
*/
export const Empty: Story = {
args: {
arguments: [],
titleLabel: 'Script Arguments'
}
}
/**
* Single argument.
*/
export const SingleArgument: Story = {
args: {
arguments: [{ id: '1', key: 'debug', value: 'true' }],
titleLabel: 'Script Arguments'
}
}
/**
* Arguments with flags (empty values).
*/
export const WithFlags: Story = {
args: {
arguments: [
{ id: '1', key: '--verbose', value: '' },
{ id: '2', key: '--dry-run', value: '' },
{ id: '3', key: '--force', value: '' }
],
titleLabel: 'Script Arguments'
}
}
/**
* Many arguments to show scrolling behavior.
*/
export const ManyArguments: Story = {
args: {
arguments: [
{ id: '1', key: 'host', value: 'localhost' },
{ id: '2', key: 'port', value: '8080' },
{ id: '3', key: 'database', value: 'mydb' },
{ id: '4', key: 'user', value: 'admin' },
{ id: '5', key: 'password', value: '********' },
{ id: '6', key: 'timeout', value: '30000' },
{ id: '7', key: 'retries', value: '3' }
],
titleLabel: 'Script Arguments'
}
}
/**
* Disabled state.
*/
export const Disabled: Story = {
args: {
arguments: [
{ id: '1', key: 'port', value: '3000' },
{ id: '2', key: 'config', value: 'production' }
],
disabled: true,
titleLabel: 'Script Arguments'
}
}
/**
* Custom placeholders.
*/
export const CustomPlaceholders: Story = {
args: {
arguments: [{ id: '1', key: '', value: '' }],
keyPlaceholder: 'Argument name',
valuePlaceholder: 'Argument value',
titleLabel: 'Script Arguments'
}
}
/**
* Custom add button label.
*/
export const CustomAddLabel: Story = {
args: {
arguments: [],
addButtonLabel: 'Add New Parameter',
titleLabel: 'Script Arguments'
}
}
/**
* Interactive example with state management.
*/
export const Interactive: Story = {
args: {
arguments: [],
titleLabel: 'Script Arguments'
},
render: function InteractiveStory() {
const [args, setArgs] = useState([
{ id: '1', key: 'port', value: '3000' },
{ id: '2', key: 'verbose', value: '' },
{ id: '3', key: 'config', value: 'production' }
])
return (
Current State:
{JSON.stringify(args, null, 2)}
)
}
}
/**
* Long values that may need truncation.
*/
export const LongValues: Story = {
args: {
arguments: [
{
id: '1',
key: 'connection-string',
value:
'mongodb+srv://user:password@cluster0.mongodb.net/database?retryWrites=true&w=majority'
},
{
id: '2',
key: 'api-endpoint',
value: 'https://api.example.com/v1/very/long/endpoint/path'
}
],
titleLabel: 'Script Arguments'
}
}