@tightknitai/block-kitchen 0.9.3 → 0.9.5
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/dist/helpers.d.cts +2 -2
- package/dist/helpers.d.ts +2 -2
- package/dist/index.cjs +232 -88
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +233 -89
- package/dist/index.js.map +1 -1
- package/dist/{palette-DIbvAzRA.d.cts → palette-inX8F01o.d.cts} +9 -1
- package/dist/{palette-DIbvAzRA.d.ts → palette-inX8F01o.d.ts} +9 -1
- package/dist/palette.d.cts +1 -1
- package/dist/palette.d.ts +1 -1
- package/dist/styles.css +1 -1
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lib/container-blocks.ts","../src/lib/custom-emoji-hook.tsx","../src/lib/default-blocks.ts","../src/lib/cn.ts","../src/lib/ui/sheet.tsx","../src/lib/ui/tooltip.tsx","../src/lib/use-is-mobile.ts","../src/state/custom-emoji-context.tsx","../src/lib/error-grouping.ts","../src/lib/url-safety.ts","../src/lib/sanitize-blocks.ts","../src/lib/to-slack-blocks.ts","../src/lib/validation-sanitize.ts","../src/state/use-block-kit-validation.ts","../src/state/use-block-kitchen-state.ts","../src/lib/brand-theme.ts","../src/components/brand-theme-scope.tsx","../src/components/issues-sheet.tsx","../src/lib/parse-blocks-input.ts","../src/components/json-drawer.tsx","../src/lib/ui/button.tsx","../src/lib/ui/dialog.tsx","../src/lib/ui/input.tsx","../src/lib/ui/label.tsx","../src/components/load-message-dialog.tsx","../src/components/palette.tsx","../src/components/send-dialog.tsx","../src/lib/ui/popover.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/container-editor.tsx","../src/components/editors/context-actions-editor.tsx","../src/components/editors/context-editor.tsx","../src/components/editors/data-visualization-editor.tsx","../src/components/editors/divider-editor.tsx","../src/lib/emoji-data.ts","../src/lib/emoji-recents.ts","../src/components/emoji/emoji-picker.tsx","../src/components/emoji/emoji-picker-button.tsx","../src/components/emoji/emoji-text-insert-button.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/components/editors/plan-editor.tsx","../src/lib/emoji-resolve.ts","../src/lib/rich-text-tiptap.ts","../src/lib/tiptap-emoji-node.tsx","../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/task-card-editor.tsx","../src/components/editors/video-editor.tsx","../src/components/editors/block-editor.tsx","../src/components/preview/slack-block-preview.tsx","../src/components/block-row.tsx","../src/components/container-row.tsx","../src/components/surface.tsx","../src/components/toolbar.tsx","../src/components/update-dialog.tsx","../src/components/block-kitchen.tsx","../src/components/template-picker.tsx","../src/lib/url-state.ts"],"names":["jsx","Sparkles","FileText","AlignLeft","MousePointerClick","TextCursorInput","LayoutTemplate","Bell","Pilcrow","ImageIcon","VideoIcon","GalleryHorizontal","TableIcon","ChartColumnBig","Container","twMerge","clsx","DialogPrimitive","React","jsxs","X","TooltipPrimitive","React2","useState","useEffect","createContext","useMemo","useContext","validateBlockKit","useRef","nanoid","useCallback","useId","Fragment","CheckCircle2","AlertTriangle","blocks","cva","React3","Slot","DialogPrimitive2","React4","React5","React6","LabelPrimitive","Info","Search","ChevronDown","ChevronRight","useDraggable","GripVertical","ExternalLink","PopoverPrimitive","React7","React8","RadioGroupPrimitive","Circle","Trash2","Plus","React9","CARD_ACTIONS_MAX","TypeIcon","custom","Smile","NodeViewWrapper","Node","mergeAttributes","ReactNodeViewRenderer","StarterKit","Link","editor","useEditor","EditorContent","Bold","Italic","Strikethrough","Underline","Code","List","ListOrdered","Quote","Code2","Undo2","Redo2","LinkIcon","STATUSES","Message","useSortable","CSS","ArrowUp","ArrowDown","Pencil","Copy","useDroppable","SortableContext","verticalListSortingStrategy","ToolbarButton","DropIndicator","LayoutGrid","Sun","Moon","MessageSquare","AppWindow","Home","Toolbar","MailSearch","BookOpen","Send","Check","useSensors","useSensor","PointerSensor","TouchSensor","KeyboardSensor","sortableKeyboardCoordinates","pointerWithin","closestCenter","DndContext","DragOverlay"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { SupportedBlockType } from '../types';\n\n/**\n * Block types Slack allows inside a `container` block's `child_blocks`.\n * Mirrors the validator schema (actions, context, divider, file, header,\n * image, input, rich_text, section, table, video) across the types the\n * builder models — `file` is omitted because the builder has no file block,\n * and `container` is excluded since containers don't nest.\n * @see https://docs.slack.dev/reference/block-kit/blocks/container-block\n */\nexport const CONTAINER_CHILD_TYPES: ReadonlySet<SupportedBlockType> = new Set([\n 'actions',\n 'context',\n 'divider',\n 'header',\n 'image',\n 'input',\n 'rich_text',\n 'section',\n 'table',\n 'video'\n]);\n\n/** Max child blocks Slack accepts in a container. */\nexport const MAX_CONTAINER_CHILDREN = 10;\n\n/** Whether a block type may be dropped inside a container. */\nexport function isContainerChildType(type: SupportedBlockType): boolean {\n return CONTAINER_CHILD_TYPES.has(type);\n}\n\n/** dnd-kit droppable id prefix for a container's body (the child drop zone). */\nconst BODY_PREFIX = 'container-body:';\n\n/** Build the droppable id for a container body. */\nexport function containerBodyId(containerId: string): string {\n return `${BODY_PREFIX}${containerId}`;\n}\n\n/** Parse a container-body droppable id back to its container id, or null. */\nexport function parseContainerBodyId(id: string | number): string | null {\n if (typeof id !== 'string' || !id.startsWith(BODY_PREFIX)) {\n return null;\n }\n return id.slice(BODY_PREFIX.length);\n}\n","import type { ReactNode } from 'react';\nimport type { CustomEmoji } from '../types';\n\n/**\n * The emoji object `slack-blocks-to-jsx` hands to the `emoji` hook. Mirrors\n * the upstream `Emoji` type without importing it, so we don't leak the\n * library's internal types into our surface. `unicode` / `skin_tone` are only\n * present for rich-text emoji elements; mrkdwn emoji arrive with `name` alone.\n */\ninterface HookEmoji {\n name: string;\n unicode?: string;\n skin_tone?: 1 | 2 | 3 | 4 | 5 | 6;\n}\n\n/** The shape of the `emoji` hook expected by `slack-blocks-to-jsx`. */\nexport type EmojiHook = (data: HookEmoji, parse: (data: HookEmoji) => string) => ReactNode;\n\n/**\n * Builds the `emoji` preview hook from a `byName` lookup of workspace custom\n * emoji. Resolution mirrors the companion site's `InlineEmoji` logic:\n *\n * - A matching entry with a `url` renders the workspace image.\n * - A matching alias entry (no `url`) defers to the library's default parser\n * using the alias target's name, preserving any `unicode` / `skin_tone`.\n * - Anything else (standard emoji, or an unknown name) falls through to the\n * library's default parser unchanged.\n *\n * The hook never alters the underlying payload — `url` is render-only.\n *\n * @param byName - lookup of custom emoji keyed by codename\n * @returns an `emoji` hook for `slack-blocks-to-jsx`\n */\nexport function makeEmojiHook(byName: Map<string, CustomEmoji>): EmojiHook {\n return (data, parse) => {\n const entry = byName.get(data.name);\n if (entry) {\n if (entry.url) {\n return (\n <img\n src={entry.url}\n alt={`:${data.name}:`}\n title={`:${data.name}:`}\n className=\"bk-custom-emoji\"\n style={{\n display: 'inline-block',\n width: '1.25em',\n height: '1.25em',\n verticalAlign: '-0.25em',\n objectFit: 'contain'\n }}\n />\n );\n }\n if (entry.alias) {\n return parse({ name: entry.alias, unicode: data.unicode, skin_tone: data.skin_tone });\n }\n }\n return parse(data);\n };\n}\n","import {\n AlignLeft,\n Bell,\n ChartColumnBig,\n Container,\n FileText,\n GalleryHorizontal,\n Image as ImageIcon,\n LayoutTemplate,\n MousePointerClick,\n Pilcrow,\n Sparkles,\n Table as TableIcon,\n TextCursorInput,\n Video as VideoIcon\n} from 'lucide-react';\nimport type { ComponentType, SVGProps } from 'react';\nimport 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 (\"All selects\", \"Datepickers\",\n * \"Filtered conversation\", 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 related variants under a\n * single heading + icon, matching Slack's Block Kit Builder sidebar\n * (Agents, Markdown, Section, Actions, Input, Structure, Rich Text,\n * Image, Card and Carousel, Table).\n *\n * Variant ids must be unique across the entire palette — the drag-drop\n * variant lookup keys by id, so a duplicate would shadow the earlier one.\n */\nexport interface PaletteSection {\n /** Visible heading for the section. */\n name: string;\n /** Lucide icon component rendered next to the section heading. */\n icon: ComponentType<SVGProps<SVGSVGElement>>;\n variants: PaletteVariant[];\n}\n\n/**\n * The built-in palette. Mirrors Slack's real Block Kit Builder: related\n * variants (e.g. every select type) are combined into single showcase\n * `actions` blocks (\"All selects\", \"Datepickers\") rather than each\n * variant being its own row. The full set of single-element `input`\n * variants is still available via {@link legacyInputVariants}.\n */\nexport const defaultPalette: readonly PaletteSection[] = [\n {\n name: 'Agents',\n icon: Sparkles,\n variants: [\n {\n id: 'agents_feedback_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: 'agents_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 id: 'agents_plan',\n label: 'Plan',\n factory: () => ({\n type: 'plan',\n title: 'Investigating the issue',\n tasks: [\n {\n type: 'task_card',\n task_id: 'task_1',\n title: 'Read the bug report',\n status: 'complete'\n },\n {\n type: 'task_card',\n task_id: 'task_2',\n title: 'Reproduce the error locally',\n status: 'in_progress'\n },\n {\n type: 'task_card',\n task_id: 'task_3',\n title: 'Identify the root cause',\n status: 'pending'\n }\n ]\n })\n },\n {\n id: 'agents_task_card',\n label: 'Task card',\n factory: () => ({\n type: 'task_card',\n task_id: 'task_1',\n title: 'Summarize the latest release notes',\n status: 'in_progress'\n })\n },\n {\n id: 'agents_task_card_with_sources',\n label: 'Task card with sources',\n factory: () => ({\n type: 'task_card',\n task_id: 'task_2',\n title: 'Cite supporting docs',\n status: 'complete',\n sources: [\n {\n type: 'url',\n url: 'https://example.com/runbook',\n text: 'Runbook'\n },\n {\n type: 'url',\n url: 'https://example.com/changelog',\n text: 'Changelog'\n }\n ]\n })\n }\n ]\n },\n {\n name: 'Markdown',\n icon: FileText,\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 icon: AlignLeft,\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: 'Actions',\n icon: MousePointerClick,\n variants: [\n {\n id: 'actions_all_selects',\n label: 'All selects',\n factory: () => ({\n type: 'actions',\n elements: [\n {\n type: 'static_select',\n action_id: 'static_select',\n placeholder: { type: 'plain_text', text: 'Static', emoji: true },\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 },\n {\n type: 'users_select',\n action_id: 'users_select',\n placeholder: { type: 'plain_text', text: 'User', emoji: true }\n },\n {\n type: 'channels_select',\n action_id: 'channels_select',\n placeholder: { type: 'plain_text', text: 'Channel', emoji: true }\n },\n {\n type: 'conversations_select',\n action_id: 'conversations_select',\n placeholder: {\n type: 'plain_text',\n text: 'Conversation',\n emoji: true\n }\n },\n {\n type: 'external_select',\n action_id: 'external_select',\n placeholder: { type: 'plain_text', text: 'External', emoji: true },\n min_query_length: 0\n }\n ]\n })\n },\n {\n id: 'actions_filtered_conversation',\n label: 'Filtered conversation',\n factory: () => ({\n type: 'actions',\n elements: [\n {\n type: 'conversations_select',\n action_id: 'filtered_conversations_select',\n placeholder: {\n type: 'plain_text',\n text: 'Pick a public channel',\n emoji: true\n },\n filter: {\n include: ['public'],\n exclude_bot_users: true,\n exclude_external_shared_channels: true\n }\n }\n ]\n })\n },\n {\n id: 'actions_selects_initial_values',\n label: 'Selects with initial values',\n factory: () => ({\n type: 'actions',\n elements: [\n {\n type: 'static_select',\n action_id: 'static_select_initial',\n placeholder: { type: 'plain_text', text: 'Pick one', emoji: true },\n initial_option: {\n text: { type: 'plain_text', text: 'Option 2', emoji: true },\n value: 'option_2'\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 type: 'users_select',\n action_id: 'users_select_initial',\n placeholder: { type: 'plain_text', text: 'Pick a user', emoji: true },\n initial_user: 'U0LAN0Z89'\n },\n {\n type: 'channels_select',\n action_id: 'channels_select_initial',\n placeholder: {\n type: 'plain_text',\n text: 'Pick a channel',\n emoji: true\n },\n initial_channel: 'C012AB3CD'\n }\n ]\n })\n },\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_datepickers',\n label: 'Datepickers',\n factory: () => ({\n type: 'actions',\n elements: [\n {\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 type: 'timepicker',\n action_id: 'timepicker',\n placeholder: {\n type: 'plain_text',\n text: 'Select a time',\n emoji: true\n }\n },\n {\n type: 'datetimepicker',\n action_id: 'datetimepicker'\n }\n ]\n })\n },\n {\n id: 'actions_checkboxes',\n label: 'Checkboxes',\n factory: () => ({\n type: 'actions',\n elements: [\n {\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 {\n id: 'actions_radio_buttons',\n label: 'Radio buttons',\n factory: () => ({\n type: 'actions',\n elements: [\n {\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 {\n id: 'actions_timepicker',\n label: 'Timepicker',\n factory: () => ({\n type: 'actions',\n elements: [\n {\n type: 'timepicker',\n action_id: 'timepicker_only',\n placeholder: {\n type: 'plain_text',\n text: 'Select a time',\n emoji: true\n }\n }\n ]\n })\n }\n ]\n },\n {\n name: 'Input',\n icon: TextCursorInput,\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_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_rich_text',\n label: 'Rich text',\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: 'Structure',\n icon: LayoutTemplate,\n variants: [\n {\n id: 'structure_header',\n label: 'Header',\n factory: () => ({\n type: 'header',\n text: { type: 'plain_text', text: 'Heading text', emoji: true }\n })\n },\n {\n id: 'structure_divider',\n label: 'Divider',\n factory: () => ({ type: 'divider' })\n },\n {\n id: 'structure_context_plain',\n label: 'Context (plain text)',\n factory: () => ({\n type: 'context',\n elements: [{ type: 'plain_text', text: 'Posted by your app', emoji: true }]\n })\n },\n {\n id: 'structure_context_mrkdwn',\n label: 'Context (mrkdwn)',\n factory: () => ({\n type: 'context',\n elements: [{ type: 'mrkdwn', text: 'Posted by *your app*' }]\n })\n },\n {\n id: 'structure_context_text_images',\n label: 'Context (text + 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: 'Alert',\n icon: Bell,\n variants: [\n {\n id: 'alert_default',\n label: 'Default',\n factory: () => ({\n type: 'alert',\n text: {\n type: 'mrkdwn',\n text: 'A neutral alert message.'\n }\n })\n },\n {\n id: 'alert_info',\n label: 'Info',\n factory: () => ({\n type: 'alert',\n level: 'info',\n text: {\n type: 'mrkdwn',\n text: 'FYI: the build finished in 42 seconds.'\n }\n })\n },\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 id: 'alert_error',\n label: 'Error',\n factory: () => ({\n type: 'alert',\n level: 'error',\n text: {\n type: 'mrkdwn',\n text: 'Something went wrong. Please try again.'\n }\n })\n },\n {\n id: 'alert_success',\n label: 'Success',\n factory: () => ({\n type: 'alert',\n level: 'success',\n text: {\n type: 'mrkdwn',\n text: 'Your changes have been saved.'\n }\n })\n }\n ]\n },\n {\n name: 'Rich Text',\n icon: Pilcrow,\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: 'Image',\n icon: ImageIcon,\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: 'Video',\n icon: VideoIcon,\n variants: [\n {\n id: 'video_basic',\n label: 'Basic',\n factory: () => ({\n type: 'video',\n alt_text: 'A short demo video',\n title: { type: 'plain_text', text: 'Product demo', emoji: true },\n thumbnail_url: 'https://placehold.co/600x340?text=Video',\n video_url: 'https://www.youtube.com/embed/dQw4w9WgXcQ'\n })\n },\n {\n id: 'video_with_metadata',\n label: 'With metadata',\n factory: () => ({\n type: 'video',\n alt_text: 'A short demo video',\n title: { type: 'plain_text', text: 'Product demo', emoji: true },\n title_url: 'https://www.youtube.com/watch?v=dQw4w9WgXcQ',\n thumbnail_url: 'https://placehold.co/600x340?text=Video',\n video_url: 'https://www.youtube.com/embed/dQw4w9WgXcQ',\n author_name: 'Acme',\n description: {\n type: 'plain_text',\n text: 'A short walkthrough of the new release.',\n emoji: true\n },\n provider_name: 'YouTube',\n provider_icon_url: 'https://placehold.co/16x16?text=YT'\n })\n }\n ]\n },\n {\n name: 'Card and Carousel',\n icon: GalleryHorizontal,\n variants: [\n {\n id: 'card_basic',\n label: 'Card',\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: 'Card 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: 'Card 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 id: 'carousel_basic',\n label: 'Carousel',\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: 'Table',\n icon: TableIcon,\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 {\n name: 'Data Visualization',\n icon: ChartColumnBig,\n variants: [\n {\n id: 'dataviz_line',\n label: 'Line chart',\n factory: () => ({\n type: 'data_visualization',\n title: 'Weekly active users by platform',\n chart: {\n type: 'line',\n series: [\n {\n name: 'Desktop',\n data: [\n { label: 'Mon', value: 800 },\n { label: 'Tue', value: 920 },\n { label: 'Wed', value: 880 },\n { label: 'Thu', value: 1010 },\n { label: 'Fri', value: 1120 }\n ]\n },\n {\n name: 'Mobile',\n data: [\n { label: 'Mon', value: 400 },\n { label: 'Tue', value: 530 },\n { label: 'Wed', value: 500 },\n { label: 'Thu', value: 590 },\n { label: 'Fri', value: 600 }\n ]\n }\n ],\n axis_config: {\n categories: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri'],\n x_label: 'Day',\n y_label: 'Users'\n }\n }\n })\n },\n {\n id: 'dataviz_bar',\n label: 'Bar chart',\n factory: () => ({\n type: 'data_visualization',\n title: 'Messages sent by platform',\n chart: {\n type: 'bar',\n series: [\n {\n name: 'Desktop',\n data: [\n { label: 'Mon', value: 1500 },\n { label: 'Tue', value: 1400 },\n { label: 'Wed', value: 1700 },\n { label: 'Thu', value: 1600 },\n { label: 'Fri', value: 1280 }\n ]\n },\n {\n name: 'Mobile',\n data: [\n { label: 'Mon', value: 800 },\n { label: 'Tue', value: 750 },\n { label: 'Wed', value: 920 },\n { label: 'Thu', value: 880 },\n { label: 'Fri', value: 700 }\n ]\n }\n ],\n axis_config: {\n categories: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri'],\n x_label: 'Day',\n y_label: 'Messages'\n }\n }\n })\n },\n {\n id: 'dataviz_area',\n label: 'Area chart',\n factory: () => ({\n type: 'data_visualization',\n title: 'Concurrent users by platform',\n chart: {\n type: 'area',\n series: [\n {\n name: 'Desktop',\n data: [\n { label: 'Mon', value: 2800 },\n { label: 'Tue', value: 3000 },\n { label: 'Wed', value: 3400 },\n { label: 'Thu', value: 3200 },\n { label: 'Fri', value: 3500 }\n ]\n },\n {\n name: 'Mobile',\n data: [\n { label: 'Mon', value: 1400 },\n { label: 'Tue', value: 1500 },\n { label: 'Wed', value: 1700 },\n { label: 'Thu', value: 1600 },\n { label: 'Fri', value: 1800 }\n ]\n }\n ],\n axis_config: {\n categories: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri'],\n x_label: 'Day',\n y_label: 'Users'\n }\n }\n })\n },\n {\n id: 'dataviz_pie',\n label: 'Pie chart',\n factory: () => ({\n type: 'data_visualization',\n title: 'Plan distribution by tier',\n chart: {\n type: 'pie',\n segments: [\n { label: 'Free', value: 4200 },\n { label: 'Pro', value: 2300 },\n { label: 'Business+', value: 1100 },\n { label: 'Enterprise', value: 480 }\n ]\n }\n })\n }\n ]\n },\n {\n name: 'Container',\n icon: Container,\n variants: [\n {\n id: 'container_collapsible',\n label: 'Collapsible container',\n factory: () => ({\n type: 'container',\n title: { type: 'plain_text', text: 'Bulk update: 2 records selected' },\n subtitle: { type: 'plain_text', text: 'Review changes before confirming' },\n is_collapsible: true,\n child_blocks: [\n {\n type: 'section',\n text: { type: 'mrkdwn', text: '*DCW-1024*\\nStatus: Open → Closed' }\n },\n { type: 'divider' },\n {\n type: 'section',\n text: { type: 'mrkdwn', text: '*DCW-1025*\\nStatus: In Progress → Closed' }\n },\n {\n type: 'actions',\n elements: [\n {\n type: 'button',\n text: { type: 'plain_text', text: 'Confirm All', emoji: true },\n style: 'primary',\n action_id: 'bulk_confirm'\n },\n {\n type: 'button',\n text: { type: 'plain_text', text: 'Cancel', emoji: true },\n action_id: 'bulk_cancel'\n }\n ]\n }\n ]\n })\n }\n ]\n }\n] as const;\n\n/**\n * The single-element `input`-block variants that used to ship in\n * `defaultPalette` before it was consolidated to mirror Slack's Block\n * Kit Builder. Kept reachable so consumers who referenced these ids via\n * the `palette` prop can spread them back into a custom palette.\n *\n * @example\n * ```tsx\n * import { defaultPalette, legacyInputVariants } from '@tightknitai/block-kitchen';\n * import { TextCursorInput } from 'lucide-react';\n *\n * const palette = [\n * ...defaultPalette,\n * { name: 'All inputs', icon: TextCursorInput, variants: [...legacyInputVariants] }\n * ];\n * ```\n *\n * Note: some ids here (`input_plain_text`, `input_date`, etc.) collide\n * with curated ids in the new `defaultPalette`. `buildVariantById`\n * keeps the last entry for a given id, so spread `legacyInputVariants`\n * after `defaultPalette` to use the legacy factory.\n */\nexport const legacyInputVariants: readonly PaletteVariant[] = [\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] as const;\n\n/**\n * Standalone `alert` block variant. The full set of severity-level alert\n * variants ships in `defaultPalette` under the \"Alert\" section; this\n * export is retained for backward compatibility with consumers who\n * previously spread it onto a custom palette. Shares the `alert_warning`\n * id with its counterpart in `defaultPalette` — spread after\n * `defaultPalette` (or omit it entirely) to avoid duplicate-id lookups.\n */\nexport const extraAlertVariant: PaletteVariant = {\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 * Builds a lookup table mapping a variant id to its definition for a\n * resolved palette. Used by the DnD drop handler to resolve a\n * `palette:${id}` drag back to a factory.\n * @param sections - the palette in use (defaults or a consumer-provided one)\n * @returns a map keyed by variant id\n */\nexport function buildVariantById(sections: readonly PaletteSection[]): ReadonlyMap<string, PaletteVariant> {\n return new Map(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 case 'video':\n return 'Video';\n case 'plan':\n return 'Plan';\n case 'task_card':\n return 'Task Card';\n case 'data_visualization':\n return 'Data Visualization';\n case 'container':\n return 'Container';\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 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 'bk-portal-content 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\ntype SheetSide = 'right' | 'left' | 'top' | 'bottom';\n\nconst SHEET_SIDE_CLASSES: Record<SheetSide, string> = {\n right:\n 'inset-y-0 right-0 h-full w-full max-w-md border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right',\n left: 'inset-y-0 left-0 h-full w-full max-w-md border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left',\n top: 'inset-x-0 top-0 w-full border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top',\n bottom:\n 'inset-x-0 bottom-0 w-full rounded-t-xl border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom'\n};\n\ninterface SheetContentProps extends React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content> {\n /**\n * Which edge the sheet slides in from. Defaults to `'right'`. `'bottom'`\n * is the natural fit for mobile contexts.\n */\n side?: SheetSide;\n /**\n * When true, hides the built-in close button. Set when the sheet\n * provides its own close affordance.\n */\n hideClose?: boolean;\n}\n\nconst SheetContent = React.forwardRef<React.ElementRef<typeof DialogPrimitive.Content>, SheetContentProps>(\n ({ className, children, side = 'right', hideClose = false, ...props }, ref) => (\n <DialogPrimitive.Portal>\n <SheetOverlay />\n <DialogPrimitive.Content\n ref={ref}\n className={cn(\n 'bk-portal-content fixed z-50 flex flex-col gap-4 bg-background p-6 shadow-lg transition ease-in-out data-[state=open]:animate-in data-[state=closed]:animate-out',\n SHEET_SIDE_CLASSES[side],\n className\n )}\n {...props}\n >\n {children}\n {hideClose ? null : (\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 )}\n </DialogPrimitive.Content>\n </DialogPrimitive.Portal>\n )\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 * 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 'bk-portal-content 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 { useEffect, useState } from 'react';\n\n/**\n * Viewport breakpoint (in px) below which we treat the UI as \"mobile\".\n * Matches Tailwind's default `md` breakpoint so utility classes like\n * `md:flex` line up with the JS behavior switch.\n */\nexport const MOBILE_BREAKPOINT_PX = 768;\n\n/**\n * Returns `true` whenever the viewport width is below\n * {@link MOBILE_BREAKPOINT_PX}. Subscribes to `matchMedia` so callers\n * re-render on rotate / window resize without polling. Server-rendered\n * pages start as `false` and update on hydration.\n */\nexport function useIsMobile(): boolean {\n const [isMobile, setIsMobile] = useState<boolean>(() => {\n if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') return false;\n return window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT_PX - 1}px)`).matches;\n });\n\n useEffect(() => {\n if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') return;\n const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT_PX - 1}px)`);\n const onChange = (e: MediaQueryListEvent) => setIsMobile(e.matches);\n // Sync on mount in case state seeded before media query attached.\n setIsMobile(mql.matches);\n mql.addEventListener('change', onChange);\n return () => mql.removeEventListener('change', onChange);\n }, []);\n\n return isMobile;\n}\n","import { createContext, type ReactNode, useContext, useMemo } from 'react';\nimport type { CustomEmoji } from '../types';\n\n/**\n * The value exposed to the builder tree: the raw `customEmojis` list plus a\n * `byName` lookup keyed on each entry's codename. Built once at the\n * {@link BlockKitchen} root so editors (emoji picker) and the preview can\n * resolve `:custom:` directives without prop-drilling through\n * `Surface → block-row → block-editor → *-editor`.\n */\nexport interface CustomEmojiContextValue {\n /** The custom emoji passed to {@link BlockKitchenProps.customEmojis}. */\n customEmojis: CustomEmoji[];\n /** Lookup of each custom emoji by its codename (`name`). */\n byName: Map<string, CustomEmoji>;\n}\n\nconst EMPTY: CustomEmojiContextValue = {\n customEmojis: [],\n byName: new Map()\n};\n\nconst CustomEmojiContext = createContext<CustomEmojiContextValue>(EMPTY);\n\n/**\n * Provides the workspace custom emoji to the builder tree. Memoizes the\n * `byName` lookup so consumers get a stable reference while `customEmojis`\n * is unchanged. When `customEmojis` is omitted the context resolves to an\n * empty, shared value so descendants behave exactly as they did before the\n * prop existed.\n *\n * @param props.customEmojis - the workspace custom emoji (may be undefined)\n * @param props.children - the subtree that can read the context\n */\nexport function CustomEmojiProvider({ customEmojis, children }: { customEmojis?: CustomEmoji[]; children: ReactNode }) {\n const value = useMemo<CustomEmojiContextValue>(() => {\n if (!customEmojis || customEmojis.length === 0) {\n return EMPTY;\n }\n const byName = new Map<string, CustomEmoji>();\n for (const emoji of customEmojis) {\n byName.set(emoji.name, emoji);\n }\n return { customEmojis, byName };\n }, [customEmojis]);\n\n return <CustomEmojiContext.Provider value={value}>{children}</CustomEmojiContext.Provider>;\n}\n\n/**\n * Reads the custom emoji context. Returns the empty value when called outside\n * a {@link CustomEmojiProvider}, so it is always safe to call.\n */\nexport function useCustomEmojis(): CustomEmojiContextValue {\n return useContext(CustomEmojiContext);\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 * Leading path token in a validator message that scopes the error to a\n * single block, e.g. `blocks[2]`, `blocks[2].elements`, `blocks[0].type`.\n * `@tightknitai/slack-block-kit-validator` (>= 0.1.x) emits dot/bracket\n * paths like `blocks[1].elements: fewer than 1 items`; cross-block caveat\n * helpers use a bare space (`blocks[1].block_id must be unique — ...`).\n * The capture group is the zero-based block index.\n */\nconst BLOCK_PREFIX = /^blocks\\[(\\d+)\\]/;\n\n/**\n * Returns the block index a validator message is scoped to, or null when the\n * message isn't rooted at a specific `blocks[N]` entry (root errors, the\n * blocks-array-itself errors a view envelope can raise, etc).\n * @param raw - a single error string from `validateBlockKit`\n * @returns the zero-based block index, or null\n */\nfunction extractBlockIndex(raw: string): number | null {\n const match = BLOCK_PREFIX.exec(raw);\n return match ? Number.parseInt(match[1], 10) : null;\n}\n\n/**\n * Strips the `blocks[N]` prefix from a block-scoped message so the text\n * shown next to a block doesn't redundantly repeat the block index, keeping\n * any sub-path as useful context.\n *\n * - `blocks[1].elements: fewer than 1 items` → `elements: fewer than 1 items`\n * - `blocks[0]: missing required property 'text'` → `missing required property 'text'`\n * - `blocks[1].block_id must be unique — …` → `block_id must be unique — …`\n *\n * @param raw - the original block-scoped error string\n * @returns the message without its leading `blocks[N]` prefix\n */\nfunction toBlockMessage(raw: string): string {\n const rest = raw.replace(BLOCK_PREFIX, '');\n // Block-root errors read `blocks[N]: <message>` — drop the orphaned colon\n // so we're left with just the message.\n if (rest.startsWith(':')) {\n return rest.replace(/^:\\s*/, '');\n }\n // Sub-path errors keep the path as context; drop only the joining dot\n // (`.elements` → `elements`), leaving bracket indices (`[0]`) intact.\n return rest.replace(/^\\./, '');\n}\n\n/**\n * Lightly cleans a non-block-scoped message for display, dropping the\n * `(root)` sentinel the validator uses for top-level issues.\n * @param raw - the original general error string\n * @returns the cleaned message\n */\nfunction toGeneralMessage(raw: string): string {\n return raw.startsWith('(root)') ? raw.replace(/^\\(root\\):?\\s*/, '') : raw;\n}\n\n/**\n * Splits a flat array of validator error strings into per-block buckets\n * keyed by the matching {@link BuilderBlock.id}, plus a general bucket for\n * anything not tied to a single block.\n *\n * Pairs with `@tightknitai/slack-block-kit-validator` >= 0.1.x, which\n * collapses the AJV `oneOf` cascade (one structural mistake no longer yields\n * ~25 branch errors) and emits `blocks[N]...`-rooted paths. The exact path\n * shape is pinned by `error-grouping.test.ts`.\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 const idx = extractBlockIndex(raw);\n if (idx === null || idx >= blocks.length) {\n general.push(toGeneralMessage(raw));\n continue;\n }\n\n const id = blocks[idx].id;\n const bucket = byBlockId.get(id) ?? [];\n bucket.push(toBlockMessage(raw));\n byBlockId.set(id, bucket);\n }\n\n return { byBlockId, general, total: errors.length };\n}\n","/**\n * URL-scheme allowlists used as a defense-in-depth layer against\n * DOM-XSS via user-supplied URLs that flow into `<a href>` and `<img src>`\n * in the preview (rendered by `slack-blocks-to-jsx`, which does not\n * filter URI schemes itself) or in the builder's own chrome (e.g. the\n * \"Sign in with Slack\" link in `SendDialog`).\n *\n * `format: \"uri\"` on the validator schema (AJV / ajv-formats) accepts\n * any RFC-3986 URI including `javascript:` and `data:`, so the validator\n * cannot be relied on for this purpose.\n *\n * Mirrors react-markdown 9's `defaultUrlTransform` approach: parse the\n * scheme, allow the safe set, and treat anything without a recognized\n * scheme as a relative URL (preserved as-is).\n */\n\n/**\n * Schemes safe to use as an `<a href>` target.\n * Mirrors react-markdown's `safeProtocol` set (`https?|ircs?|mailto|xmpp`)\n * plus `tel` and `sms` (Slack's documented link types).\n */\nconst SAFE_LINK_PROTOCOLS = /^(https?|ircs?|mailto|tel|sms|xmpp)$/i;\n\n/**\n * Schemes safe to use as an `<img src>` source. We allow `data:image/*`\n * because Slack itself emits inline images that way for some emoji and\n * file thumbnails; everything else (e.g. `data:text/html`, `data:image/svg+xml`\n * — which can carry script in some contexts) is rejected.\n */\nconst SAFE_IMAGE_PROTOCOLS = /^(https?)$/i;\n// Allow `data:image/<safe-mime>` followed by any sequence of media-type\n// parameters. Each parameter is `;<name>` or `;<name>=<value>` (RFC 2397\n// allows the bare `;base64` token, which has no `=`). The comma\n// terminates the parameter list and starts the payload.\nconst SAFE_IMAGE_DATA_PREFIX =\n /^data:image\\/(?:png|jpeg|jpg|gif|webp|avif|x-icon|vnd\\.microsoft\\.icon)(?:;[a-z0-9-]+(?:=[^,;]*)?)*,/i;\n\n/**\n * Splits a URL into its scheme prefix and tail without invoking the\n * `URL` constructor (which throws on relative URLs and varies in how\n * it normalizes whitespace and unicode). Matches react-markdown's\n * approach: look for the first `:`, `?`, `#`, or `/`; if `:` comes\n * first, that prefix is the scheme.\n * @param value - the candidate URL\n * @returns the lowercase scheme if the URL is absolute, or `null` if relative\n */\nfunction getScheme(value: string): string | null {\n // Strip leading whitespace so `\\tjavascript:` and ` javascript:`\n // still resolve to the `javascript` scheme; browsers ignore leading\n // whitespace when following an href, so the sanitizer must too.\n const trimmed = value.replace(/^\\s+/, '');\n const colon = trimmed.indexOf(':');\n if (colon === -1) {\n return null;\n }\n const slash = trimmed.indexOf('/');\n const question = trimmed.indexOf('?');\n const hash = trimmed.indexOf('#');\n // If any of `/`, `?`, `#` appears before the `:`, then the `:` is\n // inside the path/query/fragment, not a scheme delimiter — treat the\n // URL as relative.\n if ((slash !== -1 && slash < colon) || (question !== -1 && question < colon) || (hash !== -1 && hash < colon)) {\n return null;\n }\n return trimmed.slice(0, colon).toLowerCase();\n}\n\n/**\n * Returns true when `value` is safe to use as an `<a href>` target.\n * Accepts:\n * - absolute URLs whose scheme is in the safe-link allowlist\n * (`http`, `https`, `ircs?`, `mailto`, `tel`, `sms`, `xmpp`).\n * - relative URLs (no scheme).\n * - empty string (caller decides whether to render).\n *\n * Rejects `javascript:`, `data:`, `vbscript:`, `file:`, `about:`,\n * and any other unrecognized scheme.\n * @param value - the candidate URL\n * @returns true when the URL is safe to render as a link\n */\nexport function isSafeHref(value: string | null | undefined): boolean {\n if (value === null || value === undefined) {\n return false;\n }\n if (typeof value !== 'string') {\n return false;\n }\n if (value.length === 0) {\n return true;\n }\n const scheme = getScheme(value);\n if (scheme === null) {\n return true;\n }\n return SAFE_LINK_PROTOCOLS.test(scheme);\n}\n\n/**\n * Returns true when `value` carries an explicit, safe URL scheme\n * (e.g. `https://example.com`, `mailto:a@b.com`).\n *\n * Used to gate the TipTap link extension's autolinker. TipTap's default\n * `shouldAutoLink` links any token containing a dot whose host isn't a\n * bare IPv4 — so `2.xyz`, `report.zip`, or `logo.png` all become links\n * just because the suffix happens to be a real gTLD. Requiring an\n * explicit scheme means only URLs the user actually typed as links\n * (`https://…`) auto-link; bare host-like text stays plain text, and\n * deliberate links can still be added via the link button or by typing\n * the scheme. Schemes outside the safe-link allowlist are rejected here\n * too, so an unsafe scheme can never be auto-linked.\n * @param value - the candidate URL (the linkifier's matched token text)\n * @returns true when the value has an explicit, allowlisted scheme\n */\nexport function hasExplicitSafeScheme(value: string | null | undefined): boolean {\n if (typeof value !== 'string' || value.length === 0) {\n return false;\n }\n return getScheme(value) !== null && isSafeHref(value);\n}\n\n/**\n * Returns true when `value` is safe to use as an `<img src>`.\n * Accepts http(s), relative URLs, empty string, and `data:image/*`\n * URLs whose MIME subtype is in a tight allowlist. Rejects\n * `data:image/svg+xml` (can carry script) and everything else.\n * @param value - the candidate URL\n * @returns true when the URL is safe to render as an image\n */\nexport function isSafeImageSrc(value: string | null | undefined): boolean {\n if (value === null || value === undefined) {\n return false;\n }\n if (typeof value !== 'string') {\n return false;\n }\n if (value.length === 0) {\n return true;\n }\n const scheme = getScheme(value);\n if (scheme === null) {\n return true;\n }\n if (scheme === 'data') {\n return SAFE_IMAGE_DATA_PREFIX.test(value);\n }\n return SAFE_IMAGE_PROTOCOLS.test(scheme);\n}\n\n/**\n * Returns `value` if it passes {@link isSafeHref}, otherwise an empty\n * string. Use at render time / payload boundaries so an unsafe URL\n * never reaches the DOM as an `href` attribute.\n * @param value - the candidate URL\n * @returns the URL if safe, or `''`\n */\nexport function sanitizeHref(value: string | null | undefined): string {\n return isSafeHref(value) ? (value ?? '') : '';\n}\n\n/**\n * Returns `value` if it passes {@link isSafeImageSrc}, otherwise an\n * empty string. Use at render time / payload boundaries.\n * @param value - the candidate URL\n * @returns the URL if safe, or `''`\n */\nexport function sanitizeImageSrc(value: string | null | undefined): string {\n return isSafeImageSrc(value) ? (value ?? '') : '';\n}\n","import type { SupportedBlock } from '../types';\nimport { sanitizeHref, sanitizeImageSrc } from './url-safety';\n\n/**\n * Recursively walks an unknown value and rewrites string values at the\n * specified keys via the matching sanitizer. Used to strip dangerous\n * URI schemes (e.g. `javascript:`) from `url`, `image_url`, and\n * rich-text link `url` fields before a Block Kit payload reaches a\n * renderer or is handed back to the consumer.\n *\n * Allocates a new object whenever a child is rewritten; otherwise\n * returns the input unchanged so unaffected payloads are reference-stable.\n *\n * Defensive against prototype-polluted shapes: copies are made via\n * `Object.assign({}, ...)` over own enumerable keys returned by\n * `Object.keys`, which skips inherited properties.\n */\nconst HREF_KEYS = new Set(['url']);\nconst IMAGE_KEYS = new Set(['image_url']);\n\n/**\n * Read-only metadata Slack attaches when a message is *retrieved* via the\n * API, but rejects on *send*, keyed by the `type` of the object it appears\n * on. Blocks loaded from an existing message carry these; drop them only\n * from the matching object type — some are common field names (`fallback`)\n * that are valid elsewhere — so a round-tripped payload stays send-valid\n * without over-scrubbing. Add an entry to extend this to other block types.\n */\nconst RETRIEVAL_ONLY_KEYS = new Map<string, Set<string>>([\n // Covers both the image block and the image element — both `type: 'image'`.\n ['image', new Set(['image_width', 'image_height', 'image_bytes', 'fallback', 'is_animated'])]\n]);\n\n/**\n * Recursively sanitize all known URL-bearing string fields inside a\n * Slack Block Kit payload fragment. Returns a value with the same\n * structural shape, where any field whose name matches an href or\n * image-src key has been replaced by the safe variant (`''` if the\n * original scheme was unsafe).\n * @param value - any payload fragment (object, array, primitive)\n * @returns the sanitized payload fragment\n */\nfunction sanitizeValue(value: unknown): unknown {\n if (value === null || typeof value !== 'object') {\n return value;\n }\n if (Array.isArray(value)) {\n let changed = false;\n const out = new Array(value.length);\n for (let i = 0; i < value.length; i++) {\n const next = sanitizeValue(value[i]);\n if (next !== value[i]) {\n changed = true;\n }\n out[i] = next;\n }\n return changed ? out : value;\n }\n const src = value as Record<string, unknown>;\n const dropKeys = typeof src.type === 'string' ? RETRIEVAL_ONLY_KEYS.get(src.type) : undefined;\n let copy: Record<string, unknown> | null = null;\n for (const key of Object.keys(src)) {\n if (dropKeys?.has(key)) {\n copy ??= { ...src };\n delete copy[key];\n continue;\n }\n const original = src[key];\n let next: unknown = original;\n if (typeof original === 'string') {\n if (HREF_KEYS.has(key)) {\n next = sanitizeHref(original);\n } else if (IMAGE_KEYS.has(key)) {\n next = sanitizeImageSrc(original);\n }\n } else if (typeof original === 'object' && original !== null) {\n next = sanitizeValue(original);\n }\n if (next !== original) {\n if (!copy) {\n copy = { ...src };\n }\n copy[key] = next;\n }\n }\n return copy ?? src;\n}\n\n/**\n * Sanitize a single Block Kit block, scrubbing dangerous URI schemes\n * from `url` and `image_url` fields anywhere in the payload tree.\n * @param block - the block payload to sanitize\n * @returns the sanitized block (same reference if nothing changed)\n */\nexport function sanitizeBlock<T extends SupportedBlock>(block: T): T {\n return sanitizeValue(block) as T;\n}\n\n/**\n * Sanitize an array of Block Kit blocks. See {@link sanitizeBlock}.\n * @param blocks - the block payloads to sanitize\n * @returns the sanitized blocks\n */\nexport function sanitizeBlocks(blocks: SupportedBlock[]): SupportedBlock[] {\n let changed = false;\n const out = new Array<SupportedBlock>(blocks.length);\n for (let i = 0; i < blocks.length; i++) {\n const next = sanitizeBlock(blocks[i]);\n if (next !== blocks[i]) {\n changed = true;\n }\n out[i] = next;\n }\n return changed ? out : blocks;\n}\n","import type { SupportedBlock } from '../types';\nimport { sanitizeBlock } from './sanitize-blocks';\n\n/**\n * Strip builder-only fields from blocks so they conform to Slack's\n * Block Kit schema, and scrub dangerous URI schemes from any\n * `url`/`image_url` fields. Currently removes the cosmetic `level`\n * field from header blocks (a builder-only extension Slack would\n * reject) and routes every URL/image-url through the allowlist in\n * `lib/url-safety.ts` so a payload that round-trips through the\n * builder cannot carry `javascript:`/`data:text/html` URIs to a\n * downstream consumer or to the Slack API.\n * @param blocks - the working draft blocks\n * @returns blocks with builder-only fields removed and URLs scrubbed\n */\nexport function toSlackBlocks(blocks: SupportedBlock[]): SupportedBlock[] {\n return blocks.map((block) => {\n const safe = sanitizeBlock(block);\n if (safe.type === 'header' && 'level' in safe) {\n const { level: _omit, ...rest } = safe;\n return rest as SupportedBlock;\n }\n return safe;\n });\n}\n","import type { SupportedBlock } from '../types';\n\n/**\n * A Slack codename guaranteed to be in the validator's known-emoji set, used\n * to neutralize custom / unknown emoji names in the validation copy only.\n */\nexport const VALIDATION_EMOJI_PLACEHOLDER = 'white_check_mark';\n\n/**\n * Recursively clone `value`, rewriting the `name` of every `rich_text` emoji\n * element (`{ type: 'emoji', name }`) to {@link VALIDATION_EMOJI_PLACEHOLDER}.\n * Copy-on-write: returns the original reference for any subtree that contains\n * no emoji, so emoji-free drafts allocate nothing. Never mutates the input.\n */\nfunction rewriteEmojiNames<T>(value: T): T {\n if (Array.isArray(value)) {\n let changed = false;\n const next = value.map((item) => {\n const rewritten = rewriteEmojiNames(item);\n if (rewritten !== item) {\n changed = true;\n }\n return rewritten;\n });\n return (changed ? next : value) as T;\n }\n if (value !== null && typeof value === 'object') {\n const source = value as Record<string, unknown>;\n let changed = false;\n const next: Record<string, unknown> = {};\n for (const key of Object.keys(source)) {\n const rewritten = rewriteEmojiNames(source[key]);\n next[key] = rewritten;\n if (rewritten !== source[key]) {\n changed = true;\n }\n }\n if (next.type === 'emoji' && typeof next.name === 'string' && next.name !== VALIDATION_EMOJI_PLACEHOLDER) {\n next.name = VALIDATION_EMOJI_PLACEHOLDER;\n changed = true;\n }\n return (changed ? next : value) as T;\n }\n return value;\n}\n\n/**\n * Validation-only sanitizer: returns a deep copy of `blocks` with every\n * `rich_text` emoji `name` rewritten to a known-valid placeholder. Slack itself\n * never rejects unknown emoji names, so workspace-custom emoji should not count\n * toward the validator's error total (which gates the Send button). The real\n * payload (preview / JSON / Send) keeps the true name — only the copy handed to\n * the validator is rewritten.\n *\n * Walks the whole block so emoji nested inside `task_card` / `plan` / table\n * `rich_text` cells are covered too.\n *\n * @param blocks - the Slack-shaped blocks about to be validated\n * @returns a deep copy with emoji names neutralized\n */\nexport function stripCustomEmojiForValidation(blocks: SupportedBlock[]): SupportedBlock[] {\n return blocks.map((block) => rewriteEmojiNames(block));\n}\n","import { validateBlockKit } from '@tightknitai/slack-block-kit-validator';\nimport { useEffect, useRef, useState } from 'react';\nimport { type GroupedErrors, groupValidatorErrors, toValidatorSurface } from '../lib/error-grouping';\nimport { toSlackBlocks } from '../lib/to-slack-blocks';\nimport { stripCustomEmojiForValidation } from '../lib/validation-sanitize';\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 * Validates a block draft against {@link validateBlockKit}, scoped to the\n * given preview surface. Pure; safe to call during render.\n */\nfunction computeValidation(blocks: BuilderBlock[], surface: PreviewSurface): ValidationState {\n // Rewrite custom / unknown emoji names to a known-valid placeholder in the\n // validation copy only, so they don't inflate `total` → disable Send. The\n // real payload (preview / JSON / Send) keeps the true names.\n const payload = stripCustomEmojiForValidation(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 return {\n valid: result.valid,\n byBlockId: grouped.byBlockId,\n general: grouped.general,\n total: grouped.total\n };\n}\n\n/**\n * Continuously validates the working draft against\n * {@link validateBlockKit}, scoped to the current preview surface.\n *\n * The first pass runs synchronously during initial render so consumers\n * never see a stale `errorCount: 0` for an invalid `initialBlocks`.\n * Subsequent passes are debounced so rapid edits don't thrash the AJV\n * 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>(() => computeValidation(blocks, surface));\n const isFirstRunRef = useRef(true);\n\n useEffect(() => {\n if (isFirstRunRef.current) {\n isFirstRunRef.current = false;\n return;\n }\n const handle = setTimeout(() => {\n setState(computeValidation(blocks, surface));\n }, DEBOUNCE_MS);\n return () => clearTimeout(handle);\n }, [blocks, surface]);\n\n return state;\n}\n","import { nanoid } from 'nanoid';\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { isContainerChildType, MAX_CONTAINER_CHILDREN } from '../lib/container-blocks';\nimport { sanitizeBlocks } from '../lib/sanitize-blocks';\nimport type { BuilderBlock, ContainerBlock, SupportedBlock } from '../types';\n\n/**\n * Re-derive a container node's `block.child_blocks` from its `children`\n * array, keeping the serialized payload in lockstep with the builder tree.\n * No-op for non-container nodes.\n */\nfunction mirror(node: BuilderBlock): BuilderBlock {\n if (!node.children) {\n return node;\n }\n return {\n ...node,\n block: { ...(node.block as ContainerBlock), child_blocks: node.children.map((c) => c.block) } as SupportedBlock\n };\n}\n\n/**\n * Wraps a Slack block payload in a {@link BuilderBlock} with a fresh client\n * id. Container payloads recursively wrap their `child_blocks` into\n * `children` (the DnD-authoritative store).\n * @param block - the underlying Slack block payload\n * @returns a builder-side block with id\n */\nfunction wrap(block: SupportedBlock): BuilderBlock {\n if (block.type === 'container') {\n const children = ((block as ContainerBlock).child_blocks ?? []).map(wrap);\n return mirror({ id: nanoid(8), block, children });\n }\n return { id: nanoid(8), block };\n}\n\n/** Deep-clone a node with fresh ids throughout (for duplicate). */\nfunction cloneNode(node: BuilderBlock): BuilderBlock {\n if (node.children) {\n return mirror({ id: nanoid(8), block: structuredClone(node.block), children: node.children.map(cloneNode) });\n }\n return { id: nanoid(8), block: structuredClone(node.block) };\n}\n\n/** Replace a node's own payload, preserving (and re-mirroring) its children. */\nfunction applyUpdate(node: BuilderBlock, block: SupportedBlock): BuilderBlock {\n if (node.children) {\n // Editors don't manage container children (that's the canvas's job), so\n // keep the existing children and re-mirror — the editor's payload can't\n // clobber the child list.\n return mirror({ ...node, block });\n }\n return { ...node, block };\n}\n\n/** A node's location in the depth-2 tree. */\ntype Loc = { kind: 'top'; index: number } | { kind: 'child'; parentId: string; index: number };\n\n/** Find a node by id across the top level and every container's children. */\nfunction locate(blocks: BuilderBlock[], id: string): Loc | null {\n const top = blocks.findIndex((b) => b.id === id);\n if (top !== -1) {\n return { kind: 'top', index: top };\n }\n for (const block of blocks) {\n if (block.children) {\n const idx = block.children.findIndex((c) => c.id === id);\n if (idx !== -1) {\n return { kind: 'child', parentId: block.id, index: idx };\n }\n }\n }\n return null;\n}\n\n/** Map over the children of one container by id, re-mirroring the result. */\nfunction withChildren(\n blocks: BuilderBlock[],\n parentId: string,\n fn: (children: BuilderBlock[]) => BuilderBlock[]\n): BuilderBlock[] {\n return blocks.map((b) => (b.id === parentId && b.children ? mirror({ ...b, children: fn(b.children) }) : b));\n}\n\n/**\n * Destination for a drag-and-drop move. `index` is the position in the\n * destination list (the hovered sibling's index, or the list length to\n * append). For a same-list reorder the node is removed first and re-spliced\n * at `index`, matching dnd-kit's sortable behavior.\n */\nexport type MoveTarget = { kind: 'top'; index: number } | { kind: 'container'; parentId: string; index: number };\n\n/**\n * Reactive state for the builder's working draft.\n *\n * - `blocks`: ordered list of {@link BuilderBlock} (id + payload + optional\n * container `children`).\n * - Mutators operate on ids, not indices, and resolve a node whether it\n * lives at the top level or inside a container.\n * - On any change, calls the optional `onChange` with the unwrapped Slack\n * payloads (container `child_blocks` mirrored in) so the consumer can\n * 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 useBlockKitchenState({\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 idx = atIndex === undefined ? next.length : Math.max(0, Math.min(atIndex, next.length));\n next.splice(idx, 0, wrap(block));\n return next;\n });\n }, []);\n\n const addChild = useCallback((parentId: string, block: SupportedBlock, atIndex?: number) => {\n if (!isContainerChildType(block.type)) {\n return;\n }\n setBlocks((prev) =>\n withChildren(prev, parentId, (children) => {\n if (children.length >= MAX_CONTAINER_CHILDREN) {\n return children;\n }\n const next = [...children];\n const idx = atIndex === undefined ? next.length : Math.max(0, Math.min(atIndex, next.length));\n next.splice(idx, 0, wrap(block));\n return next;\n })\n );\n }, []);\n\n const updateBlock = useCallback((id: string, block: SupportedBlock) => {\n setBlocks((prev) =>\n prev.map((b) => {\n if (b.id === id) {\n return applyUpdate(b, block);\n }\n if (b.children?.some((c) => c.id === id)) {\n return mirror({ ...b, children: b.children.map((c) => (c.id === id ? applyUpdate(c, block) : c)) });\n }\n return b;\n })\n );\n }, []);\n\n const removeBlock = useCallback((id: string) => {\n setBlocks((prev) => {\n if (prev.some((b) => b.id === id)) {\n return prev.filter((b) => b.id !== id);\n }\n return prev.map((b) =>\n b.children?.some((c) => c.id === id) ? mirror({ ...b, children: b.children.filter((c) => c.id !== id) }) : b\n );\n });\n }, []);\n\n const duplicateBlock = useCallback((id: string) => {\n setBlocks((prev) => {\n const loc = locate(prev, id);\n if (!loc) {\n return prev;\n }\n if (loc.kind === 'top') {\n const next = [...prev];\n next.splice(loc.index + 1, 0, cloneNode(prev[loc.index]));\n return next;\n }\n return withChildren(prev, loc.parentId, (children) => {\n const next = [...children];\n next.splice(loc.index + 1, 0, cloneNode(children[loc.index]));\n return next;\n });\n });\n }, []);\n\n const reorderBlock = useCallback((fromId: string, toIndex: number) => {\n setBlocks((prev) => {\n const loc = locate(prev, fromId);\n if (!loc) {\n return prev;\n }\n const reorder = (list: BuilderBlock[]) => {\n const next = [...list];\n const [moved] = next.splice(loc.index, 1);\n next.splice(Math.max(0, Math.min(toIndex, next.length)), 0, moved);\n return next;\n };\n if (loc.kind === 'top') {\n return reorder(prev);\n }\n return withChildren(prev, loc.parentId, reorder);\n });\n }, []);\n\n const moveBlock = useCallback((activeId: string, target: MoveTarget) => {\n setBlocks((prev) => {\n const loc = locate(prev, activeId);\n if (!loc) {\n return prev;\n }\n const moved =\n loc.kind === 'top' ? prev[loc.index] : prev.find((b) => b.id === loc.parentId)?.children?.[loc.index];\n if (!moved) {\n return prev;\n }\n\n if (target.kind === 'container') {\n // Containers can't nest, and only allowed child types may enter.\n if (moved.children || !isContainerChildType(moved.block.type)) {\n return prev;\n }\n // Enforce the child cap, but never against a reorder within the same\n // container (which doesn't grow it).\n const sameContainer = loc.kind === 'child' && loc.parentId === target.parentId;\n const destCount = prev.find((b) => b.id === target.parentId)?.children?.length ?? 0;\n if (!sameContainer && destCount >= MAX_CONTAINER_CHILDREN) {\n return prev;\n }\n }\n\n // Detach from the source list, then splice into the destination.\n const detached =\n loc.kind === 'top'\n ? prev.filter((_, i) => i !== loc.index)\n : withChildren(prev, loc.parentId, (children) => children.filter((_, i) => i !== loc.index));\n\n const insert = (list: BuilderBlock[]) => {\n const next = [...list];\n next.splice(Math.max(0, Math.min(target.index, next.length)), 0, moved);\n return next;\n };\n return target.kind === 'container' ? withChildren(detached, target.parentId, insert) : insert(detached);\n });\n }, []);\n\n // Full-replace entry point for loading an existing message, \"open as new\",\n // and JSON-drawer apply. Cleanse here (not just at send) so blocks pulled\n // from a retrieved message enter the working state already send-valid —\n // dropping Slack's retrieval-only fields and scrubbing unsafe URLs.\n const replaceAll = useCallback((newBlocks: SupportedBlock[]) => {\n setBlocks(sanitizeBlocks(newBlocks).map(wrap));\n }, []);\n\n return {\n blocks,\n addBlock,\n addChild,\n updateBlock,\n removeBlock,\n duplicateBlock,\n reorderBlock,\n moveBlock,\n replaceAll\n };\n}\n","/**\n * Brand theme resolver for the BlockKitchen chrome.\n *\n * Consumers can already brand the builder by overriding the shadcn/ui\n * CSS custom properties declared in `styles.src.css` (the lower-level\n * contract). This module wraps that contract in a typed, ergonomic prop\n * — a preset name and/or a `Partial<BrandTokens>` map — and resolves it\n * to the `cssVarName -> value` pairs that `BrandThemeScope` then writes\n * to a scoped `<style>` block around the builder.\n *\n * Scope is intentionally limited to the builder chrome. The Slack\n * preview is rendered by `slack-blocks-to-jsx` under its own\n * `#slack_blocks_to_jsx` CSS namespace and does not consume these vars,\n * so brand tokens never leak into Slack content rendering.\n */\n\n/**\n * Tokens consumers may override. Mirrors the shadcn/ui token set\n * already defined in `src/styles.src.css`. Color values are HSL\n * component strings (\"231.7 48.6% 54.1%\") — matching the existing\n * `hsl(var(--token, ...))` contract. `radius` takes a CSS length\n * such as `\"0.5rem\"`.\n */\nexport type BrandTokens = Partial<{\n background: string;\n foreground: string;\n card: string;\n cardForeground: string;\n popover: string;\n popoverForeground: string;\n primary: string;\n primaryForeground: string;\n secondary: string;\n secondaryForeground: string;\n muted: string;\n mutedForeground: string;\n accent: string;\n accentForeground: string;\n destructive: string;\n destructiveForeground: string;\n border: string;\n input: string;\n ring: string;\n radius: string;\n}>;\n\n/**\n * Curated preset names. `'default'` is a no-op (relies on the\n * `styles.src.css` fallbacks). The other entries each define their own\n * color palette and `radius`, demonstrating that brand presets can vary\n * stylistic axes beyond color. Adding more later is non-breaking —\n * extend the string union and add an entry to `PRESETS`.\n */\nexport type BrandPreset = 'default' | 'slack' | 'ocean' | 'sunset' | 'mono' | 'cyberpunk';\n\n/**\n * Brand theme shape.\n *\n * - `preset` seeds the token map (currently a no-op for `'default'`).\n * - `tokens` applies in both light and dark.\n * - `light`/`dark` apply only when the matching dark-mode class is\n * present on an ancestor (or on the scope itself).\n *\n * Merge precedence (later wins): preset → tokens → light/dark.\n */\nexport interface BrandTheme {\n preset?: BrandPreset;\n tokens?: BrandTokens;\n light?: BrandTokens;\n dark?: BrandTokens;\n}\n\n/** Maps camelCase token keys to the kebab-case CSS variable names\n * declared by the consumer-facing shadcn/ui contract in `styles.src.css`. */\nconst TOKEN_TO_CSS_VAR: Record<keyof BrandTokens, string> = {\n background: '--background',\n foreground: '--foreground',\n card: '--card',\n cardForeground: '--card-foreground',\n popover: '--popover',\n popoverForeground: '--popover-foreground',\n primary: '--primary',\n primaryForeground: '--primary-foreground',\n secondary: '--secondary',\n secondaryForeground: '--secondary-foreground',\n muted: '--muted',\n mutedForeground: '--muted-foreground',\n accent: '--accent',\n accentForeground: '--accent-foreground',\n destructive: '--destructive',\n destructiveForeground: '--destructive-foreground',\n border: '--border',\n input: '--input',\n ring: '--ring',\n radius: '--radius'\n};\n\n/** Per-preset layer — partial brand theme without the `preset` field, so\n * a preset itself can carry shared `tokens` plus per-mode `light`/`dark`\n * overrides. Resolved before user-supplied tokens so consumers can still\n * layer their own values on top. */\ntype PresetDefinition = {\n tokens?: BrandTokens;\n light?: BrandTokens;\n dark?: BrandTokens;\n};\n\nconst PRESETS: Record<BrandPreset, PresetDefinition> = {\n // No overrides — falls through to the fallbacks in styles.src.css so\n // we don't duplicate (and risk drifting from) the baseline values.\n default: {},\n // Slack's aubergine brand with tighter corners. Mirrors the Slack\n // chrome aesthetic — fitting since this builder is the Slack Block\n // Kit builder, after all.\n slack: {\n tokens: { radius: '0.375rem' },\n light: {\n background: '0 0% 100%',\n foreground: '292 30% 12%',\n card: '0 0% 100%',\n cardForeground: '292 30% 12%',\n popover: '0 0% 100%',\n popoverForeground: '292 30% 12%',\n primary: '292 78% 24%',\n primaryForeground: '0 0% 100%',\n secondary: '292 30% 95%',\n secondaryForeground: '292 78% 24%',\n muted: '292 20% 96%',\n mutedForeground: '292 12% 42%',\n accent: '160 60% 36%',\n accentForeground: '0 0% 100%',\n border: '292 20% 88%',\n input: '292 20% 88%',\n ring: '292 78% 24%'\n },\n dark: {\n background: '292 35% 8%',\n foreground: '292 15% 92%',\n card: '292 30% 11%',\n cardForeground: '292 15% 92%',\n popover: '292 30% 11%',\n popoverForeground: '292 15% 92%',\n primary: '292 50% 72%',\n primaryForeground: '292 35% 8%',\n secondary: '292 25% 18%',\n secondaryForeground: '292 15% 92%',\n muted: '292 22% 16%',\n mutedForeground: '292 12% 65%',\n accent: '160 50% 50%',\n accentForeground: '292 35% 8%',\n border: '292 22% 20%',\n input: '292 22% 20%',\n ring: '292 50% 72%'\n }\n },\n // Cool blue, airy spacing, pillowy corners.\n ocean: {\n tokens: { radius: '0.75rem' },\n light: {\n background: '200 60% 98%',\n foreground: '210 40% 14%',\n card: '0 0% 100%',\n cardForeground: '210 40% 14%',\n popover: '0 0% 100%',\n popoverForeground: '210 40% 14%',\n primary: '205 90% 42%',\n primaryForeground: '200 100% 98%',\n secondary: '200 60% 94%',\n secondaryForeground: '210 40% 14%',\n muted: '200 50% 95%',\n mutedForeground: '210 18% 44%',\n accent: '180 70% 45%',\n accentForeground: '200 100% 98%',\n border: '205 40% 86%',\n input: '205 40% 86%',\n ring: '205 90% 42%'\n },\n dark: {\n background: '215 45% 8%',\n foreground: '200 30% 94%',\n card: '215 40% 11%',\n cardForeground: '200 30% 94%',\n popover: '215 40% 11%',\n popoverForeground: '200 30% 94%',\n primary: '205 80% 65%',\n primaryForeground: '215 45% 8%',\n secondary: '215 35% 18%',\n secondaryForeground: '200 30% 94%',\n muted: '215 30% 16%',\n mutedForeground: '200 20% 68%',\n accent: '180 65% 55%',\n accentForeground: '215 45% 8%',\n border: '215 30% 22%',\n input: '215 30% 22%',\n ring: '205 80% 65%'\n }\n },\n // Warm coral and amber, very round corners — cozy and inviting.\n sunset: {\n tokens: { radius: '1rem' },\n light: {\n background: '30 50% 98%',\n foreground: '14 40% 16%',\n card: '30 60% 99%',\n cardForeground: '14 40% 16%',\n popover: '30 60% 99%',\n popoverForeground: '14 40% 16%',\n primary: '14 88% 55%',\n primaryForeground: '30 100% 98%',\n secondary: '30 60% 94%',\n secondaryForeground: '14 40% 16%',\n muted: '30 45% 95%',\n mutedForeground: '14 18% 44%',\n accent: '38 95% 55%',\n accentForeground: '14 40% 16%',\n border: '20 40% 88%',\n input: '20 40% 88%',\n ring: '14 88% 55%'\n },\n dark: {\n background: '15 32% 8%',\n foreground: '30 40% 94%',\n card: '15 30% 11%',\n cardForeground: '30 40% 94%',\n popover: '15 30% 11%',\n popoverForeground: '30 40% 94%',\n primary: '14 80% 65%',\n primaryForeground: '15 32% 8%',\n secondary: '15 25% 18%',\n secondaryForeground: '30 40% 94%',\n muted: '15 22% 16%',\n mutedForeground: '30 20% 68%',\n accent: '38 85% 60%',\n accentForeground: '15 32% 8%',\n border: '15 22% 22%',\n input: '15 22% 22%',\n ring: '14 80% 65%'\n }\n },\n // Pure grayscale, sharp corners — minimalist editorial feel.\n mono: {\n tokens: { radius: '0' },\n light: {\n background: '0 0% 100%',\n foreground: '0 0% 8%',\n card: '0 0% 100%',\n cardForeground: '0 0% 8%',\n popover: '0 0% 100%',\n popoverForeground: '0 0% 8%',\n primary: '0 0% 12%',\n primaryForeground: '0 0% 98%',\n secondary: '0 0% 95%',\n secondaryForeground: '0 0% 12%',\n muted: '0 0% 96%',\n mutedForeground: '0 0% 42%',\n accent: '0 0% 90%',\n accentForeground: '0 0% 12%',\n border: '0 0% 86%',\n input: '0 0% 86%',\n ring: '0 0% 12%'\n },\n dark: {\n background: '0 0% 6%',\n foreground: '0 0% 95%',\n card: '0 0% 9%',\n cardForeground: '0 0% 95%',\n popover: '0 0% 9%',\n popoverForeground: '0 0% 95%',\n primary: '0 0% 92%',\n primaryForeground: '0 0% 8%',\n secondary: '0 0% 16%',\n secondaryForeground: '0 0% 95%',\n muted: '0 0% 14%',\n mutedForeground: '0 0% 65%',\n accent: '0 0% 22%',\n accentForeground: '0 0% 95%',\n border: '0 0% 20%',\n input: '0 0% 20%',\n ring: '0 0% 92%'\n }\n },\n // Neon magenta on near-black with cyan accents, almost-sharp corners.\n cyberpunk: {\n tokens: { radius: '0.125rem' },\n light: {\n background: '300 40% 97%',\n foreground: '300 30% 12%',\n card: '0 0% 100%',\n cardForeground: '300 30% 12%',\n popover: '0 0% 100%',\n popoverForeground: '300 30% 12%',\n primary: '320 95% 48%',\n primaryForeground: '0 0% 100%',\n secondary: '300 40% 94%',\n secondaryForeground: '300 30% 12%',\n muted: '300 30% 96%',\n mutedForeground: '300 12% 42%',\n accent: '180 90% 38%',\n accentForeground: '0 0% 100%',\n border: '300 30% 86%',\n input: '300 30% 86%',\n ring: '320 95% 48%'\n },\n dark: {\n background: '270 30% 5%',\n foreground: '300 30% 95%',\n card: '270 28% 8%',\n cardForeground: '300 30% 95%',\n popover: '270 28% 8%',\n popoverForeground: '300 30% 95%',\n primary: '320 100% 65%',\n primaryForeground: '270 30% 5%',\n secondary: '270 25% 16%',\n secondaryForeground: '300 30% 95%',\n muted: '270 22% 14%',\n mutedForeground: '300 18% 68%',\n accent: '180 95% 55%',\n accentForeground: '270 30% 5%',\n border: '300 30% 22%',\n input: '300 30% 22%',\n ring: '320 100% 65%'\n }\n }\n};\n\n/**\n * Result of resolving a `BrandTheme`. Two parallel maps so the wrapper\n * can emit one rule for the light context and one for the `.dark` context.\n */\nexport interface ResolvedBrandTheme {\n light: Record<string, string>;\n dark: Record<string, string>;\n}\n\n/**\n * Returns true when a candidate CSS value is safe to inject into a\n * `<style>` block. Rejects characters that could break out of the\n * declaration (`;`, braces) or comment markers, plus tag-like and\n * entity-like sequences that smell wrong inside a CSS value. The\n * accepted shape covers HSL component strings, CSS lengths, hex/rgb\n * colors, named colors, and `calc(...)` expressions.\n * @param value - candidate CSS value\n * @returns true if the value is safe to emit verbatim\n */\nexport function isSafeCssValue(value: string): boolean {\n if (typeof value !== 'string' || value.length === 0 || value.length > 200) {\n return false;\n }\n // Disallow anything that could close the declaration, the rule, the\n // <style> element, or open a comment.\n return !/[;{}<>&]|\\/\\*|\\*\\/|\\n|\\r/.test(value);\n}\n\n/** Normalizes a user input that may be a preset string into a `BrandTheme`. */\nfunction toBrandTheme(input: BrandTheme | BrandPreset | undefined): BrandTheme {\n if (input === undefined) {\n return {};\n }\n if (typeof input === 'string') {\n return { preset: input };\n }\n return input;\n}\n\n/**\n * Merges a partial token map into a `cssVarName -> value` accumulator.\n * Drops any value that fails `isSafeCssValue` rather than throwing so\n * one bad token doesn't lose the rest of the theme.\n */\nfunction mergeTokens(target: Record<string, string>, source: BrandTokens | undefined): void {\n if (!source) {\n return;\n }\n for (const [key, value] of Object.entries(source) as [keyof BrandTokens, string | undefined][]) {\n if (value === undefined) {\n continue;\n }\n if (!isSafeCssValue(value)) {\n continue;\n }\n target[TOKEN_TO_CSS_VAR[key]] = value;\n }\n}\n\n/**\n * Resolves a `BrandTheme` (or a bare preset name) into two CSS-var maps:\n * one applied in light contexts and one applied under `.dark`. Returns\n * empty maps when the input contributes no overrides — the caller can\n * use that as a signal to skip the scope wrapper entirely.\n * @param input - the brand theme prop value, or `undefined`\n * @returns resolved CSS-var maps for light and dark contexts\n */\nexport function resolveBrandTheme(input: BrandTheme | BrandPreset | undefined): ResolvedBrandTheme {\n const theme = toBrandTheme(input);\n const preset = theme.preset ? PRESETS[theme.preset] : undefined;\n\n const light: Record<string, string> = {};\n const dark: Record<string, string> = {};\n\n mergeTokens(light, preset?.tokens);\n mergeTokens(dark, preset?.tokens);\n mergeTokens(light, preset?.light);\n mergeTokens(dark, preset?.dark);\n mergeTokens(light, theme.tokens);\n mergeTokens(dark, theme.tokens);\n mergeTokens(light, theme.light);\n mergeTokens(dark, theme.dark);\n\n return { light, dark };\n}\n\n/**\n * Serializes a CSS-var map to declaration text (e.g.\n * `\"--primary: 0 100% 50%; --radius: 0.5rem;\"`). Values are assumed\n * to already be sanitized by {@link isSafeCssValue}.\n * @param vars - CSS-var name → value map\n * @returns CSS declaration string, or `''` if `vars` is empty\n */\nexport function toCssDeclarations(vars: Record<string, string>): string {\n const entries = Object.entries(vars);\n if (entries.length === 0) {\n return '';\n }\n return entries.map(([name, value]) => `${name}: ${value};`).join(' ');\n}\n","import { type ReactNode, useId, useMemo } from 'react';\nimport { type BrandPreset, type BrandTheme, resolveBrandTheme, toCssDeclarations } from '../lib/brand-theme';\n\n/**\n * Wraps the builder tree in a scoped `<style>` block that writes the\n * resolved brand CSS variables onto `:root`, gated by `:has()` on a\n * per-instance `data-bk-scope` attribute. Writing the vars at `:root`\n * is necessary because Radix's `Portal` (used by every popover, dialog,\n * tooltip, and sheet in this package) renders into `document.body`\n * outside the React subtree — variables on an inner wrapper would\n * never reach them. With `:root` as the carrier and `:has()` as the\n * gate, the cascade covers both the in-tree chrome and all portaled\n * descendants without us having to plumb a `container` prop through\n * every Radix wrapper.\n *\n * When the resolved theme contains no overrides (`theme` omitted, or\n * a `'default'` preset with no token map), the wrapper bypasses itself\n * entirely so consumers who haven't opted in see zero behavioral change.\n *\n * Dark-mode coverage matches shadcn's class-based dark mode. The dark\n * rule targets the `.dark` element itself (any ancestor of the scope\n * carrying the class — be it `<html>`, `<body>`, or an inner wrapper)\n * rather than `:root`. This is load-bearing: the bundled\n * `slack-blocks-to-jsx` stylesheet ships its own `.dark { --primary: ...; }`\n * baseline that we need to outrank. Setting the vars at `:root.dark`\n * would lose the cascade fight against that closer `.dark` ancestor;\n * setting them at `.dark:has(...)` puts our values on the same element\n * the library targets, with a higher-specificity selector that wins.\n *\n * Browser support: `:has()` is widely available (Chrome 105+, Safari\n * 15.4+, Firefox 121+) and is already implied by the Tailwind v4\n * baseline this package builds against.\n * @param props - wrapper props\n * @param props.theme - the brand theme prop, forwarded from {@link BlockKitchen}\n * @param props.children - the builder tree\n * @returns the children, optionally wrapped in a scoped theme block\n */\nexport function BrandThemeScope({ theme, children }: { theme?: BrandTheme | BrandPreset; children: ReactNode }) {\n // `useId` produces something like `:r0:` — strip the colons so the\n // string can safely sit inside an attribute selector.\n const rawId = useId();\n const scopeId = useMemo(() => `bk-${rawId.replace(/[:]/g, '')}`, [rawId]);\n\n const resolved = useMemo(() => resolveBrandTheme(theme), [theme]);\n\n const hasLight = Object.keys(resolved.light).length > 0;\n const hasDark = Object.keys(resolved.dark).length > 0;\n\n if (!hasLight && !hasDark) {\n return <>{children}</>;\n }\n\n const lightDecl = toCssDeclarations(resolved.light);\n const darkDecl = toCssDeclarations(resolved.dark);\n\n const rules: string[] = [];\n if (lightDecl) {\n rules.push(`:root:has([data-bk-scope=\"${scopeId}\"]) { ${lightDecl} }`);\n }\n if (darkDecl) {\n // Match the .dark element itself wherever it sits in the ancestor\n // chain. Two variants cover all placements: an ancestor that\n // contains the scope, or the scope element itself carrying .dark.\n const darkSelectors = [`.dark:has([data-bk-scope=\"${scopeId}\"])`, `.dark[data-bk-scope=\"${scopeId}\"]`].join(', ');\n rules.push(`${darkSelectors} { ${darkDecl} }`);\n }\n\n return (\n <>\n {/* biome-ignore lint/security/noDangerouslySetInnerHtml: rule\n values are filtered by isSafeCssValue; the scope id is\n derived from useId(). */}\n <style dangerouslySetInnerHTML={{ __html: rules.join(' ') }} />\n <div data-bk-scope={scopeId} style={{ display: 'contents' }}>\n {children}\n </div>\n </>\n );\n}\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 w-full max-w-full 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 type { SupportedBlock } from '../types';\n\n/**\n * Inline error shown when imported JSON is neither a bare blocks array\n * nor a Slack message wrapper. Exported so callers (and tests) share the\n * exact copy.\n */\nexport const BLOCKS_INPUT_SHAPE_ERROR = 'Expected an array of blocks, or an object with a `blocks` array.';\n\n/**\n * Normalize a parsed JSON value into a bare blocks array.\n *\n * The builder emits (and the JSON drawer seeds from) a bare array of\n * blocks. Slack's own Block Kit Builder, however, exports the full message\n * wrapper — `{ \"blocks\": [ ... ] }` — so a straight paste from there would\n * otherwise fail. Accept either shape: a bare array passes through, and a\n * `{ blocks: [...] }` object is unwrapped down to its `blocks` array. Other\n * top-level keys on the wrapper (`text`, `channel`, `attachments`, …) are\n * ignored.\n *\n * Returns `null` when the value is neither shape, so the caller can surface\n * its existing inline error without mutating state.\n *\n * @param parsed - the value returned from `JSON.parse`\n * @returns the blocks array, or `null` when the shape is unrecognized\n */\nexport function unwrapBlocksInput(parsed: unknown): SupportedBlock[] | null {\n if (Array.isArray(parsed)) {\n return parsed as SupportedBlock[];\n }\n if (parsed && typeof parsed === 'object' && Array.isArray((parsed as { blocks?: unknown }).blocks)) {\n // Strip the Slack message wrapper down to the blocks array.\n return (parsed as { blocks: SupportedBlock[] }).blocks;\n }\n return null;\n}\n","import { validateBlockKit } from '@tightknitai/slack-block-kit-validator';\nimport { useEffect, useMemo, useRef, useState } from 'react';\nimport { BLOCKS_INPUT_SHAPE_ERROR, unwrapBlocksInput } from '../lib/parse-blocks-input';\nimport { Sheet, SheetContent, SheetDescription, SheetTitle } from '../lib/ui/sheet';\nimport type { SupportedBlock } from '../types';\n\n/**\n * Upper bound on the JSON textarea we accept. A pasted multi-megabyte\n * payload would freeze the tab inside `JSON.parse` before the validator\n * gets a look; 1 MiB is well above any realistic Slack Block Kit message\n * (Slack itself caps blocks at 50 per message and ~3000 chars per text\n * field).\n */\nconst MAX_JSON_BYTES = 1024 * 1024;\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 if (next.length > MAX_JSON_BYTES) {\n setParseError(`JSON exceeds the ${Math.round(MAX_JSON_BYTES / 1024)} KiB editor limit.`);\n setValidationErrors([]);\n return;\n }\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 // Accept either a bare blocks array or Slack's own message wrapper\n // (`{ \"blocks\": [...] }`, as exported by the Block Kit Builder). Other\n // top-level keys on the wrapper are ignored. Anything else keeps the\n // inline error without mutating state.\n const blocks = unwrapBlocksInput(parsed);\n if (!blocks) {\n setParseError(BLOCKS_INPUT_SHAPE_ERROR);\n setValidationErrors([]);\n return;\n }\n setParseError(null);\n onApply(blocks);\n const result = validateBlockKit(blocks, {\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 w-full max-w-full flex-col gap-3 sm:max-w-xl\">\n <div className=\"flex flex-col gap-1 pr-8\">\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 aria-label=\"Block Kit JSON\"\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 { 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 'bk-portal-content 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 'bk-portal-content 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 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 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, Info } from 'lucide-react';\nimport { useEffect, useRef, useState } from 'react';\nimport { Button } from '../lib/ui/button';\nimport { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle } from '../lib/ui/dialog';\nimport { Input } from '../lib/ui/input';\nimport { Label } from '../lib/ui/label';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '../lib/ui/tooltip';\nimport type { ChannelOption, LoadResult, RecentMessage, SupportedBlock } from '../types';\n\n/** Map a {@link RecentMessage} onto the `ok` verdict so it reuses the load path. */\nfunction recentToResult(msg: RecentMessage): Extract<LoadResult, { ok: true }> {\n return {\n ok: true,\n channelId: msg.channelId,\n channelName: msg.channelName,\n ts: msg.ts,\n blocks: msg.blocks,\n editableVia: msg.editableVia ?? 'bot',\n workspaceName: msg.workspaceName,\n username: msg.username,\n iconUrl: msg.iconUrl\n };\n}\n\ntype LoadStatus =\n | { kind: 'idle' }\n | { kind: 'loading' }\n | { kind: 'error'; error: string }\n | { kind: 'not-editable'; reason: string; blocks?: SupportedBlock[] };\n\n/**\n * Edit-mode entry point. Collects a Slack message permalink and hands it to\n * the host's `onLoadMessage`. On a successful load the parent flips into\n * edit mode (`onLoaded`); on a not-editable verdict the dialog renders the\n * host's `reason` inline and offers \"Open as a new message instead\".\n *\n * The package never parses the permalink — the host extracts `channel + ts`.\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.onLoadMessage - host loader returning an editability verdict\n * @param props.loadRecentMessages - optional loader for the \"recent messages\" picker, scoped to a channel\n * @param props.loadChannels - returns channels to scope the recent-messages picker by\n * @param props.onLoaded - called with the `ok` result so the parent enters edit mode\n * @param props.onOpenAsNew - called with optional blocks for the \"open as new\" fallback\n * @returns the rendered load-message dialog\n */\nexport function LoadMessageDialog({\n open,\n onOpenChange,\n onLoadMessage,\n loadRecentMessages,\n loadChannels,\n onLoaded,\n onOpenAsNew\n}: {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onLoadMessage: (input: { link: string }) => Promise<LoadResult>;\n loadRecentMessages?: (channelId: string) => Promise<RecentMessage[]>;\n loadChannels: () => Promise<ChannelOption[]>;\n onLoaded: (result: Extract<LoadResult, { ok: true }>) => void;\n onOpenAsNew: (blocks?: SupportedBlock[]) => void;\n}) {\n const [link, setLink] = useState('');\n const [status, setStatus] = useState<LoadStatus>({ kind: 'idle' });\n // Channel selector for the recent-messages picker (only when `loadRecentMessages`\n // is given). The user must pick a channel before any recent lookup runs.\n const [channels, setChannels] = useState<ChannelOption[] | null>(null);\n const [channelsError, setChannelsError] = useState<string | null>(null);\n const [channelId, setChannelId] = useState<string>('');\n // Recent messages for the selected channel. `null` means \"loading / not loaded yet\".\n const [recent, setRecent] = useState<RecentMessage[] | null>(null);\n const [recentError, setRecentError] = useState<string | null>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n\n // Hold the latest loaders in refs so they can change identity between renders\n // (consumers often pass a fresh arrow) without us needing them as deps.\n const onLoadMessageRef = useRef(onLoadMessage);\n const loadRecentMessagesRef = useRef(loadRecentMessages);\n const loadChannelsRef = useRef(loadChannels);\n useEffect(() => {\n onLoadMessageRef.current = onLoadMessage;\n loadRecentMessagesRef.current = loadRecentMessages;\n loadChannelsRef.current = loadChannels;\n });\n\n const hasRecent = !!loadRecentMessages;\n\n // Reset to a clean slate each time the dialog opens, and load the channel\n // list so the user can scope the recent-messages picker.\n useEffect(() => {\n if (!open) {\n return;\n }\n setLink('');\n setStatus({ kind: 'idle' });\n setChannelId('');\n setRecent(null);\n setRecentError(null);\n if (!loadRecentMessagesRef.current) {\n setChannels([]);\n setChannelsError(null);\n return;\n }\n setChannels(null);\n setChannelsError(null);\n let cancelled = false;\n loadChannelsRef\n .current()\n .then((list) => {\n if (!cancelled) {\n setChannels(list);\n }\n })\n .catch((e) => {\n if (!cancelled) {\n setChannelsError(e instanceof Error ? e.message : 'Failed to load channels');\n }\n });\n return () => {\n cancelled = true;\n };\n }, [open]);\n\n // (Re)load the recent list whenever the selected channel changes, scoping the\n // lookup to that one channel.\n useEffect(() => {\n if (!open || !loadRecentMessagesRef.current || !channelId) {\n return;\n }\n setRecent(null);\n setRecentError(null);\n let cancelled = false;\n loadRecentMessagesRef\n .current(channelId)\n .then((list) => {\n if (!cancelled) {\n setRecent(list);\n }\n })\n .catch((e) => {\n if (!cancelled) {\n setRecentError(e instanceof Error ? e.message : 'Failed to load recent messages.');\n }\n });\n return () => {\n cancelled = true;\n };\n }, [open, channelId]);\n\n const handleLoad = async () => {\n const trimmed = link.trim();\n if (!trimmed) {\n setStatus({ kind: 'error', error: 'Paste a Slack message link first.' });\n return;\n }\n setStatus({ kind: 'loading' });\n try {\n const result = await onLoadMessageRef.current({ link: trimmed });\n if (result.ok) {\n onLoaded(result);\n return;\n }\n setStatus({ kind: 'not-editable', reason: result.reason, blocks: result.blocks });\n } catch (e) {\n setStatus({ kind: 'error', error: e instanceof Error ? e.message : 'Failed to load message.' });\n }\n };\n\n const notEditable = status.kind === 'not-editable' ? status : null;\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent\n className=\"w-[calc(100vw-1.5rem)] max-w-lg rounded-lg\"\n // Focus the link input on open instead of letting Radix focus the\n // first tabbable element (the info button), which would pop its\n // tooltip open every time the dialog appears.\n onOpenAutoFocus={(e) => {\n e.preventDefault();\n inputRef.current?.focus();\n }}\n >\n <DialogHeader>\n <DialogTitle>Edit an existing message</DialogTitle>\n <div className=\"flex items-start gap-1.5 text-left\">\n <DialogDescription>\n {hasRecent\n ? 'Paste a Slack message link, or pick a recent message your app posted.'\n : 'Paste a Slack message link (Slack\\'s \"Copy link\") to load its blocks for editing.'}\n </DialogDescription>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n aria-label=\"How to copy a message link\"\n className=\"mt-0.5 shrink-0 rounded text-muted-foreground transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\"\n >\n <Info className=\"h-3.5 w-3.5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent className=\"max-w-xs leading-relaxed\">\n In Slack, hover over the message and click the <strong>⋮ More actions</strong> button (or right-click\n the message), then choose <strong>Copy link</strong>.\n </TooltipContent>\n </Tooltip>\n </div>\n </DialogHeader>\n\n <div className=\"flex min-w-0 flex-col gap-4\">\n <div className=\"flex flex-col gap-1.5\">\n <Label htmlFor=\"message-link\">Message link</Label>\n <Input\n ref={inputRef}\n id=\"message-link\"\n value={link}\n onChange={(e) => {\n setLink(e.target.value);\n if (status.kind !== 'idle' && status.kind !== 'loading') {\n setStatus({ kind: 'idle' });\n }\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && status.kind !== 'loading') {\n e.preventDefault();\n handleLoad();\n }\n }}\n placeholder=\"https://your-workspace.slack.com/archives/C…/p…\"\n autoComplete=\"off\"\n spellCheck={false}\n />\n </div>\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\n {notEditable && (\n <div className=\"flex flex-col gap-2 rounded-md border border-amber-200! bg-amber-50 p-3 text-xs text-amber-800\">\n <div className=\"flex items-start gap-2\">\n <AlertTriangle className=\"mt-0.5 h-3.5 w-3.5 shrink-0\" />\n <span className=\"flex-1\">{notEditable.reason}</span>\n </div>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n className=\"self-start\"\n onClick={() => onOpenAsNew(notEditable.blocks)}\n >\n Open as a new message instead\n </Button>\n </div>\n )}\n\n {hasRecent && (\n <div className=\"flex min-w-0 flex-col gap-2\">\n <div className=\"flex items-center gap-2 text-xs text-muted-foreground\">\n <span className=\"h-px flex-1 bg-border\" />\n or pick a recent message\n <span className=\"h-px flex-1 bg-border\" />\n </div>\n\n {/* Pick a channel first — the recent lookup is scoped to it. */}\n <div className=\"flex flex-col gap-1.5\">\n <Label htmlFor=\"recent-channel-picker\">Channel</Label>\n {channels === null && !channelsError && (\n <p className=\"text-xs text-muted-foreground\">Loading channels…</p>\n )}\n {channelsError && <p className=\"text-xs text-destructive\">{channelsError}</p>}\n {channels && channels.length === 0 && !channelsError && (\n <p className=\"text-xs text-muted-foreground\">No public channels available.</p>\n )}\n {channels && channels.length > 0 && (\n <select\n id=\"recent-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 <option value=\"\" disabled>\n Select a channel…\n </option>\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 {!channelId && channels && channels.length > 0 && (\n <p className=\"text-xs text-muted-foreground\">Select a channel to see recent messages.</p>\n )}\n {channelId && recent === null && !recentError && (\n <p className=\"text-xs text-muted-foreground\">Loading recent messages…</p>\n )}\n {channelId && recentError && <p className=\"text-xs text-destructive\">{recentError}</p>}\n {channelId && recent && recent.length === 0 && !recentError && (\n <p className=\"text-xs text-muted-foreground\">No recent messages from this app in this channel.</p>\n )}\n {channelId && recent && recent.length > 0 && (\n <div className=\"flex max-h-48 min-w-0 flex-col gap-1 overflow-y-auto\">\n {recent.map((m) => {\n // Which identity the message was posted as — drives both\n // this badge and (on load) the token the update uses.\n const asUser = (m.editableVia ?? 'bot') === 'user';\n return (\n <button\n key={`${m.channelId}:${m.ts}`}\n type=\"button\"\n onClick={() => onLoaded(recentToResult(m))}\n className=\"flex min-w-0 flex-col gap-0.5 rounded-md border border-input bg-background px-3 py-2 text-left text-sm hover:bg-accent hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\"\n >\n <span className=\"flex min-w-0 items-baseline justify-between gap-2\">\n <span className=\"shrink-0 rounded border px-1 py-px text-[10px] font-medium uppercase tracking-wide text-muted-foreground\">\n {asUser ? 'You' : 'Bot'}\n </span>\n <span className=\"shrink-0 text-xs text-muted-foreground\">\n <span className=\"font-semibold text-foreground\">\n {new Date(Number(m.ts) * 1000).toLocaleString()}\n </span>{' '}\n <span className=\"font-mono\">({m.ts})</span>\n </span>\n </span>\n {m.label && <span className=\"truncate text-sm text-muted-foreground\">{m.label}</span>}\n </button>\n );\n })}\n </div>\n )}\n </div>\n )}\n </div>\n\n <DialogFooter>\n <Button type=\"button\" variant=\"ghost\" onClick={() => onOpenChange(false)}>\n Cancel\n </Button>\n <Button type=\"button\" onClick={handleLoad} disabled={status.kind === 'loading' || !link.trim()}>\n {status.kind === 'loading' ? 'Loading…' : 'Load message'}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n","import { useDraggable } from '@dnd-kit/core';\nimport { ChevronDown, ChevronRight, GripVertical, Search } from 'lucide-react';\nimport type * as React from 'react';\nimport { useMemo, useState } from 'react';\nimport { cn } from '../lib/cn';\nimport type { PaletteSection as PaletteSectionDef, PaletteVariant } from '../lib/default-blocks';\nimport { Input } from '../lib/ui/input';\nimport type { SupportedBlock } from '../types';\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 * Configuration for which palette sections are open on first paint.\n * - `true` (default) → every section starts open\n * - `false` → every section starts closed\n * - array of section names → only sections whose `name` is in the list start open\n *\n * Matched by `section.name` (case-sensitive) so consumer-defined sections\n * are addressable too — a consumer with custom palette like `[{ name:\n * 'Company presets', ... }]` can pass `['Company presets']` to start that\n * one open.\n */\nexport type DefaultOpenSections = boolean | readonly string[];\n\nfunction isDefaultOpen(sectionName: string, config: DefaultOpenSections): boolean {\n if (typeof config === 'boolean') return config;\n return config.includes(sectionName);\n}\n\nfunction filterSections(sections: readonly PaletteSectionDef[], query: string): readonly PaletteSectionDef[] {\n const q = query.trim().toLowerCase();\n if (q.length === 0) return sections;\n const out: PaletteSectionDef[] = [];\n for (const section of sections) {\n if (section.name.toLowerCase().includes(q)) {\n out.push(section);\n continue;\n }\n const variants = section.variants.filter((v) => v.label.toLowerCase().includes(q));\n if (variants.length > 0) {\n out.push({ ...section, variants });\n }\n }\n return out;\n}\n\n/**\n * The left-side palette of available block variants, organized into\n * collapsible sections that mirror Slack's real Block Kit Builder\n * (Agents, Markdown, Section, Actions, Input, Structure, Rich Text,\n * Image, Card and Carousel, Table). Each variant is a draggable preset\n * that inserts a default-shaped block when dropped on the surface. A\n * search input at the top filters variants by label across all sections;\n * an active query temporarily expands every matching section regardless\n * of its collapsed state.\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 * @param props.sections - the palette sections to render (the resolved\n * palette, either the built-in default or a consumer-provided one)\n * @param props.defaultOpenSections - controls which section headers are\n * expanded on first mount. See {@link DefaultOpenSections}. Defaults to\n * `true` (all open).\n * @param props.showSearch - whether the quick-search input is rendered\n * above the section list. Defaults to `true`. Set `false` for compact\n * palettes where the list is short enough to scan by eye.\n * @param props.searchPlaceholder - placeholder text shown in the search\n * input. Defaults to `'Search blocks…'`. Useful for localization.\n * @returns the rendered palette aside\n */\nexport function Palette({\n onAddBlock,\n sections,\n defaultOpenSections = true,\n showSearch = true,\n searchPlaceholder = 'Search blocks…',\n variant = 'aside'\n}: {\n onAddBlock: (block: SupportedBlock) => void;\n sections: readonly PaletteSectionDef[];\n defaultOpenSections?: DefaultOpenSections;\n showSearch?: boolean;\n searchPlaceholder?: string;\n /**\n * `'aside'` — persistent left rail (default). Fixed width with right border.\n * `'sheet'` — full-width content for mobile bottom-sheet hosting. No\n * own borders or width constraints so it fills the sheet body.\n */\n variant?: 'aside' | 'sheet';\n}) {\n const [query, setQuery] = useState('');\n const visibleSections = useMemo(\n () => (showSearch ? filterSections(sections, query) : sections),\n [sections, query, showSearch]\n );\n const queryActive = showSearch && query.trim().length > 0;\n const isSheet = variant === 'sheet';\n\n return (\n <aside\n className={cn(\n 'flex min-h-0 flex-col overflow-x-hidden overflow-y-auto',\n isSheet ? 'w-full flex-1 bg-background' : 'w-72 shrink-0 border-r bg-muted/20'\n )}\n >\n {showSearch ? (\n <div\n className={cn(\n 'sticky top-0 z-10 border-b px-3 pt-3 pb-2 backdrop-blur',\n isSheet ? 'bg-background' : 'bg-muted/20'\n )}\n >\n <div className=\"relative\">\n <Search\n className={cn(\n 'pointer-events-none absolute left-2 top-1/2 -translate-y-1/2 text-muted-foreground',\n isSheet ? 'h-4 w-4' : 'h-3.5 w-3.5'\n )}\n />\n <Input\n type=\"search\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n placeholder={searchPlaceholder}\n aria-label={searchPlaceholder}\n className={cn(isSheet ? 'h-10 pl-8 text-base' : 'h-8 pl-7 text-sm')}\n />\n </div>\n </div>\n ) : null}\n <div className={cn('flex flex-col', isSheet ? 'px-2 pb-6' : 'p-3')}>\n {visibleSections.length === 0 ? (\n <p className=\"px-1 py-2 text-xs text-muted-foreground\">No blocks match.</p>\n ) : (\n visibleSections.map((section) => (\n <PaletteSection\n key={section.name}\n section={section}\n defaultOpen={isDefaultOpen(section.name, defaultOpenSections)}\n forceOpen={queryActive}\n onAddBlock={onAddBlock}\n variant={variant}\n />\n ))\n )}\n </div>\n </aside>\n );\n}\n\n/**\n * One collapsible category in the palette. Owns its own open/closed\n * state, seeded from `defaultOpen`. When `forceOpen` is true (an active\n * search) it renders expanded regardless of the local state, and the\n * prior state is restored once the search clears.\n */\nfunction PaletteSection({\n section,\n defaultOpen,\n forceOpen,\n onAddBlock,\n variant = 'aside'\n}: {\n section: PaletteSectionDef;\n defaultOpen: boolean;\n forceOpen: boolean;\n onAddBlock: (block: SupportedBlock) => void;\n variant?: 'aside' | 'sheet';\n}) {\n const [open, setOpen] = useState(defaultOpen);\n const Icon = section.icon;\n const isOpen = open || forceOpen;\n const Caret = isOpen ? ChevronDown : ChevronRight;\n const isSheet = variant === 'sheet';\n\n return (\n <div className=\"mt-3 flex flex-col first:mt-0\">\n <button\n type=\"button\"\n aria-expanded={isOpen}\n onClick={() => setOpen((v) => !v)}\n className={cn(\n 'flex cursor-pointer appearance-none items-center gap-1.5 rounded border-0 bg-transparent text-left transition-colors hover:bg-accent focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring',\n isSheet ? 'px-2 py-2 min-h-10' : 'px-1 py-1'\n )}\n >\n <Icon className={cn('shrink-0 text-muted-foreground', isSheet ? 'h-5 w-5' : 'h-4 w-4')} />\n <span\n className={cn('min-w-0 flex-1 truncate font-semibold text-foreground', isSheet ? 'text-sm' : 'text-[13px]')}\n >\n {section.name}\n </span>\n <Caret className={cn('shrink-0 text-muted-foreground', isSheet ? 'h-4 w-4' : 'h-3.5 w-3.5')} />\n </button>\n {isOpen ? (\n <div className=\"mt-0.5 flex flex-col\">\n {section.variants.map((v) => (\n <PaletteItem key={v.id} variant={v} onAdd={() => onAddBlock(v.factory())} mode={variant} />\n ))}\n </div>\n ) : null}\n </div>\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({\n variant,\n onAdd,\n mode = 'aside'\n}: {\n variant: PaletteVariant;\n onAdd: () => void;\n mode?: 'aside' | 'sheet';\n}) {\n const { attributes, listeners, setNodeRef, setActivatorNodeRef, isDragging } = useDraggable({\n id: `${PALETTE_DRAG_PREFIX}${variant.id}`\n });\n\n const isSheet = mode === 'sheet';\n\n if (isSheet) {\n // In the mobile sheet the row IS the tap target — no separate grip /\n // chevron split. Touch DnD is unreliable on mixed scrollers anyway, so\n // we lean on tap-to-add as the primary input here.\n return (\n <button\n ref={setNodeRef as unknown as React.Ref<HTMLButtonElement>}\n type=\"button\"\n aria-label={`Add ${variant.label}`}\n onClick={onAdd}\n className={cn(\n 'group flex w-full min-h-11 cursor-pointer items-center gap-3 rounded-md border border-transparent bg-background px-3 py-2 text-left text-sm font-medium text-foreground transition-colors hover:border-border hover:bg-accent active:bg-accent focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring',\n isDragging && 'opacity-50'\n )}\n >\n <span className=\"flex h-7 w-7 shrink-0 items-center justify-center rounded-md bg-muted text-muted-foreground transition-colors group-hover:bg-primary/10 group-hover:text-primary\">\n <ChevronRight className=\"h-4 w-4\" />\n </span>\n <span className=\"min-w-0 flex-1 truncate\">{variant.label}</span>\n </button>\n );\n }\n\n return (\n <div\n ref={setNodeRef}\n className={cn(\n 'group flex items-center gap-2 rounded px-2 py-1.5 text-sm text-muted-foreground transition-colors hover:bg-accent hover:text-foreground has-[:focus-visible]:bg-accent has-[:focus-visible]:text-foreground',\n isDragging && 'opacity-50'\n )}\n >\n <div\n ref={setActivatorNodeRef}\n className=\"-my-1.5 flex min-w-0 flex-1 cursor-grab items-center gap-2 rounded py-1.5 active:cursor-grabbing focus-visible:outline-none\"\n {...attributes}\n {...listeners}\n >\n <GripVertical className=\"h-3.5 w-3.5 shrink-0\" />\n <span className=\"truncate\">{variant.label}</span>\n </div>\n <button\n type=\"button\"\n aria-label={`Add ${variant.label} to preview`}\n onClick={onAdd}\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 group-has-[:focus-visible]:opacity-100 focus-visible:opacity-100 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\"\n >\n <ChevronRight className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n );\n}\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 { isSafeHref } from '../lib/url-safety';\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.confirmSendLabel - label for the final confirm button. Defaults to `'Send'`.\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 confirmSendLabel = 'Send',\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 /** Label for the final confirm button. Defaults to `'Send'`. */\n confirmSendLabel?: 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 className=\"w-[calc(100vw-1.5rem)] max-w-lg rounded-lg\">\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=\"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 && isSafeHref(userStatus.oauthUrl) && (\n <p className=\"text-xs text-muted-foreground\">\n <a\n href={userStatus.oauthUrl}\n target=\"_blank\"\n rel=\"noopener 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 <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 {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…' : confirmSendLabel}\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 'bk-portal-content 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 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 *\n * `idPrefix` namespaces the input ids so the editor can be rendered more\n * than once on a page (the carousel editor reuses it per card); it\n * defaults to `card` for the standalone block.\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 * @param props.idPrefix - prefix for input ids (defaults to `card`)\n * @returns the rendered card editor form\n */\nexport function CardEditor({\n block,\n onChange,\n idPrefix = 'card'\n}: BlockEditorProps<CardBlock> & { idPrefix?: string }) {\n return (\n <div className=\"flex flex-col gap-4\">\n <EditorField label=\"Title\" help=\"Up to 150 characters. Supports mrkdwn formatting.\" htmlFor={`${idPrefix}-title`}>\n <Input\n id={`${idPrefix}-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={`${idPrefix}-subtitle`}>\n <Input\n id={`${idPrefix}-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={`${idPrefix}-body`}>\n <Textarea\n id={`${idPrefix}-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={`${idPrefix}-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={`${idPrefix}-icon`}\n image={block.icon}\n onChange={(next) => onChange({ ...block, icon: next })}\n />\n\n <ButtonsField\n idPrefix={idPrefix}\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({\n buttons,\n onChange,\n idPrefix = 'card'\n}: {\n buttons: SlackButton[];\n onChange: (next: SlackButton[]) => void;\n idPrefix?: string;\n}) {\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={`${idPrefix}-btn-label-${idx}`}>\n <Input\n id={`${idPrefix}-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={`${idPrefix}-btn-url-${idx}`}\n >\n <Input\n id={`${idPrefix}-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={`${idPrefix}-btn-style-${idx}-${s}`} />\n <Label htmlFor={`${idPrefix}-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 type { CardBlock, CarouselBlock } from '../../types';\nimport { CardEditor } from './card-editor';\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 each one with the full standalone Card\n * editor (title, subtitle, body, hero image, icon, and action buttons).\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\">Carousels hold 1-10 cards.</p>\n {elements.map((card, idx) => (\n <div key={idx} className=\"flex flex-col gap-3 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 <CardEditor block={card} idPrefix={`carousel-card-${idx}`} onChange={(next) => updateCard(idx, next)} />\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 { Input } from '../../lib/ui/input';\nimport { Label } from '../../lib/ui/label';\nimport { RadioGroup, RadioGroupItem } from '../../lib/ui/radio-group';\nimport type { ContainerBlock } from '../../types';\nimport { EditorField } from './field';\nimport type { BlockEditorProps } from './types';\n\nconst WIDTHS = ['narrow', 'standard', 'wide', 'full'] as const;\n\n/**\n * Editor form for `container` blocks. Edits the container's own fields —\n * title, subtitle, width, collapse behavior, and icon. The child blocks it\n * groups are added, removed, reordered, and edited directly on the canvas\n * by dragging blocks into and out of the container.\n * @param props - editor props\n * @param props.block - the container block to edit\n * @param props.onChange - called with the updated block payload\n * @returns the rendered container editor form\n */\nexport function ContainerEditor({ block, onChange }: BlockEditorProps<ContainerBlock>) {\n // The visual builder only emits URL-based icons; a slack_file icon (rare)\n // reads as empty and is replaced if the user types a URL.\n const iconUrl = block.icon && 'image_url' in block.icon ? (block.icon.image_url ?? '') : '';\n const iconAlt = block.icon?.alt_text ?? '';\n\n return (\n <div className=\"flex flex-col gap-4\">\n <EditorField label=\"Title\" help=\"Heading shown at the top of the container.\" htmlFor=\"container-title\">\n <Input\n id=\"container-title\"\n value={block.title?.text ?? ''}\n maxLength={150}\n placeholder=\"e.g. Bulk update: 2 records selected\"\n onChange={(e) => onChange({ ...block, title: { type: 'plain_text', text: e.target.value } })}\n />\n </EditorField>\n\n <EditorField label=\"Subtitle\" help=\"Optional secondary line under the title.\" htmlFor=\"container-subtitle\">\n <Input\n id=\"container-subtitle\"\n value={block.subtitle?.text ?? ''}\n maxLength={150}\n placeholder=\"e.g. Review changes before confirming\"\n onChange={(e) =>\n onChange({\n ...block,\n subtitle: e.target.value ? { type: 'plain_text', text: e.target.value } : undefined\n })\n }\n />\n </EditorField>\n\n <EditorField label=\"Icon URL\" help=\"Optional image shown left of the title.\" htmlFor=\"container-icon\">\n <Input\n id=\"container-icon\"\n type=\"url\"\n value={iconUrl}\n placeholder=\"https://example.com/icon.png\"\n onChange={(e) =>\n onChange({\n ...block,\n icon: e.target.value\n ? { type: 'image', image_url: e.target.value, alt_text: iconAlt || 'Container icon' }\n : undefined\n })\n }\n />\n </EditorField>\n\n <EditorField label=\"Width\" help=\"How wide the container renders in the message.\">\n <RadioGroup\n value={block.width ?? 'standard'}\n onValueChange={(v) => onChange({ ...block, width: v as ContainerBlock['width'] })}\n className=\"flex flex-row flex-wrap gap-3\"\n >\n {WIDTHS.map((w) => (\n <div key={w} className=\"flex items-center gap-1.5\">\n <RadioGroupItem value={w} id={`container-width-${w}`} />\n <Label htmlFor={`container-width-${w}`} className=\"text-xs capitalize\">\n {w}\n </Label>\n </div>\n ))}\n </RadioGroup>\n </EditorField>\n\n <Checkbox\n id=\"container-collapsible\"\n label=\"Collapsible\"\n help=\"Let readers expand and collapse the container.\"\n checked={!!block.is_collapsible}\n // Clearing collapsible must also clear default_collapsed — Slack\n // rejects default_collapsed: true without is_collapsible: true.\n onChange={(checked) =>\n onChange({\n ...block,\n is_collapsible: checked || undefined,\n default_collapsed: checked ? block.default_collapsed : undefined\n })\n }\n />\n\n <Checkbox\n id=\"container-default-collapsed\"\n label=\"Collapsed by default\"\n help=\"Start collapsed on first render. Requires Collapsible.\"\n checked={!!block.default_collapsed}\n disabled={!block.is_collapsible}\n onChange={(checked) => onChange({ ...block, default_collapsed: checked || undefined })}\n />\n\n <p className=\"text-[11px] leading-snug text-muted-foreground\">\n Drag blocks into the container on the canvas to add them (1-10), and drag them out to remove. Click a child to\n edit it.\n </p>\n </div>\n );\n}\n\n/**\n * Inline labeled checkbox matching the builder's editor styling.\n */\nfunction Checkbox({\n id,\n label,\n help,\n checked,\n disabled,\n onChange\n}: {\n id: string;\n label: string;\n help?: string;\n checked: boolean;\n disabled?: 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 disabled={disabled}\n onChange={(e) => onChange(e.target.checked)}\n className=\"h-3.5 w-3.5 cursor-pointer rounded border-input disabled:cursor-not-allowed disabled:opacity-40\"\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 { 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.length === 0 ? (\n <p className=\"rounded-md border border-dashed bg-muted/20 px-3 py-2 text-xs text-muted-foreground\">\n No items yet — a context block needs at least one. Add text or an image below, or delete the block if you\n don't need it.\n </p>\n ) : null}\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 @riley\"\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. Riley's avatar\"\n onChange={(e) => onChange({ ...element, alt_text: e.target.value })}\n />\n </EditorField>\n </div>\n );\n}\n","import { Plus, Trash2 } from 'lucide-react';\nimport { useEffect, useState } from 'react';\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 CartesianChart,\n Chart,\n ChartSeries,\n ChartType,\n DataVisualizationBlock,\n PieChart,\n PieChartSegment\n} from '../../types';\nimport { EditorField } from './field';\nimport type { BlockEditorProps } from './types';\n\nconst CHART_TYPES: readonly ChartType[] = ['line', 'bar', 'area', 'pie'] as const;\n\n/** Narrows a chart to its cartesian (line / bar / area) variant. */\nfunction isCartesian(chart: Chart): chart is CartesianChart {\n return chart.type !== 'pie';\n}\n\n/** Flattens a cartesian chart's first series into pie segments. */\nfunction cartesianToSegments(chart: CartesianChart): PieChartSegment[] {\n return (chart.series[0]?.data ?? []).map((d) => ({ label: d.label, value: d.value }));\n}\n\n/** Builds a single-series cartesian chart from pie segments. */\nfunction segmentsToCartesian(type: CartesianChart['type'], segments: PieChartSegment[]): CartesianChart {\n return {\n type,\n series: [{ name: 'Series 1', data: segments.map((s) => ({ label: s.label, value: s.value })) }],\n axis_config: { categories: segments.map((s) => s.label) }\n };\n}\n\n/**\n * Converts the current chart to a new chart type, preserving the data\n * where the shapes are compatible: line / bar / area share the same\n * series shape, while switching to or from pie maps between series data\n * and segments so a user doesn't lose their numbers mid-edit.\n */\nfunction convertChart(chart: Chart, nextType: ChartType): Chart {\n if (nextType === chart.type) {\n return chart;\n }\n if (nextType === 'pie') {\n return { type: 'pie', segments: isCartesian(chart) ? cartesianToSegments(chart) : chart.segments };\n }\n if (isCartesian(chart)) {\n return { ...chart, type: nextType };\n }\n return segmentsToCartesian(nextType, chart.segments);\n}\n\n/**\n * Editor form for `data_visualization` blocks. Edits the title, the chart\n * type (line / bar / area / pie), and the underlying data — a category ×\n * series grid for the cartesian charts, or a flat segment list for pie.\n * @param props - editor props\n * @param props.block - the data visualization block to edit\n * @param props.onChange - called with the updated block payload\n * @returns the rendered data visualization editor form\n */\nexport function DataVisualizationEditor({ block, onChange }: BlockEditorProps<DataVisualizationBlock>) {\n const { chart } = block;\n const setChart = (next: Chart) => onChange({ ...block, chart: next });\n\n return (\n <div className=\"flex flex-col gap-4\">\n <EditorField label=\"Title\" help=\"Heading shown above the chart.\" htmlFor=\"dataviz-title\">\n <Input\n id=\"dataviz-title\"\n value={block.title}\n placeholder=\"e.g. Weekly active users\"\n onChange={(e) => onChange({ ...block, title: e.target.value })}\n />\n </EditorField>\n\n <EditorField label=\"Chart type\">\n <RadioGroup\n value={chart.type}\n onValueChange={(v) => setChart(convertChart(chart, v as ChartType))}\n className=\"flex flex-row flex-wrap gap-3\"\n >\n {CHART_TYPES.map((t) => (\n <div key={t} className=\"flex items-center gap-1.5\">\n <RadioGroupItem value={t} id={`dataviz-type-${t}`} />\n <Label htmlFor={`dataviz-type-${t}`} className=\"text-xs capitalize\">\n {t}\n </Label>\n </div>\n ))}\n </RadioGroup>\n </EditorField>\n\n {isCartesian(chart) ? (\n <CartesianFields chart={chart} onChange={setChart} />\n ) : (\n <PieFields chart={chart} onChange={setChart} />\n )}\n </div>\n );\n}\n\n/**\n * Numeric input that keeps a local string draft so partial values like a\n * lone \"-\" type cleanly. Commits a parsed number on every valid keystroke\n * and normalizes (empty / invalid → 0) on blur. Resyncs when the model\n * value changes from outside (e.g. a chart-type switch or row reindex).\n */\nfunction NumberInput({\n id,\n value,\n onCommit,\n ariaLabel,\n className\n}: {\n id?: string;\n value: number;\n onCommit: (next: number) => void;\n ariaLabel?: string;\n className?: string;\n}) {\n const [draft, setDraft] = useState(String(value));\n useEffect(() => {\n setDraft(String(value));\n }, [value]);\n\n return (\n <Input\n id={id}\n type=\"number\"\n inputMode=\"numeric\"\n aria-label={ariaLabel}\n value={draft}\n className={className}\n onChange={(e) => {\n const raw = e.target.value;\n setDraft(raw);\n // Skip intermediate states that don't parse to a number yet.\n if (raw === '' || raw === '-' || raw === '.' || raw === '-.') {\n return;\n }\n const next = Number(raw);\n if (!Number.isNaN(next)) {\n onCommit(next);\n }\n }}\n onBlur={() => {\n const next = Number(draft);\n const safe = draft.trim() === '' || Number.isNaN(next) ? 0 : next;\n onCommit(safe);\n setDraft(String(safe));\n }}\n />\n );\n}\n\n/**\n * Sub-editor for line / bar / area charts. Presents the data as a grid:\n * categories are the x-axis columns, each series is a row, and every cell\n * is a numeric value. Series data is kept aligned to the category spine on\n * every edit so the payload always has one value per category.\n */\nfunction CartesianFields({ chart, onChange }: { chart: CartesianChart; onChange: (next: CartesianChart) => void }) {\n const series = chart.series;\n // Categories drive the x-axis. Fall back to the first series' labels so a\n // block loaded without axis_config still shows (and keeps) its data.\n const categories =\n chart.axis_config?.categories && chart.axis_config.categories.length > 0\n ? chart.axis_config.categories\n : (series[0]?.data.map((d) => d.label) ?? []);\n const xLabel = chart.axis_config?.x_label ?? '';\n const yLabel = chart.axis_config?.y_label ?? '';\n\n // Single write path: re-align every series to the category spine and\n // rebuild axis_config, dropping empty axis labels.\n const commit = (\n nextCategories: string[],\n nextSeries: ChartSeries[],\n axis?: { x_label?: string; y_label?: string }\n ) => {\n const aligned: ChartSeries[] = nextSeries.map((s) => ({\n name: s.name,\n data: nextCategories.map((label, i) => ({ label, value: s.data[i]?.value ?? 0 }))\n }));\n const x = axis?.x_label ?? xLabel;\n const y = axis?.y_label ?? yLabel;\n onChange({\n type: chart.type,\n series: aligned,\n axis_config: {\n categories: nextCategories,\n ...(x ? { x_label: x } : {}),\n ...(y ? { y_label: y } : {})\n }\n });\n };\n\n const setCategory = (col: number, label: string) =>\n commit(\n categories.map((c, i) => (i === col ? label : c)),\n series\n );\n const addCategory = () => commit([...categories, `Cat ${categories.length + 1}`], series);\n const removeCategory = (col: number) =>\n commit(\n categories.filter((_, i) => i !== col),\n series.map((s) => ({ name: s.name, data: s.data.filter((_, i) => i !== col) }))\n );\n const setCell = (seriesIdx: number, col: number, value: number) =>\n commit(\n categories,\n series.map((s, i) =>\n i === seriesIdx ? { name: s.name, data: s.data.map((d, j) => (j === col ? { ...d, value } : d)) } : s\n )\n );\n const setSeriesName = (seriesIdx: number, name: string) =>\n commit(\n categories,\n series.map((s, i) => (i === seriesIdx ? { ...s, name } : s))\n );\n const addSeries = () =>\n commit(categories, [\n ...series,\n { name: `Series ${series.length + 1}`, data: categories.map((label) => ({ label, value: 0 })) }\n ]);\n const removeSeries = (seriesIdx: number) =>\n commit(\n categories,\n series.filter((_, i) => i !== seriesIdx)\n );\n\n return (\n <div className=\"flex flex-col gap-4\">\n <div className=\"flex gap-2\">\n <div className=\"flex-1\">\n <EditorField label=\"X-axis label\" htmlFor=\"dataviz-x-label\">\n <Input\n id=\"dataviz-x-label\"\n value={xLabel}\n placeholder=\"e.g. Day\"\n onChange={(e) => commit(categories, series, { x_label: e.target.value })}\n />\n </EditorField>\n </div>\n <div className=\"flex-1\">\n <EditorField label=\"Y-axis label\" htmlFor=\"dataviz-y-label\">\n <Input\n id=\"dataviz-y-label\"\n value={yLabel}\n placeholder=\"e.g. Users\"\n onChange={(e) => commit(categories, series, { y_label: e.target.value })}\n />\n </EditorField>\n </div>\n </div>\n\n <EditorField label=\"Data\" help=\"Categories are the x-axis; each series is plotted across them.\">\n <div className=\"flex flex-col gap-2 overflow-x-auto\">\n {/* Category header row */}\n <div className=\"flex items-center gap-1\">\n <span className=\"w-36 shrink-0\" aria-hidden=\"true\" />\n {categories.map((cat, c) => (\n <div key={c} className=\"flex min-w-[88px] flex-1 items-center gap-1\">\n <Input\n aria-label={`Category ${c + 1}`}\n value={cat}\n placeholder={`Cat ${c + 1}`}\n onChange={(e) => setCategory(c, e.target.value)}\n className=\"h-8 text-xs\"\n />\n <button\n type=\"button\"\n aria-label={`Remove category ${c + 1}`}\n onClick={() => removeCategory(c)}\n className=\"flex h-6 w-6 shrink-0 items-center justify-center rounded text-muted-foreground hover:bg-destructive/10 hover:text-destructive\"\n >\n <Trash2 className=\"h-3 w-3\" />\n </button>\n </div>\n ))}\n </div>\n\n {/* One row per series */}\n {series.map((s, si) => (\n <div key={si} className=\"flex items-center gap-1\">\n <div className=\"flex w-36 shrink-0 items-center gap-1\">\n <Input\n aria-label={`Series ${si + 1} name`}\n value={s.name}\n placeholder={`Series ${si + 1}`}\n onChange={(e) => setSeriesName(si, e.target.value)}\n className=\"h-8 text-xs\"\n />\n <button\n type=\"button\"\n aria-label={`Remove series ${si + 1}`}\n onClick={() => removeSeries(si)}\n className=\"flex h-6 w-6 shrink-0 items-center justify-center rounded text-muted-foreground hover:bg-destructive/10 hover:text-destructive\"\n >\n <Trash2 className=\"h-3 w-3\" />\n </button>\n </div>\n {categories.map((cat, c) => (\n <div key={c} className=\"min-w-[88px] flex-1\">\n <NumberInput\n value={s.data[c]?.value ?? 0}\n onCommit={(n) => setCell(si, c, n)}\n ariaLabel={`${s.name || `Series ${si + 1}`} value for ${cat || `category ${c + 1}`}`}\n className=\"h-8 text-xs\"\n />\n </div>\n ))}\n </div>\n ))}\n </div>\n </EditorField>\n\n <div className=\"flex gap-2\">\n <Button type=\"button\" size=\"sm\" onClick={addSeries} className=\"self-start\">\n <Plus className=\"h-3.5 w-3.5\" /> Add series\n </Button>\n <Button type=\"button\" size=\"sm\" variant=\"outline\" onClick={addCategory} className=\"self-start\">\n <Plus className=\"h-3.5 w-3.5\" /> Add category\n </Button>\n </div>\n </div>\n );\n}\n\n/**\n * Sub-editor for pie charts. Edits the flat list of `{ label, value }`\n * segments with add / remove controls.\n */\nfunction PieFields({ chart, onChange }: { chart: PieChart; onChange: (next: PieChart) => void }) {\n const segments = chart.segments;\n\n const setSegment = (idx: number, change: Partial<PieChartSegment>) =>\n onChange({ ...chart, segments: segments.map((s, i) => (i === idx ? { ...s, ...change } : s)) });\n const removeSegment = (idx: number) => onChange({ ...chart, segments: segments.filter((_, i) => i !== idx) });\n const addSegment = () =>\n onChange({ ...chart, segments: [...segments, { label: `Segment ${segments.length + 1}`, value: 0 }] });\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\">Segments</span>\n {segments.length === 0 ? (\n <p className=\"text-[11px] leading-snug text-muted-foreground\">No segments. Add one to render a slice.</p>\n ) : null}\n {segments.map((seg, 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\">Segment {idx + 1}</span>\n <button\n type=\"button\"\n aria-label=\"Remove segment\"\n onClick={() => removeSegment(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 <div className=\"flex gap-2\">\n <div className=\"flex-1\">\n <EditorField label=\"Label\" htmlFor={`pie-label-${idx}`}>\n <Input\n id={`pie-label-${idx}`}\n value={seg.label}\n placeholder=\"e.g. Free\"\n onChange={(e) => setSegment(idx, { label: e.target.value })}\n />\n </EditorField>\n </div>\n <div className=\"w-28\">\n <EditorField label=\"Value\" htmlFor={`pie-value-${idx}`}>\n <NumberInput\n id={`pie-value-${idx}`}\n value={seg.value}\n onCommit={(n) => setSegment(idx, { value: n })}\n ariaLabel={`Segment ${idx + 1} value`}\n />\n </EditorField>\n </div>\n </div>\n </div>\n ))}\n <Button type=\"button\" size=\"sm\" onClick={addSegment} className=\"self-start\">\n <Plus className=\"h-3.5 w-3.5\" /> Add segment\n </Button>\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","/**\n * Emoji dataset built from `emoji-datasource` (iamcal / `emoji-data`) — the\n * same canonical source `@tightknit/emoji-mapping` is generated from. Its\n * `short_name` values are Slack's codenames, so resolving a picked emoji to a\n * Slack `name` via its Unicode codepoint (`unified`) is immune to alias drift.\n *\n * The raw dataset (~1.3 MB JSON) is loaded lazily via dynamic import so it\n * never bloats the initial bundle — only when an emoji picker first mounts.\n * The derived index is memoized after the first load.\n */\n\n/** A raw record from `emoji-datasource`'s `emoji.json` (subset we use). */\nexport interface RawEmoji {\n name: string | null;\n unified: string;\n short_name: string;\n short_names: string[];\n category: string;\n sort_order: number;\n skin_variations?: Record<string, { unified: string }>;\n}\n\n/** A normalized emoji entry used by the picker and the TipTap converter. */\nexport interface EmojiDatum {\n /** Canonical Slack codename (first `short_name`). */\n name: string;\n /** All Slack codenames for this codepoint (used for search + lookup). */\n shortNames: string[];\n /** Base Unicode codepoint(s), uppercase, hyphen-delimited (`1F44B`). */\n unified: string;\n /** Source category name (`Smileys & Emotion`, …). */\n category: string;\n /** Stable ordering within a category. */\n sortOrder: number;\n /**\n * Per-skin-tone base+tone codepoints, keyed by Slack `skin_tone` (2–6).\n * Empty when the emoji has no skin variations.\n */\n skinUnified: Record<number, string>;\n}\n\n/** The memoized, derived index the picker and converter consume. */\nexport interface EmojiIndex {\n /** All standard emoji, in category + sort order. */\n all: EmojiDatum[];\n /** Lookup by any Slack codename. */\n byName: Map<string, EmojiDatum>;\n /** Lookup by base `unified` codepoint(s) (uppercase). */\n byUnified: Map<string, EmojiDatum>;\n /** Category name → entries, in Slack-like display order. */\n byCategory: { category: string; emoji: EmojiDatum[] }[];\n}\n\n/**\n * The five Fitzpatrick skin-tone modifier codepoints, in order, mapped to\n * Slack's `skin_tone` integer. emoji-mart's `skin` is 1 (default, no tone) or\n * 2–6; Slack's `skin_tone` uses the same 2–6 and omits the field for default.\n */\nconst TONE_CODEPOINT_TO_SKIN_TONE: Record<string, number> = {\n '1F3FB': 2,\n '1F3FC': 3,\n '1F3FD': 4,\n '1F3FE': 5,\n '1F3FF': 6\n};\n\n/**\n * Slack-like category display order. `Component` (skin-tone modifiers, etc.)\n * is intentionally omitted — those aren't user-pickable emoji.\n */\nconst CATEGORY_ORDER = [\n 'Smileys & Emotion',\n 'People & Body',\n 'Animals & Nature',\n 'Food & Drink',\n 'Travel & Places',\n 'Activities',\n 'Objects',\n 'Symbols',\n 'Flags'\n];\n\n/**\n * Converts a hyphen-delimited Unicode codepoint string (`1F44B`,\n * `1F441-FE0F`) to its rendered glyph. Invalid codepoints are skipped.\n * @param unified - uppercase hyphen-delimited codepoints\n * @returns the rendered emoji glyph\n */\nexport function codepointsToGlyph(unified: string): string {\n return unified\n .split('-')\n .map((cp) => {\n const n = Number.parseInt(cp, 16);\n return Number.isFinite(n) ? String.fromCodePoint(n) : '';\n })\n .join('');\n}\n\n/**\n * The Slack rich_text `unicode` value for an emoji: the base codepoint(s),\n * lowercased (`1F44B` → `1f44b`). Skin tone is carried separately in\n * `skin_tone`, never folded into `unicode`.\n * @param unified - the base `unified` codepoint(s)\n * @returns the lowercased codepoint string\n */\nexport function unifiedToUnicode(unified: string): string {\n return unified.toLowerCase();\n}\n\n/**\n * Composes the text form of an emoji for plain_text / mrkdwn fields:\n * `:name:` or, with a skin tone, `:name::skin-tone-N:`.\n * @param name - the Slack codename (no colons)\n * @param skinTone - optional Slack `skin_tone` (2–6)\n * @returns the colon-wrapped shortcode\n */\nexport function composeTextEmoji(name: string, skinTone?: number): string {\n if (skinTone && skinTone >= 2 && skinTone <= 6) {\n return `:${name}::skin-tone-${skinTone}:`;\n }\n return `:${name}:`;\n}\n\n/**\n * Builds the derived {@link EmojiIndex} from raw `emoji-datasource` records.\n * Pure and synchronous so it can be unit-tested with a small fixture.\n * @param raw - the raw emoji records\n * @returns the normalized, ordered index\n */\nexport function buildEmojiIndex(raw: RawEmoji[]): EmojiIndex {\n const all: EmojiDatum[] = [];\n const byName = new Map<string, EmojiDatum>();\n const byUnified = new Map<string, EmojiDatum>();\n\n for (const r of raw) {\n if (!CATEGORY_ORDER.includes(r.category)) {\n continue;\n }\n const shortNames = r.short_names?.length ? r.short_names : [r.short_name];\n const skinUnified: Record<number, string> = {};\n if (r.skin_variations) {\n for (const [toneKey, variation] of Object.entries(r.skin_variations)) {\n const skinTone = TONE_CODEPOINT_TO_SKIN_TONE[toneKey];\n // Skip compound (multi-person) variations keyed by paired tones; we\n // only model a single skin_tone, matching Slack's emoji element.\n if (skinTone && variation?.unified) {\n skinUnified[skinTone] = variation.unified;\n }\n }\n }\n const datum: EmojiDatum = {\n name: shortNames[0],\n shortNames,\n unified: r.unified,\n category: r.category,\n sortOrder: r.sort_order,\n skinUnified\n };\n all.push(datum);\n byUnified.set(r.unified.toUpperCase(), datum);\n for (const sn of shortNames) {\n // First writer wins so the canonical record owns a shared codename.\n if (!byName.has(sn)) {\n byName.set(sn, datum);\n }\n }\n }\n\n all.sort((a, b) => a.sortOrder - b.sortOrder);\n\n const byCategory = CATEGORY_ORDER.map((category) => ({\n category,\n emoji: all.filter((e) => e.category === category)\n })).filter((group) => group.emoji.length > 0);\n\n return { all, byName, byUnified, byCategory };\n}\n\nlet indexPromise: Promise<EmojiIndex> | null = null;\nlet cachedIndex: EmojiIndex | null = null;\n\n/**\n * Lazily loads `emoji-datasource` and builds the {@link EmojiIndex}, memoizing\n * the result across calls. Safe to call repeatedly; the dynamic import and\n * index build happen at most once.\n * @returns the emoji index\n */\nexport async function loadEmojiIndex(): Promise<EmojiIndex> {\n if (cachedIndex) {\n return cachedIndex;\n }\n if (!indexPromise) {\n indexPromise = import('emoji-datasource/emoji.json')\n .then((mod) => {\n const raw = (mod.default ?? mod) as RawEmoji[];\n cachedIndex = buildEmojiIndex(raw);\n return cachedIndex;\n })\n .catch((err) => {\n // Reset so a transient failure can be retried on the next open.\n indexPromise = null;\n throw err;\n });\n }\n return indexPromise;\n}\n\n/**\n * Returns the already-loaded index, or `null` if it hasn't loaded yet. Used by\n * synchronous code paths (e.g. the TipTap import converter) that resolve emoji\n * metadata best-effort and degrade gracefully when the dataset isn't warm.\n * @returns the cached index or null\n */\nexport function getEmojiIndex(): EmojiIndex | null {\n return cachedIndex;\n}\n","/**\n * Tiny localStorage-backed store of recently picked emoji codenames. Used by\n * the emoji picker's \"Frequently used\" row. SSR/storage-restricted\n * environments degrade to an in-memory no-op (reads return `[]`).\n */\n\nconst STORAGE_KEY = 'bk:emoji-recents';\nconst SKIN_TONE_KEY = 'bk:emoji-skin-tone';\nconst MAX_RECENTS = 24;\n\n/**\n * Reads the persisted picker skin tone (Slack `skin_tone` 2–6), or `null` for\n * the default (no tone). Degrades to `null` when storage is unavailable.\n * @returns the stored skin tone or null\n */\nexport function readEmojiSkinTone(): number | null {\n try {\n const raw = globalThis.localStorage?.getItem(SKIN_TONE_KEY);\n if (!raw) {\n return null;\n }\n const n = Number.parseInt(raw, 10);\n return n >= 2 && n <= 6 ? n : null;\n } catch {\n return null;\n }\n}\n\n/**\n * Persists the picker skin tone. Pass `null` to clear (default tone).\n * @param skinTone - Slack `skin_tone` (2–6) or null\n */\nexport function writeEmojiSkinTone(skinTone: number | null): void {\n try {\n if (skinTone && skinTone >= 2 && skinTone <= 6) {\n globalThis.localStorage?.setItem(SKIN_TONE_KEY, String(skinTone));\n } else {\n globalThis.localStorage?.removeItem(SKIN_TONE_KEY);\n }\n } catch {\n // ignore write failures (private mode, quota, SSR)\n }\n}\n\n/**\n * Reads the recent emoji codenames, most-recent first. Returns an empty array\n * when storage is unavailable or the stored value is malformed.\n * @returns recent codenames\n */\nexport function readEmojiRecents(): string[] {\n try {\n const raw = globalThis.localStorage?.getItem(STORAGE_KEY);\n if (!raw) {\n return [];\n }\n const parsed = JSON.parse(raw);\n return Array.isArray(parsed) ? parsed.filter((n): n is string => typeof n === 'string') : [];\n } catch {\n return [];\n }\n}\n\n/**\n * Records `name` as the most-recently used emoji, de-duplicating and capping\n * the list. Returns the updated list so callers can update state without a\n * re-read. No-ops gracefully when storage is unavailable.\n * @param name - the codename just picked\n * @returns the updated recents list, most-recent first\n */\nexport function pushEmojiRecent(name: string): string[] {\n const next = [name, ...readEmojiRecents().filter((n) => n !== name)].slice(0, MAX_RECENTS);\n try {\n globalThis.localStorage?.setItem(STORAGE_KEY, JSON.stringify(next));\n } catch {\n // ignore write failures (private mode, quota, SSR)\n }\n return next;\n}\n","import { useEffect, useMemo, useRef, useState } from 'react';\nimport { cn } from '../../lib/cn';\nimport {\n codepointsToGlyph,\n type EmojiDatum,\n type EmojiIndex,\n loadEmojiIndex,\n unifiedToUnicode\n} from '../../lib/emoji-data';\nimport { pushEmojiRecent, readEmojiRecents, readEmojiSkinTone, writeEmojiSkinTone } from '../../lib/emoji-recents';\nimport { Input } from '../../lib/ui/input';\nimport { useCustomEmojis } from '../../state/custom-emoji-context';\nimport type { CustomEmoji } from '../../types';\n\n/**\n * A resolved emoji selection emitted by {@link EmojiPicker}. The codename\n * (`name`) is always a Slack codename resolved via the Unicode codepoint, so\n * it round-trips to Slack without becoming blank text. `unicode` / `src` are\n * render-only hints; `skinTone` is Slack's 2–6 (or null for default / custom).\n */\nexport interface EmojiSelection {\n name: string;\n unicode: string | null;\n src: string | null;\n skinTone: number | null;\n}\n\n/** The five skin tones offered, mapped to Slack `skin_tone` (2–6). */\nconst SKIN_TONES = [\n { tone: null, label: 'Default', swatch: '✋' },\n { tone: 2, label: 'Light', swatch: '✋🏻' },\n { tone: 3, label: 'Medium-light', swatch: '✋🏼' },\n { tone: 4, label: 'Medium', swatch: '✋🏽' },\n { tone: 5, label: 'Medium-dark', swatch: '✋🏾' },\n { tone: 6, label: 'Dark', swatch: '✋🏿' }\n] as const;\n\n/** One renderable entry in a picker section: either a standard or custom emoji. */\ntype PickerEntry = { datum?: EmojiDatum; custom?: CustomEmoji };\n\ninterface PickerSection {\n key: string;\n title: string;\n emoji: PickerEntry[];\n}\n\n/**\n * Searchable Slack-style emoji picker covering the standard set (sourced from\n * `emoji-datasource`) plus workspace custom emoji. Offers search, categories,\n * skin tone, and a recents row. On pick it emits {@link EmojiSelection} with a\n * Slack codename resolved via codepoint — never the composed shortcode.\n *\n * @param props.onSelect - called with the resolved selection when an emoji is picked\n * @param props.autoFocus - whether to focus the search input on mount (default true)\n */\nexport function EmojiPicker({\n onSelect,\n autoFocus = true\n}: {\n onSelect: (selection: EmojiSelection) => void;\n autoFocus?: boolean;\n}) {\n const { customEmojis } = useCustomEmojis();\n const [index, setIndex] = useState<EmojiIndex | null>(null);\n const [loadError, setLoadError] = useState(false);\n const [query, setQuery] = useState('');\n const [skinTone, setSkinTone] = useState<number | null>(() => readEmojiSkinTone());\n const [recents, setRecents] = useState<string[]>(() => readEmojiRecents());\n const searchRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n let active = true;\n loadEmojiIndex()\n .then((idx) => {\n if (active) {\n setIndex(idx);\n }\n })\n .catch(() => {\n if (active) {\n setLoadError(true);\n }\n });\n return () => {\n active = false;\n };\n }, []);\n\n useEffect(() => {\n if (autoFocus) {\n searchRef.current?.focus();\n }\n }, [autoFocus]);\n\n // Workspace custom emoji that render as an image form the \"Custom\" category.\n const customByName = useMemo(() => {\n const map = new Map<string, CustomEmoji>();\n for (const e of customEmojis) {\n map.set(e.name, e);\n }\n return map;\n }, [customEmojis]);\n const customImageEmoji = useMemo(() => customEmojis.filter((e) => e.url), [customEmojis]);\n\n const handlePick = (selection: EmojiSelection) => {\n setRecents(pushEmojiRecent(selection.name));\n onSelect(selection);\n };\n\n const handleSkinTone = (tone: number | null) => {\n setSkinTone(tone);\n writeEmojiSkinTone(tone);\n };\n\n const sections = useMemo<PickerSection[]>(() => {\n if (!index) {\n return [];\n }\n const trimmed = query.trim().toLowerCase();\n if (trimmed) {\n const standard = index.all\n .filter((d) => d.shortNames.some((sn) => sn.includes(trimmed)))\n .slice(0, 120)\n .map((datum) => ({ datum }));\n const custom = customImageEmoji\n .filter((e) => e.name.toLowerCase().includes(trimmed))\n .map((custom) => ({ custom }));\n return [{ key: 'search', title: 'Search results', emoji: [...custom, ...standard] }];\n }\n\n const out: PickerSection[] = [];\n if (recents.length > 0) {\n const recentEmoji = recents\n .map((name): PickerEntry | null => {\n const custom = customByName.get(name);\n if (custom?.url) {\n return { custom };\n }\n const datum = index.byName.get(name);\n return datum ? { datum } : null;\n })\n .filter((e): e is PickerEntry => e !== null);\n if (recentEmoji.length > 0) {\n out.push({ key: 'recents', title: 'Frequently used', emoji: recentEmoji });\n }\n }\n if (customImageEmoji.length > 0) {\n out.push({ key: 'custom', title: 'Custom', emoji: customImageEmoji.map((custom) => ({ custom })) });\n }\n for (const group of index.byCategory) {\n out.push({ key: group.category, title: group.category, emoji: group.emoji.map((datum) => ({ datum })) });\n }\n return out;\n }, [index, query, recents, customByName, customImageEmoji]);\n\n return (\n <div className=\"bk-emoji-picker flex w-[320px] max-w-[90vw] flex-col gap-2\">\n <div className=\"flex items-center gap-2\">\n <Input\n ref={searchRef}\n value={query}\n placeholder=\"Search emoji…\"\n aria-label=\"Search emoji\"\n onChange={(e) => setQuery(e.target.value)}\n className=\"h-8\"\n />\n <SkinToneSelector value={skinTone} onChange={handleSkinTone} />\n </div>\n <div className=\"h-64 overflow-y-auto pr-1\">\n {loadError ? (\n <p className=\"p-4 text-center text-xs text-muted-foreground\">Couldn't load emoji.</p>\n ) : !index ? (\n <p className=\"p-4 text-center text-xs text-muted-foreground\">Loading emoji…</p>\n ) : sections.every((s) => s.emoji.length === 0) ? (\n <p className=\"p-4 text-center text-xs text-muted-foreground\">No emoji found.</p>\n ) : (\n sections.map((section) => (\n <div key={section.key} className=\"mb-2\">\n <div className=\"sticky top-0 z-10 bg-background px-1 py-1 text-[11px] font-medium text-muted-foreground\">\n {section.title}\n </div>\n <div className=\"grid grid-cols-8 gap-0.5\">\n {section.emoji.map((entry, i) =>\n entry.custom ? (\n <CustomEmojiButton\n key={`${section.key}-${entry.custom.name}-${i}`}\n emoji={entry.custom}\n onPick={handlePick}\n />\n ) : entry.datum ? (\n <StandardEmojiButton\n key={`${section.key}-${entry.datum.name}-${i}`}\n datum={entry.datum}\n skinTone={skinTone}\n onPick={handlePick}\n />\n ) : null\n )}\n </div>\n </div>\n ))\n )}\n </div>\n </div>\n );\n}\n\n/**\n * Resolves a standard emoji datum + the active skin tone to an\n * {@link EmojiSelection}, applying the tone only when the emoji supports it.\n */\nfunction resolveStandard(datum: EmojiDatum, skinTone: number | null): EmojiSelection {\n const tonedUnified = skinTone ? datum.skinUnified[skinTone] : undefined;\n return {\n name: datum.name,\n unicode: unifiedToUnicode(tonedUnified ?? datum.unified),\n src: null,\n skinTone: tonedUnified ? skinTone : null\n };\n}\n\nconst emojiButtonClass =\n 'flex h-8 w-8 cursor-pointer items-center justify-center rounded text-lg leading-none hover:bg-accent';\n\n/** A single standard emoji button. */\nfunction StandardEmojiButton({\n datum,\n skinTone,\n onPick\n}: {\n datum: EmojiDatum;\n skinTone: number | null;\n onPick: (s: EmojiSelection) => void;\n}) {\n const tonedUnified = (skinTone && datum.skinUnified[skinTone]) || datum.unified;\n return (\n <button\n type=\"button\"\n className={emojiButtonClass}\n title={`:${datum.name}:`}\n aria-label={datum.name}\n onClick={() => onPick(resolveStandard(datum, skinTone))}\n >\n {codepointsToGlyph(tonedUnified)}\n </button>\n );\n}\n\n/** A single workspace custom emoji button (image). */\nfunction CustomEmojiButton({ emoji, onPick }: { emoji: CustomEmoji; onPick: (s: EmojiSelection) => void }) {\n return (\n <button\n type=\"button\"\n className={emojiButtonClass}\n title={`:${emoji.name}:`}\n aria-label={emoji.name}\n onClick={() => onPick({ name: emoji.name, unicode: null, src: emoji.url, skinTone: null })}\n >\n {emoji.url ? (\n <img src={emoji.url} alt={`:${emoji.name}:`} className=\"h-5 w-5 object-contain\" />\n ) : (\n <span className=\"text-[10px]\">:{emoji.name}:</span>\n )}\n </button>\n );\n}\n\n/** Row of skin-tone swatches; the active tone applies to standard emoji. */\nfunction SkinToneSelector({ value, onChange }: { value: number | null; onChange: (tone: number | null) => void }) {\n const [open, setOpen] = useState(false);\n const active = SKIN_TONES.find((t) => t.tone === value) ?? SKIN_TONES[0];\n return (\n <div className=\"relative shrink-0\">\n <button\n type=\"button\"\n aria-label={`Skin tone: ${active.label}`}\n title={`Skin tone: ${active.label}`}\n className=\"flex h-8 w-8 items-center justify-center rounded border text-lg leading-none hover:bg-accent\"\n onClick={() => setOpen((o) => !o)}\n >\n {active.swatch}\n </button>\n {open && (\n <div className=\"absolute right-0 z-20 mt-1 flex gap-0.5 rounded-md border bg-background p-1 shadow-md\">\n {SKIN_TONES.map((t) => (\n <button\n key={t.label}\n type=\"button\"\n aria-label={t.label}\n title={t.label}\n className={cn(emojiButtonClass, value === t.tone && 'bg-accent')}\n onClick={() => {\n onChange(t.tone);\n setOpen(false);\n }}\n >\n {t.swatch}\n </button>\n ))}\n </div>\n )}\n </div>\n );\n}\n","import { Smile } from 'lucide-react';\nimport { useState } from 'react';\nimport { cn } from '../../lib/cn';\nimport { Popover, PopoverContent, PopoverTrigger } from '../../lib/ui/popover';\nimport { EmojiPicker, type EmojiSelection } from './emoji-picker';\n\n/**\n * An \"insert emoji\" trigger that opens the {@link EmojiPicker} in a popover and\n * emits the resolved {@link EmojiSelection} on pick (closing the popover).\n *\n * @param props.onSelect - called with the resolved selection when an emoji is picked\n * @param props.className - extra classes for the trigger button\n * @param props.label - accessible label / tooltip (default \"Insert emoji\")\n * @param props.align - popover alignment (default \"start\")\n */\nexport function EmojiPickerButton({\n onSelect,\n className,\n label = 'Insert emoji',\n align = 'start'\n}: {\n onSelect: (selection: EmojiSelection) => void;\n className?: string;\n label?: string;\n align?: 'start' | 'center' | 'end';\n}) {\n const [open, setOpen] = useState(false);\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n aria-label={label}\n title={label}\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 className\n )}\n >\n <Smile className=\"h-3.5 w-3.5\" />\n </button>\n </PopoverTrigger>\n <PopoverContent align={align} className=\"w-auto p-2\">\n <EmojiPicker\n onSelect={(selection) => {\n onSelect(selection);\n setOpen(false);\n }}\n />\n </PopoverContent>\n </Popover>\n );\n}\n","import type { RefObject } from 'react';\nimport { composeTextEmoji } from '../../lib/emoji-data';\nimport { EmojiPickerButton } from './emoji-picker-button';\n\n/**\n * \"Insert emoji\" control for plain_text / mrkdwn fields. Opens the emoji picker\n * and inserts the Slack shortcode form (`:name:` or `:name::skin-tone-N:`) at\n * the target field's caret, preserving the rest of the text and restoring the\n * caret after the inserted shortcode. Slack renders these shortcodes for both\n * standard and workspace-custom emoji.\n *\n * @param props.targetRef - ref to the input or textarea receiving the emoji\n * @param props.value - the field's current text (source of truth)\n * @param props.onChange - called with the next text after insertion\n * @param props.className - extra classes for the trigger button\n * @param props.align - popover alignment (default \"end\")\n */\nexport function EmojiTextInsertButton({\n targetRef,\n value,\n onChange,\n className,\n align = 'end'\n}: {\n targetRef: RefObject<HTMLInputElement | HTMLTextAreaElement | null>;\n value: string;\n onChange: (next: string) => void;\n className?: string;\n align?: 'start' | 'center' | 'end';\n}) {\n return (\n <EmojiPickerButton\n align={align}\n label=\"Insert emoji\"\n className={className}\n onSelect={(sel) => {\n const el = targetRef.current;\n const insert = composeTextEmoji(sel.name, sel.skinTone ?? undefined);\n // Fall back to appending when the caret position is unknown (e.g. the\n // field was never focused). Reading selection on a blurred element is\n // well-supported and yields the last caret position.\n const start = el?.selectionStart ?? value.length;\n const end = el?.selectionEnd ?? value.length;\n const next = value.slice(0, start) + insert + value.slice(end);\n onChange(next);\n requestAnimationFrame(() => {\n if (el) {\n const caret = start + insert.length;\n el.focus();\n el.setSelectionRange(caret, caret);\n }\n });\n }}\n />\n );\n}\n","import { useRef } from 'react';\nimport { 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 { EmojiTextInsertButton } from '../emoji/emoji-text-insert-button';\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 const inputRef = useRef<HTMLInputElement>(null);\n const setText = (next: string) => onChange({ ...block, text: { type: 'plain_text', text: next, emoji: true } });\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 <div className=\"flex items-center gap-1.5\">\n <Input\n ref={inputRef}\n id=\"header-text\"\n value={text}\n maxLength={HEADER_MAX}\n placeholder=\"e.g. Weekly roundup\"\n onChange={(e) => setText(e.target.value)}\n />\n <EmojiTextInsertButton targetRef={inputRef} value={text} onChange={setText} className=\"shrink-0 border\" />\n </div>\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\n element={element}\n onChange={onChange}\n example={element.multiline ? 'e.g. Enter a longer description' : 'e.g. Enter some text'}\n />\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} example=\"e.g. name@example.com\" />\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} example=\"e.g. https://example.com\" />\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} example=\"e.g. 0\" />\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} example=\"e.g. Select a date\" />\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} example=\"e.g. Select a time\" />\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} example=\"e.g. Choose one\" />\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} example=\"e.g. Choose one or more\" />\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} example=\"e.g. Select a user\" />\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} example=\"e.g. Select users\" />\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} example=\"e.g. Select a channel\" />\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} example=\"e.g. Select channels\" />\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} example=\"e.g. Select a conversation\" />\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} example=\"e.g. Select conversations\" />\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} example=\"e.g. Choose one\" />\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} example=\"e.g. Choose one or more\" />\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} example=\"e.g. Type something\" />\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 *\n * `example` is shown as the input's own `placeholder` attribute so the\n * user gets a per-element-type hint about what to type. The element's\n * factory in `default-blocks.ts` intentionally ships without a default\n * `placeholder.text` so this hint and the live preview don't render the\n * same string twice when the editor first opens.\n *\n * @param props - props\n * @param props.element - the element being edited\n * @param props.onChange - called with the updated element\n * @param props.example - greyed-out hint shown in the editor input (not\n * stored on the block); defaults to a generic suggestion\n * @returns the rendered field\n */\nfunction PlaceholderField<\n T extends {\n placeholder?: { type: 'plain_text'; text: string; emoji?: boolean };\n }\n>({ element, onChange, example = 'e.g. Type a hint' }: { element: T; onChange: (next: T) => void; example?: string }) {\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 placeholder={example}\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 { useRef } from 'react';\nimport { Textarea } from '../../lib/ui/textarea';\nimport type { MarkdownBlock } from '../../types';\nimport { EmojiTextInsertButton } from '../emoji/emoji-text-insert-button';\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 const textRef = useRef<HTMLTextAreaElement>(null);\n const text = block.text ?? '';\n const setText = (next: string) => onChange({ ...block, text: next });\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 <div className=\"flex items-start gap-1.5\">\n <Textarea\n ref={textRef}\n id=\"markdown-text\"\n value={text}\n rows={8}\n placeholder=\"e.g. **Roadmap**\\n\\n- Item one\\n- Item two\"\n onChange={(e) => setText(e.target.value)}\n />\n <EmojiTextInsertButton targetRef={textRef} value={text} onChange={setText} className=\"mt-1 shrink-0 border\" />\n </div>\n </EditorField>\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 { PlanBlock, TaskCardBlock, TaskCardStatus } from '../../types';\nimport { EditorField } from './field';\nimport type { BlockEditorProps } from './types';\n\nconst STATUSES: readonly TaskCardStatus[] = ['pending', 'in_progress', 'complete', 'error'] as const;\n\n/**\n * Editor form for plan blocks. Edits the title and the inline tasks list.\n * Each task gets a compact title + status row; richer fields (sources,\n * details, output) round-trip on the payload but aren't editable inline —\n * use a standalone `task_card` block for those.\n * @param props - editor props\n * @param props.block - the plan block to edit\n * @param props.onChange - called with the updated block payload\n * @returns the rendered plan editor form\n */\nexport function PlanEditor({ block, onChange }: BlockEditorProps<PlanBlock>) {\n const titleText = typeof block.title === 'string' ? block.title : (block.title?.text ?? '');\n const tasks = block.tasks ?? [];\n\n const updateTask = (idx: number, change: Partial<TaskCardBlock>) => {\n onChange({\n ...block,\n tasks: tasks.map((t, i) => (i === idx ? { ...t, ...change } : t))\n });\n };\n const removeTask = (idx: number) => {\n const next = tasks.filter((_, i) => i !== idx);\n onChange({ ...block, tasks: next.length > 0 ? next : undefined });\n };\n const addTask = () => {\n onChange({\n ...block,\n tasks: [\n ...tasks,\n {\n type: 'task_card',\n task_id: `task_${nanoid(6)}`,\n title: 'New step',\n status: 'pending'\n }\n ]\n });\n };\n\n return (\n <div className=\"flex flex-col gap-4\">\n <EditorField label=\"Title\" help=\"Heading shown above the task list.\" htmlFor=\"plan-title\">\n <Input\n id=\"plan-title\"\n value={titleText}\n placeholder=\"e.g. Investigating the issue\"\n onChange={(e) => onChange({ ...block, title: e.target.value })}\n />\n </EditorField>\n\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\">Tasks</span>\n {tasks.length === 0 ? (\n <p className=\"text-[11px] leading-snug text-muted-foreground\">\n No tasks. Add one to render a checklist beneath the title.\n </p>\n ) : null}\n {tasks.map((task, idx) => {\n const status: TaskCardStatus = task.status ?? 'pending';\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\">Task {idx + 1}</span>\n <button\n type=\"button\"\n aria-label=\"Remove task\"\n onClick={() => removeTask(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=\"Title\" htmlFor={`plan-task-title-${idx}`}>\n <Input\n id={`plan-task-title-${idx}`}\n value={task.title}\n placeholder=\"e.g. Reproduce the error locally\"\n onChange={(e) => updateTask(idx, { title: e.target.value })}\n />\n </EditorField>\n <EditorField label=\"Status\">\n <RadioGroup\n value={status}\n onValueChange={(v) => updateTask(idx, { status: v as TaskCardStatus })}\n className=\"flex flex-row flex-wrap gap-3\"\n >\n {STATUSES.map((s) => (\n <div key={s} className=\"flex items-center gap-1.5\">\n <RadioGroupItem value={s} id={`plan-task-status-${idx}-${s}`} />\n <Label htmlFor={`plan-task-status-${idx}-${s}`} className=\"text-xs capitalize\">\n {s.replace('_', ' ')}\n </Label>\n </div>\n ))}\n </RadioGroup>\n </EditorField>\n </div>\n );\n })}\n <Button type=\"button\" size=\"sm\" onClick={addTask} className=\"self-start\">\n <Plus className=\"h-3.5 w-3.5\" /> Add task\n </Button>\n </div>\n </div>\n );\n}\n","import type { CustomEmoji } from '../types';\nimport { type EmojiIndex, getEmojiIndex, unifiedToUnicode } from './emoji-data';\nimport type { EmojiImportResolver } from './rich-text-tiptap';\n\n/**\n * Builds an {@link EmojiImportResolver} that resolves a Slack emoji element's\n * render-only attributes from the workspace custom emoji and the standard\n * `emoji-datasource` index:\n *\n * - A custom emoji with a `url` → `src` is the workspace image.\n * - A custom alias (no `url`) → resolve the glyph from the alias target.\n * - A standard emoji → `unicode` from the dataset (toned when `skin_tone` is\n * set), so the editor renders the glyph even before the payload carries one.\n *\n * Best-effort and synchronous: when the dataset isn't loaded yet it falls back\n * to whatever `unicode` the payload already specifies.\n *\n * @param customByName - workspace custom emoji keyed by codename\n * @param index - the emoji index (defaults to the cached one)\n * @returns an import resolver for `richTextToProseMirror`\n */\nexport function makeEmojiImportResolver(\n customByName: Map<string, CustomEmoji>,\n index: EmojiIndex | null = getEmojiIndex()\n): EmojiImportResolver {\n return (el) => {\n const name = el.name ?? '';\n const skinTone = el.skin_tone ?? null;\n const custom = customByName.get(name);\n if (custom?.url) {\n return { name, src: custom.url, unicode: null, skinTone };\n }\n const lookupName = custom?.alias ?? name;\n const datum = index?.byName.get(lookupName);\n let unicode = el.unicode ?? null;\n if (!unicode && datum) {\n const toned = skinTone ? datum.skinUnified[skinTone] : undefined;\n unicode = unifiedToUnicode(toned ?? datum.unified);\n }\n return { name, src: null, unicode, skinTone };\n };\n}\n","import type {\n AnyRichTextBlockElement,\n AnyRichTextSectionElement,\n RichTextBlock,\n RichTextSectionElementStyleWithCode,\n RichTextSectionLink\n} from 'slack-web-api-client';\nimport { sanitizeHref } from './url-safety';\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', 'emoji']);\n\nconst SUPPORTED_TEXT_STYLE_KEYS = new Set(['bold', 'italic', 'strike', 'underline', '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, emoji, plus\n * bold/italic/strike/underline/code marks and links). Anything else (mentions,\n * broadcasts, 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/** The Slack emoji element shape we read on import. */\ninterface SlackEmojiElement {\n type: 'emoji';\n name?: string;\n unicode?: string;\n skin_tone?: number;\n}\n\n/**\n * Resolves the render-only attributes (`src`, `unicode`) of a Slack emoji\n * element when importing into the WYSIWYG. Lets the editor inject a custom\n * emoji image (from `customEmojis`) and a glyph codepoint (from\n * `emoji-datasource`) without this module depending on either. Optional: when\n * omitted, emoji carry only what the payload already specifies.\n * @param el - the Slack emoji element\n * @returns the PM emoji node attrs\n */\nexport type EmojiImportResolver = (el: SlackEmojiElement) => {\n name: string;\n src: string | null;\n unicode: string | null;\n skinTone: number | null;\n};\n\nconst defaultEmojiResolver: EmojiImportResolver = (el) => ({\n name: el.name ?? '',\n src: null,\n unicode: el.unicode ?? null,\n skinTone: el.skin_tone ?? null\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 * @param resolveEmoji - optional resolver for emoji `src` / `unicode`\n * @returns a ProseMirror `doc` node\n */\nexport function richTextToProseMirror(\n block: RichTextBlock,\n resolveEmoji: EmojiImportResolver = defaultEmojiResolver\n): 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, resolveEmoji);\n continue;\n }\n listsByIndent.clear();\n const node = blockElementToPM(el, resolveEmoji);\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 resolveEmoji: EmojiImportResolver\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 ?? [], resolveEmoji) }]\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, resolveEmoji: EmojiImportResolver): PMNode | null {\n if (el.type === 'rich_text_section') {\n return {\n type: 'paragraph',\n content: inlinesToPM(el.elements ?? [], resolveEmoji)\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 ?? [], resolveEmoji)\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 * Pushes a Slack text run onto a ProseMirror inline array, converting any\n * embedded newlines into `hardBreak` nodes so they render as soft line\n * breaks in the editor (and round-trip back to `\\n` on export). A run of\n * N consecutive newlines becomes N hardBreaks, so blank lines (`\\n\\n`)\n * are preserved. Without this, a `\\n` inside a Slack text element would\n * become a literal newline character in a ProseMirror text node, which\n * the browser collapses to a space.\n * @param out - the inline array to append to\n * @param text - the Slack text run, possibly containing `\\n`\n * @param marks - marks to apply to each text segment\n */\nfunction pushTextWithHardBreaks(\n out: PMNode[],\n text: string,\n marks: { type: string; attrs?: Record<string, unknown> }[]\n) {\n const segments = text.split('\\n');\n segments.forEach((segment, i) => {\n if (i > 0) {\n out.push({ type: 'hardBreak' });\n }\n if (segment) {\n out.push({ type: 'text', text: segment, marks });\n }\n });\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 * @param resolveEmoji - resolver for emoji `src` / `unicode`\n * @returns the corresponding ProseMirror text nodes\n */\nfunction inlinesToPM(inlines: AnyRichTextSectionElement[], resolveEmoji: EmojiImportResolver): PMNode[] {\n const out: PMNode[] = [];\n for (const inline of inlines) {\n if (inline.type === 'text') {\n if (!inline.text) {\n continue;\n }\n pushTextWithHardBreaks(out, inline.text, styleToMarks(inline.style));\n } else if (inline.type === 'emoji') {\n const attrs = resolveEmoji(inline as SlackEmojiElement);\n if (!attrs.name) {\n continue;\n }\n out.push({ type: 'emoji', attrs });\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.underline) {\n marks.push({ type: 'underline' });\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 === 'emoji') {\n const name = String(node.attrs?.name ?? '');\n if (!name) {\n continue;\n }\n // Export keeps only Slack's fields: `name` (+ `skin_tone`). The\n // render-only `src` / `unicode` attrs are intentionally dropped.\n const emoji: AnyRichTextSectionElement = { type: 'emoji', name };\n const skinTone = node.attrs?.skinTone;\n if (typeof skinTone === 'number' && skinTone >= 2 && skinTone <= 6) {\n (emoji as { skin_tone?: number }).skin_tone = skinTone;\n }\n out.push(emoji);\n continue;\n }\n if (node.type === 'hardBreak') {\n // A soft line break (Shift+Enter) becomes a newline in the Slack\n // text stream. mergeAdjacentTextRuns folds this into neighbouring\n // unstyled runs, so \"a\" + <br> + \"b\" collapses to one \"a\\nb\" run.\n out.push({ type: 'text', text: '\\n' });\n continue;\n }\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 // TipTap's setLink/toggleLink already gate on isAllowedUri, but\n // a link mark can also enter the editor via setContent() (used\n // when seeding from a payload). Sanitize once more here so a\n // crafted Slack rich_text payload that already contains an unsafe\n // href cannot round-trip back out unchanged.\n const url = sanitizeHref(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 === 'underline') {\n style.underline = 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 { mergeAttributes, Node, type NodeViewProps, NodeViewWrapper, ReactNodeViewRenderer } from '@tiptap/react';\nimport { codepointsToGlyph } from './emoji-data';\n\n/**\n * Attributes carried by the inline {@link EmojiNode}. `src` (custom image) and\n * `unicode` (codepoints) are render-only; only `name` (+ `skinTone`) survive\n * export to Slack.\n */\nexport interface EmojiNodeAttrs {\n /** Slack codename, no colons (`wave`). */\n name: string;\n /** Workspace custom-emoji image URL, or null for a standard emoji. */\n src: string | null;\n /** Base Unicode codepoint(s), lowercased (`1f44b`), or null. */\n unicode: string | null;\n /** Slack `skin_tone` (2–6), or null. */\n skinTone: number | null;\n}\n\n/**\n * React NodeView for an emoji. Renders the workspace custom image when `src`\n * is present, otherwise the Unicode glyph (derived from `unicode`), falling\n * back to the `:name:` shortcode text when neither is available.\n * @param props - TipTap node-view props\n * @returns the rendered inline emoji\n */\nfunction EmojiNodeView({ node }: NodeViewProps) {\n const { name, src, unicode } = node.attrs as EmojiNodeAttrs;\n const label = `:${name}:`;\n return (\n <NodeViewWrapper as=\"span\" className=\"bk-emoji-node\" data-emoji={name} title={label}>\n {src ? (\n <img\n src={src}\n alt={label}\n style={{\n display: 'inline-block',\n width: '1.25em',\n height: '1.25em',\n verticalAlign: '-0.25em',\n objectFit: 'contain'\n }}\n />\n ) : (\n <span aria-label={label} role=\"img\">\n {unicode ? codepointsToGlyph(unicode) : label}\n </span>\n )}\n </NodeViewWrapper>\n );\n}\n\n/**\n * Inline, atomic TipTap node representing a Slack emoji. Backed by\n * {@link EmojiNodeView}. Serializes to a `<span data-emoji>` in HTML so\n * copy/paste keeps a recognizable marker, but the canonical round-trip is\n * through `rich-text-tiptap.ts`'s ProseMirror ⇄ Slack converter.\n */\nexport const EmojiNode = Node.create({\n name: 'emoji',\n group: 'inline',\n inline: true,\n atom: true,\n selectable: true,\n\n addAttributes() {\n return {\n name: { default: '' },\n src: { default: null },\n unicode: { default: null },\n skinTone: { default: null }\n };\n },\n\n parseHTML() {\n return [{ tag: 'span[data-emoji]' }];\n },\n\n renderHTML({ HTMLAttributes }: { HTMLAttributes: Record<string, unknown> }) {\n const name = (HTMLAttributes.name as string | undefined) ?? '';\n return ['span', mergeAttributes({ 'data-emoji': name }, HTMLAttributes), `:${name}:`];\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(EmojiNodeView);\n }\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 { isSafeHref } from '../../lib/url-safety';\nimport { EmojiPickerButton } from '../emoji/emoji-picker-button';\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', 'underline', '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 const urlValue = link.url ?? '';\n const urlIsUnsafe = urlValue.length > 0 && !isSafeHref(urlValue);\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={urlValue}\n placeholder=\"e.g. https://slack.com\"\n onChange={(e) => onChange({ ...link, url: e.target.value })}\n aria-invalid={urlIsUnsafe || undefined}\n />\n {urlIsUnsafe && (\n <p className=\"mt-1 text-[11px] text-destructive\">\n Only http(s), mailto, tel, sms, and xmpp links are allowed. This URL will be stripped before send and\n preview.\n </p>\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; skin_tone?: number };\n return (\n <EditorField\n label=\"Name\"\n help=\"Pick from the emoji list, or type a shortcode (without colons).\"\n htmlFor={`${idPrefix}-emoji`}\n >\n <div className=\"flex items-center gap-1.5\">\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 <EmojiPickerButton\n align=\"end\"\n label=\"Pick emoji\"\n className=\"shrink-0 border\"\n // Clear any stale `unicode` from the prior emoji so it can't\n // mismatch the newly-picked name; Slack recomputes the glyph from\n // `name` (+ `skin_tone`).\n onSelect={(sel) =>\n onChange({ ...emoji, name: sel.name, skin_tone: sel.skinTone ?? undefined, unicode: undefined })\n }\n />\n </div>\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 Underline,\n Undo2\n} from 'lucide-react';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type { RichTextBlock } from 'slack-web-api-client';\nimport { cn } from '../../lib/cn';\nimport { type EmojiIndex, loadEmojiIndex } from '../../lib/emoji-data';\nimport { makeEmojiImportResolver } from '../../lib/emoji-resolve';\nimport {\n detectLossy,\n type EmojiImportResolver,\n type LossyReason,\n proseMirrorToRichText,\n richTextToProseMirror\n} from '../../lib/rich-text-tiptap';\nimport { EmojiNode } from '../../lib/tiptap-emoji-node';\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 { hasExplicitSafeScheme, isSafeHref } from '../../lib/url-safety';\nimport { useCustomEmojis } from '../../state/custom-emoji-context';\nimport { EmojiPickerButton } from '../emoji/emoji-picker-button';\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 * Markdown input rules to keep enabled, keyed by extension name. Passing an\n * allowlist to TipTap's `enableInputRules` disables every other rule. We\n * keep the inline mark shortcuts (`**bold**`, `*italic*`, `~~strike~~`,\n * `` `code` ``) but drop the block-level conversions (ordered/bullet list,\n * blockquote, code block) so that typing literal line-start text like `2. `\n * or `- ` in a Slack message is never swallowed into a list/quote/code\n * block. All formatting stays available via the toolbar. TipTap's inline\n * Markdown syntax also differs from Slack's (`*` is italic here, bold in\n * Slack), so these shortcuts are a convenience, not a fidelity feature.\n */\nexport const RICH_TEXT_INPUT_RULE_ALLOWLIST = ['bold', 'italic', 'strike', 'code'];\n\n/**\n * Builds the TipTap extension set for the rich-text WYSIWYG editor. Kept as\n * a standalone factory (returning fresh instances per call) so the exact\n * production configuration can be exercised in tests.\n * @returns the configured TipTap extensions\n */\nexport function buildRichTextExtensions() {\n return [\n StarterKit.configure({\n heading: false,\n horizontalRule: false,\n // StarterKit bundles its own Link extension (enabled by default),\n // which would register a second, unconfigured `link` mark and a\n // duplicate autolinker alongside the hardened one we add below.\n // Disable it so our single, security-configured Link is the only\n // link extension in the schema.\n link: false\n }),\n EmojiNode,\n Link.configure({\n openOnClick: false,\n autolink: true,\n defaultProtocol: 'https',\n // Pin TipTap's link allowlist to the same set as our shared\n // `isSafeHref` helper. The upstream default also includes\n // ftp/cid/callto which we don't expect inside Slack content.\n protocols: ['http', 'https', 'mailto', 'tel', 'sms', 'xmpp'],\n // Belt-and-suspenders: even if a downstream contributor widens\n // `protocols` later, our isSafeHref guard rejects everything\n // outside the safe-link set. setLink and toggleLink both gate\n // on this hook before applying the mark.\n isAllowedUri: (url) => isSafeHref(url),\n // Only auto-link tokens that carry an explicit, safe scheme. TipTap's\n // default would link any `host.tld` (e.g. `2.xyz`, `report.zip`,\n // `logo.png`) because the suffix is a real gTLD, which is wrong for\n // free-form Slack message text. Deliberate links can still be added\n // via the link button.\n shouldAutoLink: hasExplicitSafeScheme,\n HTMLAttributes: { rel: 'noreferrer noopener', target: '_blank' }\n })\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 { byName: customByName } = useCustomEmojis();\n // Load the emoji dataset so import resolution can fill in glyph codepoints\n // for standard emoji. Held in state so the resolver rebuilds once loaded.\n const [emojiIndex, setEmojiIndex] = useState<EmojiIndex | null>(null);\n useEffect(() => {\n let active = true;\n loadEmojiIndex()\n .then((idx) => active && setEmojiIndex(idx))\n .catch(() => {});\n return () => {\n active = false;\n };\n }, []);\n const resolveEmoji = useMemo<EmojiImportResolver>(\n () => makeEmojiImportResolver(customByName, emojiIndex),\n [customByName, emojiIndex]\n );\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: buildRichTextExtensions(),\n enableInputRules: RICH_TEXT_INPUT_RULE_ALLOWLIST,\n content: richTextToProseMirror(block, resolveEmoji) as never,\n editorProps: {\n attributes: {\n class:\n 'bk-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, resolveEmoji) as never, {\n emitUpdate: false\n });\n }, [block, editor, resolveEmoji]);\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=\"Underline\"\n active={editor.isActive('underline')}\n onClick={() => editor.chain().focus().toggleUnderline().run()}\n Icon={Underline}\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 <EmojiPickerButton\n align=\"start\"\n onSelect={(sel) =>\n editor\n .chain()\n .focus()\n .insertContent({\n type: 'emoji',\n attrs: { name: sel.name, src: sel.src, unicode: sel.unicode, skinTone: sel.skinTone }\n })\n .run()\n }\n />\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 const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n if (open) {\n setUrl(currentHref);\n setError(null);\n }\n }, [open, currentHref]);\n\n const apply = () => {\n const trimmed = url.trim();\n if (!trimmed) {\n editor.chain().focus().unsetLink().run();\n setOpen(false);\n return;\n }\n if (!isSafeHref(trimmed)) {\n setError('Only http(s), mailto, tel, sms, and xmpp links are allowed.');\n return;\n }\n editor.chain().focus().extendMarkRange('link').setLink({ href: trimmed }).run();\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) => {\n setUrl(e.target.value);\n if (error) {\n setError(null);\n }\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n apply();\n }\n }}\n />\n {error && <p className=\"text-[11px] text-destructive\">{error}</p>}\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 { useRef } from 'react';\nimport 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 { EmojiTextInsertButton } from '../emoji/emoji-text-insert-button';\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 const textRef = useRef<HTMLTextAreaElement>(null);\n const setText = (next: string) => onChange({ ...block, text: { type: 'mrkdwn', text: next } });\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 <div className=\"flex items-start gap-1.5\">\n <Textarea\n ref={textRef}\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) => setText(e.target.value)}\n />\n <EmojiTextInsertButton targetRef={textRef} value={text} onChange={setText} className=\"mt-1 shrink-0 border\" />\n </div>\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 const labelRef = useRef<HTMLInputElement>(null);\n const setLabel = (next: string) => onChange({ ...button, text: { type: 'plain_text', text: next, emoji: true } });\n\n return (\n <div className=\"flex flex-col gap-3\">\n <EditorField label=\"Label\" htmlFor=\"section-acc-btn-label\">\n <div className=\"flex items-center gap-1.5\">\n <Input\n ref={labelRef}\n id=\"section-acc-btn-label\"\n value={label}\n placeholder=\"e.g. Learn more\"\n onChange={(e) => setLabel(e.target.value)}\n />\n <EmojiTextInsertButton targetRef={labelRef} value={label} onChange={setLabel} className=\"shrink-0 border\" />\n </div>\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 { Plus, Trash2 } from 'lucide-react';\nimport type { RichTextBlock } 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 type { TaskCardBlock, TaskCardStatus, UrlSourceElement } from '../../types';\nimport { EditorField } from './field';\nimport { RichTextEditor } from './rich-text-editor';\nimport type { BlockEditorProps } from './types';\n\nconst STATUSES: readonly TaskCardStatus[] = ['pending', 'in_progress', 'complete', 'error'] as const;\n\nconst EMPTY_RICH_TEXT: RichTextBlock = {\n type: 'rich_text',\n elements: [{ type: 'rich_text_section', elements: [{ type: 'text', text: '' }] }]\n};\n\n/**\n * Editor form for task_card blocks. Edits the task id, title, status,\n * the cited sources list, and the optional rich-text `details` and\n * `output` fields. Details and output are togglable — adding one swaps\n * in an empty rich_text block; removing one drops the field from the\n * payload.\n * @param props - editor props\n * @param props.block - the task_card block to edit\n * @param props.onChange - called with the updated block payload\n * @returns the rendered task_card editor form\n */\nexport function TaskCardEditor({ block, onChange }: BlockEditorProps<TaskCardBlock>) {\n const status: TaskCardStatus = block.status ?? 'pending';\n return (\n <div className=\"flex flex-col gap-4\">\n <EditorField label=\"Title\" help=\"Title of the task in plain text.\" htmlFor=\"task-card-title\">\n <Input\n id=\"task-card-title\"\n value={block.title}\n placeholder=\"e.g. Reproduce the bug locally\"\n onChange={(e) => onChange({ ...block, title: e.target.value })}\n />\n </EditorField>\n\n <EditorField label=\"Task ID\" help=\"ID for the task.\" htmlFor=\"task-card-id\">\n <Input\n id=\"task-card-id\"\n value={block.task_id}\n placeholder=\"e.g. task_1\"\n onChange={(e) => onChange({ ...block, task_id: e.target.value })}\n />\n </EditorField>\n\n <EditorField label=\"Status\" help='The state of a task. Can be \"pending\", \"in_progress\", \"complete\", or \"error\".'>\n <RadioGroup\n value={status}\n onValueChange={(v) => onChange({ ...block, status: v as TaskCardStatus })}\n className=\"flex flex-row flex-wrap gap-3\"\n >\n {STATUSES.map((s) => (\n <div key={s} className=\"flex items-center gap-1.5\">\n <RadioGroupItem value={s} id={`task-card-status-${s}`} />\n <Label htmlFor={`task-card-status-${s}`} className=\"text-xs capitalize\">\n {s.replace('_', ' ')}\n </Label>\n </div>\n ))}\n </RadioGroup>\n </EditorField>\n\n <RichTextField\n label=\"Details\"\n help=\"Details of the task in the form of a single rich_text entity.\"\n value={block.details}\n onChange={(next) => onChange({ ...block, details: next })}\n />\n\n <RichTextField\n label=\"Output\"\n help=\"Output of the task in the form of a single rich_text entity.\"\n value={block.output}\n onChange={(next) => onChange({ ...block, output: next })}\n />\n\n <SourcesField\n sources={block.sources ?? []}\n onChange={(next) => onChange({ ...block, sources: next.length > 0 ? next : undefined })}\n />\n </div>\n );\n}\n\n/**\n * Sub-editor for an optional rich-text field on the task card (`details`\n * or `output`). When the field is unset, renders an \"Add\" button that\n * swaps in an empty rich_text block; once set, renders the standard\n * {@link RichTextEditor} plus a remove affordance.\n * @param props - field props\n * @param props.label - visible label for the field\n * @param props.help - one-line helper text\n * @param props.value - the current rich_text payload, if any\n * @param props.onChange - called with the new payload or `undefined`\n * @returns the rendered field\n */\nfunction RichTextField({\n label,\n help,\n value,\n onChange\n}: {\n label: string;\n help?: string;\n value: RichTextBlock | undefined;\n onChange: (next: RichTextBlock | undefined) => void;\n}) {\n if (!value) {\n return (\n <div className=\"flex flex-col gap-1.5\">\n <Label>{label}</Label>\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n className=\"self-start\"\n onClick={() => onChange(EMPTY_RICH_TEXT)}\n >\n <Plus className=\"h-3.5 w-3.5\" /> Add {label.toLowerCase()}\n </Button>\n {help && <p className=\"text-[11px] leading-snug text-muted-foreground\">{help}</p>}\n </div>\n );\n }\n return (\n <div className=\"flex flex-col gap-1.5\">\n <div className=\"flex items-center justify-between\">\n <Label>{label}</Label>\n <button\n type=\"button\"\n aria-label={`Remove ${label.toLowerCase()}`}\n onClick={() => onChange(undefined)}\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 <RichTextEditor block={value} onChange={onChange} />\n {help && <p className=\"text-[11px] leading-snug text-muted-foreground\">{help}</p>}\n </div>\n );\n}\n\n/**\n * Sub-editor for the task card's `sources` list. Each source is a\n * `{ text, url }` pair Slack renders as a labeled link beneath the card.\n * @param props - field props\n * @param props.sources - the current sources list\n * @param props.onChange - called with the updated sources list\n * @returns the rendered sources editor\n */\nfunction SourcesField({\n sources,\n onChange\n}: {\n sources: UrlSourceElement[];\n onChange: (next: UrlSourceElement[]) => void;\n}) {\n const update = (idx: number, change: Partial<UrlSourceElement>) => {\n onChange(sources.map((s, i) => (i === idx ? { ...s, ...change } : s)));\n };\n const removeAt = (idx: number) => onChange(sources.filter((_, i) => i !== idx));\n const addSource = () => {\n onChange([...sources, { type: 'url', url: '', text: '' }]);\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\">Sources</span>\n <p className=\"text-[11px] leading-snug text-muted-foreground\">\n Array of URL source elements used to generate a response.\n </p>\n {sources.map((src, 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\">Source {idx + 1}</span>\n <button\n type=\"button\"\n aria-label=\"Remove source\"\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={`task-card-source-text-${idx}`}>\n <Input\n id={`task-card-source-text-${idx}`}\n value={src.text}\n placeholder=\"e.g. Runbook\"\n onChange={(e) => update(idx, { text: e.target.value })}\n />\n </EditorField>\n <EditorField label=\"URL\" htmlFor={`task-card-source-url-${idx}`}>\n <Input\n id={`task-card-source-url-${idx}`}\n type=\"url\"\n value={src.url}\n placeholder=\"e.g. https://example.com/runbook\"\n onChange={(e) => update(idx, { url: e.target.value })}\n />\n </EditorField>\n </div>\n ))}\n <Button type=\"button\" size=\"sm\" onClick={addSource} className=\"self-start\">\n <Plus className=\"h-3.5 w-3.5\" /> Add source\n </Button>\n </div>\n );\n}\n","import { Input } from '../../lib/ui/input';\nimport { Textarea } from '../../lib/ui/textarea';\nimport type { VideoBlock } from '../../types';\nimport { EditorField } from './field';\nimport type { BlockEditorProps } from './types';\n\n/**\n * Editor form for video blocks. Edits the title, alt text, thumbnail/video\n * URLs, and optional provider/author/description metadata. Sending a video\n * block from Slack requires the `links.embed:write` OAuth scope and a\n * `video_url` inside the app's configured unfurl domains — the builder\n * does not enforce that here; it just edits the payload.\n * @param props - editor props\n * @param props.block - the video block to edit\n * @param props.onChange - called with the updated block payload\n * @returns the rendered video editor form\n */\nexport function VideoEditor({ block, onChange }: BlockEditorProps<VideoBlock>) {\n return (\n <div className=\"flex flex-col gap-4\">\n <EditorField label=\"Title\" help=\"Up to 199 characters. Shown above the embedded player.\" htmlFor=\"video-title\">\n <Input\n id=\"video-title\"\n value={block.title?.text ?? ''}\n maxLength={199}\n placeholder=\"e.g. Product demo\"\n onChange={(e) =>\n onChange({\n ...block,\n title: { type: 'plain_text', text: e.target.value, emoji: true }\n })\n }\n />\n </EditorField>\n\n <EditorField label=\"Alt text\" help=\"Tooltip for the video. Required for accessibility.\" htmlFor=\"video-alt\">\n <Input\n id=\"video-alt\"\n value={block.alt_text ?? ''}\n placeholder=\"e.g. A short walkthrough of the new release\"\n onChange={(e) => onChange({ ...block, alt_text: e.target.value })}\n />\n </EditorField>\n\n <EditorField\n label=\"Video URL\"\n help=\"HTTPS embed URL. Must match an unfurl domain on your Slack app.\"\n htmlFor=\"video-url\"\n >\n <Input\n id=\"video-url\"\n type=\"url\"\n value={block.video_url ?? ''}\n placeholder=\"e.g. https://www.youtube.com/embed/dQw4w9WgXcQ\"\n onChange={(e) => onChange({ ...block, video_url: e.target.value })}\n />\n </EditorField>\n\n <EditorField label=\"Thumbnail URL\" help=\"Preview image shown before the video loads.\" htmlFor=\"video-thumbnail\">\n <Input\n id=\"video-thumbnail\"\n type=\"url\"\n value={block.thumbnail_url ?? ''}\n placeholder=\"e.g. https://example.com/thumb.png\"\n onChange={(e) => onChange({ ...block, thumbnail_url: e.target.value })}\n />\n </EditorField>\n\n <EditorField\n label=\"Title link URL\"\n help=\"Optional. HTTPS link the title text opens (the non-embed page).\"\n htmlFor=\"video-title-url\"\n >\n <Input\n id=\"video-title-url\"\n type=\"url\"\n value={block.title_url ?? ''}\n placeholder=\"e.g. https://www.youtube.com/watch?v=dQw4w9WgXcQ\"\n onChange={(e) => onChange({ ...block, title_url: e.target.value || undefined })}\n />\n </EditorField>\n\n <EditorField label=\"Description\" help=\"Optional. Up to 199 characters.\" htmlFor=\"video-description\">\n <Textarea\n id=\"video-description\"\n value={block.description?.text ?? ''}\n maxLength={199}\n rows={2}\n placeholder=\"e.g. A short walkthrough of the new release.\"\n onChange={(e) =>\n onChange({\n ...block,\n description: e.target.value ? { type: 'plain_text', text: e.target.value, emoji: true } : undefined\n })\n }\n />\n </EditorField>\n\n <EditorField label=\"Author name\" help=\"Optional. Up to 49 characters.\" htmlFor=\"video-author\">\n <Input\n id=\"video-author\"\n value={block.author_name ?? ''}\n maxLength={49}\n placeholder=\"e.g. Acme\"\n onChange={(e) => onChange({ ...block, author_name: e.target.value || undefined })}\n />\n </EditorField>\n\n <EditorField\n label=\"Provider name\"\n help=\"Optional. Originating service (e.g. YouTube, Vimeo).\"\n htmlFor=\"video-provider-name\"\n >\n <Input\n id=\"video-provider-name\"\n value={block.provider_name ?? ''}\n placeholder=\"e.g. YouTube\"\n onChange={(e) => onChange({ ...block, provider_name: e.target.value || undefined })}\n />\n </EditorField>\n\n <EditorField\n label=\"Provider icon URL\"\n help=\"Optional. Small icon shown next to the provider name.\"\n htmlFor=\"video-provider-icon\"\n >\n <Input\n id=\"video-provider-icon\"\n type=\"url\"\n value={block.provider_icon_url ?? ''}\n placeholder=\"e.g. https://example.com/youtube-favicon.png\"\n onChange={(e) => onChange({ ...block, provider_icon_url: e.target.value || undefined })}\n />\n </EditorField>\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 ContainerBlock,\n ContextActionsBlock,\n DataVisualizationBlock,\n InputBlock,\n MarkdownBlock,\n PlanBlock,\n SupportedBlock,\n SupportedBlockType,\n TableBlock,\n TaskCardBlock,\n VideoBlock\n} from '../../types';\nimport { ActionsEditor } from './actions-editor';\nimport { AlertEditor } from './alert-editor';\nimport { CardEditor } from './card-editor';\nimport { CarouselEditor } from './carousel-editor';\nimport { ContainerEditor } from './container-editor';\nimport { ContextActionsEditor } from './context-actions-editor';\nimport { ContextEditor } from './context-editor';\nimport { DataVisualizationEditor } from './data-visualization-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 { PlanEditor } from './plan-editor';\nimport { RichTextEditor } from './rich-text-editor';\nimport { SectionEditor } from './section-editor';\nimport { TableEditor } from './table-editor';\nimport { TaskCardEditor } from './task-card-editor';\nimport { VideoEditor } from './video-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 case 'video':\n return <VideoEditor block={block as VideoBlock} onChange={(next) => onChange(next)} />;\n case 'plan':\n return <PlanEditor block={block as PlanBlock} onChange={(next) => onChange(next)} />;\n case 'task_card':\n return <TaskCardEditor block={block as TaskCardBlock} onChange={(next) => onChange(next)} />;\n case 'data_visualization':\n return <DataVisualizationEditor block={block as DataVisualizationBlock} onChange={(next) => onChange(next)} />;\n case 'container':\n return <ContainerEditor block={block as ContainerBlock} onChange={(next) => onChange(next)} />;\n default:\n return null;\n }\n}\n","import 'slack-blocks-to-jsx/dist/style.css';\n\nimport { useEffect, useMemo, useRef } from 'react';\nimport type { Block } from 'slack-blocks-to-jsx';\nimport { Message } from 'slack-blocks-to-jsx';\nimport { sanitizeBlock } from '../../lib/sanitize-blocks';\nimport { isSafeHref, isSafeImageSrc } from '../../lib/url-safety';\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 const rootRef = useRef<HTMLDivElement>(null);\n\n // Strip dangerous URI schemes (`javascript:`, `data:text/html`, etc.)\n // from every `url`/`image_url` field in the block before handing it\n // to slack-blocks-to-jsx, which renders rich-text links, button URLs,\n // and image sources directly into `<a href>` / `<img src>` without\n // its own scheme filter. Memoized so an unchanged block keeps the\n // same reference and doesn't churn the renderer.\n const safeBlock = useMemo(() => sanitizeBlock(block), [block]);\n\n // slack-blocks-to-jsx renders an SVG-only collapse toggle in image and\n // video blocks without an aria-label, which violates axe's `button-name`\n // rule and is unreachable to screen readers. Post-mount we add a label\n // to any such buttons we find under our wrapper. We also do a final\n // pass to neutralize any `<a href>` or `<img src>` that carries a\n // disallowed URI scheme — the block-payload sanitizer catches URLs\n // that live in structured fields (`url`, `image_url`), but mrkdwn /\n // rich-text content can encode link URLs inside text strings\n // (`[label](javascript:...)` or `<javascript:...|label>`) that\n // `slack-blocks-to-jsx`'s own parser hands straight to `<a href>`\n // without filtering. React 19 also blocks `javascript:` URLs at\n // setAttribute time, but we don't rely on that — this loop applies\n // our allowlist (which is tighter and covers `data:`/`vbscript:`/`file:`\n // as well) and replaces unsafe values with `#`.\n useEffect(() => {\n const root = rootRef.current;\n if (!root) return;\n for (const wrapper of root.querySelectorAll<HTMLElement>(\n '.slack_blocks_to_jsx__image_media_trigger, .slack_blocks_to_jsx__video_title'\n )) {\n for (const btn of wrapper.querySelectorAll<HTMLButtonElement>('button:not([aria-label])')) {\n const title = wrapper.querySelector('.slack_blocks_to_jsx__image_title')?.textContent?.trim();\n btn.setAttribute('aria-label', title ? `Toggle ${title}` : 'Toggle media');\n }\n }\n for (const a of root.querySelectorAll<HTMLAnchorElement>('a[href]')) {\n const href = a.getAttribute('href');\n if (!isSafeHref(href)) {\n a.setAttribute('href', '#');\n a.setAttribute('data-bk-blocked-href', '1');\n }\n }\n for (const img of root.querySelectorAll<HTMLImageElement>('img[src]')) {\n const src = img.getAttribute('src');\n if (!isSafeImageSrc(src)) {\n img.removeAttribute('src');\n img.setAttribute('data-bk-blocked-src', '1');\n }\n }\n });\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 ref={rootRef} 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={[safeBlock 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, ArrowDown, ArrowUp, Copy, 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 video: 'Video',\n plan: 'Plan',\n task_card: 'Task Card',\n data_visualization: 'Data Visualization',\n container: 'Container'\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. The row itself is the drag handle\n * (Slack Block Builder pattern) — clicks under the 4px activation\n * distance still open the editor. Hover surfaces a faint outline plus a\n * floating toolbar (edit, 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 index,\n total,\n onReorder,\n isPaletteDrag = false\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 /** Zero-based index of this row in the surface; powers move up/down. */\n index?: number;\n /** Total number of rows on the surface; powers move up/down. */\n total?: number;\n /** Move this row to a new index. Wires up the keyboard-accessible move buttons. */\n onReorder?: (id: string, toIndex: number) => void;\n /** True while a palette item is being dragged (vs. reordering an existing block). */\n isPaletteDrag?: boolean;\n}) {\n const { attributes, listeners, setNodeRef, transform, transition, isDragging, isOver } = useSortable({\n id: builderBlock.id\n });\n // The Popover trigger needs an explicit `role`/`tabIndex` on the div so\n // biome's a11y check accepts `aria-label`; dnd-kit's `attributes` also\n // sets those, so pull them off the spread to avoid TS's\n // duplicate-prop warning. The values match (button / 0), so behavior\n // is unchanged.\n const { role: _dndRole, tabIndex: _dndTabIndex, ...sortableA11yAttrs } = attributes;\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 // Show the insertion bar only for palette drags; sortable reorders\n // already get strong feedback from verticalListSortingStrategy.\n const showDropIndicator = isPaletteDrag && isOver;\n\n const preview = <SlackBlockPreview block={builderBlock.block} hooks={previewHooks} theme={previewTheme} />;\n\n return (\n <div\n ref={setNodeRef}\n style={style}\n className={cn('group relative mb-2 last:mb-0 hover:z-10 md:mb-0', isDragging && 'opacity-40')}\n >\n {showDropIndicator ? (\n <div\n aria-hidden=\"true\"\n className=\"-top-1 pointer-events-none absolute right-0 left-0 z-20 h-0.5 rounded-full bg-primary\"\n >\n <span className=\"-left-1 -top-[3px] absolute h-2 w-2 rounded-full bg-primary shadow-[0_0_0_2px_var(--color-background)]\" />\n </div>\n ) : null}\n <div className=\"relative w-full\">\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 {...attributes}\n {...listeners}\n className={cn(\n 'block w-full cursor-grab rounded-sm border-0 bg-transparent p-0 text-left transition-shadow hover:shadow-md focus-visible:ring-1 focus-visible:ring-ring active:cursor-grabbing',\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 {...sortableA11yAttrs}\n {...listeners}\n onKeyDown={(e) => {\n // The div trigger is keyboard-activatable via role=\"button\" + tabIndex=0,\n // but Space on a non-button element scrolls the page by default. Toggle the\n // popover ourselves on Enter/Space and swallow the event so the page stays put.\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onOpenChange?.(!isOpen);\n }\n }}\n className={cn(\n 'block w-full cursor-grab rounded-sm transition-shadow hover:shadow-md focus-visible:ring-1 focus-visible:ring-ring active:cursor-grabbing',\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-[min(32rem,calc(100vw-1.5rem))] sm: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 hidden bg-background px-1.5 text-[11px] text-muted-foreground opacity-0 transition-opacity group-hover:opacity-100 md:block\">\n {BLOCK_TYPE_LABELS[builderBlock.block.type]}\n </span>\n {/* Desktop action toolbar. Hover-reveal floating above the block —\n crowded but only one is visible at a time so the overlap is\n invisible. Hidden on mobile in favor of the inline row below. */}\n <div\n className={cn(\n // Hidden on mobile in favor of the inline row below; on desktop\n // reveal on hover, on focus inside the row (so Tab-stops on the\n // floating buttons themselves keep them visible), and when there\n // are validation errors worth surfacing immediately.\n 'absolute -top-3 right-2 z-10 hidden items-center gap-0.5 rounded-md border bg-background p-0.5 shadow-sm transition-opacity md:flex',\n hasErrors ? 'opacity-100' : 'opacity-0 group-hover:opacity-100 group-focus-within: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 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\"\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 {onReorder && typeof index === 'number' && typeof total === 'number' ? (\n <>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n aria-label=\"Move block up\"\n disabled={index === 0}\n onClick={() => onReorder(builderBlock.id, index - 1)}\n className=\"flex h-6 w-6 items-center justify-center rounded text-muted-foreground hover:bg-accent hover:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-40 disabled:hover:bg-transparent disabled:hover:text-muted-foreground\"\n >\n <ArrowUp className=\"h-3.5 w-3.5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"top\">Move up</TooltipContent>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n aria-label=\"Move block down\"\n disabled={index >= total - 1}\n onClick={() => onReorder(builderBlock.id, index + 1)}\n className=\"flex h-6 w-6 items-center justify-center rounded text-muted-foreground hover:bg-accent hover:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-40 disabled:hover:bg-transparent disabled:hover:text-muted-foreground\"\n >\n <ArrowDown className=\"h-3.5 w-3.5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"top\">Move down</TooltipContent>\n </Tooltip>\n </>\n ) : null}\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 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\"\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 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\"\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 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\"\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 {/* Mobile-only inline action bar. Lives in the flow under the block\n preview so it never overlaps content (the floating desktop bar\n gets in its own way when every row shows it). Type label sits on\n the left, action triplet on the right. */}\n <div className=\"mt-1 flex items-center justify-between gap-2 rounded-md border border-dashed bg-muted/40 px-2 py-1 md:hidden\">\n <span className=\"truncate text-[11px] font-medium text-muted-foreground\">\n {BLOCK_TYPE_LABELS[builderBlock.block.type]}\n </span>\n <div className=\"flex items-center gap-1\">\n {hasErrors ? (\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-9 w-9 items-center justify-center rounded text-destructive hover:bg-destructive/10\"\n >\n <AlertTriangle className=\"h-4 w-4\" />\n </button>\n ) : null}\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-9 w-9 items-center justify-center rounded text-muted-foreground hover:bg-accent hover:text-foreground\"\n >\n <Pencil className=\"h-4 w-4\" />\n </button>\n <button\n type=\"button\"\n aria-label=\"Duplicate block\"\n onClick={() => onDuplicate(builderBlock.id)}\n className=\"flex h-9 w-9 items-center justify-center rounded text-muted-foreground hover:bg-accent hover:text-foreground\"\n >\n <Copy className=\"h-4 w-4\" />\n </button>\n <button\n type=\"button\"\n aria-label=\"Delete block\"\n onClick={() => onDelete(builderBlock.id)}\n className=\"flex h-9 w-9 items-center justify-center rounded text-muted-foreground hover:bg-destructive/10 hover:text-destructive\"\n >\n <Trash2 className=\"h-4 w-4\" />\n </button>\n </div>\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, useSortable, verticalListSortingStrategy } from '@dnd-kit/sortable';\nimport { CSS } from '@dnd-kit/utilities';\nimport { AlertTriangle, ArrowDown, ArrowUp, Copy, Pencil, Trash2 } from 'lucide-react';\nimport { cn } from '../lib/cn';\nimport { containerBodyId } from '../lib/container-blocks';\nimport { Popover, PopoverContent, PopoverTrigger } from '../lib/ui/popover';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '../lib/ui/tooltip';\nimport type { BuilderBlock, ContainerBlock, PreviewHooks, PreviewTheme, SupportedBlock } from '../types';\nimport { BlockRow } from './block-row';\nimport { BlockEditor } from './editors/block-editor';\n\n/**\n * A top-level row for a `container` block. Unlike a leaf {@link BlockRow},\n * the container renders its own Slack-style chrome (icon / title / subtitle)\n * plus a nested, droppable list of its child blocks — so users can drag\n * blocks from the palette or the canvas straight into the container, and\n * reorder or pull them back out. The header is the drag handle and opens the\n * container's field editor; the body is a separate drop zone.\n * @param props - row props\n * @returns the rendered container row\n */\nexport function ContainerRow({\n builderBlock,\n previewHooks,\n previewTheme,\n errorsByBlockId,\n openBlockId,\n onOpenBlockChange,\n onUpdate,\n onDuplicate,\n onDelete,\n onReorder,\n index,\n total,\n isPaletteDrag = false\n}: {\n builderBlock: BuilderBlock;\n previewHooks?: PreviewHooks;\n previewTheme?: PreviewTheme;\n errorsByBlockId?: Map<string, string[]>;\n openBlockId?: string | null;\n onOpenBlockChange?: (id: string | null) => void;\n onUpdate: (id: string, block: SupportedBlock) => void;\n onDuplicate: (id: string) => void;\n onDelete: (id: string) => void;\n onReorder?: (id: string, toIndex: number) => void;\n index?: number;\n total?: number;\n isPaletteDrag?: boolean;\n}) {\n const { id } = builderBlock;\n const block = builderBlock.block as ContainerBlock;\n const children = builderBlock.children ?? [];\n const errors = errorsByBlockId?.get(id);\n const hasErrors = !!errors && errors.length > 0;\n const isOpen = openBlockId === id;\n\n const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({ id });\n const { role: _dndRole, tabIndex: _dndTabIndex, ...sortableA11yAttrs } = attributes;\n const { setNodeRef: setBodyRef, isOver: isBodyOver } = useDroppable({ id: containerBodyId(id) });\n\n const style = { transform: CSS.Transform.toString(transform), transition };\n const icon = block.icon && 'image_url' in block.icon ? block.icon.image_url : undefined;\n\n return (\n <div\n ref={setNodeRef}\n style={style}\n className={cn('group/container relative mb-2 last:mb-0 hover:z-10', isDragging && 'opacity-40')}\n >\n <div\n className={cn(\n 'overflow-hidden rounded-md border bg-card transition-shadow',\n hasErrors ? 'border-destructive/60' : 'border-border'\n )}\n >\n {/* Header — drag handle + click-to-edit the container's fields. */}\n <Popover open={isOpen} onOpenChange={(open) => onOpenBlockChange?.(open ? id : null)}>\n <PopoverTrigger asChild>\n <div\n role=\"button\"\n tabIndex={0}\n aria-label=\"Edit container\"\n {...sortableA11yAttrs}\n {...listeners}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onOpenBlockChange?.(!isOpen ? id : null);\n }\n }}\n className=\"flex w-full cursor-grab items-center gap-2 border-b bg-muted/40 px-3 py-2 text-left transition-colors hover:bg-muted active:cursor-grabbing\"\n >\n {icon ? (\n <img src={icon} alt=\"\" aria-hidden=\"true\" className=\"h-5 w-5 shrink-0 rounded object-cover\" />\n ) : null}\n <span className=\"flex min-w-0 flex-col\">\n <span className=\"truncate text-xs font-semibold text-foreground\">\n {block.title?.text || 'Container'}\n </span>\n {block.subtitle?.text ? (\n <span className=\"truncate text-[11px] text-muted-foreground\">{block.subtitle.text}</span>\n ) : null}\n </span>\n <span className=\"ml-auto shrink-0 text-[10px] font-medium uppercase tracking-wide text-muted-foreground\">\n Container\n </span>\n </div>\n </PopoverTrigger>\n <PopoverContent className=\"w-[min(32rem,calc(100vw-1.5rem))] sm:w-[32rem]\" align=\"start\">\n <BlockEditor block={block} errors={errors} onChange={(next) => onUpdate(id, next)} />\n </PopoverContent>\n </Popover>\n\n {/* Body — the child drop zone. */}\n <div\n ref={setBodyRef}\n className={cn(\n 'flex flex-col gap-2 p-3 transition-colors',\n isPaletteDrag && 'outline-2 -outline-offset-2 outline-dashed outline-primary/40',\n isPaletteDrag && isBodyOver && 'bg-primary/5'\n )}\n >\n {children.length === 0 ? (\n <div\n className={cn(\n 'flex items-center justify-center rounded-md border border-dashed px-3 py-6 text-center text-[11px] transition-colors',\n isBodyOver ? 'border-primary/60 text-primary' : 'border-border text-muted-foreground'\n )}\n >\n Drag blocks here\n </div>\n ) : (\n <SortableContext items={children.map((c) => c.id)} strategy={verticalListSortingStrategy}>\n {children.map((child, idx) => (\n <BlockRow\n key={child.id}\n builderBlock={child}\n previewHooks={previewHooks}\n previewTheme={previewTheme}\n errors={errorsByBlockId?.get(child.id)}\n isOpen={openBlockId === child.id}\n onOpenChange={(open) => onOpenBlockChange?.(open ? child.id : null)}\n onUpdate={onUpdate}\n onDuplicate={onDuplicate}\n onDelete={onDelete}\n index={idx}\n total={children.length}\n onReorder={onReorder}\n isPaletteDrag={isPaletteDrag}\n />\n ))}\n {isPaletteDrag && isBodyOver ? <DropIndicator /> : null}\n </SortableContext>\n )}\n </div>\n </div>\n\n {/* Hover toolbar — edit / duplicate / delete / move, mirroring BlockRow. */}\n <div\n className={cn(\n 'absolute -top-3 right-2 z-10 hidden items-center gap-0.5 rounded-md border bg-background p-0.5 shadow-sm transition-opacity md:flex',\n hasErrors\n ? 'opacity-100'\n : 'opacity-0 group-hover/container:opacity-100 group-focus-within/container: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={() => onOpenBlockChange?.(id)}\n className=\"flex h-6 w-6 items-center justify-center rounded text-destructive hover:bg-destructive/10 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\"\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 {onReorder && typeof index === 'number' && typeof total === 'number' ? (\n <>\n <ToolbarButton label=\"Move up\" disabled={index === 0} onClick={() => onReorder(id, index - 1)}>\n <ArrowUp className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n <ToolbarButton label=\"Move down\" disabled={index >= total - 1} onClick={() => onReorder(id, index + 1)}>\n <ArrowDown className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n </>\n ) : null}\n <ToolbarButton label=\"Edit\" onClick={() => onOpenBlockChange?.(id)}>\n <Pencil className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n <ToolbarButton label=\"Duplicate\" onClick={() => onDuplicate(id)}>\n <Copy className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n <ToolbarButton label=\"Delete\" destructive onClick={() => onDelete(id)}>\n <Trash2 className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n </div>\n\n {/* Mobile inline action bar. */}\n <div className=\"mt-1 flex items-center justify-between gap-2 rounded-md border border-dashed bg-muted/40 px-2 py-1 md:hidden\">\n <span className=\"truncate text-[11px] font-medium text-muted-foreground\">Container</span>\n <div className=\"flex items-center gap-1\">\n <button\n type=\"button\"\n aria-label=\"Edit container\"\n onClick={() => onOpenBlockChange?.(id)}\n className=\"flex h-9 w-9 items-center justify-center rounded text-muted-foreground hover:bg-accent hover:text-foreground\"\n >\n <Pencil className=\"h-4 w-4\" />\n </button>\n <button\n type=\"button\"\n aria-label=\"Duplicate container\"\n onClick={() => onDuplicate(id)}\n className=\"flex h-9 w-9 items-center justify-center rounded text-muted-foreground hover:bg-accent hover:text-foreground\"\n >\n <Copy className=\"h-4 w-4\" />\n </button>\n <button\n type=\"button\"\n aria-label=\"Delete container\"\n onClick={() => onDelete(id)}\n className=\"flex h-9 w-9 items-center justify-center rounded text-muted-foreground hover:bg-destructive/10 hover:text-destructive\"\n >\n <Trash2 className=\"h-4 w-4\" />\n </button>\n </div>\n </div>\n </div>\n );\n}\n\n/** Compact icon button used in the container's hover toolbar. */\nfunction ToolbarButton({\n label,\n onClick,\n disabled,\n destructive,\n children\n}: {\n label: string;\n onClick: () => void;\n disabled?: boolean;\n destructive?: boolean;\n children: React.ReactNode;\n}) {\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n aria-label={label}\n disabled={disabled}\n onClick={onClick}\n className={cn(\n 'flex h-6 w-6 items-center justify-center rounded text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-40',\n destructive ? 'hover:bg-destructive/10 hover:text-destructive' : 'hover:bg-accent hover:text-foreground'\n )}\n >\n {children}\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"top\">{label}</TooltipContent>\n </Tooltip>\n );\n}\n\n/** Insertion bar shown at the end of the container body while dragging in. */\nfunction DropIndicator() {\n return (\n <div aria-hidden=\"true\" className=\"pointer-events-none relative my-1 h-0.5 w-full rounded-full bg-primary\">\n <span className=\"-left-1 -top-[3px] absolute h-2 w-2 rounded-full bg-primary shadow-[0_0_0_2px_var(--color-background)]\" />\n </div>\n );\n}\n","import { useDroppable } from '@dnd-kit/core';\nimport { SortableContext, verticalListSortingStrategy } from '@dnd-kit/sortable';\nimport { LayoutGrid, Plus, X } from 'lucide-react';\nimport type { ReactNode } from 'react';\nimport { cn } from '../lib/cn';\nimport { isSafeImageSrc } from '../lib/url-safety';\nimport type { BuilderBlock, PreviewHooks, PreviewSurface, PreviewTheme, SupportedBlock } from '../types';\nimport { BlockRow } from './block-row';\nimport { ContainerRow } from './container-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 authorName,\n authorIcon,\n previewHooks,\n previewTheme,\n previewSurface = 'message',\n errorsByBlockId,\n openBlockId,\n onOpenBlockChange,\n onUpdate,\n onDuplicate,\n onDelete,\n onReorder,\n isPaletteDrag = false,\n onOpenPalette\n}: {\n blocks: BuilderBlock[];\n workspaceName?: string;\n /** Author name shown in the message-frame header (overrides `workspaceName`). */\n authorName?: string;\n /** Author avatar URL shown in the message-frame header. */\n authorIcon?: 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 /** Move a block to a new index. Powers the keyboard-accessible move up / move down buttons. */\n onReorder?: (id: string, toIndex: number) => void;\n /** True while a palette item is being dragged (vs. reordering an existing block). */\n isPaletteDrag?: boolean;\n /** When provided, the empty state shows a mobile-friendly CTA that opens the palette sheet. */\n onOpenPalette?: () => void;\n}) {\n const { setNodeRef, isOver } = useDroppable({ id: SURFACE_DROPPABLE_ID });\n const isDark = previewTheme === 'dark';\n\n // Show the end-of-list insertion bar when the cursor is past the last\n // block while dragging a palette item. For reorder we rely on\n // verticalListSortingStrategy's row shift instead.\n const showEndDropZone = isPaletteDrag && isOver && blocks.length > 0;\n\n const blocksList = (\n <div\n ref={setNodeRef}\n className={cn(\n 'flex min-h-[180px] flex-col px-3 py-2 transition-colors sm:min-h-[240px] sm:px-5',\n isDark ? 'bg-[#1a1d21]' : 'bg-white',\n isPaletteDrag &&\n (isDark\n ? 'bg-[#22262c] outline-2 outline-primary/40 -outline-offset-2 outline-dashed'\n : 'bg-[#f5f8ff] outline-2 outline-primary/40 -outline-offset-2 outline-dashed'),\n isPaletteDrag && isOver && (isDark ? 'bg-[#2c3036]' : 'bg-[#eaf0ff]')\n )}\n >\n {blocks.length === 0 ? (\n <EmptyState isDark={isDark} isPaletteDrag={isPaletteDrag} isOver={isOver} onOpenPalette={onOpenPalette} />\n ) : (\n <SortableContext items={blocks.map((b) => b.id)} strategy={verticalListSortingStrategy}>\n {blocks.map((block, idx) =>\n block.block.type === 'container' ? (\n <ContainerRow\n key={block.id}\n builderBlock={block}\n previewHooks={previewHooks}\n previewTheme={previewTheme}\n errorsByBlockId={errorsByBlockId}\n openBlockId={openBlockId}\n onOpenBlockChange={onOpenBlockChange}\n onUpdate={onUpdate}\n onDuplicate={onDuplicate}\n onDelete={onDelete}\n index={idx}\n total={blocks.length}\n onReorder={onReorder}\n isPaletteDrag={isPaletteDrag}\n />\n ) : (\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 index={idx}\n total={blocks.length}\n onReorder={onReorder}\n isPaletteDrag={isPaletteDrag}\n />\n )\n )}\n {showEndDropZone ? <DropIndicator /> : null}\n </SortableContext>\n )}\n </div>\n );\n\n return (\n <main\n aria-label=\"Block preview\"\n // Outer canvas (the area framing the Slack chrome) follows the\n // host theme's --muted token so brand presets reach it. The inner\n // Slack frame keeps Slack's own canvas colors via isDark below,\n // since that surface is mimicking Slack itself.\n className={cn('flex min-w-0 flex-1 flex-col overflow-y-auto bg-muted p-3 sm:p-6')}\n >\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} authorName={authorName} authorIcon={authorIcon} isDark={isDark}>\n {blocksList}\n </MessageFrame>\n )}\n </div>\n </main>\n );\n}\n\n/**\n * Slack message chrome: avatar + author name + 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 authorName,\n authorIcon,\n isDark,\n children\n}: {\n workspaceName?: string;\n authorName?: string;\n authorIcon?: string;\n isDark: boolean;\n children: ReactNode;\n}) {\n const displayName = authorName ?? workspaceName ?? 'Your app';\n const initial = displayName.slice(0, 1).toUpperCase();\n // Only render the author image when it's a safe http(s) URL — it flows into\n // an <img src> just like block image URLs do.\n const safeIcon = authorIcon && isSafeImageSrc(authorIcon) ? authorIcon : null;\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-5 pt-3 pb-1 text-xs', isDark ? 'text-white/60' : 'text-[#616061]')}\n >\n {safeIcon ? (\n <img src={safeIcon} alt=\"\" className=\"h-7 w-7 shrink-0 rounded object-cover\" />\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 )}\n <span className={cn('font-bold text-sm', isDark ? 'text-white' : 'text-[#1d1c1d]')}>{displayName}</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 // The X / Cancel / Submit affordances are visual chrome — they exist to\n // make the preview look like a real Slack modal. They aren't wired to\n // anything, so render them as `<span aria-hidden>` to keep them out of\n // the focus order and the accessibility tree (a keyboard or screen\n // reader user activating a \"Submit\" button that did nothing would be a\n // worse experience than not seeing the chrome at all).\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 <span\n aria-hidden=\"true\"\n className={cn(\n 'flex h-6 w-6 items-center justify-center rounded',\n isDark ? 'text-white/60' : 'text-[#616061]'\n )}\n >\n <X className=\"h-4 w-4\" />\n </span>\n </div>\n {children}\n <div\n aria-hidden=\"true\"\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 <span\n className={cn(\n 'rounded-sm border px-3 py-1.5 text-sm font-medium',\n isDark ? 'border-white/20 bg-transparent text-white' : 'border-[#e8e8e8] bg-white text-[#1d1c1d]'\n )}\n >\n Cancel\n </span>\n <span className=\"rounded-sm bg-[#007a5a] px-3 py-1.5 text-sm font-bold text-white\">Submit</span>\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-5 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-5 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. While a\n * palette item is being dragged the copy switches to a \"Drop here\" cue\n * and the icon container brightens to confirm the empty surface itself\n * is the drop target.\n * @param props - empty state props\n * @param props.isDark - whether the dark Slack canvas is active\n * @param props.isPaletteDrag - whether a palette block is currently being dragged\n * @param props.isOver - whether the cursor is currently over the surface\n * @returns the rendered placeholder\n */\nfunction EmptyState({\n isDark,\n isPaletteDrag,\n isOver,\n onOpenPalette\n}: {\n isDark: boolean;\n isPaletteDrag: boolean;\n isOver: boolean;\n onOpenPalette?: () => void;\n}) {\n const active = isPaletteDrag && isOver;\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 transition-colors',\n active ? 'text-primary' : 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 transition-colors',\n active ? 'bg-primary/15 text-primary' : isDark ? 'bg-white/5' : 'bg-[#f3f3f3]'\n )}\n >\n <LayoutGrid className=\"h-6 w-6\" />\n </span>\n <div className=\"flex flex-col gap-1\">\n <p\n className={cn(\n 'text-sm font-semibold transition-colors',\n active ? 'text-primary' : isDark ? 'text-white' : 'text-[#1d1c1d]'\n )}\n >\n {active ? 'Drop to add block' : 'Start adding blocks!'}\n </p>\n <p className=\"text-xs\">\n {active ? (\n 'Release to insert it here.'\n ) : (\n <>\n <span className=\"hidden md:inline\">Drag a block from the left, or click one to add it here.</span>\n <span className=\"md:hidden\">Tap “Add a block” below to get started.</span>\n </>\n )}\n </p>\n </div>\n {!active && onOpenPalette ? (\n <button\n type=\"button\"\n onClick={onOpenPalette}\n className=\"inline-flex min-h-11 items-center gap-2 rounded-full bg-primary px-4 py-2 text-sm font-semibold text-primary-foreground shadow-sm transition-colors hover:bg-primary/90 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring md:hidden\"\n >\n <Plus className=\"h-4 w-4\" />\n Add a block\n </button>\n ) : null}\n </div>\n );\n}\n\n/**\n * Insertion bar shown at the cursor's drop target while a palette item\n * is being dragged. A 2px primary-colored line spanning the row width\n * with a small filled caret on the leading edge so the user can see\n * exactly where the new block will land.\n * @returns the rendered drop indicator\n */\nfunction DropIndicator() {\n return (\n <div aria-hidden=\"true\" className=\"pointer-events-none relative my-1 h-0.5 w-full rounded-full bg-primary\">\n <span className=\"-left-1 -top-[3px] absolute h-2 w-2 rounded-full bg-primary shadow-[0_0_0_2px_var(--color-background)]\" />\n </div>\n );\n}\n","import {\n AlertTriangle,\n AppWindow,\n BookOpen,\n Check,\n ChevronDown,\n Code2,\n ExternalLink,\n Home,\n MailSearch,\n MessageSquare,\n Moon,\n Pencil,\n Plus,\n Send,\n Sun,\n Trash2,\n X\n} from 'lucide-react';\nimport type { ComponentType, KeyboardEvent } from 'react';\nimport { useRef, useState } from '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\nconst DEFAULT_DOCS_HREF = 'https://docs.slack.dev/reference/block-kit/blocks';\nconst DEFAULT_DOCS_LABEL = 'Docs';\n\n/**\n * Render a Slack message timestamp (`<unix-seconds>.<micro>`) as a readable\n * date for the edit-mode banner. Falls back to the raw value if it doesn't\n * parse as a number.\n */\nfunction formatMessageTs(ts: string): string {\n const seconds = Number.parseFloat(ts);\n if (!Number.isFinite(seconds)) return ts;\n const date = new Date(seconds * 1000);\n if (Number.isNaN(date.getTime())) return ts;\n return date.toLocaleString(undefined, { dateStyle: 'medium', timeStyle: 'short' });\n}\n\nconst SEND_MENU_ITEM =\n 'flex w-full cursor-pointer items-center gap-2 rounded px-2 py-1.5 text-left text-sm text-foreground transition-colors hover:bg-accent hover:text-accent-foreground focus-visible:bg-accent focus-visible:text-accent-foreground focus-visible:outline-none disabled:pointer-events-none disabled:opacity-50';\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.onOpenPalette - opens the mobile palette sheet\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.allowedSurfaces - surfaces shown in the dropdown. When the\n * list has 0 or 1 entry the dropdown is hidden entirely.\n * @param props.showThemeControl - render the theme dropdown (default true)\n * @param props.docsLink - customize or hide the Docs link. `false` hides it;\n * an object overrides `href` and/or `label`. Defaults to the Slack Block\n * Kit reference docs.\n * @param props.errorCount - number of validation errors\n * @param props.sendButtonLabel - label + accessible name for the Send\n * button that opens the send dialog. Defaults to `'Send'`.\n * @returns the rendered toolbar\n */\nexport function Toolbar({\n onClear,\n onOpenJson,\n onOpenIssues,\n onOpenSend,\n onOpenPalette,\n canSend,\n canClear,\n previewTheme,\n onPreviewThemeChange,\n previewSurface,\n onPreviewSurfaceChange,\n allowedSurfaces,\n showThemeControl = true,\n docsLink,\n errorCount,\n sendButtonLabel = 'Review & send',\n editingEnabled = false,\n editBadge,\n onOpenLoad,\n onOpenUpdate,\n onExitEdit,\n loadButtonLabel = 'Load message',\n updateButtonLabel = 'Review & update'\n}: {\n onClear: () => void;\n onOpenJson: () => void;\n onOpenIssues: () => void;\n onOpenSend: () => void;\n onOpenPalette?: () => void;\n canSend: boolean;\n canClear: boolean;\n previewTheme: PreviewTheme;\n onPreviewThemeChange: (theme: PreviewTheme) => void;\n previewSurface: PreviewSurface;\n onPreviewSurfaceChange: (surface: PreviewSurface) => void;\n allowedSurfaces: readonly PreviewSurface[];\n showThemeControl?: boolean;\n docsLink?: false | { href?: string; label?: string };\n errorCount: number;\n sendButtonLabel?: string;\n /** Whether edit mode is configured (shows the \"Edit existing message\" entry). */\n editingEnabled?: boolean;\n /** When set, a message is loaded for editing: renders the edit-mode badge. */\n editBadge?: { channelLabel: string; ts: string } | null;\n /** Opens the load-message dialog (edit-mode entry point). */\n onOpenLoad?: () => void;\n /** Opens the update dialog (split button's main action + \"Update message\"). */\n onOpenUpdate?: () => void;\n /** Switches back to a new message, clearing the loaded edit target. */\n onExitEdit?: () => void;\n /** Label for the load-message entry button. Defaults to `'Load message'`. */\n loadButtonLabel?: string;\n /** Label for the primary button while editing. Defaults to `'Review & update'`. */\n updateButtonLabel?: string;\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 const surfaceOptions = SURFACE_OPTIONS.filter((s) => allowedSurfaces.includes(s.value));\n const showSurfaceControl = surfaceOptions.length > 1;\n const docsHref = docsLink === false ? null : (docsLink?.href ?? DEFAULT_DOCS_HREF);\n const docsLabel = docsLink === false ? null : (docsLink?.label ?? DEFAULT_DOCS_LABEL);\n\n // Controlled open state so we can close the menus after a selection — the\n // `role=\"menuitemradio\"` semantics imply activation dismisses the menu.\n const [surfaceMenuOpen, setSurfaceMenuOpen] = useState(false);\n const [themeMenuOpen, setThemeMenuOpen] = useState(false);\n const [sendMenuOpen, setSendMenuOpen] = useState(false);\n\n return (\n <>\n <div className=\"flex flex-wrap items-center justify-between gap-x-2 gap-y-1 border-b bg-background px-2 py-1.5 sm:px-3 sm:py-2\">\n <div className=\"flex min-w-0 flex-1 items-center gap-1 sm:gap-2\">\n {editingEnabled ? (\n <Button type=\"button\" size=\"sm\" onClick={onOpenLoad} aria-label={loadButtonLabel}>\n <MailSearch className=\"h-3.5 w-3.5\" />\n <span className=\"hidden md:inline\">{loadButtonLabel}</span>\n </Button>\n ) : null}\n {onOpenPalette ? (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={onOpenPalette}\n className=\"md:hidden\"\n aria-label=\"Add a block\"\n >\n <Plus className=\"h-4 w-4\" />\n <span>Blocks</span>\n </Button>\n ) : null}\n {showSurfaceControl ? (\n <Popover open={surfaceMenuOpen} onOpenChange={setSurfaceMenuOpen}>\n <PopoverTrigger asChild>\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" aria-label={`Preview surface: ${activeSurface.label}`}>\n <activeSurface.Icon className=\"h-3.5 w-3.5\" />\n <span className=\"hidden md:inline\">{activeSurface.label}</span>\n <ChevronDown className=\"hidden h-3.5 w-3.5 opacity-60 md:inline\" />\n </Button>\n </PopoverTrigger>\n <PopoverContent align=\"start\" className=\"w-36 p-1\">\n <Menu<PreviewSurface>\n ariaLabel=\"Preview surface\"\n options={surfaceOptions}\n value={previewSurface}\n onChange={(next) => {\n onPreviewSurfaceChange(next);\n setSurfaceMenuOpen(false);\n }}\n />\n </PopoverContent>\n </Popover>\n ) : null}\n {showThemeControl ? (\n <Popover open={themeMenuOpen} onOpenChange={setThemeMenuOpen}>\n <PopoverTrigger asChild>\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" aria-label={`Preview theme: ${activeTheme.label}`}>\n <activeTheme.Icon className=\"h-3.5 w-3.5\" />\n <span className=\"hidden md:inline\">{activeTheme.label}</span>\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 <Menu<PreviewTheme>\n ariaLabel=\"Preview theme\"\n options={THEME_OPTIONS}\n value={previewTheme}\n onChange={(next) => {\n onPreviewThemeChange(next);\n setThemeMenuOpen(false);\n }}\n />\n </PopoverContent>\n </Popover>\n ) : null}\n {docsHref ? (\n <a\n href={docsHref}\n target=\"_blank\"\n rel=\"noreferrer noopener\"\n className=\"inline-flex h-8 items-center gap-1.5 rounded-md px-2 text-xs font-medium text-muted-foreground no-underline transition-colors hover:bg-accent hover:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\"\n aria-label={`${docsLabel} (opens in a new tab)`}\n >\n <BookOpen className=\"h-3.5 w-3.5\" />\n <span className=\"hidden md:inline\">{docsLabel}</span>\n <ExternalLink className=\"hidden h-3 w-3 opacity-50 md:inline\" />\n </a>\n ) : null}\n </div>\n <div className=\"flex items-center gap-1 sm:gap-2\">\n {errorCount > 0 ? (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={onOpenIssues}\n // High-contrast error styling: red text on a light red background\n // with a subtle red border (WCAG AA — red-700 on red-50 ≈ 6.5:1),\n // so the issue count reads unmistakably as an error rather than a\n // muted ghost button. The `!` on the border color beats the\n // unlayered `.bk-root *` border-color reset in styles.src.css,\n // which otherwise clobbers any utility border color back to the\n // neutral `--border` token.\n className=\"border border-red-200! bg-red-50 text-red-700 hover:bg-red-100 hover:text-red-700\"\n aria-label={`${errorCount} ${errorCount === 1 ? 'issue' : 'issues'}`}\n >\n <AlertTriangle className=\"h-3.5 w-3.5\" />\n <span>\n {errorCount} <span className=\"hidden md:inline\">{errorCount === 1 ? 'issue' : 'issues'}</span>\n </span>\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 aria-label=\"Clear all blocks\"\n >\n <Trash2 className=\"h-3.5 w-3.5\" />\n <span className=\"hidden md:inline\">Clear</span>\n </Button>\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={onOpenJson} aria-label=\"View JSON\">\n <Code2 className=\"h-3.5 w-3.5\" />\n <span className=\"hidden md:inline\">View JSON</span>\n </Button>\n {editBadge ? (\n // A message is loaded: split button. Main action updates it in\n // place; the menu also offers posting the blocks as a new message.\n <div className=\"flex items-stretch\">\n <Button\n type=\"button\"\n size=\"sm\"\n onClick={onOpenUpdate}\n disabled={!canSend}\n aria-label={updateButtonLabel}\n className=\"rounded-r-none\"\n >\n <Pencil className=\"h-3.5 w-3.5\" />\n <span className=\"hidden md:inline\">{updateButtonLabel}</span>\n </Button>\n <Popover open={sendMenuOpen} onOpenChange={setSendMenuOpen}>\n <PopoverTrigger asChild>\n <Button\n type=\"button\"\n size=\"sm\"\n aria-label=\"More message options\"\n aria-haspopup=\"menu\"\n className=\"rounded-l-none border-l border-l-primary-foreground/30! px-1.5\"\n >\n <ChevronDown className=\"h-3.5 w-3.5\" />\n </Button>\n </PopoverTrigger>\n <PopoverContent align=\"end\" className=\"w-56 p-1\">\n <div role=\"menu\" aria-label=\"Message options\" className=\"flex flex-col\">\n <button\n type=\"button\"\n role=\"menuitem\"\n disabled={!canSend}\n onClick={() => {\n setSendMenuOpen(false);\n onOpenUpdate?.();\n }}\n className={SEND_MENU_ITEM}\n >\n <Pencil className=\"h-3.5 w-3.5\" />\n <span className=\"flex-1\">Update message</span>\n </button>\n <button\n type=\"button\"\n role=\"menuitem\"\n disabled={!canSend}\n onClick={() => {\n setSendMenuOpen(false);\n onOpenSend();\n }}\n className={SEND_MENU_ITEM}\n >\n <Send className=\"h-3.5 w-3.5\" />\n <span className=\"flex-1\">Send as a new message</span>\n </button>\n </div>\n </PopoverContent>\n </Popover>\n </div>\n ) : (\n <Button type=\"button\" size=\"sm\" onClick={onOpenSend} disabled={!canSend} aria-label={sendButtonLabel}>\n <Send className=\"h-3.5 w-3.5\" />\n <span className=\"hidden md:inline\">{sendButtonLabel}</span>\n </Button>\n )}\n </div>\n </div>\n {editingEnabled && editBadge ? (\n <div className=\"flex flex-wrap items-center gap-x-3 gap-y-1 border-b bg-muted px-2 py-2 text-foreground sm:px-3\">\n <Pencil className=\"h-4 w-4 shrink-0 text-primary\" />\n <span className=\"min-w-0 flex-1 text-sm\">\n References an existing message in <span className=\"font-semibold\">{editBadge.channelLabel}</span>\n <span className=\"ml-1 text-xs opacity-70\" title={editBadge.ts}>\n {formatMessageTs(editBadge.ts)}\n </span>\n </span>\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={onExitEdit} className=\"shrink-0\">\n <X className=\"h-3.5 w-3.5\" />\n Switch to a new message\n </Button>\n </div>\n ) : null}\n </>\n );\n}\n\n/**\n * Single-select dropdown menu rendered inside a Popover. Adds proper\n * `role=\"menu\"` / `role=\"menuitem\"` semantics and arrow-key navigation\n * between options. Avoiding `@radix-ui/react-dropdown-menu` keeps this\n * dependency-free; the wrapping `Popover` already handles outside-click\n * dismiss, focus return, and Escape.\n */\nfunction Menu<T extends string>({\n ariaLabel,\n options,\n value,\n onChange\n}: {\n ariaLabel: string;\n options: readonly { value: T; label: string; Icon: ComponentType<{ className?: string }> }[];\n value: T;\n onChange: (next: T) => void;\n}) {\n const itemsRef = useRef<(HTMLButtonElement | null)[]>([]);\n\n const moveFocus = (from: number, delta: number) => {\n const len = options.length;\n if (len === 0) return;\n const next = (from + delta + len) % len;\n itemsRef.current[next]?.focus();\n };\n\n const handleKeyDown = (e: KeyboardEvent<HTMLButtonElement>, idx: number) => {\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n moveFocus(idx, 1);\n } else if (e.key === 'ArrowUp') {\n e.preventDefault();\n moveFocus(idx, -1);\n } else if (e.key === 'Home') {\n e.preventDefault();\n itemsRef.current[0]?.focus();\n } else if (e.key === 'End') {\n e.preventDefault();\n itemsRef.current[options.length - 1]?.focus();\n }\n };\n\n return (\n <div role=\"menu\" aria-label={ariaLabel} className=\"flex flex-col\">\n {options.map(({ value: optValue, label, Icon }, idx) => {\n const isActive = optValue === value;\n return (\n <button\n key={optValue}\n ref={(el) => {\n itemsRef.current[idx] = el;\n }}\n type=\"button\"\n role=\"menuitemradio\"\n aria-checked={isActive}\n onClick={() => onChange(optValue)}\n onKeyDown={(e) => handleKeyDown(e, idx)}\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 focus-visible:bg-accent focus-visible:text-foreground focus-visible:outline-none',\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 </div>\n );\n}\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 { isSafeHref } from '../lib/url-safety';\nimport type { EditableVia, SendAsUserStatus, SupportedBlock, UpdatePayload, UpdateResult } from '../types';\n\n/** The loaded message being edited. Destination + identity are fixed by the host's verdict. */\nexport interface EditTarget {\n channelId: string;\n channelName?: string;\n ts: string;\n editableVia: EditableVia;\n workspaceName?: string;\n username?: string;\n iconUrl?: string;\n}\n\ntype UpdateStatus = { kind: 'idle' } | { kind: 'updating' } | { kind: 'error'; error: string };\n\n/**\n * Modal dialog confirming an update to an already-posted message. Unlike the\n * send dialog, the destination channel is locked to the source and the\n * post-as identity is fixed by the host's `editableVia` verdict — there is no\n * channel or identity picker. When the verdict is `'user'` and the user has no\n * token yet, the dialog reuses the \"Sign in with Slack\" flow before allowing\n * the update.\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.target - the loaded message (channel + ts + editability verdict)\n * @param props.blocks - the edited draft blocks to write back\n * @param props.loadSendAsUserStatus - returns user-token status + OAuth URL (user-token path only)\n * @param props.onUpdate - terminal action; should return `{ ok }` or `{ ok: false, error }`\n * @param props.confirmUpdateLabel - label for the confirm button. Defaults to `'Update message'`.\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 update dialog\n */\nexport function UpdateDialog({\n open,\n onOpenChange,\n target,\n blocks,\n loadSendAsUserStatus,\n onUpdate,\n confirmUpdateLabel = 'Update message',\n errorCount,\n onShowIssues\n}: {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n target: EditTarget;\n blocks: SupportedBlock[];\n loadSendAsUserStatus: () => Promise<SendAsUserStatus>;\n onUpdate: (payload: UpdatePayload) => Promise<UpdateResult>;\n confirmUpdateLabel?: string;\n errorCount: number;\n onShowIssues?: () => void;\n}) {\n const asUser = target.editableVia === 'user';\n const [userStatus, setUserStatus] = useState<SendAsUserStatus | null>(null);\n const [status, setStatus] = useState<UpdateStatus>({ kind: 'idle' });\n\n const loadSendAsUserStatusRef = useRef(loadSendAsUserStatus);\n useEffect(() => {\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 // Only the user-token path needs a token check; the bot path can always edit\n // its own message.\n useEffect(() => {\n if (!open) {\n return;\n }\n setStatus({ kind: 'idle' });\n if (asUser) {\n setUserStatus(null);\n refreshSendAsUser();\n }\n }, [open, asUser, refreshSendAsUser]);\n\n // Pick up a completed OAuth round-trip when the window regains focus.\n useEffect(() => {\n if (!open || !asUser) {\n return;\n }\n const handler = () => refreshSendAsUser();\n window.addEventListener('focus', handler);\n return () => window.removeEventListener('focus', handler);\n }, [open, asUser, refreshSendAsUser]);\n\n // Editing as the user requires a usable user token. The bot path never gates.\n const needsSignIn = asUser && userStatus !== null && !userStatus.canSendAsUser;\n\n const handleSubmit = async () => {\n setStatus({ kind: 'updating' });\n try {\n const result = await onUpdate({\n channelId: target.channelId,\n ts: target.ts,\n blocks: toSlackBlocks(blocks),\n asUser\n });\n if (result.ok) {\n setStatus({ kind: 'idle' });\n onOpenChange(false);\n return;\n }\n setStatus({ kind: 'error', error: result.error ?? 'Update failed.' });\n } catch (e) {\n setStatus({ kind: 'error', error: e instanceof Error ? e.message : 'Update failed.' });\n }\n };\n\n const channelLabel = target.channelName ? `#${target.channelName}` : target.channelId;\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"w-[calc(100vw-1.5rem)] max-w-lg rounded-lg\">\n <DialogHeader>\n <DialogTitle>Update message</DialogTitle>\n <DialogDescription>\n This replaces the message that's already posted. It stays in the same channel and can't be moved.\n </DialogDescription>\n </DialogHeader>\n\n <div className=\"flex flex-col gap-4\">\n <div className=\"flex flex-col gap-1.5\">\n <Label>Channel</Label>\n <p className=\"flex h-9 items-center rounded-md border border-input bg-muted px-3 text-sm text-muted-foreground\">\n {channelLabel}\n </p>\n </div>\n\n <div className=\"flex flex-col gap-1.5\">\n <Label>Posting as</Label>\n <p className=\"flex h-9 items-center rounded-md border border-input bg-muted px-3 text-sm text-muted-foreground\">\n {asUser ? 'Your account' : 'App bot'}\n </p>\n {needsSignIn && userStatus?.oauthUrl && isSafeHref(userStatus.oauthUrl) && (\n <p className=\"text-xs text-muted-foreground\">\n <a\n href={userStatus.oauthUrl}\n target=\"_blank\"\n rel=\"noopener 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 update your own message.\n </p>\n )}\n {needsSignIn && !userStatus?.oauthUrl && (\n <p className=\"text-xs text-muted-foreground\">Sign in with Slack to update your own message.</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 updating.\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 === 'updating' || blocks.length === 0 || errorCount > 0 || needsSignIn}\n >\n {status.kind === 'updating' ? 'Updating…' : confirmUpdateLabel}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n","import {\n type CollisionDetection,\n closestCenter,\n DndContext,\n type DragEndEvent,\n DragOverlay,\n type DragStartEvent,\n KeyboardSensor,\n PointerSensor,\n pointerWithin,\n TouchSensor,\n useSensor,\n useSensors\n} from '@dnd-kit/core';\nimport { sortableKeyboardCoordinates } from '@dnd-kit/sortable';\nimport { GripVertical } from 'lucide-react';\nimport { useCallback, useMemo, useState } from 'react';\nimport { parseContainerBodyId } from '../lib/container-blocks';\nimport { makeEmojiHook } from '../lib/custom-emoji-hook';\nimport { buildVariantById, defaultPalette, type PaletteSection } from '../lib/default-blocks';\nimport { Sheet, SheetContent, SheetDescription, SheetTitle } from '../lib/ui/sheet';\nimport { TooltipProvider } from '../lib/ui/tooltip';\nimport { useIsMobile } from '../lib/use-is-mobile';\nimport { CustomEmojiProvider } from '../state/custom-emoji-context';\nimport { useBlockKitValidation } from '../state/use-block-kit-validation';\nimport { type MoveTarget, useBlockKitchenState } from '../state/use-block-kitchen-state';\nimport type { BlockKitchenProps, PreviewSurface, PreviewTheme } from '../types';\nimport { BrandThemeScope } from './brand-theme-scope';\nimport { IssuesSheet } from './issues-sheet';\nimport { JsonDrawer } from './json-drawer';\nimport { LoadMessageDialog } from './load-message-dialog';\nimport { Palette, parsePaletteDragId } from './palette';\nimport { SendDialog } from './send-dialog';\nimport { SURFACE_DROPPABLE_ID, Surface } from './surface';\nimport { Toolbar } from './toolbar';\nimport { type EditTarget, UpdateDialog } from './update-dialog';\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 BlockKitchenProps}\n * @returns the rendered Block Kit Builder\n */\nexport function BlockKitchen(props: BlockKitchenProps) {\n const {\n workspaceName,\n initialBlocks,\n onChange,\n previewHooks,\n customEmojis,\n loadChannels,\n loadSendAsUserStatus,\n onSend,\n editing,\n loadButtonLabel,\n updateButtonLabel,\n confirmUpdateLabel,\n palette,\n disabledBlockTypes,\n showPaletteSearch,\n paletteSearchPlaceholder,\n defaultOpenSections,\n allowedSurfaces: allowedSurfacesProp,\n showThemeControl = true,\n docsLink,\n defaultPreviewTheme = 'light',\n previewTheme: controlledPreviewTheme,\n sendButtonLabel,\n confirmSendLabel,\n theme\n } = props;\n\n const paletteSections = useMemo(() => {\n const sections = palette ?? defaultPalette;\n if (!disabledBlockTypes || disabledBlockTypes.length === 0) {\n return sections;\n }\n // Filter at the variant level: a section may mix block types (e.g.\n // Structure contains divider + header + context), so dropping a\n // whole section by name would over-prune. Run each factory once to\n // peek at the block type; drop sections that end up empty.\n const blocked = new Set(disabledBlockTypes);\n const filtered: PaletteSection[] = [];\n for (const section of sections) {\n const variants = section.variants.filter((variant) => !blocked.has(variant.factory().type));\n if (variants.length > 0) {\n filtered.push({ ...section, variants });\n }\n }\n return filtered;\n }, [palette, disabledBlockTypes]);\n const variantById = useMemo(() => buildVariantById(paletteSections), [paletteSections]);\n\n // Default to message-only when omitted (or passed empty). The toolbar\n // needs at least one entry to seed `previewSurface`; it hides the\n // dropdown when this resolves to a single surface.\n const allowedSurfaces: readonly PreviewSurface[] =\n allowedSurfacesProp && allowedSurfacesProp.length > 0 ? allowedSurfacesProp : ['message'];\n\n const { blocks, addBlock, addChild, updateBlock, removeBlock, duplicateBlock, reorderBlock, moveBlock, replaceAll } =\n useBlockKitchenState({ initialBlocks, onChange });\n\n // Lookups for resolving a drop target: which ids are container children,\n // and which container each child belongs to. Recomputed when the tree\n // changes; read by collision detection and the drag-end handler.\n const childParentById = useMemo(() => {\n const map = new Map<string, string>();\n for (const top of blocks) {\n if (top.children) {\n for (const child of top.children) {\n map.set(child.id, top.id);\n }\n }\n }\n return map;\n }, [blocks]);\n\n const [jsonOpen, setJsonOpen] = useState(false);\n const [sendOpen, setSendOpen] = useState(false);\n // Edit mode (opt-in via `editing`). `editTarget` is the loaded message;\n // when set, the split button can update it in place (`updateOpen`) or post\n // the current blocks as a new message (`sendOpen`).\n const [updateOpen, setUpdateOpen] = useState(false);\n const [loadOpen, setLoadOpen] = useState(false);\n const [editTarget, setEditTarget] = useState<EditTarget | null>(null);\n // Edit mode only counts as active while `editing` is configured. If the host\n // toggles `editing` off mid-session, fall back to send-only without losing\n // the loaded target (it reactivates if `editing` returns).\n const activeEditTarget = editing ? editTarget : null;\n const [issuesOpen, setIssuesOpen] = useState(false);\n const [paletteOpen, setPaletteOpen] = useState(false);\n const [openBlockId, setOpenBlockId] = useState<string | null>(null);\n // Preview theme is controlled when the host passes `previewTheme`, and\n // uncontrolled (seeded from `defaultPreviewTheme`) otherwise. The\n // uncontrolled state is only mutated by the toolbar toggle, which is\n // hidden whenever the theme is controlled — so the two never fight.\n const [uncontrolledPreviewTheme, setUncontrolledPreviewTheme] = useState<PreviewTheme>(defaultPreviewTheme);\n const isPreviewThemeControlled = controlledPreviewTheme !== undefined;\n const previewTheme = controlledPreviewTheme ?? uncontrolledPreviewTheme;\n const [previewSurface, setPreviewSurface] = useState<PreviewSurface>(allowedSurfaces[0]);\n const [activePaletteVariantId, setActivePaletteVariantId] = useState<string | null>(null);\n\n const isMobile = useIsMobile();\n\n // Merge a custom-emoji `emoji` hook into the caller's preview hooks so the\n // preview renders `:custom:` as the workspace image (and resolves aliases).\n // An explicit caller-supplied `emoji` hook wins over ours. When no custom\n // emoji are provided we forward `previewHooks` untouched so behavior is\n // identical to before the prop existed.\n const mergedPreviewHooks = useMemo(() => {\n if (!customEmojis || customEmojis.length === 0) {\n return previewHooks;\n }\n const byName = new Map(customEmojis.map((emoji) => [emoji.name, emoji] as const));\n return { emoji: makeEmojiHook(byName), ...previewHooks };\n }, [customEmojis, previewHooks]);\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 // Touch needs a 150ms press-and-hold to start a drag so scrolling the\n // surface doesn't accidentally pick up a block. Pointer keeps the small\n // 4px distance threshold so mouse clicks still open the editor cleanly.\n const sensors = useSensors(\n useSensor(PointerSensor, { activationConstraint: { distance: 4 } }),\n useSensor(TouchSensor, { activationConstraint: { delay: 150, tolerance: 8 } }),\n useSensor(KeyboardSensor, { coordinateGetter: sortableKeyboardCoordinates })\n );\n\n // Pick the block directly under the cursor when possible so the drop\n // target tracks the cursor rather than whichever droppable's geometric\n // center is nearest. The surface (a tall droppable) used to win against\n // small block rows under closestCenter, which made it look like every\n // palette drop appended to the end. Fall back to closestCenter so the\n // bottom of the surface still resolves to a valid target when the\n // cursor sits past the last block.\n // Prefer the most specific drop target under the cursor so nested\n // container drop zones win over the surface they sit inside: a child row\n // beats the container body, the body beats the container's own row, and\n // any block beats the tall surface droppable.\n const collisionDetection = useCallback<CollisionDetection>(\n (args) => {\n const hits = pointerWithin(args);\n if (hits.length > 0) {\n const child = hits.find((c) => childParentById.has(c.id as string));\n if (child) return [child];\n const body = hits.find((c) => parseContainerBodyId(c.id) !== null);\n if (body) return [body];\n const block = hits.find((c) => c.id !== SURFACE_DROPPABLE_ID && parseContainerBodyId(c.id) === null);\n if (block) return [block];\n return hits;\n }\n return closestCenter(args);\n },\n [childParentById]\n );\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 const overId = over.id as string;\n\n // Resolve the `over` droppable into a destination list + index:\n // the surface end, a slot among the top-level blocks, a container's\n // body (append), or a slot among a container's children (the hovered\n // child's index).\n let target: MoveTarget | null;\n const bodyParent = parseContainerBodyId(overId);\n const childParent = childParentById.get(overId);\n if (overId === SURFACE_DROPPABLE_ID) {\n target = { kind: 'top', index: blocks.length };\n } else if (bodyParent) {\n const count = blocks.find((b) => b.id === bodyParent)?.children?.length ?? 0;\n target = { kind: 'container', parentId: bodyParent, index: count };\n } else if (childParent) {\n const siblings = blocks.find((b) => b.id === childParent)?.children ?? [];\n target = { kind: 'container', parentId: childParent, index: siblings.findIndex((c) => c.id === overId) };\n } else {\n const topIndex = blocks.findIndex((b) => b.id === overId);\n target = topIndex === -1 ? null : { kind: 'top', index: topIndex };\n }\n if (!target) {\n return;\n }\n\n const variantId = parsePaletteDragId(active.id);\n if (variantId) {\n const variant = variantById.get(variantId);\n if (!variant) {\n return;\n }\n if (target.kind === 'container') {\n addChild(target.parentId, variant.factory(), target.index);\n } else {\n addBlock(variant.factory(), target.index);\n }\n return;\n }\n\n if (active.id !== overId) {\n moveBlock(active.id as string, target);\n }\n },\n [addBlock, addChild, blocks, childParentById, moveBlock, variantById]\n );\n\n const handleDragCancel = useCallback(() => {\n setActivePaletteVariantId(null);\n }, []);\n\n const activePaletteVariant = activePaletteVariantId ? variantById.get(activePaletteVariantId) : null;\n\n const blockPayloads = blocks.map((b) => b.block);\n\n return (\n <BrandThemeScope theme={theme}>\n <CustomEmojiProvider customEmojis={customEmojis}>\n <TooltipProvider delayDuration={200}>\n <DndContext\n sensors={sensors}\n collisionDetection={collisionDetection}\n onDragStart={handleDragStart}\n onDragEnd={handleDragEnd}\n onDragCancel={handleDragCancel}\n >\n <div className=\"bk-root flex h-full w-full flex-col overflow-hidden 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 onOpenPalette={() => setPaletteOpen(true)}\n canSend={blocks.length > 0}\n canClear={blocks.length > 0}\n errorCount={validation.total}\n previewTheme={previewTheme}\n onPreviewThemeChange={setUncontrolledPreviewTheme}\n previewSurface={previewSurface}\n onPreviewSurfaceChange={setPreviewSurface}\n allowedSurfaces={allowedSurfaces}\n // A controlled `previewTheme` always hides the toggle so the\n // host app fully owns the theme; otherwise honor the prop.\n showThemeControl={isPreviewThemeControlled ? false : showThemeControl}\n docsLink={docsLink}\n sendButtonLabel={sendButtonLabel}\n editingEnabled={!!editing}\n editBadge={\n activeEditTarget\n ? {\n channelLabel: activeEditTarget.channelName\n ? `#${activeEditTarget.channelName}`\n : activeEditTarget.channelId,\n ts: activeEditTarget.ts\n }\n : null\n }\n onOpenLoad={() => setLoadOpen(true)}\n onOpenUpdate={() => setUpdateOpen(true)}\n onExitEdit={() => {\n // Banner exit: discard the loaded message's draft and reopen\n // the loader so the user starts fresh or picks another message.\n setEditTarget(null);\n replaceAll([]);\n setLoadOpen(true);\n }}\n loadButtonLabel={loadButtonLabel}\n updateButtonLabel={updateButtonLabel}\n />\n <div className=\"flex min-h-0 flex-1 items-stretch\">\n {/* Desktop: persistent left aside. Mobile: collapsed to the\n palette sheet trigger in the toolbar. */}\n <div className=\"hidden min-h-0 md:flex\">\n <Palette\n onAddBlock={(block) => addBlock(block)}\n sections={paletteSections}\n showSearch={showPaletteSearch}\n searchPlaceholder={paletteSearchPlaceholder}\n defaultOpenSections={defaultOpenSections}\n />\n </div>\n <Surface\n blocks={blocks}\n workspaceName={workspaceName}\n // When a message is loaded for editing, show its author in\n // the preview header instead of the generic workspace name.\n authorName={activeEditTarget?.username}\n authorIcon={activeEditTarget?.iconUrl}\n previewHooks={mergedPreviewHooks}\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 onReorder={reorderBlock}\n isPaletteDrag={activePaletteVariant !== null}\n onOpenPalette={() => setPaletteOpen(true)}\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 {/* Mobile-only palette sheet. The desktop aside above stays put;\n this opens from the bottom on a tap of the toolbar's Blocks\n button. Tap-to-add closes the sheet so the user sees the new\n row land in the surface. */}\n <Sheet open={paletteOpen && isMobile} onOpenChange={setPaletteOpen}>\n <SheetContent\n side=\"bottom\"\n className=\"bk-portal-content flex h-[85svh] max-h-[85svh] flex-col gap-3 p-0 sm:max-w-none\"\n >\n <div className=\"flex flex-col gap-1 px-4 pt-5\">\n <SheetTitle>Add a block</SheetTitle>\n <SheetDescription>Tap a block to add it to the bottom of your draft.</SheetDescription>\n </div>\n <div className=\"flex min-h-0 flex-1 flex-col\">\n <Palette\n onAddBlock={(block) => {\n addBlock(block);\n setPaletteOpen(false);\n }}\n sections={paletteSections}\n showSearch={showPaletteSearch}\n searchPlaceholder={paletteSearchPlaceholder}\n defaultOpenSections={defaultOpenSections}\n variant=\"sheet\"\n />\n </div>\n </SheetContent>\n </Sheet>\n <JsonDrawer open={jsonOpen} onOpenChange={setJsonOpen} blocks={blockPayloads} onApply={replaceAll} />\n {/* The Send dialog always posts a brand-new message (used by both\n plain Send and the edit-mode \"Send as a new message\"). The Update\n dialog (channel locked) only exists while a message is loaded. */}\n <SendDialog\n open={sendOpen}\n onOpenChange={setSendOpen}\n blocks={blockPayloads}\n loadChannels={loadChannels}\n loadSendAsUserStatus={loadSendAsUserStatus}\n onSend={onSend}\n confirmSendLabel={confirmSendLabel}\n errorCount={validation.total}\n onShowIssues={() => {\n setSendOpen(false);\n setIssuesOpen(true);\n }}\n />\n {activeEditTarget && editing ? (\n <UpdateDialog\n open={updateOpen}\n onOpenChange={setUpdateOpen}\n target={activeEditTarget}\n blocks={blockPayloads}\n loadSendAsUserStatus={loadSendAsUserStatus}\n onUpdate={editing.onUpdate}\n confirmUpdateLabel={confirmUpdateLabel}\n errorCount={validation.total}\n onShowIssues={() => {\n setUpdateOpen(false);\n setIssuesOpen(true);\n }}\n />\n ) : null}\n {editing ? (\n <LoadMessageDialog\n open={loadOpen}\n onOpenChange={setLoadOpen}\n onLoadMessage={editing.onLoadMessage}\n loadRecentMessages={editing.loadRecentMessages}\n loadChannels={loadChannels}\n onLoaded={(result) => {\n replaceAll(result.blocks);\n setEditTarget({\n channelId: result.channelId,\n channelName: result.channelName,\n ts: result.ts,\n editableVia: result.editableVia,\n workspaceName: result.workspaceName,\n username: result.username,\n iconUrl: result.iconUrl\n });\n setLoadOpen(false);\n }}\n onOpenAsNew={(loadedBlocks) => {\n // Fallback for a not-editable verdict: drop edit mode and\n // hydrate the draft (when the host supplied blocks) so the\n // user can repost it as a brand-new message.\n if (loadedBlocks) {\n replaceAll(loadedBlocks);\n }\n setEditTarget(null);\n setLoadOpen(false);\n }}\n />\n ) : null}\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 </CustomEmojiProvider>\n </BrandThemeScope>\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 { cn } from '../lib/cn';\nimport type { PreviewSurface, PreviewTheme, Template } from '../types';\n\nconst UNCATEGORIZED = 'Other';\n\n/**\n * A live, scaled-down preview of a template's blocks rendered via\n * `slack-blocks-to-jsx`. The container is fixed-height with hidden\n * overflow so taller templates clip neatly into a thumbnail.\n */\nfunction TemplateThumbnail({ blocks, theme }: { blocks: Template['blocks']; theme: PreviewTheme }) {\n return (\n // `inert` removes the rendered template's interactive controls (buttons,\n // links, inputs) from the focus order and pointer events so the wrapping\n // card stays the only interactive element — required to avoid the\n // `nested-interactive` a11y violation, and `aria-hidden` keeps the card's\n // accessible name to just the visible name + description below.\n <div\n inert\n aria-hidden=\"true\"\n className=\"relative h-44 overflow-hidden rounded-md border bg-background shadow-inner\"\n >\n <div\n id=\"slack_blocks_to_jsx\"\n data-theme={theme}\n className=\"slack_blocks_to_jsx styles_enabled absolute top-0 left-0 w-[167%] origin-top-left scale-[0.6] p-3\"\n >\n <Message time={new Date()} name=\"\" logo=\"\" withoutWrapper theme={theme} blocks={blocks as unknown as Block[]} />\n </div>\n {/* Soft fade at the bottom so clipped content doesn't end on a hard edge. */}\n <div className=\"pointer-events-none absolute inset-x-0 bottom-0 h-10 bg-gradient-to-t from-background to-transparent\" />\n </div>\n );\n}\n\nconst SURFACE_LABEL: Record<PreviewSurface, string> = {\n message: 'Message',\n modal: 'Modal',\n app_home: 'App Home'\n};\n\n/**\n * One template card: padded preview inside a raised card frame, with a\n * surface badge, name, and optional description below. The whole card\n * is a button; clicking it invokes `onSelect`.\n */\nfunction TemplateCard({\n template,\n theme,\n onSelect\n}: {\n template: Template;\n theme: PreviewTheme;\n onSelect: (template: Template) => void;\n}) {\n // We render the card as a `div[role=\"button\"]` rather than a `<button>`\n // because the live thumbnail's rendered blocks may include real\n // `<button>` elements (e.g. action blocks). Nesting buttons is invalid\n // HTML and React's DOM validator warns about it. `inert` on the\n // thumbnail removes the descendants from the focus order, so the card\n // div stays the only interactive element.\n const handleActivate = () => onSelect(template);\n return (\n <div\n role=\"button\"\n tabIndex={0}\n onClick={handleActivate}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n handleActivate();\n }\n }}\n className=\"group flex cursor-pointer flex-col gap-3 rounded-xl border bg-card p-4 text-left shadow-sm ring-1 ring-black/5 transition-all duration-150 hover:-translate-y-0.5 hover:border-foreground/30 hover:shadow-lg focus-visible:-translate-y-0.5 focus-visible:shadow-lg focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <TemplateThumbnail blocks={template.blocks} theme={theme} />\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"flex min-w-0 flex-col gap-0.5\">\n <span className=\"truncate text-sm font-semibold text-foreground\">{template.name}</span>\n {template.description ? (\n <span className=\"line-clamp-2 text-xs text-foreground/75\">{template.description}</span>\n ) : null}\n </div>\n <span className=\"shrink-0 rounded-full border border-foreground/15 bg-background px-2 py-0.5 text-[10px] font-medium tracking-wide text-foreground/70 uppercase\">\n {SURFACE_LABEL[template.surface]}\n </span>\n </div>\n </div>\n );\n}\n\n/**\n * Group templates by `category`. Templates without a category fall into\n * an `\"Other\"` bucket placed last; if no template specifies a category\n * the function returns a single ungrouped bucket and the picker omits\n * the section heading.\n */\nfunction groupByCategory(templates: readonly Template[]): {\n grouped: boolean;\n sections: { category: string; templates: Template[] }[];\n} {\n const anyCategorized = templates.some((t) => !!t.category);\n if (!anyCategorized) {\n return { grouped: false, sections: [{ category: UNCATEGORIZED, templates: [...templates] }] };\n }\n const map = new Map<string, Template[]>();\n for (const t of templates) {\n const key = t.category ?? UNCATEGORIZED;\n const arr = map.get(key) ?? [];\n arr.push(t);\n map.set(key, arr);\n }\n // Stable order: categories in first-seen order, with `Other` pinned last.\n const seen: string[] = [];\n for (const t of templates) {\n const key = t.category ?? UNCATEGORIZED;\n if (!seen.includes(key)) seen.push(key);\n }\n seen.sort((a, b) => (a === UNCATEGORIZED ? 1 : b === UNCATEGORIZED ? -1 : 0));\n return {\n grouped: true,\n sections: seen.map((category) => ({ category, templates: map.get(category) ?? [] }))\n };\n}\n\n/**\n * Standalone, page-sized picker that displays {@link Template}s as a\n * grid of cards with live block previews, organized into category\n * sections — modeled on Slack's own Block Kit Builder templates page.\n * Pure UI: wire `onSelect` to whatever state owns the draft blocks\n * (e.g. lifted `initialBlocks` on {@link BlockKitchen}, your own\n * store, a router-driven URL param).\n *\n * Compose alongside {@link BlockKitchen} however fits your layout\n * (route, modal, slide-over, tab). This component intentionally does\n * not own its own dialog so the consumer controls placement and\n * dismissal.\n *\n * @param props - picker props\n * @param props.templates - templates to show. Order is preserved within\n * each category section.\n * @param props.onSelect - called when the user clicks a template card.\n * @param props.surface - optional surface filter. When set, only\n * templates whose {@link Template.surface} matches are shown.\n * @param props.theme - preview theme used inside the card thumbnails.\n * Defaults to `'light'`.\n * @param props.heading - optional heading rendered above the grid. When\n * omitted, no heading is rendered.\n * @param props.emptyLabel - text shown when no templates match the\n * surface filter. Defaults to `\"No templates available.\"`.\n * @param props.className - additional classes merged onto the root.\n */\nexport function TemplatePicker({\n templates,\n onSelect,\n surface,\n theme = 'light',\n heading,\n emptyLabel = 'No templates available.',\n className\n}: {\n templates: readonly Template[];\n onSelect: (template: Template) => void;\n surface?: PreviewSurface;\n theme?: PreviewTheme;\n heading?: string;\n emptyLabel?: string;\n className?: string;\n}) {\n const visible = surface ? templates.filter((t) => t.surface === surface) : templates;\n const { grouped, sections } = groupByCategory(visible);\n\n return (\n <div className={cn('flex h-full w-full flex-col gap-6 overflow-y-auto bg-muted/30 p-4 sm:gap-8 sm:p-8', className)}>\n {heading ? <h2 className=\"text-lg font-semibold tracking-tight text-foreground sm:text-xl\">{heading}</h2> : null}\n {visible.length === 0 ? (\n <p className=\"text-sm text-foreground/75\">{emptyLabel}</p>\n ) : (\n sections.map((section) => (\n <section key={section.category} className=\"flex flex-col gap-3 sm:gap-4\">\n {grouped ? (\n <h3 className=\"text-xs font-semibold tracking-wider text-foreground/60 uppercase\">{section.category}</h3>\n ) : null}\n {/* Container-driven grid: each column is at least 240px wide on\n mobile (280px on sm+) and grows to fill, so the picker\n adapts the same whether it's a narrow sidebar (1 col) or\n a full-page view (3-4 cols) without relying on viewport\n breakpoints. */}\n <div className=\"grid grid-cols-[repeat(auto-fill,minmax(240px,1fr))] gap-4 sm:grid-cols-[repeat(auto-fill,minmax(280px,1fr))] sm:gap-5\">\n {section.templates.map((template) => (\n <TemplateCard key={template.id} template={template} theme={theme} onSelect={onSelect} />\n ))}\n </div>\n </section>\n ))\n )}\n </div>\n );\n}\n","import type { SupportedBlock } from '../types';\n\n/**\n * Upper bound on the encoded string length we accept on decode. Block\n * Kit JSON in practice is well under 100 KB; we cap at 1 MiB of encoded\n * input so a pathologically large URL hash cannot freeze the tab in\n * `atob` + `JSON.parse` before the validator gets a look. Encoded\n * (base64url) is ~33% larger than the binary, so this bounds the decoded\n * JSON at roughly 768 KiB.\n */\nconst MAX_ENCODED_BYTES = 1024 * 1024;\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 if (encoded.length > MAX_ENCODED_BYTES) {\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"]}
|
|
1
|
+
{"version":3,"sources":["../src/lib/container-blocks.ts","../src/lib/custom-emoji-hook.tsx","../src/lib/default-blocks.ts","../src/lib/cn.ts","../src/lib/ui/sheet.tsx","../src/lib/ui/tooltip.tsx","../src/lib/use-is-mobile.ts","../src/state/custom-emoji-context.tsx","../src/lib/error-grouping.ts","../src/lib/url-safety.ts","../src/lib/sanitize-blocks.ts","../src/lib/to-slack-blocks.ts","../src/lib/validation-sanitize.ts","../src/state/use-block-kit-validation.ts","../src/state/use-block-kitchen-state.ts","../src/lib/brand-theme.ts","../src/components/brand-theme-scope.tsx","../src/components/issues-sheet.tsx","../src/lib/parse-blocks-input.ts","../src/components/json-drawer.tsx","../src/lib/ui/button.tsx","../src/lib/ui/dialog.tsx","../src/lib/ui/input.tsx","../src/lib/ui/label.tsx","../src/components/slack-sign-in.tsx","../src/components/load-message-dialog.tsx","../src/components/palette.tsx","../src/components/send-dialog.tsx","../src/lib/ui/popover.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/container-editor.tsx","../src/components/editors/context-actions-editor.tsx","../src/components/editors/context-editor.tsx","../src/components/editors/data-visualization-editor.tsx","../src/components/editors/divider-editor.tsx","../src/lib/emoji-data.ts","../src/lib/emoji-recents.ts","../src/components/emoji/emoji-picker.tsx","../src/components/emoji/emoji-picker-button.tsx","../src/components/emoji/emoji-text-insert-button.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/components/editors/plan-editor.tsx","../src/lib/emoji-resolve.ts","../src/lib/rich-text-tiptap.ts","../src/lib/tiptap-emoji-node.tsx","../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/task-card-editor.tsx","../src/components/editors/video-editor.tsx","../src/components/editors/block-editor.tsx","../src/components/preview/slack-block-preview.tsx","../src/components/block-row.tsx","../src/components/container-row.tsx","../src/components/surface.tsx","../src/components/toolbar.tsx","../src/components/update-dialog.tsx","../src/components/block-kitchen.tsx","../src/components/template-picker.tsx","../src/lib/url-state.ts"],"names":["jsx","Sparkles","FileText","AlignLeft","MousePointerClick","TextCursorInput","LayoutTemplate","Bell","Pilcrow","ImageIcon","VideoIcon","GalleryHorizontal","TableIcon","ChartColumnBig","Container","twMerge","clsx","DialogPrimitive","React","jsxs","X","TooltipPrimitive","React2","useState","useEffect","createContext","useMemo","useContext","validateBlockKit","useRef","nanoid","useCallback","useId","Fragment","CheckCircle2","AlertTriangle","blocks","Check","Copy","cva","React3","Slot","DialogPrimitive2","React4","React5","React6","LabelPrimitive","Loader2","ExternalLink","POLL_INTERVAL_MS","MAX_POLLS","Info","Search","ChevronDown","ChevronRight","useDraggable","GripVertical","PopoverPrimitive","React7","React8","RadioGroupPrimitive","Circle","Trash2","Plus","React9","CARD_ACTIONS_MAX","TypeIcon","custom","Smile","NodeViewWrapper","Node","mergeAttributes","ReactNodeViewRenderer","StarterKit","Link","editor","useEditor","EditorContent","Bold","Italic","Strikethrough","Underline","Code","List","ListOrdered","Quote","Code2","Undo2","Redo2","LinkIcon","STATUSES","Message","useSortable","CSS","ArrowUp","ArrowDown","Pencil","useDroppable","SortableContext","verticalListSortingStrategy","ToolbarButton","DropIndicator","LayoutGrid","Sun","Moon","MessageSquare","AppWindow","Home","Toolbar","MailSearch","BookOpen","Send","useSensors","useSensor","PointerSensor","TouchSensor","KeyboardSensor","sortableKeyboardCoordinates","pointerWithin","closestCenter","DndContext","DragOverlay"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { SupportedBlockType } from '../types';\n\n/**\n * Block types Slack allows inside a `container` block's `child_blocks`.\n * Mirrors the validator schema (actions, context, divider, file, header,\n * image, input, rich_text, section, table, video) across the types the\n * builder models — `file` is omitted because the builder has no file block,\n * and `container` is excluded since containers don't nest.\n * @see https://docs.slack.dev/reference/block-kit/blocks/container-block\n */\nexport const CONTAINER_CHILD_TYPES: ReadonlySet<SupportedBlockType> = new Set([\n 'actions',\n 'context',\n 'divider',\n 'header',\n 'image',\n 'input',\n 'rich_text',\n 'section',\n 'table',\n 'video'\n]);\n\n/** Max child blocks Slack accepts in a container. */\nexport const MAX_CONTAINER_CHILDREN = 10;\n\n/** Whether a block type may be dropped inside a container. */\nexport function isContainerChildType(type: SupportedBlockType): boolean {\n return CONTAINER_CHILD_TYPES.has(type);\n}\n\n/** dnd-kit droppable id prefix for a container's body (the child drop zone). */\nconst BODY_PREFIX = 'container-body:';\n\n/** Build the droppable id for a container body. */\nexport function containerBodyId(containerId: string): string {\n return `${BODY_PREFIX}${containerId}`;\n}\n\n/** Parse a container-body droppable id back to its container id, or null. */\nexport function parseContainerBodyId(id: string | number): string | null {\n if (typeof id !== 'string' || !id.startsWith(BODY_PREFIX)) {\n return null;\n }\n return id.slice(BODY_PREFIX.length);\n}\n","import type { ReactNode } from 'react';\nimport type { CustomEmoji } from '../types';\n\n/**\n * The emoji object `slack-blocks-to-jsx` hands to the `emoji` hook. Mirrors\n * the upstream `Emoji` type without importing it, so we don't leak the\n * library's internal types into our surface. `unicode` / `skin_tone` are only\n * present for rich-text emoji elements; mrkdwn emoji arrive with `name` alone.\n */\ninterface HookEmoji {\n name: string;\n unicode?: string;\n skin_tone?: 1 | 2 | 3 | 4 | 5 | 6;\n}\n\n/** The shape of the `emoji` hook expected by `slack-blocks-to-jsx`. */\nexport type EmojiHook = (data: HookEmoji, parse: (data: HookEmoji) => string) => ReactNode;\n\n/**\n * Builds the `emoji` preview hook from a `byName` lookup of workspace custom\n * emoji. Resolution mirrors the companion site's `InlineEmoji` logic:\n *\n * - A matching entry with a `url` renders the workspace image.\n * - A matching alias entry (no `url`) defers to the library's default parser\n * using the alias target's name, preserving any `unicode` / `skin_tone`.\n * - Anything else (standard emoji, or an unknown name) falls through to the\n * library's default parser unchanged.\n *\n * The hook never alters the underlying payload — `url` is render-only.\n *\n * @param byName - lookup of custom emoji keyed by codename\n * @returns an `emoji` hook for `slack-blocks-to-jsx`\n */\nexport function makeEmojiHook(byName: Map<string, CustomEmoji>): EmojiHook {\n return (data, parse) => {\n const entry = byName.get(data.name);\n if (entry) {\n if (entry.url) {\n return (\n <img\n src={entry.url}\n alt={`:${data.name}:`}\n title={`:${data.name}:`}\n className=\"bk-custom-emoji\"\n style={{\n display: 'inline-block',\n width: '1.25em',\n height: '1.25em',\n verticalAlign: '-0.25em',\n objectFit: 'contain'\n }}\n />\n );\n }\n if (entry.alias) {\n return parse({ name: entry.alias, unicode: data.unicode, skin_tone: data.skin_tone });\n }\n }\n return parse(data);\n };\n}\n","import {\n AlignLeft,\n Bell,\n ChartColumnBig,\n Container,\n FileText,\n GalleryHorizontal,\n Image as ImageIcon,\n LayoutTemplate,\n MousePointerClick,\n Pilcrow,\n Sparkles,\n Table as TableIcon,\n TextCursorInput,\n Video as VideoIcon\n} from 'lucide-react';\nimport type { ComponentType, SVGProps } from 'react';\nimport 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 (\"All selects\", \"Datepickers\",\n * \"Filtered conversation\", 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 related variants under a\n * single heading + icon, matching Slack's Block Kit Builder sidebar\n * (Agents, Markdown, Section, Actions, Input, Structure, Rich Text,\n * Image, Card and Carousel, Table).\n *\n * Variant ids must be unique across the entire palette — the drag-drop\n * variant lookup keys by id, so a duplicate would shadow the earlier one.\n */\nexport interface PaletteSection {\n /** Visible heading for the section. */\n name: string;\n /** Lucide icon component rendered next to the section heading. */\n icon: ComponentType<SVGProps<SVGSVGElement>>;\n variants: PaletteVariant[];\n}\n\n/**\n * The built-in palette. Mirrors Slack's real Block Kit Builder: related\n * variants (e.g. every select type) are combined into single showcase\n * `actions` blocks (\"All selects\", \"Datepickers\") rather than each\n * variant being its own row. The full set of single-element `input`\n * variants is still available via {@link legacyInputVariants}.\n */\nexport const defaultPalette: readonly PaletteSection[] = [\n {\n name: 'Agents',\n icon: Sparkles,\n variants: [\n {\n id: 'agents_feedback_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: 'agents_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 id: 'agents_plan',\n label: 'Plan',\n factory: () => ({\n type: 'plan',\n title: 'Investigating the issue',\n tasks: [\n {\n type: 'task_card',\n task_id: 'task_1',\n title: 'Read the bug report',\n status: 'complete'\n },\n {\n type: 'task_card',\n task_id: 'task_2',\n title: 'Reproduce the error locally',\n status: 'in_progress'\n },\n {\n type: 'task_card',\n task_id: 'task_3',\n title: 'Identify the root cause',\n status: 'pending'\n }\n ]\n })\n },\n {\n id: 'agents_task_card',\n label: 'Task card',\n factory: () => ({\n type: 'task_card',\n task_id: 'task_1',\n title: 'Summarize the latest release notes',\n status: 'in_progress'\n })\n },\n {\n id: 'agents_task_card_with_sources',\n label: 'Task card with sources',\n factory: () => ({\n type: 'task_card',\n task_id: 'task_2',\n title: 'Cite supporting docs',\n status: 'complete',\n sources: [\n {\n type: 'url',\n url: 'https://example.com/runbook',\n text: 'Runbook'\n },\n {\n type: 'url',\n url: 'https://example.com/changelog',\n text: 'Changelog'\n }\n ]\n })\n }\n ]\n },\n {\n name: 'Markdown',\n icon: FileText,\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 icon: AlignLeft,\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: 'Actions',\n icon: MousePointerClick,\n variants: [\n {\n id: 'actions_all_selects',\n label: 'All selects',\n factory: () => ({\n type: 'actions',\n elements: [\n {\n type: 'static_select',\n action_id: 'static_select',\n placeholder: { type: 'plain_text', text: 'Static', emoji: true },\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 },\n {\n type: 'users_select',\n action_id: 'users_select',\n placeholder: { type: 'plain_text', text: 'User', emoji: true }\n },\n {\n type: 'channels_select',\n action_id: 'channels_select',\n placeholder: { type: 'plain_text', text: 'Channel', emoji: true }\n },\n {\n type: 'conversations_select',\n action_id: 'conversations_select',\n placeholder: {\n type: 'plain_text',\n text: 'Conversation',\n emoji: true\n }\n },\n {\n type: 'external_select',\n action_id: 'external_select',\n placeholder: { type: 'plain_text', text: 'External', emoji: true },\n min_query_length: 0\n }\n ]\n })\n },\n {\n id: 'actions_filtered_conversation',\n label: 'Filtered conversation',\n factory: () => ({\n type: 'actions',\n elements: [\n {\n type: 'conversations_select',\n action_id: 'filtered_conversations_select',\n placeholder: {\n type: 'plain_text',\n text: 'Pick a public channel',\n emoji: true\n },\n filter: {\n include: ['public'],\n exclude_bot_users: true,\n exclude_external_shared_channels: true\n }\n }\n ]\n })\n },\n {\n id: 'actions_selects_initial_values',\n label: 'Selects with initial values',\n factory: () => ({\n type: 'actions',\n elements: [\n {\n type: 'static_select',\n action_id: 'static_select_initial',\n placeholder: { type: 'plain_text', text: 'Pick one', emoji: true },\n initial_option: {\n text: { type: 'plain_text', text: 'Option 2', emoji: true },\n value: 'option_2'\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 type: 'users_select',\n action_id: 'users_select_initial',\n placeholder: { type: 'plain_text', text: 'Pick a user', emoji: true },\n initial_user: 'U0LAN0Z89'\n },\n {\n type: 'channels_select',\n action_id: 'channels_select_initial',\n placeholder: {\n type: 'plain_text',\n text: 'Pick a channel',\n emoji: true\n },\n initial_channel: 'C012AB3CD'\n }\n ]\n })\n },\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_datepickers',\n label: 'Datepickers',\n factory: () => ({\n type: 'actions',\n elements: [\n {\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 type: 'timepicker',\n action_id: 'timepicker',\n placeholder: {\n type: 'plain_text',\n text: 'Select a time',\n emoji: true\n }\n },\n {\n type: 'datetimepicker',\n action_id: 'datetimepicker'\n }\n ]\n })\n },\n {\n id: 'actions_checkboxes',\n label: 'Checkboxes',\n factory: () => ({\n type: 'actions',\n elements: [\n {\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 {\n id: 'actions_radio_buttons',\n label: 'Radio buttons',\n factory: () => ({\n type: 'actions',\n elements: [\n {\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 {\n id: 'actions_timepicker',\n label: 'Timepicker',\n factory: () => ({\n type: 'actions',\n elements: [\n {\n type: 'timepicker',\n action_id: 'timepicker_only',\n placeholder: {\n type: 'plain_text',\n text: 'Select a time',\n emoji: true\n }\n }\n ]\n })\n }\n ]\n },\n {\n name: 'Input',\n icon: TextCursorInput,\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_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_rich_text',\n label: 'Rich text',\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: 'Structure',\n icon: LayoutTemplate,\n variants: [\n {\n id: 'structure_header',\n label: 'Header',\n factory: () => ({\n type: 'header',\n text: { type: 'plain_text', text: 'Heading text', emoji: true }\n })\n },\n {\n id: 'structure_divider',\n label: 'Divider',\n factory: () => ({ type: 'divider' })\n },\n {\n id: 'structure_context_plain',\n label: 'Context (plain text)',\n factory: () => ({\n type: 'context',\n elements: [{ type: 'plain_text', text: 'Posted by your app', emoji: true }]\n })\n },\n {\n id: 'structure_context_mrkdwn',\n label: 'Context (mrkdwn)',\n factory: () => ({\n type: 'context',\n elements: [{ type: 'mrkdwn', text: 'Posted by *your app*' }]\n })\n },\n {\n id: 'structure_context_text_images',\n label: 'Context (text + 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: 'Alert',\n icon: Bell,\n variants: [\n {\n id: 'alert_default',\n label: 'Default',\n factory: () => ({\n type: 'alert',\n text: {\n type: 'mrkdwn',\n text: 'A neutral alert message.'\n }\n })\n },\n {\n id: 'alert_info',\n label: 'Info',\n factory: () => ({\n type: 'alert',\n level: 'info',\n text: {\n type: 'mrkdwn',\n text: 'FYI: the build finished in 42 seconds.'\n }\n })\n },\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 id: 'alert_error',\n label: 'Error',\n factory: () => ({\n type: 'alert',\n level: 'error',\n text: {\n type: 'mrkdwn',\n text: 'Something went wrong. Please try again.'\n }\n })\n },\n {\n id: 'alert_success',\n label: 'Success',\n factory: () => ({\n type: 'alert',\n level: 'success',\n text: {\n type: 'mrkdwn',\n text: 'Your changes have been saved.'\n }\n })\n }\n ]\n },\n {\n name: 'Rich Text',\n icon: Pilcrow,\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: 'Image',\n icon: ImageIcon,\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: 'Video',\n icon: VideoIcon,\n variants: [\n {\n id: 'video_basic',\n label: 'Basic',\n factory: () => ({\n type: 'video',\n alt_text: 'A short demo video',\n title: { type: 'plain_text', text: 'Product demo', emoji: true },\n thumbnail_url: 'https://placehold.co/600x340?text=Video',\n video_url: 'https://www.youtube.com/embed/dQw4w9WgXcQ'\n })\n },\n {\n id: 'video_with_metadata',\n label: 'With metadata',\n factory: () => ({\n type: 'video',\n alt_text: 'A short demo video',\n title: { type: 'plain_text', text: 'Product demo', emoji: true },\n title_url: 'https://www.youtube.com/watch?v=dQw4w9WgXcQ',\n thumbnail_url: 'https://placehold.co/600x340?text=Video',\n video_url: 'https://www.youtube.com/embed/dQw4w9WgXcQ',\n author_name: 'Acme',\n description: {\n type: 'plain_text',\n text: 'A short walkthrough of the new release.',\n emoji: true\n },\n provider_name: 'YouTube',\n provider_icon_url: 'https://placehold.co/16x16?text=YT'\n })\n }\n ]\n },\n {\n name: 'Card and Carousel',\n icon: GalleryHorizontal,\n variants: [\n {\n id: 'card_basic',\n label: 'Card',\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: 'Card 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: 'Card 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 id: 'carousel_basic',\n label: 'Carousel',\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: 'Table',\n icon: TableIcon,\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 {\n name: 'Data Visualization',\n icon: ChartColumnBig,\n variants: [\n {\n id: 'dataviz_line',\n label: 'Line chart',\n factory: () => ({\n type: 'data_visualization',\n title: 'Weekly active users by platform',\n chart: {\n type: 'line',\n series: [\n {\n name: 'Desktop',\n data: [\n { label: 'Mon', value: 800 },\n { label: 'Tue', value: 920 },\n { label: 'Wed', value: 880 },\n { label: 'Thu', value: 1010 },\n { label: 'Fri', value: 1120 }\n ]\n },\n {\n name: 'Mobile',\n data: [\n { label: 'Mon', value: 400 },\n { label: 'Tue', value: 530 },\n { label: 'Wed', value: 500 },\n { label: 'Thu', value: 590 },\n { label: 'Fri', value: 600 }\n ]\n }\n ],\n axis_config: {\n categories: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri'],\n x_label: 'Day',\n y_label: 'Users'\n }\n }\n })\n },\n {\n id: 'dataviz_bar',\n label: 'Bar chart',\n factory: () => ({\n type: 'data_visualization',\n title: 'Messages sent by platform',\n chart: {\n type: 'bar',\n series: [\n {\n name: 'Desktop',\n data: [\n { label: 'Mon', value: 1500 },\n { label: 'Tue', value: 1400 },\n { label: 'Wed', value: 1700 },\n { label: 'Thu', value: 1600 },\n { label: 'Fri', value: 1280 }\n ]\n },\n {\n name: 'Mobile',\n data: [\n { label: 'Mon', value: 800 },\n { label: 'Tue', value: 750 },\n { label: 'Wed', value: 920 },\n { label: 'Thu', value: 880 },\n { label: 'Fri', value: 700 }\n ]\n }\n ],\n axis_config: {\n categories: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri'],\n x_label: 'Day',\n y_label: 'Messages'\n }\n }\n })\n },\n {\n id: 'dataviz_area',\n label: 'Area chart',\n factory: () => ({\n type: 'data_visualization',\n title: 'Concurrent users by platform',\n chart: {\n type: 'area',\n series: [\n {\n name: 'Desktop',\n data: [\n { label: 'Mon', value: 2800 },\n { label: 'Tue', value: 3000 },\n { label: 'Wed', value: 3400 },\n { label: 'Thu', value: 3200 },\n { label: 'Fri', value: 3500 }\n ]\n },\n {\n name: 'Mobile',\n data: [\n { label: 'Mon', value: 1400 },\n { label: 'Tue', value: 1500 },\n { label: 'Wed', value: 1700 },\n { label: 'Thu', value: 1600 },\n { label: 'Fri', value: 1800 }\n ]\n }\n ],\n axis_config: {\n categories: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri'],\n x_label: 'Day',\n y_label: 'Users'\n }\n }\n })\n },\n {\n id: 'dataviz_pie',\n label: 'Pie chart',\n factory: () => ({\n type: 'data_visualization',\n title: 'Plan distribution by tier',\n chart: {\n type: 'pie',\n segments: [\n { label: 'Free', value: 4200 },\n { label: 'Pro', value: 2300 },\n { label: 'Business+', value: 1100 },\n { label: 'Enterprise', value: 480 }\n ]\n }\n })\n }\n ]\n },\n {\n name: 'Container',\n icon: Container,\n variants: [\n {\n id: 'container_collapsible',\n label: 'Collapsible container',\n factory: () => ({\n type: 'container',\n title: { type: 'plain_text', text: 'Bulk update: 2 records selected' },\n subtitle: { type: 'plain_text', text: 'Review changes before confirming' },\n is_collapsible: true,\n child_blocks: [\n {\n type: 'section',\n text: { type: 'mrkdwn', text: '*DCW-1024*\\nStatus: Open → Closed' }\n },\n { type: 'divider' },\n {\n type: 'section',\n text: { type: 'mrkdwn', text: '*DCW-1025*\\nStatus: In Progress → Closed' }\n },\n {\n type: 'actions',\n elements: [\n {\n type: 'button',\n text: { type: 'plain_text', text: 'Confirm All', emoji: true },\n style: 'primary',\n action_id: 'bulk_confirm'\n },\n {\n type: 'button',\n text: { type: 'plain_text', text: 'Cancel', emoji: true },\n action_id: 'bulk_cancel'\n }\n ]\n }\n ]\n })\n }\n ]\n }\n] as const;\n\n/**\n * The single-element `input`-block variants that used to ship in\n * `defaultPalette` before it was consolidated to mirror Slack's Block\n * Kit Builder. Kept reachable so consumers who referenced these ids via\n * the `palette` prop can spread them back into a custom palette.\n *\n * @example\n * ```tsx\n * import { defaultPalette, legacyInputVariants } from '@tightknitai/block-kitchen';\n * import { TextCursorInput } from 'lucide-react';\n *\n * const palette = [\n * ...defaultPalette,\n * { name: 'All inputs', icon: TextCursorInput, variants: [...legacyInputVariants] }\n * ];\n * ```\n *\n * Note: some ids here (`input_plain_text`, `input_date`, etc.) collide\n * with curated ids in the new `defaultPalette`. `buildVariantById`\n * keeps the last entry for a given id, so spread `legacyInputVariants`\n * after `defaultPalette` to use the legacy factory.\n */\nexport const legacyInputVariants: readonly PaletteVariant[] = [\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] as const;\n\n/**\n * Standalone `alert` block variant. The full set of severity-level alert\n * variants ships in `defaultPalette` under the \"Alert\" section; this\n * export is retained for backward compatibility with consumers who\n * previously spread it onto a custom palette. Shares the `alert_warning`\n * id with its counterpart in `defaultPalette` — spread after\n * `defaultPalette` (or omit it entirely) to avoid duplicate-id lookups.\n */\nexport const extraAlertVariant: PaletteVariant = {\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 * Builds a lookup table mapping a variant id to its definition for a\n * resolved palette. Used by the DnD drop handler to resolve a\n * `palette:${id}` drag back to a factory.\n * @param sections - the palette in use (defaults or a consumer-provided one)\n * @returns a map keyed by variant id\n */\nexport function buildVariantById(sections: readonly PaletteSection[]): ReadonlyMap<string, PaletteVariant> {\n return new Map(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 case 'video':\n return 'Video';\n case 'plan':\n return 'Plan';\n case 'task_card':\n return 'Task Card';\n case 'data_visualization':\n return 'Data Visualization';\n case 'container':\n return 'Container';\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 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 'bk-portal-content 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\ntype SheetSide = 'right' | 'left' | 'top' | 'bottom';\n\nconst SHEET_SIDE_CLASSES: Record<SheetSide, string> = {\n right:\n 'inset-y-0 right-0 h-full w-full max-w-md border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right',\n left: 'inset-y-0 left-0 h-full w-full max-w-md border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left',\n top: 'inset-x-0 top-0 w-full border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top',\n bottom:\n 'inset-x-0 bottom-0 w-full rounded-t-xl border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom'\n};\n\ninterface SheetContentProps extends React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content> {\n /**\n * Which edge the sheet slides in from. Defaults to `'right'`. `'bottom'`\n * is the natural fit for mobile contexts.\n */\n side?: SheetSide;\n /**\n * When true, hides the built-in close button. Set when the sheet\n * provides its own close affordance.\n */\n hideClose?: boolean;\n}\n\nconst SheetContent = React.forwardRef<React.ElementRef<typeof DialogPrimitive.Content>, SheetContentProps>(\n ({ className, children, side = 'right', hideClose = false, ...props }, ref) => (\n <DialogPrimitive.Portal>\n <SheetOverlay />\n <DialogPrimitive.Content\n ref={ref}\n className={cn(\n 'bk-portal-content fixed z-50 flex flex-col gap-4 bg-background p-6 shadow-lg transition ease-in-out data-[state=open]:animate-in data-[state=closed]:animate-out',\n SHEET_SIDE_CLASSES[side],\n className\n )}\n {...props}\n >\n {children}\n {hideClose ? null : (\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 )}\n </DialogPrimitive.Content>\n </DialogPrimitive.Portal>\n )\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 * 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 'bk-portal-content 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 { useEffect, useState } from 'react';\n\n/**\n * Viewport breakpoint (in px) below which we treat the UI as \"mobile\".\n * Matches Tailwind's default `md` breakpoint so utility classes like\n * `md:flex` line up with the JS behavior switch.\n */\nexport const MOBILE_BREAKPOINT_PX = 768;\n\n/**\n * Returns `true` whenever the viewport width is below\n * {@link MOBILE_BREAKPOINT_PX}. Subscribes to `matchMedia` so callers\n * re-render on rotate / window resize without polling. Server-rendered\n * pages start as `false` and update on hydration.\n */\nexport function useIsMobile(): boolean {\n const [isMobile, setIsMobile] = useState<boolean>(() => {\n if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') return false;\n return window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT_PX - 1}px)`).matches;\n });\n\n useEffect(() => {\n if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') return;\n const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT_PX - 1}px)`);\n const onChange = (e: MediaQueryListEvent) => setIsMobile(e.matches);\n // Sync on mount in case state seeded before media query attached.\n setIsMobile(mql.matches);\n mql.addEventListener('change', onChange);\n return () => mql.removeEventListener('change', onChange);\n }, []);\n\n return isMobile;\n}\n","import { createContext, type ReactNode, useContext, useMemo } from 'react';\nimport type { CustomEmoji } from '../types';\n\n/**\n * The value exposed to the builder tree: the raw `customEmojis` list plus a\n * `byName` lookup keyed on each entry's codename. Built once at the\n * {@link BlockKitchen} root so editors (emoji picker) and the preview can\n * resolve `:custom:` directives without prop-drilling through\n * `Surface → block-row → block-editor → *-editor`.\n */\nexport interface CustomEmojiContextValue {\n /** The custom emoji passed to {@link BlockKitchenProps.customEmojis}. */\n customEmojis: CustomEmoji[];\n /** Lookup of each custom emoji by its codename (`name`). */\n byName: Map<string, CustomEmoji>;\n}\n\nconst EMPTY: CustomEmojiContextValue = {\n customEmojis: [],\n byName: new Map()\n};\n\nconst CustomEmojiContext = createContext<CustomEmojiContextValue>(EMPTY);\n\n/**\n * Provides the workspace custom emoji to the builder tree. Memoizes the\n * `byName` lookup so consumers get a stable reference while `customEmojis`\n * is unchanged. When `customEmojis` is omitted the context resolves to an\n * empty, shared value so descendants behave exactly as they did before the\n * prop existed.\n *\n * @param props.customEmojis - the workspace custom emoji (may be undefined)\n * @param props.children - the subtree that can read the context\n */\nexport function CustomEmojiProvider({ customEmojis, children }: { customEmojis?: CustomEmoji[]; children: ReactNode }) {\n const value = useMemo<CustomEmojiContextValue>(() => {\n if (!customEmojis || customEmojis.length === 0) {\n return EMPTY;\n }\n const byName = new Map<string, CustomEmoji>();\n for (const emoji of customEmojis) {\n byName.set(emoji.name, emoji);\n }\n return { customEmojis, byName };\n }, [customEmojis]);\n\n return <CustomEmojiContext.Provider value={value}>{children}</CustomEmojiContext.Provider>;\n}\n\n/**\n * Reads the custom emoji context. Returns the empty value when called outside\n * a {@link CustomEmojiProvider}, so it is always safe to call.\n */\nexport function useCustomEmojis(): CustomEmojiContextValue {\n return useContext(CustomEmojiContext);\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 * Leading path token in a validator message that scopes the error to a\n * single block, e.g. `blocks[2]`, `blocks[2].elements`, `blocks[0].type`.\n * `@tightknitai/slack-block-kit-validator` (>= 0.1.x) emits dot/bracket\n * paths like `blocks[1].elements: fewer than 1 items`; cross-block caveat\n * helpers use a bare space (`blocks[1].block_id must be unique — ...`).\n * The capture group is the zero-based block index.\n */\nconst BLOCK_PREFIX = /^blocks\\[(\\d+)\\]/;\n\n/**\n * Returns the block index a validator message is scoped to, or null when the\n * message isn't rooted at a specific `blocks[N]` entry (root errors, the\n * blocks-array-itself errors a view envelope can raise, etc).\n * @param raw - a single error string from `validateBlockKit`\n * @returns the zero-based block index, or null\n */\nfunction extractBlockIndex(raw: string): number | null {\n const match = BLOCK_PREFIX.exec(raw);\n return match ? Number.parseInt(match[1], 10) : null;\n}\n\n/**\n * Strips the `blocks[N]` prefix from a block-scoped message so the text\n * shown next to a block doesn't redundantly repeat the block index, keeping\n * any sub-path as useful context.\n *\n * - `blocks[1].elements: fewer than 1 items` → `elements: fewer than 1 items`\n * - `blocks[0]: missing required property 'text'` → `missing required property 'text'`\n * - `blocks[1].block_id must be unique — …` → `block_id must be unique — …`\n *\n * @param raw - the original block-scoped error string\n * @returns the message without its leading `blocks[N]` prefix\n */\nfunction toBlockMessage(raw: string): string {\n const rest = raw.replace(BLOCK_PREFIX, '');\n // Block-root errors read `blocks[N]: <message>` — drop the orphaned colon\n // so we're left with just the message.\n if (rest.startsWith(':')) {\n return rest.replace(/^:\\s*/, '');\n }\n // Sub-path errors keep the path as context; drop only the joining dot\n // (`.elements` → `elements`), leaving bracket indices (`[0]`) intact.\n return rest.replace(/^\\./, '');\n}\n\n/**\n * Lightly cleans a non-block-scoped message for display, dropping the\n * `(root)` sentinel the validator uses for top-level issues.\n * @param raw - the original general error string\n * @returns the cleaned message\n */\nfunction toGeneralMessage(raw: string): string {\n return raw.startsWith('(root)') ? raw.replace(/^\\(root\\):?\\s*/, '') : raw;\n}\n\n/**\n * Splits a flat array of validator error strings into per-block buckets\n * keyed by the matching {@link BuilderBlock.id}, plus a general bucket for\n * anything not tied to a single block.\n *\n * Pairs with `@tightknitai/slack-block-kit-validator` >= 0.1.x, which\n * collapses the AJV `oneOf` cascade (one structural mistake no longer yields\n * ~25 branch errors) and emits `blocks[N]...`-rooted paths. The exact path\n * shape is pinned by `error-grouping.test.ts`.\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 const idx = extractBlockIndex(raw);\n if (idx === null || idx >= blocks.length) {\n general.push(toGeneralMessage(raw));\n continue;\n }\n\n const id = blocks[idx].id;\n const bucket = byBlockId.get(id) ?? [];\n bucket.push(toBlockMessage(raw));\n byBlockId.set(id, bucket);\n }\n\n return { byBlockId, general, total: errors.length };\n}\n","/**\n * URL-scheme allowlists used as a defense-in-depth layer against\n * DOM-XSS via user-supplied URLs that flow into `<a href>` and `<img src>`\n * in the preview (rendered by `slack-blocks-to-jsx`, which does not\n * filter URI schemes itself) or in the builder's own chrome (e.g. the\n * \"Sign in with Slack\" link in `SendDialog`).\n *\n * `format: \"uri\"` on the validator schema (AJV / ajv-formats) accepts\n * any RFC-3986 URI including `javascript:` and `data:`, so the validator\n * cannot be relied on for this purpose.\n *\n * Mirrors react-markdown 9's `defaultUrlTransform` approach: parse the\n * scheme, allow the safe set, and treat anything without a recognized\n * scheme as a relative URL (preserved as-is).\n */\n\n/**\n * Schemes safe to use as an `<a href>` target.\n * Mirrors react-markdown's `safeProtocol` set (`https?|ircs?|mailto|xmpp`)\n * plus `tel` and `sms` (Slack's documented link types).\n */\nconst SAFE_LINK_PROTOCOLS = /^(https?|ircs?|mailto|tel|sms|xmpp)$/i;\n\n/**\n * Schemes safe to use as an `<img src>` source. We allow `data:image/*`\n * because Slack itself emits inline images that way for some emoji and\n * file thumbnails; everything else (e.g. `data:text/html`, `data:image/svg+xml`\n * — which can carry script in some contexts) is rejected.\n */\nconst SAFE_IMAGE_PROTOCOLS = /^(https?)$/i;\n// Allow `data:image/<safe-mime>` followed by any sequence of media-type\n// parameters. Each parameter is `;<name>` or `;<name>=<value>` (RFC 2397\n// allows the bare `;base64` token, which has no `=`). The comma\n// terminates the parameter list and starts the payload.\nconst SAFE_IMAGE_DATA_PREFIX =\n /^data:image\\/(?:png|jpeg|jpg|gif|webp|avif|x-icon|vnd\\.microsoft\\.icon)(?:;[a-z0-9-]+(?:=[^,;]*)?)*,/i;\n\n/**\n * Splits a URL into its scheme prefix and tail without invoking the\n * `URL` constructor (which throws on relative URLs and varies in how\n * it normalizes whitespace and unicode). Matches react-markdown's\n * approach: look for the first `:`, `?`, `#`, or `/`; if `:` comes\n * first, that prefix is the scheme.\n * @param value - the candidate URL\n * @returns the lowercase scheme if the URL is absolute, or `null` if relative\n */\nfunction getScheme(value: string): string | null {\n // Strip leading whitespace so `\\tjavascript:` and ` javascript:`\n // still resolve to the `javascript` scheme; browsers ignore leading\n // whitespace when following an href, so the sanitizer must too.\n const trimmed = value.replace(/^\\s+/, '');\n const colon = trimmed.indexOf(':');\n if (colon === -1) {\n return null;\n }\n const slash = trimmed.indexOf('/');\n const question = trimmed.indexOf('?');\n const hash = trimmed.indexOf('#');\n // If any of `/`, `?`, `#` appears before the `:`, then the `:` is\n // inside the path/query/fragment, not a scheme delimiter — treat the\n // URL as relative.\n if ((slash !== -1 && slash < colon) || (question !== -1 && question < colon) || (hash !== -1 && hash < colon)) {\n return null;\n }\n return trimmed.slice(0, colon).toLowerCase();\n}\n\n/**\n * Returns true when `value` is safe to use as an `<a href>` target.\n * Accepts:\n * - absolute URLs whose scheme is in the safe-link allowlist\n * (`http`, `https`, `ircs?`, `mailto`, `tel`, `sms`, `xmpp`).\n * - relative URLs (no scheme).\n * - empty string (caller decides whether to render).\n *\n * Rejects `javascript:`, `data:`, `vbscript:`, `file:`, `about:`,\n * and any other unrecognized scheme.\n * @param value - the candidate URL\n * @returns true when the URL is safe to render as a link\n */\nexport function isSafeHref(value: string | null | undefined): boolean {\n if (value === null || value === undefined) {\n return false;\n }\n if (typeof value !== 'string') {\n return false;\n }\n if (value.length === 0) {\n return true;\n }\n const scheme = getScheme(value);\n if (scheme === null) {\n return true;\n }\n return SAFE_LINK_PROTOCOLS.test(scheme);\n}\n\n/**\n * Returns true when `value` carries an explicit, safe URL scheme\n * (e.g. `https://example.com`, `mailto:a@b.com`).\n *\n * Used to gate the TipTap link extension's autolinker. TipTap's default\n * `shouldAutoLink` links any token containing a dot whose host isn't a\n * bare IPv4 — so `2.xyz`, `report.zip`, or `logo.png` all become links\n * just because the suffix happens to be a real gTLD. Requiring an\n * explicit scheme means only URLs the user actually typed as links\n * (`https://…`) auto-link; bare host-like text stays plain text, and\n * deliberate links can still be added via the link button or by typing\n * the scheme. Schemes outside the safe-link allowlist are rejected here\n * too, so an unsafe scheme can never be auto-linked.\n * @param value - the candidate URL (the linkifier's matched token text)\n * @returns true when the value has an explicit, allowlisted scheme\n */\nexport function hasExplicitSafeScheme(value: string | null | undefined): boolean {\n if (typeof value !== 'string' || value.length === 0) {\n return false;\n }\n return getScheme(value) !== null && isSafeHref(value);\n}\n\n/**\n * Returns true when `value` is safe to use as an `<img src>`.\n * Accepts http(s), relative URLs, empty string, and `data:image/*`\n * URLs whose MIME subtype is in a tight allowlist. Rejects\n * `data:image/svg+xml` (can carry script) and everything else.\n * @param value - the candidate URL\n * @returns true when the URL is safe to render as an image\n */\nexport function isSafeImageSrc(value: string | null | undefined): boolean {\n if (value === null || value === undefined) {\n return false;\n }\n if (typeof value !== 'string') {\n return false;\n }\n if (value.length === 0) {\n return true;\n }\n const scheme = getScheme(value);\n if (scheme === null) {\n return true;\n }\n if (scheme === 'data') {\n return SAFE_IMAGE_DATA_PREFIX.test(value);\n }\n return SAFE_IMAGE_PROTOCOLS.test(scheme);\n}\n\n/**\n * Returns `value` if it passes {@link isSafeHref}, otherwise an empty\n * string. Use at render time / payload boundaries so an unsafe URL\n * never reaches the DOM as an `href` attribute.\n * @param value - the candidate URL\n * @returns the URL if safe, or `''`\n */\nexport function sanitizeHref(value: string | null | undefined): string {\n return isSafeHref(value) ? (value ?? '') : '';\n}\n\n/**\n * Returns `value` if it passes {@link isSafeImageSrc}, otherwise an\n * empty string. Use at render time / payload boundaries.\n * @param value - the candidate URL\n * @returns the URL if safe, or `''`\n */\nexport function sanitizeImageSrc(value: string | null | undefined): string {\n return isSafeImageSrc(value) ? (value ?? '') : '';\n}\n","import type { SupportedBlock } from '../types';\nimport { sanitizeHref, sanitizeImageSrc } from './url-safety';\n\n/**\n * Recursively walks an unknown value and rewrites string values at the\n * specified keys via the matching sanitizer. Used to strip dangerous\n * URI schemes (e.g. `javascript:`) from `url`, `image_url`, and\n * rich-text link `url` fields before a Block Kit payload reaches a\n * renderer or is handed back to the consumer.\n *\n * Allocates a new object whenever a child is rewritten; otherwise\n * returns the input unchanged so unaffected payloads are reference-stable.\n *\n * Defensive against prototype-polluted shapes: copies are made via\n * `Object.assign({}, ...)` over own enumerable keys returned by\n * `Object.keys`, which skips inherited properties.\n */\nconst HREF_KEYS = new Set(['url']);\nconst IMAGE_KEYS = new Set(['image_url']);\n\n/**\n * Read-only metadata Slack attaches when a message is *retrieved* via the\n * API, but rejects on *send*, keyed by the `type` of the object it appears\n * on. Blocks loaded from an existing message carry these; drop them only\n * from the matching object type — some are common field names (`fallback`)\n * that are valid elsewhere — so a round-tripped payload stays send-valid\n * without over-scrubbing. Add an entry to extend this to other block types.\n */\nconst RETRIEVAL_ONLY_KEYS = new Map<string, Set<string>>([\n // Covers both the image block and the image element — both `type: 'image'`.\n ['image', new Set(['image_width', 'image_height', 'image_bytes', 'fallback', 'is_animated'])]\n]);\n\n/**\n * Recursively sanitize all known URL-bearing string fields inside a\n * Slack Block Kit payload fragment. Returns a value with the same\n * structural shape, where any field whose name matches an href or\n * image-src key has been replaced by the safe variant (`''` if the\n * original scheme was unsafe).\n * @param value - any payload fragment (object, array, primitive)\n * @returns the sanitized payload fragment\n */\nfunction sanitizeValue(value: unknown): unknown {\n if (value === null || typeof value !== 'object') {\n return value;\n }\n if (Array.isArray(value)) {\n let changed = false;\n const out = new Array(value.length);\n for (let i = 0; i < value.length; i++) {\n const next = sanitizeValue(value[i]);\n if (next !== value[i]) {\n changed = true;\n }\n out[i] = next;\n }\n return changed ? out : value;\n }\n const src = value as Record<string, unknown>;\n const dropKeys = typeof src.type === 'string' ? RETRIEVAL_ONLY_KEYS.get(src.type) : undefined;\n let copy: Record<string, unknown> | null = null;\n for (const key of Object.keys(src)) {\n if (dropKeys?.has(key)) {\n copy ??= { ...src };\n delete copy[key];\n continue;\n }\n const original = src[key];\n let next: unknown = original;\n if (typeof original === 'string') {\n if (HREF_KEYS.has(key)) {\n next = sanitizeHref(original);\n } else if (IMAGE_KEYS.has(key)) {\n next = sanitizeImageSrc(original);\n }\n } else if (typeof original === 'object' && original !== null) {\n next = sanitizeValue(original);\n }\n if (next !== original) {\n if (!copy) {\n copy = { ...src };\n }\n copy[key] = next;\n }\n }\n return copy ?? src;\n}\n\n/**\n * Sanitize a single Block Kit block, scrubbing dangerous URI schemes\n * from `url` and `image_url` fields anywhere in the payload tree.\n * @param block - the block payload to sanitize\n * @returns the sanitized block (same reference if nothing changed)\n */\nexport function sanitizeBlock<T extends SupportedBlock>(block: T): T {\n return sanitizeValue(block) as T;\n}\n\n/**\n * Sanitize an array of Block Kit blocks. See {@link sanitizeBlock}.\n * @param blocks - the block payloads to sanitize\n * @returns the sanitized blocks\n */\nexport function sanitizeBlocks(blocks: SupportedBlock[]): SupportedBlock[] {\n let changed = false;\n const out = new Array<SupportedBlock>(blocks.length);\n for (let i = 0; i < blocks.length; i++) {\n const next = sanitizeBlock(blocks[i]);\n if (next !== blocks[i]) {\n changed = true;\n }\n out[i] = next;\n }\n return changed ? out : blocks;\n}\n","import type { SupportedBlock } from '../types';\nimport { sanitizeBlock } from './sanitize-blocks';\n\n/**\n * Strip builder-only fields from blocks so they conform to Slack's\n * Block Kit schema, and scrub dangerous URI schemes from any\n * `url`/`image_url` fields. Currently removes the cosmetic `level`\n * field from header blocks (a builder-only extension Slack would\n * reject) and routes every URL/image-url through the allowlist in\n * `lib/url-safety.ts` so a payload that round-trips through the\n * builder cannot carry `javascript:`/`data:text/html` URIs to a\n * downstream consumer or to the Slack API.\n * @param blocks - the working draft blocks\n * @returns blocks with builder-only fields removed and URLs scrubbed\n */\nexport function toSlackBlocks(blocks: SupportedBlock[]): SupportedBlock[] {\n return blocks.map((block) => {\n const safe = sanitizeBlock(block);\n if (safe.type === 'header' && 'level' in safe) {\n const { level: _omit, ...rest } = safe;\n return rest as SupportedBlock;\n }\n return safe;\n });\n}\n","import type { SupportedBlock } from '../types';\n\n/**\n * A Slack codename guaranteed to be in the validator's known-emoji set, used\n * to neutralize custom / unknown emoji names in the validation copy only.\n */\nexport const VALIDATION_EMOJI_PLACEHOLDER = 'white_check_mark';\n\n/**\n * Recursively clone `value`, rewriting the `name` of every `rich_text` emoji\n * element (`{ type: 'emoji', name }`) to {@link VALIDATION_EMOJI_PLACEHOLDER}.\n * Copy-on-write: returns the original reference for any subtree that contains\n * no emoji, so emoji-free drafts allocate nothing. Never mutates the input.\n */\nfunction rewriteEmojiNames<T>(value: T): T {\n if (Array.isArray(value)) {\n let changed = false;\n const next = value.map((item) => {\n const rewritten = rewriteEmojiNames(item);\n if (rewritten !== item) {\n changed = true;\n }\n return rewritten;\n });\n return (changed ? next : value) as T;\n }\n if (value !== null && typeof value === 'object') {\n const source = value as Record<string, unknown>;\n let changed = false;\n const next: Record<string, unknown> = {};\n for (const key of Object.keys(source)) {\n const rewritten = rewriteEmojiNames(source[key]);\n next[key] = rewritten;\n if (rewritten !== source[key]) {\n changed = true;\n }\n }\n if (next.type === 'emoji' && typeof next.name === 'string' && next.name !== VALIDATION_EMOJI_PLACEHOLDER) {\n next.name = VALIDATION_EMOJI_PLACEHOLDER;\n changed = true;\n }\n return (changed ? next : value) as T;\n }\n return value;\n}\n\n/**\n * Validation-only sanitizer: returns a deep copy of `blocks` with every\n * `rich_text` emoji `name` rewritten to a known-valid placeholder. Slack itself\n * never rejects unknown emoji names, so workspace-custom emoji should not count\n * toward the validator's error total (which gates the Send button). The real\n * payload (preview / JSON / Send) keeps the true name — only the copy handed to\n * the validator is rewritten.\n *\n * Walks the whole block so emoji nested inside `task_card` / `plan` / table\n * `rich_text` cells are covered too.\n *\n * @param blocks - the Slack-shaped blocks about to be validated\n * @returns a deep copy with emoji names neutralized\n */\nexport function stripCustomEmojiForValidation(blocks: SupportedBlock[]): SupportedBlock[] {\n return blocks.map((block) => rewriteEmojiNames(block));\n}\n","import { validateBlockKit } from '@tightknitai/slack-block-kit-validator';\nimport { useEffect, useRef, useState } from 'react';\nimport { type GroupedErrors, groupValidatorErrors, toValidatorSurface } from '../lib/error-grouping';\nimport { toSlackBlocks } from '../lib/to-slack-blocks';\nimport { stripCustomEmojiForValidation } from '../lib/validation-sanitize';\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 * Validates a block draft against {@link validateBlockKit}, scoped to the\n * given preview surface. Pure; safe to call during render.\n */\nfunction computeValidation(blocks: BuilderBlock[], surface: PreviewSurface): ValidationState {\n // Rewrite custom / unknown emoji names to a known-valid placeholder in the\n // validation copy only, so they don't inflate `total` → disable Send. The\n // real payload (preview / JSON / Send) keeps the true names.\n const payload = stripCustomEmojiForValidation(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 return {\n valid: result.valid,\n byBlockId: grouped.byBlockId,\n general: grouped.general,\n total: grouped.total\n };\n}\n\n/**\n * Continuously validates the working draft against\n * {@link validateBlockKit}, scoped to the current preview surface.\n *\n * The first pass runs synchronously during initial render so consumers\n * never see a stale `errorCount: 0` for an invalid `initialBlocks`.\n * Subsequent passes are debounced so rapid edits don't thrash the AJV\n * 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>(() => computeValidation(blocks, surface));\n const isFirstRunRef = useRef(true);\n\n useEffect(() => {\n if (isFirstRunRef.current) {\n isFirstRunRef.current = false;\n return;\n }\n const handle = setTimeout(() => {\n setState(computeValidation(blocks, surface));\n }, DEBOUNCE_MS);\n return () => clearTimeout(handle);\n }, [blocks, surface]);\n\n return state;\n}\n","import { nanoid } from 'nanoid';\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { isContainerChildType, MAX_CONTAINER_CHILDREN } from '../lib/container-blocks';\nimport { sanitizeBlocks } from '../lib/sanitize-blocks';\nimport type { BuilderBlock, ContainerBlock, SupportedBlock } from '../types';\n\n/**\n * Re-derive a container node's `block.child_blocks` from its `children`\n * array, keeping the serialized payload in lockstep with the builder tree.\n * No-op for non-container nodes.\n */\nfunction mirror(node: BuilderBlock): BuilderBlock {\n if (!node.children) {\n return node;\n }\n return {\n ...node,\n block: { ...(node.block as ContainerBlock), child_blocks: node.children.map((c) => c.block) } as SupportedBlock\n };\n}\n\n/**\n * Wraps a Slack block payload in a {@link BuilderBlock} with a fresh client\n * id. Container payloads recursively wrap their `child_blocks` into\n * `children` (the DnD-authoritative store).\n * @param block - the underlying Slack block payload\n * @returns a builder-side block with id\n */\nfunction wrap(block: SupportedBlock): BuilderBlock {\n if (block.type === 'container') {\n const children = ((block as ContainerBlock).child_blocks ?? []).map(wrap);\n return mirror({ id: nanoid(8), block, children });\n }\n return { id: nanoid(8), block };\n}\n\n/** Deep-clone a node with fresh ids throughout (for duplicate). */\nfunction cloneNode(node: BuilderBlock): BuilderBlock {\n if (node.children) {\n return mirror({ id: nanoid(8), block: structuredClone(node.block), children: node.children.map(cloneNode) });\n }\n return { id: nanoid(8), block: structuredClone(node.block) };\n}\n\n/** Replace a node's own payload, preserving (and re-mirroring) its children. */\nfunction applyUpdate(node: BuilderBlock, block: SupportedBlock): BuilderBlock {\n if (node.children) {\n // Editors don't manage container children (that's the canvas's job), so\n // keep the existing children and re-mirror — the editor's payload can't\n // clobber the child list.\n return mirror({ ...node, block });\n }\n return { ...node, block };\n}\n\n/** A node's location in the depth-2 tree. */\ntype Loc = { kind: 'top'; index: number } | { kind: 'child'; parentId: string; index: number };\n\n/** Find a node by id across the top level and every container's children. */\nfunction locate(blocks: BuilderBlock[], id: string): Loc | null {\n const top = blocks.findIndex((b) => b.id === id);\n if (top !== -1) {\n return { kind: 'top', index: top };\n }\n for (const block of blocks) {\n if (block.children) {\n const idx = block.children.findIndex((c) => c.id === id);\n if (idx !== -1) {\n return { kind: 'child', parentId: block.id, index: idx };\n }\n }\n }\n return null;\n}\n\n/** Map over the children of one container by id, re-mirroring the result. */\nfunction withChildren(\n blocks: BuilderBlock[],\n parentId: string,\n fn: (children: BuilderBlock[]) => BuilderBlock[]\n): BuilderBlock[] {\n return blocks.map((b) => (b.id === parentId && b.children ? mirror({ ...b, children: fn(b.children) }) : b));\n}\n\n/**\n * Destination for a drag-and-drop move. `index` is the position in the\n * destination list (the hovered sibling's index, or the list length to\n * append). For a same-list reorder the node is removed first and re-spliced\n * at `index`, matching dnd-kit's sortable behavior.\n */\nexport type MoveTarget = { kind: 'top'; index: number } | { kind: 'container'; parentId: string; index: number };\n\n/**\n * Reactive state for the builder's working draft.\n *\n * - `blocks`: ordered list of {@link BuilderBlock} (id + payload + optional\n * container `children`).\n * - Mutators operate on ids, not indices, and resolve a node whether it\n * lives at the top level or inside a container.\n * - On any change, calls the optional `onChange` with the unwrapped Slack\n * payloads (container `child_blocks` mirrored in) so the consumer can\n * 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 useBlockKitchenState({\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 idx = atIndex === undefined ? next.length : Math.max(0, Math.min(atIndex, next.length));\n next.splice(idx, 0, wrap(block));\n return next;\n });\n }, []);\n\n const addChild = useCallback((parentId: string, block: SupportedBlock, atIndex?: number) => {\n if (!isContainerChildType(block.type)) {\n return;\n }\n setBlocks((prev) =>\n withChildren(prev, parentId, (children) => {\n if (children.length >= MAX_CONTAINER_CHILDREN) {\n return children;\n }\n const next = [...children];\n const idx = atIndex === undefined ? next.length : Math.max(0, Math.min(atIndex, next.length));\n next.splice(idx, 0, wrap(block));\n return next;\n })\n );\n }, []);\n\n const updateBlock = useCallback((id: string, block: SupportedBlock) => {\n setBlocks((prev) =>\n prev.map((b) => {\n if (b.id === id) {\n return applyUpdate(b, block);\n }\n if (b.children?.some((c) => c.id === id)) {\n return mirror({ ...b, children: b.children.map((c) => (c.id === id ? applyUpdate(c, block) : c)) });\n }\n return b;\n })\n );\n }, []);\n\n const removeBlock = useCallback((id: string) => {\n setBlocks((prev) => {\n if (prev.some((b) => b.id === id)) {\n return prev.filter((b) => b.id !== id);\n }\n return prev.map((b) =>\n b.children?.some((c) => c.id === id) ? mirror({ ...b, children: b.children.filter((c) => c.id !== id) }) : b\n );\n });\n }, []);\n\n const duplicateBlock = useCallback((id: string) => {\n setBlocks((prev) => {\n const loc = locate(prev, id);\n if (!loc) {\n return prev;\n }\n if (loc.kind === 'top') {\n const next = [...prev];\n next.splice(loc.index + 1, 0, cloneNode(prev[loc.index]));\n return next;\n }\n return withChildren(prev, loc.parentId, (children) => {\n const next = [...children];\n next.splice(loc.index + 1, 0, cloneNode(children[loc.index]));\n return next;\n });\n });\n }, []);\n\n const reorderBlock = useCallback((fromId: string, toIndex: number) => {\n setBlocks((prev) => {\n const loc = locate(prev, fromId);\n if (!loc) {\n return prev;\n }\n const reorder = (list: BuilderBlock[]) => {\n const next = [...list];\n const [moved] = next.splice(loc.index, 1);\n next.splice(Math.max(0, Math.min(toIndex, next.length)), 0, moved);\n return next;\n };\n if (loc.kind === 'top') {\n return reorder(prev);\n }\n return withChildren(prev, loc.parentId, reorder);\n });\n }, []);\n\n const moveBlock = useCallback((activeId: string, target: MoveTarget) => {\n setBlocks((prev) => {\n const loc = locate(prev, activeId);\n if (!loc) {\n return prev;\n }\n const moved =\n loc.kind === 'top' ? prev[loc.index] : prev.find((b) => b.id === loc.parentId)?.children?.[loc.index];\n if (!moved) {\n return prev;\n }\n\n if (target.kind === 'container') {\n // Containers can't nest, and only allowed child types may enter.\n if (moved.children || !isContainerChildType(moved.block.type)) {\n return prev;\n }\n // Enforce the child cap, but never against a reorder within the same\n // container (which doesn't grow it).\n const sameContainer = loc.kind === 'child' && loc.parentId === target.parentId;\n const destCount = prev.find((b) => b.id === target.parentId)?.children?.length ?? 0;\n if (!sameContainer && destCount >= MAX_CONTAINER_CHILDREN) {\n return prev;\n }\n }\n\n // Detach from the source list, then splice into the destination.\n const detached =\n loc.kind === 'top'\n ? prev.filter((_, i) => i !== loc.index)\n : withChildren(prev, loc.parentId, (children) => children.filter((_, i) => i !== loc.index));\n\n const insert = (list: BuilderBlock[]) => {\n const next = [...list];\n next.splice(Math.max(0, Math.min(target.index, next.length)), 0, moved);\n return next;\n };\n return target.kind === 'container' ? withChildren(detached, target.parentId, insert) : insert(detached);\n });\n }, []);\n\n // Full-replace entry point for loading an existing message, \"open as new\",\n // and JSON-drawer apply. Cleanse here (not just at send) so blocks pulled\n // from a retrieved message enter the working state already send-valid —\n // dropping Slack's retrieval-only fields and scrubbing unsafe URLs.\n const replaceAll = useCallback((newBlocks: SupportedBlock[]) => {\n setBlocks(sanitizeBlocks(newBlocks).map(wrap));\n }, []);\n\n return {\n blocks,\n addBlock,\n addChild,\n updateBlock,\n removeBlock,\n duplicateBlock,\n reorderBlock,\n moveBlock,\n replaceAll\n };\n}\n","/**\n * Brand theme resolver for the BlockKitchen chrome.\n *\n * Consumers can already brand the builder by overriding the shadcn/ui\n * CSS custom properties declared in `styles.src.css` (the lower-level\n * contract). This module wraps that contract in a typed, ergonomic prop\n * — a preset name and/or a `Partial<BrandTokens>` map — and resolves it\n * to the `cssVarName -> value` pairs that `BrandThemeScope` then writes\n * to a scoped `<style>` block around the builder.\n *\n * Scope is intentionally limited to the builder chrome. The Slack\n * preview is rendered by `slack-blocks-to-jsx` under its own\n * `#slack_blocks_to_jsx` CSS namespace and does not consume these vars,\n * so brand tokens never leak into Slack content rendering.\n */\n\n/**\n * Tokens consumers may override. Mirrors the shadcn/ui token set\n * already defined in `src/styles.src.css`. Color values are HSL\n * component strings (\"231.7 48.6% 54.1%\") — matching the existing\n * `hsl(var(--token, ...))` contract. `radius` takes a CSS length\n * such as `\"0.5rem\"`.\n */\nexport type BrandTokens = Partial<{\n background: string;\n foreground: string;\n card: string;\n cardForeground: string;\n popover: string;\n popoverForeground: string;\n primary: string;\n primaryForeground: string;\n secondary: string;\n secondaryForeground: string;\n muted: string;\n mutedForeground: string;\n accent: string;\n accentForeground: string;\n destructive: string;\n destructiveForeground: string;\n border: string;\n input: string;\n ring: string;\n radius: string;\n}>;\n\n/**\n * Curated preset names. `'default'` is a no-op (relies on the\n * `styles.src.css` fallbacks). The other entries each define their own\n * color palette and `radius`, demonstrating that brand presets can vary\n * stylistic axes beyond color. Adding more later is non-breaking —\n * extend the string union and add an entry to `PRESETS`.\n */\nexport type BrandPreset = 'default' | 'slack' | 'ocean' | 'sunset' | 'mono' | 'cyberpunk';\n\n/**\n * Brand theme shape.\n *\n * - `preset` seeds the token map (currently a no-op for `'default'`).\n * - `tokens` applies in both light and dark.\n * - `light`/`dark` apply only when the matching dark-mode class is\n * present on an ancestor (or on the scope itself).\n *\n * Merge precedence (later wins): preset → tokens → light/dark.\n */\nexport interface BrandTheme {\n preset?: BrandPreset;\n tokens?: BrandTokens;\n light?: BrandTokens;\n dark?: BrandTokens;\n}\n\n/** Maps camelCase token keys to the kebab-case CSS variable names\n * declared by the consumer-facing shadcn/ui contract in `styles.src.css`. */\nconst TOKEN_TO_CSS_VAR: Record<keyof BrandTokens, string> = {\n background: '--background',\n foreground: '--foreground',\n card: '--card',\n cardForeground: '--card-foreground',\n popover: '--popover',\n popoverForeground: '--popover-foreground',\n primary: '--primary',\n primaryForeground: '--primary-foreground',\n secondary: '--secondary',\n secondaryForeground: '--secondary-foreground',\n muted: '--muted',\n mutedForeground: '--muted-foreground',\n accent: '--accent',\n accentForeground: '--accent-foreground',\n destructive: '--destructive',\n destructiveForeground: '--destructive-foreground',\n border: '--border',\n input: '--input',\n ring: '--ring',\n radius: '--radius'\n};\n\n/** Per-preset layer — partial brand theme without the `preset` field, so\n * a preset itself can carry shared `tokens` plus per-mode `light`/`dark`\n * overrides. Resolved before user-supplied tokens so consumers can still\n * layer their own values on top. */\ntype PresetDefinition = {\n tokens?: BrandTokens;\n light?: BrandTokens;\n dark?: BrandTokens;\n};\n\nconst PRESETS: Record<BrandPreset, PresetDefinition> = {\n // No overrides — falls through to the fallbacks in styles.src.css so\n // we don't duplicate (and risk drifting from) the baseline values.\n default: {},\n // Slack's aubergine brand with tighter corners. Mirrors the Slack\n // chrome aesthetic — fitting since this builder is the Slack Block\n // Kit builder, after all.\n slack: {\n tokens: { radius: '0.375rem' },\n light: {\n background: '0 0% 100%',\n foreground: '292 30% 12%',\n card: '0 0% 100%',\n cardForeground: '292 30% 12%',\n popover: '0 0% 100%',\n popoverForeground: '292 30% 12%',\n primary: '292 78% 24%',\n primaryForeground: '0 0% 100%',\n secondary: '292 30% 95%',\n secondaryForeground: '292 78% 24%',\n muted: '292 20% 96%',\n mutedForeground: '292 12% 42%',\n accent: '160 60% 36%',\n accentForeground: '0 0% 100%',\n border: '292 20% 88%',\n input: '292 20% 88%',\n ring: '292 78% 24%'\n },\n dark: {\n background: '292 35% 8%',\n foreground: '292 15% 92%',\n card: '292 30% 11%',\n cardForeground: '292 15% 92%',\n popover: '292 30% 11%',\n popoverForeground: '292 15% 92%',\n primary: '292 50% 72%',\n primaryForeground: '292 35% 8%',\n secondary: '292 25% 18%',\n secondaryForeground: '292 15% 92%',\n muted: '292 22% 16%',\n mutedForeground: '292 12% 65%',\n accent: '160 50% 50%',\n accentForeground: '292 35% 8%',\n border: '292 22% 20%',\n input: '292 22% 20%',\n ring: '292 50% 72%'\n }\n },\n // Cool blue, airy spacing, pillowy corners.\n ocean: {\n tokens: { radius: '0.75rem' },\n light: {\n background: '200 60% 98%',\n foreground: '210 40% 14%',\n card: '0 0% 100%',\n cardForeground: '210 40% 14%',\n popover: '0 0% 100%',\n popoverForeground: '210 40% 14%',\n primary: '205 90% 42%',\n primaryForeground: '200 100% 98%',\n secondary: '200 60% 94%',\n secondaryForeground: '210 40% 14%',\n muted: '200 50% 95%',\n mutedForeground: '210 18% 44%',\n accent: '180 70% 45%',\n accentForeground: '200 100% 98%',\n border: '205 40% 86%',\n input: '205 40% 86%',\n ring: '205 90% 42%'\n },\n dark: {\n background: '215 45% 8%',\n foreground: '200 30% 94%',\n card: '215 40% 11%',\n cardForeground: '200 30% 94%',\n popover: '215 40% 11%',\n popoverForeground: '200 30% 94%',\n primary: '205 80% 65%',\n primaryForeground: '215 45% 8%',\n secondary: '215 35% 18%',\n secondaryForeground: '200 30% 94%',\n muted: '215 30% 16%',\n mutedForeground: '200 20% 68%',\n accent: '180 65% 55%',\n accentForeground: '215 45% 8%',\n border: '215 30% 22%',\n input: '215 30% 22%',\n ring: '205 80% 65%'\n }\n },\n // Warm coral and amber, very round corners — cozy and inviting.\n sunset: {\n tokens: { radius: '1rem' },\n light: {\n background: '30 50% 98%',\n foreground: '14 40% 16%',\n card: '30 60% 99%',\n cardForeground: '14 40% 16%',\n popover: '30 60% 99%',\n popoverForeground: '14 40% 16%',\n primary: '14 88% 55%',\n primaryForeground: '30 100% 98%',\n secondary: '30 60% 94%',\n secondaryForeground: '14 40% 16%',\n muted: '30 45% 95%',\n mutedForeground: '14 18% 44%',\n accent: '38 95% 55%',\n accentForeground: '14 40% 16%',\n border: '20 40% 88%',\n input: '20 40% 88%',\n ring: '14 88% 55%'\n },\n dark: {\n background: '15 32% 8%',\n foreground: '30 40% 94%',\n card: '15 30% 11%',\n cardForeground: '30 40% 94%',\n popover: '15 30% 11%',\n popoverForeground: '30 40% 94%',\n primary: '14 80% 65%',\n primaryForeground: '15 32% 8%',\n secondary: '15 25% 18%',\n secondaryForeground: '30 40% 94%',\n muted: '15 22% 16%',\n mutedForeground: '30 20% 68%',\n accent: '38 85% 60%',\n accentForeground: '15 32% 8%',\n border: '15 22% 22%',\n input: '15 22% 22%',\n ring: '14 80% 65%'\n }\n },\n // Pure grayscale, sharp corners — minimalist editorial feel.\n mono: {\n tokens: { radius: '0' },\n light: {\n background: '0 0% 100%',\n foreground: '0 0% 8%',\n card: '0 0% 100%',\n cardForeground: '0 0% 8%',\n popover: '0 0% 100%',\n popoverForeground: '0 0% 8%',\n primary: '0 0% 12%',\n primaryForeground: '0 0% 98%',\n secondary: '0 0% 95%',\n secondaryForeground: '0 0% 12%',\n muted: '0 0% 96%',\n mutedForeground: '0 0% 42%',\n accent: '0 0% 90%',\n accentForeground: '0 0% 12%',\n border: '0 0% 86%',\n input: '0 0% 86%',\n ring: '0 0% 12%'\n },\n dark: {\n background: '0 0% 6%',\n foreground: '0 0% 95%',\n card: '0 0% 9%',\n cardForeground: '0 0% 95%',\n popover: '0 0% 9%',\n popoverForeground: '0 0% 95%',\n primary: '0 0% 92%',\n primaryForeground: '0 0% 8%',\n secondary: '0 0% 16%',\n secondaryForeground: '0 0% 95%',\n muted: '0 0% 14%',\n mutedForeground: '0 0% 65%',\n accent: '0 0% 22%',\n accentForeground: '0 0% 95%',\n border: '0 0% 20%',\n input: '0 0% 20%',\n ring: '0 0% 92%'\n }\n },\n // Neon magenta on near-black with cyan accents, almost-sharp corners.\n cyberpunk: {\n tokens: { radius: '0.125rem' },\n light: {\n background: '300 40% 97%',\n foreground: '300 30% 12%',\n card: '0 0% 100%',\n cardForeground: '300 30% 12%',\n popover: '0 0% 100%',\n popoverForeground: '300 30% 12%',\n primary: '320 95% 48%',\n primaryForeground: '0 0% 100%',\n secondary: '300 40% 94%',\n secondaryForeground: '300 30% 12%',\n muted: '300 30% 96%',\n mutedForeground: '300 12% 42%',\n accent: '180 90% 38%',\n accentForeground: '0 0% 100%',\n border: '300 30% 86%',\n input: '300 30% 86%',\n ring: '320 95% 48%'\n },\n dark: {\n background: '270 30% 5%',\n foreground: '300 30% 95%',\n card: '270 28% 8%',\n cardForeground: '300 30% 95%',\n popover: '270 28% 8%',\n popoverForeground: '300 30% 95%',\n primary: '320 100% 65%',\n primaryForeground: '270 30% 5%',\n secondary: '270 25% 16%',\n secondaryForeground: '300 30% 95%',\n muted: '270 22% 14%',\n mutedForeground: '300 18% 68%',\n accent: '180 95% 55%',\n accentForeground: '270 30% 5%',\n border: '300 30% 22%',\n input: '300 30% 22%',\n ring: '320 100% 65%'\n }\n }\n};\n\n/**\n * Result of resolving a `BrandTheme`. Two parallel maps so the wrapper\n * can emit one rule for the light context and one for the `.dark` context.\n */\nexport interface ResolvedBrandTheme {\n light: Record<string, string>;\n dark: Record<string, string>;\n}\n\n/**\n * Returns true when a candidate CSS value is safe to inject into a\n * `<style>` block. Rejects characters that could break out of the\n * declaration (`;`, braces) or comment markers, plus tag-like and\n * entity-like sequences that smell wrong inside a CSS value. The\n * accepted shape covers HSL component strings, CSS lengths, hex/rgb\n * colors, named colors, and `calc(...)` expressions.\n * @param value - candidate CSS value\n * @returns true if the value is safe to emit verbatim\n */\nexport function isSafeCssValue(value: string): boolean {\n if (typeof value !== 'string' || value.length === 0 || value.length > 200) {\n return false;\n }\n // Disallow anything that could close the declaration, the rule, the\n // <style> element, or open a comment.\n return !/[;{}<>&]|\\/\\*|\\*\\/|\\n|\\r/.test(value);\n}\n\n/** Normalizes a user input that may be a preset string into a `BrandTheme`. */\nfunction toBrandTheme(input: BrandTheme | BrandPreset | undefined): BrandTheme {\n if (input === undefined) {\n return {};\n }\n if (typeof input === 'string') {\n return { preset: input };\n }\n return input;\n}\n\n/**\n * Merges a partial token map into a `cssVarName -> value` accumulator.\n * Drops any value that fails `isSafeCssValue` rather than throwing so\n * one bad token doesn't lose the rest of the theme.\n */\nfunction mergeTokens(target: Record<string, string>, source: BrandTokens | undefined): void {\n if (!source) {\n return;\n }\n for (const [key, value] of Object.entries(source) as [keyof BrandTokens, string | undefined][]) {\n if (value === undefined) {\n continue;\n }\n if (!isSafeCssValue(value)) {\n continue;\n }\n target[TOKEN_TO_CSS_VAR[key]] = value;\n }\n}\n\n/**\n * Resolves a `BrandTheme` (or a bare preset name) into two CSS-var maps:\n * one applied in light contexts and one applied under `.dark`. Returns\n * empty maps when the input contributes no overrides — the caller can\n * use that as a signal to skip the scope wrapper entirely.\n * @param input - the brand theme prop value, or `undefined`\n * @returns resolved CSS-var maps for light and dark contexts\n */\nexport function resolveBrandTheme(input: BrandTheme | BrandPreset | undefined): ResolvedBrandTheme {\n const theme = toBrandTheme(input);\n const preset = theme.preset ? PRESETS[theme.preset] : undefined;\n\n const light: Record<string, string> = {};\n const dark: Record<string, string> = {};\n\n mergeTokens(light, preset?.tokens);\n mergeTokens(dark, preset?.tokens);\n mergeTokens(light, preset?.light);\n mergeTokens(dark, preset?.dark);\n mergeTokens(light, theme.tokens);\n mergeTokens(dark, theme.tokens);\n mergeTokens(light, theme.light);\n mergeTokens(dark, theme.dark);\n\n return { light, dark };\n}\n\n/**\n * Serializes a CSS-var map to declaration text (e.g.\n * `\"--primary: 0 100% 50%; --radius: 0.5rem;\"`). Values are assumed\n * to already be sanitized by {@link isSafeCssValue}.\n * @param vars - CSS-var name → value map\n * @returns CSS declaration string, or `''` if `vars` is empty\n */\nexport function toCssDeclarations(vars: Record<string, string>): string {\n const entries = Object.entries(vars);\n if (entries.length === 0) {\n return '';\n }\n return entries.map(([name, value]) => `${name}: ${value};`).join(' ');\n}\n","import { type ReactNode, useId, useMemo } from 'react';\nimport { type BrandPreset, type BrandTheme, resolveBrandTheme, toCssDeclarations } from '../lib/brand-theme';\n\n/**\n * Wraps the builder tree in a scoped `<style>` block that writes the\n * resolved brand CSS variables onto `:root`, gated by `:has()` on a\n * per-instance `data-bk-scope` attribute. Writing the vars at `:root`\n * is necessary because Radix's `Portal` (used by every popover, dialog,\n * tooltip, and sheet in this package) renders into `document.body`\n * outside the React subtree — variables on an inner wrapper would\n * never reach them. With `:root` as the carrier and `:has()` as the\n * gate, the cascade covers both the in-tree chrome and all portaled\n * descendants without us having to plumb a `container` prop through\n * every Radix wrapper.\n *\n * When the resolved theme contains no overrides (`theme` omitted, or\n * a `'default'` preset with no token map), the wrapper bypasses itself\n * entirely so consumers who haven't opted in see zero behavioral change.\n *\n * Dark-mode coverage matches shadcn's class-based dark mode. The dark\n * rule targets the `.dark` element itself (any ancestor of the scope\n * carrying the class — be it `<html>`, `<body>`, or an inner wrapper)\n * rather than `:root`. This is load-bearing: the bundled\n * `slack-blocks-to-jsx` stylesheet ships its own `.dark { --primary: ...; }`\n * baseline that we need to outrank. Setting the vars at `:root.dark`\n * would lose the cascade fight against that closer `.dark` ancestor;\n * setting them at `.dark:has(...)` puts our values on the same element\n * the library targets, with a higher-specificity selector that wins.\n *\n * Browser support: `:has()` is widely available (Chrome 105+, Safari\n * 15.4+, Firefox 121+) and is already implied by the Tailwind v4\n * baseline this package builds against.\n * @param props - wrapper props\n * @param props.theme - the brand theme prop, forwarded from {@link BlockKitchen}\n * @param props.children - the builder tree\n * @returns the children, optionally wrapped in a scoped theme block\n */\nexport function BrandThemeScope({ theme, children }: { theme?: BrandTheme | BrandPreset; children: ReactNode }) {\n // `useId` produces something like `:r0:` — strip the colons so the\n // string can safely sit inside an attribute selector.\n const rawId = useId();\n const scopeId = useMemo(() => `bk-${rawId.replace(/[:]/g, '')}`, [rawId]);\n\n const resolved = useMemo(() => resolveBrandTheme(theme), [theme]);\n\n const hasLight = Object.keys(resolved.light).length > 0;\n const hasDark = Object.keys(resolved.dark).length > 0;\n\n if (!hasLight && !hasDark) {\n return <>{children}</>;\n }\n\n const lightDecl = toCssDeclarations(resolved.light);\n const darkDecl = toCssDeclarations(resolved.dark);\n\n const rules: string[] = [];\n if (lightDecl) {\n rules.push(`:root:has([data-bk-scope=\"${scopeId}\"]) { ${lightDecl} }`);\n }\n if (darkDecl) {\n // Match the .dark element itself wherever it sits in the ancestor\n // chain. Two variants cover all placements: an ancestor that\n // contains the scope, or the scope element itself carrying .dark.\n const darkSelectors = [`.dark:has([data-bk-scope=\"${scopeId}\"])`, `.dark[data-bk-scope=\"${scopeId}\"]`].join(', ');\n rules.push(`${darkSelectors} { ${darkDecl} }`);\n }\n\n return (\n <>\n {/* biome-ignore lint/security/noDangerouslySetInnerHtml: rule\n values are filtered by isSafeCssValue; the scope id is\n derived from useId(). */}\n <style dangerouslySetInnerHTML={{ __html: rules.join(' ') }} />\n <div data-bk-scope={scopeId} style={{ display: 'contents' }}>\n {children}\n </div>\n </>\n );\n}\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 w-full max-w-full 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 type { SupportedBlock } from '../types';\n\n/**\n * Inline error shown when imported JSON is neither a bare blocks array\n * nor a Slack message wrapper. Exported so callers (and tests) share the\n * exact copy.\n */\nexport const BLOCKS_INPUT_SHAPE_ERROR = 'Expected an array of blocks, or an object with a `blocks` array.';\n\n/**\n * Normalize a parsed JSON value into a bare blocks array.\n *\n * The builder emits (and the JSON drawer seeds from) a bare array of\n * blocks. Slack's own Block Kit Builder, however, exports the full message\n * wrapper — `{ \"blocks\": [ ... ] }` — so a straight paste from there would\n * otherwise fail. Accept either shape: a bare array passes through, and a\n * `{ blocks: [...] }` object is unwrapped down to its `blocks` array. Other\n * top-level keys on the wrapper (`text`, `channel`, `attachments`, …) are\n * ignored.\n *\n * Returns `null` when the value is neither shape, so the caller can surface\n * its existing inline error without mutating state.\n *\n * @param parsed - the value returned from `JSON.parse`\n * @returns the blocks array, or `null` when the shape is unrecognized\n */\nexport function unwrapBlocksInput(parsed: unknown): SupportedBlock[] | null {\n if (Array.isArray(parsed)) {\n return parsed as SupportedBlock[];\n }\n if (parsed && typeof parsed === 'object' && Array.isArray((parsed as { blocks?: unknown }).blocks)) {\n // Strip the Slack message wrapper down to the blocks array.\n return (parsed as { blocks: SupportedBlock[] }).blocks;\n }\n return null;\n}\n","import { validateBlockKit } from '@tightknitai/slack-block-kit-validator';\nimport { Check, Copy } from 'lucide-react';\nimport { useEffect, useMemo, useRef, useState } from 'react';\nimport { BLOCKS_INPUT_SHAPE_ERROR, unwrapBlocksInput } from '../lib/parse-blocks-input';\nimport { Sheet, SheetContent, SheetDescription, SheetTitle } from '../lib/ui/sheet';\nimport type { SupportedBlock } from '../types';\n\n/**\n * Upper bound on the JSON textarea we accept. A pasted multi-megabyte\n * payload would freeze the tab inside `JSON.parse` before the validator\n * gets a look; 1 MiB is well above any realistic Slack Block Kit message\n * (Slack itself caps blocks at 50 per message and ~3000 chars per text\n * field).\n */\nconst MAX_JSON_BYTES = 1024 * 1024;\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 const [copied, setCopied] = useState(false);\n\n const textareaRef = useRef<HTMLTextAreaElement | null>(null);\n const gutterRef = useRef<HTMLDivElement | null>(null);\n const copyResetRef = useRef<ReturnType<typeof setTimeout> | 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 setCopied(false);\n }\n }, [open]);\n\n // Clear the \"copied\" reset timer on unmount.\n useEffect(\n () => () => {\n if (copyResetRef.current) {\n clearTimeout(copyResetRef.current);\n }\n },\n []\n );\n\n const handleCopy = () => {\n navigator.clipboard\n ?.writeText(value)\n .then(() => {\n setCopied(true);\n if (copyResetRef.current) {\n clearTimeout(copyResetRef.current);\n }\n copyResetRef.current = setTimeout(() => setCopied(false), 2000);\n })\n .catch(() => {\n // Clipboard can be unavailable (insecure context / denied); no-op.\n });\n };\n\n const handleChange = (next: string) => {\n setValue(next);\n if (next.length > MAX_JSON_BYTES) {\n setParseError(`JSON exceeds the ${Math.round(MAX_JSON_BYTES / 1024)} KiB editor limit.`);\n setValidationErrors([]);\n return;\n }\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 // Accept either a bare blocks array or Slack's own message wrapper\n // (`{ \"blocks\": [...] }`, as exported by the Block Kit Builder). Other\n // top-level keys on the wrapper are ignored. Anything else keeps the\n // inline error without mutating state.\n const blocks = unwrapBlocksInput(parsed);\n if (!blocks) {\n setParseError(BLOCKS_INPUT_SHAPE_ERROR);\n setValidationErrors([]);\n return;\n }\n setParseError(null);\n onApply(blocks);\n const result = validateBlockKit(blocks, {\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 w-full max-w-full flex-col gap-3 sm:max-w-xl\">\n <div className=\"flex flex-col gap-1 pr-8\">\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=\"relative flex flex-1 overflow-hidden rounded-md border border-input bg-muted/30 shadow-sm focus-within:ring-1 focus-within:ring-ring\">\n <button\n type=\"button\"\n onClick={handleCopy}\n aria-label={copied ? 'Copied to clipboard' : 'Copy JSON'}\n className=\"absolute right-2 top-2 z-10 inline-flex items-center justify-center rounded-md border border-input bg-background/80 p-1.5 text-muted-foreground shadow-sm backdrop-blur transition-colors hover:bg-accent hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\"\n >\n {copied ? <Check className=\"h-3.5 w-3.5 text-emerald-600\" /> : <Copy className=\"h-3.5 w-3.5\" />}\n </button>\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 aria-label=\"Block Kit JSON\"\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 { 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 'bk-portal-content 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 'bk-portal-content 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 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 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 { ExternalLink, Loader2 } from 'lucide-react';\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { Button } from '../lib/ui/button';\nimport { isSafeHref } from '../lib/url-safety';\nimport type { SendAsUserStatus } from '../types';\n\nconst POLL_INTERVAL_MS = 2500;\nconst MAX_POLLS = 24; // ~1 minute before giving up\n\n/**\n * Tracks the \"act as the user\" Slack token status for a dialog and drives the\n * OAuth sign-in flow. Shared by {@link SendDialog} and {@link UpdateDialog}.\n *\n * While `open && enabled` it fetches status on open and refreshes on window\n * focus. Once `startSignIn` opens the OAuth tab it also background-polls until\n * the token appears or the retry cap is hit, so the dialog unlocks itself\n * without a manual reload. All work stops when the dialog closes, the token\n * path doesn't apply, or the component unmounts.\n *\n * @param loadStatus - consumer callback returning user-token status + OAuth URL\n * @param options.open - whether the host dialog is open\n * @param options.enabled - whether the user-token path applies (idle when false)\n * @returns `{ userStatus, polling, startSignIn }`\n */\nexport function useSlackSignIn(\n loadStatus: () => Promise<SendAsUserStatus>,\n { open, enabled }: { open: boolean; enabled: boolean }\n) {\n const [userStatus, setUserStatus] = useState<SendAsUserStatus | null>(null);\n const [polling, setPolling] = useState(false);\n\n // Hold the latest loader in a ref so effects depend only on open/enabled and\n // don't retrigger when the consumer passes a fresh arrow function each render.\n const loadStatusRef = useRef(loadStatus);\n useEffect(() => {\n loadStatusRef.current = loadStatus;\n });\n\n const refresh = useCallback(() => {\n loadStatusRef\n .current()\n .then(setUserStatus)\n .catch(() => setUserStatus({ canSendAsUser: false }));\n }, []);\n\n const pollRef = useRef<ReturnType<typeof setInterval> | null>(null);\n const stopPolling = useCallback(() => {\n if (pollRef.current) {\n clearInterval(pollRef.current);\n pollRef.current = null;\n }\n setPolling(false);\n }, []);\n\n const startSignIn = useCallback(() => {\n const url = userStatus?.oauthUrl;\n if (!url || !isSafeHref(url)) {\n return;\n }\n window.open(url, '_blank', 'noopener,noreferrer');\n stopPolling();\n setPolling(true);\n let tries = 0;\n pollRef.current = setInterval(() => {\n tries += 1;\n loadStatusRef\n .current()\n .then((next) => {\n setUserStatus(next);\n if (next.canSendAsUser) {\n stopPolling();\n }\n })\n .catch(() => {})\n .finally(() => {\n if (tries >= MAX_POLLS) {\n stopPolling();\n }\n });\n }, POLL_INTERVAL_MS);\n }, [userStatus, stopPolling]);\n\n // Fetch on open; clear and stop polling when the dialog closes, the token path\n // doesn't apply, or the component unmounts.\n useEffect(() => {\n if (!open || !enabled) {\n setUserStatus(null);\n stopPolling();\n return;\n }\n setUserStatus(null);\n refresh();\n return stopPolling;\n }, [open, enabled, refresh, stopPolling]);\n\n // Pick up a completed OAuth round-trip when the window regains focus.\n useEffect(() => {\n if (!open || !enabled) {\n return;\n }\n const handler = () => refresh();\n window.addEventListener('focus', handler);\n return () => window.removeEventListener('focus', handler);\n }, [open, enabled, refresh]);\n\n return { userStatus, polling, startSignIn };\n}\n\n/**\n * The \"Sign in with Slack\" button used by both dialogs. Opens OAuth and shows a\n * spinner while {@link useSlackSignIn} polls for the completed round-trip. The\n * surrounding explanatory copy stays with each caller since it differs.\n * @param props.onClick - starts the sign-in flow (typically `startSignIn`)\n * @param props.polling - whether a background poll is in flight\n */\nexport function SlackSignInButton({ onClick, polling }: { onClick: () => void; polling: boolean }) {\n return (\n <Button type=\"button\" variant=\"outline\" size=\"sm\" className=\"w-fit\" onClick={onClick} disabled={polling}>\n {polling ? (\n <>\n <Loader2 className=\"animate-spin\" /> Waiting for Slack…\n </>\n ) : (\n <>\n Sign in with Slack <ExternalLink />\n </>\n )}\n </Button>\n );\n}\n","import { AlertTriangle, Info } from 'lucide-react';\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { cn } from '../lib/cn';\nimport { Button } from '../lib/ui/button';\nimport { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle } from '../lib/ui/dialog';\nimport { Input } from '../lib/ui/input';\nimport { Label } from '../lib/ui/label';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '../lib/ui/tooltip';\nimport { isSafeHref, isSafeImageSrc } from '../lib/url-safety';\nimport type { ChannelOption, LoadResult, RecentMessage, SupportedBlock } from '../types';\nimport { SlackSignInButton } from './slack-sign-in';\n\n/** Map a {@link RecentMessage} onto the `ok` verdict so it reuses the load path. */\nfunction recentToResult(msg: RecentMessage): Extract<LoadResult, { ok: true }> {\n return {\n ok: true,\n channelId: msg.channelId,\n channelName: msg.channelName,\n ts: msg.ts,\n blocks: msg.blocks,\n editableVia: msg.editableVia ?? 'bot',\n workspaceName: msg.workspaceName,\n username: msg.username,\n iconUrl: msg.iconUrl\n };\n}\n\n/**\n * Snippet shown as the row body: the host's `label` if given, else the first\n * header/section text from the message blocks, else a block-count fallback.\n */\nfunction previewText(m: RecentMessage): string {\n if (m.label) {\n return m.label;\n }\n for (const b of m.blocks) {\n if ((b.type === 'header' || b.type === 'section') && 'text' in b && b.text && 'text' in b.text) {\n return b.text.text;\n }\n }\n return `${m.blocks.length} block${m.blocks.length === 1 ? '' : 's'}`;\n}\n\ntype LoadStatus =\n | { kind: 'idle' }\n | { kind: 'loading' }\n | { kind: 'error'; error: string }\n | { kind: 'not-editable'; reason: string; blocks?: SupportedBlock[]; oauthUrl?: string };\n\n/**\n * Edit-mode entry point. Collects a Slack message permalink and hands it to\n * the host's `onLoadMessage`. On a successful load the parent flips into\n * edit mode (`onLoaded`); on a not-editable verdict the dialog renders the\n * host's `reason` inline and, when that verdict carries blocks, offers\n * \"Open as a new message instead\" (a no-match verdict has none, so only the\n * reason shows).\n *\n * The package never parses the permalink — the host extracts `channel + ts`.\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.onLoadMessage - host loader returning an editability verdict\n * @param props.loadRecentMessages - optional loader for the \"recent messages\" picker, scoped to a channel\n * @param props.loadChannels - returns channels to scope the recent-messages picker by\n * @param props.onLoaded - called with the `ok` result so the parent enters edit mode\n * @param props.onOpenAsNew - called with optional blocks for the \"open as new\" fallback\n * @returns the rendered load-message dialog\n */\nexport function LoadMessageDialog({\n open,\n onOpenChange,\n onLoadMessage,\n loadRecentMessages,\n loadChannels,\n onLoaded,\n onOpenAsNew\n}: {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onLoadMessage: (input: { link: string }) => Promise<LoadResult>;\n loadRecentMessages?: (channelId: string) => Promise<RecentMessage[]>;\n loadChannels: () => Promise<ChannelOption[]>;\n onLoaded: (result: Extract<LoadResult, { ok: true }>) => void;\n onOpenAsNew: (blocks?: SupportedBlock[]) => void;\n}) {\n const [link, setLink] = useState('');\n const [status, setStatus] = useState<LoadStatus>({ kind: 'idle' });\n // Channel selector for the recent-messages picker (only when `loadRecentMessages`\n // is given). The user must pick a channel before any recent lookup runs.\n const [channels, setChannels] = useState<ChannelOption[] | null>(null);\n const [channelsError, setChannelsError] = useState<string | null>(null);\n const [channelId, setChannelId] = useState<string>('');\n // Recent messages for the selected channel. `null` means \"loading / not loaded yet\".\n const [recent, setRecent] = useState<RecentMessage[] | null>(null);\n const [recentError, setRecentError] = useState<string | null>(null);\n // The recent-message row the user has picked. The footer \"Find message\"\n // button loads it; mutually exclusive with the pasted link.\n const [selectedRecent, setSelectedRecent] = useState<RecentMessage | null>(null);\n // True while re-checking the load after the user opened the Slack OAuth tab\n // from a \"sign in to edit\" verdict.\n const [signInPolling, setSignInPolling] = useState(false);\n const inputRef = useRef<HTMLInputElement>(null);\n const signInPollRef = useRef<ReturnType<typeof setInterval> | null>(null);\n\n // Hold the latest loaders in refs so they can change identity between renders\n // (consumers often pass a fresh arrow) without us needing them as deps.\n const onLoadMessageRef = useRef(onLoadMessage);\n const loadRecentMessagesRef = useRef(loadRecentMessages);\n const loadChannelsRef = useRef(loadChannels);\n useEffect(() => {\n onLoadMessageRef.current = onLoadMessage;\n loadRecentMessagesRef.current = loadRecentMessages;\n loadChannelsRef.current = loadChannels;\n });\n\n const hasRecent = !!loadRecentMessages;\n\n // Reset to a clean slate each time the dialog opens, and load the channel\n // list so the user can scope the recent-messages picker.\n useEffect(() => {\n if (!open) {\n return;\n }\n setLink('');\n setStatus({ kind: 'idle' });\n setChannelId('');\n setRecent(null);\n setRecentError(null);\n setSelectedRecent(null);\n if (!loadRecentMessagesRef.current) {\n setChannels([]);\n setChannelsError(null);\n return;\n }\n setChannels(null);\n setChannelsError(null);\n let cancelled = false;\n loadChannelsRef\n .current()\n .then((list) => {\n if (!cancelled) {\n setChannels(list);\n }\n })\n .catch((e) => {\n if (!cancelled) {\n setChannelsError(e instanceof Error ? e.message : 'Failed to load channels');\n }\n });\n return () => {\n cancelled = true;\n };\n }, [open]);\n\n // (Re)load the recent list whenever the selected channel changes, scoping the\n // lookup to that one channel.\n useEffect(() => {\n if (!open || !loadRecentMessagesRef.current || !channelId) {\n return;\n }\n setRecent(null);\n setRecentError(null);\n setSelectedRecent(null);\n let cancelled = false;\n loadRecentMessagesRef\n .current(channelId)\n .then((list) => {\n if (!cancelled) {\n setRecent(list);\n }\n })\n .catch((e) => {\n if (!cancelled) {\n setRecentError(e instanceof Error ? e.message : 'Failed to load recent messages.');\n }\n });\n return () => {\n cancelled = true;\n };\n }, [open, channelId]);\n\n const stopSignInPoll = useCallback(() => {\n if (signInPollRef.current) {\n clearInterval(signInPollRef.current);\n signInPollRef.current = null;\n }\n setSignInPolling(false);\n }, []);\n\n // Stop the sign-in retry loop when the dialog closes or the component unmounts.\n useEffect(() => {\n if (!open) {\n stopSignInPoll();\n }\n return stopSignInPoll;\n }, [open, stopSignInPoll]);\n\n const handleLoad = async () => {\n stopSignInPoll();\n // A picked recent message loads directly — it's already fully resolved, so\n // there's no link to fetch.\n if (selectedRecent) {\n onLoaded(recentToResult(selectedRecent));\n return;\n }\n const trimmed = link.trim();\n if (!trimmed) {\n setStatus({ kind: 'error', error: 'Paste a Slack message link first.' });\n return;\n }\n setStatus({ kind: 'loading' });\n try {\n const result = await onLoadMessageRef.current({ link: trimmed });\n if (result.ok) {\n onLoaded(result);\n return;\n }\n setStatus({ kind: 'not-editable', reason: result.reason, blocks: result.blocks, oauthUrl: result.oauthUrl });\n } catch (e) {\n setStatus({ kind: 'error', error: e instanceof Error ? e.message : 'Failed to load message.' });\n }\n };\n\n // Opens the Slack OAuth tab, then re-runs the load on an interval so the\n // dialog advances into edit mode once the host reports the message editable\n // (i.e. the user finished signing in). Capped so it can't poll forever.\n const startFindSignIn = (oauthUrl: string) => {\n if (!isSafeHref(oauthUrl)) {\n return;\n }\n const trimmed = link.trim();\n if (!trimmed) {\n return;\n }\n window.open(oauthUrl, '_blank', 'noopener,noreferrer');\n stopSignInPoll();\n setSignInPolling(true);\n let tries = 0;\n const POLL_INTERVAL_MS = 2500;\n const MAX_POLLS = 24; // ~1 minute before giving up\n signInPollRef.current = setInterval(() => {\n tries += 1;\n onLoadMessageRef\n .current({ link: trimmed })\n .then((result) => {\n if (result.ok) {\n stopSignInPoll();\n onLoaded(result);\n }\n })\n .catch(() => {})\n .finally(() => {\n if (tries >= MAX_POLLS) {\n stopSignInPoll();\n }\n });\n }, POLL_INTERVAL_MS);\n };\n\n const notEditable = status.kind === 'not-editable' ? status : null;\n const signInUrl = notEditable?.oauthUrl && isSafeHref(notEditable.oauthUrl) ? notEditable.oauthUrl : null;\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent\n className=\"w-[calc(100vw-1.5rem)] max-w-lg rounded-lg\"\n // Focus the link input on open instead of letting Radix focus the\n // first tabbable element (the info button), which would pop its\n // tooltip open every time the dialog appears.\n onOpenAutoFocus={(e) => {\n e.preventDefault();\n inputRef.current?.focus();\n }}\n >\n <DialogHeader>\n <DialogTitle>Find an existing message</DialogTitle>\n <div className=\"flex items-start gap-1.5 text-left\">\n <DialogDescription>\n {hasRecent\n ? 'Paste a Slack message link, or pick a recent message your app posted.'\n : 'Paste a Slack message link (Slack\\'s \"Copy link\") to load its blocks for editing.'}\n </DialogDescription>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n aria-label=\"How to copy a message link\"\n className=\"mt-0.5 shrink-0 rounded text-muted-foreground transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\"\n >\n <Info className=\"h-3.5 w-3.5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent className=\"max-w-xs leading-relaxed\">\n In Slack, hover over the message and click the <strong>⋮ More actions</strong> button (or right-click\n the message), then choose <strong>Copy link</strong>.\n </TooltipContent>\n </Tooltip>\n </div>\n </DialogHeader>\n\n <div className=\"flex min-w-0 flex-col gap-4\">\n <div className=\"flex flex-col gap-1.5\">\n <Label htmlFor=\"message-link\">Message link</Label>\n <Input\n ref={inputRef}\n id=\"message-link\"\n value={link}\n onChange={(e) => {\n setLink(e.target.value);\n // Typing a link takes over from a picked recent message and\n // abandons any in-flight sign-in retry for the old link.\n setSelectedRecent(null);\n stopSignInPoll();\n if (status.kind !== 'idle' && status.kind !== 'loading') {\n setStatus({ kind: 'idle' });\n }\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && status.kind !== 'loading') {\n e.preventDefault();\n handleLoad();\n }\n }}\n placeholder=\"https://your-workspace.slack.com/archives/C…/p…\"\n autoComplete=\"off\"\n spellCheck={false}\n />\n </div>\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\n {notEditable && (\n <div className=\"flex flex-col gap-2 rounded-md border border-amber-200! bg-amber-50 p-3 text-xs text-amber-800\">\n <div className=\"flex items-start gap-2\">\n <AlertTriangle className=\"mt-0.5 h-3.5 w-3.5 shrink-0\" />\n <span className=\"flex-1\">{notEditable.reason}</span>\n </div>\n {/* Sign-in verdict: open OAuth and re-check the load on completion. */}\n {signInUrl && <SlackSignInButton onClick={() => startFindSignIn(signInUrl)} polling={signInPolling} />}\n {/* Only offer \"open as new\" when there are blocks to carry over.\n A no-match verdict has none, so there's nothing to open. */}\n {notEditable.blocks && notEditable.blocks.length > 0 && (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n className=\"self-start\"\n onClick={() => onOpenAsNew(notEditable.blocks)}\n >\n Open as a new message instead\n </Button>\n )}\n </div>\n )}\n\n {hasRecent && (\n <div className=\"flex min-w-0 flex-col gap-2\">\n <div className=\"flex items-center gap-2 text-xs text-muted-foreground\">\n <span className=\"h-px flex-1 bg-border\" />\n or pick a recent message\n <span className=\"h-px flex-1 bg-border\" />\n </div>\n\n {/* Pick a channel first — the recent lookup is scoped to it. */}\n <div className=\"flex flex-col gap-1.5\">\n <Label htmlFor=\"recent-channel-picker\">Channel</Label>\n {channels === null && !channelsError && (\n <p className=\"text-xs text-muted-foreground\">Loading channels…</p>\n )}\n {channelsError && <p className=\"text-xs text-destructive\">{channelsError}</p>}\n {channels && channels.length === 0 && !channelsError && (\n <p className=\"text-xs text-muted-foreground\">No public channels available.</p>\n )}\n {channels && channels.length > 0 && (\n <select\n id=\"recent-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 <option value=\"\" disabled>\n Select a channel…\n </option>\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 {!channelId && channels && channels.length > 0 && (\n <p className=\"text-xs text-muted-foreground\">Select a channel to see recent messages.</p>\n )}\n {channelId && recent === null && !recentError && (\n <p className=\"text-xs text-muted-foreground\">Loading recent messages…</p>\n )}\n {channelId && recentError && <p className=\"text-xs text-destructive\">{recentError}</p>}\n {channelId && recent && recent.length === 0 && !recentError && (\n <p className=\"text-xs text-muted-foreground\">No recent messages from this app in this channel.</p>\n )}\n {channelId && recent && recent.length > 0 && (\n <div className=\"flex max-h-48 min-w-0 flex-col gap-1 overflow-y-auto\">\n {recent.map((m) => {\n // Which identity the message was posted as — drives both\n // this badge and (on load) the token the update uses.\n const asUser = (m.editableVia ?? 'bot') === 'user';\n const authorName = m.username || (asUser ? 'You' : 'App bot');\n const safeIcon = isSafeImageSrc(m.iconUrl) ? m.iconUrl : undefined;\n const isSelected = selectedRecent?.channelId === m.channelId && selectedRecent?.ts === m.ts;\n return (\n <button\n key={`${m.channelId}:${m.ts}`}\n type=\"button\"\n aria-pressed={isSelected}\n onClick={() => {\n // Pick the row; the footer button does the load.\n setSelectedRecent(m);\n setLink('');\n if (status.kind !== 'idle' && status.kind !== 'loading') {\n setStatus({ kind: 'idle' });\n }\n }}\n className={cn(\n // Inset rings so the scroll container's overflow clip\n // can't shave the corners off the selected outline.\n 'flex min-w-0 items-start gap-2.5 rounded-md border border-input bg-background px-3 py-2 text-left hover:bg-accent focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-inset focus-visible:ring-ring',\n isSelected && 'border-primary! bg-accent ring-1 ring-inset ring-primary'\n )}\n >\n {/* Slack-style square avatar. */}\n {safeIcon ? (\n <img src={safeIcon} alt=\"\" className=\"h-9 w-9 shrink-0 rounded-md object-cover\" />\n ) : (\n <span\n aria-hidden\n className=\"flex h-9 w-9 shrink-0 items-center justify-center rounded-md bg-muted text-sm font-semibold text-muted-foreground\"\n >\n {authorName.charAt(0).toUpperCase()}\n </span>\n )}\n <span className=\"flex min-w-0 flex-col gap-0.5\">\n <span className=\"flex min-w-0 items-center gap-1.5\">\n <span className=\"truncate text-sm font-semibold text-foreground\">{authorName}</span>\n <span className=\"shrink-0 rounded border px-1 py-px text-[10px] font-medium uppercase tracking-wide text-muted-foreground\">\n {asUser ? 'You' : 'Bot'}\n </span>\n </span>\n <span className=\"text-xs text-muted-foreground\">\n {new Date(Number(m.ts) * 1000).toLocaleString()} <span className=\"font-mono\">({m.ts})</span>\n </span>\n <span className=\"line-clamp-2 text-sm text-foreground\">{previewText(m)}</span>\n </span>\n </button>\n );\n })}\n </div>\n )}\n </div>\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={handleLoad}\n disabled={status.kind === 'loading' || (!selectedRecent && !link.trim())}\n >\n {status.kind === 'loading' ? 'Loading…' : 'Load message'}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n","import { useDraggable } from '@dnd-kit/core';\nimport { ChevronDown, ChevronRight, GripVertical, Search } from 'lucide-react';\nimport type * as React from 'react';\nimport { useMemo, useState } from 'react';\nimport { cn } from '../lib/cn';\nimport type { PaletteSection as PaletteSectionDef, PaletteVariant } from '../lib/default-blocks';\nimport { Input } from '../lib/ui/input';\nimport type { SupportedBlock } from '../types';\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 * Configuration for which palette sections are open on first paint.\n * - `true` (default) → every section starts open\n * - `false` → every section starts closed\n * - array of section names → only sections whose `name` is in the list start open\n *\n * Matched by `section.name` (case-sensitive) so consumer-defined sections\n * are addressable too — a consumer with custom palette like `[{ name:\n * 'Company presets', ... }]` can pass `['Company presets']` to start that\n * one open.\n */\nexport type DefaultOpenSections = boolean | readonly string[];\n\nfunction isDefaultOpen(sectionName: string, config: DefaultOpenSections): boolean {\n if (typeof config === 'boolean') return config;\n return config.includes(sectionName);\n}\n\nfunction filterSections(sections: readonly PaletteSectionDef[], query: string): readonly PaletteSectionDef[] {\n const q = query.trim().toLowerCase();\n if (q.length === 0) return sections;\n const out: PaletteSectionDef[] = [];\n for (const section of sections) {\n if (section.name.toLowerCase().includes(q)) {\n out.push(section);\n continue;\n }\n const variants = section.variants.filter((v) => v.label.toLowerCase().includes(q));\n if (variants.length > 0) {\n out.push({ ...section, variants });\n }\n }\n return out;\n}\n\n/**\n * The left-side palette of available block variants, organized into\n * collapsible sections that mirror Slack's real Block Kit Builder\n * (Agents, Markdown, Section, Actions, Input, Structure, Rich Text,\n * Image, Card and Carousel, Table). Each variant is a draggable preset\n * that inserts a default-shaped block when dropped on the surface. A\n * search input at the top filters variants by label across all sections;\n * an active query temporarily expands every matching section regardless\n * of its collapsed state.\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 * @param props.sections - the palette sections to render (the resolved\n * palette, either the built-in default or a consumer-provided one)\n * @param props.defaultOpenSections - controls which section headers are\n * expanded on first mount. See {@link DefaultOpenSections}. Defaults to\n * `true` (all open).\n * @param props.showSearch - whether the quick-search input is rendered\n * above the section list. Defaults to `true`. Set `false` for compact\n * palettes where the list is short enough to scan by eye.\n * @param props.searchPlaceholder - placeholder text shown in the search\n * input. Defaults to `'Search blocks…'`. Useful for localization.\n * @returns the rendered palette aside\n */\nexport function Palette({\n onAddBlock,\n sections,\n defaultOpenSections = true,\n showSearch = true,\n searchPlaceholder = 'Search blocks…',\n variant = 'aside'\n}: {\n onAddBlock: (block: SupportedBlock) => void;\n sections: readonly PaletteSectionDef[];\n defaultOpenSections?: DefaultOpenSections;\n showSearch?: boolean;\n searchPlaceholder?: string;\n /**\n * `'aside'` — persistent left rail (default). Fixed width with right border.\n * `'sheet'` — full-width content for mobile bottom-sheet hosting. No\n * own borders or width constraints so it fills the sheet body.\n */\n variant?: 'aside' | 'sheet';\n}) {\n const [query, setQuery] = useState('');\n const visibleSections = useMemo(\n () => (showSearch ? filterSections(sections, query) : sections),\n [sections, query, showSearch]\n );\n const queryActive = showSearch && query.trim().length > 0;\n const isSheet = variant === 'sheet';\n\n return (\n <aside\n className={cn(\n 'flex min-h-0 flex-col overflow-x-hidden overflow-y-auto',\n isSheet ? 'w-full flex-1 bg-background' : 'w-72 shrink-0 border-r bg-muted/20'\n )}\n >\n {showSearch ? (\n <div\n className={cn(\n 'sticky top-0 z-10 border-b px-3 pt-3 pb-2 backdrop-blur',\n isSheet ? 'bg-background' : 'bg-muted/20'\n )}\n >\n <div className=\"relative\">\n <Search\n className={cn(\n 'pointer-events-none absolute left-2 top-1/2 -translate-y-1/2 text-muted-foreground',\n isSheet ? 'h-4 w-4' : 'h-3.5 w-3.5'\n )}\n />\n <Input\n type=\"search\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n placeholder={searchPlaceholder}\n aria-label={searchPlaceholder}\n className={cn(isSheet ? 'h-10 pl-8 text-base' : 'h-8 pl-7 text-sm')}\n />\n </div>\n </div>\n ) : null}\n <div className={cn('flex flex-col', isSheet ? 'px-2 pb-6' : 'p-3')}>\n {visibleSections.length === 0 ? (\n <p className=\"px-1 py-2 text-xs text-muted-foreground\">No blocks match.</p>\n ) : (\n visibleSections.map((section) => (\n <PaletteSection\n key={section.name}\n section={section}\n defaultOpen={isDefaultOpen(section.name, defaultOpenSections)}\n forceOpen={queryActive}\n onAddBlock={onAddBlock}\n variant={variant}\n />\n ))\n )}\n </div>\n </aside>\n );\n}\n\n/**\n * One collapsible category in the palette. Owns its own open/closed\n * state, seeded from `defaultOpen`. When `forceOpen` is true (an active\n * search) it renders expanded regardless of the local state, and the\n * prior state is restored once the search clears.\n */\nfunction PaletteSection({\n section,\n defaultOpen,\n forceOpen,\n onAddBlock,\n variant = 'aside'\n}: {\n section: PaletteSectionDef;\n defaultOpen: boolean;\n forceOpen: boolean;\n onAddBlock: (block: SupportedBlock) => void;\n variant?: 'aside' | 'sheet';\n}) {\n const [open, setOpen] = useState(defaultOpen);\n const Icon = section.icon;\n const isOpen = open || forceOpen;\n const Caret = isOpen ? ChevronDown : ChevronRight;\n const isSheet = variant === 'sheet';\n\n return (\n <div className=\"mt-3 flex flex-col first:mt-0\">\n <button\n type=\"button\"\n aria-expanded={isOpen}\n onClick={() => setOpen((v) => !v)}\n className={cn(\n 'flex cursor-pointer appearance-none items-center gap-1.5 rounded border-0 bg-transparent text-left transition-colors hover:bg-accent focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring',\n isSheet ? 'px-2 py-2 min-h-10' : 'px-1 py-1'\n )}\n >\n <Icon className={cn('shrink-0 text-muted-foreground', isSheet ? 'h-5 w-5' : 'h-4 w-4')} />\n <span\n className={cn('min-w-0 flex-1 truncate font-semibold text-foreground', isSheet ? 'text-sm' : 'text-[13px]')}\n >\n {section.name}\n </span>\n <Caret className={cn('shrink-0 text-muted-foreground', isSheet ? 'h-4 w-4' : 'h-3.5 w-3.5')} />\n </button>\n {isOpen ? (\n <div className=\"mt-0.5 flex flex-col\">\n {section.variants.map((v) => (\n <PaletteItem key={v.id} variant={v} onAdd={() => onAddBlock(v.factory())} mode={variant} />\n ))}\n </div>\n ) : null}\n </div>\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({\n variant,\n onAdd,\n mode = 'aside'\n}: {\n variant: PaletteVariant;\n onAdd: () => void;\n mode?: 'aside' | 'sheet';\n}) {\n const { attributes, listeners, setNodeRef, setActivatorNodeRef, isDragging } = useDraggable({\n id: `${PALETTE_DRAG_PREFIX}${variant.id}`\n });\n\n const isSheet = mode === 'sheet';\n\n if (isSheet) {\n // In the mobile sheet the row IS the tap target — no separate grip /\n // chevron split. Touch DnD is unreliable on mixed scrollers anyway, so\n // we lean on tap-to-add as the primary input here.\n return (\n <button\n ref={setNodeRef as unknown as React.Ref<HTMLButtonElement>}\n type=\"button\"\n aria-label={`Add ${variant.label}`}\n onClick={onAdd}\n className={cn(\n 'group flex w-full min-h-11 cursor-pointer items-center gap-3 rounded-md border border-transparent bg-background px-3 py-2 text-left text-sm font-medium text-foreground transition-colors hover:border-border hover:bg-accent active:bg-accent focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring',\n isDragging && 'opacity-50'\n )}\n >\n <span className=\"flex h-7 w-7 shrink-0 items-center justify-center rounded-md bg-muted text-muted-foreground transition-colors group-hover:bg-primary/10 group-hover:text-primary\">\n <ChevronRight className=\"h-4 w-4\" />\n </span>\n <span className=\"min-w-0 flex-1 truncate\">{variant.label}</span>\n </button>\n );\n }\n\n return (\n <div\n ref={setNodeRef}\n className={cn(\n 'group flex items-center gap-2 rounded px-2 py-1.5 text-sm text-muted-foreground transition-colors hover:bg-accent hover:text-foreground has-[:focus-visible]:bg-accent has-[:focus-visible]:text-foreground',\n isDragging && 'opacity-50'\n )}\n >\n <div\n ref={setActivatorNodeRef}\n className=\"-my-1.5 flex min-w-0 flex-1 cursor-grab items-center gap-2 rounded py-1.5 active:cursor-grabbing focus-visible:outline-none\"\n {...attributes}\n {...listeners}\n >\n <GripVertical className=\"h-3.5 w-3.5 shrink-0\" />\n <span className=\"truncate\">{variant.label}</span>\n </div>\n <button\n type=\"button\"\n aria-label={`Add ${variant.label} to preview`}\n onClick={onAdd}\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 group-has-[:focus-visible]:opacity-100 focus-visible:opacity-100 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\"\n >\n <ChevronRight className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n );\n}\n","import { AlertTriangle } from 'lucide-react';\nimport { 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 { isSafeHref } from '../lib/url-safety';\nimport type { ChannelOption, SendAsUserStatus, SendPayload, SupportedBlock } from '../types';\nimport { SlackSignInButton, useSlackSignIn } from './slack-sign-in';\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.confirmSendLabel - label for the final confirm button. Defaults to `'Send'`.\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 confirmSendLabel = 'Send',\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 /** Label for the final confirm button. Defaults to `'Send'`. */\n confirmSendLabel?: 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 [sendAs, setSendAs] = useState<'bot' | 'user'>('bot');\n const [status, setStatus] = useState<SendStatus>({ kind: 'idle' });\n\n const { userStatus, polling, startSignIn } = useSlackSignIn(loadSendAsUserStatus, { open, enabled: true });\n\n // Hold the latest channels loader in a ref so the open effect can depend only\n // on `open` without retriggering when the consumer passes a fresh arrow\n // function each render.\n const loadChannelsRef = useRef(loadChannels);\n useEffect(() => {\n loadChannelsRef.current = loadChannels;\n });\n\n useEffect(() => {\n if (!open) {\n return;\n }\n setStatus({ kind: 'idle' });\n setChannels(null);\n setChannelsError(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 return () => {\n cancelled = true;\n };\n }, [open]);\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 className=\"w-[calc(100vw-1.5rem)] max-w-lg rounded-lg\">\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=\"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 && isSafeHref(userStatus.oauthUrl) && (\n <>\n <p className=\"text-xs text-muted-foreground\">Connect your Slack account to post as yourself.</p>\n <SlackSignInButton onClick={startSignIn} polling={polling} />\n </>\n )}\n </div>\n\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 {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…' : confirmSendLabel}\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 'bk-portal-content 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 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 *\n * `idPrefix` namespaces the input ids so the editor can be rendered more\n * than once on a page (the carousel editor reuses it per card); it\n * defaults to `card` for the standalone block.\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 * @param props.idPrefix - prefix for input ids (defaults to `card`)\n * @returns the rendered card editor form\n */\nexport function CardEditor({\n block,\n onChange,\n idPrefix = 'card'\n}: BlockEditorProps<CardBlock> & { idPrefix?: string }) {\n return (\n <div className=\"flex flex-col gap-4\">\n <EditorField label=\"Title\" help=\"Up to 150 characters. Supports mrkdwn formatting.\" htmlFor={`${idPrefix}-title`}>\n <Input\n id={`${idPrefix}-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={`${idPrefix}-subtitle`}>\n <Input\n id={`${idPrefix}-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={`${idPrefix}-body`}>\n <Textarea\n id={`${idPrefix}-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={`${idPrefix}-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={`${idPrefix}-icon`}\n image={block.icon}\n onChange={(next) => onChange({ ...block, icon: next })}\n />\n\n <ButtonsField\n idPrefix={idPrefix}\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({\n buttons,\n onChange,\n idPrefix = 'card'\n}: {\n buttons: SlackButton[];\n onChange: (next: SlackButton[]) => void;\n idPrefix?: string;\n}) {\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={`${idPrefix}-btn-label-${idx}`}>\n <Input\n id={`${idPrefix}-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={`${idPrefix}-btn-url-${idx}`}\n >\n <Input\n id={`${idPrefix}-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={`${idPrefix}-btn-style-${idx}-${s}`} />\n <Label htmlFor={`${idPrefix}-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 type { CardBlock, CarouselBlock } from '../../types';\nimport { CardEditor } from './card-editor';\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 each one with the full standalone Card\n * editor (title, subtitle, body, hero image, icon, and action buttons).\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\">Carousels hold 1-10 cards.</p>\n {elements.map((card, idx) => (\n <div key={idx} className=\"flex flex-col gap-3 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 <CardEditor block={card} idPrefix={`carousel-card-${idx}`} onChange={(next) => updateCard(idx, next)} />\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 { Input } from '../../lib/ui/input';\nimport { Label } from '../../lib/ui/label';\nimport { RadioGroup, RadioGroupItem } from '../../lib/ui/radio-group';\nimport type { ContainerBlock } from '../../types';\nimport { EditorField } from './field';\nimport type { BlockEditorProps } from './types';\n\nconst WIDTHS = ['narrow', 'standard', 'wide', 'full'] as const;\n\n/**\n * Editor form for `container` blocks. Edits the container's own fields —\n * title, subtitle, width, collapse behavior, and icon. The child blocks it\n * groups are added, removed, reordered, and edited directly on the canvas\n * by dragging blocks into and out of the container.\n * @param props - editor props\n * @param props.block - the container block to edit\n * @param props.onChange - called with the updated block payload\n * @returns the rendered container editor form\n */\nexport function ContainerEditor({ block, onChange }: BlockEditorProps<ContainerBlock>) {\n // The visual builder only emits URL-based icons; a slack_file icon (rare)\n // reads as empty and is replaced if the user types a URL.\n const iconUrl = block.icon && 'image_url' in block.icon ? (block.icon.image_url ?? '') : '';\n const iconAlt = block.icon?.alt_text ?? '';\n\n return (\n <div className=\"flex flex-col gap-4\">\n <EditorField label=\"Title\" help=\"Heading shown at the top of the container.\" htmlFor=\"container-title\">\n <Input\n id=\"container-title\"\n value={block.title?.text ?? ''}\n maxLength={150}\n placeholder=\"e.g. Bulk update: 2 records selected\"\n onChange={(e) => onChange({ ...block, title: { type: 'plain_text', text: e.target.value } })}\n />\n </EditorField>\n\n <EditorField label=\"Subtitle\" help=\"Optional secondary line under the title.\" htmlFor=\"container-subtitle\">\n <Input\n id=\"container-subtitle\"\n value={block.subtitle?.text ?? ''}\n maxLength={150}\n placeholder=\"e.g. Review changes before confirming\"\n onChange={(e) =>\n onChange({\n ...block,\n subtitle: e.target.value ? { type: 'plain_text', text: e.target.value } : undefined\n })\n }\n />\n </EditorField>\n\n <EditorField label=\"Icon URL\" help=\"Optional image shown left of the title.\" htmlFor=\"container-icon\">\n <Input\n id=\"container-icon\"\n type=\"url\"\n value={iconUrl}\n placeholder=\"https://example.com/icon.png\"\n onChange={(e) =>\n onChange({\n ...block,\n icon: e.target.value\n ? { type: 'image', image_url: e.target.value, alt_text: iconAlt || 'Container icon' }\n : undefined\n })\n }\n />\n </EditorField>\n\n <EditorField label=\"Width\" help=\"How wide the container renders in the message.\">\n <RadioGroup\n value={block.width ?? 'standard'}\n onValueChange={(v) => onChange({ ...block, width: v as ContainerBlock['width'] })}\n className=\"flex flex-row flex-wrap gap-3\"\n >\n {WIDTHS.map((w) => (\n <div key={w} className=\"flex items-center gap-1.5\">\n <RadioGroupItem value={w} id={`container-width-${w}`} />\n <Label htmlFor={`container-width-${w}`} className=\"text-xs capitalize\">\n {w}\n </Label>\n </div>\n ))}\n </RadioGroup>\n </EditorField>\n\n <Checkbox\n id=\"container-collapsible\"\n label=\"Collapsible\"\n help=\"Let readers expand and collapse the container.\"\n checked={!!block.is_collapsible}\n // Clearing collapsible must also clear default_collapsed — Slack\n // rejects default_collapsed: true without is_collapsible: true.\n onChange={(checked) =>\n onChange({\n ...block,\n is_collapsible: checked || undefined,\n default_collapsed: checked ? block.default_collapsed : undefined\n })\n }\n />\n\n <Checkbox\n id=\"container-default-collapsed\"\n label=\"Collapsed by default\"\n help=\"Start collapsed on first render. Requires Collapsible.\"\n checked={!!block.default_collapsed}\n disabled={!block.is_collapsible}\n onChange={(checked) => onChange({ ...block, default_collapsed: checked || undefined })}\n />\n\n <p className=\"text-[11px] leading-snug text-muted-foreground\">\n Drag blocks into the container on the canvas to add them (1-10), and drag them out to remove. Click a child to\n edit it.\n </p>\n </div>\n );\n}\n\n/**\n * Inline labeled checkbox matching the builder's editor styling.\n */\nfunction Checkbox({\n id,\n label,\n help,\n checked,\n disabled,\n onChange\n}: {\n id: string;\n label: string;\n help?: string;\n checked: boolean;\n disabled?: 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 disabled={disabled}\n onChange={(e) => onChange(e.target.checked)}\n className=\"h-3.5 w-3.5 cursor-pointer rounded border-input disabled:cursor-not-allowed disabled:opacity-40\"\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 { 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.length === 0 ? (\n <p className=\"rounded-md border border-dashed bg-muted/20 px-3 py-2 text-xs text-muted-foreground\">\n No items yet — a context block needs at least one. Add text or an image below, or delete the block if you\n don't need it.\n </p>\n ) : null}\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 @riley\"\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. Riley's avatar\"\n onChange={(e) => onChange({ ...element, alt_text: e.target.value })}\n />\n </EditorField>\n </div>\n );\n}\n","import { Plus, Trash2 } from 'lucide-react';\nimport { useEffect, useState } from 'react';\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 CartesianChart,\n Chart,\n ChartSeries,\n ChartType,\n DataVisualizationBlock,\n PieChart,\n PieChartSegment\n} from '../../types';\nimport { EditorField } from './field';\nimport type { BlockEditorProps } from './types';\n\nconst CHART_TYPES: readonly ChartType[] = ['line', 'bar', 'area', 'pie'] as const;\n\n/** Narrows a chart to its cartesian (line / bar / area) variant. */\nfunction isCartesian(chart: Chart): chart is CartesianChart {\n return chart.type !== 'pie';\n}\n\n/** Flattens a cartesian chart's first series into pie segments. */\nfunction cartesianToSegments(chart: CartesianChart): PieChartSegment[] {\n return (chart.series[0]?.data ?? []).map((d) => ({ label: d.label, value: d.value }));\n}\n\n/** Builds a single-series cartesian chart from pie segments. */\nfunction segmentsToCartesian(type: CartesianChart['type'], segments: PieChartSegment[]): CartesianChart {\n return {\n type,\n series: [{ name: 'Series 1', data: segments.map((s) => ({ label: s.label, value: s.value })) }],\n axis_config: { categories: segments.map((s) => s.label) }\n };\n}\n\n/**\n * Converts the current chart to a new chart type, preserving the data\n * where the shapes are compatible: line / bar / area share the same\n * series shape, while switching to or from pie maps between series data\n * and segments so a user doesn't lose their numbers mid-edit.\n */\nfunction convertChart(chart: Chart, nextType: ChartType): Chart {\n if (nextType === chart.type) {\n return chart;\n }\n if (nextType === 'pie') {\n return { type: 'pie', segments: isCartesian(chart) ? cartesianToSegments(chart) : chart.segments };\n }\n if (isCartesian(chart)) {\n return { ...chart, type: nextType };\n }\n return segmentsToCartesian(nextType, chart.segments);\n}\n\n/**\n * Editor form for `data_visualization` blocks. Edits the title, the chart\n * type (line / bar / area / pie), and the underlying data — a category ×\n * series grid for the cartesian charts, or a flat segment list for pie.\n * @param props - editor props\n * @param props.block - the data visualization block to edit\n * @param props.onChange - called with the updated block payload\n * @returns the rendered data visualization editor form\n */\nexport function DataVisualizationEditor({ block, onChange }: BlockEditorProps<DataVisualizationBlock>) {\n const { chart } = block;\n const setChart = (next: Chart) => onChange({ ...block, chart: next });\n\n return (\n <div className=\"flex flex-col gap-4\">\n <EditorField label=\"Title\" help=\"Heading shown above the chart.\" htmlFor=\"dataviz-title\">\n <Input\n id=\"dataviz-title\"\n value={block.title}\n placeholder=\"e.g. Weekly active users\"\n onChange={(e) => onChange({ ...block, title: e.target.value })}\n />\n </EditorField>\n\n <EditorField label=\"Chart type\">\n <RadioGroup\n value={chart.type}\n onValueChange={(v) => setChart(convertChart(chart, v as ChartType))}\n className=\"flex flex-row flex-wrap gap-3\"\n >\n {CHART_TYPES.map((t) => (\n <div key={t} className=\"flex items-center gap-1.5\">\n <RadioGroupItem value={t} id={`dataviz-type-${t}`} />\n <Label htmlFor={`dataviz-type-${t}`} className=\"text-xs capitalize\">\n {t}\n </Label>\n </div>\n ))}\n </RadioGroup>\n </EditorField>\n\n {isCartesian(chart) ? (\n <CartesianFields chart={chart} onChange={setChart} />\n ) : (\n <PieFields chart={chart} onChange={setChart} />\n )}\n </div>\n );\n}\n\n/**\n * Numeric input that keeps a local string draft so partial values like a\n * lone \"-\" type cleanly. Commits a parsed number on every valid keystroke\n * and normalizes (empty / invalid → 0) on blur. Resyncs when the model\n * value changes from outside (e.g. a chart-type switch or row reindex).\n */\nfunction NumberInput({\n id,\n value,\n onCommit,\n ariaLabel,\n className\n}: {\n id?: string;\n value: number;\n onCommit: (next: number) => void;\n ariaLabel?: string;\n className?: string;\n}) {\n const [draft, setDraft] = useState(String(value));\n useEffect(() => {\n setDraft(String(value));\n }, [value]);\n\n return (\n <Input\n id={id}\n type=\"number\"\n inputMode=\"numeric\"\n aria-label={ariaLabel}\n value={draft}\n className={className}\n onChange={(e) => {\n const raw = e.target.value;\n setDraft(raw);\n // Skip intermediate states that don't parse to a number yet.\n if (raw === '' || raw === '-' || raw === '.' || raw === '-.') {\n return;\n }\n const next = Number(raw);\n if (!Number.isNaN(next)) {\n onCommit(next);\n }\n }}\n onBlur={() => {\n const next = Number(draft);\n const safe = draft.trim() === '' || Number.isNaN(next) ? 0 : next;\n onCommit(safe);\n setDraft(String(safe));\n }}\n />\n );\n}\n\n/**\n * Sub-editor for line / bar / area charts. Presents the data as a grid:\n * categories are the x-axis columns, each series is a row, and every cell\n * is a numeric value. Series data is kept aligned to the category spine on\n * every edit so the payload always has one value per category.\n */\nfunction CartesianFields({ chart, onChange }: { chart: CartesianChart; onChange: (next: CartesianChart) => void }) {\n const series = chart.series;\n // Categories drive the x-axis. Fall back to the first series' labels so a\n // block loaded without axis_config still shows (and keeps) its data.\n const categories =\n chart.axis_config?.categories && chart.axis_config.categories.length > 0\n ? chart.axis_config.categories\n : (series[0]?.data.map((d) => d.label) ?? []);\n const xLabel = chart.axis_config?.x_label ?? '';\n const yLabel = chart.axis_config?.y_label ?? '';\n\n // Single write path: re-align every series to the category spine and\n // rebuild axis_config, dropping empty axis labels.\n const commit = (\n nextCategories: string[],\n nextSeries: ChartSeries[],\n axis?: { x_label?: string; y_label?: string }\n ) => {\n const aligned: ChartSeries[] = nextSeries.map((s) => ({\n name: s.name,\n data: nextCategories.map((label, i) => ({ label, value: s.data[i]?.value ?? 0 }))\n }));\n const x = axis?.x_label ?? xLabel;\n const y = axis?.y_label ?? yLabel;\n onChange({\n type: chart.type,\n series: aligned,\n axis_config: {\n categories: nextCategories,\n ...(x ? { x_label: x } : {}),\n ...(y ? { y_label: y } : {})\n }\n });\n };\n\n const setCategory = (col: number, label: string) =>\n commit(\n categories.map((c, i) => (i === col ? label : c)),\n series\n );\n const addCategory = () => commit([...categories, `Cat ${categories.length + 1}`], series);\n const removeCategory = (col: number) =>\n commit(\n categories.filter((_, i) => i !== col),\n series.map((s) => ({ name: s.name, data: s.data.filter((_, i) => i !== col) }))\n );\n const setCell = (seriesIdx: number, col: number, value: number) =>\n commit(\n categories,\n series.map((s, i) =>\n i === seriesIdx ? { name: s.name, data: s.data.map((d, j) => (j === col ? { ...d, value } : d)) } : s\n )\n );\n const setSeriesName = (seriesIdx: number, name: string) =>\n commit(\n categories,\n series.map((s, i) => (i === seriesIdx ? { ...s, name } : s))\n );\n const addSeries = () =>\n commit(categories, [\n ...series,\n { name: `Series ${series.length + 1}`, data: categories.map((label) => ({ label, value: 0 })) }\n ]);\n const removeSeries = (seriesIdx: number) =>\n commit(\n categories,\n series.filter((_, i) => i !== seriesIdx)\n );\n\n return (\n <div className=\"flex flex-col gap-4\">\n <div className=\"flex gap-2\">\n <div className=\"flex-1\">\n <EditorField label=\"X-axis label\" htmlFor=\"dataviz-x-label\">\n <Input\n id=\"dataviz-x-label\"\n value={xLabel}\n placeholder=\"e.g. Day\"\n onChange={(e) => commit(categories, series, { x_label: e.target.value })}\n />\n </EditorField>\n </div>\n <div className=\"flex-1\">\n <EditorField label=\"Y-axis label\" htmlFor=\"dataviz-y-label\">\n <Input\n id=\"dataviz-y-label\"\n value={yLabel}\n placeholder=\"e.g. Users\"\n onChange={(e) => commit(categories, series, { y_label: e.target.value })}\n />\n </EditorField>\n </div>\n </div>\n\n <EditorField label=\"Data\" help=\"Categories are the x-axis; each series is plotted across them.\">\n <div className=\"flex flex-col gap-2 overflow-x-auto\">\n {/* Category header row */}\n <div className=\"flex items-center gap-1\">\n <span className=\"w-36 shrink-0\" aria-hidden=\"true\" />\n {categories.map((cat, c) => (\n <div key={c} className=\"flex min-w-[88px] flex-1 items-center gap-1\">\n <Input\n aria-label={`Category ${c + 1}`}\n value={cat}\n placeholder={`Cat ${c + 1}`}\n onChange={(e) => setCategory(c, e.target.value)}\n className=\"h-8 text-xs\"\n />\n <button\n type=\"button\"\n aria-label={`Remove category ${c + 1}`}\n onClick={() => removeCategory(c)}\n className=\"flex h-6 w-6 shrink-0 items-center justify-center rounded text-muted-foreground hover:bg-destructive/10 hover:text-destructive\"\n >\n <Trash2 className=\"h-3 w-3\" />\n </button>\n </div>\n ))}\n </div>\n\n {/* One row per series */}\n {series.map((s, si) => (\n <div key={si} className=\"flex items-center gap-1\">\n <div className=\"flex w-36 shrink-0 items-center gap-1\">\n <Input\n aria-label={`Series ${si + 1} name`}\n value={s.name}\n placeholder={`Series ${si + 1}`}\n onChange={(e) => setSeriesName(si, e.target.value)}\n className=\"h-8 text-xs\"\n />\n <button\n type=\"button\"\n aria-label={`Remove series ${si + 1}`}\n onClick={() => removeSeries(si)}\n className=\"flex h-6 w-6 shrink-0 items-center justify-center rounded text-muted-foreground hover:bg-destructive/10 hover:text-destructive\"\n >\n <Trash2 className=\"h-3 w-3\" />\n </button>\n </div>\n {categories.map((cat, c) => (\n <div key={c} className=\"min-w-[88px] flex-1\">\n <NumberInput\n value={s.data[c]?.value ?? 0}\n onCommit={(n) => setCell(si, c, n)}\n ariaLabel={`${s.name || `Series ${si + 1}`} value for ${cat || `category ${c + 1}`}`}\n className=\"h-8 text-xs\"\n />\n </div>\n ))}\n </div>\n ))}\n </div>\n </EditorField>\n\n <div className=\"flex gap-2\">\n <Button type=\"button\" size=\"sm\" onClick={addSeries} className=\"self-start\">\n <Plus className=\"h-3.5 w-3.5\" /> Add series\n </Button>\n <Button type=\"button\" size=\"sm\" variant=\"outline\" onClick={addCategory} className=\"self-start\">\n <Plus className=\"h-3.5 w-3.5\" /> Add category\n </Button>\n </div>\n </div>\n );\n}\n\n/**\n * Sub-editor for pie charts. Edits the flat list of `{ label, value }`\n * segments with add / remove controls.\n */\nfunction PieFields({ chart, onChange }: { chart: PieChart; onChange: (next: PieChart) => void }) {\n const segments = chart.segments;\n\n const setSegment = (idx: number, change: Partial<PieChartSegment>) =>\n onChange({ ...chart, segments: segments.map((s, i) => (i === idx ? { ...s, ...change } : s)) });\n const removeSegment = (idx: number) => onChange({ ...chart, segments: segments.filter((_, i) => i !== idx) });\n const addSegment = () =>\n onChange({ ...chart, segments: [...segments, { label: `Segment ${segments.length + 1}`, value: 0 }] });\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\">Segments</span>\n {segments.length === 0 ? (\n <p className=\"text-[11px] leading-snug text-muted-foreground\">No segments. Add one to render a slice.</p>\n ) : null}\n {segments.map((seg, 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\">Segment {idx + 1}</span>\n <button\n type=\"button\"\n aria-label=\"Remove segment\"\n onClick={() => removeSegment(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 <div className=\"flex gap-2\">\n <div className=\"flex-1\">\n <EditorField label=\"Label\" htmlFor={`pie-label-${idx}`}>\n <Input\n id={`pie-label-${idx}`}\n value={seg.label}\n placeholder=\"e.g. Free\"\n onChange={(e) => setSegment(idx, { label: e.target.value })}\n />\n </EditorField>\n </div>\n <div className=\"w-28\">\n <EditorField label=\"Value\" htmlFor={`pie-value-${idx}`}>\n <NumberInput\n id={`pie-value-${idx}`}\n value={seg.value}\n onCommit={(n) => setSegment(idx, { value: n })}\n ariaLabel={`Segment ${idx + 1} value`}\n />\n </EditorField>\n </div>\n </div>\n </div>\n ))}\n <Button type=\"button\" size=\"sm\" onClick={addSegment} className=\"self-start\">\n <Plus className=\"h-3.5 w-3.5\" /> Add segment\n </Button>\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","/**\n * Emoji dataset built from `emoji-datasource` (iamcal / `emoji-data`) — the\n * same canonical source `@tightknit/emoji-mapping` is generated from. Its\n * `short_name` values are Slack's codenames, so resolving a picked emoji to a\n * Slack `name` via its Unicode codepoint (`unified`) is immune to alias drift.\n *\n * The raw dataset (~1.3 MB JSON) is loaded lazily via dynamic import so it\n * never bloats the initial bundle — only when an emoji picker first mounts.\n * The derived index is memoized after the first load.\n */\n\n/** A raw record from `emoji-datasource`'s `emoji.json` (subset we use). */\nexport interface RawEmoji {\n name: string | null;\n unified: string;\n short_name: string;\n short_names: string[];\n category: string;\n sort_order: number;\n skin_variations?: Record<string, { unified: string }>;\n}\n\n/** A normalized emoji entry used by the picker and the TipTap converter. */\nexport interface EmojiDatum {\n /** Canonical Slack codename (first `short_name`). */\n name: string;\n /** All Slack codenames for this codepoint (used for search + lookup). */\n shortNames: string[];\n /** Base Unicode codepoint(s), uppercase, hyphen-delimited (`1F44B`). */\n unified: string;\n /** Source category name (`Smileys & Emotion`, …). */\n category: string;\n /** Stable ordering within a category. */\n sortOrder: number;\n /**\n * Per-skin-tone base+tone codepoints, keyed by Slack `skin_tone` (2–6).\n * Empty when the emoji has no skin variations.\n */\n skinUnified: Record<number, string>;\n}\n\n/** The memoized, derived index the picker and converter consume. */\nexport interface EmojiIndex {\n /** All standard emoji, in category + sort order. */\n all: EmojiDatum[];\n /** Lookup by any Slack codename. */\n byName: Map<string, EmojiDatum>;\n /** Lookup by base `unified` codepoint(s) (uppercase). */\n byUnified: Map<string, EmojiDatum>;\n /** Category name → entries, in Slack-like display order. */\n byCategory: { category: string; emoji: EmojiDatum[] }[];\n}\n\n/**\n * The five Fitzpatrick skin-tone modifier codepoints, in order, mapped to\n * Slack's `skin_tone` integer. emoji-mart's `skin` is 1 (default, no tone) or\n * 2–6; Slack's `skin_tone` uses the same 2–6 and omits the field for default.\n */\nconst TONE_CODEPOINT_TO_SKIN_TONE: Record<string, number> = {\n '1F3FB': 2,\n '1F3FC': 3,\n '1F3FD': 4,\n '1F3FE': 5,\n '1F3FF': 6\n};\n\n/**\n * Slack-like category display order. `Component` (skin-tone modifiers, etc.)\n * is intentionally omitted — those aren't user-pickable emoji.\n */\nconst CATEGORY_ORDER = [\n 'Smileys & Emotion',\n 'People & Body',\n 'Animals & Nature',\n 'Food & Drink',\n 'Travel & Places',\n 'Activities',\n 'Objects',\n 'Symbols',\n 'Flags'\n];\n\n/**\n * Converts a hyphen-delimited Unicode codepoint string (`1F44B`,\n * `1F441-FE0F`) to its rendered glyph. Invalid codepoints are skipped.\n * @param unified - uppercase hyphen-delimited codepoints\n * @returns the rendered emoji glyph\n */\nexport function codepointsToGlyph(unified: string): string {\n return unified\n .split('-')\n .map((cp) => {\n const n = Number.parseInt(cp, 16);\n return Number.isFinite(n) ? String.fromCodePoint(n) : '';\n })\n .join('');\n}\n\n/**\n * The Slack rich_text `unicode` value for an emoji: the base codepoint(s),\n * lowercased (`1F44B` → `1f44b`). Skin tone is carried separately in\n * `skin_tone`, never folded into `unicode`.\n * @param unified - the base `unified` codepoint(s)\n * @returns the lowercased codepoint string\n */\nexport function unifiedToUnicode(unified: string): string {\n return unified.toLowerCase();\n}\n\n/**\n * Composes the text form of an emoji for plain_text / mrkdwn fields:\n * `:name:` or, with a skin tone, `:name::skin-tone-N:`.\n * @param name - the Slack codename (no colons)\n * @param skinTone - optional Slack `skin_tone` (2–6)\n * @returns the colon-wrapped shortcode\n */\nexport function composeTextEmoji(name: string, skinTone?: number): string {\n if (skinTone && skinTone >= 2 && skinTone <= 6) {\n return `:${name}::skin-tone-${skinTone}:`;\n }\n return `:${name}:`;\n}\n\n/**\n * Builds the derived {@link EmojiIndex} from raw `emoji-datasource` records.\n * Pure and synchronous so it can be unit-tested with a small fixture.\n * @param raw - the raw emoji records\n * @returns the normalized, ordered index\n */\nexport function buildEmojiIndex(raw: RawEmoji[]): EmojiIndex {\n const all: EmojiDatum[] = [];\n const byName = new Map<string, EmojiDatum>();\n const byUnified = new Map<string, EmojiDatum>();\n\n for (const r of raw) {\n if (!CATEGORY_ORDER.includes(r.category)) {\n continue;\n }\n const shortNames = r.short_names?.length ? r.short_names : [r.short_name];\n const skinUnified: Record<number, string> = {};\n if (r.skin_variations) {\n for (const [toneKey, variation] of Object.entries(r.skin_variations)) {\n const skinTone = TONE_CODEPOINT_TO_SKIN_TONE[toneKey];\n // Skip compound (multi-person) variations keyed by paired tones; we\n // only model a single skin_tone, matching Slack's emoji element.\n if (skinTone && variation?.unified) {\n skinUnified[skinTone] = variation.unified;\n }\n }\n }\n const datum: EmojiDatum = {\n name: shortNames[0],\n shortNames,\n unified: r.unified,\n category: r.category,\n sortOrder: r.sort_order,\n skinUnified\n };\n all.push(datum);\n byUnified.set(r.unified.toUpperCase(), datum);\n for (const sn of shortNames) {\n // First writer wins so the canonical record owns a shared codename.\n if (!byName.has(sn)) {\n byName.set(sn, datum);\n }\n }\n }\n\n all.sort((a, b) => a.sortOrder - b.sortOrder);\n\n const byCategory = CATEGORY_ORDER.map((category) => ({\n category,\n emoji: all.filter((e) => e.category === category)\n })).filter((group) => group.emoji.length > 0);\n\n return { all, byName, byUnified, byCategory };\n}\n\nlet indexPromise: Promise<EmojiIndex> | null = null;\nlet cachedIndex: EmojiIndex | null = null;\n\n/**\n * Lazily loads `emoji-datasource` and builds the {@link EmojiIndex}, memoizing\n * the result across calls. Safe to call repeatedly; the dynamic import and\n * index build happen at most once.\n * @returns the emoji index\n */\nexport async function loadEmojiIndex(): Promise<EmojiIndex> {\n if (cachedIndex) {\n return cachedIndex;\n }\n if (!indexPromise) {\n indexPromise = import('emoji-datasource/emoji.json')\n .then((mod) => {\n const raw = (mod.default ?? mod) as RawEmoji[];\n cachedIndex = buildEmojiIndex(raw);\n return cachedIndex;\n })\n .catch((err) => {\n // Reset so a transient failure can be retried on the next open.\n indexPromise = null;\n throw err;\n });\n }\n return indexPromise;\n}\n\n/**\n * Returns the already-loaded index, or `null` if it hasn't loaded yet. Used by\n * synchronous code paths (e.g. the TipTap import converter) that resolve emoji\n * metadata best-effort and degrade gracefully when the dataset isn't warm.\n * @returns the cached index or null\n */\nexport function getEmojiIndex(): EmojiIndex | null {\n return cachedIndex;\n}\n","/**\n * Tiny localStorage-backed store of recently picked emoji codenames. Used by\n * the emoji picker's \"Frequently used\" row. SSR/storage-restricted\n * environments degrade to an in-memory no-op (reads return `[]`).\n */\n\nconst STORAGE_KEY = 'bk:emoji-recents';\nconst SKIN_TONE_KEY = 'bk:emoji-skin-tone';\nconst MAX_RECENTS = 24;\n\n/**\n * Reads the persisted picker skin tone (Slack `skin_tone` 2–6), or `null` for\n * the default (no tone). Degrades to `null` when storage is unavailable.\n * @returns the stored skin tone or null\n */\nexport function readEmojiSkinTone(): number | null {\n try {\n const raw = globalThis.localStorage?.getItem(SKIN_TONE_KEY);\n if (!raw) {\n return null;\n }\n const n = Number.parseInt(raw, 10);\n return n >= 2 && n <= 6 ? n : null;\n } catch {\n return null;\n }\n}\n\n/**\n * Persists the picker skin tone. Pass `null` to clear (default tone).\n * @param skinTone - Slack `skin_tone` (2–6) or null\n */\nexport function writeEmojiSkinTone(skinTone: number | null): void {\n try {\n if (skinTone && skinTone >= 2 && skinTone <= 6) {\n globalThis.localStorage?.setItem(SKIN_TONE_KEY, String(skinTone));\n } else {\n globalThis.localStorage?.removeItem(SKIN_TONE_KEY);\n }\n } catch {\n // ignore write failures (private mode, quota, SSR)\n }\n}\n\n/**\n * Reads the recent emoji codenames, most-recent first. Returns an empty array\n * when storage is unavailable or the stored value is malformed.\n * @returns recent codenames\n */\nexport function readEmojiRecents(): string[] {\n try {\n const raw = globalThis.localStorage?.getItem(STORAGE_KEY);\n if (!raw) {\n return [];\n }\n const parsed = JSON.parse(raw);\n return Array.isArray(parsed) ? parsed.filter((n): n is string => typeof n === 'string') : [];\n } catch {\n return [];\n }\n}\n\n/**\n * Records `name` as the most-recently used emoji, de-duplicating and capping\n * the list. Returns the updated list so callers can update state without a\n * re-read. No-ops gracefully when storage is unavailable.\n * @param name - the codename just picked\n * @returns the updated recents list, most-recent first\n */\nexport function pushEmojiRecent(name: string): string[] {\n const next = [name, ...readEmojiRecents().filter((n) => n !== name)].slice(0, MAX_RECENTS);\n try {\n globalThis.localStorage?.setItem(STORAGE_KEY, JSON.stringify(next));\n } catch {\n // ignore write failures (private mode, quota, SSR)\n }\n return next;\n}\n","import { useEffect, useMemo, useRef, useState } from 'react';\nimport { cn } from '../../lib/cn';\nimport {\n codepointsToGlyph,\n type EmojiDatum,\n type EmojiIndex,\n loadEmojiIndex,\n unifiedToUnicode\n} from '../../lib/emoji-data';\nimport { pushEmojiRecent, readEmojiRecents, readEmojiSkinTone, writeEmojiSkinTone } from '../../lib/emoji-recents';\nimport { Input } from '../../lib/ui/input';\nimport { useCustomEmojis } from '../../state/custom-emoji-context';\nimport type { CustomEmoji } from '../../types';\n\n/**\n * A resolved emoji selection emitted by {@link EmojiPicker}. The codename\n * (`name`) is always a Slack codename resolved via the Unicode codepoint, so\n * it round-trips to Slack without becoming blank text. `unicode` / `src` are\n * render-only hints; `skinTone` is Slack's 2–6 (or null for default / custom).\n */\nexport interface EmojiSelection {\n name: string;\n unicode: string | null;\n src: string | null;\n skinTone: number | null;\n}\n\n/** The five skin tones offered, mapped to Slack `skin_tone` (2–6). */\nconst SKIN_TONES = [\n { tone: null, label: 'Default', swatch: '✋' },\n { tone: 2, label: 'Light', swatch: '✋🏻' },\n { tone: 3, label: 'Medium-light', swatch: '✋🏼' },\n { tone: 4, label: 'Medium', swatch: '✋🏽' },\n { tone: 5, label: 'Medium-dark', swatch: '✋🏾' },\n { tone: 6, label: 'Dark', swatch: '✋🏿' }\n] as const;\n\n/** One renderable entry in a picker section: either a standard or custom emoji. */\ntype PickerEntry = { datum?: EmojiDatum; custom?: CustomEmoji };\n\ninterface PickerSection {\n key: string;\n title: string;\n emoji: PickerEntry[];\n}\n\n/**\n * Searchable Slack-style emoji picker covering the standard set (sourced from\n * `emoji-datasource`) plus workspace custom emoji. Offers search, categories,\n * skin tone, and a recents row. On pick it emits {@link EmojiSelection} with a\n * Slack codename resolved via codepoint — never the composed shortcode.\n *\n * @param props.onSelect - called with the resolved selection when an emoji is picked\n * @param props.autoFocus - whether to focus the search input on mount (default true)\n */\nexport function EmojiPicker({\n onSelect,\n autoFocus = true\n}: {\n onSelect: (selection: EmojiSelection) => void;\n autoFocus?: boolean;\n}) {\n const { customEmojis } = useCustomEmojis();\n const [index, setIndex] = useState<EmojiIndex | null>(null);\n const [loadError, setLoadError] = useState(false);\n const [query, setQuery] = useState('');\n const [skinTone, setSkinTone] = useState<number | null>(() => readEmojiSkinTone());\n const [recents, setRecents] = useState<string[]>(() => readEmojiRecents());\n const searchRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n let active = true;\n loadEmojiIndex()\n .then((idx) => {\n if (active) {\n setIndex(idx);\n }\n })\n .catch(() => {\n if (active) {\n setLoadError(true);\n }\n });\n return () => {\n active = false;\n };\n }, []);\n\n useEffect(() => {\n if (autoFocus) {\n searchRef.current?.focus();\n }\n }, [autoFocus]);\n\n // Workspace custom emoji that render as an image form the \"Custom\" category.\n const customByName = useMemo(() => {\n const map = new Map<string, CustomEmoji>();\n for (const e of customEmojis) {\n map.set(e.name, e);\n }\n return map;\n }, [customEmojis]);\n const customImageEmoji = useMemo(() => customEmojis.filter((e) => e.url), [customEmojis]);\n\n const handlePick = (selection: EmojiSelection) => {\n setRecents(pushEmojiRecent(selection.name));\n onSelect(selection);\n };\n\n const handleSkinTone = (tone: number | null) => {\n setSkinTone(tone);\n writeEmojiSkinTone(tone);\n };\n\n const sections = useMemo<PickerSection[]>(() => {\n if (!index) {\n return [];\n }\n const trimmed = query.trim().toLowerCase();\n if (trimmed) {\n const standard = index.all\n .filter((d) => d.shortNames.some((sn) => sn.includes(trimmed)))\n .slice(0, 120)\n .map((datum) => ({ datum }));\n const custom = customImageEmoji\n .filter((e) => e.name.toLowerCase().includes(trimmed))\n .map((custom) => ({ custom }));\n return [{ key: 'search', title: 'Search results', emoji: [...custom, ...standard] }];\n }\n\n const out: PickerSection[] = [];\n if (recents.length > 0) {\n const recentEmoji = recents\n .map((name): PickerEntry | null => {\n const custom = customByName.get(name);\n if (custom?.url) {\n return { custom };\n }\n const datum = index.byName.get(name);\n return datum ? { datum } : null;\n })\n .filter((e): e is PickerEntry => e !== null);\n if (recentEmoji.length > 0) {\n out.push({ key: 'recents', title: 'Frequently used', emoji: recentEmoji });\n }\n }\n if (customImageEmoji.length > 0) {\n out.push({ key: 'custom', title: 'Custom', emoji: customImageEmoji.map((custom) => ({ custom })) });\n }\n for (const group of index.byCategory) {\n out.push({ key: group.category, title: group.category, emoji: group.emoji.map((datum) => ({ datum })) });\n }\n return out;\n }, [index, query, recents, customByName, customImageEmoji]);\n\n return (\n <div className=\"bk-emoji-picker flex w-[320px] max-w-[90vw] flex-col gap-2\">\n <div className=\"flex items-center gap-2\">\n <Input\n ref={searchRef}\n value={query}\n placeholder=\"Search emoji…\"\n aria-label=\"Search emoji\"\n onChange={(e) => setQuery(e.target.value)}\n className=\"h-8\"\n />\n <SkinToneSelector value={skinTone} onChange={handleSkinTone} />\n </div>\n <div className=\"h-64 overflow-y-auto pr-1\">\n {loadError ? (\n <p className=\"p-4 text-center text-xs text-muted-foreground\">Couldn't load emoji.</p>\n ) : !index ? (\n <p className=\"p-4 text-center text-xs text-muted-foreground\">Loading emoji…</p>\n ) : sections.every((s) => s.emoji.length === 0) ? (\n <p className=\"p-4 text-center text-xs text-muted-foreground\">No emoji found.</p>\n ) : (\n sections.map((section) => (\n <div key={section.key} className=\"mb-2\">\n <div className=\"sticky top-0 z-10 bg-background px-1 py-1 text-[11px] font-medium text-muted-foreground\">\n {section.title}\n </div>\n <div className=\"grid grid-cols-8 gap-0.5\">\n {section.emoji.map((entry, i) =>\n entry.custom ? (\n <CustomEmojiButton\n key={`${section.key}-${entry.custom.name}-${i}`}\n emoji={entry.custom}\n onPick={handlePick}\n />\n ) : entry.datum ? (\n <StandardEmojiButton\n key={`${section.key}-${entry.datum.name}-${i}`}\n datum={entry.datum}\n skinTone={skinTone}\n onPick={handlePick}\n />\n ) : null\n )}\n </div>\n </div>\n ))\n )}\n </div>\n </div>\n );\n}\n\n/**\n * Resolves a standard emoji datum + the active skin tone to an\n * {@link EmojiSelection}, applying the tone only when the emoji supports it.\n */\nfunction resolveStandard(datum: EmojiDatum, skinTone: number | null): EmojiSelection {\n const tonedUnified = skinTone ? datum.skinUnified[skinTone] : undefined;\n return {\n name: datum.name,\n unicode: unifiedToUnicode(tonedUnified ?? datum.unified),\n src: null,\n skinTone: tonedUnified ? skinTone : null\n };\n}\n\nconst emojiButtonClass =\n 'flex h-8 w-8 cursor-pointer items-center justify-center rounded text-lg leading-none hover:bg-accent';\n\n/** A single standard emoji button. */\nfunction StandardEmojiButton({\n datum,\n skinTone,\n onPick\n}: {\n datum: EmojiDatum;\n skinTone: number | null;\n onPick: (s: EmojiSelection) => void;\n}) {\n const tonedUnified = (skinTone && datum.skinUnified[skinTone]) || datum.unified;\n return (\n <button\n type=\"button\"\n className={emojiButtonClass}\n title={`:${datum.name}:`}\n aria-label={datum.name}\n onClick={() => onPick(resolveStandard(datum, skinTone))}\n >\n {codepointsToGlyph(tonedUnified)}\n </button>\n );\n}\n\n/** A single workspace custom emoji button (image). */\nfunction CustomEmojiButton({ emoji, onPick }: { emoji: CustomEmoji; onPick: (s: EmojiSelection) => void }) {\n return (\n <button\n type=\"button\"\n className={emojiButtonClass}\n title={`:${emoji.name}:`}\n aria-label={emoji.name}\n onClick={() => onPick({ name: emoji.name, unicode: null, src: emoji.url, skinTone: null })}\n >\n {emoji.url ? (\n <img src={emoji.url} alt={`:${emoji.name}:`} className=\"h-5 w-5 object-contain\" />\n ) : (\n <span className=\"text-[10px]\">:{emoji.name}:</span>\n )}\n </button>\n );\n}\n\n/** Row of skin-tone swatches; the active tone applies to standard emoji. */\nfunction SkinToneSelector({ value, onChange }: { value: number | null; onChange: (tone: number | null) => void }) {\n const [open, setOpen] = useState(false);\n const active = SKIN_TONES.find((t) => t.tone === value) ?? SKIN_TONES[0];\n return (\n <div className=\"relative shrink-0\">\n <button\n type=\"button\"\n aria-label={`Skin tone: ${active.label}`}\n title={`Skin tone: ${active.label}`}\n className=\"flex h-8 w-8 items-center justify-center rounded border text-lg leading-none hover:bg-accent\"\n onClick={() => setOpen((o) => !o)}\n >\n {active.swatch}\n </button>\n {open && (\n <div className=\"absolute right-0 z-20 mt-1 flex gap-0.5 rounded-md border bg-background p-1 shadow-md\">\n {SKIN_TONES.map((t) => (\n <button\n key={t.label}\n type=\"button\"\n aria-label={t.label}\n title={t.label}\n className={cn(emojiButtonClass, value === t.tone && 'bg-accent')}\n onClick={() => {\n onChange(t.tone);\n setOpen(false);\n }}\n >\n {t.swatch}\n </button>\n ))}\n </div>\n )}\n </div>\n );\n}\n","import { Smile } from 'lucide-react';\nimport { useState } from 'react';\nimport { cn } from '../../lib/cn';\nimport { Popover, PopoverContent, PopoverTrigger } from '../../lib/ui/popover';\nimport { EmojiPicker, type EmojiSelection } from './emoji-picker';\n\n/**\n * An \"insert emoji\" trigger that opens the {@link EmojiPicker} in a popover and\n * emits the resolved {@link EmojiSelection} on pick (closing the popover).\n *\n * @param props.onSelect - called with the resolved selection when an emoji is picked\n * @param props.className - extra classes for the trigger button\n * @param props.label - accessible label / tooltip (default \"Insert emoji\")\n * @param props.align - popover alignment (default \"start\")\n */\nexport function EmojiPickerButton({\n onSelect,\n className,\n label = 'Insert emoji',\n align = 'start'\n}: {\n onSelect: (selection: EmojiSelection) => void;\n className?: string;\n label?: string;\n align?: 'start' | 'center' | 'end';\n}) {\n const [open, setOpen] = useState(false);\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n aria-label={label}\n title={label}\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 className\n )}\n >\n <Smile className=\"h-3.5 w-3.5\" />\n </button>\n </PopoverTrigger>\n <PopoverContent align={align} className=\"w-auto p-2\">\n <EmojiPicker\n onSelect={(selection) => {\n onSelect(selection);\n setOpen(false);\n }}\n />\n </PopoverContent>\n </Popover>\n );\n}\n","import type { RefObject } from 'react';\nimport { composeTextEmoji } from '../../lib/emoji-data';\nimport { EmojiPickerButton } from './emoji-picker-button';\n\n/**\n * \"Insert emoji\" control for plain_text / mrkdwn fields. Opens the emoji picker\n * and inserts the Slack shortcode form (`:name:` or `:name::skin-tone-N:`) at\n * the target field's caret, preserving the rest of the text and restoring the\n * caret after the inserted shortcode. Slack renders these shortcodes for both\n * standard and workspace-custom emoji.\n *\n * @param props.targetRef - ref to the input or textarea receiving the emoji\n * @param props.value - the field's current text (source of truth)\n * @param props.onChange - called with the next text after insertion\n * @param props.className - extra classes for the trigger button\n * @param props.align - popover alignment (default \"end\")\n */\nexport function EmojiTextInsertButton({\n targetRef,\n value,\n onChange,\n className,\n align = 'end'\n}: {\n targetRef: RefObject<HTMLInputElement | HTMLTextAreaElement | null>;\n value: string;\n onChange: (next: string) => void;\n className?: string;\n align?: 'start' | 'center' | 'end';\n}) {\n return (\n <EmojiPickerButton\n align={align}\n label=\"Insert emoji\"\n className={className}\n onSelect={(sel) => {\n const el = targetRef.current;\n const insert = composeTextEmoji(sel.name, sel.skinTone ?? undefined);\n // Fall back to appending when the caret position is unknown (e.g. the\n // field was never focused). Reading selection on a blurred element is\n // well-supported and yields the last caret position.\n const start = el?.selectionStart ?? value.length;\n const end = el?.selectionEnd ?? value.length;\n const next = value.slice(0, start) + insert + value.slice(end);\n onChange(next);\n requestAnimationFrame(() => {\n if (el) {\n const caret = start + insert.length;\n el.focus();\n el.setSelectionRange(caret, caret);\n }\n });\n }}\n />\n );\n}\n","import { useRef } from 'react';\nimport { 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 { EmojiTextInsertButton } from '../emoji/emoji-text-insert-button';\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 const inputRef = useRef<HTMLInputElement>(null);\n const setText = (next: string) => onChange({ ...block, text: { type: 'plain_text', text: next, emoji: true } });\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 <div className=\"flex items-center gap-1.5\">\n <Input\n ref={inputRef}\n id=\"header-text\"\n value={text}\n maxLength={HEADER_MAX}\n placeholder=\"e.g. Weekly roundup\"\n onChange={(e) => setText(e.target.value)}\n />\n <EmojiTextInsertButton targetRef={inputRef} value={text} onChange={setText} className=\"shrink-0 border\" />\n </div>\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\n element={element}\n onChange={onChange}\n example={element.multiline ? 'e.g. Enter a longer description' : 'e.g. Enter some text'}\n />\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} example=\"e.g. name@example.com\" />\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} example=\"e.g. https://example.com\" />\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} example=\"e.g. 0\" />\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} example=\"e.g. Select a date\" />\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} example=\"e.g. Select a time\" />\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} example=\"e.g. Choose one\" />\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} example=\"e.g. Choose one or more\" />\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} example=\"e.g. Select a user\" />\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} example=\"e.g. Select users\" />\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} example=\"e.g. Select a channel\" />\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} example=\"e.g. Select channels\" />\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} example=\"e.g. Select a conversation\" />\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} example=\"e.g. Select conversations\" />\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} example=\"e.g. Choose one\" />\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} example=\"e.g. Choose one or more\" />\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} example=\"e.g. Type something\" />\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 *\n * `example` is shown as the input's own `placeholder` attribute so the\n * user gets a per-element-type hint about what to type. The element's\n * factory in `default-blocks.ts` intentionally ships without a default\n * `placeholder.text` so this hint and the live preview don't render the\n * same string twice when the editor first opens.\n *\n * @param props - props\n * @param props.element - the element being edited\n * @param props.onChange - called with the updated element\n * @param props.example - greyed-out hint shown in the editor input (not\n * stored on the block); defaults to a generic suggestion\n * @returns the rendered field\n */\nfunction PlaceholderField<\n T extends {\n placeholder?: { type: 'plain_text'; text: string; emoji?: boolean };\n }\n>({ element, onChange, example = 'e.g. Type a hint' }: { element: T; onChange: (next: T) => void; example?: string }) {\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 placeholder={example}\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 { useRef } from 'react';\nimport { Textarea } from '../../lib/ui/textarea';\nimport type { MarkdownBlock } from '../../types';\nimport { EmojiTextInsertButton } from '../emoji/emoji-text-insert-button';\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 const textRef = useRef<HTMLTextAreaElement>(null);\n const text = block.text ?? '';\n const setText = (next: string) => onChange({ ...block, text: next });\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 <div className=\"flex items-start gap-1.5\">\n <Textarea\n ref={textRef}\n id=\"markdown-text\"\n value={text}\n rows={8}\n placeholder=\"e.g. **Roadmap**\\n\\n- Item one\\n- Item two\"\n onChange={(e) => setText(e.target.value)}\n />\n <EmojiTextInsertButton targetRef={textRef} value={text} onChange={setText} className=\"mt-1 shrink-0 border\" />\n </div>\n </EditorField>\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 { PlanBlock, TaskCardBlock, TaskCardStatus } from '../../types';\nimport { EditorField } from './field';\nimport type { BlockEditorProps } from './types';\n\nconst STATUSES: readonly TaskCardStatus[] = ['pending', 'in_progress', 'complete', 'error'] as const;\n\n/**\n * Editor form for plan blocks. Edits the title and the inline tasks list.\n * Each task gets a compact title + status row; richer fields (sources,\n * details, output) round-trip on the payload but aren't editable inline —\n * use a standalone `task_card` block for those.\n * @param props - editor props\n * @param props.block - the plan block to edit\n * @param props.onChange - called with the updated block payload\n * @returns the rendered plan editor form\n */\nexport function PlanEditor({ block, onChange }: BlockEditorProps<PlanBlock>) {\n const titleText = typeof block.title === 'string' ? block.title : (block.title?.text ?? '');\n const tasks = block.tasks ?? [];\n\n const updateTask = (idx: number, change: Partial<TaskCardBlock>) => {\n onChange({\n ...block,\n tasks: tasks.map((t, i) => (i === idx ? { ...t, ...change } : t))\n });\n };\n const removeTask = (idx: number) => {\n const next = tasks.filter((_, i) => i !== idx);\n onChange({ ...block, tasks: next.length > 0 ? next : undefined });\n };\n const addTask = () => {\n onChange({\n ...block,\n tasks: [\n ...tasks,\n {\n type: 'task_card',\n task_id: `task_${nanoid(6)}`,\n title: 'New step',\n status: 'pending'\n }\n ]\n });\n };\n\n return (\n <div className=\"flex flex-col gap-4\">\n <EditorField label=\"Title\" help=\"Heading shown above the task list.\" htmlFor=\"plan-title\">\n <Input\n id=\"plan-title\"\n value={titleText}\n placeholder=\"e.g. Investigating the issue\"\n onChange={(e) => onChange({ ...block, title: e.target.value })}\n />\n </EditorField>\n\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\">Tasks</span>\n {tasks.length === 0 ? (\n <p className=\"text-[11px] leading-snug text-muted-foreground\">\n No tasks. Add one to render a checklist beneath the title.\n </p>\n ) : null}\n {tasks.map((task, idx) => {\n const status: TaskCardStatus = task.status ?? 'pending';\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\">Task {idx + 1}</span>\n <button\n type=\"button\"\n aria-label=\"Remove task\"\n onClick={() => removeTask(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=\"Title\" htmlFor={`plan-task-title-${idx}`}>\n <Input\n id={`plan-task-title-${idx}`}\n value={task.title}\n placeholder=\"e.g. Reproduce the error locally\"\n onChange={(e) => updateTask(idx, { title: e.target.value })}\n />\n </EditorField>\n <EditorField label=\"Status\">\n <RadioGroup\n value={status}\n onValueChange={(v) => updateTask(idx, { status: v as TaskCardStatus })}\n className=\"flex flex-row flex-wrap gap-3\"\n >\n {STATUSES.map((s) => (\n <div key={s} className=\"flex items-center gap-1.5\">\n <RadioGroupItem value={s} id={`plan-task-status-${idx}-${s}`} />\n <Label htmlFor={`plan-task-status-${idx}-${s}`} className=\"text-xs capitalize\">\n {s.replace('_', ' ')}\n </Label>\n </div>\n ))}\n </RadioGroup>\n </EditorField>\n </div>\n );\n })}\n <Button type=\"button\" size=\"sm\" onClick={addTask} className=\"self-start\">\n <Plus className=\"h-3.5 w-3.5\" /> Add task\n </Button>\n </div>\n </div>\n );\n}\n","import type { CustomEmoji } from '../types';\nimport { type EmojiIndex, getEmojiIndex, unifiedToUnicode } from './emoji-data';\nimport type { EmojiImportResolver } from './rich-text-tiptap';\n\n/**\n * Builds an {@link EmojiImportResolver} that resolves a Slack emoji element's\n * render-only attributes from the workspace custom emoji and the standard\n * `emoji-datasource` index:\n *\n * - A custom emoji with a `url` → `src` is the workspace image.\n * - A custom alias (no `url`) → resolve the glyph from the alias target.\n * - A standard emoji → `unicode` from the dataset (toned when `skin_tone` is\n * set), so the editor renders the glyph even before the payload carries one.\n *\n * Best-effort and synchronous: when the dataset isn't loaded yet it falls back\n * to whatever `unicode` the payload already specifies.\n *\n * @param customByName - workspace custom emoji keyed by codename\n * @param index - the emoji index (defaults to the cached one)\n * @returns an import resolver for `richTextToProseMirror`\n */\nexport function makeEmojiImportResolver(\n customByName: Map<string, CustomEmoji>,\n index: EmojiIndex | null = getEmojiIndex()\n): EmojiImportResolver {\n return (el) => {\n const name = el.name ?? '';\n const skinTone = el.skin_tone ?? null;\n const custom = customByName.get(name);\n if (custom?.url) {\n return { name, src: custom.url, unicode: null, skinTone };\n }\n const lookupName = custom?.alias ?? name;\n const datum = index?.byName.get(lookupName);\n let unicode = el.unicode ?? null;\n if (!unicode && datum) {\n const toned = skinTone ? datum.skinUnified[skinTone] : undefined;\n unicode = unifiedToUnicode(toned ?? datum.unified);\n }\n return { name, src: null, unicode, skinTone };\n };\n}\n","import type {\n AnyRichTextBlockElement,\n AnyRichTextSectionElement,\n RichTextBlock,\n RichTextSectionElementStyleWithCode,\n RichTextSectionLink\n} from 'slack-web-api-client';\nimport { sanitizeHref } from './url-safety';\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', 'emoji']);\n\nconst SUPPORTED_TEXT_STYLE_KEYS = new Set(['bold', 'italic', 'strike', 'underline', '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, emoji, plus\n * bold/italic/strike/underline/code marks and links). Anything else (mentions,\n * broadcasts, 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/** The Slack emoji element shape we read on import. */\ninterface SlackEmojiElement {\n type: 'emoji';\n name?: string;\n unicode?: string;\n skin_tone?: number;\n}\n\n/**\n * Resolves the render-only attributes (`src`, `unicode`) of a Slack emoji\n * element when importing into the WYSIWYG. Lets the editor inject a custom\n * emoji image (from `customEmojis`) and a glyph codepoint (from\n * `emoji-datasource`) without this module depending on either. Optional: when\n * omitted, emoji carry only what the payload already specifies.\n * @param el - the Slack emoji element\n * @returns the PM emoji node attrs\n */\nexport type EmojiImportResolver = (el: SlackEmojiElement) => {\n name: string;\n src: string | null;\n unicode: string | null;\n skinTone: number | null;\n};\n\nconst defaultEmojiResolver: EmojiImportResolver = (el) => ({\n name: el.name ?? '',\n src: null,\n unicode: el.unicode ?? null,\n skinTone: el.skin_tone ?? null\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 * @param resolveEmoji - optional resolver for emoji `src` / `unicode`\n * @returns a ProseMirror `doc` node\n */\nexport function richTextToProseMirror(\n block: RichTextBlock,\n resolveEmoji: EmojiImportResolver = defaultEmojiResolver\n): 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, resolveEmoji);\n continue;\n }\n listsByIndent.clear();\n const node = blockElementToPM(el, resolveEmoji);\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 resolveEmoji: EmojiImportResolver\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 ?? [], resolveEmoji) }]\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, resolveEmoji: EmojiImportResolver): PMNode | null {\n if (el.type === 'rich_text_section') {\n return {\n type: 'paragraph',\n content: inlinesToPM(el.elements ?? [], resolveEmoji)\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 ?? [], resolveEmoji)\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 * Pushes a Slack text run onto a ProseMirror inline array, converting any\n * embedded newlines into `hardBreak` nodes so they render as soft line\n * breaks in the editor (and round-trip back to `\\n` on export). A run of\n * N consecutive newlines becomes N hardBreaks, so blank lines (`\\n\\n`)\n * are preserved. Without this, a `\\n` inside a Slack text element would\n * become a literal newline character in a ProseMirror text node, which\n * the browser collapses to a space.\n * @param out - the inline array to append to\n * @param text - the Slack text run, possibly containing `\\n`\n * @param marks - marks to apply to each text segment\n */\nfunction pushTextWithHardBreaks(\n out: PMNode[],\n text: string,\n marks: { type: string; attrs?: Record<string, unknown> }[]\n) {\n const segments = text.split('\\n');\n segments.forEach((segment, i) => {\n if (i > 0) {\n out.push({ type: 'hardBreak' });\n }\n if (segment) {\n out.push({ type: 'text', text: segment, marks });\n }\n });\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 * @param resolveEmoji - resolver for emoji `src` / `unicode`\n * @returns the corresponding ProseMirror text nodes\n */\nfunction inlinesToPM(inlines: AnyRichTextSectionElement[], resolveEmoji: EmojiImportResolver): PMNode[] {\n const out: PMNode[] = [];\n for (const inline of inlines) {\n if (inline.type === 'text') {\n if (!inline.text) {\n continue;\n }\n pushTextWithHardBreaks(out, inline.text, styleToMarks(inline.style));\n } else if (inline.type === 'emoji') {\n const attrs = resolveEmoji(inline as SlackEmojiElement);\n if (!attrs.name) {\n continue;\n }\n out.push({ type: 'emoji', attrs });\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.underline) {\n marks.push({ type: 'underline' });\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 === 'emoji') {\n const name = String(node.attrs?.name ?? '');\n if (!name) {\n continue;\n }\n // Export keeps only Slack's fields: `name` (+ `skin_tone`). The\n // render-only `src` / `unicode` attrs are intentionally dropped.\n const emoji: AnyRichTextSectionElement = { type: 'emoji', name };\n const skinTone = node.attrs?.skinTone;\n if (typeof skinTone === 'number' && skinTone >= 2 && skinTone <= 6) {\n (emoji as { skin_tone?: number }).skin_tone = skinTone;\n }\n out.push(emoji);\n continue;\n }\n if (node.type === 'hardBreak') {\n // A soft line break (Shift+Enter) becomes a newline in the Slack\n // text stream. mergeAdjacentTextRuns folds this into neighbouring\n // unstyled runs, so \"a\" + <br> + \"b\" collapses to one \"a\\nb\" run.\n out.push({ type: 'text', text: '\\n' });\n continue;\n }\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 // TipTap's setLink/toggleLink already gate on isAllowedUri, but\n // a link mark can also enter the editor via setContent() (used\n // when seeding from a payload). Sanitize once more here so a\n // crafted Slack rich_text payload that already contains an unsafe\n // href cannot round-trip back out unchanged.\n const url = sanitizeHref(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 === 'underline') {\n style.underline = 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 { mergeAttributes, Node, type NodeViewProps, NodeViewWrapper, ReactNodeViewRenderer } from '@tiptap/react';\nimport { codepointsToGlyph } from './emoji-data';\n\n/**\n * Attributes carried by the inline {@link EmojiNode}. `src` (custom image) and\n * `unicode` (codepoints) are render-only; only `name` (+ `skinTone`) survive\n * export to Slack.\n */\nexport interface EmojiNodeAttrs {\n /** Slack codename, no colons (`wave`). */\n name: string;\n /** Workspace custom-emoji image URL, or null for a standard emoji. */\n src: string | null;\n /** Base Unicode codepoint(s), lowercased (`1f44b`), or null. */\n unicode: string | null;\n /** Slack `skin_tone` (2–6), or null. */\n skinTone: number | null;\n}\n\n/**\n * React NodeView for an emoji. Renders the workspace custom image when `src`\n * is present, otherwise the Unicode glyph (derived from `unicode`), falling\n * back to the `:name:` shortcode text when neither is available.\n * @param props - TipTap node-view props\n * @returns the rendered inline emoji\n */\nfunction EmojiNodeView({ node }: NodeViewProps) {\n const { name, src, unicode } = node.attrs as EmojiNodeAttrs;\n const label = `:${name}:`;\n return (\n <NodeViewWrapper as=\"span\" className=\"bk-emoji-node\" data-emoji={name} title={label}>\n {src ? (\n <img\n src={src}\n alt={label}\n style={{\n display: 'inline-block',\n width: '1.25em',\n height: '1.25em',\n verticalAlign: '-0.25em',\n objectFit: 'contain'\n }}\n />\n ) : (\n <span aria-label={label} role=\"img\">\n {unicode ? codepointsToGlyph(unicode) : label}\n </span>\n )}\n </NodeViewWrapper>\n );\n}\n\n/**\n * Inline, atomic TipTap node representing a Slack emoji. Backed by\n * {@link EmojiNodeView}. Serializes to a `<span data-emoji>` in HTML so\n * copy/paste keeps a recognizable marker, but the canonical round-trip is\n * through `rich-text-tiptap.ts`'s ProseMirror ⇄ Slack converter.\n */\nexport const EmojiNode = Node.create({\n name: 'emoji',\n group: 'inline',\n inline: true,\n atom: true,\n selectable: true,\n\n addAttributes() {\n return {\n name: { default: '' },\n src: { default: null },\n unicode: { default: null },\n skinTone: { default: null }\n };\n },\n\n parseHTML() {\n return [{ tag: 'span[data-emoji]' }];\n },\n\n renderHTML({ HTMLAttributes }: { HTMLAttributes: Record<string, unknown> }) {\n const name = (HTMLAttributes.name as string | undefined) ?? '';\n return ['span', mergeAttributes({ 'data-emoji': name }, HTMLAttributes), `:${name}:`];\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(EmojiNodeView);\n }\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 { isSafeHref } from '../../lib/url-safety';\nimport { EmojiPickerButton } from '../emoji/emoji-picker-button';\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', 'underline', '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 const urlValue = link.url ?? '';\n const urlIsUnsafe = urlValue.length > 0 && !isSafeHref(urlValue);\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={urlValue}\n placeholder=\"e.g. https://slack.com\"\n onChange={(e) => onChange({ ...link, url: e.target.value })}\n aria-invalid={urlIsUnsafe || undefined}\n />\n {urlIsUnsafe && (\n <p className=\"mt-1 text-[11px] text-destructive\">\n Only http(s), mailto, tel, sms, and xmpp links are allowed. This URL will be stripped before send and\n preview.\n </p>\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; skin_tone?: number };\n return (\n <EditorField\n label=\"Name\"\n help=\"Pick from the emoji list, or type a shortcode (without colons).\"\n htmlFor={`${idPrefix}-emoji`}\n >\n <div className=\"flex items-center gap-1.5\">\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 <EmojiPickerButton\n align=\"end\"\n label=\"Pick emoji\"\n className=\"shrink-0 border\"\n // Clear any stale `unicode` from the prior emoji so it can't\n // mismatch the newly-picked name; Slack recomputes the glyph from\n // `name` (+ `skin_tone`).\n onSelect={(sel) =>\n onChange({ ...emoji, name: sel.name, skin_tone: sel.skinTone ?? undefined, unicode: undefined })\n }\n />\n </div>\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 Underline,\n Undo2\n} from 'lucide-react';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type { RichTextBlock } from 'slack-web-api-client';\nimport { cn } from '../../lib/cn';\nimport { type EmojiIndex, loadEmojiIndex } from '../../lib/emoji-data';\nimport { makeEmojiImportResolver } from '../../lib/emoji-resolve';\nimport {\n detectLossy,\n type EmojiImportResolver,\n type LossyReason,\n proseMirrorToRichText,\n richTextToProseMirror\n} from '../../lib/rich-text-tiptap';\nimport { EmojiNode } from '../../lib/tiptap-emoji-node';\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 { hasExplicitSafeScheme, isSafeHref } from '../../lib/url-safety';\nimport { useCustomEmojis } from '../../state/custom-emoji-context';\nimport { EmojiPickerButton } from '../emoji/emoji-picker-button';\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 * Markdown input rules to keep enabled, keyed by extension name. Passing an\n * allowlist to TipTap's `enableInputRules` disables every other rule. We\n * keep the inline mark shortcuts (`**bold**`, `*italic*`, `~~strike~~`,\n * `` `code` ``) but drop the block-level conversions (ordered/bullet list,\n * blockquote, code block) so that typing literal line-start text like `2. `\n * or `- ` in a Slack message is never swallowed into a list/quote/code\n * block. All formatting stays available via the toolbar. TipTap's inline\n * Markdown syntax also differs from Slack's (`*` is italic here, bold in\n * Slack), so these shortcuts are a convenience, not a fidelity feature.\n */\nexport const RICH_TEXT_INPUT_RULE_ALLOWLIST = ['bold', 'italic', 'strike', 'code'];\n\n/**\n * Builds the TipTap extension set for the rich-text WYSIWYG editor. Kept as\n * a standalone factory (returning fresh instances per call) so the exact\n * production configuration can be exercised in tests.\n * @returns the configured TipTap extensions\n */\nexport function buildRichTextExtensions() {\n return [\n StarterKit.configure({\n heading: false,\n horizontalRule: false,\n // StarterKit bundles its own Link extension (enabled by default),\n // which would register a second, unconfigured `link` mark and a\n // duplicate autolinker alongside the hardened one we add below.\n // Disable it so our single, security-configured Link is the only\n // link extension in the schema.\n link: false\n }),\n EmojiNode,\n Link.configure({\n openOnClick: false,\n autolink: true,\n defaultProtocol: 'https',\n // Pin TipTap's link allowlist to the same set as our shared\n // `isSafeHref` helper. The upstream default also includes\n // ftp/cid/callto which we don't expect inside Slack content.\n protocols: ['http', 'https', 'mailto', 'tel', 'sms', 'xmpp'],\n // Belt-and-suspenders: even if a downstream contributor widens\n // `protocols` later, our isSafeHref guard rejects everything\n // outside the safe-link set. setLink and toggleLink both gate\n // on this hook before applying the mark.\n isAllowedUri: (url) => isSafeHref(url),\n // Only auto-link tokens that carry an explicit, safe scheme. TipTap's\n // default would link any `host.tld` (e.g. `2.xyz`, `report.zip`,\n // `logo.png`) because the suffix is a real gTLD, which is wrong for\n // free-form Slack message text. Deliberate links can still be added\n // via the link button.\n shouldAutoLink: hasExplicitSafeScheme,\n HTMLAttributes: { rel: 'noreferrer noopener', target: '_blank' }\n })\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 { byName: customByName } = useCustomEmojis();\n // Load the emoji dataset so import resolution can fill in glyph codepoints\n // for standard emoji. Held in state so the resolver rebuilds once loaded.\n const [emojiIndex, setEmojiIndex] = useState<EmojiIndex | null>(null);\n useEffect(() => {\n let active = true;\n loadEmojiIndex()\n .then((idx) => active && setEmojiIndex(idx))\n .catch(() => {});\n return () => {\n active = false;\n };\n }, []);\n const resolveEmoji = useMemo<EmojiImportResolver>(\n () => makeEmojiImportResolver(customByName, emojiIndex),\n [customByName, emojiIndex]\n );\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: buildRichTextExtensions(),\n enableInputRules: RICH_TEXT_INPUT_RULE_ALLOWLIST,\n content: richTextToProseMirror(block, resolveEmoji) as never,\n editorProps: {\n attributes: {\n class:\n 'bk-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, resolveEmoji) as never, {\n emitUpdate: false\n });\n }, [block, editor, resolveEmoji]);\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=\"Underline\"\n active={editor.isActive('underline')}\n onClick={() => editor.chain().focus().toggleUnderline().run()}\n Icon={Underline}\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 <EmojiPickerButton\n align=\"start\"\n onSelect={(sel) =>\n editor\n .chain()\n .focus()\n .insertContent({\n type: 'emoji',\n attrs: { name: sel.name, src: sel.src, unicode: sel.unicode, skinTone: sel.skinTone }\n })\n .run()\n }\n />\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 const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n if (open) {\n setUrl(currentHref);\n setError(null);\n }\n }, [open, currentHref]);\n\n const apply = () => {\n const trimmed = url.trim();\n if (!trimmed) {\n editor.chain().focus().unsetLink().run();\n setOpen(false);\n return;\n }\n if (!isSafeHref(trimmed)) {\n setError('Only http(s), mailto, tel, sms, and xmpp links are allowed.');\n return;\n }\n editor.chain().focus().extendMarkRange('link').setLink({ href: trimmed }).run();\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) => {\n setUrl(e.target.value);\n if (error) {\n setError(null);\n }\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n apply();\n }\n }}\n />\n {error && <p className=\"text-[11px] text-destructive\">{error}</p>}\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 { useRef } from 'react';\nimport 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 { EmojiTextInsertButton } from '../emoji/emoji-text-insert-button';\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 const textRef = useRef<HTMLTextAreaElement>(null);\n const setText = (next: string) => onChange({ ...block, text: { type: 'mrkdwn', text: next } });\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 <div className=\"flex items-start gap-1.5\">\n <Textarea\n ref={textRef}\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) => setText(e.target.value)}\n />\n <EmojiTextInsertButton targetRef={textRef} value={text} onChange={setText} className=\"mt-1 shrink-0 border\" />\n </div>\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 const labelRef = useRef<HTMLInputElement>(null);\n const setLabel = (next: string) => onChange({ ...button, text: { type: 'plain_text', text: next, emoji: true } });\n\n return (\n <div className=\"flex flex-col gap-3\">\n <EditorField label=\"Label\" htmlFor=\"section-acc-btn-label\">\n <div className=\"flex items-center gap-1.5\">\n <Input\n ref={labelRef}\n id=\"section-acc-btn-label\"\n value={label}\n placeholder=\"e.g. Learn more\"\n onChange={(e) => setLabel(e.target.value)}\n />\n <EmojiTextInsertButton targetRef={labelRef} value={label} onChange={setLabel} className=\"shrink-0 border\" />\n </div>\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 { Plus, Trash2 } from 'lucide-react';\nimport type { RichTextBlock } 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 type { TaskCardBlock, TaskCardStatus, UrlSourceElement } from '../../types';\nimport { EditorField } from './field';\nimport { RichTextEditor } from './rich-text-editor';\nimport type { BlockEditorProps } from './types';\n\nconst STATUSES: readonly TaskCardStatus[] = ['pending', 'in_progress', 'complete', 'error'] as const;\n\nconst EMPTY_RICH_TEXT: RichTextBlock = {\n type: 'rich_text',\n elements: [{ type: 'rich_text_section', elements: [{ type: 'text', text: '' }] }]\n};\n\n/**\n * Editor form for task_card blocks. Edits the task id, title, status,\n * the cited sources list, and the optional rich-text `details` and\n * `output` fields. Details and output are togglable — adding one swaps\n * in an empty rich_text block; removing one drops the field from the\n * payload.\n * @param props - editor props\n * @param props.block - the task_card block to edit\n * @param props.onChange - called with the updated block payload\n * @returns the rendered task_card editor form\n */\nexport function TaskCardEditor({ block, onChange }: BlockEditorProps<TaskCardBlock>) {\n const status: TaskCardStatus = block.status ?? 'pending';\n return (\n <div className=\"flex flex-col gap-4\">\n <EditorField label=\"Title\" help=\"Title of the task in plain text.\" htmlFor=\"task-card-title\">\n <Input\n id=\"task-card-title\"\n value={block.title}\n placeholder=\"e.g. Reproduce the bug locally\"\n onChange={(e) => onChange({ ...block, title: e.target.value })}\n />\n </EditorField>\n\n <EditorField label=\"Task ID\" help=\"ID for the task.\" htmlFor=\"task-card-id\">\n <Input\n id=\"task-card-id\"\n value={block.task_id}\n placeholder=\"e.g. task_1\"\n onChange={(e) => onChange({ ...block, task_id: e.target.value })}\n />\n </EditorField>\n\n <EditorField label=\"Status\" help='The state of a task. Can be \"pending\", \"in_progress\", \"complete\", or \"error\".'>\n <RadioGroup\n value={status}\n onValueChange={(v) => onChange({ ...block, status: v as TaskCardStatus })}\n className=\"flex flex-row flex-wrap gap-3\"\n >\n {STATUSES.map((s) => (\n <div key={s} className=\"flex items-center gap-1.5\">\n <RadioGroupItem value={s} id={`task-card-status-${s}`} />\n <Label htmlFor={`task-card-status-${s}`} className=\"text-xs capitalize\">\n {s.replace('_', ' ')}\n </Label>\n </div>\n ))}\n </RadioGroup>\n </EditorField>\n\n <RichTextField\n label=\"Details\"\n help=\"Details of the task in the form of a single rich_text entity.\"\n value={block.details}\n onChange={(next) => onChange({ ...block, details: next })}\n />\n\n <RichTextField\n label=\"Output\"\n help=\"Output of the task in the form of a single rich_text entity.\"\n value={block.output}\n onChange={(next) => onChange({ ...block, output: next })}\n />\n\n <SourcesField\n sources={block.sources ?? []}\n onChange={(next) => onChange({ ...block, sources: next.length > 0 ? next : undefined })}\n />\n </div>\n );\n}\n\n/**\n * Sub-editor for an optional rich-text field on the task card (`details`\n * or `output`). When the field is unset, renders an \"Add\" button that\n * swaps in an empty rich_text block; once set, renders the standard\n * {@link RichTextEditor} plus a remove affordance.\n * @param props - field props\n * @param props.label - visible label for the field\n * @param props.help - one-line helper text\n * @param props.value - the current rich_text payload, if any\n * @param props.onChange - called with the new payload or `undefined`\n * @returns the rendered field\n */\nfunction RichTextField({\n label,\n help,\n value,\n onChange\n}: {\n label: string;\n help?: string;\n value: RichTextBlock | undefined;\n onChange: (next: RichTextBlock | undefined) => void;\n}) {\n if (!value) {\n return (\n <div className=\"flex flex-col gap-1.5\">\n <Label>{label}</Label>\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n className=\"self-start\"\n onClick={() => onChange(EMPTY_RICH_TEXT)}\n >\n <Plus className=\"h-3.5 w-3.5\" /> Add {label.toLowerCase()}\n </Button>\n {help && <p className=\"text-[11px] leading-snug text-muted-foreground\">{help}</p>}\n </div>\n );\n }\n return (\n <div className=\"flex flex-col gap-1.5\">\n <div className=\"flex items-center justify-between\">\n <Label>{label}</Label>\n <button\n type=\"button\"\n aria-label={`Remove ${label.toLowerCase()}`}\n onClick={() => onChange(undefined)}\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 <RichTextEditor block={value} onChange={onChange} />\n {help && <p className=\"text-[11px] leading-snug text-muted-foreground\">{help}</p>}\n </div>\n );\n}\n\n/**\n * Sub-editor for the task card's `sources` list. Each source is a\n * `{ text, url }` pair Slack renders as a labeled link beneath the card.\n * @param props - field props\n * @param props.sources - the current sources list\n * @param props.onChange - called with the updated sources list\n * @returns the rendered sources editor\n */\nfunction SourcesField({\n sources,\n onChange\n}: {\n sources: UrlSourceElement[];\n onChange: (next: UrlSourceElement[]) => void;\n}) {\n const update = (idx: number, change: Partial<UrlSourceElement>) => {\n onChange(sources.map((s, i) => (i === idx ? { ...s, ...change } : s)));\n };\n const removeAt = (idx: number) => onChange(sources.filter((_, i) => i !== idx));\n const addSource = () => {\n onChange([...sources, { type: 'url', url: '', text: '' }]);\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\">Sources</span>\n <p className=\"text-[11px] leading-snug text-muted-foreground\">\n Array of URL source elements used to generate a response.\n </p>\n {sources.map((src, 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\">Source {idx + 1}</span>\n <button\n type=\"button\"\n aria-label=\"Remove source\"\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={`task-card-source-text-${idx}`}>\n <Input\n id={`task-card-source-text-${idx}`}\n value={src.text}\n placeholder=\"e.g. Runbook\"\n onChange={(e) => update(idx, { text: e.target.value })}\n />\n </EditorField>\n <EditorField label=\"URL\" htmlFor={`task-card-source-url-${idx}`}>\n <Input\n id={`task-card-source-url-${idx}`}\n type=\"url\"\n value={src.url}\n placeholder=\"e.g. https://example.com/runbook\"\n onChange={(e) => update(idx, { url: e.target.value })}\n />\n </EditorField>\n </div>\n ))}\n <Button type=\"button\" size=\"sm\" onClick={addSource} className=\"self-start\">\n <Plus className=\"h-3.5 w-3.5\" /> Add source\n </Button>\n </div>\n );\n}\n","import { Input } from '../../lib/ui/input';\nimport { Textarea } from '../../lib/ui/textarea';\nimport type { VideoBlock } from '../../types';\nimport { EditorField } from './field';\nimport type { BlockEditorProps } from './types';\n\n/**\n * Editor form for video blocks. Edits the title, alt text, thumbnail/video\n * URLs, and optional provider/author/description metadata. Sending a video\n * block from Slack requires the `links.embed:write` OAuth scope and a\n * `video_url` inside the app's configured unfurl domains — the builder\n * does not enforce that here; it just edits the payload.\n * @param props - editor props\n * @param props.block - the video block to edit\n * @param props.onChange - called with the updated block payload\n * @returns the rendered video editor form\n */\nexport function VideoEditor({ block, onChange }: BlockEditorProps<VideoBlock>) {\n return (\n <div className=\"flex flex-col gap-4\">\n <EditorField label=\"Title\" help=\"Up to 199 characters. Shown above the embedded player.\" htmlFor=\"video-title\">\n <Input\n id=\"video-title\"\n value={block.title?.text ?? ''}\n maxLength={199}\n placeholder=\"e.g. Product demo\"\n onChange={(e) =>\n onChange({\n ...block,\n title: { type: 'plain_text', text: e.target.value, emoji: true }\n })\n }\n />\n </EditorField>\n\n <EditorField label=\"Alt text\" help=\"Tooltip for the video. Required for accessibility.\" htmlFor=\"video-alt\">\n <Input\n id=\"video-alt\"\n value={block.alt_text ?? ''}\n placeholder=\"e.g. A short walkthrough of the new release\"\n onChange={(e) => onChange({ ...block, alt_text: e.target.value })}\n />\n </EditorField>\n\n <EditorField\n label=\"Video URL\"\n help=\"HTTPS embed URL. Must match an unfurl domain on your Slack app.\"\n htmlFor=\"video-url\"\n >\n <Input\n id=\"video-url\"\n type=\"url\"\n value={block.video_url ?? ''}\n placeholder=\"e.g. https://www.youtube.com/embed/dQw4w9WgXcQ\"\n onChange={(e) => onChange({ ...block, video_url: e.target.value })}\n />\n </EditorField>\n\n <EditorField label=\"Thumbnail URL\" help=\"Preview image shown before the video loads.\" htmlFor=\"video-thumbnail\">\n <Input\n id=\"video-thumbnail\"\n type=\"url\"\n value={block.thumbnail_url ?? ''}\n placeholder=\"e.g. https://example.com/thumb.png\"\n onChange={(e) => onChange({ ...block, thumbnail_url: e.target.value })}\n />\n </EditorField>\n\n <EditorField\n label=\"Title link URL\"\n help=\"Optional. HTTPS link the title text opens (the non-embed page).\"\n htmlFor=\"video-title-url\"\n >\n <Input\n id=\"video-title-url\"\n type=\"url\"\n value={block.title_url ?? ''}\n placeholder=\"e.g. https://www.youtube.com/watch?v=dQw4w9WgXcQ\"\n onChange={(e) => onChange({ ...block, title_url: e.target.value || undefined })}\n />\n </EditorField>\n\n <EditorField label=\"Description\" help=\"Optional. Up to 199 characters.\" htmlFor=\"video-description\">\n <Textarea\n id=\"video-description\"\n value={block.description?.text ?? ''}\n maxLength={199}\n rows={2}\n placeholder=\"e.g. A short walkthrough of the new release.\"\n onChange={(e) =>\n onChange({\n ...block,\n description: e.target.value ? { type: 'plain_text', text: e.target.value, emoji: true } : undefined\n })\n }\n />\n </EditorField>\n\n <EditorField label=\"Author name\" help=\"Optional. Up to 49 characters.\" htmlFor=\"video-author\">\n <Input\n id=\"video-author\"\n value={block.author_name ?? ''}\n maxLength={49}\n placeholder=\"e.g. Acme\"\n onChange={(e) => onChange({ ...block, author_name: e.target.value || undefined })}\n />\n </EditorField>\n\n <EditorField\n label=\"Provider name\"\n help=\"Optional. Originating service (e.g. YouTube, Vimeo).\"\n htmlFor=\"video-provider-name\"\n >\n <Input\n id=\"video-provider-name\"\n value={block.provider_name ?? ''}\n placeholder=\"e.g. YouTube\"\n onChange={(e) => onChange({ ...block, provider_name: e.target.value || undefined })}\n />\n </EditorField>\n\n <EditorField\n label=\"Provider icon URL\"\n help=\"Optional. Small icon shown next to the provider name.\"\n htmlFor=\"video-provider-icon\"\n >\n <Input\n id=\"video-provider-icon\"\n type=\"url\"\n value={block.provider_icon_url ?? ''}\n placeholder=\"e.g. https://example.com/youtube-favicon.png\"\n onChange={(e) => onChange({ ...block, provider_icon_url: e.target.value || undefined })}\n />\n </EditorField>\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 ContainerBlock,\n ContextActionsBlock,\n DataVisualizationBlock,\n InputBlock,\n MarkdownBlock,\n PlanBlock,\n SupportedBlock,\n SupportedBlockType,\n TableBlock,\n TaskCardBlock,\n VideoBlock\n} from '../../types';\nimport { ActionsEditor } from './actions-editor';\nimport { AlertEditor } from './alert-editor';\nimport { CardEditor } from './card-editor';\nimport { CarouselEditor } from './carousel-editor';\nimport { ContainerEditor } from './container-editor';\nimport { ContextActionsEditor } from './context-actions-editor';\nimport { ContextEditor } from './context-editor';\nimport { DataVisualizationEditor } from './data-visualization-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 { PlanEditor } from './plan-editor';\nimport { RichTextEditor } from './rich-text-editor';\nimport { SectionEditor } from './section-editor';\nimport { TableEditor } from './table-editor';\nimport { TaskCardEditor } from './task-card-editor';\nimport { VideoEditor } from './video-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 case 'video':\n return <VideoEditor block={block as VideoBlock} onChange={(next) => onChange(next)} />;\n case 'plan':\n return <PlanEditor block={block as PlanBlock} onChange={(next) => onChange(next)} />;\n case 'task_card':\n return <TaskCardEditor block={block as TaskCardBlock} onChange={(next) => onChange(next)} />;\n case 'data_visualization':\n return <DataVisualizationEditor block={block as DataVisualizationBlock} onChange={(next) => onChange(next)} />;\n case 'container':\n return <ContainerEditor block={block as ContainerBlock} onChange={(next) => onChange(next)} />;\n default:\n return null;\n }\n}\n","import 'slack-blocks-to-jsx/dist/style.css';\n\nimport { useEffect, useMemo, useRef } from 'react';\nimport type { Block } from 'slack-blocks-to-jsx';\nimport { Message } from 'slack-blocks-to-jsx';\nimport { sanitizeBlock } from '../../lib/sanitize-blocks';\nimport { isSafeHref, isSafeImageSrc } from '../../lib/url-safety';\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 const rootRef = useRef<HTMLDivElement>(null);\n\n // Strip dangerous URI schemes (`javascript:`, `data:text/html`, etc.)\n // from every `url`/`image_url` field in the block before handing it\n // to slack-blocks-to-jsx, which renders rich-text links, button URLs,\n // and image sources directly into `<a href>` / `<img src>` without\n // its own scheme filter. Memoized so an unchanged block keeps the\n // same reference and doesn't churn the renderer.\n const safeBlock = useMemo(() => sanitizeBlock(block), [block]);\n\n // slack-blocks-to-jsx renders an SVG-only collapse toggle in image and\n // video blocks without an aria-label, which violates axe's `button-name`\n // rule and is unreachable to screen readers. Post-mount we add a label\n // to any such buttons we find under our wrapper. We also do a final\n // pass to neutralize any `<a href>` or `<img src>` that carries a\n // disallowed URI scheme — the block-payload sanitizer catches URLs\n // that live in structured fields (`url`, `image_url`), but mrkdwn /\n // rich-text content can encode link URLs inside text strings\n // (`[label](javascript:...)` or `<javascript:...|label>`) that\n // `slack-blocks-to-jsx`'s own parser hands straight to `<a href>`\n // without filtering. React 19 also blocks `javascript:` URLs at\n // setAttribute time, but we don't rely on that — this loop applies\n // our allowlist (which is tighter and covers `data:`/`vbscript:`/`file:`\n // as well) and replaces unsafe values with `#`.\n useEffect(() => {\n const root = rootRef.current;\n if (!root) return;\n for (const wrapper of root.querySelectorAll<HTMLElement>(\n '.slack_blocks_to_jsx__image_media_trigger, .slack_blocks_to_jsx__video_title'\n )) {\n for (const btn of wrapper.querySelectorAll<HTMLButtonElement>('button:not([aria-label])')) {\n const title = wrapper.querySelector('.slack_blocks_to_jsx__image_title')?.textContent?.trim();\n btn.setAttribute('aria-label', title ? `Toggle ${title}` : 'Toggle media');\n }\n }\n for (const a of root.querySelectorAll<HTMLAnchorElement>('a[href]')) {\n const href = a.getAttribute('href');\n if (!isSafeHref(href)) {\n a.setAttribute('href', '#');\n a.setAttribute('data-bk-blocked-href', '1');\n }\n }\n for (const img of root.querySelectorAll<HTMLImageElement>('img[src]')) {\n const src = img.getAttribute('src');\n if (!isSafeImageSrc(src)) {\n img.removeAttribute('src');\n img.setAttribute('data-bk-blocked-src', '1');\n }\n }\n });\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 ref={rootRef} 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={[safeBlock 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, ArrowDown, ArrowUp, Copy, 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 video: 'Video',\n plan: 'Plan',\n task_card: 'Task Card',\n data_visualization: 'Data Visualization',\n container: 'Container'\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. The row itself is the drag handle\n * (Slack Block Builder pattern) — clicks under the 4px activation\n * distance still open the editor. Hover surfaces a faint outline plus a\n * floating toolbar (edit, 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 index,\n total,\n onReorder,\n isPaletteDrag = false\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 /** Zero-based index of this row in the surface; powers move up/down. */\n index?: number;\n /** Total number of rows on the surface; powers move up/down. */\n total?: number;\n /** Move this row to a new index. Wires up the keyboard-accessible move buttons. */\n onReorder?: (id: string, toIndex: number) => void;\n /** True while a palette item is being dragged (vs. reordering an existing block). */\n isPaletteDrag?: boolean;\n}) {\n const { attributes, listeners, setNodeRef, transform, transition, isDragging, isOver } = useSortable({\n id: builderBlock.id\n });\n // The Popover trigger needs an explicit `role`/`tabIndex` on the div so\n // biome's a11y check accepts `aria-label`; dnd-kit's `attributes` also\n // sets those, so pull them off the spread to avoid TS's\n // duplicate-prop warning. The values match (button / 0), so behavior\n // is unchanged.\n const { role: _dndRole, tabIndex: _dndTabIndex, ...sortableA11yAttrs } = attributes;\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 // Show the insertion bar only for palette drags; sortable reorders\n // already get strong feedback from verticalListSortingStrategy.\n const showDropIndicator = isPaletteDrag && isOver;\n\n const preview = <SlackBlockPreview block={builderBlock.block} hooks={previewHooks} theme={previewTheme} />;\n\n return (\n <div\n ref={setNodeRef}\n style={style}\n className={cn('group relative mb-2 last:mb-0 hover:z-10 md:mb-0', isDragging && 'opacity-40')}\n >\n {showDropIndicator ? (\n <div\n aria-hidden=\"true\"\n className=\"-top-1 pointer-events-none absolute right-0 left-0 z-20 h-0.5 rounded-full bg-primary\"\n >\n <span className=\"-left-1 -top-[3px] absolute h-2 w-2 rounded-full bg-primary shadow-[0_0_0_2px_var(--color-background)]\" />\n </div>\n ) : null}\n <div className=\"relative w-full\">\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 {...attributes}\n {...listeners}\n className={cn(\n 'block w-full cursor-grab rounded-sm border-0 bg-transparent p-0 text-left transition-shadow hover:shadow-md focus-visible:ring-1 focus-visible:ring-ring active:cursor-grabbing',\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 {...sortableA11yAttrs}\n {...listeners}\n onKeyDown={(e) => {\n // The div trigger is keyboard-activatable via role=\"button\" + tabIndex=0,\n // but Space on a non-button element scrolls the page by default. Toggle the\n // popover ourselves on Enter/Space and swallow the event so the page stays put.\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onOpenChange?.(!isOpen);\n }\n }}\n className={cn(\n 'block w-full cursor-grab rounded-sm transition-shadow hover:shadow-md focus-visible:ring-1 focus-visible:ring-ring active:cursor-grabbing',\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-[min(32rem,calc(100vw-1.5rem))] sm: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 hidden bg-background px-1.5 text-[11px] text-muted-foreground opacity-0 transition-opacity group-hover:opacity-100 md:block\">\n {BLOCK_TYPE_LABELS[builderBlock.block.type]}\n </span>\n {/* Desktop action toolbar. Hover-reveal floating above the block —\n crowded but only one is visible at a time so the overlap is\n invisible. Hidden on mobile in favor of the inline row below. */}\n <div\n className={cn(\n // Hidden on mobile in favor of the inline row below; on desktop\n // reveal on hover, on focus inside the row (so Tab-stops on the\n // floating buttons themselves keep them visible), and when there\n // are validation errors worth surfacing immediately.\n 'absolute -top-3 right-2 z-10 hidden items-center gap-0.5 rounded-md border bg-background p-0.5 shadow-sm transition-opacity md:flex',\n hasErrors ? 'opacity-100' : 'opacity-0 group-hover:opacity-100 group-focus-within: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 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\"\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 {onReorder && typeof index === 'number' && typeof total === 'number' ? (\n <>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n aria-label=\"Move block up\"\n disabled={index === 0}\n onClick={() => onReorder(builderBlock.id, index - 1)}\n className=\"flex h-6 w-6 items-center justify-center rounded text-muted-foreground hover:bg-accent hover:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-40 disabled:hover:bg-transparent disabled:hover:text-muted-foreground\"\n >\n <ArrowUp className=\"h-3.5 w-3.5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"top\">Move up</TooltipContent>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n aria-label=\"Move block down\"\n disabled={index >= total - 1}\n onClick={() => onReorder(builderBlock.id, index + 1)}\n className=\"flex h-6 w-6 items-center justify-center rounded text-muted-foreground hover:bg-accent hover:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-40 disabled:hover:bg-transparent disabled:hover:text-muted-foreground\"\n >\n <ArrowDown className=\"h-3.5 w-3.5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"top\">Move down</TooltipContent>\n </Tooltip>\n </>\n ) : null}\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 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\"\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 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\"\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 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\"\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 {/* Mobile-only inline action bar. Lives in the flow under the block\n preview so it never overlaps content (the floating desktop bar\n gets in its own way when every row shows it). Type label sits on\n the left, action triplet on the right. */}\n <div className=\"mt-1 flex items-center justify-between gap-2 rounded-md border border-dashed bg-muted/40 px-2 py-1 md:hidden\">\n <span className=\"truncate text-[11px] font-medium text-muted-foreground\">\n {BLOCK_TYPE_LABELS[builderBlock.block.type]}\n </span>\n <div className=\"flex items-center gap-1\">\n {hasErrors ? (\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-9 w-9 items-center justify-center rounded text-destructive hover:bg-destructive/10\"\n >\n <AlertTriangle className=\"h-4 w-4\" />\n </button>\n ) : null}\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-9 w-9 items-center justify-center rounded text-muted-foreground hover:bg-accent hover:text-foreground\"\n >\n <Pencil className=\"h-4 w-4\" />\n </button>\n <button\n type=\"button\"\n aria-label=\"Duplicate block\"\n onClick={() => onDuplicate(builderBlock.id)}\n className=\"flex h-9 w-9 items-center justify-center rounded text-muted-foreground hover:bg-accent hover:text-foreground\"\n >\n <Copy className=\"h-4 w-4\" />\n </button>\n <button\n type=\"button\"\n aria-label=\"Delete block\"\n onClick={() => onDelete(builderBlock.id)}\n className=\"flex h-9 w-9 items-center justify-center rounded text-muted-foreground hover:bg-destructive/10 hover:text-destructive\"\n >\n <Trash2 className=\"h-4 w-4\" />\n </button>\n </div>\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, useSortable, verticalListSortingStrategy } from '@dnd-kit/sortable';\nimport { CSS } from '@dnd-kit/utilities';\nimport { AlertTriangle, ArrowDown, ArrowUp, Copy, Pencil, Trash2 } from 'lucide-react';\nimport { cn } from '../lib/cn';\nimport { containerBodyId } from '../lib/container-blocks';\nimport { Popover, PopoverContent, PopoverTrigger } from '../lib/ui/popover';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '../lib/ui/tooltip';\nimport type { BuilderBlock, ContainerBlock, PreviewHooks, PreviewTheme, SupportedBlock } from '../types';\nimport { BlockRow } from './block-row';\nimport { BlockEditor } from './editors/block-editor';\n\n/**\n * A top-level row for a `container` block. Unlike a leaf {@link BlockRow},\n * the container renders its own Slack-style chrome (icon / title / subtitle)\n * plus a nested, droppable list of its child blocks — so users can drag\n * blocks from the palette or the canvas straight into the container, and\n * reorder or pull them back out. The header is the drag handle and opens the\n * container's field editor; the body is a separate drop zone.\n * @param props - row props\n * @returns the rendered container row\n */\nexport function ContainerRow({\n builderBlock,\n previewHooks,\n previewTheme,\n errorsByBlockId,\n openBlockId,\n onOpenBlockChange,\n onUpdate,\n onDuplicate,\n onDelete,\n onReorder,\n index,\n total,\n isPaletteDrag = false\n}: {\n builderBlock: BuilderBlock;\n previewHooks?: PreviewHooks;\n previewTheme?: PreviewTheme;\n errorsByBlockId?: Map<string, string[]>;\n openBlockId?: string | null;\n onOpenBlockChange?: (id: string | null) => void;\n onUpdate: (id: string, block: SupportedBlock) => void;\n onDuplicate: (id: string) => void;\n onDelete: (id: string) => void;\n onReorder?: (id: string, toIndex: number) => void;\n index?: number;\n total?: number;\n isPaletteDrag?: boolean;\n}) {\n const { id } = builderBlock;\n const block = builderBlock.block as ContainerBlock;\n const children = builderBlock.children ?? [];\n const errors = errorsByBlockId?.get(id);\n const hasErrors = !!errors && errors.length > 0;\n const isOpen = openBlockId === id;\n\n const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({ id });\n const { role: _dndRole, tabIndex: _dndTabIndex, ...sortableA11yAttrs } = attributes;\n const { setNodeRef: setBodyRef, isOver: isBodyOver } = useDroppable({ id: containerBodyId(id) });\n\n const style = { transform: CSS.Transform.toString(transform), transition };\n const icon = block.icon && 'image_url' in block.icon ? block.icon.image_url : undefined;\n\n return (\n <div\n ref={setNodeRef}\n style={style}\n className={cn('group/container relative mb-2 last:mb-0 hover:z-10', isDragging && 'opacity-40')}\n >\n <div\n className={cn(\n 'overflow-hidden rounded-md border bg-card transition-shadow',\n hasErrors ? 'border-destructive/60' : 'border-border'\n )}\n >\n {/* Header — drag handle + click-to-edit the container's fields. */}\n <Popover open={isOpen} onOpenChange={(open) => onOpenBlockChange?.(open ? id : null)}>\n <PopoverTrigger asChild>\n <div\n role=\"button\"\n tabIndex={0}\n aria-label=\"Edit container\"\n {...sortableA11yAttrs}\n {...listeners}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onOpenBlockChange?.(!isOpen ? id : null);\n }\n }}\n className=\"flex w-full cursor-grab items-center gap-2 border-b bg-muted/40 px-3 py-2 text-left transition-colors hover:bg-muted active:cursor-grabbing\"\n >\n {icon ? (\n <img src={icon} alt=\"\" aria-hidden=\"true\" className=\"h-5 w-5 shrink-0 rounded object-cover\" />\n ) : null}\n <span className=\"flex min-w-0 flex-col\">\n <span className=\"truncate text-xs font-semibold text-foreground\">\n {block.title?.text || 'Container'}\n </span>\n {block.subtitle?.text ? (\n <span className=\"truncate text-[11px] text-muted-foreground\">{block.subtitle.text}</span>\n ) : null}\n </span>\n <span className=\"ml-auto shrink-0 text-[10px] font-medium uppercase tracking-wide text-muted-foreground\">\n Container\n </span>\n </div>\n </PopoverTrigger>\n <PopoverContent className=\"w-[min(32rem,calc(100vw-1.5rem))] sm:w-[32rem]\" align=\"start\">\n <BlockEditor block={block} errors={errors} onChange={(next) => onUpdate(id, next)} />\n </PopoverContent>\n </Popover>\n\n {/* Body — the child drop zone. */}\n <div\n ref={setBodyRef}\n className={cn(\n 'flex flex-col gap-2 p-3 transition-colors',\n isPaletteDrag && 'outline-2 -outline-offset-2 outline-dashed outline-primary/40',\n isPaletteDrag && isBodyOver && 'bg-primary/5'\n )}\n >\n {children.length === 0 ? (\n <div\n className={cn(\n 'flex items-center justify-center rounded-md border border-dashed px-3 py-6 text-center text-[11px] transition-colors',\n isBodyOver ? 'border-primary/60 text-primary' : 'border-border text-muted-foreground'\n )}\n >\n Drag blocks here\n </div>\n ) : (\n <SortableContext items={children.map((c) => c.id)} strategy={verticalListSortingStrategy}>\n {children.map((child, idx) => (\n <BlockRow\n key={child.id}\n builderBlock={child}\n previewHooks={previewHooks}\n previewTheme={previewTheme}\n errors={errorsByBlockId?.get(child.id)}\n isOpen={openBlockId === child.id}\n onOpenChange={(open) => onOpenBlockChange?.(open ? child.id : null)}\n onUpdate={onUpdate}\n onDuplicate={onDuplicate}\n onDelete={onDelete}\n index={idx}\n total={children.length}\n onReorder={onReorder}\n isPaletteDrag={isPaletteDrag}\n />\n ))}\n {isPaletteDrag && isBodyOver ? <DropIndicator /> : null}\n </SortableContext>\n )}\n </div>\n </div>\n\n {/* Hover toolbar — edit / duplicate / delete / move, mirroring BlockRow. */}\n <div\n className={cn(\n 'absolute -top-3 right-2 z-10 hidden items-center gap-0.5 rounded-md border bg-background p-0.5 shadow-sm transition-opacity md:flex',\n hasErrors\n ? 'opacity-100'\n : 'opacity-0 group-hover/container:opacity-100 group-focus-within/container: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={() => onOpenBlockChange?.(id)}\n className=\"flex h-6 w-6 items-center justify-center rounded text-destructive hover:bg-destructive/10 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\"\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 {onReorder && typeof index === 'number' && typeof total === 'number' ? (\n <>\n <ToolbarButton label=\"Move up\" disabled={index === 0} onClick={() => onReorder(id, index - 1)}>\n <ArrowUp className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n <ToolbarButton label=\"Move down\" disabled={index >= total - 1} onClick={() => onReorder(id, index + 1)}>\n <ArrowDown className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n </>\n ) : null}\n <ToolbarButton label=\"Edit\" onClick={() => onOpenBlockChange?.(id)}>\n <Pencil className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n <ToolbarButton label=\"Duplicate\" onClick={() => onDuplicate(id)}>\n <Copy className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n <ToolbarButton label=\"Delete\" destructive onClick={() => onDelete(id)}>\n <Trash2 className=\"h-3.5 w-3.5\" />\n </ToolbarButton>\n </div>\n\n {/* Mobile inline action bar. */}\n <div className=\"mt-1 flex items-center justify-between gap-2 rounded-md border border-dashed bg-muted/40 px-2 py-1 md:hidden\">\n <span className=\"truncate text-[11px] font-medium text-muted-foreground\">Container</span>\n <div className=\"flex items-center gap-1\">\n <button\n type=\"button\"\n aria-label=\"Edit container\"\n onClick={() => onOpenBlockChange?.(id)}\n className=\"flex h-9 w-9 items-center justify-center rounded text-muted-foreground hover:bg-accent hover:text-foreground\"\n >\n <Pencil className=\"h-4 w-4\" />\n </button>\n <button\n type=\"button\"\n aria-label=\"Duplicate container\"\n onClick={() => onDuplicate(id)}\n className=\"flex h-9 w-9 items-center justify-center rounded text-muted-foreground hover:bg-accent hover:text-foreground\"\n >\n <Copy className=\"h-4 w-4\" />\n </button>\n <button\n type=\"button\"\n aria-label=\"Delete container\"\n onClick={() => onDelete(id)}\n className=\"flex h-9 w-9 items-center justify-center rounded text-muted-foreground hover:bg-destructive/10 hover:text-destructive\"\n >\n <Trash2 className=\"h-4 w-4\" />\n </button>\n </div>\n </div>\n </div>\n );\n}\n\n/** Compact icon button used in the container's hover toolbar. */\nfunction ToolbarButton({\n label,\n onClick,\n disabled,\n destructive,\n children\n}: {\n label: string;\n onClick: () => void;\n disabled?: boolean;\n destructive?: boolean;\n children: React.ReactNode;\n}) {\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n aria-label={label}\n disabled={disabled}\n onClick={onClick}\n className={cn(\n 'flex h-6 w-6 items-center justify-center rounded text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-40',\n destructive ? 'hover:bg-destructive/10 hover:text-destructive' : 'hover:bg-accent hover:text-foreground'\n )}\n >\n {children}\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"top\">{label}</TooltipContent>\n </Tooltip>\n );\n}\n\n/** Insertion bar shown at the end of the container body while dragging in. */\nfunction DropIndicator() {\n return (\n <div aria-hidden=\"true\" className=\"pointer-events-none relative my-1 h-0.5 w-full rounded-full bg-primary\">\n <span className=\"-left-1 -top-[3px] absolute h-2 w-2 rounded-full bg-primary shadow-[0_0_0_2px_var(--color-background)]\" />\n </div>\n );\n}\n","import { useDroppable } from '@dnd-kit/core';\nimport { SortableContext, verticalListSortingStrategy } from '@dnd-kit/sortable';\nimport { LayoutGrid, Plus, X } from 'lucide-react';\nimport type { ReactNode } from 'react';\nimport { cn } from '../lib/cn';\nimport { isSafeImageSrc } from '../lib/url-safety';\nimport type { BuilderBlock, PreviewHooks, PreviewSurface, PreviewTheme, SupportedBlock } from '../types';\nimport { BlockRow } from './block-row';\nimport { ContainerRow } from './container-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 authorName,\n authorIcon,\n previewHooks,\n previewTheme,\n previewSurface = 'message',\n errorsByBlockId,\n openBlockId,\n onOpenBlockChange,\n onUpdate,\n onDuplicate,\n onDelete,\n onReorder,\n isPaletteDrag = false,\n onOpenPalette\n}: {\n blocks: BuilderBlock[];\n workspaceName?: string;\n /** Author name shown in the message-frame header (overrides `workspaceName`). */\n authorName?: string;\n /** Author avatar URL shown in the message-frame header. */\n authorIcon?: 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 /** Move a block to a new index. Powers the keyboard-accessible move up / move down buttons. */\n onReorder?: (id: string, toIndex: number) => void;\n /** True while a palette item is being dragged (vs. reordering an existing block). */\n isPaletteDrag?: boolean;\n /** When provided, the empty state shows a mobile-friendly CTA that opens the palette sheet. */\n onOpenPalette?: () => void;\n}) {\n const { setNodeRef, isOver } = useDroppable({ id: SURFACE_DROPPABLE_ID });\n const isDark = previewTheme === 'dark';\n\n // Show the end-of-list insertion bar when the cursor is past the last\n // block while dragging a palette item. For reorder we rely on\n // verticalListSortingStrategy's row shift instead.\n const showEndDropZone = isPaletteDrag && isOver && blocks.length > 0;\n\n const blocksList = (\n <div\n ref={setNodeRef}\n className={cn(\n 'flex min-h-[180px] flex-col px-3 py-2 transition-colors sm:min-h-[240px] sm:px-5',\n isDark ? 'bg-[#1a1d21]' : 'bg-white',\n isPaletteDrag &&\n (isDark\n ? 'bg-[#22262c] outline-2 outline-primary/40 -outline-offset-2 outline-dashed'\n : 'bg-[#f5f8ff] outline-2 outline-primary/40 -outline-offset-2 outline-dashed'),\n isPaletteDrag && isOver && (isDark ? 'bg-[#2c3036]' : 'bg-[#eaf0ff]')\n )}\n >\n {blocks.length === 0 ? (\n <EmptyState isDark={isDark} isPaletteDrag={isPaletteDrag} isOver={isOver} onOpenPalette={onOpenPalette} />\n ) : (\n <SortableContext items={blocks.map((b) => b.id)} strategy={verticalListSortingStrategy}>\n {blocks.map((block, idx) =>\n block.block.type === 'container' ? (\n <ContainerRow\n key={block.id}\n builderBlock={block}\n previewHooks={previewHooks}\n previewTheme={previewTheme}\n errorsByBlockId={errorsByBlockId}\n openBlockId={openBlockId}\n onOpenBlockChange={onOpenBlockChange}\n onUpdate={onUpdate}\n onDuplicate={onDuplicate}\n onDelete={onDelete}\n index={idx}\n total={blocks.length}\n onReorder={onReorder}\n isPaletteDrag={isPaletteDrag}\n />\n ) : (\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 index={idx}\n total={blocks.length}\n onReorder={onReorder}\n isPaletteDrag={isPaletteDrag}\n />\n )\n )}\n {showEndDropZone ? <DropIndicator /> : null}\n </SortableContext>\n )}\n </div>\n );\n\n return (\n <main\n aria-label=\"Block preview\"\n // Outer canvas (the area framing the Slack chrome) follows the\n // host theme's --muted token so brand presets reach it. The inner\n // Slack frame keeps Slack's own canvas colors via isDark below,\n // since that surface is mimicking Slack itself.\n className={cn('flex min-w-0 flex-1 flex-col overflow-y-auto bg-muted p-3 sm:p-6')}\n >\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} authorName={authorName} authorIcon={authorIcon} isDark={isDark}>\n {blocksList}\n </MessageFrame>\n )}\n </div>\n </main>\n );\n}\n\n/**\n * Slack message chrome: avatar + author name + 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 authorName,\n authorIcon,\n isDark,\n children\n}: {\n workspaceName?: string;\n authorName?: string;\n authorIcon?: string;\n isDark: boolean;\n children: ReactNode;\n}) {\n const displayName = authorName ?? workspaceName ?? 'Your app';\n const initial = displayName.slice(0, 1).toUpperCase();\n // Only render the author image when it's a safe http(s) URL — it flows into\n // an <img src> just like block image URLs do.\n const safeIcon = authorIcon && isSafeImageSrc(authorIcon) ? authorIcon : null;\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-5 pt-3 pb-1 text-xs', isDark ? 'text-white/60' : 'text-[#616061]')}\n >\n {safeIcon ? (\n <img src={safeIcon} alt=\"\" className=\"h-7 w-7 shrink-0 rounded object-cover\" />\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 )}\n <span className={cn('font-bold text-sm', isDark ? 'text-white' : 'text-[#1d1c1d]')}>{displayName}</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 // The X / Cancel / Submit affordances are visual chrome — they exist to\n // make the preview look like a real Slack modal. They aren't wired to\n // anything, so render them as `<span aria-hidden>` to keep them out of\n // the focus order and the accessibility tree (a keyboard or screen\n // reader user activating a \"Submit\" button that did nothing would be a\n // worse experience than not seeing the chrome at all).\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 <span\n aria-hidden=\"true\"\n className={cn(\n 'flex h-6 w-6 items-center justify-center rounded',\n isDark ? 'text-white/60' : 'text-[#616061]'\n )}\n >\n <X className=\"h-4 w-4\" />\n </span>\n </div>\n {children}\n <div\n aria-hidden=\"true\"\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 <span\n className={cn(\n 'rounded-sm border px-3 py-1.5 text-sm font-medium',\n isDark ? 'border-white/20 bg-transparent text-white' : 'border-[#e8e8e8] bg-white text-[#1d1c1d]'\n )}\n >\n Cancel\n </span>\n <span className=\"rounded-sm bg-[#007a5a] px-3 py-1.5 text-sm font-bold text-white\">Submit</span>\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-5 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-5 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. While a\n * palette item is being dragged the copy switches to a \"Drop here\" cue\n * and the icon container brightens to confirm the empty surface itself\n * is the drop target.\n * @param props - empty state props\n * @param props.isDark - whether the dark Slack canvas is active\n * @param props.isPaletteDrag - whether a palette block is currently being dragged\n * @param props.isOver - whether the cursor is currently over the surface\n * @returns the rendered placeholder\n */\nfunction EmptyState({\n isDark,\n isPaletteDrag,\n isOver,\n onOpenPalette\n}: {\n isDark: boolean;\n isPaletteDrag: boolean;\n isOver: boolean;\n onOpenPalette?: () => void;\n}) {\n const active = isPaletteDrag && isOver;\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 transition-colors',\n active ? 'text-primary' : 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 transition-colors',\n active ? 'bg-primary/15 text-primary' : isDark ? 'bg-white/5' : 'bg-[#f3f3f3]'\n )}\n >\n <LayoutGrid className=\"h-6 w-6\" />\n </span>\n <div className=\"flex flex-col gap-1\">\n <p\n className={cn(\n 'text-sm font-semibold transition-colors',\n active ? 'text-primary' : isDark ? 'text-white' : 'text-[#1d1c1d]'\n )}\n >\n {active ? 'Drop to add block' : 'Start adding blocks!'}\n </p>\n <p className=\"text-xs\">\n {active ? (\n 'Release to insert it here.'\n ) : (\n <>\n <span className=\"hidden md:inline\">Drag a block from the left, or click one to add it here.</span>\n <span className=\"md:hidden\">Tap “Add a block” below to get started.</span>\n </>\n )}\n </p>\n </div>\n {!active && onOpenPalette ? (\n <button\n type=\"button\"\n onClick={onOpenPalette}\n className=\"inline-flex min-h-11 items-center gap-2 rounded-full bg-primary px-4 py-2 text-sm font-semibold text-primary-foreground shadow-sm transition-colors hover:bg-primary/90 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring md:hidden\"\n >\n <Plus className=\"h-4 w-4\" />\n Add a block\n </button>\n ) : null}\n </div>\n );\n}\n\n/**\n * Insertion bar shown at the cursor's drop target while a palette item\n * is being dragged. A 2px primary-colored line spanning the row width\n * with a small filled caret on the leading edge so the user can see\n * exactly where the new block will land.\n * @returns the rendered drop indicator\n */\nfunction DropIndicator() {\n return (\n <div aria-hidden=\"true\" className=\"pointer-events-none relative my-1 h-0.5 w-full rounded-full bg-primary\">\n <span className=\"-left-1 -top-[3px] absolute h-2 w-2 rounded-full bg-primary shadow-[0_0_0_2px_var(--color-background)]\" />\n </div>\n );\n}\n","import {\n AlertTriangle,\n AppWindow,\n BookOpen,\n Check,\n ChevronDown,\n Code2,\n ExternalLink,\n Home,\n MailSearch,\n MessageSquare,\n Moon,\n Pencil,\n Plus,\n Send,\n Sun,\n Trash2,\n X\n} from 'lucide-react';\nimport type { ComponentType, KeyboardEvent } from 'react';\nimport { useRef, useState } from '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\nconst DEFAULT_DOCS_HREF = 'https://docs.slack.dev/reference/block-kit/blocks';\nconst DEFAULT_DOCS_LABEL = 'Docs';\n\n/**\n * Render a Slack message timestamp (`<unix-seconds>.<micro>`) as a readable\n * date for the edit-mode banner. Falls back to the raw value if it doesn't\n * parse as a number.\n */\nfunction formatMessageTs(ts: string): string {\n const seconds = Number.parseFloat(ts);\n if (!Number.isFinite(seconds)) return ts;\n const date = new Date(seconds * 1000);\n if (Number.isNaN(date.getTime())) return ts;\n return date.toLocaleString(undefined, { dateStyle: 'medium', timeStyle: 'short' });\n}\n\nconst SEND_MENU_ITEM =\n 'flex w-full cursor-pointer items-center gap-2 rounded px-2 py-1.5 text-left text-sm text-foreground transition-colors hover:bg-accent hover:text-accent-foreground focus-visible:bg-accent focus-visible:text-accent-foreground focus-visible:outline-none disabled:pointer-events-none disabled:opacity-50';\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.onOpenPalette - opens the mobile palette sheet\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.allowedSurfaces - surfaces shown in the dropdown. When the\n * list has 0 or 1 entry the dropdown is hidden entirely.\n * @param props.showThemeControl - render the theme dropdown (default true)\n * @param props.docsLink - customize or hide the Docs link. `false` hides it;\n * an object overrides `href` and/or `label`. Defaults to the Slack Block\n * Kit reference docs.\n * @param props.errorCount - number of validation errors\n * @param props.sendButtonLabel - label + accessible name for the Send\n * button that opens the send dialog. Defaults to `'Send'`.\n * @returns the rendered toolbar\n */\nexport function Toolbar({\n onClear,\n onOpenJson,\n onOpenIssues,\n onOpenSend,\n onOpenPalette,\n canSend,\n canClear,\n previewTheme,\n onPreviewThemeChange,\n previewSurface,\n onPreviewSurfaceChange,\n allowedSurfaces,\n showThemeControl = true,\n docsLink,\n errorCount,\n sendButtonLabel = 'Review & send',\n editingEnabled = false,\n editBadge,\n onOpenLoad,\n onOpenUpdate,\n onExitEdit,\n loadButtonLabel = 'Find message',\n updateButtonLabel = 'Review & update'\n}: {\n onClear: () => void;\n onOpenJson: () => void;\n onOpenIssues: () => void;\n onOpenSend: () => void;\n onOpenPalette?: () => void;\n canSend: boolean;\n canClear: boolean;\n previewTheme: PreviewTheme;\n onPreviewThemeChange: (theme: PreviewTheme) => void;\n previewSurface: PreviewSurface;\n onPreviewSurfaceChange: (surface: PreviewSurface) => void;\n allowedSurfaces: readonly PreviewSurface[];\n showThemeControl?: boolean;\n docsLink?: false | { href?: string; label?: string };\n errorCount: number;\n sendButtonLabel?: string;\n /** Whether edit mode is configured (shows the \"Edit existing message\" entry). */\n editingEnabled?: boolean;\n /** When set, a message is loaded for editing: renders the edit-mode badge. */\n editBadge?: { channelLabel: string; ts: string } | null;\n /** Opens the load-message dialog (edit-mode entry point). */\n onOpenLoad?: () => void;\n /** Opens the update dialog (split button's main action + \"Update message\"). */\n onOpenUpdate?: () => void;\n /** Switches back to a new message, clearing the loaded edit target. */\n onExitEdit?: () => void;\n /** Label for the load-message entry button. Defaults to `'Find message'`. */\n loadButtonLabel?: string;\n /** Label for the primary button while editing. Defaults to `'Review & update'`. */\n updateButtonLabel?: string;\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 const surfaceOptions = SURFACE_OPTIONS.filter((s) => allowedSurfaces.includes(s.value));\n const showSurfaceControl = surfaceOptions.length > 1;\n const docsHref = docsLink === false ? null : (docsLink?.href ?? DEFAULT_DOCS_HREF);\n const docsLabel = docsLink === false ? null : (docsLink?.label ?? DEFAULT_DOCS_LABEL);\n\n // Controlled open state so we can close the menus after a selection — the\n // `role=\"menuitemradio\"` semantics imply activation dismisses the menu.\n const [surfaceMenuOpen, setSurfaceMenuOpen] = useState(false);\n const [themeMenuOpen, setThemeMenuOpen] = useState(false);\n const [sendMenuOpen, setSendMenuOpen] = useState(false);\n\n return (\n <>\n <div className=\"flex flex-wrap items-center justify-between gap-x-2 gap-y-1 border-b bg-background px-2 py-1.5 sm:px-3 sm:py-2\">\n <div className=\"flex min-w-0 flex-1 items-center gap-1 sm:gap-2\">\n {editingEnabled ? (\n <Button type=\"button\" size=\"sm\" onClick={onOpenLoad} aria-label={loadButtonLabel}>\n <MailSearch className=\"h-3.5 w-3.5\" />\n <span className=\"hidden md:inline\">{loadButtonLabel}</span>\n </Button>\n ) : null}\n {onOpenPalette ? (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={onOpenPalette}\n className=\"md:hidden\"\n aria-label=\"Add a block\"\n >\n <Plus className=\"h-4 w-4\" />\n <span>Blocks</span>\n </Button>\n ) : null}\n {showSurfaceControl ? (\n <Popover open={surfaceMenuOpen} onOpenChange={setSurfaceMenuOpen}>\n <PopoverTrigger asChild>\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" aria-label={`Preview surface: ${activeSurface.label}`}>\n <activeSurface.Icon className=\"h-3.5 w-3.5\" />\n <span className=\"hidden md:inline\">{activeSurface.label}</span>\n <ChevronDown className=\"hidden h-3.5 w-3.5 opacity-60 md:inline\" />\n </Button>\n </PopoverTrigger>\n <PopoverContent align=\"start\" className=\"w-36 p-1\">\n <Menu<PreviewSurface>\n ariaLabel=\"Preview surface\"\n options={surfaceOptions}\n value={previewSurface}\n onChange={(next) => {\n onPreviewSurfaceChange(next);\n setSurfaceMenuOpen(false);\n }}\n />\n </PopoverContent>\n </Popover>\n ) : null}\n {showThemeControl ? (\n <Popover open={themeMenuOpen} onOpenChange={setThemeMenuOpen}>\n <PopoverTrigger asChild>\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" aria-label={`Preview theme: ${activeTheme.label}`}>\n <activeTheme.Icon className=\"h-3.5 w-3.5\" />\n <span className=\"hidden md:inline\">{activeTheme.label}</span>\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 <Menu<PreviewTheme>\n ariaLabel=\"Preview theme\"\n options={THEME_OPTIONS}\n value={previewTheme}\n onChange={(next) => {\n onPreviewThemeChange(next);\n setThemeMenuOpen(false);\n }}\n />\n </PopoverContent>\n </Popover>\n ) : null}\n {docsHref ? (\n <a\n href={docsHref}\n target=\"_blank\"\n rel=\"noreferrer noopener\"\n className=\"inline-flex h-8 items-center gap-1.5 rounded-md px-2 text-xs font-medium text-muted-foreground no-underline transition-colors hover:bg-accent hover:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\"\n aria-label={`${docsLabel} (opens in a new tab)`}\n >\n <BookOpen className=\"h-3.5 w-3.5\" />\n <span className=\"hidden md:inline\">{docsLabel}</span>\n <ExternalLink className=\"hidden h-3 w-3 opacity-50 md:inline\" />\n </a>\n ) : null}\n </div>\n <div className=\"flex items-center gap-1 sm:gap-2\">\n {errorCount > 0 ? (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={onOpenIssues}\n // High-contrast error styling: red text on a light red background\n // with a subtle red border (WCAG AA — red-700 on red-50 ≈ 6.5:1),\n // so the issue count reads unmistakably as an error rather than a\n // muted ghost button. The `!` on the border color beats the\n // unlayered `.bk-root *` border-color reset in styles.src.css,\n // which otherwise clobbers any utility border color back to the\n // neutral `--border` token.\n className=\"border border-red-200! bg-red-50 text-red-700 hover:bg-red-100 hover:text-red-700\"\n aria-label={`${errorCount} ${errorCount === 1 ? 'issue' : 'issues'}`}\n >\n <AlertTriangle className=\"h-3.5 w-3.5\" />\n <span>\n {errorCount} <span className=\"hidden md:inline\">{errorCount === 1 ? 'issue' : 'issues'}</span>\n </span>\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 aria-label=\"Clear all blocks\"\n >\n <Trash2 className=\"h-3.5 w-3.5\" />\n <span className=\"hidden md:inline\">Clear</span>\n </Button>\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={onOpenJson} aria-label=\"View JSON\">\n <Code2 className=\"h-3.5 w-3.5\" />\n <span className=\"hidden md:inline\">View JSON</span>\n </Button>\n {editBadge ? (\n // A message is loaded: split button. Main action updates it in\n // place; the menu also offers posting the blocks as a new message.\n <div className=\"flex items-stretch\">\n <Button\n type=\"button\"\n size=\"sm\"\n onClick={onOpenUpdate}\n disabled={!canSend}\n aria-label={updateButtonLabel}\n className=\"rounded-r-none\"\n >\n <Pencil className=\"h-3.5 w-3.5\" />\n <span className=\"hidden md:inline\">{updateButtonLabel}</span>\n </Button>\n <Popover open={sendMenuOpen} onOpenChange={setSendMenuOpen}>\n <PopoverTrigger asChild>\n <Button\n type=\"button\"\n size=\"sm\"\n aria-label=\"More message options\"\n aria-haspopup=\"menu\"\n className=\"rounded-l-none border-l border-l-primary-foreground/30! px-1.5\"\n >\n <ChevronDown className=\"h-3.5 w-3.5\" />\n </Button>\n </PopoverTrigger>\n <PopoverContent align=\"end\" className=\"w-56 p-1\">\n <div role=\"menu\" aria-label=\"Message options\" className=\"flex flex-col\">\n <button\n type=\"button\"\n role=\"menuitem\"\n disabled={!canSend}\n onClick={() => {\n setSendMenuOpen(false);\n onOpenUpdate?.();\n }}\n className={SEND_MENU_ITEM}\n >\n <Pencil className=\"h-3.5 w-3.5\" />\n <span className=\"flex-1\">Update message</span>\n </button>\n <button\n type=\"button\"\n role=\"menuitem\"\n disabled={!canSend}\n onClick={() => {\n setSendMenuOpen(false);\n onOpenSend();\n }}\n className={SEND_MENU_ITEM}\n >\n <Send className=\"h-3.5 w-3.5\" />\n <span className=\"flex-1\">Send as a new message</span>\n </button>\n </div>\n </PopoverContent>\n </Popover>\n </div>\n ) : (\n <Button type=\"button\" size=\"sm\" onClick={onOpenSend} disabled={!canSend} aria-label={sendButtonLabel}>\n <Send className=\"h-3.5 w-3.5\" />\n <span className=\"hidden md:inline\">{sendButtonLabel}</span>\n </Button>\n )}\n </div>\n </div>\n {editingEnabled && editBadge ? (\n <div className=\"flex flex-wrap items-center gap-x-3 gap-y-1 border-b bg-muted px-2 py-2 text-foreground sm:px-3\">\n <Pencil className=\"h-4 w-4 shrink-0 text-primary\" />\n <span className=\"min-w-0 flex-1 text-sm\">\n References an existing message in <span className=\"font-semibold\">{editBadge.channelLabel}</span>\n <span className=\"ml-1 text-xs opacity-70\" title={editBadge.ts}>\n {formatMessageTs(editBadge.ts)}\n </span>\n </span>\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={onExitEdit} className=\"shrink-0\">\n <X className=\"h-3.5 w-3.5\" />\n Switch to a new message\n </Button>\n </div>\n ) : null}\n </>\n );\n}\n\n/**\n * Single-select dropdown menu rendered inside a Popover. Adds proper\n * `role=\"menu\"` / `role=\"menuitem\"` semantics and arrow-key navigation\n * between options. Avoiding `@radix-ui/react-dropdown-menu` keeps this\n * dependency-free; the wrapping `Popover` already handles outside-click\n * dismiss, focus return, and Escape.\n */\nfunction Menu<T extends string>({\n ariaLabel,\n options,\n value,\n onChange\n}: {\n ariaLabel: string;\n options: readonly { value: T; label: string; Icon: ComponentType<{ className?: string }> }[];\n value: T;\n onChange: (next: T) => void;\n}) {\n const itemsRef = useRef<(HTMLButtonElement | null)[]>([]);\n\n const moveFocus = (from: number, delta: number) => {\n const len = options.length;\n if (len === 0) return;\n const next = (from + delta + len) % len;\n itemsRef.current[next]?.focus();\n };\n\n const handleKeyDown = (e: KeyboardEvent<HTMLButtonElement>, idx: number) => {\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n moveFocus(idx, 1);\n } else if (e.key === 'ArrowUp') {\n e.preventDefault();\n moveFocus(idx, -1);\n } else if (e.key === 'Home') {\n e.preventDefault();\n itemsRef.current[0]?.focus();\n } else if (e.key === 'End') {\n e.preventDefault();\n itemsRef.current[options.length - 1]?.focus();\n }\n };\n\n return (\n <div role=\"menu\" aria-label={ariaLabel} className=\"flex flex-col\">\n {options.map(({ value: optValue, label, Icon }, idx) => {\n const isActive = optValue === value;\n return (\n <button\n key={optValue}\n ref={(el) => {\n itemsRef.current[idx] = el;\n }}\n type=\"button\"\n role=\"menuitemradio\"\n aria-checked={isActive}\n onClick={() => onChange(optValue)}\n onKeyDown={(e) => handleKeyDown(e, idx)}\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 focus-visible:bg-accent focus-visible:text-foreground focus-visible:outline-none',\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 </div>\n );\n}\n","import { AlertTriangle } from 'lucide-react';\nimport { useEffect, 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 { isSafeHref } from '../lib/url-safety';\nimport type { EditableVia, SendAsUserStatus, SupportedBlock, UpdatePayload, UpdateResult } from '../types';\nimport { SlackSignInButton, useSlackSignIn } from './slack-sign-in';\n\n/** The loaded message being edited. Destination + identity are fixed by the host's verdict. */\nexport interface EditTarget {\n channelId: string;\n channelName?: string;\n ts: string;\n editableVia: EditableVia;\n workspaceName?: string;\n username?: string;\n iconUrl?: string;\n}\n\ntype UpdateStatus = { kind: 'idle' } | { kind: 'updating' } | { kind: 'error'; error: string };\n\n/**\n * Modal dialog confirming an update to an already-posted message. Unlike the\n * send dialog, the destination channel is locked to the source and the\n * post-as identity is fixed by the host's `editableVia` verdict — there is no\n * channel or identity picker. When the verdict is `'user'` and the user has no\n * token yet, the dialog reuses the \"Sign in with Slack\" flow before allowing\n * the update.\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.target - the loaded message (channel + ts + editability verdict)\n * @param props.blocks - the edited draft blocks to write back\n * @param props.loadSendAsUserStatus - returns user-token status + OAuth URL (user-token path only)\n * @param props.onUpdate - terminal action; should return `{ ok }` or `{ ok: false, error }`\n * @param props.confirmUpdateLabel - label for the confirm button. Defaults to `'Update message'`.\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 update dialog\n */\nexport function UpdateDialog({\n open,\n onOpenChange,\n target,\n blocks,\n loadSendAsUserStatus,\n onUpdate,\n confirmUpdateLabel = 'Update message',\n errorCount,\n onShowIssues\n}: {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n target: EditTarget;\n blocks: SupportedBlock[];\n loadSendAsUserStatus: () => Promise<SendAsUserStatus>;\n onUpdate: (payload: UpdatePayload) => Promise<UpdateResult>;\n confirmUpdateLabel?: string;\n errorCount: number;\n onShowIssues?: () => void;\n}) {\n const asUser = target.editableVia === 'user';\n const [status, setStatus] = useState<UpdateStatus>({ kind: 'idle' });\n\n // Only the user-token path needs a token check; the bot path can always edit\n // its own message.\n const { userStatus, polling, startSignIn } = useSlackSignIn(loadSendAsUserStatus, { open, enabled: asUser });\n\n // Reset the update status whenever the dialog opens.\n useEffect(() => {\n if (open) {\n setStatus({ kind: 'idle' });\n }\n }, [open]);\n\n // Editing as the user requires a usable user token. The bot path never gates.\n const needsSignIn = asUser && userStatus !== null && !userStatus.canSendAsUser;\n\n const handleSubmit = async () => {\n setStatus({ kind: 'updating' });\n try {\n const result = await onUpdate({\n channelId: target.channelId,\n ts: target.ts,\n blocks: toSlackBlocks(blocks),\n asUser\n });\n if (result.ok) {\n setStatus({ kind: 'idle' });\n onOpenChange(false);\n return;\n }\n setStatus({ kind: 'error', error: result.error ?? 'Update failed.' });\n } catch (e) {\n setStatus({ kind: 'error', error: e instanceof Error ? e.message : 'Update failed.' });\n }\n };\n\n const channelLabel = target.channelName ? `#${target.channelName}` : target.channelId;\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"w-[calc(100vw-1.5rem)] max-w-lg rounded-lg\">\n <DialogHeader>\n <DialogTitle>Update message</DialogTitle>\n <DialogDescription>\n This replaces the message that's already posted. It stays in the same channel and can't be moved.\n </DialogDescription>\n </DialogHeader>\n\n <div className=\"flex flex-col gap-4\">\n <div className=\"flex flex-col gap-1.5\">\n <Label>Channel</Label>\n <p className=\"flex h-9 items-center rounded-md border border-input bg-muted px-3 text-sm text-muted-foreground\">\n {channelLabel}\n </p>\n </div>\n\n <div className=\"flex flex-col gap-1.5\">\n <Label>Posting as</Label>\n <p className=\"flex h-9 items-center rounded-md border border-input bg-muted px-3 text-sm text-muted-foreground\">\n {asUser ? 'Your account' : 'App bot'}\n </p>\n {needsSignIn && userStatus?.oauthUrl && isSafeHref(userStatus.oauthUrl) && (\n <>\n <p className=\"text-xs text-muted-foreground\">Connect your Slack account to edit your own messages.</p>\n <SlackSignInButton onClick={startSignIn} polling={polling} />\n </>\n )}\n {needsSignIn && !userStatus?.oauthUrl && (\n <p className=\"text-xs text-muted-foreground\">Sign in with Slack to update your own message.</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 updating.\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 === 'updating' || blocks.length === 0 || errorCount > 0 || needsSignIn}\n >\n {status.kind === 'updating' ? 'Updating…' : confirmUpdateLabel}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n","import {\n type CollisionDetection,\n closestCenter,\n DndContext,\n type DragEndEvent,\n DragOverlay,\n type DragStartEvent,\n KeyboardSensor,\n PointerSensor,\n pointerWithin,\n TouchSensor,\n useSensor,\n useSensors\n} from '@dnd-kit/core';\nimport { sortableKeyboardCoordinates } from '@dnd-kit/sortable';\nimport { GripVertical } from 'lucide-react';\nimport { useCallback, useMemo, useState } from 'react';\nimport { parseContainerBodyId } from '../lib/container-blocks';\nimport { makeEmojiHook } from '../lib/custom-emoji-hook';\nimport { buildVariantById, defaultPalette, type PaletteSection } from '../lib/default-blocks';\nimport { Sheet, SheetContent, SheetDescription, SheetTitle } from '../lib/ui/sheet';\nimport { TooltipProvider } from '../lib/ui/tooltip';\nimport { useIsMobile } from '../lib/use-is-mobile';\nimport { CustomEmojiProvider } from '../state/custom-emoji-context';\nimport { useBlockKitValidation } from '../state/use-block-kit-validation';\nimport { type MoveTarget, useBlockKitchenState } from '../state/use-block-kitchen-state';\nimport type { BlockKitchenProps, PreviewSurface, PreviewTheme } from '../types';\nimport { BrandThemeScope } from './brand-theme-scope';\nimport { IssuesSheet } from './issues-sheet';\nimport { JsonDrawer } from './json-drawer';\nimport { LoadMessageDialog } from './load-message-dialog';\nimport { Palette, parsePaletteDragId } from './palette';\nimport { SendDialog } from './send-dialog';\nimport { SURFACE_DROPPABLE_ID, Surface } from './surface';\nimport { Toolbar } from './toolbar';\nimport { type EditTarget, UpdateDialog } from './update-dialog';\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 BlockKitchenProps}\n * @returns the rendered Block Kit Builder\n */\nexport function BlockKitchen(props: BlockKitchenProps) {\n const {\n workspaceName,\n initialBlocks,\n onChange,\n previewHooks,\n customEmojis,\n loadChannels,\n loadSendAsUserStatus,\n onSend,\n editing,\n loadButtonLabel,\n updateButtonLabel,\n confirmUpdateLabel,\n palette,\n disabledBlockTypes,\n showPaletteSearch,\n paletteSearchPlaceholder,\n defaultOpenSections,\n allowedSurfaces: allowedSurfacesProp,\n showThemeControl = true,\n docsLink,\n defaultPreviewTheme = 'light',\n previewTheme: controlledPreviewTheme,\n sendButtonLabel,\n confirmSendLabel,\n theme\n } = props;\n\n const paletteSections = useMemo(() => {\n const sections = palette ?? defaultPalette;\n if (!disabledBlockTypes || disabledBlockTypes.length === 0) {\n return sections;\n }\n // Filter at the variant level: a section may mix block types (e.g.\n // Structure contains divider + header + context), so dropping a\n // whole section by name would over-prune. Run each factory once to\n // peek at the block type; drop sections that end up empty.\n const blocked = new Set(disabledBlockTypes);\n const filtered: PaletteSection[] = [];\n for (const section of sections) {\n const variants = section.variants.filter((variant) => !blocked.has(variant.factory().type));\n if (variants.length > 0) {\n filtered.push({ ...section, variants });\n }\n }\n return filtered;\n }, [palette, disabledBlockTypes]);\n const variantById = useMemo(() => buildVariantById(paletteSections), [paletteSections]);\n\n // Default to message-only when omitted (or passed empty). The toolbar\n // needs at least one entry to seed `previewSurface`; it hides the\n // dropdown when this resolves to a single surface.\n const allowedSurfaces: readonly PreviewSurface[] =\n allowedSurfacesProp && allowedSurfacesProp.length > 0 ? allowedSurfacesProp : ['message'];\n\n const { blocks, addBlock, addChild, updateBlock, removeBlock, duplicateBlock, reorderBlock, moveBlock, replaceAll } =\n useBlockKitchenState({ initialBlocks, onChange });\n\n // Lookups for resolving a drop target: which ids are container children,\n // and which container each child belongs to. Recomputed when the tree\n // changes; read by collision detection and the drag-end handler.\n const childParentById = useMemo(() => {\n const map = new Map<string, string>();\n for (const top of blocks) {\n if (top.children) {\n for (const child of top.children) {\n map.set(child.id, top.id);\n }\n }\n }\n return map;\n }, [blocks]);\n\n const [jsonOpen, setJsonOpen] = useState(false);\n const [sendOpen, setSendOpen] = useState(false);\n // Edit mode (opt-in via `editing`). `editTarget` is the loaded message;\n // when set, the split button can update it in place (`updateOpen`) or post\n // the current blocks as a new message (`sendOpen`).\n const [updateOpen, setUpdateOpen] = useState(false);\n const [loadOpen, setLoadOpen] = useState(false);\n const [editTarget, setEditTarget] = useState<EditTarget | null>(null);\n // Edit mode only counts as active while `editing` is configured. If the host\n // toggles `editing` off mid-session, fall back to send-only without losing\n // the loaded target (it reactivates if `editing` returns).\n const activeEditTarget = editing ? editTarget : null;\n const [issuesOpen, setIssuesOpen] = useState(false);\n const [paletteOpen, setPaletteOpen] = useState(false);\n const [openBlockId, setOpenBlockId] = useState<string | null>(null);\n // Preview theme is controlled when the host passes `previewTheme`, and\n // uncontrolled (seeded from `defaultPreviewTheme`) otherwise. The\n // uncontrolled state is only mutated by the toolbar toggle, which is\n // hidden whenever the theme is controlled — so the two never fight.\n const [uncontrolledPreviewTheme, setUncontrolledPreviewTheme] = useState<PreviewTheme>(defaultPreviewTheme);\n const isPreviewThemeControlled = controlledPreviewTheme !== undefined;\n const previewTheme = controlledPreviewTheme ?? uncontrolledPreviewTheme;\n const [previewSurface, setPreviewSurface] = useState<PreviewSurface>(allowedSurfaces[0]);\n const [activePaletteVariantId, setActivePaletteVariantId] = useState<string | null>(null);\n\n const isMobile = useIsMobile();\n\n // Merge a custom-emoji `emoji` hook into the caller's preview hooks so the\n // preview renders `:custom:` as the workspace image (and resolves aliases).\n // An explicit caller-supplied `emoji` hook wins over ours. When no custom\n // emoji are provided we forward `previewHooks` untouched so behavior is\n // identical to before the prop existed.\n const mergedPreviewHooks = useMemo(() => {\n if (!customEmojis || customEmojis.length === 0) {\n return previewHooks;\n }\n const byName = new Map(customEmojis.map((emoji) => [emoji.name, emoji] as const));\n return { emoji: makeEmojiHook(byName), ...previewHooks };\n }, [customEmojis, previewHooks]);\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 // Touch needs a 150ms press-and-hold to start a drag so scrolling the\n // surface doesn't accidentally pick up a block. Pointer keeps the small\n // 4px distance threshold so mouse clicks still open the editor cleanly.\n const sensors = useSensors(\n useSensor(PointerSensor, { activationConstraint: { distance: 4 } }),\n useSensor(TouchSensor, { activationConstraint: { delay: 150, tolerance: 8 } }),\n useSensor(KeyboardSensor, { coordinateGetter: sortableKeyboardCoordinates })\n );\n\n // Pick the block directly under the cursor when possible so the drop\n // target tracks the cursor rather than whichever droppable's geometric\n // center is nearest. The surface (a tall droppable) used to win against\n // small block rows under closestCenter, which made it look like every\n // palette drop appended to the end. Fall back to closestCenter so the\n // bottom of the surface still resolves to a valid target when the\n // cursor sits past the last block.\n // Prefer the most specific drop target under the cursor so nested\n // container drop zones win over the surface they sit inside: a child row\n // beats the container body, the body beats the container's own row, and\n // any block beats the tall surface droppable.\n const collisionDetection = useCallback<CollisionDetection>(\n (args) => {\n const hits = pointerWithin(args);\n if (hits.length > 0) {\n const child = hits.find((c) => childParentById.has(c.id as string));\n if (child) return [child];\n const body = hits.find((c) => parseContainerBodyId(c.id) !== null);\n if (body) return [body];\n const block = hits.find((c) => c.id !== SURFACE_DROPPABLE_ID && parseContainerBodyId(c.id) === null);\n if (block) return [block];\n return hits;\n }\n return closestCenter(args);\n },\n [childParentById]\n );\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 const overId = over.id as string;\n\n // Resolve the `over` droppable into a destination list + index:\n // the surface end, a slot among the top-level blocks, a container's\n // body (append), or a slot among a container's children (the hovered\n // child's index).\n let target: MoveTarget | null;\n const bodyParent = parseContainerBodyId(overId);\n const childParent = childParentById.get(overId);\n if (overId === SURFACE_DROPPABLE_ID) {\n target = { kind: 'top', index: blocks.length };\n } else if (bodyParent) {\n const count = blocks.find((b) => b.id === bodyParent)?.children?.length ?? 0;\n target = { kind: 'container', parentId: bodyParent, index: count };\n } else if (childParent) {\n const siblings = blocks.find((b) => b.id === childParent)?.children ?? [];\n target = { kind: 'container', parentId: childParent, index: siblings.findIndex((c) => c.id === overId) };\n } else {\n const topIndex = blocks.findIndex((b) => b.id === overId);\n target = topIndex === -1 ? null : { kind: 'top', index: topIndex };\n }\n if (!target) {\n return;\n }\n\n const variantId = parsePaletteDragId(active.id);\n if (variantId) {\n const variant = variantById.get(variantId);\n if (!variant) {\n return;\n }\n if (target.kind === 'container') {\n addChild(target.parentId, variant.factory(), target.index);\n } else {\n addBlock(variant.factory(), target.index);\n }\n return;\n }\n\n if (active.id !== overId) {\n moveBlock(active.id as string, target);\n }\n },\n [addBlock, addChild, blocks, childParentById, moveBlock, variantById]\n );\n\n const handleDragCancel = useCallback(() => {\n setActivePaletteVariantId(null);\n }, []);\n\n const activePaletteVariant = activePaletteVariantId ? variantById.get(activePaletteVariantId) : null;\n\n const blockPayloads = blocks.map((b) => b.block);\n\n return (\n <BrandThemeScope theme={theme}>\n <CustomEmojiProvider customEmojis={customEmojis}>\n <TooltipProvider delayDuration={200}>\n <DndContext\n sensors={sensors}\n collisionDetection={collisionDetection}\n onDragStart={handleDragStart}\n onDragEnd={handleDragEnd}\n onDragCancel={handleDragCancel}\n >\n <div className=\"bk-root flex h-full w-full flex-col overflow-hidden 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 onOpenPalette={() => setPaletteOpen(true)}\n canSend={blocks.length > 0}\n canClear={blocks.length > 0}\n errorCount={validation.total}\n previewTheme={previewTheme}\n onPreviewThemeChange={setUncontrolledPreviewTheme}\n previewSurface={previewSurface}\n onPreviewSurfaceChange={setPreviewSurface}\n allowedSurfaces={allowedSurfaces}\n // A controlled `previewTheme` always hides the toggle so the\n // host app fully owns the theme; otherwise honor the prop.\n showThemeControl={isPreviewThemeControlled ? false : showThemeControl}\n docsLink={docsLink}\n sendButtonLabel={sendButtonLabel}\n editingEnabled={!!editing}\n editBadge={\n activeEditTarget\n ? {\n channelLabel: activeEditTarget.channelName\n ? `#${activeEditTarget.channelName}`\n : activeEditTarget.channelId,\n ts: activeEditTarget.ts\n }\n : null\n }\n onOpenLoad={() => setLoadOpen(true)}\n onOpenUpdate={() => setUpdateOpen(true)}\n onExitEdit={() => {\n // Banner exit: discard the loaded message's draft and reopen\n // the loader so the user starts fresh or picks another message.\n setEditTarget(null);\n replaceAll([]);\n setLoadOpen(true);\n }}\n loadButtonLabel={loadButtonLabel}\n updateButtonLabel={updateButtonLabel}\n />\n <div className=\"flex min-h-0 flex-1 items-stretch\">\n {/* Desktop: persistent left aside. Mobile: collapsed to the\n palette sheet trigger in the toolbar. */}\n <div className=\"hidden min-h-0 md:flex\">\n <Palette\n onAddBlock={(block) => addBlock(block)}\n sections={paletteSections}\n showSearch={showPaletteSearch}\n searchPlaceholder={paletteSearchPlaceholder}\n defaultOpenSections={defaultOpenSections}\n />\n </div>\n <Surface\n blocks={blocks}\n workspaceName={workspaceName}\n // When a message is loaded for editing, show its author in\n // the preview header instead of the generic workspace name.\n authorName={activeEditTarget?.username}\n authorIcon={activeEditTarget?.iconUrl}\n previewHooks={mergedPreviewHooks}\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 onReorder={reorderBlock}\n isPaletteDrag={activePaletteVariant !== null}\n onOpenPalette={() => setPaletteOpen(true)}\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 {/* Mobile-only palette sheet. The desktop aside above stays put;\n this opens from the bottom on a tap of the toolbar's Blocks\n button. Tap-to-add closes the sheet so the user sees the new\n row land in the surface. */}\n <Sheet open={paletteOpen && isMobile} onOpenChange={setPaletteOpen}>\n <SheetContent\n side=\"bottom\"\n className=\"bk-portal-content flex h-[85svh] max-h-[85svh] flex-col gap-3 p-0 sm:max-w-none\"\n >\n <div className=\"flex flex-col gap-1 px-4 pt-5\">\n <SheetTitle>Add a block</SheetTitle>\n <SheetDescription>Tap a block to add it to the bottom of your draft.</SheetDescription>\n </div>\n <div className=\"flex min-h-0 flex-1 flex-col\">\n <Palette\n onAddBlock={(block) => {\n addBlock(block);\n setPaletteOpen(false);\n }}\n sections={paletteSections}\n showSearch={showPaletteSearch}\n searchPlaceholder={paletteSearchPlaceholder}\n defaultOpenSections={defaultOpenSections}\n variant=\"sheet\"\n />\n </div>\n </SheetContent>\n </Sheet>\n <JsonDrawer open={jsonOpen} onOpenChange={setJsonOpen} blocks={blockPayloads} onApply={replaceAll} />\n {/* The Send dialog always posts a brand-new message (used by both\n plain Send and the edit-mode \"Send as a new message\"). The Update\n dialog (channel locked) only exists while a message is loaded. */}\n <SendDialog\n open={sendOpen}\n onOpenChange={setSendOpen}\n blocks={blockPayloads}\n loadChannels={loadChannels}\n loadSendAsUserStatus={loadSendAsUserStatus}\n onSend={onSend}\n confirmSendLabel={confirmSendLabel}\n errorCount={validation.total}\n onShowIssues={() => {\n setSendOpen(false);\n setIssuesOpen(true);\n }}\n />\n {activeEditTarget && editing ? (\n <UpdateDialog\n open={updateOpen}\n onOpenChange={setUpdateOpen}\n target={activeEditTarget}\n blocks={blockPayloads}\n loadSendAsUserStatus={loadSendAsUserStatus}\n onUpdate={editing.onUpdate}\n confirmUpdateLabel={confirmUpdateLabel}\n errorCount={validation.total}\n onShowIssues={() => {\n setUpdateOpen(false);\n setIssuesOpen(true);\n }}\n />\n ) : null}\n {editing ? (\n <LoadMessageDialog\n open={loadOpen}\n onOpenChange={setLoadOpen}\n onLoadMessage={editing.onLoadMessage}\n loadRecentMessages={editing.loadRecentMessages}\n loadChannels={loadChannels}\n onLoaded={(result) => {\n replaceAll(result.blocks);\n setEditTarget({\n channelId: result.channelId,\n channelName: result.channelName,\n ts: result.ts,\n editableVia: result.editableVia,\n workspaceName: result.workspaceName,\n username: result.username,\n iconUrl: result.iconUrl\n });\n setLoadOpen(false);\n }}\n onOpenAsNew={(loadedBlocks) => {\n // Fallback for a not-editable verdict: drop edit mode and\n // hydrate the draft (when the host supplied blocks) so the\n // user can repost it as a brand-new message.\n if (loadedBlocks) {\n replaceAll(loadedBlocks);\n }\n setEditTarget(null);\n setLoadOpen(false);\n }}\n />\n ) : null}\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 </CustomEmojiProvider>\n </BrandThemeScope>\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 { cn } from '../lib/cn';\nimport type { PreviewSurface, PreviewTheme, Template } from '../types';\n\nconst UNCATEGORIZED = 'Other';\n\n/**\n * A live, scaled-down preview of a template's blocks rendered via\n * `slack-blocks-to-jsx`. The container is fixed-height with hidden\n * overflow so taller templates clip neatly into a thumbnail.\n */\nfunction TemplateThumbnail({ blocks, theme }: { blocks: Template['blocks']; theme: PreviewTheme }) {\n return (\n // `inert` removes the rendered template's interactive controls (buttons,\n // links, inputs) from the focus order and pointer events so the wrapping\n // card stays the only interactive element — required to avoid the\n // `nested-interactive` a11y violation, and `aria-hidden` keeps the card's\n // accessible name to just the visible name + description below.\n <div\n inert\n aria-hidden=\"true\"\n className=\"relative h-44 overflow-hidden rounded-md border bg-background shadow-inner\"\n >\n <div\n id=\"slack_blocks_to_jsx\"\n data-theme={theme}\n className=\"slack_blocks_to_jsx styles_enabled absolute top-0 left-0 w-[167%] origin-top-left scale-[0.6] p-3\"\n >\n <Message time={new Date()} name=\"\" logo=\"\" withoutWrapper theme={theme} blocks={blocks as unknown as Block[]} />\n </div>\n {/* Soft fade at the bottom so clipped content doesn't end on a hard edge. */}\n <div className=\"pointer-events-none absolute inset-x-0 bottom-0 h-10 bg-gradient-to-t from-background to-transparent\" />\n </div>\n );\n}\n\nconst SURFACE_LABEL: Record<PreviewSurface, string> = {\n message: 'Message',\n modal: 'Modal',\n app_home: 'App Home'\n};\n\n/**\n * One template card: padded preview inside a raised card frame, with a\n * surface badge, name, and optional description below. The whole card\n * is a button; clicking it invokes `onSelect`.\n */\nfunction TemplateCard({\n template,\n theme,\n onSelect\n}: {\n template: Template;\n theme: PreviewTheme;\n onSelect: (template: Template) => void;\n}) {\n // We render the card as a `div[role=\"button\"]` rather than a `<button>`\n // because the live thumbnail's rendered blocks may include real\n // `<button>` elements (e.g. action blocks). Nesting buttons is invalid\n // HTML and React's DOM validator warns about it. `inert` on the\n // thumbnail removes the descendants from the focus order, so the card\n // div stays the only interactive element.\n const handleActivate = () => onSelect(template);\n return (\n <div\n role=\"button\"\n tabIndex={0}\n onClick={handleActivate}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n handleActivate();\n }\n }}\n className=\"group flex cursor-pointer flex-col gap-3 rounded-xl border bg-card p-4 text-left shadow-sm ring-1 ring-black/5 transition-all duration-150 hover:-translate-y-0.5 hover:border-foreground/30 hover:shadow-lg focus-visible:-translate-y-0.5 focus-visible:shadow-lg focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <TemplateThumbnail blocks={template.blocks} theme={theme} />\n <div className=\"flex items-start justify-between gap-2\">\n <div className=\"flex min-w-0 flex-col gap-0.5\">\n <span className=\"truncate text-sm font-semibold text-foreground\">{template.name}</span>\n {template.description ? (\n <span className=\"line-clamp-2 text-xs text-foreground/75\">{template.description}</span>\n ) : null}\n </div>\n <span className=\"shrink-0 rounded-full border border-foreground/15 bg-background px-2 py-0.5 text-[10px] font-medium tracking-wide text-foreground/70 uppercase\">\n {SURFACE_LABEL[template.surface]}\n </span>\n </div>\n </div>\n );\n}\n\n/**\n * Group templates by `category`. Templates without a category fall into\n * an `\"Other\"` bucket placed last; if no template specifies a category\n * the function returns a single ungrouped bucket and the picker omits\n * the section heading.\n */\nfunction groupByCategory(templates: readonly Template[]): {\n grouped: boolean;\n sections: { category: string; templates: Template[] }[];\n} {\n const anyCategorized = templates.some((t) => !!t.category);\n if (!anyCategorized) {\n return { grouped: false, sections: [{ category: UNCATEGORIZED, templates: [...templates] }] };\n }\n const map = new Map<string, Template[]>();\n for (const t of templates) {\n const key = t.category ?? UNCATEGORIZED;\n const arr = map.get(key) ?? [];\n arr.push(t);\n map.set(key, arr);\n }\n // Stable order: categories in first-seen order, with `Other` pinned last.\n const seen: string[] = [];\n for (const t of templates) {\n const key = t.category ?? UNCATEGORIZED;\n if (!seen.includes(key)) seen.push(key);\n }\n seen.sort((a, b) => (a === UNCATEGORIZED ? 1 : b === UNCATEGORIZED ? -1 : 0));\n return {\n grouped: true,\n sections: seen.map((category) => ({ category, templates: map.get(category) ?? [] }))\n };\n}\n\n/**\n * Standalone, page-sized picker that displays {@link Template}s as a\n * grid of cards with live block previews, organized into category\n * sections — modeled on Slack's own Block Kit Builder templates page.\n * Pure UI: wire `onSelect` to whatever state owns the draft blocks\n * (e.g. lifted `initialBlocks` on {@link BlockKitchen}, your own\n * store, a router-driven URL param).\n *\n * Compose alongside {@link BlockKitchen} however fits your layout\n * (route, modal, slide-over, tab). This component intentionally does\n * not own its own dialog so the consumer controls placement and\n * dismissal.\n *\n * @param props - picker props\n * @param props.templates - templates to show. Order is preserved within\n * each category section.\n * @param props.onSelect - called when the user clicks a template card.\n * @param props.surface - optional surface filter. When set, only\n * templates whose {@link Template.surface} matches are shown.\n * @param props.theme - preview theme used inside the card thumbnails.\n * Defaults to `'light'`.\n * @param props.heading - optional heading rendered above the grid. When\n * omitted, no heading is rendered.\n * @param props.emptyLabel - text shown when no templates match the\n * surface filter. Defaults to `\"No templates available.\"`.\n * @param props.className - additional classes merged onto the root.\n */\nexport function TemplatePicker({\n templates,\n onSelect,\n surface,\n theme = 'light',\n heading,\n emptyLabel = 'No templates available.',\n className\n}: {\n templates: readonly Template[];\n onSelect: (template: Template) => void;\n surface?: PreviewSurface;\n theme?: PreviewTheme;\n heading?: string;\n emptyLabel?: string;\n className?: string;\n}) {\n const visible = surface ? templates.filter((t) => t.surface === surface) : templates;\n const { grouped, sections } = groupByCategory(visible);\n\n return (\n <div className={cn('flex h-full w-full flex-col gap-6 overflow-y-auto bg-muted/30 p-4 sm:gap-8 sm:p-8', className)}>\n {heading ? <h2 className=\"text-lg font-semibold tracking-tight text-foreground sm:text-xl\">{heading}</h2> : null}\n {visible.length === 0 ? (\n <p className=\"text-sm text-foreground/75\">{emptyLabel}</p>\n ) : (\n sections.map((section) => (\n <section key={section.category} className=\"flex flex-col gap-3 sm:gap-4\">\n {grouped ? (\n <h3 className=\"text-xs font-semibold tracking-wider text-foreground/60 uppercase\">{section.category}</h3>\n ) : null}\n {/* Container-driven grid: each column is at least 240px wide on\n mobile (280px on sm+) and grows to fill, so the picker\n adapts the same whether it's a narrow sidebar (1 col) or\n a full-page view (3-4 cols) without relying on viewport\n breakpoints. */}\n <div className=\"grid grid-cols-[repeat(auto-fill,minmax(240px,1fr))] gap-4 sm:grid-cols-[repeat(auto-fill,minmax(280px,1fr))] sm:gap-5\">\n {section.templates.map((template) => (\n <TemplateCard key={template.id} template={template} theme={theme} onSelect={onSelect} />\n ))}\n </div>\n </section>\n ))\n )}\n </div>\n );\n}\n","import type { SupportedBlock } from '../types';\n\n/**\n * Upper bound on the encoded string length we accept on decode. Block\n * Kit JSON in practice is well under 100 KB; we cap at 1 MiB of encoded\n * input so a pathologically large URL hash cannot freeze the tab in\n * `atob` + `JSON.parse` before the validator gets a look. Encoded\n * (base64url) is ~33% larger than the binary, so this bounds the decoded\n * JSON at roughly 768 KiB.\n */\nconst MAX_ENCODED_BYTES = 1024 * 1024;\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 if (encoded.length > MAX_ENCODED_BYTES) {\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"]}
|