@tightknitai/block-kit-builder 0.1.0-alpha.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/LICENSE +21 -0
- package/README.md +111 -0
- package/dist/index.cjs +5890 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +352 -0
- package/dist/index.d.ts +352 -0
- package/dist/index.js +5857 -0
- package/dist/index.js.map +1 -0
- package/dist/styles.css +2 -0
- package/package.json +104 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/default-blocks.ts","../src/lib/cn.ts","../src/lib/ui/tooltip.tsx","../src/state/use-block-kit-builder-state.ts","../src/lib/error-grouping.ts","../src/lib/to-slack-blocks.ts","../src/state/use-block-kit-validation.ts","../src/lib/ui/sheet.tsx","../src/components/issues-sheet.tsx","../src/components/json-drawer.tsx","../src/components/palette.tsx","../src/lib/ui/button.tsx","../src/lib/ui/dialog.tsx","../src/lib/ui/label.tsx","../src/components/send-dialog.tsx","../src/lib/ui/popover.tsx","../src/lib/ui/input.tsx","../src/lib/ui/radio-group.tsx","../src/components/editors/field.tsx","../src/components/editors/actions-editor.tsx","../src/lib/ui/textarea.tsx","../src/components/editors/alert-editor.tsx","../src/components/editors/card-editor.tsx","../src/components/editors/carousel-editor.tsx","../src/components/editors/context-actions-editor.tsx","../src/components/editors/context-editor.tsx","../src/components/editors/divider-editor.tsx","../src/components/editors/header-editor.tsx","../src/components/editors/image-editor.tsx","../src/components/editors/input-editor.tsx","../src/components/editors/markdown-editor.tsx","../src/lib/rich-text-tiptap.ts","../src/components/editors/rich-text-structured-editor.tsx","../src/components/editors/rich-text-editor.tsx","../src/components/editors/section-editor.tsx","../src/components/editors/table-editor.tsx","../src/components/editors/block-editor.tsx","../src/components/preview/slack-block-preview.tsx","../src/components/block-row.tsx","../src/components/surface.tsx","../src/components/toolbar.tsx","../src/components/block-kit-builder.tsx","../src/lib/url-state.ts"],"names":["React","useState","useEffect","jsx","jsxs","useRef","validateBlockKit","ImageIcon","TableIcon","AlertTriangle","React3","DialogPrimitive2","React4","X","React5","useCallback","React6","React7","React8","nanoid","React9","Trash2","Plus","TypeIcon","editor","LinkIcon","GripVertical","Toolbar","ExternalLink","Code2"],"mappings":"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","file":"index.js","sourcesContent":["import type { SupportedBlock, SupportedBlockType } from '../types';\n\n/**\n * One pre-built block example shown as a draggable item in the palette.\n * Modeled on Slack's real Block Kit Builder (\"plain text\", \"mrkdwn\",\n * \"with button accessory\", etc).\n */\nexport interface PaletteVariant {\n /** Stable id used as the DnD draggable id (`palette:${id}`). */\n id: string;\n /** Visible label shown next to the `+` icon. */\n label: string;\n /** Builds a fresh block payload when this variant is dropped. */\n factory: () => SupportedBlock;\n}\n\n/**\n * One section in the palette. Sections group variants under a block-type\n * heading, matching Slack's organization (Section, Divider, Image, etc).\n */\nexport interface PaletteSection {\n /** Visible heading for the section. */\n name: string;\n /** The block type this section is for, used for section-icon mapping. */\n blockType: SupportedBlockType;\n variants: PaletteVariant[];\n}\n\n/**\n * The palette layout. Mirrors the section ordering of Slack's real Block\n * Kit Builder, scoped to the v1 supported block types.\n */\nexport const PALETTE_SECTIONS: readonly PaletteSection[] = [\n {\n name: 'Rich Text',\n blockType: 'rich_text',\n variants: [\n {\n id: 'rich_text_section',\n label: 'section',\n factory: () => ({\n type: 'rich_text',\n elements: [\n {\n type: 'rich_text_section',\n elements: [\n { type: 'text', text: 'A rich text ' },\n { type: 'text', text: 'section', style: { bold: true } },\n { type: 'text', text: ' with inline ' },\n { type: 'text', text: 'styled', style: { italic: true } },\n { type: 'text', text: ' text.' }\n ]\n }\n ]\n })\n }\n ]\n },\n {\n name: 'Markdown',\n blockType: 'markdown',\n variants: [\n {\n id: 'markdown_basic',\n label: 'basic',\n factory: () => ({\n type: 'markdown',\n text: 'A **markdown** block. Supports _italic_, ~~strike~~, `code`, [links](https://slack.com), lists, tables, and task lists.'\n })\n },\n {\n id: 'markdown_list',\n label: 'list',\n factory: () => ({\n type: 'markdown',\n text: '**Roadmap**\\n\\n- Item one\\n- Item two\\n- Item three'\n })\n },\n {\n id: 'markdown_code',\n label: 'code block',\n factory: () => ({\n type: 'markdown',\n // biome-ignore lint/suspicious/noTemplateCurlyInString: literal markdown source for a code-block sample\n text: '```ts\\nconst greet = (name: string) => `Hello, ${name}!`;\\n```'\n })\n }\n ]\n },\n {\n name: 'Section',\n blockType: 'section',\n variants: [\n {\n id: 'section_plain_text',\n label: 'plain text',\n factory: () => ({\n type: 'section',\n text: {\n type: 'plain_text',\n text: 'A simple plain-text section.',\n emoji: true\n }\n })\n },\n {\n id: 'section_mrkdwn',\n label: 'mrkdwn',\n factory: () => ({\n type: 'section',\n text: {\n type: 'mrkdwn',\n text: 'A *markdown* section. Supports _italic_, ~strike~, `code`, and <https://slack.com|links>.'\n }\n })\n },\n {\n id: 'section_with_button',\n label: 'with button accessory',\n factory: () => ({\n type: 'section',\n text: {\n type: 'mrkdwn',\n text: 'A section with a button accessory on the right.'\n },\n accessory: {\n type: 'button',\n text: { type: 'plain_text', text: 'Click me', emoji: true },\n action_id: 'section_button'\n }\n })\n },\n {\n id: 'section_with_image',\n label: 'with image accessory',\n factory: () => ({\n type: 'section',\n text: {\n type: 'mrkdwn',\n text: 'A section with an image accessory on the right.'\n },\n accessory: {\n type: 'image',\n image_url: 'https://placehold.co/80x80?text=Img',\n alt_text: 'Placeholder accessory image'\n }\n })\n }\n ]\n },\n {\n name: 'Header',\n blockType: 'header',\n variants: [\n {\n id: 'header_default',\n label: 'default',\n factory: () => ({\n type: 'header',\n text: { type: 'plain_text', text: 'Heading text', emoji: true }\n })\n }\n ]\n },\n {\n name: 'Divider',\n blockType: 'divider',\n variants: [\n {\n id: 'divider_plain',\n label: 'plain',\n factory: () => ({ type: 'divider' })\n }\n ]\n },\n {\n name: 'Image',\n blockType: 'image',\n variants: [\n {\n id: 'image_with_title',\n label: 'with title',\n factory: () => ({\n type: 'image',\n image_url: 'https://placehold.co/600x300?text=Image',\n alt_text: 'Placeholder image',\n title: { type: 'plain_text', text: 'Image title', emoji: true }\n })\n },\n {\n id: 'image_no_title',\n label: 'no title',\n factory: () => ({\n type: 'image',\n image_url: 'https://placehold.co/600x300?text=Image',\n alt_text: 'Placeholder image'\n })\n }\n ]\n },\n {\n name: 'Context',\n blockType: 'context',\n variants: [\n {\n id: 'context_plain_text',\n label: 'plain text',\n factory: () => ({\n type: 'context',\n elements: [{ type: 'plain_text', text: 'Posted by your app', emoji: true }]\n })\n },\n {\n id: 'context_mrkdwn',\n label: 'mrkdwn',\n factory: () => ({\n type: 'context',\n elements: [{ type: 'mrkdwn', text: 'Posted by *your app*' }]\n })\n },\n {\n id: 'context_text_and_images',\n label: 'text and images',\n factory: () => ({\n type: 'context',\n elements: [\n {\n type: 'image',\n image_url: 'https://placehold.co/40x40?text=A',\n alt_text: 'Avatar'\n },\n { type: 'mrkdwn', text: '*Alex* posted in <#general>' }\n ]\n })\n }\n ]\n },\n {\n name: 'Actions',\n blockType: 'actions',\n variants: [\n {\n id: 'actions_button',\n label: 'button',\n factory: () => ({\n type: 'actions',\n elements: [\n {\n type: 'button',\n text: { type: 'plain_text', text: 'Click me', emoji: true },\n action_id: 'button_1'\n }\n ]\n })\n },\n {\n id: 'actions_link_button',\n label: 'link button',\n factory: () => ({\n type: 'actions',\n elements: [\n {\n type: 'button',\n text: { type: 'plain_text', text: 'Open link', emoji: true },\n url: 'https://slack.com',\n action_id: 'link_button_1'\n }\n ]\n })\n },\n {\n id: 'actions_multiple_buttons',\n label: 'multiple buttons',\n factory: () => ({\n type: 'actions',\n elements: [\n {\n type: 'button',\n text: { type: 'plain_text', text: 'Approve', emoji: true },\n style: 'primary',\n action_id: 'approve'\n },\n {\n type: 'button',\n text: { type: 'plain_text', text: 'Deny', emoji: true },\n style: 'danger',\n action_id: 'deny'\n },\n {\n type: 'button',\n text: { type: 'plain_text', text: 'Cancel', emoji: true },\n action_id: 'cancel'\n }\n ]\n })\n }\n ]\n },\n {\n name: 'Input',\n blockType: 'input',\n variants: [\n {\n id: 'input_plain_text',\n label: 'plain text',\n factory: () => ({\n type: 'input',\n label: { type: 'plain_text', text: 'Label', emoji: true },\n element: {\n type: 'plain_text_input',\n action_id: 'plain_text_input',\n placeholder: {\n type: 'plain_text',\n text: 'Enter some text',\n emoji: true\n }\n }\n })\n },\n {\n id: 'input_multiline_text',\n label: 'multiline text',\n factory: () => ({\n type: 'input',\n label: { type: 'plain_text', text: 'Description', emoji: true },\n element: {\n type: 'plain_text_input',\n action_id: 'plain_text_input_multiline',\n multiline: true,\n placeholder: {\n type: 'plain_text',\n text: 'Enter a longer description',\n emoji: true\n }\n }\n })\n },\n {\n id: 'input_email',\n label: 'email',\n factory: () => ({\n type: 'input',\n label: { type: 'plain_text', text: 'Email address', emoji: true },\n element: {\n type: 'email_text_input',\n action_id: 'email_text_input',\n placeholder: {\n type: 'plain_text',\n text: 'name@example.com',\n emoji: true\n }\n }\n })\n },\n {\n id: 'input_url',\n label: 'url',\n factory: () => ({\n type: 'input',\n label: { type: 'plain_text', text: 'Website', emoji: true },\n element: {\n type: 'url_text_input',\n action_id: 'url_text_input',\n placeholder: {\n type: 'plain_text',\n text: 'https://example.com',\n emoji: true\n }\n }\n })\n },\n {\n id: 'input_number',\n label: 'number',\n factory: () => ({\n type: 'input',\n label: { type: 'plain_text', text: 'Quantity', emoji: true },\n element: {\n type: 'number_input',\n action_id: 'number_input',\n is_decimal_allowed: false,\n placeholder: { type: 'plain_text', text: '0', emoji: true }\n }\n })\n },\n {\n id: 'input_date',\n label: 'date',\n factory: () => ({\n type: 'input',\n label: { type: 'plain_text', text: 'Pick a date', emoji: true },\n element: {\n type: 'datepicker',\n action_id: 'datepicker',\n placeholder: {\n type: 'plain_text',\n text: 'Select a date',\n emoji: true\n }\n }\n })\n },\n {\n id: 'input_time',\n label: 'time',\n factory: () => ({\n type: 'input',\n label: { type: 'plain_text', text: 'Pick a time', emoji: true },\n element: {\n type: 'timepicker',\n action_id: 'timepicker',\n placeholder: {\n type: 'plain_text',\n text: 'Select a time',\n emoji: true\n }\n }\n })\n },\n {\n id: 'input_datetime',\n label: 'date and time',\n factory: () => ({\n type: 'input',\n label: {\n type: 'plain_text',\n text: 'Pick a date and time',\n emoji: true\n },\n element: {\n type: 'datetimepicker',\n action_id: 'datetimepicker'\n }\n })\n },\n {\n id: 'input_static_select',\n label: 'select',\n factory: () => ({\n type: 'input',\n label: { type: 'plain_text', text: 'Pick an option', emoji: true },\n element: {\n type: 'static_select',\n action_id: 'static_select',\n placeholder: {\n type: 'plain_text',\n text: 'Choose one',\n emoji: true\n },\n options: [\n {\n text: { type: 'plain_text', text: 'Option 1', emoji: true },\n value: 'option_1'\n },\n {\n text: { type: 'plain_text', text: 'Option 2', emoji: true },\n value: 'option_2'\n },\n {\n text: { type: 'plain_text', text: 'Option 3', emoji: true },\n value: 'option_3'\n }\n ]\n }\n })\n },\n {\n id: 'input_multi_static_select',\n label: 'multi-select',\n factory: () => ({\n type: 'input',\n label: { type: 'plain_text', text: 'Pick options', emoji: true },\n element: {\n type: 'multi_static_select',\n action_id: 'multi_static_select',\n placeholder: {\n type: 'plain_text',\n text: 'Choose one or more',\n emoji: true\n },\n options: [\n {\n text: { type: 'plain_text', text: 'Option 1', emoji: true },\n value: 'option_1'\n },\n {\n text: { type: 'plain_text', text: 'Option 2', emoji: true },\n value: 'option_2'\n },\n {\n text: { type: 'plain_text', text: 'Option 3', emoji: true },\n value: 'option_3'\n }\n ]\n }\n })\n },\n {\n id: 'input_users_select',\n label: 'users select',\n factory: () => ({\n type: 'input',\n label: { type: 'plain_text', text: 'Pick a user', emoji: true },\n element: {\n type: 'users_select',\n action_id: 'users_select',\n placeholder: {\n type: 'plain_text',\n text: 'Select a user',\n emoji: true\n }\n }\n })\n },\n {\n id: 'input_multi_users_select',\n label: 'multi users select',\n factory: () => ({\n type: 'input',\n label: { type: 'plain_text', text: 'Pick users', emoji: true },\n element: {\n type: 'multi_users_select',\n action_id: 'multi_users_select',\n placeholder: {\n type: 'plain_text',\n text: 'Select users',\n emoji: true\n }\n }\n })\n },\n {\n id: 'input_channels_select',\n label: 'channels select',\n factory: () => ({\n type: 'input',\n label: { type: 'plain_text', text: 'Pick a channel', emoji: true },\n element: {\n type: 'channels_select',\n action_id: 'channels_select',\n placeholder: {\n type: 'plain_text',\n text: 'Select a channel',\n emoji: true\n }\n }\n })\n },\n {\n id: 'input_multi_channels_select',\n label: 'multi channels select',\n factory: () => ({\n type: 'input',\n label: { type: 'plain_text', text: 'Pick channels', emoji: true },\n element: {\n type: 'multi_channels_select',\n action_id: 'multi_channels_select',\n placeholder: {\n type: 'plain_text',\n text: 'Select channels',\n emoji: true\n }\n }\n })\n },\n {\n id: 'input_conversations_select',\n label: 'conversations select',\n factory: () => ({\n type: 'input',\n label: {\n type: 'plain_text',\n text: 'Pick a conversation',\n emoji: true\n },\n element: {\n type: 'conversations_select',\n action_id: 'conversations_select',\n placeholder: {\n type: 'plain_text',\n text: 'Select a conversation',\n emoji: true\n }\n }\n })\n },\n {\n id: 'input_multi_conversations_select',\n label: 'multi conversations select',\n factory: () => ({\n type: 'input',\n label: {\n type: 'plain_text',\n text: 'Pick conversations',\n emoji: true\n },\n element: {\n type: 'multi_conversations_select',\n action_id: 'multi_conversations_select',\n placeholder: {\n type: 'plain_text',\n text: 'Select conversations',\n emoji: true\n }\n }\n })\n },\n {\n id: 'input_external_select',\n label: 'external select',\n factory: () => ({\n type: 'input',\n label: { type: 'plain_text', text: 'Pick an option', emoji: true },\n element: {\n type: 'external_select',\n action_id: 'external_select',\n placeholder: {\n type: 'plain_text',\n text: 'Choose one',\n emoji: true\n },\n min_query_length: 0\n }\n })\n },\n {\n id: 'input_multi_external_select',\n label: 'multi external select',\n factory: () => ({\n type: 'input',\n label: { type: 'plain_text', text: 'Pick options', emoji: true },\n element: {\n type: 'multi_external_select',\n action_id: 'multi_external_select',\n placeholder: {\n type: 'plain_text',\n text: 'Choose one or more',\n emoji: true\n },\n min_query_length: 0\n }\n })\n },\n {\n id: 'input_radio_buttons',\n label: 'radio buttons',\n factory: () => ({\n type: 'input',\n label: { type: 'plain_text', text: 'Pick one', emoji: true },\n element: {\n type: 'radio_buttons',\n action_id: 'radio_buttons',\n options: [\n {\n text: { type: 'plain_text', text: 'Option 1', emoji: true },\n value: 'option_1'\n },\n {\n text: { type: 'plain_text', text: 'Option 2', emoji: true },\n value: 'option_2'\n },\n {\n text: { type: 'plain_text', text: 'Option 3', emoji: true },\n value: 'option_3'\n }\n ]\n }\n })\n },\n {\n id: 'input_checkboxes',\n label: 'checkboxes',\n factory: () => ({\n type: 'input',\n label: { type: 'plain_text', text: 'Pick any', emoji: true },\n element: {\n type: 'checkboxes',\n action_id: 'checkboxes',\n options: [\n {\n text: { type: 'plain_text', text: 'Option 1', emoji: true },\n value: 'option_1'\n },\n {\n text: { type: 'plain_text', text: 'Option 2', emoji: true },\n value: 'option_2'\n },\n {\n text: { type: 'plain_text', text: 'Option 3', emoji: true },\n value: 'option_3'\n }\n ]\n }\n })\n },\n {\n id: 'input_rich_text',\n label: 'rich text input',\n factory: () => ({\n type: 'input',\n label: { type: 'plain_text', text: 'Description', emoji: true },\n element: {\n type: 'rich_text_input',\n action_id: 'rich_text_input',\n placeholder: {\n type: 'plain_text',\n text: 'Type something',\n emoji: true\n }\n }\n })\n },\n {\n id: 'input_file',\n label: 'file upload',\n factory: () => ({\n type: 'input',\n label: { type: 'plain_text', text: 'Upload a file', emoji: true },\n element: {\n type: 'file_input',\n action_id: 'file_input',\n max_files: 1\n }\n })\n }\n ]\n },\n {\n name: 'Card',\n blockType: 'card',\n variants: [\n {\n id: 'card_basic',\n label: 'basic',\n factory: () => ({\n type: 'card',\n icon: {\n type: 'image',\n image_url: 'https://placehold.co/36x36?text=Icon',\n alt_text: 'Card icon'\n },\n title: { type: 'mrkdwn', text: 'Card title' },\n subtitle: { type: 'mrkdwn', text: 'Card subtitle' },\n body: {\n type: 'mrkdwn',\n text: 'A short description of what this card is about.'\n }\n })\n },\n {\n id: 'card_with_hero',\n label: 'with hero image',\n factory: () => ({\n type: 'card',\n hero_image: {\n type: 'image',\n image_url: 'https://placehold.co/400x200?text=Hero',\n alt_text: 'Card hero image'\n },\n title: { type: 'mrkdwn', text: 'Card title' },\n body: {\n type: 'mrkdwn',\n text: 'A short description of what this card is about.'\n }\n })\n },\n {\n id: 'card_with_actions',\n label: 'with actions',\n factory: () => ({\n type: 'card',\n title: { type: 'mrkdwn', text: 'Card title' },\n body: {\n type: 'mrkdwn',\n text: 'A short description of what this card is about.'\n },\n actions: [\n {\n type: 'button',\n text: { type: 'plain_text', text: 'Open', emoji: true },\n action_id: 'card_action_1'\n }\n ]\n })\n }\n ]\n },\n {\n name: 'Carousel',\n blockType: 'carousel',\n variants: [\n {\n id: 'carousel_basic',\n label: 'basic',\n factory: () => ({\n type: 'carousel',\n elements: [\n {\n type: 'card',\n title: { type: 'mrkdwn', text: 'Card 1' },\n body: { type: 'mrkdwn', text: 'First card in the carousel.' }\n },\n {\n type: 'card',\n title: { type: 'mrkdwn', text: 'Card 2' },\n body: { type: 'mrkdwn', text: 'Second card in the carousel.' }\n },\n {\n type: 'card',\n title: { type: 'mrkdwn', text: 'Card 3' },\n body: { type: 'mrkdwn', text: 'Third card in the carousel.' }\n }\n ]\n })\n }\n ]\n },\n {\n name: 'Context Actions',\n blockType: 'context_actions',\n variants: [\n {\n id: 'context_actions_feedback_and_remove',\n label: 'feedback + remove',\n factory: () => ({\n type: 'context_actions',\n elements: [\n {\n type: 'feedback_buttons',\n action_id: 'feedback',\n positive_button: {\n text: { type: 'plain_text', text: 'Good Response' },\n value: 'positive'\n },\n negative_button: {\n text: { type: 'plain_text', text: 'Bad Response' },\n value: 'negative'\n }\n },\n {\n type: 'icon_button',\n action_id: 'remove',\n icon: 'trash',\n text: { type: 'plain_text', text: 'Remove' }\n }\n ]\n })\n },\n {\n id: 'context_actions_feedback_only',\n label: 'feedback only',\n factory: () => ({\n type: 'context_actions',\n elements: [\n {\n type: 'feedback_buttons',\n action_id: 'feedback',\n positive_button: {\n text: { type: 'plain_text', text: '👍' },\n value: 'positive'\n },\n negative_button: {\n text: { type: 'plain_text', text: '👎' },\n value: 'negative'\n }\n }\n ]\n })\n }\n ]\n },\n {\n name: 'Alert',\n blockType: 'alert',\n variants: [\n {\n id: 'alert_warning',\n label: 'warning',\n factory: () => ({\n type: 'alert',\n level: 'warning',\n text: {\n type: 'mrkdwn',\n text: 'Heads up: this action cannot be undone.'\n }\n })\n }\n ]\n },\n {\n name: 'Table',\n blockType: 'table',\n variants: [\n {\n id: 'table_simple',\n label: 'simple table',\n factory: () => ({\n type: 'table',\n rows: [\n [\n { type: 'raw_text', text: 'Header 1' },\n { type: 'raw_text', text: 'Header 2' },\n { type: 'raw_text', text: 'Header 3' }\n ],\n [\n { type: 'raw_text', text: 'Row 1, A' },\n { type: 'raw_text', text: 'Row 1, B' },\n { type: 'raw_text', text: 'Row 1, C' }\n ],\n [\n { type: 'raw_text', text: 'Row 2, A' },\n { type: 'raw_text', text: 'Row 2, B' },\n { type: 'raw_text', text: 'Row 2, C' }\n ]\n ]\n })\n }\n ]\n }\n] as const;\n\n/**\n * Lookup table mapping a variant id back to its definition. Used by the\n * DnD drop handler to resolve a `palette:${id}` drag back to a factory.\n */\nexport const VARIANT_BY_ID: ReadonlyMap<string, PaletteVariant> = new Map(\n PALETTE_SECTIONS.flatMap((section) => section.variants.map((v) => [v.id, v] as const))\n);\n\n/**\n * Human-readable label for a supported block type. Used in the per-block\n * popover editor heading.\n * @param type - the block type\n * @returns a short label (e.g. \"Section\")\n */\nexport function labelForBlockType(type: SupportedBlockType): string {\n switch (type) {\n case 'section':\n return 'Section';\n case 'header':\n return 'Header';\n case 'divider':\n return 'Divider';\n case 'context':\n return 'Context';\n case 'actions':\n return 'Buttons';\n case 'image':\n return 'Image';\n case 'markdown':\n return 'Markdown';\n case 'table':\n return 'Table';\n case 'rich_text':\n return 'Rich Text';\n case 'alert':\n return 'Alert';\n case 'card':\n return 'Card';\n case 'carousel':\n return 'Carousel';\n case 'context_actions':\n return 'Context Actions';\n case 'input':\n return 'Input';\n }\n}\n","import { type ClassValue, clsx } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\n/**\n * Merge Tailwind class names, deduplicating conflicts.\n * @param inputs - class name fragments\n * @returns merged class string\n */\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n","import * as TooltipPrimitive from '@radix-ui/react-tooltip';\nimport * as React from 'react';\nimport { cn } from '../cn';\n\nconst TooltipProvider = TooltipPrimitive.Provider;\nconst Tooltip = TooltipPrimitive.Root;\nconst TooltipTrigger = TooltipPrimitive.Trigger;\n\nconst TooltipContent = React.forwardRef<\n React.ElementRef<typeof TooltipPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>\n>(({ className, sideOffset = 6, ...props }, ref) => (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n 'z-50 max-w-xs overflow-hidden rounded-md border bg-popover px-2 py-1.5 text-xs text-popover-foreground shadow-md',\n 'data-[state=delayed-open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=delayed-open]:fade-in-0',\n className\n )}\n {...props}\n />\n </TooltipPrimitive.Portal>\n));\nTooltipContent.displayName = TooltipPrimitive.Content.displayName;\n\nexport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger };\n","import { nanoid } from 'nanoid';\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport type { BuilderBlock, SupportedBlock } from '../types';\n\n/**\n * Wraps a Slack block payload in a {@link BuilderBlock} with a fresh client id.\n * @param block - the underlying Slack block payload\n * @returns a builder-side block with id\n */\nfunction wrap(block: SupportedBlock): BuilderBlock {\n return { id: nanoid(8), block };\n}\n\n/**\n * Reactive state for the builder's working draft.\n *\n * - `blocks`: ordered list of {@link BuilderBlock} (id + payload).\n * - Mutators (`addBlock`, `removeBlock`, etc.) operate on ids, not indices.\n * - On any change, calls the optional `onChange` with the unwrapped Slack\n * payloads so the consumer can persist (URL, localStorage, etc).\n * @param params - hook params\n * @param params.initialBlocks - starting payloads\n * @param params.onChange - notified on any state change with Slack payloads\n * @returns state slice + mutators\n */\nexport function useBlockKitBuilderState({\n initialBlocks,\n onChange\n}: {\n initialBlocks?: SupportedBlock[];\n onChange?: (blocks: SupportedBlock[]) => void;\n} = {}) {\n const [blocks, setBlocks] = useState<BuilderBlock[]>(() => (initialBlocks ?? []).map(wrap));\n\n const onChangeRef = useRef(onChange);\n useEffect(() => {\n onChangeRef.current = onChange;\n }, [onChange]);\n\n const isFirstRunRef = useRef(true);\n useEffect(() => {\n if (isFirstRunRef.current) {\n isFirstRunRef.current = false;\n return;\n }\n onChangeRef.current?.(blocks.map((b) => b.block));\n }, [blocks]);\n\n const addBlock = useCallback((block: SupportedBlock, atIndex?: number) => {\n setBlocks((prev) => {\n const next = [...prev];\n const inserted = wrap(block);\n const idx = atIndex === undefined ? next.length : Math.max(0, Math.min(atIndex, next.length));\n next.splice(idx, 0, inserted);\n return next;\n });\n }, []);\n\n const updateBlock = useCallback((id: string, block: SupportedBlock) => {\n setBlocks((prev) => prev.map((b) => (b.id === id ? { ...b, block } : b)));\n }, []);\n\n const removeBlock = useCallback((id: string) => {\n setBlocks((prev) => prev.filter((b) => b.id !== id));\n }, []);\n\n const duplicateBlock = useCallback((id: string) => {\n setBlocks((prev) => {\n const idx = prev.findIndex((b) => b.id === id);\n if (idx === -1) {\n return prev;\n }\n const source = prev[idx];\n const next = [...prev];\n next.splice(idx + 1, 0, wrap(structuredClone(source.block)));\n return next;\n });\n }, []);\n\n const reorderBlock = useCallback((fromId: string, toIndex: number) => {\n setBlocks((prev) => {\n const fromIndex = prev.findIndex((b) => b.id === fromId);\n if (fromIndex === -1) {\n return prev;\n }\n const next = [...prev];\n const [moved] = next.splice(fromIndex, 1);\n const clamped = Math.max(0, Math.min(toIndex, next.length));\n next.splice(clamped, 0, moved);\n return next;\n });\n }, []);\n\n const replaceAll = useCallback((newBlocks: SupportedBlock[]) => {\n setBlocks(newBlocks.map(wrap));\n }, []);\n\n return {\n blocks,\n addBlock,\n updateBlock,\n removeBlock,\n duplicateBlock,\n reorderBlock,\n replaceAll\n };\n}\n","import type { Surface } from '@tightknitai/slack-block-kit-validator';\nimport type { BuilderBlock, PreviewSurface } from '../types';\n\n/**\n * Result of grouping a flat validator error list into builder buckets.\n */\nexport interface GroupedErrors {\n /** All errors keyed by builder block id. Buckets without errors are absent. */\n byBlockId: Map<string, string[]>;\n /** Errors that don't map to a specific block (root-level, cross-block, etc). */\n general: string[];\n /** Total count across both buckets. */\n total: number;\n}\n\n/**\n * Maps the builder's {@link PreviewSurface} (which uses `app_home`) to the\n * validator's {@link Surface} (which uses `home`).\n * @param surface - the builder's surface value\n * @returns the validator-compatible surface\n */\nexport function toValidatorSurface(surface: PreviewSurface): Surface {\n return surface === 'app_home' ? 'home' : surface;\n}\n\n/**\n * Returns the leading `/N/...` path segment from a JSON-pointer-style\n * instance path as a numeric block index, or null if the path doesn't\n * start with one.\n * @param path - a JSON-pointer style path from the validator\n * @returns the index, or null when the path is general or malformed\n */\nfunction extractBlockIndex(path: string): number | null {\n if (!path || path === '(root)') {\n return null;\n }\n const match = /^\\/(\\d+)(?:\\/|$)/.exec(path);\n if (!match) {\n return null;\n }\n return Number.parseInt(match[1], 10);\n}\n\n/**\n * Strips the leading `/N` segment from an instance path so the message\n * shown next to a block doesn't redundantly repeat the block index.\n * @param path - the original instance path\n * @returns the path without the leading `/N` segment\n */\nfunction stripBlockPrefix(path: string): string {\n return path.replace(/^\\/\\d+/, '') || '(root)';\n}\n\n/**\n * Splits a flat array of validator error strings (each in the form\n * \"<instancePath> <message>\") into per-block buckets keyed by the\n * matching {@link BuilderBlock.id}, plus a general bucket for anything\n * not tied to a single block.\n * @param errors - flat error list from `validateBlockKit`\n * @param blocks - the builder blocks in the same order as the validated payload\n * @returns the grouped error buckets\n */\nexport function groupValidatorErrors(errors: readonly string[], blocks: readonly BuilderBlock[]): GroupedErrors {\n const byBlockId = new Map<string, string[]>();\n const general: string[] = [];\n\n for (const raw of errors) {\n // Validator emits \"<path> <message>\". Path may be \"(root)\" or \"/0/...\" etc.\n const space = raw.indexOf(' ');\n const path = space === -1 ? '(root)' : raw.slice(0, space);\n const message = space === -1 ? raw : raw.slice(space + 1);\n\n const idx = extractBlockIndex(path);\n if (idx === null || idx >= blocks.length) {\n general.push(raw);\n continue;\n }\n\n const id = blocks[idx].id;\n const friendly = formatMessage(stripBlockPrefix(path), message);\n const bucket = byBlockId.get(id) ?? [];\n bucket.push(friendly);\n byBlockId.set(id, bucket);\n }\n\n return { byBlockId, general, total: errors.length };\n}\n\n/**\n * Lightly humanizes a validator message by prepending the relative path\n * when it adds useful context.\n * @param relativePath - the path within a block\n * @param message - the validator's message\n * @returns a single-line user-facing message\n */\nfunction formatMessage(relativePath: string, message: string): string {\n if (relativePath === '' || relativePath === '(root)') {\n return message;\n }\n return `${relativePath}: ${message}`;\n}\n","import type { SupportedBlock } from '../types';\n\n/**\n * Strip builder-only fields from blocks so they conform to Slack's\n * Block Kit schema. Currently removes the cosmetic `level` field from\n * header blocks, which is a builder-only extension that the validator\n * (and Slack's API) would otherwise reject.\n * @param blocks - the working draft blocks\n * @returns blocks with builder-only fields removed\n */\nexport function toSlackBlocks(blocks: SupportedBlock[]): SupportedBlock[] {\n return blocks.map((block) => {\n if (block.type === 'header' && 'level' in block) {\n const { level: _omit, ...rest } = block;\n return rest;\n }\n return block;\n });\n}\n","import { validateBlockKit } from '@tightknitai/slack-block-kit-validator';\nimport { useEffect, useState } from 'react';\nimport { type GroupedErrors, groupValidatorErrors, toValidatorSurface } from '../lib/error-grouping';\nimport { toSlackBlocks } from '../lib/to-slack-blocks';\nimport type { BuilderBlock, PreviewSurface } from '../types';\n\n/**\n * Debounce delay between the latest edit and the next validation pass.\n * Short enough to feel live; long enough to avoid running the AJV\n * compiled validator on every keystroke.\n */\nconst DEBOUNCE_MS = 150;\n\n/**\n * Result returned by {@link useBlockKitValidation}.\n */\nexport interface ValidationState extends GroupedErrors {\n /** True iff there are zero errors after the most recent run. */\n valid: boolean;\n}\n\n/**\n * Continuously validates the working draft against\n * {@link validateBlockKit}, scoped to the current preview surface.\n * Debounced so rapid edits don't thrash the AJV compiled validator.\n *\n * @param blocks - current builder blocks (id + payload)\n * @param surface - the preview surface (drives surface-compatibility checks)\n * @returns the current validation state, grouped by block id\n */\nexport function useBlockKitValidation(blocks: BuilderBlock[], surface: PreviewSurface): ValidationState {\n const [state, setState] = useState<ValidationState>(() => ({\n valid: true,\n byBlockId: new Map(),\n general: [],\n total: 0\n }));\n\n useEffect(() => {\n const handle = setTimeout(() => {\n const payload = toSlackBlocks(blocks.map((b) => b.block));\n const result = validateBlockKit(payload, {\n target: 'blocks',\n surface: toValidatorSurface(surface)\n });\n const grouped = groupValidatorErrors(result.errors, blocks);\n setState({\n valid: result.valid,\n byBlockId: grouped.byBlockId,\n general: grouped.general,\n total: grouped.total\n });\n }, DEBOUNCE_MS);\n return () => clearTimeout(handle);\n }, [blocks, surface]);\n\n return state;\n}\n","import * as DialogPrimitive from '@radix-ui/react-dialog';\nimport { X } from 'lucide-react';\nimport * as React from 'react';\nimport { cn } from '../cn';\n\nconst Sheet = DialogPrimitive.Root;\nconst SheetTrigger = DialogPrimitive.Trigger;\nconst SheetClose = DialogPrimitive.Close;\n\nconst SheetOverlay = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Overlay\n ref={ref}\n className={cn(\n 'fixed inset-0 z-50 bg-black/50 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0',\n className\n )}\n {...props}\n />\n));\nSheetOverlay.displayName = DialogPrimitive.Overlay.displayName;\n\nconst SheetContent = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>\n>(({ className, children, ...props }, ref) => (\n <DialogPrimitive.Portal>\n <SheetOverlay />\n <DialogPrimitive.Content\n ref={ref}\n className={cn(\n 'fixed inset-y-0 right-0 z-50 flex h-full w-full max-w-md flex-col gap-4 border-l bg-background p-6 shadow-lg transition ease-in-out data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right',\n className\n )}\n {...props}\n >\n {children}\n <DialogPrimitive.Close className=\"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none\">\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n </DialogPrimitive.Content>\n </DialogPrimitive.Portal>\n));\nSheetContent.displayName = DialogPrimitive.Content.displayName;\n\nconst SheetTitle = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title ref={ref} className={cn('text-lg font-semibold text-foreground', className)} {...props} />\n));\nSheetTitle.displayName = DialogPrimitive.Title.displayName;\n\nconst SheetDescription = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description ref={ref} className={cn('text-sm text-muted-foreground', className)} {...props} />\n));\nSheetDescription.displayName = DialogPrimitive.Description.displayName;\n\nexport { Sheet, SheetClose, SheetContent, SheetDescription, SheetTitle, SheetTrigger };\n","import { AlertTriangle, CheckCircle2 } from 'lucide-react';\nimport { labelForBlockType } from '../lib/default-blocks';\nimport { Sheet, SheetContent, SheetDescription, SheetTitle } from '../lib/ui/sheet';\nimport type { ValidationState } from '../state/use-block-kit-validation';\nimport type { BuilderBlock, SupportedBlockType } from '../types';\n\n/**\n * Side panel listing every validation error for the current draft,\n * grouped by block (and a \"General\" bucket for cross-block / root issues).\n * Clicking an entry asks the parent to focus + open the matching block's\n * popover editor.\n * @param props - sheet props\n * @param props.open - whether the sheet is open\n * @param props.onOpenChange - notified when the user closes the sheet\n * @param props.blocks - current builder blocks (used to label entries)\n * @param props.validation - validation state from {@link useBlockKitValidation}\n * @param props.onJumpToBlock - called when the user clicks a block entry\n * @returns the rendered issues sheet\n */\nexport function IssuesSheet({\n open,\n onOpenChange,\n blocks,\n validation,\n onJumpToBlock\n}: {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n blocks: BuilderBlock[];\n validation: ValidationState;\n onJumpToBlock?: (id: string) => void;\n}) {\n const blockEntries = blocks\n .map((block, idx) => {\n const errors = validation.byBlockId.get(block.id);\n if (!errors || errors.length === 0) {\n return null;\n }\n return { block, idx, errors };\n })\n .filter(Boolean) as {\n block: BuilderBlock;\n idx: number;\n errors: string[];\n }[];\n\n return (\n <Sheet open={open} onOpenChange={onOpenChange}>\n <SheetContent className=\"flex flex-col gap-3 sm:max-w-md\">\n <div className=\"flex flex-col gap-1\">\n <SheetTitle className=\"flex items-center gap-2\">\n {validation.total === 0 ? (\n <CheckCircle2 className=\"h-4 w-4 text-emerald-600\" />\n ) : (\n <AlertTriangle className=\"h-4 w-4 text-destructive\" />\n )}\n {validation.total === 0\n ? 'No issues'\n : `${validation.total} ${validation.total === 1 ? 'issue' : 'issues'}`}\n </SheetTitle>\n <SheetDescription>Validation runs against the chosen Slack surface as you edit.</SheetDescription>\n </div>\n\n <div className=\"flex flex-1 flex-col gap-3 overflow-y-auto pr-1\">\n {validation.total === 0 ? (\n <p className=\"text-xs text-muted-foreground\">Your draft is valid for the current surface.</p>\n ) : null}\n\n {validation.general.length > 0 ? (\n <div className=\"flex flex-col gap-1.5\">\n <p className=\"text-xs font-semibold uppercase tracking-wide text-muted-foreground\">General</p>\n <ul className=\"flex flex-col gap-1 rounded-md border border-destructive/30 bg-destructive/5 p-2 text-xs text-destructive\">\n {validation.general.map((err) => (\n <li key={err}>{err}</li>\n ))}\n </ul>\n </div>\n ) : null}\n\n {blockEntries.map(({ block, idx, errors }) => {\n const label = labelForBlockType(block.block.type as SupportedBlockType);\n return (\n <div key={block.id} className=\"flex flex-col gap-1.5\">\n <button\n type=\"button\"\n onClick={() => {\n onJumpToBlock?.(block.id);\n onOpenChange(false);\n }}\n className=\"flex items-center justify-between rounded-md border bg-muted/30 px-2 py-1.5 text-left text-xs font-medium text-foreground hover:border-primary/40 hover:bg-accent\"\n >\n <span>\n Block {idx + 1}: {label}\n </span>\n <span className=\"text-[11px] text-muted-foreground\">{errors.length}</span>\n </button>\n <ul className=\"flex flex-col gap-1 rounded-md border border-destructive/30 bg-destructive/5 p-2 text-xs text-destructive\">\n {errors.map((err, i) => (\n <li key={i}>{err}</li>\n ))}\n </ul>\n </div>\n );\n })}\n </div>\n </SheetContent>\n </Sheet>\n );\n}\n","import { validateBlockKit } from '@tightknitai/slack-block-kit-validator';\nimport { useEffect, useMemo, useRef, useState } from 'react';\nimport { Sheet, SheetContent, SheetDescription, SheetTitle } from '../lib/ui/sheet';\nimport type { SupportedBlock } from '../types';\n\n/**\n * Side drawer that exposes the current draft as raw JSON in a full-height\n * code-editor-style textarea. Edits flow live: every valid parse updates\n * the preview immediately; parse and validation errors are shown inline\n * without stomping the in-progress text.\n *\n * A left-side gutter renders line numbers in sync with the textarea's\n * vertical scroll. The gutter's scrollTop tracks the textarea's so long\n * lists of blocks stay aligned.\n *\n * When the drawer opens, the textarea initializes from the current blocks.\n * While it's open, the textarea is the source of truth; external edits via\n * popover do not override mid-typed JSON.\n * @param props - drawer props\n * @param props.open - whether the drawer is open\n * @param props.onOpenChange - notified when the user closes the drawer\n * @param props.blocks - current draft blocks (used to seed the textarea on open)\n * @param props.onApply - called on every valid parse; updates the preview\n * @returns the rendered JSON drawer\n */\nexport function JsonDrawer({\n open,\n onOpenChange,\n blocks,\n onApply\n}: {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n blocks: SupportedBlock[];\n onApply: (blocks: SupportedBlock[]) => void;\n}) {\n const [value, setValue] = useState<string>('');\n const [parseError, setParseError] = useState<string | null>(null);\n const [validationErrors, setValidationErrors] = useState<string[]>([]);\n\n const textareaRef = useRef<HTMLTextAreaElement | null>(null);\n const gutterRef = useRef<HTMLDivElement | null>(null);\n\n // Hold the latest blocks in a ref so the open-seed effect can read them\n // without listing them as a dependency. While the drawer is open the\n // textarea is the source of truth; external edits must not stomp typing.\n const blocksRef = useRef(blocks);\n useEffect(() => {\n blocksRef.current = blocks;\n });\n\n useEffect(() => {\n if (open) {\n setValue(JSON.stringify(blocksRef.current, null, 2));\n setParseError(null);\n setValidationErrors([]);\n }\n }, [open]);\n\n const handleChange = (next: string) => {\n setValue(next);\n let parsed: unknown;\n try {\n parsed = JSON.parse(next);\n } catch (e) {\n setParseError(e instanceof Error ? e.message : 'Invalid JSON');\n setValidationErrors([]);\n return;\n }\n if (!Array.isArray(parsed)) {\n setParseError('Top-level value must be an array of blocks.');\n setValidationErrors([]);\n return;\n }\n setParseError(null);\n onApply(parsed as SupportedBlock[]);\n const result = validateBlockKit(parsed, {\n target: 'blocks',\n surface: 'message'\n });\n setValidationErrors(result.valid ? [] : result.errors);\n };\n\n const lineCount = useMemo(() => {\n if (!value) {\n return 1;\n }\n let n = 1;\n for (let i = 0; i < value.length; i++) {\n if (value.charCodeAt(i) === 10) {\n n++;\n }\n }\n return n;\n }, [value]);\n\n return (\n <Sheet open={open} onOpenChange={onOpenChange}>\n <SheetContent className=\"flex flex-col gap-3 sm:max-w-xl\">\n <div className=\"flex flex-col gap-1\">\n <SheetTitle>Block Kit JSON</SheetTitle>\n <SheetDescription>Edits update the preview as you type. Parse errors show below.</SheetDescription>\n </div>\n <div className=\"flex flex-1 overflow-hidden rounded-md border border-input bg-muted/30 shadow-sm focus-within:ring-1 focus-within:ring-ring\">\n <div\n ref={gutterRef}\n aria-hidden=\"true\"\n className=\"select-none overflow-hidden border-r border-input bg-muted/40 py-3 pr-2 pl-3 text-right font-mono text-xs leading-relaxed text-muted-foreground\"\n >\n {Array.from({ length: lineCount }, (_, i) => (\n <div key={i}>{i + 1}</div>\n ))}\n </div>\n <textarea\n ref={textareaRef}\n value={value}\n onChange={(e) => handleChange(e.target.value)}\n onScroll={(e) => {\n if (gutterRef.current) {\n gutterRef.current.scrollTop = e.currentTarget.scrollTop;\n }\n }}\n spellCheck={false}\n className=\"flex-1 resize-none border-0 bg-transparent p-3 font-mono text-xs leading-relaxed text-foreground outline-none\"\n />\n </div>\n {(parseError || validationErrors.length > 0) && (\n <div className=\"shrink-0 space-y-1.5 rounded-md border border-destructive/30 bg-destructive/5 p-2 text-xs\">\n {parseError && <p className=\"font-medium text-destructive\">{parseError}</p>}\n {validationErrors.length > 0 && (\n <ul className=\"list-disc space-y-0.5 pl-4 text-destructive/80\">\n {validationErrors.slice(0, 6).map((err, i) => (\n <li key={i}>{err}</li>\n ))}\n {validationErrors.length > 6 && <li>and {validationErrors.length - 6} more</li>}\n </ul>\n )}\n </div>\n )}\n </SheetContent>\n </Sheet>\n );\n}\n","import { useDraggable } from '@dnd-kit/core';\nimport {\n AlertTriangle,\n AlignLeft,\n ChevronRight,\n CreditCard,\n FileText,\n GalleryHorizontal,\n GripVertical,\n Heading1,\n Image as ImageIcon,\n Info,\n MessageSquareMore,\n Minus,\n MousePointerClick,\n Pilcrow,\n Table as TableIcon,\n TextCursorInput\n} from 'lucide-react';\nimport type { ComponentType, SVGProps } from 'react';\nimport { cn } from '../lib/cn';\nimport { PALETTE_SECTIONS, type PaletteVariant } from '../lib/default-blocks';\nimport type { SupportedBlock, SupportedBlockType } from '../types';\n\nconst SECTION_ICONS: Record<SupportedBlockType, ComponentType<SVGProps<SVGSVGElement>>> = {\n section: AlignLeft,\n header: Heading1,\n divider: Minus,\n context: Info,\n actions: MousePointerClick,\n image: ImageIcon,\n markdown: FileText,\n rich_text: Pilcrow,\n table: TableIcon,\n alert: AlertTriangle,\n card: CreditCard,\n carousel: GalleryHorizontal,\n context_actions: MessageSquareMore,\n input: TextCursorInput\n};\n\n/**\n * The DnD draggable id format for palette items, e.g. `palette:section_mrkdwn`.\n * The drop target parses the prefix to know \"this is a new block being added\"\n * and then resolves the suffix to the appropriate variant factory.\n */\nexport const PALETTE_DRAG_PREFIX = 'palette:';\n\n/**\n * Checks whether a DnD draggable id refers to a palette item, returning\n * the variant id when it does.\n * @param id - the draggable id from a DnD event\n * @returns the variant id if the drag started in the palette, else null\n */\nexport function parsePaletteDragId(id: string | number): string | null {\n if (typeof id !== 'string' || !id.startsWith(PALETTE_DRAG_PREFIX)) {\n return null;\n }\n return id.slice(PALETTE_DRAG_PREFIX.length);\n}\n\n/**\n * The left-side palette of available block variants, organized into\n * sections that mirror Slack's real Block Kit Builder (\"Section\", \"Header\",\n * \"Divider\", \"Image\", \"Context\", \"Actions\"). Each variant is a draggable\n * preset that inserts a default-shaped block when dropped on the surface.\n * @param props - palette props\n * @param props.onAddBlock - called when a palette item is added via its\n * chevron button (appends the block to the bottom of the preview)\n * @returns the rendered palette aside\n */\nexport function Palette({ onAddBlock }: { onAddBlock: (block: SupportedBlock) => void }) {\n return (\n <aside className=\"flex min-h-0 w-60 shrink-0 flex-col overflow-y-auto border-r bg-muted/20 p-3\">\n {PALETTE_SECTIONS.map((section) => {\n const Icon = SECTION_ICONS[section.blockType];\n return (\n <div key={section.name} className=\"mt-4 flex flex-col first:mt-0\">\n <div className=\"flex items-center gap-1.5 px-1 pb-1.5\">\n <Icon className=\"h-3.5 w-3.5 text-muted-foreground\" />\n <span className=\"text-xs font-semibold text-foreground\">{section.name}</span>\n </div>\n {section.variants.map((variant) => (\n <PaletteItem key={variant.id} variant={variant} onAdd={() => onAddBlock(variant.factory())} />\n ))}\n </div>\n );\n })}\n </aside>\n );\n}\n\n/**\n * One draggable palette row. Hover surfaces a chevron button that\n * appends the variant's block to the preview without dragging.\n * @param props - item props\n * @param props.variant - the block variant this row represents\n * @param props.onAdd - called when the chevron button is clicked\n * @returns the rendered palette row\n */\nfunction PaletteItem({ variant, onAdd }: { variant: PaletteVariant; onAdd: () => void }) {\n const { attributes, listeners, setNodeRef, isDragging } = useDraggable({\n id: `${PALETTE_DRAG_PREFIX}${variant.id}`\n });\n\n return (\n <div\n ref={setNodeRef}\n className={cn(\n 'group flex cursor-grab items-center gap-2 rounded px-2 py-1.5 text-sm text-muted-foreground transition-colors hover:bg-accent hover:text-foreground active:cursor-grabbing',\n isDragging && 'opacity-50'\n )}\n {...attributes}\n {...listeners}\n >\n <GripVertical className=\"h-3.5 w-3.5 shrink-0\" />\n <span className=\"truncate\">{variant.label}</span>\n <button\n type=\"button\"\n aria-label={`Add ${variant.label} to preview`}\n onClick={onAdd}\n onPointerDown={(e) => e.stopPropagation()}\n className=\"ml-auto flex h-5 w-5 shrink-0 cursor-pointer items-center justify-center rounded border border-transparent text-muted-foreground opacity-0 transition-opacity hover:border-border hover:bg-background hover:text-foreground group-hover:opacity-100\"\n >\n <ChevronRight className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n );\n}\n","import { Slot } from '@radix-ui/react-slot';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport * as React from 'react';\nimport { cn } from '../cn';\n\nconst buttonVariants = cva(\n 'inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium cursor-pointer transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0',\n {\n variants: {\n variant: {\n default: 'bg-primary text-primary-foreground shadow hover:bg-primary/90',\n destructive: 'bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90',\n outline: 'border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground',\n secondary: 'bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80',\n ghost: 'hover:bg-accent hover:text-accent-foreground',\n link: 'text-primary underline-offset-4 hover:underline'\n },\n size: {\n default: 'h-9 px-4 py-2',\n sm: 'h-8 rounded-md px-3 text-xs',\n lg: 'h-10 rounded-md px-8',\n icon: 'h-9 w-9'\n }\n },\n defaultVariants: {\n variant: 'default',\n size: 'default'\n }\n }\n);\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean;\n}\n\nexport const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : 'button';\n return <Comp className={cn(buttonVariants({ variant, size, className }))} ref={ref} {...props} />;\n }\n);\nButton.displayName = 'Button';\n\nexport { buttonVariants };\n","import * as DialogPrimitive from '@radix-ui/react-dialog';\nimport { X } from 'lucide-react';\nimport * as React from 'react';\nimport { cn } from '../cn';\n\nconst Dialog = DialogPrimitive.Root;\nconst DialogTrigger = DialogPrimitive.Trigger;\nconst DialogPortal = DialogPrimitive.Portal;\nconst DialogClose = DialogPrimitive.Close;\n\nconst DialogOverlay = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Overlay\n ref={ref}\n className={cn(\n 'fixed inset-0 z-50 bg-black/50 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0',\n className\n )}\n {...props}\n />\n));\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName;\n\nconst DialogContent = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>\n>(({ className, children, ...props }, ref) => (\n <DialogPortal>\n <DialogOverlay />\n <DialogPrimitive.Content\n ref={ref}\n className={cn(\n 'fixed left-1/2 top-1/2 z-50 grid w-full max-w-lg -translate-x-1/2 -translate-y-1/2 gap-4 border bg-background p-6 shadow-lg duration-200 sm:rounded-lg',\n className\n )}\n {...props}\n >\n {children}\n <DialogPrimitive.Close className=\"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-1 focus:ring-ring\">\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n </DialogPrimitive.Content>\n </DialogPortal>\n));\nDialogContent.displayName = DialogPrimitive.Content.displayName;\n\n/**\n * Layout wrapper for the title and description at the top of a dialog.\n * @param props - standard div props plus optional className\n * @param props.className - extra classes merged with the header defaults\n * @returns the rendered dialog header div\n */\nfunction DialogHeader({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n return <div className={cn('flex flex-col space-y-1.5 text-center sm:text-left', className)} {...props} />;\n}\n\n/**\n * Layout wrapper for action buttons at the bottom of a dialog.\n * @param props - standard div props plus optional className\n * @param props.className - extra classes merged with the footer defaults\n * @returns the rendered dialog footer div\n */\nfunction DialogFooter({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n return <div className={cn('flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2', className)} {...props} />;\n}\n\nconst DialogTitle = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title\n ref={ref}\n className={cn('text-lg font-semibold leading-none tracking-tight', className)}\n {...props}\n />\n));\nDialogTitle.displayName = DialogPrimitive.Title.displayName;\n\nconst DialogDescription = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description ref={ref} className={cn('text-sm text-muted-foreground', className)} {...props} />\n));\nDialogDescription.displayName = DialogPrimitive.Description.displayName;\n\nexport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n DialogTrigger\n};\n","import * as LabelPrimitive from '@radix-ui/react-label';\nimport * as React from 'react';\nimport { cn } from '../cn';\n\nexport const Label = React.forwardRef<\n React.ElementRef<typeof LabelPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <LabelPrimitive.Root\n ref={ref}\n className={cn('text-sm font-medium leading-none text-foreground', className)}\n {...props}\n />\n));\nLabel.displayName = LabelPrimitive.Root.displayName;\n","import { AlertTriangle, ExternalLink } from 'lucide-react';\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { toSlackBlocks } from '../lib/to-slack-blocks';\nimport { Button } from '../lib/ui/button';\nimport { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle } from '../lib/ui/dialog';\nimport { Label } from '../lib/ui/label';\nimport type { ChannelOption, SendAsUserStatus, SendPayload, SupportedBlock } from '../types';\n\ntype SendStatus = { kind: 'idle' } | { kind: 'sending' } | { kind: 'success' } | { kind: 'error'; error: string };\n\n/**\n * Modal dialog that collects the destination channel + send-as identity,\n * then calls the consumer's `onSend`.\n *\n * Channels and user-token status are loaded async via callback props on open.\n * The consumer brokers all I/O; the dialog never makes a network call.\n * @param props - dialog props\n * @param props.open - whether the dialog is open\n * @param props.onOpenChange - notified when the user closes the dialog\n * @param props.blocks - the draft blocks to send\n * @param props.loadChannels - returns channels available to send to\n * @param props.loadSendAsUserStatus - returns user-token status + OAuth URL\n * @param props.onSend - terminal action; should return `{ ok }` or `{ ok: false, error }`\n * @param props.errorCount - total validation errors against the current draft\n * @param props.onShowIssues - called when the user opens the global issues panel\n * @returns the rendered send dialog\n */\nexport function SendDialog({\n open,\n onOpenChange,\n blocks,\n loadChannels,\n loadSendAsUserStatus,\n onSend,\n errorCount,\n onShowIssues\n}: {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n blocks: SupportedBlock[];\n loadChannels: () => Promise<ChannelOption[]>;\n loadSendAsUserStatus: () => Promise<SendAsUserStatus>;\n onSend: (payload: SendPayload) => Promise<{ ok: boolean; error?: string }>;\n /** Total validation errors against the current draft. */\n errorCount: number;\n /** Asks the parent to open the global issues panel. */\n onShowIssues?: () => void;\n}) {\n const [channels, setChannels] = useState<ChannelOption[] | null>(null);\n const [channelsError, setChannelsError] = useState<string | null>(null);\n const [channelId, setChannelId] = useState<string>('');\n const [userStatus, setUserStatus] = useState<SendAsUserStatus | null>(null);\n const [sendAs, setSendAs] = useState<'bot' | 'user'>('bot');\n const [status, setStatus] = useState<SendStatus>({ kind: 'idle' });\n\n // Hold the latest callback props in refs so the effects below can depend\n // only on `open` without retriggering when the consumer passes a fresh\n // arrow function each render.\n const loadChannelsRef = useRef(loadChannels);\n const loadSendAsUserStatusRef = useRef(loadSendAsUserStatus);\n useEffect(() => {\n loadChannelsRef.current = loadChannels;\n loadSendAsUserStatusRef.current = loadSendAsUserStatus;\n });\n\n const refreshSendAsUser = useCallback(() => {\n loadSendAsUserStatusRef\n .current()\n .then(setUserStatus)\n .catch(() => setUserStatus({ canSendAsUser: false }));\n }, []);\n\n useEffect(() => {\n if (!open) {\n return;\n }\n setStatus({ kind: 'idle' });\n setChannels(null);\n setChannelsError(null);\n setUserStatus(null);\n setChannelId('');\n setSendAs('bot');\n let cancelled = false;\n loadChannelsRef\n .current()\n .then((list) => {\n if (cancelled) {\n return;\n }\n setChannels(list);\n setChannelId(list[0]?.id ?? '');\n })\n .catch((e) => {\n if (cancelled) {\n return;\n }\n setChannelsError(e instanceof Error ? e.message : 'Failed to load channels');\n });\n refreshSendAsUser();\n return () => {\n cancelled = true;\n };\n }, [open, refreshSendAsUser]);\n\n // Refresh user-token status when the window regains focus, so a completed\n // OAuth round-trip flips the option from disabled to enabled without\n // a manual reload.\n useEffect(() => {\n if (!open) {\n return;\n }\n const handler = () => refreshSendAsUser();\n window.addEventListener('focus', handler);\n return () => window.removeEventListener('focus', handler);\n }, [open, refreshSendAsUser]);\n\n const handleSubmit = async () => {\n if (!channelId) {\n setStatus({ kind: 'error', error: 'Please pick a channel.' });\n return;\n }\n setStatus({ kind: 'sending' });\n try {\n const result = await onSend({\n channelId,\n blocks: toSlackBlocks(blocks),\n sendAsUser: sendAs === 'user'\n });\n if (result.ok) {\n setStatus({ kind: 'idle' });\n onOpenChange(false);\n return;\n } else {\n setStatus({\n kind: 'error',\n error: result.error ?? 'Send failed.'\n });\n }\n } catch (e) {\n setStatus({\n kind: 'error',\n error: e instanceof Error ? e.message : 'Send failed.'\n });\n }\n };\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Send to Slack</DialogTitle>\n <DialogDescription>Pick a channel and choose who to post as.</DialogDescription>\n </DialogHeader>\n\n <div className=\"flex flex-col gap-4\">\n <div className=\"flex flex-col gap-1.5\">\n <Label htmlFor=\"channel-picker\">Channel</Label>\n {channels === null && !channelsError && <p className=\"text-xs text-muted-foreground\">Loading channels…</p>}\n {channelsError && <p className=\"text-xs text-destructive\">{channelsError}</p>}\n {channels && channels.length === 0 && (\n <p className=\"text-xs text-muted-foreground\">No public channels available.</p>\n )}\n {channels && channels.length > 0 && (\n <select\n id=\"channel-picker\"\n value={channelId}\n onChange={(e) => setChannelId(e.target.value)}\n className=\"flex h-9 w-full rounded-md border border-input bg-background px-3 py-1 text-sm shadow-sm focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\"\n >\n {channels.map((c) => (\n <option key={c.id} value={c.id}>\n #{c.name}\n </option>\n ))}\n </select>\n )}\n </div>\n\n <div className=\"flex flex-col gap-1.5\">\n <Label htmlFor=\"send-as-picker\">Post as</Label>\n <select\n id=\"send-as-picker\"\n value={sendAs}\n onChange={(e) => setSendAs(e.target.value as 'bot' | 'user')}\n className=\"flex h-9 w-full rounded-md border border-input bg-background px-3 py-1 text-sm shadow-sm focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\"\n >\n <option value=\"bot\">App bot</option>\n <option value=\"user\" disabled={!userStatus?.canSendAsUser}>\n Your account\n {userStatus && !userStatus.canSendAsUser ? ' (Slack sign-in required)' : ''}\n </option>\n </select>\n {userStatus && !userStatus.canSendAsUser && userStatus.oauthUrl && (\n <p className=\"text-xs text-muted-foreground\">\n <a\n href={userStatus.oauthUrl}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"inline-flex items-center gap-1 text-primary hover:underline\"\n >\n Sign in with Slack <ExternalLink className=\"h-3 w-3\" />\n </a>{' '}\n to post as yourself.\n </p>\n )}\n </div>\n\n {errorCount > 0 ? (\n <button\n type=\"button\"\n onClick={onShowIssues}\n className=\"flex items-center gap-2 rounded-md border border-destructive/30 bg-destructive/5 p-2 text-left text-xs text-destructive hover:bg-destructive/10\"\n >\n <AlertTriangle className=\"h-3.5 w-3.5 shrink-0\" />\n <span className=\"flex-1\">\n Fix {errorCount} {errorCount === 1 ? 'issue' : 'issues'} before sending.\n </span>\n <span className=\"shrink-0 underline\">Show issues</span>\n </button>\n ) : null}\n\n {status.kind === 'error' && (\n <p className=\"rounded-md border border-destructive/30 bg-destructive/5 p-2 text-xs text-destructive\">\n {status.error}\n </p>\n )}\n </div>\n\n <DialogFooter>\n <Button type=\"button\" variant=\"ghost\" onClick={() => onOpenChange(false)}>\n Cancel\n </Button>\n <Button\n type=\"button\"\n onClick={handleSubmit}\n disabled={status.kind === 'sending' || !channelId || blocks.length === 0 || errorCount > 0}\n >\n {status.kind === 'sending' ? 'Sending…' : 'Send'}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n","import * as PopoverPrimitive from '@radix-ui/react-popover';\nimport * as React from 'react';\nimport { cn } from '../cn';\n\nconst Popover = PopoverPrimitive.Root;\nconst PopoverTrigger = PopoverPrimitive.Trigger;\nconst PopoverAnchor = PopoverPrimitive.Anchor;\n\nconst PopoverContent = React.forwardRef<\n React.ElementRef<typeof PopoverPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Content>\n>(({ className, align = 'start', sideOffset = 8, collisionPadding = 16, ...props }, ref) => (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n ref={ref}\n align={align}\n sideOffset={sideOffset}\n collisionPadding={collisionPadding}\n className={cn(\n 'z-50 max-h-[var(--radix-popover-content-available-height)] w-80 overflow-y-auto rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none',\n 'data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0',\n className\n )}\n {...props}\n />\n </PopoverPrimitive.Portal>\n));\nPopoverContent.displayName = PopoverPrimitive.Content.displayName;\n\nexport { Popover, PopoverAnchor, PopoverContent, PopoverTrigger };\n","import * as React from 'react';\nimport { cn } from '../cn';\n\nexport const Input = React.forwardRef<HTMLInputElement, React.InputHTMLAttributes<HTMLInputElement>>(\n ({ className, type, ...props }, ref) => (\n <input\n type={type}\n className={cn(\n 'flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50',\n className\n )}\n ref={ref}\n {...props}\n />\n )\n);\nInput.displayName = 'Input';\n","import * as RadioGroupPrimitive from '@radix-ui/react-radio-group';\nimport { Circle } from 'lucide-react';\nimport * as React from 'react';\nimport { cn } from '../cn';\n\nexport const RadioGroup = React.forwardRef<\n React.ElementRef<typeof RadioGroupPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <RadioGroupPrimitive.Root className={cn('grid gap-2', className)} {...props} ref={ref} />\n));\nRadioGroup.displayName = RadioGroupPrimitive.Root.displayName;\n\nexport const RadioGroupItem = React.forwardRef<\n React.ElementRef<typeof RadioGroupPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Item>\n>(({ className, ...props }, ref) => (\n <RadioGroupPrimitive.Item\n ref={ref}\n className={cn(\n 'aspect-square h-4 w-4 rounded-full border border-primary text-primary shadow focus:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50',\n className\n )}\n {...props}\n >\n <RadioGroupPrimitive.Indicator className=\"flex items-center justify-center\">\n <Circle className=\"h-2 w-2 fill-primary\" />\n </RadioGroupPrimitive.Indicator>\n </RadioGroupPrimitive.Item>\n));\nRadioGroupItem.displayName = RadioGroupPrimitive.Item.displayName;\n","import type { ReactNode } from 'react';\nimport { Label } from '../../lib/ui/label';\n\n/**\n * One labeled form field with inline helper text. Used by every per-block\n * editor so the look-and-feel is consistent.\n * @param props - field props\n * @param props.label - the visible label (plain language)\n * @param props.help - one-line helper text explaining the field\n * @param props.htmlFor - id of the associated input for a11y\n * @param props.children - the input control(s)\n * @returns the rendered labeled field\n */\nexport function EditorField({\n label,\n help,\n htmlFor,\n children\n}: {\n label: string;\n help?: string;\n htmlFor?: string;\n children: ReactNode;\n}) {\n return (\n <div className=\"flex flex-col gap-1.5\">\n <Label htmlFor={htmlFor}>{label}</Label>\n {children}\n {help && <p className=\"text-[11px] leading-snug text-muted-foreground\">{help}</p>}\n </div>\n );\n}\n","import { Plus, Trash2 } from 'lucide-react';\nimport { nanoid } from 'nanoid';\nimport type { ActionsBlock, Button as SlackButton } from 'slack-web-api-client';\nimport { Button } from '../../lib/ui/button';\nimport { Input } from '../../lib/ui/input';\nimport { Label } from '../../lib/ui/label';\nimport { RadioGroup, RadioGroupItem } from '../../lib/ui/radio-group';\nimport { EditorField } from './field';\nimport type { BlockEditorProps } from './types';\n\ntype ButtonStyle = 'default' | 'primary' | 'danger';\n\n/**\n * Editor form for actions blocks. v1 supports button elements only.\n * Each button gets: label, optional URL, style (default/primary/danger).\n * @param props - editor props\n * @param props.block - the actions block to edit\n * @param props.onChange - called with the updated block payload\n * @returns the rendered actions editor form\n */\nexport function ActionsEditor({ block, onChange }: BlockEditorProps<ActionsBlock>) {\n const elements = block.elements ?? [];\n\n const updateButton = (idx: number, update: Partial<SlackButton>) => {\n const next = elements.map((el, i) => {\n if (i !== idx || el.type !== 'button') {\n return el;\n }\n return { ...el, ...update };\n });\n onChange({ ...block, elements: next });\n };\n\n const removeAt = (idx: number) => {\n const next = elements.filter((_, i) => i !== idx);\n onChange({ ...block, elements: next });\n };\n\n const addButton = () => {\n // Use a random suffix rather than `elements.length + 1` so re-adding\n // after a delete can't collide with a surviving button's action_id.\n // Slack rejects duplicate action_ids in the same view/message.\n const next = [\n ...elements,\n {\n type: 'button' as const,\n text: { type: 'plain_text' as const, text: 'Click me', emoji: true },\n action_id: `button_${nanoid(6)}`\n }\n ];\n onChange({ ...block, elements: next });\n };\n\n return (\n <div className=\"flex flex-col gap-3\">\n {elements.map((el, idx) => {\n if (el.type !== 'button') {\n return (\n <div key={idx} className=\"rounded border bg-muted/30 px-2 py-1.5 text-xs text-muted-foreground\">\n Non-button action item (not editable in v1)\n </div>\n );\n }\n const label = el.text?.text ?? '';\n const url = el.url ?? '';\n const style: ButtonStyle = el.style === 'primary' || el.style === 'danger' ? el.style : 'default';\n return (\n <div key={idx} className=\"flex flex-col gap-2 rounded-md border bg-muted/20 p-3\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-xs font-medium text-foreground\">Button {idx + 1}</span>\n <button\n type=\"button\"\n aria-label=\"Remove button\"\n onClick={() => removeAt(idx)}\n className=\"rounded p-1 text-muted-foreground hover:bg-destructive/10 hover:text-destructive\"\n >\n <Trash2 className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n <EditorField label=\"Label\" htmlFor={`btn-label-${idx}`}>\n <Input\n id={`btn-label-${idx}`}\n value={label}\n placeholder=\"e.g. Learn more\"\n onChange={(e) =>\n updateButton(idx, {\n text: {\n type: 'plain_text',\n text: e.target.value,\n emoji: true\n }\n })\n }\n />\n </EditorField>\n <EditorField\n label=\"Link URL\"\n help=\"Optional. If set, clicking the button opens this link.\"\n htmlFor={`btn-url-${idx}`}\n >\n <Input\n id={`btn-url-${idx}`}\n type=\"url\"\n value={url}\n placeholder=\"e.g. https://example.com\"\n onChange={(e) => updateButton(idx, { url: e.target.value || undefined })}\n />\n </EditorField>\n <EditorField label=\"Style\" help=\"How the button looks in Slack.\">\n <RadioGroup\n value={style}\n onValueChange={(v) => {\n const nextStyle: 'primary' | 'danger' | undefined = v === 'primary' || v === 'danger' ? v : undefined;\n updateButton(idx, { style: nextStyle });\n }}\n className=\"flex flex-row gap-3\"\n >\n {(['default', 'primary', 'danger'] as const).map((s) => (\n <div key={s} className=\"flex items-center gap-1.5\">\n <RadioGroupItem value={s} id={`btn-style-${idx}-${s}`} />\n <Label htmlFor={`btn-style-${idx}-${s}`} className=\"text-xs capitalize\">\n {s}\n </Label>\n </div>\n ))}\n </RadioGroup>\n </EditorField>\n </div>\n );\n })}\n <Button type=\"button\" size=\"sm\" onClick={addButton} className=\"self-start\">\n <Plus className=\"h-3.5 w-3.5\" /> Add button\n </Button>\n </div>\n );\n}\n","import * as React from 'react';\nimport { cn } from '../cn';\n\nexport const Textarea = React.forwardRef<HTMLTextAreaElement, React.TextareaHTMLAttributes<HTMLTextAreaElement>>(\n ({ className, ...props }, ref) => (\n <textarea\n className={cn(\n 'flex min-h-[60px] w-full rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-sm placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50',\n className\n )}\n ref={ref}\n {...props}\n />\n )\n);\nTextarea.displayName = 'Textarea';\n","import { Label } from '../../lib/ui/label';\nimport { RadioGroup, RadioGroupItem } from '../../lib/ui/radio-group';\nimport { Textarea } from '../../lib/ui/textarea';\nimport type { AlertBlock, AlertLevel } from '../../types';\nimport { EditorField } from './field';\nimport type { BlockEditorProps } from './types';\n\nconst LEVELS: readonly AlertLevel[] = ['default', 'info', 'warning', 'error', 'success'] as const;\n\n/**\n * Editor form for alert blocks. Edits the message text and severity level\n * (default / info / warning / error / success). Slack renders alert blocks\n * on modal surfaces only; the validator surfaces a surface-compatibility\n * error if used elsewhere.\n * @param props - editor props\n * @param props.block - the alert block to edit\n * @param props.onChange - called with the updated block payload\n * @returns the rendered alert editor form\n */\nexport function AlertEditor({ block, onChange }: BlockEditorProps<AlertBlock>) {\n const text = block.text?.text ?? '';\n const level: AlertLevel = block.level ?? 'default';\n\n return (\n <div className=\"flex flex-col gap-4\">\n <EditorField\n label=\"Text\"\n help=\"Supports *bold*, _italic_, ~strike~, `code`, and <url|link> formatting.\"\n htmlFor=\"alert-text\"\n >\n <Textarea\n id=\"alert-text\"\n value={text}\n rows={3}\n placeholder=\"e.g. Heads up: this action cannot be undone.\"\n onChange={(e) =>\n onChange({\n ...block,\n text: { type: 'mrkdwn', text: e.target.value }\n })\n }\n />\n </EditorField>\n <EditorField label=\"Level\" help=\"Severity controls Slack's icon and color accent.\">\n <RadioGroup\n value={level}\n onValueChange={(v) => onChange({ ...block, level: v as AlertLevel })}\n className=\"flex flex-row flex-wrap gap-3\"\n >\n {LEVELS.map((l) => (\n <div key={l} className=\"flex items-center gap-1.5\">\n <RadioGroupItem value={l} id={`alert-level-${l}`} />\n <Label htmlFor={`alert-level-${l}`} className=\"text-xs capitalize\">\n {l}\n </Label>\n </div>\n ))}\n </RadioGroup>\n </EditorField>\n </div>\n );\n}\n","import { CARD_ACTIONS_MAX } from '@tightknitai/slack-block-kit-validator';\nimport { Plus, Trash2 } from 'lucide-react';\nimport { nanoid } from 'nanoid';\nimport type { ImageElement, Button as SlackButton } from 'slack-web-api-client';\nimport { Button } from '../../lib/ui/button';\nimport { Input } from '../../lib/ui/input';\nimport { Label } from '../../lib/ui/label';\nimport { RadioGroup, RadioGroupItem } from '../../lib/ui/radio-group';\nimport { Textarea } from '../../lib/ui/textarea';\nimport type { CardBlock } from '../../types';\nimport { EditorField } from './field';\nimport type { BlockEditorProps } from './types';\n\ntype ButtonStyle = 'default' | 'primary' | 'danger';\n\n/**\n * Editor form for card blocks. Edits title, subtitle, body, hero image,\n * icon, and a list of button actions. At least one of hero image, title,\n * actions, or body must be set; the validator surfaces this constraint.\n * @param props - editor props\n * @param props.block - the card block to edit\n * @param props.onChange - called with the updated block payload\n * @returns the rendered card editor form\n */\nexport function CardEditor({ block, onChange }: BlockEditorProps<CardBlock>) {\n return (\n <div className=\"flex flex-col gap-4\">\n <EditorField label=\"Title\" help=\"Up to 150 characters. Supports mrkdwn formatting.\" htmlFor=\"card-title\">\n <Input\n id=\"card-title\"\n value={block.title?.text ?? ''}\n maxLength={150}\n placeholder=\"e.g. New launch update\"\n onChange={(e) =>\n onChange({\n ...block,\n title: e.target.value ? { type: 'mrkdwn', text: e.target.value } : undefined\n })\n }\n />\n </EditorField>\n\n <EditorField label=\"Subtitle\" help=\"Up to 150 characters.\" htmlFor=\"card-subtitle\">\n <Input\n id=\"card-subtitle\"\n value={block.subtitle?.text ?? ''}\n maxLength={150}\n placeholder=\"e.g. Released April 28\"\n onChange={(e) =>\n onChange({\n ...block,\n subtitle: e.target.value ? { type: 'mrkdwn', text: e.target.value } : undefined\n })\n }\n />\n </EditorField>\n\n <EditorField label=\"Body\" help=\"Up to 200 characters. Supports mrkdwn formatting.\" htmlFor=\"card-body\">\n <Textarea\n id=\"card-body\"\n value={block.body?.text ?? ''}\n maxLength={200}\n rows={3}\n placeholder=\"e.g. Read the announcement to see what's new.\"\n onChange={(e) =>\n onChange({\n ...block,\n body: e.target.value ? { type: 'mrkdwn', text: e.target.value } : undefined\n })\n }\n />\n </EditorField>\n\n <ImageFields\n label=\"Hero image\"\n help=\"Wide image displayed at the top of the card.\"\n idPrefix=\"card-hero\"\n image={block.hero_image}\n onChange={(next) => onChange({ ...block, hero_image: next })}\n />\n\n <ImageFields\n label=\"Icon\"\n help=\"Small image shown next to the title.\"\n idPrefix=\"card-icon\"\n image={block.icon}\n onChange={(next) => onChange({ ...block, icon: next })}\n />\n\n <ButtonsField\n buttons={block.actions ?? []}\n onChange={(next) => onChange({ ...block, actions: next.length > 0 ? next : undefined })}\n />\n </div>\n );\n}\n\n/**\n * Optional image sub-editor used for the card's hero image and icon.\n * Editing the URL with the image previously unset creates the field;\n * clearing it back to empty removes the image.\n * @param props - field props\n * @param props.label - the field label\n * @param props.help - help text below the label\n * @param props.idPrefix - prefix for input ids (avoids collisions)\n * @param props.image - current image element, if any\n * @param props.onChange - called with the next image element (or undefined to clear)\n * @returns the rendered image fields\n */\nfunction ImageFields({\n label,\n help,\n idPrefix,\n image,\n onChange\n}: {\n label: string;\n help: string;\n idPrefix: string;\n image: ImageElement | undefined;\n onChange: (next: ImageElement | undefined) => void;\n}) {\n if (image && !('image_url' in image)) {\n return (\n <p className=\"text-[11px] leading-snug text-muted-foreground\">\n {label} references a Slack file. Not editable in the visual builder.\n </p>\n );\n }\n const url = image?.image_url ?? '';\n const alt = image?.alt_text ?? '';\n\n const update = (next: { url?: string; alt?: string }) => {\n const nextUrl = next.url ?? url;\n const nextAlt = next.alt ?? alt;\n if (!nextUrl && !nextAlt) {\n onChange(undefined);\n return;\n }\n onChange({\n type: 'image',\n image_url: nextUrl,\n alt_text: nextAlt || label\n });\n };\n\n return (\n <div className=\"flex flex-col gap-2 rounded-md border bg-muted/20 p-3\">\n <EditorField label={label} help={help} htmlFor={`${idPrefix}-url`}>\n <Input\n id={`${idPrefix}-url`}\n type=\"url\"\n value={url}\n placeholder=\"e.g. https://example.com/image.png\"\n onChange={(e) => update({ url: e.target.value })}\n />\n </EditorField>\n <EditorField label=\"Alt text\" help=\"Describes the image for screen readers.\" htmlFor={`${idPrefix}-alt`}>\n <Input\n id={`${idPrefix}-alt`}\n value={alt}\n placeholder=\"e.g. Product screenshot\"\n onChange={(e) => update({ alt: e.target.value })}\n />\n </EditorField>\n </div>\n );\n}\n\n/**\n * Sub-editor for the card's `actions` button list. Mirrors the\n * patterns used by {@link ActionsEditor} but scoped to button elements\n * since cards only accept buttons.\n * @param props - field props\n * @param props.buttons - current actions array\n * @param props.onChange - called with the updated actions array\n * @returns the rendered actions editor\n */\nfunction ButtonsField({ buttons, onChange }: { buttons: SlackButton[]; onChange: (next: SlackButton[]) => void }) {\n const update = (idx: number, change: Partial<SlackButton>) => {\n onChange(buttons.map((b, i) => (i === idx ? { ...b, ...change } : b)));\n };\n const removeAt = (idx: number) => onChange(buttons.filter((_, i) => i !== idx));\n const atLimit = buttons.length >= CARD_ACTIONS_MAX;\n // Random suffix so re-adding after a delete can't collide with a surviving\n // button's action_id (Slack rejects duplicates in the same view/message).\n const addButton = () => {\n if (atLimit) {\n return;\n }\n onChange([\n ...buttons,\n {\n type: 'button',\n text: { type: 'plain_text', text: 'Click me', emoji: true },\n action_id: `card_action_${nanoid(6)}`\n }\n ]);\n };\n\n return (\n <div className=\"flex flex-col gap-2 rounded-md border bg-muted/20 p-3\">\n <span className=\"text-xs font-medium text-foreground\">Actions</span>\n {buttons.length === 0 ? (\n <p className=\"text-[11px] leading-snug text-muted-foreground\">\n No buttons. Add one to render an action row at the bottom of the card.\n </p>\n ) : null}\n {buttons.map((btn, idx) => {\n const label = btn.text?.text ?? '';\n const url = btn.url ?? '';\n const style: ButtonStyle = btn.style === 'primary' || btn.style === 'danger' ? btn.style : 'default';\n return (\n <div key={idx} className=\"flex flex-col gap-2 rounded border bg-background p-2\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-xs font-medium text-foreground\">Button {idx + 1}</span>\n <button\n type=\"button\"\n aria-label=\"Remove button\"\n onClick={() => removeAt(idx)}\n className=\"rounded p-1 text-muted-foreground hover:bg-destructive/10 hover:text-destructive\"\n >\n <Trash2 className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n <EditorField label=\"Label\" htmlFor={`card-btn-label-${idx}`}>\n <Input\n id={`card-btn-label-${idx}`}\n value={label}\n placeholder=\"e.g. Open\"\n onChange={(e) =>\n update(idx, {\n text: {\n type: 'plain_text',\n text: e.target.value,\n emoji: true\n }\n })\n }\n />\n </EditorField>\n <EditorField\n label=\"Link URL\"\n help=\"Optional. If set, the button opens this link.\"\n htmlFor={`card-btn-url-${idx}`}\n >\n <Input\n id={`card-btn-url-${idx}`}\n type=\"url\"\n value={url}\n placeholder=\"e.g. https://example.com\"\n onChange={(e) => update(idx, { url: e.target.value || undefined })}\n />\n </EditorField>\n <EditorField label=\"Style\">\n <RadioGroup\n value={style}\n onValueChange={(v) => {\n const nextStyle: 'primary' | 'danger' | undefined = v === 'primary' || v === 'danger' ? v : undefined;\n update(idx, { style: nextStyle });\n }}\n className=\"flex flex-row gap-3\"\n >\n {(['default', 'primary', 'danger'] as const).map((s) => (\n <div key={s} className=\"flex items-center gap-1.5\">\n <RadioGroupItem value={s} id={`card-btn-style-${idx}-${s}`} />\n <Label htmlFor={`card-btn-style-${idx}-${s}`} className=\"text-xs capitalize\">\n {s}\n </Label>\n </div>\n ))}\n </RadioGroup>\n </EditorField>\n </div>\n );\n })}\n <Button type=\"button\" size=\"sm\" onClick={addButton} disabled={atLimit} className=\"self-start\">\n <Plus className=\"h-3.5 w-3.5\" /> Add button\n </Button>\n {atLimit ? (\n <p className=\"text-[11px] leading-snug text-muted-foreground\">\n Card blocks support up to {CARD_ACTIONS_MAX} action buttons.\n </p>\n ) : null}\n </div>\n );\n}\n","import { Plus, Trash2 } from 'lucide-react';\nimport { Button } from '../../lib/ui/button';\nimport { Input } from '../../lib/ui/input';\nimport { Textarea } from '../../lib/ui/textarea';\nimport type { CardBlock, CarouselBlock } from '../../types';\nimport { EditorField } from './field';\nimport type { BlockEditorProps } from './types';\n\nconst MAX_CARDS = 10;\n\n/**\n * Editor form for carousel blocks. Lists the contained cards and lets\n * the user add, remove, and edit the title/body of each. For deeper\n * card edits (icon, hero image, action buttons), use a standalone Card\n * block or the View JSON drawer.\n * @param props - editor props\n * @param props.block - the carousel block to edit\n * @param props.onChange - called with the updated block payload\n * @returns the rendered carousel editor form\n */\nexport function CarouselEditor({ block, onChange }: BlockEditorProps<CarouselBlock>) {\n const elements = block.elements ?? [];\n\n const updateCard = (idx: number, next: CardBlock) => {\n onChange({\n ...block,\n elements: elements.map((c, i) => (i === idx ? next : c))\n });\n };\n const removeAt = (idx: number) => {\n onChange({\n ...block,\n elements: elements.filter((_, i) => i !== idx)\n });\n };\n const addCard = () => {\n onChange({\n ...block,\n elements: [\n ...elements,\n {\n type: 'card',\n title: {\n type: 'mrkdwn',\n text: `Card ${elements.length + 1}`\n },\n body: { type: 'mrkdwn', text: 'New card.' }\n }\n ]\n });\n };\n\n return (\n <div className=\"flex flex-col gap-3\">\n <p className=\"text-[11px] leading-snug text-muted-foreground\">\n Carousels hold 1-10 cards. For icon, hero image, or action edits, use the View JSON drawer.\n </p>\n {elements.map((card, idx) => (\n <div key={idx} className=\"flex flex-col gap-2 rounded-md border bg-muted/20 p-3\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-xs font-medium text-foreground\">Card {idx + 1}</span>\n <button\n type=\"button\"\n aria-label=\"Remove card\"\n onClick={() => removeAt(idx)}\n disabled={elements.length <= 1}\n className=\"rounded p-1 text-muted-foreground hover:bg-destructive/10 hover:text-destructive disabled:cursor-not-allowed disabled:opacity-40\"\n >\n <Trash2 className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n <EditorField label=\"Title\" htmlFor={`carousel-card-title-${idx}`}>\n <Input\n id={`carousel-card-title-${idx}`}\n value={card.title?.text ?? ''}\n maxLength={150}\n placeholder=\"e.g. Card title\"\n onChange={(e) =>\n updateCard(idx, {\n ...card,\n title: e.target.value ? { type: 'mrkdwn', text: e.target.value } : undefined\n })\n }\n />\n </EditorField>\n <EditorField label=\"Body\" htmlFor={`carousel-card-body-${idx}`}>\n <Textarea\n id={`carousel-card-body-${idx}`}\n value={card.body?.text ?? ''}\n maxLength={200}\n rows={2}\n placeholder=\"e.g. Short card description.\"\n onChange={(e) =>\n updateCard(idx, {\n ...card,\n body: e.target.value ? { type: 'mrkdwn', text: e.target.value } : undefined\n })\n }\n />\n </EditorField>\n </div>\n ))}\n <Button type=\"button\" size=\"sm\" onClick={addCard} disabled={elements.length >= MAX_CARDS} className=\"self-start\">\n <Plus className=\"h-3.5 w-3.5\" /> Add card\n </Button>\n </div>\n );\n}\n","import { Plus, Trash2 } from 'lucide-react';\nimport { nanoid } from 'nanoid';\nimport { Button } from '../../lib/ui/button';\nimport { Input } from '../../lib/ui/input';\nimport { Label } from '../../lib/ui/label';\nimport { RadioGroup, RadioGroupItem } from '../../lib/ui/radio-group';\nimport type {\n ContextActionsBlock,\n ContextActionsElement,\n FeedbackButtonsElement,\n IconButtonElement\n} from '../../types';\nimport { EditorField } from './field';\nimport type { BlockEditorProps } from './types';\n\nconst MAX_ELEMENTS = 5;\ntype ElementKind = 'feedback_buttons' | 'icon_button';\n\n/**\n * Editor form for context_actions blocks. Supports the two element\n * types Slack accepts inside this block: `feedback_buttons` (paired\n * positive/negative buttons) and `icon_button` (compact icon-with-label\n * action). Up to 5 elements per block. Slack only renders this block\n * on the message surface; the validator surfaces that constraint.\n * @param props - editor props\n * @param props.block - the context_actions block to edit\n * @param props.onChange - called with the updated block payload\n * @returns the rendered context_actions editor form\n */\nexport function ContextActionsEditor({ block, onChange }: BlockEditorProps<ContextActionsBlock>) {\n const elements = block.elements ?? [];\n\n const updateAt = (idx: number, next: ContextActionsElement) => {\n onChange({\n ...block,\n elements: elements.map((el, i) => (i === idx ? next : el))\n });\n };\n const removeAt = (idx: number) => {\n onChange({\n ...block,\n elements: elements.filter((_, i) => i !== idx)\n });\n };\n // Random suffixes so re-adding after a delete can't collide with a\n // surviving element's action_id (Slack rejects duplicates).\n const addFeedback = () => {\n const next: FeedbackButtonsElement = {\n type: 'feedback_buttons',\n action_id: `feedback_${nanoid(6)}`,\n positive_button: {\n text: { type: 'plain_text', text: 'Good Response' },\n value: 'positive'\n },\n negative_button: {\n text: { type: 'plain_text', text: 'Bad Response' },\n value: 'negative'\n }\n };\n onChange({ ...block, elements: [...elements, next] });\n };\n const addIconButton = () => {\n const next: IconButtonElement = {\n type: 'icon_button',\n action_id: `icon_button_${nanoid(6)}`,\n icon: 'trash',\n text: { type: 'plain_text', text: 'Remove' }\n };\n onChange({ ...block, elements: [...elements, next] });\n };\n\n return (\n <div className=\"flex flex-col gap-3\">\n <p className=\"text-[11px] leading-snug text-muted-foreground\">\n Up to 5 elements. Renders below the message body, alongside Slack's built-in actions.\n </p>\n {elements.map((el, idx) => {\n const kind: ElementKind = el.type;\n return (\n <div key={idx} className=\"flex flex-col gap-2 rounded-md border bg-muted/20 p-3\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-xs font-medium text-foreground capitalize\">\n {kind === 'feedback_buttons' ? 'Feedback buttons' : 'Icon button'}\n </span>\n <button\n type=\"button\"\n aria-label={`Remove ${kind}`}\n onClick={() => removeAt(idx)}\n className=\"rounded p-1 text-muted-foreground hover:bg-destructive/10 hover:text-destructive\"\n >\n <Trash2 className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n {el.type === 'feedback_buttons' ? (\n <FeedbackButtonsFields element={el} idx={idx} onChange={(next) => updateAt(idx, next)} />\n ) : (\n <IconButtonFields element={el} idx={idx} onChange={(next) => updateAt(idx, next)} />\n )}\n </div>\n );\n })}\n <div className=\"flex flex-row gap-2\">\n <Button type=\"button\" size=\"sm\" onClick={addFeedback} disabled={elements.length >= MAX_ELEMENTS}>\n <Plus className=\"h-3.5 w-3.5\" /> Add feedback buttons\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"secondary\"\n onClick={addIconButton}\n disabled={elements.length >= MAX_ELEMENTS}\n >\n <Plus className=\"h-3.5 w-3.5\" /> Add icon button\n </Button>\n </div>\n </div>\n );\n}\n\n/**\n * Sub-editor for a `feedback_buttons` element. Edits the positive and\n * negative button labels and values plus the shared action_id.\n * @param props - field props\n * @param props.element - the feedback_buttons element to edit\n * @param props.idx - element index (used for input id collision avoidance)\n * @param props.onChange - called with the updated element\n * @returns the rendered feedback buttons fields\n */\nfunction FeedbackButtonsFields({\n element,\n idx,\n onChange\n}: {\n element: FeedbackButtonsElement;\n idx: number;\n onChange: (next: FeedbackButtonsElement) => void;\n}) {\n return (\n <div className=\"flex flex-col gap-2\">\n <EditorField\n label=\"Action ID\"\n help=\"Optional. Sent in the interaction payload when a button is clicked.\"\n htmlFor={`fb-action-${idx}`}\n >\n <Input\n id={`fb-action-${idx}`}\n value={element.action_id ?? ''}\n placeholder=\"e.g. feedback\"\n onChange={(e) => onChange({ ...element, action_id: e.target.value || undefined })}\n />\n </EditorField>\n <div className=\"grid grid-cols-2 gap-2\">\n <EditorField label=\"Positive label\" htmlFor={`fb-pos-text-${idx}`}>\n <Input\n id={`fb-pos-text-${idx}`}\n value={element.positive_button.text.text}\n placeholder=\"e.g. Good Response\"\n onChange={(e) =>\n onChange({\n ...element,\n positive_button: {\n ...element.positive_button,\n text: { type: 'plain_text', text: e.target.value }\n }\n })\n }\n />\n </EditorField>\n <EditorField label=\"Positive value\" htmlFor={`fb-pos-val-${idx}`}>\n <Input\n id={`fb-pos-val-${idx}`}\n value={element.positive_button.value}\n placeholder=\"e.g. positive\"\n onChange={(e) =>\n onChange({\n ...element,\n positive_button: {\n ...element.positive_button,\n value: e.target.value\n }\n })\n }\n />\n </EditorField>\n <EditorField label=\"Negative label\" htmlFor={`fb-neg-text-${idx}`}>\n <Input\n id={`fb-neg-text-${idx}`}\n value={element.negative_button.text.text}\n placeholder=\"e.g. Bad Response\"\n onChange={(e) =>\n onChange({\n ...element,\n negative_button: {\n ...element.negative_button,\n text: { type: 'plain_text', text: e.target.value }\n }\n })\n }\n />\n </EditorField>\n <EditorField label=\"Negative value\" htmlFor={`fb-neg-val-${idx}`}>\n <Input\n id={`fb-neg-val-${idx}`}\n value={element.negative_button.value}\n placeholder=\"e.g. negative\"\n onChange={(e) =>\n onChange({\n ...element,\n negative_button: {\n ...element.negative_button,\n value: e.target.value\n }\n })\n }\n />\n </EditorField>\n </div>\n </div>\n );\n}\n\n/**\n * Sub-editor for an `icon_button` element. Edits the icon (Slack only\n * exposes `trash` today), label, action_id, and optional value.\n * @param props - field props\n * @param props.element - the icon_button element to edit\n * @param props.idx - element index (used for input id collision avoidance)\n * @param props.onChange - called with the updated element\n * @returns the rendered icon button fields\n */\nfunction IconButtonFields({\n element,\n idx,\n onChange\n}: {\n element: IconButtonElement;\n idx: number;\n onChange: (next: IconButtonElement) => void;\n}) {\n return (\n <div className=\"flex flex-col gap-2\">\n <EditorField label=\"Icon\" help=\"Slack currently exposes only the trash icon.\">\n <RadioGroup\n value={element.icon}\n onValueChange={(v) => onChange({ ...element, icon: v as IconButtonElement['icon'] })}\n className=\"flex flex-row gap-3\"\n >\n {(['trash'] as const).map((i) => (\n <div key={i} className=\"flex items-center gap-1.5\">\n <RadioGroupItem value={i} id={`ib-icon-${idx}-${i}`} />\n <Label htmlFor={`ib-icon-${idx}-${i}`} className=\"text-xs capitalize\">\n {i}\n </Label>\n </div>\n ))}\n </RadioGroup>\n </EditorField>\n <EditorField label=\"Label\" htmlFor={`ib-text-${idx}`}>\n <Input\n id={`ib-text-${idx}`}\n value={element.text.text}\n placeholder=\"e.g. Remove\"\n onChange={(e) =>\n onChange({\n ...element,\n text: { type: 'plain_text', text: e.target.value }\n })\n }\n />\n </EditorField>\n <EditorField\n label=\"Action ID\"\n help=\"Optional. Sent in the interaction payload when the button is clicked.\"\n htmlFor={`ib-action-${idx}`}\n >\n <Input\n id={`ib-action-${idx}`}\n value={element.action_id ?? ''}\n placeholder=\"e.g. remove\"\n onChange={(e) => onChange({ ...element, action_id: e.target.value || undefined })}\n />\n </EditorField>\n <EditorField label=\"Value\" help=\"Optional. Sent alongside action_id.\" htmlFor={`ib-value-${idx}`}>\n <Input\n id={`ib-value-${idx}`}\n value={element.value ?? ''}\n placeholder=\"e.g. delete_item\"\n onChange={(e) => onChange({ ...element, value: e.target.value || undefined })}\n />\n </EditorField>\n </div>\n );\n}\n","import { Image as ImageIcon, Trash2, Type as TypeIcon } from 'lucide-react';\nimport type { ContextBlock } from 'slack-web-api-client';\nimport { Button } from '../../lib/ui/button';\nimport { Input } from '../../lib/ui/input';\nimport { Label } from '../../lib/ui/label';\nimport { RadioGroup, RadioGroupItem } from '../../lib/ui/radio-group';\nimport { Textarea } from '../../lib/ui/textarea';\nimport { EditorField } from './field';\nimport type { BlockEditorProps } from './types';\n\ntype TextElement = {\n type: 'mrkdwn' | 'plain_text';\n text: string;\n emoji?: boolean;\n};\n\ntype ImageElement = {\n type: 'image';\n image_url: string;\n alt_text: string;\n};\n\n/**\n * Editor form for context blocks. Supports the two element types we\n * actually emit from the palette:\n * - Text (mrkdwn or plain_text), edited as a textarea with a small\n * type toggle so users can switch between formatted and plain.\n * - Image (URL + alt text).\n *\n * Slack-file image elements (the upload variant) and any other element\n * shape are preserved as-is on save but shown as read-only with a note.\n * @param props - editor props\n * @param props.block - the context block to edit\n * @param props.onChange - called with the updated block payload\n * @returns the rendered context editor form\n */\nexport function ContextEditor({ block, onChange }: BlockEditorProps<ContextBlock>) {\n const elements = block.elements ?? [];\n\n const updateAt = <T extends ContextBlock['elements'][number]>(idx: number, updater: (el: T) => T) => {\n const next = elements.map((el, i) => (i === idx ? updater(el as T) : el));\n onChange({ ...block, elements: next });\n };\n\n const removeAt = (idx: number) => {\n onChange({ ...block, elements: elements.filter((_, i) => i !== idx) });\n };\n\n const addText = () => {\n const newEl: TextElement = { type: 'mrkdwn', text: 'More context' };\n onChange({ ...block, elements: [...elements, newEl] });\n };\n\n const addImage = () => {\n const newEl: ImageElement = {\n type: 'image',\n image_url: 'https://placehold.co/40x40?text=A',\n alt_text: 'Avatar'\n };\n onChange({ ...block, elements: [...elements, newEl] });\n };\n\n return (\n <div className=\"flex flex-col gap-3\">\n <EditorField\n label=\"Items\"\n help=\"Shown in a horizontal row, usually as footnote-style content. Slack supports up to 10 items.\"\n >\n <div className=\"flex flex-col gap-2\">\n {elements.map((el, idx) => {\n if (el.type === 'mrkdwn' || el.type === 'plain_text') {\n return (\n <TextItemCard\n key={idx}\n index={idx}\n element={el as TextElement}\n onChange={(next) => updateAt<TextElement>(idx, () => next)}\n onRemove={() => removeAt(idx)}\n />\n );\n }\n if (el.type === 'image' && 'image_url' in el) {\n return (\n <ImageItemCard\n key={idx}\n index={idx}\n element={el as ImageElement}\n onChange={(next) => updateAt<ImageElement>(idx, () => next)}\n onRemove={() => removeAt(idx)}\n />\n );\n }\n return (\n <div\n key={idx}\n className=\"flex items-center justify-between rounded border bg-muted/30 px-2 py-1.5 text-xs text-muted-foreground\"\n >\n <span>Item not editable in the visual builder</span>\n <button\n type=\"button\"\n aria-label=\"Remove item\"\n onClick={() => removeAt(idx)}\n className=\"text-muted-foreground hover:text-destructive\"\n >\n <Trash2 className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n );\n })}\n </div>\n </EditorField>\n <div className=\"flex gap-2\">\n <Button type=\"button\" size=\"sm\" onClick={addText} className=\"self-start\">\n <TypeIcon className=\"h-3.5 w-3.5\" /> Add text\n </Button>\n <Button type=\"button\" size=\"sm\" onClick={addImage} className=\"self-start\">\n <ImageIcon className=\"h-3.5 w-3.5\" /> Add image\n </Button>\n </div>\n </div>\n );\n}\n\n/**\n * Card UI for a single text-type context item with format toggle.\n * @param props - item props\n * @param props.index - position of the item within the context block\n * @param props.element - the text element being edited\n * @param props.onChange - called with the updated element\n * @param props.onRemove - called when the user removes the item\n * @returns the rendered text item card\n */\nfunction TextItemCard({\n index,\n element,\n onChange,\n onRemove\n}: {\n index: number;\n element: TextElement;\n onChange: (next: TextElement) => void;\n onRemove: () => void;\n}) {\n return (\n <div className=\"flex flex-col gap-2 rounded-md border bg-muted/20 p-3\">\n <div className=\"flex items-center justify-between\">\n <span className=\"inline-flex items-center gap-1 text-xs font-medium text-foreground\">\n <TypeIcon className=\"h-3 w-3\" /> Text item {index + 1}\n </span>\n <button\n type=\"button\"\n aria-label=\"Remove item\"\n onClick={onRemove}\n className=\"rounded p-1 text-muted-foreground hover:bg-destructive/10 hover:text-destructive\"\n >\n <Trash2 className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n <EditorField label=\"Text\" htmlFor={`ctx-text-${index}`}>\n <Textarea\n id={`ctx-text-${index}`}\n value={element.text}\n rows={2}\n placeholder=\"e.g. Posted by @stephen\"\n onChange={(e) => onChange({ ...element, text: e.target.value })}\n />\n </EditorField>\n <EditorField\n label=\"Format\"\n help=\"Markdown enables *bold*, _italic_, links, mentions, etc. Plain text shows the characters as-is.\"\n >\n <RadioGroup\n value={element.type}\n onValueChange={(v) => {\n const nextType: TextElement['type'] = v === 'plain_text' ? 'plain_text' : 'mrkdwn';\n const next: TextElement = { type: nextType, text: element.text };\n if (nextType === 'plain_text') {\n next.emoji = true;\n }\n onChange(next);\n }}\n className=\"flex flex-row gap-3\"\n >\n <div className=\"flex items-center gap-1.5\">\n <RadioGroupItem value=\"mrkdwn\" id={`ctx-fmt-${index}-mrkdwn`} />\n <Label htmlFor={`ctx-fmt-${index}-mrkdwn`} className=\"text-xs font-normal\">\n Markdown\n </Label>\n </div>\n <div className=\"flex items-center gap-1.5\">\n <RadioGroupItem value=\"plain_text\" id={`ctx-fmt-${index}-plain`} />\n <Label htmlFor={`ctx-fmt-${index}-plain`} className=\"text-xs font-normal\">\n Plain text\n </Label>\n </div>\n </RadioGroup>\n </EditorField>\n </div>\n );\n}\n\n/**\n * Card UI for a single image-type context item with URL and alt text fields.\n * @param props - item props\n * @param props.index - position of the item within the context block\n * @param props.element - the image element being edited\n * @param props.onChange - called with the updated element\n * @param props.onRemove - called when the user removes the item\n * @returns the rendered image item card\n */\nfunction ImageItemCard({\n index,\n element,\n onChange,\n onRemove\n}: {\n index: number;\n element: ImageElement;\n onChange: (next: ImageElement) => void;\n onRemove: () => void;\n}) {\n return (\n <div className=\"flex flex-col gap-2 rounded-md border bg-muted/20 p-3\">\n <div className=\"flex items-center justify-between\">\n <span className=\"inline-flex items-center gap-1 text-xs font-medium text-foreground\">\n <ImageIcon className=\"h-3 w-3\" /> Image item {index + 1}\n </span>\n <button\n type=\"button\"\n aria-label=\"Remove item\"\n onClick={onRemove}\n className=\"rounded p-1 text-muted-foreground hover:bg-destructive/10 hover:text-destructive\"\n >\n <Trash2 className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n <EditorField\n label=\"Image URL\"\n help=\"A publicly accessible image URL. Best at small sizes (around 20px).\"\n htmlFor={`ctx-img-url-${index}`}\n >\n <Input\n id={`ctx-img-url-${index}`}\n type=\"url\"\n value={element.image_url}\n placeholder=\"e.g. https://example.com/avatar.png\"\n onChange={(e) => onChange({ ...element, image_url: e.target.value })}\n />\n </EditorField>\n <EditorField label=\"Alt text\" help=\"Describes the image for screen readers.\" htmlFor={`ctx-img-alt-${index}`}>\n <Input\n id={`ctx-img-alt-${index}`}\n value={element.alt_text}\n placeholder=\"e.g. Stephen's avatar\"\n onChange={(e) => onChange({ ...element, alt_text: e.target.value })}\n />\n </EditorField>\n </div>\n );\n}\n","/**\n * Dividers have no configurable fields.\n * @returns a placeholder note explaining there are no options\n */\nexport function DividerEditor() {\n return (\n <p className=\"text-xs text-muted-foreground\">\n A horizontal line that separates content. This block has no options to configure.\n </p>\n );\n}\n","import { Input } from '../../lib/ui/input';\nimport { Label } from '../../lib/ui/label';\nimport { RadioGroup, RadioGroupItem } from '../../lib/ui/radio-group';\nimport type { HeaderLevel, SupportedHeaderBlock } from '../../types';\nimport { EditorField } from './field';\nimport type { BlockEditorProps } from './types';\n\nconst HEADER_MAX = 150;\nconst HEADER_LEVELS: HeaderLevel[] = [1, 2, 3, 4];\n\n/**\n * Editor form for header blocks. Slack enforces plain text only.\n * Shows a character count against the 150-char Slack limit, plus an\n * optional 1-4 level selector (builder-only extension; Slack ignores it).\n * @param props - editor props\n * @param props.block - the header block to edit\n * @param props.onChange - called with the updated block payload\n * @returns the rendered header editor form\n */\nexport function HeaderEditor({ block, onChange }: BlockEditorProps<SupportedHeaderBlock>) {\n const text = block.text?.text ?? '';\n const remaining = HEADER_MAX - text.length;\n const level = block.level;\n return (\n <div className=\"flex flex-col gap-3\">\n <EditorField\n label=\"Heading text\"\n help={`Plain text only. ${remaining} characters remaining.`}\n htmlFor=\"header-text\"\n >\n <Input\n id=\"header-text\"\n value={text}\n maxLength={HEADER_MAX}\n placeholder=\"e.g. Weekly roundup\"\n onChange={(e) =>\n onChange({\n ...block,\n text: {\n type: 'plain_text',\n text: e.target.value,\n emoji: true\n }\n })\n }\n />\n </EditorField>\n <EditorField label=\"Level\" help=\"Optional. Builder-only extension; Slack's API ignores this value.\">\n <RadioGroup\n value={level === undefined ? 'default' : String(level)}\n onValueChange={(v) => {\n if (v === 'default') {\n const { level: _omit, ...rest } = block;\n onChange(rest);\n return;\n }\n const next = Number(v) as HeaderLevel;\n onChange({ ...block, level: next });\n }}\n className=\"flex flex-row flex-wrap gap-3\"\n >\n <div className=\"flex items-center gap-1.5\">\n <RadioGroupItem value=\"default\" id=\"header-level-default\" />\n <Label htmlFor=\"header-level-default\" className=\"text-xs\">\n Default\n </Label>\n </div>\n {HEADER_LEVELS.map((lvl) => (\n <div key={lvl} className=\"flex items-center gap-1.5\">\n <RadioGroupItem value={String(lvl)} id={`header-level-${lvl}`} />\n <Label htmlFor={`header-level-${lvl}`} className=\"text-xs\">\n H{lvl}\n </Label>\n </div>\n ))}\n </RadioGroup>\n </EditorField>\n </div>\n );\n}\n","import type { ImageBlock } from 'slack-web-api-client';\nimport { Input } from '../../lib/ui/input';\nimport { EditorField } from './field';\nimport type { BlockEditorProps } from './types';\n\n/**\n * Editor form for URL-based image blocks. The Slack-file variant is not\n * editable here (it would require a file upload flow).\n * @param props - editor props\n * @param props.block - the image block to edit\n * @param props.onChange - called with the updated block payload\n * @returns the rendered image editor form\n */\nexport function ImageEditor({ block, onChange }: BlockEditorProps<ImageBlock>) {\n if (!('image_url' in block)) {\n return (\n <p className=\"text-xs text-muted-foreground\">\n This image references a Slack file. Not editable in the visual builder.\n </p>\n );\n }\n\n const titleText = block.title?.text ?? '';\n\n return (\n <div className=\"flex flex-col gap-3\">\n <EditorField label=\"Image URL\" help=\"A publicly accessible image URL (PNG, JPG, GIF).\" htmlFor=\"img-url\">\n <Input\n id=\"img-url\"\n type=\"url\"\n value={block.image_url ?? ''}\n placeholder=\"e.g. https://example.com/cover.png\"\n onChange={(e) => onChange({ ...block, image_url: e.target.value })}\n />\n </EditorField>\n <EditorField\n label=\"Alt text\"\n help=\"Describes the image for screen readers and when the image fails to load.\"\n htmlFor=\"img-alt\"\n >\n <Input\n id=\"img-alt\"\n value={block.alt_text ?? ''}\n placeholder=\"e.g. Quarterly roadmap cover\"\n onChange={(e) => onChange({ ...block, alt_text: e.target.value })}\n />\n </EditorField>\n <EditorField label=\"Title (optional)\" help=\"Shown as a caption above the image.\" htmlFor=\"img-title\">\n <Input\n id=\"img-title\"\n value={titleText}\n placeholder=\"e.g. Q2 Roadmap\"\n onChange={(e) => {\n const v = e.target.value;\n onChange({\n ...block,\n title: v ? { type: 'plain_text', text: v, emoji: true } : undefined\n });\n }}\n />\n </EditorField>\n </div>\n );\n}\n","import { Plus, Trash2 } from 'lucide-react';\nimport { nanoid } from 'nanoid';\nimport type {\n ChannelsSelect,\n Checkboxes,\n ConversationsSelect,\n Datepicker,\n DateTimepicker,\n EmailInput,\n ExternalSelect,\n FileInput,\n MultiChannelsSelect,\n MultiConversationsSelect,\n MultiExternalSelect,\n MultiStaticSelect,\n MultiUsersSelect,\n NumberInput,\n PlainTextInput,\n PlainTextOption,\n RadioButtons,\n RichTextInput,\n StaticSelect,\n Timepicker,\n URLInput,\n UsersSelect\n} from 'slack-web-api-client';\nimport { Button } from '../../lib/ui/button';\nimport { Input } from '../../lib/ui/input';\nimport { Label } from '../../lib/ui/label';\nimport type { InputBlock } from '../../types';\nimport { EditorField } from './field';\nimport type { BlockEditorProps } from './types';\n\ntype InputElement = InputBlock['element'];\n\n/**\n * Editor form for input blocks. Edits the shared wrapper fields (label,\n * hint, optional, dispatch_action) plus a sub-form keyed off the\n * element type. The element's `type` is fixed once added (palette\n * variant chooses it); to switch element type, delete and re-add.\n *\n * Surface compatibility — input blocks render on modal and home tab\n * surfaces only, and `rich_text_input` / `file_input` are modal-only.\n * The validator surfaces those constraints.\n *\n * @param props - editor props\n * @param props.block - the input block to edit\n * @param props.onChange - called with the updated block payload\n * @returns the rendered input editor form\n */\nexport function InputEditor({ block, onChange }: BlockEditorProps<InputBlock>) {\n const updateElement = (next: InputElement) => {\n onChange({ ...block, element: next });\n };\n\n return (\n <div className=\"flex flex-col gap-4\">\n <EditorField label=\"Label\" help=\"The visible label shown above the input.\" htmlFor=\"input-label\">\n <Input\n id=\"input-label\"\n value={block.label?.text ?? ''}\n maxLength={2000}\n placeholder=\"e.g. Email address\"\n onChange={(e) =>\n onChange({\n ...block,\n label: { type: 'plain_text', text: e.target.value, emoji: true }\n })\n }\n />\n </EditorField>\n\n <EditorField label=\"Hint\" help=\"Optional helper text shown below the input.\" htmlFor=\"input-hint\">\n <Input\n id=\"input-hint\"\n value={block.hint?.text ?? ''}\n maxLength={2000}\n placeholder=\"e.g. We'll never share this.\"\n onChange={(e) =>\n onChange({\n ...block,\n hint: e.target.value ? { type: 'plain_text', text: e.target.value, emoji: true } : undefined\n })\n }\n />\n </EditorField>\n\n <CheckboxField\n id=\"input-optional\"\n label=\"Optional\"\n help=\"If checked, the user can submit without filling this in.\"\n checked={block.optional === true}\n onChange={(checked) => onChange({ ...block, optional: checked ? true : undefined })}\n />\n\n <CheckboxField\n id=\"input-dispatch-action\"\n label=\"Dispatch action\"\n help=\"Trigger a block_actions event whenever the value changes.\"\n checked={block.dispatch_action === true}\n onChange={(checked) => onChange({ ...block, dispatch_action: checked ? true : undefined })}\n />\n\n <ElementTypeBadge type={block.element.type} />\n\n <ElementEditor element={block.element} onChange={updateElement} />\n </div>\n );\n}\n\n/**\n * Read-only chip showing the element's type so the user knows what\n * kind of input they're editing. We don't expose a type switcher;\n * to change type, delete and re-add.\n * @param props - props\n * @param props.type - the element type discriminator\n * @returns the rendered chip\n */\nfunction ElementTypeBadge({ type }: { type: InputElement['type'] }) {\n return (\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs font-medium text-muted-foreground\">Element</span>\n <code className=\"rounded bg-muted px-1.5 py-0.5 text-[11px] text-foreground\">{type}</code>\n </div>\n );\n}\n\n/**\n * Dispatches to the per-element-type sub-form. Each branch renders\n * the fields applicable to that element type.\n * @param props - props\n * @param props.element - the input element\n * @param props.onChange - called with the updated element payload\n * @returns the rendered element sub-form\n */\nfunction ElementEditor({ element, onChange }: { element: InputElement; onChange: (next: InputElement) => void }) {\n switch (element.type) {\n case 'plain_text_input':\n return <PlainTextInputEditor element={element} onChange={onChange} />;\n case 'email_text_input':\n return <EmailInputEditor element={element} onChange={onChange} />;\n case 'url_text_input':\n return <URLInputEditor element={element} onChange={onChange} />;\n case 'number_input':\n return <NumberInputEditor element={element} onChange={onChange} />;\n case 'datepicker':\n return <DatepickerEditor element={element} onChange={onChange} />;\n case 'timepicker':\n return <TimepickerEditor element={element} onChange={onChange} />;\n case 'datetimepicker':\n return <DateTimepickerEditor element={element} onChange={onChange} />;\n case 'static_select':\n return <StaticSelectEditor element={element} onChange={onChange} />;\n case 'multi_static_select':\n return <MultiStaticSelectEditor element={element} onChange={onChange} />;\n case 'users_select':\n return <UsersSelectEditor element={element} onChange={onChange} />;\n case 'multi_users_select':\n return <MultiUsersSelectEditor element={element} onChange={onChange} />;\n case 'channels_select':\n return <ChannelsSelectEditor element={element} onChange={onChange} />;\n case 'multi_channels_select':\n return <MultiChannelsSelectEditor element={element} onChange={onChange} />;\n case 'conversations_select':\n return <ConversationsSelectEditor element={element} onChange={onChange} />;\n case 'multi_conversations_select':\n return <MultiConversationsSelectEditor element={element} onChange={onChange} />;\n case 'external_select':\n return <ExternalSelectEditor element={element} onChange={onChange} />;\n case 'multi_external_select':\n return <MultiExternalSelectEditor element={element} onChange={onChange} />;\n case 'radio_buttons':\n return <RadioButtonsEditor element={element} onChange={onChange} />;\n case 'checkboxes':\n return <CheckboxesEditor element={element} onChange={onChange} />;\n case 'rich_text_input':\n return <RichTextInputEditor element={element} onChange={onChange} />;\n case 'file_input':\n return <FileInputEditor element={element} onChange={onChange} />;\n default:\n return null;\n }\n}\n\n/**\n * Sub-editor for a `plain_text_input` element.\n * @param props - props\n * @param props.element - the element to edit\n * @param props.onChange - called with the updated element\n * @returns the rendered sub-form\n */\nfunction PlainTextInputEditor({\n element,\n onChange\n}: {\n element: PlainTextInput;\n onChange: (next: PlainTextInput) => void;\n}) {\n return (\n <>\n <ActionIdField element={element} onChange={onChange} />\n <PlaceholderField element={element} onChange={onChange} />\n <EditorField\n label=\"Initial value\"\n help=\"Pre-filled value shown when the input loads.\"\n htmlFor=\"plain-text-initial\"\n >\n <Input\n id=\"plain-text-initial\"\n value={element.initial_value ?? ''}\n onChange={(e) => onChange({ ...element, initial_value: e.target.value || undefined })}\n />\n </EditorField>\n <CheckboxField\n id=\"plain-text-multiline\"\n label=\"Multiline\"\n help=\"Render as a multi-line textarea instead of a single-line input.\"\n checked={element.multiline === true}\n onChange={(checked) => onChange({ ...element, multiline: checked ? true : undefined })}\n />\n <div className=\"grid grid-cols-2 gap-2\">\n <EditorField label=\"Min length\" help=\"Optional. 0–3000.\" htmlFor=\"plain-text-min\">\n <Input\n id=\"plain-text-min\"\n type=\"number\"\n min={0}\n max={3000}\n value={element.min_length ?? ''}\n onChange={(e) =>\n onChange({\n ...element,\n min_length: e.target.value ? Number(e.target.value) : undefined\n })\n }\n />\n </EditorField>\n <EditorField label=\"Max length\" help=\"Optional. Up to 3000.\" htmlFor=\"plain-text-max\">\n <Input\n id=\"plain-text-max\"\n type=\"number\"\n min={1}\n max={3000}\n value={element.max_length ?? ''}\n onChange={(e) =>\n onChange({\n ...element,\n max_length: e.target.value ? Number(e.target.value) : undefined\n })\n }\n />\n </EditorField>\n </div>\n </>\n );\n}\n\n/**\n * Sub-editor for an `email_text_input` element.\n * @param props - props\n * @param props.element - the element to edit\n * @param props.onChange - called with the updated element\n * @returns the rendered sub-form\n */\nfunction EmailInputEditor({ element, onChange }: { element: EmailInput; onChange: (next: EmailInput) => void }) {\n return (\n <>\n <ActionIdField element={element} onChange={onChange} />\n <PlaceholderField element={element} onChange={onChange} />\n <EditorField label=\"Initial value\" help=\"Pre-filled email address.\" htmlFor=\"email-initial\">\n <Input\n id=\"email-initial\"\n type=\"email\"\n value={element.initial_value ?? ''}\n onChange={(e) => onChange({ ...element, initial_value: e.target.value || undefined })}\n />\n </EditorField>\n </>\n );\n}\n\n/**\n * Sub-editor for a `url_text_input` element.\n * @param props - props\n * @param props.element - the element to edit\n * @param props.onChange - called with the updated element\n * @returns the rendered sub-form\n */\nfunction URLInputEditor({ element, onChange }: { element: URLInput; onChange: (next: URLInput) => void }) {\n return (\n <>\n <ActionIdField element={element} onChange={onChange} />\n <PlaceholderField element={element} onChange={onChange} />\n <EditorField label=\"Initial value\" help=\"Pre-filled URL.\" htmlFor=\"url-initial\">\n <Input\n id=\"url-initial\"\n type=\"url\"\n value={element.initial_value ?? ''}\n onChange={(e) => onChange({ ...element, initial_value: e.target.value || undefined })}\n />\n </EditorField>\n </>\n );\n}\n\n/**\n * Sub-editor for a `number_input` element.\n * @param props - props\n * @param props.element - the element to edit\n * @param props.onChange - called with the updated element\n * @returns the rendered sub-form\n */\nfunction NumberInputEditor({ element, onChange }: { element: NumberInput; onChange: (next: NumberInput) => void }) {\n return (\n <>\n <ActionIdField element={element} onChange={onChange} />\n <PlaceholderField element={element} onChange={onChange} />\n <CheckboxField\n id=\"number-decimal\"\n label=\"Allow decimals\"\n help=\"If unchecked, only whole numbers are accepted.\"\n checked={element.is_decimal_allowed === true}\n onChange={(checked) => onChange({ ...element, is_decimal_allowed: checked })}\n />\n <div className=\"grid grid-cols-2 gap-2\">\n <EditorField label=\"Min value\" htmlFor=\"number-min\">\n <Input\n id=\"number-min\"\n value={element.min_value ?? ''}\n placeholder=\"e.g. 0\"\n onChange={(e) =>\n onChange({\n ...element,\n min_value: e.target.value || undefined\n })\n }\n />\n </EditorField>\n <EditorField label=\"Max value\" htmlFor=\"number-max\">\n <Input\n id=\"number-max\"\n value={element.max_value ?? ''}\n placeholder=\"e.g. 100\"\n onChange={(e) =>\n onChange({\n ...element,\n max_value: e.target.value || undefined\n })\n }\n />\n </EditorField>\n </div>\n <EditorField label=\"Initial value\" htmlFor=\"number-initial\">\n <Input\n id=\"number-initial\"\n value={element.initial_value ?? ''}\n onChange={(e) =>\n onChange({\n ...element,\n initial_value: e.target.value || undefined\n })\n }\n />\n </EditorField>\n </>\n );\n}\n\n/**\n * Sub-editor for a `datepicker` element.\n * @param props - props\n * @param props.element - the element to edit\n * @param props.onChange - called with the updated element\n * @returns the rendered sub-form\n */\nfunction DatepickerEditor({ element, onChange }: { element: Datepicker; onChange: (next: Datepicker) => void }) {\n return (\n <>\n <ActionIdField element={element} onChange={onChange} />\n <PlaceholderField element={element} onChange={onChange} />\n <EditorField label=\"Initial date\" help=\"YYYY-MM-DD. Pre-selected on load.\" htmlFor=\"date-initial\">\n <Input\n id=\"date-initial\"\n type=\"date\"\n value={element.initial_date ?? ''}\n onChange={(e) => onChange({ ...element, initial_date: e.target.value || undefined })}\n />\n </EditorField>\n </>\n );\n}\n\n/**\n * Sub-editor for a `timepicker` element.\n * @param props - props\n * @param props.element - the element to edit\n * @param props.onChange - called with the updated element\n * @returns the rendered sub-form\n */\nfunction TimepickerEditor({ element, onChange }: { element: Timepicker; onChange: (next: Timepicker) => void }) {\n return (\n <>\n <ActionIdField element={element} onChange={onChange} />\n <PlaceholderField element={element} onChange={onChange} />\n <EditorField label=\"Initial time\" help=\"HH:mm in 24-hour clock.\" htmlFor=\"time-initial\">\n <Input\n id=\"time-initial\"\n type=\"time\"\n value={element.initial_time ?? ''}\n onChange={(e) => onChange({ ...element, initial_time: e.target.value || undefined })}\n />\n </EditorField>\n <EditorField label=\"Timezone\" help=\"Optional IANA timezone, e.g. America/Los_Angeles.\" htmlFor=\"time-tz\">\n <Input\n id=\"time-tz\"\n value={element.timezone ?? ''}\n placeholder=\"e.g. America/Los_Angeles\"\n onChange={(e) => onChange({ ...element, timezone: e.target.value || undefined })}\n />\n </EditorField>\n </>\n );\n}\n\n/**\n * Sub-editor for a `datetimepicker` element. Internally stores a Unix\n * timestamp; the editor binds it to a `datetime-local` field for UX.\n * @param props - props\n * @param props.element - the element to edit\n * @param props.onChange - called with the updated element\n * @returns the rendered sub-form\n */\nfunction DateTimepickerEditor({\n element,\n onChange\n}: {\n element: DateTimepicker;\n onChange: (next: DateTimepicker) => void;\n}) {\n const initial = element.initial_date_time\n ? (() => {\n const d = new Date(element.initial_date_time * 1000);\n const year = d.getFullYear();\n const month = String(d.getMonth() + 1).padStart(2, '0');\n const day = String(d.getDate()).padStart(2, '0');\n const hours = String(d.getHours()).padStart(2, '0');\n const minutes = String(d.getMinutes()).padStart(2, '0');\n return `${year}-${month}-${day}T${hours}:${minutes}`;\n })()\n : '';\n return (\n <>\n <ActionIdField element={element} onChange={onChange} />\n <EditorField label=\"Initial date and time\" help=\"Pre-selected on load.\" htmlFor=\"datetime-initial\">\n <Input\n id=\"datetime-initial\"\n type=\"datetime-local\"\n value={initial}\n onChange={(e) => {\n const ts = e.target.value ? Math.floor(new Date(e.target.value).getTime() / 1000) : undefined;\n onChange({ ...element, initial_date_time: ts });\n }}\n />\n </EditorField>\n </>\n );\n}\n\n/**\n * Sub-editor for a `static_select` element.\n * @param props - props\n * @param props.element - the element to edit\n * @param props.onChange - called with the updated element\n * @returns the rendered sub-form\n */\nfunction StaticSelectEditor({ element, onChange }: { element: StaticSelect; onChange: (next: StaticSelect) => void }) {\n return (\n <>\n <ActionIdField element={element} onChange={onChange} />\n <PlaceholderField element={element} onChange={onChange} />\n <PlainTextOptionsField\n options={element.options ?? []}\n onChange={(next) => onChange({ ...element, options: next })}\n />\n </>\n );\n}\n\n/**\n * Sub-editor for a `multi_static_select` element.\n * @param props - props\n * @param props.element - the element to edit\n * @param props.onChange - called with the updated element\n * @returns the rendered sub-form\n */\nfunction MultiStaticSelectEditor({\n element,\n onChange\n}: {\n element: MultiStaticSelect;\n onChange: (next: MultiStaticSelect) => void;\n}) {\n return (\n <>\n <ActionIdField element={element} onChange={onChange} />\n <PlaceholderField element={element} onChange={onChange} />\n <PlainTextOptionsField\n options={element.options ?? []}\n onChange={(next) => onChange({ ...element, options: next })}\n />\n <MaxSelectedField element={element} onChange={onChange} />\n </>\n );\n}\n\n/**\n * Sub-editor for a `users_select` element.\n * @param props - props\n * @param props.element - the element to edit\n * @param props.onChange - called with the updated element\n * @returns the rendered sub-form\n */\nfunction UsersSelectEditor({ element, onChange }: { element: UsersSelect; onChange: (next: UsersSelect) => void }) {\n return (\n <>\n <ActionIdField element={element} onChange={onChange} />\n <PlaceholderField element={element} onChange={onChange} />\n <EditorField label=\"Initial user ID\" help=\"Optional. Pre-selects this Slack user.\" htmlFor=\"users-initial\">\n <Input\n id=\"users-initial\"\n value={element.initial_user ?? ''}\n placeholder=\"e.g. U0123456\"\n onChange={(e) => onChange({ ...element, initial_user: e.target.value || undefined })}\n />\n </EditorField>\n </>\n );\n}\n\n/**\n * Sub-editor for a `multi_users_select` element.\n * @param props - props\n * @param props.element - the element to edit\n * @param props.onChange - called with the updated element\n * @returns the rendered sub-form\n */\nfunction MultiUsersSelectEditor({\n element,\n onChange\n}: {\n element: MultiUsersSelect;\n onChange: (next: MultiUsersSelect) => void;\n}) {\n return (\n <>\n <ActionIdField element={element} onChange={onChange} />\n <PlaceholderField element={element} onChange={onChange} />\n <MaxSelectedField element={element} onChange={onChange} />\n </>\n );\n}\n\n/**\n * Sub-editor for a `channels_select` element.\n * @param props - props\n * @param props.element - the element to edit\n * @param props.onChange - called with the updated element\n * @returns the rendered sub-form\n */\nfunction ChannelsSelectEditor({\n element,\n onChange\n}: {\n element: ChannelsSelect;\n onChange: (next: ChannelsSelect) => void;\n}) {\n return (\n <>\n <ActionIdField element={element} onChange={onChange} />\n <PlaceholderField element={element} onChange={onChange} />\n <EditorField label=\"Initial channel ID\" help=\"Optional. Pre-selects this channel.\" htmlFor=\"channels-initial\">\n <Input\n id=\"channels-initial\"\n value={element.initial_channel ?? ''}\n placeholder=\"e.g. C0123456\"\n onChange={(e) =>\n onChange({\n ...element,\n initial_channel: e.target.value || undefined\n })\n }\n />\n </EditorField>\n </>\n );\n}\n\n/**\n * Sub-editor for a `multi_channels_select` element.\n * @param props - props\n * @param props.element - the element to edit\n * @param props.onChange - called with the updated element\n * @returns the rendered sub-form\n */\nfunction MultiChannelsSelectEditor({\n element,\n onChange\n}: {\n element: MultiChannelsSelect;\n onChange: (next: MultiChannelsSelect) => void;\n}) {\n return (\n <>\n <ActionIdField element={element} onChange={onChange} />\n <PlaceholderField element={element} onChange={onChange} />\n <MaxSelectedField element={element} onChange={onChange} />\n </>\n );\n}\n\n/**\n * Sub-editor for a `conversations_select` element.\n * @param props - props\n * @param props.element - the element to edit\n * @param props.onChange - called with the updated element\n * @returns the rendered sub-form\n */\nfunction ConversationsSelectEditor({\n element,\n onChange\n}: {\n element: ConversationsSelect;\n onChange: (next: ConversationsSelect) => void;\n}) {\n return (\n <>\n <ActionIdField element={element} onChange={onChange} />\n <PlaceholderField element={element} onChange={onChange} />\n <EditorField\n label=\"Initial conversation ID\"\n help=\"Optional. Pre-selects this conversation.\"\n htmlFor=\"convos-initial\"\n >\n <Input\n id=\"convos-initial\"\n value={element.initial_conversation ?? ''}\n placeholder=\"e.g. C0123456 or D0123456\"\n onChange={(e) =>\n onChange({\n ...element,\n initial_conversation: e.target.value || undefined\n })\n }\n />\n </EditorField>\n <CheckboxField\n id=\"convos-default-current\"\n label=\"Default to current conversation\"\n help=\"If checked, defaults to the conversation the modal was opened from.\"\n checked={element.default_to_current_conversation === true}\n onChange={(checked) =>\n onChange({\n ...element,\n default_to_current_conversation: checked ? true : undefined\n })\n }\n />\n </>\n );\n}\n\n/**\n * Sub-editor for a `multi_conversations_select` element.\n * @param props - props\n * @param props.element - the element to edit\n * @param props.onChange - called with the updated element\n * @returns the rendered sub-form\n */\nfunction MultiConversationsSelectEditor({\n element,\n onChange\n}: {\n element: MultiConversationsSelect;\n onChange: (next: MultiConversationsSelect) => void;\n}) {\n return (\n <>\n <ActionIdField element={element} onChange={onChange} />\n <PlaceholderField element={element} onChange={onChange} />\n <MaxSelectedField element={element} onChange={onChange} />\n <CheckboxField\n id=\"multi-convos-default-current\"\n label=\"Default to current conversation\"\n help=\"If checked, defaults to the conversation the modal was opened from.\"\n checked={element.default_to_current_conversation === true}\n onChange={(checked) =>\n onChange({\n ...element,\n default_to_current_conversation: checked ? true : undefined\n })\n }\n />\n </>\n );\n}\n\n/**\n * Sub-editor for an `external_select` element.\n * @param props - props\n * @param props.element - the element to edit\n * @param props.onChange - called with the updated element\n * @returns the rendered sub-form\n */\nfunction ExternalSelectEditor({\n element,\n onChange\n}: {\n element: ExternalSelect;\n onChange: (next: ExternalSelect) => void;\n}) {\n return (\n <>\n <ActionIdField element={element} onChange={onChange} />\n <PlaceholderField element={element} onChange={onChange} />\n <EditorField\n label=\"Min query length\"\n help=\"Characters typed before Slack fetches options from your app.\"\n htmlFor=\"external-min-q\"\n >\n <Input\n id=\"external-min-q\"\n type=\"number\"\n min={0}\n value={element.min_query_length ?? ''}\n onChange={(e) =>\n onChange({\n ...element,\n min_query_length: e.target.value ? Number(e.target.value) : undefined\n })\n }\n />\n </EditorField>\n </>\n );\n}\n\n/**\n * Sub-editor for a `multi_external_select` element.\n * @param props - props\n * @param props.element - the element to edit\n * @param props.onChange - called with the updated element\n * @returns the rendered sub-form\n */\nfunction MultiExternalSelectEditor({\n element,\n onChange\n}: {\n element: MultiExternalSelect;\n onChange: (next: MultiExternalSelect) => void;\n}) {\n return (\n <>\n <ActionIdField element={element} onChange={onChange} />\n <PlaceholderField element={element} onChange={onChange} />\n <EditorField\n label=\"Min query length\"\n help=\"Characters typed before Slack fetches options from your app.\"\n htmlFor=\"multi-external-min-q\"\n >\n <Input\n id=\"multi-external-min-q\"\n type=\"number\"\n min={0}\n value={element.min_query_length ?? ''}\n onChange={(e) =>\n onChange({\n ...element,\n min_query_length: e.target.value ? Number(e.target.value) : undefined\n })\n }\n />\n </EditorField>\n <MaxSelectedField element={element} onChange={onChange} />\n </>\n );\n}\n\n/**\n * Sub-editor for a `radio_buttons` element.\n * @param props - props\n * @param props.element - the element to edit\n * @param props.onChange - called with the updated element\n * @returns the rendered sub-form\n */\nfunction RadioButtonsEditor({ element, onChange }: { element: RadioButtons; onChange: (next: RadioButtons) => void }) {\n return (\n <>\n <ActionIdField element={element} onChange={onChange} />\n <PlainTextOptionsField\n options={(element.options ?? []) as PlainTextOption[]}\n onChange={(next) => onChange({ ...element, options: next })}\n />\n </>\n );\n}\n\n/**\n * Sub-editor for a `checkboxes` element.\n * @param props - props\n * @param props.element - the element to edit\n * @param props.onChange - called with the updated element\n * @returns the rendered sub-form\n */\nfunction CheckboxesEditor({ element, onChange }: { element: Checkboxes; onChange: (next: Checkboxes) => void }) {\n return (\n <>\n <ActionIdField element={element} onChange={onChange} />\n <PlainTextOptionsField\n options={(element.options ?? []) as PlainTextOption[]}\n onChange={(next) => onChange({ ...element, options: next })}\n />\n </>\n );\n}\n\n/**\n * Sub-editor for a `rich_text_input` element. Initial rich-text value\n * is non-trivial to edit inline; for that, use the View JSON drawer.\n * @param props - props\n * @param props.element - the element to edit\n * @param props.onChange - called with the updated element\n * @returns the rendered sub-form\n */\nfunction RichTextInputEditor({\n element,\n onChange\n}: {\n element: RichTextInput;\n onChange: (next: RichTextInput) => void;\n}) {\n return (\n <>\n <ActionIdField element={element} onChange={onChange} />\n <PlaceholderField element={element} onChange={onChange} />\n <p className=\"text-[11px] leading-snug text-muted-foreground\">\n Edit the initial rich-text value via the View JSON drawer.\n </p>\n </>\n );\n}\n\n/**\n * Sub-editor for a `file_input` element.\n * @param props - props\n * @param props.element - the element to edit\n * @param props.onChange - called with the updated element\n * @returns the rendered sub-form\n */\nfunction FileInputEditor({ element, onChange }: { element: FileInput; onChange: (next: FileInput) => void }) {\n const filetypes = (element.filetypes ?? []).join(', ');\n return (\n <>\n <ActionIdField element={element} onChange={onChange} />\n <EditorField\n label=\"Allowed filetypes\"\n help=\"Comma-separated extensions (e.g. jpg, png, pdf). Leave blank to allow any.\"\n htmlFor=\"file-types\"\n >\n <Input\n id=\"file-types\"\n value={filetypes}\n placeholder=\"e.g. jpg, png, pdf\"\n onChange={(e) => {\n const list = e.target.value\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean);\n onChange({\n ...element,\n filetypes: list.length > 0 ? list : undefined\n });\n }}\n />\n </EditorField>\n <EditorField label=\"Max files\" help=\"Maximum number of files the user can upload (1-10).\" htmlFor=\"file-max\">\n <Input\n id=\"file-max\"\n type=\"number\"\n min={1}\n max={10}\n value={element.max_files ?? ''}\n onChange={(e) =>\n onChange({\n ...element,\n max_files: e.target.value ? Number(e.target.value) : undefined\n })\n }\n />\n </EditorField>\n </>\n );\n}\n\n/**\n * Shared `action_id` field. Every input element uses this to identify\n * itself in submission payloads.\n * @param props - props\n * @param props.element - the element being edited\n * @param props.onChange - called with the updated element\n * @returns the rendered field\n */\nfunction ActionIdField<T extends { action_id?: string }>({\n element,\n onChange\n}: {\n element: T;\n onChange: (next: T) => void;\n}) {\n return (\n <EditorField\n label=\"Action ID\"\n help=\"Unique within the view. Slack returns this with the submitted value.\"\n htmlFor=\"action-id\"\n >\n <Input\n id=\"action-id\"\n value={element.action_id ?? ''}\n placeholder=\"e.g. email_input\"\n onChange={(e) => onChange({ ...element, action_id: e.target.value || undefined })}\n />\n </EditorField>\n );\n}\n\n/**\n * Shared placeholder field used by every element that supports\n * `placeholder` (i.e. anything implementing `Placeholdable`).\n * @param props - props\n * @param props.element - the element being edited\n * @param props.onChange - called with the updated element\n * @returns the rendered field\n */\nfunction PlaceholderField<\n T extends {\n placeholder?: { type: 'plain_text'; text: string; emoji?: boolean };\n }\n>({ element, onChange }: { element: T; onChange: (next: T) => void }) {\n return (\n <EditorField label=\"Placeholder\" help=\"Greyed-out hint shown when the input is empty.\" htmlFor=\"placeholder\">\n <Input\n id=\"placeholder\"\n value={element.placeholder?.text ?? ''}\n maxLength={150}\n onChange={(e) =>\n onChange({\n ...element,\n placeholder: e.target.value ? { type: 'plain_text', text: e.target.value, emoji: true } : undefined\n })\n }\n />\n </EditorField>\n );\n}\n\n/**\n * Shared `max_selected_items` field for any multi-select element.\n * @param props - props\n * @param props.element - the element being edited\n * @param props.onChange - called with the updated element\n * @returns the rendered field\n */\nfunction MaxSelectedField<T extends { max_selected_items?: number }>({\n element,\n onChange\n}: {\n element: T;\n onChange: (next: T) => void;\n}) {\n return (\n <EditorField label=\"Max selected items\" help=\"Maximum number of items the user can pick.\" htmlFor=\"max-selected\">\n <Input\n id=\"max-selected\"\n type=\"number\"\n min={1}\n value={element.max_selected_items ?? ''}\n onChange={(e) =>\n onChange({\n ...element,\n max_selected_items: e.target.value ? Number(e.target.value) : undefined\n })\n }\n />\n </EditorField>\n );\n}\n\n/**\n * Editor for a list of plain-text options. Used by static_select,\n * multi_static_select, radio_buttons, and checkboxes.\n * @param props - props\n * @param props.options - current options\n * @param props.onChange - called with the updated options array\n * @returns the rendered options editor\n */\nfunction PlainTextOptionsField({\n options,\n onChange\n}: {\n options: PlainTextOption[];\n onChange: (next: PlainTextOption[]) => void;\n}) {\n const update = (idx: number, change: Partial<PlainTextOption>) => {\n onChange(options.map((o, i) => (i === idx ? { ...o, ...change } : o)));\n };\n const removeAt = (idx: number) => onChange(options.filter((_, i) => i !== idx));\n // Random suffix for `value` so re-adding after a delete can't collide\n // with a surviving option's value (Slack requires unique values per\n // select / radio / checkbox element).\n const addOption = () =>\n onChange([\n ...options,\n {\n text: {\n type: 'plain_text',\n text: `Option ${options.length + 1}`,\n emoji: true\n },\n value: `option_${nanoid(6)}`\n }\n ]);\n\n return (\n <div className=\"flex flex-col gap-2 rounded-md border bg-muted/20 p-3\">\n <span className=\"text-xs font-medium text-foreground\">Options</span>\n {options.length === 0 ? (\n <p className=\"text-[11px] leading-snug text-muted-foreground\">No options. Add one to populate the choices.</p>\n ) : null}\n {options.map((opt, idx) => (\n <div key={idx} className=\"flex flex-col gap-2 rounded border bg-background p-2\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-xs font-medium text-foreground\">Option {idx + 1}</span>\n <button\n type=\"button\"\n aria-label=\"Remove option\"\n onClick={() => removeAt(idx)}\n className=\"rounded p-1 text-muted-foreground hover:bg-destructive/10 hover:text-destructive\"\n >\n <Trash2 className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n <EditorField label=\"Label\" htmlFor={`option-text-${idx}`}>\n <Input\n id={`option-text-${idx}`}\n value={opt.text?.text ?? ''}\n maxLength={75}\n onChange={(e) =>\n update(idx, {\n text: {\n type: 'plain_text',\n text: e.target.value,\n emoji: true\n }\n })\n }\n />\n </EditorField>\n <EditorField\n label=\"Value\"\n help=\"Identifier returned with the submitted payload.\"\n htmlFor={`option-value-${idx}`}\n >\n <Input\n id={`option-value-${idx}`}\n value={opt.value ?? ''}\n maxLength={75}\n onChange={(e) => update(idx, { value: e.target.value || undefined })}\n />\n </EditorField>\n </div>\n ))}\n <Button type=\"button\" size=\"sm\" onClick={addOption} className=\"self-start\">\n <Plus className=\"h-3.5 w-3.5\" /> Add option\n </Button>\n </div>\n );\n}\n\n/**\n * Native checkbox styled to match the rest of the editor surface.\n * Used for boolean fields like `optional`, `multiline`, etc.\n * @param props - props\n * @param props.id - input element id (for label association)\n * @param props.label - visible label\n * @param props.help - optional helper text below the checkbox\n * @param props.checked - whether the checkbox is checked\n * @param props.onChange - called with the new checked state\n * @returns the rendered checkbox row\n */\nfunction CheckboxField({\n id,\n label,\n help,\n checked,\n onChange\n}: {\n id: string;\n label: string;\n help?: string;\n checked: boolean;\n onChange: (checked: boolean) => void;\n}) {\n return (\n <div className=\"flex flex-col gap-1\">\n <div className=\"flex items-center gap-2\">\n <input\n id={id}\n type=\"checkbox\"\n checked={checked}\n onChange={(e) => onChange(e.target.checked)}\n className=\"h-3.5 w-3.5 cursor-pointer rounded border-input\"\n />\n <Label htmlFor={id} className=\"cursor-pointer text-xs\">\n {label}\n </Label>\n </div>\n {help ? <p className=\"ml-5 text-[11px] leading-snug text-muted-foreground\">{help}</p> : null}\n </div>\n );\n}\n","import { Textarea } from '../../lib/ui/textarea';\nimport type { MarkdownBlock } from '../../types';\nimport { EditorField } from './field';\nimport type { BlockEditorProps } from './types';\n\n/**\n * Editor form for markdown blocks. Single textarea for the markdown\n * source. Rendered with GFM (tables, task lists, syntax highlighting)\n * by `slack-blocks-to-jsx` in the preview.\n * @param props - editor props\n * @param props.block - the markdown block to edit\n * @param props.onChange - called with the updated block payload\n * @returns the rendered markdown editor form\n */\nexport function MarkdownEditor({ block, onChange }: BlockEditorProps<MarkdownBlock>) {\n return (\n <EditorField\n label=\"Markdown\"\n help=\"Standard markdown with GFM: **bold**, _italic_, lists, tables, ```code```, [links](url).\"\n htmlFor=\"markdown-text\"\n >\n <Textarea\n id=\"markdown-text\"\n value={block.text ?? ''}\n rows={8}\n placeholder=\"e.g. **Roadmap**\\n\\n- Item one\\n- Item two\"\n onChange={(e) => onChange({ ...block, text: e.target.value })}\n />\n </EditorField>\n );\n}\n","import type {\n AnyRichTextBlockElement,\n AnyRichTextSectionElement,\n RichTextBlock,\n RichTextSectionElementStyleWithCode,\n RichTextSectionLink\n} from 'slack-web-api-client';\n\ntype RichStyle = RichTextSectionElementStyleWithCode;\n\n/**\n * Minimal ProseMirror node shape we read/write. Mirrors the JSON format\n * TipTap emits via `editor.getJSON()` and accepts via `setContent`.\n * We avoid pulling in `prosemirror-model` types so this file stays\n * dependency-free for tests.\n */\nexport interface PMNode {\n type: string;\n attrs?: Record<string, unknown>;\n content?: PMNode[];\n marks?: { type: string; attrs?: Record<string, unknown> }[];\n text?: string;\n}\n\nconst SUPPORTED_BLOCK_KINDS = new Set([\n 'rich_text_section',\n 'rich_text_list',\n 'rich_text_quote',\n 'rich_text_preformatted'\n]);\n\nconst SUPPORTED_INLINE_KINDS = new Set(['text', 'link']);\n\nconst SUPPORTED_TEXT_STYLE_KEYS = new Set(['bold', 'italic', 'strike', 'code']);\n\n/**\n * Slack's documented maximum value for `indent` on a rich_text_list.\n * Deeper nesting is flattened to this depth on export.\n */\nconst MAX_LIST_INDENT = 8;\n\n/**\n * Reasons a Slack rich_text payload can't round-trip cleanly through the\n * TipTap WYSIWYG (paragraphs, lists, blockquote, code block, plus\n * bold/italic/strike/code marks and links). Anything else (mentions,\n * broadcasts, emoji, list indent, etc.) ends up in this list so the UI\n * can offer the structured editor instead.\n */\nexport interface LossyReason {\n /** Short label suitable for a UI badge or list item. */\n label: string;\n /** Path within the rich_text payload, for diagnostics. */\n where: string;\n}\n\n/**\n * Inspects a rich_text block and reports anything the WYSIWYG converter\n * would drop on a round trip.\n * @param block - the rich_text block to inspect\n * @returns array of reasons; an empty array means safe to round-trip\n */\nexport function detectLossy(block: RichTextBlock): LossyReason[] {\n const out: LossyReason[] = [];\n const blocks = block.elements ?? [];\n blocks.forEach((el, blockIdx) => {\n const where = `elements[${blockIdx}]`;\n if (!SUPPORTED_BLOCK_KINDS.has(el.type)) {\n out.push({ label: `Unsupported element: ${el.type}`, where });\n return;\n }\n if (el.type === 'rich_text_list') {\n if ((el.border ?? 0) > 0) {\n out.push({ label: 'List border', where });\n }\n el.elements?.forEach((item, itemIdx) => {\n scanInlines(item.elements ?? [], `${where}.elements[${itemIdx}]`, out);\n });\n return;\n }\n if ('border' in el && (el.border ?? 0) > 0) {\n out.push({ label: 'Quote/preformatted border', where });\n }\n scanInlines(el.elements ?? [], where, out);\n });\n return out;\n}\n\n/**\n * Walks inline elements and pushes a LossyReason for each unsupported feature.\n * @param inlines - inline elements to scan\n * @param where - dotted path describing the location, used in diagnostics\n * @param out - accumulator the helper appends LossyReason entries to\n */\nfunction scanInlines(inlines: AnyRichTextSectionElement[], where: string, out: LossyReason[]) {\n inlines.forEach((inline, i) => {\n const sub = `${where}.elements[${i}]`;\n if (!SUPPORTED_INLINE_KINDS.has(inline.type)) {\n out.push({ label: `Inline: ${inline.type}`, where: sub });\n return;\n }\n if (inline.type === 'text') {\n const style = inline.style;\n if (style) {\n for (const k of Object.keys(style)) {\n if (!SUPPORTED_TEXT_STYLE_KEYS.has(k)) {\n out.push({ label: `Text style: ${k}`, where: sub });\n }\n }\n }\n }\n });\n}\n\n/**\n * Converts a Slack rich_text block to a TipTap-compatible ProseMirror\n * `doc` node. Anything not in {@link detectLossy}'s supported set is\n * dropped (callers should pre-flight with `detectLossy`).\n * @param block - the rich_text block to convert\n * @returns a ProseMirror `doc` node\n */\nexport function richTextToProseMirror(block: RichTextBlock): PMNode {\n const content: PMNode[] = [];\n // Track the most-recent list at each indent level so we can append\n // sibling rich_text_list elements with the same indent and nest deeper\n // ones inside the parent's last listItem.\n const listsByIndent = new Map<number, PMNode>();\n\n for (const el of block.elements ?? []) {\n if (el.type === 'rich_text_list') {\n appendRichTextList(el, content, listsByIndent);\n continue;\n }\n listsByIndent.clear();\n const node = blockElementToPM(el);\n if (node) {\n content.push(node);\n }\n }\n\n return {\n type: 'doc',\n content: content.length > 0 ? content : [{ type: 'paragraph' }]\n };\n}\n\n/**\n * Appends a Slack rich_text_list as a ProseMirror list, nesting deeper\n * indents inside the previous level's last list item.\n * @param el - the Slack rich_text_list element\n * @param topLevel - the running array of top-level ProseMirror nodes\n * @param listsByIndent - map tracking the open list at each indent level\n */\nfunction appendRichTextList(\n el: Extract<AnyRichTextBlockElement, { type: 'rich_text_list' }>,\n topLevel: PMNode[],\n listsByIndent: Map<number, PMNode>\n) {\n const indent = el.indent ?? 0;\n const listType = el.style === 'ordered' ? 'orderedList' : 'bulletList';\n const items: PMNode[] = (el.elements ?? []).map((section) => ({\n type: 'listItem',\n content: [{ type: 'paragraph', content: inlinesToPM(section.elements ?? []) }]\n }));\n\n // Drop any deeper-indent lists from the running map; we've left them.\n for (const k of Array.from(listsByIndent.keys())) {\n if (k > indent) {\n listsByIndent.delete(k);\n }\n }\n\n const existing = listsByIndent.get(indent);\n if (existing && existing.type === listType) {\n existing.content = [...(existing.content ?? []), ...items];\n return;\n }\n\n const list: PMNode = { type: listType, content: items };\n listsByIndent.set(indent, list);\n\n if (indent === 0) {\n topLevel.push(list);\n return;\n }\n const parent = listsByIndent.get(indent - 1);\n if (!parent?.content || parent.content.length === 0) {\n // Skipped indent levels (uncommon). Fall back to top-level.\n topLevel.push(list);\n return;\n }\n const parentLastItem = parent.content[parent.content.length - 1];\n parentLastItem.content = [...(parentLastItem.content ?? []), list];\n}\n\n/**\n * Converts a single Slack rich_text block element to a ProseMirror node.\n * Lists are handled separately via {@link appendRichTextList}.\n * @param el - the Slack rich_text block element\n * @returns the corresponding ProseMirror node, or null for list elements\n */\nfunction blockElementToPM(el: AnyRichTextBlockElement): PMNode | null {\n if (el.type === 'rich_text_section') {\n return {\n type: 'paragraph',\n content: inlinesToPM(el.elements ?? [])\n };\n }\n if (el.type === 'rich_text_quote') {\n return {\n type: 'blockquote',\n content: [\n {\n type: 'paragraph',\n content: inlinesToPM(el.elements ?? [])\n }\n ]\n };\n }\n if (el.type === 'rich_text_preformatted') {\n const text = (el.elements ?? []).map((i) => (i.type === 'text' ? i.text : '')).join('');\n const node: PMNode = { type: 'codeBlock' };\n if (text) {\n node.content = [{ type: 'text', text }];\n }\n return node;\n }\n // rich_text_list is handled separately by appendRichTextList so we can\n // re-nest indented lists into ProseMirror's nested-list shape.\n return null;\n}\n\n/**\n * Converts Slack inline section elements (text, link) to ProseMirror text\n * nodes with the appropriate marks. Unsupported types are silently dropped.\n * @param inlines - inline elements from a section, quote, or list item\n * @returns the corresponding ProseMirror text nodes\n */\nfunction inlinesToPM(inlines: AnyRichTextSectionElement[]): PMNode[] {\n const out: PMNode[] = [];\n for (const inline of inlines) {\n if (inline.type === 'text') {\n if (!inline.text) {\n continue;\n }\n const marks = styleToMarks(inline.style);\n out.push({ type: 'text', text: inline.text, marks });\n } else if (inline.type === 'link') {\n const link = inline as RichTextSectionLink;\n const text = link.text || link.url || '';\n if (!text) {\n continue;\n }\n out.push({\n type: 'text',\n text,\n marks: [...styleToMarks(link.style as RichStyle | undefined), { type: 'link', attrs: { href: link.url } }]\n });\n }\n // unsupported inlines are silently dropped (caller pre-flighted)\n }\n return out;\n}\n\n/**\n * Converts Slack rich_text style flags to ProseMirror marks.\n * @param style - the Slack style flags, if any\n * @returns the corresponding ProseMirror marks (may be empty)\n */\nfunction styleToMarks(style: RichStyle | undefined): { type: string; attrs?: Record<string, unknown> }[] {\n if (!style) {\n return [];\n }\n const marks: { type: string }[] = [];\n if (style.bold) {\n marks.push({ type: 'bold' });\n }\n if (style.italic) {\n marks.push({ type: 'italic' });\n }\n if (style.strike) {\n marks.push({ type: 'strike' });\n }\n if (style.code) {\n marks.push({ type: 'code' });\n }\n return marks;\n}\n\n/**\n * Converts a TipTap `doc` node back to a Slack rich_text block.\n * Inverse of {@link richTextToProseMirror}.\n * @param doc - the ProseMirror `doc` node from `editor.getJSON()`\n * @returns a fresh rich_text block\n */\nexport function proseMirrorToRichText(doc: PMNode): RichTextBlock {\n const elements: AnyRichTextBlockElement[] = [];\n for (const node of doc.content ?? []) {\n pushBlockElements(node, 0, elements);\n }\n return { type: 'rich_text', elements };\n}\n\n/**\n * Translates one ProseMirror block-level node into Slack rich_text elements\n * and pushes them onto the output array.\n * @param node - the ProseMirror node to translate\n * @param indent - current list indent depth, used by nested lists\n * @param out - accumulator the helper appends Slack elements to\n */\nfunction pushBlockElements(node: PMNode, indent: number, out: AnyRichTextBlockElement[]) {\n if (node.type === 'paragraph') {\n out.push({\n type: 'rich_text_section',\n elements: proseMirrorInlinesToRichTextElements(node.content ?? [])\n });\n return;\n }\n if (node.type === 'bulletList' || node.type === 'orderedList') {\n flattenList(node, indent, out);\n return;\n }\n if (node.type === 'blockquote') {\n const para = node.content?.find((n) => n.type === 'paragraph') ?? node.content?.[0];\n out.push({\n type: 'rich_text_quote',\n elements: proseMirrorInlinesToRichTextElements(para?.content ?? [])\n });\n return;\n }\n if (node.type === 'codeBlock') {\n const text = (node.content ?? []).map((n) => n.text ?? '').join('');\n out.push({\n type: 'rich_text_preformatted',\n elements: [{ type: 'text', text }]\n });\n }\n}\n\n/**\n * Flattens a (possibly nested) ProseMirror list into sibling Slack\n * rich_text_list elements with increasing `indent` values.\n * @param listNode - the ProseMirror bullet or ordered list node\n * @param indent - current indent depth (0 at the top level)\n * @param out - accumulator the helper appends Slack elements to\n */\nfunction flattenList(listNode: PMNode, indent: number, out: AnyRichTextBlockElement[]) {\n const style = listNode.type === 'orderedList' ? 'ordered' : 'bullet';\n // Slack rich_text caps `indent` at 8. Clamp here so we never emit a\n // payload Slack will reject; deeper nesting will visually flatten in\n // the preview but text content is preserved.\n const clampedIndent = Math.min(indent, MAX_LIST_INDENT);\n // Buffer items at this indent into one rich_text_list. When an item\n // has nested lists, flush the buffer, then recurse into the nested\n // list at indent + 1, so Slack sees flat sibling lists with deeper\n // `indent` values.\n let buffered: {\n type: 'rich_text_section';\n elements: AnyRichTextSectionElement[];\n }[] = [];\n const flush = () => {\n if (buffered.length === 0) {\n return;\n }\n const list: AnyRichTextBlockElement = {\n type: 'rich_text_list',\n style,\n elements: buffered\n };\n if (clampedIndent > 0) {\n (list as { indent?: number }).indent = clampedIndent;\n }\n out.push(list);\n buffered = [];\n };\n\n for (const item of listNode.content ?? []) {\n if (item.type !== 'listItem') {\n continue;\n }\n let para: PMNode | undefined;\n const nested: PMNode[] = [];\n for (const child of item.content ?? []) {\n if (child.type === 'paragraph' && !para) {\n para = child;\n } else if (child.type === 'bulletList' || child.type === 'orderedList') {\n nested.push(child);\n }\n }\n buffered.push({\n type: 'rich_text_section',\n elements: proseMirrorInlinesToRichTextElements(para?.content ?? [])\n });\n if (nested.length > 0) {\n flush();\n for (const sub of nested) {\n flattenList(sub, indent + 1, out);\n }\n }\n }\n flush();\n}\n\n/**\n * Converts ProseMirror inline text nodes (with marks) back to Slack\n * inline elements, merging adjacent runs that share the same style.\n * @param nodes - ProseMirror text nodes from a paragraph or list item\n * @returns the corresponding Slack inline elements\n */\nfunction proseMirrorInlinesToRichTextElements(nodes: PMNode[]): AnyRichTextSectionElement[] {\n const out: AnyRichTextSectionElement[] = [];\n for (const node of nodes) {\n if (node.type !== 'text' || !node.text) {\n continue;\n }\n const linkMark = node.marks?.find((m) => m.type === 'link');\n const style = marksToStyle(node.marks ?? []);\n if (linkMark) {\n const url = String(linkMark.attrs?.href ?? '');\n const link: RichTextSectionLink = {\n type: 'link',\n url,\n text: node.text\n };\n if (Object.keys(style).length > 0) {\n link.style = style as RichTextSectionLink['style'];\n }\n out.push(link);\n } else {\n const text: AnyRichTextSectionElement = {\n type: 'text',\n text: node.text\n };\n if (Object.keys(style).length > 0) {\n (text as { style?: RichStyle }).style = style;\n }\n out.push(text);\n }\n }\n return mergeAdjacentTextRuns(out);\n}\n\n/**\n * Converts ProseMirror marks back to Slack rich_text style flags.\n * @param marks - the ProseMirror marks attached to a text node\n * @returns the corresponding Slack style flag object\n */\nfunction marksToStyle(marks: { type: string }[]): RichStyle {\n const style: Record<string, boolean> = {};\n for (const m of marks) {\n if (m.type === 'bold') {\n style.bold = true;\n }\n if (m.type === 'italic') {\n style.italic = true;\n }\n if (m.type === 'strike') {\n style.strike = true;\n }\n if (m.type === 'code') {\n style.code = true;\n }\n }\n return style as RichStyle;\n}\n\n/**\n * Concatenates adjacent text runs that share the same style flags.\n * @param inlines - inline elements possibly containing splittable runs\n * @returns a new array with adjacent matching text runs merged\n */\nfunction mergeAdjacentTextRuns(inlines: AnyRichTextSectionElement[]): AnyRichTextSectionElement[] {\n const out: AnyRichTextSectionElement[] = [];\n for (const inline of inlines) {\n const prev = out[out.length - 1];\n if (\n prev &&\n prev.type === 'text' &&\n inline.type === 'text' &&\n sameStyle((prev as { style?: RichStyle }).style, (inline as { style?: RichStyle }).style)\n ) {\n out[out.length - 1] = {\n ...prev,\n text: (prev.text ?? '') + (inline.text ?? '')\n };\n continue;\n }\n out.push(inline);\n }\n return out;\n}\n\n/**\n * Returns true when two style flag objects have the same set of keys.\n * @param a - first style flag object\n * @param b - second style flag object\n * @returns true when both have the same active flags\n */\nfunction sameStyle(a: RichStyle | undefined, b: RichStyle | undefined): boolean {\n const ak = a ? Object.keys(a).sort() : [];\n const bk = b ? Object.keys(b).sort() : [];\n if (ak.length !== bk.length) {\n return false;\n }\n return ak.every((k, i) => k === bk[i]);\n}\n","import { Plus, Trash2 } from 'lucide-react';\nimport type {\n AnyRichTextBlockElement,\n AnyRichTextSectionElement,\n RichTextBlock,\n RichTextList,\n RichTextPreformatted,\n RichTextQuote,\n RichTextSection,\n RichTextSectionElementStyle,\n RichTextSectionLink,\n RichTextSectionText\n} from 'slack-web-api-client';\nimport { cn } from '../../lib/cn';\nimport { Button } from '../../lib/ui/button';\nimport { Input } from '../../lib/ui/input';\nimport { Label } from '../../lib/ui/label';\nimport { RadioGroup, RadioGroupItem } from '../../lib/ui/radio-group';\nimport { EditorField } from './field';\nimport type { BlockEditorProps } from './types';\n\ntype BlockElementKind = AnyRichTextBlockElement['type'];\ntype InlineKind = 'text' | 'link' | 'emoji' | 'user' | 'channel' | 'broadcast' | 'usergroup';\n\ntype SectionLikeKind = 'rich_text_section' | 'rich_text_quote' | 'rich_text_preformatted';\n\nconst BLOCK_ELEMENT_LABEL: Record<BlockElementKind, string> = {\n rich_text_section: 'Section',\n rich_text_list: 'List',\n rich_text_quote: 'Quote',\n rich_text_preformatted: 'Preformatted'\n};\n\nconst INLINE_LABEL: Record<InlineKind, string> = {\n text: 'Text',\n link: 'Link',\n emoji: 'Emoji',\n user: 'User',\n channel: 'Channel',\n broadcast: 'Broadcast',\n usergroup: 'User group'\n};\n\nconst STYLE_KEYS = ['bold', 'italic', 'strike', 'code'] as const;\ntype StyleKey = (typeof STYLE_KEYS)[number];\n\n/**\n * Structured fallback editor for rich_text blocks. Used when the WYSIWYG\n * (TipTap) editor would lose data on a round trip (mentions, broadcasts,\n * emoji, list indent, etc.). Renders the top-level elements as a list of\n * cards with a type switcher; each section-like element exposes its\n * inline elements as nested cards with the fields appropriate to that\n * type. Less common inline types (date, color, team) are not authorable\n * here; they're preserved on the block payload as-is.\n * @param props - editor props\n * @param props.block - the rich_text block to edit\n * @param props.onChange - called with the updated block payload\n * @returns the rendered structured rich text editor form\n */\nexport function RichTextStructuredEditor({ block, onChange }: BlockEditorProps<RichTextBlock>) {\n const elements = block.elements ?? [];\n\n const replaceElements = (next: AnyRichTextBlockElement[]) => {\n onChange({ ...block, elements: next });\n };\n\n const updateAt = (idx: number, next: AnyRichTextBlockElement) => {\n replaceElements(elements.map((el, i) => (i === idx ? next : el)));\n };\n\n const removeAt = (idx: number) => {\n replaceElements(elements.filter((_, i) => i !== idx));\n };\n\n const addElement = (kind: BlockElementKind) => {\n replaceElements([...elements, defaultBlockElement(kind)]);\n };\n\n return (\n <div className=\"flex flex-col gap-3\">\n {elements.length === 0 ? (\n <p className=\"text-[11px] leading-snug text-muted-foreground\">\n No elements yet. Add a section, list, quote, or preformatted block to start.\n </p>\n ) : null}\n {elements.map((el, idx) => (\n <BlockElementCard\n key={`${el.type}-${idx}`}\n index={idx}\n element={el}\n onChange={(next) => updateAt(idx, next)}\n onRemove={() => removeAt(idx)}\n />\n ))}\n <div className=\"flex flex-wrap gap-2\">\n {(Object.keys(BLOCK_ELEMENT_LABEL) as BlockElementKind[]).map((kind) => (\n <Button key={kind} type=\"button\" size=\"sm\" onClick={() => addElement(kind)}>\n <Plus className=\"h-3.5 w-3.5\" />\n Add {BLOCK_ELEMENT_LABEL[kind]}\n </Button>\n ))}\n </div>\n </div>\n );\n}\n\n/**\n * Card UI for one top-level rich_text block element with a type switcher.\n * @param props - card props\n * @param props.index - position of the element within the rich_text block\n * @param props.element - the block element being edited\n * @param props.onChange - called with the updated element\n * @param props.onRemove - called when the user removes the element\n * @returns the rendered block element card\n */\nfunction BlockElementCard({\n index,\n element,\n onChange,\n onRemove\n}: {\n index: number;\n element: AnyRichTextBlockElement;\n onChange: (next: AnyRichTextBlockElement) => void;\n onRemove: () => void;\n}) {\n const setKind = (next: BlockElementKind) => {\n if (next === element.type) {\n return;\n }\n onChange(reshapeBlockElement(element, next));\n };\n\n return (\n <div className=\"flex flex-col gap-2 rounded-md border bg-muted/20 p-3\">\n <div className=\"flex items-center justify-between gap-2\">\n <span className=\"text-xs font-medium text-foreground\">\n {BLOCK_ELEMENT_LABEL[element.type]} {index + 1}\n </span>\n <button\n type=\"button\"\n aria-label=\"Remove element\"\n onClick={onRemove}\n className=\"rounded p-1 text-muted-foreground hover:bg-destructive/10 hover:text-destructive\"\n >\n <Trash2 className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n <EditorField label=\"Type\">\n <RadioGroup\n value={element.type}\n onValueChange={(v) => setKind(v as BlockElementKind)}\n className=\"flex flex-row flex-wrap gap-3\"\n >\n {(Object.keys(BLOCK_ELEMENT_LABEL) as BlockElementKind[]).map((kind) => (\n <div key={kind} className=\"flex items-center gap-1.5\">\n <RadioGroupItem value={kind} id={`rt-${index}-kind-${kind}`} />\n <Label htmlFor={`rt-${index}-kind-${kind}`} className=\"text-xs\">\n {BLOCK_ELEMENT_LABEL[kind]}\n </Label>\n </div>\n ))}\n </RadioGroup>\n </EditorField>\n {element.type === 'rich_text_list' ? (\n <ListBody parentIndex={index} element={element} onChange={(next) => onChange(next)} />\n ) : (\n <SectionLikeBody parentIndex={index} element={element} onChange={(next) => onChange(next)} />\n )}\n </div>\n );\n}\n\n/**\n * Body editor for section, quote, and preformatted elements (their inlines).\n * @param props - body props\n * @param props.parentIndex - index of the parent element, used to build ids\n * @param props.element - the section-like element being edited\n * @param props.onChange - called with the updated element\n * @returns the rendered inline elements editor\n */\nfunction SectionLikeBody({\n parentIndex,\n element,\n onChange\n}: {\n parentIndex: number;\n element: RichTextSection | RichTextQuote | RichTextPreformatted;\n onChange: (next: RichTextSection | RichTextQuote | RichTextPreformatted) => void;\n}) {\n return (\n <InlineElementsEditor\n idPrefix={`rt-${parentIndex}-section`}\n elements={element.elements ?? []}\n onChange={(next) => onChange({ ...element, elements: next })}\n />\n );\n}\n\n/**\n * Body editor for rich_text_list elements: style, indent, and items.\n * @param props - body props\n * @param props.parentIndex - index of the parent element, used to build ids\n * @param props.element - the list element being edited\n * @param props.onChange - called with the updated element\n * @returns the rendered list editor\n */\nfunction ListBody({\n parentIndex,\n element,\n onChange\n}: {\n parentIndex: number;\n element: RichTextList;\n onChange: (next: RichTextList) => void;\n}) {\n const items = element.elements ?? [];\n\n const updateItem = (idx: number, next: RichTextSection) => {\n onChange({\n ...element,\n elements: items.map((it, i) => (i === idx ? next : it))\n });\n };\n\n const removeItem = (idx: number) => {\n onChange({\n ...element,\n elements: items.filter((_, i) => i !== idx)\n });\n };\n\n const addItem = () => {\n onChange({\n ...element,\n elements: [...items, defaultSection()]\n });\n };\n\n return (\n <div className=\"flex flex-col gap-3\">\n <div className=\"flex flex-wrap items-end gap-3\">\n <EditorField label=\"Style\">\n <RadioGroup\n value={element.style ?? 'bullet'}\n onValueChange={(v) =>\n onChange({\n ...element,\n style: v === 'ordered' ? 'ordered' : 'bullet'\n })\n }\n className=\"flex flex-row gap-3\"\n >\n {(['bullet', 'ordered'] as const).map((s) => (\n <div key={s} className=\"flex items-center gap-1.5\">\n <RadioGroupItem value={s} id={`rt-${parentIndex}-list-${s}`} />\n <Label htmlFor={`rt-${parentIndex}-list-${s}`} className=\"text-xs capitalize\">\n {s}\n </Label>\n </div>\n ))}\n </RadioGroup>\n </EditorField>\n <EditorField label=\"Indent\" htmlFor={`rt-${parentIndex}-indent`}>\n <Input\n id={`rt-${parentIndex}-indent`}\n type=\"number\"\n min={0}\n max={8}\n value={element.indent ?? 0}\n className=\"w-20\"\n onChange={(e) => {\n const n = Number(e.target.value);\n onChange({\n ...element,\n indent: Number.isFinite(n) ? Math.max(0, n) : 0\n });\n }}\n />\n </EditorField>\n </div>\n {items.map((item, idx) => (\n <div key={`item-${idx}`} className=\"flex flex-col gap-2 rounded border bg-background p-2\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-[11px] font-medium text-muted-foreground\">Item {idx + 1}</span>\n <button\n type=\"button\"\n aria-label=\"Remove item\"\n onClick={() => removeItem(idx)}\n className=\"rounded p-1 text-muted-foreground hover:bg-destructive/10 hover:text-destructive\"\n >\n <Trash2 className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n <InlineElementsEditor\n idPrefix={`rt-${parentIndex}-item-${idx}`}\n elements={item.elements ?? []}\n onChange={(next) => updateItem(idx, { ...item, elements: next })}\n />\n </div>\n ))}\n <Button type=\"button\" size=\"sm\" onClick={addItem} className=\"self-start\">\n <Plus className=\"h-3.5 w-3.5\" />\n Add item\n </Button>\n </div>\n );\n}\n\n/**\n * Editor for a flat list of inline rich_text section elements.\n * @param props - editor props\n * @param props.idPrefix - prefix used to build child input ids\n * @param props.elements - the inline elements to edit\n * @param props.onChange - called with the updated inline list\n * @returns the rendered inline elements editor\n */\nfunction InlineElementsEditor({\n idPrefix,\n elements,\n onChange\n}: {\n idPrefix: string;\n elements: AnyRichTextSectionElement[];\n onChange: (next: AnyRichTextSectionElement[]) => void;\n}) {\n const updateAt = (idx: number, next: AnyRichTextSectionElement) => {\n onChange(elements.map((el, i) => (i === idx ? next : el)));\n };\n const removeAt = (idx: number) => {\n onChange(elements.filter((_, i) => i !== idx));\n };\n const addInline = (kind: InlineKind) => {\n onChange([...elements, defaultInline(kind)]);\n };\n\n return (\n <div className=\"flex flex-col gap-2\">\n {elements.length === 0 ? (\n <p className=\"text-[11px] leading-snug text-muted-foreground\">\n No inline elements yet. Add a text run, link, emoji, or mention.\n </p>\n ) : null}\n {elements.map((el, idx) => (\n <InlineElementCard\n key={`${el.type}-${idx}`}\n idPrefix={`${idPrefix}-inline-${idx}`}\n element={el}\n onChange={(next) => updateAt(idx, next)}\n onRemove={() => removeAt(idx)}\n />\n ))}\n <div className=\"flex flex-wrap gap-1.5\">\n {(Object.keys(INLINE_LABEL) as InlineKind[]).map((kind) => (\n <button\n key={kind}\n type=\"button\"\n onClick={() => addInline(kind)}\n className=\"inline-flex cursor-pointer items-center gap-1 rounded border border-dashed border-border px-2 py-1 text-[11px] text-muted-foreground hover:border-border hover:bg-accent hover:text-foreground\"\n >\n <Plus className=\"h-3 w-3\" />\n {INLINE_LABEL[kind]}\n </button>\n ))}\n </div>\n </div>\n );\n}\n\n/**\n * Card UI for one inline element with the appropriate fields for its type.\n * @param props - card props\n * @param props.idPrefix - prefix used to build child input ids\n * @param props.element - the inline element being edited\n * @param props.onChange - called with the updated element\n * @param props.onRemove - called when the user removes the element\n * @returns the rendered inline element card\n */\nfunction InlineElementCard({\n idPrefix,\n element,\n onChange,\n onRemove\n}: {\n idPrefix: string;\n element: AnyRichTextSectionElement;\n onChange: (next: AnyRichTextSectionElement) => void;\n onRemove: () => void;\n}) {\n const editableKind = inlineKindFor(element);\n\n return (\n <div className=\"flex flex-col gap-2 rounded border bg-background p-2\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-[11px] font-medium text-foreground\">\n {editableKind ? INLINE_LABEL[editableKind] : element.type}\n </span>\n <button\n type=\"button\"\n aria-label=\"Remove inline element\"\n onClick={onRemove}\n className=\"rounded p-1 text-muted-foreground hover:bg-destructive/10 hover:text-destructive\"\n >\n <Trash2 className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n {editableKind === null ? (\n <p className=\"text-[11px] leading-snug text-muted-foreground\">\n {element.type} elements are preserved on the block but not editable in the visual builder. Use the View JSON\n drawer.\n </p>\n ) : (\n <InlineFields idPrefix={idPrefix} element={element} kind={editableKind} onChange={onChange} />\n )}\n </div>\n );\n}\n\n/**\n * Renders the field set appropriate to the inline element's kind.\n * @param props - field props\n * @param props.idPrefix - prefix used to build input ids\n * @param props.element - the inline element being edited\n * @param props.kind - the editable kind dispatching which fields to show\n * @param props.onChange - called with the updated element\n * @returns the rendered fields for the given kind\n */\nfunction InlineFields({\n idPrefix,\n element,\n kind,\n onChange\n}: {\n idPrefix: string;\n element: AnyRichTextSectionElement;\n kind: InlineKind;\n onChange: (next: AnyRichTextSectionElement) => void;\n}) {\n if (kind === 'text') {\n const text = element as RichTextSectionText;\n return (\n <div className=\"flex flex-col gap-2\">\n <EditorField label=\"Text\" htmlFor={`${idPrefix}-text`}>\n <Input\n id={`${idPrefix}-text`}\n value={text.text ?? ''}\n onChange={(e) => onChange({ ...text, text: e.target.value })}\n />\n </EditorField>\n <StyleToggles idPrefix={idPrefix} style={text.style} onChange={(s) => onChange({ ...text, style: s })} />\n </div>\n );\n }\n\n if (kind === 'link') {\n const link = element as RichTextSectionLink;\n return (\n <div className=\"flex flex-col gap-2\">\n <EditorField label=\"URL\" htmlFor={`${idPrefix}-url`}>\n <Input\n id={`${idPrefix}-url`}\n type=\"url\"\n value={link.url ?? ''}\n placeholder=\"e.g. https://slack.com\"\n onChange={(e) => onChange({ ...link, url: e.target.value })}\n />\n </EditorField>\n <EditorField\n label=\"Display text\"\n help=\"Optional. Falls back to the URL when empty.\"\n htmlFor={`${idPrefix}-link-text`}\n >\n <Input\n id={`${idPrefix}-link-text`}\n value={link.text ?? ''}\n onChange={(e) => onChange({ ...link, text: e.target.value || undefined })}\n />\n </EditorField>\n <StyleToggles\n idPrefix={idPrefix}\n style={link.style as RichTextSectionElementStyle | undefined}\n onChange={(s) =>\n onChange({\n ...link,\n style: s as RichTextSectionLink['style']\n })\n }\n />\n </div>\n );\n }\n\n if (kind === 'emoji') {\n const emoji = element as { type: 'emoji'; name?: string };\n return (\n <EditorField label=\"Name\" help=\"Emoji shortcode without colons, e.g. wave\" htmlFor={`${idPrefix}-emoji`}>\n <Input\n id={`${idPrefix}-emoji`}\n value={emoji.name ?? ''}\n placeholder=\"e.g. wave\"\n onChange={(e) => onChange({ ...emoji, name: e.target.value })}\n />\n </EditorField>\n );\n }\n\n if (kind === 'user') {\n const user = element as { type: 'user'; user_id?: string };\n return (\n <EditorField label=\"User ID\" help=\"The Slack user ID, e.g. U01ABCDEF\" htmlFor={`${idPrefix}-user`}>\n <Input\n id={`${idPrefix}-user`}\n value={user.user_id ?? ''}\n placeholder=\"e.g. U01ABCDEF\"\n onChange={(e) => onChange({ ...user, user_id: e.target.value })}\n />\n </EditorField>\n );\n }\n\n if (kind === 'channel') {\n const channel = element as { type: 'channel'; channel_id?: string };\n return (\n <EditorField label=\"Channel ID\" help=\"The Slack channel ID, e.g. C01ABCDEF\" htmlFor={`${idPrefix}-channel`}>\n <Input\n id={`${idPrefix}-channel`}\n value={channel.channel_id ?? ''}\n placeholder=\"e.g. C01ABCDEF\"\n onChange={(e) => onChange({ ...channel, channel_id: e.target.value })}\n />\n </EditorField>\n );\n }\n\n if (kind === 'broadcast') {\n const broadcast = element as {\n type: 'broadcast';\n range?: 'here' | 'channel' | 'everyone';\n };\n return (\n <EditorField label=\"Range\">\n <RadioGroup\n value={broadcast.range ?? 'here'}\n onValueChange={(v) =>\n onChange({\n ...broadcast,\n range: v as 'here' | 'channel' | 'everyone'\n })\n }\n className=\"flex flex-row gap-3\"\n >\n {(['here', 'channel', 'everyone'] as const).map((r) => (\n <div key={r} className=\"flex items-center gap-1.5\">\n <RadioGroupItem value={r} id={`${idPrefix}-bcast-${r}`} />\n <Label htmlFor={`${idPrefix}-bcast-${r}`} className=\"text-xs capitalize\">\n @{r}\n </Label>\n </div>\n ))}\n </RadioGroup>\n </EditorField>\n );\n }\n\n // usergroup\n const ug = element as { type: 'usergroup'; usergroup_id?: string };\n return (\n <EditorField\n label=\"User group ID\"\n help=\"The Slack user group (subteam) ID, e.g. S01ABCDEF\"\n htmlFor={`${idPrefix}-ug`}\n >\n <Input\n id={`${idPrefix}-ug`}\n value={ug.usergroup_id ?? ''}\n placeholder=\"e.g. S01ABCDEF\"\n onChange={(e) => onChange({ ...ug, usergroup_id: e.target.value })}\n />\n </EditorField>\n );\n}\n\n/**\n * Toggle row for bold/italic/strike/code style flags on an inline element.\n * @param props - toggle props\n * @param props.idPrefix - prefix used to build button ids\n * @param props.style - the current style flags, if any\n * @param props.onChange - called with the updated style or undefined when empty\n * @returns the rendered style toggle row\n */\nfunction StyleToggles({\n idPrefix,\n style,\n onChange\n}: {\n idPrefix: string;\n style: RichTextSectionElementStyle | undefined;\n onChange: (next: RichTextSectionElementStyle | undefined) => void;\n}) {\n const current = style ?? {};\n const toggle = (key: StyleKey) => {\n const next: Record<string, boolean> = { ...current };\n if (next[key]) {\n delete next[key];\n } else {\n next[key] = true;\n }\n onChange(Object.keys(next).length > 0 ? (next as RichTextSectionElementStyle) : undefined);\n };\n\n return (\n <div className=\"flex flex-wrap gap-1.5\">\n {STYLE_KEYS.map((key) => {\n const active = Boolean((current as Record<string, boolean>)[key]);\n return (\n <button\n key={key}\n type=\"button\"\n onClick={() => toggle(key)}\n className={cn(\n 'cursor-pointer rounded border px-2 py-0.5 text-[11px] capitalize transition-colors',\n active\n ? 'border-primary bg-primary/10 text-foreground'\n : 'border-border bg-background text-muted-foreground hover:bg-accent hover:text-foreground'\n )}\n aria-pressed={active}\n id={`${idPrefix}-style-${key}`}\n >\n {key}\n </button>\n );\n })}\n </div>\n );\n}\n\n/**\n * Returns the editable inline kind for an element, or null if not authorable.\n * @param el - the inline element to classify\n * @returns the matching InlineKind, or null when the type is not editable\n */\nfunction inlineKindFor(el: AnyRichTextSectionElement): InlineKind | null {\n switch (el.type) {\n case 'text':\n return 'text';\n case 'link':\n return 'link';\n case 'emoji':\n return 'emoji';\n case 'user':\n return 'user';\n case 'channel':\n return 'channel';\n case 'broadcast':\n return 'broadcast';\n case 'usergroup':\n return 'usergroup';\n default:\n return null;\n }\n}\n\n/**\n * Builds a fresh block element of the requested kind with sample content.\n * @param kind - the kind of block element to create\n * @returns a freshly constructed block element\n */\nfunction defaultBlockElement(kind: BlockElementKind): AnyRichTextBlockElement {\n switch (kind) {\n case 'rich_text_section':\n return defaultSection();\n case 'rich_text_list':\n return {\n type: 'rich_text_list',\n style: 'bullet',\n elements: [defaultSection('First item')]\n };\n case 'rich_text_quote':\n return {\n type: 'rich_text_quote',\n elements: [{ type: 'text', text: 'Quoted text' }]\n };\n case 'rich_text_preformatted':\n return {\n type: 'rich_text_preformatted',\n elements: [{ type: 'text', text: 'Preformatted text' }]\n };\n }\n}\n\n/**\n * Builds a rich_text_section containing a single text run.\n * @param text - the initial text run content\n * @returns a freshly constructed rich_text_section\n */\nfunction defaultSection(text = 'Text'): RichTextSection {\n return {\n type: 'rich_text_section',\n elements: [{ type: 'text', text }]\n };\n}\n\n/**\n * Builds a fresh inline element of the requested kind with sample content.\n * @param kind - the kind of inline element to create\n * @returns a freshly constructed inline element\n */\nfunction defaultInline(kind: InlineKind): AnyRichTextSectionElement {\n switch (kind) {\n case 'text':\n return { type: 'text', text: 'text' };\n case 'link':\n return { type: 'link', url: 'https://slack.com', text: 'link' };\n case 'emoji':\n return { type: 'emoji', name: 'wave' };\n case 'user':\n return { type: 'user', user_id: 'U01ABCDEF' };\n case 'channel':\n return { type: 'channel', channel_id: 'C01ABCDEF' };\n case 'broadcast':\n return { type: 'broadcast', range: 'here' };\n case 'usergroup':\n return { type: 'usergroup', usergroup_id: 'S01ABCDEF' };\n }\n}\n\n/**\n * Re-types a block element while preserving inline content where possible.\n * @param el - the existing block element\n * @param to - the target block element kind\n * @returns the reshaped element\n */\nfunction reshapeBlockElement(el: AnyRichTextBlockElement, to: BlockElementKind): AnyRichTextBlockElement {\n if (el.type === 'rich_text_list' && to !== 'rich_text_list') {\n // collapse list items into a single section's worth of inlines\n const inlines = (el.elements ?? []).flatMap((item) => item.elements ?? []);\n return wrapInlines(to as SectionLikeKind, inlines);\n }\n if (el.type !== 'rich_text_list' && to === 'rich_text_list') {\n // wrap existing inlines as a single list item\n return {\n type: 'rich_text_list',\n style: 'bullet',\n elements: [{ type: 'rich_text_section', elements: el.elements ?? [] }]\n };\n }\n if (el.type !== 'rich_text_list' && to !== 'rich_text_list') {\n return wrapInlines(to as SectionLikeKind, el.elements ?? []);\n }\n return el;\n}\n\n/**\n * Wraps a set of inline elements in the chosen section-like container.\n * @param kind - the section-like kind to construct\n * @param inlines - the inline elements to wrap\n * @returns the wrapped section-like element\n */\nfunction wrapInlines(\n kind: SectionLikeKind,\n inlines: AnyRichTextSectionElement[]\n): RichTextSection | RichTextQuote | RichTextPreformatted {\n return { type: kind, elements: inlines } as RichTextSection | RichTextQuote | RichTextPreformatted;\n}\n","import Link from '@tiptap/extension-link';\nimport { type Editor, EditorContent, useEditor } from '@tiptap/react';\nimport StarterKit from '@tiptap/starter-kit';\nimport {\n Bold,\n Code,\n Code2,\n Italic,\n Link as LinkIcon,\n List,\n ListOrdered,\n Quote,\n Redo2,\n Strikethrough,\n Undo2\n} from 'lucide-react';\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport type { RichTextBlock } from 'slack-web-api-client';\nimport { cn } from '../../lib/cn';\nimport {\n detectLossy,\n type LossyReason,\n proseMirrorToRichText,\n richTextToProseMirror\n} from '../../lib/rich-text-tiptap';\nimport { Button } from '../../lib/ui/button';\nimport { Input } from '../../lib/ui/input';\nimport { Label } from '../../lib/ui/label';\nimport { Popover, PopoverContent, PopoverTrigger } from '../../lib/ui/popover';\nimport { RichTextStructuredEditor } from './rich-text-structured-editor';\nimport type { BlockEditorProps } from './types';\n\n/**\n * WYSIWYG editor for rich_text blocks, backed by TipTap. Falls back to\n * the structured editor when the block uses features the WYSIWYG can't\n * round-trip (mentions, emoji, broadcasts, list indent, etc.). The user\n * can also opt into the structured editor via a \"More options\" toggle.\n * @param props - editor props\n * @param props.block - the rich_text block to edit\n * @param props.onChange - called with the updated block payload\n * @returns the rendered rich text editor form\n */\nexport function RichTextEditor({ block, onChange }: BlockEditorProps<RichTextBlock>) {\n const lossyReasons = detectLossy(block);\n\n if (lossyReasons.length > 0) {\n return (\n <div className=\"flex flex-col gap-3\">\n <LossyBanner reasons={lossyReasons} />\n <RichTextStructuredEditor block={block} onChange={onChange} />\n </div>\n );\n }\n\n return <RichTextWysiwygEditor block={block} onChange={onChange} />;\n}\n\n/**\n * Inline notice shown above the structured editor when round-trip would lose data.\n * @param props - banner props\n * @param props.reasons - list of features that prevent WYSIWYG round-trip\n * @returns the rendered banner\n */\nfunction LossyBanner({ reasons }: { reasons: LossyReason[] }) {\n const sample = reasons.slice(0, 3).map((r) => r.label);\n const more = reasons.length - sample.length;\n return (\n <div className=\"rounded-md border border-amber-300 bg-amber-50 p-2 text-[11px] text-amber-900\">\n <p className=\"font-medium\">Editing in structured mode</p>\n <p className=\"leading-snug\">\n This block uses features the rich editor can't preserve on a round trip ({sample.join(', ')}\n {more > 0 ? `, +${more} more` : ''}).\n </p>\n </div>\n );\n}\n\n/**\n * TipTap-backed WYSIWYG editor for rich_text blocks that round-trip cleanly.\n * @param props - editor props\n * @param props.block - the rich_text block to edit\n * @param props.onChange - called with the updated block payload\n * @returns the rendered WYSIWYG editor\n */\nfunction RichTextWysiwygEditor({ block, onChange }: { block: RichTextBlock; onChange: (next: RichTextBlock) => void }) {\n // Track the last payload we emitted so we can ignore parent re-renders\n // that just echo our own changes back, avoiding feedback loops.\n const lastEmittedRef = useRef<RichTextBlock | null>(null);\n\n const handleUpdate = useCallback(\n (editor: Editor) => {\n const next = proseMirrorToRichText(editor.getJSON() as never);\n lastEmittedRef.current = next;\n onChange(next);\n },\n [onChange]\n );\n\n const editor = useEditor({\n extensions: [\n StarterKit.configure({\n heading: false,\n horizontalRule: false\n }),\n Link.configure({\n openOnClick: false,\n autolink: true,\n defaultProtocol: 'https',\n HTMLAttributes: { rel: 'noreferrer noopener', target: '_blank' }\n })\n ],\n content: richTextToProseMirror(block) as never,\n editorProps: {\n attributes: {\n class:\n 'bkb-rich-editor min-h-[120px] rounded-md border border-input bg-background px-3 py-2 text-sm focus:outline-none focus-visible:ring-1 focus-visible:ring-ring [&_p]:my-1 [&_ul]:my-1 [&_ul]:list-disc [&_ul]:pl-5 [&_ol]:my-1 [&_ol]:pl-5 [&_li]:my-0 [&_pre]:bg-muted [&_pre]:rounded [&_pre]:p-2 [&_code]:rounded [&_code]:bg-muted [&_code]:px-1 [&_blockquote]:border-l-2 [&_blockquote]:border-border [&_blockquote]:pl-3 [&_blockquote]:text-muted-foreground'\n }\n },\n onUpdate: ({ editor: ed }) => handleUpdate(ed)\n });\n\n // Keep editor in sync if the parent swaps in a different block\n // (e.g. the user opens a different rich_text block in the popover).\n useEffect(() => {\n if (!editor) {\n return;\n }\n if (lastEmittedRef.current && JSON.stringify(lastEmittedRef.current) === JSON.stringify(block)) {\n return;\n }\n editor.commands.setContent(richTextToProseMirror(block) as never, {\n emitUpdate: false\n });\n }, [block, editor]);\n\n if (!editor) {\n return <div className=\"min-h-[120px] rounded-md border border-input bg-background\" />;\n }\n\n return (\n <div className=\"flex flex-col gap-2\">\n <Toolbar editor={editor} />\n <EditorContent editor={editor} />\n </div>\n );\n}\n\n/**\n * Formatting toolbar for the WYSIWYG editor (marks, lists, blocks, undo/redo).\n * @param props - toolbar props\n * @param props.editor - the TipTap editor instance to drive\n * @returns the rendered toolbar\n */\nfunction Toolbar({ editor }: { editor: Editor }) {\n return (\n <div className=\"flex flex-wrap items-center gap-0.5 rounded-md border bg-muted/30 p-1\">\n <ToolbarButton\n label=\"Bold\"\n active={editor.isActive('bold')}\n onClick={() => editor.chain().focus().toggleBold().run()}\n Icon={Bold}\n />\n <ToolbarButton\n label=\"Italic\"\n active={editor.isActive('italic')}\n onClick={() => editor.chain().focus().toggleItalic().run()}\n Icon={Italic}\n />\n <ToolbarButton\n label=\"Strikethrough\"\n active={editor.isActive('strike')}\n onClick={() => editor.chain().focus().toggleStrike().run()}\n Icon={Strikethrough}\n />\n <ToolbarButton\n label=\"Inline code\"\n active={editor.isActive('code')}\n onClick={() => editor.chain().focus().toggleCode().run()}\n Icon={Code}\n />\n <Divider />\n <LinkPopover editor={editor} />\n <Divider />\n <ToolbarButton\n label=\"Bullet list\"\n active={editor.isActive('bulletList')}\n onClick={() => editor.chain().focus().toggleBulletList().run()}\n Icon={List}\n />\n <ToolbarButton\n label=\"Ordered list\"\n active={editor.isActive('orderedList')}\n onClick={() => editor.chain().focus().toggleOrderedList().run()}\n Icon={ListOrdered}\n />\n <ToolbarButton\n label=\"Quote\"\n active={editor.isActive('blockquote')}\n onClick={() => editor.chain().focus().toggleBlockquote().run()}\n Icon={Quote}\n />\n <ToolbarButton\n label=\"Code block\"\n active={editor.isActive('codeBlock')}\n onClick={() => editor.chain().focus().toggleCodeBlock().run()}\n Icon={Code2}\n />\n <Divider />\n <ToolbarButton\n label=\"Undo\"\n active={false}\n disabled={!editor.can().undo()}\n onClick={() => editor.chain().focus().undo().run()}\n Icon={Undo2}\n />\n <ToolbarButton\n label=\"Redo\"\n active={false}\n disabled={!editor.can().redo()}\n onClick={() => editor.chain().focus().redo().run()}\n Icon={Redo2}\n />\n </div>\n );\n}\n\n/**\n * Single icon button in the formatting toolbar.\n * @param props - button props\n * @param props.label - accessible label and tooltip text\n * @param props.active - whether the formatting at the cursor matches this button\n * @param props.disabled - whether the action is currently unavailable\n * @param props.onClick - called when the user activates the button\n * @param props.Icon - the lucide icon component to render\n * @returns the rendered toolbar button\n */\nfunction ToolbarButton({\n label,\n active,\n disabled,\n onClick,\n Icon\n}: {\n label: string;\n active: boolean;\n disabled?: boolean;\n onClick: () => void;\n Icon: typeof Bold;\n}) {\n return (\n <button\n type=\"button\"\n aria-label={label}\n title={label}\n onClick={onClick}\n disabled={disabled}\n className={cn(\n 'flex h-7 w-7 cursor-pointer items-center justify-center rounded text-muted-foreground transition-colors hover:bg-accent hover:text-foreground',\n active && 'bg-accent text-foreground',\n disabled && 'cursor-not-allowed opacity-40 hover:bg-transparent'\n )}\n >\n <Icon className=\"h-3.5 w-3.5\" />\n </button>\n );\n}\n\n/**\n * Thin vertical separator used between toolbar groups.\n * @returns the rendered divider element\n */\nfunction Divider() {\n return <span className=\"mx-0.5 h-4 w-px bg-border\" />;\n}\n\n/**\n * Toolbar control that opens a popover for setting or removing a link mark.\n * @param props - popover props\n * @param props.editor - the TipTap editor instance to drive\n * @returns the rendered link popover trigger and content\n */\nfunction LinkPopover({ editor }: { editor: Editor }) {\n const active = editor.isActive('link');\n const currentHref = (editor.getAttributes('link').href as string | undefined) ?? '';\n const [open, setOpen] = useState(false);\n const [url, setUrl] = useState(currentHref);\n\n useEffect(() => {\n if (open) {\n setUrl(currentHref);\n }\n }, [open, currentHref]);\n\n const apply = () => {\n const trimmed = url.trim();\n if (!trimmed) {\n editor.chain().focus().unsetLink().run();\n } else {\n editor.chain().focus().extendMarkRange('link').setLink({ href: trimmed }).run();\n }\n setOpen(false);\n };\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n aria-label=\"Link\"\n title=\"Link\"\n className={cn(\n 'flex h-7 w-7 cursor-pointer items-center justify-center rounded text-muted-foreground transition-colors hover:bg-accent hover:text-foreground',\n active && 'bg-accent text-foreground'\n )}\n >\n <LinkIcon className=\"h-3.5 w-3.5\" />\n </button>\n </PopoverTrigger>\n <PopoverContent align=\"start\" className=\"w-72 p-3\">\n <div className=\"flex flex-col gap-2\">\n <Label htmlFor=\"rt-link-url\" className=\"text-xs\">\n URL\n </Label>\n <Input\n id=\"rt-link-url\"\n value={url}\n placeholder=\"https://example.com\"\n onChange={(e) => setUrl(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n apply();\n }\n }}\n />\n <div className=\"flex justify-between\">\n {active ? (\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => {\n editor.chain().focus().unsetLink().run();\n setOpen(false);\n }}\n >\n Remove\n </Button>\n ) : (\n <span />\n )}\n <Button type=\"button\" size=\"sm\" onClick={apply}>\n {active ? 'Update' : 'Add link'}\n </Button>\n </div>\n </div>\n </PopoverContent>\n </Popover>\n );\n}\n","import type { ImageElement, SectionBlock, Button as SlackButton } from 'slack-web-api-client';\nimport { Input } from '../../lib/ui/input';\nimport { Label } from '../../lib/ui/label';\nimport { RadioGroup, RadioGroupItem } from '../../lib/ui/radio-group';\nimport { Textarea } from '../../lib/ui/textarea';\nimport { EditorField } from './field';\nimport type { BlockEditorProps } from './types';\n\ntype AccessoryKind = 'none' | 'button' | 'image' | 'other';\ntype ButtonStyle = 'default' | 'primary' | 'danger';\n\n/**\n * Maps a section block's accessory payload to the {@link AccessoryKind}\n * the editor UI uses, with 'other' for accessory types not yet\n * supported in the visual builder.\n * @param accessory - the section's accessory payload, if any\n * @returns the accessory kind for the radio group\n */\nfunction detectAccessory(accessory: SectionBlock['accessory']): AccessoryKind {\n if (!accessory) {\n return 'none';\n }\n if (accessory.type === 'button') {\n return 'button';\n }\n if (accessory.type === 'image') {\n return 'image';\n }\n return 'other';\n}\n\n/**\n * A sensible default Button accessory the editor swaps in when the\n * user picks \"Button\" from the accessory radio.\n * @returns a fresh button accessory payload\n */\nfunction defaultButton(): SlackButton {\n return {\n type: 'button',\n text: { type: 'plain_text', text: 'Click me', emoji: true },\n action_id: 'section_button'\n };\n}\n\n/**\n * A sensible default Image accessory the editor swaps in when the\n * user picks \"Image\" from the accessory radio.\n * @returns a fresh image accessory payload\n */\nfunction defaultImage(): ImageElement {\n return {\n type: 'image',\n image_url: 'https://placehold.co/96x96',\n alt_text: 'Accessory image'\n };\n}\n\n/**\n * Editor form for section blocks. Edits the primary mrkdwn text and\n * an optional accessory (Button or Image, the two most common\n * accessories on real Slack sections). Other accessory types\n * (overflow, selects, datepickers, etc.) are preserved on the block\n * but flagged as not editable in the visual builder.\n * @param props - editor props\n * @param props.block - the section block to edit\n * @param props.onChange - called with the updated block payload\n * @returns the rendered section editor form\n */\nexport function SectionEditor({ block, onChange }: BlockEditorProps<SectionBlock>) {\n const text = block.text?.text ?? '';\n const accessoryKind = detectAccessory(block.accessory);\n\n const setAccessoryKind = (next: AccessoryKind) => {\n if (next === accessoryKind) {\n return;\n }\n if (next === 'none') {\n onChange({ ...block, accessory: undefined });\n return;\n }\n if (next === 'button') {\n onChange({ ...block, accessory: defaultButton() });\n return;\n }\n if (next === 'image') {\n onChange({ ...block, accessory: defaultImage() });\n }\n };\n\n return (\n <div className=\"flex flex-col gap-4\">\n <EditorField\n label=\"Text\"\n help=\"Supports *bold*, _italic_, ~strike~, `code`, and <url|link> formatting.\"\n htmlFor=\"section-text\"\n >\n <Textarea\n id=\"section-text\"\n value={text}\n rows={4}\n placeholder=\"e.g. Welcome to the channel! Ping <@U123> with any questions.\"\n onChange={(e) =>\n onChange({\n ...block,\n text: { type: 'mrkdwn', text: e.target.value }\n })\n }\n />\n </EditorField>\n\n <div className=\"flex flex-col gap-3 rounded-md border bg-muted/20 p-3\">\n <EditorField label=\"Accessory\" help=\"Optional element shown to the right of the section text.\">\n <RadioGroup\n value={accessoryKind === 'other' ? 'other' : accessoryKind}\n onValueChange={(v) => setAccessoryKind(v as AccessoryKind)}\n className=\"flex flex-row flex-wrap gap-3\"\n >\n {(\n [\n ['none', 'None'],\n ['button', 'Button'],\n ['image', 'Image']\n ] as const\n ).map(([value, label]) => (\n <div key={value} className=\"flex items-center gap-1.5\">\n <RadioGroupItem value={value} id={`section-acc-${value}`} />\n <Label htmlFor={`section-acc-${value}`} className=\"text-xs capitalize\">\n {label}\n </Label>\n </div>\n ))}\n </RadioGroup>\n </EditorField>\n\n {accessoryKind === 'other' ? (\n <p className=\"text-[11px] leading-snug text-muted-foreground\">\n This section has a {block.accessory?.type} accessory. That type is not editable in the visual builder yet.\n Use the View JSON drawer to edit it directly.\n </p>\n ) : null}\n\n {accessoryKind === 'button' && block.accessory?.type === 'button' ? (\n <ButtonAccessoryFields\n button={block.accessory}\n onChange={(next) => onChange({ ...block, accessory: next })}\n />\n ) : null}\n\n {accessoryKind === 'image' && block.accessory?.type === 'image' ? (\n <ImageAccessoryFields image={block.accessory} onChange={(next) => onChange({ ...block, accessory: next })} />\n ) : null}\n </div>\n </div>\n );\n}\n\n/**\n * Sub-form for editing a Button accessory: label, URL, value, style.\n * @param props - field props\n * @param props.button - the button accessory to edit\n * @param props.onChange - called with the updated button payload\n * @returns the rendered button accessory fields\n */\nfunction ButtonAccessoryFields({ button, onChange }: { button: SlackButton; onChange: (next: SlackButton) => void }) {\n const label = button.text?.text ?? '';\n const url = button.url ?? '';\n const value = button.value ?? '';\n const style: ButtonStyle = button.style === 'primary' || button.style === 'danger' ? button.style : 'default';\n\n return (\n <div className=\"flex flex-col gap-3\">\n <EditorField label=\"Label\" htmlFor=\"section-acc-btn-label\">\n <Input\n id=\"section-acc-btn-label\"\n value={label}\n placeholder=\"e.g. Learn more\"\n onChange={(e) =>\n onChange({\n ...button,\n text: { type: 'plain_text', text: e.target.value, emoji: true }\n })\n }\n />\n </EditorField>\n <EditorField\n label=\"Link URL\"\n help=\"Optional. If set, clicking the button opens this link.\"\n htmlFor=\"section-acc-btn-url\"\n >\n <Input\n id=\"section-acc-btn-url\"\n type=\"url\"\n value={url}\n placeholder=\"e.g. https://example.com\"\n onChange={(e) => onChange({ ...button, url: e.target.value || undefined })}\n />\n </EditorField>\n <EditorField\n label=\"Value\"\n help=\"Optional. Sent in the interaction payload when the button is clicked.\"\n htmlFor=\"section-acc-btn-value\"\n >\n <Input\n id=\"section-acc-btn-value\"\n value={value}\n placeholder=\"e.g. learn_more_clicked\"\n onChange={(e) => onChange({ ...button, value: e.target.value || undefined })}\n />\n </EditorField>\n <EditorField label=\"Style\" help=\"How the button looks in Slack.\">\n <RadioGroup\n value={style}\n onValueChange={(v) => {\n const nextStyle: 'primary' | 'danger' | undefined = v === 'primary' || v === 'danger' ? v : undefined;\n onChange({ ...button, style: nextStyle });\n }}\n className=\"flex flex-row gap-3\"\n >\n {(['default', 'primary', 'danger'] as const).map((s) => (\n <div key={s} className=\"flex items-center gap-1.5\">\n <RadioGroupItem value={s} id={`section-acc-btn-style-${s}`} />\n <Label htmlFor={`section-acc-btn-style-${s}`} className=\"text-xs capitalize\">\n {s}\n </Label>\n </div>\n ))}\n </RadioGroup>\n </EditorField>\n </div>\n );\n}\n\n/**\n * Sub-form for editing an Image accessory: image URL and alt text.\n * Slack-file image accessories are detected and shown as not editable.\n * @param props - field props\n * @param props.image - the image accessory to edit\n * @param props.onChange - called with the updated image payload\n * @returns the rendered image accessory fields\n */\nfunction ImageAccessoryFields({ image, onChange }: { image: ImageElement; onChange: (next: ImageElement) => void }) {\n if (!('image_url' in image)) {\n return (\n <p className=\"text-[11px] leading-snug text-muted-foreground\">\n This image accessory references a Slack file. Not editable in the visual builder.\n </p>\n );\n }\n\n return (\n <div className=\"flex flex-col gap-3\">\n <EditorField\n label=\"Image URL\"\n help=\"A publicly accessible image URL (PNG, JPG, GIF).\"\n htmlFor=\"section-acc-img-url\"\n >\n <Input\n id=\"section-acc-img-url\"\n type=\"url\"\n value={image.image_url ?? ''}\n placeholder=\"e.g. https://example.com/thumb.png\"\n onChange={(e) => onChange({ ...image, image_url: e.target.value })}\n />\n </EditorField>\n <EditorField\n label=\"Alt text\"\n help=\"Describes the image for screen readers and when it fails to load.\"\n htmlFor=\"section-acc-img-alt\"\n >\n <Input\n id=\"section-acc-img-alt\"\n value={image.alt_text ?? ''}\n placeholder=\"e.g. Roadmap thumbnail\"\n onChange={(e) => onChange({ ...image, alt_text: e.target.value })}\n />\n </EditorField>\n </div>\n );\n}\n","import { Plus, Trash2 } from 'lucide-react';\nimport { Button } from '../../lib/ui/button';\nimport { Input } from '../../lib/ui/input';\nimport type { TableBlock, TableCell, TableColumnSetting } from '../../types';\nimport { EditorField } from './field';\nimport type { BlockEditorProps } from './types';\n\nconst ALIGN_OPTIONS: ('left' | 'center' | 'right')[] = ['left', 'center', 'right'];\n\n/**\n * Coerces a cell to a raw_text representation for editing. Rich-text\n * cells are flattened to a `[rich_text]` placeholder string so the\n * editor never silently drops content; their original payload is\n * preserved on save by `setCell` only when the user doesn't edit them.\n * @param cell - the cell to coerce\n * @returns the cell text, or a placeholder for rich-text cells\n */\nfunction cellAsText(cell: TableCell): string {\n if (cell.type === 'raw_text') {\n return cell.text;\n }\n return '[rich_text]';\n}\n\n/**\n * Editor form for table blocks. v1 surfaces:\n * - The grid as a 2D array of inputs (raw_text cells).\n * - Per-column alignment (left / center / right) and an \"add column\" button.\n * - Per-row delete and an \"add row\" button.\n *\n * Rich-text cells are shown as a read-only placeholder and preserved on\n * save unless the user edits them, in which case they're replaced with a\n * raw_text cell containing the new value.\n * @param props - editor props\n * @param props.block - the table block to edit\n * @param props.onChange - called with the updated block payload\n * @returns the rendered table editor form\n */\nexport function TableEditor({ block, onChange }: BlockEditorProps<TableBlock>) {\n const rows = block.rows ?? [];\n const columnCount = rows[0]?.length ?? 0;\n const columnSettings = block.column_settings ?? [];\n\n const setCell = (rowIdx: number, colIdx: number, text: string) => {\n const nextRows = rows.map((row, r) =>\n r === rowIdx ? row.map((cell, c) => (c === colIdx ? ({ type: 'raw_text', text } as TableCell) : cell)) : row\n );\n onChange({ ...block, rows: nextRows });\n };\n\n const addRow = () => {\n const blankRow: TableCell[] = Array.from({ length: columnCount || 1 }, () => ({ type: 'raw_text', text: '' }));\n onChange({ ...block, rows: [...rows, blankRow] });\n };\n\n const removeRow = (rowIdx: number) => {\n if (rows.length <= 1) {\n return;\n }\n onChange({ ...block, rows: rows.filter((_, r) => r !== rowIdx) });\n };\n\n const addColumn = () => {\n const nextRows = rows.map((row) => [...row, { type: 'raw_text', text: '' } as TableCell]);\n const nextSettings = [...columnSettings, null as TableColumnSetting];\n onChange({ ...block, rows: nextRows, column_settings: nextSettings });\n };\n\n const removeColumn = (colIdx: number) => {\n if (columnCount <= 1) {\n return;\n }\n const nextRows = rows.map((row) => row.filter((_, c) => c !== colIdx));\n const nextSettings = columnSettings.filter((_, c) => c !== colIdx);\n onChange({ ...block, rows: nextRows, column_settings: nextSettings });\n };\n\n const setColumnAlign = (colIdx: number, align: 'left' | 'center' | 'right' | '') => {\n const next: TableColumnSetting[] = Array.from({ length: columnCount }, (_, i) => columnSettings[i] ?? null);\n if (align === '') {\n next[colIdx] = null;\n } else {\n const existing = (next[colIdx] ?? {}) as Exclude<TableColumnSetting, null>;\n next[colIdx] = { ...existing, align };\n }\n onChange({ ...block, column_settings: next });\n };\n\n return (\n <div className=\"flex flex-col gap-3\">\n <EditorField label=\"Cells\" help=\"Up to 100 rows and 20 columns. Slack allows one table per message.\">\n <div className=\"flex flex-col gap-2 overflow-x-auto\">\n {/* Column controls */}\n <div className=\"flex items-center gap-1\">\n <span className=\"w-6 shrink-0\" aria-hidden=\"true\" />\n {Array.from({ length: columnCount }, (_, c) => {\n const setting = columnSettings[c];\n const align = setting?.align ?? '';\n return (\n <div key={c} className=\"flex min-w-[120px] flex-1 items-center gap-1\">\n <select\n aria-label={`Column ${c + 1} alignment`}\n value={align}\n onChange={(e) => setColumnAlign(c, e.target.value as 'left' | 'center' | 'right' | '')}\n className=\"h-7 flex-1 rounded-sm border border-input bg-background px-1.5 text-[11px] text-muted-foreground\"\n >\n <option value=\"\">Default</option>\n {ALIGN_OPTIONS.map((a) => (\n <option key={a} value={a}>\n {a}\n </option>\n ))}\n </select>\n <button\n type=\"button\"\n aria-label={`Remove column ${c + 1}`}\n onClick={() => removeColumn(c)}\n disabled={columnCount <= 1}\n className=\"flex h-6 w-6 items-center justify-center rounded text-muted-foreground hover:bg-destructive/10 hover:text-destructive disabled:cursor-not-allowed disabled:opacity-40\"\n >\n <Trash2 className=\"h-3 w-3\" />\n </button>\n </div>\n );\n })}\n </div>\n\n {/* Cell grid */}\n {rows.map((row, r) => (\n <div key={r} className=\"flex items-center gap-1\">\n <button\n type=\"button\"\n aria-label={`Remove row ${r + 1}`}\n onClick={() => removeRow(r)}\n disabled={rows.length <= 1}\n className=\"flex h-6 w-6 shrink-0 items-center justify-center rounded text-muted-foreground hover:bg-destructive/10 hover:text-destructive disabled:cursor-not-allowed disabled:opacity-40\"\n >\n <Trash2 className=\"h-3 w-3\" />\n </button>\n {row.map((cell, c) => {\n const isRichText = cell.type === 'rich_text';\n return (\n <div key={c} className=\"flex min-w-[120px] flex-1 flex-col gap-0.5\">\n <Input\n value={cellAsText(cell)}\n placeholder={r === 0 ? `Header ${c + 1}` : 'Cell text'}\n onChange={(e) => setCell(r, c, e.target.value)}\n className=\"h-8 text-xs\"\n />\n {isRichText ? (\n <span className=\"text-[10px] text-muted-foreground\">\n Was rich-text; editing replaces with plain text.\n </span>\n ) : null}\n </div>\n );\n })}\n </div>\n ))}\n </div>\n </EditorField>\n <div className=\"flex gap-2\">\n <Button type=\"button\" size=\"sm\" onClick={addRow} disabled={rows.length >= 100}>\n <Plus className=\"h-3.5 w-3.5\" /> Add row\n </Button>\n <Button type=\"button\" size=\"sm\" onClick={addColumn} disabled={columnCount >= 20}>\n <Plus className=\"h-3.5 w-3.5\" /> Add column\n </Button>\n </div>\n </div>\n );\n}\n","import type {\n ActionsBlock,\n ContextBlock,\n HeaderBlock,\n ImageBlock,\n RichTextBlock,\n SectionBlock\n} from 'slack-web-api-client';\nimport { labelForBlockType } from '../../lib/default-blocks';\nimport type {\n AlertBlock,\n CardBlock,\n CarouselBlock,\n ContextActionsBlock,\n InputBlock,\n MarkdownBlock,\n SupportedBlock,\n SupportedBlockType,\n TableBlock\n} from '../../types';\nimport { ActionsEditor } from './actions-editor';\nimport { AlertEditor } from './alert-editor';\nimport { CardEditor } from './card-editor';\nimport { CarouselEditor } from './carousel-editor';\nimport { ContextActionsEditor } from './context-actions-editor';\nimport { ContextEditor } from './context-editor';\nimport { DividerEditor } from './divider-editor';\nimport { HeaderEditor } from './header-editor';\nimport { ImageEditor } from './image-editor';\nimport { InputEditor } from './input-editor';\nimport { MarkdownEditor } from './markdown-editor';\nimport { RichTextEditor } from './rich-text-editor';\nimport { SectionEditor } from './section-editor';\nimport { TableEditor } from './table-editor';\n\n/**\n * Dispatches to the correct per-block editor form. Provides a consistent\n * header (block type label) and surfaces this block's validation errors\n * so the popover feels unified.\n * @param props - editor props\n * @param props.block - the block being edited\n * @param props.errors - validation errors for this block, if any\n * @param props.onChange - called with the updated block\n * @returns the rendered editor for the block's type\n */\nexport function BlockEditor({\n block,\n errors,\n onChange\n}: {\n block: SupportedBlock;\n errors?: string[];\n onChange: (next: SupportedBlock) => void;\n}) {\n return (\n <div className=\"flex flex-col gap-3\">\n <div>\n <h3 className=\"text-sm font-semibold text-foreground\">\n Edit {labelForBlockType(block.type as SupportedBlockType)}\n </h3>\n </div>\n {errors && errors.length > 0 ? (\n <ul className=\"flex flex-col gap-0.5 rounded-md border border-destructive/30 bg-destructive/5 p-2 text-xs text-destructive\">\n {errors.map((err, i) => (\n <li key={i}>{err}</li>\n ))}\n </ul>\n ) : null}\n {dispatch(block, onChange)}\n </div>\n );\n}\n\n/**\n * Picks the per-block editor form based on `block.type`.\n * @param block - the block being edited\n * @param onChange - called with the updated block payload\n * @returns the editor element for the block, or null for unsupported types\n */\nfunction dispatch(block: SupportedBlock, onChange: (next: SupportedBlock) => void) {\n switch (block.type) {\n case 'section':\n return <SectionEditor block={block as SectionBlock} onChange={(next) => onChange(next)} />;\n case 'header':\n return <HeaderEditor block={block as HeaderBlock} onChange={(next) => onChange(next)} />;\n case 'divider':\n return <DividerEditor />;\n case 'context':\n return <ContextEditor block={block as ContextBlock} onChange={(next) => onChange(next)} />;\n case 'actions':\n return <ActionsEditor block={block as ActionsBlock} onChange={(next) => onChange(next)} />;\n case 'image':\n return <ImageEditor block={block as ImageBlock} onChange={(next) => onChange(next)} />;\n case 'markdown':\n return <MarkdownEditor block={block as MarkdownBlock} onChange={(next) => onChange(next)} />;\n case 'rich_text':\n return <RichTextEditor block={block as RichTextBlock} onChange={(next) => onChange(next)} />;\n case 'table':\n return <TableEditor block={block as TableBlock} onChange={(next) => onChange(next)} />;\n case 'alert':\n return <AlertEditor block={block as AlertBlock} onChange={(next) => onChange(next)} />;\n case 'card':\n return <CardEditor block={block as CardBlock} onChange={(next) => onChange(next)} />;\n case 'carousel':\n return <CarouselEditor block={block as CarouselBlock} onChange={(next) => onChange(next)} />;\n case 'context_actions':\n return <ContextActionsEditor block={block as ContextActionsBlock} onChange={(next) => onChange(next)} />;\n case 'input':\n return <InputEditor block={block as InputBlock} onChange={(next) => onChange(next)} />;\n default:\n return null;\n }\n}\n","import 'slack-blocks-to-jsx/dist/style.css';\n\nimport type { Block } from 'slack-blocks-to-jsx';\nimport { Message } from 'slack-blocks-to-jsx';\nimport type { PreviewHooks, PreviewTheme, SupportedBlock } from '../../types';\n\n/**\n * Renders a Slack block via the `slack-blocks-to-jsx` library's `<Message>`\n * component. We render exactly one block at a time so each row in the\n * surface owns its drag and edit affordances; the wrapper-less mode keeps\n * the library from injecting its own message chrome (avatar/timestamp).\n *\n * The library handles: section, header, divider, context, actions, image,\n * rich_text, file, video, and most mrkdwn / rich-text formatting.\n *\n * `previewHooks` is forwarded as-is so the consumer can resolve user /\n * channel / emoji / link directives to its own UI when desired.\n * @param props - preview props\n * @param props.block - the single block to render\n * @param props.hooks - optional directive replacement hooks\n * @param props.theme - light or dark preview theme (default 'light')\n * @returns the rendered Slack block preview\n */\nexport function SlackBlockPreview({\n block,\n hooks,\n theme = 'light'\n}: {\n block: SupportedBlock;\n hooks?: PreviewHooks;\n theme?: PreviewTheme;\n}) {\n return (\n // The library scopes all of its CSS under `#slack_blocks_to_jsx` and\n // depends on the `slack_blocks_to_jsx styles_enabled` classes plus the\n // `data-theme` attribute for its button / mention / divider styling\n // (e.g. button reset + `bg-green-primary` for primary). `<Message\n // withoutWrapper>` skips that wrapper entirely, so we re-create it\n // here without the avatar / timestamp chrome.\n <div id=\"slack_blocks_to_jsx\" data-theme={theme} className=\"slack_blocks_to_jsx styles_enabled\">\n <Message\n time={new Date()}\n name=\"\"\n logo=\"\"\n withoutWrapper\n theme={theme}\n blocks={[block as unknown as Block]}\n hooks={hooks as Record<string, unknown> | undefined}\n />\n </div>\n );\n}\n","import { useSortable } from '@dnd-kit/sortable';\nimport { CSS } from '@dnd-kit/utilities';\nimport { AlertTriangle, Copy, GripVertical, Pencil, Trash2 } from 'lucide-react';\nimport { useState } from 'react';\nimport type { RichTextBlock } from 'slack-web-api-client';\nimport { cn } from '../lib/cn';\nimport { Button } from '../lib/ui/button';\nimport { Popover, PopoverContent, PopoverTrigger } from '../lib/ui/popover';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '../lib/ui/tooltip';\nimport type { BuilderBlock, PreviewHooks, PreviewTheme, SupportedBlock, SupportedBlockType } from '../types';\nimport { BlockEditor } from './editors/block-editor';\nimport { RichTextEditor } from './editors/rich-text-editor';\nimport { SlackBlockPreview } from './preview/slack-block-preview';\n\nconst BLOCK_TYPE_LABELS: Record<SupportedBlockType, string> = {\n section: 'Section',\n header: 'Header',\n divider: 'Divider',\n context: 'Context',\n actions: 'Actions',\n image: 'Image',\n markdown: 'Markdown',\n rich_text: 'Rich Text',\n table: 'Table',\n alert: 'Alert',\n card: 'Card',\n carousel: 'Carousel',\n context_actions: 'Context Actions',\n input: 'Input'\n};\n\n/**\n * A single row in the preview surface wrapping a block's preview render\n * plus a click-to-edit popover. Renders flush like a real Slack message:\n * no border or background by default. Hover surfaces a faint outline plus\n * a floating toolbar (drag, duplicate, delete) so editor chrome never\n * leaks into the visual approximation.\n * @param props - row props\n * @param props.builderBlock - the block to render\n * @param props.previewHooks - optional directive hooks for the preview\n * @param props.previewTheme - light or dark preview theme\n * @param props.errors - validation errors for this block, if any\n * @param props.isOpen - whether this block's editor popover is open\n * @param props.onOpenChange - called when the popover open state changes\n * @param props.onUpdate - called with the updated block payload\n * @param props.onDuplicate - called when the duplicate affordance is clicked\n * @param props.onDelete - called when the delete affordance is clicked\n * @returns the rendered block row\n */\nexport function BlockRow({\n builderBlock,\n previewHooks,\n previewTheme,\n errors,\n isOpen,\n onOpenChange,\n onUpdate,\n onDuplicate,\n onDelete\n}: {\n builderBlock: BuilderBlock;\n previewHooks?: PreviewHooks;\n previewTheme?: PreviewTheme;\n /** Validation errors for this block, if any. */\n errors?: string[];\n /** Whether this block's editor popover is open. */\n isOpen?: boolean;\n /** Notified when the popover open state changes. */\n onOpenChange?: (open: boolean) => void;\n onUpdate: (id: string, block: SupportedBlock) => void;\n onDuplicate: (id: string) => void;\n onDelete: (id: string) => void;\n}) {\n const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({ id: builderBlock.id });\n\n const style = {\n transform: CSS.Transform.toString(transform),\n transition\n };\n\n const hasErrors = !!errors && errors.length > 0;\n const isRichText = builderBlock.block.type === 'rich_text';\n const [inlineEditing, setInlineEditing] = useState(false);\n\n const preview = <SlackBlockPreview block={builderBlock.block} hooks={previewHooks} theme={previewTheme} />;\n\n return (\n <div ref={setNodeRef} style={style} className={cn('group relative hover:z-10', isDragging && 'opacity-40')}>\n {isRichText && inlineEditing ? (\n <RichTextInlineEditor\n block={builderBlock.block as RichTextBlock}\n onSave={(next) => {\n onUpdate(builderBlock.id, next);\n setInlineEditing(false);\n }}\n onCancel={() => setInlineEditing(false)}\n />\n ) : isRichText ? (\n <button\n type=\"button\"\n aria-label=\"Edit block\"\n onClick={() => setInlineEditing(true)}\n className={cn(\n 'block w-full cursor-pointer rounded-sm border-0 bg-transparent p-0 text-left transition-shadow hover:shadow-md focus-visible:ring-1 focus-visible:ring-ring',\n hasErrors ? 'ring-1 ring-destructive/60 hover:ring-destructive' : 'hover:ring-1 hover:ring-border'\n )}\n >\n {preview}\n </button>\n ) : (\n <Popover open={isOpen} onOpenChange={onOpenChange}>\n <PopoverTrigger asChild>\n <div\n role=\"button\"\n tabIndex={0}\n aria-label=\"Edit block\"\n className={cn(\n 'block w-full cursor-pointer rounded-sm transition-shadow hover:shadow-md focus-visible:ring-1 focus-visible:ring-ring',\n hasErrors ? 'ring-1 ring-destructive/60 hover:ring-destructive' : 'hover:ring-1 hover:ring-border'\n )}\n >\n {preview}\n </div>\n </PopoverTrigger>\n <PopoverContent className=\"w-[32rem]\" align=\"start\">\n <BlockEditor\n block={builderBlock.block}\n errors={errors}\n onChange={(next) => onUpdate(builderBlock.id, next)}\n />\n </PopoverContent>\n </Popover>\n )}\n <span className=\"-translate-x-1/2 pointer-events-none absolute bottom-full left-1/2 z-10 bg-background px-1.5 text-[11px] text-muted-foreground opacity-0 transition-opacity group-hover:opacity-100\">\n {BLOCK_TYPE_LABELS[builderBlock.block.type]}\n </span>\n <div\n className={cn(\n 'absolute -top-3 right-2 z-10 flex items-center gap-0.5 rounded-md border bg-background p-0.5 shadow-sm transition-opacity',\n hasErrors ? 'opacity-100' : 'opacity-0 group-hover:opacity-100'\n )}\n >\n {hasErrors ? (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n aria-label={`Show ${errors!.length} validation ${errors!.length === 1 ? 'issue' : 'issues'}`}\n onClick={() => onOpenChange?.(true)}\n className=\"flex h-6 w-6 items-center justify-center rounded text-destructive hover:bg-destructive/10\"\n >\n <AlertTriangle className=\"h-3.5 w-3.5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"top\" align=\"end\">\n <ul className=\"flex flex-col gap-0.5\">\n {errors!.slice(0, 4).map((err, i) => (\n <li key={i}>{err}</li>\n ))}\n {errors!.length > 4 ? <li className=\"text-muted-foreground\">and {errors!.length - 4} more</li> : null}\n </ul>\n </TooltipContent>\n </Tooltip>\n ) : null}\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n aria-label=\"Drag to reorder\"\n className=\"flex h-6 w-6 cursor-grab items-center justify-center rounded text-muted-foreground hover:bg-accent hover:text-foreground active:cursor-grabbing\"\n {...attributes}\n {...listeners}\n >\n <GripVertical className=\"h-3.5 w-3.5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"top\">Drag to reorder</TooltipContent>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n aria-label=\"Edit block\"\n onClick={() => {\n if (isRichText) {\n setInlineEditing(true);\n } else {\n onOpenChange?.(true);\n }\n }}\n className=\"flex h-6 w-6 items-center justify-center rounded text-muted-foreground hover:bg-accent hover:text-foreground\"\n >\n <Pencil className=\"h-3.5 w-3.5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"top\">Edit</TooltipContent>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n aria-label=\"Duplicate block\"\n onClick={() => onDuplicate(builderBlock.id)}\n className=\"flex h-6 w-6 items-center justify-center rounded text-muted-foreground hover:bg-accent hover:text-foreground\"\n >\n <Copy className=\"h-3.5 w-3.5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"top\">Duplicate</TooltipContent>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n aria-label=\"Delete block\"\n onClick={() => onDelete(builderBlock.id)}\n className=\"flex h-6 w-6 items-center justify-center rounded text-muted-foreground hover:bg-destructive/10 hover:text-destructive\"\n >\n <Trash2 className=\"h-3.5 w-3.5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"top\">Delete</TooltipContent>\n </Tooltip>\n </div>\n </div>\n );\n}\n\n/**\n * Inline rich_text editor with explicit Save/Cancel. Holds a local\n * draft so edits don't propagate to the parent block until the user\n * clicks Save. Esc cancels.\n * @param props - editor props\n * @param props.block - the rich_text block to edit\n * @param props.onSave - called with the saved block payload\n * @param props.onCancel - called when the user discards changes\n * @returns the rendered inline editor\n */\nfunction RichTextInlineEditor({\n block,\n onSave,\n onCancel\n}: {\n block: RichTextBlock;\n onSave: (next: RichTextBlock) => void;\n onCancel: () => void;\n}) {\n const [draft, setDraft] = useState<RichTextBlock>(block);\n\n return (\n <div\n className=\"flex flex-col gap-2 rounded-md border border-primary/40 bg-background p-2 shadow-sm\"\n onKeyDown={(e) => {\n if (e.key === 'Escape') {\n e.stopPropagation();\n onCancel();\n }\n }}\n >\n <RichTextEditor block={draft} onChange={setDraft} />\n <div className=\"flex items-center justify-end gap-2 border-t pt-2\">\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={onCancel}>\n Cancel\n </Button>\n <Button type=\"button\" size=\"sm\" onClick={() => onSave(draft)}>\n Save\n </Button>\n </div>\n </div>\n );\n}\n","import { useDroppable } from '@dnd-kit/core';\nimport { SortableContext, verticalListSortingStrategy } from '@dnd-kit/sortable';\nimport { LayoutGrid, X } from 'lucide-react';\nimport type { ReactNode } from 'react';\nimport { cn } from '../lib/cn';\nimport type { BuilderBlock, PreviewHooks, PreviewSurface, PreviewTheme, SupportedBlock } from '../types';\nimport { BlockRow } from './block-row';\n\n/**\n * Stable id of the drop target that represents \"end of the list\".\n * When the user drops a palette item on empty space, this is the\n * `over` id we see on the drop event.\n */\nexport const SURFACE_DROPPABLE_ID = 'builder-surface';\n\n/**\n * Center preview surface. Renders the blocks as a vertical sortable list\n * inside one of three Slack-style chromes (Message, Modal, App Home),\n * driven by `previewSurface`.\n * @param props - surface props\n * @param props.blocks - blocks to render\n * @param props.workspaceName - cosmetic workspace name shown in chrome\n * @param props.previewHooks - directive replacement hooks\n * @param props.previewTheme - light or dark preview\n * @param props.previewSurface - which surface chrome to render\n * @param props.errorsByBlockId - validation errors keyed by builder block id\n * @param props.openBlockId - id of the block whose editor popover is open\n * @param props.onOpenBlockChange - called when a block's popover open state changes\n * @param props.onUpdate - update handler forwarded to each row\n * @param props.onDuplicate - duplicate handler forwarded to each row\n * @param props.onDelete - delete handler forwarded to each row\n * @returns the rendered preview surface\n */\nexport function Surface({\n blocks,\n workspaceName,\n previewHooks,\n previewTheme,\n previewSurface = 'message',\n errorsByBlockId,\n openBlockId,\n onOpenBlockChange,\n onUpdate,\n onDuplicate,\n onDelete\n}: {\n blocks: BuilderBlock[];\n workspaceName?: string;\n previewHooks?: PreviewHooks;\n previewTheme?: PreviewTheme;\n previewSurface?: PreviewSurface;\n /** Validation errors keyed by builder block id. */\n errorsByBlockId?: Map<string, string[]>;\n /** Block id whose editor popover is currently open. */\n openBlockId?: string | null;\n /** Notified when a block's popover open state changes. */\n onOpenBlockChange?: (id: string | null) => void;\n onUpdate: (id: string, block: SupportedBlock) => void;\n onDuplicate: (id: string) => void;\n onDelete: (id: string) => void;\n}) {\n const { setNodeRef, isOver } = useDroppable({ id: SURFACE_DROPPABLE_ID });\n const isDark = previewTheme === 'dark';\n\n const isModal = previewSurface === 'modal';\n const blocksList = (\n <div\n ref={setNodeRef}\n className={cn(\n 'flex min-h-[240px] flex-col py-2 transition-colors',\n isModal ? 'px-5' : 'px-2',\n isDark ? 'bg-[#1a1d21]' : 'bg-white',\n isOver && (isDark ? 'bg-[#2c3036]' : 'bg-[#f0f4ff]')\n )}\n >\n {blocks.length === 0 ? (\n <EmptyState isDark={isDark} />\n ) : (\n <SortableContext items={blocks.map((b) => b.id)} strategy={verticalListSortingStrategy}>\n {blocks.map((block) => (\n <BlockRow\n key={block.id}\n builderBlock={block}\n previewHooks={previewHooks}\n previewTheme={previewTheme}\n errors={errorsByBlockId?.get(block.id)}\n isOpen={openBlockId === block.id}\n onOpenChange={(open) => onOpenBlockChange?.(open ? block.id : null)}\n onUpdate={onUpdate}\n onDuplicate={onDuplicate}\n onDelete={onDelete}\n />\n ))}\n </SortableContext>\n )}\n </div>\n );\n\n return (\n <div className=\"flex flex-1 flex-col bg-muted/30 p-6\">\n <div className=\"mx-auto w-full max-w-2xl\">\n {previewSurface === 'modal' ? (\n <ModalFrame isDark={isDark}>{blocksList}</ModalFrame>\n ) : previewSurface === 'app_home' ? (\n <AppHomeFrame workspaceName={workspaceName} isDark={isDark}>\n {blocksList}\n </AppHomeFrame>\n ) : (\n <MessageFrame workspaceName={workspaceName} isDark={isDark}>\n {blocksList}\n </MessageFrame>\n )}\n </div>\n </div>\n );\n}\n\n/**\n * Slack message chrome: avatar + app name + APP badge + timestamp\n * across the top, blocks below. Mimics the library's `<Message>` wrapper\n * without wiring each block through its own library wrapper (so per-block\n * editing affordances still work).\n * @param props - frame props\n * @param props.workspaceName - cosmetic app name shown in the header\n * @param props.isDark - whether to apply the dark Slack canvas colors\n * @param props.children - the blocks list to render inside the frame\n * @returns the rendered message frame\n */\nfunction MessageFrame({\n workspaceName,\n isDark,\n children\n}: {\n workspaceName?: string;\n isDark: boolean;\n children: ReactNode;\n}) {\n const initial = (workspaceName ?? 'A').slice(0, 1).toUpperCase();\n return (\n <div\n className={cn(\n 'flex flex-col overflow-hidden rounded-md border',\n isDark ? 'border-[#2c2d30] bg-[#1a1d21]' : 'border-[#e8e8e8] bg-white'\n )}\n >\n <div\n className={cn('flex items-center gap-2 px-4 pt-3 pb-1 text-xs', isDark ? 'text-white/60' : 'text-[#616061]')}\n >\n <span\n className={cn(\n 'inline-flex h-7 w-7 items-center justify-center rounded text-[12px] font-semibold',\n isDark ? 'bg-white/10 text-white' : 'bg-[#4a154b]/10 text-[#1d1c1d]'\n )}\n >\n {initial}\n </span>\n <span className={cn('font-bold text-sm', isDark ? 'text-white' : 'text-[#1d1c1d]')}>\n {workspaceName ?? 'Your app'}\n </span>\n <span\n className={cn(\n 'rounded px-1 text-[10px] font-semibold',\n isDark ? 'bg-white/10 text-white/70' : 'bg-[#f3f3f3] text-[#616061]'\n )}\n >\n APP\n </span>\n <span>10:37 AM</span>\n </div>\n {children}\n </div>\n );\n}\n\n/**\n * Fake Slack modal chrome: rounded box with a header (title + X close),\n * the blocks in the body, and a footer with Cancel + Submit buttons.\n * Buttons are non-interactive in the preview.\n * @param props - frame props\n * @param props.isDark - whether to apply the dark Slack canvas colors\n * @param props.children - the blocks list to render inside the modal body\n * @returns the rendered modal frame\n */\nfunction ModalFrame({ isDark, children }: { isDark: boolean; children: ReactNode }) {\n return (\n <div\n className={cn(\n 'flex flex-col overflow-hidden rounded-lg border shadow-lg',\n isDark ? 'border-[#2c2d30] bg-[#1a1d21]' : 'border-[#e8e8e8] bg-white'\n )}\n >\n <div\n className={cn(\n 'flex items-center justify-between border-b px-5 py-3',\n isDark ? 'border-[#2c2d30]' : 'border-[#e8e8e8]'\n )}\n >\n <h2 className={cn('text-base font-bold', isDark ? 'text-white' : 'text-[#1d1c1d]')}>Modal title</h2>\n <button\n type=\"button\"\n aria-label=\"Close\"\n className={cn(\n 'flex h-6 w-6 items-center justify-center rounded',\n isDark\n ? 'text-white/60 hover:bg-white/10 hover:text-white'\n : 'text-[#616061] hover:bg-[#f3f3f3] hover:text-[#1d1c1d]'\n )}\n >\n <X className=\"h-4 w-4\" />\n </button>\n </div>\n {children}\n <div\n className={cn(\n 'flex items-center justify-end gap-2 border-t px-5 py-3',\n isDark ? 'border-[#2c2d30]' : 'border-[#e8e8e8]'\n )}\n >\n <button\n type=\"button\"\n className={cn(\n 'cursor-pointer rounded-sm border px-3 py-1.5 text-sm font-medium',\n isDark\n ? 'border-white/20 bg-transparent text-white hover:bg-white/5'\n : 'border-[#e8e8e8] bg-white text-[#1d1c1d] hover:bg-[#f3f3f3]'\n )}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n className=\"cursor-pointer rounded-sm bg-[#007a5a] px-3 py-1.5 text-sm font-bold text-white hover:bg-[#148567]\"\n >\n Submit\n </button>\n </div>\n </div>\n );\n}\n\n/**\n * App Home tab chrome: app avatar + name on top, Home/Messages/About\n * tab strip below (Home active), then the blocks.\n * @param props - frame props\n * @param props.workspaceName - cosmetic app name shown in the header\n * @param props.isDark - whether to apply the dark Slack canvas colors\n * @param props.children - the blocks list to render inside the frame\n * @returns the rendered app home frame\n */\nfunction AppHomeFrame({\n workspaceName,\n isDark,\n children\n}: {\n workspaceName?: string;\n isDark: boolean;\n children: ReactNode;\n}) {\n const initial = (workspaceName ?? 'A').slice(0, 1).toUpperCase();\n return (\n <div\n className={cn(\n 'flex flex-col overflow-hidden rounded-md border',\n isDark ? 'border-[#2c2d30] bg-[#1a1d21]' : 'border-[#e8e8e8] bg-white'\n )}\n >\n <div\n className={cn('flex items-center gap-3 border-b px-4 py-3', isDark ? 'border-[#2c2d30]' : 'border-[#e8e8e8]')}\n >\n <span\n className={cn(\n 'inline-flex h-8 w-8 items-center justify-center rounded text-sm font-semibold',\n isDark ? 'bg-white/10 text-white' : 'bg-[#f3f3f3] text-[#1d1c1d]'\n )}\n >\n {initial}\n </span>\n <span className={cn('font-bold text-sm', isDark ? 'text-white' : 'text-[#1d1c1d]')}>\n {workspaceName ?? 'Your app'}\n </span>\n </div>\n <div\n className={cn(\n 'flex items-center gap-4 border-b px-4 text-sm',\n isDark ? 'border-[#2c2d30]' : 'border-[#e8e8e8]'\n )}\n >\n {(['Home', 'Messages', 'About'] as const).map((tab) => {\n const active = tab === 'Home';\n return (\n <span\n key={tab}\n className={cn(\n 'border-b-2 py-2',\n active\n ? isDark\n ? 'border-white font-bold text-white'\n : 'border-[#1d1c1d] font-bold text-[#1d1c1d]'\n : `border-transparent font-medium ${isDark ? 'text-white/60' : 'text-[#616061]'}`\n )}\n >\n {tab}\n </span>\n );\n })}\n </div>\n {children}\n </div>\n );\n}\n\n/**\n * Placeholder shown inside the preview surface when the draft has no\n * blocks. Uses Slack-style explicit colors keyed off `isDark` so the\n * empty state visually matches the rest of the preview chrome and stays\n * consistent regardless of the host app's light/dark theme.\n * @param props - empty state props\n * @param props.isDark - whether the dark Slack canvas is active\n * @returns the rendered placeholder\n */\nfunction EmptyState({ isDark }: { isDark: boolean }) {\n return (\n <div\n className={cn(\n 'flex flex-1 flex-col items-center justify-center gap-3 px-6 py-10 text-center',\n isDark ? 'text-white/60' : 'text-[#616061]'\n )}\n >\n <span\n className={cn(\n 'flex h-12 w-12 items-center justify-center rounded-full',\n isDark ? 'bg-white/5' : 'bg-[#f3f3f3]'\n )}\n >\n <LayoutGrid className=\"h-6 w-6\" />\n </span>\n <div className=\"flex flex-col gap-0.5\">\n <p className={cn('text-sm font-semibold', isDark ? 'text-white' : 'text-[#1d1c1d]')}>Start adding blocks!</p>\n <p className=\"text-xs\">Drag a block from the left, or click one to add it here.</p>\n </div>\n </div>\n );\n}\n","import {\n AlertTriangle,\n AppWindow,\n Check,\n ChevronDown,\n Code2,\n ExternalLink,\n Home,\n MessageSquare,\n Moon,\n Send,\n Sun,\n Trash2\n} from 'lucide-react';\nimport { cn } from '../lib/cn';\nimport { Button } from '../lib/ui/button';\nimport { Popover, PopoverContent, PopoverTrigger } from '../lib/ui/popover';\nimport type { PreviewSurface, PreviewTheme } from '../types';\n\nconst THEME_OPTIONS: {\n value: PreviewTheme;\n label: string;\n Icon: typeof Sun;\n}[] = [\n { value: 'light', label: 'Light', Icon: Sun },\n { value: 'dark', label: 'Dark', Icon: Moon }\n];\n\nconst SURFACE_OPTIONS: {\n value: PreviewSurface;\n label: string;\n Icon: typeof Sun;\n}[] = [\n { value: 'message', label: 'Message', Icon: MessageSquare },\n { value: 'modal', label: 'Modal', Icon: AppWindow },\n { value: 'app_home', label: 'App Home', Icon: Home }\n];\n\n/**\n * Top toolbar with the preview theme picker, View JSON escape hatch, and\n * the Send action.\n * @param props - toolbar props\n * @param props.onClear - resets the draft to empty (disabled when already empty)\n * @param props.onOpenJson - opens the JSON drawer\n * @param props.onOpenIssues - opens the issues sheet\n * @param props.onOpenSend - opens the send dialog\n * @param props.canSend - whether the Send button should be enabled\n * @param props.canClear - whether the Clear button should be enabled\n * @param props.previewTheme - current preview theme\n * @param props.onPreviewThemeChange - called when the user picks a theme\n * @param props.previewSurface - which Slack surface to approximate\n * @param props.onPreviewSurfaceChange - called when the user picks a surface\n * @param props.showSurfaceControl - render the surface dropdown (default true)\n * @param props.showThemeControl - render the theme dropdown (default true)\n * @param props.errorCount - number of validation errors\n * @returns the rendered toolbar\n */\nexport function Toolbar({\n onClear,\n onOpenJson,\n onOpenIssues,\n onOpenSend,\n canSend,\n canClear,\n previewTheme,\n onPreviewThemeChange,\n previewSurface,\n onPreviewSurfaceChange,\n showSurfaceControl = true,\n showThemeControl = true,\n errorCount\n}: {\n onClear: () => void;\n onOpenJson: () => void;\n onOpenIssues: () => void;\n onOpenSend: () => void;\n canSend: boolean;\n canClear: boolean;\n previewTheme: PreviewTheme;\n onPreviewThemeChange: (theme: PreviewTheme) => void;\n previewSurface: PreviewSurface;\n onPreviewSurfaceChange: (surface: PreviewSurface) => void;\n showSurfaceControl?: boolean;\n showThemeControl?: boolean;\n errorCount: number;\n}) {\n const activeTheme = THEME_OPTIONS.find((t) => t.value === previewTheme) ?? THEME_OPTIONS[0];\n const activeSurface = SURFACE_OPTIONS.find((s) => s.value === previewSurface) ?? SURFACE_OPTIONS[0];\n\n return (\n <div className=\"flex items-center justify-between gap-2 border-b bg-background px-3 py-2\">\n <div className=\"flex items-center gap-2\">\n {showSurfaceControl ? (\n <Popover>\n <PopoverTrigger asChild>\n <Button type=\"button\" variant=\"ghost\" size=\"sm\">\n <activeSurface.Icon className=\"h-3.5 w-3.5\" />\n {activeSurface.label}\n <ChevronDown className=\"h-3.5 w-3.5 opacity-60\" />\n </Button>\n </PopoverTrigger>\n <PopoverContent align=\"start\" className=\"w-36 p-1\">\n {SURFACE_OPTIONS.map(({ value, label, Icon }) => {\n const isActive = value === previewSurface;\n return (\n <button\n key={value}\n type=\"button\"\n onClick={() => onPreviewSurfaceChange(value)}\n className={cn(\n 'flex w-full cursor-pointer items-center gap-2 rounded px-2 py-1.5 text-left text-sm hover:bg-accent hover:text-foreground',\n isActive ? 'text-foreground' : 'text-muted-foreground'\n )}\n >\n <Icon className=\"h-3.5 w-3.5\" />\n <span className=\"flex-1\">{label}</span>\n {isActive ? <Check className=\"h-3.5 w-3.5\" /> : null}\n </button>\n );\n })}\n </PopoverContent>\n </Popover>\n ) : null}\n {showThemeControl ? (\n <Popover>\n <PopoverTrigger asChild>\n <Button type=\"button\" variant=\"ghost\" size=\"sm\">\n <activeTheme.Icon className=\"h-3.5 w-3.5\" />\n {activeTheme.label}\n <ChevronDown className=\"h-3.5 w-3.5 opacity-60\" />\n </Button>\n </PopoverTrigger>\n <PopoverContent align=\"start\" className=\"w-32 p-1\">\n {THEME_OPTIONS.map(({ value, label, Icon }) => {\n const isActive = value === previewTheme;\n return (\n <button\n key={value}\n type=\"button\"\n onClick={() => onPreviewThemeChange(value)}\n className={cn(\n 'flex w-full cursor-pointer items-center gap-2 rounded px-2 py-1.5 text-left text-sm hover:bg-accent hover:text-foreground',\n isActive ? 'text-foreground' : 'text-muted-foreground'\n )}\n >\n <Icon className=\"h-3.5 w-3.5\" />\n <span className=\"flex-1\">{label}</span>\n {isActive ? <Check className=\"h-3.5 w-3.5\" /> : null}\n </button>\n );\n })}\n </PopoverContent>\n </Popover>\n ) : null}\n <a\n href=\"https://docs.slack.dev/reference/block-kit/blocks\"\n target=\"_blank\"\n rel=\"noreferrer noopener\"\n className=\"inline-flex items-center gap-1 text-xs text-muted-foreground hover:text-foreground hover:underline\"\n >\n Docs\n <ExternalLink className=\"h-3 w-3 opacity-70\" />\n </a>\n </div>\n <div className=\"flex items-center gap-2\">\n {errorCount > 0 ? (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={onOpenIssues}\n className=\"text-destructive hover:text-destructive\"\n >\n <AlertTriangle className=\"h-3.5 w-3.5\" />\n {errorCount} {errorCount === 1 ? 'issue' : 'issues'}\n </Button>\n ) : null}\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={onClear}\n disabled={!canClear}\n className=\"hover:bg-destructive/10 hover:text-destructive\"\n >\n <Trash2 className=\"h-3.5 w-3.5\" />\n Clear\n </Button>\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={onOpenJson}>\n <Code2 className=\"h-3.5 w-3.5\" />\n View JSON\n </Button>\n <Button type=\"button\" size=\"sm\" onClick={onOpenSend} disabled={!canSend}>\n <Send className=\"h-3.5 w-3.5\" />\n Send\n </Button>\n </div>\n </div>\n );\n}\n","import {\n closestCenter,\n DndContext,\n type DragEndEvent,\n DragOverlay,\n type DragStartEvent,\n PointerSensor,\n useSensor,\n useSensors\n} from '@dnd-kit/core';\nimport { GripVertical } from 'lucide-react';\nimport { useCallback, useState } from 'react';\nimport { VARIANT_BY_ID } from '../lib/default-blocks';\nimport { TooltipProvider } from '../lib/ui/tooltip';\nimport { useBlockKitBuilderState } from '../state/use-block-kit-builder-state';\nimport { useBlockKitValidation } from '../state/use-block-kit-validation';\nimport type { BlockKitBuilderProps, PreviewSurface, PreviewTheme } from '../types';\nimport { IssuesSheet } from './issues-sheet';\nimport { JsonDrawer } from './json-drawer';\nimport { Palette, parsePaletteDragId } from './palette';\nimport { SendDialog } from './send-dialog';\nimport { SURFACE_DROPPABLE_ID, Surface } from './surface';\nimport { Toolbar } from './toolbar';\n\n/**\n * Top-level Slack Block Kit builder component.\n * Renders the toolbar, palette, preview surface, popover editors, send\n * dialog, and View-JSON drawer. Integration-agnostic: all I/O is brokered\n * through props.\n * @param props - {@link BlockKitBuilderProps}\n * @returns the rendered Block Kit Builder\n */\nexport function BlockKitBuilder(props: BlockKitBuilderProps) {\n const {\n workspaceName,\n initialBlocks,\n onChange,\n previewHooks,\n loadChannels,\n loadSendAsUserStatus,\n onSend,\n showSurfaceControl = true,\n showThemeControl = true,\n defaultPreviewTheme = 'light'\n } = props;\n const { blocks, addBlock, updateBlock, removeBlock, duplicateBlock, reorderBlock, replaceAll } =\n useBlockKitBuilderState({ initialBlocks, onChange });\n\n const [jsonOpen, setJsonOpen] = useState(false);\n const [sendOpen, setSendOpen] = useState(false);\n const [issuesOpen, setIssuesOpen] = useState(false);\n const [openBlockId, setOpenBlockId] = useState<string | null>(null);\n const [previewTheme, setPreviewTheme] = useState<PreviewTheme>(defaultPreviewTheme);\n const [previewSurface, setPreviewSurface] = useState<PreviewSurface>('message');\n const [activePaletteVariantId, setActivePaletteVariantId] = useState<string | null>(null);\n\n // Always validate against the `message` surface: that's where Send posts\n // to. If we scoped validation to the preview surface, a user could switch\n // to `modal`, drop in modal-only blocks, see `errorCount === 0`, and have\n // Send accept a payload Slack will reject.\n const validation = useBlockKitValidation(blocks, 'message');\n\n const sensors = useSensors(useSensor(PointerSensor, { activationConstraint: { distance: 4 } }));\n\n const handleDragStart = useCallback((event: DragStartEvent) => {\n const variantId = parsePaletteDragId(event.active.id);\n setActivePaletteVariantId(variantId);\n }, []);\n\n const handleDragEnd = useCallback(\n (event: DragEndEvent) => {\n setActivePaletteVariantId(null);\n const { active, over } = event;\n if (!over) {\n return;\n }\n\n const variantId = parsePaletteDragId(active.id);\n if (variantId) {\n const variant = VARIANT_BY_ID.get(variantId);\n if (!variant) {\n return;\n }\n const targetIndex =\n over.id === SURFACE_DROPPABLE_ID ? blocks.length : blocks.findIndex((b) => b.id === over.id);\n addBlock(variant.factory(), targetIndex === -1 ? undefined : targetIndex);\n return;\n }\n\n if (active.id !== over.id) {\n const overIndex = blocks.findIndex((b) => b.id === over.id);\n if (overIndex !== -1) {\n reorderBlock(active.id as string, overIndex);\n }\n }\n },\n [addBlock, blocks, reorderBlock]\n );\n\n const handleDragCancel = useCallback(() => {\n setActivePaletteVariantId(null);\n }, []);\n\n const activePaletteVariant = activePaletteVariantId ? VARIANT_BY_ID.get(activePaletteVariantId) : null;\n\n const blockPayloads = blocks.map((b) => b.block);\n\n return (\n <TooltipProvider delayDuration={200}>\n <DndContext\n sensors={sensors}\n collisionDetection={closestCenter}\n onDragStart={handleDragStart}\n onDragEnd={handleDragEnd}\n onDragCancel={handleDragCancel}\n >\n <div className=\"bkb-root flex h-full w-full flex-col rounded-md border bg-background text-foreground\">\n <Toolbar\n onClear={() => replaceAll([])}\n onOpenJson={() => setJsonOpen(true)}\n onOpenIssues={() => setIssuesOpen(true)}\n onOpenSend={() => setSendOpen(true)}\n canSend={blocks.length > 0}\n canClear={blocks.length > 0}\n errorCount={validation.total}\n previewTheme={previewTheme}\n onPreviewThemeChange={setPreviewTheme}\n previewSurface={previewSurface}\n onPreviewSurfaceChange={setPreviewSurface}\n showSurfaceControl={showSurfaceControl}\n showThemeControl={showThemeControl}\n />\n <div className=\"flex min-h-0 flex-1 items-stretch\">\n <Palette onAddBlock={(block) => addBlock(block)} />\n <Surface\n blocks={blocks}\n workspaceName={workspaceName}\n previewHooks={previewHooks}\n previewTheme={previewTheme}\n previewSurface={previewSurface}\n errorsByBlockId={validation.byBlockId}\n openBlockId={openBlockId}\n onOpenBlockChange={setOpenBlockId}\n onUpdate={updateBlock}\n onDuplicate={duplicateBlock}\n onDelete={removeBlock}\n />\n </div>\n </div>\n <DragOverlay dropAnimation={null}>\n {activePaletteVariant ? (\n <div className=\"flex items-center gap-1.5 rounded border bg-background px-1.5 py-1 text-xs text-foreground shadow-md\">\n <GripVertical className=\"h-3 w-3 shrink-0\" />\n <span className=\"truncate\">{activePaletteVariant.label}</span>\n </div>\n ) : null}\n </DragOverlay>\n <JsonDrawer open={jsonOpen} onOpenChange={setJsonOpen} blocks={blockPayloads} onApply={replaceAll} />\n <SendDialog\n open={sendOpen}\n onOpenChange={setSendOpen}\n blocks={blockPayloads}\n loadChannels={loadChannels}\n loadSendAsUserStatus={loadSendAsUserStatus}\n onSend={onSend}\n errorCount={validation.total}\n onShowIssues={() => {\n setSendOpen(false);\n setIssuesOpen(true);\n }}\n />\n <IssuesSheet\n open={issuesOpen}\n onOpenChange={setIssuesOpen}\n blocks={blocks}\n validation={validation}\n onJumpToBlock={(id) => setOpenBlockId(id)}\n />\n </DndContext>\n </TooltipProvider>\n );\n}\n","import type { SupportedBlock } from '../types';\n\n/**\n * Encodes a block list to a base64url string suitable for use as a URL\n * search param. The consumer chooses where to put it (search param, hash,\n * localStorage, etc).\n * Returns an empty string for an empty list so the consumer can omit the\n * param entirely.\n * @param blocks - the blocks to encode\n * @returns base64url-encoded JSON, or '' if blocks is empty\n */\nexport function encodeBlocksToString(blocks: SupportedBlock[]): string {\n if (blocks.length === 0) {\n return '';\n }\n const json = JSON.stringify(blocks);\n const utf8Bytes = new TextEncoder().encode(json);\n const chars = new Array<string>(utf8Bytes.length);\n for (let i = 0; i < utf8Bytes.length; i++) {\n chars[i] = String.fromCharCode(utf8Bytes[i]);\n }\n return toBase64Url(btoa(chars.join('')));\n}\n\n/**\n * Decodes a string produced by {@link encodeBlocksToString} back to a\n * block list. Returns null on any decode/parse error.\n * @param encoded - the encoded string\n * @returns decoded blocks, or null if input is empty/invalid\n */\nexport function decodeBlocksFromString(encoded: string | undefined | null): SupportedBlock[] | null {\n if (!encoded) {\n return null;\n }\n try {\n const binary = atob(fromBase64Url(encoded));\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n const json = new TextDecoder().decode(bytes);\n const parsed = JSON.parse(json);\n if (!Array.isArray(parsed)) {\n return null;\n }\n return parsed as SupportedBlock[];\n } catch {\n return null;\n }\n}\n\n/**\n * Converts a standard base64 string to base64url (URL-safe alphabet, no padding).\n * @param b64 - standard base64-encoded string\n * @returns the base64url-encoded equivalent\n */\nfunction toBase64Url(b64: string): string {\n return b64.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '');\n}\n\n/**\n * Converts a base64url string back to standard base64 with padding restored.\n * @param b64url - base64url-encoded string\n * @returns the standard base64 equivalent\n */\nfunction fromBase64Url(b64url: string): string {\n const b64 = b64url.replace(/-/g, '+').replace(/_/g, '/');\n const padLen = (4 - (b64.length % 4)) % 4;\n return b64 + '='.repeat(padLen);\n}\n"]}
|