@nkootstra/block-kit 0.3.3 → 0.3.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/{index-D139DZfD.d.ts → index-DXUlQCUq.d.ts} +12 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +176 -34
- package/dist/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/styles.css.map +1 -1
- package/dist/transport.d.ts +1 -1
- package/dist/web-api.d.ts +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["SearchIcon","KebabIcon","LockIcon","Fragment","Fragment","ordinal","formatDate","ordinal","ordinal","formatTime","ICONS","KebabIcon","KebabIcon","Fragment","node","LockIcon","SearchIcon","HEIGHT","Fragment","TextLink","Fragment"],"sources":["../src/elements/Unsupported.tsx","../src/payloads.ts","../src/icons/index.tsx","../src/validation.ts","../src/surfaces/Modal.tsx","../src/surfaces/ModalLayer.tsx","../src/context.tsx","../src/useClientLayoutEffect.ts","../src/Tooltip.tsx","../src/emoji/aliases.ts","../src/emoji/data.generated.ts","../src/emoji/lookup.ts","../src/emoji/Emoji.tsx","../src/Link.tsx","../src/UserMention.tsx","../src/Mrkdwn.tsx","../src/Text.tsx","../src/confirm/ConfirmDialog.tsx","../src/confirm/useConfirm.tsx","../src/elements/Button.tsx","../src/elements/useFocusOnLoad.ts","../src/elements/Checkboxes.tsx","../src/elements/calendar/Calendar.tsx","../src/elements/dateFormat.ts","../src/elements/inputBlockContext.ts","../src/elements/Popover.tsx","../src/elements/DatePicker.tsx","../src/elements/DateTimePicker.tsx","../src/elements/FeedbackButtons.tsx","../src/elements/FileInput.tsx","../src/elements/IconButton.tsx","../src/elements/ImageElement.tsx","../src/elements/useMenuNavigation.ts","../src/elements/Overflow.tsx","../src/elements/RadioButtons.tsx","../src/elements/RichTextToolbar.tsx","../src/elements/RichTextInput.tsx","../src/elements/Select.tsx","../src/elements/TextInput.tsx","../src/elements/TimePicker.tsx","../src/elements/WorkflowButton.tsx","../src/elements/index.ts","../src/elements/Element.tsx","../src/blocks/Actions.tsx","../src/blocks/Alert.tsx","../src/blocks/Callout.tsx","../src/blocks/Card.tsx","../src/data/icons.tsx","../src/blocks/Carousel.tsx","../src/blocks/Condition.tsx","../src/blocks/containerContext.ts","../src/blocks/ContactCard.tsx","../src/data/Collapse.tsx","../src/blocks/Container.tsx","../src/blocks/Context.tsx","../src/blocks/ContextActions.tsx","../src/data/richTextMini.tsx","../src/data/dataTableCells.tsx","../src/blocks/DataTableColumnHeader.tsx","../src/blocks/DataTable.tsx","../src/charts/palette.ts","../src/charts/paths.ts","../src/charts/scale.ts","../src/charts/useContainerWidth.ts","../src/charts/CartesianChart.tsx","../src/charts/PieChart.tsx","../src/data/HoverActions.tsx","../src/blocks/DataVisualization.tsx","../src/blocks/Divider.tsx","../src/blocks/FallbackCanary.tsx","../src/blocks/File.tsx","../src/blocks/Header.tsx","../src/blocks/Image.tsx","../src/blocks/Input.tsx","../src/blocks/CodeBlock.tsx","../src/blocks/Markdown.tsx","../src/data/statusIcon.tsx","../src/blocks/Plan.tsx","../src/blocks/RichText.tsx","../src/blocks/Section.tsx","../src/blocks/Table.tsx","../src/blocks/TaskCard.tsx","../src/blocks/Video.tsx","../src/blocks/index.ts","../src/blocks/Block.tsx","../src/Blocks.tsx","../src/Message.tsx","../src/surfaces/HomeTab.tsx","../src/surfaces/View.tsx"],"sourcesContent":["/** Visible placeholder for a type this library doesn't render, so gaps are obvious in previews. */\nexport function Unsupported({ type }: { type: string }) {\n return (\n <span className=\"sbk-unsupported\" title=\"Not rendered yet\">\n {type}\n </span>\n );\n}\n","import type { AnyBlock } from \"@slack/types\";\nimport type { BlockAction, StateValues } from \"./context\";\n\n/**\n * Builders for the exact JSON Slack sends to an app's request URL: `block_actions`,\n * `view_submission` and `view_closed`. Shapes are cross-checked against `@slack/bolt`'s\n * `BlockAction`, `ViewSubmitAction` and `ViewClosedAction` types and Slack's documented examples.\n *\n * These are plain functions (no React) so `@nkootstra/block-kit/server` and tests can use\n * them without pulling in the renderer.\n */\n\nexport interface PayloadTeam {\n id: string;\n domain: string;\n enterprise_id?: string;\n enterprise_name?: string;\n}\n\nexport interface PayloadUser {\n id: string;\n username?: string;\n /** Only present for Home tab actions, per Slack's docs. */\n name?: string;\n team_id?: string;\n}\n\n/** Identity fields Slack stamps onto every payload. Defaulted so a demo/emulator works with no setup. */\nexport interface PayloadIdentity {\n team?: PayloadTeam | null;\n user?: PayloadUser;\n apiAppId?: string;\n token?: string;\n triggerId?: string;\n responseUrl?: string;\n}\n\nconst DEFAULT_IDENTITY = {\n team: { id: \"T00000000\", domain: \"workspace\" } as PayloadTeam | null,\n user: { id: \"U00000000\", username: \"user\", name: \"user\", team_id: \"T00000000\" } as PayloadUser,\n apiAppId: \"A00000000\",\n token: \"verification-token\",\n triggerId: \"000000000000.000000000000.deadbeefdeadbeefdeadbeefdeadbeef\",\n responseUrl:\n \"https://hooks.slack.com/actions/T00000000/0000000000000/deadbeefdeadbeefdeadbeefdeadbeef\",\n};\n\ntype ResolvedIdentity = typeof DEFAULT_IDENTITY;\n\nfunction resolveIdentity(identity?: PayloadIdentity): ResolvedIdentity {\n return { ...DEFAULT_IDENTITY, ...identity };\n}\n\n/** The `message` surface's container: the message the block_actions/actions came from. */\nexport interface MessageContainer {\n type: \"message\";\n channelId?: string;\n messageTs: string;\n isEphemeral?: boolean;\n /** Raw message object, if available, sent back verbatim as payload.message. */\n message?: Record<string, unknown>;\n}\n\n/** A view as Slack would echo it back: enough fields to build view_submission/view_closed/block_actions. */\nexport interface ViewLike {\n /** Slack assigns this at `views.open` time; default to a placeholder id for standalone previews. */\n id?: string;\n type: \"modal\" | \"home\";\n callback_id?: string;\n private_metadata?: string;\n hash?: string;\n blocks: AnyBlock[];\n title?: { type: \"plain_text\"; text: string; emoji?: boolean } | null;\n close?: { type: \"plain_text\"; text: string; emoji?: boolean } | null;\n submit?: { type: \"plain_text\"; text: string; emoji?: boolean } | null;\n root_view_id?: string | null;\n previous_view_id?: string | null;\n clear_on_close?: boolean;\n notify_on_close?: boolean;\n external_id?: string;\n}\n\n/** The `modal`/`home` surface's container: the view the block_actions came from. */\nexport interface ViewContainer {\n type: \"view\";\n view: ViewLike;\n}\n\nexport type Container = MessageContainer | ViewContainer;\n\nfunction toViewOutput(view: ViewLike, state: StateValues, identity: ResolvedIdentity) {\n const viewId = view.id ?? \"V00000000\";\n return {\n id: viewId,\n team_id: identity.team?.id ?? \"\",\n app_installed_team_id: identity.team?.id ?? \"\",\n app_id: identity.apiAppId ?? null,\n bot_id: \"B00000000\",\n callback_id: view.callback_id ?? \"\",\n type: view.type,\n title: view.title ?? null,\n close: view.close ?? null,\n submit: view.submit ?? null,\n blocks: view.blocks,\n private_metadata: view.private_metadata ?? \"\",\n state: { values: state },\n hash: view.hash ?? \"0.0000000000\",\n clear_on_close: view.clear_on_close ?? false,\n notify_on_close: view.notify_on_close ?? false,\n root_view_id: view.root_view_id ?? viewId,\n previous_view_id: view.previous_view_id ?? null,\n external_id: view.external_id ?? \"\",\n };\n}\n\nexport interface BuildBlockActionsPayloadOptions {\n action: BlockAction;\n state: StateValues;\n container: Container;\n identity?: PayloadIdentity;\n}\n\ninterface BlockActionsPayloadBase {\n type: \"block_actions\";\n actions: BlockAction[];\n team: PayloadTeam | null;\n user: PayloadUser;\n token?: string;\n response_url?: string;\n trigger_id?: string;\n api_app_id?: string;\n}\n\nexport interface MessageBlockActionsPayload extends BlockActionsPayloadBase {\n channel?: { id: string; name: string };\n message: Record<string, unknown>;\n state: { values: StateValues };\n container: {\n type: \"message\";\n message_ts: string;\n channel_id?: string;\n is_ephemeral: boolean;\n };\n}\n\nexport interface ViewBlockActionsPayload extends BlockActionsPayloadBase {\n view: ReturnType<typeof toViewOutput>;\n container: { type: \"view\"; view_id: string };\n}\n\nexport type BlockActionsPayload = MessageBlockActionsPayload | ViewBlockActionsPayload;\n\n/** Slack's `block_actions` payload, for either a message's or a view's interactive elements. */\nexport function buildBlockActionsPayload(\n options: BuildBlockActionsPayloadOptions & { container: MessageContainer },\n): MessageBlockActionsPayload;\nexport function buildBlockActionsPayload(\n options: BuildBlockActionsPayloadOptions & { container: ViewContainer },\n): ViewBlockActionsPayload;\nexport function buildBlockActionsPayload(\n options: BuildBlockActionsPayloadOptions,\n): BlockActionsPayload;\nexport function buildBlockActionsPayload({\n action,\n state,\n container,\n identity,\n}: BuildBlockActionsPayloadOptions): BlockActionsPayload {\n const id = resolveIdentity(identity);\n const base = {\n type: \"block_actions\" as const,\n actions: [action],\n team: id.team,\n user: id.user,\n token: id.token,\n response_url: id.responseUrl,\n trigger_id: id.triggerId,\n api_app_id: id.apiAppId,\n };\n\n if (container.type === \"message\") {\n return {\n ...base,\n channel: container.channelId ? { id: container.channelId, name: \"\" } : undefined,\n message: container.message ?? { type: \"message\", ts: container.messageTs },\n state: { values: state },\n container: {\n type: \"message\" as const,\n message_ts: container.messageTs,\n channel_id: container.channelId,\n is_ephemeral: container.isEphemeral ?? false,\n },\n };\n }\n\n return {\n ...base,\n view: toViewOutput(container.view, state, id),\n container: { type: \"view\" as const, view_id: container.view.id ?? \"V00000000\" },\n };\n}\n\nexport interface BuildViewSubmissionPayloadOptions {\n view: ViewLike;\n state: StateValues;\n identity?: PayloadIdentity;\n responseUrls?: Array<{\n block_id: string;\n action_id: string;\n channel_id: string;\n response_url: string;\n }>;\n}\n\n/** Slack's `view_submission` payload, sent when the modal's Submit button is pressed. */\nexport function buildViewSubmissionPayload({\n view,\n state,\n identity,\n responseUrls,\n}: BuildViewSubmissionPayloadOptions) {\n const id = resolveIdentity(identity);\n return {\n type: \"view_submission\" as const,\n team: id.team,\n user: {\n id: id.user.id,\n name: id.user.name ?? id.user.username ?? \"\",\n team_id: id.user.team_id,\n },\n api_app_id: id.apiAppId,\n token: id.token,\n trigger_id: id.triggerId,\n view: toViewOutput(view, state, id),\n response_urls: responseUrls ?? [],\n };\n}\n\nexport interface BuildViewClosedPayloadOptions {\n view: ViewLike;\n state: StateValues;\n identity?: PayloadIdentity;\n /** True when Slack cleared the whole view stack (vs. just closing the top view). */\n isCleared?: boolean;\n}\n\n/** Slack's `view_closed` payload, sent when the modal's close (X) button is pressed. */\nexport function buildViewClosedPayload({\n view,\n state,\n identity,\n isCleared,\n}: BuildViewClosedPayloadOptions) {\n const id = resolveIdentity(identity);\n return {\n type: \"view_closed\" as const,\n team: id.team,\n user: {\n id: id.user.id,\n name: id.user.name ?? id.user.username ?? \"\",\n team_id: id.user.team_id,\n },\n api_app_id: id.apiAppId,\n token: id.token,\n view: toViewOutput(view, state, id),\n is_cleared: isCleared ?? false,\n };\n}\n\n/** The subset of `ack()` response actions a modal reacts to: validation errors, or view navigation. */\nexport type ViewResponseAction =\n | { response_action: \"errors\"; errors: Record<string, string> }\n | { response_action: \"update\"; view: ViewLike }\n | { response_action: \"push\"; view: ViewLike }\n | { response_action: \"clear\" };\n\n/** A static/external select option, as returned to a `block_suggestion` request. */\nexport interface SuggestionOption {\n text: { type: \"plain_text\"; text: string; emoji?: boolean };\n value: string;\n description?: { type: \"plain_text\"; text: string; emoji?: boolean };\n url?: string;\n}\n\n/** What an app answers a `block_suggestion` request with: flat options or labelled groups. */\nexport type OptionsResponse =\n | { options: SuggestionOption[] }\n | {\n option_groups: Array<{\n label: { type: \"plain_text\"; text: string; emoji?: boolean };\n options: SuggestionOption[];\n }>;\n };\n\nexport interface BuildBlockSuggestionPayloadOptions {\n actionId: string;\n blockId: string;\n /** What the user has typed into the select's search box so far. */\n value: string;\n container: Container;\n state: StateValues;\n identity?: PayloadIdentity;\n}\n\n/** Slack's `block_suggestion` payload, sent while the user types into an `external_select`. */\nexport function buildBlockSuggestionPayload({\n actionId,\n blockId,\n value,\n container,\n state,\n identity,\n}: BuildBlockSuggestionPayloadOptions) {\n const id = resolveIdentity(identity);\n const base = {\n type: \"block_suggestion\" as const,\n user: id.user,\n api_app_id: id.apiAppId,\n token: id.token,\n action_id: actionId,\n block_id: blockId,\n value,\n team: id.team,\n };\n\n if (container.type === \"message\") {\n return {\n ...base,\n container: {\n type: \"message\" as const,\n message_ts: container.messageTs,\n channel_id: container.channelId,\n is_ephemeral: container.isEphemeral ?? false,\n },\n channel: container.channelId ? { id: container.channelId, name: \"\" } : undefined,\n message: container.message ?? { type: \"message\", ts: container.messageTs },\n };\n }\n\n return {\n ...base,\n container: { type: \"view\" as const, view_id: container.view.id ?? \"V00000000\" },\n view: toViewOutput(container.view, state, id),\n };\n}\n\nexport type BlockSuggestionPayload = ReturnType<typeof buildBlockSuggestionPayload>;\n","/**\n * Inline SVG icons approximating Slack's \"Slack v2\" icon font glyphs. We can't ship the icon\n * font, so these are hand-drawn strokes matched to the reference snapshots' `<path>` bounding\n * boxes (20x20 viewBox, ~9x5 chevron, 13x13 glyphs) rather than a generic icon set.\n */\nimport type { SVGProps } from \"react\";\n\nexport function ChevronDownIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg viewBox=\"0 0 20 20\" width=\"20\" height=\"20\" fill=\"none\" aria-hidden=\"true\" {...props}>\n <path\n d=\"M6.25 8L10 11.75L13.75 8\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\n/**\n * Slack's calendar, traced from its icon font's `calendar` glyph (2000 units to the em, 1700 above\n * the baseline), so it lands in a square box exactly where the glyph sits in an em.\n */\nexport function CalendarIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg viewBox=\"0 0 2000 2000\" width=\"20\" height=\"20\" aria-hidden=\"true\" {...props}>\n <path\n transform=\"matrix(1 0 0 -1 0 1700)\"\n fill=\"currentColor\"\n d=\"M350 1600C212 1600 100 1487 100 1349V51C100 -87 212 -200 350 -200H1649C1787 -200 1900 -87 1900 51V1349C1900 1487 1787 1600 1649 1600ZM1649 1450C1705 1450 1750 1405 1750 1349V1200H250V1349C250 1405 295 1450 350 1450ZM350 -50C295 -50 250 -5 250 51V1050H1750V51C1750 -5 1705 -50 1649 -50ZM1001 900C945 900 901 855 901 800C901 744 945 700 1001 700C1056 700 1101 745 1101 800C1101 856 1056 900 1001 900ZM1401 900C1345 900 1301 855 1301 800C1301 744 1345 700 1401 700C1456 700 1501 745 1501 800C1501 856 1456 900 1401 900ZM601 600C545 600 501 555 501 500C501 444 545 400 601 400C656 400 701 445 701 500C701 556 656 600 601 600ZM1001 600C945 600 901 555 901 500C901 444 945 400 1001 400C1056 400 1101 445 1101 500C1101 556 1056 600 1001 600ZM1401 600C1345 600 1301 555 1301 500C1301 444 1345 400 1401 400C1456 400 1501 445 1501 500C1501 556 1456 600 1401 600ZM601 300C545 300 501 255 501 200C501 144 545 100 601 100C656 100 701 145 701 200C701 256 656 300 601 300ZM1001 300C945 300 901 255 901 200C901 144 945 100 1001 100C1056 100 1101 145 1101 200C1101 256 1056 300 1001 300ZM1401 300C1345 300 1301 255 1301 200C1301 144 1345 100 1401 100C1456 100 1501 145 1501 200C1501 256 1456 300 1401 300Z\"\n />\n </svg>\n );\n}\n\n/** Slack's clock: a full-size 1.5-stroke ring with an L-shaped hand pointing at three o'clock. */\nexport function ClockIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg viewBox=\"0 0 20 20\" width=\"20\" height=\"20\" fill=\"none\" aria-hidden=\"true\" {...props}>\n <circle cx=\"10\" cy=\"10\" r=\"8.25\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path\n d=\"M9.75 5.75V10.25H13.75\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nexport function SearchIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg viewBox=\"0 0 20 20\" width=\"16\" height=\"16\" fill=\"none\" aria-hidden=\"true\" {...props}>\n <circle cx=\"8.5\" cy=\"8.5\" r=\"5\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M12.5 12.5L16 16\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n );\n}\n\nexport function CheckIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg viewBox=\"0 0 14 14\" width=\"14\" height=\"14\" fill=\"none\" aria-hidden=\"true\" {...props}>\n <path\n d=\"M2.5 7.2L5.3 10L11.5 3.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\n/** Slack's `trash` glyph. */\nexport function TrashIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg viewBox=\"0 0 20 20\" width=\"16\" height=\"16\" aria-hidden=\"true\" {...props}>\n <path\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M8.75 1A2.25 2.25 0 0 0 6.5 3.25v.25H4.25A2.25 2.25 0 0 0 2 5.75v1.5c0 .414.336.75.75.75h.75v8.25a2.25 2.25 0 0 0 2.25 2.25h8.5a2.25 2.25 0 0 0 2.25-2.25V8h.75a.75.75 0 0 0 .75-.75v-1.5a2.25 2.25 0 0 0-2.25-2.25H13.5v-.25A2.25 2.25 0 0 0 11.25 1zM12 3.5v-.25a.75.75 0 0 0-.75-.75h-2.5a.75.75 0 0 0-.75.75v.25zM7.25 5h-3a.75.75 0 0 0-.75.75v.75h13v-.75a.75.75 0 0 0-.75-.75zM5 8h10v8.25a.75.75 0 0 1-.75.75h-8.5a.75.75 0 0 1-.75-.75zm3.25 1.5a.75.75 0 0 1 .75.75v4.5a.75.75 0 0 1-1.5 0v-4.5a.75.75 0 0 1 .75-.75m4.25.75a.75.75 0 0 0-1.5 0v4.5a.75.75 0 0 0 1.5 0z\"\n />\n </svg>\n );\n}\n\n/** Slack's `thumbs-up` glyph. */\nexport function ThumbsUpIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg viewBox=\"0 0 20 20\" width=\"16\" height=\"16\" aria-hidden=\"true\" {...props}>\n <path\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M10.457 3.036a.903.903 0 0 1 1.69.626l-.362 1.205-.996 2.987a.75.75 0 0 0 .825.978l3.644-.559a1.25 1.25 0 0 1 1.413 1.493l-.861 4.092a3.25 3.25 0 0 1-2.543 2.518l-.057.011a11.3 11.3 0 0 1-4.42-.001l-2.04-.41V7.951l.14-.111a11.7 11.7 0 0 0 3.377-4.377zM6.043 6.595a10.2 10.2 0 0 0 2.854-3.742l.19-.427a2.403 2.403 0 0 1 4.496 1.667l-.365 1.216-.007.022-.61 1.832 2.43-.373a2.75 2.75 0 0 1 3.108 3.285l-.862 4.092a4.75 4.75 0 0 1-3.716 3.68l-.057.01a12.8 12.8 0 0 1-5.008 0l-1.763-.354a.75.75 0 0 1-.733.59H3.653A2.653 2.653 0 0 1 1 15.442V7.344a.75.75 0 0 1 .75-.75H6zM5.25 8.094v8.5H3.653A1.153 1.153 0 0 1 2.5 15.44V8.094z\"\n />\n </svg>\n );\n}\n\n/** Slack's `thumbs-down` glyph. */\nexport function ThumbsDownIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg viewBox=\"0 0 20 20\" width=\"16\" height=\"16\" aria-hidden=\"true\" {...props}>\n <path\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M10.957 16.57a.903.903 0 0 0 1.69-.627l-.362-1.205-.996-2.986a.75.75 0 0 1 .825-.979l3.644.56a1.25 1.25 0 0 0 1.413-1.494l-.861-4.092a3.25 3.25 0 0 0-2.543-2.517l-.057-.012a11.3 11.3 0 0 0-4.42.002l-2.04.41v8.024l.14.112a11.7 11.7 0 0 1 3.377 4.377zm-4.414-3.56a10.2 10.2 0 0 1 2.854 3.742l.19.427a2.403 2.403 0 0 0 4.496-1.667l-.365-1.216-.007-.022-.61-1.832 2.43.373a2.75 2.75 0 0 0 3.108-3.285l-.862-4.092a4.75 4.75 0 0 0-3.716-3.679l-.057-.011a12.8 12.8 0 0 0-5.008.001l-1.763.354a.75.75 0 0 0-.733-.591H4.153A2.653 2.653 0 0 0 1.5 4.165v8.097a.75.75 0 0 0 .75.75H6.5q.022 0 .043-.002m-.793-1.498v-8.5H4.153C3.516 3.012 3 3.528 3 4.165v7.347z\"\n />\n </svg>\n );\n}\n\nexport function KebabIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg\n viewBox=\"0 0 20 20\"\n width=\"13\"\n height=\"13\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n {...props}\n >\n <circle cx=\"4\" cy=\"10\" r=\"1.7\" />\n <circle cx=\"10\" cy=\"10\" r=\"1.7\" />\n <circle cx=\"16\" cy=\"10\" r=\"1.7\" />\n </svg>\n );\n}\n\n/** Slack's `file-upload` glyph (document with an up arrow), used by file_input. */\nexport function FileUploadIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg viewBox=\"0 0 20 20\" width=\"16\" height=\"16\" aria-hidden=\"true\" {...props}>\n <path\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M6.25 1.5A3.75 3.75 0 0 0 2.5 5.25v5a.75.75 0 0 0 1.5 0v-5A2.25 2.25 0 0 1 6.25 3h6.5c.393 0 .764.185 1 .5l2 2.667c.162.216.25.48.25.75v7.833A2.25 2.25 0 0 1 13.75 17h-4a.75.75 0 0 0 0 1.5h4a3.75 3.75 0 0 0 3.75-3.75V6.917a2.75 2.75 0 0 0-.55-1.65l-2-2.667a2.75 2.75 0 0 0-2.2-1.1zm6.25 3.25a.75.75 0 0 0-1.5 0v2.5c0 .414.336.75.75.75h2.5a.75.75 0 0 0 0-1.5H12.5zm-8 9.81v3.19a.75.75 0 0 0 1.5 0v-3.19l1.22 1.22a.75.75 0 0 0 1.06-1.06l-2.5-2.5a.75.75 0 0 0-1.06 0l-2.5 2.5a.75.75 0 1 0 1.06 1.06z\"\n />\n </svg>\n );\n}\n\nexport function ExternalLinkIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg viewBox=\"0 0 20 20\" width=\"13\" height=\"13\" fill=\"none\" aria-hidden=\"true\" {...props}>\n <path\n d=\"M8 5H5.5C4.7 5 4 5.7 4 6.5V14.5C4 15.3 4.7 16 5.5 16H13.5C14.3 16 15 15.3 15 14.5V12\"\n stroke=\"currentColor\"\n strokeWidth=\"1.3\"\n />\n <path\n d=\"M11 4H16V9M16 4L9 11\"\n stroke=\"currentColor\"\n strokeWidth=\"1.3\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nexport function LockIcon(props: SVGProps<SVGSVGElement>) {\n // Slack's lock on its 20-unit grid: a 1.5-stroke body with a 3.75-radius shackle.\n return (\n <svg viewBox=\"0 0 20 20\" width=\"13\" height=\"13\" fill=\"none\" aria-hidden=\"true\" {...props}>\n <rect\n x=\"3.75\"\n y=\"8.25\"\n width=\"12.5\"\n height=\"9\"\n rx=\"1.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n />\n <path d=\"M6.25 8.25V6a3.75 3.75 0 0 1 7.5 0v2.25\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n </svg>\n );\n}\n\nexport function ChannelHashIcon(props: SVGProps<SVGSVGElement>) {\n // Slack's channel \"#\": two bars and two slashes leaning 10 degrees, all 1.5 wide.\n return (\n <svg viewBox=\"0 0 20 20\" width=\"18\" height=\"18\" fill=\"none\" aria-hidden=\"true\" {...props}>\n <path\n d=\"M9 2.75L6.5 17.25M13.75 2.75L11.25 17.25M3.75 6.75H16.25M2.75 13.75H15.25\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n\n/** Slack's `close` icon, its filled path as Slack ships it. */\nexport function CloseIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg viewBox=\"0 0 20 20\" width=\"18\" height=\"18\" aria-hidden=\"true\" {...props}>\n <path\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M16.53 3.47a.75.75 0 0 1 0 1.06L11.06 10l5.47 5.47a.75.75 0 0 1-1.06 1.06L10 11.06l-5.47 5.47a.75.75 0 0 1-1.06-1.06L8.94 10 3.47 4.53a.75.75 0 0 1 1.06-1.06L10 8.94l5.47-5.47a.75.75 0 0 1 1.06 0\"\n />\n </svg>\n );\n}\n\nexport function EmailIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg viewBox=\"0 0 20 20\" width=\"14\" height=\"14\" fill=\"none\" aria-hidden=\"true\" {...props}>\n <rect x=\"2.5\" y=\"5\" width=\"15\" height=\"10\" rx=\"1.5\" stroke=\"currentColor\" strokeWidth=\"1.4\" />\n <path\n d=\"M3.2 5.8L10 11L16.8 5.8\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nexport function LinkGlyphIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg viewBox=\"0 0 20 20\" width=\"14\" height=\"14\" fill=\"none\" aria-hidden=\"true\" {...props}>\n <path d=\"M8.5 11.5L11.5 8.5\" stroke=\"currentColor\" strokeWidth=\"1.4\" strokeLinecap=\"round\" />\n <path\n d=\"M9.5 6.5L11 5C12.4 3.6 14.6 3.6 16 5V5C17.4 6.4 17.4 8.6 16 10L14.5 11.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M10.5 13.5L9 15C7.6 16.4 5.4 16.4 4 15V15C2.6 13.6 2.6 11.4 4 10L5.5 8.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n\nexport function ReturnIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg viewBox=\"0 0 20 20\" width=\"12\" height=\"12\" fill=\"none\" aria-hidden=\"true\" {...props}>\n <path\n d=\"M4 8.5V10.5C4 11.6 4.9 12.5 6 12.5H15M15 12.5L11.5 9.5M15 12.5L11.5 15.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nexport function WorkflowIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg viewBox=\"0 0 20 20\" width=\"14\" height=\"14\" fill=\"none\" aria-hidden=\"true\" {...props}>\n <rect x=\"2.5\" y=\"8.5\" width=\"4\" height=\"4\" rx=\"1\" stroke=\"currentColor\" strokeWidth=\"1.3\" />\n <rect x=\"13.5\" y=\"8.5\" width=\"4\" height=\"4\" rx=\"1\" stroke=\"currentColor\" strokeWidth=\"1.3\" />\n <path\n d=\"M6.5 10.5H8.5C9.6 10.5 10.4 9.7 10.4 8.6V5.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.3\"\n />\n <path\n d=\"M6.5 10.5H8.5C9.6 10.5 10.4 11.3 10.4 12.4V15.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.3\"\n />\n <circle cx=\"10.5\" cy=\"3.5\" r=\"1.7\" stroke=\"currentColor\" strokeWidth=\"1.3\" />\n </svg>\n );\n}\n\n/** Slack's `download` glyph (cloud with a down arrow), from the table action group. */\nexport function DownloadIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg viewBox=\"0 0 20 20\" width=\"18\" height=\"18\" aria-hidden=\"true\" {...props}>\n <path\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n d=\"M11.75 4a3.75 3.75 0 0 0-3.512 2.432.75.75 0 0 1-.941.447 2.5 2.5 0 0 0-2.937 3.664.75.75 0 0 1-.384 1.093A2.251 2.251 0 0 0 4.75 16h9.5a3.25 3.25 0 0 0 1.44-6.164.75.75 0 0 1-.379-.908A3.75 3.75 0 0 0 11.75 4M7.108 5.296a5.25 5.25 0 0 1 9.786 3.508A4.75 4.75 0 0 1 14.25 17.5h-9.5a3.75 3.75 0 0 1-2.02-6.91 4 4 0 0 1 4.378-5.294M10.25 7.5a.75.75 0 0 1 .75.75v3.69l1.22-1.22a.75.75 0 1 1 1.06 1.06l-2.5 2.5a.75.75 0 0 1-1.06 0l-2.5-2.5a.75.75 0 1 1 1.06-1.06l1.22 1.22V8.25a.75.75 0 0 1 .75-.75\"\n clipRule=\"evenodd\"\n />\n </svg>\n );\n}\n\n/** Slack's `copy` glyph (two stacked squares). */\nexport function CopyIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg viewBox=\"0 0 20 20\" width=\"18\" height=\"18\" aria-hidden=\"true\" {...props}>\n <path\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n d=\"M7.75 1.5A2.25 2.25 0 0 0 5.5 3.75v8.5a2.25 2.25 0 0 0 2.25 2.25h8.5a2.25 2.25 0 0 0 2.25-2.25v-8.5a2.25 2.25 0 0 0-2.25-2.25zM7 3.75A.75.75 0 0 1 7.75 3h8.5a.75.75 0 0 1 .75.75v8.5a.75.75 0 0 1-.75.75h-8.5a.75.75 0 0 1-.75-.75zM3.75 5.5A2.25 2.25 0 0 0 1.5 7.75v8.5a2.25 2.25 0 0 0 2.25 2.25h8.5a2.25 2.25 0 0 0 2.25-2.25V16H13v.25a.75.75 0 0 1-.75.75h-8.5a.75.75 0 0 1-.75-.75v-8.5A.75.75 0 0 1 3.75 7H4V5.5z\"\n clipRule=\"evenodd\"\n />\n </svg>\n );\n}\n\n/** Slack's `open-in-window` glyph, from the image action group. */\nexport function OpenInWindowIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg viewBox=\"0 0 20 20\" width=\"20\" height=\"20\" aria-hidden=\"true\" {...props}>\n <path\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n d=\"M2.5 8.507C2.5 7.675 3.175 7 4.007 7H5.5v.793l-3 3zm3 2.949V9.207l-3 3v2.586l3.017-3.017a3 3 0 0 1-.017-.32m-2.982 4.733 3.326-3.326q.055.105.117.205a3.06 3.06 0 0 0 1.167 1.097l-3.317 3.318a1.550 1.550 0 0 1-1.293-1.294M5.207 17.5l3-3q.171.02.35.02h2.216l-2.980 2.980zm4 0h2.250c.852 0 1.543-.691 1.543-1.544v-1.435h-.813zm5.293-3v1.456A3.044 3.044 0 0 1 11.456 19H4.044A3.044 3.044 0 0 1 1 15.956v-7.45A3.007 3.007 0 0 1 4.007 5.5H5.5V4.044A3.044 3.044 0 0 1 8.544 1h7.412A3.044 3.044 0 0 1 19 4.044v7.412a3.044 3.044 0 0 1-3.044 3.044zm-7.263-2.222c.273.434.757.722 1.307.722h7.412c.852 0 1.544-.691 1.544-1.544V4.044c0-.853-.692-1.544-1.544-1.544H8.544C7.690 2.5 7 3.191 7 4.044v2.760q.013.096.013.196v4.477c0 .293.082.568.224.801m3.337-6.396a.75.75 0 0 1 0-1.500h4.266a.75.75 0 0 1 .75.75v4.266a.75.75 0 0 1-1.500 0V6.911l-3.443 3.443a.75.75 0 1 1-1.060-1.060l3.410-3.412z\"\n clipRule=\"evenodd\"\n />\n </svg>\n );\n}\n\n/** Slack's `ellipsis-vertical-filled` glyph (\"More actions\"). */\nexport function EllipsisVerticalIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg viewBox=\"0 0 20 20\" width=\"18\" height=\"18\" aria-hidden=\"true\" {...props}>\n <path\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n d=\"M10 5.5A1.75 1.75 0 1 1 10 2a1.75 1.75 0 0 1 0 3.5m0 6.25a1.75 1.75 0 1 1 0-3.5 1.75 1.75 0 0 1 0 3.5m-1.75 4.5a1.75 1.75 0 1 0 3.5 0 1.75 1.75 0 0 0-3.5 0\"\n clipRule=\"evenodd\"\n />\n </svg>\n );\n}\n","import type { ElementState, StateValues } from \"./context\";\nimport type { Json } from \"./types\";\n\n/**\n * The checks Slack's client runs on a modal before it sends `view_submission`: required inputs,\n * text length, number format/range, and email/URL format. A failing field shows its message under\n * the input and the submission never reaches the app.\n *\n * Slack doesn't document the exact wording; these follow its client's phrasing as closely as we\n * know it and live here so they can be adjusted in one place.\n */\nexport const VALIDATION_MESSAGES = {\n required: \"Please complete this required field.\",\n minLength: (n: number) => `Please enter at least ${n} character${n === 1 ? \"\" : \"s\"}.`,\n maxLength: (n: number) => `Please enter no more than ${n} character${n === 1 ? \"\" : \"s\"}.`,\n number: \"Please enter a number.\",\n wholeNumber: \"Please enter a whole number.\",\n minValue: (min: string) => `Please enter a number greater than or equal to ${min}.`,\n maxValue: (max: string) => `Please enter a number less than or equal to ${max}.`,\n email: \"Please enter a valid email address.\",\n url: \"Please enter a valid URL.\",\n};\n\n/** Same rule as `<input type=\"email\">`: something@something, no spaces. */\nconst EMAIL = /^[^\\s@]+@[^\\s@]+$/;\n\n/** Whether a rich_text value holds any non-blank text, or anything that isn't text (a mention, emoji…). */\nfunction hasText(node: unknown): boolean {\n if (!node || typeof node !== \"object\") return false;\n const { type, text, elements } = node as Json;\n if (type === \"text\") return typeof text === \"string\" && text.trim() !== \"\";\n if (Array.isArray(elements)) return elements.some(hasText);\n return type !== \"rich_text\" && !String(type).startsWith(\"rich_text_\");\n}\n\nfunction isEmpty(state: ElementState | undefined): boolean {\n if (!state) return true;\n return Object.entries(state).every(([key, value]) => {\n if (key === \"type\") return true;\n if (value === null || value === undefined || value === \"\") return true;\n if (Array.isArray(value)) return value.length === 0;\n // rich_text_input: a rich_text block whose sections hold no text at all.\n if (typeof value === \"object\" && (value as Json).type === \"rich_text\") {\n return !hasText(value);\n }\n return false;\n });\n}\n\nfunction isUrl(value: string): boolean {\n try {\n const url = new URL(value);\n return url.protocol === \"http:\" || url.protocol === \"https:\";\n } catch {\n return false;\n }\n}\n\nfunction checkValue(element: Json, value: string): string | undefined {\n switch (element.type) {\n case \"plain_text_input\": {\n if (typeof element.min_length === \"number\" && value.length < element.min_length) {\n return VALIDATION_MESSAGES.minLength(element.min_length);\n }\n if (typeof element.max_length === \"number\" && value.length > element.max_length) {\n return VALIDATION_MESSAGES.maxLength(element.max_length);\n }\n return undefined;\n }\n case \"email_text_input\":\n return EMAIL.test(value) ? undefined : VALIDATION_MESSAGES.email;\n case \"url_text_input\":\n return isUrl(value) ? undefined : VALIDATION_MESSAGES.url;\n case \"number_input\": {\n const n = Number(value);\n if (value.trim() === \"\" || Number.isNaN(n)) return VALIDATION_MESSAGES.number;\n if (!element.is_decimal_allowed && !Number.isInteger(n)) {\n return VALIDATION_MESSAGES.wholeNumber;\n }\n if (element.min_value !== undefined && n < Number(element.min_value)) {\n return VALIDATION_MESSAGES.minValue(String(element.min_value));\n }\n if (element.max_value !== undefined && n > Number(element.max_value)) {\n return VALIDATION_MESSAGES.maxValue(String(element.max_value));\n }\n return undefined;\n }\n default:\n return undefined;\n }\n}\n\n/**\n * Validates a view's `input` blocks against `state.values` the way Slack's client does before a\n * submission. Returns errors keyed by block_id (the shape of `response_action: \"errors\"`); empty\n * when the view may be submitted.\n */\nexport function validateView(\n blocks: readonly Json[] | readonly unknown[],\n state: StateValues,\n): Record<string, string> {\n const errors: Record<string, string> = {};\n (blocks as Json[]).forEach((block, index) => {\n if (block.type !== \"input\" || !block.element) return;\n const blockId = typeof block.block_id === \"string\" ? block.block_id : `block-${index}`;\n const element = block.element as Json;\n const entry = state[blockId]?.[(element.action_id as string | undefined) ?? \"\"];\n\n if (isEmpty(entry)) {\n if (!block.optional) errors[blockId] = VALIDATION_MESSAGES.required;\n return;\n }\n const value = entry?.value;\n if (typeof value === \"string\") {\n const error = checkValue(element, value);\n if (error) errors[blockId] = error;\n }\n });\n return errors;\n}\n","import { useState } from \"react\";\nimport { Blocks } from \"../Blocks\";\nimport { CloseIcon } from \"../icons\";\nimport {\n type StateValues,\n type SubmitResult,\n SurfaceScope,\n useBlockKit,\n useLiveView,\n} from \"../context\";\nimport { buildViewClosedPayload, buildViewSubmissionPayload, type ViewLike } from \"../payloads\";\nimport { validateView } from \"../validation\";\n\nexport interface ModalView extends ViewLike {\n type: \"modal\";\n}\n\nexport interface ModalProps {\n view: ModalView;\n /** App icon shown before the title, as in Slack's own modal chrome. */\n icon?: string;\n}\n\n/** A Slack modal: header (icon + title + close), a scrollable body of blocks, and a close/submit footer. */\nexport function Modal({ view: viewProp, icon }: ModalProps) {\n const { state, identity, onSubmit, onClose, views, stackedView, respond } = useBlockKit();\n // A modal opened through `views`: the X closes the whole stack (Slack's `is_cleared`), the\n // footer's close button goes back one view, and Submit applies the app's `response_action`.\n // Any other modal is standalone: `views.update` can still swap its content.\n const stacked = stackedView?.view.id === viewProp.id && viewProp.id !== undefined;\n const { view, update } = useLiveView(viewProp, !stacked);\n const [appErrors, setAppErrors] = useState<Record<string, string>>({});\n // Slack's own pre-submit checks. An error hides once its field changes.\n const [checked, setChecked] = useState<{ errors: Record<string, string>; state: StateValues }>();\n const clientErrors = Object.fromEntries(\n Object.entries(checked?.errors ?? {}).filter(([id]) => state[id] === checked?.state[id]),\n );\n const errors = stacked ? clientErrors : { ...appErrors, ...clientErrors };\n\n // Stacked modals are an app's own views, so they report `view_closed` only when it asked to\n // (`notify_on_close`), as Slack does. A standalone modal always reports it: its host needs to\n // know to hide it.\n const notify = !stacked || view.notify_on_close === true;\n const dismiss = () => {\n const isCleared = stacked && view.previous_view_id != null;\n if (notify) onClose?.(buildViewClosedPayload({ view, state, identity, isCleared }));\n if (stacked) views.clear();\n };\n const back = () => {\n if (notify) onClose?.(buildViewClosedPayload({ view, state, identity }));\n if (stacked && view.id) respond?.(view.id, undefined);\n };\n const submit = async () => {\n const invalid = validateView(view.blocks, state);\n setChecked({ errors: invalid, state });\n if (Object.keys(invalid).length > 0) return;\n\n setAppErrors({});\n let result: SubmitResult;\n try {\n result = await onSubmit?.(buildViewSubmissionPayload({ view, state, identity }), { views });\n } catch {\n // The app couldn't be reached or failed: like Slack, leave the modal open to retry.\n return;\n }\n if (stacked && view.id) {\n respond?.(view.id, result);\n return;\n }\n if (!result) return;\n if (result.response_action === \"errors\") setAppErrors(result.errors);\n else if (result.response_action === \"update\") update(result.view);\n else if (result.response_action === \"push\") views.push(result.view);\n else if (result.response_action === \"clear\") views.clear();\n };\n\n return (\n <div className=\"sbk-root sbk-modal\" data-surface=\"modal\">\n <div className=\"sbk-modal__header\">\n <div className=\"sbk-modal__title-row\">\n {icon && <img className=\"sbk-modal__icon\" src={icon} alt=\"\" />}\n <h2 className=\"sbk-modal__title\">{view.title?.text}</h2>\n </div>\n <button type=\"button\" className=\"sbk-modal__close\" aria-label=\"Close\" onClick={dismiss}>\n <CloseIcon width=\"20\" height=\"20\" />\n </button>\n </div>\n <div className=\"sbk-modal__body\">\n <SurfaceScope container={{ type: \"view\", view }} errors={errors}>\n <Blocks blocks={view.blocks} />\n </SurfaceScope>\n </div>\n {(view.close || view.submit) && (\n <div className=\"sbk-modal__footer\">\n {view.close && (\n <button\n type=\"button\"\n className=\"sbk-modal__button sbk-modal__button--secondary\"\n onClick={back}\n >\n {view.close.text}\n </button>\n )}\n {view.submit && (\n <button\n type=\"button\"\n className=\"sbk-modal__button sbk-modal__button--primary\"\n onClick={submit}\n >\n {view.submit.text}\n </button>\n )}\n </div>\n )}\n </div>\n );\n}\n","import type { ReactNode } from \"react\";\nimport type { StackedView } from \"../context\";\n\nexport interface ModalLayerProps {\n stack: StackedView[];\n renderEntry: (entry: StackedView) => ReactNode;\n}\n\n/**\n * The dimmed overlay that modals opened through `views` sit on. Every view in the stack stays\n * mounted (only the top one is shown) so going back after a push keeps the earlier view's input.\n */\nexport function ModalLayer({ stack, renderEntry }: ModalLayerProps) {\n return (\n <div className=\"sbk-modal-layer\">\n {stack.map((entry, i) => (\n <div key={entry.view.id} className=\"sbk-modal-layer__view\" hidden={i !== stack.length - 1}>\n {renderEntry(entry)}\n </div>\n ))}\n </div>\n );\n}\n","import type { AnyBlock } from \"@slack/types\";\nimport {\n type ComponentType,\n createContext,\n type ReactNode,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport {\n type BlockSuggestionPayload,\n buildBlockActionsPayload,\n buildBlockSuggestionPayload,\n buildViewClosedPayload,\n buildViewSubmissionPayload,\n type Container,\n type OptionsResponse,\n type PayloadIdentity,\n type ViewLike,\n type ViewResponseAction,\n} from \"./payloads\";\nimport { Modal, type ModalView } from \"./surfaces/Modal\";\nimport { ModalLayer } from \"./surfaces/ModalLayer\";\n\n/**\n * The action object Slack puts in `block_actions.actions[]`. The extra fields depend on the\n * element type (`value`, `selected_option`, `selected_date`, ...), exactly as Slack sends them.\n */\nexport interface BlockAction {\n type: string;\n action_id: string;\n block_id: string;\n action_ts: string;\n text?: { type: \"plain_text\"; text: string; emoji?: boolean };\n value?: string;\n url?: string;\n style?: \"primary\" | \"danger\";\n [field: string]: unknown;\n}\n\n/** One entry of `view.state.values[block_id][action_id]`, e.g. `{ type: \"datepicker\", selected_date: \"2024-01-01\" }`. */\nexport interface ElementState {\n type: string;\n [field: string]: unknown;\n}\n\n/** Slack's `state.values`: element values keyed by block_id, then action_id. */\nexport type StateValues = Record<string, Record<string, ElementState>>;\n\nexport type Surface = \"message\" | \"modal\" | \"home\";\n\n/** What a user mention's profile card shows; everything but the name is optional. */\nexport interface UserProfile {\n /** Display name, shown bold at the top of the card. */\n name: string;\n /** Full name, shown under the display name when it differs. */\n realName?: string;\n title?: string;\n pronouns?: string;\n avatarUrl?: string;\n /** Custom status, e.g. `{ emoji: \"palm_tree\", text: \"On vacation\" }`. */\n status?: { emoji?: string; text?: string };\n /** IANA zone used for the card's \"local time\" row, e.g. `Europe/Amsterdam`. */\n timeZone?: string;\n}\n\n/** Resolves ids in mrkdwn and rich text to display names. Return undefined when unknown. */\nexport interface Resolvers {\n user?: (id: string) => string | undefined;\n /**\n * Profile details for the card that opens when a user mention is clicked. Falls back to the\n * name from `user` when omitted.\n */\n userProfile?: (id: string) => UserProfile | undefined;\n channel?: (id: string) => string | undefined;\n usergroup?: (id: string) => string | undefined;\n}\n\nexport interface EmojiOptions {\n /**\n * Builds the image URL for a unified code point sequence such as `1f44d-1f3fd`. Defaults to the\n * Apple set from emoji-datasource-apple on jsDelivr.\n */\n imageUrl?: (unified: string) => string;\n /** Workspace custom emoji: name → image URL, or `alias:<name>`. */\n custom?: Record<string, string>;\n}\n\n/** A modal opened through {@link ViewsApi}, with the validation errors last returned for it. */\nexport interface StackedView {\n view: ViewLike & { id: string };\n errors: Record<string, string>;\n}\n\n/**\n * Slack's `views.*` calls, for answering an interaction the way an app would: open a modal from a\n * button, push a second one on top, or update one in place (e.g. after a `dispatch_action` input).\n * Opened modals render on top of the provider's children, up to Slack's limit of 3.\n */\nexport interface ViewsApi {\n /** `views.open`: replaces any open modals with this one. Returns the new view's id. */\n open: (view: ViewLike) => string;\n /** `views.push`: stacks a modal on top of the current one. Returns the new view's id. */\n push: (view: ViewLike) => string;\n /**\n * `views.update`: swaps a modal's content, keeping its id and any input values whose\n * `block_id`/`action_id` are unchanged. Targets `viewId` or `externalId`, else the top modal.\n */\n update: (view: ViewLike, target?: { viewId?: string; externalId?: string }) => void;\n /** Closes the top modal, returning to the one below it. */\n close: () => void;\n /** Closes every open modal. */\n clear: () => void;\n /** `views.publish`: replaces the content of the `<HomeTab>` rendered under this provider. */\n publish: (view: ViewLike) => void;\n}\n\n/** New content for a message, as an app would send with `chat.update` or a `response_url`. */\nexport interface MessageUpdate {\n blocks?: AnyBlock[];\n text?: string;\n}\n\n/**\n * Answers an interaction by changing the message it came from, like posting to its `response_url`\n * with `replace_original` / `delete_original`, or calling `chat.update` / `chat.delete`.\n */\nexport interface MessageApi {\n /** Replaces the message's blocks and fallback text. */\n update: (message: MessageUpdate) => void;\n /** Removes the message. */\n delete: () => void;\n}\n\n/** What an interaction happened in: the message/view it came from, and a handle to change the message. */\nexport interface SurfaceScopeValue {\n container: Container;\n message?: MessageApi;\n}\n\nexport interface ActionContext {\n /** State of every input on the surface at the time of the action, like `state.values`. */\n state: StateValues;\n /** Opens, pushes or updates modals in response, like an app calling `views.*`. */\n views: ViewsApi;\n /** Set for actions in a `<Message>`: replaces or deletes that message. */\n message?: MessageApi;\n}\n\n/** The second argument of `onPayload`. */\nexport interface PayloadContext {\n views: ViewsApi;\n /** Set for actions in a `<Message>`: replaces or deletes that message. */\n message?: MessageApi;\n}\n\n/** What `onSubmit` may return: Slack's `response_action` ack, or nothing to just close the modal. */\nexport type SubmitResult = ViewResponseAction | undefined | void;\n\n/** What block-kit passes to a `linkComponent`: an anchor's props, ready to spread. */\nexport interface LinkProps {\n href: string;\n className?: string;\n target?: string;\n rel?: string;\n children?: ReactNode;\n}\n\n/** A resolved mention, as `mentionHref` gets it. */\nexport interface MentionRef {\n type: \"user\" | \"channel\" | \"usergroup\";\n /** Slack id, e.g. `U0123ABC`, `C0123ABC` or `S0123ABC`. */\n id: string;\n}\n\nexport interface BlockKitContextValue {\n surface: Surface;\n /** The provider's `theme`. Popovers, tooltips and dialogs render outside its wrapper, so they set it themselves. */\n theme?: \"light\" | \"dark\";\n onAction?: (action: BlockAction, context: ActionContext) => void;\n /** Same actions as `onAction`, wrapped in the full Slack `block_actions` payload (team/user/container/...). */\n onPayload?: (\n payload: ReturnType<typeof buildBlockActionsPayload>,\n context: PayloadContext,\n ) => void;\n /** Called with a `view_submission` payload when a `<Modal>`'s Submit button is pressed. */\n onSubmit?: (\n payload: ReturnType<typeof buildViewSubmissionPayload>,\n context: { views: ViewsApi },\n ) => SubmitResult | Promise<SubmitResult>;\n /** Called with a `view_closed` payload when a `<Modal>`'s close (X) button is pressed. */\n onClose?: (payload: ReturnType<typeof buildViewClosedPayload>) => void;\n resolvers: Resolvers;\n /** Renders links from the payload; an `<a>` unless the provider's `linkComponent` says otherwise. */\n linkComponent?: ComponentType<LinkProps>;\n /** The app's page for a mention, if it has one. */\n mentionHref?: (mention: MentionRef) => string | undefined;\n emoji: EmojiOptions;\n /** Validation errors keyed by block_id, as returned in `response_action: \"errors\"`. */\n errors: Record<string, string>;\n /** IANA zone for `<!date>` tokens and date elements. Undefined means the viewer's zone. */\n timeZone?: string;\n state: StateValues;\n /** Records an element's current value. Elements call this on every change. */\n setValue: (blockId: string, actionId: string, value: ElementState | undefined) => void;\n /**\n * Reports an action, passing the current state along. `scope` is the surface it happened in;\n * surfaces bind it for their elements, so elements never pass it themselves.\n */\n dispatch: (\n action: Partial<Pick<BlockAction, \"action_ts\">> & Omit<BlockAction, \"action_ts\">,\n scope?: SurfaceScopeValue,\n ) => void;\n /** Identity fields (team/user/trigger_id/...) used to build full Slack payloads. */\n identity: PayloadIdentity;\n /**\n * Registers the message/view a surface is rendering, so `dispatch` can build a full\n * `block_actions` payload for `onPayload`. Surfaces call this via `useContainer`; not meant to\n * be called directly.\n */\n setContainer: (container: Container | undefined) => void;\n views: ViewsApi;\n /**\n * Asks the app for an `external_select`'s options with a `block_suggestion` payload. Resolves\n * to undefined when there's no `onOptions` handler or no known container.\n */\n loadOptions?: (\n actionId: string,\n blockId: string,\n value: string,\n scope?: SurfaceScopeValue,\n ) => Promise<OptionsResponse | undefined>;\n /** Set on a modal opened through `views`: the stack entry it renders. */\n stackedView?: StackedView;\n /** Applies a submit's `response_action` (or closes) for a stacked modal. */\n respond?: (viewId: string, result: SubmitResult) => void;\n}\n\nconst noop = () => {};\nconst noopId = () => \"\";\nconst noopViews: ViewsApi = {\n open: noopId,\n push: noopId,\n update: noop,\n close: noop,\n clear: noop,\n publish: noop,\n};\n\nconst BlockKitContext = createContext<BlockKitContextValue>({\n surface: \"message\",\n resolvers: {},\n emoji: {},\n errors: {},\n state: {},\n setValue: noop,\n dispatch: noop,\n identity: {},\n setContainer: noop,\n views: noopViews,\n});\n\nexport interface BlockKitProviderProps {\n children: ReactNode;\n surface?: Surface;\n onAction?: (action: BlockAction, context: ActionContext) => void;\n /**\n * Same actions as `onAction`, wrapped in the full Slack `block_actions` payload (team, user,\n * container, response_url, ...) that an app's request URL would receive. Requires the surface\n * being rendered (`<Message>`, `<Modal>`, `<HomeTab>`) to know its container, which they do\n * automatically.\n */\n onPayload?: (\n payload: ReturnType<typeof buildBlockActionsPayload>,\n context: PayloadContext,\n ) => void;\n /**\n * Called with a `view_submission` payload when a `<Modal>`'s Submit button is pressed. For a\n * modal opened through `views`, return a `response_action` (`errors`, `update`, `push`,\n * `clear`) to react as Slack would, or nothing to close it. If it throws or rejects (the app\n * couldn't be reached), the modal stays open.\n */\n onSubmit?: (\n payload: ReturnType<typeof buildViewSubmissionPayload>,\n context: { views: ViewsApi },\n ) => SubmitResult | Promise<SubmitResult>;\n /** Called with a `view_closed` payload when a `<Modal>`'s close (X) button is pressed. */\n onClose?: (payload: ReturnType<typeof buildViewClosedPayload>) => void;\n /**\n * Answers an `external_select`'s `block_suggestion` request with options, as an app's options\n * load URL would. Without it, external selects accept a typed value on Enter instead.\n */\n onOptions?: (payload: BlockSuggestionPayload) => OptionsResponse | Promise<OptionsResponse>;\n /** Called whenever an input value changes, with the full `state.values`. */\n onStateChange?: (state: StateValues) => void;\n resolvers?: Resolvers;\n /**\n * Renders every link that comes from the payload, e.g. a router's `<Link>` for client-side\n * navigation or a component that rewrites URLs: links in mrkdwn, rich text, markdown and dates,\n * data tables, plan and task card sources, video titles, attachment authors and titles, and\n * mentions linked by `mentionHref`. It gets an anchor's props to spread: `href`, `className`,\n * `children`, and `target`/`rel` for links that open a new tab, as Slack's do.\n */\n linkComponent?: ComponentType<LinkProps>;\n /**\n * Links resolved mentions to the app's own pages: return a URL for a user, channel or user\n * group, or `undefined` to leave it unlinked. Mention links open in the same tab and render\n * through `linkComponent`.\n */\n mentionHref?: (mention: MentionRef) => string | undefined;\n emoji?: EmojiOptions;\n errors?: Record<string, string>;\n timeZone?: string;\n /** Team/user/trigger_id/... stamped onto payloads built for `onPayload`/`onSubmit`/`onClose`. */\n identity?: PayloadIdentity;\n /** Sets `data-theme` on a wrapper div so Slack's dark-mode CSS variables (Message.css) apply. */\n theme?: \"light\" | \"dark\";\n}\n\n/** Slack allows at most 3 views in a modal stack. */\nconst MAX_STACK = 3;\n\nfunction newViewId(): string {\n return `V${Math.random().toString(36).slice(2, 12).toUpperCase().padEnd(10, \"0\")}`;\n}\n\nfunction newHash(): string {\n return `${Math.floor(Date.now() / 1000)}.${Math.random().toString(36).slice(2, 10)}`;\n}\n\nexport function BlockKitProvider(props: BlockKitProviderProps) {\n const {\n children,\n surface = \"message\",\n onAction,\n onPayload,\n onSubmit,\n onClose,\n onOptions,\n onStateChange,\n resolvers,\n linkComponent,\n mentionHref,\n emoji,\n errors,\n timeZone,\n identity,\n theme,\n } = props;\n const [state, setState] = useState<StateValues>({});\n // Actions read the latest state synchronously, even when fired in the same tick as a change.\n const stateRef = useRef(state);\n // The message/view currently rendered, registered by `useContainer`. A ref (not state): it's\n // read only from event handlers, so updating it should never trigger a re-render.\n const containerRef = useRef<Container | undefined>(undefined);\n\n // A modal opened through `views` renders in a nested provider (so it gets its own state); that\n // provider shares the root's stack instead of starting its own.\n const parent = useContext(StackContext);\n const [stack, setStack] = useState<StackedView[]>([]);\n const stackRef = useRef(stack);\n const commitStack = useCallback((next: StackedView[]) => {\n stackRef.current = next;\n setStack(next);\n }, []);\n\n // Views rendered outside the stack (`<HomeTab>`, a standalone `<Modal>`), so `views.update`\n // and `views.publish` can reach them.\n const handlesRef = useRef<ViewHandle[]>([]);\n const register = useCallback((handle: ViewHandle) => {\n handlesRef.current = [...handlesRef.current, handle];\n return () => {\n handlesRef.current = handlesRef.current.filter((h) => h !== handle);\n };\n }, []);\n\n const ownViews = useMemo<ViewsApi>(() => {\n const stamp = (view: ViewLike, below: StackedView | undefined): StackedView[\"view\"] => {\n const id = newViewId();\n return {\n ...view,\n id,\n hash: newHash(),\n root_view_id: below?.view.root_view_id ?? id,\n previous_view_id: below?.view.id ?? null,\n };\n };\n const findIndex = (target?: { viewId?: string; externalId?: string }) => {\n const views = stackRef.current;\n if (target?.viewId) return views.findIndex((v) => v.view.id === target.viewId);\n if (target?.externalId) {\n return views.findIndex((v) => v.view.external_id === target.externalId);\n }\n return views.length - 1;\n };\n return {\n open: (view) => {\n const next = { view: stamp(view, undefined), errors: {} };\n commitStack([next]);\n return next.view.id;\n },\n push: (view) => {\n const views = stackRef.current;\n if (views.length >= MAX_STACK) {\n console.warn(`views.push: Slack allows at most ${MAX_STACK} views in a stack.`);\n return \"\";\n }\n const next = { view: stamp(view, views[views.length - 1]), errors: {} };\n commitStack([...views, next]);\n return next.view.id;\n },\n update: (view, target) => {\n const i = findIndex(target);\n const current = stackRef.current[i];\n if (!current) {\n const handles = handlesRef.current;\n const handle = target?.viewId\n ? handles.find((h) => h.current().id === target.viewId)\n : target?.externalId\n ? handles.find((h) => h.current().external_id === target.externalId)\n : handles[handles.length - 1];\n handle?.update(view);\n return;\n }\n const next = [...stackRef.current];\n next[i] = {\n view: {\n ...view,\n id: current.view.id,\n hash: newHash(),\n root_view_id: current.view.root_view_id,\n previous_view_id: current.view.previous_view_id,\n },\n errors: {},\n };\n commitStack(next);\n },\n close: () => commitStack(stackRef.current.slice(0, -1)),\n clear: () => commitStack([]),\n publish: (view) => {\n const homes = handlesRef.current.filter((h) => h.current().type === \"home\");\n if (homes.length === 0) console.warn(\"views.publish: no <HomeTab> is rendered.\");\n for (const home of homes) home.update(view);\n },\n };\n }, [commitStack]);\n\n const views = parent?.views ?? ownViews;\n\n const ownRespond = useCallback(\n (viewId: string, result: SubmitResult) => {\n const i = stackRef.current.findIndex((v) => v.view.id === viewId);\n if (i < 0) return;\n if (!result) {\n commitStack(stackRef.current.filter((v) => v.view.id !== viewId));\n } else if (result.response_action === \"errors\") {\n const next = [...stackRef.current];\n next[i] = { ...(next[i] as StackedView), errors: result.errors };\n commitStack(next);\n } else if (result.response_action === \"update\") {\n ownViews.update(result.view, { viewId });\n } else if (result.response_action === \"push\") {\n ownViews.push(result.view);\n } else if (result.response_action === \"clear\") {\n ownViews.clear();\n }\n },\n [commitStack, ownViews],\n );\n\n const respond = parent?.respond ?? ownRespond;\n\n const setValue = useCallback(\n (blockId: string, actionId: string, value: ElementState | undefined) => {\n const block = { ...stateRef.current[blockId] };\n if (value === undefined) delete block[actionId];\n else block[actionId] = value;\n const next = { ...stateRef.current, [blockId]: block };\n stateRef.current = next;\n setState(next);\n onStateChange?.(next);\n },\n [onStateChange],\n );\n\n const setContainer = useCallback((container: Container | undefined) => {\n containerRef.current = container;\n }, []);\n\n const dispatch = useCallback<BlockKitContextValue[\"dispatch\"]>(\n (action, scope) => {\n const full = { ...action, action_ts: action.action_ts ?? actionTs() } as BlockAction;\n const message = scope?.message;\n onAction?.(full, { state: stateRef.current, views, message });\n const container = scope?.container ?? containerRef.current;\n if (onPayload && container) {\n onPayload(\n buildBlockActionsPayload({ action: full, state: stateRef.current, container, identity }),\n { views, message },\n );\n }\n },\n [onAction, onPayload, identity, views],\n );\n\n // Read through a ref so an inline `onOptions` (a new function every render) doesn't change\n // loadOptions' identity and re-fire the select's options request after every parent render.\n const optionsRef = useRef({ onOptions, identity });\n optionsRef.current = { onOptions, identity };\n const loadOptions = useCallback<NonNullable<BlockKitContextValue[\"loadOptions\"]>>(\n async (actionId, blockId, value, scope) => {\n const { onOptions, identity } = optionsRef.current;\n const container = scope?.container ?? containerRef.current;\n if (!onOptions || !container) return undefined;\n return onOptions(\n buildBlockSuggestionPayload({\n actionId,\n blockId,\n value,\n container,\n state: stateRef.current,\n identity,\n }),\n );\n },\n [],\n );\n\n const stackedView = useContext(StackEntryContext);\n const value = useMemo<BlockKitContextValue>(\n () => ({\n surface,\n theme,\n onAction,\n onPayload,\n onSubmit,\n onClose,\n resolvers: resolvers ?? {},\n linkComponent,\n mentionHref,\n emoji: emoji ?? {},\n errors: stackedView?.errors ?? errors ?? {},\n timeZone,\n state,\n setValue,\n dispatch,\n identity: identity ?? {},\n setContainer,\n views,\n loadOptions: onOptions ? loadOptions : undefined,\n stackedView,\n respond,\n }),\n [\n surface,\n theme,\n onAction,\n onPayload,\n onSubmit,\n onClose,\n resolvers,\n linkComponent,\n mentionHref,\n emoji,\n errors,\n timeZone,\n state,\n setValue,\n dispatch,\n identity,\n setContainer,\n views,\n onOptions,\n loadOptions,\n stackedView,\n respond,\n ],\n );\n\n const registerView = parent?.register ?? register;\n const stackValue = useMemo(\n () => ({ views, respond, register: registerView }),\n [views, respond, registerView],\n );\n const content = (\n <>\n {children}\n {!parent && stack.length > 0 && (\n <ModalLayer\n stack={stack}\n renderEntry={(entry) => (\n <StackEntryContext.Provider value={entry}>\n <BlockKitProvider {...props} surface=\"modal\" theme={undefined}>\n <Modal view={entry.view as ModalView} />\n </BlockKitProvider>\n </StackEntryContext.Provider>\n )}\n />\n )}\n </>\n );\n\n return (\n <BlockKitContext.Provider value={value}>\n <StackContext.Provider value={stackValue}>\n {theme ? <div data-theme={theme}>{content}</div> : content}\n </StackContext.Provider>\n </BlockKitContext.Provider>\n );\n}\n\n/** A view rendered outside the modal stack, as `views.update`/`views.publish` see it. */\ninterface ViewHandle {\n current: () => ViewLike;\n update: (view: ViewLike) => void;\n}\n\nconst StackContext = createContext<\n | {\n views: ViewsApi;\n respond: (viewId: string, result: SubmitResult) => void;\n register: (handle: ViewHandle) => () => void;\n }\n | undefined\n>(undefined);\n\nconst StackEntryContext = createContext<StackedView | undefined>(undefined);\n\nexport function useBlockKit(): BlockKitContextValue {\n return useContext(BlockKitContext);\n}\n\n/**\n * Registers the message/view a surface (`<Message>`, `<Modal>`, `<HomeTab>`) is rendering, so\n * `dispatch` can build a full `block_actions` payload for the provider's `onPayload`. Call once\n * near the top of a surface component; re-call (it's cheap) whenever the container's identity\n * changes.\n */\nexport function useContainer(container: Container | undefined): void {\n const { setContainer } = useBlockKit();\n useEffect(() => {\n setContainer(container);\n });\n}\n\nexport interface SurfaceScopeProps extends SurfaceScopeValue {\n /** Extra validation errors (by block_id) shown on top of the provider's. */\n errors?: Record<string, string>;\n children: ReactNode;\n}\n\n/**\n * Binds the elements below it to one surface: their actions and options requests carry this\n * container (and message handle), even when several surfaces share a provider. `<Message>`,\n * `<Modal>` and `<HomeTab>` render one; custom surfaces can too.\n */\nexport function SurfaceScope({ container, message, errors, children }: SurfaceScopeProps) {\n const context = useBlockKit();\n const scopeRef = useRef<SurfaceScopeValue>({ container, message });\n scopeRef.current = { container, message };\n // Keeps the old container registration working for code that reads it (e.g. custom elements\n // calling the provider's dispatch directly).\n useContainer(container);\n const { dispatch, loadOptions } = context;\n // A standalone <Modal>/<HomeTab> is that surface even under a provider set up for messages.\n const surface: Surface = container.type === \"view\" ? container.view.type : \"message\";\n const scopedDispatch = useCallback<BlockKitContextValue[\"dispatch\"]>(\n (action, scope) => dispatch(action, scope ?? scopeRef.current),\n [dispatch],\n );\n const scopedLoadOptions = useMemo<BlockKitContextValue[\"loadOptions\"]>(\n () =>\n loadOptions &&\n ((actionId, blockId, value, scope) =>\n loadOptions(actionId, blockId, value, scope ?? scopeRef.current)),\n [loadOptions],\n );\n const value = useMemo<BlockKitContextValue>(\n () => ({\n ...context,\n surface,\n dispatch: scopedDispatch,\n loadOptions: scopedLoadOptions,\n errors:\n errors && Object.keys(errors).length > 0\n ? { ...context.errors, ...errors }\n : context.errors,\n }),\n [context, surface, scopedDispatch, scopedLoadOptions, errors],\n );\n return <BlockKitContext.Provider value={value}>{children}</BlockKitContext.Provider>;\n}\n\n/**\n * Stops the elements below it from sending `block_actions`, while their values still reach\n * `state`. An `input` block uses it: Slack only dispatches from an input's element when the block\n * sets `dispatch_action`.\n */\nexport function SuppressActions({ children }: { children: ReactNode }) {\n const context = useBlockKit();\n const value = useMemo<BlockKitContextValue>(() => ({ ...context, dispatch: noop }), [context]);\n return <BlockKitContext.Provider value={value}>{children}</BlockKitContext.Provider>;\n}\n\n/**\n * The view a `<HomeTab>` or standalone `<Modal>` should show: its `view` prop, or what the app\n * last sent with `views.update`/`views.publish`. A new `view` prop (by content) wins again.\n */\nexport function useLiveView<V extends ViewLike>(\n view: V,\n enabled = true,\n): { view: V; update: (next: ViewLike) => void } {\n const shared = useContext(StackContext);\n const source = JSON.stringify(view);\n const [override, setOverride] = useState<{ source: string; view: V }>();\n const live = override?.source === source ? override.view : view;\n const liveRef = useRef(live);\n liveRef.current = live;\n\n const update = useCallback(\n (next: ViewLike) => {\n const current = liveRef.current;\n setOverride({\n source,\n view: {\n ...next,\n type: current.type,\n id: current.id,\n hash: newHash(),\n root_view_id: current.root_view_id,\n previous_view_id: current.previous_view_id,\n } as V,\n });\n },\n [source],\n );\n\n useEffect(() => {\n if (!enabled || !shared) return;\n return shared.register({ current: () => liveRef.current, update });\n }, [enabled, shared, update]);\n\n return { view: live, update };\n}\n\n/** Slack's `action_ts` format: seconds with microseconds. */\nexport function actionTs(now = Date.now()): string {\n return (now / 1000).toFixed(6);\n}\n","import { useEffect, useLayoutEffect } from \"react\";\n\n/**\n * `useLayoutEffect` in the browser and `useEffect` on the server, where neither runs. React 18\n * warns about every `useLayoutEffect` it meets while server rendering; React 19 doesn't.\n */\nexport const useClientLayoutEffect = typeof document === \"undefined\" ? useEffect : useLayoutEffect;\n","import {\n cloneElement,\n type FocusEvent,\n type MouseEvent,\n type ReactElement,\n type ReactNode,\n useEffect,\n useId,\n useRef,\n useState,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { useBlockKit } from \"./context\";\nimport { useClientLayoutEffect } from \"./useClientLayoutEffect\";\n\n/** How long the pointer rests on an anchor before its tooltip shows. */\nconst SHOW_DELAY_MS = 300;\n\ntype Placement = \"top\" | \"bottom\";\n\ntype AnchorProps = {\n onMouseEnter?: (e: MouseEvent) => void;\n onMouseLeave?: (e: MouseEvent) => void;\n onFocus?: (e: FocusEvent) => void;\n onBlur?: (e: FocusEvent) => void;\n \"aria-describedby\"?: string;\n};\n\nexport interface TooltipProps {\n /** Tooltip content; nothing is rendered when empty. */\n label: ReactNode;\n /** A single element to anchor to; it receives the hover/focus handlers. */\n children: ReactElement<AnchorProps>;\n /** Preferred side; flips to the other one when there's no room. Defaults to `top`. */\n placement?: Placement;\n}\n\n/**\n * Slack's `c-tooltip`: a dark, bold 13px bubble with an arrow, shown above (or below) its anchor\n * after a short hover or on keyboard focus. It appears and disappears without animation, as in\n * Slack. Portalled to `<body>` so scroll containers and `overflow: hidden` can't clip it.\n */\nexport function Tooltip({ label, children, placement = \"top\" }: TooltipProps) {\n const { theme } = useBlockKit();\n const id = useId();\n const [open, setOpen] = useState(false);\n const [position, setPosition] = useState<{\n top: number;\n left: number;\n side: Placement;\n } | null>(null);\n const anchorRef = useRef<Element | null>(null);\n const tipRef = useRef<HTMLDivElement>(null);\n const timer = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n\n useEffect(() => () => clearTimeout(timer.current), []);\n\n useClientLayoutEffect(() => {\n if (!open) {\n setPosition(null);\n return;\n }\n const anchor = anchorRef.current;\n const tip = tipRef.current;\n if (!anchor || !tip) return;\n const a = anchor.getBoundingClientRect();\n const t = tip.getBoundingClientRect();\n const gap = 8;\n const fitsAbove = a.top - gap - t.height >= 0;\n const fitsBelow = a.bottom + gap + t.height <= window.innerHeight;\n const side: Placement =\n placement === \"top\"\n ? fitsAbove || !fitsBelow\n ? \"top\"\n : \"bottom\"\n : fitsBelow || !fitsAbove\n ? \"bottom\"\n : \"top\";\n const left = Math.min(\n Math.max(4, a.left + a.width / 2 - t.width / 2),\n window.innerWidth - t.width - 4,\n );\n setPosition({ top: side === \"top\" ? a.top - gap - t.height : a.bottom + gap, left, side });\n }, [open, placement]);\n\n if (label === undefined || label === null || label === \"\") return children;\n\n function show(e: { currentTarget: Element }, immediate: boolean) {\n anchorRef.current = e.currentTarget;\n clearTimeout(timer.current);\n if (immediate) setOpen(true);\n else timer.current = setTimeout(() => setOpen(true), SHOW_DELAY_MS);\n }\n\n function hide() {\n clearTimeout(timer.current);\n setOpen(false);\n }\n\n const props = children.props;\n const anchor = cloneElement(children, {\n onMouseEnter: (e: MouseEvent) => {\n props.onMouseEnter?.(e);\n show(e, false);\n },\n onMouseLeave: (e: MouseEvent) => {\n props.onMouseLeave?.(e);\n hide();\n },\n onFocus: (e: FocusEvent) => {\n props.onFocus?.(e);\n if ((e.currentTarget as Element).matches?.(\":focus-visible\")) show(e, true);\n },\n onBlur: (e: FocusEvent) => {\n props.onBlur?.(e);\n hide();\n },\n \"aria-describedby\": open ? id : props[\"aria-describedby\"],\n });\n\n const tip =\n open && typeof document !== \"undefined\"\n ? createPortal(\n <div\n ref={tipRef}\n id={id}\n role=\"tooltip\"\n data-theme={theme}\n className={`sbk-tooltip sbk-tooltip--${position?.side ?? placement}`}\n style={\n position\n ? { top: position.top, left: position.left }\n : { top: 0, left: 0, visibility: \"hidden\" }\n }\n >\n {label}\n <span className=\"sbk-tooltip__arrow\" aria-hidden=\"true\" />\n </div>,\n document.body,\n )\n : null;\n\n return (\n <>\n {anchor}\n {tip}\n </>\n );\n}\n","/**\n * Slack-specific shortcodes that predate today's standard Unicode emoji set and so aren't in\n * `emoji-datasource`. Slack keeps them as aliases into the standard set for backward compatibility.\n */\nexport const LEGACY_ALIASES: Record<string, string> = {\n // Slack's original \"smile\" glyph, kept as an alias for the standard slightly-smiling-face.\n simple_smile: \"1f642\",\n};\n","/**\n * Generated by tools/emoji-data/generate.ts from emoji-datasource@16.0.0. Do not edit by hand.\n */\n\n/** short_name (incl. aliases like \"+1\") -> lowercase unified codepoint hex, e.g. \"1f44d\". */\nexport const EMOJI_NAMES: Record<string, string> = {\n \"100\": \"1f4af\",\n \"1234\": \"1f522\",\n hash: \"0023-fe0f-20e3\",\n keycap_star: \"002a-fe0f-20e3\",\n zero: \"0030-fe0f-20e3\",\n one: \"0031-fe0f-20e3\",\n two: \"0032-fe0f-20e3\",\n three: \"0033-fe0f-20e3\",\n four: \"0034-fe0f-20e3\",\n five: \"0035-fe0f-20e3\",\n six: \"0036-fe0f-20e3\",\n seven: \"0037-fe0f-20e3\",\n eight: \"0038-fe0f-20e3\",\n nine: \"0039-fe0f-20e3\",\n copyright: \"00a9-fe0f\",\n registered: \"00ae-fe0f\",\n mahjong: \"1f004\",\n black_joker: \"1f0cf\",\n a: \"1f170-fe0f\",\n b: \"1f171-fe0f\",\n o2: \"1f17e-fe0f\",\n parking: \"1f17f-fe0f\",\n ab: \"1f18e\",\n cl: \"1f191\",\n cool: \"1f192\",\n free: \"1f193\",\n id: \"1f194\",\n new: \"1f195\",\n ng: \"1f196\",\n ok: \"1f197\",\n sos: \"1f198\",\n up: \"1f199\",\n vs: \"1f19a\",\n \"flag-ac\": \"1f1e6-1f1e8\",\n \"flag-ad\": \"1f1e6-1f1e9\",\n \"flag-ae\": \"1f1e6-1f1ea\",\n \"flag-af\": \"1f1e6-1f1eb\",\n \"flag-ag\": \"1f1e6-1f1ec\",\n \"flag-ai\": \"1f1e6-1f1ee\",\n \"flag-al\": \"1f1e6-1f1f1\",\n \"flag-am\": \"1f1e6-1f1f2\",\n \"flag-ao\": \"1f1e6-1f1f4\",\n \"flag-aq\": \"1f1e6-1f1f6\",\n \"flag-ar\": \"1f1e6-1f1f7\",\n \"flag-as\": \"1f1e6-1f1f8\",\n \"flag-at\": \"1f1e6-1f1f9\",\n \"flag-au\": \"1f1e6-1f1fa\",\n \"flag-aw\": \"1f1e6-1f1fc\",\n \"flag-ax\": \"1f1e6-1f1fd\",\n \"flag-az\": \"1f1e6-1f1ff\",\n \"flag-ba\": \"1f1e7-1f1e6\",\n \"flag-bb\": \"1f1e7-1f1e7\",\n \"flag-bd\": \"1f1e7-1f1e9\",\n \"flag-be\": \"1f1e7-1f1ea\",\n \"flag-bf\": \"1f1e7-1f1eb\",\n \"flag-bg\": \"1f1e7-1f1ec\",\n \"flag-bh\": \"1f1e7-1f1ed\",\n \"flag-bi\": \"1f1e7-1f1ee\",\n \"flag-bj\": \"1f1e7-1f1ef\",\n \"flag-bl\": \"1f1e7-1f1f1\",\n \"flag-bm\": \"1f1e7-1f1f2\",\n \"flag-bn\": \"1f1e7-1f1f3\",\n \"flag-bo\": \"1f1e7-1f1f4\",\n \"flag-bq\": \"1f1e7-1f1f6\",\n \"flag-br\": \"1f1e7-1f1f7\",\n \"flag-bs\": \"1f1e7-1f1f8\",\n \"flag-bt\": \"1f1e7-1f1f9\",\n \"flag-bv\": \"1f1e7-1f1fb\",\n \"flag-bw\": \"1f1e7-1f1fc\",\n \"flag-by\": \"1f1e7-1f1fe\",\n \"flag-bz\": \"1f1e7-1f1ff\",\n \"flag-ca\": \"1f1e8-1f1e6\",\n \"flag-cc\": \"1f1e8-1f1e8\",\n \"flag-cd\": \"1f1e8-1f1e9\",\n \"flag-cf\": \"1f1e8-1f1eb\",\n \"flag-cg\": \"1f1e8-1f1ec\",\n \"flag-ch\": \"1f1e8-1f1ed\",\n \"flag-ci\": \"1f1e8-1f1ee\",\n \"flag-ck\": \"1f1e8-1f1f0\",\n \"flag-cl\": \"1f1e8-1f1f1\",\n \"flag-cm\": \"1f1e8-1f1f2\",\n cn: \"1f1e8-1f1f3\",\n \"flag-cn\": \"1f1e8-1f1f3\",\n \"flag-co\": \"1f1e8-1f1f4\",\n \"flag-cp\": \"1f1e8-1f1f5\",\n \"flag-sark\": \"1f1e8-1f1f6\",\n \"flag-cr\": \"1f1e8-1f1f7\",\n \"flag-cu\": \"1f1e8-1f1fa\",\n \"flag-cv\": \"1f1e8-1f1fb\",\n \"flag-cw\": \"1f1e8-1f1fc\",\n \"flag-cx\": \"1f1e8-1f1fd\",\n \"flag-cy\": \"1f1e8-1f1fe\",\n \"flag-cz\": \"1f1e8-1f1ff\",\n de: \"1f1e9-1f1ea\",\n \"flag-de\": \"1f1e9-1f1ea\",\n \"flag-dg\": \"1f1e9-1f1ec\",\n \"flag-dj\": \"1f1e9-1f1ef\",\n \"flag-dk\": \"1f1e9-1f1f0\",\n \"flag-dm\": \"1f1e9-1f1f2\",\n \"flag-do\": \"1f1e9-1f1f4\",\n \"flag-dz\": \"1f1e9-1f1ff\",\n \"flag-ea\": \"1f1ea-1f1e6\",\n \"flag-ec\": \"1f1ea-1f1e8\",\n \"flag-ee\": \"1f1ea-1f1ea\",\n \"flag-eg\": \"1f1ea-1f1ec\",\n \"flag-eh\": \"1f1ea-1f1ed\",\n \"flag-er\": \"1f1ea-1f1f7\",\n es: \"1f1ea-1f1f8\",\n \"flag-es\": \"1f1ea-1f1f8\",\n \"flag-et\": \"1f1ea-1f1f9\",\n \"flag-eu\": \"1f1ea-1f1fa\",\n \"flag-fi\": \"1f1eb-1f1ee\",\n \"flag-fj\": \"1f1eb-1f1ef\",\n \"flag-fk\": \"1f1eb-1f1f0\",\n \"flag-fm\": \"1f1eb-1f1f2\",\n \"flag-fo\": \"1f1eb-1f1f4\",\n fr: \"1f1eb-1f1f7\",\n \"flag-fr\": \"1f1eb-1f1f7\",\n \"flag-ga\": \"1f1ec-1f1e6\",\n gb: \"1f1ec-1f1e7\",\n uk: \"1f1ec-1f1e7\",\n \"flag-gb\": \"1f1ec-1f1e7\",\n \"flag-gd\": \"1f1ec-1f1e9\",\n \"flag-ge\": \"1f1ec-1f1ea\",\n \"flag-gf\": \"1f1ec-1f1eb\",\n \"flag-gg\": \"1f1ec-1f1ec\",\n \"flag-gh\": \"1f1ec-1f1ed\",\n \"flag-gi\": \"1f1ec-1f1ee\",\n \"flag-gl\": \"1f1ec-1f1f1\",\n \"flag-gm\": \"1f1ec-1f1f2\",\n \"flag-gn\": \"1f1ec-1f1f3\",\n \"flag-gp\": \"1f1ec-1f1f5\",\n \"flag-gq\": \"1f1ec-1f1f6\",\n \"flag-gr\": \"1f1ec-1f1f7\",\n \"flag-gs\": \"1f1ec-1f1f8\",\n \"flag-gt\": \"1f1ec-1f1f9\",\n \"flag-gu\": \"1f1ec-1f1fa\",\n \"flag-gw\": \"1f1ec-1f1fc\",\n \"flag-gy\": \"1f1ec-1f1fe\",\n \"flag-hk\": \"1f1ed-1f1f0\",\n \"flag-hm\": \"1f1ed-1f1f2\",\n \"flag-hn\": \"1f1ed-1f1f3\",\n \"flag-hr\": \"1f1ed-1f1f7\",\n \"flag-ht\": \"1f1ed-1f1f9\",\n \"flag-hu\": \"1f1ed-1f1fa\",\n \"flag-ic\": \"1f1ee-1f1e8\",\n \"flag-id\": \"1f1ee-1f1e9\",\n \"flag-ie\": \"1f1ee-1f1ea\",\n \"flag-il\": \"1f1ee-1f1f1\",\n \"flag-im\": \"1f1ee-1f1f2\",\n \"flag-in\": \"1f1ee-1f1f3\",\n \"flag-io\": \"1f1ee-1f1f4\",\n \"flag-iq\": \"1f1ee-1f1f6\",\n \"flag-ir\": \"1f1ee-1f1f7\",\n \"flag-is\": \"1f1ee-1f1f8\",\n it: \"1f1ee-1f1f9\",\n \"flag-it\": \"1f1ee-1f1f9\",\n \"flag-je\": \"1f1ef-1f1ea\",\n \"flag-jm\": \"1f1ef-1f1f2\",\n \"flag-jo\": \"1f1ef-1f1f4\",\n jp: \"1f1ef-1f1f5\",\n \"flag-jp\": \"1f1ef-1f1f5\",\n \"flag-ke\": \"1f1f0-1f1ea\",\n \"flag-kg\": \"1f1f0-1f1ec\",\n \"flag-kh\": \"1f1f0-1f1ed\",\n \"flag-ki\": \"1f1f0-1f1ee\",\n \"flag-km\": \"1f1f0-1f1f2\",\n \"flag-kn\": \"1f1f0-1f1f3\",\n \"flag-kp\": \"1f1f0-1f1f5\",\n kr: \"1f1f0-1f1f7\",\n \"flag-kr\": \"1f1f0-1f1f7\",\n \"flag-kw\": \"1f1f0-1f1fc\",\n \"flag-ky\": \"1f1f0-1f1fe\",\n \"flag-kz\": \"1f1f0-1f1ff\",\n \"flag-la\": \"1f1f1-1f1e6\",\n \"flag-lb\": \"1f1f1-1f1e7\",\n \"flag-lc\": \"1f1f1-1f1e8\",\n \"flag-li\": \"1f1f1-1f1ee\",\n \"flag-lk\": \"1f1f1-1f1f0\",\n \"flag-lr\": \"1f1f1-1f1f7\",\n \"flag-ls\": \"1f1f1-1f1f8\",\n \"flag-lt\": \"1f1f1-1f1f9\",\n \"flag-lu\": \"1f1f1-1f1fa\",\n \"flag-lv\": \"1f1f1-1f1fb\",\n \"flag-ly\": \"1f1f1-1f1fe\",\n \"flag-ma\": \"1f1f2-1f1e6\",\n \"flag-mc\": \"1f1f2-1f1e8\",\n \"flag-md\": \"1f1f2-1f1e9\",\n \"flag-me\": \"1f1f2-1f1ea\",\n \"flag-mf\": \"1f1f2-1f1eb\",\n \"flag-mg\": \"1f1f2-1f1ec\",\n \"flag-mh\": \"1f1f2-1f1ed\",\n \"flag-mk\": \"1f1f2-1f1f0\",\n \"flag-ml\": \"1f1f2-1f1f1\",\n \"flag-mm\": \"1f1f2-1f1f2\",\n \"flag-mn\": \"1f1f2-1f1f3\",\n \"flag-mo\": \"1f1f2-1f1f4\",\n \"flag-mp\": \"1f1f2-1f1f5\",\n \"flag-mq\": \"1f1f2-1f1f6\",\n \"flag-mr\": \"1f1f2-1f1f7\",\n \"flag-ms\": \"1f1f2-1f1f8\",\n \"flag-mt\": \"1f1f2-1f1f9\",\n \"flag-mu\": \"1f1f2-1f1fa\",\n \"flag-mv\": \"1f1f2-1f1fb\",\n \"flag-mw\": \"1f1f2-1f1fc\",\n \"flag-mx\": \"1f1f2-1f1fd\",\n \"flag-my\": \"1f1f2-1f1fe\",\n \"flag-mz\": \"1f1f2-1f1ff\",\n \"flag-na\": \"1f1f3-1f1e6\",\n \"flag-nc\": \"1f1f3-1f1e8\",\n \"flag-ne\": \"1f1f3-1f1ea\",\n \"flag-nf\": \"1f1f3-1f1eb\",\n \"flag-ng\": \"1f1f3-1f1ec\",\n \"flag-ni\": \"1f1f3-1f1ee\",\n \"flag-nl\": \"1f1f3-1f1f1\",\n \"flag-no\": \"1f1f3-1f1f4\",\n \"flag-np\": \"1f1f3-1f1f5\",\n \"flag-nr\": \"1f1f3-1f1f7\",\n \"flag-nu\": \"1f1f3-1f1fa\",\n \"flag-nz\": \"1f1f3-1f1ff\",\n \"flag-om\": \"1f1f4-1f1f2\",\n \"flag-pa\": \"1f1f5-1f1e6\",\n \"flag-pe\": \"1f1f5-1f1ea\",\n \"flag-pf\": \"1f1f5-1f1eb\",\n \"flag-pg\": \"1f1f5-1f1ec\",\n \"flag-ph\": \"1f1f5-1f1ed\",\n \"flag-pk\": \"1f1f5-1f1f0\",\n \"flag-pl\": \"1f1f5-1f1f1\",\n \"flag-pm\": \"1f1f5-1f1f2\",\n \"flag-pn\": \"1f1f5-1f1f3\",\n \"flag-pr\": \"1f1f5-1f1f7\",\n \"flag-ps\": \"1f1f5-1f1f8\",\n \"flag-pt\": \"1f1f5-1f1f9\",\n \"flag-pw\": \"1f1f5-1f1fc\",\n \"flag-py\": \"1f1f5-1f1fe\",\n \"flag-qa\": \"1f1f6-1f1e6\",\n \"flag-re\": \"1f1f7-1f1ea\",\n \"flag-ro\": \"1f1f7-1f1f4\",\n \"flag-rs\": \"1f1f7-1f1f8\",\n ru: \"1f1f7-1f1fa\",\n \"flag-ru\": \"1f1f7-1f1fa\",\n \"flag-rw\": \"1f1f7-1f1fc\",\n \"flag-sa\": \"1f1f8-1f1e6\",\n \"flag-sb\": \"1f1f8-1f1e7\",\n \"flag-sc\": \"1f1f8-1f1e8\",\n \"flag-sd\": \"1f1f8-1f1e9\",\n \"flag-se\": \"1f1f8-1f1ea\",\n \"flag-sg\": \"1f1f8-1f1ec\",\n \"flag-sh\": \"1f1f8-1f1ed\",\n \"flag-si\": \"1f1f8-1f1ee\",\n \"flag-sj\": \"1f1f8-1f1ef\",\n \"flag-sk\": \"1f1f8-1f1f0\",\n \"flag-sl\": \"1f1f8-1f1f1\",\n \"flag-sm\": \"1f1f8-1f1f2\",\n \"flag-sn\": \"1f1f8-1f1f3\",\n \"flag-so\": \"1f1f8-1f1f4\",\n \"flag-sr\": \"1f1f8-1f1f7\",\n \"flag-ss\": \"1f1f8-1f1f8\",\n \"flag-st\": \"1f1f8-1f1f9\",\n \"flag-sv\": \"1f1f8-1f1fb\",\n \"flag-sx\": \"1f1f8-1f1fd\",\n \"flag-sy\": \"1f1f8-1f1fe\",\n \"flag-sz\": \"1f1f8-1f1ff\",\n \"flag-ta\": \"1f1f9-1f1e6\",\n \"flag-tc\": \"1f1f9-1f1e8\",\n \"flag-td\": \"1f1f9-1f1e9\",\n \"flag-tf\": \"1f1f9-1f1eb\",\n \"flag-tg\": \"1f1f9-1f1ec\",\n \"flag-th\": \"1f1f9-1f1ed\",\n \"flag-tj\": \"1f1f9-1f1ef\",\n \"flag-tk\": \"1f1f9-1f1f0\",\n \"flag-tl\": \"1f1f9-1f1f1\",\n \"flag-tm\": \"1f1f9-1f1f2\",\n \"flag-tn\": \"1f1f9-1f1f3\",\n \"flag-to\": \"1f1f9-1f1f4\",\n \"flag-tr\": \"1f1f9-1f1f7\",\n \"flag-tt\": \"1f1f9-1f1f9\",\n \"flag-tv\": \"1f1f9-1f1fb\",\n \"flag-tw\": \"1f1f9-1f1fc\",\n \"flag-tz\": \"1f1f9-1f1ff\",\n \"flag-ua\": \"1f1fa-1f1e6\",\n \"flag-ug\": \"1f1fa-1f1ec\",\n \"flag-um\": \"1f1fa-1f1f2\",\n \"flag-un\": \"1f1fa-1f1f3\",\n us: \"1f1fa-1f1f8\",\n \"flag-us\": \"1f1fa-1f1f8\",\n \"flag-uy\": \"1f1fa-1f1fe\",\n \"flag-uz\": \"1f1fa-1f1ff\",\n \"flag-va\": \"1f1fb-1f1e6\",\n \"flag-vc\": \"1f1fb-1f1e8\",\n \"flag-ve\": \"1f1fb-1f1ea\",\n \"flag-vg\": \"1f1fb-1f1ec\",\n \"flag-vi\": \"1f1fb-1f1ee\",\n \"flag-vn\": \"1f1fb-1f1f3\",\n \"flag-vu\": \"1f1fb-1f1fa\",\n \"flag-wf\": \"1f1fc-1f1eb\",\n \"flag-ws\": \"1f1fc-1f1f8\",\n \"flag-xk\": \"1f1fd-1f1f0\",\n \"flag-ye\": \"1f1fe-1f1ea\",\n \"flag-yt\": \"1f1fe-1f1f9\",\n \"flag-za\": \"1f1ff-1f1e6\",\n \"flag-zm\": \"1f1ff-1f1f2\",\n \"flag-zw\": \"1f1ff-1f1fc\",\n koko: \"1f201\",\n sa: \"1f202-fe0f\",\n u7121: \"1f21a\",\n u6307: \"1f22f\",\n u7981: \"1f232\",\n u7a7a: \"1f233\",\n u5408: \"1f234\",\n u6e80: \"1f235\",\n u6709: \"1f236\",\n u6708: \"1f237-fe0f\",\n u7533: \"1f238\",\n u5272: \"1f239\",\n u55b6: \"1f23a\",\n ideograph_advantage: \"1f250\",\n accept: \"1f251\",\n cyclone: \"1f300\",\n foggy: \"1f301\",\n closed_umbrella: \"1f302\",\n night_with_stars: \"1f303\",\n sunrise_over_mountains: \"1f304\",\n sunrise: \"1f305\",\n city_sunset: \"1f306\",\n city_sunrise: \"1f307\",\n rainbow: \"1f308\",\n bridge_at_night: \"1f309\",\n ocean: \"1f30a\",\n volcano: \"1f30b\",\n milky_way: \"1f30c\",\n earth_africa: \"1f30d\",\n earth_americas: \"1f30e\",\n earth_asia: \"1f30f\",\n globe_with_meridians: \"1f310\",\n new_moon: \"1f311\",\n waxing_crescent_moon: \"1f312\",\n first_quarter_moon: \"1f313\",\n moon: \"1f314\",\n waxing_gibbous_moon: \"1f314\",\n full_moon: \"1f315\",\n waning_gibbous_moon: \"1f316\",\n last_quarter_moon: \"1f317\",\n waning_crescent_moon: \"1f318\",\n crescent_moon: \"1f319\",\n new_moon_with_face: \"1f31a\",\n first_quarter_moon_with_face: \"1f31b\",\n last_quarter_moon_with_face: \"1f31c\",\n full_moon_with_face: \"1f31d\",\n sun_with_face: \"1f31e\",\n star2: \"1f31f\",\n stars: \"1f320\",\n thermometer: \"1f321-fe0f\",\n mostly_sunny: \"1f324-fe0f\",\n sun_small_cloud: \"1f324-fe0f\",\n barely_sunny: \"1f325-fe0f\",\n sun_behind_cloud: \"1f325-fe0f\",\n partly_sunny_rain: \"1f326-fe0f\",\n sun_behind_rain_cloud: \"1f326-fe0f\",\n rain_cloud: \"1f327-fe0f\",\n snow_cloud: \"1f328-fe0f\",\n lightning: \"1f329-fe0f\",\n lightning_cloud: \"1f329-fe0f\",\n tornado: \"1f32a-fe0f\",\n tornado_cloud: \"1f32a-fe0f\",\n fog: \"1f32b-fe0f\",\n wind_blowing_face: \"1f32c-fe0f\",\n hotdog: \"1f32d\",\n taco: \"1f32e\",\n burrito: \"1f32f\",\n chestnut: \"1f330\",\n seedling: \"1f331\",\n evergreen_tree: \"1f332\",\n deciduous_tree: \"1f333\",\n palm_tree: \"1f334\",\n cactus: \"1f335\",\n hot_pepper: \"1f336-fe0f\",\n tulip: \"1f337\",\n cherry_blossom: \"1f338\",\n rose: \"1f339\",\n hibiscus: \"1f33a\",\n sunflower: \"1f33b\",\n blossom: \"1f33c\",\n corn: \"1f33d\",\n ear_of_rice: \"1f33e\",\n herb: \"1f33f\",\n four_leaf_clover: \"1f340\",\n maple_leaf: \"1f341\",\n fallen_leaf: \"1f342\",\n leaves: \"1f343\",\n brown_mushroom: \"1f344-200d-1f7eb\",\n mushroom: \"1f344\",\n tomato: \"1f345\",\n eggplant: \"1f346\",\n grapes: \"1f347\",\n melon: \"1f348\",\n watermelon: \"1f349\",\n tangerine: \"1f34a\",\n lime: \"1f34b-200d-1f7e9\",\n lemon: \"1f34b\",\n banana: \"1f34c\",\n pineapple: \"1f34d\",\n apple: \"1f34e\",\n green_apple: \"1f34f\",\n pear: \"1f350\",\n peach: \"1f351\",\n cherries: \"1f352\",\n strawberry: \"1f353\",\n hamburger: \"1f354\",\n pizza: \"1f355\",\n meat_on_bone: \"1f356\",\n poultry_leg: \"1f357\",\n rice_cracker: \"1f358\",\n rice_ball: \"1f359\",\n rice: \"1f35a\",\n curry: \"1f35b\",\n ramen: \"1f35c\",\n spaghetti: \"1f35d\",\n bread: \"1f35e\",\n fries: \"1f35f\",\n sweet_potato: \"1f360\",\n dango: \"1f361\",\n oden: \"1f362\",\n sushi: \"1f363\",\n fried_shrimp: \"1f364\",\n fish_cake: \"1f365\",\n icecream: \"1f366\",\n shaved_ice: \"1f367\",\n ice_cream: \"1f368\",\n doughnut: \"1f369\",\n cookie: \"1f36a\",\n chocolate_bar: \"1f36b\",\n candy: \"1f36c\",\n lollipop: \"1f36d\",\n custard: \"1f36e\",\n honey_pot: \"1f36f\",\n cake: \"1f370\",\n bento: \"1f371\",\n stew: \"1f372\",\n fried_egg: \"1f373\",\n cooking: \"1f373\",\n fork_and_knife: \"1f374\",\n tea: \"1f375\",\n sake: \"1f376\",\n wine_glass: \"1f377\",\n cocktail: \"1f378\",\n tropical_drink: \"1f379\",\n beer: \"1f37a\",\n beers: \"1f37b\",\n baby_bottle: \"1f37c\",\n knife_fork_plate: \"1f37d-fe0f\",\n champagne: \"1f37e\",\n popcorn: \"1f37f\",\n ribbon: \"1f380\",\n gift: \"1f381\",\n birthday: \"1f382\",\n jack_o_lantern: \"1f383\",\n christmas_tree: \"1f384\",\n santa: \"1f385\",\n fireworks: \"1f386\",\n sparkler: \"1f387\",\n balloon: \"1f388\",\n tada: \"1f389\",\n confetti_ball: \"1f38a\",\n tanabata_tree: \"1f38b\",\n crossed_flags: \"1f38c\",\n bamboo: \"1f38d\",\n dolls: \"1f38e\",\n flags: \"1f38f\",\n wind_chime: \"1f390\",\n rice_scene: \"1f391\",\n school_satchel: \"1f392\",\n mortar_board: \"1f393\",\n medal: \"1f396-fe0f\",\n reminder_ribbon: \"1f397-fe0f\",\n studio_microphone: \"1f399-fe0f\",\n level_slider: \"1f39a-fe0f\",\n control_knobs: \"1f39b-fe0f\",\n film_frames: \"1f39e-fe0f\",\n admission_tickets: \"1f39f-fe0f\",\n carousel_horse: \"1f3a0\",\n ferris_wheel: \"1f3a1\",\n roller_coaster: \"1f3a2\",\n fishing_pole_and_fish: \"1f3a3\",\n microphone: \"1f3a4\",\n movie_camera: \"1f3a5\",\n cinema: \"1f3a6\",\n headphones: \"1f3a7\",\n art: \"1f3a8\",\n tophat: \"1f3a9\",\n circus_tent: \"1f3aa\",\n ticket: \"1f3ab\",\n clapper: \"1f3ac\",\n performing_arts: \"1f3ad\",\n video_game: \"1f3ae\",\n dart: \"1f3af\",\n slot_machine: \"1f3b0\",\n \"8ball\": \"1f3b1\",\n game_die: \"1f3b2\",\n bowling: \"1f3b3\",\n flower_playing_cards: \"1f3b4\",\n musical_note: \"1f3b5\",\n notes: \"1f3b6\",\n saxophone: \"1f3b7\",\n guitar: \"1f3b8\",\n musical_keyboard: \"1f3b9\",\n trumpet: \"1f3ba\",\n violin: \"1f3bb\",\n musical_score: \"1f3bc\",\n running_shirt_with_sash: \"1f3bd\",\n tennis: \"1f3be\",\n ski: \"1f3bf\",\n basketball: \"1f3c0\",\n checkered_flag: \"1f3c1\",\n snowboarder: \"1f3c2\",\n \"woman-running\": \"1f3c3-200d-2640-fe0f\",\n woman_running_facing_right: \"1f3c3-200d-2640-fe0f-200d-27a1-fe0f\",\n \"man-running\": \"1f3c3-200d-2642-fe0f\",\n man_running_facing_right: \"1f3c3-200d-2642-fe0f-200d-27a1-fe0f\",\n person_running_facing_right: \"1f3c3-200d-27a1-fe0f\",\n runner: \"1f3c3\",\n running: \"1f3c3\",\n \"woman-surfing\": \"1f3c4-200d-2640-fe0f\",\n \"man-surfing\": \"1f3c4-200d-2642-fe0f\",\n surfer: \"1f3c4\",\n sports_medal: \"1f3c5\",\n trophy: \"1f3c6\",\n horse_racing: \"1f3c7\",\n football: \"1f3c8\",\n rugby_football: \"1f3c9\",\n \"woman-swimming\": \"1f3ca-200d-2640-fe0f\",\n \"man-swimming\": \"1f3ca-200d-2642-fe0f\",\n swimmer: \"1f3ca\",\n \"woman-lifting-weights\": \"1f3cb-fe0f-200d-2640-fe0f\",\n \"man-lifting-weights\": \"1f3cb-fe0f-200d-2642-fe0f\",\n weight_lifter: \"1f3cb-fe0f\",\n \"woman-golfing\": \"1f3cc-fe0f-200d-2640-fe0f\",\n \"man-golfing\": \"1f3cc-fe0f-200d-2642-fe0f\",\n golfer: \"1f3cc-fe0f\",\n racing_motorcycle: \"1f3cd-fe0f\",\n racing_car: \"1f3ce-fe0f\",\n cricket_bat_and_ball: \"1f3cf\",\n volleyball: \"1f3d0\",\n field_hockey_stick_and_ball: \"1f3d1\",\n ice_hockey_stick_and_puck: \"1f3d2\",\n table_tennis_paddle_and_ball: \"1f3d3\",\n snow_capped_mountain: \"1f3d4-fe0f\",\n camping: \"1f3d5-fe0f\",\n beach_with_umbrella: \"1f3d6-fe0f\",\n building_construction: \"1f3d7-fe0f\",\n house_buildings: \"1f3d8-fe0f\",\n cityscape: \"1f3d9-fe0f\",\n derelict_house_building: \"1f3da-fe0f\",\n classical_building: \"1f3db-fe0f\",\n desert: \"1f3dc-fe0f\",\n desert_island: \"1f3dd-fe0f\",\n national_park: \"1f3de-fe0f\",\n stadium: \"1f3df-fe0f\",\n house: \"1f3e0\",\n house_with_garden: \"1f3e1\",\n office: \"1f3e2\",\n post_office: \"1f3e3\",\n european_post_office: \"1f3e4\",\n hospital: \"1f3e5\",\n bank: \"1f3e6\",\n atm: \"1f3e7\",\n hotel: \"1f3e8\",\n love_hotel: \"1f3e9\",\n convenience_store: \"1f3ea\",\n school: \"1f3eb\",\n department_store: \"1f3ec\",\n factory: \"1f3ed\",\n izakaya_lantern: \"1f3ee\",\n lantern: \"1f3ee\",\n japanese_castle: \"1f3ef\",\n european_castle: \"1f3f0\",\n \"rainbow-flag\": \"1f3f3-fe0f-200d-1f308\",\n transgender_flag: \"1f3f3-fe0f-200d-26a7-fe0f\",\n waving_white_flag: \"1f3f3-fe0f\",\n pirate_flag: \"1f3f4-200d-2620-fe0f\",\n \"flag-england\": \"1f3f4-e0067-e0062-e0065-e006e-e0067-e007f\",\n \"flag-scotland\": \"1f3f4-e0067-e0062-e0073-e0063-e0074-e007f\",\n \"flag-wales\": \"1f3f4-e0067-e0062-e0077-e006c-e0073-e007f\",\n waving_black_flag: \"1f3f4\",\n rosette: \"1f3f5-fe0f\",\n label: \"1f3f7-fe0f\",\n badminton_racquet_and_shuttlecock: \"1f3f8\",\n bow_and_arrow: \"1f3f9\",\n amphora: \"1f3fa\",\n \"skin-tone-2\": \"1f3fb\",\n \"skin-tone-3\": \"1f3fc\",\n \"skin-tone-4\": \"1f3fd\",\n \"skin-tone-5\": \"1f3fe\",\n \"skin-tone-6\": \"1f3ff\",\n rat: \"1f400\",\n mouse2: \"1f401\",\n ox: \"1f402\",\n water_buffalo: \"1f403\",\n cow2: \"1f404\",\n tiger2: \"1f405\",\n leopard: \"1f406\",\n rabbit2: \"1f407\",\n black_cat: \"1f408-200d-2b1b\",\n cat2: \"1f408\",\n dragon: \"1f409\",\n crocodile: \"1f40a\",\n whale2: \"1f40b\",\n snail: \"1f40c\",\n snake: \"1f40d\",\n racehorse: \"1f40e\",\n ram: \"1f40f\",\n goat: \"1f410\",\n sheep: \"1f411\",\n monkey: \"1f412\",\n rooster: \"1f413\",\n chicken: \"1f414\",\n service_dog: \"1f415-200d-1f9ba\",\n dog2: \"1f415\",\n pig2: \"1f416\",\n boar: \"1f417\",\n elephant: \"1f418\",\n octopus: \"1f419\",\n shell: \"1f41a\",\n bug: \"1f41b\",\n ant: \"1f41c\",\n bee: \"1f41d\",\n honeybee: \"1f41d\",\n ladybug: \"1f41e\",\n lady_beetle: \"1f41e\",\n fish: \"1f41f\",\n tropical_fish: \"1f420\",\n blowfish: \"1f421\",\n turtle: \"1f422\",\n hatching_chick: \"1f423\",\n baby_chick: \"1f424\",\n hatched_chick: \"1f425\",\n phoenix: \"1f426-200d-1f525\",\n black_bird: \"1f426-200d-2b1b\",\n bird: \"1f426\",\n penguin: \"1f427\",\n koala: \"1f428\",\n poodle: \"1f429\",\n dromedary_camel: \"1f42a\",\n camel: \"1f42b\",\n dolphin: \"1f42c\",\n flipper: \"1f42c\",\n mouse: \"1f42d\",\n cow: \"1f42e\",\n tiger: \"1f42f\",\n rabbit: \"1f430\",\n cat: \"1f431\",\n dragon_face: \"1f432\",\n whale: \"1f433\",\n horse: \"1f434\",\n monkey_face: \"1f435\",\n dog: \"1f436\",\n pig: \"1f437\",\n frog: \"1f438\",\n hamster: \"1f439\",\n wolf: \"1f43a\",\n polar_bear: \"1f43b-200d-2744-fe0f\",\n bear: \"1f43b\",\n panda_face: \"1f43c\",\n pig_nose: \"1f43d\",\n feet: \"1f43e\",\n paw_prints: \"1f43e\",\n chipmunk: \"1f43f-fe0f\",\n eyes: \"1f440\",\n \"eye-in-speech-bubble\": \"1f441-fe0f-200d-1f5e8-fe0f\",\n eye: \"1f441-fe0f\",\n ear: \"1f442\",\n nose: \"1f443\",\n lips: \"1f444\",\n tongue: \"1f445\",\n point_up_2: \"1f446\",\n point_down: \"1f447\",\n point_left: \"1f448\",\n point_right: \"1f449\",\n facepunch: \"1f44a\",\n punch: \"1f44a\",\n wave: \"1f44b\",\n ok_hand: \"1f44c\",\n \"+1\": \"1f44d\",\n thumbsup: \"1f44d\",\n \"-1\": \"1f44e\",\n thumbsdown: \"1f44e\",\n clap: \"1f44f\",\n open_hands: \"1f450\",\n crown: \"1f451\",\n womans_hat: \"1f452\",\n eyeglasses: \"1f453\",\n necktie: \"1f454\",\n shirt: \"1f455\",\n tshirt: \"1f455\",\n jeans: \"1f456\",\n dress: \"1f457\",\n kimono: \"1f458\",\n bikini: \"1f459\",\n womans_clothes: \"1f45a\",\n purse: \"1f45b\",\n handbag: \"1f45c\",\n pouch: \"1f45d\",\n mans_shoe: \"1f45e\",\n shoe: \"1f45e\",\n athletic_shoe: \"1f45f\",\n high_heel: \"1f460\",\n sandal: \"1f461\",\n boot: \"1f462\",\n footprints: \"1f463\",\n bust_in_silhouette: \"1f464\",\n busts_in_silhouette: \"1f465\",\n boy: \"1f466\",\n girl: \"1f467\",\n \"male-farmer\": \"1f468-200d-1f33e\",\n \"male-cook\": \"1f468-200d-1f373\",\n man_feeding_baby: \"1f468-200d-1f37c\",\n \"male-student\": \"1f468-200d-1f393\",\n \"male-singer\": \"1f468-200d-1f3a4\",\n \"male-artist\": \"1f468-200d-1f3a8\",\n \"male-teacher\": \"1f468-200d-1f3eb\",\n \"male-factory-worker\": \"1f468-200d-1f3ed\",\n \"man-boy-boy\": \"1f468-200d-1f466-200d-1f466\",\n \"man-boy\": \"1f468-200d-1f466\",\n \"man-girl-boy\": \"1f468-200d-1f467-200d-1f466\",\n \"man-girl-girl\": \"1f468-200d-1f467-200d-1f467\",\n \"man-girl\": \"1f468-200d-1f467\",\n \"man-man-boy\": \"1f468-200d-1f468-200d-1f466\",\n \"man-man-boy-boy\": \"1f468-200d-1f468-200d-1f466-200d-1f466\",\n \"man-man-girl\": \"1f468-200d-1f468-200d-1f467\",\n \"man-man-girl-boy\": \"1f468-200d-1f468-200d-1f467-200d-1f466\",\n \"man-man-girl-girl\": \"1f468-200d-1f468-200d-1f467-200d-1f467\",\n \"man-woman-boy\": \"1f468-200d-1f469-200d-1f466\",\n \"man-woman-boy-boy\": \"1f468-200d-1f469-200d-1f466-200d-1f466\",\n \"man-woman-girl\": \"1f468-200d-1f469-200d-1f467\",\n \"man-woman-girl-boy\": \"1f468-200d-1f469-200d-1f467-200d-1f466\",\n \"man-woman-girl-girl\": \"1f468-200d-1f469-200d-1f467-200d-1f467\",\n \"male-technologist\": \"1f468-200d-1f4bb\",\n \"male-office-worker\": \"1f468-200d-1f4bc\",\n \"male-mechanic\": \"1f468-200d-1f527\",\n \"male-scientist\": \"1f468-200d-1f52c\",\n \"male-astronaut\": \"1f468-200d-1f680\",\n \"male-firefighter\": \"1f468-200d-1f692\",\n man_with_white_cane_facing_right: \"1f468-200d-1f9af-200d-27a1-fe0f\",\n man_with_probing_cane: \"1f468-200d-1f9af\",\n red_haired_man: \"1f468-200d-1f9b0\",\n curly_haired_man: \"1f468-200d-1f9b1\",\n bald_man: \"1f468-200d-1f9b2\",\n white_haired_man: \"1f468-200d-1f9b3\",\n man_in_motorized_wheelchair_facing_right: \"1f468-200d-1f9bc-200d-27a1-fe0f\",\n man_in_motorized_wheelchair: \"1f468-200d-1f9bc\",\n man_in_manual_wheelchair_facing_right: \"1f468-200d-1f9bd-200d-27a1-fe0f\",\n man_in_manual_wheelchair: \"1f468-200d-1f9bd\",\n \"male-doctor\": \"1f468-200d-2695-fe0f\",\n \"male-judge\": \"1f468-200d-2696-fe0f\",\n \"male-pilot\": \"1f468-200d-2708-fe0f\",\n \"man-heart-man\": \"1f468-200d-2764-fe0f-200d-1f468\",\n \"man-kiss-man\": \"1f468-200d-2764-fe0f-200d-1f48b-200d-1f468\",\n man: \"1f468\",\n \"female-farmer\": \"1f469-200d-1f33e\",\n \"female-cook\": \"1f469-200d-1f373\",\n woman_feeding_baby: \"1f469-200d-1f37c\",\n \"female-student\": \"1f469-200d-1f393\",\n \"female-singer\": \"1f469-200d-1f3a4\",\n \"female-artist\": \"1f469-200d-1f3a8\",\n \"female-teacher\": \"1f469-200d-1f3eb\",\n \"female-factory-worker\": \"1f469-200d-1f3ed\",\n \"woman-boy-boy\": \"1f469-200d-1f466-200d-1f466\",\n \"woman-boy\": \"1f469-200d-1f466\",\n \"woman-girl-boy\": \"1f469-200d-1f467-200d-1f466\",\n \"woman-girl-girl\": \"1f469-200d-1f467-200d-1f467\",\n \"woman-girl\": \"1f469-200d-1f467\",\n \"woman-woman-boy\": \"1f469-200d-1f469-200d-1f466\",\n \"woman-woman-boy-boy\": \"1f469-200d-1f469-200d-1f466-200d-1f466\",\n \"woman-woman-girl\": \"1f469-200d-1f469-200d-1f467\",\n \"woman-woman-girl-boy\": \"1f469-200d-1f469-200d-1f467-200d-1f466\",\n \"woman-woman-girl-girl\": \"1f469-200d-1f469-200d-1f467-200d-1f467\",\n \"female-technologist\": \"1f469-200d-1f4bb\",\n \"female-office-worker\": \"1f469-200d-1f4bc\",\n \"female-mechanic\": \"1f469-200d-1f527\",\n \"female-scientist\": \"1f469-200d-1f52c\",\n \"female-astronaut\": \"1f469-200d-1f680\",\n \"female-firefighter\": \"1f469-200d-1f692\",\n woman_with_white_cane_facing_right: \"1f469-200d-1f9af-200d-27a1-fe0f\",\n woman_with_probing_cane: \"1f469-200d-1f9af\",\n red_haired_woman: \"1f469-200d-1f9b0\",\n curly_haired_woman: \"1f469-200d-1f9b1\",\n bald_woman: \"1f469-200d-1f9b2\",\n white_haired_woman: \"1f469-200d-1f9b3\",\n woman_in_motorized_wheelchair_facing_right: \"1f469-200d-1f9bc-200d-27a1-fe0f\",\n woman_in_motorized_wheelchair: \"1f469-200d-1f9bc\",\n woman_in_manual_wheelchair_facing_right: \"1f469-200d-1f9bd-200d-27a1-fe0f\",\n woman_in_manual_wheelchair: \"1f469-200d-1f9bd\",\n \"female-doctor\": \"1f469-200d-2695-fe0f\",\n \"female-judge\": \"1f469-200d-2696-fe0f\",\n \"female-pilot\": \"1f469-200d-2708-fe0f\",\n \"woman-heart-man\": \"1f469-200d-2764-fe0f-200d-1f468\",\n \"woman-heart-woman\": \"1f469-200d-2764-fe0f-200d-1f469\",\n \"woman-kiss-man\": \"1f469-200d-2764-fe0f-200d-1f48b-200d-1f468\",\n \"woman-kiss-woman\": \"1f469-200d-2764-fe0f-200d-1f48b-200d-1f469\",\n woman: \"1f469\",\n family: \"1f46a\",\n man_and_woman_holding_hands: \"1f46b\",\n woman_and_man_holding_hands: \"1f46b\",\n couple: \"1f46b\",\n two_men_holding_hands: \"1f46c\",\n men_holding_hands: \"1f46c\",\n two_women_holding_hands: \"1f46d\",\n women_holding_hands: \"1f46d\",\n \"female-police-officer\": \"1f46e-200d-2640-fe0f\",\n \"male-police-officer\": \"1f46e-200d-2642-fe0f\",\n cop: \"1f46e\",\n \"women-with-bunny-ears-partying\": \"1f46f-200d-2640-fe0f\",\n \"woman-with-bunny-ears-partying\": \"1f46f-200d-2640-fe0f\",\n \"men-with-bunny-ears-partying\": \"1f46f-200d-2642-fe0f\",\n \"man-with-bunny-ears-partying\": \"1f46f-200d-2642-fe0f\",\n dancers: \"1f46f\",\n woman_with_veil: \"1f470-200d-2640-fe0f\",\n man_with_veil: \"1f470-200d-2642-fe0f\",\n bride_with_veil: \"1f470\",\n \"blond-haired-woman\": \"1f471-200d-2640-fe0f\",\n \"blond-haired-man\": \"1f471-200d-2642-fe0f\",\n person_with_blond_hair: \"1f471\",\n man_with_gua_pi_mao: \"1f472\",\n \"woman-wearing-turban\": \"1f473-200d-2640-fe0f\",\n \"man-wearing-turban\": \"1f473-200d-2642-fe0f\",\n man_with_turban: \"1f473\",\n older_man: \"1f474\",\n older_woman: \"1f475\",\n baby: \"1f476\",\n \"female-construction-worker\": \"1f477-200d-2640-fe0f\",\n \"male-construction-worker\": \"1f477-200d-2642-fe0f\",\n construction_worker: \"1f477\",\n princess: \"1f478\",\n japanese_ogre: \"1f479\",\n japanese_goblin: \"1f47a\",\n ghost: \"1f47b\",\n angel: \"1f47c\",\n alien: \"1f47d\",\n space_invader: \"1f47e\",\n imp: \"1f47f\",\n skull: \"1f480\",\n \"woman-tipping-hand\": \"1f481-200d-2640-fe0f\",\n \"man-tipping-hand\": \"1f481-200d-2642-fe0f\",\n information_desk_person: \"1f481\",\n \"female-guard\": \"1f482-200d-2640-fe0f\",\n \"male-guard\": \"1f482-200d-2642-fe0f\",\n guardsman: \"1f482\",\n dancer: \"1f483\",\n lipstick: \"1f484\",\n nail_care: \"1f485\",\n \"woman-getting-massage\": \"1f486-200d-2640-fe0f\",\n \"man-getting-massage\": \"1f486-200d-2642-fe0f\",\n massage: \"1f486\",\n \"woman-getting-haircut\": \"1f487-200d-2640-fe0f\",\n \"man-getting-haircut\": \"1f487-200d-2642-fe0f\",\n haircut: \"1f487\",\n barber: \"1f488\",\n syringe: \"1f489\",\n pill: \"1f48a\",\n kiss: \"1f48b\",\n love_letter: \"1f48c\",\n ring: \"1f48d\",\n gem: \"1f48e\",\n couplekiss: \"1f48f\",\n bouquet: \"1f490\",\n couple_with_heart: \"1f491\",\n wedding: \"1f492\",\n heartbeat: \"1f493\",\n broken_heart: \"1f494\",\n two_hearts: \"1f495\",\n sparkling_heart: \"1f496\",\n heartpulse: \"1f497\",\n cupid: \"1f498\",\n blue_heart: \"1f499\",\n green_heart: \"1f49a\",\n yellow_heart: \"1f49b\",\n purple_heart: \"1f49c\",\n gift_heart: \"1f49d\",\n revolving_hearts: \"1f49e\",\n heart_decoration: \"1f49f\",\n diamond_shape_with_a_dot_inside: \"1f4a0\",\n bulb: \"1f4a1\",\n anger: \"1f4a2\",\n bomb: \"1f4a3\",\n zzz: \"1f4a4\",\n boom: \"1f4a5\",\n collision: \"1f4a5\",\n sweat_drops: \"1f4a6\",\n droplet: \"1f4a7\",\n dash: \"1f4a8\",\n hankey: \"1f4a9\",\n poop: \"1f4a9\",\n shit: \"1f4a9\",\n muscle: \"1f4aa\",\n dizzy: \"1f4ab\",\n speech_balloon: \"1f4ac\",\n thought_balloon: \"1f4ad\",\n white_flower: \"1f4ae\",\n moneybag: \"1f4b0\",\n currency_exchange: \"1f4b1\",\n heavy_dollar_sign: \"1f4b2\",\n credit_card: \"1f4b3\",\n yen: \"1f4b4\",\n dollar: \"1f4b5\",\n euro: \"1f4b6\",\n pound: \"1f4b7\",\n money_with_wings: \"1f4b8\",\n chart: \"1f4b9\",\n seat: \"1f4ba\",\n computer: \"1f4bb\",\n briefcase: \"1f4bc\",\n minidisc: \"1f4bd\",\n floppy_disk: \"1f4be\",\n cd: \"1f4bf\",\n dvd: \"1f4c0\",\n file_folder: \"1f4c1\",\n open_file_folder: \"1f4c2\",\n page_with_curl: \"1f4c3\",\n page_facing_up: \"1f4c4\",\n date: \"1f4c5\",\n calendar: \"1f4c6\",\n card_index: \"1f4c7\",\n chart_with_upwards_trend: \"1f4c8\",\n chart_with_downwards_trend: \"1f4c9\",\n bar_chart: \"1f4ca\",\n clipboard: \"1f4cb\",\n pushpin: \"1f4cc\",\n round_pushpin: \"1f4cd\",\n paperclip: \"1f4ce\",\n straight_ruler: \"1f4cf\",\n triangular_ruler: \"1f4d0\",\n bookmark_tabs: \"1f4d1\",\n ledger: \"1f4d2\",\n notebook: \"1f4d3\",\n notebook_with_decorative_cover: \"1f4d4\",\n closed_book: \"1f4d5\",\n book: \"1f4d6\",\n open_book: \"1f4d6\",\n green_book: \"1f4d7\",\n blue_book: \"1f4d8\",\n orange_book: \"1f4d9\",\n books: \"1f4da\",\n name_badge: \"1f4db\",\n scroll: \"1f4dc\",\n memo: \"1f4dd\",\n pencil: \"1f4dd\",\n telephone_receiver: \"1f4de\",\n pager: \"1f4df\",\n fax: \"1f4e0\",\n satellite_antenna: \"1f4e1\",\n loudspeaker: \"1f4e2\",\n mega: \"1f4e3\",\n outbox_tray: \"1f4e4\",\n inbox_tray: \"1f4e5\",\n package: \"1f4e6\",\n \"e-mail\": \"1f4e7\",\n incoming_envelope: \"1f4e8\",\n envelope_with_arrow: \"1f4e9\",\n mailbox_closed: \"1f4ea\",\n mailbox: \"1f4eb\",\n mailbox_with_mail: \"1f4ec\",\n mailbox_with_no_mail: \"1f4ed\",\n postbox: \"1f4ee\",\n postal_horn: \"1f4ef\",\n newspaper: \"1f4f0\",\n iphone: \"1f4f1\",\n calling: \"1f4f2\",\n vibration_mode: \"1f4f3\",\n mobile_phone_off: \"1f4f4\",\n no_mobile_phones: \"1f4f5\",\n signal_strength: \"1f4f6\",\n camera: \"1f4f7\",\n camera_with_flash: \"1f4f8\",\n video_camera: \"1f4f9\",\n tv: \"1f4fa\",\n radio: \"1f4fb\",\n vhs: \"1f4fc\",\n film_projector: \"1f4fd-fe0f\",\n prayer_beads: \"1f4ff\",\n twisted_rightwards_arrows: \"1f500\",\n repeat: \"1f501\",\n repeat_one: \"1f502\",\n arrows_clockwise: \"1f503\",\n arrows_counterclockwise: \"1f504\",\n low_brightness: \"1f505\",\n high_brightness: \"1f506\",\n mute: \"1f507\",\n speaker: \"1f508\",\n sound: \"1f509\",\n loud_sound: \"1f50a\",\n battery: \"1f50b\",\n electric_plug: \"1f50c\",\n mag: \"1f50d\",\n mag_right: \"1f50e\",\n lock_with_ink_pen: \"1f50f\",\n closed_lock_with_key: \"1f510\",\n key: \"1f511\",\n lock: \"1f512\",\n unlock: \"1f513\",\n bell: \"1f514\",\n no_bell: \"1f515\",\n bookmark: \"1f516\",\n link: \"1f517\",\n radio_button: \"1f518\",\n back: \"1f519\",\n end: \"1f51a\",\n on: \"1f51b\",\n soon: \"1f51c\",\n top: \"1f51d\",\n underage: \"1f51e\",\n keycap_ten: \"1f51f\",\n capital_abcd: \"1f520\",\n abcd: \"1f521\",\n symbols: \"1f523\",\n abc: \"1f524\",\n fire: \"1f525\",\n flashlight: \"1f526\",\n wrench: \"1f527\",\n hammer: \"1f528\",\n nut_and_bolt: \"1f529\",\n hocho: \"1f52a\",\n knife: \"1f52a\",\n gun: \"1f52b\",\n microscope: \"1f52c\",\n telescope: \"1f52d\",\n crystal_ball: \"1f52e\",\n six_pointed_star: \"1f52f\",\n beginner: \"1f530\",\n trident: \"1f531\",\n black_square_button: \"1f532\",\n white_square_button: \"1f533\",\n red_circle: \"1f534\",\n large_blue_circle: \"1f535\",\n large_orange_diamond: \"1f536\",\n large_blue_diamond: \"1f537\",\n small_orange_diamond: \"1f538\",\n small_blue_diamond: \"1f539\",\n small_red_triangle: \"1f53a\",\n small_red_triangle_down: \"1f53b\",\n arrow_up_small: \"1f53c\",\n arrow_down_small: \"1f53d\",\n om_symbol: \"1f549-fe0f\",\n dove_of_peace: \"1f54a-fe0f\",\n kaaba: \"1f54b\",\n mosque: \"1f54c\",\n synagogue: \"1f54d\",\n menorah_with_nine_branches: \"1f54e\",\n clock1: \"1f550\",\n clock2: \"1f551\",\n clock3: \"1f552\",\n clock4: \"1f553\",\n clock5: \"1f554\",\n clock6: \"1f555\",\n clock7: \"1f556\",\n clock8: \"1f557\",\n clock9: \"1f558\",\n clock10: \"1f559\",\n clock11: \"1f55a\",\n clock12: \"1f55b\",\n clock130: \"1f55c\",\n clock230: \"1f55d\",\n clock330: \"1f55e\",\n clock430: \"1f55f\",\n clock530: \"1f560\",\n clock630: \"1f561\",\n clock730: \"1f562\",\n clock830: \"1f563\",\n clock930: \"1f564\",\n clock1030: \"1f565\",\n clock1130: \"1f566\",\n clock1230: \"1f567\",\n candle: \"1f56f-fe0f\",\n mantelpiece_clock: \"1f570-fe0f\",\n hole: \"1f573-fe0f\",\n man_in_business_suit_levitating: \"1f574-fe0f\",\n \"female-detective\": \"1f575-fe0f-200d-2640-fe0f\",\n \"male-detective\": \"1f575-fe0f-200d-2642-fe0f\",\n sleuth_or_spy: \"1f575-fe0f\",\n dark_sunglasses: \"1f576-fe0f\",\n spider: \"1f577-fe0f\",\n spider_web: \"1f578-fe0f\",\n joystick: \"1f579-fe0f\",\n man_dancing: \"1f57a\",\n linked_paperclips: \"1f587-fe0f\",\n lower_left_ballpoint_pen: \"1f58a-fe0f\",\n lower_left_fountain_pen: \"1f58b-fe0f\",\n lower_left_paintbrush: \"1f58c-fe0f\",\n lower_left_crayon: \"1f58d-fe0f\",\n raised_hand_with_fingers_splayed: \"1f590-fe0f\",\n middle_finger: \"1f595\",\n reversed_hand_with_middle_finger_extended: \"1f595\",\n \"spock-hand\": \"1f596\",\n black_heart: \"1f5a4\",\n desktop_computer: \"1f5a5-fe0f\",\n printer: \"1f5a8-fe0f\",\n three_button_mouse: \"1f5b1-fe0f\",\n trackball: \"1f5b2-fe0f\",\n frame_with_picture: \"1f5bc-fe0f\",\n card_index_dividers: \"1f5c2-fe0f\",\n card_file_box: \"1f5c3-fe0f\",\n file_cabinet: \"1f5c4-fe0f\",\n wastebasket: \"1f5d1-fe0f\",\n spiral_note_pad: \"1f5d2-fe0f\",\n spiral_calendar_pad: \"1f5d3-fe0f\",\n compression: \"1f5dc-fe0f\",\n old_key: \"1f5dd-fe0f\",\n rolled_up_newspaper: \"1f5de-fe0f\",\n dagger_knife: \"1f5e1-fe0f\",\n speaking_head_in_silhouette: \"1f5e3-fe0f\",\n left_speech_bubble: \"1f5e8-fe0f\",\n right_anger_bubble: \"1f5ef-fe0f\",\n ballot_box_with_ballot: \"1f5f3-fe0f\",\n world_map: \"1f5fa-fe0f\",\n mount_fuji: \"1f5fb\",\n tokyo_tower: \"1f5fc\",\n statue_of_liberty: \"1f5fd\",\n japan: \"1f5fe\",\n moyai: \"1f5ff\",\n grinning: \"1f600\",\n grin: \"1f601\",\n joy: \"1f602\",\n smiley: \"1f603\",\n smile: \"1f604\",\n sweat_smile: \"1f605\",\n laughing: \"1f606\",\n satisfied: \"1f606\",\n innocent: \"1f607\",\n smiling_imp: \"1f608\",\n wink: \"1f609\",\n blush: \"1f60a\",\n yum: \"1f60b\",\n relieved: \"1f60c\",\n heart_eyes: \"1f60d\",\n sunglasses: \"1f60e\",\n smirk: \"1f60f\",\n neutral_face: \"1f610\",\n expressionless: \"1f611\",\n unamused: \"1f612\",\n sweat: \"1f613\",\n pensive: \"1f614\",\n confused: \"1f615\",\n confounded: \"1f616\",\n kissing: \"1f617\",\n kissing_heart: \"1f618\",\n kissing_smiling_eyes: \"1f619\",\n kissing_closed_eyes: \"1f61a\",\n stuck_out_tongue: \"1f61b\",\n stuck_out_tongue_winking_eye: \"1f61c\",\n stuck_out_tongue_closed_eyes: \"1f61d\",\n disappointed: \"1f61e\",\n worried: \"1f61f\",\n angry: \"1f620\",\n rage: \"1f621\",\n cry: \"1f622\",\n persevere: \"1f623\",\n triumph: \"1f624\",\n disappointed_relieved: \"1f625\",\n frowning: \"1f626\",\n anguished: \"1f627\",\n fearful: \"1f628\",\n weary: \"1f629\",\n sleepy: \"1f62a\",\n tired_face: \"1f62b\",\n grimacing: \"1f62c\",\n sob: \"1f62d\",\n face_exhaling: \"1f62e-200d-1f4a8\",\n open_mouth: \"1f62e\",\n hushed: \"1f62f\",\n cold_sweat: \"1f630\",\n scream: \"1f631\",\n astonished: \"1f632\",\n flushed: \"1f633\",\n sleeping: \"1f634\",\n face_with_spiral_eyes: \"1f635-200d-1f4ab\",\n dizzy_face: \"1f635\",\n face_in_clouds: \"1f636-200d-1f32b-fe0f\",\n no_mouth: \"1f636\",\n mask: \"1f637\",\n smile_cat: \"1f638\",\n joy_cat: \"1f639\",\n smiley_cat: \"1f63a\",\n heart_eyes_cat: \"1f63b\",\n smirk_cat: \"1f63c\",\n kissing_cat: \"1f63d\",\n pouting_cat: \"1f63e\",\n crying_cat_face: \"1f63f\",\n scream_cat: \"1f640\",\n slightly_frowning_face: \"1f641\",\n head_shaking_horizontally: \"1f642-200d-2194-fe0f\",\n head_shaking_vertically: \"1f642-200d-2195-fe0f\",\n slightly_smiling_face: \"1f642\",\n upside_down_face: \"1f643\",\n face_with_rolling_eyes: \"1f644\",\n \"woman-gesturing-no\": \"1f645-200d-2640-fe0f\",\n \"man-gesturing-no\": \"1f645-200d-2642-fe0f\",\n no_good: \"1f645\",\n \"woman-gesturing-ok\": \"1f646-200d-2640-fe0f\",\n \"man-gesturing-ok\": \"1f646-200d-2642-fe0f\",\n ok_woman: \"1f646\",\n \"woman-bowing\": \"1f647-200d-2640-fe0f\",\n \"man-bowing\": \"1f647-200d-2642-fe0f\",\n bow: \"1f647\",\n see_no_evil: \"1f648\",\n hear_no_evil: \"1f649\",\n speak_no_evil: \"1f64a\",\n \"woman-raising-hand\": \"1f64b-200d-2640-fe0f\",\n \"man-raising-hand\": \"1f64b-200d-2642-fe0f\",\n raising_hand: \"1f64b\",\n raised_hands: \"1f64c\",\n \"woman-frowning\": \"1f64d-200d-2640-fe0f\",\n \"man-frowning\": \"1f64d-200d-2642-fe0f\",\n person_frowning: \"1f64d\",\n \"woman-pouting\": \"1f64e-200d-2640-fe0f\",\n \"man-pouting\": \"1f64e-200d-2642-fe0f\",\n person_with_pouting_face: \"1f64e\",\n pray: \"1f64f\",\n rocket: \"1f680\",\n helicopter: \"1f681\",\n steam_locomotive: \"1f682\",\n railway_car: \"1f683\",\n bullettrain_side: \"1f684\",\n bullettrain_front: \"1f685\",\n train2: \"1f686\",\n metro: \"1f687\",\n light_rail: \"1f688\",\n station: \"1f689\",\n tram: \"1f68a\",\n train: \"1f68b\",\n bus: \"1f68c\",\n oncoming_bus: \"1f68d\",\n trolleybus: \"1f68e\",\n busstop: \"1f68f\",\n minibus: \"1f690\",\n ambulance: \"1f691\",\n fire_engine: \"1f692\",\n police_car: \"1f693\",\n oncoming_police_car: \"1f694\",\n taxi: \"1f695\",\n oncoming_taxi: \"1f696\",\n car: \"1f697\",\n red_car: \"1f697\",\n oncoming_automobile: \"1f698\",\n blue_car: \"1f699\",\n truck: \"1f69a\",\n articulated_lorry: \"1f69b\",\n tractor: \"1f69c\",\n monorail: \"1f69d\",\n mountain_railway: \"1f69e\",\n suspension_railway: \"1f69f\",\n mountain_cableway: \"1f6a0\",\n aerial_tramway: \"1f6a1\",\n ship: \"1f6a2\",\n \"woman-rowing-boat\": \"1f6a3-200d-2640-fe0f\",\n \"man-rowing-boat\": \"1f6a3-200d-2642-fe0f\",\n rowboat: \"1f6a3\",\n speedboat: \"1f6a4\",\n traffic_light: \"1f6a5\",\n vertical_traffic_light: \"1f6a6\",\n construction: \"1f6a7\",\n rotating_light: \"1f6a8\",\n triangular_flag_on_post: \"1f6a9\",\n door: \"1f6aa\",\n no_entry_sign: \"1f6ab\",\n smoking: \"1f6ac\",\n no_smoking: \"1f6ad\",\n put_litter_in_its_place: \"1f6ae\",\n do_not_litter: \"1f6af\",\n potable_water: \"1f6b0\",\n \"non-potable_water\": \"1f6b1\",\n bike: \"1f6b2\",\n no_bicycles: \"1f6b3\",\n \"woman-biking\": \"1f6b4-200d-2640-fe0f\",\n \"man-biking\": \"1f6b4-200d-2642-fe0f\",\n bicyclist: \"1f6b4\",\n \"woman-mountain-biking\": \"1f6b5-200d-2640-fe0f\",\n \"man-mountain-biking\": \"1f6b5-200d-2642-fe0f\",\n mountain_bicyclist: \"1f6b5\",\n \"woman-walking\": \"1f6b6-200d-2640-fe0f\",\n woman_walking_facing_right: \"1f6b6-200d-2640-fe0f-200d-27a1-fe0f\",\n \"man-walking\": \"1f6b6-200d-2642-fe0f\",\n man_walking_facing_right: \"1f6b6-200d-2642-fe0f-200d-27a1-fe0f\",\n person_walking_facing_right: \"1f6b6-200d-27a1-fe0f\",\n walking: \"1f6b6\",\n no_pedestrians: \"1f6b7\",\n children_crossing: \"1f6b8\",\n mens: \"1f6b9\",\n womens: \"1f6ba\",\n restroom: \"1f6bb\",\n baby_symbol: \"1f6bc\",\n toilet: \"1f6bd\",\n wc: \"1f6be\",\n shower: \"1f6bf\",\n bath: \"1f6c0\",\n bathtub: \"1f6c1\",\n passport_control: \"1f6c2\",\n customs: \"1f6c3\",\n baggage_claim: \"1f6c4\",\n left_luggage: \"1f6c5\",\n couch_and_lamp: \"1f6cb-fe0f\",\n sleeping_accommodation: \"1f6cc\",\n shopping_bags: \"1f6cd-fe0f\",\n bellhop_bell: \"1f6ce-fe0f\",\n bed: \"1f6cf-fe0f\",\n place_of_worship: \"1f6d0\",\n octagonal_sign: \"1f6d1\",\n shopping_trolley: \"1f6d2\",\n hindu_temple: \"1f6d5\",\n hut: \"1f6d6\",\n elevator: \"1f6d7\",\n wireless: \"1f6dc\",\n playground_slide: \"1f6dd\",\n wheel: \"1f6de\",\n ring_buoy: \"1f6df\",\n hammer_and_wrench: \"1f6e0-fe0f\",\n shield: \"1f6e1-fe0f\",\n oil_drum: \"1f6e2-fe0f\",\n motorway: \"1f6e3-fe0f\",\n railway_track: \"1f6e4-fe0f\",\n motor_boat: \"1f6e5-fe0f\",\n small_airplane: \"1f6e9-fe0f\",\n airplane_departure: \"1f6eb\",\n airplane_arriving: \"1f6ec\",\n satellite: \"1f6f0-fe0f\",\n passenger_ship: \"1f6f3-fe0f\",\n scooter: \"1f6f4\",\n motor_scooter: \"1f6f5\",\n canoe: \"1f6f6\",\n sled: \"1f6f7\",\n flying_saucer: \"1f6f8\",\n skateboard: \"1f6f9\",\n auto_rickshaw: \"1f6fa\",\n pickup_truck: \"1f6fb\",\n roller_skate: \"1f6fc\",\n large_orange_circle: \"1f7e0\",\n large_yellow_circle: \"1f7e1\",\n large_green_circle: \"1f7e2\",\n large_purple_circle: \"1f7e3\",\n large_brown_circle: \"1f7e4\",\n large_red_square: \"1f7e5\",\n large_blue_square: \"1f7e6\",\n large_orange_square: \"1f7e7\",\n large_yellow_square: \"1f7e8\",\n large_green_square: \"1f7e9\",\n large_purple_square: \"1f7ea\",\n large_brown_square: \"1f7eb\",\n heavy_equals_sign: \"1f7f0\",\n pinched_fingers: \"1f90c\",\n white_heart: \"1f90d\",\n brown_heart: \"1f90e\",\n pinching_hand: \"1f90f\",\n zipper_mouth_face: \"1f910\",\n money_mouth_face: \"1f911\",\n face_with_thermometer: \"1f912\",\n nerd_face: \"1f913\",\n thinking_face: \"1f914\",\n face_with_head_bandage: \"1f915\",\n robot_face: \"1f916\",\n hugging_face: \"1f917\",\n the_horns: \"1f918\",\n sign_of_the_horns: \"1f918\",\n call_me_hand: \"1f919\",\n raised_back_of_hand: \"1f91a\",\n \"left-facing_fist\": \"1f91b\",\n \"right-facing_fist\": \"1f91c\",\n handshake: \"1f91d\",\n crossed_fingers: \"1f91e\",\n hand_with_index_and_middle_fingers_crossed: \"1f91e\",\n i_love_you_hand_sign: \"1f91f\",\n face_with_cowboy_hat: \"1f920\",\n clown_face: \"1f921\",\n nauseated_face: \"1f922\",\n rolling_on_the_floor_laughing: \"1f923\",\n drooling_face: \"1f924\",\n lying_face: \"1f925\",\n \"woman-facepalming\": \"1f926-200d-2640-fe0f\",\n \"man-facepalming\": \"1f926-200d-2642-fe0f\",\n face_palm: \"1f926\",\n sneezing_face: \"1f927\",\n face_with_raised_eyebrow: \"1f928\",\n face_with_one_eyebrow_raised: \"1f928\",\n \"star-struck\": \"1f929\",\n grinning_face_with_star_eyes: \"1f929\",\n zany_face: \"1f92a\",\n grinning_face_with_one_large_and_one_small_eye: \"1f92a\",\n shushing_face: \"1f92b\",\n face_with_finger_covering_closed_lips: \"1f92b\",\n face_with_symbols_on_mouth: \"1f92c\",\n serious_face_with_symbols_covering_mouth: \"1f92c\",\n face_with_hand_over_mouth: \"1f92d\",\n smiling_face_with_smiling_eyes_and_hand_covering_mouth: \"1f92d\",\n face_vomiting: \"1f92e\",\n face_with_open_mouth_vomiting: \"1f92e\",\n exploding_head: \"1f92f\",\n shocked_face_with_exploding_head: \"1f92f\",\n pregnant_woman: \"1f930\",\n \"breast-feeding\": \"1f931\",\n palms_up_together: \"1f932\",\n selfie: \"1f933\",\n prince: \"1f934\",\n woman_in_tuxedo: \"1f935-200d-2640-fe0f\",\n man_in_tuxedo: \"1f935-200d-2642-fe0f\",\n person_in_tuxedo: \"1f935\",\n mrs_claus: \"1f936\",\n mother_christmas: \"1f936\",\n \"woman-shrugging\": \"1f937-200d-2640-fe0f\",\n \"man-shrugging\": \"1f937-200d-2642-fe0f\",\n shrug: \"1f937\",\n \"woman-cartwheeling\": \"1f938-200d-2640-fe0f\",\n \"man-cartwheeling\": \"1f938-200d-2642-fe0f\",\n person_doing_cartwheel: \"1f938\",\n \"woman-juggling\": \"1f939-200d-2640-fe0f\",\n \"man-juggling\": \"1f939-200d-2642-fe0f\",\n juggling: \"1f939\",\n fencer: \"1f93a\",\n \"woman-wrestling\": \"1f93c-200d-2640-fe0f\",\n \"man-wrestling\": \"1f93c-200d-2642-fe0f\",\n wrestlers: \"1f93c\",\n \"woman-playing-water-polo\": \"1f93d-200d-2640-fe0f\",\n \"man-playing-water-polo\": \"1f93d-200d-2642-fe0f\",\n water_polo: \"1f93d\",\n \"woman-playing-handball\": \"1f93e-200d-2640-fe0f\",\n \"man-playing-handball\": \"1f93e-200d-2642-fe0f\",\n handball: \"1f93e\",\n diving_mask: \"1f93f\",\n wilted_flower: \"1f940\",\n drum_with_drumsticks: \"1f941\",\n clinking_glasses: \"1f942\",\n tumbler_glass: \"1f943\",\n spoon: \"1f944\",\n goal_net: \"1f945\",\n first_place_medal: \"1f947\",\n second_place_medal: \"1f948\",\n third_place_medal: \"1f949\",\n boxing_glove: \"1f94a\",\n martial_arts_uniform: \"1f94b\",\n curling_stone: \"1f94c\",\n lacrosse: \"1f94d\",\n softball: \"1f94e\",\n flying_disc: \"1f94f\",\n croissant: \"1f950\",\n avocado: \"1f951\",\n cucumber: \"1f952\",\n bacon: \"1f953\",\n potato: \"1f954\",\n carrot: \"1f955\",\n baguette_bread: \"1f956\",\n green_salad: \"1f957\",\n shallow_pan_of_food: \"1f958\",\n stuffed_flatbread: \"1f959\",\n egg: \"1f95a\",\n glass_of_milk: \"1f95b\",\n peanuts: \"1f95c\",\n kiwifruit: \"1f95d\",\n pancakes: \"1f95e\",\n dumpling: \"1f95f\",\n fortune_cookie: \"1f960\",\n takeout_box: \"1f961\",\n chopsticks: \"1f962\",\n bowl_with_spoon: \"1f963\",\n cup_with_straw: \"1f964\",\n coconut: \"1f965\",\n broccoli: \"1f966\",\n pie: \"1f967\",\n pretzel: \"1f968\",\n cut_of_meat: \"1f969\",\n sandwich: \"1f96a\",\n canned_food: \"1f96b\",\n leafy_green: \"1f96c\",\n mango: \"1f96d\",\n moon_cake: \"1f96e\",\n bagel: \"1f96f\",\n smiling_face_with_3_hearts: \"1f970\",\n yawning_face: \"1f971\",\n smiling_face_with_tear: \"1f972\",\n partying_face: \"1f973\",\n woozy_face: \"1f974\",\n hot_face: \"1f975\",\n cold_face: \"1f976\",\n ninja: \"1f977\",\n disguised_face: \"1f978\",\n face_holding_back_tears: \"1f979\",\n pleading_face: \"1f97a\",\n sari: \"1f97b\",\n lab_coat: \"1f97c\",\n goggles: \"1f97d\",\n hiking_boot: \"1f97e\",\n womans_flat_shoe: \"1f97f\",\n crab: \"1f980\",\n lion_face: \"1f981\",\n scorpion: \"1f982\",\n turkey: \"1f983\",\n unicorn_face: \"1f984\",\n eagle: \"1f985\",\n duck: \"1f986\",\n bat: \"1f987\",\n shark: \"1f988\",\n owl: \"1f989\",\n fox_face: \"1f98a\",\n butterfly: \"1f98b\",\n deer: \"1f98c\",\n gorilla: \"1f98d\",\n lizard: \"1f98e\",\n rhinoceros: \"1f98f\",\n shrimp: \"1f990\",\n squid: \"1f991\",\n giraffe_face: \"1f992\",\n zebra_face: \"1f993\",\n hedgehog: \"1f994\",\n sauropod: \"1f995\",\n \"t-rex\": \"1f996\",\n cricket: \"1f997\",\n kangaroo: \"1f998\",\n llama: \"1f999\",\n peacock: \"1f99a\",\n hippopotamus: \"1f99b\",\n parrot: \"1f99c\",\n raccoon: \"1f99d\",\n lobster: \"1f99e\",\n mosquito: \"1f99f\",\n microbe: \"1f9a0\",\n badger: \"1f9a1\",\n swan: \"1f9a2\",\n mammoth: \"1f9a3\",\n dodo: \"1f9a4\",\n sloth: \"1f9a5\",\n otter: \"1f9a6\",\n orangutan: \"1f9a7\",\n skunk: \"1f9a8\",\n flamingo: \"1f9a9\",\n oyster: \"1f9aa\",\n beaver: \"1f9ab\",\n bison: \"1f9ac\",\n seal: \"1f9ad\",\n guide_dog: \"1f9ae\",\n probing_cane: \"1f9af\",\n bone: \"1f9b4\",\n leg: \"1f9b5\",\n foot: \"1f9b6\",\n tooth: \"1f9b7\",\n female_superhero: \"1f9b8-200d-2640-fe0f\",\n male_superhero: \"1f9b8-200d-2642-fe0f\",\n superhero: \"1f9b8\",\n female_supervillain: \"1f9b9-200d-2640-fe0f\",\n male_supervillain: \"1f9b9-200d-2642-fe0f\",\n supervillain: \"1f9b9\",\n safety_vest: \"1f9ba\",\n ear_with_hearing_aid: \"1f9bb\",\n motorized_wheelchair: \"1f9bc\",\n manual_wheelchair: \"1f9bd\",\n mechanical_arm: \"1f9be\",\n mechanical_leg: \"1f9bf\",\n cheese_wedge: \"1f9c0\",\n cupcake: \"1f9c1\",\n salt: \"1f9c2\",\n beverage_box: \"1f9c3\",\n garlic: \"1f9c4\",\n onion: \"1f9c5\",\n falafel: \"1f9c6\",\n waffle: \"1f9c7\",\n butter: \"1f9c8\",\n mate_drink: \"1f9c9\",\n ice_cube: \"1f9ca\",\n bubble_tea: \"1f9cb\",\n troll: \"1f9cc\",\n woman_standing: \"1f9cd-200d-2640-fe0f\",\n man_standing: \"1f9cd-200d-2642-fe0f\",\n standing_person: \"1f9cd\",\n woman_kneeling: \"1f9ce-200d-2640-fe0f\",\n woman_kneeling_facing_right: \"1f9ce-200d-2640-fe0f-200d-27a1-fe0f\",\n man_kneeling: \"1f9ce-200d-2642-fe0f\",\n man_kneeling_facing_right: \"1f9ce-200d-2642-fe0f-200d-27a1-fe0f\",\n person_kneeling_facing_right: \"1f9ce-200d-27a1-fe0f\",\n kneeling_person: \"1f9ce\",\n deaf_woman: \"1f9cf-200d-2640-fe0f\",\n deaf_man: \"1f9cf-200d-2642-fe0f\",\n deaf_person: \"1f9cf\",\n face_with_monocle: \"1f9d0\",\n farmer: \"1f9d1-200d-1f33e\",\n cook: \"1f9d1-200d-1f373\",\n person_feeding_baby: \"1f9d1-200d-1f37c\",\n mx_claus: \"1f9d1-200d-1f384\",\n student: \"1f9d1-200d-1f393\",\n singer: \"1f9d1-200d-1f3a4\",\n artist: \"1f9d1-200d-1f3a8\",\n teacher: \"1f9d1-200d-1f3eb\",\n factory_worker: \"1f9d1-200d-1f3ed\",\n technologist: \"1f9d1-200d-1f4bb\",\n office_worker: \"1f9d1-200d-1f4bc\",\n mechanic: \"1f9d1-200d-1f527\",\n scientist: \"1f9d1-200d-1f52c\",\n astronaut: \"1f9d1-200d-1f680\",\n firefighter: \"1f9d1-200d-1f692\",\n people_holding_hands: \"1f9d1-200d-1f91d-200d-1f9d1\",\n person_with_white_cane_facing_right: \"1f9d1-200d-1f9af-200d-27a1-fe0f\",\n person_with_probing_cane: \"1f9d1-200d-1f9af\",\n red_haired_person: \"1f9d1-200d-1f9b0\",\n curly_haired_person: \"1f9d1-200d-1f9b1\",\n bald_person: \"1f9d1-200d-1f9b2\",\n white_haired_person: \"1f9d1-200d-1f9b3\",\n person_in_motorized_wheelchair_facing_right: \"1f9d1-200d-1f9bc-200d-27a1-fe0f\",\n person_in_motorized_wheelchair: \"1f9d1-200d-1f9bc\",\n person_in_manual_wheelchair_facing_right: \"1f9d1-200d-1f9bd-200d-27a1-fe0f\",\n person_in_manual_wheelchair: \"1f9d1-200d-1f9bd\",\n family_adult_adult_child: \"1f9d1-200d-1f9d1-200d-1f9d2\",\n family_adult_adult_child_child: \"1f9d1-200d-1f9d1-200d-1f9d2-200d-1f9d2\",\n family_adult_child_child: \"1f9d1-200d-1f9d2-200d-1f9d2\",\n family_adult_child: \"1f9d1-200d-1f9d2\",\n health_worker: \"1f9d1-200d-2695-fe0f\",\n judge: \"1f9d1-200d-2696-fe0f\",\n pilot: \"1f9d1-200d-2708-fe0f\",\n adult: \"1f9d1\",\n child: \"1f9d2\",\n older_adult: \"1f9d3\",\n woman_with_beard: \"1f9d4-200d-2640-fe0f\",\n man_with_beard: \"1f9d4-200d-2642-fe0f\",\n bearded_person: \"1f9d4\",\n person_with_headscarf: \"1f9d5\",\n woman_in_steamy_room: \"1f9d6-200d-2640-fe0f\",\n man_in_steamy_room: \"1f9d6-200d-2642-fe0f\",\n person_in_steamy_room: \"1f9d6\",\n woman_climbing: \"1f9d7-200d-2640-fe0f\",\n man_climbing: \"1f9d7-200d-2642-fe0f\",\n person_climbing: \"1f9d7\",\n woman_in_lotus_position: \"1f9d8-200d-2640-fe0f\",\n man_in_lotus_position: \"1f9d8-200d-2642-fe0f\",\n person_in_lotus_position: \"1f9d8\",\n female_mage: \"1f9d9-200d-2640-fe0f\",\n male_mage: \"1f9d9-200d-2642-fe0f\",\n mage: \"1f9d9\",\n female_fairy: \"1f9da-200d-2640-fe0f\",\n male_fairy: \"1f9da-200d-2642-fe0f\",\n fairy: \"1f9da\",\n female_vampire: \"1f9db-200d-2640-fe0f\",\n male_vampire: \"1f9db-200d-2642-fe0f\",\n vampire: \"1f9db\",\n mermaid: \"1f9dc-200d-2640-fe0f\",\n merman: \"1f9dc-200d-2642-fe0f\",\n merperson: \"1f9dc\",\n female_elf: \"1f9dd-200d-2640-fe0f\",\n male_elf: \"1f9dd-200d-2642-fe0f\",\n elf: \"1f9dd\",\n female_genie: \"1f9de-200d-2640-fe0f\",\n male_genie: \"1f9de-200d-2642-fe0f\",\n genie: \"1f9de\",\n female_zombie: \"1f9df-200d-2640-fe0f\",\n male_zombie: \"1f9df-200d-2642-fe0f\",\n zombie: \"1f9df\",\n brain: \"1f9e0\",\n orange_heart: \"1f9e1\",\n billed_cap: \"1f9e2\",\n scarf: \"1f9e3\",\n gloves: \"1f9e4\",\n coat: \"1f9e5\",\n socks: \"1f9e6\",\n red_envelope: \"1f9e7\",\n firecracker: \"1f9e8\",\n jigsaw: \"1f9e9\",\n test_tube: \"1f9ea\",\n petri_dish: \"1f9eb\",\n dna: \"1f9ec\",\n compass: \"1f9ed\",\n abacus: \"1f9ee\",\n fire_extinguisher: \"1f9ef\",\n toolbox: \"1f9f0\",\n bricks: \"1f9f1\",\n magnet: \"1f9f2\",\n luggage: \"1f9f3\",\n lotion_bottle: \"1f9f4\",\n thread: \"1f9f5\",\n yarn: \"1f9f6\",\n safety_pin: \"1f9f7\",\n teddy_bear: \"1f9f8\",\n broom: \"1f9f9\",\n basket: \"1f9fa\",\n roll_of_paper: \"1f9fb\",\n soap: \"1f9fc\",\n sponge: \"1f9fd\",\n receipt: \"1f9fe\",\n nazar_amulet: \"1f9ff\",\n ballet_shoes: \"1fa70\",\n \"one-piece_swimsuit\": \"1fa71\",\n briefs: \"1fa72\",\n shorts: \"1fa73\",\n thong_sandal: \"1fa74\",\n light_blue_heart: \"1fa75\",\n grey_heart: \"1fa76\",\n pink_heart: \"1fa77\",\n drop_of_blood: \"1fa78\",\n adhesive_bandage: \"1fa79\",\n stethoscope: \"1fa7a\",\n \"x-ray\": \"1fa7b\",\n crutch: \"1fa7c\",\n \"yo-yo\": \"1fa80\",\n kite: \"1fa81\",\n parachute: \"1fa82\",\n boomerang: \"1fa83\",\n magic_wand: \"1fa84\",\n pinata: \"1fa85\",\n nesting_dolls: \"1fa86\",\n maracas: \"1fa87\",\n flute: \"1fa88\",\n harp: \"1fa89\",\n shovel: \"1fa8f\",\n ringed_planet: \"1fa90\",\n chair: \"1fa91\",\n razor: \"1fa92\",\n axe: \"1fa93\",\n diya_lamp: \"1fa94\",\n banjo: \"1fa95\",\n military_helmet: \"1fa96\",\n accordion: \"1fa97\",\n long_drum: \"1fa98\",\n coin: \"1fa99\",\n carpentry_saw: \"1fa9a\",\n screwdriver: \"1fa9b\",\n ladder: \"1fa9c\",\n hook: \"1fa9d\",\n mirror: \"1fa9e\",\n window: \"1fa9f\",\n plunger: \"1faa0\",\n sewing_needle: \"1faa1\",\n knot: \"1faa2\",\n bucket: \"1faa3\",\n mouse_trap: \"1faa4\",\n toothbrush: \"1faa5\",\n headstone: \"1faa6\",\n placard: \"1faa7\",\n rock: \"1faa8\",\n mirror_ball: \"1faa9\",\n identification_card: \"1faaa\",\n low_battery: \"1faab\",\n hamsa: \"1faac\",\n folding_hand_fan: \"1faad\",\n hair_pick: \"1faae\",\n khanda: \"1faaf\",\n fly: \"1fab0\",\n worm: \"1fab1\",\n beetle: \"1fab2\",\n cockroach: \"1fab3\",\n potted_plant: \"1fab4\",\n wood: \"1fab5\",\n feather: \"1fab6\",\n lotus: \"1fab7\",\n coral: \"1fab8\",\n empty_nest: \"1fab9\",\n nest_with_eggs: \"1faba\",\n hyacinth: \"1fabb\",\n jellyfish: \"1fabc\",\n wing: \"1fabd\",\n leafless_tree: \"1fabe\",\n goose: \"1fabf\",\n anatomical_heart: \"1fac0\",\n lungs: \"1fac1\",\n people_hugging: \"1fac2\",\n pregnant_man: \"1fac3\",\n pregnant_person: \"1fac4\",\n person_with_crown: \"1fac5\",\n fingerprint: \"1fac6\",\n moose: \"1face\",\n donkey: \"1facf\",\n blueberries: \"1fad0\",\n bell_pepper: \"1fad1\",\n olive: \"1fad2\",\n flatbread: \"1fad3\",\n tamale: \"1fad4\",\n fondue: \"1fad5\",\n teapot: \"1fad6\",\n pouring_liquid: \"1fad7\",\n beans: \"1fad8\",\n jar: \"1fad9\",\n ginger_root: \"1fada\",\n pea_pod: \"1fadb\",\n root_vegetable: \"1fadc\",\n splatter: \"1fadf\",\n melting_face: \"1fae0\",\n saluting_face: \"1fae1\",\n face_with_open_eyes_and_hand_over_mouth: \"1fae2\",\n face_with_peeking_eye: \"1fae3\",\n face_with_diagonal_mouth: \"1fae4\",\n dotted_line_face: \"1fae5\",\n biting_lip: \"1fae6\",\n bubbles: \"1fae7\",\n shaking_face: \"1fae8\",\n face_with_bags_under_eyes: \"1fae9\",\n hand_with_index_finger_and_thumb_crossed: \"1faf0\",\n rightwards_hand: \"1faf1\",\n leftwards_hand: \"1faf2\",\n palm_down_hand: \"1faf3\",\n palm_up_hand: \"1faf4\",\n index_pointing_at_the_viewer: \"1faf5\",\n heart_hands: \"1faf6\",\n leftwards_pushing_hand: \"1faf7\",\n rightwards_pushing_hand: \"1faf8\",\n bangbang: \"203c-fe0f\",\n interrobang: \"2049-fe0f\",\n tm: \"2122-fe0f\",\n information_source: \"2139-fe0f\",\n left_right_arrow: \"2194-fe0f\",\n arrow_up_down: \"2195-fe0f\",\n arrow_upper_left: \"2196-fe0f\",\n arrow_upper_right: \"2197-fe0f\",\n arrow_lower_right: \"2198-fe0f\",\n arrow_lower_left: \"2199-fe0f\",\n leftwards_arrow_with_hook: \"21a9-fe0f\",\n arrow_right_hook: \"21aa-fe0f\",\n watch: \"231a\",\n hourglass: \"231b\",\n keyboard: \"2328-fe0f\",\n eject: \"23cf-fe0f\",\n fast_forward: \"23e9\",\n rewind: \"23ea\",\n arrow_double_up: \"23eb\",\n arrow_double_down: \"23ec\",\n black_right_pointing_double_triangle_with_vertical_bar: \"23ed-fe0f\",\n black_left_pointing_double_triangle_with_vertical_bar: \"23ee-fe0f\",\n black_right_pointing_triangle_with_double_vertical_bar: \"23ef-fe0f\",\n alarm_clock: \"23f0\",\n stopwatch: \"23f1-fe0f\",\n timer_clock: \"23f2-fe0f\",\n hourglass_flowing_sand: \"23f3\",\n double_vertical_bar: \"23f8-fe0f\",\n black_square_for_stop: \"23f9-fe0f\",\n black_circle_for_record: \"23fa-fe0f\",\n m: \"24c2-fe0f\",\n black_small_square: \"25aa-fe0f\",\n white_small_square: \"25ab-fe0f\",\n arrow_forward: \"25b6-fe0f\",\n arrow_backward: \"25c0-fe0f\",\n white_medium_square: \"25fb-fe0f\",\n black_medium_square: \"25fc-fe0f\",\n white_medium_small_square: \"25fd\",\n black_medium_small_square: \"25fe\",\n sunny: \"2600-fe0f\",\n cloud: \"2601-fe0f\",\n umbrella: \"2602-fe0f\",\n snowman: \"2603-fe0f\",\n comet: \"2604-fe0f\",\n phone: \"260e-fe0f\",\n telephone: \"260e-fe0f\",\n ballot_box_with_check: \"2611-fe0f\",\n umbrella_with_rain_drops: \"2614\",\n coffee: \"2615\",\n shamrock: \"2618-fe0f\",\n point_up: \"261d-fe0f\",\n skull_and_crossbones: \"2620-fe0f\",\n radioactive_sign: \"2622-fe0f\",\n biohazard_sign: \"2623-fe0f\",\n orthodox_cross: \"2626-fe0f\",\n star_and_crescent: \"262a-fe0f\",\n peace_symbol: \"262e-fe0f\",\n yin_yang: \"262f-fe0f\",\n wheel_of_dharma: \"2638-fe0f\",\n white_frowning_face: \"2639-fe0f\",\n relaxed: \"263a-fe0f\",\n female_sign: \"2640-fe0f\",\n male_sign: \"2642-fe0f\",\n aries: \"2648\",\n taurus: \"2649\",\n gemini: \"264a\",\n cancer: \"264b\",\n leo: \"264c\",\n virgo: \"264d\",\n libra: \"264e\",\n scorpius: \"264f\",\n sagittarius: \"2650\",\n capricorn: \"2651\",\n aquarius: \"2652\",\n pisces: \"2653\",\n chess_pawn: \"265f-fe0f\",\n spades: \"2660-fe0f\",\n clubs: \"2663-fe0f\",\n hearts: \"2665-fe0f\",\n diamonds: \"2666-fe0f\",\n hotsprings: \"2668-fe0f\",\n recycle: \"267b-fe0f\",\n infinity: \"267e-fe0f\",\n wheelchair: \"267f\",\n hammer_and_pick: \"2692-fe0f\",\n anchor: \"2693\",\n crossed_swords: \"2694-fe0f\",\n medical_symbol: \"2695-fe0f\",\n staff_of_aesculapius: \"2695-fe0f\",\n scales: \"2696-fe0f\",\n alembic: \"2697-fe0f\",\n gear: \"2699-fe0f\",\n atom_symbol: \"269b-fe0f\",\n fleur_de_lis: \"269c-fe0f\",\n warning: \"26a0-fe0f\",\n zap: \"26a1\",\n transgender_symbol: \"26a7-fe0f\",\n white_circle: \"26aa\",\n black_circle: \"26ab\",\n coffin: \"26b0-fe0f\",\n funeral_urn: \"26b1-fe0f\",\n soccer: \"26bd\",\n baseball: \"26be\",\n snowman_without_snow: \"26c4\",\n partly_sunny: \"26c5\",\n thunder_cloud_and_rain: \"26c8-fe0f\",\n ophiuchus: \"26ce\",\n pick: \"26cf-fe0f\",\n helmet_with_white_cross: \"26d1-fe0f\",\n broken_chain: \"26d3-fe0f-200d-1f4a5\",\n chains: \"26d3-fe0f\",\n no_entry: \"26d4\",\n shinto_shrine: \"26e9-fe0f\",\n church: \"26ea\",\n mountain: \"26f0-fe0f\",\n umbrella_on_ground: \"26f1-fe0f\",\n fountain: \"26f2\",\n golf: \"26f3\",\n ferry: \"26f4-fe0f\",\n boat: \"26f5\",\n sailboat: \"26f5\",\n skier: \"26f7-fe0f\",\n ice_skate: \"26f8-fe0f\",\n \"woman-bouncing-ball\": \"26f9-fe0f-200d-2640-fe0f\",\n \"man-bouncing-ball\": \"26f9-fe0f-200d-2642-fe0f\",\n person_with_ball: \"26f9-fe0f\",\n tent: \"26fa\",\n fuelpump: \"26fd\",\n scissors: \"2702-fe0f\",\n white_check_mark: \"2705\",\n airplane: \"2708-fe0f\",\n email: \"2709-fe0f\",\n envelope: \"2709-fe0f\",\n fist: \"270a\",\n hand: \"270b\",\n raised_hand: \"270b\",\n v: \"270c-fe0f\",\n writing_hand: \"270d-fe0f\",\n pencil2: \"270f-fe0f\",\n black_nib: \"2712-fe0f\",\n heavy_check_mark: \"2714-fe0f\",\n heavy_multiplication_x: \"2716-fe0f\",\n latin_cross: \"271d-fe0f\",\n star_of_david: \"2721-fe0f\",\n sparkles: \"2728\",\n eight_spoked_asterisk: \"2733-fe0f\",\n eight_pointed_black_star: \"2734-fe0f\",\n snowflake: \"2744-fe0f\",\n sparkle: \"2747-fe0f\",\n x: \"274c\",\n negative_squared_cross_mark: \"274e\",\n question: \"2753\",\n grey_question: \"2754\",\n grey_exclamation: \"2755\",\n exclamation: \"2757\",\n heavy_exclamation_mark: \"2757\",\n heavy_heart_exclamation_mark_ornament: \"2763-fe0f\",\n heart_on_fire: \"2764-fe0f-200d-1f525\",\n mending_heart: \"2764-fe0f-200d-1fa79\",\n heart: \"2764-fe0f\",\n heavy_plus_sign: \"2795\",\n heavy_minus_sign: \"2796\",\n heavy_division_sign: \"2797\",\n arrow_right: \"27a1-fe0f\",\n curly_loop: \"27b0\",\n loop: \"27bf\",\n arrow_heading_up: \"2934-fe0f\",\n arrow_heading_down: \"2935-fe0f\",\n arrow_left: \"2b05-fe0f\",\n arrow_up: \"2b06-fe0f\",\n arrow_down: \"2b07-fe0f\",\n black_large_square: \"2b1b\",\n white_large_square: \"2b1c\",\n star: \"2b50\",\n o: \"2b55\",\n wavy_dash: \"3030-fe0f\",\n part_alternation_mark: \"303d-fe0f\",\n congratulations: \"3297-fe0f\",\n secret: \"3299-fe0f\",\n};\n\n/** Base unified codepoint -> unified codepoint for skin tones 2-6, \"\" when that tone has no image. */\nexport const EMOJI_SKIN_TONES: Record<string, string[]> = {\n \"1f385\": [\"1f385-1f3fb\", \"1f385-1f3fc\", \"1f385-1f3fd\", \"1f385-1f3fe\", \"1f385-1f3ff\"],\n \"1f3c2\": [\"1f3c2-1f3fb\", \"1f3c2-1f3fc\", \"1f3c2-1f3fd\", \"1f3c2-1f3fe\", \"1f3c2-1f3ff\"],\n \"1f3c3-200d-2640-fe0f\": [\n \"1f3c3-1f3fb-200d-2640-fe0f\",\n \"1f3c3-1f3fc-200d-2640-fe0f\",\n \"1f3c3-1f3fd-200d-2640-fe0f\",\n \"1f3c3-1f3fe-200d-2640-fe0f\",\n \"1f3c3-1f3ff-200d-2640-fe0f\",\n ],\n \"1f3c3-200d-2640-fe0f-200d-27a1-fe0f\": [\n \"1f3c3-1f3fb-200d-2640-fe0f-200d-27a1-fe0f\",\n \"1f3c3-1f3fc-200d-2640-fe0f-200d-27a1-fe0f\",\n \"1f3c3-1f3fd-200d-2640-fe0f-200d-27a1-fe0f\",\n \"1f3c3-1f3fe-200d-2640-fe0f-200d-27a1-fe0f\",\n \"1f3c3-1f3ff-200d-2640-fe0f-200d-27a1-fe0f\",\n ],\n \"1f3c3-200d-2642-fe0f\": [\n \"1f3c3-1f3fb-200d-2642-fe0f\",\n \"1f3c3-1f3fc-200d-2642-fe0f\",\n \"1f3c3-1f3fd-200d-2642-fe0f\",\n \"1f3c3-1f3fe-200d-2642-fe0f\",\n \"1f3c3-1f3ff-200d-2642-fe0f\",\n ],\n \"1f3c3-200d-2642-fe0f-200d-27a1-fe0f\": [\n \"1f3c3-1f3fb-200d-2642-fe0f-200d-27a1-fe0f\",\n \"1f3c3-1f3fc-200d-2642-fe0f-200d-27a1-fe0f\",\n \"1f3c3-1f3fd-200d-2642-fe0f-200d-27a1-fe0f\",\n \"1f3c3-1f3fe-200d-2642-fe0f-200d-27a1-fe0f\",\n \"1f3c3-1f3ff-200d-2642-fe0f-200d-27a1-fe0f\",\n ],\n \"1f3c3-200d-27a1-fe0f\": [\n \"1f3c3-1f3fb-200d-27a1-fe0f\",\n \"1f3c3-1f3fc-200d-27a1-fe0f\",\n \"1f3c3-1f3fd-200d-27a1-fe0f\",\n \"1f3c3-1f3fe-200d-27a1-fe0f\",\n \"1f3c3-1f3ff-200d-27a1-fe0f\",\n ],\n \"1f3c3\": [\"1f3c3-1f3fb\", \"1f3c3-1f3fc\", \"1f3c3-1f3fd\", \"1f3c3-1f3fe\", \"1f3c3-1f3ff\"],\n \"1f3c4-200d-2640-fe0f\": [\n \"1f3c4-1f3fb-200d-2640-fe0f\",\n \"1f3c4-1f3fc-200d-2640-fe0f\",\n \"1f3c4-1f3fd-200d-2640-fe0f\",\n \"1f3c4-1f3fe-200d-2640-fe0f\",\n \"1f3c4-1f3ff-200d-2640-fe0f\",\n ],\n \"1f3c4-200d-2642-fe0f\": [\n \"1f3c4-1f3fb-200d-2642-fe0f\",\n \"1f3c4-1f3fc-200d-2642-fe0f\",\n \"1f3c4-1f3fd-200d-2642-fe0f\",\n \"1f3c4-1f3fe-200d-2642-fe0f\",\n \"1f3c4-1f3ff-200d-2642-fe0f\",\n ],\n \"1f3c4\": [\"1f3c4-1f3fb\", \"1f3c4-1f3fc\", \"1f3c4-1f3fd\", \"1f3c4-1f3fe\", \"1f3c4-1f3ff\"],\n \"1f3c7\": [\"1f3c7-1f3fb\", \"1f3c7-1f3fc\", \"1f3c7-1f3fd\", \"1f3c7-1f3fe\", \"1f3c7-1f3ff\"],\n \"1f3ca-200d-2640-fe0f\": [\n \"1f3ca-1f3fb-200d-2640-fe0f\",\n \"1f3ca-1f3fc-200d-2640-fe0f\",\n \"1f3ca-1f3fd-200d-2640-fe0f\",\n \"1f3ca-1f3fe-200d-2640-fe0f\",\n \"1f3ca-1f3ff-200d-2640-fe0f\",\n ],\n \"1f3ca-200d-2642-fe0f\": [\n \"1f3ca-1f3fb-200d-2642-fe0f\",\n \"1f3ca-1f3fc-200d-2642-fe0f\",\n \"1f3ca-1f3fd-200d-2642-fe0f\",\n \"1f3ca-1f3fe-200d-2642-fe0f\",\n \"1f3ca-1f3ff-200d-2642-fe0f\",\n ],\n \"1f3ca\": [\"1f3ca-1f3fb\", \"1f3ca-1f3fc\", \"1f3ca-1f3fd\", \"1f3ca-1f3fe\", \"1f3ca-1f3ff\"],\n \"1f3cb-fe0f-200d-2640-fe0f\": [\n \"1f3cb-1f3fb-200d-2640-fe0f\",\n \"1f3cb-1f3fc-200d-2640-fe0f\",\n \"1f3cb-1f3fd-200d-2640-fe0f\",\n \"1f3cb-1f3fe-200d-2640-fe0f\",\n \"1f3cb-1f3ff-200d-2640-fe0f\",\n ],\n \"1f3cb-fe0f-200d-2642-fe0f\": [\n \"1f3cb-1f3fb-200d-2642-fe0f\",\n \"1f3cb-1f3fc-200d-2642-fe0f\",\n \"1f3cb-1f3fd-200d-2642-fe0f\",\n \"1f3cb-1f3fe-200d-2642-fe0f\",\n \"1f3cb-1f3ff-200d-2642-fe0f\",\n ],\n \"1f3cb-fe0f\": [\"1f3cb-1f3fb\", \"1f3cb-1f3fc\", \"1f3cb-1f3fd\", \"1f3cb-1f3fe\", \"1f3cb-1f3ff\"],\n \"1f3cc-fe0f-200d-2640-fe0f\": [\n \"1f3cc-1f3fb-200d-2640-fe0f\",\n \"1f3cc-1f3fc-200d-2640-fe0f\",\n \"1f3cc-1f3fd-200d-2640-fe0f\",\n \"1f3cc-1f3fe-200d-2640-fe0f\",\n \"1f3cc-1f3ff-200d-2640-fe0f\",\n ],\n \"1f3cc-fe0f-200d-2642-fe0f\": [\n \"1f3cc-1f3fb-200d-2642-fe0f\",\n \"1f3cc-1f3fc-200d-2642-fe0f\",\n \"1f3cc-1f3fd-200d-2642-fe0f\",\n \"1f3cc-1f3fe-200d-2642-fe0f\",\n \"1f3cc-1f3ff-200d-2642-fe0f\",\n ],\n \"1f3cc-fe0f\": [\"1f3cc-1f3fb\", \"1f3cc-1f3fc\", \"1f3cc-1f3fd\", \"1f3cc-1f3fe\", \"1f3cc-1f3ff\"],\n \"1f442\": [\"1f442-1f3fb\", \"1f442-1f3fc\", \"1f442-1f3fd\", \"1f442-1f3fe\", \"1f442-1f3ff\"],\n \"1f443\": [\"1f443-1f3fb\", \"1f443-1f3fc\", \"1f443-1f3fd\", \"1f443-1f3fe\", \"1f443-1f3ff\"],\n \"1f446\": [\"1f446-1f3fb\", \"1f446-1f3fc\", \"1f446-1f3fd\", \"1f446-1f3fe\", \"1f446-1f3ff\"],\n \"1f447\": [\"1f447-1f3fb\", \"1f447-1f3fc\", \"1f447-1f3fd\", \"1f447-1f3fe\", \"1f447-1f3ff\"],\n \"1f448\": [\"1f448-1f3fb\", \"1f448-1f3fc\", \"1f448-1f3fd\", \"1f448-1f3fe\", \"1f448-1f3ff\"],\n \"1f449\": [\"1f449-1f3fb\", \"1f449-1f3fc\", \"1f449-1f3fd\", \"1f449-1f3fe\", \"1f449-1f3ff\"],\n \"1f44a\": [\"1f44a-1f3fb\", \"1f44a-1f3fc\", \"1f44a-1f3fd\", \"1f44a-1f3fe\", \"1f44a-1f3ff\"],\n \"1f44b\": [\"1f44b-1f3fb\", \"1f44b-1f3fc\", \"1f44b-1f3fd\", \"1f44b-1f3fe\", \"1f44b-1f3ff\"],\n \"1f44c\": [\"1f44c-1f3fb\", \"1f44c-1f3fc\", \"1f44c-1f3fd\", \"1f44c-1f3fe\", \"1f44c-1f3ff\"],\n \"1f44d\": [\"1f44d-1f3fb\", \"1f44d-1f3fc\", \"1f44d-1f3fd\", \"1f44d-1f3fe\", \"1f44d-1f3ff\"],\n \"1f44e\": [\"1f44e-1f3fb\", \"1f44e-1f3fc\", \"1f44e-1f3fd\", \"1f44e-1f3fe\", \"1f44e-1f3ff\"],\n \"1f44f\": [\"1f44f-1f3fb\", \"1f44f-1f3fc\", \"1f44f-1f3fd\", \"1f44f-1f3fe\", \"1f44f-1f3ff\"],\n \"1f450\": [\"1f450-1f3fb\", \"1f450-1f3fc\", \"1f450-1f3fd\", \"1f450-1f3fe\", \"1f450-1f3ff\"],\n \"1f466\": [\"1f466-1f3fb\", \"1f466-1f3fc\", \"1f466-1f3fd\", \"1f466-1f3fe\", \"1f466-1f3ff\"],\n \"1f467\": [\"1f467-1f3fb\", \"1f467-1f3fc\", \"1f467-1f3fd\", \"1f467-1f3fe\", \"1f467-1f3ff\"],\n \"1f468-200d-1f33e\": [\n \"1f468-1f3fb-200d-1f33e\",\n \"1f468-1f3fc-200d-1f33e\",\n \"1f468-1f3fd-200d-1f33e\",\n \"1f468-1f3fe-200d-1f33e\",\n \"1f468-1f3ff-200d-1f33e\",\n ],\n \"1f468-200d-1f373\": [\n \"1f468-1f3fb-200d-1f373\",\n \"1f468-1f3fc-200d-1f373\",\n \"1f468-1f3fd-200d-1f373\",\n \"1f468-1f3fe-200d-1f373\",\n \"1f468-1f3ff-200d-1f373\",\n ],\n \"1f468-200d-1f37c\": [\n \"1f468-1f3fb-200d-1f37c\",\n \"1f468-1f3fc-200d-1f37c\",\n \"1f468-1f3fd-200d-1f37c\",\n \"1f468-1f3fe-200d-1f37c\",\n \"1f468-1f3ff-200d-1f37c\",\n ],\n \"1f468-200d-1f393\": [\n \"1f468-1f3fb-200d-1f393\",\n \"1f468-1f3fc-200d-1f393\",\n \"1f468-1f3fd-200d-1f393\",\n \"1f468-1f3fe-200d-1f393\",\n \"1f468-1f3ff-200d-1f393\",\n ],\n \"1f468-200d-1f3a4\": [\n \"1f468-1f3fb-200d-1f3a4\",\n \"1f468-1f3fc-200d-1f3a4\",\n \"1f468-1f3fd-200d-1f3a4\",\n \"1f468-1f3fe-200d-1f3a4\",\n \"1f468-1f3ff-200d-1f3a4\",\n ],\n \"1f468-200d-1f3a8\": [\n \"1f468-1f3fb-200d-1f3a8\",\n \"1f468-1f3fc-200d-1f3a8\",\n \"1f468-1f3fd-200d-1f3a8\",\n \"1f468-1f3fe-200d-1f3a8\",\n \"1f468-1f3ff-200d-1f3a8\",\n ],\n \"1f468-200d-1f3eb\": [\n \"1f468-1f3fb-200d-1f3eb\",\n \"1f468-1f3fc-200d-1f3eb\",\n \"1f468-1f3fd-200d-1f3eb\",\n \"1f468-1f3fe-200d-1f3eb\",\n \"1f468-1f3ff-200d-1f3eb\",\n ],\n \"1f468-200d-1f3ed\": [\n \"1f468-1f3fb-200d-1f3ed\",\n \"1f468-1f3fc-200d-1f3ed\",\n \"1f468-1f3fd-200d-1f3ed\",\n \"1f468-1f3fe-200d-1f3ed\",\n \"1f468-1f3ff-200d-1f3ed\",\n ],\n \"1f468-200d-1f4bb\": [\n \"1f468-1f3fb-200d-1f4bb\",\n \"1f468-1f3fc-200d-1f4bb\",\n \"1f468-1f3fd-200d-1f4bb\",\n \"1f468-1f3fe-200d-1f4bb\",\n \"1f468-1f3ff-200d-1f4bb\",\n ],\n \"1f468-200d-1f4bc\": [\n \"1f468-1f3fb-200d-1f4bc\",\n \"1f468-1f3fc-200d-1f4bc\",\n \"1f468-1f3fd-200d-1f4bc\",\n \"1f468-1f3fe-200d-1f4bc\",\n \"1f468-1f3ff-200d-1f4bc\",\n ],\n \"1f468-200d-1f527\": [\n \"1f468-1f3fb-200d-1f527\",\n \"1f468-1f3fc-200d-1f527\",\n \"1f468-1f3fd-200d-1f527\",\n \"1f468-1f3fe-200d-1f527\",\n \"1f468-1f3ff-200d-1f527\",\n ],\n \"1f468-200d-1f52c\": [\n \"1f468-1f3fb-200d-1f52c\",\n \"1f468-1f3fc-200d-1f52c\",\n \"1f468-1f3fd-200d-1f52c\",\n \"1f468-1f3fe-200d-1f52c\",\n \"1f468-1f3ff-200d-1f52c\",\n ],\n \"1f468-200d-1f680\": [\n \"1f468-1f3fb-200d-1f680\",\n \"1f468-1f3fc-200d-1f680\",\n \"1f468-1f3fd-200d-1f680\",\n \"1f468-1f3fe-200d-1f680\",\n \"1f468-1f3ff-200d-1f680\",\n ],\n \"1f468-200d-1f692\": [\n \"1f468-1f3fb-200d-1f692\",\n \"1f468-1f3fc-200d-1f692\",\n \"1f468-1f3fd-200d-1f692\",\n \"1f468-1f3fe-200d-1f692\",\n \"1f468-1f3ff-200d-1f692\",\n ],\n \"1f468-200d-1f9af-200d-27a1-fe0f\": [\n \"1f468-1f3fb-200d-1f9af-200d-27a1-fe0f\",\n \"1f468-1f3fc-200d-1f9af-200d-27a1-fe0f\",\n \"1f468-1f3fd-200d-1f9af-200d-27a1-fe0f\",\n \"1f468-1f3fe-200d-1f9af-200d-27a1-fe0f\",\n \"1f468-1f3ff-200d-1f9af-200d-27a1-fe0f\",\n ],\n \"1f468-200d-1f9af\": [\n \"1f468-1f3fb-200d-1f9af\",\n \"1f468-1f3fc-200d-1f9af\",\n \"1f468-1f3fd-200d-1f9af\",\n \"1f468-1f3fe-200d-1f9af\",\n \"1f468-1f3ff-200d-1f9af\",\n ],\n \"1f468-200d-1f9b0\": [\n \"1f468-1f3fb-200d-1f9b0\",\n \"1f468-1f3fc-200d-1f9b0\",\n \"1f468-1f3fd-200d-1f9b0\",\n \"1f468-1f3fe-200d-1f9b0\",\n \"1f468-1f3ff-200d-1f9b0\",\n ],\n \"1f468-200d-1f9b1\": [\n \"1f468-1f3fb-200d-1f9b1\",\n \"1f468-1f3fc-200d-1f9b1\",\n \"1f468-1f3fd-200d-1f9b1\",\n \"1f468-1f3fe-200d-1f9b1\",\n \"1f468-1f3ff-200d-1f9b1\",\n ],\n \"1f468-200d-1f9b2\": [\n \"1f468-1f3fb-200d-1f9b2\",\n \"1f468-1f3fc-200d-1f9b2\",\n \"1f468-1f3fd-200d-1f9b2\",\n \"1f468-1f3fe-200d-1f9b2\",\n \"1f468-1f3ff-200d-1f9b2\",\n ],\n \"1f468-200d-1f9b3\": [\n \"1f468-1f3fb-200d-1f9b3\",\n \"1f468-1f3fc-200d-1f9b3\",\n \"1f468-1f3fd-200d-1f9b3\",\n \"1f468-1f3fe-200d-1f9b3\",\n \"1f468-1f3ff-200d-1f9b3\",\n ],\n \"1f468-200d-1f9bc-200d-27a1-fe0f\": [\n \"1f468-1f3fb-200d-1f9bc-200d-27a1-fe0f\",\n \"1f468-1f3fc-200d-1f9bc-200d-27a1-fe0f\",\n \"1f468-1f3fd-200d-1f9bc-200d-27a1-fe0f\",\n \"1f468-1f3fe-200d-1f9bc-200d-27a1-fe0f\",\n \"1f468-1f3ff-200d-1f9bc-200d-27a1-fe0f\",\n ],\n \"1f468-200d-1f9bc\": [\n \"1f468-1f3fb-200d-1f9bc\",\n \"1f468-1f3fc-200d-1f9bc\",\n \"1f468-1f3fd-200d-1f9bc\",\n \"1f468-1f3fe-200d-1f9bc\",\n \"1f468-1f3ff-200d-1f9bc\",\n ],\n \"1f468-200d-1f9bd-200d-27a1-fe0f\": [\n \"1f468-1f3fb-200d-1f9bd-200d-27a1-fe0f\",\n \"1f468-1f3fc-200d-1f9bd-200d-27a1-fe0f\",\n \"1f468-1f3fd-200d-1f9bd-200d-27a1-fe0f\",\n \"1f468-1f3fe-200d-1f9bd-200d-27a1-fe0f\",\n \"1f468-1f3ff-200d-1f9bd-200d-27a1-fe0f\",\n ],\n \"1f468-200d-1f9bd\": [\n \"1f468-1f3fb-200d-1f9bd\",\n \"1f468-1f3fc-200d-1f9bd\",\n \"1f468-1f3fd-200d-1f9bd\",\n \"1f468-1f3fe-200d-1f9bd\",\n \"1f468-1f3ff-200d-1f9bd\",\n ],\n \"1f468-200d-2695-fe0f\": [\n \"1f468-1f3fb-200d-2695-fe0f\",\n \"1f468-1f3fc-200d-2695-fe0f\",\n \"1f468-1f3fd-200d-2695-fe0f\",\n \"1f468-1f3fe-200d-2695-fe0f\",\n \"1f468-1f3ff-200d-2695-fe0f\",\n ],\n \"1f468-200d-2696-fe0f\": [\n \"1f468-1f3fb-200d-2696-fe0f\",\n \"1f468-1f3fc-200d-2696-fe0f\",\n \"1f468-1f3fd-200d-2696-fe0f\",\n \"1f468-1f3fe-200d-2696-fe0f\",\n \"1f468-1f3ff-200d-2696-fe0f\",\n ],\n \"1f468-200d-2708-fe0f\": [\n \"1f468-1f3fb-200d-2708-fe0f\",\n \"1f468-1f3fc-200d-2708-fe0f\",\n \"1f468-1f3fd-200d-2708-fe0f\",\n \"1f468-1f3fe-200d-2708-fe0f\",\n \"1f468-1f3ff-200d-2708-fe0f\",\n ],\n \"1f468\": [\"1f468-1f3fb\", \"1f468-1f3fc\", \"1f468-1f3fd\", \"1f468-1f3fe\", \"1f468-1f3ff\"],\n \"1f469-200d-1f33e\": [\n \"1f469-1f3fb-200d-1f33e\",\n \"1f469-1f3fc-200d-1f33e\",\n \"1f469-1f3fd-200d-1f33e\",\n \"1f469-1f3fe-200d-1f33e\",\n \"1f469-1f3ff-200d-1f33e\",\n ],\n \"1f469-200d-1f373\": [\n \"1f469-1f3fb-200d-1f373\",\n \"1f469-1f3fc-200d-1f373\",\n \"1f469-1f3fd-200d-1f373\",\n \"1f469-1f3fe-200d-1f373\",\n \"1f469-1f3ff-200d-1f373\",\n ],\n \"1f469-200d-1f37c\": [\n \"1f469-1f3fb-200d-1f37c\",\n \"1f469-1f3fc-200d-1f37c\",\n \"1f469-1f3fd-200d-1f37c\",\n \"1f469-1f3fe-200d-1f37c\",\n \"1f469-1f3ff-200d-1f37c\",\n ],\n \"1f469-200d-1f393\": [\n \"1f469-1f3fb-200d-1f393\",\n \"1f469-1f3fc-200d-1f393\",\n \"1f469-1f3fd-200d-1f393\",\n \"1f469-1f3fe-200d-1f393\",\n \"1f469-1f3ff-200d-1f393\",\n ],\n \"1f469-200d-1f3a4\": [\n \"1f469-1f3fb-200d-1f3a4\",\n \"1f469-1f3fc-200d-1f3a4\",\n \"1f469-1f3fd-200d-1f3a4\",\n \"1f469-1f3fe-200d-1f3a4\",\n \"1f469-1f3ff-200d-1f3a4\",\n ],\n \"1f469-200d-1f3a8\": [\n \"1f469-1f3fb-200d-1f3a8\",\n \"1f469-1f3fc-200d-1f3a8\",\n \"1f469-1f3fd-200d-1f3a8\",\n \"1f469-1f3fe-200d-1f3a8\",\n \"1f469-1f3ff-200d-1f3a8\",\n ],\n \"1f469-200d-1f3eb\": [\n \"1f469-1f3fb-200d-1f3eb\",\n \"1f469-1f3fc-200d-1f3eb\",\n \"1f469-1f3fd-200d-1f3eb\",\n \"1f469-1f3fe-200d-1f3eb\",\n \"1f469-1f3ff-200d-1f3eb\",\n ],\n \"1f469-200d-1f3ed\": [\n \"1f469-1f3fb-200d-1f3ed\",\n \"1f469-1f3fc-200d-1f3ed\",\n \"1f469-1f3fd-200d-1f3ed\",\n \"1f469-1f3fe-200d-1f3ed\",\n \"1f469-1f3ff-200d-1f3ed\",\n ],\n \"1f469-200d-1f4bb\": [\n \"1f469-1f3fb-200d-1f4bb\",\n \"1f469-1f3fc-200d-1f4bb\",\n \"1f469-1f3fd-200d-1f4bb\",\n \"1f469-1f3fe-200d-1f4bb\",\n \"1f469-1f3ff-200d-1f4bb\",\n ],\n \"1f469-200d-1f4bc\": [\n \"1f469-1f3fb-200d-1f4bc\",\n \"1f469-1f3fc-200d-1f4bc\",\n \"1f469-1f3fd-200d-1f4bc\",\n \"1f469-1f3fe-200d-1f4bc\",\n \"1f469-1f3ff-200d-1f4bc\",\n ],\n \"1f469-200d-1f527\": [\n \"1f469-1f3fb-200d-1f527\",\n \"1f469-1f3fc-200d-1f527\",\n \"1f469-1f3fd-200d-1f527\",\n \"1f469-1f3fe-200d-1f527\",\n \"1f469-1f3ff-200d-1f527\",\n ],\n \"1f469-200d-1f52c\": [\n \"1f469-1f3fb-200d-1f52c\",\n \"1f469-1f3fc-200d-1f52c\",\n \"1f469-1f3fd-200d-1f52c\",\n \"1f469-1f3fe-200d-1f52c\",\n \"1f469-1f3ff-200d-1f52c\",\n ],\n \"1f469-200d-1f680\": [\n \"1f469-1f3fb-200d-1f680\",\n \"1f469-1f3fc-200d-1f680\",\n \"1f469-1f3fd-200d-1f680\",\n \"1f469-1f3fe-200d-1f680\",\n \"1f469-1f3ff-200d-1f680\",\n ],\n \"1f469-200d-1f692\": [\n \"1f469-1f3fb-200d-1f692\",\n \"1f469-1f3fc-200d-1f692\",\n \"1f469-1f3fd-200d-1f692\",\n \"1f469-1f3fe-200d-1f692\",\n \"1f469-1f3ff-200d-1f692\",\n ],\n \"1f469-200d-1f9af-200d-27a1-fe0f\": [\n \"1f469-1f3fb-200d-1f9af-200d-27a1-fe0f\",\n \"1f469-1f3fc-200d-1f9af-200d-27a1-fe0f\",\n \"1f469-1f3fd-200d-1f9af-200d-27a1-fe0f\",\n \"1f469-1f3fe-200d-1f9af-200d-27a1-fe0f\",\n \"1f469-1f3ff-200d-1f9af-200d-27a1-fe0f\",\n ],\n \"1f469-200d-1f9af\": [\n \"1f469-1f3fb-200d-1f9af\",\n \"1f469-1f3fc-200d-1f9af\",\n \"1f469-1f3fd-200d-1f9af\",\n \"1f469-1f3fe-200d-1f9af\",\n \"1f469-1f3ff-200d-1f9af\",\n ],\n \"1f469-200d-1f9b0\": [\n \"1f469-1f3fb-200d-1f9b0\",\n \"1f469-1f3fc-200d-1f9b0\",\n \"1f469-1f3fd-200d-1f9b0\",\n \"1f469-1f3fe-200d-1f9b0\",\n \"1f469-1f3ff-200d-1f9b0\",\n ],\n \"1f469-200d-1f9b1\": [\n \"1f469-1f3fb-200d-1f9b1\",\n \"1f469-1f3fc-200d-1f9b1\",\n \"1f469-1f3fd-200d-1f9b1\",\n \"1f469-1f3fe-200d-1f9b1\",\n \"1f469-1f3ff-200d-1f9b1\",\n ],\n \"1f469-200d-1f9b2\": [\n \"1f469-1f3fb-200d-1f9b2\",\n \"1f469-1f3fc-200d-1f9b2\",\n \"1f469-1f3fd-200d-1f9b2\",\n \"1f469-1f3fe-200d-1f9b2\",\n \"1f469-1f3ff-200d-1f9b2\",\n ],\n \"1f469-200d-1f9b3\": [\n \"1f469-1f3fb-200d-1f9b3\",\n \"1f469-1f3fc-200d-1f9b3\",\n \"1f469-1f3fd-200d-1f9b3\",\n \"1f469-1f3fe-200d-1f9b3\",\n \"1f469-1f3ff-200d-1f9b3\",\n ],\n \"1f469-200d-1f9bc-200d-27a1-fe0f\": [\n \"1f469-1f3fb-200d-1f9bc-200d-27a1-fe0f\",\n \"1f469-1f3fc-200d-1f9bc-200d-27a1-fe0f\",\n \"1f469-1f3fd-200d-1f9bc-200d-27a1-fe0f\",\n \"1f469-1f3fe-200d-1f9bc-200d-27a1-fe0f\",\n \"1f469-1f3ff-200d-1f9bc-200d-27a1-fe0f\",\n ],\n \"1f469-200d-1f9bc\": [\n \"1f469-1f3fb-200d-1f9bc\",\n \"1f469-1f3fc-200d-1f9bc\",\n \"1f469-1f3fd-200d-1f9bc\",\n \"1f469-1f3fe-200d-1f9bc\",\n \"1f469-1f3ff-200d-1f9bc\",\n ],\n \"1f469-200d-1f9bd-200d-27a1-fe0f\": [\n \"1f469-1f3fb-200d-1f9bd-200d-27a1-fe0f\",\n \"1f469-1f3fc-200d-1f9bd-200d-27a1-fe0f\",\n \"1f469-1f3fd-200d-1f9bd-200d-27a1-fe0f\",\n \"1f469-1f3fe-200d-1f9bd-200d-27a1-fe0f\",\n \"1f469-1f3ff-200d-1f9bd-200d-27a1-fe0f\",\n ],\n \"1f469-200d-1f9bd\": [\n \"1f469-1f3fb-200d-1f9bd\",\n \"1f469-1f3fc-200d-1f9bd\",\n \"1f469-1f3fd-200d-1f9bd\",\n \"1f469-1f3fe-200d-1f9bd\",\n \"1f469-1f3ff-200d-1f9bd\",\n ],\n \"1f469-200d-2695-fe0f\": [\n \"1f469-1f3fb-200d-2695-fe0f\",\n \"1f469-1f3fc-200d-2695-fe0f\",\n \"1f469-1f3fd-200d-2695-fe0f\",\n \"1f469-1f3fe-200d-2695-fe0f\",\n \"1f469-1f3ff-200d-2695-fe0f\",\n ],\n \"1f469-200d-2696-fe0f\": [\n \"1f469-1f3fb-200d-2696-fe0f\",\n \"1f469-1f3fc-200d-2696-fe0f\",\n \"1f469-1f3fd-200d-2696-fe0f\",\n \"1f469-1f3fe-200d-2696-fe0f\",\n \"1f469-1f3ff-200d-2696-fe0f\",\n ],\n \"1f469-200d-2708-fe0f\": [\n \"1f469-1f3fb-200d-2708-fe0f\",\n \"1f469-1f3fc-200d-2708-fe0f\",\n \"1f469-1f3fd-200d-2708-fe0f\",\n \"1f469-1f3fe-200d-2708-fe0f\",\n \"1f469-1f3ff-200d-2708-fe0f\",\n ],\n \"1f469\": [\"1f469-1f3fb\", \"1f469-1f3fc\", \"1f469-1f3fd\", \"1f469-1f3fe\", \"1f469-1f3ff\"],\n \"1f46b\": [\"1f46b-1f3fb\", \"1f46b-1f3fc\", \"1f46b-1f3fd\", \"1f46b-1f3fe\", \"1f46b-1f3ff\"],\n \"1f46c\": [\"1f46c-1f3fb\", \"1f46c-1f3fc\", \"1f46c-1f3fd\", \"1f46c-1f3fe\", \"1f46c-1f3ff\"],\n \"1f46d\": [\"1f46d-1f3fb\", \"1f46d-1f3fc\", \"1f46d-1f3fd\", \"1f46d-1f3fe\", \"1f46d-1f3ff\"],\n \"1f46e-200d-2640-fe0f\": [\n \"1f46e-1f3fb-200d-2640-fe0f\",\n \"1f46e-1f3fc-200d-2640-fe0f\",\n \"1f46e-1f3fd-200d-2640-fe0f\",\n \"1f46e-1f3fe-200d-2640-fe0f\",\n \"1f46e-1f3ff-200d-2640-fe0f\",\n ],\n \"1f46e-200d-2642-fe0f\": [\n \"1f46e-1f3fb-200d-2642-fe0f\",\n \"1f46e-1f3fc-200d-2642-fe0f\",\n \"1f46e-1f3fd-200d-2642-fe0f\",\n \"1f46e-1f3fe-200d-2642-fe0f\",\n \"1f46e-1f3ff-200d-2642-fe0f\",\n ],\n \"1f46e\": [\"1f46e-1f3fb\", \"1f46e-1f3fc\", \"1f46e-1f3fd\", \"1f46e-1f3fe\", \"1f46e-1f3ff\"],\n \"1f470-200d-2640-fe0f\": [\n \"1f470-1f3fb-200d-2640-fe0f\",\n \"1f470-1f3fc-200d-2640-fe0f\",\n \"1f470-1f3fd-200d-2640-fe0f\",\n \"1f470-1f3fe-200d-2640-fe0f\",\n \"1f470-1f3ff-200d-2640-fe0f\",\n ],\n \"1f470-200d-2642-fe0f\": [\n \"1f470-1f3fb-200d-2642-fe0f\",\n \"1f470-1f3fc-200d-2642-fe0f\",\n \"1f470-1f3fd-200d-2642-fe0f\",\n \"1f470-1f3fe-200d-2642-fe0f\",\n \"1f470-1f3ff-200d-2642-fe0f\",\n ],\n \"1f470\": [\"1f470-1f3fb\", \"1f470-1f3fc\", \"1f470-1f3fd\", \"1f470-1f3fe\", \"1f470-1f3ff\"],\n \"1f471-200d-2640-fe0f\": [\n \"1f471-1f3fb-200d-2640-fe0f\",\n \"1f471-1f3fc-200d-2640-fe0f\",\n \"1f471-1f3fd-200d-2640-fe0f\",\n \"1f471-1f3fe-200d-2640-fe0f\",\n \"1f471-1f3ff-200d-2640-fe0f\",\n ],\n \"1f471-200d-2642-fe0f\": [\n \"1f471-1f3fb-200d-2642-fe0f\",\n \"1f471-1f3fc-200d-2642-fe0f\",\n \"1f471-1f3fd-200d-2642-fe0f\",\n \"1f471-1f3fe-200d-2642-fe0f\",\n \"1f471-1f3ff-200d-2642-fe0f\",\n ],\n \"1f471\": [\"1f471-1f3fb\", \"1f471-1f3fc\", \"1f471-1f3fd\", \"1f471-1f3fe\", \"1f471-1f3ff\"],\n \"1f472\": [\"1f472-1f3fb\", \"1f472-1f3fc\", \"1f472-1f3fd\", \"1f472-1f3fe\", \"1f472-1f3ff\"],\n \"1f473-200d-2640-fe0f\": [\n \"1f473-1f3fb-200d-2640-fe0f\",\n \"1f473-1f3fc-200d-2640-fe0f\",\n \"1f473-1f3fd-200d-2640-fe0f\",\n \"1f473-1f3fe-200d-2640-fe0f\",\n \"1f473-1f3ff-200d-2640-fe0f\",\n ],\n \"1f473-200d-2642-fe0f\": [\n \"1f473-1f3fb-200d-2642-fe0f\",\n \"1f473-1f3fc-200d-2642-fe0f\",\n \"1f473-1f3fd-200d-2642-fe0f\",\n \"1f473-1f3fe-200d-2642-fe0f\",\n \"1f473-1f3ff-200d-2642-fe0f\",\n ],\n \"1f473\": [\"1f473-1f3fb\", \"1f473-1f3fc\", \"1f473-1f3fd\", \"1f473-1f3fe\", \"1f473-1f3ff\"],\n \"1f474\": [\"1f474-1f3fb\", \"1f474-1f3fc\", \"1f474-1f3fd\", \"1f474-1f3fe\", \"1f474-1f3ff\"],\n \"1f475\": [\"1f475-1f3fb\", \"1f475-1f3fc\", \"1f475-1f3fd\", \"1f475-1f3fe\", \"1f475-1f3ff\"],\n \"1f476\": [\"1f476-1f3fb\", \"1f476-1f3fc\", \"1f476-1f3fd\", \"1f476-1f3fe\", \"1f476-1f3ff\"],\n \"1f477-200d-2640-fe0f\": [\n \"1f477-1f3fb-200d-2640-fe0f\",\n \"1f477-1f3fc-200d-2640-fe0f\",\n \"1f477-1f3fd-200d-2640-fe0f\",\n \"1f477-1f3fe-200d-2640-fe0f\",\n \"1f477-1f3ff-200d-2640-fe0f\",\n ],\n \"1f477-200d-2642-fe0f\": [\n \"1f477-1f3fb-200d-2642-fe0f\",\n \"1f477-1f3fc-200d-2642-fe0f\",\n \"1f477-1f3fd-200d-2642-fe0f\",\n \"1f477-1f3fe-200d-2642-fe0f\",\n \"1f477-1f3ff-200d-2642-fe0f\",\n ],\n \"1f477\": [\"1f477-1f3fb\", \"1f477-1f3fc\", \"1f477-1f3fd\", \"1f477-1f3fe\", \"1f477-1f3ff\"],\n \"1f478\": [\"1f478-1f3fb\", \"1f478-1f3fc\", \"1f478-1f3fd\", \"1f478-1f3fe\", \"1f478-1f3ff\"],\n \"1f47c\": [\"1f47c-1f3fb\", \"1f47c-1f3fc\", \"1f47c-1f3fd\", \"1f47c-1f3fe\", \"1f47c-1f3ff\"],\n \"1f481-200d-2640-fe0f\": [\n \"1f481-1f3fb-200d-2640-fe0f\",\n \"1f481-1f3fc-200d-2640-fe0f\",\n \"1f481-1f3fd-200d-2640-fe0f\",\n \"1f481-1f3fe-200d-2640-fe0f\",\n \"1f481-1f3ff-200d-2640-fe0f\",\n ],\n \"1f481-200d-2642-fe0f\": [\n \"1f481-1f3fb-200d-2642-fe0f\",\n \"1f481-1f3fc-200d-2642-fe0f\",\n \"1f481-1f3fd-200d-2642-fe0f\",\n \"1f481-1f3fe-200d-2642-fe0f\",\n \"1f481-1f3ff-200d-2642-fe0f\",\n ],\n \"1f481\": [\"1f481-1f3fb\", \"1f481-1f3fc\", \"1f481-1f3fd\", \"1f481-1f3fe\", \"1f481-1f3ff\"],\n \"1f482-200d-2640-fe0f\": [\n \"1f482-1f3fb-200d-2640-fe0f\",\n \"1f482-1f3fc-200d-2640-fe0f\",\n \"1f482-1f3fd-200d-2640-fe0f\",\n \"1f482-1f3fe-200d-2640-fe0f\",\n \"1f482-1f3ff-200d-2640-fe0f\",\n ],\n \"1f482-200d-2642-fe0f\": [\n \"1f482-1f3fb-200d-2642-fe0f\",\n \"1f482-1f3fc-200d-2642-fe0f\",\n \"1f482-1f3fd-200d-2642-fe0f\",\n \"1f482-1f3fe-200d-2642-fe0f\",\n \"1f482-1f3ff-200d-2642-fe0f\",\n ],\n \"1f482\": [\"1f482-1f3fb\", \"1f482-1f3fc\", \"1f482-1f3fd\", \"1f482-1f3fe\", \"1f482-1f3ff\"],\n \"1f483\": [\"1f483-1f3fb\", \"1f483-1f3fc\", \"1f483-1f3fd\", \"1f483-1f3fe\", \"1f483-1f3ff\"],\n \"1f485\": [\"1f485-1f3fb\", \"1f485-1f3fc\", \"1f485-1f3fd\", \"1f485-1f3fe\", \"1f485-1f3ff\"],\n \"1f486-200d-2640-fe0f\": [\n \"1f486-1f3fb-200d-2640-fe0f\",\n \"1f486-1f3fc-200d-2640-fe0f\",\n \"1f486-1f3fd-200d-2640-fe0f\",\n \"1f486-1f3fe-200d-2640-fe0f\",\n \"1f486-1f3ff-200d-2640-fe0f\",\n ],\n \"1f486-200d-2642-fe0f\": [\n \"1f486-1f3fb-200d-2642-fe0f\",\n \"1f486-1f3fc-200d-2642-fe0f\",\n \"1f486-1f3fd-200d-2642-fe0f\",\n \"1f486-1f3fe-200d-2642-fe0f\",\n \"1f486-1f3ff-200d-2642-fe0f\",\n ],\n \"1f486\": [\"1f486-1f3fb\", \"1f486-1f3fc\", \"1f486-1f3fd\", \"1f486-1f3fe\", \"1f486-1f3ff\"],\n \"1f487-200d-2640-fe0f\": [\n \"1f487-1f3fb-200d-2640-fe0f\",\n \"1f487-1f3fc-200d-2640-fe0f\",\n \"1f487-1f3fd-200d-2640-fe0f\",\n \"1f487-1f3fe-200d-2640-fe0f\",\n \"1f487-1f3ff-200d-2640-fe0f\",\n ],\n \"1f487-200d-2642-fe0f\": [\n \"1f487-1f3fb-200d-2642-fe0f\",\n \"1f487-1f3fc-200d-2642-fe0f\",\n \"1f487-1f3fd-200d-2642-fe0f\",\n \"1f487-1f3fe-200d-2642-fe0f\",\n \"1f487-1f3ff-200d-2642-fe0f\",\n ],\n \"1f487\": [\"1f487-1f3fb\", \"1f487-1f3fc\", \"1f487-1f3fd\", \"1f487-1f3fe\", \"1f487-1f3ff\"],\n \"1f48f\": [\"1f48f-1f3fb\", \"1f48f-1f3fc\", \"1f48f-1f3fd\", \"1f48f-1f3fe\", \"1f48f-1f3ff\"],\n \"1f491\": [\"1f491-1f3fb\", \"1f491-1f3fc\", \"1f491-1f3fd\", \"1f491-1f3fe\", \"1f491-1f3ff\"],\n \"1f4aa\": [\"1f4aa-1f3fb\", \"1f4aa-1f3fc\", \"1f4aa-1f3fd\", \"1f4aa-1f3fe\", \"1f4aa-1f3ff\"],\n \"1f574-fe0f\": [\"1f574-1f3fb\", \"1f574-1f3fc\", \"1f574-1f3fd\", \"1f574-1f3fe\", \"1f574-1f3ff\"],\n \"1f575-fe0f-200d-2640-fe0f\": [\n \"1f575-1f3fb-200d-2640-fe0f\",\n \"1f575-1f3fc-200d-2640-fe0f\",\n \"1f575-1f3fd-200d-2640-fe0f\",\n \"1f575-1f3fe-200d-2640-fe0f\",\n \"1f575-1f3ff-200d-2640-fe0f\",\n ],\n \"1f575-fe0f-200d-2642-fe0f\": [\n \"1f575-1f3fb-200d-2642-fe0f\",\n \"1f575-1f3fc-200d-2642-fe0f\",\n \"1f575-1f3fd-200d-2642-fe0f\",\n \"1f575-1f3fe-200d-2642-fe0f\",\n \"1f575-1f3ff-200d-2642-fe0f\",\n ],\n \"1f575-fe0f\": [\"1f575-1f3fb\", \"1f575-1f3fc\", \"1f575-1f3fd\", \"1f575-1f3fe\", \"1f575-1f3ff\"],\n \"1f57a\": [\"1f57a-1f3fb\", \"1f57a-1f3fc\", \"1f57a-1f3fd\", \"1f57a-1f3fe\", \"1f57a-1f3ff\"],\n \"1f590-fe0f\": [\"1f590-1f3fb\", \"1f590-1f3fc\", \"1f590-1f3fd\", \"1f590-1f3fe\", \"1f590-1f3ff\"],\n \"1f595\": [\"1f595-1f3fb\", \"1f595-1f3fc\", \"1f595-1f3fd\", \"1f595-1f3fe\", \"1f595-1f3ff\"],\n \"1f596\": [\"1f596-1f3fb\", \"1f596-1f3fc\", \"1f596-1f3fd\", \"1f596-1f3fe\", \"1f596-1f3ff\"],\n \"1f645-200d-2640-fe0f\": [\n \"1f645-1f3fb-200d-2640-fe0f\",\n \"1f645-1f3fc-200d-2640-fe0f\",\n \"1f645-1f3fd-200d-2640-fe0f\",\n \"1f645-1f3fe-200d-2640-fe0f\",\n \"1f645-1f3ff-200d-2640-fe0f\",\n ],\n \"1f645-200d-2642-fe0f\": [\n \"1f645-1f3fb-200d-2642-fe0f\",\n \"1f645-1f3fc-200d-2642-fe0f\",\n \"1f645-1f3fd-200d-2642-fe0f\",\n \"1f645-1f3fe-200d-2642-fe0f\",\n \"1f645-1f3ff-200d-2642-fe0f\",\n ],\n \"1f645\": [\"1f645-1f3fb\", \"1f645-1f3fc\", \"1f645-1f3fd\", \"1f645-1f3fe\", \"1f645-1f3ff\"],\n \"1f646-200d-2640-fe0f\": [\n \"1f646-1f3fb-200d-2640-fe0f\",\n \"1f646-1f3fc-200d-2640-fe0f\",\n \"1f646-1f3fd-200d-2640-fe0f\",\n \"1f646-1f3fe-200d-2640-fe0f\",\n \"1f646-1f3ff-200d-2640-fe0f\",\n ],\n \"1f646-200d-2642-fe0f\": [\n \"1f646-1f3fb-200d-2642-fe0f\",\n \"1f646-1f3fc-200d-2642-fe0f\",\n \"1f646-1f3fd-200d-2642-fe0f\",\n \"1f646-1f3fe-200d-2642-fe0f\",\n \"1f646-1f3ff-200d-2642-fe0f\",\n ],\n \"1f646\": [\"1f646-1f3fb\", \"1f646-1f3fc\", \"1f646-1f3fd\", \"1f646-1f3fe\", \"1f646-1f3ff\"],\n \"1f647-200d-2640-fe0f\": [\n \"1f647-1f3fb-200d-2640-fe0f\",\n \"1f647-1f3fc-200d-2640-fe0f\",\n \"1f647-1f3fd-200d-2640-fe0f\",\n \"1f647-1f3fe-200d-2640-fe0f\",\n \"1f647-1f3ff-200d-2640-fe0f\",\n ],\n \"1f647-200d-2642-fe0f\": [\n \"1f647-1f3fb-200d-2642-fe0f\",\n \"1f647-1f3fc-200d-2642-fe0f\",\n \"1f647-1f3fd-200d-2642-fe0f\",\n \"1f647-1f3fe-200d-2642-fe0f\",\n \"1f647-1f3ff-200d-2642-fe0f\",\n ],\n \"1f647\": [\"1f647-1f3fb\", \"1f647-1f3fc\", \"1f647-1f3fd\", \"1f647-1f3fe\", \"1f647-1f3ff\"],\n \"1f64b-200d-2640-fe0f\": [\n \"1f64b-1f3fb-200d-2640-fe0f\",\n \"1f64b-1f3fc-200d-2640-fe0f\",\n \"1f64b-1f3fd-200d-2640-fe0f\",\n \"1f64b-1f3fe-200d-2640-fe0f\",\n \"1f64b-1f3ff-200d-2640-fe0f\",\n ],\n \"1f64b-200d-2642-fe0f\": [\n \"1f64b-1f3fb-200d-2642-fe0f\",\n \"1f64b-1f3fc-200d-2642-fe0f\",\n \"1f64b-1f3fd-200d-2642-fe0f\",\n \"1f64b-1f3fe-200d-2642-fe0f\",\n \"1f64b-1f3ff-200d-2642-fe0f\",\n ],\n \"1f64b\": [\"1f64b-1f3fb\", \"1f64b-1f3fc\", \"1f64b-1f3fd\", \"1f64b-1f3fe\", \"1f64b-1f3ff\"],\n \"1f64c\": [\"1f64c-1f3fb\", \"1f64c-1f3fc\", \"1f64c-1f3fd\", \"1f64c-1f3fe\", \"1f64c-1f3ff\"],\n \"1f64d-200d-2640-fe0f\": [\n \"1f64d-1f3fb-200d-2640-fe0f\",\n \"1f64d-1f3fc-200d-2640-fe0f\",\n \"1f64d-1f3fd-200d-2640-fe0f\",\n \"1f64d-1f3fe-200d-2640-fe0f\",\n \"1f64d-1f3ff-200d-2640-fe0f\",\n ],\n \"1f64d-200d-2642-fe0f\": [\n \"1f64d-1f3fb-200d-2642-fe0f\",\n \"1f64d-1f3fc-200d-2642-fe0f\",\n \"1f64d-1f3fd-200d-2642-fe0f\",\n \"1f64d-1f3fe-200d-2642-fe0f\",\n \"1f64d-1f3ff-200d-2642-fe0f\",\n ],\n \"1f64d\": [\"1f64d-1f3fb\", \"1f64d-1f3fc\", \"1f64d-1f3fd\", \"1f64d-1f3fe\", \"1f64d-1f3ff\"],\n \"1f64e-200d-2640-fe0f\": [\n \"1f64e-1f3fb-200d-2640-fe0f\",\n \"1f64e-1f3fc-200d-2640-fe0f\",\n \"1f64e-1f3fd-200d-2640-fe0f\",\n \"1f64e-1f3fe-200d-2640-fe0f\",\n \"1f64e-1f3ff-200d-2640-fe0f\",\n ],\n \"1f64e-200d-2642-fe0f\": [\n \"1f64e-1f3fb-200d-2642-fe0f\",\n \"1f64e-1f3fc-200d-2642-fe0f\",\n \"1f64e-1f3fd-200d-2642-fe0f\",\n \"1f64e-1f3fe-200d-2642-fe0f\",\n \"1f64e-1f3ff-200d-2642-fe0f\",\n ],\n \"1f64e\": [\"1f64e-1f3fb\", \"1f64e-1f3fc\", \"1f64e-1f3fd\", \"1f64e-1f3fe\", \"1f64e-1f3ff\"],\n \"1f64f\": [\"1f64f-1f3fb\", \"1f64f-1f3fc\", \"1f64f-1f3fd\", \"1f64f-1f3fe\", \"1f64f-1f3ff\"],\n \"1f6a3-200d-2640-fe0f\": [\n \"1f6a3-1f3fb-200d-2640-fe0f\",\n \"1f6a3-1f3fc-200d-2640-fe0f\",\n \"1f6a3-1f3fd-200d-2640-fe0f\",\n \"1f6a3-1f3fe-200d-2640-fe0f\",\n \"1f6a3-1f3ff-200d-2640-fe0f\",\n ],\n \"1f6a3-200d-2642-fe0f\": [\n \"1f6a3-1f3fb-200d-2642-fe0f\",\n \"1f6a3-1f3fc-200d-2642-fe0f\",\n \"1f6a3-1f3fd-200d-2642-fe0f\",\n \"1f6a3-1f3fe-200d-2642-fe0f\",\n \"1f6a3-1f3ff-200d-2642-fe0f\",\n ],\n \"1f6a3\": [\"1f6a3-1f3fb\", \"1f6a3-1f3fc\", \"1f6a3-1f3fd\", \"1f6a3-1f3fe\", \"1f6a3-1f3ff\"],\n \"1f6b4-200d-2640-fe0f\": [\n \"1f6b4-1f3fb-200d-2640-fe0f\",\n \"1f6b4-1f3fc-200d-2640-fe0f\",\n \"1f6b4-1f3fd-200d-2640-fe0f\",\n \"1f6b4-1f3fe-200d-2640-fe0f\",\n \"1f6b4-1f3ff-200d-2640-fe0f\",\n ],\n \"1f6b4-200d-2642-fe0f\": [\n \"1f6b4-1f3fb-200d-2642-fe0f\",\n \"1f6b4-1f3fc-200d-2642-fe0f\",\n \"1f6b4-1f3fd-200d-2642-fe0f\",\n \"1f6b4-1f3fe-200d-2642-fe0f\",\n \"1f6b4-1f3ff-200d-2642-fe0f\",\n ],\n \"1f6b4\": [\"1f6b4-1f3fb\", \"1f6b4-1f3fc\", \"1f6b4-1f3fd\", \"1f6b4-1f3fe\", \"1f6b4-1f3ff\"],\n \"1f6b5-200d-2640-fe0f\": [\n \"1f6b5-1f3fb-200d-2640-fe0f\",\n \"1f6b5-1f3fc-200d-2640-fe0f\",\n \"1f6b5-1f3fd-200d-2640-fe0f\",\n \"1f6b5-1f3fe-200d-2640-fe0f\",\n \"1f6b5-1f3ff-200d-2640-fe0f\",\n ],\n \"1f6b5-200d-2642-fe0f\": [\n \"1f6b5-1f3fb-200d-2642-fe0f\",\n \"1f6b5-1f3fc-200d-2642-fe0f\",\n \"1f6b5-1f3fd-200d-2642-fe0f\",\n \"1f6b5-1f3fe-200d-2642-fe0f\",\n \"1f6b5-1f3ff-200d-2642-fe0f\",\n ],\n \"1f6b5\": [\"1f6b5-1f3fb\", \"1f6b5-1f3fc\", \"1f6b5-1f3fd\", \"1f6b5-1f3fe\", \"1f6b5-1f3ff\"],\n \"1f6b6-200d-2640-fe0f\": [\n \"1f6b6-1f3fb-200d-2640-fe0f\",\n \"1f6b6-1f3fc-200d-2640-fe0f\",\n \"1f6b6-1f3fd-200d-2640-fe0f\",\n \"1f6b6-1f3fe-200d-2640-fe0f\",\n \"1f6b6-1f3ff-200d-2640-fe0f\",\n ],\n \"1f6b6-200d-2640-fe0f-200d-27a1-fe0f\": [\n \"1f6b6-1f3fb-200d-2640-fe0f-200d-27a1-fe0f\",\n \"1f6b6-1f3fc-200d-2640-fe0f-200d-27a1-fe0f\",\n \"1f6b6-1f3fd-200d-2640-fe0f-200d-27a1-fe0f\",\n \"1f6b6-1f3fe-200d-2640-fe0f-200d-27a1-fe0f\",\n \"1f6b6-1f3ff-200d-2640-fe0f-200d-27a1-fe0f\",\n ],\n \"1f6b6-200d-2642-fe0f\": [\n \"1f6b6-1f3fb-200d-2642-fe0f\",\n \"1f6b6-1f3fc-200d-2642-fe0f\",\n \"1f6b6-1f3fd-200d-2642-fe0f\",\n \"1f6b6-1f3fe-200d-2642-fe0f\",\n \"1f6b6-1f3ff-200d-2642-fe0f\",\n ],\n \"1f6b6-200d-2642-fe0f-200d-27a1-fe0f\": [\n \"1f6b6-1f3fb-200d-2642-fe0f-200d-27a1-fe0f\",\n \"1f6b6-1f3fc-200d-2642-fe0f-200d-27a1-fe0f\",\n \"1f6b6-1f3fd-200d-2642-fe0f-200d-27a1-fe0f\",\n \"1f6b6-1f3fe-200d-2642-fe0f-200d-27a1-fe0f\",\n \"1f6b6-1f3ff-200d-2642-fe0f-200d-27a1-fe0f\",\n ],\n \"1f6b6-200d-27a1-fe0f\": [\n \"1f6b6-1f3fb-200d-27a1-fe0f\",\n \"1f6b6-1f3fc-200d-27a1-fe0f\",\n \"1f6b6-1f3fd-200d-27a1-fe0f\",\n \"1f6b6-1f3fe-200d-27a1-fe0f\",\n \"1f6b6-1f3ff-200d-27a1-fe0f\",\n ],\n \"1f6b6\": [\"1f6b6-1f3fb\", \"1f6b6-1f3fc\", \"1f6b6-1f3fd\", \"1f6b6-1f3fe\", \"1f6b6-1f3ff\"],\n \"1f6c0\": [\"1f6c0-1f3fb\", \"1f6c0-1f3fc\", \"1f6c0-1f3fd\", \"1f6c0-1f3fe\", \"1f6c0-1f3ff\"],\n \"1f6cc\": [\"1f6cc-1f3fb\", \"1f6cc-1f3fc\", \"1f6cc-1f3fd\", \"1f6cc-1f3fe\", \"1f6cc-1f3ff\"],\n \"1f90c\": [\"1f90c-1f3fb\", \"1f90c-1f3fc\", \"1f90c-1f3fd\", \"1f90c-1f3fe\", \"1f90c-1f3ff\"],\n \"1f90f\": [\"1f90f-1f3fb\", \"1f90f-1f3fc\", \"1f90f-1f3fd\", \"1f90f-1f3fe\", \"1f90f-1f3ff\"],\n \"1f918\": [\"1f918-1f3fb\", \"1f918-1f3fc\", \"1f918-1f3fd\", \"1f918-1f3fe\", \"1f918-1f3ff\"],\n \"1f919\": [\"1f919-1f3fb\", \"1f919-1f3fc\", \"1f919-1f3fd\", \"1f919-1f3fe\", \"1f919-1f3ff\"],\n \"1f91a\": [\"1f91a-1f3fb\", \"1f91a-1f3fc\", \"1f91a-1f3fd\", \"1f91a-1f3fe\", \"1f91a-1f3ff\"],\n \"1f91b\": [\"1f91b-1f3fb\", \"1f91b-1f3fc\", \"1f91b-1f3fd\", \"1f91b-1f3fe\", \"1f91b-1f3ff\"],\n \"1f91c\": [\"1f91c-1f3fb\", \"1f91c-1f3fc\", \"1f91c-1f3fd\", \"1f91c-1f3fe\", \"1f91c-1f3ff\"],\n \"1f91d\": [\"1f91d-1f3fb\", \"1f91d-1f3fc\", \"1f91d-1f3fd\", \"1f91d-1f3fe\", \"1f91d-1f3ff\"],\n \"1f91e\": [\"1f91e-1f3fb\", \"1f91e-1f3fc\", \"1f91e-1f3fd\", \"1f91e-1f3fe\", \"1f91e-1f3ff\"],\n \"1f91f\": [\"1f91f-1f3fb\", \"1f91f-1f3fc\", \"1f91f-1f3fd\", \"1f91f-1f3fe\", \"1f91f-1f3ff\"],\n \"1f926-200d-2640-fe0f\": [\n \"1f926-1f3fb-200d-2640-fe0f\",\n \"1f926-1f3fc-200d-2640-fe0f\",\n \"1f926-1f3fd-200d-2640-fe0f\",\n \"1f926-1f3fe-200d-2640-fe0f\",\n \"1f926-1f3ff-200d-2640-fe0f\",\n ],\n \"1f926-200d-2642-fe0f\": [\n \"1f926-1f3fb-200d-2642-fe0f\",\n \"1f926-1f3fc-200d-2642-fe0f\",\n \"1f926-1f3fd-200d-2642-fe0f\",\n \"1f926-1f3fe-200d-2642-fe0f\",\n \"1f926-1f3ff-200d-2642-fe0f\",\n ],\n \"1f926\": [\"1f926-1f3fb\", \"1f926-1f3fc\", \"1f926-1f3fd\", \"1f926-1f3fe\", \"1f926-1f3ff\"],\n \"1f930\": [\"1f930-1f3fb\", \"1f930-1f3fc\", \"1f930-1f3fd\", \"1f930-1f3fe\", \"1f930-1f3ff\"],\n \"1f931\": [\"1f931-1f3fb\", \"1f931-1f3fc\", \"1f931-1f3fd\", \"1f931-1f3fe\", \"1f931-1f3ff\"],\n \"1f932\": [\"1f932-1f3fb\", \"1f932-1f3fc\", \"1f932-1f3fd\", \"1f932-1f3fe\", \"1f932-1f3ff\"],\n \"1f933\": [\"1f933-1f3fb\", \"1f933-1f3fc\", \"1f933-1f3fd\", \"1f933-1f3fe\", \"1f933-1f3ff\"],\n \"1f934\": [\"1f934-1f3fb\", \"1f934-1f3fc\", \"1f934-1f3fd\", \"1f934-1f3fe\", \"1f934-1f3ff\"],\n \"1f935-200d-2640-fe0f\": [\n \"1f935-1f3fb-200d-2640-fe0f\",\n \"1f935-1f3fc-200d-2640-fe0f\",\n \"1f935-1f3fd-200d-2640-fe0f\",\n \"1f935-1f3fe-200d-2640-fe0f\",\n \"1f935-1f3ff-200d-2640-fe0f\",\n ],\n \"1f935-200d-2642-fe0f\": [\n \"1f935-1f3fb-200d-2642-fe0f\",\n \"1f935-1f3fc-200d-2642-fe0f\",\n \"1f935-1f3fd-200d-2642-fe0f\",\n \"1f935-1f3fe-200d-2642-fe0f\",\n \"1f935-1f3ff-200d-2642-fe0f\",\n ],\n \"1f935\": [\"1f935-1f3fb\", \"1f935-1f3fc\", \"1f935-1f3fd\", \"1f935-1f3fe\", \"1f935-1f3ff\"],\n \"1f936\": [\"1f936-1f3fb\", \"1f936-1f3fc\", \"1f936-1f3fd\", \"1f936-1f3fe\", \"1f936-1f3ff\"],\n \"1f937-200d-2640-fe0f\": [\n \"1f937-1f3fb-200d-2640-fe0f\",\n \"1f937-1f3fc-200d-2640-fe0f\",\n \"1f937-1f3fd-200d-2640-fe0f\",\n \"1f937-1f3fe-200d-2640-fe0f\",\n \"1f937-1f3ff-200d-2640-fe0f\",\n ],\n \"1f937-200d-2642-fe0f\": [\n \"1f937-1f3fb-200d-2642-fe0f\",\n \"1f937-1f3fc-200d-2642-fe0f\",\n \"1f937-1f3fd-200d-2642-fe0f\",\n \"1f937-1f3fe-200d-2642-fe0f\",\n \"1f937-1f3ff-200d-2642-fe0f\",\n ],\n \"1f937\": [\"1f937-1f3fb\", \"1f937-1f3fc\", \"1f937-1f3fd\", \"1f937-1f3fe\", \"1f937-1f3ff\"],\n \"1f938-200d-2640-fe0f\": [\n \"1f938-1f3fb-200d-2640-fe0f\",\n \"1f938-1f3fc-200d-2640-fe0f\",\n \"1f938-1f3fd-200d-2640-fe0f\",\n \"1f938-1f3fe-200d-2640-fe0f\",\n \"1f938-1f3ff-200d-2640-fe0f\",\n ],\n \"1f938-200d-2642-fe0f\": [\n \"1f938-1f3fb-200d-2642-fe0f\",\n \"1f938-1f3fc-200d-2642-fe0f\",\n \"1f938-1f3fd-200d-2642-fe0f\",\n \"1f938-1f3fe-200d-2642-fe0f\",\n \"1f938-1f3ff-200d-2642-fe0f\",\n ],\n \"1f938\": [\"1f938-1f3fb\", \"1f938-1f3fc\", \"1f938-1f3fd\", \"1f938-1f3fe\", \"1f938-1f3ff\"],\n \"1f939-200d-2640-fe0f\": [\n \"1f939-1f3fb-200d-2640-fe0f\",\n \"1f939-1f3fc-200d-2640-fe0f\",\n \"1f939-1f3fd-200d-2640-fe0f\",\n \"1f939-1f3fe-200d-2640-fe0f\",\n \"1f939-1f3ff-200d-2640-fe0f\",\n ],\n \"1f939-200d-2642-fe0f\": [\n \"1f939-1f3fb-200d-2642-fe0f\",\n \"1f939-1f3fc-200d-2642-fe0f\",\n \"1f939-1f3fd-200d-2642-fe0f\",\n \"1f939-1f3fe-200d-2642-fe0f\",\n \"1f939-1f3ff-200d-2642-fe0f\",\n ],\n \"1f939\": [\"1f939-1f3fb\", \"1f939-1f3fc\", \"1f939-1f3fd\", \"1f939-1f3fe\", \"1f939-1f3ff\"],\n \"1f93d-200d-2640-fe0f\": [\n \"1f93d-1f3fb-200d-2640-fe0f\",\n \"1f93d-1f3fc-200d-2640-fe0f\",\n \"1f93d-1f3fd-200d-2640-fe0f\",\n \"1f93d-1f3fe-200d-2640-fe0f\",\n \"1f93d-1f3ff-200d-2640-fe0f\",\n ],\n \"1f93d-200d-2642-fe0f\": [\n \"1f93d-1f3fb-200d-2642-fe0f\",\n \"1f93d-1f3fc-200d-2642-fe0f\",\n \"1f93d-1f3fd-200d-2642-fe0f\",\n \"1f93d-1f3fe-200d-2642-fe0f\",\n \"1f93d-1f3ff-200d-2642-fe0f\",\n ],\n \"1f93d\": [\"1f93d-1f3fb\", \"1f93d-1f3fc\", \"1f93d-1f3fd\", \"1f93d-1f3fe\", \"1f93d-1f3ff\"],\n \"1f93e-200d-2640-fe0f\": [\n \"1f93e-1f3fb-200d-2640-fe0f\",\n \"1f93e-1f3fc-200d-2640-fe0f\",\n \"1f93e-1f3fd-200d-2640-fe0f\",\n \"1f93e-1f3fe-200d-2640-fe0f\",\n \"1f93e-1f3ff-200d-2640-fe0f\",\n ],\n \"1f93e-200d-2642-fe0f\": [\n \"1f93e-1f3fb-200d-2642-fe0f\",\n \"1f93e-1f3fc-200d-2642-fe0f\",\n \"1f93e-1f3fd-200d-2642-fe0f\",\n \"1f93e-1f3fe-200d-2642-fe0f\",\n \"1f93e-1f3ff-200d-2642-fe0f\",\n ],\n \"1f93e\": [\"1f93e-1f3fb\", \"1f93e-1f3fc\", \"1f93e-1f3fd\", \"1f93e-1f3fe\", \"1f93e-1f3ff\"],\n \"1f977\": [\"1f977-1f3fb\", \"1f977-1f3fc\", \"1f977-1f3fd\", \"1f977-1f3fe\", \"1f977-1f3ff\"],\n \"1f9b5\": [\"1f9b5-1f3fb\", \"1f9b5-1f3fc\", \"1f9b5-1f3fd\", \"1f9b5-1f3fe\", \"1f9b5-1f3ff\"],\n \"1f9b6\": [\"1f9b6-1f3fb\", \"1f9b6-1f3fc\", \"1f9b6-1f3fd\", \"1f9b6-1f3fe\", \"1f9b6-1f3ff\"],\n \"1f9b8-200d-2640-fe0f\": [\n \"1f9b8-1f3fb-200d-2640-fe0f\",\n \"1f9b8-1f3fc-200d-2640-fe0f\",\n \"1f9b8-1f3fd-200d-2640-fe0f\",\n \"1f9b8-1f3fe-200d-2640-fe0f\",\n \"1f9b8-1f3ff-200d-2640-fe0f\",\n ],\n \"1f9b8-200d-2642-fe0f\": [\n \"1f9b8-1f3fb-200d-2642-fe0f\",\n \"1f9b8-1f3fc-200d-2642-fe0f\",\n \"1f9b8-1f3fd-200d-2642-fe0f\",\n \"1f9b8-1f3fe-200d-2642-fe0f\",\n \"1f9b8-1f3ff-200d-2642-fe0f\",\n ],\n \"1f9b8\": [\"1f9b8-1f3fb\", \"1f9b8-1f3fc\", \"1f9b8-1f3fd\", \"1f9b8-1f3fe\", \"1f9b8-1f3ff\"],\n \"1f9b9-200d-2640-fe0f\": [\n \"1f9b9-1f3fb-200d-2640-fe0f\",\n \"1f9b9-1f3fc-200d-2640-fe0f\",\n \"1f9b9-1f3fd-200d-2640-fe0f\",\n \"1f9b9-1f3fe-200d-2640-fe0f\",\n \"1f9b9-1f3ff-200d-2640-fe0f\",\n ],\n \"1f9b9-200d-2642-fe0f\": [\n \"1f9b9-1f3fb-200d-2642-fe0f\",\n \"1f9b9-1f3fc-200d-2642-fe0f\",\n \"1f9b9-1f3fd-200d-2642-fe0f\",\n \"1f9b9-1f3fe-200d-2642-fe0f\",\n \"1f9b9-1f3ff-200d-2642-fe0f\",\n ],\n \"1f9b9\": [\"1f9b9-1f3fb\", \"1f9b9-1f3fc\", \"1f9b9-1f3fd\", \"1f9b9-1f3fe\", \"1f9b9-1f3ff\"],\n \"1f9bb\": [\"1f9bb-1f3fb\", \"1f9bb-1f3fc\", \"1f9bb-1f3fd\", \"1f9bb-1f3fe\", \"1f9bb-1f3ff\"],\n \"1f9cd-200d-2640-fe0f\": [\n \"1f9cd-1f3fb-200d-2640-fe0f\",\n \"1f9cd-1f3fc-200d-2640-fe0f\",\n \"1f9cd-1f3fd-200d-2640-fe0f\",\n \"1f9cd-1f3fe-200d-2640-fe0f\",\n \"1f9cd-1f3ff-200d-2640-fe0f\",\n ],\n \"1f9cd-200d-2642-fe0f\": [\n \"1f9cd-1f3fb-200d-2642-fe0f\",\n \"1f9cd-1f3fc-200d-2642-fe0f\",\n \"1f9cd-1f3fd-200d-2642-fe0f\",\n \"1f9cd-1f3fe-200d-2642-fe0f\",\n \"1f9cd-1f3ff-200d-2642-fe0f\",\n ],\n \"1f9cd\": [\"1f9cd-1f3fb\", \"1f9cd-1f3fc\", \"1f9cd-1f3fd\", \"1f9cd-1f3fe\", \"1f9cd-1f3ff\"],\n \"1f9ce-200d-2640-fe0f\": [\n \"1f9ce-1f3fb-200d-2640-fe0f\",\n \"1f9ce-1f3fc-200d-2640-fe0f\",\n \"1f9ce-1f3fd-200d-2640-fe0f\",\n \"1f9ce-1f3fe-200d-2640-fe0f\",\n \"1f9ce-1f3ff-200d-2640-fe0f\",\n ],\n \"1f9ce-200d-2640-fe0f-200d-27a1-fe0f\": [\n \"1f9ce-1f3fb-200d-2640-fe0f-200d-27a1-fe0f\",\n \"1f9ce-1f3fc-200d-2640-fe0f-200d-27a1-fe0f\",\n \"1f9ce-1f3fd-200d-2640-fe0f-200d-27a1-fe0f\",\n \"1f9ce-1f3fe-200d-2640-fe0f-200d-27a1-fe0f\",\n \"1f9ce-1f3ff-200d-2640-fe0f-200d-27a1-fe0f\",\n ],\n \"1f9ce-200d-2642-fe0f\": [\n \"1f9ce-1f3fb-200d-2642-fe0f\",\n \"1f9ce-1f3fc-200d-2642-fe0f\",\n \"1f9ce-1f3fd-200d-2642-fe0f\",\n \"1f9ce-1f3fe-200d-2642-fe0f\",\n \"1f9ce-1f3ff-200d-2642-fe0f\",\n ],\n \"1f9ce-200d-2642-fe0f-200d-27a1-fe0f\": [\n \"1f9ce-1f3fb-200d-2642-fe0f-200d-27a1-fe0f\",\n \"1f9ce-1f3fc-200d-2642-fe0f-200d-27a1-fe0f\",\n \"1f9ce-1f3fd-200d-2642-fe0f-200d-27a1-fe0f\",\n \"1f9ce-1f3fe-200d-2642-fe0f-200d-27a1-fe0f\",\n \"1f9ce-1f3ff-200d-2642-fe0f-200d-27a1-fe0f\",\n ],\n \"1f9ce-200d-27a1-fe0f\": [\n \"1f9ce-1f3fb-200d-27a1-fe0f\",\n \"1f9ce-1f3fc-200d-27a1-fe0f\",\n \"1f9ce-1f3fd-200d-27a1-fe0f\",\n \"1f9ce-1f3fe-200d-27a1-fe0f\",\n \"1f9ce-1f3ff-200d-27a1-fe0f\",\n ],\n \"1f9ce\": [\"1f9ce-1f3fb\", \"1f9ce-1f3fc\", \"1f9ce-1f3fd\", \"1f9ce-1f3fe\", \"1f9ce-1f3ff\"],\n \"1f9cf-200d-2640-fe0f\": [\n \"1f9cf-1f3fb-200d-2640-fe0f\",\n \"1f9cf-1f3fc-200d-2640-fe0f\",\n \"1f9cf-1f3fd-200d-2640-fe0f\",\n \"1f9cf-1f3fe-200d-2640-fe0f\",\n \"1f9cf-1f3ff-200d-2640-fe0f\",\n ],\n \"1f9cf-200d-2642-fe0f\": [\n \"1f9cf-1f3fb-200d-2642-fe0f\",\n \"1f9cf-1f3fc-200d-2642-fe0f\",\n \"1f9cf-1f3fd-200d-2642-fe0f\",\n \"1f9cf-1f3fe-200d-2642-fe0f\",\n \"1f9cf-1f3ff-200d-2642-fe0f\",\n ],\n \"1f9cf\": [\"1f9cf-1f3fb\", \"1f9cf-1f3fc\", \"1f9cf-1f3fd\", \"1f9cf-1f3fe\", \"1f9cf-1f3ff\"],\n \"1f9d1-200d-1f33e\": [\n \"1f9d1-1f3fb-200d-1f33e\",\n \"1f9d1-1f3fc-200d-1f33e\",\n \"1f9d1-1f3fd-200d-1f33e\",\n \"1f9d1-1f3fe-200d-1f33e\",\n \"1f9d1-1f3ff-200d-1f33e\",\n ],\n \"1f9d1-200d-1f373\": [\n \"1f9d1-1f3fb-200d-1f373\",\n \"1f9d1-1f3fc-200d-1f373\",\n \"1f9d1-1f3fd-200d-1f373\",\n \"1f9d1-1f3fe-200d-1f373\",\n \"1f9d1-1f3ff-200d-1f373\",\n ],\n \"1f9d1-200d-1f37c\": [\n \"1f9d1-1f3fb-200d-1f37c\",\n \"1f9d1-1f3fc-200d-1f37c\",\n \"1f9d1-1f3fd-200d-1f37c\",\n \"1f9d1-1f3fe-200d-1f37c\",\n \"1f9d1-1f3ff-200d-1f37c\",\n ],\n \"1f9d1-200d-1f384\": [\n \"1f9d1-1f3fb-200d-1f384\",\n \"1f9d1-1f3fc-200d-1f384\",\n \"1f9d1-1f3fd-200d-1f384\",\n \"1f9d1-1f3fe-200d-1f384\",\n \"1f9d1-1f3ff-200d-1f384\",\n ],\n \"1f9d1-200d-1f393\": [\n \"1f9d1-1f3fb-200d-1f393\",\n \"1f9d1-1f3fc-200d-1f393\",\n \"1f9d1-1f3fd-200d-1f393\",\n \"1f9d1-1f3fe-200d-1f393\",\n \"1f9d1-1f3ff-200d-1f393\",\n ],\n \"1f9d1-200d-1f3a4\": [\n \"1f9d1-1f3fb-200d-1f3a4\",\n \"1f9d1-1f3fc-200d-1f3a4\",\n \"1f9d1-1f3fd-200d-1f3a4\",\n \"1f9d1-1f3fe-200d-1f3a4\",\n \"1f9d1-1f3ff-200d-1f3a4\",\n ],\n \"1f9d1-200d-1f3a8\": [\n \"1f9d1-1f3fb-200d-1f3a8\",\n \"1f9d1-1f3fc-200d-1f3a8\",\n \"1f9d1-1f3fd-200d-1f3a8\",\n \"1f9d1-1f3fe-200d-1f3a8\",\n \"1f9d1-1f3ff-200d-1f3a8\",\n ],\n \"1f9d1-200d-1f3eb\": [\n \"1f9d1-1f3fb-200d-1f3eb\",\n \"1f9d1-1f3fc-200d-1f3eb\",\n \"1f9d1-1f3fd-200d-1f3eb\",\n \"1f9d1-1f3fe-200d-1f3eb\",\n \"1f9d1-1f3ff-200d-1f3eb\",\n ],\n \"1f9d1-200d-1f3ed\": [\n \"1f9d1-1f3fb-200d-1f3ed\",\n \"1f9d1-1f3fc-200d-1f3ed\",\n \"1f9d1-1f3fd-200d-1f3ed\",\n \"1f9d1-1f3fe-200d-1f3ed\",\n \"1f9d1-1f3ff-200d-1f3ed\",\n ],\n \"1f9d1-200d-1f4bb\": [\n \"1f9d1-1f3fb-200d-1f4bb\",\n \"1f9d1-1f3fc-200d-1f4bb\",\n \"1f9d1-1f3fd-200d-1f4bb\",\n \"1f9d1-1f3fe-200d-1f4bb\",\n \"1f9d1-1f3ff-200d-1f4bb\",\n ],\n \"1f9d1-200d-1f4bc\": [\n \"1f9d1-1f3fb-200d-1f4bc\",\n \"1f9d1-1f3fc-200d-1f4bc\",\n \"1f9d1-1f3fd-200d-1f4bc\",\n \"1f9d1-1f3fe-200d-1f4bc\",\n \"1f9d1-1f3ff-200d-1f4bc\",\n ],\n \"1f9d1-200d-1f527\": [\n \"1f9d1-1f3fb-200d-1f527\",\n \"1f9d1-1f3fc-200d-1f527\",\n \"1f9d1-1f3fd-200d-1f527\",\n \"1f9d1-1f3fe-200d-1f527\",\n \"1f9d1-1f3ff-200d-1f527\",\n ],\n \"1f9d1-200d-1f52c\": [\n \"1f9d1-1f3fb-200d-1f52c\",\n \"1f9d1-1f3fc-200d-1f52c\",\n \"1f9d1-1f3fd-200d-1f52c\",\n \"1f9d1-1f3fe-200d-1f52c\",\n \"1f9d1-1f3ff-200d-1f52c\",\n ],\n \"1f9d1-200d-1f680\": [\n \"1f9d1-1f3fb-200d-1f680\",\n \"1f9d1-1f3fc-200d-1f680\",\n \"1f9d1-1f3fd-200d-1f680\",\n \"1f9d1-1f3fe-200d-1f680\",\n \"1f9d1-1f3ff-200d-1f680\",\n ],\n \"1f9d1-200d-1f692\": [\n \"1f9d1-1f3fb-200d-1f692\",\n \"1f9d1-1f3fc-200d-1f692\",\n \"1f9d1-1f3fd-200d-1f692\",\n \"1f9d1-1f3fe-200d-1f692\",\n \"1f9d1-1f3ff-200d-1f692\",\n ],\n \"1f9d1-200d-1f9af-200d-27a1-fe0f\": [\n \"1f9d1-1f3fb-200d-1f9af-200d-27a1-fe0f\",\n \"1f9d1-1f3fc-200d-1f9af-200d-27a1-fe0f\",\n \"1f9d1-1f3fd-200d-1f9af-200d-27a1-fe0f\",\n \"1f9d1-1f3fe-200d-1f9af-200d-27a1-fe0f\",\n \"1f9d1-1f3ff-200d-1f9af-200d-27a1-fe0f\",\n ],\n \"1f9d1-200d-1f9af\": [\n \"1f9d1-1f3fb-200d-1f9af\",\n \"1f9d1-1f3fc-200d-1f9af\",\n \"1f9d1-1f3fd-200d-1f9af\",\n \"1f9d1-1f3fe-200d-1f9af\",\n \"1f9d1-1f3ff-200d-1f9af\",\n ],\n \"1f9d1-200d-1f9b0\": [\n \"1f9d1-1f3fb-200d-1f9b0\",\n \"1f9d1-1f3fc-200d-1f9b0\",\n \"1f9d1-1f3fd-200d-1f9b0\",\n \"1f9d1-1f3fe-200d-1f9b0\",\n \"1f9d1-1f3ff-200d-1f9b0\",\n ],\n \"1f9d1-200d-1f9b1\": [\n \"1f9d1-1f3fb-200d-1f9b1\",\n \"1f9d1-1f3fc-200d-1f9b1\",\n \"1f9d1-1f3fd-200d-1f9b1\",\n \"1f9d1-1f3fe-200d-1f9b1\",\n \"1f9d1-1f3ff-200d-1f9b1\",\n ],\n \"1f9d1-200d-1f9b2\": [\n \"1f9d1-1f3fb-200d-1f9b2\",\n \"1f9d1-1f3fc-200d-1f9b2\",\n \"1f9d1-1f3fd-200d-1f9b2\",\n \"1f9d1-1f3fe-200d-1f9b2\",\n \"1f9d1-1f3ff-200d-1f9b2\",\n ],\n \"1f9d1-200d-1f9b3\": [\n \"1f9d1-1f3fb-200d-1f9b3\",\n \"1f9d1-1f3fc-200d-1f9b3\",\n \"1f9d1-1f3fd-200d-1f9b3\",\n \"1f9d1-1f3fe-200d-1f9b3\",\n \"1f9d1-1f3ff-200d-1f9b3\",\n ],\n \"1f9d1-200d-1f9bc-200d-27a1-fe0f\": [\n \"1f9d1-1f3fb-200d-1f9bc-200d-27a1-fe0f\",\n \"1f9d1-1f3fc-200d-1f9bc-200d-27a1-fe0f\",\n \"1f9d1-1f3fd-200d-1f9bc-200d-27a1-fe0f\",\n \"1f9d1-1f3fe-200d-1f9bc-200d-27a1-fe0f\",\n \"1f9d1-1f3ff-200d-1f9bc-200d-27a1-fe0f\",\n ],\n \"1f9d1-200d-1f9bc\": [\n \"1f9d1-1f3fb-200d-1f9bc\",\n \"1f9d1-1f3fc-200d-1f9bc\",\n \"1f9d1-1f3fd-200d-1f9bc\",\n \"1f9d1-1f3fe-200d-1f9bc\",\n \"1f9d1-1f3ff-200d-1f9bc\",\n ],\n \"1f9d1-200d-1f9bd-200d-27a1-fe0f\": [\n \"1f9d1-1f3fb-200d-1f9bd-200d-27a1-fe0f\",\n \"1f9d1-1f3fc-200d-1f9bd-200d-27a1-fe0f\",\n \"1f9d1-1f3fd-200d-1f9bd-200d-27a1-fe0f\",\n \"1f9d1-1f3fe-200d-1f9bd-200d-27a1-fe0f\",\n \"1f9d1-1f3ff-200d-1f9bd-200d-27a1-fe0f\",\n ],\n \"1f9d1-200d-1f9bd\": [\n \"1f9d1-1f3fb-200d-1f9bd\",\n \"1f9d1-1f3fc-200d-1f9bd\",\n \"1f9d1-1f3fd-200d-1f9bd\",\n \"1f9d1-1f3fe-200d-1f9bd\",\n \"1f9d1-1f3ff-200d-1f9bd\",\n ],\n \"1f9d1-200d-2695-fe0f\": [\n \"1f9d1-1f3fb-200d-2695-fe0f\",\n \"1f9d1-1f3fc-200d-2695-fe0f\",\n \"1f9d1-1f3fd-200d-2695-fe0f\",\n \"1f9d1-1f3fe-200d-2695-fe0f\",\n \"1f9d1-1f3ff-200d-2695-fe0f\",\n ],\n \"1f9d1-200d-2696-fe0f\": [\n \"1f9d1-1f3fb-200d-2696-fe0f\",\n \"1f9d1-1f3fc-200d-2696-fe0f\",\n \"1f9d1-1f3fd-200d-2696-fe0f\",\n \"1f9d1-1f3fe-200d-2696-fe0f\",\n \"1f9d1-1f3ff-200d-2696-fe0f\",\n ],\n \"1f9d1-200d-2708-fe0f\": [\n \"1f9d1-1f3fb-200d-2708-fe0f\",\n \"1f9d1-1f3fc-200d-2708-fe0f\",\n \"1f9d1-1f3fd-200d-2708-fe0f\",\n \"1f9d1-1f3fe-200d-2708-fe0f\",\n \"1f9d1-1f3ff-200d-2708-fe0f\",\n ],\n \"1f9d1\": [\"1f9d1-1f3fb\", \"1f9d1-1f3fc\", \"1f9d1-1f3fd\", \"1f9d1-1f3fe\", \"1f9d1-1f3ff\"],\n \"1f9d2\": [\"1f9d2-1f3fb\", \"1f9d2-1f3fc\", \"1f9d2-1f3fd\", \"1f9d2-1f3fe\", \"1f9d2-1f3ff\"],\n \"1f9d3\": [\"1f9d3-1f3fb\", \"1f9d3-1f3fc\", \"1f9d3-1f3fd\", \"1f9d3-1f3fe\", \"1f9d3-1f3ff\"],\n \"1f9d4-200d-2640-fe0f\": [\n \"1f9d4-1f3fb-200d-2640-fe0f\",\n \"1f9d4-1f3fc-200d-2640-fe0f\",\n \"1f9d4-1f3fd-200d-2640-fe0f\",\n \"1f9d4-1f3fe-200d-2640-fe0f\",\n \"1f9d4-1f3ff-200d-2640-fe0f\",\n ],\n \"1f9d4-200d-2642-fe0f\": [\n \"1f9d4-1f3fb-200d-2642-fe0f\",\n \"1f9d4-1f3fc-200d-2642-fe0f\",\n \"1f9d4-1f3fd-200d-2642-fe0f\",\n \"1f9d4-1f3fe-200d-2642-fe0f\",\n \"1f9d4-1f3ff-200d-2642-fe0f\",\n ],\n \"1f9d4\": [\"1f9d4-1f3fb\", \"1f9d4-1f3fc\", \"1f9d4-1f3fd\", \"1f9d4-1f3fe\", \"1f9d4-1f3ff\"],\n \"1f9d5\": [\"1f9d5-1f3fb\", \"1f9d5-1f3fc\", \"1f9d5-1f3fd\", \"1f9d5-1f3fe\", \"1f9d5-1f3ff\"],\n \"1f9d6-200d-2640-fe0f\": [\n \"1f9d6-1f3fb-200d-2640-fe0f\",\n \"1f9d6-1f3fc-200d-2640-fe0f\",\n \"1f9d6-1f3fd-200d-2640-fe0f\",\n \"1f9d6-1f3fe-200d-2640-fe0f\",\n \"1f9d6-1f3ff-200d-2640-fe0f\",\n ],\n \"1f9d6-200d-2642-fe0f\": [\n \"1f9d6-1f3fb-200d-2642-fe0f\",\n \"1f9d6-1f3fc-200d-2642-fe0f\",\n \"1f9d6-1f3fd-200d-2642-fe0f\",\n \"1f9d6-1f3fe-200d-2642-fe0f\",\n \"1f9d6-1f3ff-200d-2642-fe0f\",\n ],\n \"1f9d6\": [\"1f9d6-1f3fb\", \"1f9d6-1f3fc\", \"1f9d6-1f3fd\", \"1f9d6-1f3fe\", \"1f9d6-1f3ff\"],\n \"1f9d7-200d-2640-fe0f\": [\n \"1f9d7-1f3fb-200d-2640-fe0f\",\n \"1f9d7-1f3fc-200d-2640-fe0f\",\n \"1f9d7-1f3fd-200d-2640-fe0f\",\n \"1f9d7-1f3fe-200d-2640-fe0f\",\n \"1f9d7-1f3ff-200d-2640-fe0f\",\n ],\n \"1f9d7-200d-2642-fe0f\": [\n \"1f9d7-1f3fb-200d-2642-fe0f\",\n \"1f9d7-1f3fc-200d-2642-fe0f\",\n \"1f9d7-1f3fd-200d-2642-fe0f\",\n \"1f9d7-1f3fe-200d-2642-fe0f\",\n \"1f9d7-1f3ff-200d-2642-fe0f\",\n ],\n \"1f9d7\": [\"1f9d7-1f3fb\", \"1f9d7-1f3fc\", \"1f9d7-1f3fd\", \"1f9d7-1f3fe\", \"1f9d7-1f3ff\"],\n \"1f9d8-200d-2640-fe0f\": [\n \"1f9d8-1f3fb-200d-2640-fe0f\",\n \"1f9d8-1f3fc-200d-2640-fe0f\",\n \"1f9d8-1f3fd-200d-2640-fe0f\",\n \"1f9d8-1f3fe-200d-2640-fe0f\",\n \"1f9d8-1f3ff-200d-2640-fe0f\",\n ],\n \"1f9d8-200d-2642-fe0f\": [\n \"1f9d8-1f3fb-200d-2642-fe0f\",\n \"1f9d8-1f3fc-200d-2642-fe0f\",\n \"1f9d8-1f3fd-200d-2642-fe0f\",\n \"1f9d8-1f3fe-200d-2642-fe0f\",\n \"1f9d8-1f3ff-200d-2642-fe0f\",\n ],\n \"1f9d8\": [\"1f9d8-1f3fb\", \"1f9d8-1f3fc\", \"1f9d8-1f3fd\", \"1f9d8-1f3fe\", \"1f9d8-1f3ff\"],\n \"1f9d9-200d-2640-fe0f\": [\n \"1f9d9-1f3fb-200d-2640-fe0f\",\n \"1f9d9-1f3fc-200d-2640-fe0f\",\n \"1f9d9-1f3fd-200d-2640-fe0f\",\n \"1f9d9-1f3fe-200d-2640-fe0f\",\n \"1f9d9-1f3ff-200d-2640-fe0f\",\n ],\n \"1f9d9-200d-2642-fe0f\": [\n \"1f9d9-1f3fb-200d-2642-fe0f\",\n \"1f9d9-1f3fc-200d-2642-fe0f\",\n \"1f9d9-1f3fd-200d-2642-fe0f\",\n \"1f9d9-1f3fe-200d-2642-fe0f\",\n \"1f9d9-1f3ff-200d-2642-fe0f\",\n ],\n \"1f9d9\": [\"1f9d9-1f3fb\", \"1f9d9-1f3fc\", \"1f9d9-1f3fd\", \"1f9d9-1f3fe\", \"1f9d9-1f3ff\"],\n \"1f9da-200d-2640-fe0f\": [\n \"1f9da-1f3fb-200d-2640-fe0f\",\n \"1f9da-1f3fc-200d-2640-fe0f\",\n \"1f9da-1f3fd-200d-2640-fe0f\",\n \"1f9da-1f3fe-200d-2640-fe0f\",\n \"1f9da-1f3ff-200d-2640-fe0f\",\n ],\n \"1f9da-200d-2642-fe0f\": [\n \"1f9da-1f3fb-200d-2642-fe0f\",\n \"1f9da-1f3fc-200d-2642-fe0f\",\n \"1f9da-1f3fd-200d-2642-fe0f\",\n \"1f9da-1f3fe-200d-2642-fe0f\",\n \"1f9da-1f3ff-200d-2642-fe0f\",\n ],\n \"1f9da\": [\"1f9da-1f3fb\", \"1f9da-1f3fc\", \"1f9da-1f3fd\", \"1f9da-1f3fe\", \"1f9da-1f3ff\"],\n \"1f9db-200d-2640-fe0f\": [\n \"1f9db-1f3fb-200d-2640-fe0f\",\n \"1f9db-1f3fc-200d-2640-fe0f\",\n \"1f9db-1f3fd-200d-2640-fe0f\",\n \"1f9db-1f3fe-200d-2640-fe0f\",\n \"1f9db-1f3ff-200d-2640-fe0f\",\n ],\n \"1f9db-200d-2642-fe0f\": [\n \"1f9db-1f3fb-200d-2642-fe0f\",\n \"1f9db-1f3fc-200d-2642-fe0f\",\n \"1f9db-1f3fd-200d-2642-fe0f\",\n \"1f9db-1f3fe-200d-2642-fe0f\",\n \"1f9db-1f3ff-200d-2642-fe0f\",\n ],\n \"1f9db\": [\"1f9db-1f3fb\", \"1f9db-1f3fc\", \"1f9db-1f3fd\", \"1f9db-1f3fe\", \"1f9db-1f3ff\"],\n \"1f9dc-200d-2640-fe0f\": [\n \"1f9dc-1f3fb-200d-2640-fe0f\",\n \"1f9dc-1f3fc-200d-2640-fe0f\",\n \"1f9dc-1f3fd-200d-2640-fe0f\",\n \"1f9dc-1f3fe-200d-2640-fe0f\",\n \"1f9dc-1f3ff-200d-2640-fe0f\",\n ],\n \"1f9dc-200d-2642-fe0f\": [\n \"1f9dc-1f3fb-200d-2642-fe0f\",\n \"1f9dc-1f3fc-200d-2642-fe0f\",\n \"1f9dc-1f3fd-200d-2642-fe0f\",\n \"1f9dc-1f3fe-200d-2642-fe0f\",\n \"1f9dc-1f3ff-200d-2642-fe0f\",\n ],\n \"1f9dc\": [\"1f9dc-1f3fb\", \"1f9dc-1f3fc\", \"1f9dc-1f3fd\", \"1f9dc-1f3fe\", \"1f9dc-1f3ff\"],\n \"1f9dd-200d-2640-fe0f\": [\n \"1f9dd-1f3fb-200d-2640-fe0f\",\n \"1f9dd-1f3fc-200d-2640-fe0f\",\n \"1f9dd-1f3fd-200d-2640-fe0f\",\n \"1f9dd-1f3fe-200d-2640-fe0f\",\n \"1f9dd-1f3ff-200d-2640-fe0f\",\n ],\n \"1f9dd-200d-2642-fe0f\": [\n \"1f9dd-1f3fb-200d-2642-fe0f\",\n \"1f9dd-1f3fc-200d-2642-fe0f\",\n \"1f9dd-1f3fd-200d-2642-fe0f\",\n \"1f9dd-1f3fe-200d-2642-fe0f\",\n \"1f9dd-1f3ff-200d-2642-fe0f\",\n ],\n \"1f9dd\": [\"1f9dd-1f3fb\", \"1f9dd-1f3fc\", \"1f9dd-1f3fd\", \"1f9dd-1f3fe\", \"1f9dd-1f3ff\"],\n \"1fac3\": [\"1fac3-1f3fb\", \"1fac3-1f3fc\", \"1fac3-1f3fd\", \"1fac3-1f3fe\", \"1fac3-1f3ff\"],\n \"1fac4\": [\"1fac4-1f3fb\", \"1fac4-1f3fc\", \"1fac4-1f3fd\", \"1fac4-1f3fe\", \"1fac4-1f3ff\"],\n \"1fac5\": [\"1fac5-1f3fb\", \"1fac5-1f3fc\", \"1fac5-1f3fd\", \"1fac5-1f3fe\", \"1fac5-1f3ff\"],\n \"1faf0\": [\"1faf0-1f3fb\", \"1faf0-1f3fc\", \"1faf0-1f3fd\", \"1faf0-1f3fe\", \"1faf0-1f3ff\"],\n \"1faf1\": [\"1faf1-1f3fb\", \"1faf1-1f3fc\", \"1faf1-1f3fd\", \"1faf1-1f3fe\", \"1faf1-1f3ff\"],\n \"1faf2\": [\"1faf2-1f3fb\", \"1faf2-1f3fc\", \"1faf2-1f3fd\", \"1faf2-1f3fe\", \"1faf2-1f3ff\"],\n \"1faf3\": [\"1faf3-1f3fb\", \"1faf3-1f3fc\", \"1faf3-1f3fd\", \"1faf3-1f3fe\", \"1faf3-1f3ff\"],\n \"1faf4\": [\"1faf4-1f3fb\", \"1faf4-1f3fc\", \"1faf4-1f3fd\", \"1faf4-1f3fe\", \"1faf4-1f3ff\"],\n \"1faf5\": [\"1faf5-1f3fb\", \"1faf5-1f3fc\", \"1faf5-1f3fd\", \"1faf5-1f3fe\", \"1faf5-1f3ff\"],\n \"1faf6\": [\"1faf6-1f3fb\", \"1faf6-1f3fc\", \"1faf6-1f3fd\", \"1faf6-1f3fe\", \"1faf6-1f3ff\"],\n \"1faf7\": [\"1faf7-1f3fb\", \"1faf7-1f3fc\", \"1faf7-1f3fd\", \"1faf7-1f3fe\", \"1faf7-1f3ff\"],\n \"1faf8\": [\"1faf8-1f3fb\", \"1faf8-1f3fc\", \"1faf8-1f3fd\", \"1faf8-1f3fe\", \"1faf8-1f3ff\"],\n \"261d-fe0f\": [\"261d-1f3fb\", \"261d-1f3fc\", \"261d-1f3fd\", \"261d-1f3fe\", \"261d-1f3ff\"],\n \"26f9-fe0f-200d-2640-fe0f\": [\n \"26f9-1f3fb-200d-2640-fe0f\",\n \"26f9-1f3fc-200d-2640-fe0f\",\n \"26f9-1f3fd-200d-2640-fe0f\",\n \"26f9-1f3fe-200d-2640-fe0f\",\n \"26f9-1f3ff-200d-2640-fe0f\",\n ],\n \"26f9-fe0f-200d-2642-fe0f\": [\n \"26f9-1f3fb-200d-2642-fe0f\",\n \"26f9-1f3fc-200d-2642-fe0f\",\n \"26f9-1f3fd-200d-2642-fe0f\",\n \"26f9-1f3fe-200d-2642-fe0f\",\n \"26f9-1f3ff-200d-2642-fe0f\",\n ],\n \"26f9-fe0f\": [\"26f9-1f3fb\", \"26f9-1f3fc\", \"26f9-1f3fd\", \"26f9-1f3fe\", \"26f9-1f3ff\"],\n \"270a\": [\"270a-1f3fb\", \"270a-1f3fc\", \"270a-1f3fd\", \"270a-1f3fe\", \"270a-1f3ff\"],\n \"270b\": [\"270b-1f3fb\", \"270b-1f3fc\", \"270b-1f3fd\", \"270b-1f3fe\", \"270b-1f3ff\"],\n \"270c-fe0f\": [\"270c-1f3fb\", \"270c-1f3fc\", \"270c-1f3fd\", \"270c-1f3fe\", \"270c-1f3ff\"],\n \"270d-fe0f\": [\"270d-1f3fb\", \"270d-1f3fc\", \"270d-1f3fd\", \"270d-1f3fe\", \"270d-1f3ff\"],\n};\n","import { LEGACY_ALIASES } from \"./aliases\";\nimport { EMOJI_NAMES, EMOJI_SKIN_TONES } from \"./data.generated\";\n\nconst ALL_NAMES: Record<string, string> = { ...EMOJI_NAMES, ...LEGACY_ALIASES };\n\nexport type ResolvedEmoji = { kind: \"unicode\"; unified: string } | { kind: \"custom\"; url: string };\n\n/**\n * Resolves a `:name:` shortcode to a Unicode codepoint or a workspace custom emoji URL.\n * `custom` entries may point at a URL, or `alias:<name>` to point at another emoji (which may\n * itself be a standard one). Returns null when the name isn't recognized.\n */\nexport function resolveEmoji(\n name: string,\n skinTone: number | undefined,\n custom: Record<string, string> | undefined,\n): ResolvedEmoji | null {\n if (custom) {\n let current = name;\n const seen = new Set<string>();\n while (Object.hasOwn(custom, current) && !seen.has(current)) {\n seen.add(current);\n const value = custom[current];\n if (typeof value !== \"string\") break;\n if (value.startsWith(\"alias:\")) {\n current = value.slice(\"alias:\".length);\n continue;\n }\n return { kind: \"custom\", url: value };\n }\n }\n\n const unified = ALL_NAMES[name.toLowerCase()];\n if (!unified) return null;\n\n if (skinTone && skinTone >= 2 && skinTone <= 6) {\n const variant = EMOJI_SKIN_TONES[unified]?.[skinTone - 2];\n if (variant) return { kind: \"unicode\", unified: variant };\n }\n return { kind: \"unicode\", unified };\n}\n\n/** Apple emoji set served from jsDelivr, Slack's own image source for standard emoji. */\nexport function defaultEmojiImageUrl(unified: string): string {\n return `https://cdn.jsdelivr.net/npm/emoji-datasource-apple@16.0.0/img/apple/64/${unified}.png`;\n}\n","import { useBlockKit } from \"../context\";\nimport { Tooltip } from \"../Tooltip\";\nimport { defaultEmojiImageUrl, resolveEmoji } from \"./lookup\";\n\nexport interface EmojiProps {\n /** Shortcode without colons, e.g. `\"+1\"` or `\"basketball\"`. */\n name: string;\n /** Fitzpatrick modifier 2-6, as in Slack's `skin-tone-N`. */\n skinTone?: number;\n /** Rendered width/height in px. Defaults to 22, Slack's inline size at 15px text. */\n size?: number;\n}\n\n/** Renders a `:name:` shortcode as an image, matching Slack exactly. Unknown names fall back to the literal text. */\nexport function Emoji({ name, skinTone, size = 22 }: EmojiProps) {\n const { emoji } = useBlockKit();\n const resolved = resolveEmoji(name, skinTone, emoji.custom);\n if (!resolved) return <>{`:${name}:`}</>;\n\n const src =\n resolved.kind === \"custom\"\n ? resolved.url\n : (emoji.imageUrl ?? defaultEmojiImageUrl)(resolved.unified);\n\n return (\n <Tooltip label={`:${name}:`}>\n <span className=\"sbk-emoji\" style={{ width: size, height: size }}>\n <img\n className=\"sbk-emoji__img\"\n src={src}\n alt={`:${name}:`}\n draggable={false}\n style={{ width: size, height: size, top: size / 2, marginTop: -size / 2 }}\n />\n </span>\n </Tooltip>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { type LinkProps, type MentionRef, useBlockKit } from \"./context\";\n\n/**\n * A link from the payload, rendered by the provider's `linkComponent` when it has one. Without an\n * `href` (a payload missing its URL) it stays a plain `<a>`, so the app's component always gets one.\n */\nexport function Link({\n href,\n children,\n ...props\n}: Omit<LinkProps, \"href\"> & { href: string | undefined }) {\n const { linkComponent: Component } = useBlockKit();\n if (Component && href !== undefined)\n return (\n <Component href={href} {...props}>\n {children}\n </Component>\n );\n return (\n <a href={href} {...props}>\n {children}\n </a>\n );\n}\n\n/**\n * A resolved channel or user group mention: a link to the app's page for it when `mentionHref`\n * returns one, otherwise the plain pill. Both keep the pill's class, so they look the same.\n */\nexport function MentionLink({ type, id, children }: MentionRef & { children: ReactNode }) {\n const { mentionHref } = useBlockKit();\n const href = mentionHref?.({ type, id });\n return href === undefined ? (\n <span className=\"sbk-mention\">{children}</span>\n ) : (\n <Link className=\"sbk-mention\" href={href}>\n {children}\n </Link>\n );\n}\n","import { type KeyboardEvent, useEffect, useId, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { useBlockKit } from \"./context\";\nimport { Emoji } from \"./emoji\";\nimport { Link } from \"./Link\";\nimport { useClientLayoutEffect } from \"./useClientLayoutEffect\";\n\nexport interface UserMentionProps {\n /** Slack user id, e.g. `U0123ABC`. */\n id: string;\n /** Display name, rendered as `@name`. */\n name: string;\n}\n\nfunction localTime(timeZone: string): string | undefined {\n try {\n return new Date().toLocaleTimeString(\"en-US\", { hour: \"numeric\", minute: \"2-digit\", timeZone });\n } catch {\n return undefined;\n }\n}\n\n/**\n * A resolved `@user` mention. Clicking it (or Enter/Space when focused) opens a profile card like\n * Slack's `p-member_profile_card` popover: avatar, names, title, status and local time, filled from\n * `resolvers.userProfile` and falling back to the display name alone.\n */\nexport function UserMention({ id, name }: UserMentionProps) {\n const { resolvers, theme, mentionHref } = useBlockKit();\n const [open, setOpen] = useState(false);\n const [position, setPosition] = useState<{ top: number; left: number } | null>(null);\n const anchorRef = useRef<HTMLSpanElement>(null);\n const cardRef = useRef<HTMLDivElement>(null);\n const cardId = useId();\n\n useClientLayoutEffect(() => {\n if (!open) {\n setPosition(null);\n return;\n }\n const anchor = anchorRef.current?.getBoundingClientRect();\n const card = cardRef.current?.getBoundingClientRect();\n if (!anchor || !card) return;\n const gap = 4;\n const below = anchor.bottom + gap;\n const top =\n below + card.height <= window.innerHeight || anchor.top - gap - card.height < 0\n ? below\n : anchor.top - gap - card.height;\n const left = Math.min(Math.max(8, anchor.left), window.innerWidth - card.width - 8);\n setPosition({ top, left });\n }, [open]);\n\n useEffect(() => {\n if (!open) return;\n const onPointerDown = (e: MouseEvent) => {\n const target = e.target as Node;\n if (anchorRef.current?.contains(target) || cardRef.current?.contains(target)) return;\n setOpen(false);\n };\n const onKey = (e: globalThis.KeyboardEvent) => {\n if (e.key === \"Escape\") {\n setOpen(false);\n anchorRef.current?.focus();\n }\n };\n document.addEventListener(\"mousedown\", onPointerDown);\n document.addEventListener(\"keydown\", onKey);\n return () => {\n document.removeEventListener(\"mousedown\", onPointerDown);\n document.removeEventListener(\"keydown\", onKey);\n };\n }, [open]);\n\n function onKeyDown(e: KeyboardEvent) {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n setOpen((o) => !o);\n }\n }\n\n const profile = open ? (resolvers.userProfile?.(id) ?? { name }) : undefined;\n const time = profile?.timeZone ? localTime(profile.timeZone) : undefined;\n const href = profile ? mentionHref?.({ type: \"user\", id }) : undefined;\n\n return (\n <>\n <span\n ref={anchorRef}\n className=\"sbk-mention sbk-mention--user\"\n role=\"button\"\n tabIndex={0}\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n aria-controls={open ? cardId : undefined}\n onClick={() => setOpen((o) => !o)}\n onKeyDown={onKeyDown}\n >\n @{name}\n </span>\n {profile &&\n typeof document !== \"undefined\" &&\n createPortal(\n <div\n ref={cardRef}\n id={cardId}\n role=\"dialog\"\n aria-label={profile.name}\n className=\"sbk-root sbk-profile-card\"\n data-theme={theme}\n style={\n position\n ? { top: position.top, left: position.left }\n : { top: 0, left: 0, visibility: \"hidden\" }\n }\n >\n {profile.avatarUrl ? (\n <img className=\"sbk-profile-card__avatar\" src={profile.avatarUrl} alt=\"\" />\n ) : (\n <span\n className=\"sbk-profile-card__avatar sbk-profile-card__avatar--placeholder\"\n aria-hidden=\"true\"\n >\n {profile.name.charAt(0).toUpperCase()}\n </span>\n )}\n <div className=\"sbk-profile-card__body\">\n <div className=\"sbk-profile-card__name\">\n {href === undefined ? (\n profile.name\n ) : (\n <Link className=\"sbk-profile-card__name-link\" href={href}>\n {profile.name}\n </Link>\n )}\n {profile.pronouns && (\n <span className=\"sbk-profile-card__pronouns\">{profile.pronouns}</span>\n )}\n </div>\n {profile.realName && profile.realName !== profile.name && (\n <div className=\"sbk-profile-card__secondary\">{profile.realName}</div>\n )}\n {profile.title && <div className=\"sbk-profile-card__secondary\">{profile.title}</div>}\n {profile.status && (profile.status.emoji || profile.status.text) && (\n <div className=\"sbk-profile-card__status\">\n {profile.status.emoji && <Emoji name={profile.status.emoji} size={16} />}\n {profile.status.text}\n </div>\n )}\n {time && <div className=\"sbk-profile-card__time\">{time} local time</div>}\n </div>\n </div>,\n document.body,\n )}\n </>\n );\n}\n","import { formatSlackDate, type InlineNode, type MrkdwnNode, parse } from \"./parser\";\nimport { Fragment, type ReactNode } from \"react\";\nimport { useBlockKit } from \"./context\";\nimport { Emoji } from \"./emoji\";\nimport { Link, MentionLink } from \"./Link\";\nimport { UserMention } from \"./UserMention\";\n\nexport interface MrkdwnProps {\n text: string;\n /** Slack's `verbatim` flag. When false (the default), bare URLs are linked. */\n verbatim?: boolean;\n /** Pixel size for `:emoji:` images. Defaults to 22 (Slack's inline size at 15px text). */\n emojiSize?: number;\n}\n\n/** Renders a Slack mrkdwn string. */\nexport function Mrkdwn({ text, verbatim = false, emojiSize = 22 }: MrkdwnProps) {\n const { resolvers, timeZone } = useBlockKit();\n const root = parse(text, { verbatim });\n return (\n <span className=\"sbk-mrkdwn\">{renderNodes(root.children, resolvers, timeZone, emojiSize)}</span>\n );\n}\n\nfunction renderNodes(\n nodes: MrkdwnNode[],\n resolvers: ReturnType<typeof useBlockKit>[\"resolvers\"],\n timeZone: string | undefined,\n emojiSize: number,\n): ReactNode[] {\n return nodes.map((node, i) => (\n <Fragment key={i}>{renderNode(node, resolvers, timeZone, emojiSize)}</Fragment>\n ));\n}\n\nfunction renderNode(\n node: MrkdwnNode,\n resolvers: ReturnType<typeof useBlockKit>[\"resolvers\"],\n timeZone: string | undefined,\n emojiSize: number,\n): ReactNode {\n switch (node.type) {\n case \"text\":\n return renderText(node.value);\n case \"bold\":\n return <b>{renderNodes(node.children, resolvers, timeZone, emojiSize)}</b>;\n case \"italic\":\n return <i>{renderNodes(node.children, resolvers, timeZone, emojiSize)}</i>;\n case \"strike\":\n return <s>{renderNodes(node.children, resolvers, timeZone, emojiSize)}</s>;\n case \"code\":\n return <code className=\"sbk-mrkdwn__code\">{node.value}</code>;\n case \"preformatted\":\n return <pre className=\"sbk-mrkdwn__pre\">{node.value}</pre>;\n case \"quote\":\n return (\n <blockquote className=\"sbk-mrkdwn__quote\">\n {renderNodes(node.children, resolvers, timeZone, emojiSize)}\n </blockquote>\n );\n case \"link\":\n return (\n <Link className=\"sbk-link\" href={node.url} target=\"_blank\" rel=\"noopener noreferrer\">\n {node.children ? renderNodes(node.children, resolvers, timeZone, emojiSize) : node.url}\n </Link>\n );\n case \"user\": {\n const name = resolvers.user?.(node.id);\n return name ? <UserMention id={node.id} name={name} /> : <Fragment>@{node.id}</Fragment>;\n }\n case \"usergroup\": {\n // The Builder shows an empty loading pill for subteam mentions it can't resolve live, even\n // when the message carries a `|label` fallback — the label is ignored for display.\n const name = resolvers.usergroup?.(node.id);\n return name ? (\n <MentionLink type=\"usergroup\" id={node.id}>\n @{name}\n </MentionLink>\n ) : (\n <span className=\"sbk-mention--loading\" aria-label=\"Loading user group\" />\n );\n }\n case \"channel\": {\n const name = resolvers.channel?.(node.id) ?? node.label;\n return name ? (\n <MentionLink type=\"channel\" id={node.id}>\n #{name}\n </MentionLink>\n ) : (\n <span className=\"sbk-mention--private\">\n <LockIcon />\n Private channel\n </span>\n );\n }\n case \"broadcast\":\n return <span className=\"sbk-mention--broadcast\">@{node.range}</span>;\n case \"date\": {\n const text = formatSlackDate(node.timestamp, node.format, { timeZone });\n return node.url ? (\n <Link className=\"sbk-link\" href={node.url} target=\"_blank\" rel=\"noopener noreferrer\">\n {text}\n </Link>\n ) : (\n <span className=\"sbk-mrkdwn__date\">{text}</span>\n );\n }\n case \"emoji\":\n return <Emoji name={node.name} skinTone={node.skinTone} size={emojiSize} />;\n }\n}\n\n/** Matches the lock glyph Slack shows on an unresolved private channel mention. */\nexport function LockIcon() {\n return (\n <svg\n className=\"sbk-mention__lock-icon\"\n viewBox=\"0 0 20 20\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <path\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M10 1.5A4.5 4.5 0 0 0 5.5 6v1.5h-.25A2.25 2.25 0 0 0 3 9.75v6.5c0 .966.784 1.75 1.75 1.75h10.5A1.75 1.75 0 0 0 17 16.25v-6.5a2.25 2.25 0 0 0-2.25-2.25h-.25V6A4.5 4.5 0 0 0 10 1.5m3 6V6a3 3 0 1 0-6 0v1.5zM4.5 9.75A.75.75 0 0 1 5.25 9h9.5a.75.75 0 0 1 .75.75v6.5a.25.25 0 0 1-.25.25H4.75a.25.25 0 0 1-.25-.25z\"\n />\n </svg>\n );\n}\n\nfunction renderText(value: string): ReactNode {\n const lines = value.split(\"\\n\");\n return lines.map((line, i) => (\n <Fragment key={i}>\n {i > 0 && <br />}\n {line}\n </Fragment>\n ));\n}\n\nexport type { InlineNode };\n","import type { MrkdwnElement, PlainTextElement } from \"@slack/types\";\nimport { parsePlainTextEmoji } from \"./parser\";\nimport { Fragment } from \"react\";\nimport { Emoji } from \"./emoji\";\nimport { Mrkdwn } from \"./Mrkdwn\";\n\nexport type TextObject = PlainTextElement | MrkdwnElement;\n\nexport interface TextProps {\n text: TextObject;\n /** Pixel size for `:emoji:` images. Defaults to 22 (Slack's inline size at 15px text). */\n emojiSize?: number;\n}\n\n/** Renders a Block Kit text object. */\nexport function Text({ text, emojiSize = 22 }: TextProps) {\n if (text.type === \"mrkdwn\") {\n return <Mrkdwn text={text.text} verbatim={text.verbatim} emojiSize={emojiSize} />;\n }\n\n // plain_text converts `:name:` shortcodes to emoji by default; `emoji: false` opts out.\n const emoji = (text as PlainTextElement).emoji ?? true;\n if (!emoji) return <span className=\"sbk-plain-text\">{text.text}</span>;\n\n const nodes = parsePlainTextEmoji(text.text);\n return (\n <span className=\"sbk-plain-text\">\n {nodes.map((node, i) => (\n <Fragment key={i}>\n {node.type === \"emoji\" ? (\n <Emoji name={node.name} skinTone={node.skinTone} size={emojiSize} />\n ) : (\n node.value\n )}\n </Fragment>\n ))}\n </span>\n );\n}\n","import type { ConfirmationDialog } from \"@slack/types\";\nimport { createPortal } from \"react-dom\";\nimport { useBlockKit } from \"../context\";\nimport { Text } from \"../Text\";\n\nexport interface ConfirmDialogProps {\n confirm: ConfirmationDialog;\n onConfirm: () => void;\n onDeny: () => void;\n}\n\n/** Slack's confirmation dialog: blocks the triggering action until the user picks confirm/deny. */\nexport function ConfirmDialog({ confirm, onConfirm, onDeny }: ConfirmDialogProps) {\n const { theme } = useBlockKit();\n const confirmStyle = confirm.style ?? \"primary\";\n const node = (\n <div className=\"sbk-confirm__overlay\" role=\"presentation\" data-theme={theme} onClick={onDeny}>\n <div\n className=\"sbk-confirm\"\n role=\"alertdialog\"\n aria-modal=\"true\"\n aria-label={confirm.title?.text}\n // Stop the overlay's onClick (dismiss) from firing for clicks inside the dialog.\n onClick={(event) => event.stopPropagation()}\n >\n {confirm.title && <h2 className=\"sbk-confirm__title\">{confirm.title.text}</h2>}\n <div className=\"sbk-confirm__text\">\n <Text text={confirm.text} />\n </div>\n <div className=\"sbk-confirm__actions\">\n <button\n type=\"button\"\n className=\"sbk-confirm__button sbk-confirm__button--deny\"\n onClick={onDeny}\n >\n {confirm.deny?.text ?? \"Cancel\"}\n </button>\n <button\n type=\"button\"\n className={`sbk-confirm__button sbk-confirm__button--${confirmStyle}`}\n onClick={onConfirm}\n >\n {confirm.confirm?.text ?? \"Confirm\"}\n </button>\n </div>\n </div>\n </div>\n );\n // Portal to <body> so the dialog stacks above the message surface; falls back to inline\n // rendering when `document` isn't available (e.g. non-DOM test renderers).\n return typeof document !== \"undefined\" ? createPortal(node, document.body) : node;\n}\n","import type { ConfirmationDialog } from \"@slack/types\";\nimport { useCallback, useState } from \"react\";\nimport { ConfirmDialog } from \"./ConfirmDialog\";\n\n/**\n * Wires up a confirm-before-acting flow for an element's `confirm` object. `ask()` resolves\n * `true` immediately when there is no `confirm` object; otherwise it opens the dialog and\n * resolves once the user picks confirm or deny. Render the returned `dialog` next to the\n * element so it can appear when open.\n */\nexport function useConfirm(confirm: ConfirmationDialog | undefined) {\n const [resolver, setResolver] = useState<((ok: boolean) => void) | null>(null);\n\n const ask = useCallback(() => {\n if (!confirm) return Promise.resolve(true);\n return new Promise<boolean>((resolve) => setResolver(() => resolve));\n }, [confirm]);\n\n const dialog =\n resolver && confirm ? (\n <ConfirmDialog\n confirm={confirm}\n onConfirm={() => {\n resolver(true);\n setResolver(null);\n }}\n onDeny={() => {\n resolver(false);\n setResolver(null);\n }}\n />\n ) : null;\n\n return { ask, dialog };\n}\n","import type { Button as ButtonElement } from \"@slack/types\";\nimport { useConfirm } from \"../confirm/useConfirm\";\nimport { useBlockKit } from \"../context\";\nimport type { ElementProps } from \"../types\";\n\nexport function Button({ element, blockId }: ElementProps<ButtonElement>) {\n const { dispatch } = useBlockKit();\n const { ask, dialog } = useConfirm(element.confirm);\n const className = [\"sbk-button\", element.style && `sbk-button--${element.style}`]\n .filter(Boolean)\n .join(\" \");\n\n const handleClick = async () => {\n if (!(await ask())) return;\n dispatch({\n type: \"button\",\n action_id: element.action_id ?? \"\",\n block_id: blockId,\n text: { type: \"plain_text\", text: element.text.text, emoji: element.text.emoji ?? true },\n ...(element.value !== undefined ? { value: element.value } : {}),\n ...(element.url !== undefined ? { url: element.url } : {}),\n ...(element.style !== undefined ? { style: element.style } : {}),\n });\n if (element.url) window.open(element.url, \"_blank\", \"noopener,noreferrer\");\n };\n\n return (\n <>\n <button\n type=\"button\"\n className={className}\n onClick={handleClick}\n aria-label={element.accessibility_label}\n >\n <span className=\"sbk-button__label\">{element.text.text}</span>\n </button>\n {dialog}\n </>\n );\n}\n","import { useEffect, useRef } from \"react\";\nimport { useBlockKit } from \"../context\";\n\n/**\n * Slack's `focus_on_load`: the element takes focus when its modal or Home tab opens. Slack ignores\n * it in messages and allows it on only one element per view.\n *\n * Pass the element's own ref when it already has one; otherwise attach the returned ref. The return\n * type is `useRef`'s own, which differs between @types/react 18 and 19, so it fits a `ref` prop in\n * both.\n */\nexport function useFocusOnLoad<T extends HTMLElement>(\n element: { focus_on_load?: boolean },\n existing?: { readonly current: T | null },\n) {\n const { surface } = useBlockKit();\n const own = useRef<T>(null);\n const ref = existing ?? own;\n const focus = element.focus_on_load === true && surface !== \"message\";\n useEffect(() => {\n if (focus) ref.current?.focus();\n // Only when the surface loads, like Slack.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n return ref as typeof own;\n}\n","import type { Checkboxes as CheckboxesElement, Option } from \"@slack/types\";\nimport { useEffect, useState } from \"react\";\nimport { useConfirm } from \"../confirm/useConfirm\";\nimport { useBlockKit } from \"../context\";\nimport { Text } from \"../Text\";\nimport type { ElementProps } from \"../types\";\nimport { useFocusOnLoad } from \"./useFocusOnLoad\";\n\n/** Two options are \"the same\" option when their values match, as Slack compares them. */\nfunction sameOption(a: Option, b: Option) {\n return a.value === b.value;\n}\n\nexport function Checkboxes({ element, blockId }: ElementProps<CheckboxesElement>) {\n const { setValue, dispatch } = useBlockKit();\n const { ask, dialog } = useConfirm(element.confirm);\n const [selected, setSelected] = useState<Option[]>(element.initial_options ?? []);\n const actionId = element.action_id ?? \"\";\n const focusRef = useFocusOnLoad<HTMLInputElement>(element);\n\n useEffect(() => {\n setValue(blockId, actionId, { type: \"checkboxes\", selected_options: selected });\n // Only on mount: report the initial value, exactly like Slack does when the surface loads.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const toggle = async (option: Option) => {\n const isSelected = selected.some((o) => sameOption(o, option));\n if (!isSelected && !(await ask())) return;\n const next = isSelected\n ? selected.filter((o) => !sameOption(o, option))\n : [...selected, option];\n setSelected(next);\n setValue(blockId, actionId, { type: \"checkboxes\", selected_options: next });\n dispatch({\n type: \"checkboxes\",\n action_id: actionId,\n block_id: blockId,\n selected_options: next,\n });\n };\n\n return (\n <div className=\"sbk-checkboxes\" role=\"group\">\n {element.options.map((option, i) => {\n const checked = selected.some((o) => sameOption(o, option));\n return (\n <label className=\"sbk-checkboxes__option\" key={option.value ?? i}>\n <input\n ref={i === 0 ? focusRef : undefined}\n type=\"checkbox\"\n className=\"sbk-checkboxes__input\"\n checked={checked}\n onChange={() => toggle(option)}\n />\n <span className=\"sbk-checkboxes__body\">\n <span className=\"sbk-checkboxes__text\">\n <Text text={option.text} />\n </span>\n {option.description && (\n <span className=\"sbk-checkboxes__description\">\n <Text text={option.description} />\n </span>\n )}\n </span>\n </label>\n );\n })}\n {dialog}\n </div>\n );\n}\n","import { useState } from \"react\";\n\nexport interface CalendarProps {\n /** `YYYY-MM-DD`, or undefined for no selection. */\n value?: string;\n onSelect: (date: string) => void;\n /** When given (and a date is selected), a \"Clear selection\" footer is shown, as in Slack. */\n onClear?: () => void;\n}\n\nfunction pad(n: number) {\n return String(n).padStart(2, \"0\");\n}\n\nfunction toISO(y: number, m: number, d: number) {\n return `${y}-${pad(m + 1)}-${pad(d)}`;\n}\n\nfunction todayISO() {\n const now = new Date();\n return toISO(now.getFullYear(), now.getMonth(), now.getDate());\n}\n\nfunction Caret({ direction }: { direction: \"left\" | \"right\" }) {\n return (\n <svg viewBox=\"0 0 20 20\" width=\"20\" height=\"20\" aria-hidden=\"true\">\n <path\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n d={\n direction === \"left\"\n ? \"M12.28 5.22a.75.75 0 0 1 0 1.06L8.56 10l3.72 3.72a.75.75 0 1 1-1.06 1.06l-4.25-4.25a.75.75 0 0 1 0-1.06l4.25-4.25a.75.75 0 0 1 1.06 0\"\n : \"M7.72 14.78a.75.75 0 0 1 0-1.06L11.44 10 7.72 6.28a.75.75 0 0 1 1.06-1.06l4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.75.75 0 0 1-1.06 0\"\n }\n clipRule=\"evenodd\"\n />\n </svg>\n );\n}\n\n/** A month grid matching Slack's `c-date_picker_calendar`: a bordered 7-column grid of 44×42\n * day cells, a ring around today, and solid blue for the selected day. */\nexport function Calendar({ value, onSelect, onClear }: CalendarProps) {\n const initial = value ? new Date(`${value}T00:00:00Z`) : new Date();\n const [year, setYear] = useState(initial.getUTCFullYear());\n const [month, setMonth] = useState(initial.getUTCMonth());\n\n const first = new Date(Date.UTC(year, month, 1));\n const startWeekday = first.getUTCDay();\n const daysInMonth = new Date(Date.UTC(year, month + 1, 0)).getUTCDate();\n const cells: (number | null)[] = [\n ...Array(startWeekday).fill(null),\n ...Array.from({ length: daysInMonth }, (_, i) => i + 1),\n ];\n const today = todayISO();\n\n function go(delta: number) {\n const d = new Date(Date.UTC(year, month + delta, 1));\n setYear(d.getUTCFullYear());\n setMonth(d.getUTCMonth());\n }\n\n const monthLabel = first.toLocaleDateString(\"en-US\", {\n month: \"long\",\n year: \"numeric\",\n timeZone: \"UTC\",\n });\n\n return (\n <div className=\"sbk-calendar\">\n <div className=\"sbk-calendar__header\">\n <button\n type=\"button\"\n className=\"sbk-calendar__nav\"\n onClick={() => go(-1)}\n aria-label=\"Previous month\"\n >\n <Caret direction=\"left\" />\n </button>\n <span className=\"sbk-calendar__label\">{monthLabel}</span>\n <button\n type=\"button\"\n className=\"sbk-calendar__nav\"\n onClick={() => go(1)}\n aria-label=\"Next month\"\n >\n <Caret direction=\"right\" />\n </button>\n </div>\n <div className=\"sbk-calendar__weekdays\">\n {[\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"].map((w) => (\n <span key={w}>{w}</span>\n ))}\n </div>\n <div className=\"sbk-calendar__grid\">\n {cells.map((day, i) => {\n if (day === null)\n return <span key={i} className=\"sbk-calendar__cell sbk-calendar__cell--empty\" />;\n const iso = toISO(year, month, day);\n const classes = [\"sbk-calendar__cell\"];\n if (iso === value) classes.push(\"sbk-calendar__cell--selected\");\n if (iso === today) classes.push(\"sbk-calendar__cell--today\");\n return (\n <button\n type=\"button\"\n key={iso}\n className={classes.join(\" \")}\n aria-pressed={iso === value}\n aria-current={iso === today ? \"date\" : undefined}\n onClick={() => onSelect(iso)}\n >\n {day}\n </button>\n );\n })}\n </div>\n {onClear && value && (\n <div className=\"sbk-calendar__footer\">\n <button type=\"button\" className=\"sbk-calendar__clear\" onClick={onClear}>\n Clear selection\n </button>\n </div>\n )}\n </div>\n );\n}\n","/** \"1st\", \"2nd\", \"3rd\", \"11th\"… as Slack writes the day in a long date (\"January 1st, 2026\"). */\nexport function ordinal(day: number): string {\n if (day % 10 === 1 && day !== 11) return `${day}st`;\n if (day % 10 === 2 && day !== 12) return `${day}nd`;\n if (day % 10 === 3 && day !== 13) return `${day}rd`;\n return `${day}th`;\n}\n\n/** Slack names time zones by their Windows display name (minus the UTC offset), not the IANA id. */\nconst TIME_ZONE_LABELS: Record<string, string> = {\n \"Europe/Amsterdam\": \"Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna\",\n \"Europe/Berlin\": \"Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna\",\n \"Europe/Zurich\": \"Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna\",\n \"Europe/Rome\": \"Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna\",\n \"Europe/Stockholm\": \"Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna\",\n \"Europe/Vienna\": \"Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna\",\n \"Europe/Brussels\": \"Brussels, Copenhagen, Madrid, Paris\",\n \"Europe/Copenhagen\": \"Brussels, Copenhagen, Madrid, Paris\",\n \"Europe/Madrid\": \"Brussels, Copenhagen, Madrid, Paris\",\n \"Europe/Paris\": \"Brussels, Copenhagen, Madrid, Paris\",\n \"Europe/Belgrade\": \"Belgrade, Bratislava, Budapest, Ljubljana, Prague\",\n \"Europe/Budapest\": \"Belgrade, Bratislava, Budapest, Ljubljana, Prague\",\n \"Europe/Prague\": \"Belgrade, Bratislava, Budapest, Ljubljana, Prague\",\n \"Europe/Warsaw\": \"Sarajevo, Skopje, Warsaw, Zagreb\",\n \"Europe/Dublin\": \"Dublin, Edinburgh, Lisbon, London\",\n \"Europe/Lisbon\": \"Dublin, Edinburgh, Lisbon, London\",\n \"Europe/London\": \"Dublin, Edinburgh, Lisbon, London\",\n \"Europe/Athens\": \"Athens, Bucharest\",\n \"Europe/Bucharest\": \"Athens, Bucharest\",\n \"Europe/Helsinki\": \"Helsinki, Kyiv, Riga, Sofia, Tallinn, Vilnius\",\n \"Europe/Kyiv\": \"Helsinki, Kyiv, Riga, Sofia, Tallinn, Vilnius\",\n \"Europe/Istanbul\": \"Istanbul\",\n \"Europe/Moscow\": \"Moscow, St. Petersburg\",\n \"America/New_York\": \"Eastern Time (US and Canada)\",\n \"America/Chicago\": \"Central Time (US and Canada)\",\n \"America/Denver\": \"Mountain Time (US and Canada)\",\n \"America/Phoenix\": \"Arizona\",\n \"America/Los_Angeles\": \"Pacific Time (US and Canada)\",\n \"America/Anchorage\": \"Alaska\",\n \"Pacific/Honolulu\": \"Hawaii\",\n \"America/Halifax\": \"Atlantic Time (Canada)\",\n \"America/Sao_Paulo\": \"Brasilia\",\n \"Asia/Dubai\": \"Abu Dhabi, Muscat\",\n \"Asia/Kolkata\": \"Chennai, Kolkata, Mumbai, New Delhi\",\n \"Asia/Shanghai\": \"Beijing, Chongqing, Hong Kong, Urumqi\",\n \"Asia/Hong_Kong\": \"Beijing, Chongqing, Hong Kong, Urumqi\",\n \"Asia/Singapore\": \"Kuala Lumpur, Singapore\",\n \"Asia/Tokyo\": \"Osaka, Sapporo, Tokyo\",\n \"Australia/Sydney\": \"Canberra, Melbourne, Sydney\",\n \"Australia/Melbourne\": \"Canberra, Melbourne, Sydney\",\n \"Pacific/Auckland\": \"Auckland, Wellington\",\n};\n\n/** The label Slack shows under a datetimepicker; unknown zones fall back to their IANA id. */\nexport function timeZoneLabel(timeZone: string): string {\n return TIME_ZONE_LABELS[timeZone] ?? timeZone;\n}\n\n/** A timestamp's wall-clock date (\"2026-01-01\") and time (\"11:00\") in `timeZone`. */\nexport function wallClock(ts: number, timeZone: string): { date: string; time: string } {\n const parts = new Intl.DateTimeFormat(\"en-US\", {\n timeZone,\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n hourCycle: \"h23\",\n }).formatToParts(new Date(ts * 1000));\n const get = (type: Intl.DateTimeFormatPartTypes) =>\n parts.find((p) => p.type === type)?.value ?? \"00\";\n return {\n date: `${get(\"year\")}-${get(\"month\")}-${get(\"day\")}`,\n time: `${get(\"hour\")}:${get(\"minute\")}`,\n };\n}\n\n/** The timestamp of a wall-clock date and time in `timeZone`. Around a daylight saving change it\n * resolves like JavaScript's `Date`: a time the clocks skip moves forward by the gap, and a time\n * they repeat takes its first occurrence. */\nexport function fromWallClock(date: string, time: string, timeZone: string): number {\n const asUtc = Date.parse(`${date}T${time}:00Z`) / 1000;\n const offsetAt = (ts: number) => {\n const wall = wallClock(ts, timeZone);\n return Date.parse(`${wall.date}T${wall.time}:00Z`) / 1000 - ts;\n };\n // A zone has at most two offsets within a day of any instant: the one before a change and the\n // one after it.\n const before = asUtc - offsetAt(asUtc - 86400);\n const after = asUtc - offsetAt(asUtc + 86400);\n const matches = [before, after].filter((ts) => {\n const wall = wallClock(ts, timeZone);\n return wall.date === date && wall.time === time;\n });\n return matches.length > 0 ? Math.min(...matches) : before;\n}\n","import { createContext, useContext } from \"react\";\n\n/** True while rendering the element of an `input` block, where Slack lays some elements out differently. */\nexport const InputBlockContext = createContext(false);\n\nexport function useInInputBlock(): boolean {\n return useContext(InputBlockContext);\n}\n\n/** The id of the error shown under an `input` block's element, while it has one. */\nexport const InputErrorContext = createContext<string | undefined>(undefined);\n\n/**\n * Props for the element's focusable control: an `input` block with an error marks it invalid,\n * which also gives it Slack's red focus ring, and describes it with the error text.\n */\nexport function useInvalidProps(): { \"aria-invalid\"?: true; \"aria-describedby\"?: string } {\n const errorId = useContext(InputErrorContext);\n return errorId ? { \"aria-invalid\": true, \"aria-describedby\": errorId } : {};\n}\n","import { type ReactNode, type RefObject, useEffect, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { useBlockKit } from \"../context\";\nimport { useClientLayoutEffect } from \"../useClientLayoutEffect\";\n\n/** Space between the anchor and the popover, as in Slack's menus. */\nconst DEFAULT_GAP = 4;\n\nexport interface PopoverProps {\n /** The element the popover opens from; it's placed below it, or above when there's no room. */\n anchorRef: RefObject<HTMLElement | null>;\n /** Called on a press outside both the anchor and the popover. */\n onDismiss: () => void;\n /** Space between the anchor and the popover; Slack's table sort menu sits flush below its header. */\n gap?: number;\n children: ReactNode;\n}\n\n/**\n * The layer a menu or calendar opens in. Slack mounts its popovers at the top of the page, so a\n * message list, a modal body or a carousel never clips them; this portals to `<body>` the same way\n * and keeps the popover pinned to its anchor as the page scrolls or resizes, or its content does.\n * The layer is as wide as the anchor, so a child sized `width: 100%` matches the control it opened\n * from.\n */\nexport function Popover({ anchorRef, onDismiss, gap = DEFAULT_GAP, children }: PopoverProps) {\n const { theme } = useBlockKit();\n const layerRef = useRef<HTMLDivElement>(null);\n const [position, setPosition] = useState<{ top: number; left: number; width: number } | null>(\n null,\n );\n // The latest onDismiss, for the document listener below without re-adding it on every render.\n const dismiss = useRef(onDismiss);\n useClientLayoutEffect(() => {\n dismiss.current = onDismiss;\n });\n\n useClientLayoutEffect(() => {\n function place() {\n const anchor = anchorRef.current;\n const layer = layerRef.current;\n if (!anchor || !layer) return;\n const a = anchor.getBoundingClientRect();\n const height = (layer.firstElementChild as HTMLElement | null)?.offsetHeight ?? 0;\n const below = a.bottom + gap;\n const above = a.top - gap - height;\n const fitsBelow = below + height <= window.innerHeight;\n const fitsAbove = above >= 0;\n let top = !fitsBelow && fitsAbove ? above : below;\n // Taller than the room on either side: keep it on screen rather than past the window's edge.\n if (!fitsBelow && !fitsAbove) {\n top = Math.max(gap, Math.min(below, window.innerHeight - height - gap));\n }\n setPosition({ top, left: a.left, width: a.width });\n }\n place();\n window.addEventListener(\"scroll\", place, true);\n window.addEventListener(\"resize\", place);\n // Its content can change size while open (a select filtering its options), which moves a popover\n // placed above its anchor.\n const content = layerRef.current?.firstElementChild;\n const resize = typeof ResizeObserver === \"undefined\" ? null : new ResizeObserver(place);\n if (content) resize?.observe(content);\n return () => {\n window.removeEventListener(\"scroll\", place, true);\n window.removeEventListener(\"resize\", place);\n resize?.disconnect();\n };\n }, [anchorRef, gap]);\n\n useEffect(() => {\n function onDocDown(e: MouseEvent) {\n const target = e.target as Node;\n if (anchorRef.current?.contains(target) || layerRef.current?.contains(target)) return;\n dismiss.current();\n }\n document.addEventListener(\"mousedown\", onDocDown);\n return () => document.removeEventListener(\"mousedown\", onDocDown);\n }, [anchorRef]);\n\n if (typeof document === \"undefined\") return null;\n return createPortal(\n <div\n ref={layerRef}\n className=\"sbk-root sbk-popover\"\n data-theme={theme}\n style={position ?? { top: 0, left: 0, visibility: \"hidden\" }}\n >\n {children}\n </div>,\n document.body,\n );\n}\n","import type { Datepicker } from \"@slack/types\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { useConfirm } from \"../confirm/useConfirm\";\nimport { useBlockKit } from \"../context\";\nimport { CalendarIcon, ChevronDownIcon } from \"../icons\";\nimport type { ElementProps } from \"../types\";\nimport { Calendar } from \"./calendar/Calendar\";\nimport { ordinal } from \"./dateFormat\";\nimport { useInInputBlock, useInvalidProps } from \"./inputBlockContext\";\nimport { useFocusOnLoad } from \"./useFocusOnLoad\";\nimport { Popover } from \"./Popover\";\n\n/**\n * Formats `YYYY-MM-DD` the way Slack's closed datepicker control shows it: \"04/28/1990\" in an\n * actions block or section accessory, and \"April 28th, 1990\" in an `input` block.\n */\nfunction formatDate(date: string, long: boolean): string {\n const [y = 0, m = 1, d = 1] = date.split(\"-\").map(Number);\n if (long) {\n const month = new Date(Date.UTC(y, m - 1, 1)).toLocaleString(\"en-US\", {\n month: \"long\",\n timeZone: \"UTC\",\n });\n return `${month} ${ordinal(d)}, ${y}`;\n }\n return `${String(m).padStart(2, \"0\")}/${String(d).padStart(2, \"0\")}/${y}`;\n}\n\nexport function DatePicker({ element, blockId }: ElementProps<Datepicker>) {\n const { setValue, dispatch } = useBlockKit();\n const inInputBlock = useInInputBlock();\n const { ask, dialog } = useConfirm(element.confirm);\n const [date, setDate] = useState<string | undefined>(element.initial_date);\n const [open, setOpen] = useState(false);\n const rootRef = useRef<HTMLDivElement>(null);\n const inputRef = useFocusOnLoad<HTMLInputElement>(element);\n const invalid = useInvalidProps();\n // Focus given by `focus_on_load` shouldn't pop the calendar open; a user's focus does.\n const loadFocus = useRef(element.focus_on_load === true);\n const actionId = element.action_id ?? \"\";\n\n useEffect(() => {\n if (date) setValue(blockId, actionId, { type: \"datepicker\", selected_date: date });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n async function pick(next: string) {\n if (!(await ask())) return;\n setDate(next);\n setOpen(false);\n setValue(blockId, actionId, { type: \"datepicker\", selected_date: next });\n dispatch({ type: \"datepicker\", action_id: actionId, block_id: blockId, selected_date: next });\n }\n\n async function clear() {\n if (!(await ask())) return;\n setDate(undefined);\n setOpen(false);\n setValue(blockId, actionId, { type: \"datepicker\", selected_date: null });\n dispatch({ type: \"datepicker\", action_id: actionId, block_id: blockId, selected_date: null });\n }\n\n return (\n <div className=\"sbk-datepicker\" ref={rootRef}>\n <div className=\"sbk-datepicker__input_wrap\">\n <CalendarIcon className=\"sbk-datepicker__icon\" />\n <input\n className=\"sbk-datepicker__input\"\n readOnly\n value={date ? formatDate(date, inInputBlock) : \"\"}\n placeholder={element.placeholder?.text ?? \"Select a date\"}\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n {...invalid}\n ref={inputRef}\n onFocus={() => {\n if (loadFocus.current) loadFocus.current = false;\n else setOpen(true);\n }}\n onClick={() => setOpen(true)}\n onKeyDown={(e) => {\n if (e.key === \"Escape\") setOpen(false);\n }}\n />\n <ChevronDownIcon className=\"sbk-datepicker__chevron\" />\n </div>\n {open && (\n <Popover anchorRef={rootRef} onDismiss={() => setOpen(false)}>\n <div className=\"sbk-datepicker__popup\">\n <Calendar value={date} onSelect={pick} onClear={clear} />\n </div>\n </Popover>\n )}\n {dialog}\n </div>\n );\n}\n","import type { DateTimepicker } from \"@slack/types\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { useConfirm } from \"../confirm/useConfirm\";\nimport { useBlockKit } from \"../context\";\nimport { CalendarIcon, ChevronDownIcon, ClockIcon } from \"../icons\";\nimport type { ElementProps } from \"../types\";\nimport { Calendar } from \"./calendar/Calendar\";\nimport { fromWallClock, ordinal, timeZoneLabel, wallClock } from \"./dateFormat\";\nimport { useFocusOnLoad } from \"./useFocusOnLoad\";\nimport { Popover } from \"./Popover\";\n\n/** Slack's Builder splits a datetimepicker's closed control into a date box (\"January 1st,\n * 2026\") and a separate time box (\"11:00 AM\"), rather than one combined string. */\nfunction formatDate(ts: number, timeZone: string): string {\n const d = new Date(ts * 1000);\n const parts = new Intl.DateTimeFormat(\"en-US\", {\n month: \"long\",\n day: \"numeric\",\n year: \"numeric\",\n timeZone,\n }).formatToParts(d);\n const month = parts.find((p) => p.type === \"month\")?.value ?? \"\";\n const day = Number(parts.find((p) => p.type === \"day\")?.value ?? \"1\");\n const year = parts.find((p) => p.type === \"year\")?.value ?? \"\";\n return `${month} ${ordinal(day)}, ${year}`;\n}\n\nfunction formatTime(ts: number, timeZone: string): string {\n return new Date(ts * 1000).toLocaleString(\"en-US\", {\n hour: \"numeric\",\n minute: \"2-digit\",\n timeZone,\n });\n}\n\nexport function DateTimePicker({ element, blockId }: ElementProps<DateTimepicker>) {\n const { setValue, dispatch, timeZone } = useBlockKit();\n const { ask, dialog } = useConfirm(element.confirm);\n const [value, setValueState] = useState<number | undefined>(element.initial_date_time);\n const [open, setOpen] = useState(false);\n const zone = timeZone ?? \"UTC\";\n const initial =\n element.initial_date_time !== undefined\n ? wallClock(element.initial_date_time, zone)\n : undefined;\n const [draftDate, setDraftDate] = useState<string | undefined>(initial?.date);\n const [draftTime, setDraftTime] = useState<string>(initial?.time ?? \"12:00\");\n const rootRef = useRef<HTMLDivElement>(null);\n const focusRef = useFocusOnLoad<HTMLButtonElement>(element);\n const actionId = element.action_id ?? \"\";\n\n useEffect(() => {\n if (value !== undefined) {\n setValue(blockId, actionId, {\n type: \"datetimepicker\",\n selected_date_time: value,\n });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n async function apply() {\n if (!draftDate) return;\n if (!(await ask())) return;\n const ts = fromWallClock(draftDate, draftTime, zone);\n setValueState(ts);\n setOpen(false);\n setValue(blockId, actionId, {\n type: \"datetimepicker\",\n selected_date_time: ts,\n });\n dispatch({\n type: \"datetimepicker\",\n action_id: actionId,\n block_id: blockId,\n selected_date_time: ts,\n });\n }\n\n return (\n <div className=\"sbk-datetimepicker\" ref={rootRef}>\n <div className=\"sbk-datetimepicker__row\">\n <div className=\"sbk-datetimepicker__column\">\n <button\n ref={focusRef}\n type=\"button\"\n className=\"sbk-datetimepicker__control sbk-datetimepicker__control--date\"\n onClick={() => setOpen((o) => !o)}\n >\n <CalendarIcon className=\"sbk-datetimepicker__icon\" />\n <span\n className={\n value !== undefined\n ? \"sbk-datetimepicker__value\"\n : \"sbk-datetimepicker__placeholder\"\n }\n >\n {value !== undefined ? formatDate(value, zone) : \"Select a date\"}\n </span>\n <ChevronDownIcon className=\"sbk-datetimepicker__chevron\" />\n </button>\n </div>\n <div className=\"sbk-datetimepicker__column\">\n <button\n type=\"button\"\n className=\"sbk-datetimepicker__control sbk-datetimepicker__control--time\"\n onClick={() => setOpen((o) => !o)}\n >\n <ClockIcon className=\"sbk-datetimepicker__icon\" />\n <span\n className={\n value !== undefined\n ? \"sbk-datetimepicker__value\"\n : \"sbk-datetimepicker__placeholder\"\n }\n >\n {value !== undefined ? formatTime(value, zone) : \"Select a time\"}\n </span>\n <ChevronDownIcon className=\"sbk-datetimepicker__chevron\" />\n </button>\n <p className=\"sbk-datetimepicker__timezone\">Time zone: {timeZoneLabel(zone)}</p>\n </div>\n </div>\n {open && (\n <Popover anchorRef={rootRef} onDismiss={() => setOpen(false)}>\n <div className=\"sbk-datetimepicker__popup\">\n <Calendar value={draftDate} onSelect={setDraftDate} />\n <div className=\"sbk-datetimepicker__time-row\">\n <input\n type=\"time\"\n className=\"sbk-datetimepicker__time-input\"\n value={draftTime}\n onChange={(e) => setDraftTime(e.target.value)}\n />\n <button\n type=\"button\"\n className=\"sbk-datetimepicker__apply\"\n onClick={apply}\n disabled={!draftDate}\n >\n Apply\n </button>\n </div>\n </div>\n </Popover>\n )}\n {dialog}\n </div>\n );\n}\n","import type { FeedbackButtons as FeedbackButtonsElement } from \"@slack/types\";\nimport { useState } from \"react\";\nimport { useBlockKit } from \"../context\";\nimport { ThumbsDownIcon, ThumbsUpIcon } from \"../icons\";\nimport { Tooltip } from \"../Tooltip\";\nimport type { ElementProps } from \"../types\";\n\n/** Positive/negative feedback buttons, as seen on AI agent messages. Only one of the two can be\n * picked, matching Slack's own toggle behavior. */\nexport function FeedbackButtons({ element, blockId }: ElementProps<FeedbackButtonsElement>) {\n const { setValue, dispatch } = useBlockKit();\n const [picked, setPicked] = useState<\"positive\" | \"negative\" | undefined>();\n const actionId = element.action_id ?? \"\";\n\n function choose(kind: \"positive\" | \"negative\") {\n const next = picked === kind ? undefined : kind;\n setPicked(next);\n const button = kind === \"positive\" ? element.positive_button : element.negative_button;\n setValue(\n blockId,\n actionId,\n next ? { type: \"feedback_buttons\", value: button.value } : undefined,\n );\n dispatch({\n type: \"feedback_buttons\",\n action_id: actionId,\n block_id: blockId,\n value: button.value,\n text: { type: \"plain_text\", text: button.text.text },\n });\n }\n\n return (\n <div className=\"sbk-feedback-buttons\">\n <Tooltip label={element.positive_button.text.text}>\n <button\n type=\"button\"\n className={`sbk-icon-button${picked === \"positive\" ? \" sbk-icon-button--active\" : \"\"}`}\n onClick={() => choose(\"positive\")}\n aria-label={\n element.positive_button.accessibility_label ?? element.positive_button.text.text\n }\n aria-pressed={picked === \"positive\"}\n >\n <ThumbsUpIcon />\n </button>\n </Tooltip>\n <Tooltip label={element.negative_button.text.text}>\n <button\n type=\"button\"\n className={`sbk-icon-button${picked === \"negative\" ? \" sbk-icon-button--active\" : \"\"}`}\n onClick={() => choose(\"negative\")}\n aria-label={\n element.negative_button.accessibility_label ?? element.negative_button.text.text\n }\n aria-pressed={picked === \"negative\"}\n >\n <ThumbsDownIcon />\n </button>\n </Tooltip>\n </div>\n );\n}\n","import type { FileInput as FileInputElement } from \"@slack/types\";\nimport { useId, useState } from \"react\";\nimport { useBlockKit } from \"../context\";\nimport { FileUploadIcon } from \"../icons\";\nimport type { ElementProps } from \"../types\";\n\ninterface PickedFile {\n id: string;\n name: string;\n filetype: string;\n size: number;\n}\n\n/** UI-only: there is no upload backend here, so picking a file just records its metadata in the\n * shape Slack's `files:read`-scoped apps receive, without actually transferring bytes anywhere. */\nexport function FileInput({ element, blockId }: ElementProps<FileInputElement>) {\n const { setValue, dispatch } = useBlockKit();\n const [files, setFiles] = useState<PickedFile[]>([]);\n const inputId = useId();\n const actionId = element.action_id ?? \"\";\n const maxFiles = element.max_files ?? 10;\n\n function onChange(fileList: FileList | null) {\n if (!fileList) return;\n const picked: PickedFile[] = Array.from(fileList)\n .slice(0, maxFiles)\n .map((f, i) => ({\n id: `F${Date.now()}${i}`,\n name: f.name,\n filetype: f.name.split(\".\").pop() ?? \"\",\n size: f.size,\n }));\n setFiles(picked);\n setValue(blockId, actionId, { type: \"file_input\", files: picked });\n dispatch({ type: \"file_input\", action_id: actionId, block_id: blockId, files: picked });\n }\n\n return (\n <div className=\"sbk-file-input\">\n <label className=\"sbk-file-input__button\" htmlFor={inputId}>\n <FileUploadIcon />\n {/* Slack keeps the singular label even when `max_files` allows several. */}\n <span>Upload File</span>\n </label>\n <input\n id={inputId}\n type=\"file\"\n className=\"sbk-file-input__native\"\n multiple={maxFiles > 1}\n accept={element.filetypes?.map((t) => `.${t}`).join(\",\")}\n onChange={(e) => onChange(e.target.files)}\n />\n {files.length > 0 && (\n <ul className=\"sbk-file-input__list\">\n {files.map((f) => (\n <li key={f.id} className=\"sbk-file-input__item\">\n {f.name}\n </li>\n ))}\n </ul>\n )}\n </div>\n );\n}\n","import type { IconButton as IconButtonElement } from \"@slack/types\";\nimport { useConfirm } from \"../confirm/useConfirm\";\nimport { useBlockKit } from \"../context\";\nimport {\n CalendarIcon,\n ChevronDownIcon,\n ClockIcon,\n ExternalLinkIcon,\n KebabIcon,\n TrashIcon,\n WorkflowIcon,\n} from \"../icons\";\nimport { Tooltip } from \"../Tooltip\";\nimport type { ElementProps } from \"../types\";\n\n/** Slack's icon names we can approximate with our inline set; unknown icons fall back to a\n * generic glyph rather than rendering nothing. */\nconst ICONS: Record<string, typeof TrashIcon> = {\n trash: TrashIcon,\n delete: TrashIcon,\n calendar: CalendarIcon,\n clock: ClockIcon,\n time: ClockIcon,\n \"external-link\": ExternalLinkIcon,\n link: ExternalLinkIcon,\n workflow: WorkflowIcon,\n more: KebabIcon,\n \"chevron-down\": ChevronDownIcon,\n};\n\nexport function IconButton({ element, blockId }: ElementProps<IconButtonElement>) {\n const { dispatch } = useBlockKit();\n const { ask, dialog } = useConfirm(element.confirm);\n const Icon = ICONS[element.icon] ?? KebabIcon;\n\n async function onClick() {\n if (!(await ask())) return;\n dispatch({\n type: \"icon_button\",\n action_id: element.action_id ?? \"\",\n block_id: blockId,\n ...(element.value !== undefined ? { value: element.value } : {}),\n });\n }\n\n return (\n <>\n <Tooltip label={element.text.text}>\n <button\n type=\"button\"\n className=\"sbk-icon-button\"\n onClick={onClick}\n aria-label={element.accessibility_label ?? element.text.text}\n >\n <Icon />\n </button>\n </Tooltip>\n {dialog}\n </>\n );\n}\n","import type { ImageElement as ImageElementType } from \"@slack/types\";\nimport type { ElementProps } from \"../types\";\n\nexport function ImageElement({ element }: ElementProps<ImageElementType>) {\n return (\n <img\n className=\"sbk-image-element\"\n src={\"image_url\" in element ? element.image_url : undefined}\n alt={element.alt_text}\n />\n );\n}\n","import { type KeyboardEvent, type RefObject, useEffect, useState } from \"react\";\n\n/**\n * Slack's menus and option lists keep one \"active\" row that follows both the pointer and the\n * arrow keys (`c-menu_item--highlighted` / `c-select_options_list__option--active`), so hover and\n * keyboard highlight share one style. Returns the active index plus handlers for the list.\n */\nexport function useMenuNavigation({\n open,\n count,\n initialIndex = -1,\n onChoose,\n onClose,\n onOpen,\n listRef,\n}: {\n open: boolean;\n count: number;\n initialIndex?: number;\n onChoose: (index: number) => void;\n onClose: () => void;\n /** Called when an arrow key is pressed on the closed trigger. */\n onOpen?: () => void;\n /** The scrolling list; the active row is kept in view as the keyboard moves it. */\n listRef?: RefObject<HTMLElement | null>;\n}) {\n const [active, setActive] = useState(-1);\n\n useEffect(() => {\n setActive(open ? initialIndex : -1);\n // Only reset when the menu opens or closes.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open]);\n\n useEffect(() => {\n if (active >= count) setActive(count - 1);\n }, [active, count]);\n\n useEffect(() => {\n const row = listRef?.current?.querySelector<HTMLElement>(\"[data-active]\");\n row?.scrollIntoView?.({ block: \"nearest\" });\n }, [active, listRef]);\n\n function onKeyDown(e: KeyboardEvent) {\n if (!open) {\n if (e.key === \"ArrowDown\" || e.key === \"ArrowUp\") {\n e.preventDefault();\n onOpen?.();\n }\n return;\n }\n switch (e.key) {\n case \"ArrowDown\":\n e.preventDefault();\n setActive((i) => (count === 0 ? -1 : (i + 1) % count));\n break;\n case \"ArrowUp\":\n e.preventDefault();\n setActive((i) => (count === 0 ? -1 : i <= 0 ? count - 1 : i - 1));\n break;\n case \"Home\":\n e.preventDefault();\n setActive(count > 0 ? 0 : -1);\n break;\n case \"End\":\n e.preventDefault();\n setActive(count - 1);\n break;\n case \"Enter\":\n if (active >= 0 && active < count) {\n e.preventDefault();\n onChoose(active);\n }\n break;\n case \"Escape\":\n e.preventDefault();\n onClose();\n break;\n }\n }\n\n /** Props for the row at `index`: pointer movement moves the highlight, like Slack's lists. */\n function itemProps(index: number) {\n return {\n onMouseEnter: () => setActive(index),\n onMouseMove: () => {\n if (active !== index) setActive(index);\n },\n \"data-active\": active === index || undefined,\n };\n }\n\n return { active, setActive, onKeyDown, itemProps };\n}\n","import type { Overflow as OverflowElement, PlainTextOption } from \"@slack/types\";\nimport { useRef, useState } from \"react\";\nimport { useConfirm } from \"../confirm/useConfirm\";\nimport { useBlockKit } from \"../context\";\nimport { KebabIcon } from \"../icons\";\nimport type { ElementProps } from \"../types\";\nimport { useMenuNavigation } from \"./useMenuNavigation\";\nimport { Popover } from \"./Popover\";\n\nexport function Overflow({ element, blockId }: ElementProps<OverflowElement>) {\n const { dispatch } = useBlockKit();\n const { ask, dialog } = useConfirm(element.confirm);\n const [open, setOpen] = useState(false);\n const rootRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const listRef = useRef<HTMLDivElement>(null);\n const actionId = element.action_id ?? \"\";\n\n async function choose(option: PlainTextOption) {\n if (!(await ask())) return;\n setOpen(false);\n dispatch({\n type: \"overflow\",\n action_id: actionId,\n block_id: blockId,\n selected_option: option,\n });\n if (option.url) window.open(option.url, \"_blank\", \"noopener,noreferrer\");\n }\n\n const nav = useMenuNavigation({\n open,\n count: element.options.length,\n onChoose: (i) => {\n const option = element.options[i];\n if (option) choose(option);\n },\n onClose: () => {\n setOpen(false);\n triggerRef.current?.focus();\n },\n onOpen: () => setOpen(true),\n listRef,\n });\n\n return (\n <div className=\"sbk-overflow\" ref={rootRef} onKeyDown={nav.onKeyDown}>\n <button\n ref={triggerRef}\n type=\"button\"\n className=\"sbk-overflow__button\"\n onClick={() => setOpen((o) => !o)}\n aria-haspopup=\"menu\"\n aria-expanded={open}\n aria-label=\"More options\"\n >\n <KebabIcon />\n </button>\n {open && (\n <Popover anchorRef={rootRef} onDismiss={() => setOpen(false)}>\n <div className=\"sbk-overflow__menu\" role=\"menu\" ref={listRef}>\n {element.options.map((option, i) => (\n <div\n key={option.value ?? i}\n role=\"menuitem\"\n className=\"sbk-overflow__option\"\n onClick={() => choose(option)}\n {...nav.itemProps(i)}\n >\n {option.text.text}\n </div>\n ))}\n </div>\n </Popover>\n )}\n {dialog}\n </div>\n );\n}\n","import type { Option, RadioButtons as RadioButtonsElement } from \"@slack/types\";\nimport { useEffect, useState } from \"react\";\nimport { useConfirm } from \"../confirm/useConfirm\";\nimport { useBlockKit } from \"../context\";\nimport { Text } from \"../Text\";\nimport type { ElementProps } from \"../types\";\nimport { useFocusOnLoad } from \"./useFocusOnLoad\";\n\nexport function RadioButtons({ element, blockId }: ElementProps<RadioButtonsElement>) {\n const { setValue, dispatch } = useBlockKit();\n const { ask, dialog } = useConfirm(element.confirm);\n const [selected, setSelected] = useState<Option | undefined>(element.initial_option);\n const actionId = element.action_id ?? \"\";\n const focusRef = useFocusOnLoad<HTMLInputElement>(element);\n\n useEffect(() => {\n if (selected) setValue(blockId, actionId, { type: \"radio_buttons\", selected_option: selected });\n // Only on mount: report the initial value, exactly like Slack does when the surface loads.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const select = async (option: Option) => {\n if (option.value === selected?.value) return;\n if (!(await ask())) return;\n setSelected(option);\n setValue(blockId, actionId, { type: \"radio_buttons\", selected_option: option });\n dispatch({\n type: \"radio_buttons\",\n action_id: actionId,\n block_id: blockId,\n selected_option: option,\n });\n };\n\n return (\n <div className=\"sbk-radio-buttons\" role=\"radiogroup\">\n {element.options.map((option, i) => (\n <label className=\"sbk-radio-buttons__option\" key={option.value ?? i}>\n <input\n ref={i === 0 ? focusRef : undefined}\n type=\"radio\"\n className=\"sbk-radio-buttons__input\"\n name={`${blockId}-${actionId}`}\n checked={option.value === selected?.value}\n onChange={() => select(option)}\n />\n <span className=\"sbk-radio-buttons__body\">\n <span className=\"sbk-radio-buttons__text\">\n <Text text={option.text} />\n </span>\n {option.description && (\n <span className=\"sbk-radio-buttons__description\">\n <Text text={option.description} />\n </span>\n )}\n </span>\n </label>\n ))}\n {dialog}\n </div>\n );\n}\n","import { Fragment } from \"react\";\n\n/** Slack's formatting toolbar glyphs (20×20), grouped as the separators split them. */\nconst FORMATTING_GROUPS: { label: string; evenOdd: boolean; d: string }[][] = [\n [\n {\n label: \"Bold\",\n evenOdd: true,\n d: \"M4 2.75A.75.75 0 0 1 4.75 2h6.343a3.91 3.91 0 0 1 3.88 3.449A2 2 0 0 1 15 5.84l.001.067a3.9 3.9 0 0 1-1.551 3.118A4.627 4.627 0 0 1 11.875 18H4.75a.75.75 0 0 1-.75-.75V9.5a.8.8 0 0 1 .032-.218A.8.8 0 0 1 4 9.065zm2.5 5.565h3.593a2.157 2.157 0 1 0 0-4.315H6.5zm4.25 1.935H6.5v5.5h4.25a2.75 2.75 0 1 0 0-5.5\",\n },\n {\n label: \"Italic\",\n evenOdd: true,\n d: \"M7 2.75A.75.75 0 0 1 7.75 2h7.5a.75.75 0 0 1 0 1.5H12.3l-2.6 13h2.55a.75.75 0 0 1 0 1.5h-7.5a.75.75 0 0 1 0-1.5H7.7l2.6-13H7.75A.75.75 0 0 1 7 2.75\",\n },\n {\n label: \"Underline\",\n evenOdd: false,\n d: \"M17.25 17.12a.75.75 0 0 1 0 1.5H2.75a.75.75 0 0 1 0-1.5zM14.5 1.63a.75.75 0 0 1 .75.75v8a5.25 5.25 0 1 1-10.5 0v-8a.75.75 0 0 1 1.5 0v8a3.75 3.75 0 0 0 7.5 0v-8a.75.75 0 0 1 .75-.75\",\n },\n {\n label: \"Strikethrough\",\n evenOdd: true,\n d: \"M11.721 3.84c-.91-.334-2.028-.36-3.035-.114-1.51.407-2.379 1.861-2.164 3.15C6.718 8.051 7.939 9.5 11.5 9.5l.027.001h5.723a.75.75 0 0 1 0 1.5H2.75a.75.75 0 0 1 0-1.5h3.66c-.76-.649-1.216-1.468-1.368-2.377-.347-2.084 1.033-4.253 3.265-4.848l.007-.002.007-.002c1.252-.307 2.68-.292 3.915.16 1.252.457 2.337 1.381 2.738 2.874a.75.75 0 0 1-1.448.39c-.25-.925-.91-1.528-1.805-1.856m2.968 9.114a.75.75 0 1 0-1.378.59c.273.64.186 1.205-.13 1.674-.333.492-.958.925-1.82 1.137-.989.243-1.991.165-3.029-.124-.93-.26-1.613-.935-1.858-1.845a.75.75 0 0 0-1.448.39c.388 1.441 1.483 2.503 2.903 2.9 1.213.338 2.486.456 3.79.135 1.14-.28 2.12-.889 2.704-1.753.6-.888.743-1.992.266-3.104\",\n },\n ],\n [\n {\n label: \"Link\",\n evenOdd: true,\n d: \"M12.306 3.756a2.75 2.75 0 0 1 3.889 0l.05.05a2.75 2.75 0 0 1 0 3.889l-3.18 3.18a2.75 2.75 0 0 1-3.98-.095l-.03-.034a.75.75 0 0 0-1.11 1.009l.03.034a4.25 4.25 0 0 0 6.15.146l3.18-3.18a4.25 4.25 0 0 0 0-6.01l-.05-.05a4.25 4.25 0 0 0-6.01 0L9.47 4.47a.75.75 0 1 0 1.06 1.06zm-4.611 12.49a2.75 2.75 0 0 1-3.89 0l-.05-.051a2.75 2.75 0 0 1 0-3.89l3.18-3.179a2.75 2.75 0 0 1 3.98.095l.03.034a.75.75 0 1 0 1.11-1.01l-.03-.033a4.25 4.25 0 0 0-6.15-.146l-3.18 3.18a4.25 4.25 0 0 0 0 6.01l.05.05a4.25 4.25 0 0 0 6.01 0l1.775-1.775a.75.75 0 0 0-1.06-1.06z\",\n },\n {\n label: \"Ordered list\",\n evenOdd: true,\n d: \"M3.792 2.094A.5.5 0 0 1 4 2.5V6h1a.5.5 0 1 1 0 1H2a.5.5 0 1 1 0-1h1V3.194l-.842.28a.5.5 0 0 1-.316-.948l1.5-.5a.5.5 0 0 1 .45.068M7.75 3.5a.75.75 0 0 0 0 1.5h10a.75.75 0 0 0 0-1.5zM7 10.75a.75.75 0 0 1 .75-.75h10a.75.75 0 0 1 0 1.5h-10a.75.75 0 0 1-.75-.75m0 6.5a.75.75 0 0 1 .75-.75h10a.75.75 0 0 1 0 1.5h-10a.75.75 0 0 1-.75-.75m-4.293-3.36a1 1 0 0 1 .793-.39c.49 0 .75.38.75.75 0 .064-.033.194-.173.409a5 5 0 0 1-.594.711c-.256.267-.552.548-.87.848l-.088.084a42 42 0 0 0-.879.845A.5.5 0 0 0 2 18h3a.5.5 0 0 0 0-1H3.242l.058-.055c.316-.298.629-.595.904-.882a6 6 0 0 0 .711-.859c.18-.277.335-.604.335-.954 0-.787-.582-1.75-1.75-1.75a2 2 0 0 0-1.81 1.147.5.5 0 1 0 .905.427 1 1 0 0 1 .112-.184\",\n },\n {\n label: \"Bulleted list\",\n evenOdd: true,\n d: \"M4 3a1 1 0 1 1-2 0 1 1 0 0 1 2 0m3 0a.75.75 0 0 1 .75-.75h10a.75.75 0 0 1 0 1.5h-10A.75.75 0 0 1 7 3m.75 6.25a.75.75 0 0 0 0 1.5h10a.75.75 0 0 0 0-1.5zm0 7a.75.75 0 0 0 0 1.5h10a.75.75 0 0 0 0-1.5zM3 11a1 1 0 1 0 0-2 1 1 0 0 0 0 2m0 7a1 1 0 1 0 0-2 1 1 0 0 0 0 2\",\n },\n ],\n [\n {\n label: \"Blockquote\",\n evenOdd: true,\n d: \"M3.5 2.75a.75.75 0 0 0-1.5 0v14.5a.75.75 0 0 0 1.5 0zM6.75 3a.75.75 0 0 0 0 1.5h8.5a.75.75 0 0 0 0-1.5zM6 10.25a.75.75 0 0 1 .75-.75h10.5a.75.75 0 0 1 0 1.5H6.75a.75.75 0 0 1-.75-.75m.75 5.25a.75.75 0 0 0 0 1.5h7.5a.75.75 0 0 0 0-1.5z\",\n },\n {\n label: \"Code\",\n evenOdd: true,\n d: \"M12.058 3.212c.396.12.62.54.5.936L8.87 16.29a.75.75 0 1 1-1.435-.436l3.686-12.143a.75.75 0 0 1 .936-.5M5.472 6.24a.75.75 0 0 1 .005 1.06l-2.67 2.693 2.67 2.691a.75.75 0 1 1-1.065 1.057l-3.194-3.22a.75.75 0 0 1 0-1.056l3.194-3.22a.75.75 0 0 1 1.06-.005m9.044 1.06a.75.75 0 1 1 1.065-1.056l3.194 3.221a.75.75 0 0 1 0 1.057l-3.194 3.219a.75.75 0 0 1-1.065-1.057l2.67-2.69z\",\n },\n {\n label: \"Code block\",\n evenOdd: true,\n d: \"M9.212 2.737a.75.75 0 1 0-1.424-.474l-2.5 7.5a.75.75 0 0 0 1.424.474zm6.038.265a.75.75 0 0 0 0 1.5h2a.25.25 0 0 1 .25.25v11.5a.25.25 0 0 1-.25.25h-13a.25.25 0 0 1-.25-.25v-3.5a.75.75 0 0 0-1.5 0v3.5c0 .966.784 1.75 1.75 1.75h13a1.75 1.75 0 0 0 1.75-1.75v-11.5a1.75 1.75 0 0 0-1.75-1.75zm-3.69.5a.75.75 0 1 0-1.12.996l1.556 1.754-1.556 1.75a.75.75 0 1 0 1.12.997l2-2.249a.75.75 0 0 0 0-.996zM3.999 9.061a.75.75 0 0 1-1.058-.062l-2-2.249a.75.75 0 0 1 0-.996l2-2.252a.75.75 0 1 1 1.12.996L2.504 6.252l1.557 1.75a.75.75 0 0 1-.062 1.059\",\n },\n ],\n];\n\n/** The (inert) formatting toolbar Slack shows above a modal's rich-text editor; its buttons stay\n * dimmed because they only act on a selection in Slack's own editor. */\nexport function RichTextToolbar() {\n return (\n <div className=\"sbk-rich-text-input__toolbar\" aria-hidden=\"true\">\n {FORMATTING_GROUPS.map((group, i) => (\n <Fragment key={group[0]?.label}>\n {i > 0 && <span className=\"sbk-rich-text-input__separator\" />}\n {group.map((icon) => (\n <span key={icon.label} className=\"sbk-rich-text-input__tool\" title={icon.label}>\n <svg viewBox=\"0 0 20 20\" width=\"18\" height=\"18\">\n <path\n fill=\"currentColor\"\n fillRule={icon.evenOdd ? \"evenodd\" : undefined}\n clipRule={icon.evenOdd ? \"evenodd\" : undefined}\n d={icon.d}\n />\n </svg>\n </span>\n ))}\n </Fragment>\n ))}\n </div>\n );\n}\n","import type { RichTextBlock, RichTextInput as RichTextInputElement } from \"@slack/types\";\nimport { useEffect, useRef } from \"react\";\nimport { useBlockKit } from \"../context\";\nimport type { ElementProps } from \"../types\";\nimport { RichTextToolbar } from \"./RichTextToolbar\";\nimport { useFocusOnLoad } from \"./useFocusOnLoad\";\nimport { useInvalidProps } from \"./inputBlockContext\";\n\n/** Wraps plain text into the `rich_text` block shape Slack uses for this element's value. A\n * full WYSIWYG (bold/lists/links) is out of scope; the brief allows a contentEditable here, under\n * Slack's (inert) formatting toolbar. */\nfunction toRichText(text: string): RichTextBlock {\n return {\n type: \"rich_text\",\n elements: [\n {\n type: \"rich_text_section\",\n elements: text ? [{ type: \"text\", text }] : [],\n },\n ],\n };\n}\n\nfunction fromRichText(value: RichTextBlock | undefined): string {\n if (!value) return \"\";\n return (value.elements as unknown[])\n .flatMap((section) => {\n const node = section as { elements?: unknown[] };\n return node.elements ?? [];\n })\n .map((el: unknown) => {\n const node = el as { text?: unknown };\n return typeof node.text === \"string\" ? node.text : \"\";\n })\n .join(\"\");\n}\n\nexport function RichTextInput({ element, blockId }: ElementProps<RichTextInputElement>) {\n const { setValue, dispatch } = useBlockKit();\n const ref = useRef<HTMLDivElement>(null);\n useFocusOnLoad(element, ref);\n const invalid = useInvalidProps();\n const actionId = element.action_id ?? \"\";\n const initialText = fromRichText(element.initial_value);\n\n useEffect(() => {\n if (element.initial_value) {\n setValue(blockId, actionId, {\n type: \"rich_text_input\",\n rich_text_value: element.initial_value,\n });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n function onInput() {\n const text = ref.current?.innerText ?? \"\";\n const richText = toRichText(text);\n setValue(blockId, actionId, { type: \"rich_text_input\", rich_text_value: richText });\n dispatch({\n type: \"rich_text_input\",\n action_id: actionId,\n block_id: blockId,\n rich_text_value: richText,\n });\n }\n\n return (\n <div className=\"sbk-rich-text-input\">\n <RichTextToolbar />\n <div\n ref={ref}\n className=\"sbk-rich-text-input__editor\"\n contentEditable\n suppressContentEditableWarning\n role=\"textbox\"\n aria-multiline=\"true\"\n {...invalid}\n aria-label={element.placeholder?.text ?? actionId}\n data-placeholder={element.placeholder?.text}\n onInput={onInput}\n style={{\n minHeight: element.min_lines ? `${element.min_lines * 22}px` : undefined,\n maxHeight: element.max_lines ? `${element.max_lines * 22}px` : undefined,\n }}\n >\n {initialText}\n </div>\n </div>\n );\n}\n","import type { OptionGroup, PlainTextOption } from \"@slack/types\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { useConfirm } from \"../confirm/useConfirm\";\nimport { useBlockKit } from \"../context\";\nimport { ChannelHashIcon, ChevronDownIcon, CloseIcon, LockIcon, SearchIcon } from \"../icons\";\nimport type { OptionsResponse } from \"../payloads\";\nimport { Text } from \"../Text\";\nimport type { ElementProps, Json } from \"../types\";\nimport { useFocusOnLoad } from \"./useFocusOnLoad\";\nimport { useInvalidProps } from \"./inputBlockContext\";\nimport { useMenuNavigation } from \"./useMenuNavigation\";\nimport { Popover } from \"./Popover\";\n\n/**\n * One component renders every `*_select` element. The 5 data sources (static, external, users,\n * conversations, channels) and their `multi_` variants differ only in: what the closed control\n * shows, what the open menu offers, and the field names Slack uses in `state.values` /\n * `block_actions` (`selected_option(s)`, `selected_user(s)`, `selected_conversation(s)`,\n * `selected_channel(s)`).\n */\n\ntype Source = \"static\" | \"external\" | \"users\" | \"conversations\" | \"channels\";\n\nexport interface SelectElement extends Json {\n type: string;\n action_id?: string;\n placeholder?: { type: \"plain_text\"; text: string };\n options?: PlainTextOption[];\n option_groups?: OptionGroup[];\n min_query_length?: number;\n max_selected_items?: number;\n filter?: {\n include?: string[];\n exclude_external_shared_channels?: boolean;\n exclude_bot_users?: boolean;\n };\n default_to_current_conversation?: boolean;\n confirm?: import(\"@slack/types\").ConfirmationDialog;\n initial_option?: PlainTextOption;\n initial_options?: PlainTextOption[];\n initial_user?: string;\n initial_users?: string[];\n initial_conversation?: string;\n initial_conversations?: string[];\n initial_channel?: string;\n initial_channels?: string[];\n}\n\nfunction parseType(type: string): { source: Source; multi: boolean } {\n const multi = type.startsWith(\"multi_\");\n const base = multi ? type.slice(\"multi_\".length) : type;\n const source = base.replace(\"_select\", \"\") as Source;\n return { source, multi };\n}\n\n/** A selection, normalized to `{id, label}` regardless of data source. For static/external\n * selects `id` is the option's `value` and the full option is kept for the payload. */\ninterface Item {\n id: string;\n label: string;\n option?: PlainTextOption;\n}\n\nfunction optionToItem(option: PlainTextOption): Item {\n return { id: option.value ?? option.text.text, label: option.text.text, option };\n}\n\n/** Slack's field name for one selected item, by source and singular/plural. */\nfunction fieldName(source: Source, plural: boolean): string {\n const names: Record<Source, [string, string]> = {\n static: [\"selected_option\", \"selected_options\"],\n external: [\"selected_option\", \"selected_options\"],\n users: [\"selected_user\", \"selected_users\"],\n conversations: [\"selected_conversation\", \"selected_conversations\"],\n channels: [\"selected_channel\", \"selected_channels\"],\n };\n return names[source][plural ? 1 : 0];\n}\n\nfunction itemToPayload(source: Source, item: Item): unknown {\n return source === \"static\" || source === \"external\" ? item.option : item.id;\n}\n\nfunction initialItems(element: SelectElement, source: Source, multi: boolean): Item[] {\n if (source === \"static\" || source === \"external\") {\n const options = multi\n ? element.initial_options\n : element.initial_option && [element.initial_option];\n return (options ?? []).map(optionToItem);\n }\n const key = { users: \"user\", conversations: \"conversation\", channels: \"channel\" }[source];\n const single = element[`initial_${key}` as keyof SelectElement] as string | undefined;\n const many = element[`initial_${key}s` as keyof SelectElement] as string[] | undefined;\n const ids = multi ? (many ?? []) : single ? [single] : [];\n // Leave `label` empty for directory-backed sources (users/conversations/channels) — there's no\n // label to show until it's resolved. Every read site falls back to `resolveLabel(id)` when\n // `label` is falsy; storing `id` here instead would short-circuit that fallback and always show\n // the raw id even when a resolver is configured.\n return ids.map((id) => ({ id, label: \"\" }));\n}\n\nfunction allOptions(element: SelectElement): PlainTextOption[] {\n if (element.options) return element.options;\n return (element.option_groups ?? []).flatMap((g) => g.options as PlainTextOption[]);\n}\n\ntype OptionGroupView = { label?: string; options: PlainTextOption[] };\n\nfunction responseGroups(response: OptionsResponse | undefined): OptionGroupView[] {\n if (!response) return [];\n if (\"option_groups\" in response) {\n return response.option_groups.map((group) => ({\n label: group.label.text,\n options: group.options as PlainTextOption[],\n }));\n }\n return [{ options: response.options as PlainTextOption[] }];\n}\n\n/** Slack's default `min_query_length` for an `external_select`. */\nconst DEFAULT_MIN_QUERY_LENGTH = 3;\n/** How long typing must pause before an `external_select` asks the app for options. */\nconst SUGGESTION_DEBOUNCE_MS = 250;\n\nexport function Select({ element, blockId }: ElementProps<SelectElement>) {\n const { setValue, dispatch, resolvers, surface, loadOptions } = useBlockKit();\n // Slack's Builder uses a taller \"medium\" control (36px) for a modal/Home tab surface than the\n // message-surface preview's 28px \"small\" control (independent of the multi-select bump below).\n const sizeClass = surface === \"message\" ? \"\" : \" sbk-select--medium\";\n const { ask, dialog } = useConfirm(element.confirm);\n const { source, multi } = parseType(element.type);\n const actionId = element.action_id ?? \"\";\n\n const [items, setItems] = useState<Item[]>(() => initialItems(element, source, multi));\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState(\"\");\n const rootRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n useFocusOnLoad(element as { focus_on_load?: boolean }, triggerRef);\n const invalid = useInvalidProps();\n const listRef = useRef<HTMLDivElement>(null);\n\n // An `external_select` with an `onOptions` handler asks the app for options (a\n // `block_suggestion` request) once the query reaches `min_query_length`, as Slack does.\n const remote = source === \"external\" && loadOptions !== undefined;\n const minQueryLength = element.min_query_length ?? DEFAULT_MIN_QUERY_LENGTH;\n const [remoteGroups, setRemoteGroups] = useState<OptionGroupView[] | undefined>();\n const [loading, setLoading] = useState(false);\n\n useEffect(() => {\n if (!open || !remote || !loadOptions) return;\n if (query.length < minQueryLength) {\n setRemoteGroups(undefined);\n setLoading(false);\n return;\n }\n let cancelled = false;\n setLoading(true);\n const timer = setTimeout(\n async () => {\n try {\n const response = await loadOptions(actionId, blockId, query);\n if (!cancelled) setRemoteGroups(responseGroups(response));\n } catch {\n if (!cancelled) setRemoteGroups([]);\n } finally {\n if (!cancelled) setLoading(false);\n }\n },\n query ? SUGGESTION_DEBOUNCE_MS : 0,\n );\n return () => {\n cancelled = true;\n clearTimeout(timer);\n };\n }, [open, remote, loadOptions, query, minQueryLength, actionId, blockId]);\n\n const resolveLabel = (id: string): string => {\n const resolver =\n source === \"users\"\n ? resolvers.user\n : source === \"channels\" || source === \"conversations\"\n ? resolvers.channel\n : undefined;\n return resolver?.(id) ?? id;\n };\n\n /** Slack's own Builder preview can't resolve a fabricated id against the real directory, and\n * never shows the raw id: a channel becomes a \"Private channel\" pill, a user stays a loading\n * skeleton, and a conversation stays blank. */\n const isUnresolved = ({ id, label }: { id: string; label?: string }) =>\n !label &&\n (source === \"users\" || source === \"channels\" || source === \"conversations\") &&\n resolveLabel(id) === id;\n\n const privateChannel = (className: string) => (\n <span className={className}>\n <ChannelHashIcon className=\"sbk-select__channel-hash\" />\n <span className=\"sbk-select__entity-text\">\n <span className=\"sbk-select__missing-channel\">\n <LockIcon />\n Private channel\n </span>\n </span>\n </span>\n );\n\n const unresolvedValue = (id: string) =>\n source === \"channels\" ? (\n privateChannel(\"sbk-select__value sbk-select__entity\")\n ) : source === \"users\" ? (\n <span className=\"sbk-select__value sbk-select__skeleton\" aria-label={id}>\n <span className=\"sbk-select__skeleton-avatar\" />\n <span className=\"sbk-select__skeleton-name\" />\n </span>\n ) : (\n <span className=\"sbk-select__value\" aria-label={id} />\n );\n\n useEffect(() => {\n if (items.length > 0) {\n setValue(blockId, actionId, buildState());\n }\n // Only on mount: report the initial value, exactly like Slack does when the surface loads.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n function buildState() {\n const field = fieldName(source, multi);\n const first = items[0];\n const value = multi\n ? items.map((i) => itemToPayload(source, i))\n : first\n ? itemToPayload(source, first)\n : undefined;\n return { type: element.type, [field]: value };\n }\n\n async function commit(next: Item[]) {\n setItems(next);\n const fields = buildStateFor(next);\n setValue(blockId, actionId, { type: element.type, ...fields });\n dispatch({ type: element.type, action_id: actionId, block_id: blockId, ...fields });\n }\n\n function buildStateFor(next: Item[]) {\n const field = fieldName(source, multi);\n const first = next[0];\n const value = multi\n ? next.map((i) => itemToPayload(source, i))\n : first\n ? itemToPayload(source, first)\n : undefined;\n return { [field]: value };\n }\n\n async function selectItem(item: Item) {\n if (!(await ask())) return;\n if (multi) {\n if (items.some((i) => i.id === item.id)) return;\n if (element.max_selected_items && items.length >= element.max_selected_items) return;\n await commit([...items, item]);\n setQuery(\"\");\n } else {\n await commit([item]);\n setOpen(false);\n setQuery(\"\");\n }\n }\n\n async function removeItem(id: string) {\n await commit(items.filter((i) => i.id !== id));\n }\n\n const filteredOptions =\n source === \"static\"\n ? allOptions(element).filter((o) => o.text.text.toLowerCase().includes(query.toLowerCase()))\n : [];\n\n // Visible static options, grouped as rendered, plus a flat list for keyboard navigation.\n const matches = (o: PlainTextOption) => o.text.text.toLowerCase().includes(query.toLowerCase());\n const visibleGroups: OptionGroupView[] = remote\n ? (remoteGroups ?? [])\n : source !== \"static\"\n ? []\n : element.option_groups\n ? element.option_groups.map((group) => ({\n label: group.label.text,\n options: (group.options as PlainTextOption[]).filter(matches),\n }))\n : [{ options: filteredOptions }];\n const flatOptions = visibleGroups.flatMap((g) => g.options);\n const isSelected = (option: PlainTextOption) =>\n items.some((i) => i.id === (option.value ?? option.text.text));\n\n const nav = useMenuNavigation({\n open,\n count: flatOptions.length,\n initialIndex: Math.max(0, flatOptions.findIndex(isSelected)),\n onChoose: (i) => {\n const option = flatOptions[i];\n if (option) selectItem(optionToItem(option));\n },\n onClose: () => {\n setOpen(false);\n triggerRef.current?.focus();\n },\n onOpen: () => setOpen(true),\n listRef,\n });\n\n const closedLabel = multi\n ? undefined\n : items[0]\n ? items[0].label || resolveLabel(items[0].id)\n : undefined;\n const placeholder = element.placeholder?.text ?? \"Select an item\";\n const showSearchOnly = source !== \"static\"; // external/users/conversations/channels have no local directory\n\n return (\n <div\n className={`sbk-select${multi ? \" sbk-select--multi\" : \"\"}${multi && items.length > 0 ? \" sbk-select--chips\" : \"\"}${sizeClass}`}\n ref={rootRef}\n onKeyDown={nav.onKeyDown}\n >\n {multi && element.max_selected_items && (\n <p className=\"sbk-select__max-info\">\n You can select up to {element.max_selected_items}{\" \"}\n {element.max_selected_items === 1 ? \"item\" : \"items\"}.\n </p>\n )}\n <button\n ref={triggerRef}\n type=\"button\"\n className=\"sbk-select__control\"\n onClick={() => setOpen((o) => !o)}\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n {...invalid}\n >\n {multi ? (\n items.length > 0 ? (\n <span className=\"sbk-select__chips\">\n {items.map((item) => (\n <span className=\"sbk-select__chip\" key={item.id}>\n {source === \"channels\" && isUnresolved(item) ? (\n privateChannel(\"sbk-select__chip-label sbk-select__chip-entity\")\n ) : (\n <span className=\"sbk-select__chip-label\">\n <span className=\"sbk-select__chip-text\">\n <span>{item.label || resolveLabel(item.id)}</span>\n </span>\n </span>\n )}\n <span\n className=\"sbk-select__chip-remove\"\n role=\"button\"\n tabIndex={0}\n aria-label={`Remove ${item.label || resolveLabel(item.id)}`}\n onClick={(e) => {\n e.stopPropagation();\n removeItem(item.id);\n }}\n // A role=\"button\" span only gets clicks from the pointer; Enter and Space\n // remove the chip too, and stop there so the select doesn't open.\n onKeyDown={(e) => {\n if (e.key !== \"Enter\" && e.key !== \" \") return;\n e.preventDefault();\n e.stopPropagation();\n removeItem(item.id);\n }}\n >\n <CloseIcon />\n </span>\n </span>\n ))}\n </span>\n ) : (\n <span className=\"sbk-select__placeholder\">{placeholder}</span>\n )\n ) : closedLabel ? (\n items[0] && isUnresolved(items[0]) ? (\n unresolvedValue(items[0].id)\n ) : (\n <span className=\"sbk-select__value\">{closedLabel}</span>\n )\n ) : (\n <span className=\"sbk-select__placeholder\">{placeholder}</span>\n )}\n <ChevronDownIcon className=\"sbk-select__chevron\" />\n </button>\n {open && (\n <Popover anchorRef={rootRef} onDismiss={() => setOpen(false)}>\n <div className=\"sbk-select__menu\" role=\"listbox\" ref={listRef}>\n {(showSearchOnly || allOptions(element).length > 8) && (\n <div className=\"sbk-select__search\">\n <SearchIcon />\n <input\n autoFocus\n className=\"sbk-select__search-input\"\n placeholder={\n source === \"static\" || source === \"external\"\n ? \"Search options\"\n : `Search ${source}`\n }\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" && query.trim() && showSearchOnly && !remote) {\n // No live directory to search against: typing an id/value and pressing\n // enter selects it directly. This is our approximation for\n // external/users/conversations/channels selects, documented in the brief.\n selectItem({ id: query.trim(), label: resolveLabel(query.trim()) });\n }\n }}\n />\n </div>\n )}\n {(() => {\n let index = 0;\n return visibleGroups.map((group, gi) => {\n const rows = group.options.map((option) => {\n const i = index++;\n return (\n <SelectOption\n key={option.value ?? i}\n option={option}\n selected={isSelected(option)}\n onSelect={() => selectItem(optionToItem(option))}\n navProps={nav.itemProps(i)}\n />\n );\n });\n return group.label === undefined ? (\n rows\n ) : (\n <div className=\"sbk-select__group\" key={gi}>\n <div className=\"sbk-select__group-label\">{group.label}</div>\n {rows}\n </div>\n );\n });\n })()}\n {remote && loading && <div className=\"sbk-select__status\">Loading…</div>}\n {remote && !loading && remoteGroups !== undefined && flatOptions.length === 0 && (\n <div className=\"sbk-select__status\">No results</div>\n )}\n {showSearchOnly && items.length > 0 && multi && (\n <div className=\"sbk-select__group-label\">Selected</div>\n )}\n {showSearchOnly &&\n multi &&\n items.map((item) => (\n <div className=\"sbk-select__option sbk-select__option--selected\" key={item.id}>\n {item.label || resolveLabel(item.id)}\n </div>\n ))}\n </div>\n </Popover>\n )}\n {dialog}\n </div>\n );\n}\n\nfunction SelectOption({\n option,\n selected,\n onSelect,\n navProps,\n}: {\n option: PlainTextOption;\n selected: boolean;\n onSelect: () => void;\n navProps?: ReturnType<ReturnType<typeof useMenuNavigation>[\"itemProps\"]>;\n}) {\n return (\n <div\n className={`sbk-select__option${selected ? \" sbk-select__option--selected\" : \"\"}`}\n role=\"option\"\n aria-selected={selected}\n onClick={onSelect}\n {...navProps}\n >\n <span className=\"sbk-select__option-text\">\n <Text text={option.text} />\n </span>\n {option.description && (\n <span className=\"sbk-select__option-description\">\n <Text text={option.description} />\n </span>\n )}\n </div>\n );\n}\n","import { useEffect, useState } from \"react\";\nimport { useBlockKit } from \"../context\";\nimport { EmailIcon, LinkGlyphIcon } from \"../icons\";\nimport type { ElementProps, Json } from \"../types\";\nimport { useFocusOnLoad } from \"./useFocusOnLoad\";\nimport { useInvalidProps } from \"./inputBlockContext\";\n\nexport interface TextInputElement extends Json {\n type: \"plain_text_input\" | \"email_text_input\" | \"url_text_input\" | \"number_input\";\n action_id?: string;\n initial_value?: string;\n placeholder?: { type: \"plain_text\"; text: string };\n multiline?: boolean;\n min_length?: number;\n max_length?: number;\n is_decimal_allowed?: boolean;\n min_value?: string;\n max_value?: string;\n dispatch_action_config?: { trigger_actions_on?: (\"on_enter_pressed\" | \"on_character_entered\")[] };\n /** Set by the owning `input` block (Slack's block-level `dispatch_action` flag); not part of\n * the Block Kit element schema, so it's read via an internal field rather than exported. */\n __dispatchAction?: boolean;\n}\n\nconst HTML_TYPE: Record<TextInputElement[\"type\"], string> = {\n plain_text_input: \"text\",\n email_text_input: \"email\",\n url_text_input: \"url\",\n number_input: \"text\",\n};\n\nexport function TextInput({ element, blockId }: ElementProps<TextInputElement>) {\n const { setValue, dispatch, surface } = useBlockKit();\n // Slack's Builder uses a taller \"medium\" control (36px, more horizontal padding) for a modal\n // or Home tab form; the message-surface preview uses a smaller 28px control.\n const sizeClass = surface === \"message\" ? \"\" : \" sbk-text-input--medium\";\n const [value, setLocalValue] = useState(element.initial_value ?? \"\");\n const invalid = useInvalidProps();\n const focusRef = useFocusOnLoad<HTMLInputElement & HTMLTextAreaElement>(\n element as { focus_on_load?: boolean },\n );\n const actionId = element.action_id ?? \"\";\n const dispatchEnabled = element.__dispatchAction === true;\n const triggers = element.dispatch_action_config?.trigger_actions_on ?? [\"on_enter_pressed\"];\n\n useEffect(() => {\n if (element.initial_value !== undefined) {\n setValue(blockId, actionId, { type: element.type, value: element.initial_value });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n function report(next: string) {\n setValue(blockId, actionId, { type: element.type, value: next });\n }\n\n function fire(next: string) {\n dispatch({ type: element.type, action_id: actionId, block_id: blockId, value: next });\n }\n\n function onChange(next: string) {\n if (element.type === \"number_input\") {\n const pattern = element.is_decimal_allowed ? /^-?\\d*\\.?\\d*$/ : /^-?\\d*$/;\n if (next !== \"\" && !pattern.test(next)) return;\n }\n setLocalValue(next);\n report(next);\n if (dispatchEnabled && triggers.includes(\"on_character_entered\")) fire(next);\n }\n\n function onKeyDown(e: React.KeyboardEvent) {\n if (\n e.key === \"Enter\" &&\n !element.multiline &&\n dispatchEnabled &&\n triggers.includes(\"on_enter_pressed\")\n ) {\n fire(value);\n }\n }\n\n // Slack's Builder preview shows this default placeholder for any text-like input that doesn't\n // specify its own, rather than leaving the field visually empty.\n const placeholder = element.placeholder?.text ?? \"Write something\";\n\n const commonProps = {\n className: `sbk-text-input${sizeClass}`,\n value,\n placeholder,\n onKeyDown,\n ref: focusRef,\n \"aria-label\": element.action_id,\n ...invalid,\n };\n\n // Slack's Builder prefixes email/url inputs with a small leading glyph (envelope / link) inside\n // the closed control, before the placeholder or value.\n const leadingIcon =\n element.type === \"email_text_input\" ? (\n <EmailIcon className=\"sbk-text-input__icon\" />\n ) : element.type === \"url_text_input\" ? (\n <LinkGlyphIcon className=\"sbk-text-input__icon\" />\n ) : null;\n\n if (element.multiline) {\n return (\n <textarea\n {...commonProps}\n className={`sbk-text-input sbk-text-input--multiline${sizeClass}`}\n onChange={(e) => onChange(e.target.value)}\n />\n );\n }\n\n const input = (\n <input\n {...commonProps}\n type={HTML_TYPE[element.type]}\n inputMode={\n element.type === \"number_input\"\n ? element.is_decimal_allowed\n ? \"decimal\"\n : \"numeric\"\n : undefined\n }\n minLength={element.min_length}\n maxLength={element.max_length}\n onChange={(e) => onChange(e.target.value)}\n />\n );\n\n if (!leadingIcon) return input;\n\n return (\n <div className=\"sbk-text-input__wrap\">\n {leadingIcon}\n {input}\n </div>\n );\n}\n","import type { Timepicker } from \"@slack/types\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { useConfirm } from \"../confirm/useConfirm\";\nimport { useBlockKit } from \"../context\";\nimport { ChevronDownIcon, ClockIcon } from \"../icons\";\nimport type { ElementProps } from \"../types\";\nimport { useFocusOnLoad } from \"./useFocusOnLoad\";\nimport { useInvalidProps } from \"./inputBlockContext\";\nimport { useMenuNavigation } from \"./useMenuNavigation\";\nimport { Popover } from \"./Popover\";\n\n/** Formats `HH:mm` the way Slack's closed timepicker shows it, e.g. \"1:37 PM\". */\nfunction formatTime(time: string): string {\n const [h = 0, m = 0] = time.split(\":\").map(Number);\n const period = h >= 12 ? \"PM\" : \"AM\";\n const hour12 = h % 12 === 0 ? 12 : h % 12;\n return `${hour12}:${String(m).padStart(2, \"0\")} ${period}`;\n}\n\n/** Every 30 minutes, as Slack's timepicker list offers. */\nfunction timeOptions(): string[] {\n const times: string[] = [];\n for (let h = 0; h < 24; h++) {\n for (const m of [0, 30])\n times.push(`${String(h).padStart(2, \"0\")}:${String(m).padStart(2, \"0\")}`);\n }\n return times;\n}\n\nexport function TimePicker({ element, blockId }: ElementProps<Timepicker>) {\n const { setValue, dispatch } = useBlockKit();\n const { ask, dialog } = useConfirm(element.confirm);\n const [time, setTime] = useState<string | undefined>(element.initial_time);\n const [open, setOpen] = useState(false);\n const rootRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n useFocusOnLoad(element, triggerRef);\n const invalid = useInvalidProps();\n const listRef = useRef<HTMLDivElement>(null);\n const actionId = element.action_id ?? \"\";\n\n useEffect(() => {\n if (time) setValue(blockId, actionId, { type: \"timepicker\", selected_time: time });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n async function pick(next: string) {\n if (!(await ask())) return;\n setTime(next);\n setOpen(false);\n setValue(blockId, actionId, { type: \"timepicker\", selected_time: next });\n dispatch({ type: \"timepicker\", action_id: actionId, block_id: blockId, selected_time: next });\n }\n\n const times = timeOptions();\n const nav = useMenuNavigation({\n open,\n count: times.length,\n initialIndex: time ? times.indexOf(time) : -1,\n onChoose: (i) => {\n const t = times[i];\n if (t) pick(t);\n },\n onClose: () => {\n setOpen(false);\n triggerRef.current?.focus();\n },\n onOpen: () => setOpen(true),\n listRef,\n });\n\n return (\n <div className=\"sbk-timepicker\" ref={rootRef} onKeyDown={nav.onKeyDown}>\n <button\n ref={triggerRef}\n type=\"button\"\n className=\"sbk-timepicker__control\"\n onClick={() => setOpen((o) => !o)}\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n {...invalid}\n >\n <ClockIcon className=\"sbk-timepicker__icon\" />\n <span className={time ? \"sbk-timepicker__value\" : \"sbk-timepicker__placeholder\"}>\n {time ? formatTime(time) : (element.placeholder?.text ?? \"Select time\")}\n </span>\n <ChevronDownIcon className=\"sbk-timepicker__chevron\" />\n </button>\n {open && (\n <Popover anchorRef={rootRef} onDismiss={() => setOpen(false)}>\n <div className=\"sbk-timepicker__menu\" role=\"listbox\" ref={listRef}>\n {times.map((t, i) => (\n <div\n key={t}\n role=\"option\"\n aria-selected={t === time}\n className={`sbk-timepicker__option${t === time ? \" sbk-timepicker__option--selected\" : \"\"}`}\n onClick={() => pick(t)}\n {...nav.itemProps(i)}\n >\n {formatTime(t)}\n </div>\n ))}\n </div>\n </Popover>\n )}\n {element.timezone && <div className=\"sbk-timepicker__hint\">Timezone: {element.timezone}</div>}\n {dialog}\n </div>\n );\n}\n","import type { WorkflowButton as WorkflowButtonElement } from \"@slack/types\";\nimport { useConfirm } from \"../confirm/useConfirm\";\nimport { useBlockKit } from \"../context\";\nimport { WorkflowIcon } from \"../icons\";\nimport type { ElementProps } from \"../types\";\n\n/** Renders like a regular button with a small lightning-bolt glyph, matching Slack's own\n * workflow_button treatment. There is no real workflow runtime here: clicking only dispatches\n * the block_actions payload with the workflow's trigger metadata, it never calls the trigger URL. */\nexport function WorkflowButton({ element, blockId }: ElementProps<WorkflowButtonElement>) {\n const { dispatch } = useBlockKit();\n const { ask, dialog } = useConfirm(element.confirm);\n const className = [\n \"sbk-button\",\n \"sbk-workflow-button\",\n element.style && `sbk-button--${element.style}`,\n ]\n .filter(Boolean)\n .join(\" \");\n\n // @slack/types omits `action_id` from WorkflowButton, but Slack's real payloads include it.\n const actionId = (element as unknown as { action_id?: string }).action_id ?? \"\";\n\n const handleClick = async () => {\n if (!(await ask())) return;\n dispatch({\n type: \"workflow_button\",\n action_id: actionId,\n block_id: blockId,\n text: { type: \"plain_text\", text: element.text.text, emoji: element.text.emoji ?? true },\n workflow: element.workflow,\n ...(element.style !== undefined ? { style: element.style } : {}),\n });\n };\n\n return (\n <>\n <button\n type=\"button\"\n className={className}\n onClick={handleClick}\n aria-label={element.accessibility_label}\n >\n <WorkflowIcon className=\"sbk-workflow-button__icon\" />\n <span className=\"sbk-button__label\">{element.text.text}</span>\n </button>\n {dialog}\n </>\n );\n}\n","import type { ComponentType } from \"react\";\nimport type { ElementProps } from \"../types\";\nimport { Button } from \"./Button\";\nimport { Checkboxes } from \"./Checkboxes\";\nimport { DatePicker } from \"./DatePicker\";\nimport { DateTimePicker } from \"./DateTimePicker\";\nimport { FeedbackButtons } from \"./FeedbackButtons\";\nimport { FileInput } from \"./FileInput\";\nimport { IconButton } from \"./IconButton\";\nimport { ImageElement } from \"./ImageElement\";\nimport { Overflow } from \"./Overflow\";\nimport { RadioButtons } from \"./RadioButtons\";\nimport { RichTextInput } from \"./RichTextInput\";\nimport { Select } from \"./Select\";\nimport { TextInput } from \"./TextInput\";\nimport { TimePicker } from \"./TimePicker\";\nimport { WorkflowButton } from \"./WorkflowButton\";\n\nexport const elementComponents: Record<string, ComponentType<ElementProps<any>>> = {\n button: Button,\n channels_select: Select,\n checkboxes: Checkboxes,\n conversations_select: Select,\n datepicker: DatePicker,\n datetimepicker: DateTimePicker,\n email_text_input: TextInput,\n external_select: Select,\n feedback_buttons: FeedbackButtons,\n file_input: FileInput,\n icon_button: IconButton,\n image: ImageElement,\n multi_channels_select: Select,\n multi_conversations_select: Select,\n multi_external_select: Select,\n multi_static_select: Select,\n multi_users_select: Select,\n number_input: TextInput,\n overflow: Overflow,\n plain_text_input: TextInput,\n radio_buttons: RadioButtons,\n rich_text_input: RichTextInput,\n static_select: Select,\n timepicker: TimePicker,\n url_text_input: TextInput,\n users_select: Select,\n workflow_button: WorkflowButton,\n};\n","import type { Json } from \"../types\";\nimport { elementComponents } from \".\";\nimport { Unsupported } from \"./Unsupported\";\n\n/** Renders any interactive or image element. Unsupported types render a visible placeholder. */\nexport function Element({ element, blockId }: { element: Json; blockId: string }) {\n const Component = elementComponents[element.type];\n if (!Component) return <Unsupported type={element.type} />;\n return <Component element={element} blockId={blockId} />;\n}\n","import type { ActionsBlock } from \"@slack/types\";\nimport { Element } from \"../elements/Element\";\nimport type { BlockProps, Json } from \"../types\";\n\n// Slack's Builder gives these element types their own full-width row in an actions block,\n// stacked vertically, instead of letting them sit side-by-side with other actions like a button\n// or select does. Confirmed via inspect.ts against catalog/actions/checkboxes and\n// catalog/actions/radio-buttons (`p-actions_block__action--full_width`). A datetimepicker's two\n// boxes stretch to fill the row too (extra/actions/more-elements).\nconst FULL_WIDTH_TYPES = new Set([\"checkboxes\", \"radio_buttons\", \"datetimepicker\"]);\n\nexport function Actions({ block, blockId }: BlockProps<ActionsBlock>) {\n return (\n <div className=\"sbk-actions\">\n {(block.elements as unknown as Json[]).map((element, i) => {\n const fullWidth = FULL_WIDTH_TYPES.has(element.type as string);\n return (\n <div\n key={(element.action_id as string | undefined) ?? i}\n className={`sbk-actions__action${fullWidth ? \" sbk-actions__action--full-width\" : \"\"}`}\n >\n <Element element={element} blockId={blockId} />\n </div>\n );\n })}\n </div>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { Text, type TextObject } from \"../Text\";\nimport type { BlockProps, Json } from \"../types\";\n\ntype AlertLevel = \"default\" | \"info\" | \"warning\" | \"error\" | \"success\";\n\nconst LEVELS = new Set<AlertLevel>([\"default\", \"info\", \"warning\", \"error\", \"success\"]);\n\n// Icons copied from the Builder's `c-alert__icon` (20×20, `currentColor`).\nconst WARNING_TRIANGLE = (\n <>\n <path d=\"M10 12.75a1 1 0 1 1 0 2 1 1 0 0 1 0-2m0-6a.75.75 0 0 1 .75.75V11a.75.75 0 0 1-1.5 0V7.5a.75.75 0 0 1 .75-.75\" />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M7.712 3.542c1.02-1.723 3.556-1.723 4.576 0l6.1 10.303c1.043 1.761-.28 3.905-2.287 3.905H3.899c-2.007 0-3.33-2.144-2.288-3.905zm3.285.765c-.44-.742-1.554-.742-1.994 0l-6.1 10.302c-.418.704.084 1.641.996 1.641h12.202c.912 0 1.414-.937.997-1.642z\"\n />\n </>\n);\n\nconst ICONS: Record<AlertLevel, ReactNode> = {\n default: (\n <path d=\"M9.52 4.8V2.9q0-.51-.26-.95a1.8 1.8 0 0 0-.69-.69A1.8 1.8 0 0 0 7.62 1q-.51 0-.95.26a2 2 0 0 0-.69.7q-.25.43-.25.94 0 .52.25.96.26.43.69.69.44.25.95.25zm2.85 4.73a1.9 1.9 0 0 1-.96-.25 2 2 0 0 1-.69-.69 1.9 1.9 0 0 1-.25-.96V2.9q0-.51.25-.95.26-.44.69-.69.44-.26.96-.26.51 0 .94.26.43.25.68.69.26.44.26.95v4.73q0 .52-.26.96a1.84 1.84 0 0 1-1.62.94M9.53 7.62q0 .52-.26.96a1.9 1.9 0 0 1-.69.69q-.43.25-.95.25H2.9q-.51 0-.95-.25a2 2 0 0 1-.7-.69A1.9 1.9 0 0 1 1 7.62q0-.51.26-.94.26-.44.69-.69.44-.26.95-.26h4.73q.52 0 .95.26.44.25.69.69.26.43.26.94m5.67 1.9h1.9q.51 0 .95-.25.44-.26.69-.69.26-.44.26-.96 0-.51-.26-.94a1.9 1.9 0 0 0-.7-.69q-.43-.26-.94-.26-.52 0-.96.26a1.9 1.9 0 0 0-.69.69q-.25.43-.25.94zM2.9 14.25a1.9 1.9 0 0 1-.95-.25 2 2 0 0 1-.7-.69Q1 12.88 1 12.37a1.86 1.86 0 0 1 .95-1.64q.44-.26.95-.26h1.9v1.9q0 .51-.26.94a1.9 1.9 0 0 1-.69.69q-.43.25-.95.25m4.72-3.78q.52 0 .95.26.44.25.69.69.26.43.26.95v4.73q0 .51-.26.95a1.8 1.8 0 0 1-.69.69q-.43.26-.95.26-.51 0-.95-.26a2 2 0 0 1-.69-.7q-.25-.43-.25-.94v-4.73q0-.52.25-.95.26-.44.69-.69.44-.26.95-.26m2.85 1.9q0-.52.25-.95.26-.44.69-.69.44-.26.96-.26h4.73q.51 0 .95.26.44.25.69.69.26.43.26.95 0 .51-.26.94a1.9 1.9 0 0 1-.69.69 1.9 1.9 0 0 1-.95.25h-4.73a1.9 1.9 0 0 1-.96-.25 2 2 0 0 1-.69-.69q-.25-.43-.25-.94m0 2.83v1.9q0 .51.25.95.26.44.69.69.44.26.96.26.51 0 .94-.26.43-.25.68-.69.26-.44.26-.95 0-.52-.26-.95a1.83 1.83 0 0 0-.68-.69q-.43-.26-.94-.26z\" />\n ),\n info: (\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M10 2.5a7.5 7.5 0 1 0 0 15 7.5 7.5 0 0 0 0-15M1 10a9 9 0 1 1 18 0 9 9 0 0 1-18 0m10-4a1 1 0 1 1-2 0 1 1 0 0 1 2 0m-.25 3.25a.75.75 0 0 0-1.5 0v5a.75.75 0 0 0 1.5 0z\"\n />\n ),\n warning: WARNING_TRIANGLE,\n error: WARNING_TRIANGLE,\n success: (\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M10 2.5a7.5 7.5 0 1 1 0 15 7.5 7.5 0 0 1 0-15M10 19a9 9 0 1 0 0-18 9 9 0 0 0 0 18m3.636-12.372a.75.75 0 0 0-1.058.087l-4.125 4.862-1.14-1.61a.75.75 0 0 0-1.225.867l1.7 2.4a.75.75 0 0 0 1.184.051l4.75-5.6a.75.75 0 0 0-.086-1.057\"\n />\n ),\n};\n\n/**\n * Slack only accepts `alert` in modals; like the other blocks it renders on any surface here, so\n * a payload previews the same wherever it's placed. An unknown `level` falls back to `default`.\n */\nexport function Alert({ block }: BlockProps) {\n const json = block as Json;\n const level: AlertLevel = LEVELS.has(json.level as AlertLevel)\n ? (json.level as AlertLevel)\n : \"default\";\n const text = json.text as TextObject | undefined;\n\n return (\n <div className={`sbk-alert sbk-alert--${level}`} role={level === \"error\" ? \"alert\" : \"status\"}>\n <svg\n className=\"sbk-alert__icon\"\n viewBox=\"0 0 20 20\"\n width=\"20\"\n height=\"20\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n {ICONS[level]}\n </svg>\n <span className=\"sbk-alert__message\">{text ? <Text text={text} /> : null}</span>\n </div>\n );\n}\n","import type { BlockProps, Json } from \"../types\";\nimport { Block } from \"./Block\";\n\n/** Callout colours; each has a token per theme (Callout.css, and Message.css for dark). */\nconst BACKGROUND_COLORS = new Set([\"green\", \"blue\", \"red\", \"yellow\", \"purple\", \"gray\"]);\n\nexport function Callout({ block }: BlockProps) {\n const json = block as Json;\n const color = typeof json.background_color === \"string\" ? json.background_color : undefined;\n const key = color === \"grey\" ? \"gray\" : color;\n const background = `var(--sbk-callout-${key && BACKGROUND_COLORS.has(key) ? key : \"gray\"}-bg)`;\n const children = (json.child_blocks as Json[] | undefined) ?? [];\n\n return (\n <div className=\"sbk-callout\" style={{ backgroundColor: background }}>\n {children.map((child, i) => (\n <Block key={(child.block_id as string | undefined) ?? i} block={child} index={i} />\n ))}\n </div>\n );\n}\n","import { Element } from \"../elements/Element\";\nimport { Text, type TextObject } from \"../Text\";\nimport { Tooltip } from \"../Tooltip\";\nimport type { BlockProps, Json } from \"../types\";\n\n/** Slack's inline icons by `slack_icon` name, their 20-unit paths as Slack ships them. */\nconst SLACK_ICONS: Record<string, string> = {\n rocket:\n \"m18.168 1.832.05.639c.257 3.278-1.016 7.195-5.445 9.976.2 1.025.257 1.866-.078 2.653-.376.881-1.2 1.57-2.327 2.443-.689.535-1.653.22-1.98-.506a11 11 0 0 0-2.229-3.197 11 11 0 0 0-3.196-2.229c-.728-.327-1.041-1.29-.507-1.98.874-1.127 1.562-1.95 2.444-2.326.786-.336 1.627-.28 2.652-.078 2.782-4.43 6.698-5.702 9.977-5.446zM16.749 3.25c-2.714-.008-5.882 1.24-8.182 5.197l-.276.475-.535-.12c-1.302-.289-1.845-.298-2.268-.118-.432.185-.865.615-1.688 1.663.848.405 2.148 1.16 3.42 2.432a12.6 12.6 0 0 1 2.433 3.42c1.048-.823 1.478-1.256 1.662-1.688.18-.423.171-.965-.118-2.267l-.12-.536.475-.276c3.957-2.3 5.206-5.468 5.197-8.182m-3.702 4.955c-.69 0-1.253-.563-1.253-1.252S12.357 5.7 13.047 5.7c.689 0 1.252.563 1.252 1.253 0 .689-.563 1.252-1.252 1.252M2.95 14.217c.597-.596 1.222-.485 1.952-.172a1 1 0 0 0-.081.071l-.809.809a.75.75 0 0 0 1.062 1.061l.808-.808a1 1 0 0 0 .071-.082c.313.73.425 1.356-.171 1.952-1.77 1.77-3.893 1.062-3.893 1.062s-.708-2.124 1.061-3.893\",\n};\n\n/** A card's `icon` (an image element) or `slack_icon` (one of Slack's inline icons, by name). */\nfunction CardIcon({ icon, slackIcon }: { icon?: Json; slackIcon?: Json }) {\n if (icon && icon.type === \"image\") {\n return (\n <img\n className=\"sbk-card__icon\"\n src={\"image_url\" in icon ? (icon.image_url as string) : undefined}\n alt={(icon.alt_text as string) ?? \"\"}\n />\n );\n }\n if (slackIcon) {\n const name = slackIcon.name as string;\n const glyph = SLACK_ICONS[name];\n if (glyph) {\n return (\n <span className=\"sbk-card__icon sbk-card__icon--slack\">\n <svg viewBox=\"0 0 20 20\" width=\"24\" height=\"24\" aria-hidden=\"true\">\n <path fill=\"currentColor\" fillRule=\"evenodd\" clipRule=\"evenodd\" d={glyph} />\n </svg>\n </span>\n );\n }\n // An icon we have no glyph for: a neutral badge stands in, named on hover.\n return (\n <Tooltip label={name}>\n <span className=\"sbk-card__icon sbk-card__icon--fallback\">\n <svg viewBox=\"0 0 20 20\" width=\"18\" height=\"18\" aria-hidden=\"true\">\n <circle cx=\"10\" cy=\"10\" r=\"9\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n </svg>\n </span>\n </Tooltip>\n );\n }\n return null;\n}\n\n/**\n * Renders one `card` block. Also used by `Carousel` for its `elements[]`, since a carousel is a\n * horizontally-scrolling row of the same card content.\n */\nexport function Card({ block, blockId }: BlockProps) {\n const json = block as Json;\n const icon = json.icon as Json | undefined;\n const slackIcon = json.slack_icon as Json | undefined;\n const title = json.title as TextObject | undefined;\n const subtitle = json.subtitle as TextObject | undefined;\n const heroImage = json.hero_image as Json | undefined;\n const body = json.body as TextObject | undefined;\n const subtext = json.subtext as TextObject | undefined;\n const actions = json.actions as Json[] | undefined;\n\n return (\n <div className=\"sbk-card\">\n <div className=\"sbk-card__box\">\n <div className=\"sbk-card__content\">\n {heroImage && (\n <img\n className=\"sbk-card__hero\"\n src={\"image_url\" in heroImage ? (heroImage.image_url as string) : undefined}\n alt={(heroImage.alt_text as string) ?? \"\"}\n />\n )}\n {(icon || slackIcon || title || subtitle) && (\n <div className=\"sbk-card__header\">\n <CardIcon icon={icon} slackIcon={slackIcon} />\n {(title || subtitle) && (\n <div className=\"sbk-card__titles\">\n {title && (\n <div className=\"sbk-card__title\">\n <Text text={title} />\n </div>\n )}\n {subtitle && (\n <div className=\"sbk-card__subtitle\">\n <Text text={subtitle} />\n </div>\n )}\n </div>\n )}\n </div>\n )}\n {body && (\n <div className=\"sbk-card__body\">\n <Text text={body} />\n </div>\n )}\n {subtext && (\n <div className=\"sbk-card__subtext\">\n <Text text={subtext} />\n </div>\n )}\n {actions && actions.length > 0 && (\n <div className=\"sbk-card__actions\">\n {/* Slack pulls danger buttons into a left-aligned group; the rest stay right-aligned\n in their original order. */}\n <div className=\"sbk-card__actions-start\">\n {actions.map(\n (action, i) =>\n action.style === \"danger\" && (\n <Element\n key={(action.action_id as string | undefined) ?? i}\n element={action}\n blockId={blockId}\n />\n ),\n )}\n </div>\n {actions.map(\n (action, i) =>\n action.style !== \"danger\" && (\n <Element\n key={(action.action_id as string | undefined) ?? i}\n element={action}\n blockId={blockId}\n />\n ),\n )}\n </div>\n )}\n </div>\n </div>\n </div>\n );\n}\n","/** Small inline icons shared by the table/chart blocks, drawn to match Slack's glyphs. */\n\nexport function SearchIcon() {\n return (\n <svg viewBox=\"0 0 20 20\" width=\"16\" height=\"16\" fill=\"none\" aria-hidden=\"true\">\n <circle cx=\"8.5\" cy=\"8.5\" r=\"6\" stroke=\"currentColor\" strokeWidth=\"1.8\" />\n <line\n x1=\"13\"\n y1=\"13\"\n x2=\"17.5\"\n y2=\"17.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n\nexport function ExpandIcon() {\n return (\n <svg viewBox=\"0 0 20 20\" width=\"16\" height=\"16\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M7 3H3v4M13 3h4v4M3 13v4h4M17 13v4h-4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nexport function KebabIcon() {\n return (\n <svg viewBox=\"0 0 4 18\" width=\"4\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\">\n <circle cx=\"2\" cy=\"2\" r=\"2\" />\n <circle cx=\"2\" cy=\"9\" r=\"2\" />\n <circle cx=\"2\" cy=\"16\" r=\"2\" />\n </svg>\n );\n}\n\n/** Slack's `caret-right` glyph, turned to point down when expanded (task card and plan toggles). */\nconst CARET_ROTATION = { right: undefined, down: \"rotate(90deg)\", left: \"rotate(180deg)\" };\n\nexport function CaretIcon({\n direction = \"right\",\n size = 13,\n}: {\n direction?: \"right\" | \"down\" | \"left\";\n size?: number;\n}) {\n const rotation = CARET_ROTATION[direction];\n return (\n <svg\n viewBox=\"0 0 20 20\"\n width={size}\n height={size}\n aria-hidden=\"true\"\n style={rotation ? { transform: rotation } : undefined}\n >\n <path\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M7.72 5.72a.75.75 0 0 1 1.06 0l3.75 3.75a.75.75 0 0 1 0 1.06l-3.75 3.75a.75.75 0 0 1-1.06-1.06L10.94 10 7.72 6.78a.75.75 0 0 1 0-1.06\"\n />\n </svg>\n );\n}\n\nexport function ChevronIcon({\n direction = \"down\",\n}: {\n direction?: \"up\" | \"down\" | \"left\" | \"right\";\n}) {\n const rotation = { up: 180, down: 0, left: 90, right: -90 }[direction];\n return (\n <svg\n viewBox=\"0 0 12 8\"\n width=\"7\"\n height=\"4\"\n fill=\"none\"\n aria-hidden=\"true\"\n style={{ transform: `rotate(${rotation}deg)` }}\n >\n <path\n d=\"M1 1.5L6 6.5L11 1.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\n/** A 16px glyph from Slack's 20x20 icon set, filled with the text colour. */\nfunction SlackGlyph({ d }: { d: string }) {\n return (\n <svg viewBox=\"0 0 20 20\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d={d} />\n </svg>\n );\n}\n\n/** Slack's `chevron-down`, shown on a sortable column header while it's hovered or focused. */\nexport function SortCaretIcon() {\n return (\n <SlackGlyph d=\"M5.72 7.47a.75.75 0 0 1 1.06 0L10 10.69l3.22-3.22a.75.75 0 1 1 1.06 1.06l-3.75 3.75a.75.75 0 0 1-1.06 0L5.72 8.53a.75.75 0 0 1 0-1.06\" />\n );\n}\n\n/** Slack's `arrow-up`, on the sort menu's Ascending item. */\nexport function ArrowUpIcon() {\n return (\n <SlackGlyph d=\"M10.543 3.232a.75.75 0 0 0-1.086 0l-5.25 5.5a.75.75 0 0 0 1.086 1.036L9.25 5.622V16.25a.75.75 0 0 0 1.5 0V5.622l3.957 4.146a.75.75 0 0 0 1.085-1.036z\" />\n );\n}\n\n/** Slack's `arrow-down`, on the sort menu's Descending item. */\nexport function ArrowDownIcon() {\n return (\n <SlackGlyph d=\"M10.75 3.75a.75.75 0 0 0-1.5 0v10.628l-3.957-4.146a.75.75 0 0 0-1.086 1.036l5.25 5.5a.75.75 0 0 0 1.085 0l5.25-5.5a.75.75 0 0 0-1.085-1.036l-3.957 4.146z\" />\n );\n}\n\n/** Slack's `check`, beside the checked item of a menu. */\nexport function MenuCheckIcon() {\n return (\n <SlackGlyph d=\"M17.234 3.677a.75.75 0 0 1 .089 1.057l-9.72 11.5a.75.75 0 0 1-1.19-.058L2.633 10.7a.75.75 0 0 1 1.234-.852l3.223 4.669 9.087-10.751a.75.75 0 0 1 1.057-.089\" />\n );\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport { CaretIcon } from \"../data/icons\";\nimport type { BlockProps, Json } from \"../types\";\nimport { Card } from \"./Card\";\n\n/** A horizontally-scrolling row of cards, with arrow buttons that page by one card width. */\nexport function Carousel({ block }: BlockProps) {\n const elements = ((block as Json).elements as Json[] | undefined) ?? [];\n const scrollerRef = useRef<HTMLDivElement>(null);\n // Slack fades an arrow out once there is nothing left to scroll towards.\n const [edges, setEdges] = useState({ start: true, end: false });\n\n const updateEdges = () => {\n const el = scrollerRef.current;\n if (!el) return;\n const start = el.scrollLeft <= 1;\n const end = el.scrollLeft + el.clientWidth >= el.scrollWidth - 1;\n setEdges((prev) => (prev.start === start && prev.end === end ? prev : { start, end }));\n };\n\n useEffect(updateEdges, [elements.length]);\n\n const scrollBy = (dx: number) => {\n scrollerRef.current?.scrollBy({ left: dx, behavior: \"smooth\" });\n };\n\n const arrowClass = (side: \"left\" | \"right\", hidden: boolean) =>\n `sbk-carousel__arrow sbk-carousel__arrow--${side}${hidden ? \" sbk-carousel__arrow--hidden\" : \"\"}`;\n\n return (\n <div className=\"sbk-carousel\">\n <div className=\"sbk-carousel__scroller\" ref={scrollerRef} onScroll={updateEdges}>\n {elements.map((card, i) => (\n <div className=\"sbk-carousel__item\" key={(card.block_id as string | undefined) ?? i}>\n <Card\n block={card}\n blockId={(card.block_id as string) ?? `carousel-card-${i}`}\n index={i}\n />\n </div>\n ))}\n </div>\n <button\n type=\"button\"\n className={arrowClass(\"left\", edges.start)}\n aria-label=\"Scroll left\"\n disabled={edges.start}\n onClick={() => scrollBy(-356)}\n >\n <CaretIcon direction=\"left\" size={20} />\n </button>\n <button\n type=\"button\"\n className={arrowClass(\"right\", edges.end)}\n aria-label=\"Scroll right\"\n disabled={edges.end}\n onClick={() => scrollBy(356)}\n >\n <CaretIcon direction=\"right\" size={20} />\n </button>\n </div>\n );\n}\n","import type { BlockProps, Json } from \"../types\";\nimport { Block } from \"./Block\";\n\n/** This library only ever renders as Slack's desktop client, matching the Builder's preview. */\nconst CLIENT = \"desktop\";\n\ninterface ConditionClause {\n type: string;\n op?: \"=\" | \"!=\";\n value?: string;\n}\n\nfunction matches(condition: ConditionClause): boolean {\n if (condition.type !== \"client\") return false;\n const isEqual = condition.value === CLIENT;\n return condition.op === \"!=\" ? !isEqual : isEqual;\n}\n\n/** Renders the first case whose conditions all match the desktop client, else `default`. */\nexport function Condition({ block }: BlockProps) {\n const json = block as Json;\n const cases =\n (json.cases as { conditions: ConditionClause[]; blocks: Json[] }[] | undefined) ?? [];\n const defaultBlocks = (json.default as Json[] | undefined) ?? [];\n\n const matched = cases.find((c) => c.conditions.every(matches));\n const blocks = matched?.blocks ?? defaultBlocks;\n\n return (\n <>\n {blocks.map((child, i) => (\n <Block key={(child.block_id as string | undefined) ?? i} block={child} index={i} />\n ))}\n </>\n );\n}\n","import { createContext, useContext } from \"react\";\n\n/** True for blocks rendered anywhere inside a `container` block's `child_blocks`. */\nexport const InContainerContext = createContext(false);\n\nexport function useInContainer(): boolean {\n return useContext(InContainerContext);\n}\n","import { useBlockKit } from \"../context\";\nimport type { BlockProps, Json } from \"../types\";\nimport { useInContainer } from \"./containerContext\";\n\n/**\n * Renders a workspace user as a contact tile. Resolving `contact_user_id` to a name/avatar needs\n * an authenticated `users.info` call; without a matching `resolvers.user`, we render the same\n * \"unknown user\" skeleton Slack's own Builder shows for an id it can't resolve either (see the\n * `catalog/callout/callout` reference, which uses a placeholder id).\n *\n * Inside a `container` (even nested in a callout there) Slack doesn't render the card at all and\n * shows its unknown-block notice instead (catalog/container/with-callout).\n */\nexport function ContactCard({ block }: BlockProps) {\n const json = block as Json;\n const userId = typeof json.contact_user_id === \"string\" ? json.contact_user_id : undefined;\n const { resolvers } = useBlockKit();\n const name = userId ? resolvers.user?.(userId) : undefined;\n const inContainer = useInContainer();\n\n if (inContainer) {\n return (\n <div className=\"sbk-block-error\">\n <small className=\"sbk-block-error__message\">This content could not be displayed.</small>\n </div>\n );\n }\n\n return (\n <div className=\"sbk-contact-card\">\n <span className=\"sbk-contact-card__avatar\" aria-hidden=\"true\" />\n <div className=\"sbk-contact-card__body\">\n {name ? (\n <span className=\"sbk-contact-card__name\">{name}</span>\n ) : (\n <span className=\"sbk-contact-card__name sbk-contact-card__name--unknown\">\n <span className=\"sbk-contact-card__skeleton\" />\n </span>\n )}\n <span className=\"sbk-contact-card__meta\">Contact</span>\n </div>\n </div>\n );\n}\n","import { type ReactNode, useRef, useState } from \"react\";\nimport { useClientLayoutEffect } from \"../useClientLayoutEffect\";\n\n/**\n * Slack's toggle-bar blocks (plan, task_card) slide open and shut: the block's height transitions\n * over 0.25s while its overflow is clipped. This does the same for the content under the toggle. It\n * keeps the content mounted until the closing transition ends, and skips the animation when the\n * stylesheet sets no transition (reduced motion, or no CSS loaded).\n */\nexport function Collapse({\n open,\n className,\n children,\n}: {\n open: boolean;\n /** Sets a block's own timing, e.g. the container's shorter, eased slide. */\n className?: string;\n children: ReactNode;\n}) {\n const ref = useRef<HTMLDivElement>(null);\n // Whether the content is mounted: it opens with `open` but only closes once the transition ends.\n const [shown, setShown] = useState(open);\n if (open && !shown) setShown(true);\n // What `open` was last time, so only a toggle animates (not the first render).\n const was = useRef(open);\n\n useClientLayoutEffect(() => {\n // Set on the node, not as a prop: React 18 doesn't know `inert` and drops a boolean value.\n ref.current?.toggleAttribute(\"inert\", !open);\n if (was.current === open) return;\n was.current = open;\n const el = ref.current;\n if (!el) return;\n if (!(parseFloat(getComputedStyle(el).transitionDuration) > 0)) {\n // No transition to wait for, and only the stylesheet can say so: unmount now.\n // eslint-disable-next-line react/set-state-in-effect\n if (!open) setShown(false);\n return;\n }\n // Start from the current height: 0 for fresh content, or wherever an interrupted transition is.\n const from = el.style.height ? el.offsetHeight : open ? 0 : el.offsetHeight;\n el.style.height = `${from}px`;\n void el.offsetHeight;\n el.style.height = open ? `${el.scrollHeight}px` : \"0px\";\n }, [open]);\n\n if (!shown) return null;\n return (\n <div\n ref={ref}\n className={className ? `sbk-collapse ${className}` : \"sbk-collapse\"}\n onTransitionEnd={(e) => {\n if (e.target !== e.currentTarget || e.propertyName !== \"height\") return;\n if (open) e.currentTarget.style.height = \"\";\n else setShown(false);\n }}\n >\n {children}\n </div>\n );\n}\n","import { useState } from \"react\";\nimport { Collapse } from \"../data/Collapse\";\nimport { Text, type TextObject } from \"../Text\";\nimport type { BlockProps, Json } from \"../types\";\nimport { Block } from \"./Block\";\nimport { InContainerContext } from \"./containerContext\";\n\nfunction ChevronDown() {\n return (\n <svg viewBox=\"0 0 15 15\" width=\"15\" height=\"15\" aria-hidden=\"true\">\n <path\n d=\"M3 5.5l4.5 4.5 4.5-4.5\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nconst WIDTHS = [\"narrow\", \"standard\", \"wide\", \"full\"];\n\n/**\n * A bordered, optionally-collapsible group of child blocks with a header (icon/title/subtitle).\n * `width` caps the card (narrow/standard/wide); `full` spans the whole message column.\n */\nexport function Container({ block }: BlockProps) {\n const json = block as Json;\n const title = json.title as TextObject | undefined;\n const subtitle = json.subtitle as TextObject | undefined;\n const icon = json.icon as Json | undefined;\n const isCollapsible = json.is_collapsible === true;\n const width = WIDTHS.includes(json.width as string) ? (json.width as string) : \"standard\";\n const hasHeaderDivider = json.has_header_divider === true;\n const children = (json.child_blocks as Json[] | undefined) ?? [];\n const [collapsed, setCollapsed] = useState(isCollapsible && json.default_collapsed === true);\n\n const hasHeader = Boolean(title || subtitle || icon || isCollapsible);\n\n const header = hasHeader && (\n <div className=\"sbk-container__titles\">\n {icon && (\n <img\n className=\"sbk-container__icon\"\n src={\"image_url\" in icon ? (icon.image_url as string) : undefined}\n alt={(icon.alt_text as string) ?? \"\"}\n />\n )}\n <div className=\"sbk-container__title-col\">\n {title && (\n <span className=\"sbk-container__title\">\n <Text text={title} />\n </span>\n )}\n {subtitle && (\n <span className=\"sbk-container__subtitle\">\n <Text text={subtitle} />\n </span>\n )}\n </div>\n {isCollapsible && (\n <span\n className={`sbk-container__chevron${collapsed ? \" sbk-container__chevron--collapsed\" : \"\"}`}\n >\n <ChevronDown />\n </span>\n )}\n </div>\n );\n\n const body = (\n <div className=\"sbk-container__body\">\n <InContainerContext.Provider value={true}>\n {children.map((child, i) => (\n <Block key={(child.block_id as string | undefined) ?? i} block={child} index={i} />\n ))}\n </InContainerContext.Provider>\n </div>\n );\n\n return (\n <div className={`sbk-container sbk-container--${width}`}>\n {isCollapsible ? (\n <button\n type=\"button\"\n className=\"sbk-container__header sbk-container__header--button\"\n aria-expanded={!collapsed}\n onClick={() => setCollapsed((v) => !v)}\n >\n {header}\n </button>\n ) : (\n hasHeader && (\n <div\n className={`sbk-container__header${hasHeaderDivider ? \" sbk-container__header--divider\" : \"\"}`}\n >\n {header}\n </div>\n )\n )}\n {isCollapsible ? (\n <Collapse open={!collapsed} className=\"sbk-container__collapse\">\n {body}\n </Collapse>\n ) : (\n body\n )}\n </div>\n );\n}\n","import type { ContextBlock } from \"@slack/types\";\nimport { Text, type TextObject } from \"../Text\";\nimport type { BlockProps } from \"../types\";\n\nexport function Context({ block }: BlockProps<ContextBlock>) {\n return (\n <div className=\"sbk-context\">\n {block.elements.map((el, i) =>\n el.type === \"image\" ? (\n <img\n key={i}\n className=\"sbk-context__image\"\n src={\"image_url\" in el ? el.image_url : undefined}\n alt={el.alt_text}\n />\n ) : (\n <span key={i} className=\"sbk-context__text\">\n <Text text={el as TextObject} emojiSize={16} />\n </span>\n ),\n )}\n </div>\n );\n}\n","import { Element } from \"../elements/Element\";\nimport type { BlockProps, Json } from \"../types\";\n\n/**\n * A trailing row of small icon-style actions (feedback thumbs-up/down, copy, retry, overflow…),\n * typically under an AI-generated message. The individual element rendering (feedback_buttons,\n * icon_button, overflow, ...) is owned by the elements layer; this just lays the row out.\n */\nexport function ContextActions({ block, blockId }: BlockProps) {\n const elements = ((block as Json).elements as Json[] | undefined) ?? [];\n return (\n <div className=\"sbk-context-actions\">\n {elements.map((element, i) => (\n <div\n key={(element.action_id as string | undefined) ?? i}\n className=\"sbk-context-actions__item\"\n >\n <Element element={element} blockId={blockId} />\n </div>\n ))}\n </div>\n );\n}\n","import type { ReactNode } from \"react\";\nimport type { Json } from \"../types\";\nimport { Link } from \"../Link\";\n\n/**\n * Minimal renderer for the `rich_text` objects embedded as table/plan/task_card cell values\n * (`{type:\"rich_text\", elements:[{type:\"rich_text_section\", elements:[...]}]}`). These blocks'\n * fixtures only ever use `text` and `link` leaf elements with basic styling, so this stays\n * self-contained rather than depending on the full `rich_text` block (owned separately).\n */\nexport function RichTextMini({ value }: { value: Json }) {\n if (!value || typeof value !== \"object\") return null;\n const elements = Array.isArray((value as Json).elements) ? (value as Json).elements : [];\n return (\n <>\n {(elements as Json[]).map((section, i) => (\n <RichTextMiniSection key={i} section={section} />\n ))}\n </>\n );\n}\n\nfunction RichTextMiniSection({ section }: { section: Json }) {\n const elements = Array.isArray(section.elements) ? (section.elements as Json[]) : [];\n return (\n <>\n {elements.map((el, i) => (\n <RichTextMiniLeaf key={i} element={el} />\n ))}\n </>\n );\n}\n\nfunction RichTextMiniLeaf({ element }: { element: Json }) {\n if (element.type === \"link\") {\n const text = typeof element.text === \"string\" ? element.text : String(element.url ?? \"\");\n return (\n <Link\n className=\"sbk-rtmini__link\"\n href={typeof element.url === \"string\" ? element.url : undefined}\n target=\"_blank\"\n rel=\"noreferrer noopener\"\n >\n {text}\n </Link>\n );\n }\n if (element.type !== \"text\") return null;\n const text = typeof element.text === \"string\" ? element.text : \"\";\n const style = (element.style ?? {}) as Json;\n let node: ReactNode = text;\n if (style.code) node = <code className=\"sbk-rtmini__code\">{node}</code>;\n if (style.bold) node = <b>{node}</b>;\n if (style.italic) node = <i>{node}</i>;\n if (style.strike) node = <s>{node}</s>;\n return <>{node}</>;\n}\n\n/** Plain-text extraction of a rich_text value, used for sorting table cells. */\nexport function richTextMiniToString(value: Json): string {\n if (!value || typeof value !== \"object\") return \"\";\n const elements = Array.isArray((value as Json).elements) ? (value as Json).elements : [];\n return (elements as Json[])\n .map((section) => {\n const leaves = Array.isArray(section.elements) ? (section.elements as Json[]) : [];\n return leaves.map((leaf) => (typeof leaf.text === \"string\" ? leaf.text : \"\")).join(\"\");\n })\n .join(\"\");\n}\n","import type { Json } from \"../types\";\nimport { RichTextMini, richTextMiniToString } from \"./richTextMini\";\nimport { Link } from \"../Link\";\n\n/** Renders a `data_table` cell: `raw_text`, `raw_number`, `url`, or `rich_text`. */\nexport function DataTableCell({ cell }: { cell: Json }) {\n if (!cell || typeof cell !== \"object\") return null;\n switch (cell.type) {\n case \"rich_text\":\n return <RichTextMini value={cell} />;\n case \"url\":\n return (\n <Link\n className=\"sbk-rtmini__link\"\n href={typeof cell.url === \"string\" ? cell.url : undefined}\n target=\"_blank\"\n rel=\"noreferrer noopener\"\n >\n {typeof cell.text === \"string\" ? cell.text : String(cell.url ?? \"\")}\n </Link>\n );\n case \"raw_number\":\n return <>{typeof cell.text === \"string\" ? cell.text : String(cell.value ?? \"\")}</>;\n default:\n return <>{typeof cell.text === \"string\" ? cell.text : \"\"}</>;\n }\n}\n\n/** The value a cell sorts by: a raw_number's numeric value, otherwise its plain text. */\nexport function dataTableSortValue(cell: Json | undefined): number | string {\n if (!cell || typeof cell !== \"object\") return \"\";\n if (cell.type === \"raw_number\" && typeof cell.value === \"number\") return cell.value;\n if (cell.type === \"rich_text\") return richTextMiniToString(cell).toLowerCase();\n if (typeof cell.text === \"string\") return cell.text.toLowerCase();\n return \"\";\n}\n","import { type ReactNode, useRef, useState } from \"react\";\nimport { ArrowDownIcon, ArrowUpIcon, MenuCheckIcon, SortCaretIcon } from \"../data/icons\";\nimport { Popover } from \"../elements/Popover\";\nimport { useMenuNavigation } from \"../elements/useMenuNavigation\";\n\nexport type SortDirection = \"asc\" | \"desc\";\n\nconst DIRECTIONS = [\n { direction: \"asc\", label: \"Ascending\", icon: <ArrowUpIcon /> },\n { direction: \"desc\", label: \"Descending\", icon: <ArrowDownIcon /> },\n] as const;\n\n/**\n * A sortable column header. As in Slack, pressing it opens a small \"Sort\" menu rather than sorting\n * straight away: Ascending and Descending, with the current one checked, and Clear Sort once this\n * column is the sorted one. The header itself shows no sort arrow; its caret only appears on hover.\n */\nexport function DataTableColumnHeader({\n label,\n sorted,\n onSort,\n}: {\n label: ReactNode;\n /** This column's direction, or null when the table is unsorted or sorted by another column. */\n sorted: SortDirection | null;\n onSort: (direction: SortDirection | null) => void;\n}) {\n const [open, setOpen] = useState(false);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const listRef = useRef<HTMLDivElement>(null);\n const choices: (SortDirection | null)[] = sorted ? [\"asc\", \"desc\", null] : [\"asc\", \"desc\"];\n\n function choose(direction: SortDirection | null) {\n setOpen(false);\n onSort(direction);\n }\n\n const nav = useMenuNavigation({\n open,\n count: choices.length,\n onChoose: (i) => choose(choices[i] ?? null),\n onClose: () => {\n setOpen(false);\n triggerRef.current?.focus();\n },\n onOpen: () => setOpen(true),\n listRef,\n });\n\n return (\n <div\n role=\"columnheader\"\n aria-sort={sorted === \"asc\" ? \"ascending\" : sorted === \"desc\" ? \"descending\" : \"none\"}\n className=\"sbk-data-table__col-header\"\n onKeyDown={nav.onKeyDown}\n >\n <button\n ref={triggerRef}\n type=\"button\"\n aria-haspopup=\"menu\"\n aria-expanded={open}\n onClick={() => setOpen((o) => !o)}\n >\n <span className=\"sbk-data-table__col-label\">{label}</span>\n <span className=\"sbk-data-table__sort-caret\">\n <SortCaretIcon />\n </span>\n </button>\n {open ? (\n <Popover anchorRef={triggerRef} gap={0} onDismiss={() => setOpen(false)}>\n <div className=\"sbk-data-table__sort-menu\" role=\"menu\" ref={listRef}>\n <div className=\"sbk-data-table__sort-heading\" role=\"presentation\">\n Sort\n </div>\n {DIRECTIONS.map(({ direction, label: itemLabel, icon }, i) => (\n <div\n key={direction}\n role=\"menuitemradio\"\n aria-checked={sorted === direction}\n className=\"sbk-data-table__sort-item\"\n onClick={() => choose(direction)}\n {...nav.itemProps(i)}\n >\n {sorted === direction ? (\n <span className=\"sbk-data-table__sort-check\">\n <MenuCheckIcon />\n </span>\n ) : null}\n <span className=\"sbk-data-table__sort-icon\">{icon}</span>\n {itemLabel}\n </div>\n ))}\n {sorted ? (\n <>\n <div className=\"sbk-data-table__sort-separator\" role=\"separator\" />\n <div\n role=\"menuitem\"\n className=\"sbk-data-table__sort-item sbk-data-table__sort-item--danger\"\n onClick={() => choose(null)}\n {...nav.itemProps(2)}\n >\n Clear Sort\n </div>\n </>\n ) : null}\n </div>\n </Popover>\n ) : null}\n </div>\n );\n}\n","import { useMemo, useState } from \"react\";\nimport { DataTableCell, dataTableSortValue } from \"../data/dataTableCells\";\nimport { ChevronIcon, ExpandIcon, KebabIcon, SearchIcon } from \"../data/icons\";\nimport type { BlockProps, Json } from \"../types\";\nimport { DataTableColumnHeader, type SortDirection } from \"./DataTableColumnHeader\";\n\ninterface DataTableBlock extends Json {\n type: \"data_table\";\n caption?: string;\n rows: Json[][];\n}\n\nconst PAGE_SIZE = 5;\n/** Height of a body row, which Slack uses to pad a short last page up to a full one. */\nconst ROW_HEIGHT = 48;\n\n/**\n * The `data_table` block: a caption, a sortable/paginated grid of cells (first row is the\n * header), and a small toolbar. Each column header opens a Sort menu (ascending, descending, or back to insertion order);\n * pagination kicks in above `PAGE_SIZE` data rows, matching Slack's Builder.\n */\nexport function DataTable({ block }: BlockProps<DataTableBlock>) {\n const rows = Array.isArray(block.rows) ? block.rows : [];\n const [header, ...body] = rows;\n const columnCount = header?.length ?? 0;\n\n const [sort, setSort] = useState<{ column: number; direction: SortDirection } | null>(null);\n const [page, setPage] = useState(0);\n\n const sortedBody = useMemo(() => {\n if (!sort) return body;\n const { column, direction } = sort;\n const withIndex = body.map((row, i) => ({ row, i }));\n withIndex.sort((a, b) => {\n const va = dataTableSortValue(a.row[column]);\n const vb = dataTableSortValue(b.row[column]);\n let cmp: number;\n if (typeof va === \"number\" && typeof vb === \"number\") cmp = va - vb;\n else cmp = String(va).localeCompare(String(vb));\n if (cmp === 0) cmp = a.i - b.i;\n return direction === \"asc\" ? cmp : -cmp;\n });\n return withIndex.map((entry) => entry.row);\n }, [body, sort]);\n\n const totalPages = Math.max(1, Math.ceil(sortedBody.length / PAGE_SIZE));\n const currentPage = Math.min(page, totalPages - 1);\n const visibleRows =\n sortedBody.length > PAGE_SIZE\n ? sortedBody.slice(currentPage * PAGE_SIZE, currentPage * PAGE_SIZE + PAGE_SIZE)\n : sortedBody;\n\n const sortColumn = (column: number, direction: SortDirection | null) => {\n setPage(0);\n setSort(direction ? { column, direction } : null);\n };\n\n // Slack's columns share the width but never shrink below 120px; past that the frame scrolls.\n const gridStyle = { gridTemplateColumns: `repeat(${columnCount}, minmax(120px, 1fr))` };\n\n return (\n <div className=\"sbk-data-table\">\n <div className=\"sbk-data-table__header\">\n {block.caption ? <span className=\"sbk-data-table__caption\">{block.caption}</span> : null}\n <div className=\"sbk-data-table__toolbar\">\n <button type=\"button\" className=\"sbk-data-table__icon-btn\" aria-label=\"Search table\">\n <SearchIcon />\n </button>\n <button\n type=\"button\"\n className=\"sbk-data-table__icon-btn\"\n aria-label={block.caption ? `View ${block.caption}` : \"View table\"}\n >\n <ExpandIcon />\n </button>\n <button type=\"button\" className=\"sbk-data-table__icon-btn\" aria-label=\"More actions\">\n <KebabIcon />\n </button>\n </div>\n </div>\n\n <div className=\"sbk-data-table__frame\">\n <div className=\"sbk-data-table__rows\" role=\"table\" aria-label={block.caption}>\n <div className=\"sbk-data-table__grid-header\" role=\"row\" style={gridStyle}>\n {header?.map((cell, i) => (\n <DataTableColumnHeader\n key={i}\n label={<DataTableCell cell={cell} />}\n sorted={sort?.column === i ? sort.direction : null}\n onSort={(direction) => sortColumn(i, direction)}\n />\n ))}\n </div>\n <div className=\"sbk-data-table__body\" role=\"rowgroup\">\n {visibleRows.map((row, r) => (\n <div key={r} className=\"sbk-data-table__row\" role=\"row\" style={gridStyle}>\n {row.map((cell, i) => (\n <div\n key={i}\n className=\"sbk-data-table__cell\"\n role={i === 0 ? \"rowheader\" : \"cell\"}\n >\n <div className=\"sbk-data-table__cell-content\">\n <span className=\"sbk-data-table__truncate\">\n <DataTableCell cell={cell} />\n </span>\n </div>\n </div>\n ))}\n </div>\n ))}\n </div>\n </div>\n\n {sortedBody.length > PAGE_SIZE && visibleRows.length < PAGE_SIZE ? (\n <div\n className=\"sbk-data-table__spacer\"\n style={{ height: (PAGE_SIZE - visibleRows.length) * ROW_HEIGHT }}\n />\n ) : null}\n {sortedBody.length > PAGE_SIZE ? (\n <div className=\"sbk-data-table__pagination\" aria-label=\"Pagination\">\n <button\n type=\"button\"\n className=\"sbk-data-table__page-nav\"\n aria-label=\"Previous page\"\n disabled={currentPage === 0}\n onClick={() => setPage((p) => Math.max(0, p - 1))}\n >\n <ChevronIcon direction=\"left\" />\n </button>\n {Array.from({ length: totalPages }, (_, i) => (\n <button\n key={i}\n type=\"button\"\n className={`sbk-data-table__page-btn${i === currentPage ? \" sbk-data-table__page-btn--active\" : \"\"}`}\n aria-label={String(i + 1)}\n onClick={() => setPage(i)}\n >\n {i + 1}\n </button>\n ))}\n <button\n type=\"button\"\n className=\"sbk-data-table__page-nav\"\n aria-label=\"Next page\"\n disabled={currentPage === totalPages - 1}\n onClick={() => setPage((p) => Math.min(totalPages - 1, p + 1))}\n >\n <ChevronIcon direction=\"right\" />\n </button>\n </div>\n ) : null}\n </div>\n </div>\n );\n}\n","/** Series/segment colours, in order, measured from Slack's Builder charts. */\nexport const CHART_COLORS = [\"#e96825\", \"#20a271\", \"#c474d3\", \"#0e9dd3\"];\n\n/**\n * Fill of a series' area, as a token per theme (DataVisualization.css, and Message.css for dark):\n * a light tint of the series colour, or a dark one.\n */\nexport function areaFillForIndex(i: number): string {\n return `var(--sbk-chart-area-${(i % CHART_COLORS.length) + 1})`;\n}\n\nexport function colorForIndex(i: number): string {\n return CHART_COLORS[i % CHART_COLORS.length] ?? \"#e96825\";\n}\n","/**\n * Smooth line through points, matching Slack's series curves: each point's tangent runs parallel to\n * its neighbours (flattened at peaks and troughs) and its handles are split in proportion to the\n * adjacent chord lengths, at a tension of 0.5. A handle that would rise or fall past its neighbour\n * has the tangent flattened until it stops level with it, so the curve never overshoots a point.\n * The end points use themselves as their outer handle.\n */\nexport function smoothLinePath(points: { x: number; y: number }[]): string {\n const first = points[0];\n if (!first) return \"\";\n const handles = points.map((p, i) => {\n const prev = points[i - 1];\n const next = points[i + 1];\n if (!prev || !next) return { in: p, out: p };\n const d01 = Math.hypot(p.x - prev.x, p.y - prev.y);\n const d12 = Math.hypot(next.x - p.x, next.y - p.y);\n const total = d01 + d12 || 1;\n const fa = (0.5 * d01) / total;\n const fb = (0.5 * d12) / total;\n const extremum = (p.y - prev.y) * (next.y - p.y) <= 0;\n const dx = next.x - prev.x;\n let dy = extremum ? 0 : next.y - prev.y;\n if (dy !== 0) {\n const room = Math.min(\n Math.abs(p.y - prev.y) / Math.abs(fa * dy),\n Math.abs(next.y - p.y) / Math.abs(fb * dy),\n );\n if (room < 1) dy *= room;\n }\n return {\n in: { x: p.x - fa * dx, y: p.y - fa * dy },\n out: { x: p.x + fb * dx, y: p.y + fb * dy },\n };\n });\n let d = `M${first.x} ${first.y}`;\n for (let i = 1; i < points.length; i++) {\n const p = points[i];\n const c1 = handles[i - 1]?.out;\n const c2 = handles[i]?.in;\n if (!p || !c1 || !c2) continue;\n d += `C${c1.x} ${c1.y} ${c2.x} ${c2.y} ${p.x} ${p.y}`;\n }\n return d;\n}\n\n/** A bar with the two corners on its outer end (top when positive, bottom when negative) rounded. */\nexport function roundedBarPath(\n x: number,\n yTop: number,\n width: number,\n yBottom: number,\n radius: number,\n roundTop: boolean,\n): string {\n const r = Math.min(radius, width / 2, Math.abs(yBottom - yTop));\n if (roundTop) {\n return `M${x} ${yTop + r}A${r} ${r} 0 0 1 ${x + r} ${yTop}L${x + width - r} ${yTop}A${r} ${r} 0 0 1 ${x + width} ${yTop + r}L${x + width} ${yBottom}L${x} ${yBottom}Z`;\n }\n return `M${x} ${yTop}L${x + width} ${yTop}L${x + width} ${yBottom - r}A${r} ${r} 0 0 1 ${x + width - r} ${yBottom}L${x + r} ${yBottom}A${r} ${r} 0 0 1 ${x} ${yBottom - r}Z`;\n}\n","/**\n * Linear \"nice tick\" scale for the chart y-axis, reverse-engineered from Slack's Builder:\n * it always aims for ~6 intervals, picking the smallest step from {1, 2, 3, 5, 10} * 10^n\n * that covers the data range, and always includes 0.\n */\nexport interface NiceScale {\n min: number;\n max: number;\n step: number;\n ticks: number[];\n}\n\nconst STEP_CANDIDATES = [1, 2, 3, 5, 10];\n\nfunction niceStep(rawStep: number): number {\n if (rawStep <= 0) return 1;\n const mag = 10 ** Math.floor(Math.log10(rawStep));\n const norm = rawStep / mag;\n const candidate = STEP_CANDIDATES.find((c) => c >= norm - 1e-9) ?? 10;\n return candidate * mag;\n}\n\nexport function niceLinearScale(dataMin: number, dataMax: number, targetIntervals = 6): NiceScale {\n const min = Math.min(0, dataMin);\n const max = Math.max(0, dataMax === dataMin ? dataMin + 1 : dataMax);\n const step = niceStep((max - min) / targetIntervals);\n const niceMin = Math.floor(min / step) * step;\n const niceMax = Math.ceil(max / step) * step;\n const ticks: number[] = [];\n for (let v = niceMin; v <= niceMax + step * 1e-6; v += step) {\n ticks.push(Math.round(v / step) * step);\n }\n return { min: niceMin, max: niceMax, step, ticks };\n}\n\n/** Matches Slack's `1,200`-style tick labels. */\nexport function formatTick(value: number): string {\n return value.toLocaleString(\"en-US\");\n}\n\n/**\n * Where Slack's chart library draws a 1px horizontal line meant for `y`: the nearest half pixel, so\n * the stroke fills exactly one pixel row, rounding up when `y` sits on a row boundary.\n */\nexport function crispLine(y: number): number {\n const doubled = Math.round(y * 2);\n return doubled % 2 === 1 ? doubled / 2 : (doubled + 1) / 2;\n}\n","import { useEffect, useRef, useState } from \"react\";\n\n/** Tracks a container's content width via ResizeObserver, so charts can lay out to the real width. */\nexport function useContainerWidth(fallback: number) {\n const ref = useRef<HTMLDivElement | null>(null);\n const [width, setWidth] = useState(fallback);\n\n useEffect(() => {\n const el = ref.current;\n // jsdom (used in tests) has no ResizeObserver; fall back to the static width there.\n if (!el || typeof ResizeObserver === \"undefined\") return;\n const observer = new ResizeObserver((entries) => {\n const w = entries[0]?.contentRect.width;\n if (w) setWidth(w);\n });\n observer.observe(el);\n return () => observer.disconnect();\n }, []);\n\n return { ref, width };\n}\n","import { areaFillForIndex, colorForIndex } from \"./palette\";\nimport { roundedBarPath, smoothLinePath } from \"./paths\";\nimport { crispLine, formatTick, niceLinearScale } from \"./scale\";\nimport { useContainerWidth } from \"./useContainerWidth\";\n\nexport interface ChartSeries {\n name: string;\n data: { label: string; value: number }[];\n}\n\nconst HEIGHT = 360;\nconst PLOT_TOP = 9;\nconst PLOT_BOTTOM = 334;\nconst LABELS_Y = 342;\n\n// Measured across every reference fixture — from 2-digit negative deltas (\"-2\") to 5-character\n// values (\"1,800\") — Slack always reserves a fixed 74px gutter for the y-axis label + tick\n// numbers, rather than sizing it to the tick text. `ticks` is kept as a parameter so a future\n// fixture with unusually long labels can widen this without changing every call site.\nfunction leftMarginFor(ticks: number[]): number {\n const maxLen = Math.max(...ticks.map((t) => formatTick(t).length), 1);\n return Math.max(74, 34 + maxLen * 8);\n}\n\nexport function CartesianChart({\n type,\n series,\n categories,\n}: {\n type: \"line\" | \"area\" | \"bar\";\n series: ChartSeries[];\n categories: string[];\n}) {\n const { ref, width } = useContainerWidth(406);\n const allValues = series.flatMap((s) => s.data.map((d) => d.value));\n const scale = niceLinearScale(Math.min(0, ...allValues), Math.max(0, ...allValues));\n const leftMargin = leftMarginFor(scale.ticks);\n // Slack's line and area plots stop 10.7675px short of the edge, leaving room for half the last\n // category label; bars fill the width.\n const rightMargin = type === \"bar\" ? 0 : 10.7675;\n const plotLeft = leftMargin;\n const plotRight = Math.max(plotLeft + 1, width - rightMargin);\n const plotWidth = plotRight - plotLeft;\n\n const y = (v: number) =>\n PLOT_BOTTOM - ((v - scale.min) / (scale.max - scale.min)) * (PLOT_BOTTOM - PLOT_TOP);\n const zeroY = y(0);\n\n const n = categories.length;\n const bandWidth = n > 0 ? plotWidth / n : plotWidth;\n const pointX = (i: number) =>\n n > 1 ? plotLeft + (i * plotWidth) / (n - 1) : plotLeft + plotWidth / 2;\n const bandCenterX = (i: number) => plotLeft + bandWidth * (i + 0.5);\n\n // Measured from Slack's Builder: a lone bar occupies ~69% of its category band, while a\n // grouped set of bars (with a small gap scaling with bar width) occupies ~73%.\n const groupWidth = bandWidth * (series.length > 1 ? 0.73 : 0.69);\n const barGapRatio = 0.1;\n const barWidth =\n series.length > 0\n ? Math.max(1, groupWidth / (series.length + (series.length - 1) * barGapRatio))\n : 0;\n const barGap = barWidth * barGapRatio;\n\n return (\n <div className=\"sbk-chart\" ref={ref}>\n <svg\n className=\"sbk-chart__svg\"\n width={width}\n height={HEIGHT}\n viewBox={`0 0 ${width} ${HEIGHT}`}\n role=\"img\"\n aria-label=\"Chart\"\n >\n <g>\n {scale.ticks.map((t) => (\n <line\n key={t}\n x1={plotLeft}\n x2={plotRight}\n y1={crispLine(y(t))}\n y2={crispLine(y(t))}\n stroke=\"rgba(94,93,96,0.13)\"\n />\n ))}\n {/* Slack draws the x axis over the zero gridline, darkening it. */}\n <line\n className=\"sbk-chart__axis\"\n x1={plotLeft}\n x2={plotRight}\n y1={crispLine(zeroY)}\n y2={crispLine(zeroY)}\n stroke=\"rgba(94,93,96,0.13)\"\n strokeLinecap=\"round\"\n />\n {scale.ticks.map((t) => (\n <text\n key={t}\n transform={`translate(${plotLeft - 8} ${y(t)})`}\n textAnchor=\"end\"\n dominantBaseline=\"central\"\n className=\"sbk-chart__tick\"\n >\n {formatTick(t)}\n </text>\n ))}\n {categories.map((c, i) => (\n <text\n key={c}\n transform={`translate(${type === \"bar\" ? bandCenterX(i) : pointX(i)} ${LABELS_Y})`}\n y={9}\n textAnchor=\"middle\"\n dominantBaseline=\"central\"\n className=\"sbk-chart__tick\"\n >\n {c}\n </text>\n ))}\n\n {type === \"bar\"\n ? series.map((s, si) =>\n s.data.map((d, i) => {\n const x = bandCenterX(i) - groupWidth / 2 + si * (barWidth + barGap);\n const positive = d.value >= 0;\n const top = positive ? y(d.value) : zeroY;\n const bottom = positive ? zeroY : y(d.value);\n return (\n <path\n key={`${si}-${i}`}\n d={roundedBarPath(x, top, barWidth, bottom, 4, positive)}\n fill={colorForIndex(si)}\n />\n );\n }),\n )\n : series.map((s, si) => {\n const points = s.data.map((d, i) => ({ x: pointX(i), y: y(d.value) }));\n const color = colorForIndex(si);\n return (\n <g key={si}>\n {type === \"area\" ? (\n <path\n d={`${smoothLinePath(points)}L${points[points.length - 1]?.x ?? 0} ${zeroY}L${points[0]?.x ?? 0} ${zeroY}Z`}\n style={{ fill: areaFillForIndex(si) }}\n fillOpacity={0.7}\n />\n ) : null}\n <path\n d={smoothLinePath(points)}\n fill=\"none\"\n stroke={color}\n strokeWidth={2}\n strokeLinejoin=\"bevel\"\n />\n </g>\n );\n })}\n </g>\n </svg>\n </div>\n );\n}\n","import { colorForIndex } from \"./palette\";\n\nexport interface PieSegment {\n label: string;\n value: number;\n}\n\nconst WIDTH = 406;\n/** Builder's pie plot area is 406×360, not square, with the pie centred in it. */\nconst HEIGHT = 360;\nconst CENTER = { x: 203, y: 180 };\nconst RADIUS = 144;\n\n/** Point on the pie's circle for a given angle in degrees, measured clockwise from 12 o'clock. */\nfunction pointAt(angleDeg: number) {\n const rad = ((angleDeg - 90) * Math.PI) / 180;\n return { x: CENTER.x + RADIUS * Math.cos(rad), y: CENTER.y + RADIUS * Math.sin(rad) };\n}\n\nfunction segmentPath(startAngle: number, endAngle: number): string {\n const sweep = endAngle - startAngle;\n const start = pointAt(startAngle);\n const end = pointAt(endAngle);\n const largeArc = sweep > 180 ? 1 : 0;\n if (sweep >= 359.999) {\n // A full circle, drawn as Slack's chart library does: one arc stopping 1e-4 rad short of its\n // start, with no edge to the centre (which would show as a white seam under the stroke).\n const stop = pointAt(startAngle + 360 - (1e-4 * 180) / Math.PI);\n const r4 = (n: number) => Math.round(n * 1e4) / 1e4;\n return `M${r4(start.x)} ${r4(start.y)}A${RADIUS} ${RADIUS} 0 1 1 ${r4(stop.x)} ${r4(stop.y)}Z`;\n }\n return `M${CENTER.x} ${CENTER.y}L${start.x} ${start.y}A${RADIUS} ${RADIUS} 0 ${largeArc} 1 ${end.x} ${end.y}Z`;\n}\n\nexport function PieChart({ segments }: { segments: PieSegment[] }) {\n const total = segments.reduce((sum, s) => sum + Math.max(0, s.value), 0);\n let angle = 0;\n const arcs = segments.map((segment, i) => {\n const value = Math.max(0, segment.value);\n const sweep = total > 0 ? (value / total) * 360 : 0;\n const start = angle;\n const end = angle + sweep;\n angle = end;\n return { key: i, d: segmentPath(start, end), color: colorForIndex(i) };\n });\n\n return (\n <svg\n className=\"sbk-chart__svg sbk-chart__svg--pie\"\n width={WIDTH}\n height={HEIGHT}\n viewBox={`0 0 ${WIDTH} ${HEIGHT}`}\n role=\"img\"\n aria-label=\"Pie chart\"\n >\n {arcs.map((arc) => (\n <path\n key={arc.key}\n d={arc.d}\n fill={arc.color}\n stroke=\"#fff\"\n strokeWidth={2}\n strokeLinejoin=\"round\"\n />\n ))}\n </svg>\n );\n}\n","import { type ReactNode, type RefObject, useEffect, useRef, useState } from \"react\";\nimport { useMenuNavigation } from \"../elements/useMenuNavigation\";\nimport { CopyIcon, DownloadIcon, EllipsisVerticalIcon, OpenInWindowIcon } from \"../icons\";\nimport { Tooltip } from \"../Tooltip\";\n\nexport interface HoverMenuItem {\n label: string;\n onSelect: () => void;\n}\n\nexport interface HoverAction {\n /** Tooltip and accessible name, e.g. \"Copy table\". */\n label: string;\n icon: ReactNode;\n onClick?: () => void;\n /** Renders the action as a link (e.g. \"Open in new window\"). */\n href?: string;\n /** Opens a `c-menu` of further actions (Slack's \"More actions\"). */\n menu?: HoverMenuItem[];\n}\n\n/**\n * Slack's `c-message_actions__group` pinned to the top-right of a table, image or chart: a white\n * 12px-radius pill of 32px icon buttons that fades in while its host is hovered or focused.\n * The host needs the `sbk-hover-actions-host` class.\n */\nexport function HoverActions({\n actions,\n className,\n}: {\n actions: HoverAction[];\n className?: string;\n}) {\n return (\n <div className={`sbk-hover-actions${className ? ` ${className}` : \"\"}`} role=\"group\">\n {actions.map((action) =>\n action.menu ? (\n <MenuAction key={action.label} action={action} items={action.menu} />\n ) : (\n <Tooltip key={action.label} label={action.label}>\n {action.href ? (\n <a\n className=\"sbk-hover-actions__button\"\n href={action.href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n aria-label={action.label}\n >\n {action.icon}\n </a>\n ) : (\n <button\n type=\"button\"\n className=\"sbk-hover-actions__button\"\n aria-label={action.label}\n onClick={action.onClick}\n >\n {action.icon}\n </button>\n )}\n </Tooltip>\n ),\n )}\n </div>\n );\n}\n\nfunction MenuAction({ action, items }: { action: HoverAction; items: HoverMenuItem[] }) {\n const [open, setOpen] = useState(false);\n const rootRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const listRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!open) return;\n const onDocClick = (e: MouseEvent) => {\n if (rootRef.current && !rootRef.current.contains(e.target as Node)) setOpen(false);\n };\n document.addEventListener(\"mousedown\", onDocClick);\n return () => document.removeEventListener(\"mousedown\", onDocClick);\n }, [open]);\n\n function choose(i: number) {\n setOpen(false);\n items[i]?.onSelect();\n }\n\n const nav = useMenuNavigation({\n open,\n count: items.length,\n onChoose: choose,\n onClose: () => {\n setOpen(false);\n triggerRef.current?.focus();\n },\n onOpen: () => setOpen(true),\n listRef,\n });\n\n return (\n <div className=\"sbk-hover-actions__menu-root\" ref={rootRef} onKeyDown={nav.onKeyDown}>\n <Tooltip label={open ? \"\" : action.label}>\n <button\n ref={triggerRef}\n type=\"button\"\n className=\"sbk-hover-actions__button\"\n aria-label={action.label}\n aria-haspopup=\"menu\"\n aria-expanded={open}\n onClick={() => setOpen((o) => !o)}\n >\n {action.icon}\n </button>\n </Tooltip>\n {open && (\n <div className=\"sbk-overflow__menu sbk-hover-actions__menu\" role=\"menu\" ref={listRef}>\n {items.map((item, i) => (\n <div\n key={item.label}\n role=\"menuitem\"\n className=\"sbk-overflow__option\"\n onClick={() => choose(i)}\n {...nav.itemProps(i)}\n >\n {item.label}\n </div>\n ))}\n </div>\n )}\n </div>\n );\n}\n\n/** Reads a rendered `<table>` into rows of cell text. */\nexport function tableRows(table: HTMLTableElement | null): string[][] {\n if (!table) return [];\n return Array.from(table.rows, (row) =>\n Array.from(row.cells, (cell) => (cell.textContent ?? \"\").trim()),\n );\n}\n\nfunction csvCell(value: string): string {\n return /[\",\\n]/.test(value) ? `\"${value.replace(/\"/g, '\"\"')}\"` : value;\n}\n\nexport function toCsv(rows: string[][]): string {\n return rows.map((row) => row.map(csvCell).join(\",\")).join(\"\\n\");\n}\n\nexport function toTsv(rows: string[][]): string {\n return rows.map((row) => row.join(\"\\t\")).join(\"\\n\");\n}\n\nexport function copyText(text: string) {\n void navigator.clipboard?.writeText(text).catch(() => {});\n}\n\n/** Saves `text` as a file via a temporary object-URL link. */\nexport function downloadText(filename: string, text: string, type = \"text/csv\") {\n const url = URL.createObjectURL(new Blob([text], { type }));\n const link = document.createElement(\"a\");\n link.href = url;\n link.download = filename;\n link.click();\n setTimeout(() => URL.revokeObjectURL(url), 0);\n}\n\n/** Slack's table actions: \"Download table\" (CSV) and \"Copy table\" (tab-separated, pastes into\n * spreadsheets). Reads the rendered table so rich cells export as their visible text. */\nexport function TableActions({ tableRef }: { tableRef: RefObject<HTMLTableElement | null> }) {\n return (\n <HoverActions\n actions={[\n {\n label: \"Download table\",\n icon: <DownloadIcon />,\n onClick: () => downloadText(\"table.csv\", toCsv(tableRows(tableRef.current))),\n },\n {\n label: \"Copy table\",\n icon: <CopyIcon />,\n onClick: () => copyText(toTsv(tableRows(tableRef.current))),\n },\n ]}\n />\n );\n}\n\n/** Slack's `p-attachment_image_actions`: open the full image in a new window, plus a menu. */\nexport function ImageActions({ url }: { url: string }) {\n return (\n <HoverActions\n className=\"sbk-hover-actions--image\"\n actions={[\n { label: \"Open in new window\", icon: <OpenInWindowIcon />, href: url },\n {\n label: \"More actions\",\n icon: <EllipsisVerticalIcon />,\n menu: [\n { label: \"Copy link to image\", onSelect: () => copyText(url) },\n {\n label: \"Download image\",\n onSelect: () => {\n const link = document.createElement(\"a\");\n link.href = url;\n link.download = \"\";\n link.target = \"_blank\";\n link.rel = \"noopener noreferrer\";\n link.click();\n },\n },\n ],\n },\n ]}\n />\n );\n}\n\n/** A chart's single \"More actions\" menu, exporting its underlying data. */\nexport function ChartActions({ rows, title }: { rows: string[][]; title?: string }) {\n const name = `${(title || \"chart\").replace(/[^\\w-]+/g, \"_\")}.csv`;\n return (\n <HoverActions\n className=\"sbk-hover-actions--chart\"\n actions={[\n {\n label: \"More actions\",\n icon: <EllipsisVerticalIcon />,\n menu: [\n { label: \"Copy data\", onSelect: () => copyText(toTsv(rows)) },\n { label: \"Download as CSV\", onSelect: () => downloadText(name, toCsv(rows)) },\n ],\n },\n ]}\n />\n );\n}\n","import { CartesianChart, type ChartSeries } from \"../charts/CartesianChart\";\nimport { PieChart } from \"../charts/PieChart\";\nimport { colorForIndex } from \"../charts/palette\";\nimport { ChartActions } from \"../data/HoverActions\";\nimport type { BlockProps, Json } from \"../types\";\n\ninterface AxisConfig {\n categories?: string[];\n x_label?: string;\n y_label?: string;\n}\n\ninterface Chart extends Json {\n type: \"line\" | \"area\" | \"bar\" | \"pie\";\n series?: ChartSeries[];\n segments?: { label: string; value: number }[];\n axis_config?: AxisConfig;\n}\n\ninterface DataVisualizationBlock extends Json {\n type: \"data_visualization\";\n title?: string;\n chart: Chart;\n}\n\n/** The chart's data as a table: a label column plus one column per series (or a value column). */\nfunction chartRows(chart: Chart, categories: string[]): string[][] {\n if (chart.type === \"pie\") {\n return [[\"Label\", \"Value\"], ...(chart.segments ?? []).map((s) => [s.label, String(s.value)])];\n }\n const series = chart.series ?? [];\n return [\n [chart.axis_config?.x_label ?? \"\", ...series.map((s) => s.name)],\n ...categories.map((label, i) => [\n label,\n ...series.map((s) =>\n String(s.data.find((d) => d.label === label)?.value ?? s.data[i]?.value ?? \"\"),\n ),\n ]),\n ];\n}\n\nfunction legendEntries(chart: Chart): { name: string; color: string }[] {\n if (chart.type === \"pie\") {\n return (chart.segments ?? []).map((s, i) => ({ name: s.label, color: colorForIndex(i) }));\n }\n return (chart.series ?? []).map((s, i) => ({ name: s.name, color: colorForIndex(i) }));\n}\n\nexport function DataVisualization({ block }: BlockProps<DataVisualizationBlock>) {\n const chart = block.chart;\n if (!chart) return null;\n const isPie = chart.type === \"pie\";\n const categories =\n chart.axis_config?.categories ?? chart.series?.[0]?.data.map((d) => d.label) ?? [];\n const legend = legendEntries(chart);\n\n return (\n <div className=\"sbk-dataviz sbk-hover-actions-host\">\n {block.title ? <h3 className=\"sbk-dataviz__title\">{block.title}</h3> : null}\n <div className={isPie ? \"sbk-dataviz__body sbk-dataviz__body--pie\" : \"sbk-dataviz__body\"}>\n {!isPie && chart.axis_config?.y_label ? (\n <div className=\"sbk-dataviz__y-label\">{chart.axis_config.y_label}</div>\n ) : null}\n {chart.type === \"pie\" ? (\n <PieChart segments={chart.segments ?? []} />\n ) : (\n <CartesianChart type={chart.type} series={chart.series ?? []} categories={categories} />\n )}\n </div>\n {!isPie && chart.axis_config?.x_label ? (\n <div className=\"sbk-dataviz__x-label\">{chart.axis_config.x_label}</div>\n ) : null}\n {legend.length > 0 ? (\n <div\n className={isPie ? \"sbk-dataviz__legend sbk-dataviz__legend--pie\" : \"sbk-dataviz__legend\"}\n >\n {legend.map((entry) => (\n <span key={entry.name} className=\"sbk-dataviz__legend-entry\">\n <span className=\"sbk-dataviz__legend-dot\" style={{ backgroundColor: entry.color }} />\n {entry.name}\n </span>\n ))}\n </div>\n ) : null}\n <ChartActions rows={chartRows(chart, categories)} title={block.title} />\n </div>\n );\n}\n","import type { BlockProps } from \"../types\";\n\nexport function Divider(_props: BlockProps) {\n return <hr className=\"sbk-divider\" />;\n}\n","import type { BlockProps, Json } from \"../types\";\nimport { Block } from \"./Block\";\n\n/**\n * The Block Kit \"fallback\" convention: a block type this renderer doesn't know renders its\n * producer-supplied `fallback` blocks in place instead of being dropped. `fallback_canary` is a\n * synthetic type used to test that convention itself (see `catalog/reference/fallback-canary`);\n * an unrecognized real block type with a `fallback` array should be handled the same way, but\n * this library's registry always maps a known type, so the canary is what exercises the path.\n *\n * Slack renders the whole fallback list inside the one block wrapper it gave the unknown block,\n * and that wrapper is a flex row, so the fallback blocks sit side by side rather than stacking.\n */\nexport function FallbackCanary({ block }: BlockProps) {\n const fallback = ((block as Json).fallback as Json[] | undefined) ?? [];\n return (\n <div className=\"sbk-fallback-canary\">\n {fallback.map((child, i) => (\n <Block key={(child.block_id as string | undefined) ?? i} block={child} index={i} />\n ))}\n </div>\n );\n}\n","import type { BlockProps, Json } from \"../types\";\n\nfunction FileIcon() {\n return (\n <svg viewBox=\"0 0 24 24\" width=\"24\" height=\"24\" aria-hidden=\"true\">\n <path\n d=\"M6 2h9l5 5v15a1 1 0 0 1-1 1H6a1 1 0 0 1-1-1V3a1 1 0 0 1 1-1z\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n />\n <path d=\"M15 2v5h5\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n </svg>\n );\n}\n\n/**\n * The `file` block only ever references a remote file by `external_id` (`source: \"remote\"`).\n * Slack resolves it via an app's `files.remote` integration, which we can't call, so this is a\n * generic placeholder card carrying the id — there's no Builder fixture to match against.\n */\nexport function File({ block }: BlockProps) {\n const json = block as Json;\n const externalId = typeof json.external_id === \"string\" ? json.external_id : \"unknown\";\n const source = typeof json.source === \"string\" ? json.source : \"remote\";\n\n return (\n <div className=\"sbk-file\">\n <span className=\"sbk-file__icon\">\n <FileIcon />\n </span>\n <div className=\"sbk-file__body\">\n <span className=\"sbk-file__name\">{externalId}</span>\n <span className=\"sbk-file__meta\">{source} file</span>\n </div>\n </div>\n );\n}\n","import type { HeaderBlock } from \"@slack/types\";\nimport { Text } from \"../Text\";\nimport type { BlockProps } from \"../types\";\n\n/** Builder-only field: renders the header at one of 4 scales. Defaults to 2 (Slack's standard size). */\ntype HeaderBlockWithLevel = HeaderBlock & { level?: 1 | 2 | 3 | 4 };\n\nconst TAGS = { 1: \"h1\", 2: \"h2\", 3: \"h3\", 4: \"h4\" } as const;\n\nexport function Header({ block }: BlockProps<HeaderBlockWithLevel>) {\n const level = block.level ?? 2;\n const Tag = TAGS[level];\n return (\n <Tag className={`sbk-header sbk-header--level-${level}`}>\n <Text text={block.text} />\n </Tag>\n );\n}\n","import type { ImageBlock } from \"@slack/types\";\nimport { useState } from \"react\";\nimport { ImageActions } from \"../data/HoverActions\";\nimport { Text } from \"../Text\";\nimport type { BlockProps, Json } from \"../types\";\n\n/**\n * The caret Slack shows after an image's file-size caption: its icon font's filled triangle,\n * pointing down while shown and right while hidden. Paths are the font's glyphs (2000 units to the\n * em, 1700 above the baseline), so they sit in the 15px box exactly as Slack's glyph does.\n */\nconst CARET_GLYPHS = {\n down: \"M1410 911C1463 971 1427 1050 1348 1050H652C573 1050 537 971 590 911L937 521C972 481 1028 481 1063 521Z\",\n right:\n \"M1279 687C1319 722 1319 778 1279 813L889 1160C829 1213 750 1177 750 1098V402C750 323 829 287 889 340Z\",\n};\n\nfunction ExpandCaret({ expanded }: { expanded: boolean }) {\n return (\n <svg\n className={expanded ? \"sbk-image__caret\" : \"sbk-image__caret sbk-image__caret--collapsed\"}\n viewBox=\"0 0 2000 2000\"\n aria-hidden=\"true\"\n >\n <path\n transform=\"matrix(1 0 0 -1 0 1700)\"\n fill=\"currentColor\"\n d={expanded ? CARET_GLYPHS.down : CARET_GLYPHS.right}\n />\n </svg>\n );\n}\n\n/**\n * `image_url` renders directly. `slack_file` references a file in a workspace's file store —\n * without an authenticated `files.info` call we can't resolve it to a URL, so we render the\n * documented fallback (alt text in a placeholder box) instead of a broken `<img>`.\n *\n * Slack always shows a title row above the image with an expand caret and a \"(N kB)\" file-size\n * caption — the caption comes from fetching the file's real bytes, which isn't available to us\n * without a network round-trip, so we render the row (title + caret) but omit the byte count.\n * Keeping the row's height/spacing matches Slack's vertical rhythm even where the text differs.\n *\n * The caret is a toggle, as in Slack: pressing it hides the image (instantly, no animation) and\n * leaves only the title row, and pressing it again brings the image back.\n */\nexport function Image({ block }: BlockProps<ImageBlock>) {\n const json = block as unknown as Json;\n const imageUrl = \"image_url\" in block ? block.image_url : undefined;\n const slackFile = json.slack_file as { url?: string; id?: string } | undefined;\n const [expanded, setExpanded] = useState(true);\n\n return (\n <figure className=\"sbk-image\">\n {imageUrl && (\n <div className=\"sbk-image__title\">\n {block.title && (\n <span className=\"sbk-image__title-text\">\n <Text text={block.title} />\n </span>\n )}\n <span className=\"sbk-image__trigger\">\n {\" \"}\n <button\n type=\"button\"\n className=\"sbk-image__toggle\"\n aria-label=\"image\"\n aria-expanded={expanded}\n title={expanded ? \"Collapse\" : \"Expand\"}\n onClick={() => setExpanded((value) => !value)}\n >\n <ExpandCaret expanded={expanded} />\n </button>\n </span>\n </div>\n )}\n {expanded && (\n <div\n className=\"sbk-image__frame sbk-hover-actions-host\"\n style={imageUrl ? { backgroundImage: `url(${JSON.stringify(imageUrl)})` } : undefined}\n >\n {imageUrl ? (\n <img className=\"sbk-image__img\" src={imageUrl} alt={block.alt_text} />\n ) : (\n <div className=\"sbk-image__fallback\" role=\"img\" aria-label={block.alt_text}>\n <span className=\"sbk-image__fallback-text\">\n {slackFile ? \"Slack file image unavailable\" : block.alt_text}\n </span>\n </div>\n )}\n {imageUrl && <ImageActions url={imageUrl} />}\n </div>\n )}\n </figure>\n );\n}\n","import type { InputBlock } from \"@slack/types\";\nimport { useId } from \"react\";\nimport { SuppressActions, useBlockKit } from \"../context\";\nimport { Element } from \"../elements/Element\";\nimport { InputBlockContext, InputErrorContext } from \"../elements/inputBlockContext\";\nimport { ReturnIcon } from \"../icons\";\nimport { Text } from \"../Text\";\nimport type { BlockProps, Json } from \"../types\";\n\nconst TEXT_INPUT_TYPES = new Set([\n \"plain_text_input\",\n \"email_text_input\",\n \"url_text_input\",\n \"number_input\",\n]);\n\n/** Slack's Builder preview synthesizes a \"Press 'enter' to submit\" hint below a single-line text\n * input whose owning `input` block dispatches on the (default) `on_enter_pressed` trigger, when\n * the block doesn't already carry its own explicit `hint`. It does NOT synthesize anything for\n * `on_character_entered`-only dispatch, or for multiline inputs (Enter inserts a newline there). */\nfunction dispatchHint(block: InputBlock): boolean {\n if (block.dispatch_action !== true || block.hint) return false;\n const element = block.element as Json;\n if (typeof element.type !== \"string\" || !TEXT_INPUT_TYPES.has(element.type)) return false;\n if (element.multiline === true) return false;\n const config = element.dispatch_action_config as { trigger_actions_on?: string[] } | undefined;\n const triggers = config?.trigger_actions_on ?? [\"on_enter_pressed\"];\n return triggers.includes(\"on_enter_pressed\");\n}\n\n/**\n * Slack's form field wrapper: label (+\"(optional)\" suffix), the element itself, an optional hint\n * below it, and a validation error (from `errors[block_id]`, as returned by `response_action:\n * \"errors\"`) shown in red beneath everything. Without `dispatch_action` the element sends no\n * `block_actions`, as in Slack. The flag is also stamped onto the element as an internal\n * `__dispatchAction` field, since text inputs need it to pick their triggers.\n */\nexport function Input({ block, blockId }: BlockProps<InputBlock>) {\n const { errors, surface } = useBlockKit();\n const element = { ...(block.element as Json), __dispatchAction: block.dispatch_action === true };\n const error = errors[blockId];\n const errorId = useId();\n const showDispatchHint = dispatchHint(block);\n // Slack's Builder preview never shows the \"(optional)\" suffix on the message-surface preview\n // (an `input` block there only ever appears inside a workflow step, where it's implied); it\n // only renders it for a modal/Home tab form.\n const showOptional = block.optional && surface !== \"message\";\n\n return (\n <div className={`sbk-input${error ? \" sbk-input--error\" : \"\"}`}>\n <div className=\"sbk-input__label\">\n <Text text={block.label} />\n {showOptional && <span className=\"sbk-input__optional\"> (optional)</span>}\n </div>\n <div className=\"sbk-input__element\">\n <InputBlockContext.Provider value={true}>\n <InputErrorContext.Provider value={error ? errorId : undefined}>\n {block.dispatch_action === true ? (\n <Element element={element} blockId={blockId} />\n ) : (\n <SuppressActions>\n <Element element={element} blockId={blockId} />\n </SuppressActions>\n )}\n </InputErrorContext.Provider>\n </InputBlockContext.Provider>\n </div>\n {block.hint && (\n <div className=\"sbk-input__hint\">\n <span className=\"sbk-input__hint-text\">\n <Text text={block.hint} />\n </span>\n </div>\n )}\n {showDispatchHint && (\n <div className=\"sbk-input__hint\">\n <span className=\"sbk-input__hint-text sbk-input__hint-text--dispatch\">\n <span className=\"sbk-input__hint-icon\">\n <ReturnIcon />\n </span>{\" \"}\n Press 'enter' to submit\n </span>\n </div>\n )}\n {error && (\n <div className=\"sbk-input__error\" id={errorId}>\n {error}\n </div>\n )}\n </div>\n );\n}\n","/**\n * Shared \"code snippet\" chrome used both by a `rich_text_preformatted` element that carries a\n * Builder-only `language` field, and by the Markdown block's fenced code blocks. Slack renders\n * these as a rounded card with a language label + copy button header, and a horizontally\n * scrolling, non-wrapping code area where each source line is its own line-box.\n */\n\nimport { CopyIcon } from \"../icons\";\n\nconst LANGUAGE_LABELS: Record<string, string> = {\n js: \"JavaScript\",\n javascript: \"JavaScript\",\n jsx: \"JavaScript\",\n ts: \"TypeScript\",\n typescript: \"TypeScript\",\n tsx: \"TypeScript\",\n py: \"Python\",\n python: \"Python\",\n rb: \"Ruby\",\n ruby: \"Ruby\",\n go: \"Go\",\n golang: \"Go\",\n rs: \"Rust\",\n rust: \"Rust\",\n java: \"Java\",\n kotlin: \"Kotlin\",\n swift: \"Swift\",\n php: \"PHP\",\n c: \"C\",\n cpp: \"C++\",\n \"c++\": \"C++\",\n csharp: \"C#\",\n \"c#\": \"C#\",\n cs: \"C#\",\n html: \"HTML\",\n css: \"CSS\",\n scss: \"SCSS\",\n json: \"JSON\",\n yaml: \"YAML\",\n yml: \"YAML\",\n sql: \"SQL\",\n bash: \"Bash\",\n sh: \"Shell\",\n shell: \"Shell\",\n markdown: \"Markdown\",\n md: \"Markdown\",\n graphql: \"GraphQL\",\n xml: \"XML\",\n};\n\nfunction languageLabel(language: string): string {\n const known = LANGUAGE_LABELS[language.toLowerCase()];\n if (known) return known;\n return language.charAt(0).toUpperCase() + language.slice(1);\n}\n\nexport interface CodeBlockProps {\n language: string;\n code: string;\n}\n\nexport function CodeBlock({ language, code }: CodeBlockProps) {\n const lines = code.split(\"\\n\");\n return (\n <div className=\"sbk-code-block\">\n <div className=\"sbk-code-block__box\">\n <div className=\"sbk-code-block__header\">\n <span className=\"sbk-code-block__language\">{languageLabel(language)}</span>\n <button type=\"button\" className=\"sbk-code-block__copy\" aria-label=\"Copy code\">\n <CopyIcon width={16} height={16} />\n </button>\n </div>\n <div className=\"sbk-code-block__scroll\">\n <pre className=\"sbk-code-block__code\">\n <code>\n {lines.map((line, i) => (\n <span key={i} className=\"sbk-code-block__line\">\n {line || \" \"}\n </span>\n ))}\n </code>\n </pre>\n </div>\n </div>\n </div>\n );\n}\n","import type { MarkdownBlock } from \"@slack/types\";\nimport { parsePlainTextEmoji } from \"../parser\";\nimport type {\n Blockquote,\n Code,\n Heading,\n InlineCode,\n Link,\n List,\n ListItem,\n Paragraph,\n PhrasingContent,\n Root,\n RootContent,\n Table,\n TableCell,\n TableRow,\n Text,\n} from \"mdast\";\nimport { fromMarkdown } from \"mdast-util-from-markdown\";\nimport { gfmFromMarkdown } from \"mdast-util-gfm\";\nimport { gfm } from \"micromark-extension-gfm\";\nimport { Fragment, type ReactNode, useRef } from \"react\";\nimport { TableActions } from \"../data/HoverActions\";\nimport { Emoji } from \"../emoji\";\n// mdast has its own `Link` type.\nimport { Link as TextLink } from \"../Link\";\nimport type { BlockProps } from \"../types\";\nimport { CodeBlock } from \"./CodeBlock\";\n\n/**\n * Renders the (Builder-only) `markdown` block: a GitHub-flavored-markdown string that the Builder\n * converts into a run of the same building blocks used elsewhere (headers, dividers, rich-text-like\n * paragraphs, code snippets, tables). We parse with `mdast-util-from-markdown` + GFM and reuse those\n * blocks' own CSS classes so the two stay visually identical.\n */\nexport function Markdown({ block }: BlockProps<MarkdownBlock>) {\n const tree = parseMarkdown(block.text);\n return <div className=\"sbk-markdown\">{renderBlocks(tree.children)}</div>;\n}\n\nfunction parseMarkdown(text: string): Root {\n return fromMarkdown(text, {\n extensions: [gfm()],\n mdastExtensions: [gfmFromMarkdown()],\n });\n}\n\nconst HEADING_TAGS = { 1: \"h1\", 2: \"h2\", 3: \"h3\" } as const;\n\nfunction renderBlocks(children: RootContent[]): ReactNode[] {\n const nodes: ReactNode[] = [];\n let i = 0;\n let key = 0;\n\n while (i < children.length) {\n const node = children[i];\n if (!node) {\n i++;\n continue;\n }\n\n if (node.type === \"paragraph\") {\n const run: Paragraph[] = [];\n while (i < children.length && children[i]?.type === \"paragraph\") {\n run.push(children[i] as Paragraph);\n i++;\n }\n nodes.push(\n <div key={key++} className=\"sbk-markdown__section\">\n {run.map((p, j) => (\n <Fragment key={j}>\n {renderInline(p.children)}\n <span className=\"sbk-rich-text__br\" />\n </Fragment>\n ))}\n </div>,\n );\n continue;\n }\n\n switch (node.type) {\n case \"heading\": {\n const heading = node as Heading;\n const depth = Math.min(heading.depth, 4);\n const Tag = HEADING_TAGS[depth as 1 | 2 | 3] ?? \"h4\";\n const level = depth >= 3 ? 3 : depth;\n nodes.push(\n <Tag key={key++} className={`sbk-header sbk-header--level-${level}`}>\n {renderInline(heading.children)}\n </Tag>,\n );\n break;\n }\n case \"thematicBreak\":\n nodes.push(<hr key={key++} className=\"sbk-divider\" />);\n break;\n case \"code\": {\n const code = node as Code;\n if (code.lang) {\n nodes.push(<CodeBlock key={key++} language={code.lang} code={code.value} />);\n } else {\n nodes.push(\n <pre key={key++} className=\"sbk-rich-text__pre\">\n {code.value}\n </pre>,\n );\n }\n break;\n }\n case \"blockquote\":\n nodes.push(\n <blockquote key={key++} className=\"sbk-rich-text__quote\">\n {renderQuoteChildren((node as Blockquote).children)}\n </blockquote>,\n );\n break;\n case \"list\":\n nodes.push(renderList(node as List, key++, 0));\n break;\n case \"table\":\n nodes.push(renderTable(node as Table, key++));\n break;\n default:\n break;\n }\n i++;\n }\n\n return nodes;\n}\n\n/** Consecutive paragraphs inside a blockquote are joined with a plain line break, no spacer. */\nfunction renderQuoteChildren(children: RootContent[]): ReactNode {\n const paragraphs = children.filter((c): c is Paragraph => c.type === \"paragraph\");\n return paragraphs.map((p, i) => (\n <Fragment key={i}>\n {i > 0 && <br />}\n {renderInline(p.children)}\n </Fragment>\n ));\n}\n\nconst MARKER_STYLES = [\"disc\", \"circle\", \"square\"];\n\nfunction renderList(list: List, key: number, depth: number): ReactNode {\n const Tag = list.ordered ? \"ol\" : \"ul\";\n const style = list.ordered ? \"ordered\" : \"bullet\";\n const markerStyle = list.ordered ? \"decimal\" : MARKER_STYLES[depth % 3];\n const start = list.ordered ? (list.start ?? 1) : undefined;\n\n return (\n <Tag\n key={key}\n className={`sbk-rich-list sbk-rich-list--${style}`}\n start={start}\n style={{ listStyleType: markerStyle }}\n >\n {list.children.map((item, i) => renderListItem(item, i, depth))}\n </Tag>\n );\n}\n\nfunction renderListItem(item: ListItem, key: number, depth: number): ReactNode {\n const paragraphs = item.children.filter((c): c is Paragraph => c.type === \"paragraph\");\n const nestedLists = item.children.filter((c): c is List => c.type === \"list\");\n\n return (\n <li key={key} className=\"sbk-rich-list__item\">\n {paragraphs.map((p, i) => (\n <Fragment key={i}>\n {i > 0 && <br />}\n {renderInline(p.children)}\n </Fragment>\n ))}\n {nestedLists.map((nested, i) => renderList(nested, i, depth + 1))}\n </li>\n );\n}\n\nfunction renderTable(table: Table, key: number): ReactNode {\n return <MarkdownTable key={key} table={table} />;\n}\n\nfunction MarkdownTable({ table }: { table: Table }) {\n const [headerRow, ...bodyRows] = table.children;\n const align = table.align ?? [];\n const tableRef = useRef<HTMLTableElement>(null);\n\n return (\n <div className=\"sbk-hover-actions-host sbk-hover-actions-host--fit\">\n <div className=\"sbk-markdown__table-wrap\">\n <table className=\"sbk-markdown__table\" ref={tableRef}>\n {headerRow && (\n <thead>\n <tr>\n {headerRow.children.map((cell, i) => (\n <th key={i} style={{ textAlign: align[i] ?? undefined }}>\n {renderInline(cell.children)}\n </th>\n ))}\n </tr>\n </thead>\n )}\n <tbody>\n {bodyRows.map((row: TableRow, i) => (\n <tr key={i}>\n {row.children.map((cell: TableCell, j) => (\n <td key={j} style={{ textAlign: align[j] ?? undefined }}>\n {renderInline(cell.children)}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n <TableActions tableRef={tableRef} />\n </div>\n );\n}\n\nfunction renderInline(nodes: PhrasingContent[]): ReactNode {\n return nodes.map((node, i) => <Fragment key={i}>{renderInlineNode(node)}</Fragment>);\n}\n\nfunction renderInlineNode(node: PhrasingContent): ReactNode {\n switch (node.type) {\n case \"text\":\n return renderTextWithEmoji((node as Text).value);\n case \"strong\":\n return <b>{renderInline(node.children)}</b>;\n case \"emphasis\":\n return <i>{renderInline(node.children)}</i>;\n case \"delete\":\n return <s>{renderInline(node.children)}</s>;\n case \"inlineCode\":\n return <code className=\"sbk-mrkdwn__code\">{(node as InlineCode).value}</code>;\n case \"link\": {\n const link = node as Link;\n return (\n <TextLink className=\"sbk-link\" href={link.url} target=\"_blank\" rel=\"noopener noreferrer\">\n {renderInline(link.children)}\n </TextLink>\n );\n }\n case \"break\":\n return <br />;\n default:\n return null;\n }\n}\n\nfunction renderTextWithEmoji(value: string): ReactNode {\n const nodes = parsePlainTextEmoji(value);\n return nodes.map((node, i) =>\n node.type === \"emoji\" ? (\n <Emoji key={i} name={node.name} skinTone={node.skinTone} size={22} />\n ) : (\n <Fragment key={i}>{renderSoftBreaks(node.value)}</Fragment>\n ),\n );\n}\n\n/** A GFM \"lazy continuation\" line within a paragraph/blockquote is a literal `\\n` in the text\n * node's value; render each as a visual line break rather than letting it collapse to a space. */\nfunction renderSoftBreaks(value: string): ReactNode {\n const lines = value.split(\"\\n\");\n return lines.map((line, i) => (\n <Fragment key={i}>\n {i > 0 && <br />}\n {line}\n </Fragment>\n ));\n}\n","/** Status glyphs shared by the plan/task_card blocks, matching Slack's status iconography. */\nexport type TaskStatus = \"complete\" | \"in_progress\" | \"pending\" | \"error\" | string;\n\n/**\n * Slack's `c-infinite_spinner`: two stacked arcs (head + tail) rotating on slightly different\n * easing curves, so the arc appears to stretch and shrink as it spins.\n */\nexport function SpinnerIcon({ size = 12 }: { size?: number }) {\n return (\n <span\n className=\"sbk-status-icon sbk-status-icon--spinner sbk-spinner\"\n style={{ width: size, height: size }}\n aria-hidden=\"true\"\n >\n <svg className=\"sbk-spinner__arc\" viewBox=\"0 0 100 100\">\n <circle className=\"sbk-spinner__bg\" cx=\"50%\" cy=\"50%\" r=\"35\" />\n <circle className=\"sbk-spinner__path\" cx=\"50%\" cy=\"50%\" r=\"35\" />\n </svg>\n <svg className=\"sbk-spinner__arc sbk-spinner__tail\" viewBox=\"0 0 100 100\">\n <circle className=\"sbk-spinner__path\" cx=\"50%\" cy=\"50%\" r=\"35\" />\n </svg>\n </span>\n );\n}\n\n/** Slack's filled check-circle, 13px on the toggle bar. */\nexport function CheckCircleIcon({ size = 13 }: { size?: number }) {\n return (\n <svg\n className=\"sbk-status-icon sbk-status-icon--complete\"\n viewBox=\"0 0 20 20\"\n width={size}\n height={size}\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M10 19a9 9 0 1 0 0-18 9 9 0 0 0 0 18m3.722-11.315a.75.75 0 1 0-1.144-.97l-4.125 4.863-1.141-1.611a.75.75 0 1 0-1.224.867l1.7 2.4a.75.75 0 0 0 1.184.051z\"\n />\n </svg>\n );\n}\n\n/** Slack's warning triangle for a failed task. */\nexport function ErrorIcon({ size = 13 }: { size?: number }) {\n return (\n <svg\n className=\"sbk-status-icon sbk-status-icon--error\"\n viewBox=\"0 0 20 20\"\n width={size}\n height={size}\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M7.712 3.542c1.02-1.723 3.556-1.723 4.576 0l6.1 10.303c1.043 1.76-.28 3.905-2.287 3.905H3.9c-2.008 0-3.331-2.144-2.288-3.905zM10 12.75a1 1 0 1 0 0 2 1 1 0 0 0 0-2m0-6a.75.75 0 0 0-.75.75V11a.75.75 0 0 0 1.5 0V7.5a.75.75 0 0 0-.75-.75\"\n />\n </svg>\n );\n}\n\n/** The 5px dot Slack's plan timeline puts on a finished or waiting step. */\nexport function DotIcon({ status }: { status: TaskStatus }) {\n return (\n <svg\n className={`sbk-status-icon sbk-status-icon--dot${status === \"complete\" ? \" sbk-status-icon--dot-complete\" : \"\"}`}\n viewBox=\"0 0 20 20\"\n width={5}\n height={5}\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path d=\"M19 10a9 9 0 1 1-18 0 9 9 0 0 1 18 0\" />\n </svg>\n );\n}\n\n/** How a status reads aloud. The icons are hidden from assistive technology, so this stands in. */\nconst STATUS_LABELS: Record<string, string> = {\n complete: \"complete\",\n in_progress: \"in progress\",\n pending: \"pending\",\n error: \"failed\",\n};\n\n/**\n * A status as text that only screen readers get, set after a title (\", in progress\"), so a toggle\n * or task header is announced with the state its icon shows. An unknown status says nothing.\n */\nexport function StatusText({ status }: { status: TaskStatus }) {\n const label = STATUS_LABELS[status];\n return label ? <span className=\"sbk-visually-hidden\">{`, ${label}`}</span> : null;\n}\n\n/** The glyph on a toggle bar (the plan's or a task_card's): check, warning or spinner. */\nexport function StatusIcon({ status }: { status: TaskStatus }) {\n if (status === \"complete\") return <CheckCircleIcon />;\n if (status === \"error\") return <ErrorIcon />;\n return <SpinnerIcon />;\n}\n\n/** One step on the plan's timeline: a dot once finished or while waiting, else as on the toggle. */\nexport function TimelineIcon({ status }: { status: TaskStatus }) {\n if (status === \"in_progress\") return <SpinnerIcon />;\n if (status === \"error\") return <ErrorIcon />;\n return <DotIcon status={status} />;\n}\n\n/**\n * The plan's overall status, as Slack shows it: still running while any task is unfinished, then\n * failed if any task failed, else complete.\n */\nexport function aggregateStatus(statuses: TaskStatus[]): TaskStatus {\n if (statuses.some((s) => s !== \"complete\" && s !== \"error\")) return \"in_progress\";\n if (statuses.includes(\"error\")) return \"error\";\n return \"complete\";\n}\n","import { useState } from \"react\";\nimport { Collapse } from \"../data/Collapse\";\nimport { CaretIcon } from \"../data/icons\";\nimport { RichTextMini } from \"../data/richTextMini\";\nimport {\n aggregateStatus,\n StatusIcon,\n StatusText,\n type TaskStatus,\n TimelineIcon,\n} from \"../data/statusIcon\";\nimport type { BlockProps, Json } from \"../types\";\nimport { Link } from \"../Link\";\n\ninterface PlanSource extends Json {\n type: \"url\";\n url: string;\n text?: string;\n}\n\ninterface PlanTask extends Json {\n task_id: string;\n title: string;\n status: TaskStatus;\n details?: Json;\n output?: Json;\n sources?: PlanSource[];\n}\n\ninterface PlanBlock extends Json {\n type: \"plan\";\n title: string;\n tasks: PlanTask[];\n}\n\n/**\n * One step of the plan. As in Slack, a thin line joins each step's icon to the next, its details\n * start open, and the title is a button that hides and shows them instantly; a task with nothing\n * to reveal gets the same header as plain text, with no caret. The status, shown as an icon, is\n * also in the header as text for screen readers.\n */\nfunction TaskRow({ task }: { task: PlanTask }) {\n const [open, setOpen] = useState(true);\n const sources = Array.isArray(task.sources) ? task.sources : [];\n const expandable = Boolean(task.details || task.output || sources.length > 0);\n\n return (\n <li className=\"sbk-plan__task\">\n <span className=\"sbk-plan__step\" aria-hidden=\"true\">\n <span className=\"sbk-plan__line sbk-plan__line--top\" />\n <span className=\"sbk-plan__task-icon\">\n <TimelineIcon status={task.status} />\n </span>\n <span className=\"sbk-plan__line sbk-plan__line--bottom\" />\n </span>\n <div className=\"sbk-plan__task-content\">\n {expandable ? (\n <button\n type=\"button\"\n className=\"sbk-plan__task-header\"\n aria-expanded={open}\n onClick={() => setOpen((value) => !value)}\n >\n <span className=\"sbk-plan__task-title\">{task.title}</span>\n <StatusText status={task.status} />\n <span className=\"sbk-plan__task-caret\">\n <CaretIcon direction={open ? \"down\" : \"right\"} />\n </span>\n </button>\n ) : (\n <div className=\"sbk-plan__task-header\">\n <span className=\"sbk-plan__task-title\">{task.title}</span>\n <StatusText status={task.status} />\n </div>\n )}\n {open && expandable ? (\n <div className=\"sbk-plan__task-body\">\n {task.details ? (\n <div className=\"sbk-plan__task-details\">\n <RichTextMini value={task.details} />\n </div>\n ) : null}\n {task.output ? (\n <div className=\"sbk-plan__task-output\">\n <RichTextMini value={task.output} />\n </div>\n ) : null}\n {sources.length > 0 ? (\n <ul className=\"sbk-plan__task-sources\">\n {sources.map((source, i) => (\n <li key={source.url ?? i}>\n <Link\n className=\"sbk-plan__task-source-link\"\n href={source.url}\n target=\"_blank\"\n rel=\"noreferrer noopener\"\n >\n {source.text ?? source.url}\n </Link>\n </li>\n ))}\n </ul>\n ) : null}\n </div>\n ) : null}\n </div>\n </li>\n );\n}\n\nexport function Plan({ block }: BlockProps<PlanBlock>) {\n const [expanded, setExpanded] = useState(false);\n const tasks = Array.isArray(block.tasks) ? block.tasks : [];\n const status = aggregateStatus(tasks.map((t) => t.status));\n\n return (\n <div className=\"sbk-plan\">\n <button\n type=\"button\"\n className=\"sbk-plan__pill\"\n aria-expanded={expanded}\n onClick={() => setExpanded((value) => !value)}\n >\n <span className=\"sbk-plan__pill-content\">\n <span className=\"sbk-plan__pill-icon\">\n <StatusIcon status={status} />\n </span>\n <span className=\"sbk-plan__pill-title\">{block.title}</span>\n <StatusText status={status} />\n <span className=\"sbk-plan__pill-chevron\">\n <CaretIcon direction={expanded ? \"down\" : \"right\"} />\n </span>\n </span>\n </button>\n <Collapse open={expanded}>\n <ul className=\"sbk-plan__tasks\">\n {tasks.map((task) => (\n <TaskRow key={task.task_id} task={task} />\n ))}\n </ul>\n </Collapse>\n </div>\n );\n}\n","import type {\n RichTextBlock,\n RichTextBlockElement,\n RichTextElement,\n RichTextList,\n RichTextSection,\n} from \"@slack/types\";\nimport { formatSlackDate } from \"../parser\";\nimport { Fragment, type ReactNode } from \"react\";\nimport { useBlockKit } from \"../context\";\nimport { Emoji } from \"../emoji\";\nimport { Link, MentionLink } from \"../Link\";\nimport { LockIcon } from \"../Mrkdwn\";\nimport type { BlockProps } from \"../types\";\nimport { UserMention } from \"../UserMention\";\nimport { CopyIcon } from \"../icons\";\nimport { CodeBlock } from \"./CodeBlock\";\n\n// Builder-only/undocumented extensions to `@slack/types`' definitions.\ntype RichTextListExt = RichTextList & { offset?: number };\ntype RichTextEmojiExt = Extract<RichTextElement, { type: \"emoji\" }> & { skin_tone?: number };\ntype RichTextPreformattedExt = Extract<RichTextBlockElement, { type: \"rich_text_preformatted\" }> & {\n language?: string;\n};\n\ntype Resolvers = ReturnType<typeof useBlockKit>[\"resolvers\"];\n\ninterface RenderCtx {\n resolvers: Resolvers;\n timeZone: string | undefined;\n}\n\nexport function RichText({ block }: BlockProps<RichTextBlock>) {\n const { resolvers, timeZone } = useBlockKit();\n const ctx: RenderCtx = { resolvers, timeZone };\n return <div className=\"sbk-rich-text\">{renderTopLevel(block.elements ?? [], ctx)}</div>;\n}\n\nfunction renderTopLevel(elements: RichTextBlockElement[], ctx: RenderCtx): ReactNode[] {\n const nodes: ReactNode[] = [];\n let i = 0;\n let key = 0;\n while (i < elements.length) {\n const el = elements[i];\n if (!el) {\n i++;\n continue;\n }\n if (el.type === \"rich_text_list\") {\n const run: RichTextListExt[] = [];\n while (i < elements.length && elements[i]?.type === \"rich_text_list\") {\n run.push(elements[i] as RichTextListExt);\n i++;\n }\n const forest = buildListForest(run);\n for (const group of forest) nodes.push(renderListGroup(group, ctx, key++, 0));\n continue;\n }\n switch (el.type) {\n case \"rich_text_section\":\n nodes.push(\n <div key={key++} className=\"sbk-rich-text__section\">\n {renderSectionChildren(el.elements, ctx)}\n </div>,\n );\n break;\n case \"rich_text_quote\":\n nodes.push(\n <blockquote key={key++} className=\"sbk-rich-text__quote\">\n {renderSectionChildren(el.elements, ctx)}\n </blockquote>,\n );\n break;\n case \"rich_text_preformatted\": {\n const language = (el as RichTextPreformattedExt).language;\n if (language) {\n const code = el.elements\n .map((leaf) =>\n leaf.type === \"text\" ? leaf.text : leaf.type === \"link\" ? leaf.text || leaf.url : \"\",\n )\n .join(\"\");\n nodes.push(<CodeBlock key={key++} language={language} code={code} />);\n } else {\n nodes.push(\n <pre key={key++} className=\"sbk-rich-text__pre\">\n {renderPreformattedLines(el.elements)}\n <span className=\"sbk-rich-text__pre-copy\" aria-label=\"Copy code\">\n <CopyIcon width={16} height={16} />\n </span>\n </pre>,\n );\n }\n break;\n }\n default:\n break;\n }\n i++;\n }\n return nodes;\n}\n\n/** A section renders \"jumbo\" 32px emoji when it consists only of emoji (and whitespace). */\nfunction renderSectionChildren(elements: RichTextElement[], ctx: RenderCtx): ReactNode {\n const isJumbo =\n elements.some((el) => el.type === \"emoji\") &&\n elements.every((el) => el.type === \"emoji\" || (el.type === \"text\" && el.text.trim() === \"\"));\n\n if (isJumbo) {\n return (\n <span className=\"sbk-rich-text__jumbo-emoji\">\n {elements\n .filter((el) => el.type === \"emoji\")\n .map((el, i) => (\n <Fragment key={i}>{renderLeaf(el, ctx, 32)}</Fragment>\n ))}\n </span>\n );\n }\n\n return elements.map((el, i) => <Fragment key={i}>{renderLeaf(el, ctx, 22, i === 0)}</Fragment>);\n}\n\nfunction renderLeaf(\n el: RichTextElement,\n ctx: RenderCtx,\n emojiSize: number,\n isFirst = false,\n): ReactNode {\n let content: ReactNode;\n switch (el.type) {\n case \"text\":\n content = renderTextWithBreaks(el.text, isFirst);\n break;\n case \"link\":\n content = (\n <Link className=\"sbk-link\" href={el.url} target=\"_blank\" rel=\"noopener noreferrer\">\n {el.text || el.url}\n </Link>\n );\n break;\n case \"emoji\": {\n const emoji = el as RichTextEmojiExt;\n content = <Emoji name={emoji.name} skinTone={emoji.skin_tone} size={emojiSize} />;\n break;\n }\n case \"user\": {\n const name = ctx.resolvers.user?.(el.user_id);\n content = name ? (\n <UserMention id={el.user_id} name={name} />\n ) : (\n <span className=\"sbk-mention--unresolved\" aria-label={`@${el.user_id}`} />\n );\n break;\n }\n case \"usergroup\": {\n const name = ctx.resolvers.usergroup?.(el.usergroup_id);\n content = name ? (\n <MentionLink type=\"usergroup\" id={el.usergroup_id}>\n @{name}\n </MentionLink>\n ) : (\n <span className=\"sbk-mention--loading\" aria-label=\"Loading user group\" />\n );\n break;\n }\n case \"channel\": {\n const name = ctx.resolvers.channel?.(el.channel_id);\n content = name ? (\n <MentionLink type=\"channel\" id={el.channel_id}>\n #{name}\n </MentionLink>\n ) : (\n <span className=\"sbk-mention--private\">\n <LockIcon />\n Private channel\n </span>\n );\n break;\n }\n case \"broadcast\":\n content = <span className=\"sbk-mention--broadcast\">@{el.range}</span>;\n break;\n case \"date\": {\n const text = formatSlackDate(el.timestamp, el.format, { timeZone: ctx.timeZone });\n content = el.url ? (\n <Link className=\"sbk-link\" href={el.url} target=\"_blank\" rel=\"noopener noreferrer\">\n {text}\n </Link>\n ) : (\n <span className=\"sbk-mrkdwn__date\">{text}</span>\n );\n break;\n }\n case \"color\":\n content = (\n <Fragment>\n {el.value}\n <span\n className=\"sbk-rich-text__color-swatch\"\n style={{ background: el.value }}\n aria-label={el.value}\n />\n </Fragment>\n );\n break;\n case \"team\":\n content = <span className=\"sbk-mention--unresolved\" aria-label={`@${el.team_id}`} />;\n break;\n default:\n content = null;\n }\n\n return applyStyle(content, el.style);\n}\n\nfunction applyStyle(content: ReactNode, style: RichTextElement[\"style\"] | undefined): ReactNode {\n if (!style) return content;\n let node = content;\n if (style.underline) node = <u>{node}</u>;\n if (style.strike) node = <s>{node}</s>;\n if (style.italic) node = <i>{node}</i>;\n if (style.bold) node = <b>{node}</b>;\n if (style.code) node = <code className=\"sbk-mrkdwn__code\">{node}</code>;\n return node;\n}\n\n/**\n * A run of 2+ `\\n`s (a paragraph gap) always collapses to a small fixed-height spacer, regardless\n * of where it sits. A single `\\n` renders as a literal `<br/>` — which, left to normal browser\n * layout, already does the right thing at both ends: a *trailing* `<br/>` (nothing after it in the\n * section) naturally contributes no extra height, and a *mid-content* one (real content before and\n * after) inserts a full line break. The one case the browser gets \"wrong\" for our purposes is a\n * *leading* single `\\n` (nothing meaningful before it): natively that reserves a whole blank line,\n * but the Builder instead shows the same small spacer used for multi-`\\n` gaps — so that one case\n * is special-cased explicitly.\n */\nfunction renderTextWithBreaks(value: string, isFirst: boolean): ReactNode {\n const parts = value.split(/(\\n+)/);\n // `split` on a capturing regex leaves an empty \"\" entry wherever the match sits at the very\n // start of the string, so the real leading run lives at index 1, not index 0.\n const firstNonEmpty = parts.findIndex((p) => p !== \"\");\n return parts.map((part, i) => {\n if (part === \"\") return null;\n if (/^\\n+$/.test(part)) {\n const isLeading = isFirst && i === firstNonEmpty;\n if (part.length === 1 && !isLeading) return <br key={i} />;\n return <span key={i} className=\"sbk-rich-text__br\" />;\n }\n return <Fragment key={i}>{part}</Fragment>;\n });\n}\n\n/**\n * Preformatted blocks (without a `language`) wrap long lines normally, and — unlike a regular\n * rich_text section — a `\\n` here is a literal hard break: `white-space: pre-wrap` on the `<pre>`\n * already renders each one as a real line, so a `\\n\\n` run naturally produces one full blank line\n * rather than the compact spacer used elsewhere. That means the raw text can be rendered as-is,\n * with no custom newline splitting.\n */\nfunction renderPreformattedLines(\n elements: Extract<RichTextElement, { type: \"text\" | \"link\" }>[],\n): ReactNode {\n return elements.map((el, i) => {\n if (el.type === \"link\") {\n return (\n <Fragment key={i}>\n {applyStyle(\n <Link className=\"sbk-link\" href={el.url} target=\"_blank\" rel=\"noopener noreferrer\">\n {el.text || el.url}\n </Link>,\n el.style,\n )}\n </Fragment>\n );\n }\n return <Fragment key={i}>{applyStyle(el.text, el.style)}</Fragment>;\n });\n}\n\n// --- List grouping/nesting -------------------------------------------------\n//\n// Slack merges consecutive `rich_text_list` blocks into one continuous outline: a block whose\n// `indent` is deeper than the running list nests inside the last item of that list, and a block\n// whose `indent`/`style` matches the current list at that depth continues it (this is how the\n// Builder renders e.g. an ordered list, an indented bullet aside, then more of the ordered list,\n// as a single properly nested <ol>/<ul> tree).\n\ninterface ListItem {\n section: RichTextSection;\n children: ListGroup[];\n /** Explicit start value for this <li>, used to honor a list's `offset`. */\n value?: number;\n}\n\ninterface ListGroup {\n style: \"bullet\" | \"ordered\";\n indent: number;\n border?: number;\n startValue?: number;\n items: ListItem[];\n}\n\nfunction buildListForest(run: RichTextListExt[]): ListGroup[] {\n const forest: ListGroup[] = [];\n const stack: ListGroup[] = [];\n\n for (const block of run) {\n const indent = block.indent ?? 0;\n while (stack.length > 0 && (stack[stack.length - 1] as ListGroup).indent > indent) {\n stack.pop();\n }\n let top = stack[stack.length - 1];\n\n if (top && top.indent === indent && top.style === block.style) {\n const startCount = top.items.length;\n for (const section of block.elements) top.items.push({ section, children: [] });\n if (block.offset != null && top.style === \"ordered\") {\n const firstNew = top.items[startCount];\n if (firstNew) firstNew.value = block.offset + 1;\n }\n continue;\n }\n\n if (top && top.indent === indent) {\n // Same depth, different style: end the current list and start a fresh one alongside it.\n stack.pop();\n top = stack[stack.length - 1];\n }\n\n const group: ListGroup = {\n style: block.style,\n indent,\n border: block.border,\n startValue: block.style === \"ordered\" ? (block.offset ?? 0) + 1 : undefined,\n items: block.elements.map((section) => ({ section, children: [] })),\n };\n\n if (top && top.indent < indent) {\n const parentItem = top.items[top.items.length - 1];\n if (parentItem) parentItem.children.push(group);\n else forest.push(group);\n } else {\n forest.push(group);\n }\n stack.push(group);\n }\n\n return forest;\n}\n\n/** Ordered lists count in the browser's markers; bullets are Slack's icon glyphs, drawn in CSS. */\nconst ORDERED_MARKERS = [\"decimal\", \"lower-alpha\", \"lower-roman\"];\n\nfunction renderListGroup(group: ListGroup, ctx: RenderCtx, key: number, depth: number): ReactNode {\n const Tag = group.style === \"ordered\" ? \"ol\" : \"ul\";\n const ordered = group.style === \"ordered\";\n const className = `sbk-rich-list sbk-rich-list--${group.style}${group.border ? \" sbk-rich-list--bordered\" : \"\"}`;\n\n return (\n <Tag\n key={key}\n className={className}\n start={group.startValue}\n data-indent={ordered ? undefined : group.indent}\n style={ordered ? { listStyleType: ORDERED_MARKERS[depth % 3] } : undefined}\n >\n {group.items.map((item, i) => (\n <li key={i} value={item.value} className=\"sbk-rich-list__item\">\n {renderSectionChildren(item.section.elements, ctx)}\n {item.children.map((child, j) => renderListGroup(child, ctx, j, depth + 1))}\n </li>\n ))}\n </Tag>\n );\n}\n","import type { SectionBlock } from \"@slack/types\";\nimport { useState } from \"react\";\nimport { Element } from \"../elements/Element\";\nimport { Text } from \"../Text\";\nimport type { BlockProps, Json } from \"../types\";\n\n/**\n * Long section text is clamped unless `expand: true`. There's no Builder reference for the exact\n * truncation length, so this mirrors the documented behaviour (a \"Show more\" toggle) with a\n * reasonable clamp rather than Slack's precise measurement.\n */\nconst COLLAPSE_LINES = 5;\nconst COLLAPSE_CHAR_THRESHOLD = 300;\n\n/** Accessories Slack stacks full-width below the text instead of beside it. */\nconst STACKED_ACCESSORIES = new Set([\"checkboxes\", \"radio_buttons\"]);\n\nexport function Section({ block, blockId }: BlockProps<SectionBlock>) {\n const accessory = block.accessory as Json | undefined;\n const expand = (block as unknown as Json).expand === true;\n const textLength = block.text?.text.length ?? 0;\n const collapsible = !expand && textLength > COLLAPSE_CHAR_THRESHOLD;\n const [expanded, setExpanded] = useState(false);\n const stacked = accessory !== undefined && STACKED_ACCESSORIES.has(accessory.type as string);\n\n return (\n <div\n className={`sbk-section${accessory ? \" sbk-section--has-accessory\" : \"\"}${stacked ? \" sbk-section--stacked\" : \"\"}`}\n >\n <div className=\"sbk-section__content\">\n {block.text && (\n <div\n className={`sbk-section__text${collapsible && !expanded ? \" sbk-section__text--clamped\" : \"\"}`}\n style={collapsible && !expanded ? { WebkitLineClamp: COLLAPSE_LINES } : undefined}\n >\n <Text text={block.text} />\n {collapsible && (\n <button\n type=\"button\"\n className=\"sbk-section__toggle\"\n onClick={() => setExpanded((v) => !v)}\n >\n {expanded ? \"Show less\" : \"Show more\"}\n </button>\n )}\n </div>\n )}\n {block.fields && (\n <div className=\"sbk-section__fields\">\n {block.fields.map((field, i) => (\n <div key={i} className=\"sbk-section__field\">\n <Text text={field} />\n </div>\n ))}\n </div>\n )}\n </div>\n {accessory && (\n <div className={`sbk-section__accessory sbk-section__accessory--${accessory.type}`}>\n <Element element={accessory} blockId={blockId} />\n </div>\n )}\n </div>\n );\n}\n","import { type CSSProperties, useRef } from \"react\";\nimport { TableActions } from \"../data/HoverActions\";\nimport { RichTextMini } from \"../data/richTextMini\";\nimport type { BlockProps, Json } from \"../types\";\n\ninterface ColumnSetting {\n is_wrapped?: boolean;\n align?: \"left\" | \"center\" | \"right\";\n}\n\nexport interface TableBlock extends Json {\n type: \"table\";\n rows: Json[][];\n column_settings?: ColumnSetting[];\n}\n\n/** Renders one cell's content: a `rich_text` object, or a plain-text `raw_text`/legacy string cell. */\nfunction Cell({ cell }: { cell: Json }) {\n if (cell && typeof cell === \"object\" && cell.type === \"rich_text\") {\n return <RichTextMini value={cell} />;\n }\n if (cell && typeof cell === \"object\" && typeof cell.text === \"string\") {\n return <>{cell.text}</>;\n }\n return null;\n}\n\n/**\n * The `table` block: a fixed grid of `rich_text`/`raw_text` cells, first row as the header.\n * `column_settings[i]` controls per-column alignment and text wrapping.\n */\nexport function Table({ block }: BlockProps<TableBlock>) {\n const rows = Array.isArray(block.rows) ? block.rows : [];\n const [header, ...body] = rows;\n const settings = block.column_settings ?? [];\n const tableRef = useRef<HTMLTableElement>(null);\n\n const cellStyle = (colIndex: number): CSSProperties | undefined => {\n const setting = settings[colIndex];\n if (!setting) return undefined;\n return {\n textAlign: setting.align,\n whiteSpace: setting.is_wrapped ? \"normal\" : \"nowrap\",\n };\n };\n\n return (\n <div className=\"sbk-table sbk-hover-actions-host sbk-hover-actions-host--fit\">\n <div className=\"sbk-table__scroll\">\n <table className=\"sbk-table__table\" ref={tableRef}>\n {header ? (\n <thead className=\"sbk-table__thead\">\n <tr>\n {header.map((cell, i) => (\n <th key={i} className=\"sbk-table__th\" style={cellStyle(i)}>\n <Cell cell={cell} />\n </th>\n ))}\n </tr>\n </thead>\n ) : null}\n <tbody className=\"sbk-table__tbody\">\n {body.map((row, r) => (\n <tr key={r}>\n {row.map((cell, i) => (\n <td key={i} className=\"sbk-table__td\" style={cellStyle(i)}>\n <Cell cell={cell} />\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n <TableActions tableRef={tableRef} />\n </div>\n );\n}\n","import { useState } from \"react\";\nimport { Collapse } from \"../data/Collapse\";\nimport { CaretIcon } from \"../data/icons\";\nimport { RichTextMini } from \"../data/richTextMini\";\nimport { DotIcon, StatusIcon, StatusText, type TaskStatus } from \"../data/statusIcon\";\nimport type { BlockProps, Json } from \"../types\";\nimport { Link } from \"../Link\";\n\ninterface TaskCardSource extends Json {\n type: \"url\";\n url: string;\n text?: string;\n}\n\ninterface TaskCardBlock extends Json {\n type: \"task_card\";\n task_id: string;\n title: string;\n status: TaskStatus;\n details?: Json;\n output?: Json;\n sources?: TaskCardSource[];\n}\n\nexport function TaskCard({ block }: BlockProps<TaskCardBlock>) {\n const [expanded, setExpanded] = useState(false);\n const sources = Array.isArray(block.sources) ? block.sources : [];\n // Slack disables the toggle, and drops its caret, when the card has nothing to reveal. Here it is\n // plain text then, so it isn't a tab stop that controls nothing.\n const expandable = Boolean(block.details || block.output || sources.length > 0);\n const pillContent = (\n <span className=\"sbk-task-card__pill-content\">\n <span className=\"sbk-task-card__pill-icon\">\n <StatusIcon status={block.status} />\n </span>\n <span className=\"sbk-task-card__pill-title\">{block.title}</span>\n <StatusText status={block.status} />\n {expandable ? (\n <span className=\"sbk-task-card__pill-chevron\">\n <CaretIcon direction={expanded ? \"down\" : \"right\"} />\n </span>\n ) : null}\n </span>\n );\n\n return (\n <div className=\"sbk-task-card\">\n {expandable ? (\n <button\n type=\"button\"\n className=\"sbk-task-card__pill\"\n aria-expanded={expanded}\n onClick={() => setExpanded((value) => !value)}\n >\n {pillContent}\n </button>\n ) : (\n <div className=\"sbk-task-card__pill\">{pillContent}</div>\n )}\n <Collapse open={expanded}>\n <div className=\"sbk-task-card__body\">\n {block.details ? (\n <div className=\"sbk-task-card__details\">\n <RichTextMini value={block.details} />\n </div>\n ) : null}\n {block.output || sources.length > 0 ? (\n <div className=\"sbk-task-card__step\">\n <div className=\"sbk-task-card__rail\">\n <span className=\"sbk-task-card__dot\">\n <DotIcon status=\"pending\" />\n </span>\n <span className=\"sbk-task-card__line\" />\n </div>\n <div className=\"sbk-task-card__step-content\">\n {block.output ? (\n <div className=\"sbk-task-card__output\">\n <RichTextMini value={block.output} />\n </div>\n ) : null}\n {sources.length > 0 ? (\n <ul className=\"sbk-task-card__sources\">\n {sources.map((source, i) => (\n <li key={source.url ?? i}>\n <Link\n className=\"sbk-task-card__source-link\"\n href={source.url}\n target=\"_blank\"\n rel=\"noreferrer noopener\"\n >\n {source.text ?? source.url}\n </Link>\n </li>\n ))}\n </ul>\n ) : null}\n </div>\n </div>\n ) : null}\n </div>\n </Collapse>\n </div>\n );\n}\n","import { Text, type TextObject } from \"../Text\";\nimport type { BlockProps, Json } from \"../types\";\nimport { Link } from \"../Link\";\n\nfunction PlayIcon() {\n return (\n <svg viewBox=\"0 0 20 20\" width=\"20\" height=\"20\" aria-hidden=\"true\">\n <path\n d=\"M6 4.3a1 1 0 0 1 1.5-.9l8.6 5.7a1 1 0 0 1 0 1.8l-8.6 5.7A1 1 0 0 1 6 15.7z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n}\n\nfunction CaretDownIcon() {\n return (\n <svg viewBox=\"0 0 20 20\" width=\"15\" height=\"15\" aria-hidden=\"true\">\n <path d=\"M5.5 8l4.5 4.5L14.5 8z\" fill=\"currentColor\" />\n </svg>\n );\n}\n\n/**\n * A video preview: author/provider row, description, title link, and a thumbnail with Slack's\n * \"Video\" play pill. We render the thumbnail rather than an embedded player — `video_url` is opened in a\n * new tab, matching how a message-surface preview behaves before the player is expanded.\n */\nexport function Video({ block }: BlockProps) {\n const json = block as Json;\n const title = json.title as TextObject | undefined;\n const titleUrl = typeof json.title_url === \"string\" ? json.title_url : undefined;\n const description = json.description as TextObject | undefined;\n const authorName = typeof json.author_name === \"string\" ? json.author_name : undefined;\n const providerName = typeof json.provider_name === \"string\" ? json.provider_name : undefined;\n const providerIcon =\n typeof json.provider_icon_url === \"string\" ? json.provider_icon_url : undefined;\n const thumbnailUrl = typeof json.thumbnail_url === \"string\" ? json.thumbnail_url : undefined;\n const altText = typeof json.alt_text === \"string\" ? json.alt_text : (title?.text ?? \"video\");\n\n return (\n <div className=\"sbk-video\">\n {(providerName || authorName) && (\n <div className=\"sbk-video__byline\">\n {providerIcon && <img className=\"sbk-video__provider-icon\" src={providerIcon} alt=\"\" />}\n {providerName && <span className=\"sbk-video__provider\">{providerName}</span>}\n {providerName && authorName && <span className=\"sbk-video__separator\"> | </span>}\n {authorName && <span className=\"sbk-video__author\">{authorName}</span>}\n </div>\n )}\n {description && (\n <div className=\"sbk-video__description\">\n <Text text={description} />\n </div>\n )}\n {title && (\n <div className=\"sbk-video__title\">\n {titleUrl ? (\n <Link href={titleUrl} target=\"_blank\" rel=\"noreferrer\">\n <Text text={title} />\n </Link>\n ) : (\n <Text text={title} />\n )}\n <span className=\"sbk-video__expand\" aria-hidden=\"true\">\n <CaretDownIcon />\n </span>\n </div>\n )}\n <Link\n className=\"sbk-video__frame\"\n href={typeof json.video_url === \"string\" ? (json.video_url as string) : titleUrl}\n target=\"_blank\"\n rel=\"noreferrer\"\n aria-label={altText}\n >\n {thumbnailUrl && <img className=\"sbk-video__thumb\" src={thumbnailUrl} alt=\"\" />}\n <span className=\"sbk-video__play\">\n <PlayIcon />\n <span className=\"sbk-video__play-label\">Video</span>\n </span>\n </Link>\n </div>\n );\n}\n","import type { ComponentType } from \"react\";\nimport type { BlockProps } from \"../types\";\nimport { Actions } from \"./Actions\";\nimport { Alert } from \"./Alert\";\nimport { Callout } from \"./Callout\";\nimport { Card } from \"./Card\";\nimport { Carousel } from \"./Carousel\";\nimport { Condition } from \"./Condition\";\nimport { ContactCard } from \"./ContactCard\";\nimport { Container } from \"./Container\";\nimport { Context } from \"./Context\";\nimport { ContextActions } from \"./ContextActions\";\nimport { DataTable } from \"./DataTable\";\nimport { DataVisualization } from \"./DataVisualization\";\nimport { Divider } from \"./Divider\";\nimport { FallbackCanary } from \"./FallbackCanary\";\nimport { File } from \"./File\";\nimport { Header } from \"./Header\";\nimport { Image } from \"./Image\";\nimport { Input } from \"./Input\";\nimport { Markdown } from \"./Markdown\";\nimport { Plan } from \"./Plan\";\nimport { RichText } from \"./RichText\";\nimport { Section } from \"./Section\";\nimport { Table } from \"./Table\";\nimport { TaskCard } from \"./TaskCard\";\nimport { Video } from \"./Video\";\n\n// `any`: each component narrows the block itself.\nexport const blockComponents: Record<string, ComponentType<BlockProps<any>>> = {\n actions: Actions,\n alert: Alert,\n callout: Callout,\n card: Card,\n carousel: Carousel,\n condition: Condition,\n contact_card: ContactCard,\n container: Container,\n context: Context,\n context_actions: ContextActions,\n data_table: DataTable,\n data_visualization: DataVisualization,\n divider: Divider,\n fallback_canary: FallbackCanary,\n file: File,\n header: Header,\n image: Image,\n input: Input,\n markdown: Markdown,\n plan: Plan,\n rich_text: RichText,\n section: Section,\n table: Table,\n task_card: TaskCard,\n video: Video,\n};\n","import { Unsupported } from \"../elements/Unsupported\";\nimport type { Json } from \"../types\";\nimport { blockComponents } from \".\";\n\n/** Renders one block. `index` is used for the generated block_id, as Slack does for blocks without one. */\nexport function Block({ block, index }: { block: Json; index: number }) {\n const blockId = typeof block.block_id === \"string\" ? block.block_id : `block-${index}`;\n const Component = blockComponents[block.type];\n return (\n <div className={`sbk-block sbk-block--${block.type}`} data-block-id={blockId}>\n {Component ? (\n <Component block={block} blockId={blockId} index={index} />\n ) : (\n <Unsupported type={block.type} />\n )}\n </div>\n );\n}\n","import type { AnyBlock } from \"@slack/types\";\nimport { Block } from \"./blocks/Block\";\nimport type { Json } from \"./types\";\n\nexport function Blocks({ blocks }: { blocks: readonly (AnyBlock | Json)[] }) {\n return (\n <div className=\"sbk-blocks\">\n {blocks.map((block, i) => (\n <Block key={(block.block_id as string | undefined) ?? i} block={block as Json} index={i} />\n ))}\n </div>\n );\n}\n","import type { AnyBlock } from \"@slack/types\";\nimport { useMemo, useState } from \"react\";\nimport { Blocks } from \"./Blocks\";\nimport { actionTs, type MessageApi, type MessageUpdate, SurfaceScope } from \"./context\";\nimport { Mrkdwn } from \"./Mrkdwn\";\nimport { Tooltip } from \"./Tooltip\";\nimport { Link } from \"./Link\";\n\nfunction ordinal(n: number): string {\n const v = n % 100;\n if (v >= 11 && v <= 13) return `${n}th`;\n return `${n}${[\"th\", \"st\", \"nd\", \"rd\"][n % 10] ?? \"th\"}`;\n}\n\n/** Slack's timestamp tooltip, e.g. \"Monday, September 27th at 4:54:45 AM\". */\nfunction fullTimestamp(time: Date, timeZone?: string): string {\n const part = (options: Intl.DateTimeFormatOptions) =>\n time.toLocaleString(\"en-US\", { ...options, timeZone });\n const day = Number(part({ day: \"numeric\" }));\n const clock = part({ hour: \"numeric\", minute: \"2-digit\", second: \"2-digit\" });\n return `${part({ weekday: \"long\" })}, ${part({ month: \"long\" })} ${ordinal(day)} at ${clock}`;\n}\n\nexport interface MessageApp {\n name: string;\n iconUrl?: string;\n}\n\n/** A reaction as Slack stores it on a message (`reactions[]` from conversations.history). */\nexport interface SlackReaction {\n name: string;\n count: number;\n users?: string[];\n}\n\n/** One field of a legacy attachment (`attachments[].fields[]`). */\nexport interface SlackAttachmentField {\n title: string;\n value: string;\n short?: boolean;\n}\n\n/** A legacy attachment, as Slack still renders it (colour bar, pretext, title, fields, footer). */\nexport interface SlackAttachment {\n color?: string;\n pretext?: string;\n author_name?: string;\n author_icon?: string;\n author_link?: string;\n title?: string;\n title_link?: string;\n text?: string;\n fields?: SlackAttachmentField[];\n image_url?: string;\n footer?: string;\n footer_icon?: string;\n ts?: string | number;\n /** Slack also lets attachments carry Block Kit blocks directly. */\n blocks?: AnyBlock[];\n}\n\n/** A message object as returned by `conversations.history` / stored by `@emulators/slack`. */\nexport interface SlackMessageLike {\n ts?: string;\n channel?: string;\n blocks?: AnyBlock[];\n text?: string;\n username?: string;\n icon_url?: string;\n icon_emoji?: string;\n bot_profile?: { name?: string; icons?: { image_72?: string; image_48?: string } };\n edited?: { ts?: string; user?: string };\n attachments?: SlackAttachment[];\n reactions?: SlackReaction[];\n reply_count?: number;\n reply_users_count?: number;\n latest_reply?: string;\n subscribed?: boolean;\n}\n\nexport interface MessageProps {\n blocks?: AnyBlock[];\n /** Fallback text. Slack shows it only when there are no blocks. */\n text?: string;\n app?: MessageApp;\n /** Message timestamp (Slack `ts`, seconds). Defaults to now. */\n ts?: string | number;\n /** IANA zone for the displayed time. Defaults to the viewer's zone, like Slack. */\n timeZone?: string;\n /**\n * A Slack message object (e.g. from `conversations.history`, or as stored by\n * `@emulators/slack`). When given, it supplies blocks/text/ts and the sender header\n * (username/icon/bot_profile), plus attachments, reactions, thread summary and edited marker.\n * `blocks`/`text`/`app`/`ts` above still work standalone for simple previews.\n */\n message?: SlackMessageLike;\n /** The channel the message is in. Used for the `block_actions` container Slack would send. */\n channelId?: string;\n /** Slack's \"Only visible to you\" marker, shown for ephemeral messages. */\n isEphemeral?: boolean;\n}\n\nconst DEFAULT_APP: MessageApp = { name: \"Block Kit Preview\" };\n\n/** A message as it appears in a Slack channel: avatar, app name, APP badge, time and blocks. */\nexport function Message({\n blocks,\n text,\n app = DEFAULT_APP,\n ts,\n timeZone,\n message,\n channelId,\n isEphemeral,\n}: MessageProps) {\n // Without a `ts`, the message is stamped once at mount, so its timestamp stays stable across\n // renders and interactions still produce a `block_actions` payload with a `message_ts`.\n const [mountTs] = useState(() => actionTs());\n const resolvedTs = message?.ts ?? (ts === undefined ? mountTs : String(ts));\n const time = new Date(Number(resolvedTs) * 1000);\n\n // What an app sent back through the action's `message` handle (`chat.update`/`response_url`).\n // It applies until the props change content, so editing the source still shows the edit.\n const source = JSON.stringify([message?.blocks, message?.text, blocks, text]);\n const [replaced, setReplaced] = useState<{ source: string; update: MessageUpdate | null }>();\n const override = replaced?.source === source ? replaced.update : undefined;\n const api = useMemo<MessageApi>(\n () => ({\n update: (update) => setReplaced({ source, update }),\n delete: () => setReplaced({ source, update: null }),\n }),\n [source],\n );\n\n const resolvedBlocks = override ? override.blocks : (message?.blocks ?? blocks);\n const resolvedText = override ? override.text : (message?.text ?? text);\n const header = resolveHeader(message, app);\n const ephemeral = isEphemeral ?? false;\n\n if (override === null) return null;\n\n return (\n <SurfaceScope\n container={{\n type: \"message\",\n messageTs: resolvedTs,\n channelId: message?.channel ?? channelId,\n isEphemeral: ephemeral,\n // Slack sends the message as it is now, so a replaced one carries its new content.\n message: override\n ? {\n type: \"message\",\n ...message,\n ts: resolvedTs,\n blocks: override.blocks,\n text: override.text,\n }\n : (message as Record<string, unknown> | undefined),\n }}\n message={api}\n >\n <div className=\"sbk-root sbk-message\">\n {header.iconUrl ? (\n <img className=\"sbk-message__avatar\" src={header.iconUrl} alt=\"\" />\n ) : (\n <span className=\"sbk-message__avatar sbk-message__avatar--placeholder\" aria-hidden>\n {header.name.charAt(0)}\n </span>\n )}\n <div className=\"sbk-message__content\">\n <div className=\"sbk-message__header\">\n <span className=\"sbk-message__sender\">{header.name}</span>\n {header.isApp && <span className=\"sbk-message__badge\">APP</span>}\n <Tooltip label={fullTimestamp(time, timeZone)}>\n <time className=\"sbk-message__time\" dateTime={time.toISOString()}>\n {time.toLocaleTimeString(\"en-US\", { hour: \"numeric\", minute: \"2-digit\", timeZone })}\n </time>\n </Tooltip>\n {message?.edited && <span className=\"sbk-message__edited\">(edited)</span>}\n </div>\n\n {resolvedBlocks && resolvedBlocks.length > 0 ? (\n <Blocks blocks={resolvedBlocks} />\n ) : (\n resolvedText && <Mrkdwn text={resolvedText} />\n )}\n\n {message?.attachments && message.attachments.length > 0 && (\n <div className=\"sbk-attachments\">\n {message.attachments.map((attachment, i) => (\n <Attachment key={i} attachment={attachment} />\n ))}\n </div>\n )}\n\n {message?.reactions && message.reactions.length > 0 && (\n <div className=\"sbk-reactions\">\n {message.reactions.map((reaction) => (\n <Tooltip key={reaction.name} label={`:${reaction.name}:`}>\n <span className=\"sbk-reactions__item\">\n <span className=\"sbk-reactions__emoji\">:{reaction.name}:</span>\n <span className=\"sbk-reactions__count\">{reaction.count}</span>\n </span>\n </Tooltip>\n ))}\n </div>\n )}\n\n {message && (message.reply_count ?? 0) > 0 && (\n <button type=\"button\" className=\"sbk-thread-summary\">\n <span className=\"sbk-thread-summary__count\">\n {message.reply_count} {message.reply_count === 1 ? \"reply\" : \"replies\"}\n </span>\n {message.subscribed && <span className=\"sbk-thread-summary__subscribed\">●</span>}\n </button>\n )}\n\n {ephemeral && <div className=\"sbk-message__ephemeral\">Only visible to you</div>}\n </div>\n </div>\n </SurfaceScope>\n );\n}\n\ninterface ResolvedHeader {\n name: string;\n iconUrl?: string;\n isApp: boolean;\n}\n\nfunction resolveHeader(message: SlackMessageLike | undefined, app: MessageApp): ResolvedHeader {\n if (!message) return { name: app.name, iconUrl: app.iconUrl, isApp: true };\n const name = message.username ?? message.bot_profile?.name ?? app.name;\n const iconUrl =\n message.icon_url ??\n message.bot_profile?.icons?.image_72 ??\n message.bot_profile?.icons?.image_48;\n return {\n name,\n iconUrl,\n isApp: Boolean(message.username || message.bot_profile || message.icon_url),\n };\n}\n\nfunction Attachment({ attachment }: { attachment: SlackAttachment }) {\n return (\n <div className=\"sbk-attachment\" style={{ borderLeftColor: normalizeColor(attachment.color) }}>\n <div className=\"sbk-attachment__body\">\n {attachment.pretext && (\n <div className=\"sbk-attachment__pretext\">\n <Mrkdwn text={attachment.pretext} />\n </div>\n )}\n {attachment.author_name && (\n <div className=\"sbk-attachment__author\">\n {attachment.author_icon && (\n <img className=\"sbk-attachment__author-icon\" src={attachment.author_icon} alt=\"\" />\n )}\n {attachment.author_link ? (\n <Link\n className=\"sbk-link\"\n href={attachment.author_link}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {attachment.author_name}\n </Link>\n ) : (\n attachment.author_name\n )}\n </div>\n )}\n {attachment.title && (\n <div className=\"sbk-attachment__title\">\n {attachment.title_link ? (\n <Link\n className=\"sbk-link\"\n href={attachment.title_link}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {attachment.title}\n </Link>\n ) : (\n attachment.title\n )}\n </div>\n )}\n {attachment.text && (\n <div className=\"sbk-attachment__text\">\n <Mrkdwn text={attachment.text} />\n </div>\n )}\n {attachment.fields && attachment.fields.length > 0 && (\n <div className=\"sbk-attachment__fields\">\n {attachment.fields.map((field, i) => (\n <div\n key={i}\n className={`sbk-attachment__field${field.short ? \" sbk-attachment__field--short\" : \"\"}`}\n >\n <div className=\"sbk-attachment__field-title\">{field.title}</div>\n <div className=\"sbk-attachment__field-value\">\n <Mrkdwn text={field.value} />\n </div>\n </div>\n ))}\n </div>\n )}\n {attachment.image_url && (\n <img className=\"sbk-attachment__image\" src={attachment.image_url} alt=\"\" />\n )}\n {attachment.blocks && attachment.blocks.length > 0 && <Blocks blocks={attachment.blocks} />}\n {attachment.footer && (\n <div className=\"sbk-attachment__footer\">\n {attachment.footer_icon && (\n <img className=\"sbk-attachment__footer-icon\" src={attachment.footer_icon} alt=\"\" />\n )}\n {attachment.footer}\n </div>\n )}\n </div>\n </div>\n );\n}\n\nfunction normalizeColor(color: string | undefined): string | undefined {\n if (!color) return undefined;\n if (color === \"good\") return \"#2eb67d\";\n if (color === \"warning\") return \"#ecb22e\";\n if (color === \"danger\") return \"#e01e5a\";\n return color.startsWith(\"#\") ? color : `#${color}`;\n}\n","import { Blocks } from \"../Blocks\";\nimport { SurfaceScope, useLiveView } from \"../context\";\nimport type { ViewLike } from \"../payloads\";\n\nexport interface HomeTabView extends ViewLike {\n type: \"home\";\n}\n\nexport interface HomeTabProps {\n view: HomeTabView;\n}\n\n/** A Slack Home tab: just its blocks, laid out full width like Slack's App Home. */\nexport function HomeTab({ view: viewProp }: HomeTabProps) {\n // `views.publish` (or `views.update`) from an action swaps the content, as it would in Slack.\n const { view } = useLiveView(viewProp);\n\n return (\n <div className=\"sbk-root sbk-home\" data-surface=\"home\">\n <div className=\"sbk-home__menu\">\n <span className=\"sbk-home__tab\">\n <HomeIcon /> Home\n </span>\n </div>\n <div className=\"sbk-home__content\">\n <SurfaceScope container={{ type: \"view\", view }}>\n <Blocks blocks={view.blocks} />\n </SurfaceScope>\n </div>\n </div>\n );\n}\n\n/** A filled house with a small window, like the glyph on Slack's Home tab. */\nfunction HomeIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" aria-hidden>\n <path\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n d=\"M9.3 2.4a1.25 1.25 0 0 1 1.4 0l7 4.7a.75.75 0 0 1-.7 1.3v6.2c0 2.1-1.7 3.9-3.8 3.9H6.8C4.7 18.5 3 16.7 3 14.6V8.4a.75.75 0 0 1-.7-1.3zM11.5 10.5a.5.5 0 0 0-.5.5v1.5a.5.5 0 0 0 .5.5H13a.5.5 0 0 0 .5-.5V11a.5.5 0 0 0-.5-.5z\"\n />\n </svg>\n );\n}\n","import { HomeTab, type HomeTabView } from \"./HomeTab\";\nimport { Modal, type ModalView } from \"./Modal\";\n\nexport type AnyView = ModalView | HomeTabView;\n\nexport interface ViewProps {\n view: AnyView;\n /** App icon shown before the modal title. No effect on the Home tab (Slack doesn't show it there). */\n icon?: string;\n}\n\n/** Dispatches a Slack `view` payload (as from `views.open`/`views.publish`) to `<Modal>` or `<HomeTab>`. */\nexport function View({ view, icon }: ViewProps) {\n if (view.type === \"home\") return <HomeTab view={view} />;\n return <Modal view={view} icon={icon} />;\n}\n"],"mappings":"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W;CACX,IAAI;CACJ,WAAW;CACX,WAAW;CACX,WAAW;CACX,aAAa;CACb,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,IAAI;CACJ,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,IAAI;CACJ,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,IAAI;CACJ,WAAW;CACX,WAAW;CACX,IAAI;CACJ,IAAI;CACJ,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,IAAI;CACJ,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,IAAI;CACJ,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,IAAI;CACJ,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,IAAI;CACJ,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,IAAI;CACJ,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,MAAM;CACN,IAAI;CACJ,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,qBAAqB;CACrB,QAAQ;CACR,SAAS;CACT,OAAO;CACP,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;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,mCAAmC;EACjC;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,mCAAmC;EACjC;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,mCAAmC;EACjC;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,mCAAmC;EACjC;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,mCAAmC;EACjC;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,mCAAmC;EACjC;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,cAAc;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACxF,6BAA6B;EAC3B;EACA;EACA;EACA;EACA;CACF;CACA,6BAA6B;EAC3B;EACA;EACA;EACA;EACA;CACF;CACA,cAAc;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACxF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,cAAc;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACxF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,uCAAuC;EACrC;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,uCAAuC;EACrC;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,uCAAuC;EACrC;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,uCAAuC;EACrC;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,mCAAmC;EACjC;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,mCAAmC;EACjC;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,mCAAmC;EACjC;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CAC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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["SearchIcon","KebabIcon","LockIcon","Fragment","Fragment","ordinal","formatDate","ordinal","ordinal","formatTime","ICONS","KebabIcon","KebabIcon","Fragment","node","LockIcon","SearchIcon","HEIGHT","Fragment","TextLink","Fragment"],"sources":["../src/elements/Unsupported.tsx","../src/payloads.ts","../src/icons/index.tsx","../src/validation.ts","../src/surfaces/Modal.tsx","../src/surfaces/ModalLayer.tsx","../src/context.tsx","../src/useClientLayoutEffect.ts","../src/Tooltip.tsx","../src/emoji/aliases.ts","../src/emoji/data.generated.ts","../src/emoji/lookup.ts","../src/emoji/Emoji.tsx","../src/Link.tsx","../src/UserMention.tsx","../src/Mrkdwn.tsx","../src/Text.tsx","../src/confirm/ConfirmDialog.tsx","../src/confirm/useConfirm.tsx","../src/elements/Button.tsx","../src/elements/useFocusOnLoad.ts","../src/elements/Checkboxes.tsx","../src/elements/calendar/Calendar.tsx","../src/elements/dateFormat.ts","../src/elements/inputBlockContext.ts","../src/elements/Popover.tsx","../src/elements/DatePicker.tsx","../src/elements/DateTimePicker.tsx","../src/elements/FeedbackButtons.tsx","../src/elements/FileInput.tsx","../src/elements/IconButton.tsx","../src/elements/ImageElement.tsx","../src/elements/useMenuNavigation.ts","../src/elements/Overflow.tsx","../src/elements/RadioButtons.tsx","../src/elements/RichTextToolbar.tsx","../src/elements/RichTextInput.tsx","../src/elements/Select.tsx","../src/elements/TextInput.tsx","../src/elements/TimePicker.tsx","../src/elements/WorkflowButton.tsx","../src/elements/index.ts","../src/elements/Element.tsx","../src/blocks/Actions.tsx","../src/blocks/Alert.tsx","../src/blocks/Callout.tsx","../src/blocks/Card.tsx","../src/data/icons.tsx","../src/blocks/Carousel.tsx","../src/blocks/Condition.tsx","../src/blocks/containerContext.ts","../src/blocks/ContactCard.tsx","../src/data/Collapse.tsx","../src/blocks/Container.tsx","../src/blocks/Context.tsx","../src/blocks/ContextActions.tsx","../src/data/richTextMini.tsx","../src/data/dataTableCells.tsx","../src/blocks/DataTableColumnHeader.tsx","../src/blocks/DataTable.tsx","../src/charts/palette.ts","../src/charts/paths.ts","../src/charts/scale.ts","../src/charts/useContainerWidth.ts","../src/charts/CartesianChart.tsx","../src/charts/PieChart.tsx","../src/data/HoverActions.tsx","../src/blocks/DataVisualization.tsx","../src/blocks/Divider.tsx","../src/blocks/FallbackCanary.tsx","../src/blocks/File.tsx","../src/blocks/Header.tsx","../src/blocks/Image.tsx","../src/blocks/Input.tsx","../src/blocks/CodeBlock.tsx","../src/blocks/Markdown.tsx","../src/data/statusIcon.tsx","../src/blocks/Plan.tsx","../src/blocks/RichText.tsx","../src/blocks/Section.tsx","../src/blocks/Table.tsx","../src/blocks/TaskCard.tsx","../src/blocks/Video.tsx","../src/blocks/index.ts","../src/blocks/Block.tsx","../src/Blocks.tsx","../src/Message.tsx","../src/surfaces/HomeTab.tsx","../src/surfaces/View.tsx"],"sourcesContent":["/** Visible placeholder for a type this library doesn't render, so gaps are obvious in previews. */\nexport function Unsupported({ type }: { type: string }) {\n return (\n <span className=\"sbk-unsupported\" title=\"Not rendered yet\">\n {type}\n </span>\n );\n}\n","import type { AnyBlock } from \"@slack/types\";\nimport type { BlockAction, StateValues } from \"./context\";\n\n/**\n * Builders for the exact JSON Slack sends to an app's request URL: `block_actions`,\n * `view_submission` and `view_closed`. Shapes are cross-checked against `@slack/bolt`'s\n * `BlockAction`, `ViewSubmitAction` and `ViewClosedAction` types and Slack's documented examples.\n *\n * These are plain functions (no React) so `@nkootstra/block-kit/server` and tests can use\n * them without pulling in the renderer.\n */\n\nexport interface PayloadTeam {\n id: string;\n domain: string;\n enterprise_id?: string;\n enterprise_name?: string;\n}\n\nexport interface PayloadUser {\n id: string;\n username?: string;\n /** Only present for Home tab actions, per Slack's docs. */\n name?: string;\n team_id?: string;\n}\n\n/** Identity fields Slack stamps onto every payload. Defaulted so a demo/emulator works with no setup. */\nexport interface PayloadIdentity {\n team?: PayloadTeam | null;\n user?: PayloadUser;\n apiAppId?: string;\n token?: string;\n triggerId?: string;\n responseUrl?: string;\n /** Whether the app is installed org-wide on an Enterprise Grid org (`is_enterprise_install`). */\n isEnterpriseInstall?: boolean;\n}\n\nconst DEFAULT_IDENTITY = {\n team: { id: \"T00000000\", domain: \"workspace\" } as PayloadTeam | null,\n user: { id: \"U00000000\", username: \"user\", name: \"user\", team_id: \"T00000000\" } as PayloadUser,\n apiAppId: \"A00000000\",\n token: \"verification-token\",\n triggerId: \"000000000000.000000000000.deadbeefdeadbeefdeadbeefdeadbeef\",\n responseUrl:\n \"https://hooks.slack.com/actions/T00000000/0000000000000/deadbeefdeadbeefdeadbeefdeadbeef\",\n isEnterpriseInstall: false,\n};\n\ntype ResolvedIdentity = typeof DEFAULT_IDENTITY;\n\nfunction resolveIdentity(identity?: PayloadIdentity): ResolvedIdentity {\n return { ...DEFAULT_IDENTITY, ...identity };\n}\n\n/** The `message` surface's container: the message the block_actions/actions came from. */\nexport interface MessageContainer {\n type: \"message\";\n channelId?: string;\n messageTs: string;\n isEphemeral?: boolean;\n /** Raw message object, if available, sent back verbatim as payload.message. */\n message?: Record<string, unknown>;\n}\n\n/** A view as Slack would echo it back: enough fields to build view_submission/view_closed/block_actions. */\nexport interface ViewLike {\n /** Slack assigns this at `views.open` time; default to a placeholder id for standalone previews. */\n id?: string;\n type: \"modal\" | \"home\";\n callback_id?: string;\n private_metadata?: string;\n hash?: string;\n blocks: AnyBlock[];\n title?: { type: \"plain_text\"; text: string; emoji?: boolean } | null;\n close?: { type: \"plain_text\"; text: string; emoji?: boolean } | null;\n submit?: { type: \"plain_text\"; text: string; emoji?: boolean } | null;\n root_view_id?: string | null;\n previous_view_id?: string | null;\n clear_on_close?: boolean;\n notify_on_close?: boolean;\n external_id?: string;\n}\n\n/** The `modal`/`home` surface's container: the view the block_actions came from. */\nexport interface ViewContainer {\n type: \"view\";\n view: ViewLike;\n}\n\nexport type Container = MessageContainer | ViewContainer;\n\nfunction toViewOutput(view: ViewLike, state: StateValues, identity: ResolvedIdentity) {\n const viewId = view.id ?? \"V00000000\";\n return {\n id: viewId,\n team_id: identity.team?.id ?? \"\",\n app_installed_team_id: identity.team?.id ?? \"\",\n app_id: identity.apiAppId ?? null,\n bot_id: \"B00000000\",\n callback_id: view.callback_id ?? \"\",\n type: view.type,\n title: view.title ?? null,\n close: view.close ?? null,\n submit: view.submit ?? null,\n blocks: view.blocks,\n private_metadata: view.private_metadata ?? \"\",\n state: { values: state },\n hash: view.hash ?? \"0.0000000000\",\n clear_on_close: view.clear_on_close ?? false,\n notify_on_close: view.notify_on_close ?? false,\n root_view_id: view.root_view_id ?? viewId,\n previous_view_id: view.previous_view_id ?? null,\n external_id: view.external_id ?? \"\",\n };\n}\n\n/**\n * A text object as Slack echoes it back: `plain_text` gains `emoji: true` and `mrkdwn` gains\n * `verbatim: false` unless the app set them.\n */\nexport function normalizeText<T>(text: T): T {\n if (typeof text !== \"object\" || text === null) return text;\n const object = text as { type?: unknown; emoji?: unknown; verbatim?: unknown };\n if (object.type === \"plain_text\") return { ...text, emoji: object.emoji ?? true };\n if (object.type === \"mrkdwn\") return { ...text, verbatim: object.verbatim ?? false };\n return text;\n}\n\nfunction normalizeOption(option: unknown): unknown {\n if (typeof option !== \"object\" || option === null) return option;\n const { text, description } = option as { text?: unknown; description?: unknown };\n return {\n ...option,\n ...(text === undefined ? {} : { text: normalizeText(text) }),\n ...(description === undefined ? {} : { description: normalizeText(description) }),\n };\n}\n\n/** An action or state entry with every text object it echoes normalized like Slack's. */\nfunction normalizeEchoes<T extends Record<string, unknown>>(entry: T): T {\n const out: Record<string, unknown> = { ...entry };\n if (out.text !== undefined) out.text = normalizeText(out.text);\n if (out.placeholder !== undefined) out.placeholder = normalizeText(out.placeholder);\n if (out.selected_option) out.selected_option = normalizeOption(out.selected_option);\n if (Array.isArray(out.selected_options)) {\n out.selected_options = out.selected_options.map(normalizeOption);\n }\n if (typeof out.confirm === \"object\" && out.confirm !== null) {\n const confirm = { ...(out.confirm as Record<string, unknown>) };\n for (const key of [\"title\", \"text\", \"confirm\", \"deny\"]) {\n if (confirm[key] !== undefined) confirm[key] = normalizeText(confirm[key]);\n }\n out.confirm = confirm;\n }\n return out as T;\n}\n\nfunction normalizeState(state: StateValues): StateValues {\n return Object.fromEntries(\n Object.entries(state).map(([blockId, elements]) => [\n blockId,\n Object.fromEntries(\n Object.entries(elements).map(([actionId, value]) => [actionId, normalizeEchoes(value)]),\n ),\n ]),\n );\n}\n\nexport interface BuildBlockActionsPayloadOptions {\n action: BlockAction;\n state: StateValues;\n container: Container;\n identity?: PayloadIdentity;\n}\n\n/** The Enterprise Grid org a payload came from, as Slack names it. */\nexport interface PayloadEnterprise {\n id: string;\n name: string;\n}\n\ninterface BlockActionsPayloadBase {\n type: \"block_actions\";\n actions: BlockAction[];\n team: PayloadTeam | null;\n /** The team's Enterprise Grid org, or `null` outside one. */\n enterprise: PayloadEnterprise | null;\n is_enterprise_install: boolean;\n user: PayloadUser;\n token?: string;\n response_url?: string;\n trigger_id?: string;\n api_app_id?: string;\n}\n\nexport interface MessageBlockActionsPayload extends BlockActionsPayloadBase {\n channel?: { id: string; name: string };\n message: Record<string, unknown>;\n state: { values: StateValues };\n container: {\n type: \"message\";\n message_ts: string;\n channel_id?: string;\n is_ephemeral: boolean;\n };\n}\n\nexport interface ViewBlockActionsPayload extends BlockActionsPayloadBase {\n view: ReturnType<typeof toViewOutput>;\n container: { type: \"view\"; view_id: string };\n}\n\nexport type BlockActionsPayload = MessageBlockActionsPayload | ViewBlockActionsPayload;\n\n/** Slack's `block_actions` payload, for either a message's or a view's interactive elements. */\nexport function buildBlockActionsPayload(\n options: BuildBlockActionsPayloadOptions & { container: MessageContainer },\n): MessageBlockActionsPayload;\nexport function buildBlockActionsPayload(\n options: BuildBlockActionsPayloadOptions & { container: ViewContainer },\n): ViewBlockActionsPayload;\nexport function buildBlockActionsPayload(\n options: BuildBlockActionsPayloadOptions,\n): BlockActionsPayload;\nexport function buildBlockActionsPayload({\n action,\n state,\n container,\n identity,\n}: BuildBlockActionsPayloadOptions): BlockActionsPayload {\n const id = resolveIdentity(identity);\n state = normalizeState(state);\n const base = {\n type: \"block_actions\" as const,\n actions: [normalizeEchoes(action)],\n team: id.team,\n enterprise: id.team?.enterprise_id\n ? { id: id.team.enterprise_id, name: id.team.enterprise_name ?? \"\" }\n : null,\n is_enterprise_install: id.isEnterpriseInstall,\n user: id.user,\n token: id.token,\n response_url: id.responseUrl,\n trigger_id: id.triggerId,\n api_app_id: id.apiAppId,\n };\n\n if (container.type === \"message\") {\n return {\n ...base,\n channel: container.channelId ? { id: container.channelId, name: \"\" } : undefined,\n message: container.message ?? { type: \"message\", ts: container.messageTs },\n state: { values: state },\n container: {\n type: \"message\" as const,\n message_ts: container.messageTs,\n channel_id: container.channelId,\n is_ephemeral: container.isEphemeral ?? false,\n },\n };\n }\n\n return {\n ...base,\n view: toViewOutput(container.view, state, id),\n container: { type: \"view\" as const, view_id: container.view.id ?? \"V00000000\" },\n };\n}\n\nexport interface BuildViewSubmissionPayloadOptions {\n view: ViewLike;\n state: StateValues;\n identity?: PayloadIdentity;\n responseUrls?: Array<{\n block_id: string;\n action_id: string;\n channel_id: string;\n response_url: string;\n }>;\n}\n\n/** Slack's `view_submission` payload, sent when the modal's Submit button is pressed. */\nexport function buildViewSubmissionPayload({\n view,\n state,\n identity,\n responseUrls,\n}: BuildViewSubmissionPayloadOptions) {\n const id = resolveIdentity(identity);\n return {\n type: \"view_submission\" as const,\n team: id.team,\n user: {\n id: id.user.id,\n name: id.user.name ?? id.user.username ?? \"\",\n team_id: id.user.team_id,\n },\n api_app_id: id.apiAppId,\n token: id.token,\n trigger_id: id.triggerId,\n view: toViewOutput(view, state, id),\n response_urls: responseUrls ?? [],\n };\n}\n\nexport interface BuildViewClosedPayloadOptions {\n view: ViewLike;\n state: StateValues;\n identity?: PayloadIdentity;\n /** True when Slack cleared the whole view stack (vs. just closing the top view). */\n isCleared?: boolean;\n}\n\n/** Slack's `view_closed` payload, sent when the modal's close (X) button is pressed. */\nexport function buildViewClosedPayload({\n view,\n state,\n identity,\n isCleared,\n}: BuildViewClosedPayloadOptions) {\n const id = resolveIdentity(identity);\n return {\n type: \"view_closed\" as const,\n team: id.team,\n user: {\n id: id.user.id,\n name: id.user.name ?? id.user.username ?? \"\",\n team_id: id.user.team_id,\n },\n api_app_id: id.apiAppId,\n token: id.token,\n view: toViewOutput(view, state, id),\n is_cleared: isCleared ?? false,\n };\n}\n\n/** The subset of `ack()` response actions a modal reacts to: validation errors, or view navigation. */\nexport type ViewResponseAction =\n | { response_action: \"errors\"; errors: Record<string, string> }\n | { response_action: \"update\"; view: ViewLike }\n | { response_action: \"push\"; view: ViewLike }\n | { response_action: \"clear\" };\n\n/** A static/external select option, as returned to a `block_suggestion` request. */\nexport interface SuggestionOption {\n text: { type: \"plain_text\"; text: string; emoji?: boolean };\n value: string;\n description?: { type: \"plain_text\"; text: string; emoji?: boolean };\n url?: string;\n}\n\n/** What an app answers a `block_suggestion` request with: flat options or labelled groups. */\nexport type OptionsResponse =\n | { options: SuggestionOption[] }\n | {\n option_groups: Array<{\n label: { type: \"plain_text\"; text: string; emoji?: boolean };\n options: SuggestionOption[];\n }>;\n };\n\nexport interface BuildBlockSuggestionPayloadOptions {\n actionId: string;\n blockId: string;\n /** What the user has typed into the select's search box so far. */\n value: string;\n container: Container;\n state: StateValues;\n identity?: PayloadIdentity;\n}\n\n/** Slack's `block_suggestion` payload, sent while the user types into an `external_select`. */\nexport function buildBlockSuggestionPayload({\n actionId,\n blockId,\n value,\n container,\n state,\n identity,\n}: BuildBlockSuggestionPayloadOptions) {\n const id = resolveIdentity(identity);\n const base = {\n type: \"block_suggestion\" as const,\n user: id.user,\n api_app_id: id.apiAppId,\n token: id.token,\n action_id: actionId,\n block_id: blockId,\n value,\n team: id.team,\n };\n\n if (container.type === \"message\") {\n return {\n ...base,\n container: {\n type: \"message\" as const,\n message_ts: container.messageTs,\n channel_id: container.channelId,\n is_ephemeral: container.isEphemeral ?? false,\n },\n channel: container.channelId ? { id: container.channelId, name: \"\" } : undefined,\n message: container.message ?? { type: \"message\", ts: container.messageTs },\n };\n }\n\n return {\n ...base,\n container: { type: \"view\" as const, view_id: container.view.id ?? \"V00000000\" },\n view: toViewOutput(container.view, state, id),\n };\n}\n\nexport type BlockSuggestionPayload = ReturnType<typeof buildBlockSuggestionPayload>;\n","/**\n * Inline SVG icons approximating Slack's \"Slack v2\" icon font glyphs. We can't ship the icon\n * font, so these are hand-drawn strokes matched to the reference snapshots' `<path>` bounding\n * boxes (20x20 viewBox, ~9x5 chevron, 13x13 glyphs) rather than a generic icon set.\n */\nimport type { SVGProps } from \"react\";\n\nexport function ChevronDownIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg viewBox=\"0 0 20 20\" width=\"20\" height=\"20\" fill=\"none\" aria-hidden=\"true\" {...props}>\n <path\n d=\"M6.25 8L10 11.75L13.75 8\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\n/**\n * Slack's calendar, traced from its icon font's `calendar` glyph (2000 units to the em, 1700 above\n * the baseline), so it lands in a square box exactly where the glyph sits in an em.\n */\nexport function CalendarIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg viewBox=\"0 0 2000 2000\" width=\"20\" height=\"20\" aria-hidden=\"true\" {...props}>\n <path\n transform=\"matrix(1 0 0 -1 0 1700)\"\n fill=\"currentColor\"\n d=\"M350 1600C212 1600 100 1487 100 1349V51C100 -87 212 -200 350 -200H1649C1787 -200 1900 -87 1900 51V1349C1900 1487 1787 1600 1649 1600ZM1649 1450C1705 1450 1750 1405 1750 1349V1200H250V1349C250 1405 295 1450 350 1450ZM350 -50C295 -50 250 -5 250 51V1050H1750V51C1750 -5 1705 -50 1649 -50ZM1001 900C945 900 901 855 901 800C901 744 945 700 1001 700C1056 700 1101 745 1101 800C1101 856 1056 900 1001 900ZM1401 900C1345 900 1301 855 1301 800C1301 744 1345 700 1401 700C1456 700 1501 745 1501 800C1501 856 1456 900 1401 900ZM601 600C545 600 501 555 501 500C501 444 545 400 601 400C656 400 701 445 701 500C701 556 656 600 601 600ZM1001 600C945 600 901 555 901 500C901 444 945 400 1001 400C1056 400 1101 445 1101 500C1101 556 1056 600 1001 600ZM1401 600C1345 600 1301 555 1301 500C1301 444 1345 400 1401 400C1456 400 1501 445 1501 500C1501 556 1456 600 1401 600ZM601 300C545 300 501 255 501 200C501 144 545 100 601 100C656 100 701 145 701 200C701 256 656 300 601 300ZM1001 300C945 300 901 255 901 200C901 144 945 100 1001 100C1056 100 1101 145 1101 200C1101 256 1056 300 1001 300ZM1401 300C1345 300 1301 255 1301 200C1301 144 1345 100 1401 100C1456 100 1501 145 1501 200C1501 256 1456 300 1401 300Z\"\n />\n </svg>\n );\n}\n\n/** Slack's clock: a full-size 1.5-stroke ring with an L-shaped hand pointing at three o'clock. */\nexport function ClockIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg viewBox=\"0 0 20 20\" width=\"20\" height=\"20\" fill=\"none\" aria-hidden=\"true\" {...props}>\n <circle cx=\"10\" cy=\"10\" r=\"8.25\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path\n d=\"M9.75 5.75V10.25H13.75\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nexport function SearchIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg viewBox=\"0 0 20 20\" width=\"16\" height=\"16\" fill=\"none\" aria-hidden=\"true\" {...props}>\n <circle cx=\"8.5\" cy=\"8.5\" r=\"5\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M12.5 12.5L16 16\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n );\n}\n\nexport function CheckIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg viewBox=\"0 0 14 14\" width=\"14\" height=\"14\" fill=\"none\" aria-hidden=\"true\" {...props}>\n <path\n d=\"M2.5 7.2L5.3 10L11.5 3.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\n/** Slack's `trash` glyph. */\nexport function TrashIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg viewBox=\"0 0 20 20\" width=\"16\" height=\"16\" aria-hidden=\"true\" {...props}>\n <path\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M8.75 1A2.25 2.25 0 0 0 6.5 3.25v.25H4.25A2.25 2.25 0 0 0 2 5.75v1.5c0 .414.336.75.75.75h.75v8.25a2.25 2.25 0 0 0 2.25 2.25h8.5a2.25 2.25 0 0 0 2.25-2.25V8h.75a.75.75 0 0 0 .75-.75v-1.5a2.25 2.25 0 0 0-2.25-2.25H13.5v-.25A2.25 2.25 0 0 0 11.25 1zM12 3.5v-.25a.75.75 0 0 0-.75-.75h-2.5a.75.75 0 0 0-.75.75v.25zM7.25 5h-3a.75.75 0 0 0-.75.75v.75h13v-.75a.75.75 0 0 0-.75-.75zM5 8h10v8.25a.75.75 0 0 1-.75.75h-8.5a.75.75 0 0 1-.75-.75zm3.25 1.5a.75.75 0 0 1 .75.75v4.5a.75.75 0 0 1-1.5 0v-4.5a.75.75 0 0 1 .75-.75m4.25.75a.75.75 0 0 0-1.5 0v4.5a.75.75 0 0 0 1.5 0z\"\n />\n </svg>\n );\n}\n\n/** Slack's `thumbs-up` glyph. */\nexport function ThumbsUpIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg viewBox=\"0 0 20 20\" width=\"16\" height=\"16\" aria-hidden=\"true\" {...props}>\n <path\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M10.457 3.036a.903.903 0 0 1 1.69.626l-.362 1.205-.996 2.987a.75.75 0 0 0 .825.978l3.644-.559a1.25 1.25 0 0 1 1.413 1.493l-.861 4.092a3.25 3.25 0 0 1-2.543 2.518l-.057.011a11.3 11.3 0 0 1-4.42-.001l-2.04-.41V7.951l.14-.111a11.7 11.7 0 0 0 3.377-4.377zM6.043 6.595a10.2 10.2 0 0 0 2.854-3.742l.19-.427a2.403 2.403 0 0 1 4.496 1.667l-.365 1.216-.007.022-.61 1.832 2.43-.373a2.75 2.75 0 0 1 3.108 3.285l-.862 4.092a4.75 4.75 0 0 1-3.716 3.68l-.057.01a12.8 12.8 0 0 1-5.008 0l-1.763-.354a.75.75 0 0 1-.733.59H3.653A2.653 2.653 0 0 1 1 15.442V7.344a.75.75 0 0 1 .75-.75H6zM5.25 8.094v8.5H3.653A1.153 1.153 0 0 1 2.5 15.44V8.094z\"\n />\n </svg>\n );\n}\n\n/** Slack's `thumbs-down` glyph. */\nexport function ThumbsDownIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg viewBox=\"0 0 20 20\" width=\"16\" height=\"16\" aria-hidden=\"true\" {...props}>\n <path\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M10.957 16.57a.903.903 0 0 0 1.69-.627l-.362-1.205-.996-2.986a.75.75 0 0 1 .825-.979l3.644.56a1.25 1.25 0 0 0 1.413-1.494l-.861-4.092a3.25 3.25 0 0 0-2.543-2.517l-.057-.012a11.3 11.3 0 0 0-4.42.002l-2.04.41v8.024l.14.112a11.7 11.7 0 0 1 3.377 4.377zm-4.414-3.56a10.2 10.2 0 0 1 2.854 3.742l.19.427a2.403 2.403 0 0 0 4.496-1.667l-.365-1.216-.007-.022-.61-1.832 2.43.373a2.75 2.75 0 0 0 3.108-3.285l-.862-4.092a4.75 4.75 0 0 0-3.716-3.679l-.057-.011a12.8 12.8 0 0 0-5.008.001l-1.763.354a.75.75 0 0 0-.733-.591H4.153A2.653 2.653 0 0 0 1.5 4.165v8.097a.75.75 0 0 0 .75.75H6.5q.022 0 .043-.002m-.793-1.498v-8.5H4.153C3.516 3.012 3 3.528 3 4.165v7.347z\"\n />\n </svg>\n );\n}\n\nexport function KebabIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg\n viewBox=\"0 0 20 20\"\n width=\"13\"\n height=\"13\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n {...props}\n >\n <circle cx=\"4\" cy=\"10\" r=\"1.7\" />\n <circle cx=\"10\" cy=\"10\" r=\"1.7\" />\n <circle cx=\"16\" cy=\"10\" r=\"1.7\" />\n </svg>\n );\n}\n\n/** Slack's `file-upload` glyph (document with an up arrow), used by file_input. */\nexport function FileUploadIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg viewBox=\"0 0 20 20\" width=\"16\" height=\"16\" aria-hidden=\"true\" {...props}>\n <path\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M6.25 1.5A3.75 3.75 0 0 0 2.5 5.25v5a.75.75 0 0 0 1.5 0v-5A2.25 2.25 0 0 1 6.25 3h6.5c.393 0 .764.185 1 .5l2 2.667c.162.216.25.48.25.75v7.833A2.25 2.25 0 0 1 13.75 17h-4a.75.75 0 0 0 0 1.5h4a3.75 3.75 0 0 0 3.75-3.75V6.917a2.75 2.75 0 0 0-.55-1.65l-2-2.667a2.75 2.75 0 0 0-2.2-1.1zm6.25 3.25a.75.75 0 0 0-1.5 0v2.5c0 .414.336.75.75.75h2.5a.75.75 0 0 0 0-1.5H12.5zm-8 9.81v3.19a.75.75 0 0 0 1.5 0v-3.19l1.22 1.22a.75.75 0 0 0 1.06-1.06l-2.5-2.5a.75.75 0 0 0-1.06 0l-2.5 2.5a.75.75 0 1 0 1.06 1.06z\"\n />\n </svg>\n );\n}\n\nexport function ExternalLinkIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg viewBox=\"0 0 20 20\" width=\"13\" height=\"13\" fill=\"none\" aria-hidden=\"true\" {...props}>\n <path\n d=\"M8 5H5.5C4.7 5 4 5.7 4 6.5V14.5C4 15.3 4.7 16 5.5 16H13.5C14.3 16 15 15.3 15 14.5V12\"\n stroke=\"currentColor\"\n strokeWidth=\"1.3\"\n />\n <path\n d=\"M11 4H16V9M16 4L9 11\"\n stroke=\"currentColor\"\n strokeWidth=\"1.3\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nexport function LockIcon(props: SVGProps<SVGSVGElement>) {\n // Slack's lock on its 20-unit grid: a 1.5-stroke body with a 3.75-radius shackle.\n return (\n <svg viewBox=\"0 0 20 20\" width=\"13\" height=\"13\" fill=\"none\" aria-hidden=\"true\" {...props}>\n <rect\n x=\"3.75\"\n y=\"8.25\"\n width=\"12.5\"\n height=\"9\"\n rx=\"1.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n />\n <path d=\"M6.25 8.25V6a3.75 3.75 0 0 1 7.5 0v2.25\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n </svg>\n );\n}\n\nexport function ChannelHashIcon(props: SVGProps<SVGSVGElement>) {\n // Slack's channel \"#\": two bars and two slashes leaning 10 degrees, all 1.5 wide.\n return (\n <svg viewBox=\"0 0 20 20\" width=\"18\" height=\"18\" fill=\"none\" aria-hidden=\"true\" {...props}>\n <path\n d=\"M9 2.75L6.5 17.25M13.75 2.75L11.25 17.25M3.75 6.75H16.25M2.75 13.75H15.25\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n\n/** Slack's `close` icon, its filled path as Slack ships it. */\nexport function CloseIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg viewBox=\"0 0 20 20\" width=\"18\" height=\"18\" aria-hidden=\"true\" {...props}>\n <path\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M16.53 3.47a.75.75 0 0 1 0 1.06L11.06 10l5.47 5.47a.75.75 0 0 1-1.06 1.06L10 11.06l-5.47 5.47a.75.75 0 0 1-1.06-1.06L8.94 10 3.47 4.53a.75.75 0 0 1 1.06-1.06L10 8.94l5.47-5.47a.75.75 0 0 1 1.06 0\"\n />\n </svg>\n );\n}\n\nexport function EmailIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg viewBox=\"0 0 20 20\" width=\"14\" height=\"14\" fill=\"none\" aria-hidden=\"true\" {...props}>\n <rect x=\"2.5\" y=\"5\" width=\"15\" height=\"10\" rx=\"1.5\" stroke=\"currentColor\" strokeWidth=\"1.4\" />\n <path\n d=\"M3.2 5.8L10 11L16.8 5.8\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nexport function LinkGlyphIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg viewBox=\"0 0 20 20\" width=\"14\" height=\"14\" fill=\"none\" aria-hidden=\"true\" {...props}>\n <path d=\"M8.5 11.5L11.5 8.5\" stroke=\"currentColor\" strokeWidth=\"1.4\" strokeLinecap=\"round\" />\n <path\n d=\"M9.5 6.5L11 5C12.4 3.6 14.6 3.6 16 5V5C17.4 6.4 17.4 8.6 16 10L14.5 11.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n />\n <path\n d=\"M10.5 13.5L9 15C7.6 16.4 5.4 16.4 4 15V15C2.6 13.6 2.6 11.4 4 10L5.5 8.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n\nexport function ReturnIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg viewBox=\"0 0 20 20\" width=\"12\" height=\"12\" fill=\"none\" aria-hidden=\"true\" {...props}>\n <path\n d=\"M4 8.5V10.5C4 11.6 4.9 12.5 6 12.5H15M15 12.5L11.5 9.5M15 12.5L11.5 15.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nexport function WorkflowIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg viewBox=\"0 0 20 20\" width=\"14\" height=\"14\" fill=\"none\" aria-hidden=\"true\" {...props}>\n <rect x=\"2.5\" y=\"8.5\" width=\"4\" height=\"4\" rx=\"1\" stroke=\"currentColor\" strokeWidth=\"1.3\" />\n <rect x=\"13.5\" y=\"8.5\" width=\"4\" height=\"4\" rx=\"1\" stroke=\"currentColor\" strokeWidth=\"1.3\" />\n <path\n d=\"M6.5 10.5H8.5C9.6 10.5 10.4 9.7 10.4 8.6V5.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.3\"\n />\n <path\n d=\"M6.5 10.5H8.5C9.6 10.5 10.4 11.3 10.4 12.4V15.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.3\"\n />\n <circle cx=\"10.5\" cy=\"3.5\" r=\"1.7\" stroke=\"currentColor\" strokeWidth=\"1.3\" />\n </svg>\n );\n}\n\n/** Slack's `download` glyph (cloud with a down arrow), from the table action group. */\nexport function DownloadIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg viewBox=\"0 0 20 20\" width=\"18\" height=\"18\" aria-hidden=\"true\" {...props}>\n <path\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n d=\"M11.75 4a3.75 3.75 0 0 0-3.512 2.432.75.75 0 0 1-.941.447 2.5 2.5 0 0 0-2.937 3.664.75.75 0 0 1-.384 1.093A2.251 2.251 0 0 0 4.75 16h9.5a3.25 3.25 0 0 0 1.44-6.164.75.75 0 0 1-.379-.908A3.75 3.75 0 0 0 11.75 4M7.108 5.296a5.25 5.25 0 0 1 9.786 3.508A4.75 4.75 0 0 1 14.25 17.5h-9.5a3.75 3.75 0 0 1-2.02-6.91 4 4 0 0 1 4.378-5.294M10.25 7.5a.75.75 0 0 1 .75.75v3.69l1.22-1.22a.75.75 0 1 1 1.06 1.06l-2.5 2.5a.75.75 0 0 1-1.06 0l-2.5-2.5a.75.75 0 1 1 1.06-1.06l1.22 1.22V8.25a.75.75 0 0 1 .75-.75\"\n clipRule=\"evenodd\"\n />\n </svg>\n );\n}\n\n/** Slack's `copy` glyph (two stacked squares). */\nexport function CopyIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg viewBox=\"0 0 20 20\" width=\"18\" height=\"18\" aria-hidden=\"true\" {...props}>\n <path\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n d=\"M7.75 1.5A2.25 2.25 0 0 0 5.5 3.75v8.5a2.25 2.25 0 0 0 2.25 2.25h8.5a2.25 2.25 0 0 0 2.25-2.25v-8.5a2.25 2.25 0 0 0-2.25-2.25zM7 3.75A.75.75 0 0 1 7.75 3h8.5a.75.75 0 0 1 .75.75v8.5a.75.75 0 0 1-.75.75h-8.5a.75.75 0 0 1-.75-.75zM3.75 5.5A2.25 2.25 0 0 0 1.5 7.75v8.5a2.25 2.25 0 0 0 2.25 2.25h8.5a2.25 2.25 0 0 0 2.25-2.25V16H13v.25a.75.75 0 0 1-.75.75h-8.5a.75.75 0 0 1-.75-.75v-8.5A.75.75 0 0 1 3.75 7H4V5.5z\"\n clipRule=\"evenodd\"\n />\n </svg>\n );\n}\n\n/** Slack's `open-in-window` glyph, from the image action group. */\nexport function OpenInWindowIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg viewBox=\"0 0 20 20\" width=\"20\" height=\"20\" aria-hidden=\"true\" {...props}>\n <path\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n d=\"M2.5 8.507C2.5 7.675 3.175 7 4.007 7H5.5v.793l-3 3zm3 2.949V9.207l-3 3v2.586l3.017-3.017a3 3 0 0 1-.017-.32m-2.982 4.733 3.326-3.326q.055.105.117.205a3.06 3.06 0 0 0 1.167 1.097l-3.317 3.318a1.550 1.550 0 0 1-1.293-1.294M5.207 17.5l3-3q.171.02.35.02h2.216l-2.980 2.980zm4 0h2.250c.852 0 1.543-.691 1.543-1.544v-1.435h-.813zm5.293-3v1.456A3.044 3.044 0 0 1 11.456 19H4.044A3.044 3.044 0 0 1 1 15.956v-7.45A3.007 3.007 0 0 1 4.007 5.5H5.5V4.044A3.044 3.044 0 0 1 8.544 1h7.412A3.044 3.044 0 0 1 19 4.044v7.412a3.044 3.044 0 0 1-3.044 3.044zm-7.263-2.222c.273.434.757.722 1.307.722h7.412c.852 0 1.544-.691 1.544-1.544V4.044c0-.853-.692-1.544-1.544-1.544H8.544C7.690 2.5 7 3.191 7 4.044v2.760q.013.096.013.196v4.477c0 .293.082.568.224.801m3.337-6.396a.75.75 0 0 1 0-1.500h4.266a.75.75 0 0 1 .75.75v4.266a.75.75 0 0 1-1.500 0V6.911l-3.443 3.443a.75.75 0 1 1-1.060-1.060l3.410-3.412z\"\n clipRule=\"evenodd\"\n />\n </svg>\n );\n}\n\n/** Slack's `ellipsis-vertical-filled` glyph (\"More actions\"). */\nexport function EllipsisVerticalIcon(props: SVGProps<SVGSVGElement>) {\n return (\n <svg viewBox=\"0 0 20 20\" width=\"18\" height=\"18\" aria-hidden=\"true\" {...props}>\n <path\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n d=\"M10 5.5A1.75 1.75 0 1 1 10 2a1.75 1.75 0 0 1 0 3.5m0 6.25a1.75 1.75 0 1 1 0-3.5 1.75 1.75 0 0 1 0 3.5m-1.75 4.5a1.75 1.75 0 1 0 3.5 0 1.75 1.75 0 0 0-3.5 0\"\n clipRule=\"evenodd\"\n />\n </svg>\n );\n}\n","import type { ElementState, StateValues } from \"./context\";\nimport type { Json } from \"./types\";\n\n/**\n * The checks Slack's client runs on a modal before it sends `view_submission`: required inputs,\n * text length, number format/range, and email/URL format. A failing field shows its message under\n * the input and the submission never reaches the app.\n *\n * Slack doesn't document the exact wording; these follow its client's phrasing as closely as we\n * know it and live here so they can be adjusted in one place.\n */\nexport const VALIDATION_MESSAGES = {\n required: \"Please complete this required field.\",\n minLength: (n: number) => `Please enter at least ${n} character${n === 1 ? \"\" : \"s\"}.`,\n maxLength: (n: number) => `Please enter no more than ${n} character${n === 1 ? \"\" : \"s\"}.`,\n number: \"Please enter a number.\",\n wholeNumber: \"Please enter a whole number.\",\n minValue: (min: string) => `Please enter a number greater than or equal to ${min}.`,\n maxValue: (max: string) => `Please enter a number less than or equal to ${max}.`,\n email: \"Please enter a valid email address.\",\n url: \"Please enter a valid URL.\",\n};\n\n/** Same rule as `<input type=\"email\">`: something@something, no spaces. */\nconst EMAIL = /^[^\\s@]+@[^\\s@]+$/;\n\n/** Whether a rich_text value holds any non-blank text, or anything that isn't text (a mention, emoji…). */\nfunction hasText(node: unknown): boolean {\n if (!node || typeof node !== \"object\") return false;\n const { type, text, elements } = node as Json;\n if (type === \"text\") return typeof text === \"string\" && text.trim() !== \"\";\n if (Array.isArray(elements)) return elements.some(hasText);\n return type !== \"rich_text\" && !String(type).startsWith(\"rich_text_\");\n}\n\nfunction isEmpty(state: ElementState | undefined): boolean {\n if (!state) return true;\n return Object.entries(state).every(([key, value]) => {\n if (key === \"type\") return true;\n if (value === null || value === undefined || value === \"\") return true;\n if (Array.isArray(value)) return value.length === 0;\n // rich_text_input: a rich_text block whose sections hold no text at all.\n if (typeof value === \"object\" && (value as Json).type === \"rich_text\") {\n return !hasText(value);\n }\n return false;\n });\n}\n\nfunction isUrl(value: string): boolean {\n try {\n const url = new URL(value);\n return url.protocol === \"http:\" || url.protocol === \"https:\";\n } catch {\n return false;\n }\n}\n\nfunction checkValue(element: Json, value: string): string | undefined {\n switch (element.type) {\n case \"plain_text_input\": {\n if (typeof element.min_length === \"number\" && value.length < element.min_length) {\n return VALIDATION_MESSAGES.minLength(element.min_length);\n }\n if (typeof element.max_length === \"number\" && value.length > element.max_length) {\n return VALIDATION_MESSAGES.maxLength(element.max_length);\n }\n return undefined;\n }\n case \"email_text_input\":\n return EMAIL.test(value) ? undefined : VALIDATION_MESSAGES.email;\n case \"url_text_input\":\n return isUrl(value) ? undefined : VALIDATION_MESSAGES.url;\n case \"number_input\": {\n const n = Number(value);\n if (value.trim() === \"\" || Number.isNaN(n)) return VALIDATION_MESSAGES.number;\n if (!element.is_decimal_allowed && !Number.isInteger(n)) {\n return VALIDATION_MESSAGES.wholeNumber;\n }\n if (element.min_value !== undefined && n < Number(element.min_value)) {\n return VALIDATION_MESSAGES.minValue(String(element.min_value));\n }\n if (element.max_value !== undefined && n > Number(element.max_value)) {\n return VALIDATION_MESSAGES.maxValue(String(element.max_value));\n }\n return undefined;\n }\n default:\n return undefined;\n }\n}\n\n/**\n * Validates a view's `input` blocks against `state.values` the way Slack's client does before a\n * submission. Returns errors keyed by block_id (the shape of `response_action: \"errors\"`); empty\n * when the view may be submitted.\n */\nexport function validateView(\n blocks: readonly Json[] | readonly unknown[],\n state: StateValues,\n): Record<string, string> {\n const errors: Record<string, string> = {};\n (blocks as Json[]).forEach((block, index) => {\n if (block.type !== \"input\" || !block.element) return;\n const blockId = typeof block.block_id === \"string\" ? block.block_id : `block-${index}`;\n const element = block.element as Json;\n const entry = state[blockId]?.[(element.action_id as string | undefined) ?? \"\"];\n\n if (isEmpty(entry)) {\n if (!block.optional) errors[blockId] = VALIDATION_MESSAGES.required;\n return;\n }\n const value = entry?.value;\n if (typeof value === \"string\") {\n const error = checkValue(element, value);\n if (error) errors[blockId] = error;\n }\n });\n return errors;\n}\n","import { useState } from \"react\";\nimport { Blocks } from \"../Blocks\";\nimport { CloseIcon } from \"../icons\";\nimport {\n type StateValues,\n type SubmitResult,\n SurfaceScope,\n useBlockKit,\n useLiveView,\n} from \"../context\";\nimport { buildViewClosedPayload, buildViewSubmissionPayload, type ViewLike } from \"../payloads\";\nimport { validateView } from \"../validation\";\n\nexport interface ModalView extends ViewLike {\n type: \"modal\";\n}\n\nexport interface ModalProps {\n view: ModalView;\n /** App icon shown before the title, as in Slack's own modal chrome. */\n icon?: string;\n}\n\n/** A Slack modal: header (icon + title + close), a scrollable body of blocks, and a close/submit footer. */\nexport function Modal({ view: viewProp, icon }: ModalProps) {\n const { state, identity, onSubmit, onClose, views, stackedView, respond } = useBlockKit();\n // A modal opened through `views`: the X closes the whole stack (Slack's `is_cleared`), the\n // footer's close button goes back one view, and Submit applies the app's `response_action`.\n // Any other modal is standalone: `views.update` can still swap its content.\n const stacked = stackedView?.view.id === viewProp.id && viewProp.id !== undefined;\n const { view, update } = useLiveView(viewProp, !stacked);\n const [appErrors, setAppErrors] = useState<Record<string, string>>({});\n // Slack's own pre-submit checks. An error hides once its field changes.\n const [checked, setChecked] = useState<{ errors: Record<string, string>; state: StateValues }>();\n const clientErrors = Object.fromEntries(\n Object.entries(checked?.errors ?? {}).filter(([id]) => state[id] === checked?.state[id]),\n );\n const errors = stacked ? clientErrors : { ...appErrors, ...clientErrors };\n\n // Stacked modals are an app's own views, so they report `view_closed` only when it asked to\n // (`notify_on_close`), as Slack does. A standalone modal always reports it: its host needs to\n // know to hide it.\n const notify = !stacked || view.notify_on_close === true;\n const dismiss = () => {\n const isCleared = stacked && view.previous_view_id != null;\n if (notify) onClose?.(buildViewClosedPayload({ view, state, identity, isCleared }));\n if (stacked) views.clear();\n };\n const back = () => {\n if (notify) onClose?.(buildViewClosedPayload({ view, state, identity }));\n if (stacked && view.id) respond?.(view.id, undefined);\n };\n const submit = async () => {\n const invalid = validateView(view.blocks, state);\n setChecked({ errors: invalid, state });\n if (Object.keys(invalid).length > 0) return;\n\n setAppErrors({});\n let result: SubmitResult;\n try {\n result = await onSubmit?.(buildViewSubmissionPayload({ view, state, identity }), { views });\n } catch {\n // The app couldn't be reached or failed: like Slack, leave the modal open to retry.\n return;\n }\n if (stacked && view.id) {\n respond?.(view.id, result);\n return;\n }\n if (!result) return;\n if (result.response_action === \"errors\") setAppErrors(result.errors);\n else if (result.response_action === \"update\") update(result.view);\n else if (result.response_action === \"push\") views.push(result.view);\n else if (result.response_action === \"clear\") views.clear();\n };\n\n return (\n <div className=\"sbk-root sbk-modal\" data-surface=\"modal\">\n <div className=\"sbk-modal__header\">\n <div className=\"sbk-modal__title-row\">\n {icon && <img className=\"sbk-modal__icon\" src={icon} alt=\"\" />}\n <h2 className=\"sbk-modal__title\">{view.title?.text}</h2>\n </div>\n <button type=\"button\" className=\"sbk-modal__close\" aria-label=\"Close\" onClick={dismiss}>\n <CloseIcon width=\"20\" height=\"20\" />\n </button>\n </div>\n <div className=\"sbk-modal__body\">\n <SurfaceScope container={{ type: \"view\", view }} errors={errors}>\n <Blocks blocks={view.blocks} />\n </SurfaceScope>\n </div>\n {(view.close || view.submit) && (\n <div className=\"sbk-modal__footer\">\n {view.close && (\n <button\n type=\"button\"\n className=\"sbk-modal__button sbk-modal__button--secondary\"\n onClick={back}\n >\n {view.close.text}\n </button>\n )}\n {view.submit && (\n <button\n type=\"button\"\n className=\"sbk-modal__button sbk-modal__button--primary\"\n onClick={submit}\n >\n {view.submit.text}\n </button>\n )}\n </div>\n )}\n </div>\n );\n}\n","import type { ReactNode } from \"react\";\nimport type { StackedView } from \"../context\";\n\nexport interface ModalLayerProps {\n stack: StackedView[];\n renderEntry: (entry: StackedView) => ReactNode;\n}\n\n/**\n * The dimmed overlay that modals opened through `views` sit on. Every view in the stack stays\n * mounted (only the top one is shown) so going back after a push keeps the earlier view's input.\n */\nexport function ModalLayer({ stack, renderEntry }: ModalLayerProps) {\n return (\n <div className=\"sbk-modal-layer\">\n {stack.map((entry, i) => (\n <div key={entry.view.id} className=\"sbk-modal-layer__view\" hidden={i !== stack.length - 1}>\n {renderEntry(entry)}\n </div>\n ))}\n </div>\n );\n}\n","import type { AnyBlock } from \"@slack/types\";\nimport {\n type ComponentType,\n createContext,\n type ReactNode,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport {\n type BlockSuggestionPayload,\n buildBlockActionsPayload,\n buildBlockSuggestionPayload,\n buildViewClosedPayload,\n buildViewSubmissionPayload,\n type Container,\n type OptionsResponse,\n type PayloadIdentity,\n type ViewLike,\n type ViewResponseAction,\n} from \"./payloads\";\nimport { Modal, type ModalView } from \"./surfaces/Modal\";\nimport { ModalLayer } from \"./surfaces/ModalLayer\";\n\n/**\n * The action object Slack puts in `block_actions.actions[]`. The extra fields depend on the\n * element type (`value`, `selected_option`, `selected_date`, ...), exactly as Slack sends them.\n */\nexport interface BlockAction {\n type: string;\n action_id: string;\n block_id: string;\n action_ts: string;\n text?: { type: \"plain_text\"; text: string; emoji?: boolean };\n value?: string;\n url?: string;\n style?: \"primary\" | \"danger\";\n [field: string]: unknown;\n}\n\n/** One entry of `view.state.values[block_id][action_id]`, e.g. `{ type: \"datepicker\", selected_date: \"2024-01-01\" }`. */\nexport interface ElementState {\n type: string;\n [field: string]: unknown;\n}\n\n/** Slack's `state.values`: element values keyed by block_id, then action_id. */\nexport type StateValues = Record<string, Record<string, ElementState>>;\n\nexport type Surface = \"message\" | \"modal\" | \"home\";\n\n/** What a user mention's profile card shows; everything but the name is optional. */\nexport interface UserProfile {\n /** Display name, shown bold at the top of the card. */\n name: string;\n /** Full name, shown under the display name when it differs. */\n realName?: string;\n title?: string;\n pronouns?: string;\n avatarUrl?: string;\n /** Custom status, e.g. `{ emoji: \"palm_tree\", text: \"On vacation\" }`. */\n status?: { emoji?: string; text?: string };\n /** IANA zone used for the card's \"local time\" row, e.g. `Europe/Amsterdam`. */\n timeZone?: string;\n}\n\n/** Resolves ids in mrkdwn and rich text to display names. Return undefined when unknown. */\nexport interface Resolvers {\n user?: (id: string) => string | undefined;\n /**\n * Profile details for the card that opens when a user mention is clicked. Falls back to the\n * name from `user` when omitted.\n */\n userProfile?: (id: string) => UserProfile | undefined;\n channel?: (id: string) => string | undefined;\n usergroup?: (id: string) => string | undefined;\n}\n\nexport interface EmojiOptions {\n /**\n * Builds the image URL for a unified code point sequence such as `1f44d-1f3fd`. Defaults to the\n * Apple set from emoji-datasource-apple on jsDelivr.\n */\n imageUrl?: (unified: string) => string;\n /** Workspace custom emoji: name → image URL, or `alias:<name>`. */\n custom?: Record<string, string>;\n}\n\n/** A modal opened through {@link ViewsApi}, with the validation errors last returned for it. */\nexport interface StackedView {\n view: ViewLike & { id: string };\n errors: Record<string, string>;\n}\n\n/**\n * Slack's `views.*` calls, for answering an interaction the way an app would: open a modal from a\n * button, push a second one on top, or update one in place (e.g. after a `dispatch_action` input).\n * Opened modals render on top of the provider's children, up to Slack's limit of 3.\n */\nexport interface ViewsApi {\n /** `views.open`: replaces any open modals with this one. Returns the new view's id. */\n open: (view: ViewLike) => string;\n /** `views.push`: stacks a modal on top of the current one. Returns the new view's id. */\n push: (view: ViewLike) => string;\n /**\n * `views.update`: swaps a modal's content, keeping its id and any input values whose\n * `block_id`/`action_id` are unchanged. Targets `viewId` or `externalId`, else the top modal.\n */\n update: (view: ViewLike, target?: { viewId?: string; externalId?: string }) => void;\n /** Closes the top modal, returning to the one below it. */\n close: () => void;\n /** Closes every open modal. */\n clear: () => void;\n /** `views.publish`: replaces the content of the `<HomeTab>` rendered under this provider. */\n publish: (view: ViewLike) => void;\n}\n\n/** New content for a message, as an app would send with `chat.update` or a `response_url`. */\nexport interface MessageUpdate {\n blocks?: AnyBlock[];\n text?: string;\n}\n\n/**\n * Answers an interaction by changing the message it came from, like posting to its `response_url`\n * with `replace_original` / `delete_original`, or calling `chat.update` / `chat.delete`.\n */\nexport interface MessageApi {\n /** Replaces the message's blocks and fallback text. */\n update: (message: MessageUpdate) => void;\n /** Removes the message. */\n delete: () => void;\n}\n\n/** What an interaction happened in: the message/view it came from, and a handle to change the message. */\nexport interface SurfaceScopeValue {\n container: Container;\n message?: MessageApi;\n}\n\nexport interface ActionContext {\n /** State of every input on the surface at the time of the action, like `state.values`. */\n state: StateValues;\n /** Opens, pushes or updates modals in response, like an app calling `views.*`. */\n views: ViewsApi;\n /** Set for actions in a `<Message>`: replaces or deletes that message. */\n message?: MessageApi;\n}\n\n/** The second argument of `onPayload`. */\nexport interface PayloadContext {\n views: ViewsApi;\n /** Set for actions in a `<Message>`: replaces or deletes that message. */\n message?: MessageApi;\n}\n\n/** What `onSubmit` may return: Slack's `response_action` ack, or nothing to just close the modal. */\nexport type SubmitResult = ViewResponseAction | undefined | void;\n\n/** What block-kit passes to a `linkComponent`: an anchor's props, ready to spread. */\nexport interface LinkProps {\n href: string;\n className?: string;\n target?: string;\n rel?: string;\n children?: ReactNode;\n}\n\n/** A resolved mention, as `mentionHref` gets it. */\nexport interface MentionRef {\n type: \"user\" | \"channel\" | \"usergroup\";\n /** Slack id, e.g. `U0123ABC`, `C0123ABC` or `S0123ABC`. */\n id: string;\n}\n\nexport interface BlockKitContextValue {\n surface: Surface;\n /** The provider's `theme`. Popovers, tooltips and dialogs render outside its wrapper, so they set it themselves. */\n theme?: \"light\" | \"dark\";\n onAction?: (action: BlockAction, context: ActionContext) => void;\n /** Same actions as `onAction`, wrapped in the full Slack `block_actions` payload (team/user/container/...). */\n onPayload?: (\n payload: ReturnType<typeof buildBlockActionsPayload>,\n context: PayloadContext,\n ) => void;\n /** Called with a `view_submission` payload when a `<Modal>`'s Submit button is pressed. */\n onSubmit?: (\n payload: ReturnType<typeof buildViewSubmissionPayload>,\n context: { views: ViewsApi },\n ) => SubmitResult | Promise<SubmitResult>;\n /** Called with a `view_closed` payload when a `<Modal>`'s close (X) button is pressed. */\n onClose?: (payload: ReturnType<typeof buildViewClosedPayload>) => void;\n resolvers: Resolvers;\n /** Renders links from the payload; an `<a>` unless the provider's `linkComponent` says otherwise. */\n linkComponent?: ComponentType<LinkProps>;\n /** The app's page for a mention, if it has one. */\n mentionHref?: (mention: MentionRef) => string | undefined;\n emoji: EmojiOptions;\n /** Validation errors keyed by block_id, as returned in `response_action: \"errors\"`. */\n errors: Record<string, string>;\n /** IANA zone for `<!date>` tokens and date elements. Undefined means the viewer's zone. */\n timeZone?: string;\n state: StateValues;\n /** Records an element's current value. Elements call this on every change. */\n setValue: (blockId: string, actionId: string, value: ElementState | undefined) => void;\n /**\n * Reports an action, passing the current state along. `scope` is the surface it happened in;\n * surfaces bind it for their elements, so elements never pass it themselves.\n */\n dispatch: (\n action: Partial<Pick<BlockAction, \"action_ts\">> & Omit<BlockAction, \"action_ts\">,\n scope?: SurfaceScopeValue,\n ) => void;\n /** Identity fields (team/user/trigger_id/...) used to build full Slack payloads. */\n identity: PayloadIdentity;\n /**\n * Registers the message/view a surface is rendering, so `dispatch` can build a full\n * `block_actions` payload for `onPayload`. Surfaces call this via `useContainer`; not meant to\n * be called directly.\n */\n setContainer: (container: Container | undefined) => void;\n views: ViewsApi;\n /**\n * Asks the app for an `external_select`'s options with a `block_suggestion` payload. Resolves\n * to undefined when there's no `onOptions` handler or no known container.\n */\n loadOptions?: (\n actionId: string,\n blockId: string,\n value: string,\n scope?: SurfaceScopeValue,\n ) => Promise<OptionsResponse | undefined>;\n /** Set on a modal opened through `views`: the stack entry it renders. */\n stackedView?: StackedView;\n /** Applies a submit's `response_action` (or closes) for a stacked modal. */\n respond?: (viewId: string, result: SubmitResult) => void;\n}\n\nconst noop = () => {};\nconst noopId = () => \"\";\nconst noopViews: ViewsApi = {\n open: noopId,\n push: noopId,\n update: noop,\n close: noop,\n clear: noop,\n publish: noop,\n};\n\nconst BlockKitContext = createContext<BlockKitContextValue>({\n surface: \"message\",\n resolvers: {},\n emoji: {},\n errors: {},\n state: {},\n setValue: noop,\n dispatch: noop,\n identity: {},\n setContainer: noop,\n views: noopViews,\n});\n\nexport interface BlockKitProviderProps {\n children: ReactNode;\n surface?: Surface;\n onAction?: (action: BlockAction, context: ActionContext) => void;\n /**\n * Same actions as `onAction`, wrapped in the full Slack `block_actions` payload (team, user,\n * container, response_url, ...) that an app's request URL would receive. Requires the surface\n * being rendered (`<Message>`, `<Modal>`, `<HomeTab>`) to know its container, which they do\n * automatically.\n */\n onPayload?: (\n payload: ReturnType<typeof buildBlockActionsPayload>,\n context: PayloadContext,\n ) => void;\n /**\n * Called with a `view_submission` payload when a `<Modal>`'s Submit button is pressed. For a\n * modal opened through `views`, return a `response_action` (`errors`, `update`, `push`,\n * `clear`) to react as Slack would, or nothing to close it. If it throws or rejects (the app\n * couldn't be reached), the modal stays open.\n */\n onSubmit?: (\n payload: ReturnType<typeof buildViewSubmissionPayload>,\n context: { views: ViewsApi },\n ) => SubmitResult | Promise<SubmitResult>;\n /** Called with a `view_closed` payload when a `<Modal>`'s close (X) button is pressed. */\n onClose?: (payload: ReturnType<typeof buildViewClosedPayload>) => void;\n /**\n * Answers an `external_select`'s `block_suggestion` request with options, as an app's options\n * load URL would. Without it, external selects accept a typed value on Enter instead.\n */\n onOptions?: (payload: BlockSuggestionPayload) => OptionsResponse | Promise<OptionsResponse>;\n /** Called whenever an input value changes, with the full `state.values`. */\n onStateChange?: (state: StateValues) => void;\n resolvers?: Resolvers;\n /**\n * Renders every link that comes from the payload, e.g. a router's `<Link>` for client-side\n * navigation or a component that rewrites URLs: links in mrkdwn, rich text, markdown and dates,\n * data tables, plan and task card sources, video titles, attachment authors and titles, and\n * mentions linked by `mentionHref`. It gets an anchor's props to spread: `href`, `className`,\n * `children`, and `target`/`rel` for links that open a new tab, as Slack's do.\n */\n linkComponent?: ComponentType<LinkProps>;\n /**\n * Links resolved mentions to the app's own pages: return a URL for a user, channel or user\n * group, or `undefined` to leave it unlinked. Mention links open in the same tab and render\n * through `linkComponent`.\n */\n mentionHref?: (mention: MentionRef) => string | undefined;\n emoji?: EmojiOptions;\n errors?: Record<string, string>;\n timeZone?: string;\n /** Team/user/trigger_id/... stamped onto payloads built for `onPayload`/`onSubmit`/`onClose`. */\n identity?: PayloadIdentity;\n /** Sets `data-theme` on a wrapper div so Slack's dark-mode CSS variables (Message.css) apply. */\n theme?: \"light\" | \"dark\";\n}\n\n/** Slack allows at most 3 views in a modal stack. */\nconst MAX_STACK = 3;\n\nfunction newViewId(): string {\n return `V${Math.random().toString(36).slice(2, 12).toUpperCase().padEnd(10, \"0\")}`;\n}\n\nfunction newHash(): string {\n return `${Math.floor(Date.now() / 1000)}.${Math.random().toString(36).slice(2, 10)}`;\n}\n\nexport function BlockKitProvider(props: BlockKitProviderProps) {\n const {\n children,\n surface = \"message\",\n onAction,\n onPayload,\n onSubmit,\n onClose,\n onOptions,\n onStateChange,\n resolvers,\n linkComponent,\n mentionHref,\n emoji,\n errors,\n timeZone,\n identity,\n theme,\n } = props;\n const [state, setState] = useState<StateValues>({});\n // Actions read the latest state synchronously, even when fired in the same tick as a change.\n const stateRef = useRef(state);\n // The message/view currently rendered, registered by `useContainer`. A ref (not state): it's\n // read only from event handlers, so updating it should never trigger a re-render.\n const containerRef = useRef<Container | undefined>(undefined);\n\n // A modal opened through `views` renders in a nested provider (so it gets its own state); that\n // provider shares the root's stack instead of starting its own.\n const parent = useContext(StackContext);\n const [stack, setStack] = useState<StackedView[]>([]);\n const stackRef = useRef(stack);\n const commitStack = useCallback((next: StackedView[]) => {\n stackRef.current = next;\n setStack(next);\n }, []);\n\n // Views rendered outside the stack (`<HomeTab>`, a standalone `<Modal>`), so `views.update`\n // and `views.publish` can reach them.\n const handlesRef = useRef<ViewHandle[]>([]);\n const register = useCallback((handle: ViewHandle) => {\n handlesRef.current = [...handlesRef.current, handle];\n return () => {\n handlesRef.current = handlesRef.current.filter((h) => h !== handle);\n };\n }, []);\n\n const ownViews = useMemo<ViewsApi>(() => {\n const stamp = (view: ViewLike, below: StackedView | undefined): StackedView[\"view\"] => {\n const id = newViewId();\n return {\n ...view,\n id,\n hash: newHash(),\n root_view_id: below?.view.root_view_id ?? id,\n previous_view_id: below?.view.id ?? null,\n };\n };\n const findIndex = (target?: { viewId?: string; externalId?: string }) => {\n const views = stackRef.current;\n if (target?.viewId) return views.findIndex((v) => v.view.id === target.viewId);\n if (target?.externalId) {\n return views.findIndex((v) => v.view.external_id === target.externalId);\n }\n return views.length - 1;\n };\n return {\n open: (view) => {\n const next = { view: stamp(view, undefined), errors: {} };\n commitStack([next]);\n return next.view.id;\n },\n push: (view) => {\n const views = stackRef.current;\n if (views.length >= MAX_STACK) {\n console.warn(`views.push: Slack allows at most ${MAX_STACK} views in a stack.`);\n return \"\";\n }\n const next = { view: stamp(view, views[views.length - 1]), errors: {} };\n commitStack([...views, next]);\n return next.view.id;\n },\n update: (view, target) => {\n const i = findIndex(target);\n const current = stackRef.current[i];\n if (!current) {\n const handles = handlesRef.current;\n const handle = target?.viewId\n ? handles.find((h) => h.current().id === target.viewId)\n : target?.externalId\n ? handles.find((h) => h.current().external_id === target.externalId)\n : handles[handles.length - 1];\n handle?.update(view);\n return;\n }\n const next = [...stackRef.current];\n next[i] = {\n view: {\n ...view,\n id: current.view.id,\n hash: newHash(),\n root_view_id: current.view.root_view_id,\n previous_view_id: current.view.previous_view_id,\n },\n errors: {},\n };\n commitStack(next);\n },\n close: () => commitStack(stackRef.current.slice(0, -1)),\n clear: () => commitStack([]),\n publish: (view) => {\n const homes = handlesRef.current.filter((h) => h.current().type === \"home\");\n if (homes.length === 0) console.warn(\"views.publish: no <HomeTab> is rendered.\");\n for (const home of homes) home.update(view);\n },\n };\n }, [commitStack]);\n\n const views = parent?.views ?? ownViews;\n\n const ownRespond = useCallback(\n (viewId: string, result: SubmitResult) => {\n const i = stackRef.current.findIndex((v) => v.view.id === viewId);\n if (i < 0) return;\n if (!result) {\n commitStack(stackRef.current.filter((v) => v.view.id !== viewId));\n } else if (result.response_action === \"errors\") {\n const next = [...stackRef.current];\n next[i] = { ...(next[i] as StackedView), errors: result.errors };\n commitStack(next);\n } else if (result.response_action === \"update\") {\n ownViews.update(result.view, { viewId });\n } else if (result.response_action === \"push\") {\n ownViews.push(result.view);\n } else if (result.response_action === \"clear\") {\n ownViews.clear();\n }\n },\n [commitStack, ownViews],\n );\n\n const respond = parent?.respond ?? ownRespond;\n\n const setValue = useCallback(\n (blockId: string, actionId: string, value: ElementState | undefined) => {\n const block = { ...stateRef.current[blockId] };\n if (value === undefined) delete block[actionId];\n else block[actionId] = value;\n const next = { ...stateRef.current, [blockId]: block };\n stateRef.current = next;\n setState(next);\n onStateChange?.(next);\n },\n [onStateChange],\n );\n\n const setContainer = useCallback((container: Container | undefined) => {\n containerRef.current = container;\n }, []);\n\n const dispatch = useCallback<BlockKitContextValue[\"dispatch\"]>(\n (action, scope) => {\n const full = { ...action, action_ts: action.action_ts ?? actionTs() } as BlockAction;\n const message = scope?.message;\n onAction?.(full, { state: stateRef.current, views, message });\n const container = scope?.container ?? containerRef.current;\n if (onPayload && container) {\n onPayload(\n buildBlockActionsPayload({ action: full, state: stateRef.current, container, identity }),\n { views, message },\n );\n }\n },\n [onAction, onPayload, identity, views],\n );\n\n // Read through a ref so an inline `onOptions` (a new function every render) doesn't change\n // loadOptions' identity and re-fire the select's options request after every parent render.\n const optionsRef = useRef({ onOptions, identity });\n optionsRef.current = { onOptions, identity };\n const loadOptions = useCallback<NonNullable<BlockKitContextValue[\"loadOptions\"]>>(\n async (actionId, blockId, value, scope) => {\n const { onOptions, identity } = optionsRef.current;\n const container = scope?.container ?? containerRef.current;\n if (!onOptions || !container) return undefined;\n return onOptions(\n buildBlockSuggestionPayload({\n actionId,\n blockId,\n value,\n container,\n state: stateRef.current,\n identity,\n }),\n );\n },\n [],\n );\n\n const stackedView = useContext(StackEntryContext);\n const value = useMemo<BlockKitContextValue>(\n () => ({\n surface,\n theme,\n onAction,\n onPayload,\n onSubmit,\n onClose,\n resolvers: resolvers ?? {},\n linkComponent,\n mentionHref,\n emoji: emoji ?? {},\n errors: stackedView?.errors ?? errors ?? {},\n timeZone,\n state,\n setValue,\n dispatch,\n identity: identity ?? {},\n setContainer,\n views,\n loadOptions: onOptions ? loadOptions : undefined,\n stackedView,\n respond,\n }),\n [\n surface,\n theme,\n onAction,\n onPayload,\n onSubmit,\n onClose,\n resolvers,\n linkComponent,\n mentionHref,\n emoji,\n errors,\n timeZone,\n state,\n setValue,\n dispatch,\n identity,\n setContainer,\n views,\n onOptions,\n loadOptions,\n stackedView,\n respond,\n ],\n );\n\n const registerView = parent?.register ?? register;\n const stackValue = useMemo(\n () => ({ views, respond, register: registerView }),\n [views, respond, registerView],\n );\n const content = (\n <>\n {children}\n {!parent && stack.length > 0 && (\n <ModalLayer\n stack={stack}\n renderEntry={(entry) => (\n <StackEntryContext.Provider value={entry}>\n <BlockKitProvider {...props} surface=\"modal\" theme={undefined}>\n <Modal view={entry.view as ModalView} />\n </BlockKitProvider>\n </StackEntryContext.Provider>\n )}\n />\n )}\n </>\n );\n\n return (\n <BlockKitContext.Provider value={value}>\n <StackContext.Provider value={stackValue}>\n {theme ? <div data-theme={theme}>{content}</div> : content}\n </StackContext.Provider>\n </BlockKitContext.Provider>\n );\n}\n\n/** A view rendered outside the modal stack, as `views.update`/`views.publish` see it. */\ninterface ViewHandle {\n current: () => ViewLike;\n update: (view: ViewLike) => void;\n}\n\nconst StackContext = createContext<\n | {\n views: ViewsApi;\n respond: (viewId: string, result: SubmitResult) => void;\n register: (handle: ViewHandle) => () => void;\n }\n | undefined\n>(undefined);\n\nconst StackEntryContext = createContext<StackedView | undefined>(undefined);\n\nexport function useBlockKit(): BlockKitContextValue {\n return useContext(BlockKitContext);\n}\n\n/**\n * Registers the message/view a surface (`<Message>`, `<Modal>`, `<HomeTab>`) is rendering, so\n * `dispatch` can build a full `block_actions` payload for the provider's `onPayload`. Call once\n * near the top of a surface component; re-call (it's cheap) whenever the container's identity\n * changes.\n */\nexport function useContainer(container: Container | undefined): void {\n const { setContainer } = useBlockKit();\n useEffect(() => {\n setContainer(container);\n });\n}\n\nexport interface SurfaceScopeProps extends SurfaceScopeValue {\n /** Extra validation errors (by block_id) shown on top of the provider's. */\n errors?: Record<string, string>;\n children: ReactNode;\n}\n\n/**\n * Binds the elements below it to one surface: their actions and options requests carry this\n * container (and message handle), even when several surfaces share a provider. `<Message>`,\n * `<Modal>` and `<HomeTab>` render one; custom surfaces can too.\n */\nexport function SurfaceScope({ container, message, errors, children }: SurfaceScopeProps) {\n const context = useBlockKit();\n const scopeRef = useRef<SurfaceScopeValue>({ container, message });\n scopeRef.current = { container, message };\n // Keeps the old container registration working for code that reads it (e.g. custom elements\n // calling the provider's dispatch directly).\n useContainer(container);\n const { dispatch, loadOptions } = context;\n // A standalone <Modal>/<HomeTab> is that surface even under a provider set up for messages.\n const surface: Surface = container.type === \"view\" ? container.view.type : \"message\";\n const scopedDispatch = useCallback<BlockKitContextValue[\"dispatch\"]>(\n (action, scope) => dispatch(action, scope ?? scopeRef.current),\n [dispatch],\n );\n const scopedLoadOptions = useMemo<BlockKitContextValue[\"loadOptions\"]>(\n () =>\n loadOptions &&\n ((actionId, blockId, value, scope) =>\n loadOptions(actionId, blockId, value, scope ?? scopeRef.current)),\n [loadOptions],\n );\n const value = useMemo<BlockKitContextValue>(\n () => ({\n ...context,\n surface,\n dispatch: scopedDispatch,\n loadOptions: scopedLoadOptions,\n errors:\n errors && Object.keys(errors).length > 0\n ? { ...context.errors, ...errors }\n : context.errors,\n }),\n [context, surface, scopedDispatch, scopedLoadOptions, errors],\n );\n return <BlockKitContext.Provider value={value}>{children}</BlockKitContext.Provider>;\n}\n\n/**\n * Stops the elements below it from sending `block_actions`, while their values still reach\n * `state`. An `input` block uses it: Slack only dispatches from an input's element when the block\n * sets `dispatch_action`.\n */\nexport function SuppressActions({ children }: { children: ReactNode }) {\n const context = useBlockKit();\n const value = useMemo<BlockKitContextValue>(() => ({ ...context, dispatch: noop }), [context]);\n return <BlockKitContext.Provider value={value}>{children}</BlockKitContext.Provider>;\n}\n\n/**\n * The view a `<HomeTab>` or standalone `<Modal>` should show: its `view` prop, or what the app\n * last sent with `views.update`/`views.publish`. A new `view` prop (by content) wins again.\n */\nexport function useLiveView<V extends ViewLike>(\n view: V,\n enabled = true,\n): { view: V; update: (next: ViewLike) => void } {\n const shared = useContext(StackContext);\n const source = JSON.stringify(view);\n const [override, setOverride] = useState<{ source: string; view: V }>();\n const live = override?.source === source ? override.view : view;\n const liveRef = useRef(live);\n liveRef.current = live;\n\n const update = useCallback(\n (next: ViewLike) => {\n const current = liveRef.current;\n setOverride({\n source,\n view: {\n ...next,\n type: current.type,\n id: current.id,\n hash: newHash(),\n root_view_id: current.root_view_id,\n previous_view_id: current.previous_view_id,\n } as V,\n });\n },\n [source],\n );\n\n useEffect(() => {\n if (!enabled || !shared) return;\n return shared.register({ current: () => liveRef.current, update });\n }, [enabled, shared, update]);\n\n return { view: live, update };\n}\n\n/** Slack's `action_ts` format: seconds with microseconds. */\nexport function actionTs(now = Date.now()): string {\n return (now / 1000).toFixed(6);\n}\n","import { useEffect, useLayoutEffect } from \"react\";\n\n/**\n * `useLayoutEffect` in the browser and `useEffect` on the server, where neither runs. React 18\n * warns about every `useLayoutEffect` it meets while server rendering; React 19 doesn't.\n */\nexport const useClientLayoutEffect = typeof document === \"undefined\" ? useEffect : useLayoutEffect;\n","import {\n cloneElement,\n type FocusEvent,\n type MouseEvent,\n type ReactElement,\n type ReactNode,\n useEffect,\n useId,\n useRef,\n useState,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { useBlockKit } from \"./context\";\nimport { useClientLayoutEffect } from \"./useClientLayoutEffect\";\n\n/** How long the pointer rests on an anchor before its tooltip shows. */\nconst SHOW_DELAY_MS = 300;\n\ntype Placement = \"top\" | \"bottom\";\n\ntype AnchorProps = {\n onMouseEnter?: (e: MouseEvent) => void;\n onMouseLeave?: (e: MouseEvent) => void;\n onFocus?: (e: FocusEvent) => void;\n onBlur?: (e: FocusEvent) => void;\n \"aria-describedby\"?: string;\n};\n\nexport interface TooltipProps {\n /** Tooltip content; nothing is rendered when empty. */\n label: ReactNode;\n /** A single element to anchor to; it receives the hover/focus handlers. */\n children: ReactElement<AnchorProps>;\n /** Preferred side; flips to the other one when there's no room. Defaults to `top`. */\n placement?: Placement;\n}\n\n/**\n * Slack's `c-tooltip`: a dark, bold 13px bubble with an arrow, shown above (or below) its anchor\n * after a short hover or on keyboard focus. It appears and disappears without animation, as in\n * Slack. Portalled to `<body>` so scroll containers and `overflow: hidden` can't clip it.\n */\nexport function Tooltip({ label, children, placement = \"top\" }: TooltipProps) {\n const { theme } = useBlockKit();\n const id = useId();\n const [open, setOpen] = useState(false);\n const [position, setPosition] = useState<{\n top: number;\n left: number;\n side: Placement;\n } | null>(null);\n const anchorRef = useRef<Element | null>(null);\n const tipRef = useRef<HTMLDivElement>(null);\n const timer = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n\n useEffect(() => () => clearTimeout(timer.current), []);\n\n useClientLayoutEffect(() => {\n if (!open) {\n setPosition(null);\n return;\n }\n const anchor = anchorRef.current;\n const tip = tipRef.current;\n if (!anchor || !tip) return;\n const a = anchor.getBoundingClientRect();\n const t = tip.getBoundingClientRect();\n const gap = 8;\n const fitsAbove = a.top - gap - t.height >= 0;\n const fitsBelow = a.bottom + gap + t.height <= window.innerHeight;\n const side: Placement =\n placement === \"top\"\n ? fitsAbove || !fitsBelow\n ? \"top\"\n : \"bottom\"\n : fitsBelow || !fitsAbove\n ? \"bottom\"\n : \"top\";\n const left = Math.min(\n Math.max(4, a.left + a.width / 2 - t.width / 2),\n window.innerWidth - t.width - 4,\n );\n setPosition({ top: side === \"top\" ? a.top - gap - t.height : a.bottom + gap, left, side });\n }, [open, placement]);\n\n if (label === undefined || label === null || label === \"\") return children;\n\n function show(e: { currentTarget: Element }, immediate: boolean) {\n anchorRef.current = e.currentTarget;\n clearTimeout(timer.current);\n if (immediate) setOpen(true);\n else timer.current = setTimeout(() => setOpen(true), SHOW_DELAY_MS);\n }\n\n function hide() {\n clearTimeout(timer.current);\n setOpen(false);\n }\n\n const props = children.props;\n const anchor = cloneElement(children, {\n onMouseEnter: (e: MouseEvent) => {\n props.onMouseEnter?.(e);\n show(e, false);\n },\n onMouseLeave: (e: MouseEvent) => {\n props.onMouseLeave?.(e);\n hide();\n },\n onFocus: (e: FocusEvent) => {\n props.onFocus?.(e);\n if ((e.currentTarget as Element).matches?.(\":focus-visible\")) show(e, true);\n },\n onBlur: (e: FocusEvent) => {\n props.onBlur?.(e);\n hide();\n },\n \"aria-describedby\": open ? id : props[\"aria-describedby\"],\n });\n\n const tip =\n open && typeof document !== \"undefined\"\n ? createPortal(\n <div\n ref={tipRef}\n id={id}\n role=\"tooltip\"\n data-theme={theme}\n className={`sbk-tooltip sbk-tooltip--${position?.side ?? placement}`}\n style={\n position\n ? { top: position.top, left: position.left }\n : { top: 0, left: 0, visibility: \"hidden\" }\n }\n >\n {label}\n <span className=\"sbk-tooltip__arrow\" aria-hidden=\"true\" />\n </div>,\n document.body,\n )\n : null;\n\n return (\n <>\n {anchor}\n {tip}\n </>\n );\n}\n","/**\n * Slack-specific shortcodes that predate today's standard Unicode emoji set and so aren't in\n * `emoji-datasource`. Slack keeps them as aliases into the standard set for backward compatibility.\n */\nexport const LEGACY_ALIASES: Record<string, string> = {\n // Slack's original \"smile\" glyph, kept as an alias for the standard slightly-smiling-face.\n simple_smile: \"1f642\",\n};\n","/**\n * Generated by tools/emoji-data/generate.ts from emoji-datasource@16.0.0. Do not edit by hand.\n */\n\n/** short_name (incl. aliases like \"+1\") -> lowercase unified codepoint hex, e.g. \"1f44d\". */\nexport const EMOJI_NAMES: Record<string, string> = {\n \"100\": \"1f4af\",\n \"1234\": \"1f522\",\n hash: \"0023-fe0f-20e3\",\n keycap_star: \"002a-fe0f-20e3\",\n zero: \"0030-fe0f-20e3\",\n one: \"0031-fe0f-20e3\",\n two: \"0032-fe0f-20e3\",\n three: \"0033-fe0f-20e3\",\n four: \"0034-fe0f-20e3\",\n five: \"0035-fe0f-20e3\",\n six: \"0036-fe0f-20e3\",\n seven: \"0037-fe0f-20e3\",\n eight: \"0038-fe0f-20e3\",\n nine: \"0039-fe0f-20e3\",\n copyright: \"00a9-fe0f\",\n registered: \"00ae-fe0f\",\n mahjong: \"1f004\",\n black_joker: \"1f0cf\",\n a: \"1f170-fe0f\",\n b: \"1f171-fe0f\",\n o2: \"1f17e-fe0f\",\n parking: \"1f17f-fe0f\",\n ab: \"1f18e\",\n cl: \"1f191\",\n cool: \"1f192\",\n free: \"1f193\",\n id: \"1f194\",\n new: \"1f195\",\n ng: \"1f196\",\n ok: \"1f197\",\n sos: \"1f198\",\n up: \"1f199\",\n vs: \"1f19a\",\n \"flag-ac\": \"1f1e6-1f1e8\",\n \"flag-ad\": \"1f1e6-1f1e9\",\n \"flag-ae\": \"1f1e6-1f1ea\",\n \"flag-af\": \"1f1e6-1f1eb\",\n \"flag-ag\": \"1f1e6-1f1ec\",\n \"flag-ai\": \"1f1e6-1f1ee\",\n \"flag-al\": \"1f1e6-1f1f1\",\n \"flag-am\": \"1f1e6-1f1f2\",\n \"flag-ao\": \"1f1e6-1f1f4\",\n \"flag-aq\": \"1f1e6-1f1f6\",\n \"flag-ar\": \"1f1e6-1f1f7\",\n \"flag-as\": \"1f1e6-1f1f8\",\n \"flag-at\": \"1f1e6-1f1f9\",\n \"flag-au\": \"1f1e6-1f1fa\",\n \"flag-aw\": \"1f1e6-1f1fc\",\n \"flag-ax\": \"1f1e6-1f1fd\",\n \"flag-az\": \"1f1e6-1f1ff\",\n \"flag-ba\": \"1f1e7-1f1e6\",\n \"flag-bb\": \"1f1e7-1f1e7\",\n \"flag-bd\": \"1f1e7-1f1e9\",\n \"flag-be\": \"1f1e7-1f1ea\",\n \"flag-bf\": \"1f1e7-1f1eb\",\n \"flag-bg\": \"1f1e7-1f1ec\",\n \"flag-bh\": \"1f1e7-1f1ed\",\n \"flag-bi\": \"1f1e7-1f1ee\",\n \"flag-bj\": \"1f1e7-1f1ef\",\n \"flag-bl\": \"1f1e7-1f1f1\",\n \"flag-bm\": \"1f1e7-1f1f2\",\n \"flag-bn\": \"1f1e7-1f1f3\",\n \"flag-bo\": \"1f1e7-1f1f4\",\n \"flag-bq\": \"1f1e7-1f1f6\",\n \"flag-br\": \"1f1e7-1f1f7\",\n \"flag-bs\": \"1f1e7-1f1f8\",\n \"flag-bt\": \"1f1e7-1f1f9\",\n \"flag-bv\": \"1f1e7-1f1fb\",\n \"flag-bw\": \"1f1e7-1f1fc\",\n \"flag-by\": \"1f1e7-1f1fe\",\n \"flag-bz\": \"1f1e7-1f1ff\",\n \"flag-ca\": \"1f1e8-1f1e6\",\n \"flag-cc\": \"1f1e8-1f1e8\",\n \"flag-cd\": \"1f1e8-1f1e9\",\n \"flag-cf\": \"1f1e8-1f1eb\",\n \"flag-cg\": \"1f1e8-1f1ec\",\n \"flag-ch\": \"1f1e8-1f1ed\",\n \"flag-ci\": \"1f1e8-1f1ee\",\n \"flag-ck\": \"1f1e8-1f1f0\",\n \"flag-cl\": \"1f1e8-1f1f1\",\n \"flag-cm\": \"1f1e8-1f1f2\",\n cn: \"1f1e8-1f1f3\",\n \"flag-cn\": \"1f1e8-1f1f3\",\n \"flag-co\": \"1f1e8-1f1f4\",\n \"flag-cp\": \"1f1e8-1f1f5\",\n \"flag-sark\": \"1f1e8-1f1f6\",\n \"flag-cr\": \"1f1e8-1f1f7\",\n \"flag-cu\": \"1f1e8-1f1fa\",\n \"flag-cv\": \"1f1e8-1f1fb\",\n \"flag-cw\": \"1f1e8-1f1fc\",\n \"flag-cx\": \"1f1e8-1f1fd\",\n \"flag-cy\": \"1f1e8-1f1fe\",\n \"flag-cz\": \"1f1e8-1f1ff\",\n de: \"1f1e9-1f1ea\",\n \"flag-de\": \"1f1e9-1f1ea\",\n \"flag-dg\": \"1f1e9-1f1ec\",\n \"flag-dj\": \"1f1e9-1f1ef\",\n \"flag-dk\": \"1f1e9-1f1f0\",\n \"flag-dm\": \"1f1e9-1f1f2\",\n \"flag-do\": \"1f1e9-1f1f4\",\n \"flag-dz\": \"1f1e9-1f1ff\",\n \"flag-ea\": \"1f1ea-1f1e6\",\n \"flag-ec\": \"1f1ea-1f1e8\",\n \"flag-ee\": \"1f1ea-1f1ea\",\n \"flag-eg\": \"1f1ea-1f1ec\",\n \"flag-eh\": \"1f1ea-1f1ed\",\n \"flag-er\": \"1f1ea-1f1f7\",\n es: \"1f1ea-1f1f8\",\n \"flag-es\": \"1f1ea-1f1f8\",\n \"flag-et\": \"1f1ea-1f1f9\",\n \"flag-eu\": \"1f1ea-1f1fa\",\n \"flag-fi\": \"1f1eb-1f1ee\",\n \"flag-fj\": \"1f1eb-1f1ef\",\n \"flag-fk\": \"1f1eb-1f1f0\",\n \"flag-fm\": \"1f1eb-1f1f2\",\n \"flag-fo\": \"1f1eb-1f1f4\",\n fr: \"1f1eb-1f1f7\",\n \"flag-fr\": \"1f1eb-1f1f7\",\n \"flag-ga\": \"1f1ec-1f1e6\",\n gb: \"1f1ec-1f1e7\",\n uk: \"1f1ec-1f1e7\",\n \"flag-gb\": \"1f1ec-1f1e7\",\n \"flag-gd\": \"1f1ec-1f1e9\",\n \"flag-ge\": \"1f1ec-1f1ea\",\n \"flag-gf\": \"1f1ec-1f1eb\",\n \"flag-gg\": \"1f1ec-1f1ec\",\n \"flag-gh\": \"1f1ec-1f1ed\",\n \"flag-gi\": \"1f1ec-1f1ee\",\n \"flag-gl\": \"1f1ec-1f1f1\",\n \"flag-gm\": \"1f1ec-1f1f2\",\n \"flag-gn\": \"1f1ec-1f1f3\",\n \"flag-gp\": \"1f1ec-1f1f5\",\n \"flag-gq\": \"1f1ec-1f1f6\",\n \"flag-gr\": \"1f1ec-1f1f7\",\n \"flag-gs\": \"1f1ec-1f1f8\",\n \"flag-gt\": \"1f1ec-1f1f9\",\n \"flag-gu\": \"1f1ec-1f1fa\",\n \"flag-gw\": \"1f1ec-1f1fc\",\n \"flag-gy\": \"1f1ec-1f1fe\",\n \"flag-hk\": \"1f1ed-1f1f0\",\n \"flag-hm\": \"1f1ed-1f1f2\",\n \"flag-hn\": \"1f1ed-1f1f3\",\n \"flag-hr\": \"1f1ed-1f1f7\",\n \"flag-ht\": \"1f1ed-1f1f9\",\n \"flag-hu\": \"1f1ed-1f1fa\",\n \"flag-ic\": \"1f1ee-1f1e8\",\n \"flag-id\": \"1f1ee-1f1e9\",\n \"flag-ie\": \"1f1ee-1f1ea\",\n \"flag-il\": \"1f1ee-1f1f1\",\n \"flag-im\": \"1f1ee-1f1f2\",\n \"flag-in\": \"1f1ee-1f1f3\",\n \"flag-io\": \"1f1ee-1f1f4\",\n \"flag-iq\": \"1f1ee-1f1f6\",\n \"flag-ir\": \"1f1ee-1f1f7\",\n \"flag-is\": \"1f1ee-1f1f8\",\n it: \"1f1ee-1f1f9\",\n \"flag-it\": \"1f1ee-1f1f9\",\n \"flag-je\": \"1f1ef-1f1ea\",\n \"flag-jm\": \"1f1ef-1f1f2\",\n \"flag-jo\": \"1f1ef-1f1f4\",\n jp: \"1f1ef-1f1f5\",\n \"flag-jp\": \"1f1ef-1f1f5\",\n \"flag-ke\": \"1f1f0-1f1ea\",\n \"flag-kg\": \"1f1f0-1f1ec\",\n \"flag-kh\": \"1f1f0-1f1ed\",\n \"flag-ki\": \"1f1f0-1f1ee\",\n \"flag-km\": \"1f1f0-1f1f2\",\n \"flag-kn\": \"1f1f0-1f1f3\",\n \"flag-kp\": \"1f1f0-1f1f5\",\n kr: \"1f1f0-1f1f7\",\n \"flag-kr\": \"1f1f0-1f1f7\",\n \"flag-kw\": \"1f1f0-1f1fc\",\n \"flag-ky\": \"1f1f0-1f1fe\",\n \"flag-kz\": \"1f1f0-1f1ff\",\n \"flag-la\": \"1f1f1-1f1e6\",\n \"flag-lb\": \"1f1f1-1f1e7\",\n \"flag-lc\": \"1f1f1-1f1e8\",\n \"flag-li\": \"1f1f1-1f1ee\",\n \"flag-lk\": \"1f1f1-1f1f0\",\n \"flag-lr\": \"1f1f1-1f1f7\",\n \"flag-ls\": \"1f1f1-1f1f8\",\n \"flag-lt\": \"1f1f1-1f1f9\",\n \"flag-lu\": \"1f1f1-1f1fa\",\n \"flag-lv\": \"1f1f1-1f1fb\",\n \"flag-ly\": \"1f1f1-1f1fe\",\n \"flag-ma\": \"1f1f2-1f1e6\",\n \"flag-mc\": \"1f1f2-1f1e8\",\n \"flag-md\": \"1f1f2-1f1e9\",\n \"flag-me\": \"1f1f2-1f1ea\",\n \"flag-mf\": \"1f1f2-1f1eb\",\n \"flag-mg\": \"1f1f2-1f1ec\",\n \"flag-mh\": \"1f1f2-1f1ed\",\n \"flag-mk\": \"1f1f2-1f1f0\",\n \"flag-ml\": \"1f1f2-1f1f1\",\n \"flag-mm\": \"1f1f2-1f1f2\",\n \"flag-mn\": \"1f1f2-1f1f3\",\n \"flag-mo\": \"1f1f2-1f1f4\",\n \"flag-mp\": \"1f1f2-1f1f5\",\n \"flag-mq\": \"1f1f2-1f1f6\",\n \"flag-mr\": \"1f1f2-1f1f7\",\n \"flag-ms\": \"1f1f2-1f1f8\",\n \"flag-mt\": \"1f1f2-1f1f9\",\n \"flag-mu\": \"1f1f2-1f1fa\",\n \"flag-mv\": \"1f1f2-1f1fb\",\n \"flag-mw\": \"1f1f2-1f1fc\",\n \"flag-mx\": \"1f1f2-1f1fd\",\n \"flag-my\": \"1f1f2-1f1fe\",\n \"flag-mz\": \"1f1f2-1f1ff\",\n \"flag-na\": \"1f1f3-1f1e6\",\n \"flag-nc\": \"1f1f3-1f1e8\",\n \"flag-ne\": \"1f1f3-1f1ea\",\n \"flag-nf\": \"1f1f3-1f1eb\",\n \"flag-ng\": \"1f1f3-1f1ec\",\n \"flag-ni\": \"1f1f3-1f1ee\",\n \"flag-nl\": \"1f1f3-1f1f1\",\n \"flag-no\": \"1f1f3-1f1f4\",\n \"flag-np\": \"1f1f3-1f1f5\",\n \"flag-nr\": \"1f1f3-1f1f7\",\n \"flag-nu\": \"1f1f3-1f1fa\",\n \"flag-nz\": \"1f1f3-1f1ff\",\n \"flag-om\": \"1f1f4-1f1f2\",\n \"flag-pa\": \"1f1f5-1f1e6\",\n \"flag-pe\": \"1f1f5-1f1ea\",\n \"flag-pf\": \"1f1f5-1f1eb\",\n \"flag-pg\": \"1f1f5-1f1ec\",\n \"flag-ph\": \"1f1f5-1f1ed\",\n \"flag-pk\": \"1f1f5-1f1f0\",\n \"flag-pl\": \"1f1f5-1f1f1\",\n \"flag-pm\": \"1f1f5-1f1f2\",\n \"flag-pn\": \"1f1f5-1f1f3\",\n \"flag-pr\": \"1f1f5-1f1f7\",\n \"flag-ps\": \"1f1f5-1f1f8\",\n \"flag-pt\": \"1f1f5-1f1f9\",\n \"flag-pw\": \"1f1f5-1f1fc\",\n \"flag-py\": \"1f1f5-1f1fe\",\n \"flag-qa\": \"1f1f6-1f1e6\",\n \"flag-re\": \"1f1f7-1f1ea\",\n \"flag-ro\": \"1f1f7-1f1f4\",\n \"flag-rs\": \"1f1f7-1f1f8\",\n ru: \"1f1f7-1f1fa\",\n \"flag-ru\": \"1f1f7-1f1fa\",\n \"flag-rw\": \"1f1f7-1f1fc\",\n \"flag-sa\": \"1f1f8-1f1e6\",\n \"flag-sb\": \"1f1f8-1f1e7\",\n \"flag-sc\": \"1f1f8-1f1e8\",\n \"flag-sd\": \"1f1f8-1f1e9\",\n \"flag-se\": \"1f1f8-1f1ea\",\n \"flag-sg\": \"1f1f8-1f1ec\",\n \"flag-sh\": \"1f1f8-1f1ed\",\n \"flag-si\": \"1f1f8-1f1ee\",\n \"flag-sj\": \"1f1f8-1f1ef\",\n \"flag-sk\": \"1f1f8-1f1f0\",\n \"flag-sl\": \"1f1f8-1f1f1\",\n \"flag-sm\": \"1f1f8-1f1f2\",\n \"flag-sn\": \"1f1f8-1f1f3\",\n \"flag-so\": \"1f1f8-1f1f4\",\n \"flag-sr\": \"1f1f8-1f1f7\",\n \"flag-ss\": \"1f1f8-1f1f8\",\n \"flag-st\": \"1f1f8-1f1f9\",\n \"flag-sv\": \"1f1f8-1f1fb\",\n \"flag-sx\": \"1f1f8-1f1fd\",\n \"flag-sy\": \"1f1f8-1f1fe\",\n \"flag-sz\": \"1f1f8-1f1ff\",\n \"flag-ta\": \"1f1f9-1f1e6\",\n \"flag-tc\": \"1f1f9-1f1e8\",\n \"flag-td\": \"1f1f9-1f1e9\",\n \"flag-tf\": \"1f1f9-1f1eb\",\n \"flag-tg\": \"1f1f9-1f1ec\",\n \"flag-th\": \"1f1f9-1f1ed\",\n \"flag-tj\": \"1f1f9-1f1ef\",\n \"flag-tk\": \"1f1f9-1f1f0\",\n \"flag-tl\": \"1f1f9-1f1f1\",\n \"flag-tm\": \"1f1f9-1f1f2\",\n \"flag-tn\": \"1f1f9-1f1f3\",\n \"flag-to\": \"1f1f9-1f1f4\",\n \"flag-tr\": \"1f1f9-1f1f7\",\n \"flag-tt\": \"1f1f9-1f1f9\",\n \"flag-tv\": \"1f1f9-1f1fb\",\n \"flag-tw\": \"1f1f9-1f1fc\",\n \"flag-tz\": \"1f1f9-1f1ff\",\n \"flag-ua\": \"1f1fa-1f1e6\",\n \"flag-ug\": \"1f1fa-1f1ec\",\n \"flag-um\": \"1f1fa-1f1f2\",\n \"flag-un\": \"1f1fa-1f1f3\",\n us: \"1f1fa-1f1f8\",\n \"flag-us\": \"1f1fa-1f1f8\",\n \"flag-uy\": \"1f1fa-1f1fe\",\n \"flag-uz\": \"1f1fa-1f1ff\",\n \"flag-va\": \"1f1fb-1f1e6\",\n \"flag-vc\": \"1f1fb-1f1e8\",\n \"flag-ve\": \"1f1fb-1f1ea\",\n \"flag-vg\": \"1f1fb-1f1ec\",\n \"flag-vi\": \"1f1fb-1f1ee\",\n \"flag-vn\": \"1f1fb-1f1f3\",\n \"flag-vu\": \"1f1fb-1f1fa\",\n \"flag-wf\": \"1f1fc-1f1eb\",\n \"flag-ws\": \"1f1fc-1f1f8\",\n \"flag-xk\": \"1f1fd-1f1f0\",\n \"flag-ye\": \"1f1fe-1f1ea\",\n \"flag-yt\": \"1f1fe-1f1f9\",\n \"flag-za\": \"1f1ff-1f1e6\",\n \"flag-zm\": \"1f1ff-1f1f2\",\n \"flag-zw\": \"1f1ff-1f1fc\",\n koko: \"1f201\",\n sa: \"1f202-fe0f\",\n u7121: \"1f21a\",\n u6307: \"1f22f\",\n u7981: \"1f232\",\n u7a7a: \"1f233\",\n u5408: \"1f234\",\n u6e80: \"1f235\",\n u6709: \"1f236\",\n u6708: \"1f237-fe0f\",\n u7533: \"1f238\",\n u5272: \"1f239\",\n u55b6: \"1f23a\",\n ideograph_advantage: \"1f250\",\n accept: \"1f251\",\n cyclone: \"1f300\",\n foggy: \"1f301\",\n closed_umbrella: \"1f302\",\n night_with_stars: \"1f303\",\n sunrise_over_mountains: \"1f304\",\n sunrise: \"1f305\",\n city_sunset: \"1f306\",\n city_sunrise: \"1f307\",\n rainbow: \"1f308\",\n bridge_at_night: \"1f309\",\n ocean: \"1f30a\",\n volcano: \"1f30b\",\n milky_way: \"1f30c\",\n earth_africa: \"1f30d\",\n earth_americas: \"1f30e\",\n earth_asia: \"1f30f\",\n globe_with_meridians: \"1f310\",\n new_moon: \"1f311\",\n waxing_crescent_moon: \"1f312\",\n first_quarter_moon: \"1f313\",\n moon: \"1f314\",\n waxing_gibbous_moon: \"1f314\",\n full_moon: \"1f315\",\n waning_gibbous_moon: \"1f316\",\n last_quarter_moon: \"1f317\",\n waning_crescent_moon: \"1f318\",\n crescent_moon: \"1f319\",\n new_moon_with_face: \"1f31a\",\n first_quarter_moon_with_face: \"1f31b\",\n last_quarter_moon_with_face: \"1f31c\",\n full_moon_with_face: \"1f31d\",\n sun_with_face: \"1f31e\",\n star2: \"1f31f\",\n stars: \"1f320\",\n thermometer: \"1f321-fe0f\",\n mostly_sunny: \"1f324-fe0f\",\n sun_small_cloud: \"1f324-fe0f\",\n barely_sunny: \"1f325-fe0f\",\n sun_behind_cloud: \"1f325-fe0f\",\n partly_sunny_rain: \"1f326-fe0f\",\n sun_behind_rain_cloud: \"1f326-fe0f\",\n rain_cloud: \"1f327-fe0f\",\n snow_cloud: \"1f328-fe0f\",\n lightning: \"1f329-fe0f\",\n lightning_cloud: \"1f329-fe0f\",\n tornado: \"1f32a-fe0f\",\n tornado_cloud: \"1f32a-fe0f\",\n fog: \"1f32b-fe0f\",\n wind_blowing_face: \"1f32c-fe0f\",\n hotdog: \"1f32d\",\n taco: \"1f32e\",\n burrito: \"1f32f\",\n chestnut: \"1f330\",\n seedling: \"1f331\",\n evergreen_tree: \"1f332\",\n deciduous_tree: \"1f333\",\n palm_tree: \"1f334\",\n cactus: \"1f335\",\n hot_pepper: \"1f336-fe0f\",\n tulip: \"1f337\",\n cherry_blossom: \"1f338\",\n rose: \"1f339\",\n hibiscus: \"1f33a\",\n sunflower: \"1f33b\",\n blossom: \"1f33c\",\n corn: \"1f33d\",\n ear_of_rice: \"1f33e\",\n herb: \"1f33f\",\n four_leaf_clover: \"1f340\",\n maple_leaf: \"1f341\",\n fallen_leaf: \"1f342\",\n leaves: \"1f343\",\n brown_mushroom: \"1f344-200d-1f7eb\",\n mushroom: \"1f344\",\n tomato: \"1f345\",\n eggplant: \"1f346\",\n grapes: \"1f347\",\n melon: \"1f348\",\n watermelon: \"1f349\",\n tangerine: \"1f34a\",\n lime: \"1f34b-200d-1f7e9\",\n lemon: \"1f34b\",\n banana: \"1f34c\",\n pineapple: \"1f34d\",\n apple: \"1f34e\",\n green_apple: \"1f34f\",\n pear: \"1f350\",\n peach: \"1f351\",\n cherries: \"1f352\",\n strawberry: \"1f353\",\n hamburger: \"1f354\",\n pizza: \"1f355\",\n meat_on_bone: \"1f356\",\n poultry_leg: \"1f357\",\n rice_cracker: \"1f358\",\n rice_ball: \"1f359\",\n rice: \"1f35a\",\n curry: \"1f35b\",\n ramen: \"1f35c\",\n spaghetti: \"1f35d\",\n bread: \"1f35e\",\n fries: \"1f35f\",\n sweet_potato: \"1f360\",\n dango: \"1f361\",\n oden: \"1f362\",\n sushi: \"1f363\",\n fried_shrimp: \"1f364\",\n fish_cake: \"1f365\",\n icecream: \"1f366\",\n shaved_ice: \"1f367\",\n ice_cream: \"1f368\",\n doughnut: \"1f369\",\n cookie: \"1f36a\",\n chocolate_bar: \"1f36b\",\n candy: \"1f36c\",\n lollipop: \"1f36d\",\n custard: \"1f36e\",\n honey_pot: \"1f36f\",\n cake: \"1f370\",\n bento: \"1f371\",\n stew: \"1f372\",\n fried_egg: \"1f373\",\n cooking: \"1f373\",\n fork_and_knife: \"1f374\",\n tea: \"1f375\",\n sake: \"1f376\",\n wine_glass: \"1f377\",\n cocktail: \"1f378\",\n tropical_drink: \"1f379\",\n beer: \"1f37a\",\n beers: \"1f37b\",\n baby_bottle: \"1f37c\",\n knife_fork_plate: \"1f37d-fe0f\",\n champagne: \"1f37e\",\n popcorn: \"1f37f\",\n ribbon: \"1f380\",\n gift: \"1f381\",\n birthday: \"1f382\",\n jack_o_lantern: \"1f383\",\n christmas_tree: \"1f384\",\n santa: \"1f385\",\n fireworks: \"1f386\",\n sparkler: \"1f387\",\n balloon: \"1f388\",\n tada: \"1f389\",\n confetti_ball: \"1f38a\",\n tanabata_tree: \"1f38b\",\n crossed_flags: \"1f38c\",\n bamboo: \"1f38d\",\n dolls: \"1f38e\",\n flags: \"1f38f\",\n wind_chime: \"1f390\",\n rice_scene: \"1f391\",\n school_satchel: \"1f392\",\n mortar_board: \"1f393\",\n medal: \"1f396-fe0f\",\n reminder_ribbon: \"1f397-fe0f\",\n studio_microphone: \"1f399-fe0f\",\n level_slider: \"1f39a-fe0f\",\n control_knobs: \"1f39b-fe0f\",\n film_frames: \"1f39e-fe0f\",\n admission_tickets: \"1f39f-fe0f\",\n carousel_horse: \"1f3a0\",\n ferris_wheel: \"1f3a1\",\n roller_coaster: \"1f3a2\",\n fishing_pole_and_fish: \"1f3a3\",\n microphone: \"1f3a4\",\n movie_camera: \"1f3a5\",\n cinema: \"1f3a6\",\n headphones: \"1f3a7\",\n art: \"1f3a8\",\n tophat: \"1f3a9\",\n circus_tent: \"1f3aa\",\n ticket: \"1f3ab\",\n clapper: \"1f3ac\",\n performing_arts: \"1f3ad\",\n video_game: \"1f3ae\",\n dart: \"1f3af\",\n slot_machine: \"1f3b0\",\n \"8ball\": \"1f3b1\",\n game_die: \"1f3b2\",\n bowling: \"1f3b3\",\n flower_playing_cards: \"1f3b4\",\n musical_note: \"1f3b5\",\n notes: \"1f3b6\",\n saxophone: \"1f3b7\",\n guitar: \"1f3b8\",\n musical_keyboard: \"1f3b9\",\n trumpet: \"1f3ba\",\n violin: \"1f3bb\",\n musical_score: \"1f3bc\",\n running_shirt_with_sash: \"1f3bd\",\n tennis: \"1f3be\",\n ski: \"1f3bf\",\n basketball: \"1f3c0\",\n checkered_flag: \"1f3c1\",\n snowboarder: \"1f3c2\",\n \"woman-running\": \"1f3c3-200d-2640-fe0f\",\n woman_running_facing_right: \"1f3c3-200d-2640-fe0f-200d-27a1-fe0f\",\n \"man-running\": \"1f3c3-200d-2642-fe0f\",\n man_running_facing_right: \"1f3c3-200d-2642-fe0f-200d-27a1-fe0f\",\n person_running_facing_right: \"1f3c3-200d-27a1-fe0f\",\n runner: \"1f3c3\",\n running: \"1f3c3\",\n \"woman-surfing\": \"1f3c4-200d-2640-fe0f\",\n \"man-surfing\": \"1f3c4-200d-2642-fe0f\",\n surfer: \"1f3c4\",\n sports_medal: \"1f3c5\",\n trophy: \"1f3c6\",\n horse_racing: \"1f3c7\",\n football: \"1f3c8\",\n rugby_football: \"1f3c9\",\n \"woman-swimming\": \"1f3ca-200d-2640-fe0f\",\n \"man-swimming\": \"1f3ca-200d-2642-fe0f\",\n swimmer: \"1f3ca\",\n \"woman-lifting-weights\": \"1f3cb-fe0f-200d-2640-fe0f\",\n \"man-lifting-weights\": \"1f3cb-fe0f-200d-2642-fe0f\",\n weight_lifter: \"1f3cb-fe0f\",\n \"woman-golfing\": \"1f3cc-fe0f-200d-2640-fe0f\",\n \"man-golfing\": \"1f3cc-fe0f-200d-2642-fe0f\",\n golfer: \"1f3cc-fe0f\",\n racing_motorcycle: \"1f3cd-fe0f\",\n racing_car: \"1f3ce-fe0f\",\n cricket_bat_and_ball: \"1f3cf\",\n volleyball: \"1f3d0\",\n field_hockey_stick_and_ball: \"1f3d1\",\n ice_hockey_stick_and_puck: \"1f3d2\",\n table_tennis_paddle_and_ball: \"1f3d3\",\n snow_capped_mountain: \"1f3d4-fe0f\",\n camping: \"1f3d5-fe0f\",\n beach_with_umbrella: \"1f3d6-fe0f\",\n building_construction: \"1f3d7-fe0f\",\n house_buildings: \"1f3d8-fe0f\",\n cityscape: \"1f3d9-fe0f\",\n derelict_house_building: \"1f3da-fe0f\",\n classical_building: \"1f3db-fe0f\",\n desert: \"1f3dc-fe0f\",\n desert_island: \"1f3dd-fe0f\",\n national_park: \"1f3de-fe0f\",\n stadium: \"1f3df-fe0f\",\n house: \"1f3e0\",\n house_with_garden: \"1f3e1\",\n office: \"1f3e2\",\n post_office: \"1f3e3\",\n european_post_office: \"1f3e4\",\n hospital: \"1f3e5\",\n bank: \"1f3e6\",\n atm: \"1f3e7\",\n hotel: \"1f3e8\",\n love_hotel: \"1f3e9\",\n convenience_store: \"1f3ea\",\n school: \"1f3eb\",\n department_store: \"1f3ec\",\n factory: \"1f3ed\",\n izakaya_lantern: \"1f3ee\",\n lantern: \"1f3ee\",\n japanese_castle: \"1f3ef\",\n european_castle: \"1f3f0\",\n \"rainbow-flag\": \"1f3f3-fe0f-200d-1f308\",\n transgender_flag: \"1f3f3-fe0f-200d-26a7-fe0f\",\n waving_white_flag: \"1f3f3-fe0f\",\n pirate_flag: \"1f3f4-200d-2620-fe0f\",\n \"flag-england\": \"1f3f4-e0067-e0062-e0065-e006e-e0067-e007f\",\n \"flag-scotland\": \"1f3f4-e0067-e0062-e0073-e0063-e0074-e007f\",\n \"flag-wales\": \"1f3f4-e0067-e0062-e0077-e006c-e0073-e007f\",\n waving_black_flag: \"1f3f4\",\n rosette: \"1f3f5-fe0f\",\n label: \"1f3f7-fe0f\",\n badminton_racquet_and_shuttlecock: \"1f3f8\",\n bow_and_arrow: \"1f3f9\",\n amphora: \"1f3fa\",\n \"skin-tone-2\": \"1f3fb\",\n \"skin-tone-3\": \"1f3fc\",\n \"skin-tone-4\": \"1f3fd\",\n \"skin-tone-5\": \"1f3fe\",\n \"skin-tone-6\": \"1f3ff\",\n rat: \"1f400\",\n mouse2: \"1f401\",\n ox: \"1f402\",\n water_buffalo: \"1f403\",\n cow2: \"1f404\",\n tiger2: \"1f405\",\n leopard: \"1f406\",\n rabbit2: \"1f407\",\n black_cat: \"1f408-200d-2b1b\",\n cat2: \"1f408\",\n dragon: \"1f409\",\n crocodile: \"1f40a\",\n whale2: \"1f40b\",\n snail: \"1f40c\",\n snake: \"1f40d\",\n racehorse: \"1f40e\",\n ram: \"1f40f\",\n goat: \"1f410\",\n sheep: \"1f411\",\n monkey: \"1f412\",\n rooster: \"1f413\",\n chicken: \"1f414\",\n service_dog: \"1f415-200d-1f9ba\",\n dog2: \"1f415\",\n pig2: \"1f416\",\n boar: \"1f417\",\n elephant: \"1f418\",\n octopus: \"1f419\",\n shell: \"1f41a\",\n bug: \"1f41b\",\n ant: \"1f41c\",\n bee: \"1f41d\",\n honeybee: \"1f41d\",\n ladybug: \"1f41e\",\n lady_beetle: \"1f41e\",\n fish: \"1f41f\",\n tropical_fish: \"1f420\",\n blowfish: \"1f421\",\n turtle: \"1f422\",\n hatching_chick: \"1f423\",\n baby_chick: \"1f424\",\n hatched_chick: \"1f425\",\n phoenix: \"1f426-200d-1f525\",\n black_bird: \"1f426-200d-2b1b\",\n bird: \"1f426\",\n penguin: \"1f427\",\n koala: \"1f428\",\n poodle: \"1f429\",\n dromedary_camel: \"1f42a\",\n camel: \"1f42b\",\n dolphin: \"1f42c\",\n flipper: \"1f42c\",\n mouse: \"1f42d\",\n cow: \"1f42e\",\n tiger: \"1f42f\",\n rabbit: \"1f430\",\n cat: \"1f431\",\n dragon_face: \"1f432\",\n whale: \"1f433\",\n horse: \"1f434\",\n monkey_face: \"1f435\",\n dog: \"1f436\",\n pig: \"1f437\",\n frog: \"1f438\",\n hamster: \"1f439\",\n wolf: \"1f43a\",\n polar_bear: \"1f43b-200d-2744-fe0f\",\n bear: \"1f43b\",\n panda_face: \"1f43c\",\n pig_nose: \"1f43d\",\n feet: \"1f43e\",\n paw_prints: \"1f43e\",\n chipmunk: \"1f43f-fe0f\",\n eyes: \"1f440\",\n \"eye-in-speech-bubble\": \"1f441-fe0f-200d-1f5e8-fe0f\",\n eye: \"1f441-fe0f\",\n ear: \"1f442\",\n nose: \"1f443\",\n lips: \"1f444\",\n tongue: \"1f445\",\n point_up_2: \"1f446\",\n point_down: \"1f447\",\n point_left: \"1f448\",\n point_right: \"1f449\",\n facepunch: \"1f44a\",\n punch: \"1f44a\",\n wave: \"1f44b\",\n ok_hand: \"1f44c\",\n \"+1\": \"1f44d\",\n thumbsup: \"1f44d\",\n \"-1\": \"1f44e\",\n thumbsdown: \"1f44e\",\n clap: \"1f44f\",\n open_hands: \"1f450\",\n crown: \"1f451\",\n womans_hat: \"1f452\",\n eyeglasses: \"1f453\",\n necktie: \"1f454\",\n shirt: \"1f455\",\n tshirt: \"1f455\",\n jeans: \"1f456\",\n dress: \"1f457\",\n kimono: \"1f458\",\n bikini: \"1f459\",\n womans_clothes: \"1f45a\",\n purse: \"1f45b\",\n handbag: \"1f45c\",\n pouch: \"1f45d\",\n mans_shoe: \"1f45e\",\n shoe: \"1f45e\",\n athletic_shoe: \"1f45f\",\n high_heel: \"1f460\",\n sandal: \"1f461\",\n boot: \"1f462\",\n footprints: \"1f463\",\n bust_in_silhouette: \"1f464\",\n busts_in_silhouette: \"1f465\",\n boy: \"1f466\",\n girl: \"1f467\",\n \"male-farmer\": \"1f468-200d-1f33e\",\n \"male-cook\": \"1f468-200d-1f373\",\n man_feeding_baby: \"1f468-200d-1f37c\",\n \"male-student\": \"1f468-200d-1f393\",\n \"male-singer\": \"1f468-200d-1f3a4\",\n \"male-artist\": \"1f468-200d-1f3a8\",\n \"male-teacher\": \"1f468-200d-1f3eb\",\n \"male-factory-worker\": \"1f468-200d-1f3ed\",\n \"man-boy-boy\": \"1f468-200d-1f466-200d-1f466\",\n \"man-boy\": \"1f468-200d-1f466\",\n \"man-girl-boy\": \"1f468-200d-1f467-200d-1f466\",\n \"man-girl-girl\": \"1f468-200d-1f467-200d-1f467\",\n \"man-girl\": \"1f468-200d-1f467\",\n \"man-man-boy\": \"1f468-200d-1f468-200d-1f466\",\n \"man-man-boy-boy\": \"1f468-200d-1f468-200d-1f466-200d-1f466\",\n \"man-man-girl\": \"1f468-200d-1f468-200d-1f467\",\n \"man-man-girl-boy\": \"1f468-200d-1f468-200d-1f467-200d-1f466\",\n \"man-man-girl-girl\": \"1f468-200d-1f468-200d-1f467-200d-1f467\",\n \"man-woman-boy\": \"1f468-200d-1f469-200d-1f466\",\n \"man-woman-boy-boy\": \"1f468-200d-1f469-200d-1f466-200d-1f466\",\n \"man-woman-girl\": \"1f468-200d-1f469-200d-1f467\",\n \"man-woman-girl-boy\": \"1f468-200d-1f469-200d-1f467-200d-1f466\",\n \"man-woman-girl-girl\": \"1f468-200d-1f469-200d-1f467-200d-1f467\",\n \"male-technologist\": \"1f468-200d-1f4bb\",\n \"male-office-worker\": \"1f468-200d-1f4bc\",\n \"male-mechanic\": \"1f468-200d-1f527\",\n \"male-scientist\": \"1f468-200d-1f52c\",\n \"male-astronaut\": \"1f468-200d-1f680\",\n \"male-firefighter\": \"1f468-200d-1f692\",\n man_with_white_cane_facing_right: \"1f468-200d-1f9af-200d-27a1-fe0f\",\n man_with_probing_cane: \"1f468-200d-1f9af\",\n red_haired_man: \"1f468-200d-1f9b0\",\n curly_haired_man: \"1f468-200d-1f9b1\",\n bald_man: \"1f468-200d-1f9b2\",\n white_haired_man: \"1f468-200d-1f9b3\",\n man_in_motorized_wheelchair_facing_right: \"1f468-200d-1f9bc-200d-27a1-fe0f\",\n man_in_motorized_wheelchair: \"1f468-200d-1f9bc\",\n man_in_manual_wheelchair_facing_right: \"1f468-200d-1f9bd-200d-27a1-fe0f\",\n man_in_manual_wheelchair: \"1f468-200d-1f9bd\",\n \"male-doctor\": \"1f468-200d-2695-fe0f\",\n \"male-judge\": \"1f468-200d-2696-fe0f\",\n \"male-pilot\": \"1f468-200d-2708-fe0f\",\n \"man-heart-man\": \"1f468-200d-2764-fe0f-200d-1f468\",\n \"man-kiss-man\": \"1f468-200d-2764-fe0f-200d-1f48b-200d-1f468\",\n man: \"1f468\",\n \"female-farmer\": \"1f469-200d-1f33e\",\n \"female-cook\": \"1f469-200d-1f373\",\n woman_feeding_baby: \"1f469-200d-1f37c\",\n \"female-student\": \"1f469-200d-1f393\",\n \"female-singer\": \"1f469-200d-1f3a4\",\n \"female-artist\": \"1f469-200d-1f3a8\",\n \"female-teacher\": \"1f469-200d-1f3eb\",\n \"female-factory-worker\": \"1f469-200d-1f3ed\",\n \"woman-boy-boy\": \"1f469-200d-1f466-200d-1f466\",\n \"woman-boy\": \"1f469-200d-1f466\",\n \"woman-girl-boy\": \"1f469-200d-1f467-200d-1f466\",\n \"woman-girl-girl\": \"1f469-200d-1f467-200d-1f467\",\n \"woman-girl\": \"1f469-200d-1f467\",\n \"woman-woman-boy\": \"1f469-200d-1f469-200d-1f466\",\n \"woman-woman-boy-boy\": \"1f469-200d-1f469-200d-1f466-200d-1f466\",\n \"woman-woman-girl\": \"1f469-200d-1f469-200d-1f467\",\n \"woman-woman-girl-boy\": \"1f469-200d-1f469-200d-1f467-200d-1f466\",\n \"woman-woman-girl-girl\": \"1f469-200d-1f469-200d-1f467-200d-1f467\",\n \"female-technologist\": \"1f469-200d-1f4bb\",\n \"female-office-worker\": \"1f469-200d-1f4bc\",\n \"female-mechanic\": \"1f469-200d-1f527\",\n \"female-scientist\": \"1f469-200d-1f52c\",\n \"female-astronaut\": \"1f469-200d-1f680\",\n \"female-firefighter\": \"1f469-200d-1f692\",\n woman_with_white_cane_facing_right: \"1f469-200d-1f9af-200d-27a1-fe0f\",\n woman_with_probing_cane: \"1f469-200d-1f9af\",\n red_haired_woman: \"1f469-200d-1f9b0\",\n curly_haired_woman: \"1f469-200d-1f9b1\",\n bald_woman: \"1f469-200d-1f9b2\",\n white_haired_woman: \"1f469-200d-1f9b3\",\n woman_in_motorized_wheelchair_facing_right: \"1f469-200d-1f9bc-200d-27a1-fe0f\",\n woman_in_motorized_wheelchair: \"1f469-200d-1f9bc\",\n woman_in_manual_wheelchair_facing_right: \"1f469-200d-1f9bd-200d-27a1-fe0f\",\n woman_in_manual_wheelchair: \"1f469-200d-1f9bd\",\n \"female-doctor\": \"1f469-200d-2695-fe0f\",\n \"female-judge\": \"1f469-200d-2696-fe0f\",\n \"female-pilot\": \"1f469-200d-2708-fe0f\",\n \"woman-heart-man\": \"1f469-200d-2764-fe0f-200d-1f468\",\n \"woman-heart-woman\": \"1f469-200d-2764-fe0f-200d-1f469\",\n \"woman-kiss-man\": \"1f469-200d-2764-fe0f-200d-1f48b-200d-1f468\",\n \"woman-kiss-woman\": \"1f469-200d-2764-fe0f-200d-1f48b-200d-1f469\",\n woman: \"1f469\",\n family: \"1f46a\",\n man_and_woman_holding_hands: \"1f46b\",\n woman_and_man_holding_hands: \"1f46b\",\n couple: \"1f46b\",\n two_men_holding_hands: \"1f46c\",\n men_holding_hands: \"1f46c\",\n two_women_holding_hands: \"1f46d\",\n women_holding_hands: \"1f46d\",\n \"female-police-officer\": \"1f46e-200d-2640-fe0f\",\n \"male-police-officer\": \"1f46e-200d-2642-fe0f\",\n cop: \"1f46e\",\n \"women-with-bunny-ears-partying\": \"1f46f-200d-2640-fe0f\",\n \"woman-with-bunny-ears-partying\": \"1f46f-200d-2640-fe0f\",\n \"men-with-bunny-ears-partying\": \"1f46f-200d-2642-fe0f\",\n \"man-with-bunny-ears-partying\": \"1f46f-200d-2642-fe0f\",\n dancers: \"1f46f\",\n woman_with_veil: \"1f470-200d-2640-fe0f\",\n man_with_veil: \"1f470-200d-2642-fe0f\",\n bride_with_veil: \"1f470\",\n \"blond-haired-woman\": \"1f471-200d-2640-fe0f\",\n \"blond-haired-man\": \"1f471-200d-2642-fe0f\",\n person_with_blond_hair: \"1f471\",\n man_with_gua_pi_mao: \"1f472\",\n \"woman-wearing-turban\": \"1f473-200d-2640-fe0f\",\n \"man-wearing-turban\": \"1f473-200d-2642-fe0f\",\n man_with_turban: \"1f473\",\n older_man: \"1f474\",\n older_woman: \"1f475\",\n baby: \"1f476\",\n \"female-construction-worker\": \"1f477-200d-2640-fe0f\",\n \"male-construction-worker\": \"1f477-200d-2642-fe0f\",\n construction_worker: \"1f477\",\n princess: \"1f478\",\n japanese_ogre: \"1f479\",\n japanese_goblin: \"1f47a\",\n ghost: \"1f47b\",\n angel: \"1f47c\",\n alien: \"1f47d\",\n space_invader: \"1f47e\",\n imp: \"1f47f\",\n skull: \"1f480\",\n \"woman-tipping-hand\": \"1f481-200d-2640-fe0f\",\n \"man-tipping-hand\": \"1f481-200d-2642-fe0f\",\n information_desk_person: \"1f481\",\n \"female-guard\": \"1f482-200d-2640-fe0f\",\n \"male-guard\": \"1f482-200d-2642-fe0f\",\n guardsman: \"1f482\",\n dancer: \"1f483\",\n lipstick: \"1f484\",\n nail_care: \"1f485\",\n \"woman-getting-massage\": \"1f486-200d-2640-fe0f\",\n \"man-getting-massage\": \"1f486-200d-2642-fe0f\",\n massage: \"1f486\",\n \"woman-getting-haircut\": \"1f487-200d-2640-fe0f\",\n \"man-getting-haircut\": \"1f487-200d-2642-fe0f\",\n haircut: \"1f487\",\n barber: \"1f488\",\n syringe: \"1f489\",\n pill: \"1f48a\",\n kiss: \"1f48b\",\n love_letter: \"1f48c\",\n ring: \"1f48d\",\n gem: \"1f48e\",\n couplekiss: \"1f48f\",\n bouquet: \"1f490\",\n couple_with_heart: \"1f491\",\n wedding: \"1f492\",\n heartbeat: \"1f493\",\n broken_heart: \"1f494\",\n two_hearts: \"1f495\",\n sparkling_heart: \"1f496\",\n heartpulse: \"1f497\",\n cupid: \"1f498\",\n blue_heart: \"1f499\",\n green_heart: \"1f49a\",\n yellow_heart: \"1f49b\",\n purple_heart: \"1f49c\",\n gift_heart: \"1f49d\",\n revolving_hearts: \"1f49e\",\n heart_decoration: \"1f49f\",\n diamond_shape_with_a_dot_inside: \"1f4a0\",\n bulb: \"1f4a1\",\n anger: \"1f4a2\",\n bomb: \"1f4a3\",\n zzz: \"1f4a4\",\n boom: \"1f4a5\",\n collision: \"1f4a5\",\n sweat_drops: \"1f4a6\",\n droplet: \"1f4a7\",\n dash: \"1f4a8\",\n hankey: \"1f4a9\",\n poop: \"1f4a9\",\n shit: \"1f4a9\",\n muscle: \"1f4aa\",\n dizzy: \"1f4ab\",\n speech_balloon: \"1f4ac\",\n thought_balloon: \"1f4ad\",\n white_flower: \"1f4ae\",\n moneybag: \"1f4b0\",\n currency_exchange: \"1f4b1\",\n heavy_dollar_sign: \"1f4b2\",\n credit_card: \"1f4b3\",\n yen: \"1f4b4\",\n dollar: \"1f4b5\",\n euro: \"1f4b6\",\n pound: \"1f4b7\",\n money_with_wings: \"1f4b8\",\n chart: \"1f4b9\",\n seat: \"1f4ba\",\n computer: \"1f4bb\",\n briefcase: \"1f4bc\",\n minidisc: \"1f4bd\",\n floppy_disk: \"1f4be\",\n cd: \"1f4bf\",\n dvd: \"1f4c0\",\n file_folder: \"1f4c1\",\n open_file_folder: \"1f4c2\",\n page_with_curl: \"1f4c3\",\n page_facing_up: \"1f4c4\",\n date: \"1f4c5\",\n calendar: \"1f4c6\",\n card_index: \"1f4c7\",\n chart_with_upwards_trend: \"1f4c8\",\n chart_with_downwards_trend: \"1f4c9\",\n bar_chart: \"1f4ca\",\n clipboard: \"1f4cb\",\n pushpin: \"1f4cc\",\n round_pushpin: \"1f4cd\",\n paperclip: \"1f4ce\",\n straight_ruler: \"1f4cf\",\n triangular_ruler: \"1f4d0\",\n bookmark_tabs: \"1f4d1\",\n ledger: \"1f4d2\",\n notebook: \"1f4d3\",\n notebook_with_decorative_cover: \"1f4d4\",\n closed_book: \"1f4d5\",\n book: \"1f4d6\",\n open_book: \"1f4d6\",\n green_book: \"1f4d7\",\n blue_book: \"1f4d8\",\n orange_book: \"1f4d9\",\n books: \"1f4da\",\n name_badge: \"1f4db\",\n scroll: \"1f4dc\",\n memo: \"1f4dd\",\n pencil: \"1f4dd\",\n telephone_receiver: \"1f4de\",\n pager: \"1f4df\",\n fax: \"1f4e0\",\n satellite_antenna: \"1f4e1\",\n loudspeaker: \"1f4e2\",\n mega: \"1f4e3\",\n outbox_tray: \"1f4e4\",\n inbox_tray: \"1f4e5\",\n package: \"1f4e6\",\n \"e-mail\": \"1f4e7\",\n incoming_envelope: \"1f4e8\",\n envelope_with_arrow: \"1f4e9\",\n mailbox_closed: \"1f4ea\",\n mailbox: \"1f4eb\",\n mailbox_with_mail: \"1f4ec\",\n mailbox_with_no_mail: \"1f4ed\",\n postbox: \"1f4ee\",\n postal_horn: \"1f4ef\",\n newspaper: \"1f4f0\",\n iphone: \"1f4f1\",\n calling: \"1f4f2\",\n vibration_mode: \"1f4f3\",\n mobile_phone_off: \"1f4f4\",\n no_mobile_phones: \"1f4f5\",\n signal_strength: \"1f4f6\",\n camera: \"1f4f7\",\n camera_with_flash: \"1f4f8\",\n video_camera: \"1f4f9\",\n tv: \"1f4fa\",\n radio: \"1f4fb\",\n vhs: \"1f4fc\",\n film_projector: \"1f4fd-fe0f\",\n prayer_beads: \"1f4ff\",\n twisted_rightwards_arrows: \"1f500\",\n repeat: \"1f501\",\n repeat_one: \"1f502\",\n arrows_clockwise: \"1f503\",\n arrows_counterclockwise: \"1f504\",\n low_brightness: \"1f505\",\n high_brightness: \"1f506\",\n mute: \"1f507\",\n speaker: \"1f508\",\n sound: \"1f509\",\n loud_sound: \"1f50a\",\n battery: \"1f50b\",\n electric_plug: \"1f50c\",\n mag: \"1f50d\",\n mag_right: \"1f50e\",\n lock_with_ink_pen: \"1f50f\",\n closed_lock_with_key: \"1f510\",\n key: \"1f511\",\n lock: \"1f512\",\n unlock: \"1f513\",\n bell: \"1f514\",\n no_bell: \"1f515\",\n bookmark: \"1f516\",\n link: \"1f517\",\n radio_button: \"1f518\",\n back: \"1f519\",\n end: \"1f51a\",\n on: \"1f51b\",\n soon: \"1f51c\",\n top: \"1f51d\",\n underage: \"1f51e\",\n keycap_ten: \"1f51f\",\n capital_abcd: \"1f520\",\n abcd: \"1f521\",\n symbols: \"1f523\",\n abc: \"1f524\",\n fire: \"1f525\",\n flashlight: \"1f526\",\n wrench: \"1f527\",\n hammer: \"1f528\",\n nut_and_bolt: \"1f529\",\n hocho: \"1f52a\",\n knife: \"1f52a\",\n gun: \"1f52b\",\n microscope: \"1f52c\",\n telescope: \"1f52d\",\n crystal_ball: \"1f52e\",\n six_pointed_star: \"1f52f\",\n beginner: \"1f530\",\n trident: \"1f531\",\n black_square_button: \"1f532\",\n white_square_button: \"1f533\",\n red_circle: \"1f534\",\n large_blue_circle: \"1f535\",\n large_orange_diamond: \"1f536\",\n large_blue_diamond: \"1f537\",\n small_orange_diamond: \"1f538\",\n small_blue_diamond: \"1f539\",\n small_red_triangle: \"1f53a\",\n small_red_triangle_down: \"1f53b\",\n arrow_up_small: \"1f53c\",\n arrow_down_small: \"1f53d\",\n om_symbol: \"1f549-fe0f\",\n dove_of_peace: \"1f54a-fe0f\",\n kaaba: \"1f54b\",\n mosque: \"1f54c\",\n synagogue: \"1f54d\",\n menorah_with_nine_branches: \"1f54e\",\n clock1: \"1f550\",\n clock2: \"1f551\",\n clock3: \"1f552\",\n clock4: \"1f553\",\n clock5: \"1f554\",\n clock6: \"1f555\",\n clock7: \"1f556\",\n clock8: \"1f557\",\n clock9: \"1f558\",\n clock10: \"1f559\",\n clock11: \"1f55a\",\n clock12: \"1f55b\",\n clock130: \"1f55c\",\n clock230: \"1f55d\",\n clock330: \"1f55e\",\n clock430: \"1f55f\",\n clock530: \"1f560\",\n clock630: \"1f561\",\n clock730: \"1f562\",\n clock830: \"1f563\",\n clock930: \"1f564\",\n clock1030: \"1f565\",\n clock1130: \"1f566\",\n clock1230: \"1f567\",\n candle: \"1f56f-fe0f\",\n mantelpiece_clock: \"1f570-fe0f\",\n hole: \"1f573-fe0f\",\n man_in_business_suit_levitating: \"1f574-fe0f\",\n \"female-detective\": \"1f575-fe0f-200d-2640-fe0f\",\n \"male-detective\": \"1f575-fe0f-200d-2642-fe0f\",\n sleuth_or_spy: \"1f575-fe0f\",\n dark_sunglasses: \"1f576-fe0f\",\n spider: \"1f577-fe0f\",\n spider_web: \"1f578-fe0f\",\n joystick: \"1f579-fe0f\",\n man_dancing: \"1f57a\",\n linked_paperclips: \"1f587-fe0f\",\n lower_left_ballpoint_pen: \"1f58a-fe0f\",\n lower_left_fountain_pen: \"1f58b-fe0f\",\n lower_left_paintbrush: \"1f58c-fe0f\",\n lower_left_crayon: \"1f58d-fe0f\",\n raised_hand_with_fingers_splayed: \"1f590-fe0f\",\n middle_finger: \"1f595\",\n reversed_hand_with_middle_finger_extended: \"1f595\",\n \"spock-hand\": \"1f596\",\n black_heart: \"1f5a4\",\n desktop_computer: \"1f5a5-fe0f\",\n printer: \"1f5a8-fe0f\",\n three_button_mouse: \"1f5b1-fe0f\",\n trackball: \"1f5b2-fe0f\",\n frame_with_picture: \"1f5bc-fe0f\",\n card_index_dividers: \"1f5c2-fe0f\",\n card_file_box: \"1f5c3-fe0f\",\n file_cabinet: \"1f5c4-fe0f\",\n wastebasket: \"1f5d1-fe0f\",\n spiral_note_pad: \"1f5d2-fe0f\",\n spiral_calendar_pad: \"1f5d3-fe0f\",\n compression: \"1f5dc-fe0f\",\n old_key: \"1f5dd-fe0f\",\n rolled_up_newspaper: \"1f5de-fe0f\",\n dagger_knife: \"1f5e1-fe0f\",\n speaking_head_in_silhouette: \"1f5e3-fe0f\",\n left_speech_bubble: \"1f5e8-fe0f\",\n right_anger_bubble: \"1f5ef-fe0f\",\n ballot_box_with_ballot: \"1f5f3-fe0f\",\n world_map: \"1f5fa-fe0f\",\n mount_fuji: \"1f5fb\",\n tokyo_tower: \"1f5fc\",\n statue_of_liberty: \"1f5fd\",\n japan: \"1f5fe\",\n moyai: \"1f5ff\",\n grinning: \"1f600\",\n grin: \"1f601\",\n joy: \"1f602\",\n smiley: \"1f603\",\n smile: \"1f604\",\n sweat_smile: \"1f605\",\n laughing: \"1f606\",\n satisfied: \"1f606\",\n innocent: \"1f607\",\n smiling_imp: \"1f608\",\n wink: \"1f609\",\n blush: \"1f60a\",\n yum: \"1f60b\",\n relieved: \"1f60c\",\n heart_eyes: \"1f60d\",\n sunglasses: \"1f60e\",\n smirk: \"1f60f\",\n neutral_face: \"1f610\",\n expressionless: \"1f611\",\n unamused: \"1f612\",\n sweat: \"1f613\",\n pensive: \"1f614\",\n confused: \"1f615\",\n confounded: \"1f616\",\n kissing: \"1f617\",\n kissing_heart: \"1f618\",\n kissing_smiling_eyes: \"1f619\",\n kissing_closed_eyes: \"1f61a\",\n stuck_out_tongue: \"1f61b\",\n stuck_out_tongue_winking_eye: \"1f61c\",\n stuck_out_tongue_closed_eyes: \"1f61d\",\n disappointed: \"1f61e\",\n worried: \"1f61f\",\n angry: \"1f620\",\n rage: \"1f621\",\n cry: \"1f622\",\n persevere: \"1f623\",\n triumph: \"1f624\",\n disappointed_relieved: \"1f625\",\n frowning: \"1f626\",\n anguished: \"1f627\",\n fearful: \"1f628\",\n weary: \"1f629\",\n sleepy: \"1f62a\",\n tired_face: \"1f62b\",\n grimacing: \"1f62c\",\n sob: \"1f62d\",\n face_exhaling: \"1f62e-200d-1f4a8\",\n open_mouth: \"1f62e\",\n hushed: \"1f62f\",\n cold_sweat: \"1f630\",\n scream: \"1f631\",\n astonished: \"1f632\",\n flushed: \"1f633\",\n sleeping: \"1f634\",\n face_with_spiral_eyes: \"1f635-200d-1f4ab\",\n dizzy_face: \"1f635\",\n face_in_clouds: \"1f636-200d-1f32b-fe0f\",\n no_mouth: \"1f636\",\n mask: \"1f637\",\n smile_cat: \"1f638\",\n joy_cat: \"1f639\",\n smiley_cat: \"1f63a\",\n heart_eyes_cat: \"1f63b\",\n smirk_cat: \"1f63c\",\n kissing_cat: \"1f63d\",\n pouting_cat: \"1f63e\",\n crying_cat_face: \"1f63f\",\n scream_cat: \"1f640\",\n slightly_frowning_face: \"1f641\",\n head_shaking_horizontally: \"1f642-200d-2194-fe0f\",\n head_shaking_vertically: \"1f642-200d-2195-fe0f\",\n slightly_smiling_face: \"1f642\",\n upside_down_face: \"1f643\",\n face_with_rolling_eyes: \"1f644\",\n \"woman-gesturing-no\": \"1f645-200d-2640-fe0f\",\n \"man-gesturing-no\": \"1f645-200d-2642-fe0f\",\n no_good: \"1f645\",\n \"woman-gesturing-ok\": \"1f646-200d-2640-fe0f\",\n \"man-gesturing-ok\": \"1f646-200d-2642-fe0f\",\n ok_woman: \"1f646\",\n \"woman-bowing\": \"1f647-200d-2640-fe0f\",\n \"man-bowing\": \"1f647-200d-2642-fe0f\",\n bow: \"1f647\",\n see_no_evil: \"1f648\",\n hear_no_evil: \"1f649\",\n speak_no_evil: \"1f64a\",\n \"woman-raising-hand\": \"1f64b-200d-2640-fe0f\",\n \"man-raising-hand\": \"1f64b-200d-2642-fe0f\",\n raising_hand: \"1f64b\",\n raised_hands: \"1f64c\",\n \"woman-frowning\": \"1f64d-200d-2640-fe0f\",\n \"man-frowning\": \"1f64d-200d-2642-fe0f\",\n person_frowning: \"1f64d\",\n \"woman-pouting\": \"1f64e-200d-2640-fe0f\",\n \"man-pouting\": \"1f64e-200d-2642-fe0f\",\n person_with_pouting_face: \"1f64e\",\n pray: \"1f64f\",\n rocket: \"1f680\",\n helicopter: \"1f681\",\n steam_locomotive: \"1f682\",\n railway_car: \"1f683\",\n bullettrain_side: \"1f684\",\n bullettrain_front: \"1f685\",\n train2: \"1f686\",\n metro: \"1f687\",\n light_rail: \"1f688\",\n station: \"1f689\",\n tram: \"1f68a\",\n train: \"1f68b\",\n bus: \"1f68c\",\n oncoming_bus: \"1f68d\",\n trolleybus: \"1f68e\",\n busstop: \"1f68f\",\n minibus: \"1f690\",\n ambulance: \"1f691\",\n fire_engine: \"1f692\",\n police_car: \"1f693\",\n oncoming_police_car: \"1f694\",\n taxi: \"1f695\",\n oncoming_taxi: \"1f696\",\n car: \"1f697\",\n red_car: \"1f697\",\n oncoming_automobile: \"1f698\",\n blue_car: \"1f699\",\n truck: \"1f69a\",\n articulated_lorry: \"1f69b\",\n tractor: \"1f69c\",\n monorail: \"1f69d\",\n mountain_railway: \"1f69e\",\n suspension_railway: \"1f69f\",\n mountain_cableway: \"1f6a0\",\n aerial_tramway: \"1f6a1\",\n ship: \"1f6a2\",\n \"woman-rowing-boat\": \"1f6a3-200d-2640-fe0f\",\n \"man-rowing-boat\": \"1f6a3-200d-2642-fe0f\",\n rowboat: \"1f6a3\",\n speedboat: \"1f6a4\",\n traffic_light: \"1f6a5\",\n vertical_traffic_light: \"1f6a6\",\n construction: \"1f6a7\",\n rotating_light: \"1f6a8\",\n triangular_flag_on_post: \"1f6a9\",\n door: \"1f6aa\",\n no_entry_sign: \"1f6ab\",\n smoking: \"1f6ac\",\n no_smoking: \"1f6ad\",\n put_litter_in_its_place: \"1f6ae\",\n do_not_litter: \"1f6af\",\n potable_water: \"1f6b0\",\n \"non-potable_water\": \"1f6b1\",\n bike: \"1f6b2\",\n no_bicycles: \"1f6b3\",\n \"woman-biking\": \"1f6b4-200d-2640-fe0f\",\n \"man-biking\": \"1f6b4-200d-2642-fe0f\",\n bicyclist: \"1f6b4\",\n \"woman-mountain-biking\": \"1f6b5-200d-2640-fe0f\",\n \"man-mountain-biking\": \"1f6b5-200d-2642-fe0f\",\n mountain_bicyclist: \"1f6b5\",\n \"woman-walking\": \"1f6b6-200d-2640-fe0f\",\n woman_walking_facing_right: \"1f6b6-200d-2640-fe0f-200d-27a1-fe0f\",\n \"man-walking\": \"1f6b6-200d-2642-fe0f\",\n man_walking_facing_right: \"1f6b6-200d-2642-fe0f-200d-27a1-fe0f\",\n person_walking_facing_right: \"1f6b6-200d-27a1-fe0f\",\n walking: \"1f6b6\",\n no_pedestrians: \"1f6b7\",\n children_crossing: \"1f6b8\",\n mens: \"1f6b9\",\n womens: \"1f6ba\",\n restroom: \"1f6bb\",\n baby_symbol: \"1f6bc\",\n toilet: \"1f6bd\",\n wc: \"1f6be\",\n shower: \"1f6bf\",\n bath: \"1f6c0\",\n bathtub: \"1f6c1\",\n passport_control: \"1f6c2\",\n customs: \"1f6c3\",\n baggage_claim: \"1f6c4\",\n left_luggage: \"1f6c5\",\n couch_and_lamp: \"1f6cb-fe0f\",\n sleeping_accommodation: \"1f6cc\",\n shopping_bags: \"1f6cd-fe0f\",\n bellhop_bell: \"1f6ce-fe0f\",\n bed: \"1f6cf-fe0f\",\n place_of_worship: \"1f6d0\",\n octagonal_sign: \"1f6d1\",\n shopping_trolley: \"1f6d2\",\n hindu_temple: \"1f6d5\",\n hut: \"1f6d6\",\n elevator: \"1f6d7\",\n wireless: \"1f6dc\",\n playground_slide: \"1f6dd\",\n wheel: \"1f6de\",\n ring_buoy: \"1f6df\",\n hammer_and_wrench: \"1f6e0-fe0f\",\n shield: \"1f6e1-fe0f\",\n oil_drum: \"1f6e2-fe0f\",\n motorway: \"1f6e3-fe0f\",\n railway_track: \"1f6e4-fe0f\",\n motor_boat: \"1f6e5-fe0f\",\n small_airplane: \"1f6e9-fe0f\",\n airplane_departure: \"1f6eb\",\n airplane_arriving: \"1f6ec\",\n satellite: \"1f6f0-fe0f\",\n passenger_ship: \"1f6f3-fe0f\",\n scooter: \"1f6f4\",\n motor_scooter: \"1f6f5\",\n canoe: \"1f6f6\",\n sled: \"1f6f7\",\n flying_saucer: \"1f6f8\",\n skateboard: \"1f6f9\",\n auto_rickshaw: \"1f6fa\",\n pickup_truck: \"1f6fb\",\n roller_skate: \"1f6fc\",\n large_orange_circle: \"1f7e0\",\n large_yellow_circle: \"1f7e1\",\n large_green_circle: \"1f7e2\",\n large_purple_circle: \"1f7e3\",\n large_brown_circle: \"1f7e4\",\n large_red_square: \"1f7e5\",\n large_blue_square: \"1f7e6\",\n large_orange_square: \"1f7e7\",\n large_yellow_square: \"1f7e8\",\n large_green_square: \"1f7e9\",\n large_purple_square: \"1f7ea\",\n large_brown_square: \"1f7eb\",\n heavy_equals_sign: \"1f7f0\",\n pinched_fingers: \"1f90c\",\n white_heart: \"1f90d\",\n brown_heart: \"1f90e\",\n pinching_hand: \"1f90f\",\n zipper_mouth_face: \"1f910\",\n money_mouth_face: \"1f911\",\n face_with_thermometer: \"1f912\",\n nerd_face: \"1f913\",\n thinking_face: \"1f914\",\n face_with_head_bandage: \"1f915\",\n robot_face: \"1f916\",\n hugging_face: \"1f917\",\n the_horns: \"1f918\",\n sign_of_the_horns: \"1f918\",\n call_me_hand: \"1f919\",\n raised_back_of_hand: \"1f91a\",\n \"left-facing_fist\": \"1f91b\",\n \"right-facing_fist\": \"1f91c\",\n handshake: \"1f91d\",\n crossed_fingers: \"1f91e\",\n hand_with_index_and_middle_fingers_crossed: \"1f91e\",\n i_love_you_hand_sign: \"1f91f\",\n face_with_cowboy_hat: \"1f920\",\n clown_face: \"1f921\",\n nauseated_face: \"1f922\",\n rolling_on_the_floor_laughing: \"1f923\",\n drooling_face: \"1f924\",\n lying_face: \"1f925\",\n \"woman-facepalming\": \"1f926-200d-2640-fe0f\",\n \"man-facepalming\": \"1f926-200d-2642-fe0f\",\n face_palm: \"1f926\",\n sneezing_face: \"1f927\",\n face_with_raised_eyebrow: \"1f928\",\n face_with_one_eyebrow_raised: \"1f928\",\n \"star-struck\": \"1f929\",\n grinning_face_with_star_eyes: \"1f929\",\n zany_face: \"1f92a\",\n grinning_face_with_one_large_and_one_small_eye: \"1f92a\",\n shushing_face: \"1f92b\",\n face_with_finger_covering_closed_lips: \"1f92b\",\n face_with_symbols_on_mouth: \"1f92c\",\n serious_face_with_symbols_covering_mouth: \"1f92c\",\n face_with_hand_over_mouth: \"1f92d\",\n smiling_face_with_smiling_eyes_and_hand_covering_mouth: \"1f92d\",\n face_vomiting: \"1f92e\",\n face_with_open_mouth_vomiting: \"1f92e\",\n exploding_head: \"1f92f\",\n shocked_face_with_exploding_head: \"1f92f\",\n pregnant_woman: \"1f930\",\n \"breast-feeding\": \"1f931\",\n palms_up_together: \"1f932\",\n selfie: \"1f933\",\n prince: \"1f934\",\n woman_in_tuxedo: \"1f935-200d-2640-fe0f\",\n man_in_tuxedo: \"1f935-200d-2642-fe0f\",\n person_in_tuxedo: \"1f935\",\n mrs_claus: \"1f936\",\n mother_christmas: \"1f936\",\n \"woman-shrugging\": \"1f937-200d-2640-fe0f\",\n \"man-shrugging\": \"1f937-200d-2642-fe0f\",\n shrug: \"1f937\",\n \"woman-cartwheeling\": \"1f938-200d-2640-fe0f\",\n \"man-cartwheeling\": \"1f938-200d-2642-fe0f\",\n person_doing_cartwheel: \"1f938\",\n \"woman-juggling\": \"1f939-200d-2640-fe0f\",\n \"man-juggling\": \"1f939-200d-2642-fe0f\",\n juggling: \"1f939\",\n fencer: \"1f93a\",\n \"woman-wrestling\": \"1f93c-200d-2640-fe0f\",\n \"man-wrestling\": \"1f93c-200d-2642-fe0f\",\n wrestlers: \"1f93c\",\n \"woman-playing-water-polo\": \"1f93d-200d-2640-fe0f\",\n \"man-playing-water-polo\": \"1f93d-200d-2642-fe0f\",\n water_polo: \"1f93d\",\n \"woman-playing-handball\": \"1f93e-200d-2640-fe0f\",\n \"man-playing-handball\": \"1f93e-200d-2642-fe0f\",\n handball: \"1f93e\",\n diving_mask: \"1f93f\",\n wilted_flower: \"1f940\",\n drum_with_drumsticks: \"1f941\",\n clinking_glasses: \"1f942\",\n tumbler_glass: \"1f943\",\n spoon: \"1f944\",\n goal_net: \"1f945\",\n first_place_medal: \"1f947\",\n second_place_medal: \"1f948\",\n third_place_medal: \"1f949\",\n boxing_glove: \"1f94a\",\n martial_arts_uniform: \"1f94b\",\n curling_stone: \"1f94c\",\n lacrosse: \"1f94d\",\n softball: \"1f94e\",\n flying_disc: \"1f94f\",\n croissant: \"1f950\",\n avocado: \"1f951\",\n cucumber: \"1f952\",\n bacon: \"1f953\",\n potato: \"1f954\",\n carrot: \"1f955\",\n baguette_bread: \"1f956\",\n green_salad: \"1f957\",\n shallow_pan_of_food: \"1f958\",\n stuffed_flatbread: \"1f959\",\n egg: \"1f95a\",\n glass_of_milk: \"1f95b\",\n peanuts: \"1f95c\",\n kiwifruit: \"1f95d\",\n pancakes: \"1f95e\",\n dumpling: \"1f95f\",\n fortune_cookie: \"1f960\",\n takeout_box: \"1f961\",\n chopsticks: \"1f962\",\n bowl_with_spoon: \"1f963\",\n cup_with_straw: \"1f964\",\n coconut: \"1f965\",\n broccoli: \"1f966\",\n pie: \"1f967\",\n pretzel: \"1f968\",\n cut_of_meat: \"1f969\",\n sandwich: \"1f96a\",\n canned_food: \"1f96b\",\n leafy_green: \"1f96c\",\n mango: \"1f96d\",\n moon_cake: \"1f96e\",\n bagel: \"1f96f\",\n smiling_face_with_3_hearts: \"1f970\",\n yawning_face: \"1f971\",\n smiling_face_with_tear: \"1f972\",\n partying_face: \"1f973\",\n woozy_face: \"1f974\",\n hot_face: \"1f975\",\n cold_face: \"1f976\",\n ninja: \"1f977\",\n disguised_face: \"1f978\",\n face_holding_back_tears: \"1f979\",\n pleading_face: \"1f97a\",\n sari: \"1f97b\",\n lab_coat: \"1f97c\",\n goggles: \"1f97d\",\n hiking_boot: \"1f97e\",\n womans_flat_shoe: \"1f97f\",\n crab: \"1f980\",\n lion_face: \"1f981\",\n scorpion: \"1f982\",\n turkey: \"1f983\",\n unicorn_face: \"1f984\",\n eagle: \"1f985\",\n duck: \"1f986\",\n bat: \"1f987\",\n shark: \"1f988\",\n owl: \"1f989\",\n fox_face: \"1f98a\",\n butterfly: \"1f98b\",\n deer: \"1f98c\",\n gorilla: \"1f98d\",\n lizard: \"1f98e\",\n rhinoceros: \"1f98f\",\n shrimp: \"1f990\",\n squid: \"1f991\",\n giraffe_face: \"1f992\",\n zebra_face: \"1f993\",\n hedgehog: \"1f994\",\n sauropod: \"1f995\",\n \"t-rex\": \"1f996\",\n cricket: \"1f997\",\n kangaroo: \"1f998\",\n llama: \"1f999\",\n peacock: \"1f99a\",\n hippopotamus: \"1f99b\",\n parrot: \"1f99c\",\n raccoon: \"1f99d\",\n lobster: \"1f99e\",\n mosquito: \"1f99f\",\n microbe: \"1f9a0\",\n badger: \"1f9a1\",\n swan: \"1f9a2\",\n mammoth: \"1f9a3\",\n dodo: \"1f9a4\",\n sloth: \"1f9a5\",\n otter: \"1f9a6\",\n orangutan: \"1f9a7\",\n skunk: \"1f9a8\",\n flamingo: \"1f9a9\",\n oyster: \"1f9aa\",\n beaver: \"1f9ab\",\n bison: \"1f9ac\",\n seal: \"1f9ad\",\n guide_dog: \"1f9ae\",\n probing_cane: \"1f9af\",\n bone: \"1f9b4\",\n leg: \"1f9b5\",\n foot: \"1f9b6\",\n tooth: \"1f9b7\",\n female_superhero: \"1f9b8-200d-2640-fe0f\",\n male_superhero: \"1f9b8-200d-2642-fe0f\",\n superhero: \"1f9b8\",\n female_supervillain: \"1f9b9-200d-2640-fe0f\",\n male_supervillain: \"1f9b9-200d-2642-fe0f\",\n supervillain: \"1f9b9\",\n safety_vest: \"1f9ba\",\n ear_with_hearing_aid: \"1f9bb\",\n motorized_wheelchair: \"1f9bc\",\n manual_wheelchair: \"1f9bd\",\n mechanical_arm: \"1f9be\",\n mechanical_leg: \"1f9bf\",\n cheese_wedge: \"1f9c0\",\n cupcake: \"1f9c1\",\n salt: \"1f9c2\",\n beverage_box: \"1f9c3\",\n garlic: \"1f9c4\",\n onion: \"1f9c5\",\n falafel: \"1f9c6\",\n waffle: \"1f9c7\",\n butter: \"1f9c8\",\n mate_drink: \"1f9c9\",\n ice_cube: \"1f9ca\",\n bubble_tea: \"1f9cb\",\n troll: \"1f9cc\",\n woman_standing: \"1f9cd-200d-2640-fe0f\",\n man_standing: \"1f9cd-200d-2642-fe0f\",\n standing_person: \"1f9cd\",\n woman_kneeling: \"1f9ce-200d-2640-fe0f\",\n woman_kneeling_facing_right: \"1f9ce-200d-2640-fe0f-200d-27a1-fe0f\",\n man_kneeling: \"1f9ce-200d-2642-fe0f\",\n man_kneeling_facing_right: \"1f9ce-200d-2642-fe0f-200d-27a1-fe0f\",\n person_kneeling_facing_right: \"1f9ce-200d-27a1-fe0f\",\n kneeling_person: \"1f9ce\",\n deaf_woman: \"1f9cf-200d-2640-fe0f\",\n deaf_man: \"1f9cf-200d-2642-fe0f\",\n deaf_person: \"1f9cf\",\n face_with_monocle: \"1f9d0\",\n farmer: \"1f9d1-200d-1f33e\",\n cook: \"1f9d1-200d-1f373\",\n person_feeding_baby: \"1f9d1-200d-1f37c\",\n mx_claus: \"1f9d1-200d-1f384\",\n student: \"1f9d1-200d-1f393\",\n singer: \"1f9d1-200d-1f3a4\",\n artist: \"1f9d1-200d-1f3a8\",\n teacher: \"1f9d1-200d-1f3eb\",\n factory_worker: \"1f9d1-200d-1f3ed\",\n technologist: \"1f9d1-200d-1f4bb\",\n office_worker: \"1f9d1-200d-1f4bc\",\n mechanic: \"1f9d1-200d-1f527\",\n scientist: \"1f9d1-200d-1f52c\",\n astronaut: \"1f9d1-200d-1f680\",\n firefighter: \"1f9d1-200d-1f692\",\n people_holding_hands: \"1f9d1-200d-1f91d-200d-1f9d1\",\n person_with_white_cane_facing_right: \"1f9d1-200d-1f9af-200d-27a1-fe0f\",\n person_with_probing_cane: \"1f9d1-200d-1f9af\",\n red_haired_person: \"1f9d1-200d-1f9b0\",\n curly_haired_person: \"1f9d1-200d-1f9b1\",\n bald_person: \"1f9d1-200d-1f9b2\",\n white_haired_person: \"1f9d1-200d-1f9b3\",\n person_in_motorized_wheelchair_facing_right: \"1f9d1-200d-1f9bc-200d-27a1-fe0f\",\n person_in_motorized_wheelchair: \"1f9d1-200d-1f9bc\",\n person_in_manual_wheelchair_facing_right: \"1f9d1-200d-1f9bd-200d-27a1-fe0f\",\n person_in_manual_wheelchair: \"1f9d1-200d-1f9bd\",\n family_adult_adult_child: \"1f9d1-200d-1f9d1-200d-1f9d2\",\n family_adult_adult_child_child: \"1f9d1-200d-1f9d1-200d-1f9d2-200d-1f9d2\",\n family_adult_child_child: \"1f9d1-200d-1f9d2-200d-1f9d2\",\n family_adult_child: \"1f9d1-200d-1f9d2\",\n health_worker: \"1f9d1-200d-2695-fe0f\",\n judge: \"1f9d1-200d-2696-fe0f\",\n pilot: \"1f9d1-200d-2708-fe0f\",\n adult: \"1f9d1\",\n child: \"1f9d2\",\n older_adult: \"1f9d3\",\n woman_with_beard: \"1f9d4-200d-2640-fe0f\",\n man_with_beard: \"1f9d4-200d-2642-fe0f\",\n bearded_person: \"1f9d4\",\n person_with_headscarf: \"1f9d5\",\n woman_in_steamy_room: \"1f9d6-200d-2640-fe0f\",\n man_in_steamy_room: \"1f9d6-200d-2642-fe0f\",\n person_in_steamy_room: \"1f9d6\",\n woman_climbing: \"1f9d7-200d-2640-fe0f\",\n man_climbing: \"1f9d7-200d-2642-fe0f\",\n person_climbing: \"1f9d7\",\n woman_in_lotus_position: \"1f9d8-200d-2640-fe0f\",\n man_in_lotus_position: \"1f9d8-200d-2642-fe0f\",\n person_in_lotus_position: \"1f9d8\",\n female_mage: \"1f9d9-200d-2640-fe0f\",\n male_mage: \"1f9d9-200d-2642-fe0f\",\n mage: \"1f9d9\",\n female_fairy: \"1f9da-200d-2640-fe0f\",\n male_fairy: \"1f9da-200d-2642-fe0f\",\n fairy: \"1f9da\",\n female_vampire: \"1f9db-200d-2640-fe0f\",\n male_vampire: \"1f9db-200d-2642-fe0f\",\n vampire: \"1f9db\",\n mermaid: \"1f9dc-200d-2640-fe0f\",\n merman: \"1f9dc-200d-2642-fe0f\",\n merperson: \"1f9dc\",\n female_elf: \"1f9dd-200d-2640-fe0f\",\n male_elf: \"1f9dd-200d-2642-fe0f\",\n elf: \"1f9dd\",\n female_genie: \"1f9de-200d-2640-fe0f\",\n male_genie: \"1f9de-200d-2642-fe0f\",\n genie: \"1f9de\",\n female_zombie: \"1f9df-200d-2640-fe0f\",\n male_zombie: \"1f9df-200d-2642-fe0f\",\n zombie: \"1f9df\",\n brain: \"1f9e0\",\n orange_heart: \"1f9e1\",\n billed_cap: \"1f9e2\",\n scarf: \"1f9e3\",\n gloves: \"1f9e4\",\n coat: \"1f9e5\",\n socks: \"1f9e6\",\n red_envelope: \"1f9e7\",\n firecracker: \"1f9e8\",\n jigsaw: \"1f9e9\",\n test_tube: \"1f9ea\",\n petri_dish: \"1f9eb\",\n dna: \"1f9ec\",\n compass: \"1f9ed\",\n abacus: \"1f9ee\",\n fire_extinguisher: \"1f9ef\",\n toolbox: \"1f9f0\",\n bricks: \"1f9f1\",\n magnet: \"1f9f2\",\n luggage: \"1f9f3\",\n lotion_bottle: \"1f9f4\",\n thread: \"1f9f5\",\n yarn: \"1f9f6\",\n safety_pin: \"1f9f7\",\n teddy_bear: \"1f9f8\",\n broom: \"1f9f9\",\n basket: \"1f9fa\",\n roll_of_paper: \"1f9fb\",\n soap: \"1f9fc\",\n sponge: \"1f9fd\",\n receipt: \"1f9fe\",\n nazar_amulet: \"1f9ff\",\n ballet_shoes: \"1fa70\",\n \"one-piece_swimsuit\": \"1fa71\",\n briefs: \"1fa72\",\n shorts: \"1fa73\",\n thong_sandal: \"1fa74\",\n light_blue_heart: \"1fa75\",\n grey_heart: \"1fa76\",\n pink_heart: \"1fa77\",\n drop_of_blood: \"1fa78\",\n adhesive_bandage: \"1fa79\",\n stethoscope: \"1fa7a\",\n \"x-ray\": \"1fa7b\",\n crutch: \"1fa7c\",\n \"yo-yo\": \"1fa80\",\n kite: \"1fa81\",\n parachute: \"1fa82\",\n boomerang: \"1fa83\",\n magic_wand: \"1fa84\",\n pinata: \"1fa85\",\n nesting_dolls: \"1fa86\",\n maracas: \"1fa87\",\n flute: \"1fa88\",\n harp: \"1fa89\",\n shovel: \"1fa8f\",\n ringed_planet: \"1fa90\",\n chair: \"1fa91\",\n razor: \"1fa92\",\n axe: \"1fa93\",\n diya_lamp: \"1fa94\",\n banjo: \"1fa95\",\n military_helmet: \"1fa96\",\n accordion: \"1fa97\",\n long_drum: \"1fa98\",\n coin: \"1fa99\",\n carpentry_saw: \"1fa9a\",\n screwdriver: \"1fa9b\",\n ladder: \"1fa9c\",\n hook: \"1fa9d\",\n mirror: \"1fa9e\",\n window: \"1fa9f\",\n plunger: \"1faa0\",\n sewing_needle: \"1faa1\",\n knot: \"1faa2\",\n bucket: \"1faa3\",\n mouse_trap: \"1faa4\",\n toothbrush: \"1faa5\",\n headstone: \"1faa6\",\n placard: \"1faa7\",\n rock: \"1faa8\",\n mirror_ball: \"1faa9\",\n identification_card: \"1faaa\",\n low_battery: \"1faab\",\n hamsa: \"1faac\",\n folding_hand_fan: \"1faad\",\n hair_pick: \"1faae\",\n khanda: \"1faaf\",\n fly: \"1fab0\",\n worm: \"1fab1\",\n beetle: \"1fab2\",\n cockroach: \"1fab3\",\n potted_plant: \"1fab4\",\n wood: \"1fab5\",\n feather: \"1fab6\",\n lotus: \"1fab7\",\n coral: \"1fab8\",\n empty_nest: \"1fab9\",\n nest_with_eggs: \"1faba\",\n hyacinth: \"1fabb\",\n jellyfish: \"1fabc\",\n wing: \"1fabd\",\n leafless_tree: \"1fabe\",\n goose: \"1fabf\",\n anatomical_heart: \"1fac0\",\n lungs: \"1fac1\",\n people_hugging: \"1fac2\",\n pregnant_man: \"1fac3\",\n pregnant_person: \"1fac4\",\n person_with_crown: \"1fac5\",\n fingerprint: \"1fac6\",\n moose: \"1face\",\n donkey: \"1facf\",\n blueberries: \"1fad0\",\n bell_pepper: \"1fad1\",\n olive: \"1fad2\",\n flatbread: \"1fad3\",\n tamale: \"1fad4\",\n fondue: \"1fad5\",\n teapot: \"1fad6\",\n pouring_liquid: \"1fad7\",\n beans: \"1fad8\",\n jar: \"1fad9\",\n ginger_root: \"1fada\",\n pea_pod: \"1fadb\",\n root_vegetable: \"1fadc\",\n splatter: \"1fadf\",\n melting_face: \"1fae0\",\n saluting_face: \"1fae1\",\n face_with_open_eyes_and_hand_over_mouth: \"1fae2\",\n face_with_peeking_eye: \"1fae3\",\n face_with_diagonal_mouth: \"1fae4\",\n dotted_line_face: \"1fae5\",\n biting_lip: \"1fae6\",\n bubbles: \"1fae7\",\n shaking_face: \"1fae8\",\n face_with_bags_under_eyes: \"1fae9\",\n hand_with_index_finger_and_thumb_crossed: \"1faf0\",\n rightwards_hand: \"1faf1\",\n leftwards_hand: \"1faf2\",\n palm_down_hand: \"1faf3\",\n palm_up_hand: \"1faf4\",\n index_pointing_at_the_viewer: \"1faf5\",\n heart_hands: \"1faf6\",\n leftwards_pushing_hand: \"1faf7\",\n rightwards_pushing_hand: \"1faf8\",\n bangbang: \"203c-fe0f\",\n interrobang: \"2049-fe0f\",\n tm: \"2122-fe0f\",\n information_source: \"2139-fe0f\",\n left_right_arrow: \"2194-fe0f\",\n arrow_up_down: \"2195-fe0f\",\n arrow_upper_left: \"2196-fe0f\",\n arrow_upper_right: \"2197-fe0f\",\n arrow_lower_right: \"2198-fe0f\",\n arrow_lower_left: \"2199-fe0f\",\n leftwards_arrow_with_hook: \"21a9-fe0f\",\n arrow_right_hook: \"21aa-fe0f\",\n watch: \"231a\",\n hourglass: \"231b\",\n keyboard: \"2328-fe0f\",\n eject: \"23cf-fe0f\",\n fast_forward: \"23e9\",\n rewind: \"23ea\",\n arrow_double_up: \"23eb\",\n arrow_double_down: \"23ec\",\n black_right_pointing_double_triangle_with_vertical_bar: \"23ed-fe0f\",\n black_left_pointing_double_triangle_with_vertical_bar: \"23ee-fe0f\",\n black_right_pointing_triangle_with_double_vertical_bar: \"23ef-fe0f\",\n alarm_clock: \"23f0\",\n stopwatch: \"23f1-fe0f\",\n timer_clock: \"23f2-fe0f\",\n hourglass_flowing_sand: \"23f3\",\n double_vertical_bar: \"23f8-fe0f\",\n black_square_for_stop: \"23f9-fe0f\",\n black_circle_for_record: \"23fa-fe0f\",\n m: \"24c2-fe0f\",\n black_small_square: \"25aa-fe0f\",\n white_small_square: \"25ab-fe0f\",\n arrow_forward: \"25b6-fe0f\",\n arrow_backward: \"25c0-fe0f\",\n white_medium_square: \"25fb-fe0f\",\n black_medium_square: \"25fc-fe0f\",\n white_medium_small_square: \"25fd\",\n black_medium_small_square: \"25fe\",\n sunny: \"2600-fe0f\",\n cloud: \"2601-fe0f\",\n umbrella: \"2602-fe0f\",\n snowman: \"2603-fe0f\",\n comet: \"2604-fe0f\",\n phone: \"260e-fe0f\",\n telephone: \"260e-fe0f\",\n ballot_box_with_check: \"2611-fe0f\",\n umbrella_with_rain_drops: \"2614\",\n coffee: \"2615\",\n shamrock: \"2618-fe0f\",\n point_up: \"261d-fe0f\",\n skull_and_crossbones: \"2620-fe0f\",\n radioactive_sign: \"2622-fe0f\",\n biohazard_sign: \"2623-fe0f\",\n orthodox_cross: \"2626-fe0f\",\n star_and_crescent: \"262a-fe0f\",\n peace_symbol: \"262e-fe0f\",\n yin_yang: \"262f-fe0f\",\n wheel_of_dharma: \"2638-fe0f\",\n white_frowning_face: \"2639-fe0f\",\n relaxed: \"263a-fe0f\",\n female_sign: \"2640-fe0f\",\n male_sign: \"2642-fe0f\",\n aries: \"2648\",\n taurus: \"2649\",\n gemini: \"264a\",\n cancer: \"264b\",\n leo: \"264c\",\n virgo: \"264d\",\n libra: \"264e\",\n scorpius: \"264f\",\n sagittarius: \"2650\",\n capricorn: \"2651\",\n aquarius: \"2652\",\n pisces: \"2653\",\n chess_pawn: \"265f-fe0f\",\n spades: \"2660-fe0f\",\n clubs: \"2663-fe0f\",\n hearts: \"2665-fe0f\",\n diamonds: \"2666-fe0f\",\n hotsprings: \"2668-fe0f\",\n recycle: \"267b-fe0f\",\n infinity: \"267e-fe0f\",\n wheelchair: \"267f\",\n hammer_and_pick: \"2692-fe0f\",\n anchor: \"2693\",\n crossed_swords: \"2694-fe0f\",\n medical_symbol: \"2695-fe0f\",\n staff_of_aesculapius: \"2695-fe0f\",\n scales: \"2696-fe0f\",\n alembic: \"2697-fe0f\",\n gear: \"2699-fe0f\",\n atom_symbol: \"269b-fe0f\",\n fleur_de_lis: \"269c-fe0f\",\n warning: \"26a0-fe0f\",\n zap: \"26a1\",\n transgender_symbol: \"26a7-fe0f\",\n white_circle: \"26aa\",\n black_circle: \"26ab\",\n coffin: \"26b0-fe0f\",\n funeral_urn: \"26b1-fe0f\",\n soccer: \"26bd\",\n baseball: \"26be\",\n snowman_without_snow: \"26c4\",\n partly_sunny: \"26c5\",\n thunder_cloud_and_rain: \"26c8-fe0f\",\n ophiuchus: \"26ce\",\n pick: \"26cf-fe0f\",\n helmet_with_white_cross: \"26d1-fe0f\",\n broken_chain: \"26d3-fe0f-200d-1f4a5\",\n chains: \"26d3-fe0f\",\n no_entry: \"26d4\",\n shinto_shrine: \"26e9-fe0f\",\n church: \"26ea\",\n mountain: \"26f0-fe0f\",\n umbrella_on_ground: \"26f1-fe0f\",\n fountain: \"26f2\",\n golf: \"26f3\",\n ferry: \"26f4-fe0f\",\n boat: \"26f5\",\n sailboat: \"26f5\",\n skier: \"26f7-fe0f\",\n ice_skate: \"26f8-fe0f\",\n \"woman-bouncing-ball\": \"26f9-fe0f-200d-2640-fe0f\",\n \"man-bouncing-ball\": \"26f9-fe0f-200d-2642-fe0f\",\n person_with_ball: \"26f9-fe0f\",\n tent: \"26fa\",\n fuelpump: \"26fd\",\n scissors: \"2702-fe0f\",\n white_check_mark: \"2705\",\n airplane: \"2708-fe0f\",\n email: \"2709-fe0f\",\n envelope: \"2709-fe0f\",\n fist: \"270a\",\n hand: \"270b\",\n raised_hand: \"270b\",\n v: \"270c-fe0f\",\n writing_hand: \"270d-fe0f\",\n pencil2: \"270f-fe0f\",\n black_nib: \"2712-fe0f\",\n heavy_check_mark: \"2714-fe0f\",\n heavy_multiplication_x: \"2716-fe0f\",\n latin_cross: \"271d-fe0f\",\n star_of_david: \"2721-fe0f\",\n sparkles: \"2728\",\n eight_spoked_asterisk: \"2733-fe0f\",\n eight_pointed_black_star: \"2734-fe0f\",\n snowflake: \"2744-fe0f\",\n sparkle: \"2747-fe0f\",\n x: \"274c\",\n negative_squared_cross_mark: \"274e\",\n question: \"2753\",\n grey_question: \"2754\",\n grey_exclamation: \"2755\",\n exclamation: \"2757\",\n heavy_exclamation_mark: \"2757\",\n heavy_heart_exclamation_mark_ornament: \"2763-fe0f\",\n heart_on_fire: \"2764-fe0f-200d-1f525\",\n mending_heart: \"2764-fe0f-200d-1fa79\",\n heart: \"2764-fe0f\",\n heavy_plus_sign: \"2795\",\n heavy_minus_sign: \"2796\",\n heavy_division_sign: \"2797\",\n arrow_right: \"27a1-fe0f\",\n curly_loop: \"27b0\",\n loop: \"27bf\",\n arrow_heading_up: \"2934-fe0f\",\n arrow_heading_down: \"2935-fe0f\",\n arrow_left: \"2b05-fe0f\",\n arrow_up: \"2b06-fe0f\",\n arrow_down: \"2b07-fe0f\",\n black_large_square: \"2b1b\",\n white_large_square: \"2b1c\",\n star: \"2b50\",\n o: \"2b55\",\n wavy_dash: \"3030-fe0f\",\n part_alternation_mark: \"303d-fe0f\",\n congratulations: \"3297-fe0f\",\n secret: \"3299-fe0f\",\n};\n\n/** Base unified codepoint -> unified codepoint for skin tones 2-6, \"\" when that tone has no image. */\nexport const EMOJI_SKIN_TONES: Record<string, string[]> = {\n \"1f385\": [\"1f385-1f3fb\", \"1f385-1f3fc\", \"1f385-1f3fd\", \"1f385-1f3fe\", \"1f385-1f3ff\"],\n \"1f3c2\": [\"1f3c2-1f3fb\", \"1f3c2-1f3fc\", \"1f3c2-1f3fd\", \"1f3c2-1f3fe\", \"1f3c2-1f3ff\"],\n \"1f3c3-200d-2640-fe0f\": [\n \"1f3c3-1f3fb-200d-2640-fe0f\",\n \"1f3c3-1f3fc-200d-2640-fe0f\",\n \"1f3c3-1f3fd-200d-2640-fe0f\",\n \"1f3c3-1f3fe-200d-2640-fe0f\",\n \"1f3c3-1f3ff-200d-2640-fe0f\",\n ],\n \"1f3c3-200d-2640-fe0f-200d-27a1-fe0f\": [\n \"1f3c3-1f3fb-200d-2640-fe0f-200d-27a1-fe0f\",\n \"1f3c3-1f3fc-200d-2640-fe0f-200d-27a1-fe0f\",\n \"1f3c3-1f3fd-200d-2640-fe0f-200d-27a1-fe0f\",\n \"1f3c3-1f3fe-200d-2640-fe0f-200d-27a1-fe0f\",\n \"1f3c3-1f3ff-200d-2640-fe0f-200d-27a1-fe0f\",\n ],\n \"1f3c3-200d-2642-fe0f\": [\n \"1f3c3-1f3fb-200d-2642-fe0f\",\n \"1f3c3-1f3fc-200d-2642-fe0f\",\n \"1f3c3-1f3fd-200d-2642-fe0f\",\n \"1f3c3-1f3fe-200d-2642-fe0f\",\n \"1f3c3-1f3ff-200d-2642-fe0f\",\n ],\n \"1f3c3-200d-2642-fe0f-200d-27a1-fe0f\": [\n \"1f3c3-1f3fb-200d-2642-fe0f-200d-27a1-fe0f\",\n \"1f3c3-1f3fc-200d-2642-fe0f-200d-27a1-fe0f\",\n \"1f3c3-1f3fd-200d-2642-fe0f-200d-27a1-fe0f\",\n \"1f3c3-1f3fe-200d-2642-fe0f-200d-27a1-fe0f\",\n \"1f3c3-1f3ff-200d-2642-fe0f-200d-27a1-fe0f\",\n ],\n \"1f3c3-200d-27a1-fe0f\": [\n \"1f3c3-1f3fb-200d-27a1-fe0f\",\n \"1f3c3-1f3fc-200d-27a1-fe0f\",\n \"1f3c3-1f3fd-200d-27a1-fe0f\",\n \"1f3c3-1f3fe-200d-27a1-fe0f\",\n \"1f3c3-1f3ff-200d-27a1-fe0f\",\n ],\n \"1f3c3\": [\"1f3c3-1f3fb\", \"1f3c3-1f3fc\", \"1f3c3-1f3fd\", \"1f3c3-1f3fe\", \"1f3c3-1f3ff\"],\n \"1f3c4-200d-2640-fe0f\": [\n \"1f3c4-1f3fb-200d-2640-fe0f\",\n \"1f3c4-1f3fc-200d-2640-fe0f\",\n \"1f3c4-1f3fd-200d-2640-fe0f\",\n \"1f3c4-1f3fe-200d-2640-fe0f\",\n \"1f3c4-1f3ff-200d-2640-fe0f\",\n ],\n \"1f3c4-200d-2642-fe0f\": [\n \"1f3c4-1f3fb-200d-2642-fe0f\",\n \"1f3c4-1f3fc-200d-2642-fe0f\",\n \"1f3c4-1f3fd-200d-2642-fe0f\",\n \"1f3c4-1f3fe-200d-2642-fe0f\",\n \"1f3c4-1f3ff-200d-2642-fe0f\",\n ],\n \"1f3c4\": [\"1f3c4-1f3fb\", \"1f3c4-1f3fc\", \"1f3c4-1f3fd\", \"1f3c4-1f3fe\", \"1f3c4-1f3ff\"],\n \"1f3c7\": [\"1f3c7-1f3fb\", \"1f3c7-1f3fc\", \"1f3c7-1f3fd\", \"1f3c7-1f3fe\", \"1f3c7-1f3ff\"],\n \"1f3ca-200d-2640-fe0f\": [\n \"1f3ca-1f3fb-200d-2640-fe0f\",\n \"1f3ca-1f3fc-200d-2640-fe0f\",\n \"1f3ca-1f3fd-200d-2640-fe0f\",\n \"1f3ca-1f3fe-200d-2640-fe0f\",\n \"1f3ca-1f3ff-200d-2640-fe0f\",\n ],\n \"1f3ca-200d-2642-fe0f\": [\n \"1f3ca-1f3fb-200d-2642-fe0f\",\n \"1f3ca-1f3fc-200d-2642-fe0f\",\n \"1f3ca-1f3fd-200d-2642-fe0f\",\n \"1f3ca-1f3fe-200d-2642-fe0f\",\n \"1f3ca-1f3ff-200d-2642-fe0f\",\n ],\n \"1f3ca\": [\"1f3ca-1f3fb\", \"1f3ca-1f3fc\", \"1f3ca-1f3fd\", \"1f3ca-1f3fe\", \"1f3ca-1f3ff\"],\n \"1f3cb-fe0f-200d-2640-fe0f\": [\n \"1f3cb-1f3fb-200d-2640-fe0f\",\n \"1f3cb-1f3fc-200d-2640-fe0f\",\n \"1f3cb-1f3fd-200d-2640-fe0f\",\n \"1f3cb-1f3fe-200d-2640-fe0f\",\n \"1f3cb-1f3ff-200d-2640-fe0f\",\n ],\n \"1f3cb-fe0f-200d-2642-fe0f\": [\n \"1f3cb-1f3fb-200d-2642-fe0f\",\n \"1f3cb-1f3fc-200d-2642-fe0f\",\n \"1f3cb-1f3fd-200d-2642-fe0f\",\n \"1f3cb-1f3fe-200d-2642-fe0f\",\n \"1f3cb-1f3ff-200d-2642-fe0f\",\n ],\n \"1f3cb-fe0f\": [\"1f3cb-1f3fb\", \"1f3cb-1f3fc\", \"1f3cb-1f3fd\", \"1f3cb-1f3fe\", \"1f3cb-1f3ff\"],\n \"1f3cc-fe0f-200d-2640-fe0f\": [\n \"1f3cc-1f3fb-200d-2640-fe0f\",\n \"1f3cc-1f3fc-200d-2640-fe0f\",\n \"1f3cc-1f3fd-200d-2640-fe0f\",\n \"1f3cc-1f3fe-200d-2640-fe0f\",\n \"1f3cc-1f3ff-200d-2640-fe0f\",\n ],\n \"1f3cc-fe0f-200d-2642-fe0f\": [\n \"1f3cc-1f3fb-200d-2642-fe0f\",\n \"1f3cc-1f3fc-200d-2642-fe0f\",\n \"1f3cc-1f3fd-200d-2642-fe0f\",\n \"1f3cc-1f3fe-200d-2642-fe0f\",\n \"1f3cc-1f3ff-200d-2642-fe0f\",\n ],\n \"1f3cc-fe0f\": [\"1f3cc-1f3fb\", \"1f3cc-1f3fc\", \"1f3cc-1f3fd\", \"1f3cc-1f3fe\", \"1f3cc-1f3ff\"],\n \"1f442\": [\"1f442-1f3fb\", \"1f442-1f3fc\", \"1f442-1f3fd\", \"1f442-1f3fe\", \"1f442-1f3ff\"],\n \"1f443\": [\"1f443-1f3fb\", \"1f443-1f3fc\", \"1f443-1f3fd\", \"1f443-1f3fe\", \"1f443-1f3ff\"],\n \"1f446\": [\"1f446-1f3fb\", \"1f446-1f3fc\", \"1f446-1f3fd\", \"1f446-1f3fe\", \"1f446-1f3ff\"],\n \"1f447\": [\"1f447-1f3fb\", \"1f447-1f3fc\", \"1f447-1f3fd\", \"1f447-1f3fe\", \"1f447-1f3ff\"],\n \"1f448\": [\"1f448-1f3fb\", \"1f448-1f3fc\", \"1f448-1f3fd\", \"1f448-1f3fe\", \"1f448-1f3ff\"],\n \"1f449\": [\"1f449-1f3fb\", \"1f449-1f3fc\", \"1f449-1f3fd\", \"1f449-1f3fe\", \"1f449-1f3ff\"],\n \"1f44a\": [\"1f44a-1f3fb\", \"1f44a-1f3fc\", \"1f44a-1f3fd\", \"1f44a-1f3fe\", \"1f44a-1f3ff\"],\n \"1f44b\": [\"1f44b-1f3fb\", \"1f44b-1f3fc\", \"1f44b-1f3fd\", \"1f44b-1f3fe\", \"1f44b-1f3ff\"],\n \"1f44c\": [\"1f44c-1f3fb\", \"1f44c-1f3fc\", \"1f44c-1f3fd\", \"1f44c-1f3fe\", \"1f44c-1f3ff\"],\n \"1f44d\": [\"1f44d-1f3fb\", \"1f44d-1f3fc\", \"1f44d-1f3fd\", \"1f44d-1f3fe\", \"1f44d-1f3ff\"],\n \"1f44e\": [\"1f44e-1f3fb\", \"1f44e-1f3fc\", \"1f44e-1f3fd\", \"1f44e-1f3fe\", \"1f44e-1f3ff\"],\n \"1f44f\": [\"1f44f-1f3fb\", \"1f44f-1f3fc\", \"1f44f-1f3fd\", \"1f44f-1f3fe\", \"1f44f-1f3ff\"],\n \"1f450\": [\"1f450-1f3fb\", \"1f450-1f3fc\", \"1f450-1f3fd\", \"1f450-1f3fe\", \"1f450-1f3ff\"],\n \"1f466\": [\"1f466-1f3fb\", \"1f466-1f3fc\", \"1f466-1f3fd\", \"1f466-1f3fe\", \"1f466-1f3ff\"],\n \"1f467\": [\"1f467-1f3fb\", \"1f467-1f3fc\", \"1f467-1f3fd\", \"1f467-1f3fe\", \"1f467-1f3ff\"],\n \"1f468-200d-1f33e\": [\n \"1f468-1f3fb-200d-1f33e\",\n \"1f468-1f3fc-200d-1f33e\",\n \"1f468-1f3fd-200d-1f33e\",\n \"1f468-1f3fe-200d-1f33e\",\n \"1f468-1f3ff-200d-1f33e\",\n ],\n \"1f468-200d-1f373\": [\n \"1f468-1f3fb-200d-1f373\",\n \"1f468-1f3fc-200d-1f373\",\n \"1f468-1f3fd-200d-1f373\",\n \"1f468-1f3fe-200d-1f373\",\n \"1f468-1f3ff-200d-1f373\",\n ],\n \"1f468-200d-1f37c\": [\n \"1f468-1f3fb-200d-1f37c\",\n \"1f468-1f3fc-200d-1f37c\",\n \"1f468-1f3fd-200d-1f37c\",\n \"1f468-1f3fe-200d-1f37c\",\n \"1f468-1f3ff-200d-1f37c\",\n ],\n \"1f468-200d-1f393\": [\n \"1f468-1f3fb-200d-1f393\",\n \"1f468-1f3fc-200d-1f393\",\n \"1f468-1f3fd-200d-1f393\",\n \"1f468-1f3fe-200d-1f393\",\n \"1f468-1f3ff-200d-1f393\",\n ],\n \"1f468-200d-1f3a4\": [\n \"1f468-1f3fb-200d-1f3a4\",\n \"1f468-1f3fc-200d-1f3a4\",\n \"1f468-1f3fd-200d-1f3a4\",\n \"1f468-1f3fe-200d-1f3a4\",\n \"1f468-1f3ff-200d-1f3a4\",\n ],\n \"1f468-200d-1f3a8\": [\n \"1f468-1f3fb-200d-1f3a8\",\n \"1f468-1f3fc-200d-1f3a8\",\n \"1f468-1f3fd-200d-1f3a8\",\n \"1f468-1f3fe-200d-1f3a8\",\n \"1f468-1f3ff-200d-1f3a8\",\n ],\n \"1f468-200d-1f3eb\": [\n \"1f468-1f3fb-200d-1f3eb\",\n \"1f468-1f3fc-200d-1f3eb\",\n \"1f468-1f3fd-200d-1f3eb\",\n \"1f468-1f3fe-200d-1f3eb\",\n \"1f468-1f3ff-200d-1f3eb\",\n ],\n \"1f468-200d-1f3ed\": [\n \"1f468-1f3fb-200d-1f3ed\",\n \"1f468-1f3fc-200d-1f3ed\",\n \"1f468-1f3fd-200d-1f3ed\",\n \"1f468-1f3fe-200d-1f3ed\",\n \"1f468-1f3ff-200d-1f3ed\",\n ],\n \"1f468-200d-1f4bb\": [\n \"1f468-1f3fb-200d-1f4bb\",\n \"1f468-1f3fc-200d-1f4bb\",\n \"1f468-1f3fd-200d-1f4bb\",\n \"1f468-1f3fe-200d-1f4bb\",\n \"1f468-1f3ff-200d-1f4bb\",\n ],\n \"1f468-200d-1f4bc\": [\n \"1f468-1f3fb-200d-1f4bc\",\n \"1f468-1f3fc-200d-1f4bc\",\n \"1f468-1f3fd-200d-1f4bc\",\n \"1f468-1f3fe-200d-1f4bc\",\n \"1f468-1f3ff-200d-1f4bc\",\n ],\n \"1f468-200d-1f527\": [\n \"1f468-1f3fb-200d-1f527\",\n \"1f468-1f3fc-200d-1f527\",\n \"1f468-1f3fd-200d-1f527\",\n \"1f468-1f3fe-200d-1f527\",\n \"1f468-1f3ff-200d-1f527\",\n ],\n \"1f468-200d-1f52c\": [\n \"1f468-1f3fb-200d-1f52c\",\n \"1f468-1f3fc-200d-1f52c\",\n \"1f468-1f3fd-200d-1f52c\",\n \"1f468-1f3fe-200d-1f52c\",\n \"1f468-1f3ff-200d-1f52c\",\n ],\n \"1f468-200d-1f680\": [\n \"1f468-1f3fb-200d-1f680\",\n \"1f468-1f3fc-200d-1f680\",\n \"1f468-1f3fd-200d-1f680\",\n \"1f468-1f3fe-200d-1f680\",\n \"1f468-1f3ff-200d-1f680\",\n ],\n \"1f468-200d-1f692\": [\n \"1f468-1f3fb-200d-1f692\",\n \"1f468-1f3fc-200d-1f692\",\n \"1f468-1f3fd-200d-1f692\",\n \"1f468-1f3fe-200d-1f692\",\n \"1f468-1f3ff-200d-1f692\",\n ],\n \"1f468-200d-1f9af-200d-27a1-fe0f\": [\n \"1f468-1f3fb-200d-1f9af-200d-27a1-fe0f\",\n \"1f468-1f3fc-200d-1f9af-200d-27a1-fe0f\",\n \"1f468-1f3fd-200d-1f9af-200d-27a1-fe0f\",\n \"1f468-1f3fe-200d-1f9af-200d-27a1-fe0f\",\n \"1f468-1f3ff-200d-1f9af-200d-27a1-fe0f\",\n ],\n \"1f468-200d-1f9af\": [\n \"1f468-1f3fb-200d-1f9af\",\n \"1f468-1f3fc-200d-1f9af\",\n \"1f468-1f3fd-200d-1f9af\",\n \"1f468-1f3fe-200d-1f9af\",\n \"1f468-1f3ff-200d-1f9af\",\n ],\n \"1f468-200d-1f9b0\": [\n \"1f468-1f3fb-200d-1f9b0\",\n \"1f468-1f3fc-200d-1f9b0\",\n \"1f468-1f3fd-200d-1f9b0\",\n \"1f468-1f3fe-200d-1f9b0\",\n \"1f468-1f3ff-200d-1f9b0\",\n ],\n \"1f468-200d-1f9b1\": [\n \"1f468-1f3fb-200d-1f9b1\",\n \"1f468-1f3fc-200d-1f9b1\",\n \"1f468-1f3fd-200d-1f9b1\",\n \"1f468-1f3fe-200d-1f9b1\",\n \"1f468-1f3ff-200d-1f9b1\",\n ],\n \"1f468-200d-1f9b2\": [\n \"1f468-1f3fb-200d-1f9b2\",\n \"1f468-1f3fc-200d-1f9b2\",\n \"1f468-1f3fd-200d-1f9b2\",\n \"1f468-1f3fe-200d-1f9b2\",\n \"1f468-1f3ff-200d-1f9b2\",\n ],\n \"1f468-200d-1f9b3\": [\n \"1f468-1f3fb-200d-1f9b3\",\n \"1f468-1f3fc-200d-1f9b3\",\n \"1f468-1f3fd-200d-1f9b3\",\n \"1f468-1f3fe-200d-1f9b3\",\n \"1f468-1f3ff-200d-1f9b3\",\n ],\n \"1f468-200d-1f9bc-200d-27a1-fe0f\": [\n \"1f468-1f3fb-200d-1f9bc-200d-27a1-fe0f\",\n \"1f468-1f3fc-200d-1f9bc-200d-27a1-fe0f\",\n \"1f468-1f3fd-200d-1f9bc-200d-27a1-fe0f\",\n \"1f468-1f3fe-200d-1f9bc-200d-27a1-fe0f\",\n \"1f468-1f3ff-200d-1f9bc-200d-27a1-fe0f\",\n ],\n \"1f468-200d-1f9bc\": [\n \"1f468-1f3fb-200d-1f9bc\",\n \"1f468-1f3fc-200d-1f9bc\",\n \"1f468-1f3fd-200d-1f9bc\",\n \"1f468-1f3fe-200d-1f9bc\",\n \"1f468-1f3ff-200d-1f9bc\",\n ],\n \"1f468-200d-1f9bd-200d-27a1-fe0f\": [\n \"1f468-1f3fb-200d-1f9bd-200d-27a1-fe0f\",\n \"1f468-1f3fc-200d-1f9bd-200d-27a1-fe0f\",\n \"1f468-1f3fd-200d-1f9bd-200d-27a1-fe0f\",\n \"1f468-1f3fe-200d-1f9bd-200d-27a1-fe0f\",\n \"1f468-1f3ff-200d-1f9bd-200d-27a1-fe0f\",\n ],\n \"1f468-200d-1f9bd\": [\n \"1f468-1f3fb-200d-1f9bd\",\n \"1f468-1f3fc-200d-1f9bd\",\n \"1f468-1f3fd-200d-1f9bd\",\n \"1f468-1f3fe-200d-1f9bd\",\n \"1f468-1f3ff-200d-1f9bd\",\n ],\n \"1f468-200d-2695-fe0f\": [\n \"1f468-1f3fb-200d-2695-fe0f\",\n \"1f468-1f3fc-200d-2695-fe0f\",\n \"1f468-1f3fd-200d-2695-fe0f\",\n \"1f468-1f3fe-200d-2695-fe0f\",\n \"1f468-1f3ff-200d-2695-fe0f\",\n ],\n \"1f468-200d-2696-fe0f\": [\n \"1f468-1f3fb-200d-2696-fe0f\",\n \"1f468-1f3fc-200d-2696-fe0f\",\n \"1f468-1f3fd-200d-2696-fe0f\",\n \"1f468-1f3fe-200d-2696-fe0f\",\n \"1f468-1f3ff-200d-2696-fe0f\",\n ],\n \"1f468-200d-2708-fe0f\": [\n \"1f468-1f3fb-200d-2708-fe0f\",\n \"1f468-1f3fc-200d-2708-fe0f\",\n \"1f468-1f3fd-200d-2708-fe0f\",\n \"1f468-1f3fe-200d-2708-fe0f\",\n \"1f468-1f3ff-200d-2708-fe0f\",\n ],\n \"1f468\": [\"1f468-1f3fb\", \"1f468-1f3fc\", \"1f468-1f3fd\", \"1f468-1f3fe\", \"1f468-1f3ff\"],\n \"1f469-200d-1f33e\": [\n \"1f469-1f3fb-200d-1f33e\",\n \"1f469-1f3fc-200d-1f33e\",\n \"1f469-1f3fd-200d-1f33e\",\n \"1f469-1f3fe-200d-1f33e\",\n \"1f469-1f3ff-200d-1f33e\",\n ],\n \"1f469-200d-1f373\": [\n \"1f469-1f3fb-200d-1f373\",\n \"1f469-1f3fc-200d-1f373\",\n \"1f469-1f3fd-200d-1f373\",\n \"1f469-1f3fe-200d-1f373\",\n \"1f469-1f3ff-200d-1f373\",\n ],\n \"1f469-200d-1f37c\": [\n \"1f469-1f3fb-200d-1f37c\",\n \"1f469-1f3fc-200d-1f37c\",\n \"1f469-1f3fd-200d-1f37c\",\n \"1f469-1f3fe-200d-1f37c\",\n \"1f469-1f3ff-200d-1f37c\",\n ],\n \"1f469-200d-1f393\": [\n \"1f469-1f3fb-200d-1f393\",\n \"1f469-1f3fc-200d-1f393\",\n \"1f469-1f3fd-200d-1f393\",\n \"1f469-1f3fe-200d-1f393\",\n \"1f469-1f3ff-200d-1f393\",\n ],\n \"1f469-200d-1f3a4\": [\n \"1f469-1f3fb-200d-1f3a4\",\n \"1f469-1f3fc-200d-1f3a4\",\n \"1f469-1f3fd-200d-1f3a4\",\n \"1f469-1f3fe-200d-1f3a4\",\n \"1f469-1f3ff-200d-1f3a4\",\n ],\n \"1f469-200d-1f3a8\": [\n \"1f469-1f3fb-200d-1f3a8\",\n \"1f469-1f3fc-200d-1f3a8\",\n \"1f469-1f3fd-200d-1f3a8\",\n \"1f469-1f3fe-200d-1f3a8\",\n \"1f469-1f3ff-200d-1f3a8\",\n ],\n \"1f469-200d-1f3eb\": [\n \"1f469-1f3fb-200d-1f3eb\",\n \"1f469-1f3fc-200d-1f3eb\",\n \"1f469-1f3fd-200d-1f3eb\",\n \"1f469-1f3fe-200d-1f3eb\",\n \"1f469-1f3ff-200d-1f3eb\",\n ],\n \"1f469-200d-1f3ed\": [\n \"1f469-1f3fb-200d-1f3ed\",\n \"1f469-1f3fc-200d-1f3ed\",\n \"1f469-1f3fd-200d-1f3ed\",\n \"1f469-1f3fe-200d-1f3ed\",\n \"1f469-1f3ff-200d-1f3ed\",\n ],\n \"1f469-200d-1f4bb\": [\n \"1f469-1f3fb-200d-1f4bb\",\n \"1f469-1f3fc-200d-1f4bb\",\n \"1f469-1f3fd-200d-1f4bb\",\n \"1f469-1f3fe-200d-1f4bb\",\n \"1f469-1f3ff-200d-1f4bb\",\n ],\n \"1f469-200d-1f4bc\": [\n \"1f469-1f3fb-200d-1f4bc\",\n \"1f469-1f3fc-200d-1f4bc\",\n \"1f469-1f3fd-200d-1f4bc\",\n \"1f469-1f3fe-200d-1f4bc\",\n \"1f469-1f3ff-200d-1f4bc\",\n ],\n \"1f469-200d-1f527\": [\n \"1f469-1f3fb-200d-1f527\",\n \"1f469-1f3fc-200d-1f527\",\n \"1f469-1f3fd-200d-1f527\",\n \"1f469-1f3fe-200d-1f527\",\n \"1f469-1f3ff-200d-1f527\",\n ],\n \"1f469-200d-1f52c\": [\n \"1f469-1f3fb-200d-1f52c\",\n \"1f469-1f3fc-200d-1f52c\",\n \"1f469-1f3fd-200d-1f52c\",\n \"1f469-1f3fe-200d-1f52c\",\n \"1f469-1f3ff-200d-1f52c\",\n ],\n \"1f469-200d-1f680\": [\n \"1f469-1f3fb-200d-1f680\",\n \"1f469-1f3fc-200d-1f680\",\n \"1f469-1f3fd-200d-1f680\",\n \"1f469-1f3fe-200d-1f680\",\n \"1f469-1f3ff-200d-1f680\",\n ],\n \"1f469-200d-1f692\": [\n \"1f469-1f3fb-200d-1f692\",\n \"1f469-1f3fc-200d-1f692\",\n \"1f469-1f3fd-200d-1f692\",\n \"1f469-1f3fe-200d-1f692\",\n \"1f469-1f3ff-200d-1f692\",\n ],\n \"1f469-200d-1f9af-200d-27a1-fe0f\": [\n \"1f469-1f3fb-200d-1f9af-200d-27a1-fe0f\",\n \"1f469-1f3fc-200d-1f9af-200d-27a1-fe0f\",\n \"1f469-1f3fd-200d-1f9af-200d-27a1-fe0f\",\n \"1f469-1f3fe-200d-1f9af-200d-27a1-fe0f\",\n \"1f469-1f3ff-200d-1f9af-200d-27a1-fe0f\",\n ],\n \"1f469-200d-1f9af\": [\n \"1f469-1f3fb-200d-1f9af\",\n \"1f469-1f3fc-200d-1f9af\",\n \"1f469-1f3fd-200d-1f9af\",\n \"1f469-1f3fe-200d-1f9af\",\n \"1f469-1f3ff-200d-1f9af\",\n ],\n \"1f469-200d-1f9b0\": [\n \"1f469-1f3fb-200d-1f9b0\",\n \"1f469-1f3fc-200d-1f9b0\",\n \"1f469-1f3fd-200d-1f9b0\",\n \"1f469-1f3fe-200d-1f9b0\",\n \"1f469-1f3ff-200d-1f9b0\",\n ],\n \"1f469-200d-1f9b1\": [\n \"1f469-1f3fb-200d-1f9b1\",\n \"1f469-1f3fc-200d-1f9b1\",\n \"1f469-1f3fd-200d-1f9b1\",\n \"1f469-1f3fe-200d-1f9b1\",\n \"1f469-1f3ff-200d-1f9b1\",\n ],\n \"1f469-200d-1f9b2\": [\n \"1f469-1f3fb-200d-1f9b2\",\n \"1f469-1f3fc-200d-1f9b2\",\n \"1f469-1f3fd-200d-1f9b2\",\n \"1f469-1f3fe-200d-1f9b2\",\n \"1f469-1f3ff-200d-1f9b2\",\n ],\n \"1f469-200d-1f9b3\": [\n \"1f469-1f3fb-200d-1f9b3\",\n \"1f469-1f3fc-200d-1f9b3\",\n \"1f469-1f3fd-200d-1f9b3\",\n \"1f469-1f3fe-200d-1f9b3\",\n \"1f469-1f3ff-200d-1f9b3\",\n ],\n \"1f469-200d-1f9bc-200d-27a1-fe0f\": [\n \"1f469-1f3fb-200d-1f9bc-200d-27a1-fe0f\",\n \"1f469-1f3fc-200d-1f9bc-200d-27a1-fe0f\",\n \"1f469-1f3fd-200d-1f9bc-200d-27a1-fe0f\",\n \"1f469-1f3fe-200d-1f9bc-200d-27a1-fe0f\",\n \"1f469-1f3ff-200d-1f9bc-200d-27a1-fe0f\",\n ],\n \"1f469-200d-1f9bc\": [\n \"1f469-1f3fb-200d-1f9bc\",\n \"1f469-1f3fc-200d-1f9bc\",\n \"1f469-1f3fd-200d-1f9bc\",\n \"1f469-1f3fe-200d-1f9bc\",\n \"1f469-1f3ff-200d-1f9bc\",\n ],\n \"1f469-200d-1f9bd-200d-27a1-fe0f\": [\n \"1f469-1f3fb-200d-1f9bd-200d-27a1-fe0f\",\n \"1f469-1f3fc-200d-1f9bd-200d-27a1-fe0f\",\n \"1f469-1f3fd-200d-1f9bd-200d-27a1-fe0f\",\n \"1f469-1f3fe-200d-1f9bd-200d-27a1-fe0f\",\n \"1f469-1f3ff-200d-1f9bd-200d-27a1-fe0f\",\n ],\n \"1f469-200d-1f9bd\": [\n \"1f469-1f3fb-200d-1f9bd\",\n \"1f469-1f3fc-200d-1f9bd\",\n \"1f469-1f3fd-200d-1f9bd\",\n \"1f469-1f3fe-200d-1f9bd\",\n \"1f469-1f3ff-200d-1f9bd\",\n ],\n \"1f469-200d-2695-fe0f\": [\n \"1f469-1f3fb-200d-2695-fe0f\",\n \"1f469-1f3fc-200d-2695-fe0f\",\n \"1f469-1f3fd-200d-2695-fe0f\",\n \"1f469-1f3fe-200d-2695-fe0f\",\n \"1f469-1f3ff-200d-2695-fe0f\",\n ],\n \"1f469-200d-2696-fe0f\": [\n \"1f469-1f3fb-200d-2696-fe0f\",\n \"1f469-1f3fc-200d-2696-fe0f\",\n \"1f469-1f3fd-200d-2696-fe0f\",\n \"1f469-1f3fe-200d-2696-fe0f\",\n \"1f469-1f3ff-200d-2696-fe0f\",\n ],\n \"1f469-200d-2708-fe0f\": [\n \"1f469-1f3fb-200d-2708-fe0f\",\n \"1f469-1f3fc-200d-2708-fe0f\",\n \"1f469-1f3fd-200d-2708-fe0f\",\n \"1f469-1f3fe-200d-2708-fe0f\",\n \"1f469-1f3ff-200d-2708-fe0f\",\n ],\n \"1f469\": [\"1f469-1f3fb\", \"1f469-1f3fc\", \"1f469-1f3fd\", \"1f469-1f3fe\", \"1f469-1f3ff\"],\n \"1f46b\": [\"1f46b-1f3fb\", \"1f46b-1f3fc\", \"1f46b-1f3fd\", \"1f46b-1f3fe\", \"1f46b-1f3ff\"],\n \"1f46c\": [\"1f46c-1f3fb\", \"1f46c-1f3fc\", \"1f46c-1f3fd\", \"1f46c-1f3fe\", \"1f46c-1f3ff\"],\n \"1f46d\": [\"1f46d-1f3fb\", \"1f46d-1f3fc\", \"1f46d-1f3fd\", \"1f46d-1f3fe\", \"1f46d-1f3ff\"],\n \"1f46e-200d-2640-fe0f\": [\n \"1f46e-1f3fb-200d-2640-fe0f\",\n \"1f46e-1f3fc-200d-2640-fe0f\",\n \"1f46e-1f3fd-200d-2640-fe0f\",\n \"1f46e-1f3fe-200d-2640-fe0f\",\n \"1f46e-1f3ff-200d-2640-fe0f\",\n ],\n \"1f46e-200d-2642-fe0f\": [\n \"1f46e-1f3fb-200d-2642-fe0f\",\n \"1f46e-1f3fc-200d-2642-fe0f\",\n \"1f46e-1f3fd-200d-2642-fe0f\",\n \"1f46e-1f3fe-200d-2642-fe0f\",\n \"1f46e-1f3ff-200d-2642-fe0f\",\n ],\n \"1f46e\": [\"1f46e-1f3fb\", \"1f46e-1f3fc\", \"1f46e-1f3fd\", \"1f46e-1f3fe\", \"1f46e-1f3ff\"],\n \"1f470-200d-2640-fe0f\": [\n \"1f470-1f3fb-200d-2640-fe0f\",\n \"1f470-1f3fc-200d-2640-fe0f\",\n \"1f470-1f3fd-200d-2640-fe0f\",\n \"1f470-1f3fe-200d-2640-fe0f\",\n \"1f470-1f3ff-200d-2640-fe0f\",\n ],\n \"1f470-200d-2642-fe0f\": [\n \"1f470-1f3fb-200d-2642-fe0f\",\n \"1f470-1f3fc-200d-2642-fe0f\",\n \"1f470-1f3fd-200d-2642-fe0f\",\n \"1f470-1f3fe-200d-2642-fe0f\",\n \"1f470-1f3ff-200d-2642-fe0f\",\n ],\n \"1f470\": [\"1f470-1f3fb\", \"1f470-1f3fc\", \"1f470-1f3fd\", \"1f470-1f3fe\", \"1f470-1f3ff\"],\n \"1f471-200d-2640-fe0f\": [\n \"1f471-1f3fb-200d-2640-fe0f\",\n \"1f471-1f3fc-200d-2640-fe0f\",\n \"1f471-1f3fd-200d-2640-fe0f\",\n \"1f471-1f3fe-200d-2640-fe0f\",\n \"1f471-1f3ff-200d-2640-fe0f\",\n ],\n \"1f471-200d-2642-fe0f\": [\n \"1f471-1f3fb-200d-2642-fe0f\",\n \"1f471-1f3fc-200d-2642-fe0f\",\n \"1f471-1f3fd-200d-2642-fe0f\",\n \"1f471-1f3fe-200d-2642-fe0f\",\n \"1f471-1f3ff-200d-2642-fe0f\",\n ],\n \"1f471\": [\"1f471-1f3fb\", \"1f471-1f3fc\", \"1f471-1f3fd\", \"1f471-1f3fe\", \"1f471-1f3ff\"],\n \"1f472\": [\"1f472-1f3fb\", \"1f472-1f3fc\", \"1f472-1f3fd\", \"1f472-1f3fe\", \"1f472-1f3ff\"],\n \"1f473-200d-2640-fe0f\": [\n \"1f473-1f3fb-200d-2640-fe0f\",\n \"1f473-1f3fc-200d-2640-fe0f\",\n \"1f473-1f3fd-200d-2640-fe0f\",\n \"1f473-1f3fe-200d-2640-fe0f\",\n \"1f473-1f3ff-200d-2640-fe0f\",\n ],\n \"1f473-200d-2642-fe0f\": [\n \"1f473-1f3fb-200d-2642-fe0f\",\n \"1f473-1f3fc-200d-2642-fe0f\",\n \"1f473-1f3fd-200d-2642-fe0f\",\n \"1f473-1f3fe-200d-2642-fe0f\",\n \"1f473-1f3ff-200d-2642-fe0f\",\n ],\n \"1f473\": [\"1f473-1f3fb\", \"1f473-1f3fc\", \"1f473-1f3fd\", \"1f473-1f3fe\", \"1f473-1f3ff\"],\n \"1f474\": [\"1f474-1f3fb\", \"1f474-1f3fc\", \"1f474-1f3fd\", \"1f474-1f3fe\", \"1f474-1f3ff\"],\n \"1f475\": [\"1f475-1f3fb\", \"1f475-1f3fc\", \"1f475-1f3fd\", \"1f475-1f3fe\", \"1f475-1f3ff\"],\n \"1f476\": [\"1f476-1f3fb\", \"1f476-1f3fc\", \"1f476-1f3fd\", \"1f476-1f3fe\", \"1f476-1f3ff\"],\n \"1f477-200d-2640-fe0f\": [\n \"1f477-1f3fb-200d-2640-fe0f\",\n \"1f477-1f3fc-200d-2640-fe0f\",\n \"1f477-1f3fd-200d-2640-fe0f\",\n \"1f477-1f3fe-200d-2640-fe0f\",\n \"1f477-1f3ff-200d-2640-fe0f\",\n ],\n \"1f477-200d-2642-fe0f\": [\n \"1f477-1f3fb-200d-2642-fe0f\",\n \"1f477-1f3fc-200d-2642-fe0f\",\n \"1f477-1f3fd-200d-2642-fe0f\",\n \"1f477-1f3fe-200d-2642-fe0f\",\n \"1f477-1f3ff-200d-2642-fe0f\",\n ],\n \"1f477\": [\"1f477-1f3fb\", \"1f477-1f3fc\", \"1f477-1f3fd\", \"1f477-1f3fe\", \"1f477-1f3ff\"],\n \"1f478\": [\"1f478-1f3fb\", \"1f478-1f3fc\", \"1f478-1f3fd\", \"1f478-1f3fe\", \"1f478-1f3ff\"],\n \"1f47c\": [\"1f47c-1f3fb\", \"1f47c-1f3fc\", \"1f47c-1f3fd\", \"1f47c-1f3fe\", \"1f47c-1f3ff\"],\n \"1f481-200d-2640-fe0f\": [\n \"1f481-1f3fb-200d-2640-fe0f\",\n \"1f481-1f3fc-200d-2640-fe0f\",\n \"1f481-1f3fd-200d-2640-fe0f\",\n \"1f481-1f3fe-200d-2640-fe0f\",\n \"1f481-1f3ff-200d-2640-fe0f\",\n ],\n \"1f481-200d-2642-fe0f\": [\n \"1f481-1f3fb-200d-2642-fe0f\",\n \"1f481-1f3fc-200d-2642-fe0f\",\n \"1f481-1f3fd-200d-2642-fe0f\",\n \"1f481-1f3fe-200d-2642-fe0f\",\n \"1f481-1f3ff-200d-2642-fe0f\",\n ],\n \"1f481\": [\"1f481-1f3fb\", \"1f481-1f3fc\", \"1f481-1f3fd\", \"1f481-1f3fe\", \"1f481-1f3ff\"],\n \"1f482-200d-2640-fe0f\": [\n \"1f482-1f3fb-200d-2640-fe0f\",\n \"1f482-1f3fc-200d-2640-fe0f\",\n \"1f482-1f3fd-200d-2640-fe0f\",\n \"1f482-1f3fe-200d-2640-fe0f\",\n \"1f482-1f3ff-200d-2640-fe0f\",\n ],\n \"1f482-200d-2642-fe0f\": [\n \"1f482-1f3fb-200d-2642-fe0f\",\n \"1f482-1f3fc-200d-2642-fe0f\",\n \"1f482-1f3fd-200d-2642-fe0f\",\n \"1f482-1f3fe-200d-2642-fe0f\",\n \"1f482-1f3ff-200d-2642-fe0f\",\n ],\n \"1f482\": [\"1f482-1f3fb\", \"1f482-1f3fc\", \"1f482-1f3fd\", \"1f482-1f3fe\", \"1f482-1f3ff\"],\n \"1f483\": [\"1f483-1f3fb\", \"1f483-1f3fc\", \"1f483-1f3fd\", \"1f483-1f3fe\", \"1f483-1f3ff\"],\n \"1f485\": [\"1f485-1f3fb\", \"1f485-1f3fc\", \"1f485-1f3fd\", \"1f485-1f3fe\", \"1f485-1f3ff\"],\n \"1f486-200d-2640-fe0f\": [\n \"1f486-1f3fb-200d-2640-fe0f\",\n \"1f486-1f3fc-200d-2640-fe0f\",\n \"1f486-1f3fd-200d-2640-fe0f\",\n \"1f486-1f3fe-200d-2640-fe0f\",\n \"1f486-1f3ff-200d-2640-fe0f\",\n ],\n \"1f486-200d-2642-fe0f\": [\n \"1f486-1f3fb-200d-2642-fe0f\",\n \"1f486-1f3fc-200d-2642-fe0f\",\n \"1f486-1f3fd-200d-2642-fe0f\",\n \"1f486-1f3fe-200d-2642-fe0f\",\n \"1f486-1f3ff-200d-2642-fe0f\",\n ],\n \"1f486\": [\"1f486-1f3fb\", \"1f486-1f3fc\", \"1f486-1f3fd\", \"1f486-1f3fe\", \"1f486-1f3ff\"],\n \"1f487-200d-2640-fe0f\": [\n \"1f487-1f3fb-200d-2640-fe0f\",\n \"1f487-1f3fc-200d-2640-fe0f\",\n \"1f487-1f3fd-200d-2640-fe0f\",\n \"1f487-1f3fe-200d-2640-fe0f\",\n \"1f487-1f3ff-200d-2640-fe0f\",\n ],\n \"1f487-200d-2642-fe0f\": [\n \"1f487-1f3fb-200d-2642-fe0f\",\n \"1f487-1f3fc-200d-2642-fe0f\",\n \"1f487-1f3fd-200d-2642-fe0f\",\n \"1f487-1f3fe-200d-2642-fe0f\",\n \"1f487-1f3ff-200d-2642-fe0f\",\n ],\n \"1f487\": [\"1f487-1f3fb\", \"1f487-1f3fc\", \"1f487-1f3fd\", \"1f487-1f3fe\", \"1f487-1f3ff\"],\n \"1f48f\": [\"1f48f-1f3fb\", \"1f48f-1f3fc\", \"1f48f-1f3fd\", \"1f48f-1f3fe\", \"1f48f-1f3ff\"],\n \"1f491\": [\"1f491-1f3fb\", \"1f491-1f3fc\", \"1f491-1f3fd\", \"1f491-1f3fe\", \"1f491-1f3ff\"],\n \"1f4aa\": [\"1f4aa-1f3fb\", \"1f4aa-1f3fc\", \"1f4aa-1f3fd\", \"1f4aa-1f3fe\", \"1f4aa-1f3ff\"],\n \"1f574-fe0f\": [\"1f574-1f3fb\", \"1f574-1f3fc\", \"1f574-1f3fd\", \"1f574-1f3fe\", \"1f574-1f3ff\"],\n \"1f575-fe0f-200d-2640-fe0f\": [\n \"1f575-1f3fb-200d-2640-fe0f\",\n \"1f575-1f3fc-200d-2640-fe0f\",\n \"1f575-1f3fd-200d-2640-fe0f\",\n \"1f575-1f3fe-200d-2640-fe0f\",\n \"1f575-1f3ff-200d-2640-fe0f\",\n ],\n \"1f575-fe0f-200d-2642-fe0f\": [\n \"1f575-1f3fb-200d-2642-fe0f\",\n \"1f575-1f3fc-200d-2642-fe0f\",\n \"1f575-1f3fd-200d-2642-fe0f\",\n \"1f575-1f3fe-200d-2642-fe0f\",\n \"1f575-1f3ff-200d-2642-fe0f\",\n ],\n \"1f575-fe0f\": [\"1f575-1f3fb\", \"1f575-1f3fc\", \"1f575-1f3fd\", \"1f575-1f3fe\", \"1f575-1f3ff\"],\n \"1f57a\": [\"1f57a-1f3fb\", \"1f57a-1f3fc\", \"1f57a-1f3fd\", \"1f57a-1f3fe\", \"1f57a-1f3ff\"],\n \"1f590-fe0f\": [\"1f590-1f3fb\", \"1f590-1f3fc\", \"1f590-1f3fd\", \"1f590-1f3fe\", \"1f590-1f3ff\"],\n \"1f595\": [\"1f595-1f3fb\", \"1f595-1f3fc\", \"1f595-1f3fd\", \"1f595-1f3fe\", \"1f595-1f3ff\"],\n \"1f596\": [\"1f596-1f3fb\", \"1f596-1f3fc\", \"1f596-1f3fd\", \"1f596-1f3fe\", \"1f596-1f3ff\"],\n \"1f645-200d-2640-fe0f\": [\n \"1f645-1f3fb-200d-2640-fe0f\",\n \"1f645-1f3fc-200d-2640-fe0f\",\n \"1f645-1f3fd-200d-2640-fe0f\",\n \"1f645-1f3fe-200d-2640-fe0f\",\n \"1f645-1f3ff-200d-2640-fe0f\",\n ],\n \"1f645-200d-2642-fe0f\": [\n \"1f645-1f3fb-200d-2642-fe0f\",\n \"1f645-1f3fc-200d-2642-fe0f\",\n \"1f645-1f3fd-200d-2642-fe0f\",\n \"1f645-1f3fe-200d-2642-fe0f\",\n \"1f645-1f3ff-200d-2642-fe0f\",\n ],\n \"1f645\": [\"1f645-1f3fb\", \"1f645-1f3fc\", \"1f645-1f3fd\", \"1f645-1f3fe\", \"1f645-1f3ff\"],\n \"1f646-200d-2640-fe0f\": [\n \"1f646-1f3fb-200d-2640-fe0f\",\n \"1f646-1f3fc-200d-2640-fe0f\",\n \"1f646-1f3fd-200d-2640-fe0f\",\n \"1f646-1f3fe-200d-2640-fe0f\",\n \"1f646-1f3ff-200d-2640-fe0f\",\n ],\n \"1f646-200d-2642-fe0f\": [\n \"1f646-1f3fb-200d-2642-fe0f\",\n \"1f646-1f3fc-200d-2642-fe0f\",\n \"1f646-1f3fd-200d-2642-fe0f\",\n \"1f646-1f3fe-200d-2642-fe0f\",\n \"1f646-1f3ff-200d-2642-fe0f\",\n ],\n \"1f646\": [\"1f646-1f3fb\", \"1f646-1f3fc\", \"1f646-1f3fd\", \"1f646-1f3fe\", \"1f646-1f3ff\"],\n \"1f647-200d-2640-fe0f\": [\n \"1f647-1f3fb-200d-2640-fe0f\",\n \"1f647-1f3fc-200d-2640-fe0f\",\n \"1f647-1f3fd-200d-2640-fe0f\",\n \"1f647-1f3fe-200d-2640-fe0f\",\n \"1f647-1f3ff-200d-2640-fe0f\",\n ],\n \"1f647-200d-2642-fe0f\": [\n \"1f647-1f3fb-200d-2642-fe0f\",\n \"1f647-1f3fc-200d-2642-fe0f\",\n \"1f647-1f3fd-200d-2642-fe0f\",\n \"1f647-1f3fe-200d-2642-fe0f\",\n \"1f647-1f3ff-200d-2642-fe0f\",\n ],\n \"1f647\": [\"1f647-1f3fb\", \"1f647-1f3fc\", \"1f647-1f3fd\", \"1f647-1f3fe\", \"1f647-1f3ff\"],\n \"1f64b-200d-2640-fe0f\": [\n \"1f64b-1f3fb-200d-2640-fe0f\",\n \"1f64b-1f3fc-200d-2640-fe0f\",\n \"1f64b-1f3fd-200d-2640-fe0f\",\n \"1f64b-1f3fe-200d-2640-fe0f\",\n \"1f64b-1f3ff-200d-2640-fe0f\",\n ],\n \"1f64b-200d-2642-fe0f\": [\n \"1f64b-1f3fb-200d-2642-fe0f\",\n \"1f64b-1f3fc-200d-2642-fe0f\",\n \"1f64b-1f3fd-200d-2642-fe0f\",\n \"1f64b-1f3fe-200d-2642-fe0f\",\n \"1f64b-1f3ff-200d-2642-fe0f\",\n ],\n \"1f64b\": [\"1f64b-1f3fb\", \"1f64b-1f3fc\", \"1f64b-1f3fd\", \"1f64b-1f3fe\", \"1f64b-1f3ff\"],\n \"1f64c\": [\"1f64c-1f3fb\", \"1f64c-1f3fc\", \"1f64c-1f3fd\", \"1f64c-1f3fe\", \"1f64c-1f3ff\"],\n \"1f64d-200d-2640-fe0f\": [\n \"1f64d-1f3fb-200d-2640-fe0f\",\n \"1f64d-1f3fc-200d-2640-fe0f\",\n \"1f64d-1f3fd-200d-2640-fe0f\",\n \"1f64d-1f3fe-200d-2640-fe0f\",\n \"1f64d-1f3ff-200d-2640-fe0f\",\n ],\n \"1f64d-200d-2642-fe0f\": [\n \"1f64d-1f3fb-200d-2642-fe0f\",\n \"1f64d-1f3fc-200d-2642-fe0f\",\n \"1f64d-1f3fd-200d-2642-fe0f\",\n \"1f64d-1f3fe-200d-2642-fe0f\",\n \"1f64d-1f3ff-200d-2642-fe0f\",\n ],\n \"1f64d\": [\"1f64d-1f3fb\", \"1f64d-1f3fc\", \"1f64d-1f3fd\", \"1f64d-1f3fe\", \"1f64d-1f3ff\"],\n \"1f64e-200d-2640-fe0f\": [\n \"1f64e-1f3fb-200d-2640-fe0f\",\n \"1f64e-1f3fc-200d-2640-fe0f\",\n \"1f64e-1f3fd-200d-2640-fe0f\",\n \"1f64e-1f3fe-200d-2640-fe0f\",\n \"1f64e-1f3ff-200d-2640-fe0f\",\n ],\n \"1f64e-200d-2642-fe0f\": [\n \"1f64e-1f3fb-200d-2642-fe0f\",\n \"1f64e-1f3fc-200d-2642-fe0f\",\n \"1f64e-1f3fd-200d-2642-fe0f\",\n \"1f64e-1f3fe-200d-2642-fe0f\",\n \"1f64e-1f3ff-200d-2642-fe0f\",\n ],\n \"1f64e\": [\"1f64e-1f3fb\", \"1f64e-1f3fc\", \"1f64e-1f3fd\", \"1f64e-1f3fe\", \"1f64e-1f3ff\"],\n \"1f64f\": [\"1f64f-1f3fb\", \"1f64f-1f3fc\", \"1f64f-1f3fd\", \"1f64f-1f3fe\", \"1f64f-1f3ff\"],\n \"1f6a3-200d-2640-fe0f\": [\n \"1f6a3-1f3fb-200d-2640-fe0f\",\n \"1f6a3-1f3fc-200d-2640-fe0f\",\n \"1f6a3-1f3fd-200d-2640-fe0f\",\n \"1f6a3-1f3fe-200d-2640-fe0f\",\n \"1f6a3-1f3ff-200d-2640-fe0f\",\n ],\n \"1f6a3-200d-2642-fe0f\": [\n \"1f6a3-1f3fb-200d-2642-fe0f\",\n \"1f6a3-1f3fc-200d-2642-fe0f\",\n \"1f6a3-1f3fd-200d-2642-fe0f\",\n \"1f6a3-1f3fe-200d-2642-fe0f\",\n \"1f6a3-1f3ff-200d-2642-fe0f\",\n ],\n \"1f6a3\": [\"1f6a3-1f3fb\", \"1f6a3-1f3fc\", \"1f6a3-1f3fd\", \"1f6a3-1f3fe\", \"1f6a3-1f3ff\"],\n \"1f6b4-200d-2640-fe0f\": [\n \"1f6b4-1f3fb-200d-2640-fe0f\",\n \"1f6b4-1f3fc-200d-2640-fe0f\",\n \"1f6b4-1f3fd-200d-2640-fe0f\",\n \"1f6b4-1f3fe-200d-2640-fe0f\",\n \"1f6b4-1f3ff-200d-2640-fe0f\",\n ],\n \"1f6b4-200d-2642-fe0f\": [\n \"1f6b4-1f3fb-200d-2642-fe0f\",\n \"1f6b4-1f3fc-200d-2642-fe0f\",\n \"1f6b4-1f3fd-200d-2642-fe0f\",\n \"1f6b4-1f3fe-200d-2642-fe0f\",\n \"1f6b4-1f3ff-200d-2642-fe0f\",\n ],\n \"1f6b4\": [\"1f6b4-1f3fb\", \"1f6b4-1f3fc\", \"1f6b4-1f3fd\", \"1f6b4-1f3fe\", \"1f6b4-1f3ff\"],\n \"1f6b5-200d-2640-fe0f\": [\n \"1f6b5-1f3fb-200d-2640-fe0f\",\n \"1f6b5-1f3fc-200d-2640-fe0f\",\n \"1f6b5-1f3fd-200d-2640-fe0f\",\n \"1f6b5-1f3fe-200d-2640-fe0f\",\n \"1f6b5-1f3ff-200d-2640-fe0f\",\n ],\n \"1f6b5-200d-2642-fe0f\": [\n \"1f6b5-1f3fb-200d-2642-fe0f\",\n \"1f6b5-1f3fc-200d-2642-fe0f\",\n \"1f6b5-1f3fd-200d-2642-fe0f\",\n \"1f6b5-1f3fe-200d-2642-fe0f\",\n \"1f6b5-1f3ff-200d-2642-fe0f\",\n ],\n \"1f6b5\": [\"1f6b5-1f3fb\", \"1f6b5-1f3fc\", \"1f6b5-1f3fd\", \"1f6b5-1f3fe\", \"1f6b5-1f3ff\"],\n \"1f6b6-200d-2640-fe0f\": [\n \"1f6b6-1f3fb-200d-2640-fe0f\",\n \"1f6b6-1f3fc-200d-2640-fe0f\",\n \"1f6b6-1f3fd-200d-2640-fe0f\",\n \"1f6b6-1f3fe-200d-2640-fe0f\",\n \"1f6b6-1f3ff-200d-2640-fe0f\",\n ],\n \"1f6b6-200d-2640-fe0f-200d-27a1-fe0f\": [\n \"1f6b6-1f3fb-200d-2640-fe0f-200d-27a1-fe0f\",\n \"1f6b6-1f3fc-200d-2640-fe0f-200d-27a1-fe0f\",\n \"1f6b6-1f3fd-200d-2640-fe0f-200d-27a1-fe0f\",\n \"1f6b6-1f3fe-200d-2640-fe0f-200d-27a1-fe0f\",\n \"1f6b6-1f3ff-200d-2640-fe0f-200d-27a1-fe0f\",\n ],\n \"1f6b6-200d-2642-fe0f\": [\n \"1f6b6-1f3fb-200d-2642-fe0f\",\n \"1f6b6-1f3fc-200d-2642-fe0f\",\n \"1f6b6-1f3fd-200d-2642-fe0f\",\n \"1f6b6-1f3fe-200d-2642-fe0f\",\n \"1f6b6-1f3ff-200d-2642-fe0f\",\n ],\n \"1f6b6-200d-2642-fe0f-200d-27a1-fe0f\": [\n \"1f6b6-1f3fb-200d-2642-fe0f-200d-27a1-fe0f\",\n \"1f6b6-1f3fc-200d-2642-fe0f-200d-27a1-fe0f\",\n \"1f6b6-1f3fd-200d-2642-fe0f-200d-27a1-fe0f\",\n \"1f6b6-1f3fe-200d-2642-fe0f-200d-27a1-fe0f\",\n \"1f6b6-1f3ff-200d-2642-fe0f-200d-27a1-fe0f\",\n ],\n \"1f6b6-200d-27a1-fe0f\": [\n \"1f6b6-1f3fb-200d-27a1-fe0f\",\n \"1f6b6-1f3fc-200d-27a1-fe0f\",\n \"1f6b6-1f3fd-200d-27a1-fe0f\",\n \"1f6b6-1f3fe-200d-27a1-fe0f\",\n \"1f6b6-1f3ff-200d-27a1-fe0f\",\n ],\n \"1f6b6\": [\"1f6b6-1f3fb\", \"1f6b6-1f3fc\", \"1f6b6-1f3fd\", \"1f6b6-1f3fe\", \"1f6b6-1f3ff\"],\n \"1f6c0\": [\"1f6c0-1f3fb\", \"1f6c0-1f3fc\", \"1f6c0-1f3fd\", \"1f6c0-1f3fe\", \"1f6c0-1f3ff\"],\n \"1f6cc\": [\"1f6cc-1f3fb\", \"1f6cc-1f3fc\", \"1f6cc-1f3fd\", \"1f6cc-1f3fe\", \"1f6cc-1f3ff\"],\n \"1f90c\": [\"1f90c-1f3fb\", \"1f90c-1f3fc\", \"1f90c-1f3fd\", \"1f90c-1f3fe\", \"1f90c-1f3ff\"],\n \"1f90f\": [\"1f90f-1f3fb\", \"1f90f-1f3fc\", \"1f90f-1f3fd\", \"1f90f-1f3fe\", \"1f90f-1f3ff\"],\n \"1f918\": [\"1f918-1f3fb\", \"1f918-1f3fc\", \"1f918-1f3fd\", \"1f918-1f3fe\", \"1f918-1f3ff\"],\n \"1f919\": [\"1f919-1f3fb\", \"1f919-1f3fc\", \"1f919-1f3fd\", \"1f919-1f3fe\", \"1f919-1f3ff\"],\n \"1f91a\": [\"1f91a-1f3fb\", \"1f91a-1f3fc\", \"1f91a-1f3fd\", \"1f91a-1f3fe\", \"1f91a-1f3ff\"],\n \"1f91b\": [\"1f91b-1f3fb\", \"1f91b-1f3fc\", \"1f91b-1f3fd\", \"1f91b-1f3fe\", \"1f91b-1f3ff\"],\n \"1f91c\": [\"1f91c-1f3fb\", \"1f91c-1f3fc\", \"1f91c-1f3fd\", \"1f91c-1f3fe\", \"1f91c-1f3ff\"],\n \"1f91d\": [\"1f91d-1f3fb\", \"1f91d-1f3fc\", \"1f91d-1f3fd\", \"1f91d-1f3fe\", \"1f91d-1f3ff\"],\n \"1f91e\": [\"1f91e-1f3fb\", \"1f91e-1f3fc\", \"1f91e-1f3fd\", \"1f91e-1f3fe\", \"1f91e-1f3ff\"],\n \"1f91f\": [\"1f91f-1f3fb\", \"1f91f-1f3fc\", \"1f91f-1f3fd\", \"1f91f-1f3fe\", \"1f91f-1f3ff\"],\n \"1f926-200d-2640-fe0f\": [\n \"1f926-1f3fb-200d-2640-fe0f\",\n \"1f926-1f3fc-200d-2640-fe0f\",\n \"1f926-1f3fd-200d-2640-fe0f\",\n \"1f926-1f3fe-200d-2640-fe0f\",\n \"1f926-1f3ff-200d-2640-fe0f\",\n ],\n \"1f926-200d-2642-fe0f\": [\n \"1f926-1f3fb-200d-2642-fe0f\",\n \"1f926-1f3fc-200d-2642-fe0f\",\n \"1f926-1f3fd-200d-2642-fe0f\",\n \"1f926-1f3fe-200d-2642-fe0f\",\n \"1f926-1f3ff-200d-2642-fe0f\",\n ],\n \"1f926\": [\"1f926-1f3fb\", \"1f926-1f3fc\", \"1f926-1f3fd\", \"1f926-1f3fe\", \"1f926-1f3ff\"],\n \"1f930\": [\"1f930-1f3fb\", \"1f930-1f3fc\", \"1f930-1f3fd\", \"1f930-1f3fe\", \"1f930-1f3ff\"],\n \"1f931\": [\"1f931-1f3fb\", \"1f931-1f3fc\", \"1f931-1f3fd\", \"1f931-1f3fe\", \"1f931-1f3ff\"],\n \"1f932\": [\"1f932-1f3fb\", \"1f932-1f3fc\", \"1f932-1f3fd\", \"1f932-1f3fe\", \"1f932-1f3ff\"],\n \"1f933\": [\"1f933-1f3fb\", \"1f933-1f3fc\", \"1f933-1f3fd\", \"1f933-1f3fe\", \"1f933-1f3ff\"],\n \"1f934\": [\"1f934-1f3fb\", \"1f934-1f3fc\", \"1f934-1f3fd\", \"1f934-1f3fe\", \"1f934-1f3ff\"],\n \"1f935-200d-2640-fe0f\": [\n \"1f935-1f3fb-200d-2640-fe0f\",\n \"1f935-1f3fc-200d-2640-fe0f\",\n \"1f935-1f3fd-200d-2640-fe0f\",\n \"1f935-1f3fe-200d-2640-fe0f\",\n \"1f935-1f3ff-200d-2640-fe0f\",\n ],\n \"1f935-200d-2642-fe0f\": [\n \"1f935-1f3fb-200d-2642-fe0f\",\n \"1f935-1f3fc-200d-2642-fe0f\",\n \"1f935-1f3fd-200d-2642-fe0f\",\n \"1f935-1f3fe-200d-2642-fe0f\",\n \"1f935-1f3ff-200d-2642-fe0f\",\n ],\n \"1f935\": [\"1f935-1f3fb\", \"1f935-1f3fc\", \"1f935-1f3fd\", \"1f935-1f3fe\", \"1f935-1f3ff\"],\n \"1f936\": [\"1f936-1f3fb\", \"1f936-1f3fc\", \"1f936-1f3fd\", \"1f936-1f3fe\", \"1f936-1f3ff\"],\n \"1f937-200d-2640-fe0f\": [\n \"1f937-1f3fb-200d-2640-fe0f\",\n \"1f937-1f3fc-200d-2640-fe0f\",\n \"1f937-1f3fd-200d-2640-fe0f\",\n \"1f937-1f3fe-200d-2640-fe0f\",\n \"1f937-1f3ff-200d-2640-fe0f\",\n ],\n \"1f937-200d-2642-fe0f\": [\n \"1f937-1f3fb-200d-2642-fe0f\",\n \"1f937-1f3fc-200d-2642-fe0f\",\n \"1f937-1f3fd-200d-2642-fe0f\",\n \"1f937-1f3fe-200d-2642-fe0f\",\n \"1f937-1f3ff-200d-2642-fe0f\",\n ],\n \"1f937\": [\"1f937-1f3fb\", \"1f937-1f3fc\", \"1f937-1f3fd\", \"1f937-1f3fe\", \"1f937-1f3ff\"],\n \"1f938-200d-2640-fe0f\": [\n \"1f938-1f3fb-200d-2640-fe0f\",\n \"1f938-1f3fc-200d-2640-fe0f\",\n \"1f938-1f3fd-200d-2640-fe0f\",\n \"1f938-1f3fe-200d-2640-fe0f\",\n \"1f938-1f3ff-200d-2640-fe0f\",\n ],\n \"1f938-200d-2642-fe0f\": [\n \"1f938-1f3fb-200d-2642-fe0f\",\n \"1f938-1f3fc-200d-2642-fe0f\",\n \"1f938-1f3fd-200d-2642-fe0f\",\n \"1f938-1f3fe-200d-2642-fe0f\",\n \"1f938-1f3ff-200d-2642-fe0f\",\n ],\n \"1f938\": [\"1f938-1f3fb\", \"1f938-1f3fc\", \"1f938-1f3fd\", \"1f938-1f3fe\", \"1f938-1f3ff\"],\n \"1f939-200d-2640-fe0f\": [\n \"1f939-1f3fb-200d-2640-fe0f\",\n \"1f939-1f3fc-200d-2640-fe0f\",\n \"1f939-1f3fd-200d-2640-fe0f\",\n \"1f939-1f3fe-200d-2640-fe0f\",\n \"1f939-1f3ff-200d-2640-fe0f\",\n ],\n \"1f939-200d-2642-fe0f\": [\n \"1f939-1f3fb-200d-2642-fe0f\",\n \"1f939-1f3fc-200d-2642-fe0f\",\n \"1f939-1f3fd-200d-2642-fe0f\",\n \"1f939-1f3fe-200d-2642-fe0f\",\n \"1f939-1f3ff-200d-2642-fe0f\",\n ],\n \"1f939\": [\"1f939-1f3fb\", \"1f939-1f3fc\", \"1f939-1f3fd\", \"1f939-1f3fe\", \"1f939-1f3ff\"],\n \"1f93d-200d-2640-fe0f\": [\n \"1f93d-1f3fb-200d-2640-fe0f\",\n \"1f93d-1f3fc-200d-2640-fe0f\",\n \"1f93d-1f3fd-200d-2640-fe0f\",\n \"1f93d-1f3fe-200d-2640-fe0f\",\n \"1f93d-1f3ff-200d-2640-fe0f\",\n ],\n \"1f93d-200d-2642-fe0f\": [\n \"1f93d-1f3fb-200d-2642-fe0f\",\n \"1f93d-1f3fc-200d-2642-fe0f\",\n \"1f93d-1f3fd-200d-2642-fe0f\",\n \"1f93d-1f3fe-200d-2642-fe0f\",\n \"1f93d-1f3ff-200d-2642-fe0f\",\n ],\n \"1f93d\": [\"1f93d-1f3fb\", \"1f93d-1f3fc\", \"1f93d-1f3fd\", \"1f93d-1f3fe\", \"1f93d-1f3ff\"],\n \"1f93e-200d-2640-fe0f\": [\n \"1f93e-1f3fb-200d-2640-fe0f\",\n \"1f93e-1f3fc-200d-2640-fe0f\",\n \"1f93e-1f3fd-200d-2640-fe0f\",\n \"1f93e-1f3fe-200d-2640-fe0f\",\n \"1f93e-1f3ff-200d-2640-fe0f\",\n ],\n \"1f93e-200d-2642-fe0f\": [\n \"1f93e-1f3fb-200d-2642-fe0f\",\n \"1f93e-1f3fc-200d-2642-fe0f\",\n \"1f93e-1f3fd-200d-2642-fe0f\",\n \"1f93e-1f3fe-200d-2642-fe0f\",\n \"1f93e-1f3ff-200d-2642-fe0f\",\n ],\n \"1f93e\": [\"1f93e-1f3fb\", \"1f93e-1f3fc\", \"1f93e-1f3fd\", \"1f93e-1f3fe\", \"1f93e-1f3ff\"],\n \"1f977\": [\"1f977-1f3fb\", \"1f977-1f3fc\", \"1f977-1f3fd\", \"1f977-1f3fe\", \"1f977-1f3ff\"],\n \"1f9b5\": [\"1f9b5-1f3fb\", \"1f9b5-1f3fc\", \"1f9b5-1f3fd\", \"1f9b5-1f3fe\", \"1f9b5-1f3ff\"],\n \"1f9b6\": [\"1f9b6-1f3fb\", \"1f9b6-1f3fc\", \"1f9b6-1f3fd\", \"1f9b6-1f3fe\", \"1f9b6-1f3ff\"],\n \"1f9b8-200d-2640-fe0f\": [\n \"1f9b8-1f3fb-200d-2640-fe0f\",\n \"1f9b8-1f3fc-200d-2640-fe0f\",\n \"1f9b8-1f3fd-200d-2640-fe0f\",\n \"1f9b8-1f3fe-200d-2640-fe0f\",\n \"1f9b8-1f3ff-200d-2640-fe0f\",\n ],\n \"1f9b8-200d-2642-fe0f\": [\n \"1f9b8-1f3fb-200d-2642-fe0f\",\n \"1f9b8-1f3fc-200d-2642-fe0f\",\n \"1f9b8-1f3fd-200d-2642-fe0f\",\n \"1f9b8-1f3fe-200d-2642-fe0f\",\n \"1f9b8-1f3ff-200d-2642-fe0f\",\n ],\n \"1f9b8\": [\"1f9b8-1f3fb\", \"1f9b8-1f3fc\", \"1f9b8-1f3fd\", \"1f9b8-1f3fe\", \"1f9b8-1f3ff\"],\n \"1f9b9-200d-2640-fe0f\": [\n \"1f9b9-1f3fb-200d-2640-fe0f\",\n \"1f9b9-1f3fc-200d-2640-fe0f\",\n \"1f9b9-1f3fd-200d-2640-fe0f\",\n \"1f9b9-1f3fe-200d-2640-fe0f\",\n \"1f9b9-1f3ff-200d-2640-fe0f\",\n ],\n \"1f9b9-200d-2642-fe0f\": [\n \"1f9b9-1f3fb-200d-2642-fe0f\",\n \"1f9b9-1f3fc-200d-2642-fe0f\",\n \"1f9b9-1f3fd-200d-2642-fe0f\",\n \"1f9b9-1f3fe-200d-2642-fe0f\",\n \"1f9b9-1f3ff-200d-2642-fe0f\",\n ],\n \"1f9b9\": [\"1f9b9-1f3fb\", \"1f9b9-1f3fc\", \"1f9b9-1f3fd\", \"1f9b9-1f3fe\", \"1f9b9-1f3ff\"],\n \"1f9bb\": [\"1f9bb-1f3fb\", \"1f9bb-1f3fc\", \"1f9bb-1f3fd\", \"1f9bb-1f3fe\", \"1f9bb-1f3ff\"],\n \"1f9cd-200d-2640-fe0f\": [\n \"1f9cd-1f3fb-200d-2640-fe0f\",\n \"1f9cd-1f3fc-200d-2640-fe0f\",\n \"1f9cd-1f3fd-200d-2640-fe0f\",\n \"1f9cd-1f3fe-200d-2640-fe0f\",\n \"1f9cd-1f3ff-200d-2640-fe0f\",\n ],\n \"1f9cd-200d-2642-fe0f\": [\n \"1f9cd-1f3fb-200d-2642-fe0f\",\n \"1f9cd-1f3fc-200d-2642-fe0f\",\n \"1f9cd-1f3fd-200d-2642-fe0f\",\n \"1f9cd-1f3fe-200d-2642-fe0f\",\n \"1f9cd-1f3ff-200d-2642-fe0f\",\n ],\n \"1f9cd\": [\"1f9cd-1f3fb\", \"1f9cd-1f3fc\", \"1f9cd-1f3fd\", \"1f9cd-1f3fe\", \"1f9cd-1f3ff\"],\n \"1f9ce-200d-2640-fe0f\": [\n \"1f9ce-1f3fb-200d-2640-fe0f\",\n \"1f9ce-1f3fc-200d-2640-fe0f\",\n \"1f9ce-1f3fd-200d-2640-fe0f\",\n \"1f9ce-1f3fe-200d-2640-fe0f\",\n \"1f9ce-1f3ff-200d-2640-fe0f\",\n ],\n \"1f9ce-200d-2640-fe0f-200d-27a1-fe0f\": [\n \"1f9ce-1f3fb-200d-2640-fe0f-200d-27a1-fe0f\",\n \"1f9ce-1f3fc-200d-2640-fe0f-200d-27a1-fe0f\",\n \"1f9ce-1f3fd-200d-2640-fe0f-200d-27a1-fe0f\",\n \"1f9ce-1f3fe-200d-2640-fe0f-200d-27a1-fe0f\",\n \"1f9ce-1f3ff-200d-2640-fe0f-200d-27a1-fe0f\",\n ],\n \"1f9ce-200d-2642-fe0f\": [\n \"1f9ce-1f3fb-200d-2642-fe0f\",\n \"1f9ce-1f3fc-200d-2642-fe0f\",\n \"1f9ce-1f3fd-200d-2642-fe0f\",\n \"1f9ce-1f3fe-200d-2642-fe0f\",\n \"1f9ce-1f3ff-200d-2642-fe0f\",\n ],\n \"1f9ce-200d-2642-fe0f-200d-27a1-fe0f\": [\n \"1f9ce-1f3fb-200d-2642-fe0f-200d-27a1-fe0f\",\n \"1f9ce-1f3fc-200d-2642-fe0f-200d-27a1-fe0f\",\n \"1f9ce-1f3fd-200d-2642-fe0f-200d-27a1-fe0f\",\n \"1f9ce-1f3fe-200d-2642-fe0f-200d-27a1-fe0f\",\n \"1f9ce-1f3ff-200d-2642-fe0f-200d-27a1-fe0f\",\n ],\n \"1f9ce-200d-27a1-fe0f\": [\n \"1f9ce-1f3fb-200d-27a1-fe0f\",\n \"1f9ce-1f3fc-200d-27a1-fe0f\",\n \"1f9ce-1f3fd-200d-27a1-fe0f\",\n \"1f9ce-1f3fe-200d-27a1-fe0f\",\n \"1f9ce-1f3ff-200d-27a1-fe0f\",\n ],\n \"1f9ce\": [\"1f9ce-1f3fb\", \"1f9ce-1f3fc\", \"1f9ce-1f3fd\", \"1f9ce-1f3fe\", \"1f9ce-1f3ff\"],\n \"1f9cf-200d-2640-fe0f\": [\n \"1f9cf-1f3fb-200d-2640-fe0f\",\n \"1f9cf-1f3fc-200d-2640-fe0f\",\n \"1f9cf-1f3fd-200d-2640-fe0f\",\n \"1f9cf-1f3fe-200d-2640-fe0f\",\n \"1f9cf-1f3ff-200d-2640-fe0f\",\n ],\n \"1f9cf-200d-2642-fe0f\": [\n \"1f9cf-1f3fb-200d-2642-fe0f\",\n \"1f9cf-1f3fc-200d-2642-fe0f\",\n \"1f9cf-1f3fd-200d-2642-fe0f\",\n \"1f9cf-1f3fe-200d-2642-fe0f\",\n \"1f9cf-1f3ff-200d-2642-fe0f\",\n ],\n \"1f9cf\": [\"1f9cf-1f3fb\", \"1f9cf-1f3fc\", \"1f9cf-1f3fd\", \"1f9cf-1f3fe\", \"1f9cf-1f3ff\"],\n \"1f9d1-200d-1f33e\": [\n \"1f9d1-1f3fb-200d-1f33e\",\n \"1f9d1-1f3fc-200d-1f33e\",\n \"1f9d1-1f3fd-200d-1f33e\",\n \"1f9d1-1f3fe-200d-1f33e\",\n \"1f9d1-1f3ff-200d-1f33e\",\n ],\n \"1f9d1-200d-1f373\": [\n \"1f9d1-1f3fb-200d-1f373\",\n \"1f9d1-1f3fc-200d-1f373\",\n \"1f9d1-1f3fd-200d-1f373\",\n \"1f9d1-1f3fe-200d-1f373\",\n \"1f9d1-1f3ff-200d-1f373\",\n ],\n \"1f9d1-200d-1f37c\": [\n \"1f9d1-1f3fb-200d-1f37c\",\n \"1f9d1-1f3fc-200d-1f37c\",\n \"1f9d1-1f3fd-200d-1f37c\",\n \"1f9d1-1f3fe-200d-1f37c\",\n \"1f9d1-1f3ff-200d-1f37c\",\n ],\n \"1f9d1-200d-1f384\": [\n \"1f9d1-1f3fb-200d-1f384\",\n \"1f9d1-1f3fc-200d-1f384\",\n \"1f9d1-1f3fd-200d-1f384\",\n \"1f9d1-1f3fe-200d-1f384\",\n \"1f9d1-1f3ff-200d-1f384\",\n ],\n \"1f9d1-200d-1f393\": [\n \"1f9d1-1f3fb-200d-1f393\",\n \"1f9d1-1f3fc-200d-1f393\",\n \"1f9d1-1f3fd-200d-1f393\",\n \"1f9d1-1f3fe-200d-1f393\",\n \"1f9d1-1f3ff-200d-1f393\",\n ],\n \"1f9d1-200d-1f3a4\": [\n \"1f9d1-1f3fb-200d-1f3a4\",\n \"1f9d1-1f3fc-200d-1f3a4\",\n \"1f9d1-1f3fd-200d-1f3a4\",\n \"1f9d1-1f3fe-200d-1f3a4\",\n \"1f9d1-1f3ff-200d-1f3a4\",\n ],\n \"1f9d1-200d-1f3a8\": [\n \"1f9d1-1f3fb-200d-1f3a8\",\n \"1f9d1-1f3fc-200d-1f3a8\",\n \"1f9d1-1f3fd-200d-1f3a8\",\n \"1f9d1-1f3fe-200d-1f3a8\",\n \"1f9d1-1f3ff-200d-1f3a8\",\n ],\n \"1f9d1-200d-1f3eb\": [\n \"1f9d1-1f3fb-200d-1f3eb\",\n \"1f9d1-1f3fc-200d-1f3eb\",\n \"1f9d1-1f3fd-200d-1f3eb\",\n \"1f9d1-1f3fe-200d-1f3eb\",\n \"1f9d1-1f3ff-200d-1f3eb\",\n ],\n \"1f9d1-200d-1f3ed\": [\n \"1f9d1-1f3fb-200d-1f3ed\",\n \"1f9d1-1f3fc-200d-1f3ed\",\n \"1f9d1-1f3fd-200d-1f3ed\",\n \"1f9d1-1f3fe-200d-1f3ed\",\n \"1f9d1-1f3ff-200d-1f3ed\",\n ],\n \"1f9d1-200d-1f4bb\": [\n \"1f9d1-1f3fb-200d-1f4bb\",\n \"1f9d1-1f3fc-200d-1f4bb\",\n \"1f9d1-1f3fd-200d-1f4bb\",\n \"1f9d1-1f3fe-200d-1f4bb\",\n \"1f9d1-1f3ff-200d-1f4bb\",\n ],\n \"1f9d1-200d-1f4bc\": [\n \"1f9d1-1f3fb-200d-1f4bc\",\n \"1f9d1-1f3fc-200d-1f4bc\",\n \"1f9d1-1f3fd-200d-1f4bc\",\n \"1f9d1-1f3fe-200d-1f4bc\",\n \"1f9d1-1f3ff-200d-1f4bc\",\n ],\n \"1f9d1-200d-1f527\": [\n \"1f9d1-1f3fb-200d-1f527\",\n \"1f9d1-1f3fc-200d-1f527\",\n \"1f9d1-1f3fd-200d-1f527\",\n \"1f9d1-1f3fe-200d-1f527\",\n \"1f9d1-1f3ff-200d-1f527\",\n ],\n \"1f9d1-200d-1f52c\": [\n \"1f9d1-1f3fb-200d-1f52c\",\n \"1f9d1-1f3fc-200d-1f52c\",\n \"1f9d1-1f3fd-200d-1f52c\",\n \"1f9d1-1f3fe-200d-1f52c\",\n \"1f9d1-1f3ff-200d-1f52c\",\n ],\n \"1f9d1-200d-1f680\": [\n \"1f9d1-1f3fb-200d-1f680\",\n \"1f9d1-1f3fc-200d-1f680\",\n \"1f9d1-1f3fd-200d-1f680\",\n \"1f9d1-1f3fe-200d-1f680\",\n \"1f9d1-1f3ff-200d-1f680\",\n ],\n \"1f9d1-200d-1f692\": [\n \"1f9d1-1f3fb-200d-1f692\",\n \"1f9d1-1f3fc-200d-1f692\",\n \"1f9d1-1f3fd-200d-1f692\",\n \"1f9d1-1f3fe-200d-1f692\",\n \"1f9d1-1f3ff-200d-1f692\",\n ],\n \"1f9d1-200d-1f9af-200d-27a1-fe0f\": [\n \"1f9d1-1f3fb-200d-1f9af-200d-27a1-fe0f\",\n \"1f9d1-1f3fc-200d-1f9af-200d-27a1-fe0f\",\n \"1f9d1-1f3fd-200d-1f9af-200d-27a1-fe0f\",\n \"1f9d1-1f3fe-200d-1f9af-200d-27a1-fe0f\",\n \"1f9d1-1f3ff-200d-1f9af-200d-27a1-fe0f\",\n ],\n \"1f9d1-200d-1f9af\": [\n \"1f9d1-1f3fb-200d-1f9af\",\n \"1f9d1-1f3fc-200d-1f9af\",\n \"1f9d1-1f3fd-200d-1f9af\",\n \"1f9d1-1f3fe-200d-1f9af\",\n \"1f9d1-1f3ff-200d-1f9af\",\n ],\n \"1f9d1-200d-1f9b0\": [\n \"1f9d1-1f3fb-200d-1f9b0\",\n \"1f9d1-1f3fc-200d-1f9b0\",\n \"1f9d1-1f3fd-200d-1f9b0\",\n \"1f9d1-1f3fe-200d-1f9b0\",\n \"1f9d1-1f3ff-200d-1f9b0\",\n ],\n \"1f9d1-200d-1f9b1\": [\n \"1f9d1-1f3fb-200d-1f9b1\",\n \"1f9d1-1f3fc-200d-1f9b1\",\n \"1f9d1-1f3fd-200d-1f9b1\",\n \"1f9d1-1f3fe-200d-1f9b1\",\n \"1f9d1-1f3ff-200d-1f9b1\",\n ],\n \"1f9d1-200d-1f9b2\": [\n \"1f9d1-1f3fb-200d-1f9b2\",\n \"1f9d1-1f3fc-200d-1f9b2\",\n \"1f9d1-1f3fd-200d-1f9b2\",\n \"1f9d1-1f3fe-200d-1f9b2\",\n \"1f9d1-1f3ff-200d-1f9b2\",\n ],\n \"1f9d1-200d-1f9b3\": [\n \"1f9d1-1f3fb-200d-1f9b3\",\n \"1f9d1-1f3fc-200d-1f9b3\",\n \"1f9d1-1f3fd-200d-1f9b3\",\n \"1f9d1-1f3fe-200d-1f9b3\",\n \"1f9d1-1f3ff-200d-1f9b3\",\n ],\n \"1f9d1-200d-1f9bc-200d-27a1-fe0f\": [\n \"1f9d1-1f3fb-200d-1f9bc-200d-27a1-fe0f\",\n \"1f9d1-1f3fc-200d-1f9bc-200d-27a1-fe0f\",\n \"1f9d1-1f3fd-200d-1f9bc-200d-27a1-fe0f\",\n \"1f9d1-1f3fe-200d-1f9bc-200d-27a1-fe0f\",\n \"1f9d1-1f3ff-200d-1f9bc-200d-27a1-fe0f\",\n ],\n \"1f9d1-200d-1f9bc\": [\n \"1f9d1-1f3fb-200d-1f9bc\",\n \"1f9d1-1f3fc-200d-1f9bc\",\n \"1f9d1-1f3fd-200d-1f9bc\",\n \"1f9d1-1f3fe-200d-1f9bc\",\n \"1f9d1-1f3ff-200d-1f9bc\",\n ],\n \"1f9d1-200d-1f9bd-200d-27a1-fe0f\": [\n \"1f9d1-1f3fb-200d-1f9bd-200d-27a1-fe0f\",\n \"1f9d1-1f3fc-200d-1f9bd-200d-27a1-fe0f\",\n \"1f9d1-1f3fd-200d-1f9bd-200d-27a1-fe0f\",\n \"1f9d1-1f3fe-200d-1f9bd-200d-27a1-fe0f\",\n \"1f9d1-1f3ff-200d-1f9bd-200d-27a1-fe0f\",\n ],\n \"1f9d1-200d-1f9bd\": [\n \"1f9d1-1f3fb-200d-1f9bd\",\n \"1f9d1-1f3fc-200d-1f9bd\",\n \"1f9d1-1f3fd-200d-1f9bd\",\n \"1f9d1-1f3fe-200d-1f9bd\",\n \"1f9d1-1f3ff-200d-1f9bd\",\n ],\n \"1f9d1-200d-2695-fe0f\": [\n \"1f9d1-1f3fb-200d-2695-fe0f\",\n \"1f9d1-1f3fc-200d-2695-fe0f\",\n \"1f9d1-1f3fd-200d-2695-fe0f\",\n \"1f9d1-1f3fe-200d-2695-fe0f\",\n \"1f9d1-1f3ff-200d-2695-fe0f\",\n ],\n \"1f9d1-200d-2696-fe0f\": [\n \"1f9d1-1f3fb-200d-2696-fe0f\",\n \"1f9d1-1f3fc-200d-2696-fe0f\",\n \"1f9d1-1f3fd-200d-2696-fe0f\",\n \"1f9d1-1f3fe-200d-2696-fe0f\",\n \"1f9d1-1f3ff-200d-2696-fe0f\",\n ],\n \"1f9d1-200d-2708-fe0f\": [\n \"1f9d1-1f3fb-200d-2708-fe0f\",\n \"1f9d1-1f3fc-200d-2708-fe0f\",\n \"1f9d1-1f3fd-200d-2708-fe0f\",\n \"1f9d1-1f3fe-200d-2708-fe0f\",\n \"1f9d1-1f3ff-200d-2708-fe0f\",\n ],\n \"1f9d1\": [\"1f9d1-1f3fb\", \"1f9d1-1f3fc\", \"1f9d1-1f3fd\", \"1f9d1-1f3fe\", \"1f9d1-1f3ff\"],\n \"1f9d2\": [\"1f9d2-1f3fb\", \"1f9d2-1f3fc\", \"1f9d2-1f3fd\", \"1f9d2-1f3fe\", \"1f9d2-1f3ff\"],\n \"1f9d3\": [\"1f9d3-1f3fb\", \"1f9d3-1f3fc\", \"1f9d3-1f3fd\", \"1f9d3-1f3fe\", \"1f9d3-1f3ff\"],\n \"1f9d4-200d-2640-fe0f\": [\n \"1f9d4-1f3fb-200d-2640-fe0f\",\n \"1f9d4-1f3fc-200d-2640-fe0f\",\n \"1f9d4-1f3fd-200d-2640-fe0f\",\n \"1f9d4-1f3fe-200d-2640-fe0f\",\n \"1f9d4-1f3ff-200d-2640-fe0f\",\n ],\n \"1f9d4-200d-2642-fe0f\": [\n \"1f9d4-1f3fb-200d-2642-fe0f\",\n \"1f9d4-1f3fc-200d-2642-fe0f\",\n \"1f9d4-1f3fd-200d-2642-fe0f\",\n \"1f9d4-1f3fe-200d-2642-fe0f\",\n \"1f9d4-1f3ff-200d-2642-fe0f\",\n ],\n \"1f9d4\": [\"1f9d4-1f3fb\", \"1f9d4-1f3fc\", \"1f9d4-1f3fd\", \"1f9d4-1f3fe\", \"1f9d4-1f3ff\"],\n \"1f9d5\": [\"1f9d5-1f3fb\", \"1f9d5-1f3fc\", \"1f9d5-1f3fd\", \"1f9d5-1f3fe\", \"1f9d5-1f3ff\"],\n \"1f9d6-200d-2640-fe0f\": [\n \"1f9d6-1f3fb-200d-2640-fe0f\",\n \"1f9d6-1f3fc-200d-2640-fe0f\",\n \"1f9d6-1f3fd-200d-2640-fe0f\",\n \"1f9d6-1f3fe-200d-2640-fe0f\",\n \"1f9d6-1f3ff-200d-2640-fe0f\",\n ],\n \"1f9d6-200d-2642-fe0f\": [\n \"1f9d6-1f3fb-200d-2642-fe0f\",\n \"1f9d6-1f3fc-200d-2642-fe0f\",\n \"1f9d6-1f3fd-200d-2642-fe0f\",\n \"1f9d6-1f3fe-200d-2642-fe0f\",\n \"1f9d6-1f3ff-200d-2642-fe0f\",\n ],\n \"1f9d6\": [\"1f9d6-1f3fb\", \"1f9d6-1f3fc\", \"1f9d6-1f3fd\", \"1f9d6-1f3fe\", \"1f9d6-1f3ff\"],\n \"1f9d7-200d-2640-fe0f\": [\n \"1f9d7-1f3fb-200d-2640-fe0f\",\n \"1f9d7-1f3fc-200d-2640-fe0f\",\n \"1f9d7-1f3fd-200d-2640-fe0f\",\n \"1f9d7-1f3fe-200d-2640-fe0f\",\n \"1f9d7-1f3ff-200d-2640-fe0f\",\n ],\n \"1f9d7-200d-2642-fe0f\": [\n \"1f9d7-1f3fb-200d-2642-fe0f\",\n \"1f9d7-1f3fc-200d-2642-fe0f\",\n \"1f9d7-1f3fd-200d-2642-fe0f\",\n \"1f9d7-1f3fe-200d-2642-fe0f\",\n \"1f9d7-1f3ff-200d-2642-fe0f\",\n ],\n \"1f9d7\": [\"1f9d7-1f3fb\", \"1f9d7-1f3fc\", \"1f9d7-1f3fd\", \"1f9d7-1f3fe\", \"1f9d7-1f3ff\"],\n \"1f9d8-200d-2640-fe0f\": [\n \"1f9d8-1f3fb-200d-2640-fe0f\",\n \"1f9d8-1f3fc-200d-2640-fe0f\",\n \"1f9d8-1f3fd-200d-2640-fe0f\",\n \"1f9d8-1f3fe-200d-2640-fe0f\",\n \"1f9d8-1f3ff-200d-2640-fe0f\",\n ],\n \"1f9d8-200d-2642-fe0f\": [\n \"1f9d8-1f3fb-200d-2642-fe0f\",\n \"1f9d8-1f3fc-200d-2642-fe0f\",\n \"1f9d8-1f3fd-200d-2642-fe0f\",\n \"1f9d8-1f3fe-200d-2642-fe0f\",\n \"1f9d8-1f3ff-200d-2642-fe0f\",\n ],\n \"1f9d8\": [\"1f9d8-1f3fb\", \"1f9d8-1f3fc\", \"1f9d8-1f3fd\", \"1f9d8-1f3fe\", \"1f9d8-1f3ff\"],\n \"1f9d9-200d-2640-fe0f\": [\n \"1f9d9-1f3fb-200d-2640-fe0f\",\n \"1f9d9-1f3fc-200d-2640-fe0f\",\n \"1f9d9-1f3fd-200d-2640-fe0f\",\n \"1f9d9-1f3fe-200d-2640-fe0f\",\n \"1f9d9-1f3ff-200d-2640-fe0f\",\n ],\n \"1f9d9-200d-2642-fe0f\": [\n \"1f9d9-1f3fb-200d-2642-fe0f\",\n \"1f9d9-1f3fc-200d-2642-fe0f\",\n \"1f9d9-1f3fd-200d-2642-fe0f\",\n \"1f9d9-1f3fe-200d-2642-fe0f\",\n \"1f9d9-1f3ff-200d-2642-fe0f\",\n ],\n \"1f9d9\": [\"1f9d9-1f3fb\", \"1f9d9-1f3fc\", \"1f9d9-1f3fd\", \"1f9d9-1f3fe\", \"1f9d9-1f3ff\"],\n \"1f9da-200d-2640-fe0f\": [\n \"1f9da-1f3fb-200d-2640-fe0f\",\n \"1f9da-1f3fc-200d-2640-fe0f\",\n \"1f9da-1f3fd-200d-2640-fe0f\",\n \"1f9da-1f3fe-200d-2640-fe0f\",\n \"1f9da-1f3ff-200d-2640-fe0f\",\n ],\n \"1f9da-200d-2642-fe0f\": [\n \"1f9da-1f3fb-200d-2642-fe0f\",\n \"1f9da-1f3fc-200d-2642-fe0f\",\n \"1f9da-1f3fd-200d-2642-fe0f\",\n \"1f9da-1f3fe-200d-2642-fe0f\",\n \"1f9da-1f3ff-200d-2642-fe0f\",\n ],\n \"1f9da\": [\"1f9da-1f3fb\", \"1f9da-1f3fc\", \"1f9da-1f3fd\", \"1f9da-1f3fe\", \"1f9da-1f3ff\"],\n \"1f9db-200d-2640-fe0f\": [\n \"1f9db-1f3fb-200d-2640-fe0f\",\n \"1f9db-1f3fc-200d-2640-fe0f\",\n \"1f9db-1f3fd-200d-2640-fe0f\",\n \"1f9db-1f3fe-200d-2640-fe0f\",\n \"1f9db-1f3ff-200d-2640-fe0f\",\n ],\n \"1f9db-200d-2642-fe0f\": [\n \"1f9db-1f3fb-200d-2642-fe0f\",\n \"1f9db-1f3fc-200d-2642-fe0f\",\n \"1f9db-1f3fd-200d-2642-fe0f\",\n \"1f9db-1f3fe-200d-2642-fe0f\",\n \"1f9db-1f3ff-200d-2642-fe0f\",\n ],\n \"1f9db\": [\"1f9db-1f3fb\", \"1f9db-1f3fc\", \"1f9db-1f3fd\", \"1f9db-1f3fe\", \"1f9db-1f3ff\"],\n \"1f9dc-200d-2640-fe0f\": [\n \"1f9dc-1f3fb-200d-2640-fe0f\",\n \"1f9dc-1f3fc-200d-2640-fe0f\",\n \"1f9dc-1f3fd-200d-2640-fe0f\",\n \"1f9dc-1f3fe-200d-2640-fe0f\",\n \"1f9dc-1f3ff-200d-2640-fe0f\",\n ],\n \"1f9dc-200d-2642-fe0f\": [\n \"1f9dc-1f3fb-200d-2642-fe0f\",\n \"1f9dc-1f3fc-200d-2642-fe0f\",\n \"1f9dc-1f3fd-200d-2642-fe0f\",\n \"1f9dc-1f3fe-200d-2642-fe0f\",\n \"1f9dc-1f3ff-200d-2642-fe0f\",\n ],\n \"1f9dc\": [\"1f9dc-1f3fb\", \"1f9dc-1f3fc\", \"1f9dc-1f3fd\", \"1f9dc-1f3fe\", \"1f9dc-1f3ff\"],\n \"1f9dd-200d-2640-fe0f\": [\n \"1f9dd-1f3fb-200d-2640-fe0f\",\n \"1f9dd-1f3fc-200d-2640-fe0f\",\n \"1f9dd-1f3fd-200d-2640-fe0f\",\n \"1f9dd-1f3fe-200d-2640-fe0f\",\n \"1f9dd-1f3ff-200d-2640-fe0f\",\n ],\n \"1f9dd-200d-2642-fe0f\": [\n \"1f9dd-1f3fb-200d-2642-fe0f\",\n \"1f9dd-1f3fc-200d-2642-fe0f\",\n \"1f9dd-1f3fd-200d-2642-fe0f\",\n \"1f9dd-1f3fe-200d-2642-fe0f\",\n \"1f9dd-1f3ff-200d-2642-fe0f\",\n ],\n \"1f9dd\": [\"1f9dd-1f3fb\", \"1f9dd-1f3fc\", \"1f9dd-1f3fd\", \"1f9dd-1f3fe\", \"1f9dd-1f3ff\"],\n \"1fac3\": [\"1fac3-1f3fb\", \"1fac3-1f3fc\", \"1fac3-1f3fd\", \"1fac3-1f3fe\", \"1fac3-1f3ff\"],\n \"1fac4\": [\"1fac4-1f3fb\", \"1fac4-1f3fc\", \"1fac4-1f3fd\", \"1fac4-1f3fe\", \"1fac4-1f3ff\"],\n \"1fac5\": [\"1fac5-1f3fb\", \"1fac5-1f3fc\", \"1fac5-1f3fd\", \"1fac5-1f3fe\", \"1fac5-1f3ff\"],\n \"1faf0\": [\"1faf0-1f3fb\", \"1faf0-1f3fc\", \"1faf0-1f3fd\", \"1faf0-1f3fe\", \"1faf0-1f3ff\"],\n \"1faf1\": [\"1faf1-1f3fb\", \"1faf1-1f3fc\", \"1faf1-1f3fd\", \"1faf1-1f3fe\", \"1faf1-1f3ff\"],\n \"1faf2\": [\"1faf2-1f3fb\", \"1faf2-1f3fc\", \"1faf2-1f3fd\", \"1faf2-1f3fe\", \"1faf2-1f3ff\"],\n \"1faf3\": [\"1faf3-1f3fb\", \"1faf3-1f3fc\", \"1faf3-1f3fd\", \"1faf3-1f3fe\", \"1faf3-1f3ff\"],\n \"1faf4\": [\"1faf4-1f3fb\", \"1faf4-1f3fc\", \"1faf4-1f3fd\", \"1faf4-1f3fe\", \"1faf4-1f3ff\"],\n \"1faf5\": [\"1faf5-1f3fb\", \"1faf5-1f3fc\", \"1faf5-1f3fd\", \"1faf5-1f3fe\", \"1faf5-1f3ff\"],\n \"1faf6\": [\"1faf6-1f3fb\", \"1faf6-1f3fc\", \"1faf6-1f3fd\", \"1faf6-1f3fe\", \"1faf6-1f3ff\"],\n \"1faf7\": [\"1faf7-1f3fb\", \"1faf7-1f3fc\", \"1faf7-1f3fd\", \"1faf7-1f3fe\", \"1faf7-1f3ff\"],\n \"1faf8\": [\"1faf8-1f3fb\", \"1faf8-1f3fc\", \"1faf8-1f3fd\", \"1faf8-1f3fe\", \"1faf8-1f3ff\"],\n \"261d-fe0f\": [\"261d-1f3fb\", \"261d-1f3fc\", \"261d-1f3fd\", \"261d-1f3fe\", \"261d-1f3ff\"],\n \"26f9-fe0f-200d-2640-fe0f\": [\n \"26f9-1f3fb-200d-2640-fe0f\",\n \"26f9-1f3fc-200d-2640-fe0f\",\n \"26f9-1f3fd-200d-2640-fe0f\",\n \"26f9-1f3fe-200d-2640-fe0f\",\n \"26f9-1f3ff-200d-2640-fe0f\",\n ],\n \"26f9-fe0f-200d-2642-fe0f\": [\n \"26f9-1f3fb-200d-2642-fe0f\",\n \"26f9-1f3fc-200d-2642-fe0f\",\n \"26f9-1f3fd-200d-2642-fe0f\",\n \"26f9-1f3fe-200d-2642-fe0f\",\n \"26f9-1f3ff-200d-2642-fe0f\",\n ],\n \"26f9-fe0f\": [\"26f9-1f3fb\", \"26f9-1f3fc\", \"26f9-1f3fd\", \"26f9-1f3fe\", \"26f9-1f3ff\"],\n \"270a\": [\"270a-1f3fb\", \"270a-1f3fc\", \"270a-1f3fd\", \"270a-1f3fe\", \"270a-1f3ff\"],\n \"270b\": [\"270b-1f3fb\", \"270b-1f3fc\", \"270b-1f3fd\", \"270b-1f3fe\", \"270b-1f3ff\"],\n \"270c-fe0f\": [\"270c-1f3fb\", \"270c-1f3fc\", \"270c-1f3fd\", \"270c-1f3fe\", \"270c-1f3ff\"],\n \"270d-fe0f\": [\"270d-1f3fb\", \"270d-1f3fc\", \"270d-1f3fd\", \"270d-1f3fe\", \"270d-1f3ff\"],\n};\n","import { LEGACY_ALIASES } from \"./aliases\";\nimport { EMOJI_NAMES, EMOJI_SKIN_TONES } from \"./data.generated\";\n\nconst ALL_NAMES: Record<string, string> = { ...EMOJI_NAMES, ...LEGACY_ALIASES };\n\nexport type ResolvedEmoji = { kind: \"unicode\"; unified: string } | { kind: \"custom\"; url: string };\n\n/**\n * Resolves a `:name:` shortcode to a Unicode codepoint or a workspace custom emoji URL.\n * `custom` entries may point at a URL, or `alias:<name>` to point at another emoji (which may\n * itself be a standard one). Returns null when the name isn't recognized.\n */\nexport function resolveEmoji(\n name: string,\n skinTone: number | undefined,\n custom: Record<string, string> | undefined,\n): ResolvedEmoji | null {\n if (custom) {\n let current = name;\n const seen = new Set<string>();\n while (Object.hasOwn(custom, current) && !seen.has(current)) {\n seen.add(current);\n const value = custom[current];\n if (typeof value !== \"string\") break;\n if (value.startsWith(\"alias:\")) {\n current = value.slice(\"alias:\".length);\n continue;\n }\n return { kind: \"custom\", url: value };\n }\n }\n\n const unified = ALL_NAMES[name.toLowerCase()];\n if (!unified) return null;\n\n if (skinTone && skinTone >= 2 && skinTone <= 6) {\n const variant = EMOJI_SKIN_TONES[unified]?.[skinTone - 2];\n if (variant) return { kind: \"unicode\", unified: variant };\n }\n return { kind: \"unicode\", unified };\n}\n\n/** Apple emoji set served from jsDelivr, Slack's own image source for standard emoji. */\nexport function defaultEmojiImageUrl(unified: string): string {\n return `https://cdn.jsdelivr.net/npm/emoji-datasource-apple@16.0.0/img/apple/64/${unified}.png`;\n}\n","import { useBlockKit } from \"../context\";\nimport { Tooltip } from \"../Tooltip\";\nimport { defaultEmojiImageUrl, resolveEmoji } from \"./lookup\";\n\nexport interface EmojiProps {\n /** Shortcode without colons, e.g. `\"+1\"` or `\"basketball\"`. */\n name: string;\n /** Fitzpatrick modifier 2-6, as in Slack's `skin-tone-N`. */\n skinTone?: number;\n /** Rendered width/height in px. Defaults to 22, Slack's inline size at 15px text. */\n size?: number;\n}\n\n/** Renders a `:name:` shortcode as an image, matching Slack exactly. Unknown names fall back to the literal text. */\nexport function Emoji({ name, skinTone, size = 22 }: EmojiProps) {\n const { emoji } = useBlockKit();\n const resolved = resolveEmoji(name, skinTone, emoji.custom);\n if (!resolved) return <>{`:${name}:`}</>;\n\n const src =\n resolved.kind === \"custom\"\n ? resolved.url\n : (emoji.imageUrl ?? defaultEmojiImageUrl)(resolved.unified);\n\n return (\n <Tooltip label={`:${name}:`}>\n <span className=\"sbk-emoji\" style={{ width: size, height: size }}>\n <img\n className=\"sbk-emoji__img\"\n src={src}\n alt={`:${name}:`}\n draggable={false}\n style={{ width: size, height: size, top: size / 2, marginTop: -size / 2 }}\n />\n </span>\n </Tooltip>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { type LinkProps, type MentionRef, useBlockKit } from \"./context\";\n\n/**\n * A link from the payload, rendered by the provider's `linkComponent` when it has one. Without an\n * `href` (a payload missing its URL) it stays a plain `<a>`, so the app's component always gets one.\n */\nexport function Link({\n href,\n children,\n ...props\n}: Omit<LinkProps, \"href\"> & { href: string | undefined }) {\n const { linkComponent: Component } = useBlockKit();\n if (Component && href !== undefined)\n return (\n <Component href={href} {...props}>\n {children}\n </Component>\n );\n return (\n <a href={href} {...props}>\n {children}\n </a>\n );\n}\n\n/**\n * A resolved channel or user group mention: a link to the app's page for it when `mentionHref`\n * returns one, otherwise the plain pill. Both keep the pill's class, so they look the same.\n */\nexport function MentionLink({ type, id, children }: MentionRef & { children: ReactNode }) {\n const { mentionHref } = useBlockKit();\n const href = mentionHref?.({ type, id });\n return href === undefined ? (\n <span className=\"sbk-mention\">{children}</span>\n ) : (\n <Link className=\"sbk-mention\" href={href}>\n {children}\n </Link>\n );\n}\n","import { type KeyboardEvent, useEffect, useId, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { useBlockKit } from \"./context\";\nimport { Emoji } from \"./emoji\";\nimport { Link } from \"./Link\";\nimport { useClientLayoutEffect } from \"./useClientLayoutEffect\";\n\nexport interface UserMentionProps {\n /** Slack user id, e.g. `U0123ABC`. */\n id: string;\n /** Display name, rendered as `@name`. */\n name: string;\n}\n\nfunction localTime(timeZone: string): string | undefined {\n try {\n return new Date().toLocaleTimeString(\"en-US\", { hour: \"numeric\", minute: \"2-digit\", timeZone });\n } catch {\n return undefined;\n }\n}\n\n/**\n * A resolved `@user` mention. Clicking it (or Enter/Space when focused) opens a profile card like\n * Slack's `p-member_profile_card` popover: avatar, names, title, status and local time, filled from\n * `resolvers.userProfile` and falling back to the display name alone.\n */\nexport function UserMention({ id, name }: UserMentionProps) {\n const { resolvers, theme, mentionHref } = useBlockKit();\n const [open, setOpen] = useState(false);\n const [position, setPosition] = useState<{ top: number; left: number } | null>(null);\n const anchorRef = useRef<HTMLSpanElement>(null);\n const cardRef = useRef<HTMLDivElement>(null);\n const cardId = useId();\n\n useClientLayoutEffect(() => {\n if (!open) {\n setPosition(null);\n return;\n }\n const anchor = anchorRef.current?.getBoundingClientRect();\n const card = cardRef.current?.getBoundingClientRect();\n if (!anchor || !card) return;\n const gap = 4;\n const below = anchor.bottom + gap;\n const top =\n below + card.height <= window.innerHeight || anchor.top - gap - card.height < 0\n ? below\n : anchor.top - gap - card.height;\n const left = Math.min(Math.max(8, anchor.left), window.innerWidth - card.width - 8);\n setPosition({ top, left });\n }, [open]);\n\n useEffect(() => {\n if (!open) return;\n const onPointerDown = (e: MouseEvent) => {\n const target = e.target as Node;\n if (anchorRef.current?.contains(target) || cardRef.current?.contains(target)) return;\n setOpen(false);\n };\n const onKey = (e: globalThis.KeyboardEvent) => {\n if (e.key === \"Escape\") {\n setOpen(false);\n anchorRef.current?.focus();\n }\n };\n document.addEventListener(\"mousedown\", onPointerDown);\n document.addEventListener(\"keydown\", onKey);\n return () => {\n document.removeEventListener(\"mousedown\", onPointerDown);\n document.removeEventListener(\"keydown\", onKey);\n };\n }, [open]);\n\n function onKeyDown(e: KeyboardEvent) {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n setOpen((o) => !o);\n }\n }\n\n const profile = open ? (resolvers.userProfile?.(id) ?? { name }) : undefined;\n const time = profile?.timeZone ? localTime(profile.timeZone) : undefined;\n const href = profile ? mentionHref?.({ type: \"user\", id }) : undefined;\n\n return (\n <>\n <span\n ref={anchorRef}\n className=\"sbk-mention sbk-mention--user\"\n role=\"button\"\n tabIndex={0}\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n aria-controls={open ? cardId : undefined}\n onClick={() => setOpen((o) => !o)}\n onKeyDown={onKeyDown}\n >\n @{name}\n </span>\n {profile &&\n typeof document !== \"undefined\" &&\n createPortal(\n <div\n ref={cardRef}\n id={cardId}\n role=\"dialog\"\n aria-label={profile.name}\n className=\"sbk-root sbk-profile-card\"\n data-theme={theme}\n style={\n position\n ? { top: position.top, left: position.left }\n : { top: 0, left: 0, visibility: \"hidden\" }\n }\n >\n {profile.avatarUrl ? (\n <img className=\"sbk-profile-card__avatar\" src={profile.avatarUrl} alt=\"\" />\n ) : (\n <span\n className=\"sbk-profile-card__avatar sbk-profile-card__avatar--placeholder\"\n aria-hidden=\"true\"\n >\n {profile.name.charAt(0).toUpperCase()}\n </span>\n )}\n <div className=\"sbk-profile-card__body\">\n <div className=\"sbk-profile-card__name\">\n {href === undefined ? (\n profile.name\n ) : (\n <Link className=\"sbk-profile-card__name-link\" href={href}>\n {profile.name}\n </Link>\n )}\n {profile.pronouns && (\n <span className=\"sbk-profile-card__pronouns\">{profile.pronouns}</span>\n )}\n </div>\n {profile.realName && profile.realName !== profile.name && (\n <div className=\"sbk-profile-card__secondary\">{profile.realName}</div>\n )}\n {profile.title && <div className=\"sbk-profile-card__secondary\">{profile.title}</div>}\n {profile.status && (profile.status.emoji || profile.status.text) && (\n <div className=\"sbk-profile-card__status\">\n {profile.status.emoji && <Emoji name={profile.status.emoji} size={16} />}\n {profile.status.text}\n </div>\n )}\n {time && <div className=\"sbk-profile-card__time\">{time} local time</div>}\n </div>\n </div>,\n document.body,\n )}\n </>\n );\n}\n","import { formatSlackDate, type InlineNode, type MrkdwnNode, parse } from \"./parser\";\nimport { Fragment, type ReactNode } from \"react\";\nimport { useBlockKit } from \"./context\";\nimport { Emoji } from \"./emoji\";\nimport { Link, MentionLink } from \"./Link\";\nimport { UserMention } from \"./UserMention\";\n\nexport interface MrkdwnProps {\n text: string;\n /** Slack's `verbatim` flag. When false (the default), bare URLs are linked. */\n verbatim?: boolean;\n /** Pixel size for `:emoji:` images. Defaults to 22 (Slack's inline size at 15px text). */\n emojiSize?: number;\n}\n\n/** Renders a Slack mrkdwn string. */\nexport function Mrkdwn({ text, verbatim = false, emojiSize = 22 }: MrkdwnProps) {\n const { resolvers, timeZone } = useBlockKit();\n const root = parse(text, { verbatim });\n return (\n <span className=\"sbk-mrkdwn\">{renderNodes(root.children, resolvers, timeZone, emojiSize)}</span>\n );\n}\n\nfunction renderNodes(\n nodes: MrkdwnNode[],\n resolvers: ReturnType<typeof useBlockKit>[\"resolvers\"],\n timeZone: string | undefined,\n emojiSize: number,\n): ReactNode[] {\n return nodes.map((node, i) => (\n <Fragment key={i}>{renderNode(node, resolvers, timeZone, emojiSize)}</Fragment>\n ));\n}\n\nfunction renderNode(\n node: MrkdwnNode,\n resolvers: ReturnType<typeof useBlockKit>[\"resolvers\"],\n timeZone: string | undefined,\n emojiSize: number,\n): ReactNode {\n switch (node.type) {\n case \"text\":\n return renderText(node.value);\n case \"bold\":\n return <b>{renderNodes(node.children, resolvers, timeZone, emojiSize)}</b>;\n case \"italic\":\n return <i>{renderNodes(node.children, resolvers, timeZone, emojiSize)}</i>;\n case \"strike\":\n return <s>{renderNodes(node.children, resolvers, timeZone, emojiSize)}</s>;\n case \"code\":\n return <code className=\"sbk-mrkdwn__code\">{node.value}</code>;\n case \"preformatted\":\n return <pre className=\"sbk-mrkdwn__pre\">{node.value}</pre>;\n case \"quote\":\n return (\n <blockquote className=\"sbk-mrkdwn__quote\">\n {renderNodes(node.children, resolvers, timeZone, emojiSize)}\n </blockquote>\n );\n case \"link\":\n return (\n <Link className=\"sbk-link\" href={node.url} target=\"_blank\" rel=\"noopener noreferrer\">\n {node.children ? renderNodes(node.children, resolvers, timeZone, emojiSize) : node.url}\n </Link>\n );\n case \"user\": {\n const name = resolvers.user?.(node.id);\n return name ? <UserMention id={node.id} name={name} /> : <Fragment>@{node.id}</Fragment>;\n }\n case \"usergroup\": {\n // The Builder shows an empty loading pill for subteam mentions it can't resolve live, even\n // when the message carries a `|label` fallback — the label is ignored for display.\n const name = resolvers.usergroup?.(node.id);\n return name ? (\n <MentionLink type=\"usergroup\" id={node.id}>\n @{name}\n </MentionLink>\n ) : (\n <span className=\"sbk-mention--loading\" aria-label=\"Loading user group\" />\n );\n }\n case \"channel\": {\n const name = resolvers.channel?.(node.id) ?? node.label;\n return name ? (\n <MentionLink type=\"channel\" id={node.id}>\n #{name}\n </MentionLink>\n ) : (\n <span className=\"sbk-mention--private\">\n <LockIcon />\n Private channel\n </span>\n );\n }\n case \"broadcast\":\n return <span className=\"sbk-mention--broadcast\">@{node.range}</span>;\n case \"date\": {\n const text = formatSlackDate(node.timestamp, node.format, { timeZone });\n return node.url ? (\n <Link className=\"sbk-link\" href={node.url} target=\"_blank\" rel=\"noopener noreferrer\">\n {text}\n </Link>\n ) : (\n <span className=\"sbk-mrkdwn__date\">{text}</span>\n );\n }\n case \"emoji\":\n return <Emoji name={node.name} skinTone={node.skinTone} size={emojiSize} />;\n }\n}\n\n/** Matches the lock glyph Slack shows on an unresolved private channel mention. */\nexport function LockIcon() {\n return (\n <svg\n className=\"sbk-mention__lock-icon\"\n viewBox=\"0 0 20 20\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <path\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M10 1.5A4.5 4.5 0 0 0 5.5 6v1.5h-.25A2.25 2.25 0 0 0 3 9.75v6.5c0 .966.784 1.75 1.75 1.75h10.5A1.75 1.75 0 0 0 17 16.25v-6.5a2.25 2.25 0 0 0-2.25-2.25h-.25V6A4.5 4.5 0 0 0 10 1.5m3 6V6a3 3 0 1 0-6 0v1.5zM4.5 9.75A.75.75 0 0 1 5.25 9h9.5a.75.75 0 0 1 .75.75v6.5a.25.25 0 0 1-.25.25H4.75a.25.25 0 0 1-.25-.25z\"\n />\n </svg>\n );\n}\n\nfunction renderText(value: string): ReactNode {\n const lines = value.split(\"\\n\");\n return lines.map((line, i) => (\n <Fragment key={i}>\n {i > 0 && <br />}\n {line}\n </Fragment>\n ));\n}\n\nexport type { InlineNode };\n","import type { MrkdwnElement, PlainTextElement } from \"@slack/types\";\nimport { parsePlainTextEmoji } from \"./parser\";\nimport { Fragment } from \"react\";\nimport { Emoji } from \"./emoji\";\nimport { Mrkdwn } from \"./Mrkdwn\";\n\nexport type TextObject = PlainTextElement | MrkdwnElement;\n\nexport interface TextProps {\n text: TextObject;\n /** Pixel size for `:emoji:` images. Defaults to 22 (Slack's inline size at 15px text). */\n emojiSize?: number;\n}\n\n/** Renders a Block Kit text object. */\nexport function Text({ text, emojiSize = 22 }: TextProps) {\n if (text.type === \"mrkdwn\") {\n return <Mrkdwn text={text.text} verbatim={text.verbatim} emojiSize={emojiSize} />;\n }\n\n // plain_text converts `:name:` shortcodes to emoji by default; `emoji: false` opts out.\n const emoji = (text as PlainTextElement).emoji ?? true;\n if (!emoji) return <span className=\"sbk-plain-text\">{text.text}</span>;\n\n const nodes = parsePlainTextEmoji(text.text);\n return (\n <span className=\"sbk-plain-text\">\n {nodes.map((node, i) => (\n <Fragment key={i}>\n {node.type === \"emoji\" ? (\n <Emoji name={node.name} skinTone={node.skinTone} size={emojiSize} />\n ) : (\n node.value\n )}\n </Fragment>\n ))}\n </span>\n );\n}\n","import type { ConfirmationDialog } from \"@slack/types\";\nimport { createPortal } from \"react-dom\";\nimport { useBlockKit } from \"../context\";\nimport { Text } from \"../Text\";\n\nexport interface ConfirmDialogProps {\n confirm: ConfirmationDialog;\n onConfirm: () => void;\n onDeny: () => void;\n}\n\n/** Slack's confirmation dialog: blocks the triggering action until the user picks confirm/deny. */\nexport function ConfirmDialog({ confirm, onConfirm, onDeny }: ConfirmDialogProps) {\n const { theme } = useBlockKit();\n const confirmStyle = confirm.style ?? \"primary\";\n const node = (\n <div className=\"sbk-confirm__overlay\" role=\"presentation\" data-theme={theme} onClick={onDeny}>\n <div\n className=\"sbk-confirm\"\n role=\"alertdialog\"\n aria-modal=\"true\"\n aria-label={confirm.title?.text}\n // Stop the overlay's onClick (dismiss) from firing for clicks inside the dialog.\n onClick={(event) => event.stopPropagation()}\n >\n {confirm.title && <h2 className=\"sbk-confirm__title\">{confirm.title.text}</h2>}\n <div className=\"sbk-confirm__text\">\n <Text text={confirm.text} />\n </div>\n <div className=\"sbk-confirm__actions\">\n <button\n type=\"button\"\n className=\"sbk-confirm__button sbk-confirm__button--deny\"\n onClick={onDeny}\n >\n {confirm.deny?.text ?? \"Cancel\"}\n </button>\n <button\n type=\"button\"\n className={`sbk-confirm__button sbk-confirm__button--${confirmStyle}`}\n onClick={onConfirm}\n >\n {confirm.confirm?.text ?? \"Confirm\"}\n </button>\n </div>\n </div>\n </div>\n );\n // Portal to <body> so the dialog stacks above the message surface; falls back to inline\n // rendering when `document` isn't available (e.g. non-DOM test renderers).\n return typeof document !== \"undefined\" ? createPortal(node, document.body) : node;\n}\n","import type { ConfirmationDialog } from \"@slack/types\";\nimport { useCallback, useState } from \"react\";\nimport { ConfirmDialog } from \"./ConfirmDialog\";\n\n/**\n * Wires up a confirm-before-acting flow for an element's `confirm` object. `ask()` resolves\n * `true` immediately when there is no `confirm` object; otherwise it opens the dialog and\n * resolves once the user picks confirm or deny. Render the returned `dialog` next to the\n * element so it can appear when open.\n */\nexport function useConfirm(confirm: ConfirmationDialog | undefined) {\n const [resolver, setResolver] = useState<((ok: boolean) => void) | null>(null);\n\n const ask = useCallback(() => {\n if (!confirm) return Promise.resolve(true);\n return new Promise<boolean>((resolve) => setResolver(() => resolve));\n }, [confirm]);\n\n const dialog =\n resolver && confirm ? (\n <ConfirmDialog\n confirm={confirm}\n onConfirm={() => {\n resolver(true);\n setResolver(null);\n }}\n onDeny={() => {\n resolver(false);\n setResolver(null);\n }}\n />\n ) : null;\n\n return { ask, dialog };\n}\n","import type { Button as ButtonElement } from \"@slack/types\";\nimport { useConfirm } from \"../confirm/useConfirm\";\nimport { useBlockKit } from \"../context\";\nimport type { ElementProps } from \"../types\";\n\nexport function Button({ element, blockId }: ElementProps<ButtonElement>) {\n const { dispatch } = useBlockKit();\n const { ask, dialog } = useConfirm(element.confirm);\n const className = [\"sbk-button\", element.style && `sbk-button--${element.style}`]\n .filter(Boolean)\n .join(\" \");\n\n const handleClick = async () => {\n if (!(await ask())) return;\n dispatch({\n type: \"button\",\n action_id: element.action_id ?? \"\",\n block_id: blockId,\n text: { type: \"plain_text\", text: element.text.text, emoji: element.text.emoji ?? true },\n ...(element.value !== undefined ? { value: element.value } : {}),\n ...(element.url !== undefined ? { url: element.url } : {}),\n ...(element.style !== undefined ? { style: element.style } : {}),\n // Slack echoes the button's confirm dialog back in the action.\n ...(element.confirm ? { confirm: element.confirm } : {}),\n });\n if (element.url) window.open(element.url, \"_blank\", \"noopener,noreferrer\");\n };\n\n return (\n <>\n <button\n type=\"button\"\n className={className}\n onClick={handleClick}\n aria-label={element.accessibility_label}\n >\n <span className=\"sbk-button__label\">{element.text.text}</span>\n </button>\n {dialog}\n </>\n );\n}\n","import { useEffect, useRef } from \"react\";\nimport { useBlockKit } from \"../context\";\n\n/**\n * Slack's `focus_on_load`: the element takes focus when its modal or Home tab opens. Slack ignores\n * it in messages and allows it on only one element per view.\n *\n * Pass the element's own ref when it already has one; otherwise attach the returned ref. The return\n * type is `useRef`'s own, which differs between @types/react 18 and 19, so it fits a `ref` prop in\n * both.\n */\nexport function useFocusOnLoad<T extends HTMLElement>(\n element: { focus_on_load?: boolean },\n existing?: { readonly current: T | null },\n) {\n const { surface } = useBlockKit();\n const own = useRef<T>(null);\n const ref = existing ?? own;\n const focus = element.focus_on_load === true && surface !== \"message\";\n useEffect(() => {\n if (focus) ref.current?.focus();\n // Only when the surface loads, like Slack.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n return ref as typeof own;\n}\n","import type { Checkboxes as CheckboxesElement, Option } from \"@slack/types\";\nimport { useEffect, useState } from \"react\";\nimport { useConfirm } from \"../confirm/useConfirm\";\nimport { useBlockKit } from \"../context\";\nimport { Text } from \"../Text\";\nimport type { ElementProps } from \"../types\";\nimport { useFocusOnLoad } from \"./useFocusOnLoad\";\n\n/** Two options are \"the same\" option when their values match, as Slack compares them. */\nfunction sameOption(a: Option, b: Option) {\n return a.value === b.value;\n}\n\nexport function Checkboxes({ element, blockId }: ElementProps<CheckboxesElement>) {\n const { setValue, dispatch } = useBlockKit();\n const { ask, dialog } = useConfirm(element.confirm);\n const [selected, setSelected] = useState<Option[]>(element.initial_options ?? []);\n const actionId = element.action_id ?? \"\";\n const focusRef = useFocusOnLoad<HTMLInputElement>(element);\n\n useEffect(() => {\n setValue(blockId, actionId, { type: \"checkboxes\", selected_options: selected });\n // Only on mount: report the initial value, exactly like Slack does when the surface loads.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const toggle = async (option: Option) => {\n const isSelected = selected.some((o) => sameOption(o, option));\n if (!isSelected && !(await ask())) return;\n const next = isSelected\n ? selected.filter((o) => !sameOption(o, option))\n : [...selected, option];\n setSelected(next);\n setValue(blockId, actionId, { type: \"checkboxes\", selected_options: next });\n dispatch({\n type: \"checkboxes\",\n action_id: actionId,\n block_id: blockId,\n selected_options: next,\n });\n };\n\n return (\n <div className=\"sbk-checkboxes\" role=\"group\">\n {element.options.map((option, i) => {\n const checked = selected.some((o) => sameOption(o, option));\n return (\n <label className=\"sbk-checkboxes__option\" key={option.value ?? i}>\n <input\n ref={i === 0 ? focusRef : undefined}\n type=\"checkbox\"\n className=\"sbk-checkboxes__input\"\n checked={checked}\n onChange={() => toggle(option)}\n />\n <span className=\"sbk-checkboxes__body\">\n <span className=\"sbk-checkboxes__text\">\n <Text text={option.text} />\n </span>\n {option.description && (\n <span className=\"sbk-checkboxes__description\">\n <Text text={option.description} />\n </span>\n )}\n </span>\n </label>\n );\n })}\n {dialog}\n </div>\n );\n}\n","import { useState } from \"react\";\n\nexport interface CalendarProps {\n /** `YYYY-MM-DD`, or undefined for no selection. */\n value?: string;\n onSelect: (date: string) => void;\n /** When given (and a date is selected), a \"Clear selection\" footer is shown, as in Slack. */\n onClear?: () => void;\n}\n\nfunction pad(n: number) {\n return String(n).padStart(2, \"0\");\n}\n\nfunction toISO(y: number, m: number, d: number) {\n return `${y}-${pad(m + 1)}-${pad(d)}`;\n}\n\nfunction todayISO() {\n const now = new Date();\n return toISO(now.getFullYear(), now.getMonth(), now.getDate());\n}\n\nfunction Caret({ direction }: { direction: \"left\" | \"right\" }) {\n return (\n <svg viewBox=\"0 0 20 20\" width=\"20\" height=\"20\" aria-hidden=\"true\">\n <path\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n d={\n direction === \"left\"\n ? \"M12.28 5.22a.75.75 0 0 1 0 1.06L8.56 10l3.72 3.72a.75.75 0 1 1-1.06 1.06l-4.25-4.25a.75.75 0 0 1 0-1.06l4.25-4.25a.75.75 0 0 1 1.06 0\"\n : \"M7.72 14.78a.75.75 0 0 1 0-1.06L11.44 10 7.72 6.28a.75.75 0 0 1 1.06-1.06l4.25 4.25a.75.75 0 0 1 0 1.06l-4.25 4.25a.75.75 0 0 1-1.06 0\"\n }\n clipRule=\"evenodd\"\n />\n </svg>\n );\n}\n\n/** A month grid matching Slack's `c-date_picker_calendar`: a bordered 7-column grid of 44×42\n * day cells, a ring around today, and solid blue for the selected day. */\nexport function Calendar({ value, onSelect, onClear }: CalendarProps) {\n const initial = value ? new Date(`${value}T00:00:00Z`) : new Date();\n const [year, setYear] = useState(initial.getUTCFullYear());\n const [month, setMonth] = useState(initial.getUTCMonth());\n\n const first = new Date(Date.UTC(year, month, 1));\n const startWeekday = first.getUTCDay();\n const daysInMonth = new Date(Date.UTC(year, month + 1, 0)).getUTCDate();\n const cells: (number | null)[] = [\n ...Array(startWeekday).fill(null),\n ...Array.from({ length: daysInMonth }, (_, i) => i + 1),\n ];\n const today = todayISO();\n\n function go(delta: number) {\n const d = new Date(Date.UTC(year, month + delta, 1));\n setYear(d.getUTCFullYear());\n setMonth(d.getUTCMonth());\n }\n\n const monthLabel = first.toLocaleDateString(\"en-US\", {\n month: \"long\",\n year: \"numeric\",\n timeZone: \"UTC\",\n });\n\n return (\n <div className=\"sbk-calendar\">\n <div className=\"sbk-calendar__header\">\n <button\n type=\"button\"\n className=\"sbk-calendar__nav\"\n onClick={() => go(-1)}\n aria-label=\"Previous month\"\n >\n <Caret direction=\"left\" />\n </button>\n <span className=\"sbk-calendar__label\">{monthLabel}</span>\n <button\n type=\"button\"\n className=\"sbk-calendar__nav\"\n onClick={() => go(1)}\n aria-label=\"Next month\"\n >\n <Caret direction=\"right\" />\n </button>\n </div>\n <div className=\"sbk-calendar__weekdays\">\n {[\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"].map((w) => (\n <span key={w}>{w}</span>\n ))}\n </div>\n <div className=\"sbk-calendar__grid\">\n {cells.map((day, i) => {\n if (day === null)\n return <span key={i} className=\"sbk-calendar__cell sbk-calendar__cell--empty\" />;\n const iso = toISO(year, month, day);\n const classes = [\"sbk-calendar__cell\"];\n if (iso === value) classes.push(\"sbk-calendar__cell--selected\");\n if (iso === today) classes.push(\"sbk-calendar__cell--today\");\n return (\n <button\n type=\"button\"\n key={iso}\n className={classes.join(\" \")}\n aria-pressed={iso === value}\n aria-current={iso === today ? \"date\" : undefined}\n onClick={() => onSelect(iso)}\n >\n {day}\n </button>\n );\n })}\n </div>\n {onClear && value && (\n <div className=\"sbk-calendar__footer\">\n <button type=\"button\" className=\"sbk-calendar__clear\" onClick={onClear}>\n Clear selection\n </button>\n </div>\n )}\n </div>\n );\n}\n","/** \"1st\", \"2nd\", \"3rd\", \"11th\"… as Slack writes the day in a long date (\"January 1st, 2026\"). */\nexport function ordinal(day: number): string {\n if (day % 10 === 1 && day !== 11) return `${day}st`;\n if (day % 10 === 2 && day !== 12) return `${day}nd`;\n if (day % 10 === 3 && day !== 13) return `${day}rd`;\n return `${day}th`;\n}\n\n/** Slack names time zones by their Windows display name (minus the UTC offset), not the IANA id. */\nconst TIME_ZONE_LABELS: Record<string, string> = {\n \"Europe/Amsterdam\": \"Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna\",\n \"Europe/Berlin\": \"Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna\",\n \"Europe/Zurich\": \"Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna\",\n \"Europe/Rome\": \"Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna\",\n \"Europe/Stockholm\": \"Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna\",\n \"Europe/Vienna\": \"Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna\",\n \"Europe/Brussels\": \"Brussels, Copenhagen, Madrid, Paris\",\n \"Europe/Copenhagen\": \"Brussels, Copenhagen, Madrid, Paris\",\n \"Europe/Madrid\": \"Brussels, Copenhagen, Madrid, Paris\",\n \"Europe/Paris\": \"Brussels, Copenhagen, Madrid, Paris\",\n \"Europe/Belgrade\": \"Belgrade, Bratislava, Budapest, Ljubljana, Prague\",\n \"Europe/Budapest\": \"Belgrade, Bratislava, Budapest, Ljubljana, Prague\",\n \"Europe/Prague\": \"Belgrade, Bratislava, Budapest, Ljubljana, Prague\",\n \"Europe/Warsaw\": \"Sarajevo, Skopje, Warsaw, Zagreb\",\n \"Europe/Dublin\": \"Dublin, Edinburgh, Lisbon, London\",\n \"Europe/Lisbon\": \"Dublin, Edinburgh, Lisbon, London\",\n \"Europe/London\": \"Dublin, Edinburgh, Lisbon, London\",\n \"Europe/Athens\": \"Athens, Bucharest\",\n \"Europe/Bucharest\": \"Athens, Bucharest\",\n \"Europe/Helsinki\": \"Helsinki, Kyiv, Riga, Sofia, Tallinn, Vilnius\",\n \"Europe/Kyiv\": \"Helsinki, Kyiv, Riga, Sofia, Tallinn, Vilnius\",\n \"Europe/Istanbul\": \"Istanbul\",\n \"Europe/Moscow\": \"Moscow, St. Petersburg\",\n \"America/New_York\": \"Eastern Time (US and Canada)\",\n \"America/Chicago\": \"Central Time (US and Canada)\",\n \"America/Denver\": \"Mountain Time (US and Canada)\",\n \"America/Phoenix\": \"Arizona\",\n \"America/Los_Angeles\": \"Pacific Time (US and Canada)\",\n \"America/Anchorage\": \"Alaska\",\n \"Pacific/Honolulu\": \"Hawaii\",\n \"America/Halifax\": \"Atlantic Time (Canada)\",\n \"America/Sao_Paulo\": \"Brasilia\",\n \"Asia/Dubai\": \"Abu Dhabi, Muscat\",\n \"Asia/Kolkata\": \"Chennai, Kolkata, Mumbai, New Delhi\",\n \"Asia/Shanghai\": \"Beijing, Chongqing, Hong Kong, Urumqi\",\n \"Asia/Hong_Kong\": \"Beijing, Chongqing, Hong Kong, Urumqi\",\n \"Asia/Singapore\": \"Kuala Lumpur, Singapore\",\n \"Asia/Tokyo\": \"Osaka, Sapporo, Tokyo\",\n \"Australia/Sydney\": \"Canberra, Melbourne, Sydney\",\n \"Australia/Melbourne\": \"Canberra, Melbourne, Sydney\",\n \"Pacific/Auckland\": \"Auckland, Wellington\",\n};\n\n/** The label Slack shows under a datetimepicker; unknown zones fall back to their IANA id. */\nexport function timeZoneLabel(timeZone: string): string {\n return TIME_ZONE_LABELS[timeZone] ?? timeZone;\n}\n\n/** A timestamp's wall-clock date (\"2026-01-01\") and time (\"11:00\") in `timeZone`. */\nexport function wallClock(ts: number, timeZone: string): { date: string; time: string } {\n const parts = new Intl.DateTimeFormat(\"en-US\", {\n timeZone,\n year: \"numeric\",\n month: \"2-digit\",\n day: \"2-digit\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n hourCycle: \"h23\",\n }).formatToParts(new Date(ts * 1000));\n const get = (type: Intl.DateTimeFormatPartTypes) =>\n parts.find((p) => p.type === type)?.value ?? \"00\";\n return {\n date: `${get(\"year\")}-${get(\"month\")}-${get(\"day\")}`,\n time: `${get(\"hour\")}:${get(\"minute\")}`,\n };\n}\n\n/** The timestamp of a wall-clock date and time in `timeZone`. Around a daylight saving change it\n * resolves like JavaScript's `Date`: a time the clocks skip moves forward by the gap, and a time\n * they repeat takes its first occurrence. */\nexport function fromWallClock(date: string, time: string, timeZone: string): number {\n const asUtc = Date.parse(`${date}T${time}:00Z`) / 1000;\n const offsetAt = (ts: number) => {\n const wall = wallClock(ts, timeZone);\n return Date.parse(`${wall.date}T${wall.time}:00Z`) / 1000 - ts;\n };\n // A zone has at most two offsets within a day of any instant: the one before a change and the\n // one after it.\n const before = asUtc - offsetAt(asUtc - 86400);\n const after = asUtc - offsetAt(asUtc + 86400);\n const matches = [before, after].filter((ts) => {\n const wall = wallClock(ts, timeZone);\n return wall.date === date && wall.time === time;\n });\n return matches.length > 0 ? Math.min(...matches) : before;\n}\n","import { createContext, useContext } from \"react\";\n\n/** True while rendering the element of an `input` block, where Slack lays some elements out differently. */\nexport const InputBlockContext = createContext(false);\n\nexport function useInInputBlock(): boolean {\n return useContext(InputBlockContext);\n}\n\n/** The id of the error shown under an `input` block's element, while it has one. */\nexport const InputErrorContext = createContext<string | undefined>(undefined);\n\n/**\n * Props for the element's focusable control: an `input` block with an error marks it invalid,\n * which also gives it Slack's red focus ring, and describes it with the error text.\n */\nexport function useInvalidProps(): { \"aria-invalid\"?: true; \"aria-describedby\"?: string } {\n const errorId = useContext(InputErrorContext);\n return errorId ? { \"aria-invalid\": true, \"aria-describedby\": errorId } : {};\n}\n","import { type ReactNode, type RefObject, useEffect, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { useBlockKit } from \"../context\";\nimport { useClientLayoutEffect } from \"../useClientLayoutEffect\";\n\n/** Space between the anchor and the popover, as in Slack's menus. */\nconst DEFAULT_GAP = 4;\n\nexport interface PopoverProps {\n /** The element the popover opens from; it's placed below it, or above when there's no room. */\n anchorRef: RefObject<HTMLElement | null>;\n /** Called on a press outside both the anchor and the popover. */\n onDismiss: () => void;\n /** Space between the anchor and the popover; Slack's table sort menu sits flush below its header. */\n gap?: number;\n children: ReactNode;\n}\n\n/**\n * The layer a menu or calendar opens in. Slack mounts its popovers at the top of the page, so a\n * message list, a modal body or a carousel never clips them; this portals to `<body>` the same way\n * and keeps the popover pinned to its anchor as the page scrolls or resizes, or its content does.\n * The layer is as wide as the anchor, so a child sized `width: 100%` matches the control it opened\n * from.\n */\nexport function Popover({ anchorRef, onDismiss, gap = DEFAULT_GAP, children }: PopoverProps) {\n const { theme } = useBlockKit();\n const layerRef = useRef<HTMLDivElement>(null);\n const [position, setPosition] = useState<{ top: number; left: number; width: number } | null>(\n null,\n );\n // The latest onDismiss, for the document listener below without re-adding it on every render.\n const dismiss = useRef(onDismiss);\n useClientLayoutEffect(() => {\n dismiss.current = onDismiss;\n });\n\n useClientLayoutEffect(() => {\n function place() {\n const anchor = anchorRef.current;\n const layer = layerRef.current;\n if (!anchor || !layer) return;\n const a = anchor.getBoundingClientRect();\n const height = (layer.firstElementChild as HTMLElement | null)?.offsetHeight ?? 0;\n const below = a.bottom + gap;\n const above = a.top - gap - height;\n const fitsBelow = below + height <= window.innerHeight;\n const fitsAbove = above >= 0;\n let top = !fitsBelow && fitsAbove ? above : below;\n // Taller than the room on either side: keep it on screen rather than past the window's edge.\n if (!fitsBelow && !fitsAbove) {\n top = Math.max(gap, Math.min(below, window.innerHeight - height - gap));\n }\n setPosition({ top, left: a.left, width: a.width });\n }\n place();\n window.addEventListener(\"scroll\", place, true);\n window.addEventListener(\"resize\", place);\n // Its content can change size while open (a select filtering its options), which moves a popover\n // placed above its anchor.\n const content = layerRef.current?.firstElementChild;\n const resize = typeof ResizeObserver === \"undefined\" ? null : new ResizeObserver(place);\n if (content) resize?.observe(content);\n return () => {\n window.removeEventListener(\"scroll\", place, true);\n window.removeEventListener(\"resize\", place);\n resize?.disconnect();\n };\n }, [anchorRef, gap]);\n\n useEffect(() => {\n function onDocDown(e: MouseEvent) {\n const target = e.target as Node;\n if (anchorRef.current?.contains(target) || layerRef.current?.contains(target)) return;\n dismiss.current();\n }\n document.addEventListener(\"mousedown\", onDocDown);\n return () => document.removeEventListener(\"mousedown\", onDocDown);\n }, [anchorRef]);\n\n if (typeof document === \"undefined\") return null;\n return createPortal(\n <div\n ref={layerRef}\n className=\"sbk-root sbk-popover\"\n data-theme={theme}\n style={position ?? { top: 0, left: 0, visibility: \"hidden\" }}\n >\n {children}\n </div>,\n document.body,\n );\n}\n","import type { Datepicker } from \"@slack/types\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { useConfirm } from \"../confirm/useConfirm\";\nimport { useBlockKit } from \"../context\";\nimport { CalendarIcon, ChevronDownIcon } from \"../icons\";\nimport type { ElementProps } from \"../types\";\nimport { Calendar } from \"./calendar/Calendar\";\nimport { ordinal } from \"./dateFormat\";\nimport { useInInputBlock, useInvalidProps } from \"./inputBlockContext\";\nimport { useFocusOnLoad } from \"./useFocusOnLoad\";\nimport { Popover } from \"./Popover\";\n\n/**\n * Formats `YYYY-MM-DD` the way Slack's closed datepicker control shows it: \"04/28/1990\" in an\n * actions block or section accessory, and \"April 28th, 1990\" in an `input` block.\n */\nfunction formatDate(date: string, long: boolean): string {\n const [y = 0, m = 1, d = 1] = date.split(\"-\").map(Number);\n if (long) {\n const month = new Date(Date.UTC(y, m - 1, 1)).toLocaleString(\"en-US\", {\n month: \"long\",\n timeZone: \"UTC\",\n });\n return `${month} ${ordinal(d)}, ${y}`;\n }\n return `${String(m).padStart(2, \"0\")}/${String(d).padStart(2, \"0\")}/${y}`;\n}\n\nexport function DatePicker({ element, blockId }: ElementProps<Datepicker>) {\n const { setValue, dispatch } = useBlockKit();\n const inInputBlock = useInInputBlock();\n const { ask, dialog } = useConfirm(element.confirm);\n const [date, setDate] = useState<string | undefined>(element.initial_date);\n const [open, setOpen] = useState(false);\n const rootRef = useRef<HTMLDivElement>(null);\n const inputRef = useFocusOnLoad<HTMLInputElement>(element);\n const invalid = useInvalidProps();\n // Focus given by `focus_on_load` shouldn't pop the calendar open; a user's focus does.\n const loadFocus = useRef(element.focus_on_load === true);\n const actionId = element.action_id ?? \"\";\n\n useEffect(() => {\n if (date) setValue(blockId, actionId, { type: \"datepicker\", selected_date: date });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n async function pick(next: string) {\n if (!(await ask())) return;\n setDate(next);\n setOpen(false);\n setValue(blockId, actionId, { type: \"datepicker\", selected_date: next });\n dispatch({\n type: \"datepicker\",\n action_id: actionId,\n block_id: blockId,\n selected_date: next,\n // Slack echoes the element's initial_date back in the action, but not its placeholder.\n ...(element.initial_date !== undefined ? { initial_date: element.initial_date } : {}),\n });\n }\n\n async function clear() {\n if (!(await ask())) return;\n setDate(undefined);\n setOpen(false);\n setValue(blockId, actionId, { type: \"datepicker\", selected_date: null });\n dispatch({\n type: \"datepicker\",\n action_id: actionId,\n block_id: blockId,\n selected_date: null,\n ...(element.initial_date !== undefined ? { initial_date: element.initial_date } : {}),\n });\n }\n\n return (\n <div className=\"sbk-datepicker\" ref={rootRef}>\n <div className=\"sbk-datepicker__input_wrap\">\n <CalendarIcon className=\"sbk-datepicker__icon\" />\n <input\n className=\"sbk-datepicker__input\"\n readOnly\n value={date ? formatDate(date, inInputBlock) : \"\"}\n placeholder={element.placeholder?.text ?? \"Select a date\"}\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n {...invalid}\n ref={inputRef}\n onFocus={() => {\n if (loadFocus.current) loadFocus.current = false;\n else setOpen(true);\n }}\n onClick={() => setOpen(true)}\n onKeyDown={(e) => {\n if (e.key === \"Escape\") setOpen(false);\n }}\n />\n <ChevronDownIcon className=\"sbk-datepicker__chevron\" />\n </div>\n {open && (\n <Popover anchorRef={rootRef} onDismiss={() => setOpen(false)}>\n <div className=\"sbk-datepicker__popup\">\n <Calendar value={date} onSelect={pick} onClear={clear} />\n </div>\n </Popover>\n )}\n {dialog}\n </div>\n );\n}\n","import type { DateTimepicker } from \"@slack/types\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { useConfirm } from \"../confirm/useConfirm\";\nimport { useBlockKit } from \"../context\";\nimport { CalendarIcon, ChevronDownIcon, ClockIcon } from \"../icons\";\nimport type { ElementProps } from \"../types\";\nimport { Calendar } from \"./calendar/Calendar\";\nimport { fromWallClock, ordinal, timeZoneLabel, wallClock } from \"./dateFormat\";\nimport { useFocusOnLoad } from \"./useFocusOnLoad\";\nimport { Popover } from \"./Popover\";\n\n/** Slack's Builder splits a datetimepicker's closed control into a date box (\"January 1st,\n * 2026\") and a separate time box (\"11:00 AM\"), rather than one combined string. */\nfunction formatDate(ts: number, timeZone: string): string {\n const d = new Date(ts * 1000);\n const parts = new Intl.DateTimeFormat(\"en-US\", {\n month: \"long\",\n day: \"numeric\",\n year: \"numeric\",\n timeZone,\n }).formatToParts(d);\n const month = parts.find((p) => p.type === \"month\")?.value ?? \"\";\n const day = Number(parts.find((p) => p.type === \"day\")?.value ?? \"1\");\n const year = parts.find((p) => p.type === \"year\")?.value ?? \"\";\n return `${month} ${ordinal(day)}, ${year}`;\n}\n\nfunction formatTime(ts: number, timeZone: string): string {\n return new Date(ts * 1000).toLocaleString(\"en-US\", {\n hour: \"numeric\",\n minute: \"2-digit\",\n timeZone,\n });\n}\n\nexport function DateTimePicker({ element, blockId }: ElementProps<DateTimepicker>) {\n const { setValue, dispatch, timeZone } = useBlockKit();\n const { ask, dialog } = useConfirm(element.confirm);\n const [value, setValueState] = useState<number | undefined>(element.initial_date_time);\n const [open, setOpen] = useState(false);\n const zone = timeZone ?? \"UTC\";\n const initial =\n element.initial_date_time !== undefined\n ? wallClock(element.initial_date_time, zone)\n : undefined;\n const [draftDate, setDraftDate] = useState<string | undefined>(initial?.date);\n const [draftTime, setDraftTime] = useState<string>(initial?.time ?? \"12:00\");\n const rootRef = useRef<HTMLDivElement>(null);\n const focusRef = useFocusOnLoad<HTMLButtonElement>(element);\n const actionId = element.action_id ?? \"\";\n\n useEffect(() => {\n if (value !== undefined) {\n setValue(blockId, actionId, {\n type: \"datetimepicker\",\n selected_date_time: value,\n });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n async function apply() {\n if (!draftDate) return;\n if (!(await ask())) return;\n const ts = fromWallClock(draftDate, draftTime, zone);\n setValueState(ts);\n setOpen(false);\n setValue(blockId, actionId, {\n type: \"datetimepicker\",\n selected_date_time: ts,\n });\n dispatch({\n type: \"datetimepicker\",\n action_id: actionId,\n block_id: blockId,\n selected_date_time: ts,\n });\n }\n\n return (\n <div className=\"sbk-datetimepicker\" ref={rootRef}>\n <div className=\"sbk-datetimepicker__row\">\n <div className=\"sbk-datetimepicker__column\">\n <button\n ref={focusRef}\n type=\"button\"\n className=\"sbk-datetimepicker__control sbk-datetimepicker__control--date\"\n onClick={() => setOpen((o) => !o)}\n >\n <CalendarIcon className=\"sbk-datetimepicker__icon\" />\n <span\n className={\n value !== undefined\n ? \"sbk-datetimepicker__value\"\n : \"sbk-datetimepicker__placeholder\"\n }\n >\n {value !== undefined ? formatDate(value, zone) : \"Select a date\"}\n </span>\n <ChevronDownIcon className=\"sbk-datetimepicker__chevron\" />\n </button>\n </div>\n <div className=\"sbk-datetimepicker__column\">\n <button\n type=\"button\"\n className=\"sbk-datetimepicker__control sbk-datetimepicker__control--time\"\n onClick={() => setOpen((o) => !o)}\n >\n <ClockIcon className=\"sbk-datetimepicker__icon\" />\n <span\n className={\n value !== undefined\n ? \"sbk-datetimepicker__value\"\n : \"sbk-datetimepicker__placeholder\"\n }\n >\n {value !== undefined ? formatTime(value, zone) : \"Select a time\"}\n </span>\n <ChevronDownIcon className=\"sbk-datetimepicker__chevron\" />\n </button>\n <p className=\"sbk-datetimepicker__timezone\">Time zone: {timeZoneLabel(zone)}</p>\n </div>\n </div>\n {open && (\n <Popover anchorRef={rootRef} onDismiss={() => setOpen(false)}>\n <div className=\"sbk-datetimepicker__popup\">\n <Calendar value={draftDate} onSelect={setDraftDate} />\n <div className=\"sbk-datetimepicker__time-row\">\n <input\n type=\"time\"\n className=\"sbk-datetimepicker__time-input\"\n value={draftTime}\n onChange={(e) => setDraftTime(e.target.value)}\n />\n <button\n type=\"button\"\n className=\"sbk-datetimepicker__apply\"\n onClick={apply}\n disabled={!draftDate}\n >\n Apply\n </button>\n </div>\n </div>\n </Popover>\n )}\n {dialog}\n </div>\n );\n}\n","import type { FeedbackButtons as FeedbackButtonsElement } from \"@slack/types\";\nimport { useState } from \"react\";\nimport { useBlockKit } from \"../context\";\nimport { ThumbsDownIcon, ThumbsUpIcon } from \"../icons\";\nimport { Tooltip } from \"../Tooltip\";\nimport type { ElementProps } from \"../types\";\n\n/** Positive/negative feedback buttons, as seen on AI agent messages. Only one of the two can be\n * picked, matching Slack's own toggle behavior. */\nexport function FeedbackButtons({ element, blockId }: ElementProps<FeedbackButtonsElement>) {\n const { setValue, dispatch } = useBlockKit();\n const [picked, setPicked] = useState<\"positive\" | \"negative\" | undefined>();\n const actionId = element.action_id ?? \"\";\n\n function choose(kind: \"positive\" | \"negative\") {\n const next = picked === kind ? undefined : kind;\n setPicked(next);\n const button = kind === \"positive\" ? element.positive_button : element.negative_button;\n setValue(\n blockId,\n actionId,\n next ? { type: \"feedback_buttons\", value: button.value } : undefined,\n );\n dispatch({\n type: \"feedback_buttons\",\n action_id: actionId,\n block_id: blockId,\n value: button.value,\n text: { type: \"plain_text\", text: button.text.text },\n });\n }\n\n return (\n <div className=\"sbk-feedback-buttons\">\n <Tooltip label={element.positive_button.text.text}>\n <button\n type=\"button\"\n className={`sbk-icon-button${picked === \"positive\" ? \" sbk-icon-button--active\" : \"\"}`}\n onClick={() => choose(\"positive\")}\n aria-label={\n element.positive_button.accessibility_label ?? element.positive_button.text.text\n }\n aria-pressed={picked === \"positive\"}\n >\n <ThumbsUpIcon />\n </button>\n </Tooltip>\n <Tooltip label={element.negative_button.text.text}>\n <button\n type=\"button\"\n className={`sbk-icon-button${picked === \"negative\" ? \" sbk-icon-button--active\" : \"\"}`}\n onClick={() => choose(\"negative\")}\n aria-label={\n element.negative_button.accessibility_label ?? element.negative_button.text.text\n }\n aria-pressed={picked === \"negative\"}\n >\n <ThumbsDownIcon />\n </button>\n </Tooltip>\n </div>\n );\n}\n","import type { FileInput as FileInputElement } from \"@slack/types\";\nimport { useId, useState } from \"react\";\nimport { useBlockKit } from \"../context\";\nimport { FileUploadIcon } from \"../icons\";\nimport type { ElementProps } from \"../types\";\n\ninterface PickedFile {\n id: string;\n name: string;\n filetype: string;\n size: number;\n}\n\n/** UI-only: there is no upload backend here, so picking a file just records its metadata in the\n * shape Slack's `files:read`-scoped apps receive, without actually transferring bytes anywhere. */\nexport function FileInput({ element, blockId }: ElementProps<FileInputElement>) {\n const { setValue, dispatch } = useBlockKit();\n const [files, setFiles] = useState<PickedFile[]>([]);\n const inputId = useId();\n const actionId = element.action_id ?? \"\";\n const maxFiles = element.max_files ?? 10;\n\n function onChange(fileList: FileList | null) {\n if (!fileList) return;\n const picked: PickedFile[] = Array.from(fileList)\n .slice(0, maxFiles)\n .map((f, i) => ({\n id: `F${Date.now()}${i}`,\n name: f.name,\n filetype: f.name.split(\".\").pop() ?? \"\",\n size: f.size,\n }));\n setFiles(picked);\n setValue(blockId, actionId, { type: \"file_input\", files: picked });\n dispatch({ type: \"file_input\", action_id: actionId, block_id: blockId, files: picked });\n }\n\n return (\n <div className=\"sbk-file-input\">\n <label className=\"sbk-file-input__button\" htmlFor={inputId}>\n <FileUploadIcon />\n {/* Slack keeps the singular label even when `max_files` allows several. */}\n <span>Upload File</span>\n </label>\n <input\n id={inputId}\n type=\"file\"\n className=\"sbk-file-input__native\"\n multiple={maxFiles > 1}\n accept={element.filetypes?.map((t) => `.${t}`).join(\",\")}\n onChange={(e) => onChange(e.target.files)}\n />\n {files.length > 0 && (\n <ul className=\"sbk-file-input__list\">\n {files.map((f) => (\n <li key={f.id} className=\"sbk-file-input__item\">\n {f.name}\n </li>\n ))}\n </ul>\n )}\n </div>\n );\n}\n","import type { IconButton as IconButtonElement } from \"@slack/types\";\nimport { useConfirm } from \"../confirm/useConfirm\";\nimport { useBlockKit } from \"../context\";\nimport {\n CalendarIcon,\n ChevronDownIcon,\n ClockIcon,\n ExternalLinkIcon,\n KebabIcon,\n TrashIcon,\n WorkflowIcon,\n} from \"../icons\";\nimport { Tooltip } from \"../Tooltip\";\nimport type { ElementProps } from \"../types\";\n\n/** Slack's icon names we can approximate with our inline set; unknown icons fall back to a\n * generic glyph rather than rendering nothing. */\nconst ICONS: Record<string, typeof TrashIcon> = {\n trash: TrashIcon,\n delete: TrashIcon,\n calendar: CalendarIcon,\n clock: ClockIcon,\n time: ClockIcon,\n \"external-link\": ExternalLinkIcon,\n link: ExternalLinkIcon,\n workflow: WorkflowIcon,\n more: KebabIcon,\n \"chevron-down\": ChevronDownIcon,\n};\n\nexport function IconButton({ element, blockId }: ElementProps<IconButtonElement>) {\n const { dispatch } = useBlockKit();\n const { ask, dialog } = useConfirm(element.confirm);\n const Icon = ICONS[element.icon] ?? KebabIcon;\n\n async function onClick() {\n if (!(await ask())) return;\n dispatch({\n type: \"icon_button\",\n action_id: element.action_id ?? \"\",\n block_id: blockId,\n ...(element.value !== undefined ? { value: element.value } : {}),\n });\n }\n\n return (\n <>\n <Tooltip label={element.text.text}>\n <button\n type=\"button\"\n className=\"sbk-icon-button\"\n onClick={onClick}\n aria-label={element.accessibility_label ?? element.text.text}\n >\n <Icon />\n </button>\n </Tooltip>\n {dialog}\n </>\n );\n}\n","import type { ImageElement as ImageElementType } from \"@slack/types\";\nimport type { ElementProps } from \"../types\";\n\nexport function ImageElement({ element }: ElementProps<ImageElementType>) {\n return (\n <img\n className=\"sbk-image-element\"\n src={\"image_url\" in element ? element.image_url : undefined}\n alt={element.alt_text}\n />\n );\n}\n","import { type KeyboardEvent, type RefObject, useEffect, useState } from \"react\";\n\n/**\n * Slack's menus and option lists keep one \"active\" row that follows both the pointer and the\n * arrow keys (`c-menu_item--highlighted` / `c-select_options_list__option--active`), so hover and\n * keyboard highlight share one style. Returns the active index plus handlers for the list.\n */\nexport function useMenuNavigation({\n open,\n count,\n initialIndex = -1,\n onChoose,\n onClose,\n onOpen,\n listRef,\n}: {\n open: boolean;\n count: number;\n initialIndex?: number;\n onChoose: (index: number) => void;\n onClose: () => void;\n /** Called when an arrow key is pressed on the closed trigger. */\n onOpen?: () => void;\n /** The scrolling list; the active row is kept in view as the keyboard moves it. */\n listRef?: RefObject<HTMLElement | null>;\n}) {\n const [active, setActive] = useState(-1);\n\n useEffect(() => {\n setActive(open ? initialIndex : -1);\n // Only reset when the menu opens or closes.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open]);\n\n useEffect(() => {\n if (active >= count) setActive(count - 1);\n }, [active, count]);\n\n useEffect(() => {\n const row = listRef?.current?.querySelector<HTMLElement>(\"[data-active]\");\n row?.scrollIntoView?.({ block: \"nearest\" });\n }, [active, listRef]);\n\n function onKeyDown(e: KeyboardEvent) {\n if (!open) {\n if (e.key === \"ArrowDown\" || e.key === \"ArrowUp\") {\n e.preventDefault();\n onOpen?.();\n }\n return;\n }\n switch (e.key) {\n case \"ArrowDown\":\n e.preventDefault();\n setActive((i) => (count === 0 ? -1 : (i + 1) % count));\n break;\n case \"ArrowUp\":\n e.preventDefault();\n setActive((i) => (count === 0 ? -1 : i <= 0 ? count - 1 : i - 1));\n break;\n case \"Home\":\n e.preventDefault();\n setActive(count > 0 ? 0 : -1);\n break;\n case \"End\":\n e.preventDefault();\n setActive(count - 1);\n break;\n case \"Enter\":\n if (active >= 0 && active < count) {\n e.preventDefault();\n onChoose(active);\n }\n break;\n case \"Escape\":\n e.preventDefault();\n onClose();\n break;\n }\n }\n\n /** Props for the row at `index`: pointer movement moves the highlight, like Slack's lists. */\n function itemProps(index: number) {\n return {\n onMouseEnter: () => setActive(index),\n onMouseMove: () => {\n if (active !== index) setActive(index);\n },\n \"data-active\": active === index || undefined,\n };\n }\n\n return { active, setActive, onKeyDown, itemProps };\n}\n","import type { Overflow as OverflowElement, PlainTextOption } from \"@slack/types\";\nimport { useRef, useState } from \"react\";\nimport { useConfirm } from \"../confirm/useConfirm\";\nimport { useBlockKit } from \"../context\";\nimport { KebabIcon } from \"../icons\";\nimport type { ElementProps } from \"../types\";\nimport { useMenuNavigation } from \"./useMenuNavigation\";\nimport { Popover } from \"./Popover\";\n\nexport function Overflow({ element, blockId }: ElementProps<OverflowElement>) {\n const { dispatch } = useBlockKit();\n const { ask, dialog } = useConfirm(element.confirm);\n const [open, setOpen] = useState(false);\n const rootRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const listRef = useRef<HTMLDivElement>(null);\n const actionId = element.action_id ?? \"\";\n\n async function choose(option: PlainTextOption) {\n if (!(await ask())) return;\n setOpen(false);\n dispatch({\n type: \"overflow\",\n action_id: actionId,\n block_id: blockId,\n selected_option: option,\n });\n if (option.url) window.open(option.url, \"_blank\", \"noopener,noreferrer\");\n }\n\n const nav = useMenuNavigation({\n open,\n count: element.options.length,\n onChoose: (i) => {\n const option = element.options[i];\n if (option) choose(option);\n },\n onClose: () => {\n setOpen(false);\n triggerRef.current?.focus();\n },\n onOpen: () => setOpen(true),\n listRef,\n });\n\n return (\n <div className=\"sbk-overflow\" ref={rootRef} onKeyDown={nav.onKeyDown}>\n <button\n ref={triggerRef}\n type=\"button\"\n className=\"sbk-overflow__button\"\n onClick={() => setOpen((o) => !o)}\n aria-haspopup=\"menu\"\n aria-expanded={open}\n aria-label=\"More options\"\n >\n <KebabIcon />\n </button>\n {open && (\n <Popover anchorRef={rootRef} onDismiss={() => setOpen(false)}>\n <div className=\"sbk-overflow__menu\" role=\"menu\" ref={listRef}>\n {element.options.map((option, i) => (\n <div\n key={option.value ?? i}\n role=\"menuitem\"\n className=\"sbk-overflow__option\"\n onClick={() => choose(option)}\n {...nav.itemProps(i)}\n >\n {option.text.text}\n </div>\n ))}\n </div>\n </Popover>\n )}\n {dialog}\n </div>\n );\n}\n","import type { Option, RadioButtons as RadioButtonsElement } from \"@slack/types\";\nimport { useEffect, useState } from \"react\";\nimport { useConfirm } from \"../confirm/useConfirm\";\nimport { useBlockKit } from \"../context\";\nimport { Text } from \"../Text\";\nimport type { ElementProps } from \"../types\";\nimport { useFocusOnLoad } from \"./useFocusOnLoad\";\n\nexport function RadioButtons({ element, blockId }: ElementProps<RadioButtonsElement>) {\n const { setValue, dispatch } = useBlockKit();\n const { ask, dialog } = useConfirm(element.confirm);\n const [selected, setSelected] = useState<Option | undefined>(element.initial_option);\n const actionId = element.action_id ?? \"\";\n const focusRef = useFocusOnLoad<HTMLInputElement>(element);\n\n useEffect(() => {\n if (selected) setValue(blockId, actionId, { type: \"radio_buttons\", selected_option: selected });\n // Only on mount: report the initial value, exactly like Slack does when the surface loads.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const select = async (option: Option) => {\n if (option.value === selected?.value) return;\n if (!(await ask())) return;\n setSelected(option);\n setValue(blockId, actionId, { type: \"radio_buttons\", selected_option: option });\n dispatch({\n type: \"radio_buttons\",\n action_id: actionId,\n block_id: blockId,\n selected_option: option,\n });\n };\n\n return (\n <div className=\"sbk-radio-buttons\" role=\"radiogroup\">\n {element.options.map((option, i) => (\n <label className=\"sbk-radio-buttons__option\" key={option.value ?? i}>\n <input\n ref={i === 0 ? focusRef : undefined}\n type=\"radio\"\n className=\"sbk-radio-buttons__input\"\n name={`${blockId}-${actionId}`}\n checked={option.value === selected?.value}\n onChange={() => select(option)}\n />\n <span className=\"sbk-radio-buttons__body\">\n <span className=\"sbk-radio-buttons__text\">\n <Text text={option.text} />\n </span>\n {option.description && (\n <span className=\"sbk-radio-buttons__description\">\n <Text text={option.description} />\n </span>\n )}\n </span>\n </label>\n ))}\n {dialog}\n </div>\n );\n}\n","import { Fragment } from \"react\";\n\n/** Slack's formatting toolbar glyphs (20×20), grouped as the separators split them. */\nconst FORMATTING_GROUPS: { label: string; evenOdd: boolean; d: string }[][] = [\n [\n {\n label: \"Bold\",\n evenOdd: true,\n d: \"M4 2.75A.75.75 0 0 1 4.75 2h6.343a3.91 3.91 0 0 1 3.88 3.449A2 2 0 0 1 15 5.84l.001.067a3.9 3.9 0 0 1-1.551 3.118A4.627 4.627 0 0 1 11.875 18H4.75a.75.75 0 0 1-.75-.75V9.5a.8.8 0 0 1 .032-.218A.8.8 0 0 1 4 9.065zm2.5 5.565h3.593a2.157 2.157 0 1 0 0-4.315H6.5zm4.25 1.935H6.5v5.5h4.25a2.75 2.75 0 1 0 0-5.5\",\n },\n {\n label: \"Italic\",\n evenOdd: true,\n d: \"M7 2.75A.75.75 0 0 1 7.75 2h7.5a.75.75 0 0 1 0 1.5H12.3l-2.6 13h2.55a.75.75 0 0 1 0 1.5h-7.5a.75.75 0 0 1 0-1.5H7.7l2.6-13H7.75A.75.75 0 0 1 7 2.75\",\n },\n {\n label: \"Underline\",\n evenOdd: false,\n d: \"M17.25 17.12a.75.75 0 0 1 0 1.5H2.75a.75.75 0 0 1 0-1.5zM14.5 1.63a.75.75 0 0 1 .75.75v8a5.25 5.25 0 1 1-10.5 0v-8a.75.75 0 0 1 1.5 0v8a3.75 3.75 0 0 0 7.5 0v-8a.75.75 0 0 1 .75-.75\",\n },\n {\n label: \"Strikethrough\",\n evenOdd: true,\n d: \"M11.721 3.84c-.91-.334-2.028-.36-3.035-.114-1.51.407-2.379 1.861-2.164 3.15C6.718 8.051 7.939 9.5 11.5 9.5l.027.001h5.723a.75.75 0 0 1 0 1.5H2.75a.75.75 0 0 1 0-1.5h3.66c-.76-.649-1.216-1.468-1.368-2.377-.347-2.084 1.033-4.253 3.265-4.848l.007-.002.007-.002c1.252-.307 2.68-.292 3.915.16 1.252.457 2.337 1.381 2.738 2.874a.75.75 0 0 1-1.448.39c-.25-.925-.91-1.528-1.805-1.856m2.968 9.114a.75.75 0 1 0-1.378.59c.273.64.186 1.205-.13 1.674-.333.492-.958.925-1.82 1.137-.989.243-1.991.165-3.029-.124-.93-.26-1.613-.935-1.858-1.845a.75.75 0 0 0-1.448.39c.388 1.441 1.483 2.503 2.903 2.9 1.213.338 2.486.456 3.79.135 1.14-.28 2.12-.889 2.704-1.753.6-.888.743-1.992.266-3.104\",\n },\n ],\n [\n {\n label: \"Link\",\n evenOdd: true,\n d: \"M12.306 3.756a2.75 2.75 0 0 1 3.889 0l.05.05a2.75 2.75 0 0 1 0 3.889l-3.18 3.18a2.75 2.75 0 0 1-3.98-.095l-.03-.034a.75.75 0 0 0-1.11 1.009l.03.034a4.25 4.25 0 0 0 6.15.146l3.18-3.18a4.25 4.25 0 0 0 0-6.01l-.05-.05a4.25 4.25 0 0 0-6.01 0L9.47 4.47a.75.75 0 1 0 1.06 1.06zm-4.611 12.49a2.75 2.75 0 0 1-3.89 0l-.05-.051a2.75 2.75 0 0 1 0-3.89l3.18-3.179a2.75 2.75 0 0 1 3.98.095l.03.034a.75.75 0 1 0 1.11-1.01l-.03-.033a4.25 4.25 0 0 0-6.15-.146l-3.18 3.18a4.25 4.25 0 0 0 0 6.01l.05.05a4.25 4.25 0 0 0 6.01 0l1.775-1.775a.75.75 0 0 0-1.06-1.06z\",\n },\n {\n label: \"Ordered list\",\n evenOdd: true,\n d: \"M3.792 2.094A.5.5 0 0 1 4 2.5V6h1a.5.5 0 1 1 0 1H2a.5.5 0 1 1 0-1h1V3.194l-.842.28a.5.5 0 0 1-.316-.948l1.5-.5a.5.5 0 0 1 .45.068M7.75 3.5a.75.75 0 0 0 0 1.5h10a.75.75 0 0 0 0-1.5zM7 10.75a.75.75 0 0 1 .75-.75h10a.75.75 0 0 1 0 1.5h-10a.75.75 0 0 1-.75-.75m0 6.5a.75.75 0 0 1 .75-.75h10a.75.75 0 0 1 0 1.5h-10a.75.75 0 0 1-.75-.75m-4.293-3.36a1 1 0 0 1 .793-.39c.49 0 .75.38.75.75 0 .064-.033.194-.173.409a5 5 0 0 1-.594.711c-.256.267-.552.548-.87.848l-.088.084a42 42 0 0 0-.879.845A.5.5 0 0 0 2 18h3a.5.5 0 0 0 0-1H3.242l.058-.055c.316-.298.629-.595.904-.882a6 6 0 0 0 .711-.859c.18-.277.335-.604.335-.954 0-.787-.582-1.75-1.75-1.75a2 2 0 0 0-1.81 1.147.5.5 0 1 0 .905.427 1 1 0 0 1 .112-.184\",\n },\n {\n label: \"Bulleted list\",\n evenOdd: true,\n d: \"M4 3a1 1 0 1 1-2 0 1 1 0 0 1 2 0m3 0a.75.75 0 0 1 .75-.75h10a.75.75 0 0 1 0 1.5h-10A.75.75 0 0 1 7 3m.75 6.25a.75.75 0 0 0 0 1.5h10a.75.75 0 0 0 0-1.5zm0 7a.75.75 0 0 0 0 1.5h10a.75.75 0 0 0 0-1.5zM3 11a1 1 0 1 0 0-2 1 1 0 0 0 0 2m0 7a1 1 0 1 0 0-2 1 1 0 0 0 0 2\",\n },\n ],\n [\n {\n label: \"Blockquote\",\n evenOdd: true,\n d: \"M3.5 2.75a.75.75 0 0 0-1.5 0v14.5a.75.75 0 0 0 1.5 0zM6.75 3a.75.75 0 0 0 0 1.5h8.5a.75.75 0 0 0 0-1.5zM6 10.25a.75.75 0 0 1 .75-.75h10.5a.75.75 0 0 1 0 1.5H6.75a.75.75 0 0 1-.75-.75m.75 5.25a.75.75 0 0 0 0 1.5h7.5a.75.75 0 0 0 0-1.5z\",\n },\n {\n label: \"Code\",\n evenOdd: true,\n d: \"M12.058 3.212c.396.12.62.54.5.936L8.87 16.29a.75.75 0 1 1-1.435-.436l3.686-12.143a.75.75 0 0 1 .936-.5M5.472 6.24a.75.75 0 0 1 .005 1.06l-2.67 2.693 2.67 2.691a.75.75 0 1 1-1.065 1.057l-3.194-3.22a.75.75 0 0 1 0-1.056l3.194-3.22a.75.75 0 0 1 1.06-.005m9.044 1.06a.75.75 0 1 1 1.065-1.056l3.194 3.221a.75.75 0 0 1 0 1.057l-3.194 3.219a.75.75 0 0 1-1.065-1.057l2.67-2.69z\",\n },\n {\n label: \"Code block\",\n evenOdd: true,\n d: \"M9.212 2.737a.75.75 0 1 0-1.424-.474l-2.5 7.5a.75.75 0 0 0 1.424.474zm6.038.265a.75.75 0 0 0 0 1.5h2a.25.25 0 0 1 .25.25v11.5a.25.25 0 0 1-.25.25h-13a.25.25 0 0 1-.25-.25v-3.5a.75.75 0 0 0-1.5 0v3.5c0 .966.784 1.75 1.75 1.75h13a1.75 1.75 0 0 0 1.75-1.75v-11.5a1.75 1.75 0 0 0-1.75-1.75zm-3.69.5a.75.75 0 1 0-1.12.996l1.556 1.754-1.556 1.75a.75.75 0 1 0 1.12.997l2-2.249a.75.75 0 0 0 0-.996zM3.999 9.061a.75.75 0 0 1-1.058-.062l-2-2.249a.75.75 0 0 1 0-.996l2-2.252a.75.75 0 1 1 1.12.996L2.504 6.252l1.557 1.75a.75.75 0 0 1-.062 1.059\",\n },\n ],\n];\n\n/** The formatting bar Slack shows above a modal's rich-text editor. The editor here is plain text,\n * so its buttons are there to look like Slack's but marked unavailable; they dim until the editor\n * has focus, as Slack's do. */\nexport function RichTextToolbar() {\n return (\n <div\n className=\"sbk-rich-text-input__toolbar\"\n role=\"toolbar\"\n aria-orientation=\"horizontal\"\n aria-label=\"Formatting\"\n >\n {FORMATTING_GROUPS.map((group, i) => (\n <Fragment key={group[0]?.label}>\n {i > 0 && <span className=\"sbk-rich-text-input__separator\" />}\n {group.map((icon) => (\n <button\n key={icon.label}\n type=\"button\"\n className=\"sbk-rich-text-input__tool\"\n aria-label={icon.label}\n aria-disabled=\"true\"\n tabIndex={-1}\n >\n <svg viewBox=\"0 0 20 20\" width=\"18\" height=\"18\" aria-hidden=\"true\">\n <path\n fill=\"currentColor\"\n fillRule={icon.evenOdd ? \"evenodd\" : undefined}\n clipRule={icon.evenOdd ? \"evenodd\" : undefined}\n d={icon.d}\n />\n </svg>\n </button>\n ))}\n </Fragment>\n ))}\n </div>\n );\n}\n\n/** Slack's \"Aa\" (show formatting) and emoji glyphs, 20-unit paths as Slack ships them. */\nconst FORMATTING_ICON =\n \"M6.941 3.952c-.459-1.378-2.414-1.363-2.853.022l-4.053 12.8a.75.75 0 0 0 1.43.452l1.101-3.476h6.06l1.163 3.487a.75.75 0 1 0 1.423-.474zm1.185 8.298L5.518 4.427 3.041 12.25zm6.198-5.537a4.74 4.74 0 0 1 3.037-.081A3.74 3.74 0 0 1 20 10.208V17a.75.75 0 0 1-1.5 0v-.745a8 8 0 0 1-2.847 1.355 3 3 0 0 1-3.15-1.143C10.848 14.192 12.473 11 15.287 11H18.5v-.792c0-.984-.641-1.853-1.581-2.143a3.24 3.24 0 0 0-2.077.056l-.242.089a2.22 2.22 0 0 0-1.34 1.382l-.048.145a.75.75 0 0 1-1.423-.474l.048-.145a3.72 3.72 0 0 1 2.244-2.315zM18.5 12.5h-3.213c-1.587 0-2.504 1.801-1.57 3.085.357.491.98.717 1.572.57a6.5 6.5 0 0 0 2.47-1.223l.741-.593z\";\nconst EMOJI_ICON =\n \"M2.5 10a7.5 7.5 0 1 1 15 0 7.5 7.5 0 0 1-15 0M10 1a9 9 0 1 0 0 18 9 9 0 0 0 0-18M7.5 9.5a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3M14 8a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0m-6.385 3.766a.75.75 0 1 0-1.425.468C6.796 14.08 8.428 15 10.027 15s3.23-.92 3.838-2.766a.75.75 0 1 0-1.425-.468c-.38 1.155-1.38 1.734-2.413 1.734s-2.032-.58-2.412-1.734\";\n\nfunction Glyph({ d }: { d: string }) {\n return (\n <svg viewBox=\"0 0 20 20\" width=\"18\" height=\"18\" aria-hidden=\"true\">\n <path fill=\"currentColor\" fillRule=\"evenodd\" clipRule=\"evenodd\" d={d} />\n </svg>\n );\n}\n\n/** The row Slack draws under the editor: \"Aa\" shows or hides the formatting bar (underlined while\n * it's shown), and an emoji button, unavailable until block-kit has an emoji picker. */\nexport function RichTextComposerActions({\n formatting,\n onToggleFormatting,\n}: {\n formatting: boolean;\n onToggleFormatting: () => void;\n}) {\n return (\n <div\n className=\"sbk-rich-text-input__footer\"\n role=\"toolbar\"\n aria-orientation=\"horizontal\"\n aria-label=\"Composer actions\"\n >\n <button\n type=\"button\"\n className=\"sbk-rich-text-input__action sbk-rich-text-input__action--formatting\"\n aria-label=\"Show formatting\"\n aria-pressed={formatting}\n onClick={onToggleFormatting}\n >\n <Glyph d={FORMATTING_ICON} />\n </button>\n <button\n type=\"button\"\n className=\"sbk-rich-text-input__action\"\n aria-label=\"Emoji\"\n aria-disabled=\"true\"\n tabIndex={-1}\n >\n <Glyph d={EMOJI_ICON} />\n </button>\n </div>\n );\n}\n","import type { RichTextBlock, RichTextInput as RichTextInputElement } from \"@slack/types\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { useBlockKit } from \"../context\";\nimport type { ElementProps } from \"../types\";\nimport { RichTextComposerActions, RichTextToolbar } from \"./RichTextToolbar\";\nimport { useFocusOnLoad } from \"./useFocusOnLoad\";\nimport { useInvalidProps } from \"./inputBlockContext\";\n\n/** Wraps plain text into the `rich_text` block shape Slack uses for this element's value. The\n * editor is plain text; Slack's formatting bar and composer row are drawn around it for parity. */\nfunction toRichText(text: string): RichTextBlock {\n return {\n type: \"rich_text\",\n elements: [\n {\n type: \"rich_text_section\",\n elements: text ? [{ type: \"text\", text }] : [],\n },\n ],\n };\n}\n\nfunction fromRichText(value: RichTextBlock | undefined): string {\n if (!value) return \"\";\n return (value.elements as unknown[])\n .flatMap((section) => {\n const node = section as { elements?: unknown[] };\n return node.elements ?? [];\n })\n .map((el: unknown) => {\n const node = el as { text?: unknown };\n return typeof node.text === \"string\" ? node.text : \"\";\n })\n .join(\"\");\n}\n\nexport function RichTextInput({ element, blockId }: ElementProps<RichTextInputElement>) {\n const { setValue, dispatch } = useBlockKit();\n const ref = useRef<HTMLDivElement>(null);\n useFocusOnLoad(element, ref);\n const invalid = useInvalidProps();\n const actionId = element.action_id ?? \"\";\n const initialText = fromRichText(element.initial_value);\n const [formatting, setFormatting] = useState(true);\n const [empty, setEmpty] = useState(initialText === \"\");\n\n useEffect(() => {\n if (element.initial_value) {\n setValue(blockId, actionId, {\n type: \"rich_text_input\",\n rich_text_value: element.initial_value,\n });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n function onInput() {\n const text = ref.current?.innerText ?? \"\";\n setEmpty(text.trim() === \"\");\n const richText = toRichText(text);\n setValue(blockId, actionId, { type: \"rich_text_input\", rich_text_value: richText });\n dispatch({\n type: \"rich_text_input\",\n action_id: actionId,\n block_id: blockId,\n rich_text_value: richText,\n });\n }\n\n const placeholder = element.placeholder?.text;\n return (\n <div className=\"sbk-rich-text-input\">\n {formatting && <RichTextToolbar />}\n <div className=\"sbk-rich-text-input__body\">\n <div\n ref={ref}\n className=\"sbk-rich-text-input__editor\"\n contentEditable\n suppressContentEditableWarning\n role=\"textbox\"\n aria-multiline=\"true\"\n {...invalid}\n aria-label={placeholder ?? actionId}\n onInput={onInput}\n style={{\n minHeight: element.min_lines ? `${element.min_lines * 22}px` : undefined,\n maxHeight: element.max_lines ? `${element.max_lines * 22}px` : undefined,\n }}\n >\n {initialText}\n </div>\n {/* A real element, as Slack's `ql-placeholder` is, so it's text on the page. */}\n {placeholder && empty && (\n <div className=\"sbk-rich-text-input__placeholder\" aria-hidden=\"true\">\n {placeholder}\n </div>\n )}\n </div>\n <RichTextComposerActions\n formatting={formatting}\n onToggleFormatting={() => setFormatting((shown) => !shown)}\n />\n </div>\n );\n}\n","import type { OptionGroup, PlainTextOption } from \"@slack/types\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { useConfirm } from \"../confirm/useConfirm\";\nimport { useBlockKit } from \"../context\";\nimport { ChannelHashIcon, ChevronDownIcon, CloseIcon, LockIcon, SearchIcon } from \"../icons\";\nimport type { OptionsResponse } from \"../payloads\";\nimport { Text } from \"../Text\";\nimport type { ElementProps, Json } from \"../types\";\nimport { useFocusOnLoad } from \"./useFocusOnLoad\";\nimport { useInvalidProps } from \"./inputBlockContext\";\nimport { useMenuNavigation } from \"./useMenuNavigation\";\nimport { Popover } from \"./Popover\";\n\n/**\n * One component renders every `*_select` element. The 5 data sources (static, external, users,\n * conversations, channels) and their `multi_` variants differ only in: what the closed control\n * shows, what the open menu offers, and the field names Slack uses in `state.values` /\n * `block_actions` (`selected_option(s)`, `selected_user(s)`, `selected_conversation(s)`,\n * `selected_channel(s)`).\n */\n\ntype Source = \"static\" | \"external\" | \"users\" | \"conversations\" | \"channels\";\n\nexport interface SelectElement extends Json {\n type: string;\n action_id?: string;\n placeholder?: { type: \"plain_text\"; text: string };\n options?: PlainTextOption[];\n option_groups?: OptionGroup[];\n min_query_length?: number;\n max_selected_items?: number;\n filter?: {\n include?: string[];\n exclude_external_shared_channels?: boolean;\n exclude_bot_users?: boolean;\n };\n default_to_current_conversation?: boolean;\n confirm?: import(\"@slack/types\").ConfirmationDialog;\n initial_option?: PlainTextOption;\n initial_options?: PlainTextOption[];\n initial_user?: string;\n initial_users?: string[];\n initial_conversation?: string;\n initial_conversations?: string[];\n initial_channel?: string;\n initial_channels?: string[];\n}\n\nfunction parseType(type: string): { source: Source; multi: boolean } {\n const multi = type.startsWith(\"multi_\");\n const base = multi ? type.slice(\"multi_\".length) : type;\n const source = base.replace(\"_select\", \"\") as Source;\n return { source, multi };\n}\n\n/** A selection, normalized to `{id, label}` regardless of data source. For static/external\n * selects `id` is the option's `value` and the full option is kept for the payload. */\ninterface Item {\n id: string;\n label: string;\n option?: PlainTextOption;\n}\n\nfunction optionToItem(option: PlainTextOption): Item {\n return { id: option.value ?? option.text.text, label: option.text.text, option };\n}\n\n/** Slack's field name for one selected item, by source and singular/plural. */\nfunction fieldName(source: Source, plural: boolean): string {\n const names: Record<Source, [string, string]> = {\n static: [\"selected_option\", \"selected_options\"],\n external: [\"selected_option\", \"selected_options\"],\n users: [\"selected_user\", \"selected_users\"],\n conversations: [\"selected_conversation\", \"selected_conversations\"],\n channels: [\"selected_channel\", \"selected_channels\"],\n };\n return names[source][plural ? 1 : 0];\n}\n\nfunction itemToPayload(source: Source, item: Item): unknown {\n return source === \"static\" || source === \"external\" ? item.option : item.id;\n}\n\nfunction initialItems(element: SelectElement, source: Source, multi: boolean): Item[] {\n if (source === \"static\" || source === \"external\") {\n const options = multi\n ? element.initial_options\n : element.initial_option && [element.initial_option];\n return (options ?? []).map(optionToItem);\n }\n const key = { users: \"user\", conversations: \"conversation\", channels: \"channel\" }[source];\n const single = element[`initial_${key}` as keyof SelectElement] as string | undefined;\n const many = element[`initial_${key}s` as keyof SelectElement] as string[] | undefined;\n const ids = multi ? (many ?? []) : single ? [single] : [];\n // Leave `label` empty for directory-backed sources (users/conversations/channels) — there's no\n // label to show until it's resolved. Every read site falls back to `resolveLabel(id)` when\n // `label` is falsy; storing `id` here instead would short-circuit that fallback and always show\n // the raw id even when a resolver is configured.\n return ids.map((id) => ({ id, label: \"\" }));\n}\n\nfunction allOptions(element: SelectElement): PlainTextOption[] {\n if (element.options) return element.options;\n return (element.option_groups ?? []).flatMap((g) => g.options as PlainTextOption[]);\n}\n\ntype OptionGroupView = { label?: string; options: PlainTextOption[] };\n\nfunction responseGroups(response: OptionsResponse | undefined): OptionGroupView[] {\n if (!response) return [];\n if (\"option_groups\" in response) {\n return response.option_groups.map((group) => ({\n label: group.label.text,\n options: group.options as PlainTextOption[],\n }));\n }\n return [{ options: response.options as PlainTextOption[] }];\n}\n\n/** Slack's default `min_query_length` for an `external_select`. */\nconst DEFAULT_MIN_QUERY_LENGTH = 3;\n/** How long typing must pause before an `external_select` asks the app for options. */\nconst SUGGESTION_DEBOUNCE_MS = 250;\n\nexport function Select({ element, blockId }: ElementProps<SelectElement>) {\n const { setValue, dispatch, resolvers, surface, loadOptions } = useBlockKit();\n // Slack's Builder uses a taller \"medium\" control (36px) for a modal/Home tab surface than the\n // message-surface preview's 28px \"small\" control (independent of the multi-select bump below).\n const sizeClass = surface === \"message\" ? \"\" : \" sbk-select--medium\";\n const { ask, dialog } = useConfirm(element.confirm);\n const { source, multi } = parseType(element.type);\n const actionId = element.action_id ?? \"\";\n\n const [items, setItems] = useState<Item[]>(() => initialItems(element, source, multi));\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState(\"\");\n const rootRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n useFocusOnLoad(element as { focus_on_load?: boolean }, triggerRef);\n const invalid = useInvalidProps();\n const listRef = useRef<HTMLDivElement>(null);\n\n // An `external_select` with an `onOptions` handler asks the app for options (a\n // `block_suggestion` request) once the query reaches `min_query_length`, as Slack does.\n const remote = source === \"external\" && loadOptions !== undefined;\n const minQueryLength = element.min_query_length ?? DEFAULT_MIN_QUERY_LENGTH;\n const [remoteGroups, setRemoteGroups] = useState<OptionGroupView[] | undefined>();\n const [loading, setLoading] = useState(false);\n\n useEffect(() => {\n if (!open || !remote || !loadOptions) return;\n if (query.length < minQueryLength) {\n setRemoteGroups(undefined);\n setLoading(false);\n return;\n }\n let cancelled = false;\n setLoading(true);\n const timer = setTimeout(\n async () => {\n try {\n const response = await loadOptions(actionId, blockId, query);\n if (!cancelled) setRemoteGroups(responseGroups(response));\n } catch {\n if (!cancelled) setRemoteGroups([]);\n } finally {\n if (!cancelled) setLoading(false);\n }\n },\n query ? SUGGESTION_DEBOUNCE_MS : 0,\n );\n return () => {\n cancelled = true;\n clearTimeout(timer);\n };\n }, [open, remote, loadOptions, query, minQueryLength, actionId, blockId]);\n\n const resolveLabel = (id: string): string => {\n const resolver =\n source === \"users\"\n ? resolvers.user\n : source === \"channels\" || source === \"conversations\"\n ? resolvers.channel\n : undefined;\n return resolver?.(id) ?? id;\n };\n\n /** Slack's own Builder preview can't resolve a fabricated id against the real directory, and\n * never shows the raw id: a channel becomes a \"Private channel\" pill, a user stays a loading\n * skeleton, and a conversation stays blank. */\n const isUnresolved = ({ id, label }: { id: string; label?: string }) =>\n !label &&\n (source === \"users\" || source === \"channels\" || source === \"conversations\") &&\n resolveLabel(id) === id;\n\n const privateChannel = (className: string) => (\n <span className={className}>\n <ChannelHashIcon className=\"sbk-select__channel-hash\" />\n <span className=\"sbk-select__entity-text\">\n <span className=\"sbk-select__missing-channel\">\n <LockIcon />\n Private channel\n </span>\n </span>\n </span>\n );\n\n const unresolvedValue = (id: string) =>\n source === \"channels\" ? (\n privateChannel(\"sbk-select__value sbk-select__entity\")\n ) : source === \"users\" ? (\n <span className=\"sbk-select__value sbk-select__skeleton\" aria-label={id}>\n <span className=\"sbk-select__skeleton-avatar\" />\n <span className=\"sbk-select__skeleton-name\" />\n </span>\n ) : (\n <span className=\"sbk-select__value\" aria-label={id} />\n );\n\n useEffect(() => {\n if (items.length > 0) {\n setValue(blockId, actionId, buildState());\n }\n // Only on mount: report the initial value, exactly like Slack does when the surface loads.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n function buildState() {\n const field = fieldName(source, multi);\n const first = items[0];\n const value = multi\n ? items.map((i) => itemToPayload(source, i))\n : first\n ? itemToPayload(source, first)\n : undefined;\n return { type: element.type, [field]: value };\n }\n\n async function commit(next: Item[]) {\n setItems(next);\n const fields = buildStateFor(next);\n setValue(blockId, actionId, { type: element.type, ...fields });\n dispatch({\n type: element.type,\n action_id: actionId,\n block_id: blockId,\n ...fields,\n // Slack echoes a select's placeholder back in the action.\n ...(element.placeholder ? { placeholder: element.placeholder } : {}),\n });\n }\n\n function buildStateFor(next: Item[]) {\n const field = fieldName(source, multi);\n const first = next[0];\n const value = multi\n ? next.map((i) => itemToPayload(source, i))\n : first\n ? itemToPayload(source, first)\n : undefined;\n return { [field]: value };\n }\n\n async function selectItem(item: Item) {\n if (!(await ask())) return;\n if (multi) {\n if (items.some((i) => i.id === item.id)) return;\n if (element.max_selected_items && items.length >= element.max_selected_items) return;\n await commit([...items, item]);\n setQuery(\"\");\n } else {\n await commit([item]);\n setOpen(false);\n setQuery(\"\");\n }\n }\n\n async function removeItem(id: string) {\n await commit(items.filter((i) => i.id !== id));\n }\n\n const filteredOptions =\n source === \"static\"\n ? allOptions(element).filter((o) => o.text.text.toLowerCase().includes(query.toLowerCase()))\n : [];\n\n // Visible static options, grouped as rendered, plus a flat list for keyboard navigation.\n const matches = (o: PlainTextOption) => o.text.text.toLowerCase().includes(query.toLowerCase());\n const visibleGroups: OptionGroupView[] = remote\n ? (remoteGroups ?? [])\n : source !== \"static\"\n ? []\n : element.option_groups\n ? element.option_groups.map((group) => ({\n label: group.label.text,\n options: (group.options as PlainTextOption[]).filter(matches),\n }))\n : [{ options: filteredOptions }];\n const flatOptions = visibleGroups.flatMap((g) => g.options);\n const isSelected = (option: PlainTextOption) =>\n items.some((i) => i.id === (option.value ?? option.text.text));\n\n const nav = useMenuNavigation({\n open,\n count: flatOptions.length,\n initialIndex: Math.max(0, flatOptions.findIndex(isSelected)),\n onChoose: (i) => {\n const option = flatOptions[i];\n if (option) selectItem(optionToItem(option));\n },\n onClose: () => {\n setOpen(false);\n triggerRef.current?.focus();\n },\n onOpen: () => setOpen(true),\n listRef,\n });\n\n const closedLabel = multi\n ? undefined\n : items[0]\n ? items[0].label || resolveLabel(items[0].id)\n : undefined;\n const placeholder = element.placeholder?.text ?? \"Select an item\";\n const showSearchOnly = source !== \"static\"; // external/users/conversations/channels have no local directory\n\n return (\n <div\n className={`sbk-select${multi ? \" sbk-select--multi\" : \"\"}${multi && items.length > 0 ? \" sbk-select--chips\" : \"\"}${sizeClass}`}\n ref={rootRef}\n onKeyDown={nav.onKeyDown}\n >\n {multi && element.max_selected_items && (\n <p className=\"sbk-select__max-info\">\n You can select up to {element.max_selected_items}{\" \"}\n {element.max_selected_items === 1 ? \"item\" : \"items\"}.\n </p>\n )}\n <button\n ref={triggerRef}\n type=\"button\"\n className=\"sbk-select__control\"\n onClick={() => setOpen((o) => !o)}\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n {...invalid}\n >\n {multi ? (\n items.length > 0 ? (\n <span className=\"sbk-select__chips\">\n {items.map((item) => (\n <span className=\"sbk-select__chip\" key={item.id}>\n {source === \"channels\" && isUnresolved(item) ? (\n privateChannel(\"sbk-select__chip-label sbk-select__chip-entity\")\n ) : (\n <span className=\"sbk-select__chip-label\">\n <span className=\"sbk-select__chip-text\">\n <span>{item.label || resolveLabel(item.id)}</span>\n </span>\n </span>\n )}\n <span\n className=\"sbk-select__chip-remove\"\n role=\"button\"\n tabIndex={0}\n aria-label={`Remove ${item.label || resolveLabel(item.id)}`}\n onClick={(e) => {\n e.stopPropagation();\n removeItem(item.id);\n }}\n // A role=\"button\" span only gets clicks from the pointer; Enter and Space\n // remove the chip too, and stop there so the select doesn't open.\n onKeyDown={(e) => {\n if (e.key !== \"Enter\" && e.key !== \" \") return;\n e.preventDefault();\n e.stopPropagation();\n removeItem(item.id);\n }}\n >\n <CloseIcon />\n </span>\n </span>\n ))}\n </span>\n ) : (\n <span className=\"sbk-select__placeholder\">{placeholder}</span>\n )\n ) : closedLabel ? (\n items[0] && isUnresolved(items[0]) ? (\n unresolvedValue(items[0].id)\n ) : (\n <span className=\"sbk-select__value\">{closedLabel}</span>\n )\n ) : (\n <span className=\"sbk-select__placeholder\">{placeholder}</span>\n )}\n <ChevronDownIcon className=\"sbk-select__chevron\" />\n </button>\n {open && (\n <Popover anchorRef={rootRef} onDismiss={() => setOpen(false)}>\n <div className=\"sbk-select__menu\" role=\"listbox\" ref={listRef}>\n {(showSearchOnly || allOptions(element).length > 8) && (\n <div className=\"sbk-select__search\">\n <SearchIcon />\n <input\n autoFocus\n className=\"sbk-select__search-input\"\n placeholder={\n source === \"static\" || source === \"external\"\n ? \"Search options\"\n : `Search ${source}`\n }\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" && query.trim() && showSearchOnly && !remote) {\n // No live directory to search against: typing an id/value and pressing\n // enter selects it directly. This is our approximation for\n // external/users/conversations/channels selects, documented in the brief.\n selectItem({ id: query.trim(), label: resolveLabel(query.trim()) });\n }\n }}\n />\n </div>\n )}\n {(() => {\n let index = 0;\n return visibleGroups.map((group, gi) => {\n const rows = group.options.map((option) => {\n const i = index++;\n return (\n <SelectOption\n key={option.value ?? i}\n option={option}\n selected={isSelected(option)}\n onSelect={() => selectItem(optionToItem(option))}\n navProps={nav.itemProps(i)}\n />\n );\n });\n return group.label === undefined ? (\n rows\n ) : (\n <div className=\"sbk-select__group\" key={gi}>\n <div className=\"sbk-select__group-label\">{group.label}</div>\n {rows}\n </div>\n );\n });\n })()}\n {remote && loading && <div className=\"sbk-select__status\">Loading…</div>}\n {remote && !loading && remoteGroups !== undefined && flatOptions.length === 0 && (\n <div className=\"sbk-select__status\">No results</div>\n )}\n {showSearchOnly && items.length > 0 && multi && (\n <div className=\"sbk-select__group-label\">Selected</div>\n )}\n {showSearchOnly &&\n multi &&\n items.map((item) => (\n <div className=\"sbk-select__option sbk-select__option--selected\" key={item.id}>\n {item.label || resolveLabel(item.id)}\n </div>\n ))}\n </div>\n </Popover>\n )}\n {dialog}\n </div>\n );\n}\n\nfunction SelectOption({\n option,\n selected,\n onSelect,\n navProps,\n}: {\n option: PlainTextOption;\n selected: boolean;\n onSelect: () => void;\n navProps?: ReturnType<ReturnType<typeof useMenuNavigation>[\"itemProps\"]>;\n}) {\n return (\n <div\n className={`sbk-select__option${selected ? \" sbk-select__option--selected\" : \"\"}`}\n role=\"option\"\n aria-selected={selected}\n onClick={onSelect}\n {...navProps}\n >\n <span className=\"sbk-select__option-text\">\n <Text text={option.text} />\n </span>\n {option.description && (\n <span className=\"sbk-select__option-description\">\n <Text text={option.description} />\n </span>\n )}\n </div>\n );\n}\n","import { useEffect, useState } from \"react\";\nimport { useBlockKit } from \"../context\";\nimport { EmailIcon, LinkGlyphIcon } from \"../icons\";\nimport type { ElementProps, Json } from \"../types\";\nimport { useFocusOnLoad } from \"./useFocusOnLoad\";\nimport { useInvalidProps } from \"./inputBlockContext\";\n\nexport interface TextInputElement extends Json {\n type: \"plain_text_input\" | \"email_text_input\" | \"url_text_input\" | \"number_input\";\n action_id?: string;\n initial_value?: string;\n placeholder?: { type: \"plain_text\"; text: string };\n multiline?: boolean;\n min_length?: number;\n max_length?: number;\n is_decimal_allowed?: boolean;\n min_value?: string;\n max_value?: string;\n dispatch_action_config?: { trigger_actions_on?: (\"on_enter_pressed\" | \"on_character_entered\")[] };\n /** Set by the owning `input` block (Slack's block-level `dispatch_action` flag); not part of\n * the Block Kit element schema, so it's read via an internal field rather than exported. */\n __dispatchAction?: boolean;\n}\n\nconst HTML_TYPE: Record<TextInputElement[\"type\"], string> = {\n plain_text_input: \"text\",\n email_text_input: \"email\",\n url_text_input: \"url\",\n number_input: \"text\",\n};\n\nexport function TextInput({ element, blockId }: ElementProps<TextInputElement>) {\n const { setValue, dispatch, surface } = useBlockKit();\n // Slack's Builder uses a taller \"medium\" control (36px, more horizontal padding) for a modal\n // or Home tab form; the message-surface preview uses a smaller 28px control.\n const sizeClass = surface === \"message\" ? \"\" : \" sbk-text-input--medium\";\n const [value, setLocalValue] = useState(element.initial_value ?? \"\");\n const invalid = useInvalidProps();\n const focusRef = useFocusOnLoad<HTMLInputElement & HTMLTextAreaElement>(\n element as { focus_on_load?: boolean },\n );\n const actionId = element.action_id ?? \"\";\n const dispatchEnabled = element.__dispatchAction === true;\n const triggers = element.dispatch_action_config?.trigger_actions_on ?? [\"on_enter_pressed\"];\n\n useEffect(() => {\n if (element.initial_value !== undefined) {\n setValue(blockId, actionId, { type: element.type, value: element.initial_value });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n function report(next: string) {\n setValue(blockId, actionId, { type: element.type, value: next });\n }\n\n function fire(next: string) {\n dispatch({ type: element.type, action_id: actionId, block_id: blockId, value: next });\n }\n\n function onChange(next: string) {\n if (element.type === \"number_input\") {\n const pattern = element.is_decimal_allowed ? /^-?\\d*\\.?\\d*$/ : /^-?\\d*$/;\n if (next !== \"\" && !pattern.test(next)) return;\n }\n setLocalValue(next);\n report(next);\n if (dispatchEnabled && triggers.includes(\"on_character_entered\")) fire(next);\n }\n\n function onKeyDown(e: React.KeyboardEvent) {\n if (\n e.key === \"Enter\" &&\n !element.multiline &&\n dispatchEnabled &&\n triggers.includes(\"on_enter_pressed\")\n ) {\n fire(value);\n }\n }\n\n // Slack's Builder preview shows this default placeholder for any text-like input that doesn't\n // specify its own, rather than leaving the field visually empty.\n const placeholder = element.placeholder?.text ?? \"Write something\";\n\n const commonProps = {\n className: `sbk-text-input${sizeClass}`,\n value,\n placeholder,\n onKeyDown,\n ref: focusRef,\n \"aria-label\": element.action_id,\n ...invalid,\n };\n\n // Slack's Builder prefixes email/url inputs with a small leading glyph (envelope / link) inside\n // the closed control, before the placeholder or value.\n const leadingIcon =\n element.type === \"email_text_input\" ? (\n <EmailIcon className=\"sbk-text-input__icon\" />\n ) : element.type === \"url_text_input\" ? (\n <LinkGlyphIcon className=\"sbk-text-input__icon\" />\n ) : null;\n\n if (element.multiline) {\n return (\n <textarea\n {...commonProps}\n className={`sbk-text-input sbk-text-input--multiline${sizeClass}`}\n onChange={(e) => onChange(e.target.value)}\n />\n );\n }\n\n const input = (\n <input\n {...commonProps}\n type={HTML_TYPE[element.type]}\n inputMode={\n element.type === \"number_input\"\n ? element.is_decimal_allowed\n ? \"decimal\"\n : \"numeric\"\n : undefined\n }\n minLength={element.min_length}\n maxLength={element.max_length}\n onChange={(e) => onChange(e.target.value)}\n />\n );\n\n if (!leadingIcon) return input;\n\n return (\n <div className=\"sbk-text-input__wrap\">\n {leadingIcon}\n {input}\n </div>\n );\n}\n","import type { Timepicker } from \"@slack/types\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { useConfirm } from \"../confirm/useConfirm\";\nimport { useBlockKit } from \"../context\";\nimport { ChevronDownIcon, ClockIcon } from \"../icons\";\nimport type { ElementProps } from \"../types\";\nimport { useFocusOnLoad } from \"./useFocusOnLoad\";\nimport { useInvalidProps } from \"./inputBlockContext\";\nimport { useMenuNavigation } from \"./useMenuNavigation\";\nimport { Popover } from \"./Popover\";\n\n/** Formats `HH:mm` the way Slack's closed timepicker shows it, e.g. \"1:37 PM\". */\nfunction formatTime(time: string): string {\n const [h = 0, m = 0] = time.split(\":\").map(Number);\n const period = h >= 12 ? \"PM\" : \"AM\";\n const hour12 = h % 12 === 0 ? 12 : h % 12;\n return `${hour12}:${String(m).padStart(2, \"0\")} ${period}`;\n}\n\n/** Every 30 minutes, as Slack's timepicker list offers. */\nfunction timeOptions(): string[] {\n const times: string[] = [];\n for (let h = 0; h < 24; h++) {\n for (const m of [0, 30])\n times.push(`${String(h).padStart(2, \"0\")}:${String(m).padStart(2, \"0\")}`);\n }\n return times;\n}\n\nexport function TimePicker({ element, blockId }: ElementProps<Timepicker>) {\n const { setValue, dispatch } = useBlockKit();\n const { ask, dialog } = useConfirm(element.confirm);\n const [time, setTime] = useState<string | undefined>(element.initial_time);\n const [open, setOpen] = useState(false);\n const rootRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n useFocusOnLoad(element, triggerRef);\n const invalid = useInvalidProps();\n const listRef = useRef<HTMLDivElement>(null);\n const actionId = element.action_id ?? \"\";\n\n useEffect(() => {\n if (time) setValue(blockId, actionId, { type: \"timepicker\", selected_time: time });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n async function pick(next: string) {\n if (!(await ask())) return;\n setTime(next);\n setOpen(false);\n setValue(blockId, actionId, { type: \"timepicker\", selected_time: next });\n dispatch({\n type: \"timepicker\",\n action_id: actionId,\n block_id: blockId,\n selected_time: next,\n // Slack echoes the element's initial_time back in the action, but not its placeholder.\n ...(element.initial_time !== undefined ? { initial_time: element.initial_time } : {}),\n });\n }\n\n const times = timeOptions();\n const nav = useMenuNavigation({\n open,\n count: times.length,\n initialIndex: time ? times.indexOf(time) : -1,\n onChoose: (i) => {\n const t = times[i];\n if (t) pick(t);\n },\n onClose: () => {\n setOpen(false);\n triggerRef.current?.focus();\n },\n onOpen: () => setOpen(true),\n listRef,\n });\n\n return (\n <div className=\"sbk-timepicker\" ref={rootRef} onKeyDown={nav.onKeyDown}>\n <button\n ref={triggerRef}\n type=\"button\"\n className=\"sbk-timepicker__control\"\n onClick={() => setOpen((o) => !o)}\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n {...invalid}\n >\n <ClockIcon className=\"sbk-timepicker__icon\" />\n <span className={time ? \"sbk-timepicker__value\" : \"sbk-timepicker__placeholder\"}>\n {time ? formatTime(time) : (element.placeholder?.text ?? \"Select time\")}\n </span>\n <ChevronDownIcon className=\"sbk-timepicker__chevron\" />\n </button>\n {open && (\n <Popover anchorRef={rootRef} onDismiss={() => setOpen(false)}>\n <div className=\"sbk-timepicker__menu\" role=\"listbox\" ref={listRef}>\n {times.map((t, i) => (\n <div\n key={t}\n role=\"option\"\n aria-selected={t === time}\n className={`sbk-timepicker__option${t === time ? \" sbk-timepicker__option--selected\" : \"\"}`}\n onClick={() => pick(t)}\n {...nav.itemProps(i)}\n >\n {formatTime(t)}\n </div>\n ))}\n </div>\n </Popover>\n )}\n {element.timezone && <div className=\"sbk-timepicker__hint\">Timezone: {element.timezone}</div>}\n {dialog}\n </div>\n );\n}\n","import type { WorkflowButton as WorkflowButtonElement } from \"@slack/types\";\nimport { useConfirm } from \"../confirm/useConfirm\";\nimport { useBlockKit } from \"../context\";\nimport { WorkflowIcon } from \"../icons\";\nimport type { ElementProps } from \"../types\";\n\n/** Renders like a regular button with a small lightning-bolt glyph, matching Slack's own\n * workflow_button treatment. There is no real workflow runtime here: clicking only dispatches\n * the block_actions payload with the workflow's trigger metadata, it never calls the trigger URL. */\nexport function WorkflowButton({ element, blockId }: ElementProps<WorkflowButtonElement>) {\n const { dispatch } = useBlockKit();\n const { ask, dialog } = useConfirm(element.confirm);\n const className = [\n \"sbk-button\",\n \"sbk-workflow-button\",\n element.style && `sbk-button--${element.style}`,\n ]\n .filter(Boolean)\n .join(\" \");\n\n // @slack/types omits `action_id` from WorkflowButton, but Slack's real payloads include it.\n const actionId = (element as unknown as { action_id?: string }).action_id ?? \"\";\n\n const handleClick = async () => {\n if (!(await ask())) return;\n dispatch({\n type: \"workflow_button\",\n action_id: actionId,\n block_id: blockId,\n text: { type: \"plain_text\", text: element.text.text, emoji: element.text.emoji ?? true },\n workflow: element.workflow,\n ...(element.style !== undefined ? { style: element.style } : {}),\n });\n };\n\n return (\n <>\n <button\n type=\"button\"\n className={className}\n onClick={handleClick}\n aria-label={element.accessibility_label}\n >\n <WorkflowIcon className=\"sbk-workflow-button__icon\" />\n <span className=\"sbk-button__label\">{element.text.text}</span>\n </button>\n {dialog}\n </>\n );\n}\n","import type { ComponentType } from \"react\";\nimport type { ElementProps } from \"../types\";\nimport { Button } from \"./Button\";\nimport { Checkboxes } from \"./Checkboxes\";\nimport { DatePicker } from \"./DatePicker\";\nimport { DateTimePicker } from \"./DateTimePicker\";\nimport { FeedbackButtons } from \"./FeedbackButtons\";\nimport { FileInput } from \"./FileInput\";\nimport { IconButton } from \"./IconButton\";\nimport { ImageElement } from \"./ImageElement\";\nimport { Overflow } from \"./Overflow\";\nimport { RadioButtons } from \"./RadioButtons\";\nimport { RichTextInput } from \"./RichTextInput\";\nimport { Select } from \"./Select\";\nimport { TextInput } from \"./TextInput\";\nimport { TimePicker } from \"./TimePicker\";\nimport { WorkflowButton } from \"./WorkflowButton\";\n\nexport const elementComponents: Record<string, ComponentType<ElementProps<any>>> = {\n button: Button,\n channels_select: Select,\n checkboxes: Checkboxes,\n conversations_select: Select,\n datepicker: DatePicker,\n datetimepicker: DateTimePicker,\n email_text_input: TextInput,\n external_select: Select,\n feedback_buttons: FeedbackButtons,\n file_input: FileInput,\n icon_button: IconButton,\n image: ImageElement,\n multi_channels_select: Select,\n multi_conversations_select: Select,\n multi_external_select: Select,\n multi_static_select: Select,\n multi_users_select: Select,\n number_input: TextInput,\n overflow: Overflow,\n plain_text_input: TextInput,\n radio_buttons: RadioButtons,\n rich_text_input: RichTextInput,\n static_select: Select,\n timepicker: TimePicker,\n url_text_input: TextInput,\n users_select: Select,\n workflow_button: WorkflowButton,\n};\n","import type { Json } from \"../types\";\nimport { elementComponents } from \".\";\nimport { Unsupported } from \"./Unsupported\";\n\n/** Renders any interactive or image element. Unsupported types render a visible placeholder. */\nexport function Element({ element, blockId }: { element: Json; blockId: string }) {\n const Component = elementComponents[element.type];\n if (!Component) return <Unsupported type={element.type} />;\n return <Component element={element} blockId={blockId} />;\n}\n","import type { ActionsBlock } from \"@slack/types\";\nimport { Element } from \"../elements/Element\";\nimport type { BlockProps, Json } from \"../types\";\n\n// Slack's Builder gives these element types their own full-width row in an actions block,\n// stacked vertically, instead of letting them sit side-by-side with other actions like a button\n// or select does. Confirmed via inspect.ts against catalog/actions/checkboxes and\n// catalog/actions/radio-buttons (`p-actions_block__action--full_width`). A datetimepicker's two\n// boxes stretch to fill the row too (extra/actions/more-elements).\nconst FULL_WIDTH_TYPES = new Set([\"checkboxes\", \"radio_buttons\", \"datetimepicker\"]);\n\nexport function Actions({ block, blockId }: BlockProps<ActionsBlock>) {\n return (\n <div className=\"sbk-actions\">\n {(block.elements as unknown as Json[]).map((element, i) => {\n const fullWidth = FULL_WIDTH_TYPES.has(element.type as string);\n return (\n <div\n key={(element.action_id as string | undefined) ?? i}\n className={`sbk-actions__action${fullWidth ? \" sbk-actions__action--full-width\" : \"\"}`}\n >\n <Element element={element} blockId={blockId} />\n </div>\n );\n })}\n </div>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { Text, type TextObject } from \"../Text\";\nimport type { BlockProps, Json } from \"../types\";\n\ntype AlertLevel = \"default\" | \"info\" | \"warning\" | \"error\" | \"success\";\n\nconst LEVELS = new Set<AlertLevel>([\"default\", \"info\", \"warning\", \"error\", \"success\"]);\n\n// Icons copied from the Builder's `c-alert__icon` (20×20, `currentColor`).\nconst WARNING_TRIANGLE = (\n <>\n <path d=\"M10 12.75a1 1 0 1 1 0 2 1 1 0 0 1 0-2m0-6a.75.75 0 0 1 .75.75V11a.75.75 0 0 1-1.5 0V7.5a.75.75 0 0 1 .75-.75\" />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M7.712 3.542c1.02-1.723 3.556-1.723 4.576 0l6.1 10.303c1.043 1.761-.28 3.905-2.287 3.905H3.899c-2.007 0-3.33-2.144-2.288-3.905zm3.285.765c-.44-.742-1.554-.742-1.994 0l-6.1 10.302c-.418.704.084 1.641.996 1.641h12.202c.912 0 1.414-.937.997-1.642z\"\n />\n </>\n);\n\nconst ICONS: Record<AlertLevel, ReactNode> = {\n default: (\n <path d=\"M9.52 4.8V2.9q0-.51-.26-.95a1.8 1.8 0 0 0-.69-.69A1.8 1.8 0 0 0 7.62 1q-.51 0-.95.26a2 2 0 0 0-.69.7q-.25.43-.25.94 0 .52.25.96.26.43.69.69.44.25.95.25zm2.85 4.73a1.9 1.9 0 0 1-.96-.25 2 2 0 0 1-.69-.69 1.9 1.9 0 0 1-.25-.96V2.9q0-.51.25-.95.26-.44.69-.69.44-.26.96-.26.51 0 .94.26.43.25.68.69.26.44.26.95v4.73q0 .52-.26.96a1.84 1.84 0 0 1-1.62.94M9.53 7.62q0 .52-.26.96a1.9 1.9 0 0 1-.69.69q-.43.25-.95.25H2.9q-.51 0-.95-.25a2 2 0 0 1-.7-.69A1.9 1.9 0 0 1 1 7.62q0-.51.26-.94.26-.44.69-.69.44-.26.95-.26h4.73q.52 0 .95.26.44.25.69.69.26.43.26.94m5.67 1.9h1.9q.51 0 .95-.25.44-.26.69-.69.26-.44.26-.96 0-.51-.26-.94a1.9 1.9 0 0 0-.7-.69q-.43-.26-.94-.26-.52 0-.96.26a1.9 1.9 0 0 0-.69.69q-.25.43-.25.94zM2.9 14.25a1.9 1.9 0 0 1-.95-.25 2 2 0 0 1-.7-.69Q1 12.88 1 12.37a1.86 1.86 0 0 1 .95-1.64q.44-.26.95-.26h1.9v1.9q0 .51-.26.94a1.9 1.9 0 0 1-.69.69q-.43.25-.95.25m4.72-3.78q.52 0 .95.26.44.25.69.69.26.43.26.95v4.73q0 .51-.26.95a1.8 1.8 0 0 1-.69.69q-.43.26-.95.26-.51 0-.95-.26a2 2 0 0 1-.69-.7q-.25-.43-.25-.94v-4.73q0-.52.25-.95.26-.44.69-.69.44-.26.95-.26m2.85 1.9q0-.52.25-.95.26-.44.69-.69.44-.26.96-.26h4.73q.51 0 .95.26.44.25.69.69.26.43.26.95 0 .51-.26.94a1.9 1.9 0 0 1-.69.69 1.9 1.9 0 0 1-.95.25h-4.73a1.9 1.9 0 0 1-.96-.25 2 2 0 0 1-.69-.69q-.25-.43-.25-.94m0 2.83v1.9q0 .51.25.95.26.44.69.69.44.26.96.26.51 0 .94-.26.43-.25.68-.69.26-.44.26-.95 0-.52-.26-.95a1.83 1.83 0 0 0-.68-.69q-.43-.26-.94-.26z\" />\n ),\n info: (\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M10 2.5a7.5 7.5 0 1 0 0 15 7.5 7.5 0 0 0 0-15M1 10a9 9 0 1 1 18 0 9 9 0 0 1-18 0m10-4a1 1 0 1 1-2 0 1 1 0 0 1 2 0m-.25 3.25a.75.75 0 0 0-1.5 0v5a.75.75 0 0 0 1.5 0z\"\n />\n ),\n warning: WARNING_TRIANGLE,\n error: WARNING_TRIANGLE,\n success: (\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M10 2.5a7.5 7.5 0 1 1 0 15 7.5 7.5 0 0 1 0-15M10 19a9 9 0 1 0 0-18 9 9 0 0 0 0 18m3.636-12.372a.75.75 0 0 0-1.058.087l-4.125 4.862-1.14-1.61a.75.75 0 0 0-1.225.867l1.7 2.4a.75.75 0 0 0 1.184.051l4.75-5.6a.75.75 0 0 0-.086-1.057\"\n />\n ),\n};\n\n/**\n * Slack only accepts `alert` in modals; like the other blocks it renders on any surface here, so\n * a payload previews the same wherever it's placed. An unknown `level` falls back to `default`.\n */\nexport function Alert({ block }: BlockProps) {\n const json = block as Json;\n const level: AlertLevel = LEVELS.has(json.level as AlertLevel)\n ? (json.level as AlertLevel)\n : \"default\";\n const text = json.text as TextObject | undefined;\n\n return (\n <div className={`sbk-alert sbk-alert--${level}`} role={level === \"error\" ? \"alert\" : \"status\"}>\n <svg\n className=\"sbk-alert__icon\"\n viewBox=\"0 0 20 20\"\n width=\"20\"\n height=\"20\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n {ICONS[level]}\n </svg>\n <span className=\"sbk-alert__message\">{text ? <Text text={text} /> : null}</span>\n </div>\n );\n}\n","import type { BlockProps, Json } from \"../types\";\nimport { Block } from \"./Block\";\n\n/** Callout colours; each has a token per theme (Callout.css, and Message.css for dark). */\nconst BACKGROUND_COLORS = new Set([\"green\", \"blue\", \"red\", \"yellow\", \"purple\", \"gray\"]);\n\nexport function Callout({ block }: BlockProps) {\n const json = block as Json;\n const color = typeof json.background_color === \"string\" ? json.background_color : undefined;\n const key = color === \"grey\" ? \"gray\" : color;\n const background = `var(--sbk-callout-${key && BACKGROUND_COLORS.has(key) ? key : \"gray\"}-bg)`;\n const children = (json.child_blocks as Json[] | undefined) ?? [];\n\n return (\n <div className=\"sbk-callout\" style={{ backgroundColor: background }}>\n {children.map((child, i) => (\n <Block key={(child.block_id as string | undefined) ?? i} block={child} index={i} />\n ))}\n </div>\n );\n}\n","import { Element } from \"../elements/Element\";\nimport { Text, type TextObject } from \"../Text\";\nimport { Tooltip } from \"../Tooltip\";\nimport type { BlockProps, Json } from \"../types\";\n\n/** Slack's inline icons by `slack_icon` name, their 20-unit paths as Slack ships them. */\nconst SLACK_ICONS: Record<string, string> = {\n rocket:\n \"m18.168 1.832.05.639c.257 3.278-1.016 7.195-5.445 9.976.2 1.025.257 1.866-.078 2.653-.376.881-1.2 1.57-2.327 2.443-.689.535-1.653.22-1.98-.506a11 11 0 0 0-2.229-3.197 11 11 0 0 0-3.196-2.229c-.728-.327-1.041-1.29-.507-1.98.874-1.127 1.562-1.95 2.444-2.326.786-.336 1.627-.28 2.652-.078 2.782-4.43 6.698-5.702 9.977-5.446zM16.749 3.25c-2.714-.008-5.882 1.24-8.182 5.197l-.276.475-.535-.12c-1.302-.289-1.845-.298-2.268-.118-.432.185-.865.615-1.688 1.663.848.405 2.148 1.16 3.42 2.432a12.6 12.6 0 0 1 2.433 3.42c1.048-.823 1.478-1.256 1.662-1.688.18-.423.171-.965-.118-2.267l-.12-.536.475-.276c3.957-2.3 5.206-5.468 5.197-8.182m-3.702 4.955c-.69 0-1.253-.563-1.253-1.252S12.357 5.7 13.047 5.7c.689 0 1.252.563 1.252 1.253 0 .689-.563 1.252-1.252 1.252M2.95 14.217c.597-.596 1.222-.485 1.952-.172a1 1 0 0 0-.081.071l-.809.809a.75.75 0 0 0 1.062 1.061l.808-.808a1 1 0 0 0 .071-.082c.313.73.425 1.356-.171 1.952-1.77 1.77-3.893 1.062-3.893 1.062s-.708-2.124 1.061-3.893\",\n};\n\n/** A card's `icon` (an image element) or `slack_icon` (one of Slack's inline icons, by name). */\nfunction CardIcon({ icon, slackIcon }: { icon?: Json; slackIcon?: Json }) {\n if (icon && icon.type === \"image\") {\n return (\n <img\n className=\"sbk-card__icon\"\n src={\"image_url\" in icon ? (icon.image_url as string) : undefined}\n alt={(icon.alt_text as string) ?? \"\"}\n />\n );\n }\n if (slackIcon) {\n const name = slackIcon.name as string;\n const glyph = SLACK_ICONS[name];\n if (glyph) {\n return (\n <span className=\"sbk-card__icon sbk-card__icon--slack\">\n <svg viewBox=\"0 0 20 20\" width=\"24\" height=\"24\" aria-hidden=\"true\">\n <path fill=\"currentColor\" fillRule=\"evenodd\" clipRule=\"evenodd\" d={glyph} />\n </svg>\n </span>\n );\n }\n // An icon we have no glyph for: a neutral badge stands in, named on hover.\n return (\n <Tooltip label={name}>\n <span className=\"sbk-card__icon sbk-card__icon--fallback\">\n <svg viewBox=\"0 0 20 20\" width=\"18\" height=\"18\" aria-hidden=\"true\">\n <circle cx=\"10\" cy=\"10\" r=\"9\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n </svg>\n </span>\n </Tooltip>\n );\n }\n return null;\n}\n\n/**\n * Renders one `card` block. Also used by `Carousel` for its `elements[]`, since a carousel is a\n * horizontally-scrolling row of the same card content.\n */\nexport function Card({ block, blockId }: BlockProps) {\n const json = block as Json;\n const icon = json.icon as Json | undefined;\n const slackIcon = json.slack_icon as Json | undefined;\n const title = json.title as TextObject | undefined;\n const subtitle = json.subtitle as TextObject | undefined;\n const heroImage = json.hero_image as Json | undefined;\n const body = json.body as TextObject | undefined;\n const subtext = json.subtext as TextObject | undefined;\n const actions = json.actions as Json[] | undefined;\n\n return (\n <div className=\"sbk-card\">\n <div className=\"sbk-card__box\">\n <div className=\"sbk-card__content\">\n {heroImage && (\n <img\n className=\"sbk-card__hero\"\n src={\"image_url\" in heroImage ? (heroImage.image_url as string) : undefined}\n alt={(heroImage.alt_text as string) ?? \"\"}\n />\n )}\n {(icon || slackIcon || title || subtitle) && (\n <div className=\"sbk-card__header\">\n <CardIcon icon={icon} slackIcon={slackIcon} />\n {(title || subtitle) && (\n <div className=\"sbk-card__titles\">\n {title && (\n <div className=\"sbk-card__title\">\n <Text text={title} />\n </div>\n )}\n {subtitle && (\n <div className=\"sbk-card__subtitle\">\n <Text text={subtitle} />\n </div>\n )}\n </div>\n )}\n </div>\n )}\n {body && (\n <div className=\"sbk-card__body\">\n <Text text={body} />\n </div>\n )}\n {subtext && (\n <div className=\"sbk-card__subtext\">\n <Text text={subtext} />\n </div>\n )}\n {actions && actions.length > 0 && (\n <div className=\"sbk-card__actions\">\n {/* Slack pulls danger buttons into a left-aligned group; the rest stay right-aligned\n in their original order. */}\n <div className=\"sbk-card__actions-start\">\n {actions.map(\n (action, i) =>\n action.style === \"danger\" && (\n <Element\n key={(action.action_id as string | undefined) ?? i}\n element={action}\n blockId={blockId}\n />\n ),\n )}\n </div>\n {actions.map(\n (action, i) =>\n action.style !== \"danger\" && (\n <Element\n key={(action.action_id as string | undefined) ?? i}\n element={action}\n blockId={blockId}\n />\n ),\n )}\n </div>\n )}\n </div>\n </div>\n </div>\n );\n}\n","/** Small inline icons shared by the table/chart blocks, drawn to match Slack's glyphs. */\n\nexport function SearchIcon() {\n return (\n <svg viewBox=\"0 0 20 20\" width=\"16\" height=\"16\" fill=\"none\" aria-hidden=\"true\">\n <circle cx=\"8.5\" cy=\"8.5\" r=\"6\" stroke=\"currentColor\" strokeWidth=\"1.8\" />\n <line\n x1=\"13\"\n y1=\"13\"\n x2=\"17.5\"\n y2=\"17.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n\nexport function ExpandIcon() {\n return (\n <svg viewBox=\"0 0 20 20\" width=\"16\" height=\"16\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M7 3H3v4M13 3h4v4M3 13v4h4M17 13v4h-4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nexport function KebabIcon() {\n return (\n <svg viewBox=\"0 0 4 18\" width=\"4\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\">\n <circle cx=\"2\" cy=\"2\" r=\"2\" />\n <circle cx=\"2\" cy=\"9\" r=\"2\" />\n <circle cx=\"2\" cy=\"16\" r=\"2\" />\n </svg>\n );\n}\n\n/** Slack's `caret-right` glyph, turned to point down when expanded (task card and plan toggles). */\nconst CARET_ROTATION = { right: undefined, down: \"rotate(90deg)\", left: \"rotate(180deg)\" };\n\nexport function CaretIcon({\n direction = \"right\",\n size = 13,\n}: {\n direction?: \"right\" | \"down\" | \"left\";\n size?: number;\n}) {\n const rotation = CARET_ROTATION[direction];\n return (\n <svg\n viewBox=\"0 0 20 20\"\n width={size}\n height={size}\n aria-hidden=\"true\"\n style={rotation ? { transform: rotation } : undefined}\n >\n <path\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M7.72 5.72a.75.75 0 0 1 1.06 0l3.75 3.75a.75.75 0 0 1 0 1.06l-3.75 3.75a.75.75 0 0 1-1.06-1.06L10.94 10 7.72 6.78a.75.75 0 0 1 0-1.06\"\n />\n </svg>\n );\n}\n\nexport function ChevronIcon({\n direction = \"down\",\n}: {\n direction?: \"up\" | \"down\" | \"left\" | \"right\";\n}) {\n const rotation = { up: 180, down: 0, left: 90, right: -90 }[direction];\n return (\n <svg\n viewBox=\"0 0 12 8\"\n width=\"7\"\n height=\"4\"\n fill=\"none\"\n aria-hidden=\"true\"\n style={{ transform: `rotate(${rotation}deg)` }}\n >\n <path\n d=\"M1 1.5L6 6.5L11 1.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\n/** A 16px glyph from Slack's 20x20 icon set, filled with the text colour. */\nfunction SlackGlyph({ d }: { d: string }) {\n return (\n <svg viewBox=\"0 0 20 20\" width=\"16\" height=\"16\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d={d} />\n </svg>\n );\n}\n\n/** Slack's `chevron-down`, shown on a sortable column header while it's hovered or focused. */\nexport function SortCaretIcon() {\n return (\n <SlackGlyph d=\"M5.72 7.47a.75.75 0 0 1 1.06 0L10 10.69l3.22-3.22a.75.75 0 1 1 1.06 1.06l-3.75 3.75a.75.75 0 0 1-1.06 0L5.72 8.53a.75.75 0 0 1 0-1.06\" />\n );\n}\n\n/** Slack's `arrow-up`, on the sort menu's Ascending item. */\nexport function ArrowUpIcon() {\n return (\n <SlackGlyph d=\"M10.543 3.232a.75.75 0 0 0-1.086 0l-5.25 5.5a.75.75 0 0 0 1.086 1.036L9.25 5.622V16.25a.75.75 0 0 0 1.5 0V5.622l3.957 4.146a.75.75 0 0 0 1.085-1.036z\" />\n );\n}\n\n/** Slack's `arrow-down`, on the sort menu's Descending item. */\nexport function ArrowDownIcon() {\n return (\n <SlackGlyph d=\"M10.75 3.75a.75.75 0 0 0-1.5 0v10.628l-3.957-4.146a.75.75 0 0 0-1.086 1.036l5.25 5.5a.75.75 0 0 0 1.085 0l5.25-5.5a.75.75 0 0 0-1.085-1.036l-3.957 4.146z\" />\n );\n}\n\n/** Slack's `check`, beside the checked item of a menu. */\nexport function MenuCheckIcon() {\n return (\n <SlackGlyph d=\"M17.234 3.677a.75.75 0 0 1 .089 1.057l-9.72 11.5a.75.75 0 0 1-1.19-.058L2.633 10.7a.75.75 0 0 1 1.234-.852l3.223 4.669 9.087-10.751a.75.75 0 0 1 1.057-.089\" />\n );\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport { CaretIcon } from \"../data/icons\";\nimport type { BlockProps, Json } from \"../types\";\nimport { Card } from \"./Card\";\n\n/** A horizontally-scrolling row of cards, with arrow buttons that page by one card width. */\nexport function Carousel({ block }: BlockProps) {\n const elements = ((block as Json).elements as Json[] | undefined) ?? [];\n const scrollerRef = useRef<HTMLDivElement>(null);\n // Slack fades an arrow out once there is nothing left to scroll towards.\n const [edges, setEdges] = useState({ start: true, end: false });\n\n const updateEdges = () => {\n const el = scrollerRef.current;\n if (!el) return;\n const start = el.scrollLeft <= 1;\n const end = el.scrollLeft + el.clientWidth >= el.scrollWidth - 1;\n setEdges((prev) => (prev.start === start && prev.end === end ? prev : { start, end }));\n };\n\n useEffect(updateEdges, [elements.length]);\n\n const scrollBy = (dx: number) => {\n scrollerRef.current?.scrollBy({ left: dx, behavior: \"smooth\" });\n };\n\n const arrowClass = (side: \"left\" | \"right\", hidden: boolean) =>\n `sbk-carousel__arrow sbk-carousel__arrow--${side}${hidden ? \" sbk-carousel__arrow--hidden\" : \"\"}`;\n\n return (\n <div className=\"sbk-carousel\">\n <div className=\"sbk-carousel__scroller\" ref={scrollerRef} onScroll={updateEdges}>\n {elements.map((card, i) => (\n <div className=\"sbk-carousel__item\" key={(card.block_id as string | undefined) ?? i}>\n <Card\n block={card}\n blockId={(card.block_id as string) ?? `carousel-card-${i}`}\n index={i}\n />\n </div>\n ))}\n </div>\n <button\n type=\"button\"\n className={arrowClass(\"left\", edges.start)}\n aria-label=\"Scroll left\"\n disabled={edges.start}\n onClick={() => scrollBy(-356)}\n >\n <CaretIcon direction=\"left\" size={20} />\n </button>\n <button\n type=\"button\"\n className={arrowClass(\"right\", edges.end)}\n aria-label=\"Scroll right\"\n disabled={edges.end}\n onClick={() => scrollBy(356)}\n >\n <CaretIcon direction=\"right\" size={20} />\n </button>\n </div>\n );\n}\n","import type { BlockProps, Json } from \"../types\";\nimport { Block } from \"./Block\";\n\n/** This library only ever renders as Slack's desktop client, matching the Builder's preview. */\nconst CLIENT = \"desktop\";\n\ninterface ConditionClause {\n type: string;\n op?: \"=\" | \"!=\";\n value?: string;\n}\n\nfunction matches(condition: ConditionClause): boolean {\n if (condition.type !== \"client\") return false;\n const isEqual = condition.value === CLIENT;\n return condition.op === \"!=\" ? !isEqual : isEqual;\n}\n\n/** Renders the first case whose conditions all match the desktop client, else `default`. */\nexport function Condition({ block }: BlockProps) {\n const json = block as Json;\n const cases =\n (json.cases as { conditions: ConditionClause[]; blocks: Json[] }[] | undefined) ?? [];\n const defaultBlocks = (json.default as Json[] | undefined) ?? [];\n\n const matched = cases.find((c) => c.conditions.every(matches));\n const blocks = matched?.blocks ?? defaultBlocks;\n\n return (\n <>\n {blocks.map((child, i) => (\n <Block key={(child.block_id as string | undefined) ?? i} block={child} index={i} />\n ))}\n </>\n );\n}\n","import { createContext, useContext } from \"react\";\n\n/** True for blocks rendered anywhere inside a `container` block's `child_blocks`. */\nexport const InContainerContext = createContext(false);\n\nexport function useInContainer(): boolean {\n return useContext(InContainerContext);\n}\n","import { useBlockKit } from \"../context\";\nimport type { BlockProps, Json } from \"../types\";\nimport { useInContainer } from \"./containerContext\";\n\n/**\n * Renders a workspace user as a contact tile. Resolving `contact_user_id` to a name/avatar needs\n * an authenticated `users.info` call; without a matching `resolvers.user`, we render the same\n * \"unknown user\" skeleton Slack's own Builder shows for an id it can't resolve either (see the\n * `catalog/callout/callout` reference, which uses a placeholder id).\n *\n * Inside a `container` (even nested in a callout there) Slack doesn't render the card at all and\n * shows its unknown-block notice instead (catalog/container/with-callout).\n */\nexport function ContactCard({ block }: BlockProps) {\n const json = block as Json;\n const userId = typeof json.contact_user_id === \"string\" ? json.contact_user_id : undefined;\n const { resolvers } = useBlockKit();\n const name = userId ? resolvers.user?.(userId) : undefined;\n const inContainer = useInContainer();\n\n if (inContainer) {\n return (\n <div className=\"sbk-block-error\">\n <small className=\"sbk-block-error__message\">This content could not be displayed.</small>\n </div>\n );\n }\n\n return (\n <div className=\"sbk-contact-card\">\n <span className=\"sbk-contact-card__avatar\" aria-hidden=\"true\" />\n <div className=\"sbk-contact-card__body\">\n {name ? (\n <span className=\"sbk-contact-card__name\">{name}</span>\n ) : (\n <span className=\"sbk-contact-card__name sbk-contact-card__name--unknown\">\n <span className=\"sbk-contact-card__skeleton\" />\n </span>\n )}\n <span className=\"sbk-contact-card__meta\">Contact</span>\n </div>\n </div>\n );\n}\n","import { type ReactNode, useRef, useState } from \"react\";\nimport { useClientLayoutEffect } from \"../useClientLayoutEffect\";\n\n/**\n * Slack's toggle-bar blocks (plan, task_card) slide open and shut: the block's height transitions\n * over 0.25s while its overflow is clipped. This does the same for the content under the toggle. It\n * keeps the content mounted until the closing transition ends, and skips the animation when the\n * stylesheet sets no transition (reduced motion, or no CSS loaded).\n */\nexport function Collapse({\n open,\n className,\n children,\n}: {\n open: boolean;\n /** Sets a block's own timing, e.g. the container's shorter, eased slide. */\n className?: string;\n children: ReactNode;\n}) {\n const ref = useRef<HTMLDivElement>(null);\n // Whether the content is mounted: it opens with `open` but only closes once the transition ends.\n const [shown, setShown] = useState(open);\n if (open && !shown) setShown(true);\n // What `open` was last time, so only a toggle animates (not the first render).\n const was = useRef(open);\n\n useClientLayoutEffect(() => {\n // Set on the node, not as a prop: React 18 doesn't know `inert` and drops a boolean value.\n ref.current?.toggleAttribute(\"inert\", !open);\n if (was.current === open) return;\n was.current = open;\n const el = ref.current;\n if (!el) return;\n if (!(parseFloat(getComputedStyle(el).transitionDuration) > 0)) {\n // No transition to wait for, and only the stylesheet can say so: unmount now.\n // eslint-disable-next-line react/set-state-in-effect\n if (!open) setShown(false);\n return;\n }\n // Start from the current height: 0 for fresh content, or wherever an interrupted transition is.\n const from = el.style.height ? el.offsetHeight : open ? 0 : el.offsetHeight;\n el.style.height = `${from}px`;\n void el.offsetHeight;\n el.style.height = open ? `${el.scrollHeight}px` : \"0px\";\n }, [open]);\n\n if (!shown) return null;\n return (\n <div\n ref={ref}\n className={className ? `sbk-collapse ${className}` : \"sbk-collapse\"}\n onTransitionEnd={(e) => {\n if (e.target !== e.currentTarget || e.propertyName !== \"height\") return;\n if (open) e.currentTarget.style.height = \"\";\n else setShown(false);\n }}\n >\n {children}\n </div>\n );\n}\n","import { useState } from \"react\";\nimport { Collapse } from \"../data/Collapse\";\nimport { Text, type TextObject } from \"../Text\";\nimport type { BlockProps, Json } from \"../types\";\nimport { Block } from \"./Block\";\nimport { InContainerContext } from \"./containerContext\";\n\nfunction ChevronDown() {\n return (\n <svg viewBox=\"0 0 15 15\" width=\"15\" height=\"15\" aria-hidden=\"true\">\n <path\n d=\"M3 5.5l4.5 4.5 4.5-4.5\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nconst WIDTHS = [\"narrow\", \"standard\", \"wide\", \"full\"];\n\n/**\n * A bordered, optionally-collapsible group of child blocks with a header (icon/title/subtitle).\n * `width` caps the card (narrow/standard/wide); `full` spans the whole message column.\n */\nexport function Container({ block }: BlockProps) {\n const json = block as Json;\n const title = json.title as TextObject | undefined;\n const subtitle = json.subtitle as TextObject | undefined;\n const icon = json.icon as Json | undefined;\n const isCollapsible = json.is_collapsible === true;\n const width = WIDTHS.includes(json.width as string) ? (json.width as string) : \"standard\";\n const hasHeaderDivider = json.has_header_divider === true;\n const children = (json.child_blocks as Json[] | undefined) ?? [];\n const [collapsed, setCollapsed] = useState(isCollapsible && json.default_collapsed === true);\n\n const hasHeader = Boolean(title || subtitle || icon || isCollapsible);\n\n const header = hasHeader && (\n <div className=\"sbk-container__titles\">\n {icon && (\n <img\n className=\"sbk-container__icon\"\n src={\"image_url\" in icon ? (icon.image_url as string) : undefined}\n alt={(icon.alt_text as string) ?? \"\"}\n />\n )}\n <div className=\"sbk-container__title-col\">\n {title && (\n <span className=\"sbk-container__title\">\n <Text text={title} />\n </span>\n )}\n {subtitle && (\n <span className=\"sbk-container__subtitle\">\n <Text text={subtitle} />\n </span>\n )}\n </div>\n {isCollapsible && (\n <span\n className={`sbk-container__chevron${collapsed ? \" sbk-container__chevron--collapsed\" : \"\"}`}\n >\n <ChevronDown />\n </span>\n )}\n </div>\n );\n\n const body = (\n <div className=\"sbk-container__body\">\n <InContainerContext.Provider value={true}>\n {children.map((child, i) => (\n <Block key={(child.block_id as string | undefined) ?? i} block={child} index={i} />\n ))}\n </InContainerContext.Provider>\n </div>\n );\n\n return (\n <div className={`sbk-container sbk-container--${width}`}>\n {isCollapsible ? (\n <button\n type=\"button\"\n className=\"sbk-container__header sbk-container__header--button\"\n aria-expanded={!collapsed}\n onClick={() => setCollapsed((v) => !v)}\n >\n {header}\n </button>\n ) : (\n hasHeader && (\n <div\n className={`sbk-container__header${hasHeaderDivider ? \" sbk-container__header--divider\" : \"\"}`}\n >\n {header}\n </div>\n )\n )}\n {isCollapsible ? (\n <Collapse open={!collapsed} className=\"sbk-container__collapse\">\n {body}\n </Collapse>\n ) : (\n body\n )}\n </div>\n );\n}\n","import type { ContextBlock } from \"@slack/types\";\nimport { Text, type TextObject } from \"../Text\";\nimport type { BlockProps } from \"../types\";\n\nexport function Context({ block }: BlockProps<ContextBlock>) {\n return (\n <div className=\"sbk-context\">\n {block.elements.map((el, i) =>\n el.type === \"image\" ? (\n <img\n key={i}\n className=\"sbk-context__image\"\n src={\"image_url\" in el ? el.image_url : undefined}\n alt={el.alt_text}\n />\n ) : (\n <span key={i} className=\"sbk-context__text\">\n <Text text={el as TextObject} emojiSize={16} />\n </span>\n ),\n )}\n </div>\n );\n}\n","import { Element } from \"../elements/Element\";\nimport type { BlockProps, Json } from \"../types\";\n\n/**\n * A trailing row of small icon-style actions (feedback thumbs-up/down, copy, retry, overflow…),\n * typically under an AI-generated message. The individual element rendering (feedback_buttons,\n * icon_button, overflow, ...) is owned by the elements layer; this just lays the row out.\n */\nexport function ContextActions({ block, blockId }: BlockProps) {\n const elements = ((block as Json).elements as Json[] | undefined) ?? [];\n return (\n <div className=\"sbk-context-actions\">\n {elements.map((element, i) => (\n <div\n key={(element.action_id as string | undefined) ?? i}\n className=\"sbk-context-actions__item\"\n >\n <Element element={element} blockId={blockId} />\n </div>\n ))}\n </div>\n );\n}\n","import type { ReactNode } from \"react\";\nimport type { Json } from \"../types\";\nimport { Link } from \"../Link\";\n\n/**\n * Minimal renderer for the `rich_text` objects embedded as table/plan/task_card cell values\n * (`{type:\"rich_text\", elements:[{type:\"rich_text_section\", elements:[...]}]}`). These blocks'\n * fixtures only ever use `text` and `link` leaf elements with basic styling, so this stays\n * self-contained rather than depending on the full `rich_text` block (owned separately).\n */\nexport function RichTextMini({ value }: { value: Json }) {\n if (!value || typeof value !== \"object\") return null;\n const elements = Array.isArray((value as Json).elements) ? (value as Json).elements : [];\n return (\n <>\n {(elements as Json[]).map((section, i) => (\n <RichTextMiniSection key={i} section={section} />\n ))}\n </>\n );\n}\n\nfunction RichTextMiniSection({ section }: { section: Json }) {\n const elements = Array.isArray(section.elements) ? (section.elements as Json[]) : [];\n return (\n <>\n {elements.map((el, i) => (\n <RichTextMiniLeaf key={i} element={el} />\n ))}\n </>\n );\n}\n\nfunction RichTextMiniLeaf({ element }: { element: Json }) {\n if (element.type === \"link\") {\n const text = typeof element.text === \"string\" ? element.text : String(element.url ?? \"\");\n return (\n <Link\n className=\"sbk-rtmini__link\"\n href={typeof element.url === \"string\" ? element.url : undefined}\n target=\"_blank\"\n rel=\"noreferrer noopener\"\n >\n {text}\n </Link>\n );\n }\n if (element.type !== \"text\") return null;\n const text = typeof element.text === \"string\" ? element.text : \"\";\n const style = (element.style ?? {}) as Json;\n let node: ReactNode = text;\n if (style.code) node = <code className=\"sbk-rtmini__code\">{node}</code>;\n if (style.bold) node = <b>{node}</b>;\n if (style.italic) node = <i>{node}</i>;\n if (style.strike) node = <s>{node}</s>;\n return <>{node}</>;\n}\n\n/** Plain-text extraction of a rich_text value, used for sorting table cells. */\nexport function richTextMiniToString(value: Json): string {\n if (!value || typeof value !== \"object\") return \"\";\n const elements = Array.isArray((value as Json).elements) ? (value as Json).elements : [];\n return (elements as Json[])\n .map((section) => {\n const leaves = Array.isArray(section.elements) ? (section.elements as Json[]) : [];\n return leaves.map((leaf) => (typeof leaf.text === \"string\" ? leaf.text : \"\")).join(\"\");\n })\n .join(\"\");\n}\n","import type { Json } from \"../types\";\nimport { RichTextMini, richTextMiniToString } from \"./richTextMini\";\nimport { Link } from \"../Link\";\n\n/** Renders a `data_table` cell: `raw_text`, `raw_number`, `url`, or `rich_text`. */\nexport function DataTableCell({ cell }: { cell: Json }) {\n if (!cell || typeof cell !== \"object\") return null;\n switch (cell.type) {\n case \"rich_text\":\n return <RichTextMini value={cell} />;\n case \"url\":\n return (\n <Link\n className=\"sbk-rtmini__link\"\n href={typeof cell.url === \"string\" ? cell.url : undefined}\n target=\"_blank\"\n rel=\"noreferrer noopener\"\n >\n {typeof cell.text === \"string\" ? cell.text : String(cell.url ?? \"\")}\n </Link>\n );\n case \"raw_number\":\n return <>{typeof cell.text === \"string\" ? cell.text : String(cell.value ?? \"\")}</>;\n default:\n return <>{typeof cell.text === \"string\" ? cell.text : \"\"}</>;\n }\n}\n\n/** The value a cell sorts by: a raw_number's numeric value, otherwise its plain text. */\nexport function dataTableSortValue(cell: Json | undefined): number | string {\n if (!cell || typeof cell !== \"object\") return \"\";\n if (cell.type === \"raw_number\" && typeof cell.value === \"number\") return cell.value;\n if (cell.type === \"rich_text\") return richTextMiniToString(cell).toLowerCase();\n if (typeof cell.text === \"string\") return cell.text.toLowerCase();\n return \"\";\n}\n","import { type ReactNode, useRef, useState } from \"react\";\nimport { ArrowDownIcon, ArrowUpIcon, MenuCheckIcon, SortCaretIcon } from \"../data/icons\";\nimport { Popover } from \"../elements/Popover\";\nimport { useMenuNavigation } from \"../elements/useMenuNavigation\";\n\nexport type SortDirection = \"asc\" | \"desc\";\n\nconst DIRECTIONS = [\n { direction: \"asc\", label: \"Ascending\", icon: <ArrowUpIcon /> },\n { direction: \"desc\", label: \"Descending\", icon: <ArrowDownIcon /> },\n] as const;\n\n/**\n * A sortable column header. As in Slack, pressing it opens a small \"Sort\" menu rather than sorting\n * straight away: Ascending and Descending, with the current one checked, and Clear Sort once this\n * column is the sorted one. The header itself shows no sort arrow; its caret only appears on hover.\n */\nexport function DataTableColumnHeader({\n label,\n sorted,\n onSort,\n}: {\n label: ReactNode;\n /** This column's direction, or null when the table is unsorted or sorted by another column. */\n sorted: SortDirection | null;\n onSort: (direction: SortDirection | null) => void;\n}) {\n const [open, setOpen] = useState(false);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const listRef = useRef<HTMLDivElement>(null);\n const choices: (SortDirection | null)[] = sorted ? [\"asc\", \"desc\", null] : [\"asc\", \"desc\"];\n\n function choose(direction: SortDirection | null) {\n setOpen(false);\n onSort(direction);\n }\n\n const nav = useMenuNavigation({\n open,\n count: choices.length,\n onChoose: (i) => choose(choices[i] ?? null),\n onClose: () => {\n setOpen(false);\n triggerRef.current?.focus();\n },\n onOpen: () => setOpen(true),\n listRef,\n });\n\n return (\n <div\n role=\"columnheader\"\n aria-sort={sorted === \"asc\" ? \"ascending\" : sorted === \"desc\" ? \"descending\" : \"none\"}\n className=\"sbk-data-table__col-header\"\n onKeyDown={nav.onKeyDown}\n >\n <button\n ref={triggerRef}\n type=\"button\"\n aria-haspopup=\"menu\"\n aria-expanded={open}\n onClick={() => setOpen((o) => !o)}\n >\n <span className=\"sbk-data-table__col-label\">{label}</span>\n <span className=\"sbk-data-table__sort-caret\">\n <SortCaretIcon />\n </span>\n </button>\n {open ? (\n <Popover anchorRef={triggerRef} gap={0} onDismiss={() => setOpen(false)}>\n <div className=\"sbk-data-table__sort-menu\" role=\"menu\" ref={listRef}>\n <div className=\"sbk-data-table__sort-heading\" role=\"presentation\">\n Sort\n </div>\n {DIRECTIONS.map(({ direction, label: itemLabel, icon }, i) => (\n <div\n key={direction}\n role=\"menuitemradio\"\n aria-checked={sorted === direction}\n className=\"sbk-data-table__sort-item\"\n onClick={() => choose(direction)}\n {...nav.itemProps(i)}\n >\n {sorted === direction ? (\n <span className=\"sbk-data-table__sort-check\">\n <MenuCheckIcon />\n </span>\n ) : null}\n <span className=\"sbk-data-table__sort-icon\">{icon}</span>\n {itemLabel}\n </div>\n ))}\n {sorted ? (\n <>\n <div className=\"sbk-data-table__sort-separator\" role=\"separator\" />\n <div\n role=\"menuitem\"\n className=\"sbk-data-table__sort-item sbk-data-table__sort-item--danger\"\n onClick={() => choose(null)}\n {...nav.itemProps(2)}\n >\n Clear Sort\n </div>\n </>\n ) : null}\n </div>\n </Popover>\n ) : null}\n </div>\n );\n}\n","import { useMemo, useState } from \"react\";\nimport { DataTableCell, dataTableSortValue } from \"../data/dataTableCells\";\nimport { ChevronIcon, ExpandIcon, KebabIcon, SearchIcon } from \"../data/icons\";\nimport type { BlockProps, Json } from \"../types\";\nimport { DataTableColumnHeader, type SortDirection } from \"./DataTableColumnHeader\";\n\ninterface DataTableBlock extends Json {\n type: \"data_table\";\n caption?: string;\n rows: Json[][];\n}\n\nconst PAGE_SIZE = 5;\n/** Height of a body row, which Slack uses to pad a short last page up to a full one. */\nconst ROW_HEIGHT = 48;\n\n/**\n * The `data_table` block: a caption, a sortable/paginated grid of cells (first row is the\n * header), and a small toolbar. Each column header opens a Sort menu (ascending, descending, or back to insertion order);\n * pagination kicks in above `PAGE_SIZE` data rows, matching Slack's Builder.\n */\nexport function DataTable({ block }: BlockProps<DataTableBlock>) {\n const rows = Array.isArray(block.rows) ? block.rows : [];\n const [header, ...body] = rows;\n const columnCount = header?.length ?? 0;\n\n const [sort, setSort] = useState<{ column: number; direction: SortDirection } | null>(null);\n const [page, setPage] = useState(0);\n\n const sortedBody = useMemo(() => {\n if (!sort) return body;\n const { column, direction } = sort;\n const withIndex = body.map((row, i) => ({ row, i }));\n withIndex.sort((a, b) => {\n const va = dataTableSortValue(a.row[column]);\n const vb = dataTableSortValue(b.row[column]);\n let cmp: number;\n if (typeof va === \"number\" && typeof vb === \"number\") cmp = va - vb;\n else cmp = String(va).localeCompare(String(vb));\n if (cmp === 0) cmp = a.i - b.i;\n return direction === \"asc\" ? cmp : -cmp;\n });\n return withIndex.map((entry) => entry.row);\n }, [body, sort]);\n\n const totalPages = Math.max(1, Math.ceil(sortedBody.length / PAGE_SIZE));\n const currentPage = Math.min(page, totalPages - 1);\n const visibleRows =\n sortedBody.length > PAGE_SIZE\n ? sortedBody.slice(currentPage * PAGE_SIZE, currentPage * PAGE_SIZE + PAGE_SIZE)\n : sortedBody;\n\n const sortColumn = (column: number, direction: SortDirection | null) => {\n setPage(0);\n setSort(direction ? { column, direction } : null);\n };\n\n // Slack's columns share the width but never shrink below 120px; past that the frame scrolls.\n const gridStyle = { gridTemplateColumns: `repeat(${columnCount}, minmax(120px, 1fr))` };\n\n return (\n <div className=\"sbk-data-table\">\n <div className=\"sbk-data-table__header\">\n {block.caption ? <span className=\"sbk-data-table__caption\">{block.caption}</span> : null}\n <div className=\"sbk-data-table__toolbar\">\n <button type=\"button\" className=\"sbk-data-table__icon-btn\" aria-label=\"Search table\">\n <SearchIcon />\n </button>\n <button\n type=\"button\"\n className=\"sbk-data-table__icon-btn\"\n aria-label={block.caption ? `View ${block.caption}` : \"View table\"}\n >\n <ExpandIcon />\n </button>\n <button type=\"button\" className=\"sbk-data-table__icon-btn\" aria-label=\"More actions\">\n <KebabIcon />\n </button>\n </div>\n </div>\n\n <div className=\"sbk-data-table__frame\">\n <div className=\"sbk-data-table__rows\" role=\"table\" aria-label={block.caption}>\n <div className=\"sbk-data-table__grid-header\" role=\"row\" style={gridStyle}>\n {header?.map((cell, i) => (\n <DataTableColumnHeader\n key={i}\n label={<DataTableCell cell={cell} />}\n sorted={sort?.column === i ? sort.direction : null}\n onSort={(direction) => sortColumn(i, direction)}\n />\n ))}\n </div>\n <div className=\"sbk-data-table__body\" role=\"rowgroup\">\n {visibleRows.map((row, r) => (\n <div key={r} className=\"sbk-data-table__row\" role=\"row\" style={gridStyle}>\n {row.map((cell, i) => (\n <div\n key={i}\n className=\"sbk-data-table__cell\"\n role={i === 0 ? \"rowheader\" : \"cell\"}\n >\n <div className=\"sbk-data-table__cell-content\">\n <span className=\"sbk-data-table__truncate\">\n <DataTableCell cell={cell} />\n </span>\n </div>\n </div>\n ))}\n </div>\n ))}\n </div>\n </div>\n\n {sortedBody.length > PAGE_SIZE && visibleRows.length < PAGE_SIZE ? (\n <div\n className=\"sbk-data-table__spacer\"\n style={{ height: (PAGE_SIZE - visibleRows.length) * ROW_HEIGHT }}\n />\n ) : null}\n {sortedBody.length > PAGE_SIZE ? (\n <div className=\"sbk-data-table__pagination\" aria-label=\"Pagination\">\n <button\n type=\"button\"\n className=\"sbk-data-table__page-nav\"\n aria-label=\"Previous page\"\n disabled={currentPage === 0}\n onClick={() => setPage((p) => Math.max(0, p - 1))}\n >\n <ChevronIcon direction=\"left\" />\n </button>\n {Array.from({ length: totalPages }, (_, i) => (\n <button\n key={i}\n type=\"button\"\n className={`sbk-data-table__page-btn${i === currentPage ? \" sbk-data-table__page-btn--active\" : \"\"}`}\n aria-label={String(i + 1)}\n onClick={() => setPage(i)}\n >\n {i + 1}\n </button>\n ))}\n <button\n type=\"button\"\n className=\"sbk-data-table__page-nav\"\n aria-label=\"Next page\"\n disabled={currentPage === totalPages - 1}\n onClick={() => setPage((p) => Math.min(totalPages - 1, p + 1))}\n >\n <ChevronIcon direction=\"right\" />\n </button>\n </div>\n ) : null}\n </div>\n </div>\n );\n}\n","/** Series/segment colours, in order, measured from Slack's Builder charts. */\nexport const CHART_COLORS = [\"#e96825\", \"#20a271\", \"#c474d3\", \"#0e9dd3\"];\n\n/**\n * Fill of a series' area, as a token per theme (DataVisualization.css, and Message.css for dark):\n * a light tint of the series colour, or a dark one.\n */\nexport function areaFillForIndex(i: number): string {\n return `var(--sbk-chart-area-${(i % CHART_COLORS.length) + 1})`;\n}\n\nexport function colorForIndex(i: number): string {\n return CHART_COLORS[i % CHART_COLORS.length] ?? \"#e96825\";\n}\n","/**\n * Smooth line through points, matching Slack's series curves: each point's tangent runs parallel to\n * its neighbours (flattened at peaks and troughs) and its handles are split in proportion to the\n * adjacent chord lengths, at a tension of 0.5. A handle that would rise or fall past its neighbour\n * has the tangent flattened until it stops level with it, so the curve never overshoots a point.\n * The end points use themselves as their outer handle.\n */\nexport function smoothLinePath(points: { x: number; y: number }[]): string {\n const first = points[0];\n if (!first) return \"\";\n const handles = points.map((p, i) => {\n const prev = points[i - 1];\n const next = points[i + 1];\n if (!prev || !next) return { in: p, out: p };\n const d01 = Math.hypot(p.x - prev.x, p.y - prev.y);\n const d12 = Math.hypot(next.x - p.x, next.y - p.y);\n const total = d01 + d12 || 1;\n const fa = (0.5 * d01) / total;\n const fb = (0.5 * d12) / total;\n const extremum = (p.y - prev.y) * (next.y - p.y) <= 0;\n const dx = next.x - prev.x;\n let dy = extremum ? 0 : next.y - prev.y;\n if (dy !== 0) {\n const room = Math.min(\n Math.abs(p.y - prev.y) / Math.abs(fa * dy),\n Math.abs(next.y - p.y) / Math.abs(fb * dy),\n );\n if (room < 1) dy *= room;\n }\n return {\n in: { x: p.x - fa * dx, y: p.y - fa * dy },\n out: { x: p.x + fb * dx, y: p.y + fb * dy },\n };\n });\n let d = `M${first.x} ${first.y}`;\n for (let i = 1; i < points.length; i++) {\n const p = points[i];\n const c1 = handles[i - 1]?.out;\n const c2 = handles[i]?.in;\n if (!p || !c1 || !c2) continue;\n d += `C${c1.x} ${c1.y} ${c2.x} ${c2.y} ${p.x} ${p.y}`;\n }\n return d;\n}\n\n/** A bar with the two corners on its outer end (top when positive, bottom when negative) rounded. */\nexport function roundedBarPath(\n x: number,\n yTop: number,\n width: number,\n yBottom: number,\n radius: number,\n roundTop: boolean,\n): string {\n const r = Math.min(radius, width / 2, Math.abs(yBottom - yTop));\n if (roundTop) {\n return `M${x} ${yTop + r}A${r} ${r} 0 0 1 ${x + r} ${yTop}L${x + width - r} ${yTop}A${r} ${r} 0 0 1 ${x + width} ${yTop + r}L${x + width} ${yBottom}L${x} ${yBottom}Z`;\n }\n return `M${x} ${yTop}L${x + width} ${yTop}L${x + width} ${yBottom - r}A${r} ${r} 0 0 1 ${x + width - r} ${yBottom}L${x + r} ${yBottom}A${r} ${r} 0 0 1 ${x} ${yBottom - r}Z`;\n}\n","/**\n * Linear \"nice tick\" scale for the chart y-axis, reverse-engineered from Slack's Builder:\n * it always aims for ~6 intervals, picking the smallest step from {1, 2, 3, 5, 10} * 10^n\n * that covers the data range, and always includes 0.\n */\nexport interface NiceScale {\n min: number;\n max: number;\n step: number;\n ticks: number[];\n}\n\nconst STEP_CANDIDATES = [1, 2, 3, 5, 10];\n\nfunction niceStep(rawStep: number): number {\n if (rawStep <= 0) return 1;\n const mag = 10 ** Math.floor(Math.log10(rawStep));\n const norm = rawStep / mag;\n const candidate = STEP_CANDIDATES.find((c) => c >= norm - 1e-9) ?? 10;\n return candidate * mag;\n}\n\nexport function niceLinearScale(dataMin: number, dataMax: number, targetIntervals = 6): NiceScale {\n const min = Math.min(0, dataMin);\n const max = Math.max(0, dataMax === dataMin ? dataMin + 1 : dataMax);\n const step = niceStep((max - min) / targetIntervals);\n const niceMin = Math.floor(min / step) * step;\n const niceMax = Math.ceil(max / step) * step;\n const ticks: number[] = [];\n for (let v = niceMin; v <= niceMax + step * 1e-6; v += step) {\n ticks.push(Math.round(v / step) * step);\n }\n return { min: niceMin, max: niceMax, step, ticks };\n}\n\n/** Matches Slack's `1,200`-style tick labels. */\nexport function formatTick(value: number): string {\n return value.toLocaleString(\"en-US\");\n}\n\n/**\n * Where Slack's chart library draws a 1px horizontal line meant for `y`: the nearest half pixel, so\n * the stroke fills exactly one pixel row, rounding up when `y` sits on a row boundary.\n */\nexport function crispLine(y: number): number {\n const doubled = Math.round(y * 2);\n return doubled % 2 === 1 ? doubled / 2 : (doubled + 1) / 2;\n}\n","import { useEffect, useRef, useState } from \"react\";\n\n/** Tracks a container's content width via ResizeObserver, so charts can lay out to the real width. */\nexport function useContainerWidth(fallback: number) {\n const ref = useRef<HTMLDivElement | null>(null);\n const [width, setWidth] = useState(fallback);\n\n useEffect(() => {\n const el = ref.current;\n // jsdom (used in tests) has no ResizeObserver; fall back to the static width there.\n if (!el || typeof ResizeObserver === \"undefined\") return;\n const observer = new ResizeObserver((entries) => {\n const w = entries[0]?.contentRect.width;\n if (w) setWidth(w);\n });\n observer.observe(el);\n return () => observer.disconnect();\n }, []);\n\n return { ref, width };\n}\n","import { areaFillForIndex, colorForIndex } from \"./palette\";\nimport { roundedBarPath, smoothLinePath } from \"./paths\";\nimport { crispLine, formatTick, niceLinearScale } from \"./scale\";\nimport { useContainerWidth } from \"./useContainerWidth\";\n\nexport interface ChartSeries {\n name: string;\n data: { label: string; value: number }[];\n}\n\nconst HEIGHT = 360;\nconst PLOT_TOP = 9;\nconst PLOT_BOTTOM = 334;\nconst LABELS_Y = 342;\n\n// Measured across every reference fixture — from 2-digit negative deltas (\"-2\") to 5-character\n// values (\"1,800\") — Slack always reserves a fixed 74px gutter for the y-axis label + tick\n// numbers, rather than sizing it to the tick text. `ticks` is kept as a parameter so a future\n// fixture with unusually long labels can widen this without changing every call site.\nfunction leftMarginFor(ticks: number[]): number {\n const maxLen = Math.max(...ticks.map((t) => formatTick(t).length), 1);\n return Math.max(74, 34 + maxLen * 8);\n}\n\nexport function CartesianChart({\n type,\n series,\n categories,\n}: {\n type: \"line\" | \"area\" | \"bar\";\n series: ChartSeries[];\n categories: string[];\n}) {\n const { ref, width } = useContainerWidth(406);\n const allValues = series.flatMap((s) => s.data.map((d) => d.value));\n const scale = niceLinearScale(Math.min(0, ...allValues), Math.max(0, ...allValues));\n const leftMargin = leftMarginFor(scale.ticks);\n // Slack's line and area plots stop 10.7675px short of the edge, leaving room for half the last\n // category label; bars fill the width.\n const rightMargin = type === \"bar\" ? 0 : 10.7675;\n const plotLeft = leftMargin;\n const plotRight = Math.max(plotLeft + 1, width - rightMargin);\n const plotWidth = plotRight - plotLeft;\n\n const y = (v: number) =>\n PLOT_BOTTOM - ((v - scale.min) / (scale.max - scale.min)) * (PLOT_BOTTOM - PLOT_TOP);\n const zeroY = y(0);\n\n const n = categories.length;\n const bandWidth = n > 0 ? plotWidth / n : plotWidth;\n const pointX = (i: number) =>\n n > 1 ? plotLeft + (i * plotWidth) / (n - 1) : plotLeft + plotWidth / 2;\n const bandCenterX = (i: number) => plotLeft + bandWidth * (i + 0.5);\n\n // Measured from Slack's Builder: a lone bar occupies ~69% of its category band, while a\n // grouped set of bars (with a small gap scaling with bar width) occupies ~73%.\n const groupWidth = bandWidth * (series.length > 1 ? 0.73 : 0.69);\n const barGapRatio = 0.1;\n const barWidth =\n series.length > 0\n ? Math.max(1, groupWidth / (series.length + (series.length - 1) * barGapRatio))\n : 0;\n const barGap = barWidth * barGapRatio;\n\n return (\n <div className=\"sbk-chart\" ref={ref}>\n <svg\n className=\"sbk-chart__svg\"\n width={width}\n height={HEIGHT}\n viewBox={`0 0 ${width} ${HEIGHT}`}\n role=\"img\"\n aria-label=\"Chart\"\n >\n <g>\n {scale.ticks.map((t) => (\n <line\n key={t}\n x1={plotLeft}\n x2={plotRight}\n y1={crispLine(y(t))}\n y2={crispLine(y(t))}\n stroke=\"rgba(94,93,96,0.13)\"\n />\n ))}\n {/* Slack draws the x axis over the zero gridline, darkening it. */}\n <line\n className=\"sbk-chart__axis\"\n x1={plotLeft}\n x2={plotRight}\n y1={crispLine(zeroY)}\n y2={crispLine(zeroY)}\n stroke=\"rgba(94,93,96,0.13)\"\n strokeLinecap=\"round\"\n />\n {scale.ticks.map((t) => (\n <text\n key={t}\n transform={`translate(${plotLeft - 8} ${y(t)})`}\n textAnchor=\"end\"\n dominantBaseline=\"central\"\n className=\"sbk-chart__tick\"\n >\n {formatTick(t)}\n </text>\n ))}\n {categories.map((c, i) => (\n <text\n key={c}\n transform={`translate(${type === \"bar\" ? bandCenterX(i) : pointX(i)} ${LABELS_Y})`}\n y={9}\n textAnchor=\"middle\"\n dominantBaseline=\"central\"\n className=\"sbk-chart__tick\"\n >\n {c}\n </text>\n ))}\n\n {type === \"bar\"\n ? series.map((s, si) =>\n s.data.map((d, i) => {\n const x = bandCenterX(i) - groupWidth / 2 + si * (barWidth + barGap);\n const positive = d.value >= 0;\n const top = positive ? y(d.value) : zeroY;\n const bottom = positive ? zeroY : y(d.value);\n return (\n <path\n key={`${si}-${i}`}\n d={roundedBarPath(x, top, barWidth, bottom, 4, positive)}\n fill={colorForIndex(si)}\n />\n );\n }),\n )\n : series.map((s, si) => {\n const points = s.data.map((d, i) => ({ x: pointX(i), y: y(d.value) }));\n const color = colorForIndex(si);\n return (\n <g key={si}>\n {type === \"area\" ? (\n <path\n d={`${smoothLinePath(points)}L${points[points.length - 1]?.x ?? 0} ${zeroY}L${points[0]?.x ?? 0} ${zeroY}Z`}\n style={{ fill: areaFillForIndex(si) }}\n fillOpacity={0.7}\n />\n ) : null}\n <path\n d={smoothLinePath(points)}\n fill=\"none\"\n stroke={color}\n strokeWidth={2}\n strokeLinejoin=\"bevel\"\n />\n </g>\n );\n })}\n </g>\n </svg>\n </div>\n );\n}\n","import { colorForIndex } from \"./palette\";\n\nexport interface PieSegment {\n label: string;\n value: number;\n}\n\nconst WIDTH = 406;\n/** Builder's pie plot area is 406×360, not square, with the pie centred in it. */\nconst HEIGHT = 360;\nconst CENTER = { x: 203, y: 180 };\nconst RADIUS = 144;\n\n/** Point on the pie's circle for a given angle in degrees, measured clockwise from 12 o'clock. */\nfunction pointAt(angleDeg: number) {\n const rad = ((angleDeg - 90) * Math.PI) / 180;\n return { x: CENTER.x + RADIUS * Math.cos(rad), y: CENTER.y + RADIUS * Math.sin(rad) };\n}\n\nfunction segmentPath(startAngle: number, endAngle: number): string {\n const sweep = endAngle - startAngle;\n const start = pointAt(startAngle);\n const end = pointAt(endAngle);\n const largeArc = sweep > 180 ? 1 : 0;\n if (sweep >= 359.999) {\n // A full circle, drawn as Slack's chart library does: one arc stopping 1e-4 rad short of its\n // start, with no edge to the centre (which would show as a white seam under the stroke).\n const stop = pointAt(startAngle + 360 - (1e-4 * 180) / Math.PI);\n const r4 = (n: number) => Math.round(n * 1e4) / 1e4;\n return `M${r4(start.x)} ${r4(start.y)}A${RADIUS} ${RADIUS} 0 1 1 ${r4(stop.x)} ${r4(stop.y)}Z`;\n }\n return `M${CENTER.x} ${CENTER.y}L${start.x} ${start.y}A${RADIUS} ${RADIUS} 0 ${largeArc} 1 ${end.x} ${end.y}Z`;\n}\n\nexport function PieChart({ segments }: { segments: PieSegment[] }) {\n const total = segments.reduce((sum, s) => sum + Math.max(0, s.value), 0);\n let angle = 0;\n const arcs = segments.map((segment, i) => {\n const value = Math.max(0, segment.value);\n const sweep = total > 0 ? (value / total) * 360 : 0;\n const start = angle;\n const end = angle + sweep;\n angle = end;\n return { key: i, d: segmentPath(start, end), color: colorForIndex(i) };\n });\n\n return (\n <svg\n className=\"sbk-chart__svg sbk-chart__svg--pie\"\n width={WIDTH}\n height={HEIGHT}\n viewBox={`0 0 ${WIDTH} ${HEIGHT}`}\n role=\"img\"\n aria-label=\"Pie chart\"\n >\n {arcs.map((arc) => (\n <path\n key={arc.key}\n d={arc.d}\n fill={arc.color}\n stroke=\"#fff\"\n strokeWidth={2}\n strokeLinejoin=\"round\"\n />\n ))}\n </svg>\n );\n}\n","import { type ReactNode, type RefObject, useEffect, useRef, useState } from \"react\";\nimport { useMenuNavigation } from \"../elements/useMenuNavigation\";\nimport { CopyIcon, DownloadIcon, EllipsisVerticalIcon, OpenInWindowIcon } from \"../icons\";\nimport { Tooltip } from \"../Tooltip\";\n\nexport interface HoverMenuItem {\n label: string;\n onSelect: () => void;\n}\n\nexport interface HoverAction {\n /** Tooltip and accessible name, e.g. \"Copy table\". */\n label: string;\n icon: ReactNode;\n onClick?: () => void;\n /** Renders the action as a link (e.g. \"Open in new window\"). */\n href?: string;\n /** Opens a `c-menu` of further actions (Slack's \"More actions\"). */\n menu?: HoverMenuItem[];\n}\n\n/**\n * Slack's `c-message_actions__group` pinned to the top-right of a table, image or chart: a white\n * 12px-radius pill of 32px icon buttons that fades in while its host is hovered or focused.\n * The host needs the `sbk-hover-actions-host` class.\n */\nexport function HoverActions({\n actions,\n className,\n}: {\n actions: HoverAction[];\n className?: string;\n}) {\n return (\n <div className={`sbk-hover-actions${className ? ` ${className}` : \"\"}`} role=\"group\">\n {actions.map((action) =>\n action.menu ? (\n <MenuAction key={action.label} action={action} items={action.menu} />\n ) : (\n <Tooltip key={action.label} label={action.label}>\n {action.href ? (\n <a\n className=\"sbk-hover-actions__button\"\n href={action.href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n aria-label={action.label}\n >\n {action.icon}\n </a>\n ) : (\n <button\n type=\"button\"\n className=\"sbk-hover-actions__button\"\n aria-label={action.label}\n onClick={action.onClick}\n >\n {action.icon}\n </button>\n )}\n </Tooltip>\n ),\n )}\n </div>\n );\n}\n\nfunction MenuAction({ action, items }: { action: HoverAction; items: HoverMenuItem[] }) {\n const [open, setOpen] = useState(false);\n const rootRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const listRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!open) return;\n const onDocClick = (e: MouseEvent) => {\n if (rootRef.current && !rootRef.current.contains(e.target as Node)) setOpen(false);\n };\n document.addEventListener(\"mousedown\", onDocClick);\n return () => document.removeEventListener(\"mousedown\", onDocClick);\n }, [open]);\n\n function choose(i: number) {\n setOpen(false);\n items[i]?.onSelect();\n }\n\n const nav = useMenuNavigation({\n open,\n count: items.length,\n onChoose: choose,\n onClose: () => {\n setOpen(false);\n triggerRef.current?.focus();\n },\n onOpen: () => setOpen(true),\n listRef,\n });\n\n return (\n <div className=\"sbk-hover-actions__menu-root\" ref={rootRef} onKeyDown={nav.onKeyDown}>\n <Tooltip label={open ? \"\" : action.label}>\n <button\n ref={triggerRef}\n type=\"button\"\n className=\"sbk-hover-actions__button\"\n aria-label={action.label}\n aria-haspopup=\"menu\"\n aria-expanded={open}\n onClick={() => setOpen((o) => !o)}\n >\n {action.icon}\n </button>\n </Tooltip>\n {open && (\n <div className=\"sbk-overflow__menu sbk-hover-actions__menu\" role=\"menu\" ref={listRef}>\n {items.map((item, i) => (\n <div\n key={item.label}\n role=\"menuitem\"\n className=\"sbk-overflow__option\"\n onClick={() => choose(i)}\n {...nav.itemProps(i)}\n >\n {item.label}\n </div>\n ))}\n </div>\n )}\n </div>\n );\n}\n\n/** Reads a rendered `<table>` into rows of cell text. */\nexport function tableRows(table: HTMLTableElement | null): string[][] {\n if (!table) return [];\n return Array.from(table.rows, (row) =>\n Array.from(row.cells, (cell) => (cell.textContent ?? \"\").trim()),\n );\n}\n\nfunction csvCell(value: string): string {\n return /[\",\\n]/.test(value) ? `\"${value.replace(/\"/g, '\"\"')}\"` : value;\n}\n\nexport function toCsv(rows: string[][]): string {\n return rows.map((row) => row.map(csvCell).join(\",\")).join(\"\\n\");\n}\n\nexport function toTsv(rows: string[][]): string {\n return rows.map((row) => row.join(\"\\t\")).join(\"\\n\");\n}\n\nexport function copyText(text: string) {\n void navigator.clipboard?.writeText(text).catch(() => {});\n}\n\n/** Saves `text` as a file via a temporary object-URL link. */\nexport function downloadText(filename: string, text: string, type = \"text/csv\") {\n const url = URL.createObjectURL(new Blob([text], { type }));\n const link = document.createElement(\"a\");\n link.href = url;\n link.download = filename;\n link.click();\n setTimeout(() => URL.revokeObjectURL(url), 0);\n}\n\n/** Slack's table actions: \"Download table\" (CSV) and \"Copy table\" (tab-separated, pastes into\n * spreadsheets). Reads the rendered table so rich cells export as their visible text. */\nexport function TableActions({ tableRef }: { tableRef: RefObject<HTMLTableElement | null> }) {\n return (\n <HoverActions\n actions={[\n {\n label: \"Download table\",\n icon: <DownloadIcon />,\n onClick: () => downloadText(\"table.csv\", toCsv(tableRows(tableRef.current))),\n },\n {\n label: \"Copy table\",\n icon: <CopyIcon />,\n onClick: () => copyText(toTsv(tableRows(tableRef.current))),\n },\n ]}\n />\n );\n}\n\n/** Slack's `p-attachment_image_actions`: open the full image in a new window, plus a menu. */\nexport function ImageActions({ url }: { url: string }) {\n return (\n <HoverActions\n className=\"sbk-hover-actions--image\"\n actions={[\n { label: \"Open in new window\", icon: <OpenInWindowIcon />, href: url },\n {\n label: \"More actions\",\n icon: <EllipsisVerticalIcon />,\n menu: [\n { label: \"Copy link to image\", onSelect: () => copyText(url) },\n {\n label: \"Download image\",\n onSelect: () => {\n const link = document.createElement(\"a\");\n link.href = url;\n link.download = \"\";\n link.target = \"_blank\";\n link.rel = \"noopener noreferrer\";\n link.click();\n },\n },\n ],\n },\n ]}\n />\n );\n}\n\n/** A chart's single \"More actions\" menu, exporting its underlying data. */\nexport function ChartActions({ rows, title }: { rows: string[][]; title?: string }) {\n const name = `${(title || \"chart\").replace(/[^\\w-]+/g, \"_\")}.csv`;\n return (\n <HoverActions\n className=\"sbk-hover-actions--chart\"\n actions={[\n {\n label: \"More actions\",\n icon: <EllipsisVerticalIcon />,\n menu: [\n { label: \"Copy data\", onSelect: () => copyText(toTsv(rows)) },\n { label: \"Download as CSV\", onSelect: () => downloadText(name, toCsv(rows)) },\n ],\n },\n ]}\n />\n );\n}\n","import { CartesianChart, type ChartSeries } from \"../charts/CartesianChart\";\nimport { PieChart } from \"../charts/PieChart\";\nimport { colorForIndex } from \"../charts/palette\";\nimport { ChartActions } from \"../data/HoverActions\";\nimport type { BlockProps, Json } from \"../types\";\n\ninterface AxisConfig {\n categories?: string[];\n x_label?: string;\n y_label?: string;\n}\n\ninterface Chart extends Json {\n type: \"line\" | \"area\" | \"bar\" | \"pie\";\n series?: ChartSeries[];\n segments?: { label: string; value: number }[];\n axis_config?: AxisConfig;\n}\n\ninterface DataVisualizationBlock extends Json {\n type: \"data_visualization\";\n title?: string;\n chart: Chart;\n}\n\n/** The chart's data as a table: a label column plus one column per series (or a value column). */\nfunction chartRows(chart: Chart, categories: string[]): string[][] {\n if (chart.type === \"pie\") {\n return [[\"Label\", \"Value\"], ...(chart.segments ?? []).map((s) => [s.label, String(s.value)])];\n }\n const series = chart.series ?? [];\n return [\n [chart.axis_config?.x_label ?? \"\", ...series.map((s) => s.name)],\n ...categories.map((label, i) => [\n label,\n ...series.map((s) =>\n String(s.data.find((d) => d.label === label)?.value ?? s.data[i]?.value ?? \"\"),\n ),\n ]),\n ];\n}\n\nfunction legendEntries(chart: Chart): { name: string; color: string }[] {\n if (chart.type === \"pie\") {\n return (chart.segments ?? []).map((s, i) => ({ name: s.label, color: colorForIndex(i) }));\n }\n return (chart.series ?? []).map((s, i) => ({ name: s.name, color: colorForIndex(i) }));\n}\n\nexport function DataVisualization({ block }: BlockProps<DataVisualizationBlock>) {\n const chart = block.chart;\n if (!chart) return null;\n const isPie = chart.type === \"pie\";\n const categories =\n chart.axis_config?.categories ?? chart.series?.[0]?.data.map((d) => d.label) ?? [];\n const legend = legendEntries(chart);\n\n return (\n <div className=\"sbk-dataviz sbk-hover-actions-host\">\n {block.title ? <h3 className=\"sbk-dataviz__title\">{block.title}</h3> : null}\n <div className={isPie ? \"sbk-dataviz__body sbk-dataviz__body--pie\" : \"sbk-dataviz__body\"}>\n {!isPie && chart.axis_config?.y_label ? (\n <div className=\"sbk-dataviz__y-label\">{chart.axis_config.y_label}</div>\n ) : null}\n {chart.type === \"pie\" ? (\n <PieChart segments={chart.segments ?? []} />\n ) : (\n <CartesianChart type={chart.type} series={chart.series ?? []} categories={categories} />\n )}\n </div>\n {!isPie && chart.axis_config?.x_label ? (\n <div className=\"sbk-dataviz__x-label\">{chart.axis_config.x_label}</div>\n ) : null}\n {legend.length > 0 ? (\n <div\n className={isPie ? \"sbk-dataviz__legend sbk-dataviz__legend--pie\" : \"sbk-dataviz__legend\"}\n >\n {legend.map((entry) => (\n <span key={entry.name} className=\"sbk-dataviz__legend-entry\">\n <span className=\"sbk-dataviz__legend-dot\" style={{ backgroundColor: entry.color }} />\n {entry.name}\n </span>\n ))}\n </div>\n ) : null}\n <ChartActions rows={chartRows(chart, categories)} title={block.title} />\n </div>\n );\n}\n","import type { BlockProps } from \"../types\";\n\nexport function Divider(_props: BlockProps) {\n return <hr className=\"sbk-divider\" />;\n}\n","import type { BlockProps, Json } from \"../types\";\nimport { Block } from \"./Block\";\n\n/**\n * The Block Kit \"fallback\" convention: a block type this renderer doesn't know renders its\n * producer-supplied `fallback` blocks in place instead of being dropped. `fallback_canary` is a\n * synthetic type used to test that convention itself (see `catalog/reference/fallback-canary`);\n * an unrecognized real block type with a `fallback` array should be handled the same way, but\n * this library's registry always maps a known type, so the canary is what exercises the path.\n *\n * Slack renders the whole fallback list inside the one block wrapper it gave the unknown block,\n * and that wrapper is a flex row, so the fallback blocks sit side by side rather than stacking.\n */\nexport function FallbackCanary({ block }: BlockProps) {\n const fallback = ((block as Json).fallback as Json[] | undefined) ?? [];\n return (\n <div className=\"sbk-fallback-canary\">\n {fallback.map((child, i) => (\n <Block key={(child.block_id as string | undefined) ?? i} block={child} index={i} />\n ))}\n </div>\n );\n}\n","import type { BlockProps, Json } from \"../types\";\n\nfunction FileIcon() {\n return (\n <svg viewBox=\"0 0 24 24\" width=\"24\" height=\"24\" aria-hidden=\"true\">\n <path\n d=\"M6 2h9l5 5v15a1 1 0 0 1-1 1H6a1 1 0 0 1-1-1V3a1 1 0 0 1 1-1z\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n />\n <path d=\"M15 2v5h5\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n </svg>\n );\n}\n\n/**\n * The `file` block only ever references a remote file by `external_id` (`source: \"remote\"`).\n * Slack resolves it via an app's `files.remote` integration, which we can't call, so this is a\n * generic placeholder card carrying the id — there's no Builder fixture to match against.\n */\nexport function File({ block }: BlockProps) {\n const json = block as Json;\n const externalId = typeof json.external_id === \"string\" ? json.external_id : \"unknown\";\n const source = typeof json.source === \"string\" ? json.source : \"remote\";\n\n return (\n <div className=\"sbk-file\">\n <span className=\"sbk-file__icon\">\n <FileIcon />\n </span>\n <div className=\"sbk-file__body\">\n <span className=\"sbk-file__name\">{externalId}</span>\n <span className=\"sbk-file__meta\">{source} file</span>\n </div>\n </div>\n );\n}\n","import type { HeaderBlock } from \"@slack/types\";\nimport { Text } from \"../Text\";\nimport type { BlockProps } from \"../types\";\n\n/** Builder-only field: renders the header at one of 4 scales. Defaults to 2 (Slack's standard size). */\ntype HeaderBlockWithLevel = HeaderBlock & { level?: 1 | 2 | 3 | 4 };\n\nconst TAGS = { 1: \"h1\", 2: \"h2\", 3: \"h3\", 4: \"h4\" } as const;\n\nexport function Header({ block }: BlockProps<HeaderBlockWithLevel>) {\n const level = block.level ?? 2;\n const Tag = TAGS[level];\n return (\n <Tag className={`sbk-header sbk-header--level-${level}`}>\n <Text text={block.text} />\n </Tag>\n );\n}\n","import type { ImageBlock } from \"@slack/types\";\nimport { useState } from \"react\";\nimport { ImageActions } from \"../data/HoverActions\";\nimport { Text } from \"../Text\";\nimport type { BlockProps, Json } from \"../types\";\n\n/**\n * The caret Slack shows after an image's file-size caption: its icon font's filled triangle,\n * pointing down while shown and right while hidden. Paths are the font's glyphs (2000 units to the\n * em, 1700 above the baseline), so they sit in the 15px box exactly as Slack's glyph does.\n */\nconst CARET_GLYPHS = {\n down: \"M1410 911C1463 971 1427 1050 1348 1050H652C573 1050 537 971 590 911L937 521C972 481 1028 481 1063 521Z\",\n right:\n \"M1279 687C1319 722 1319 778 1279 813L889 1160C829 1213 750 1177 750 1098V402C750 323 829 287 889 340Z\",\n};\n\nfunction ExpandCaret({ expanded }: { expanded: boolean }) {\n return (\n <svg\n className={expanded ? \"sbk-image__caret\" : \"sbk-image__caret sbk-image__caret--collapsed\"}\n viewBox=\"0 0 2000 2000\"\n aria-hidden=\"true\"\n >\n <path\n transform=\"matrix(1 0 0 -1 0 1700)\"\n fill=\"currentColor\"\n d={expanded ? CARET_GLYPHS.down : CARET_GLYPHS.right}\n />\n </svg>\n );\n}\n\n/**\n * `image_url` renders directly. `slack_file` references a file in a workspace's file store —\n * without an authenticated `files.info` call we can't resolve it to a URL, so we render the\n * documented fallback (alt text in a placeholder box) instead of a broken `<img>`.\n *\n * Slack always shows a title row above the image with an expand caret and a \"(N kB)\" file-size\n * caption — the caption comes from fetching the file's real bytes, which isn't available to us\n * without a network round-trip, so we render the row (title + caret) but omit the byte count.\n * Keeping the row's height/spacing matches Slack's vertical rhythm even where the text differs.\n *\n * The caret is a toggle, as in Slack: pressing it hides the image (instantly, no animation) and\n * leaves only the title row, and pressing it again brings the image back.\n */\nexport function Image({ block }: BlockProps<ImageBlock>) {\n const json = block as unknown as Json;\n const imageUrl = \"image_url\" in block ? block.image_url : undefined;\n const slackFile = json.slack_file as { url?: string; id?: string } | undefined;\n const [expanded, setExpanded] = useState(true);\n\n return (\n <figure className=\"sbk-image\">\n {imageUrl && (\n <div className=\"sbk-image__title\">\n {block.title && (\n <span className=\"sbk-image__title-text\">\n <Text text={block.title} />\n </span>\n )}\n <span className=\"sbk-image__trigger\">\n {\" \"}\n <button\n type=\"button\"\n className=\"sbk-image__toggle\"\n aria-label=\"image\"\n aria-expanded={expanded}\n title={expanded ? \"Collapse\" : \"Expand\"}\n onClick={() => setExpanded((value) => !value)}\n >\n <ExpandCaret expanded={expanded} />\n </button>\n </span>\n </div>\n )}\n {expanded && (\n <div\n className=\"sbk-image__frame sbk-hover-actions-host\"\n style={imageUrl ? { backgroundImage: `url(${JSON.stringify(imageUrl)})` } : undefined}\n >\n {imageUrl ? (\n <img className=\"sbk-image__img\" src={imageUrl} alt={block.alt_text} />\n ) : (\n <div className=\"sbk-image__fallback\" role=\"img\" aria-label={block.alt_text}>\n <span className=\"sbk-image__fallback-text\">\n {slackFile ? \"Slack file image unavailable\" : block.alt_text}\n </span>\n </div>\n )}\n {imageUrl && <ImageActions url={imageUrl} />}\n </div>\n )}\n </figure>\n );\n}\n","import type { InputBlock } from \"@slack/types\";\nimport { useId } from \"react\";\nimport { SuppressActions, useBlockKit } from \"../context\";\nimport { Element } from \"../elements/Element\";\nimport { InputBlockContext, InputErrorContext } from \"../elements/inputBlockContext\";\nimport { ReturnIcon } from \"../icons\";\nimport { Text } from \"../Text\";\nimport type { BlockProps, Json } from \"../types\";\n\nconst TEXT_INPUT_TYPES = new Set([\n \"plain_text_input\",\n \"email_text_input\",\n \"url_text_input\",\n \"number_input\",\n]);\n\n/** Slack's Builder preview synthesizes a \"Press 'enter' to submit\" hint below a single-line text\n * input whose owning `input` block dispatches on the (default) `on_enter_pressed` trigger, when\n * the block doesn't already carry its own explicit `hint`. It does NOT synthesize anything for\n * `on_character_entered`-only dispatch, or for multiline inputs (Enter inserts a newline there). */\nfunction dispatchHint(block: InputBlock): boolean {\n if (block.dispatch_action !== true || block.hint) return false;\n const element = block.element as Json;\n if (typeof element.type !== \"string\" || !TEXT_INPUT_TYPES.has(element.type)) return false;\n if (element.multiline === true) return false;\n const config = element.dispatch_action_config as { trigger_actions_on?: string[] } | undefined;\n const triggers = config?.trigger_actions_on ?? [\"on_enter_pressed\"];\n return triggers.includes(\"on_enter_pressed\");\n}\n\n/**\n * Slack's form field wrapper: label (+\"(optional)\" suffix), the element itself, an optional hint\n * below it, and a validation error (from `errors[block_id]`, as returned by `response_action:\n * \"errors\"`) shown in red beneath everything. Without `dispatch_action` the element sends no\n * `block_actions`, as in Slack. The flag is also stamped onto the element as an internal\n * `__dispatchAction` field, since text inputs need it to pick their triggers.\n */\nexport function Input({ block, blockId }: BlockProps<InputBlock>) {\n const { errors, surface } = useBlockKit();\n const element = { ...(block.element as Json), __dispatchAction: block.dispatch_action === true };\n const error = errors[blockId];\n const errorId = useId();\n const showDispatchHint = dispatchHint(block);\n // Slack's Builder preview never shows the \"(optional)\" suffix on the message-surface preview\n // (an `input` block there only ever appears inside a workflow step, where it's implied); it\n // only renders it for a modal/Home tab form.\n const showOptional = block.optional && surface !== \"message\";\n\n return (\n <div className={`sbk-input${error ? \" sbk-input--error\" : \"\"}`}>\n <div className=\"sbk-input__label\">\n <Text text={block.label} />\n {showOptional && <span className=\"sbk-input__optional\"> (optional)</span>}\n </div>\n <div className=\"sbk-input__element\">\n <InputBlockContext.Provider value={true}>\n <InputErrorContext.Provider value={error ? errorId : undefined}>\n {block.dispatch_action === true ? (\n <Element element={element} blockId={blockId} />\n ) : (\n <SuppressActions>\n <Element element={element} blockId={blockId} />\n </SuppressActions>\n )}\n </InputErrorContext.Provider>\n </InputBlockContext.Provider>\n </div>\n {block.hint && (\n <div className=\"sbk-input__hint\">\n <span className=\"sbk-input__hint-text\">\n <Text text={block.hint} />\n </span>\n </div>\n )}\n {showDispatchHint && (\n <div className=\"sbk-input__hint\">\n <span className=\"sbk-input__hint-text sbk-input__hint-text--dispatch\">\n <span className=\"sbk-input__hint-icon\">\n <ReturnIcon />\n </span>{\" \"}\n Press 'enter' to submit\n </span>\n </div>\n )}\n {error && (\n <div className=\"sbk-input__error\" id={errorId}>\n {error}\n </div>\n )}\n </div>\n );\n}\n","/**\n * Shared \"code snippet\" chrome used both by a `rich_text_preformatted` element that carries a\n * Builder-only `language` field, and by the Markdown block's fenced code blocks. Slack renders\n * these as a rounded card with a language label + copy button header, and a horizontally\n * scrolling, non-wrapping code area where each source line is its own line-box.\n */\n\nimport { CopyIcon } from \"../icons\";\n\nconst LANGUAGE_LABELS: Record<string, string> = {\n js: \"JavaScript\",\n javascript: \"JavaScript\",\n jsx: \"JavaScript\",\n ts: \"TypeScript\",\n typescript: \"TypeScript\",\n tsx: \"TypeScript\",\n py: \"Python\",\n python: \"Python\",\n rb: \"Ruby\",\n ruby: \"Ruby\",\n go: \"Go\",\n golang: \"Go\",\n rs: \"Rust\",\n rust: \"Rust\",\n java: \"Java\",\n kotlin: \"Kotlin\",\n swift: \"Swift\",\n php: \"PHP\",\n c: \"C\",\n cpp: \"C++\",\n \"c++\": \"C++\",\n csharp: \"C#\",\n \"c#\": \"C#\",\n cs: \"C#\",\n html: \"HTML\",\n css: \"CSS\",\n scss: \"SCSS\",\n json: \"JSON\",\n yaml: \"YAML\",\n yml: \"YAML\",\n sql: \"SQL\",\n bash: \"Bash\",\n sh: \"Shell\",\n shell: \"Shell\",\n markdown: \"Markdown\",\n md: \"Markdown\",\n graphql: \"GraphQL\",\n xml: \"XML\",\n};\n\nfunction languageLabel(language: string): string {\n const known = LANGUAGE_LABELS[language.toLowerCase()];\n if (known) return known;\n return language.charAt(0).toUpperCase() + language.slice(1);\n}\n\nexport interface CodeBlockProps {\n language: string;\n code: string;\n}\n\nexport function CodeBlock({ language, code }: CodeBlockProps) {\n const lines = code.split(\"\\n\");\n return (\n <div className=\"sbk-code-block\">\n <div className=\"sbk-code-block__box\">\n <div className=\"sbk-code-block__header\">\n <span className=\"sbk-code-block__language\">{languageLabel(language)}</span>\n <button type=\"button\" className=\"sbk-code-block__copy\" aria-label=\"Copy code\">\n <CopyIcon width={16} height={16} />\n </button>\n </div>\n <div className=\"sbk-code-block__scroll\">\n <pre className=\"sbk-code-block__code\">\n <code>\n {lines.map((line, i) => (\n <span key={i} className=\"sbk-code-block__line\">\n {line || \" \"}\n </span>\n ))}\n </code>\n </pre>\n </div>\n </div>\n </div>\n );\n}\n","import type { MarkdownBlock } from \"@slack/types\";\nimport { parsePlainTextEmoji } from \"../parser\";\nimport type {\n Blockquote,\n Code,\n Heading,\n InlineCode,\n Link,\n List,\n ListItem,\n Paragraph,\n PhrasingContent,\n Root,\n RootContent,\n Table,\n TableCell,\n TableRow,\n Text,\n} from \"mdast\";\nimport { fromMarkdown } from \"mdast-util-from-markdown\";\nimport { gfmFromMarkdown } from \"mdast-util-gfm\";\nimport { gfm } from \"micromark-extension-gfm\";\nimport { Fragment, type ReactNode, useRef } from \"react\";\nimport { TableActions } from \"../data/HoverActions\";\nimport { Emoji } from \"../emoji\";\n// mdast has its own `Link` type.\nimport { Link as TextLink } from \"../Link\";\nimport type { BlockProps } from \"../types\";\nimport { CodeBlock } from \"./CodeBlock\";\n\n/**\n * Renders the (Builder-only) `markdown` block: a GitHub-flavored-markdown string that the Builder\n * converts into a run of the same building blocks used elsewhere (headers, dividers, rich-text-like\n * paragraphs, code snippets, tables). We parse with `mdast-util-from-markdown` + GFM and reuse those\n * blocks' own CSS classes so the two stay visually identical.\n */\nexport function Markdown({ block }: BlockProps<MarkdownBlock>) {\n const tree = parseMarkdown(block.text);\n return <div className=\"sbk-markdown\">{renderBlocks(tree.children)}</div>;\n}\n\nfunction parseMarkdown(text: string): Root {\n return fromMarkdown(text, {\n extensions: [gfm()],\n mdastExtensions: [gfmFromMarkdown()],\n });\n}\n\nconst HEADING_TAGS = { 1: \"h1\", 2: \"h2\", 3: \"h3\" } as const;\n\nfunction renderBlocks(children: RootContent[]): ReactNode[] {\n const nodes: ReactNode[] = [];\n let i = 0;\n let key = 0;\n\n while (i < children.length) {\n const node = children[i];\n if (!node) {\n i++;\n continue;\n }\n\n if (node.type === \"paragraph\") {\n const run: Paragraph[] = [];\n while (i < children.length && children[i]?.type === \"paragraph\") {\n run.push(children[i] as Paragraph);\n i++;\n }\n nodes.push(\n <div key={key++} className=\"sbk-markdown__section\">\n {run.map((p, j) => (\n <Fragment key={j}>\n {renderInline(p.children)}\n <span className=\"sbk-rich-text__br\" />\n </Fragment>\n ))}\n </div>,\n );\n continue;\n }\n\n switch (node.type) {\n case \"heading\": {\n const heading = node as Heading;\n const depth = Math.min(heading.depth, 4);\n const Tag = HEADING_TAGS[depth as 1 | 2 | 3] ?? \"h4\";\n const level = depth >= 3 ? 3 : depth;\n nodes.push(\n <Tag key={key++} className={`sbk-header sbk-header--level-${level}`}>\n {renderInline(heading.children)}\n </Tag>,\n );\n break;\n }\n case \"thematicBreak\":\n nodes.push(<hr key={key++} className=\"sbk-divider\" />);\n break;\n case \"code\": {\n const code = node as Code;\n if (code.lang) {\n nodes.push(<CodeBlock key={key++} language={code.lang} code={code.value} />);\n } else {\n nodes.push(\n <pre key={key++} className=\"sbk-rich-text__pre\">\n {code.value}\n </pre>,\n );\n }\n break;\n }\n case \"blockquote\":\n nodes.push(\n <blockquote key={key++} className=\"sbk-rich-text__quote\">\n {renderQuoteChildren((node as Blockquote).children)}\n </blockquote>,\n );\n break;\n case \"list\":\n nodes.push(renderList(node as List, key++, 0));\n break;\n case \"table\":\n nodes.push(renderTable(node as Table, key++));\n break;\n default:\n break;\n }\n i++;\n }\n\n return nodes;\n}\n\n/** Consecutive paragraphs inside a blockquote are joined with a plain line break, no spacer. */\nfunction renderQuoteChildren(children: RootContent[]): ReactNode {\n const paragraphs = children.filter((c): c is Paragraph => c.type === \"paragraph\");\n return paragraphs.map((p, i) => (\n <Fragment key={i}>\n {i > 0 && <br />}\n {renderInline(p.children)}\n </Fragment>\n ));\n}\n\nconst MARKER_STYLES = [\"disc\", \"circle\", \"square\"];\n\nfunction renderList(list: List, key: number, depth: number): ReactNode {\n const Tag = list.ordered ? \"ol\" : \"ul\";\n const style = list.ordered ? \"ordered\" : \"bullet\";\n const markerStyle = list.ordered ? \"decimal\" : MARKER_STYLES[depth % 3];\n const start = list.ordered ? (list.start ?? 1) : undefined;\n\n return (\n <Tag\n key={key}\n className={`sbk-rich-list sbk-rich-list--${style}`}\n start={start}\n style={{ listStyleType: markerStyle }}\n >\n {list.children.map((item, i) => renderListItem(item, i, depth))}\n </Tag>\n );\n}\n\nfunction renderListItem(item: ListItem, key: number, depth: number): ReactNode {\n const paragraphs = item.children.filter((c): c is Paragraph => c.type === \"paragraph\");\n const nestedLists = item.children.filter((c): c is List => c.type === \"list\");\n\n return (\n <li key={key} className=\"sbk-rich-list__item\">\n {paragraphs.map((p, i) => (\n <Fragment key={i}>\n {i > 0 && <br />}\n {renderInline(p.children)}\n </Fragment>\n ))}\n {nestedLists.map((nested, i) => renderList(nested, i, depth + 1))}\n </li>\n );\n}\n\nfunction renderTable(table: Table, key: number): ReactNode {\n return <MarkdownTable key={key} table={table} />;\n}\n\nfunction MarkdownTable({ table }: { table: Table }) {\n const [headerRow, ...bodyRows] = table.children;\n const align = table.align ?? [];\n const tableRef = useRef<HTMLTableElement>(null);\n\n return (\n <div className=\"sbk-hover-actions-host sbk-hover-actions-host--fit\">\n <div className=\"sbk-markdown__table-wrap\">\n <table className=\"sbk-markdown__table\" ref={tableRef}>\n {headerRow && (\n <thead>\n <tr>\n {headerRow.children.map((cell, i) => (\n <th key={i} style={{ textAlign: align[i] ?? undefined }}>\n {renderInline(cell.children)}\n </th>\n ))}\n </tr>\n </thead>\n )}\n <tbody>\n {bodyRows.map((row: TableRow, i) => (\n <tr key={i}>\n {row.children.map((cell: TableCell, j) => (\n <td key={j} style={{ textAlign: align[j] ?? undefined }}>\n {renderInline(cell.children)}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n <TableActions tableRef={tableRef} />\n </div>\n );\n}\n\nfunction renderInline(nodes: PhrasingContent[]): ReactNode {\n return nodes.map((node, i) => <Fragment key={i}>{renderInlineNode(node)}</Fragment>);\n}\n\nfunction renderInlineNode(node: PhrasingContent): ReactNode {\n switch (node.type) {\n case \"text\":\n return renderTextWithEmoji((node as Text).value);\n case \"strong\":\n return <b>{renderInline(node.children)}</b>;\n case \"emphasis\":\n return <i>{renderInline(node.children)}</i>;\n case \"delete\":\n return <s>{renderInline(node.children)}</s>;\n case \"inlineCode\":\n return <code className=\"sbk-mrkdwn__code\">{(node as InlineCode).value}</code>;\n case \"link\": {\n const link = node as Link;\n return (\n <TextLink className=\"sbk-link\" href={link.url} target=\"_blank\" rel=\"noopener noreferrer\">\n {renderInline(link.children)}\n </TextLink>\n );\n }\n case \"break\":\n return <br />;\n default:\n return null;\n }\n}\n\nfunction renderTextWithEmoji(value: string): ReactNode {\n const nodes = parsePlainTextEmoji(value);\n return nodes.map((node, i) =>\n node.type === \"emoji\" ? (\n <Emoji key={i} name={node.name} skinTone={node.skinTone} size={22} />\n ) : (\n <Fragment key={i}>{renderSoftBreaks(node.value)}</Fragment>\n ),\n );\n}\n\n/** A GFM \"lazy continuation\" line within a paragraph/blockquote is a literal `\\n` in the text\n * node's value; render each as a visual line break rather than letting it collapse to a space. */\nfunction renderSoftBreaks(value: string): ReactNode {\n const lines = value.split(\"\\n\");\n return lines.map((line, i) => (\n <Fragment key={i}>\n {i > 0 && <br />}\n {line}\n </Fragment>\n ));\n}\n","/** Status glyphs shared by the plan/task_card blocks, matching Slack's status iconography. */\nexport type TaskStatus = \"complete\" | \"in_progress\" | \"pending\" | \"error\" | string;\n\n/**\n * Slack's `c-infinite_spinner`: two stacked arcs (head + tail) rotating on slightly different\n * easing curves, so the arc appears to stretch and shrink as it spins.\n */\nexport function SpinnerIcon({ size = 12 }: { size?: number }) {\n return (\n <span\n className=\"sbk-status-icon sbk-status-icon--spinner sbk-spinner\"\n style={{ width: size, height: size }}\n aria-hidden=\"true\"\n >\n <svg className=\"sbk-spinner__arc\" viewBox=\"0 0 100 100\">\n <circle className=\"sbk-spinner__bg\" cx=\"50%\" cy=\"50%\" r=\"35\" />\n <circle className=\"sbk-spinner__path\" cx=\"50%\" cy=\"50%\" r=\"35\" />\n </svg>\n <svg className=\"sbk-spinner__arc sbk-spinner__tail\" viewBox=\"0 0 100 100\">\n <circle className=\"sbk-spinner__path\" cx=\"50%\" cy=\"50%\" r=\"35\" />\n </svg>\n </span>\n );\n}\n\n/** Slack's filled check-circle, 13px on the toggle bar. */\nexport function CheckCircleIcon({ size = 13 }: { size?: number }) {\n return (\n <svg\n className=\"sbk-status-icon sbk-status-icon--complete\"\n viewBox=\"0 0 20 20\"\n width={size}\n height={size}\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M10 19a9 9 0 1 0 0-18 9 9 0 0 0 0 18m3.722-11.315a.75.75 0 1 0-1.144-.97l-4.125 4.863-1.141-1.611a.75.75 0 1 0-1.224.867l1.7 2.4a.75.75 0 0 0 1.184.051z\"\n />\n </svg>\n );\n}\n\n/** Slack's warning triangle for a failed task. */\nexport function ErrorIcon({ size = 13 }: { size?: number }) {\n return (\n <svg\n className=\"sbk-status-icon sbk-status-icon--error\"\n viewBox=\"0 0 20 20\"\n width={size}\n height={size}\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M7.712 3.542c1.02-1.723 3.556-1.723 4.576 0l6.1 10.303c1.043 1.76-.28 3.905-2.287 3.905H3.9c-2.008 0-3.331-2.144-2.288-3.905zM10 12.75a1 1 0 1 0 0 2 1 1 0 0 0 0-2m0-6a.75.75 0 0 0-.75.75V11a.75.75 0 0 0 1.5 0V7.5a.75.75 0 0 0-.75-.75\"\n />\n </svg>\n );\n}\n\n/** The 5px dot Slack's plan timeline puts on a finished or waiting step. */\nexport function DotIcon({ status }: { status: TaskStatus }) {\n return (\n <svg\n className={`sbk-status-icon sbk-status-icon--dot${status === \"complete\" ? \" sbk-status-icon--dot-complete\" : \"\"}`}\n viewBox=\"0 0 20 20\"\n width={5}\n height={5}\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path d=\"M19 10a9 9 0 1 1-18 0 9 9 0 0 1 18 0\" />\n </svg>\n );\n}\n\n/** How a status reads aloud. The icons are hidden from assistive technology, so this stands in. */\nconst STATUS_LABELS: Record<string, string> = {\n complete: \"complete\",\n in_progress: \"in progress\",\n pending: \"pending\",\n error: \"failed\",\n};\n\n/**\n * A status as text that only screen readers get, set after a title (\", in progress\"), so a toggle\n * or task header is announced with the state its icon shows. An unknown status says nothing.\n */\nexport function StatusText({ status }: { status: TaskStatus }) {\n const label = STATUS_LABELS[status];\n return label ? <span className=\"sbk-visually-hidden\">{`, ${label}`}</span> : null;\n}\n\n/** The glyph on a toggle bar (the plan's or a task_card's): check, warning or spinner. */\nexport function StatusIcon({ status }: { status: TaskStatus }) {\n if (status === \"complete\") return <CheckCircleIcon />;\n if (status === \"error\") return <ErrorIcon />;\n return <SpinnerIcon />;\n}\n\n/** One step on the plan's timeline: a dot once finished or while waiting, else as on the toggle. */\nexport function TimelineIcon({ status }: { status: TaskStatus }) {\n if (status === \"in_progress\") return <SpinnerIcon />;\n if (status === \"error\") return <ErrorIcon />;\n return <DotIcon status={status} />;\n}\n\n/**\n * The plan's overall status, as Slack shows it: still running while any task is unfinished, then\n * failed if any task failed, else complete.\n */\nexport function aggregateStatus(statuses: TaskStatus[]): TaskStatus {\n if (statuses.some((s) => s !== \"complete\" && s !== \"error\")) return \"in_progress\";\n if (statuses.includes(\"error\")) return \"error\";\n return \"complete\";\n}\n","import { useState } from \"react\";\nimport { Collapse } from \"../data/Collapse\";\nimport { CaretIcon } from \"../data/icons\";\nimport { RichTextMini } from \"../data/richTextMini\";\nimport {\n aggregateStatus,\n StatusIcon,\n StatusText,\n type TaskStatus,\n TimelineIcon,\n} from \"../data/statusIcon\";\nimport type { BlockProps, Json } from \"../types\";\nimport { Link } from \"../Link\";\n\ninterface PlanSource extends Json {\n type: \"url\";\n url: string;\n text?: string;\n}\n\ninterface PlanTask extends Json {\n task_id: string;\n title: string;\n status: TaskStatus;\n details?: Json;\n output?: Json;\n sources?: PlanSource[];\n}\n\ninterface PlanBlock extends Json {\n type: \"plan\";\n title: string;\n tasks: PlanTask[];\n}\n\n/**\n * One step of the plan. As in Slack, a thin line joins each step's icon to the next, its details\n * start open, and the title is a button that hides and shows them instantly; a task with nothing\n * to reveal gets the same header as plain text, with no caret. The status, shown as an icon, is\n * also in the header as text for screen readers.\n */\nfunction TaskRow({ task }: { task: PlanTask }) {\n const [open, setOpen] = useState(true);\n const sources = Array.isArray(task.sources) ? task.sources : [];\n const expandable = Boolean(task.details || task.output || sources.length > 0);\n\n return (\n <li className=\"sbk-plan__task\">\n <span className=\"sbk-plan__step\" aria-hidden=\"true\">\n <span className=\"sbk-plan__line sbk-plan__line--top\" />\n <span className=\"sbk-plan__task-icon\">\n <TimelineIcon status={task.status} />\n </span>\n <span className=\"sbk-plan__line sbk-plan__line--bottom\" />\n </span>\n <div className=\"sbk-plan__task-content\">\n {expandable ? (\n <button\n type=\"button\"\n className=\"sbk-plan__task-header\"\n aria-expanded={open}\n onClick={() => setOpen((value) => !value)}\n >\n <span className=\"sbk-plan__task-title\">{task.title}</span>\n <StatusText status={task.status} />\n <span className=\"sbk-plan__task-caret\">\n <CaretIcon direction={open ? \"down\" : \"right\"} />\n </span>\n </button>\n ) : (\n <div className=\"sbk-plan__task-header\">\n <span className=\"sbk-plan__task-title\">{task.title}</span>\n <StatusText status={task.status} />\n </div>\n )}\n {open && expandable ? (\n <div className=\"sbk-plan__task-body\">\n {task.details ? (\n <div className=\"sbk-plan__task-details\">\n <RichTextMini value={task.details} />\n </div>\n ) : null}\n {task.output ? (\n <div className=\"sbk-plan__task-output\">\n <RichTextMini value={task.output} />\n </div>\n ) : null}\n {sources.length > 0 ? (\n <ul className=\"sbk-plan__task-sources\">\n {sources.map((source, i) => (\n <li key={source.url ?? i}>\n <Link\n className=\"sbk-plan__task-source-link\"\n href={source.url}\n target=\"_blank\"\n rel=\"noreferrer noopener\"\n >\n {source.text ?? source.url}\n </Link>\n </li>\n ))}\n </ul>\n ) : null}\n </div>\n ) : null}\n </div>\n </li>\n );\n}\n\nexport function Plan({ block }: BlockProps<PlanBlock>) {\n const [expanded, setExpanded] = useState(false);\n const tasks = Array.isArray(block.tasks) ? block.tasks : [];\n const status = aggregateStatus(tasks.map((t) => t.status));\n\n return (\n <div className=\"sbk-plan\">\n <button\n type=\"button\"\n className=\"sbk-plan__pill\"\n aria-expanded={expanded}\n onClick={() => setExpanded((value) => !value)}\n >\n <span className=\"sbk-plan__pill-content\">\n <span className=\"sbk-plan__pill-icon\">\n <StatusIcon status={status} />\n </span>\n <span className=\"sbk-plan__pill-title\">{block.title}</span>\n <StatusText status={status} />\n <span className=\"sbk-plan__pill-chevron\">\n <CaretIcon direction={expanded ? \"down\" : \"right\"} />\n </span>\n </span>\n </button>\n <Collapse open={expanded}>\n <ul className=\"sbk-plan__tasks\">\n {tasks.map((task) => (\n <TaskRow key={task.task_id} task={task} />\n ))}\n </ul>\n </Collapse>\n </div>\n );\n}\n","import type {\n RichTextBlock,\n RichTextBlockElement,\n RichTextElement,\n RichTextList,\n RichTextQuote,\n RichTextSection,\n} from \"@slack/types\";\nimport { formatSlackDate } from \"../parser\";\nimport { Fragment, type ReactNode } from \"react\";\nimport { useBlockKit } from \"../context\";\nimport { Emoji } from \"../emoji\";\nimport { Link, MentionLink } from \"../Link\";\nimport { LockIcon } from \"../Mrkdwn\";\nimport type { BlockProps } from \"../types\";\nimport { UserMention } from \"../UserMention\";\nimport { CopyIcon } from \"../icons\";\nimport { CodeBlock } from \"./CodeBlock\";\n\n// Builder-only/undocumented extensions to `@slack/types`' definitions.\ntype RichTextListExt = RichTextList & { offset?: number };\ntype RichTextEmojiExt = Extract<RichTextElement, { type: \"emoji\" }> & { skin_tone?: number };\ntype RichTextPreformattedExt = Extract<RichTextBlockElement, { type: \"rich_text_preformatted\" }> & {\n language?: string;\n};\n\ntype Resolvers = ReturnType<typeof useBlockKit>[\"resolvers\"];\n\ninterface RenderCtx {\n resolvers: Resolvers;\n timeZone: string | undefined;\n}\n\nexport function RichText({ block }: BlockProps<RichTextBlock>) {\n const { resolvers, timeZone } = useBlockKit();\n const ctx: RenderCtx = { resolvers, timeZone };\n return <div className=\"sbk-rich-text\">{renderTopLevel(block.elements ?? [], ctx)}</div>;\n}\n\nfunction renderTopLevel(elements: RichTextBlockElement[], ctx: RenderCtx): ReactNode[] {\n const nodes: ReactNode[] = [];\n let i = 0;\n let key = 0;\n while (i < elements.length) {\n const el = elements[i];\n if (!el) {\n i++;\n continue;\n }\n if (el.type === \"rich_text_list\") {\n const run: RichTextListExt[] = [];\n while (i < elements.length && elements[i]?.type === \"rich_text_list\") {\n run.push(elements[i] as RichTextListExt);\n i++;\n }\n const forest = buildListForest(run);\n const lists = forest.map((group) => renderListGroup(group, ctx, key++, 0));\n if (!forest.some((group) => group.border)) {\n nodes.push(...lists);\n continue;\n }\n // Slack draws a list with `border: 1` inside a quote, and the quotes right after it join that\n // same quote: one bar down the side, one 4px margin above and below the group.\n const quoted: ReactNode[] = [];\n while (i < elements.length && elements[i]?.type === \"rich_text_quote\") {\n quoted.push(\n <div key={key++} className=\"sbk-rich-text__quote-text\">\n {renderSectionChildren((elements[i] as RichTextQuote).elements, ctx)}\n </div>,\n );\n i++;\n }\n nodes.push(\n <blockquote key={key++} className=\"sbk-rich-text__quote sbk-rich-text__quote--group\">\n {lists}\n {quoted}\n </blockquote>,\n );\n continue;\n }\n switch (el.type) {\n case \"rich_text_section\":\n nodes.push(\n <div key={key++} className=\"sbk-rich-text__section\">\n {renderSectionChildren(el.elements, ctx)}\n </div>,\n );\n break;\n case \"rich_text_quote\":\n nodes.push(\n <blockquote key={key++} className=\"sbk-rich-text__quote\">\n {renderSectionChildren(el.elements, ctx)}\n </blockquote>,\n );\n break;\n case \"rich_text_preformatted\": {\n const language = (el as RichTextPreformattedExt).language;\n if (language) {\n const code = el.elements\n .map((leaf) =>\n leaf.type === \"text\" ? leaf.text : leaf.type === \"link\" ? leaf.text || leaf.url : \"\",\n )\n .join(\"\");\n nodes.push(<CodeBlock key={key++} language={language} code={code} />);\n } else {\n nodes.push(\n <pre key={key++} className=\"sbk-rich-text__pre\">\n {renderPreformattedLines(el.elements)}\n <span className=\"sbk-rich-text__pre-copy\" aria-label=\"Copy code\">\n <CopyIcon width={16} height={16} />\n </span>\n </pre>,\n );\n }\n break;\n }\n default:\n break;\n }\n i++;\n }\n return nodes;\n}\n\n/** A section renders \"jumbo\" 32px emoji when it consists only of emoji (and whitespace). */\nfunction renderSectionChildren(elements: RichTextElement[], ctx: RenderCtx): ReactNode {\n const isJumbo =\n elements.some((el) => el.type === \"emoji\") &&\n elements.every((el) => el.type === \"emoji\" || (el.type === \"text\" && el.text.trim() === \"\"));\n\n if (isJumbo) {\n return (\n <span className=\"sbk-rich-text__jumbo-emoji\">\n {elements\n .filter((el) => el.type === \"emoji\")\n .map((el, i) => (\n <Fragment key={i}>{renderLeaf(el, ctx, 32)}</Fragment>\n ))}\n </span>\n );\n }\n\n return elements.map((el, i) => <Fragment key={i}>{renderLeaf(el, ctx, 22, i === 0)}</Fragment>);\n}\n\nfunction renderLeaf(\n el: RichTextElement,\n ctx: RenderCtx,\n emojiSize: number,\n isFirst = false,\n): ReactNode {\n let content: ReactNode;\n switch (el.type) {\n case \"text\":\n content = renderTextWithBreaks(el.text, isFirst);\n break;\n case \"link\":\n content = (\n <Link className=\"sbk-link\" href={el.url} target=\"_blank\" rel=\"noopener noreferrer\">\n {el.text || el.url}\n </Link>\n );\n break;\n case \"emoji\": {\n const emoji = el as RichTextEmojiExt;\n content = <Emoji name={emoji.name} skinTone={emoji.skin_tone} size={emojiSize} />;\n break;\n }\n case \"user\": {\n const name = ctx.resolvers.user?.(el.user_id);\n content = name ? (\n <UserMention id={el.user_id} name={name} />\n ) : (\n <span className=\"sbk-mention--unresolved\" aria-label={`@${el.user_id}`} />\n );\n break;\n }\n case \"usergroup\": {\n const name = ctx.resolvers.usergroup?.(el.usergroup_id);\n content = name ? (\n <MentionLink type=\"usergroup\" id={el.usergroup_id}>\n @{name}\n </MentionLink>\n ) : (\n <span className=\"sbk-mention--loading\" aria-label=\"Loading user group\" />\n );\n break;\n }\n case \"channel\": {\n const name = ctx.resolvers.channel?.(el.channel_id);\n content = name ? (\n <MentionLink type=\"channel\" id={el.channel_id}>\n #{name}\n </MentionLink>\n ) : (\n <span className=\"sbk-mention--private\">\n <LockIcon />\n Private channel\n </span>\n );\n break;\n }\n case \"broadcast\":\n content = <span className=\"sbk-mention--broadcast\">@{el.range}</span>;\n break;\n case \"date\": {\n const text = formatSlackDate(el.timestamp, el.format, { timeZone: ctx.timeZone });\n content = el.url ? (\n <Link className=\"sbk-link\" href={el.url} target=\"_blank\" rel=\"noopener noreferrer\">\n {text}\n </Link>\n ) : (\n <span className=\"sbk-mrkdwn__date\">{text}</span>\n );\n break;\n }\n case \"color\":\n content = (\n <Fragment>\n {el.value}\n <span\n className=\"sbk-rich-text__color-swatch\"\n style={{ background: el.value }}\n aria-label={el.value}\n />\n </Fragment>\n );\n break;\n case \"team\":\n content = <span className=\"sbk-mention--unresolved\" aria-label={`@${el.team_id}`} />;\n break;\n default:\n content = null;\n }\n\n return applyStyle(content, el.style);\n}\n\nfunction applyStyle(content: ReactNode, style: RichTextElement[\"style\"] | undefined): ReactNode {\n if (!style) return content;\n let node = content;\n if (style.underline) node = <u>{node}</u>;\n if (style.strike) node = <s>{node}</s>;\n if (style.italic) node = <i>{node}</i>;\n if (style.bold) node = <b>{node}</b>;\n if (style.code) node = <code className=\"sbk-mrkdwn__code\">{node}</code>;\n return node;\n}\n\n/**\n * A run of 2+ `\\n`s (a paragraph gap) always collapses to a small fixed-height spacer, regardless\n * of where it sits. A single `\\n` renders as a literal `<br/>` — which, left to normal browser\n * layout, already does the right thing at both ends: a *trailing* `<br/>` (nothing after it in the\n * section) naturally contributes no extra height, and a *mid-content* one (real content before and\n * after) inserts a full line break. The one case the browser gets \"wrong\" for our purposes is a\n * *leading* single `\\n` (nothing meaningful before it): natively that reserves a whole blank line,\n * but the Builder instead shows the same small spacer used for multi-`\\n` gaps — so that one case\n * is special-cased explicitly.\n */\nfunction renderTextWithBreaks(value: string, isFirst: boolean): ReactNode {\n const parts = value.split(/(\\n+)/);\n // `split` on a capturing regex leaves an empty \"\" entry wherever the match sits at the very\n // start of the string, so the real leading run lives at index 1, not index 0.\n const firstNonEmpty = parts.findIndex((p) => p !== \"\");\n return parts.map((part, i) => {\n if (part === \"\") return null;\n if (/^\\n+$/.test(part)) {\n const isLeading = isFirst && i === firstNonEmpty;\n if (part.length === 1 && !isLeading) return <br key={i} />;\n return <span key={i} className=\"sbk-rich-text__br\" />;\n }\n return <Fragment key={i}>{part}</Fragment>;\n });\n}\n\n/**\n * Preformatted blocks (without a `language`) wrap long lines normally, and — unlike a regular\n * rich_text section — a `\\n` here is a literal hard break: `white-space: pre-wrap` on the `<pre>`\n * already renders each one as a real line, so a `\\n\\n` run naturally produces one full blank line\n * rather than the compact spacer used elsewhere. That means the raw text can be rendered as-is,\n * with no custom newline splitting.\n */\nfunction renderPreformattedLines(\n elements: Extract<RichTextElement, { type: \"text\" | \"link\" }>[],\n): ReactNode {\n return elements.map((el, i) => {\n if (el.type === \"link\") {\n return (\n <Fragment key={i}>\n {applyStyle(\n <Link className=\"sbk-link\" href={el.url} target=\"_blank\" rel=\"noopener noreferrer\">\n {el.text || el.url}\n </Link>,\n el.style,\n )}\n </Fragment>\n );\n }\n return <Fragment key={i}>{applyStyle(el.text, el.style)}</Fragment>;\n });\n}\n\n// --- List grouping/nesting -------------------------------------------------\n//\n// Slack merges consecutive `rich_text_list` blocks into one continuous outline: a block whose\n// `indent` is deeper than the running list nests inside the last item of that list, and a block\n// whose `indent`/`style` matches the current list at that depth continues it (this is how the\n// Builder renders e.g. an ordered list, an indented bullet aside, then more of the ordered list,\n// as a single properly nested <ol>/<ul> tree).\n\ninterface ListItem {\n section: RichTextSection;\n children: ListGroup[];\n /** Explicit start value for this <li>, used to honor a list's `offset`. */\n value?: number;\n}\n\ninterface ListGroup {\n style: \"bullet\" | \"ordered\";\n indent: number;\n border?: number;\n startValue?: number;\n items: ListItem[];\n}\n\nfunction buildListForest(run: RichTextListExt[]): ListGroup[] {\n const forest: ListGroup[] = [];\n const stack: ListGroup[] = [];\n\n for (const block of run) {\n const indent = block.indent ?? 0;\n while (stack.length > 0 && (stack[stack.length - 1] as ListGroup).indent > indent) {\n stack.pop();\n }\n let top = stack[stack.length - 1];\n\n if (top && top.indent === indent && top.style === block.style) {\n const startCount = top.items.length;\n for (const section of block.elements) top.items.push({ section, children: [] });\n if (block.offset != null && top.style === \"ordered\") {\n const firstNew = top.items[startCount];\n if (firstNew) firstNew.value = block.offset + 1;\n }\n continue;\n }\n\n if (top && top.indent === indent) {\n // Same depth, different style: end the current list and start a fresh one alongside it.\n stack.pop();\n top = stack[stack.length - 1];\n }\n\n const group: ListGroup = {\n style: block.style,\n indent,\n border: block.border,\n startValue: block.style === \"ordered\" ? (block.offset ?? 0) + 1 : undefined,\n items: block.elements.map((section) => ({ section, children: [] })),\n };\n\n if (top && top.indent < indent) {\n const parentItem = top.items[top.items.length - 1];\n if (parentItem) parentItem.children.push(group);\n else forest.push(group);\n } else {\n forest.push(group);\n }\n stack.push(group);\n }\n\n return forest;\n}\n\n/** Ordered lists count in the browser's markers; bullets are Slack's icon glyphs, drawn in CSS. */\nconst ORDERED_MARKERS = [\"decimal\", \"lower-alpha\", \"lower-roman\"];\n\nfunction renderListGroup(group: ListGroup, ctx: RenderCtx, key: number, depth: number): ReactNode {\n const Tag = group.style === \"ordered\" ? \"ol\" : \"ul\";\n const ordered = group.style === \"ordered\";\n const className = `sbk-rich-list sbk-rich-list--${group.style}${group.border ? \" sbk-rich-list--bordered\" : \"\"}`;\n\n return (\n <Tag\n key={key}\n className={className}\n start={group.startValue}\n data-indent={ordered ? undefined : group.indent}\n style={ordered ? { listStyleType: ORDERED_MARKERS[depth % 3] } : undefined}\n >\n {group.items.map((item, i) => (\n <li key={i} value={item.value} className=\"sbk-rich-list__item\">\n {renderSectionChildren(item.section.elements, ctx)}\n {item.children.map((child, j) => renderListGroup(child, ctx, j, depth + 1))}\n </li>\n ))}\n </Tag>\n );\n}\n","import type { SectionBlock } from \"@slack/types\";\nimport { useState } from \"react\";\nimport { Element } from \"../elements/Element\";\nimport { Text } from \"../Text\";\nimport type { BlockProps, Json } from \"../types\";\n\n/**\n * Long section text is clamped unless `expand: true`. There's no Builder reference for the exact\n * truncation length, so this mirrors the documented behaviour (a \"Show more\" toggle) with a\n * reasonable clamp rather than Slack's precise measurement.\n */\nconst COLLAPSE_LINES = 5;\nconst COLLAPSE_CHAR_THRESHOLD = 300;\n\n/** Accessories Slack stacks full-width below the text instead of beside it. */\nconst STACKED_ACCESSORIES = new Set([\"checkboxes\", \"radio_buttons\"]);\n\nexport function Section({ block, blockId }: BlockProps<SectionBlock>) {\n const accessory = block.accessory as Json | undefined;\n const expand = (block as unknown as Json).expand === true;\n const textLength = block.text?.text.length ?? 0;\n const collapsible = !expand && textLength > COLLAPSE_CHAR_THRESHOLD;\n const [expanded, setExpanded] = useState(false);\n const stacked = accessory !== undefined && STACKED_ACCESSORIES.has(accessory.type as string);\n\n return (\n <div\n className={`sbk-section${accessory ? \" sbk-section--has-accessory\" : \"\"}${stacked ? \" sbk-section--stacked\" : \"\"}`}\n >\n <div className=\"sbk-section__content\">\n {block.text && (\n <div\n className={`sbk-section__text${collapsible && !expanded ? \" sbk-section__text--clamped\" : \"\"}`}\n style={collapsible && !expanded ? { WebkitLineClamp: COLLAPSE_LINES } : undefined}\n >\n <Text text={block.text} />\n {collapsible && (\n <button\n type=\"button\"\n className=\"sbk-section__toggle\"\n onClick={() => setExpanded((v) => !v)}\n >\n {expanded ? \"Show less\" : \"Show more\"}\n </button>\n )}\n </div>\n )}\n {block.fields && (\n <div className=\"sbk-section__fields\">\n {block.fields.map((field, i) => (\n <div key={i} className=\"sbk-section__field\">\n <Text text={field} />\n </div>\n ))}\n </div>\n )}\n </div>\n {accessory && (\n <div className={`sbk-section__accessory sbk-section__accessory--${accessory.type}`}>\n <Element element={accessory} blockId={blockId} />\n </div>\n )}\n </div>\n );\n}\n","import { type CSSProperties, useRef } from \"react\";\nimport { TableActions } from \"../data/HoverActions\";\nimport { RichTextMini } from \"../data/richTextMini\";\nimport type { BlockProps, Json } from \"../types\";\n\ninterface ColumnSetting {\n is_wrapped?: boolean;\n align?: \"left\" | \"center\" | \"right\";\n}\n\nexport interface TableBlock extends Json {\n type: \"table\";\n rows: Json[][];\n column_settings?: ColumnSetting[];\n}\n\n/** Renders one cell's content: a `rich_text` object, or a plain-text `raw_text`/legacy string cell. */\nfunction Cell({ cell }: { cell: Json }) {\n if (cell && typeof cell === \"object\" && cell.type === \"rich_text\") {\n return <RichTextMini value={cell} />;\n }\n if (cell && typeof cell === \"object\" && typeof cell.text === \"string\") {\n return <>{cell.text}</>;\n }\n return null;\n}\n\n/**\n * The `table` block: a fixed grid of `rich_text`/`raw_text` cells, first row as the header.\n * `column_settings[i]` controls per-column alignment and text wrapping.\n */\nexport function Table({ block }: BlockProps<TableBlock>) {\n const rows = Array.isArray(block.rows) ? block.rows : [];\n const [header, ...body] = rows;\n const settings = block.column_settings ?? [];\n const tableRef = useRef<HTMLTableElement>(null);\n\n const cellStyle = (colIndex: number): CSSProperties | undefined => {\n const setting = settings[colIndex];\n if (!setting) return undefined;\n return {\n textAlign: setting.align,\n whiteSpace: setting.is_wrapped ? \"normal\" : \"nowrap\",\n };\n };\n\n return (\n <div className=\"sbk-table sbk-hover-actions-host sbk-hover-actions-host--fit\">\n <div className=\"sbk-table__scroll\">\n <table className=\"sbk-table__table\" ref={tableRef}>\n {header ? (\n <thead className=\"sbk-table__thead\">\n <tr>\n {header.map((cell, i) => (\n <th key={i} className=\"sbk-table__th\" style={cellStyle(i)}>\n <Cell cell={cell} />\n </th>\n ))}\n </tr>\n </thead>\n ) : null}\n <tbody className=\"sbk-table__tbody\">\n {body.map((row, r) => (\n <tr key={r}>\n {row.map((cell, i) => (\n <td key={i} className=\"sbk-table__td\" style={cellStyle(i)}>\n <Cell cell={cell} />\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n <TableActions tableRef={tableRef} />\n </div>\n );\n}\n","import { useState } from \"react\";\nimport { Collapse } from \"../data/Collapse\";\nimport { CaretIcon } from \"../data/icons\";\nimport { RichTextMini } from \"../data/richTextMini\";\nimport { DotIcon, StatusIcon, StatusText, type TaskStatus } from \"../data/statusIcon\";\nimport type { BlockProps, Json } from \"../types\";\nimport { Link } from \"../Link\";\n\ninterface TaskCardSource extends Json {\n type: \"url\";\n url: string;\n text?: string;\n}\n\ninterface TaskCardBlock extends Json {\n type: \"task_card\";\n task_id: string;\n title: string;\n status: TaskStatus;\n details?: Json;\n output?: Json;\n sources?: TaskCardSource[];\n}\n\nexport function TaskCard({ block }: BlockProps<TaskCardBlock>) {\n const [expanded, setExpanded] = useState(false);\n const sources = Array.isArray(block.sources) ? block.sources : [];\n // Slack disables the toggle, and drops its caret, when the card has nothing to reveal. Here it is\n // plain text then, so it isn't a tab stop that controls nothing.\n const expandable = Boolean(block.details || block.output || sources.length > 0);\n const pillContent = (\n <span className=\"sbk-task-card__pill-content\">\n <span className=\"sbk-task-card__pill-icon\">\n <StatusIcon status={block.status} />\n </span>\n <span className=\"sbk-task-card__pill-title\">{block.title}</span>\n <StatusText status={block.status} />\n {expandable ? (\n <span className=\"sbk-task-card__pill-chevron\">\n <CaretIcon direction={expanded ? \"down\" : \"right\"} />\n </span>\n ) : null}\n </span>\n );\n\n return (\n <div className=\"sbk-task-card\">\n {expandable ? (\n <button\n type=\"button\"\n className=\"sbk-task-card__pill\"\n aria-expanded={expanded}\n onClick={() => setExpanded((value) => !value)}\n >\n {pillContent}\n </button>\n ) : (\n <div className=\"sbk-task-card__pill\">{pillContent}</div>\n )}\n <Collapse open={expanded}>\n <div className=\"sbk-task-card__body\">\n {block.details ? (\n <div className=\"sbk-task-card__details\">\n <RichTextMini value={block.details} />\n </div>\n ) : null}\n {block.output || sources.length > 0 ? (\n <div className=\"sbk-task-card__step\">\n <div className=\"sbk-task-card__rail\">\n <span className=\"sbk-task-card__dot\">\n <DotIcon status=\"pending\" />\n </span>\n <span className=\"sbk-task-card__line\" />\n </div>\n <div className=\"sbk-task-card__step-content\">\n {block.output ? (\n <div className=\"sbk-task-card__output\">\n <RichTextMini value={block.output} />\n </div>\n ) : null}\n {sources.length > 0 ? (\n <ul className=\"sbk-task-card__sources\">\n {sources.map((source, i) => (\n <li key={source.url ?? i}>\n <Link\n className=\"sbk-task-card__source-link\"\n href={source.url}\n target=\"_blank\"\n rel=\"noreferrer noopener\"\n >\n {source.text ?? source.url}\n </Link>\n </li>\n ))}\n </ul>\n ) : null}\n </div>\n </div>\n ) : null}\n </div>\n </Collapse>\n </div>\n );\n}\n","import { Text, type TextObject } from \"../Text\";\nimport type { BlockProps, Json } from \"../types\";\nimport { Link } from \"../Link\";\n\nfunction PlayIcon() {\n return (\n <svg viewBox=\"0 0 20 20\" width=\"20\" height=\"20\" aria-hidden=\"true\">\n <path\n d=\"M6 4.3a1 1 0 0 1 1.5-.9l8.6 5.7a1 1 0 0 1 0 1.8l-8.6 5.7A1 1 0 0 1 6 15.7z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n}\n\nfunction CaretDownIcon() {\n return (\n <svg viewBox=\"0 0 20 20\" width=\"15\" height=\"15\" aria-hidden=\"true\">\n <path d=\"M5.5 8l4.5 4.5L14.5 8z\" fill=\"currentColor\" />\n </svg>\n );\n}\n\n/**\n * A video preview: author/provider row, description, title link, and a thumbnail with Slack's\n * \"Video\" play pill. We render the thumbnail rather than an embedded player — `video_url` is opened in a\n * new tab, matching how a message-surface preview behaves before the player is expanded.\n */\nexport function Video({ block }: BlockProps) {\n const json = block as Json;\n const title = json.title as TextObject | undefined;\n const titleUrl = typeof json.title_url === \"string\" ? json.title_url : undefined;\n const description = json.description as TextObject | undefined;\n const authorName = typeof json.author_name === \"string\" ? json.author_name : undefined;\n const providerName = typeof json.provider_name === \"string\" ? json.provider_name : undefined;\n const providerIcon =\n typeof json.provider_icon_url === \"string\" ? json.provider_icon_url : undefined;\n const thumbnailUrl = typeof json.thumbnail_url === \"string\" ? json.thumbnail_url : undefined;\n const altText = typeof json.alt_text === \"string\" ? json.alt_text : (title?.text ?? \"video\");\n\n return (\n <div className=\"sbk-video\">\n {(providerName || authorName) && (\n <div className=\"sbk-video__byline\">\n {providerIcon && <img className=\"sbk-video__provider-icon\" src={providerIcon} alt=\"\" />}\n {providerName && <span className=\"sbk-video__provider\">{providerName}</span>}\n {providerName && authorName && <span className=\"sbk-video__separator\"> | </span>}\n {authorName && <span className=\"sbk-video__author\">{authorName}</span>}\n </div>\n )}\n {description && (\n <div className=\"sbk-video__description\">\n <Text text={description} />\n </div>\n )}\n {title && (\n <div className=\"sbk-video__title\">\n {titleUrl ? (\n <Link href={titleUrl} target=\"_blank\" rel=\"noreferrer\">\n <Text text={title} />\n </Link>\n ) : (\n <Text text={title} />\n )}\n <span className=\"sbk-video__expand\" aria-hidden=\"true\">\n <CaretDownIcon />\n </span>\n </div>\n )}\n <Link\n className=\"sbk-video__frame\"\n href={typeof json.video_url === \"string\" ? (json.video_url as string) : titleUrl}\n target=\"_blank\"\n rel=\"noreferrer\"\n aria-label={altText}\n >\n {thumbnailUrl && <img className=\"sbk-video__thumb\" src={thumbnailUrl} alt=\"\" />}\n <span className=\"sbk-video__play\">\n <PlayIcon />\n <span className=\"sbk-video__play-label\">Video</span>\n </span>\n </Link>\n </div>\n );\n}\n","import type { ComponentType } from \"react\";\nimport type { BlockProps } from \"../types\";\nimport { Actions } from \"./Actions\";\nimport { Alert } from \"./Alert\";\nimport { Callout } from \"./Callout\";\nimport { Card } from \"./Card\";\nimport { Carousel } from \"./Carousel\";\nimport { Condition } from \"./Condition\";\nimport { ContactCard } from \"./ContactCard\";\nimport { Container } from \"./Container\";\nimport { Context } from \"./Context\";\nimport { ContextActions } from \"./ContextActions\";\nimport { DataTable } from \"./DataTable\";\nimport { DataVisualization } from \"./DataVisualization\";\nimport { Divider } from \"./Divider\";\nimport { FallbackCanary } from \"./FallbackCanary\";\nimport { File } from \"./File\";\nimport { Header } from \"./Header\";\nimport { Image } from \"./Image\";\nimport { Input } from \"./Input\";\nimport { Markdown } from \"./Markdown\";\nimport { Plan } from \"./Plan\";\nimport { RichText } from \"./RichText\";\nimport { Section } from \"./Section\";\nimport { Table } from \"./Table\";\nimport { TaskCard } from \"./TaskCard\";\nimport { Video } from \"./Video\";\n\n// `any`: each component narrows the block itself.\nexport const blockComponents: Record<string, ComponentType<BlockProps<any>>> = {\n actions: Actions,\n alert: Alert,\n callout: Callout,\n card: Card,\n carousel: Carousel,\n condition: Condition,\n contact_card: ContactCard,\n container: Container,\n context: Context,\n context_actions: ContextActions,\n data_table: DataTable,\n data_visualization: DataVisualization,\n divider: Divider,\n fallback_canary: FallbackCanary,\n file: File,\n header: Header,\n image: Image,\n input: Input,\n markdown: Markdown,\n plan: Plan,\n rich_text: RichText,\n section: Section,\n table: Table,\n task_card: TaskCard,\n video: Video,\n};\n","import { Unsupported } from \"../elements/Unsupported\";\nimport type { Json } from \"../types\";\nimport { blockComponents } from \".\";\n\n/** Renders one block. `index` is used for the generated block_id, as Slack does for blocks without one. */\nexport function Block({ block, index }: { block: Json; index: number }) {\n const blockId = typeof block.block_id === \"string\" ? block.block_id : `block-${index}`;\n const Component = blockComponents[block.type];\n return (\n <div className={`sbk-block sbk-block--${block.type}`} data-block-id={blockId}>\n {Component ? (\n <Component block={block} blockId={blockId} index={index} />\n ) : (\n <Unsupported type={block.type} />\n )}\n </div>\n );\n}\n","import type { AnyBlock } from \"@slack/types\";\nimport { Block } from \"./blocks/Block\";\nimport type { Json } from \"./types\";\n\nexport function Blocks({ blocks }: { blocks: readonly (AnyBlock | Json)[] }) {\n return (\n <div className=\"sbk-blocks\">\n {blocks.map((block, i) => (\n <Block key={(block.block_id as string | undefined) ?? i} block={block as Json} index={i} />\n ))}\n </div>\n );\n}\n","import type { AnyBlock } from \"@slack/types\";\nimport { useMemo, useState } from \"react\";\nimport { Blocks } from \"./Blocks\";\nimport { actionTs, type MessageApi, type MessageUpdate, SurfaceScope } from \"./context\";\nimport { Mrkdwn } from \"./Mrkdwn\";\nimport { Tooltip } from \"./Tooltip\";\nimport { Link } from \"./Link\";\n\nfunction ordinal(n: number): string {\n const v = n % 100;\n if (v >= 11 && v <= 13) return `${n}th`;\n return `${n}${[\"th\", \"st\", \"nd\", \"rd\"][n % 10] ?? \"th\"}`;\n}\n\n/** Slack's timestamp tooltip, e.g. \"Monday, September 27th at 4:54:45 AM\". */\nfunction fullTimestamp(time: Date, timeZone?: string): string {\n const part = (options: Intl.DateTimeFormatOptions) =>\n time.toLocaleString(\"en-US\", { ...options, timeZone });\n const day = Number(part({ day: \"numeric\" }));\n const clock = part({ hour: \"numeric\", minute: \"2-digit\", second: \"2-digit\" });\n return `${part({ weekday: \"long\" })}, ${part({ month: \"long\" })} ${ordinal(day)} at ${clock}`;\n}\n\nexport interface MessageApp {\n name: string;\n iconUrl?: string;\n}\n\n/** A reaction as Slack stores it on a message (`reactions[]` from conversations.history). */\nexport interface SlackReaction {\n name: string;\n count: number;\n users?: string[];\n}\n\n/** One field of a legacy attachment (`attachments[].fields[]`). */\nexport interface SlackAttachmentField {\n title: string;\n value: string;\n short?: boolean;\n}\n\n/** A legacy attachment, as Slack still renders it (colour bar, pretext, title, fields, footer). */\nexport interface SlackAttachment {\n color?: string;\n pretext?: string;\n author_name?: string;\n author_icon?: string;\n author_link?: string;\n title?: string;\n title_link?: string;\n text?: string;\n fields?: SlackAttachmentField[];\n image_url?: string;\n footer?: string;\n footer_icon?: string;\n ts?: string | number;\n /** Slack also lets attachments carry Block Kit blocks directly. */\n blocks?: AnyBlock[];\n}\n\n/** A message object as returned by `conversations.history` / stored by `@emulators/slack`. */\nexport interface SlackMessageLike {\n ts?: string;\n channel?: string;\n blocks?: AnyBlock[];\n text?: string;\n username?: string;\n icon_url?: string;\n icon_emoji?: string;\n bot_profile?: { name?: string; icons?: { image_72?: string; image_48?: string } };\n edited?: { ts?: string; user?: string };\n attachments?: SlackAttachment[];\n reactions?: SlackReaction[];\n reply_count?: number;\n reply_users_count?: number;\n latest_reply?: string;\n subscribed?: boolean;\n}\n\nexport interface MessageProps {\n blocks?: AnyBlock[];\n /** Fallback text. Slack shows it only when there are no blocks. */\n text?: string;\n app?: MessageApp;\n /** Message timestamp (Slack `ts`, seconds). Defaults to now. */\n ts?: string | number;\n /** IANA zone for the displayed time. Defaults to the viewer's zone, like Slack. */\n timeZone?: string;\n /**\n * A Slack message object (e.g. from `conversations.history`, or as stored by\n * `@emulators/slack`). When given, it supplies blocks/text/ts and the sender header\n * (username/icon/bot_profile), plus attachments, reactions, thread summary and edited marker.\n * `blocks`/`text`/`app`/`ts` above still work standalone for simple previews.\n */\n message?: SlackMessageLike;\n /** The channel the message is in. Used for the `block_actions` container Slack would send. */\n channelId?: string;\n /** Slack's \"Only visible to you\" marker, shown for ephemeral messages. */\n isEphemeral?: boolean;\n}\n\nconst DEFAULT_APP: MessageApp = { name: \"Block Kit Preview\" };\n\n/** A message as it appears in a Slack channel: avatar, app name, APP badge, time and blocks. */\nexport function Message({\n blocks,\n text,\n app = DEFAULT_APP,\n ts,\n timeZone,\n message,\n channelId,\n isEphemeral,\n}: MessageProps) {\n // Without a `ts`, the message is stamped once at mount, so its timestamp stays stable across\n // renders and interactions still produce a `block_actions` payload with a `message_ts`.\n const [mountTs] = useState(() => actionTs());\n const resolvedTs = message?.ts ?? (ts === undefined ? mountTs : String(ts));\n const time = new Date(Number(resolvedTs) * 1000);\n\n // What an app sent back through the action's `message` handle (`chat.update`/`response_url`).\n // It applies until the props change content, so editing the source still shows the edit.\n const source = JSON.stringify([message?.blocks, message?.text, blocks, text]);\n const [replaced, setReplaced] = useState<{ source: string; update: MessageUpdate | null }>();\n const override = replaced?.source === source ? replaced.update : undefined;\n const api = useMemo<MessageApi>(\n () => ({\n update: (update) => setReplaced({ source, update }),\n delete: () => setReplaced({ source, update: null }),\n }),\n [source],\n );\n\n const resolvedBlocks = override ? override.blocks : (message?.blocks ?? blocks);\n const resolvedText = override ? override.text : (message?.text ?? text);\n const header = resolveHeader(message, app);\n const ephemeral = isEphemeral ?? false;\n\n if (override === null) return null;\n\n return (\n <SurfaceScope\n container={{\n type: \"message\",\n messageTs: resolvedTs,\n channelId: message?.channel ?? channelId,\n isEphemeral: ephemeral,\n // Slack sends the message as it is now, so a replaced one carries its new content.\n message: override\n ? {\n type: \"message\",\n ...message,\n ts: resolvedTs,\n blocks: override.blocks,\n text: override.text,\n }\n : (message as Record<string, unknown> | undefined),\n }}\n message={api}\n >\n <div className=\"sbk-root sbk-message\">\n {header.iconUrl ? (\n <img className=\"sbk-message__avatar\" src={header.iconUrl} alt=\"\" />\n ) : (\n <span className=\"sbk-message__avatar sbk-message__avatar--placeholder\" aria-hidden>\n {header.name.charAt(0)}\n </span>\n )}\n <div className=\"sbk-message__content\">\n <div className=\"sbk-message__header\">\n <span className=\"sbk-message__sender\">{header.name}</span>\n {header.isApp && <span className=\"sbk-message__badge\">APP</span>}\n <Tooltip label={fullTimestamp(time, timeZone)}>\n <time className=\"sbk-message__time\" dateTime={time.toISOString()}>\n {time.toLocaleTimeString(\"en-US\", { hour: \"numeric\", minute: \"2-digit\", timeZone })}\n </time>\n </Tooltip>\n {message?.edited && <span className=\"sbk-message__edited\">(edited)</span>}\n </div>\n\n {resolvedBlocks && resolvedBlocks.length > 0 ? (\n <Blocks blocks={resolvedBlocks} />\n ) : (\n resolvedText && <Mrkdwn text={resolvedText} />\n )}\n\n {message?.attachments && message.attachments.length > 0 && (\n <div className=\"sbk-attachments\">\n {message.attachments.map((attachment, i) => (\n <Attachment key={i} attachment={attachment} />\n ))}\n </div>\n )}\n\n {message?.reactions && message.reactions.length > 0 && (\n <div className=\"sbk-reactions\">\n {message.reactions.map((reaction) => (\n <Tooltip key={reaction.name} label={`:${reaction.name}:`}>\n <span className=\"sbk-reactions__item\">\n <span className=\"sbk-reactions__emoji\">:{reaction.name}:</span>\n <span className=\"sbk-reactions__count\">{reaction.count}</span>\n </span>\n </Tooltip>\n ))}\n </div>\n )}\n\n {message && (message.reply_count ?? 0) > 0 && (\n <button type=\"button\" className=\"sbk-thread-summary\">\n <span className=\"sbk-thread-summary__count\">\n {message.reply_count} {message.reply_count === 1 ? \"reply\" : \"replies\"}\n </span>\n {message.subscribed && <span className=\"sbk-thread-summary__subscribed\">●</span>}\n </button>\n )}\n\n {ephemeral && <div className=\"sbk-message__ephemeral\">Only visible to you</div>}\n </div>\n </div>\n </SurfaceScope>\n );\n}\n\ninterface ResolvedHeader {\n name: string;\n iconUrl?: string;\n isApp: boolean;\n}\n\nfunction resolveHeader(message: SlackMessageLike | undefined, app: MessageApp): ResolvedHeader {\n if (!message) return { name: app.name, iconUrl: app.iconUrl, isApp: true };\n const name = message.username ?? message.bot_profile?.name ?? app.name;\n const iconUrl =\n message.icon_url ??\n message.bot_profile?.icons?.image_72 ??\n message.bot_profile?.icons?.image_48;\n return {\n name,\n iconUrl,\n isApp: Boolean(message.username || message.bot_profile || message.icon_url),\n };\n}\n\nfunction Attachment({ attachment }: { attachment: SlackAttachment }) {\n return (\n <div className=\"sbk-attachment\" style={{ borderLeftColor: normalizeColor(attachment.color) }}>\n <div className=\"sbk-attachment__body\">\n {attachment.pretext && (\n <div className=\"sbk-attachment__pretext\">\n <Mrkdwn text={attachment.pretext} />\n </div>\n )}\n {attachment.author_name && (\n <div className=\"sbk-attachment__author\">\n {attachment.author_icon && (\n <img className=\"sbk-attachment__author-icon\" src={attachment.author_icon} alt=\"\" />\n )}\n {attachment.author_link ? (\n <Link\n className=\"sbk-link\"\n href={attachment.author_link}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {attachment.author_name}\n </Link>\n ) : (\n attachment.author_name\n )}\n </div>\n )}\n {attachment.title && (\n <div className=\"sbk-attachment__title\">\n {attachment.title_link ? (\n <Link\n className=\"sbk-link\"\n href={attachment.title_link}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {attachment.title}\n </Link>\n ) : (\n attachment.title\n )}\n </div>\n )}\n {attachment.text && (\n <div className=\"sbk-attachment__text\">\n <Mrkdwn text={attachment.text} />\n </div>\n )}\n {attachment.fields && attachment.fields.length > 0 && (\n <div className=\"sbk-attachment__fields\">\n {attachment.fields.map((field, i) => (\n <div\n key={i}\n className={`sbk-attachment__field${field.short ? \" sbk-attachment__field--short\" : \"\"}`}\n >\n <div className=\"sbk-attachment__field-title\">{field.title}</div>\n <div className=\"sbk-attachment__field-value\">\n <Mrkdwn text={field.value} />\n </div>\n </div>\n ))}\n </div>\n )}\n {attachment.image_url && (\n <img className=\"sbk-attachment__image\" src={attachment.image_url} alt=\"\" />\n )}\n {attachment.blocks && attachment.blocks.length > 0 && <Blocks blocks={attachment.blocks} />}\n {attachment.footer && (\n <div className=\"sbk-attachment__footer\">\n {attachment.footer_icon && (\n <img className=\"sbk-attachment__footer-icon\" src={attachment.footer_icon} alt=\"\" />\n )}\n {attachment.footer}\n </div>\n )}\n </div>\n </div>\n );\n}\n\nfunction normalizeColor(color: string | undefined): string | undefined {\n if (!color) return undefined;\n if (color === \"good\") return \"#2eb67d\";\n if (color === \"warning\") return \"#ecb22e\";\n if (color === \"danger\") return \"#e01e5a\";\n return color.startsWith(\"#\") ? color : `#${color}`;\n}\n","import { Blocks } from \"../Blocks\";\nimport { SurfaceScope, useLiveView } from \"../context\";\nimport type { ViewLike } from \"../payloads\";\n\nexport interface HomeTabView extends ViewLike {\n type: \"home\";\n}\n\nexport interface HomeTabProps {\n view: HomeTabView;\n}\n\n/** A Slack Home tab: just its blocks, laid out full width like Slack's App Home. */\nexport function HomeTab({ view: viewProp }: HomeTabProps) {\n // `views.publish` (or `views.update`) from an action swaps the content, as it would in Slack.\n const { view } = useLiveView(viewProp);\n\n return (\n <div className=\"sbk-root sbk-home\" data-surface=\"home\">\n <div className=\"sbk-home__menu\">\n <span className=\"sbk-home__tab\">\n <HomeIcon /> Home\n </span>\n </div>\n <div className=\"sbk-home__content\">\n <SurfaceScope container={{ type: \"view\", view }}>\n <Blocks blocks={view.blocks} />\n </SurfaceScope>\n </div>\n </div>\n );\n}\n\n/** A filled house with a small window, like the glyph on Slack's Home tab. */\nfunction HomeIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" aria-hidden>\n <path\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n d=\"M9.3 2.4a1.25 1.25 0 0 1 1.4 0l7 4.7a.75.75 0 0 1-.7 1.3v6.2c0 2.1-1.7 3.9-3.8 3.9H6.8C4.7 18.5 3 16.7 3 14.6V8.4a.75.75 0 0 1-.7-1.3zM11.5 10.5a.5.5 0 0 0-.5.5v1.5a.5.5 0 0 0 .5.5H13a.5.5 0 0 0 .5-.5V11a.5.5 0 0 0-.5-.5z\"\n />\n </svg>\n );\n}\n","import { HomeTab, type HomeTabView } from \"./HomeTab\";\nimport { Modal, type ModalView } from \"./Modal\";\n\nexport type AnyView = ModalView | HomeTabView;\n\nexport interface ViewProps {\n view: AnyView;\n /** App icon shown before the modal title. No effect on the Home tab (Slack doesn't show it there). */\n icon?: string;\n}\n\n/** Dispatches a Slack `view` payload (as from `views.open`/`views.publish`) to `<Modal>` or `<HomeTab>`. */\nexport function View({ view, icon }: ViewProps) {\n if (view.type === \"home\") return <HomeTab view={view} />;\n return <Modal view={view} icon={icon} />;\n}\n"],"mappings":"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WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,IAAI;CACJ,WAAW;CACX,WAAW;CACX,WAAW;CACX,aAAa;CACb,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,IAAI;CACJ,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,IAAI;CACJ,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,IAAI;CACJ,WAAW;CACX,WAAW;CACX,IAAI;CACJ,IAAI;CACJ,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,IAAI;CACJ,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,IAAI;CACJ,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,IAAI;CACJ,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,IAAI;CACJ,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,IAAI;CACJ,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,WAAW;CACX,MAAM;CACN,IAAI;CACJ,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AAe;CACf,kBAAkB;CAClB,aAAa;CACb,wBAAwB;CACxB,uCAAuC;CACvC,eAAe;CACf,eAAe;CACf,OAAO;CACP,iBAAiB;CACjB,kBAAkB;CAClB,qBAAqB;CACrB,aAAa;CACb,YAAY;CACZ,MAAM;CACN,kBAAkB;CAClB,oBAAoB;CACpB,YAAY;CACZ,UAAU;CACV,YAAY;CACZ,oBAAoB;CACpB,oBAAoB;CACpB,MAAM;CACN,GAAG;CACH,WAAW;CACX,uBAAuB;CACvB,iBAAiB;CACjB,QAAQ;AACV;;AAGA,MAAa,mBAA6C;CACxD,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,uCAAuC;EACrC;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,uCAAuC;EACrC;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,6BAA6B;EAC3B;EACA;EACA;EACA;EACA;CACF;CACA,6BAA6B;EAC3B;EACA;EACA;EACA;EACA;CACF;CACA,cAAc;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACxF,6BAA6B;EAC3B;EACA;EACA;EACA;EACA;CACF;CACA,6BAA6B;EAC3B;EACA;EACA;EACA;EACA;CACF;CACA,cAAc;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACxF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,mCAAmC;EACjC;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,mCAAmC;EACjC;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,mCAAmC;EACjC;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,mCAAmC;EACjC;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,mCAAmC;EACjC;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,mCAAmC;EACjC;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,cAAc;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACxF,6BAA6B;EAC3B;EACA;EACA;EACA;EACA;CACF;CACA,6BAA6B;EAC3B;EACA;EACA;EACA;EACA;CACF;CACA,cAAc;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACxF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,cAAc;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACxF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,uCAAuC;EACrC;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,uCAAuC;EACrC;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,uCAAuC;EACrC;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,uCAAuC;EACrC;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,mCAAmC;EACjC;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,mCAAmC;EACjC;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,mCAAmC;EACjC;EACA;EACA;EACA;EACA;CACF;CACA,oBAAoB;EAClB;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,SAAS;EAAC;EAAe;EAAe;EAAe;EAAe;CAAa;CACnF,wBAAwB;EACtB;EACA;EACA;EACA;EACA;CACF;CACA,wBAAwB;EACtB;EA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"}
|