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',
},
};