react-blockkit 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +203 -0
  3. package/dist/Block.d.ts +13 -0
  4. package/dist/Block.d.ts.map +1 -0
  5. package/dist/BlockKit.d.ts +13 -0
  6. package/dist/BlockKit.d.ts.map +1 -0
  7. package/dist/assert-never.d.ts +2 -0
  8. package/dist/assert-never.d.ts.map +1 -0
  9. package/dist/blocks/AdvancedBlocks.d.ts +21 -0
  10. package/dist/blocks/AdvancedBlocks.d.ts.map +1 -0
  11. package/dist/blocks/BasicBlocks.d.ts +21 -0
  12. package/dist/blocks/BasicBlocks.d.ts.map +1 -0
  13. package/dist/blocks/Charts.d.ts +4 -0
  14. package/dist/blocks/Charts.d.ts.map +1 -0
  15. package/dist/blocks/InteractiveBlocks.d.ts +6 -0
  16. package/dist/blocks/InteractiveBlocks.d.ts.map +1 -0
  17. package/dist/constants.d.ts +54 -0
  18. package/dist/constants.d.ts.map +1 -0
  19. package/dist/context.d.ts +17 -0
  20. package/dist/context.d.ts.map +1 -0
  21. package/dist/elements/Elements.d.ts +51 -0
  22. package/dist/elements/Elements.d.ts.map +1 -0
  23. package/dist/errors.d.ts +12 -0
  24. package/dist/errors.d.ts.map +1 -0
  25. package/dist/index.cjs +6 -0
  26. package/dist/index.cjs.map +1 -0
  27. package/dist/index.d.ts +28 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +4707 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/runtime.d.ts +6 -0
  32. package/dist/runtime.d.ts.map +1 -0
  33. package/dist/safe-url.d.ts +2 -0
  34. package/dist/safe-url.d.ts.map +1 -0
  35. package/dist/styles.css +1502 -0
  36. package/dist/styles.d.ts +21 -0
  37. package/dist/styles.d.ts.map +1 -0
  38. package/dist/text/Markdown.d.ts +34 -0
  39. package/dist/text/Markdown.d.ts.map +1 -0
  40. package/dist/text/Mrkdwn.d.ts +37 -0
  41. package/dist/text/Mrkdwn.d.ts.map +1 -0
  42. package/dist/text/RichText.d.ts +9 -0
  43. package/dist/text/RichText.d.ts.map +1 -0
  44. package/dist/text/Text.d.ts +10 -0
  45. package/dist/text/Text.d.ts.map +1 -0
  46. package/dist/text/date.d.ts +6 -0
  47. package/dist/text/date.d.ts.map +1 -0
  48. package/dist/text/emoji.d.ts +3 -0
  49. package/dist/text/emoji.d.ts.map +1 -0
  50. package/dist/tokens.stylex.d.ts +8 -0
  51. package/dist/tokens.stylex.d.ts.map +1 -0
  52. package/dist/types.d.ts +221 -0
  53. package/dist/types.d.ts.map +1 -0
  54. package/dist/validation.d.ts +11 -0
  55. package/dist/validation.d.ts.map +1 -0
  56. package/docs/coverage-matrix.md +80 -0
  57. package/docs/parity/chart-bar-3-w580-dark.png +0 -0
  58. package/docs/parity/chart-bar-3-w580-light.png +0 -0
  59. package/docs/parity/chart-line-3-w580-light.png +0 -0
  60. package/docs/parity/chart-pie-12-w400-light.png +0 -0
  61. package/docs/parity/chart-pie-5-w580-light.png +0 -0
  62. package/docs/parity/data-table-w580-dark.png +0 -0
  63. package/docs/parity/data-table-w580-light.png +0 -0
  64. package/docs/parity/headers-levels-w580-light.png +0 -0
  65. package/docs/parity/rich-text-full-w580-light.png +0 -0
  66. package/docs/parity/spacing-rhythm-w580-light.png +0 -0
  67. package/docs/parity/table-align-wrap-w580-light.png +0 -0
  68. package/docs/parity/table-basic-w580-light.png +0 -0
  69. package/docs/slack-style-baseline.md +260 -0
  70. package/package.json +83 -0
@@ -0,0 +1,21 @@
1
+ import * as stylex from "@stylexjs/stylex";
2
+ type StyleKey = "accessory" | "accessoryImage" | "actions" | "alert" | "alertError" | "alertInfo" | "alertSuccess" | "alertWarning" | "block" | "bold" | "button" | "buttonDanger" | "buttonPrimary" | "card" | "cardActions" | "cardContent" | "cardHeading" | "cardHero" | "cardIcon" | "cardTitle" | "carousel" | "carouselCard" | "chartAreaFallbackFill" | "chartAreaFill" | "chartCanvas" | "chartCard" | "chartContent" | "chartGridline" | "chartLegend" | "chartLegendCartesian" | "chartLegendItem" | "chartLegendSwatch" | "chartLinePath" | "chartPlotArea" | "chartScroller" | "chartSvg" | "chartTickText" | "chartTitle" | "chartXAxisLabel" | "chartYAxisLabel" | "chartYAxisLabelText" | "choice" | "choiceGroup" | "colorSwatch" | "container" | "containerBody" | "containerHeader" | "containerHeaderDivider" | "context" | "contextElement" | "contextImage" | "contextText" | "dataTable" | "dataTableBand" | "dataTableBandUnpaginated" | "dataTableFilter" | "dataTableFilterInput" | "dataTableHeaderBar" | "dataTableIconButton" | "dataTablePageButton" | "dataTablePageButtonActive" | "dataTablePageChevron" | "dataTablePagination" | "dataTableRadiusBottomEnd" | "dataTableRadiusBottomStart" | "dataTableRadiusTopEnd" | "dataTableRadiusTopStart" | "dataTableTable" | "dataTableTd" | "dataTableTh" | "dataTableTitle" | "divider" | "fields" | "file" | "heading" | "heading1" | "heading2" | "heading3" | "heading4" | "iconButton" | "image" | "inlineCode" | "input" | "inputBlock" | "inputLabel" | "italic" | "link" | "list" | "listBullet" | "listBulletAlternate" | "listBulletSquare" | "listItemBullet" | "listItemOrdered" | "listOrdered" | "listOrderedAlpha" | "listOrderedRoman" | "markdown" | "mention" | "overflowButton" | "picker" | "pickerChevron" | "pickerIcon" | "pieSlice" | "plan" | "pre" | "quote" | "reference" | "required" | "richBorder" | "richSection" | "richText" | "root" | "rootDark" | "rootLight" | "section" | "sectionContent" | "select" | "smallText" | "strike" | "table" | "tableCell" | "tableCellFirstColumn" | "tableCellWrapped" | "tableHeader" | "tableScroller" | "task" | "taskHeading" | "taskStatus" | "text" | "unhandled" | "underline" | "visuallyHidden";
3
+ export declare const styles: Readonly<Record<StyleKey, stylex.StyleXStyles>>;
4
+ export interface ChartSeriesStyle {
5
+ /** SVG fill in the series color (bars, pie slices). */
6
+ readonly fill: stylex.StyleXStyles;
7
+ /** SVG stroke in the series color (lines, area outlines). */
8
+ readonly stroke: stylex.StyleXStyles;
9
+ /** Legend swatch background in the series color. */
10
+ readonly swatch: stylex.StyleXStyles;
11
+ /**
12
+ * Area fill. Indices 1-6 use the measured pastel tints; 7-12 fall back to
13
+ * the series color (rendered at reduced opacity by the area style).
14
+ */
15
+ readonly tint: stylex.StyleXStyles;
16
+ }
17
+ export declare const defaultChartSeriesStyle: ChartSeriesStyle;
18
+ export declare const chartSeriesStyles: readonly ChartSeriesStyle[];
19
+ export declare function joinClassNames(generated: string | undefined, supplied: string | undefined): string | undefined;
20
+ export {};
21
+ //# sourceMappingURL=styles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../src/styles.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import type { ReactElement } from "react";
2
+ type MarkdownBlockToken = {
3
+ readonly kind: "code";
4
+ readonly language?: string;
5
+ readonly text: string;
6
+ } | {
7
+ readonly kind: "divider";
8
+ } | {
9
+ readonly kind: "heading";
10
+ readonly level: number;
11
+ readonly text: string;
12
+ } | {
13
+ readonly items: readonly {
14
+ readonly checked?: boolean;
15
+ readonly task: boolean;
16
+ readonly text: string;
17
+ }[];
18
+ readonly kind: "list";
19
+ readonly ordered: boolean;
20
+ } | {
21
+ readonly kind: "paragraph" | "quote";
22
+ readonly text: string;
23
+ } | {
24
+ readonly headers: readonly string[];
25
+ readonly kind: "table";
26
+ readonly rows: readonly (readonly string[])[];
27
+ };
28
+ export declare function tokenizeMarkdown(markdown: string): readonly MarkdownBlockToken[];
29
+ export interface MarkdownProps {
30
+ readonly markdown: string;
31
+ }
32
+ export declare function Markdown({ markdown }: MarkdownProps): ReactElement;
33
+ export {};
34
+ //# sourceMappingURL=Markdown.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Markdown.d.ts","sourceRoot":"","sources":["../../src/text/Markdown.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAa,MAAM,OAAO,CAAC;AAKrD,KAAK,kBAAkB,GACnB;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC5E;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;CAAE,GAC5B;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC3E;IACE,QAAQ,CAAC,KAAK,EAAE,SAAS;QACvB,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;QAC3B,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;QACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;KACvB,EAAE,CAAC;IACJ,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B,GACD;IAAE,QAAQ,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC/D;IACE,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,CAAC;CAC/C,CAAC;AAiDN,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,kBAAkB,EAAE,CA+FhF;AAoHD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,wBAAgB,QAAQ,CAAC,EAAE,QAAQ,EAAE,EAAE,aAAa,GAAG,YAAY,CAQlE"}
@@ -0,0 +1,37 @@
1
+ import type { ReactElement } from "react";
2
+ export type MrkdwnToken = {
3
+ readonly kind: "text";
4
+ readonly value: string;
5
+ } | {
6
+ readonly children: readonly MrkdwnToken[];
7
+ readonly kind: "bold" | "italic" | "strike";
8
+ } | {
9
+ readonly kind: "code";
10
+ readonly value: string;
11
+ } | {
12
+ readonly kind: "code_block";
13
+ readonly value: string;
14
+ } | {
15
+ readonly kind: "emoji";
16
+ readonly name: string;
17
+ } | {
18
+ readonly href: string;
19
+ readonly kind: "link";
20
+ readonly label: string;
21
+ } | {
22
+ readonly fallback?: string;
23
+ readonly format?: string;
24
+ readonly href?: string;
25
+ readonly id: string;
26
+ readonly kind: "channel" | "date" | "team" | "user" | "usergroup";
27
+ } | {
28
+ readonly kind: "broadcast";
29
+ readonly range: string;
30
+ };
31
+ export declare function tokenizeMrkdwn(text: string): readonly MrkdwnToken[];
32
+ export interface MrkdwnProps {
33
+ readonly className?: string | undefined;
34
+ readonly text: string;
35
+ }
36
+ export declare function Mrkdwn({ className, text }: MrkdwnProps): ReactElement;
37
+ //# sourceMappingURL=Mrkdwn.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Mrkdwn.d.ts","sourceRoot":"","sources":["../../src/text/Mrkdwn.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAa,MAAM,OAAO,CAAC;AAQrD,MAAM,MAAM,WAAW,GACnB;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACjD;IACE,QAAQ,CAAC,QAAQ,EAAE,SAAS,WAAW,EAAE,CAAC;IAC1C,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC;CAC7C,GACD;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACjD;IAAE,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACvD;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACjD;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACxE;IACE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,WAAW,CAAC;CACnE,GACD;IAAE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAgJ3D,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,WAAW,EAAE,CAEnE;AAgGD,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACxC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,MAAM,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,WAAW,GAAG,YAAY,CASrE"}
@@ -0,0 +1,9 @@
1
+ import type { ReactElement } from "react";
2
+ import type { RichTextBlockData } from "../types.js";
3
+ export interface RichTextProps {
4
+ readonly block: RichTextBlockData;
5
+ readonly className?: string | undefined;
6
+ readonly path?: string | undefined;
7
+ }
8
+ export declare function RichText({ block, className, path }: RichTextProps): ReactElement;
9
+ //# sourceMappingURL=RichText.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RichText.d.ts","sourceRoot":"","sources":["../../src/text/RichText.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAiB,YAAY,EAAa,MAAM,OAAO,CAAC;AAMpE,OAAO,KAAK,EACV,iBAAiB,EAIlB,MAAM,aAAa,CAAC;AAwbrB,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,KAAK,EAAE,iBAAiB,CAAC;IAClC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACxC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACpC;AAED,wBAAgB,QAAQ,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,IAAc,EAAE,EAAE,aAAa,GAAG,YAAY,CAqB1F"}
@@ -0,0 +1,10 @@
1
+ import type { ReactElement } from "react";
2
+ import type { TextObjectData } from "../types.js";
3
+ export interface TextProps {
4
+ readonly className?: string | undefined;
5
+ readonly maxLength?: number | undefined;
6
+ readonly path?: string | undefined;
7
+ readonly text: TextObjectData;
8
+ }
9
+ export declare function Text({ className, text }: TextProps): ReactElement;
10
+ //# sourceMappingURL=Text.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Text.d.ts","sourceRoot":"","sources":["../../src/text/Text.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAG1C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAGlD,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACxC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACxC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;CAC/B;AAED,wBAAgB,IAAI,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,SAAS,GAAG,YAAY,CAejE"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Formats Slack date tokens deterministically in UTC. Relative tokens such as
3
+ * `{ago}` require a clock, so they intentionally use Slack's supplied fallback.
4
+ */
5
+ export declare function formatSlackDate(timestamp: number, format: string, fallback?: string): string;
6
+ //# sourceMappingURL=date.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"date.d.ts","sourceRoot":"","sources":["../../src/text/date.ts"],"names":[],"mappings":"AAgGA;;;GAGG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAoB5F"}
@@ -0,0 +1,3 @@
1
+ export declare function coreEmojiGlyph(name: string): string | undefined;
2
+ export declare function unicodeEmoji(unicode: string | undefined): string | undefined;
3
+ //# sourceMappingURL=emoji.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emoji.d.ts","sourceRoot":"","sources":["../../src/text/emoji.ts"],"names":[],"mappings":"AA6CA,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAE/D;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAa5E"}
@@ -0,0 +1,8 @@
1
+ import * as stylex from "@stylexjs/stylex";
2
+ type TokenName = "border" | "borderStrong" | "chartAreaFallbackOpacity" | "chartSeries1" | "chartSeries2" | "chartSeries3" | "chartSeries4" | "chartSeries5" | "chartSeries6" | "chartSeries7" | "chartSeries8" | "chartSeries9" | "chartSeries10" | "chartSeries11" | "chartSeries12" | "chartSeriesTint1" | "chartSeriesTint2" | "chartSeriesTint3" | "chartSeriesTint4" | "chartSeriesTint5" | "chartSeriesTint6" | "chartTickFontFamily" | "chartTickText" | "codeSurface" | "codeText" | "codeBorder" | "controlBorder" | "contextText" | "danger" | "dangerHover" | "fadedText" | "focus" | "fontFamily" | "fontSize" | "info" | "inlineCodeSurface" | "largeFontSize" | "largeLineHeight" | "lineHeight" | "link" | "linkHover" | "mentionSurface" | "monoFamily" | "outlineFaint" | "primary" | "primaryHover" | "quoteBar" | "radiusLarge" | "radiusMedium" | "radiusSmall" | "selectionSurface" | "shadow" | "smallFontSize" | "smallLineHeight" | "space1" | "space2" | "space3" | "space4" | "space5" | "space6" | "success" | "sunkenBand" | "surface" | "surfaceRaised" | "surfaceSunken" | "text" | "textFaint" | "textSecondary" | "warning";
3
+ type TokenValues = Readonly<Record<TokenName, string>>;
4
+ export declare const tokens: stylex.VarGroup<TokenValues>;
5
+ export declare const lightTheme: stylex.Theme<typeof tokens>;
6
+ export declare const darkTheme: stylex.Theme<typeof tokens>;
7
+ export {};
8
+ //# sourceMappingURL=tokens.stylex.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.stylex.d.ts","sourceRoot":"","sources":["../src/tokens.stylex.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,kBAAkB,CAAC;AAE3C,KAAK,SAAS,GACV,QAAQ,GACR,cAAc,GACd,0BAA0B,GAC1B,cAAc,GACd,cAAc,GACd,cAAc,GACd,cAAc,GACd,cAAc,GACd,cAAc,GACd,cAAc,GACd,cAAc,GACd,cAAc,GACd,eAAe,GACf,eAAe,GACf,eAAe,GACf,kBAAkB,GAClB,kBAAkB,GAClB,kBAAkB,GAClB,kBAAkB,GAClB,kBAAkB,GAClB,kBAAkB,GAClB,qBAAqB,GACrB,eAAe,GACf,aAAa,GACb,UAAU,GACV,YAAY,GACZ,eAAe,GACf,aAAa,GACb,QAAQ,GACR,aAAa,GACb,WAAW,GACX,OAAO,GACP,YAAY,GACZ,UAAU,GACV,MAAM,GACN,mBAAmB,GACnB,eAAe,GACf,iBAAiB,GACjB,YAAY,GACZ,MAAM,GACN,WAAW,GACX,gBAAgB,GAChB,YAAY,GACZ,cAAc,GACd,SAAS,GACT,cAAc,GACd,UAAU,GACV,aAAa,GACb,cAAc,GACd,aAAa,GACb,kBAAkB,GAClB,QAAQ,GACR,eAAe,GACf,iBAAiB,GACjB,QAAQ,GACR,QAAQ,GACR,QAAQ,GACR,QAAQ,GACR,QAAQ,GACR,QAAQ,GACR,SAAS,GACT,YAAY,GACZ,SAAS,GACT,eAAe,GACf,eAAe,GACf,MAAM,GACN,WAAW,GACX,eAAe,GACf,SAAS,CAAC;AAEd,KAAK,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;AAEvD,eAAO,MAAM,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,WAAW,CAsE9C,CAAC;AAEH,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,MAAM,CAsEjD,CAAC;AAEH,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,MAAM,CAsEhD,CAAC"}
@@ -0,0 +1,221 @@
1
+ import type { ActionsBlock, ActionsBlockElement, Button, CardBlock as SlackCardBlock, HeaderBlock as SlackHeaderBlock, KnownBlock, Option, PlainTextElement, RawTextElement, RichTextBlock as SlackRichTextBlock, RichTextElement, RichTextLink, RichTextList as SlackRichTextList, RichTextPreformatted as SlackRichTextPreformatted, RichTextQuote as SlackRichTextQuote, RichTextSection as SlackRichTextSection, RichTextText, SectionBlockAccessory, TaskCardBlock, TableBlock as SlackTableBlock, TextObject, InputBlockElement } from "@slack/types";
2
+ import type { ReactNode } from "react";
3
+ export type DeepReadonly<T> = T extends (...arguments_: never[]) => unknown ? T : T extends readonly (infer TItem)[] ? readonly DeepReadonly<TItem>[] : T extends object ? {
4
+ readonly [TKey in keyof T]: DeepReadonly<T[TKey]> | ({} extends Pick<T, TKey> ? undefined : never);
5
+ } : T;
6
+ export type BlockKitSurface = "message" | "modal" | "home";
7
+ export type BlockKitTheme = "light" | "dark";
8
+ export interface HeaderBlockData extends DeepReadonly<SlackHeaderBlock> {
9
+ readonly level?: 1 | 2 | 3 | 4;
10
+ }
11
+ export interface RawNumberElement {
12
+ readonly type: "raw_number";
13
+ readonly value: number;
14
+ readonly text?: string;
15
+ }
16
+ export interface RichTextCitationElementData {
17
+ readonly type: "citation";
18
+ readonly url?: string;
19
+ readonly text?: string;
20
+ readonly index?: number;
21
+ readonly details: Readonly<Record<string, unknown>>;
22
+ readonly from_llm?: boolean;
23
+ readonly is_slack_url?: boolean;
24
+ }
25
+ export interface RichTextReferenceElementData {
26
+ readonly type: "attachment_mention" | "canvas" | "canvas_message_unfurl" | "canvas_user_mention" | "file" | "list_record" | "message_mention" | "salesforce_data_field" | "tag" | "work_object_mention" | "workflow_mention";
27
+ readonly id?: string;
28
+ readonly text?: string;
29
+ readonly url?: string;
30
+ readonly user_id?: string;
31
+ readonly channel_id?: string;
32
+ readonly team_id?: string;
33
+ readonly file_id?: string;
34
+ readonly canvas_id?: string;
35
+ readonly record_id?: string;
36
+ readonly message_ts?: string;
37
+ readonly workflow_id?: string;
38
+ }
39
+ export type RichTextInlineElementData = DeepReadonly<RichTextElement> | RichTextCitationElementData | RichTextReferenceElementData;
40
+ export interface RichTextSectionData extends Omit<DeepReadonly<SlackRichTextSection>, "elements"> {
41
+ readonly elements: readonly RichTextInlineElementData[];
42
+ }
43
+ export interface RichTextListData extends Omit<DeepReadonly<SlackRichTextList>, "elements"> {
44
+ readonly elements: readonly RichTextSectionData[];
45
+ readonly offset?: number;
46
+ }
47
+ export interface RichTextQuoteData extends Omit<DeepReadonly<SlackRichTextQuote>, "elements"> {
48
+ readonly elements: readonly RichTextInlineElementData[];
49
+ }
50
+ export interface RichTextPreformattedData extends Omit<DeepReadonly<SlackRichTextPreformatted>, "elements"> {
51
+ readonly elements: readonly DeepReadonly<RichTextText | RichTextLink>[];
52
+ readonly language?: string;
53
+ }
54
+ export type RichTextBlockElementData = RichTextSectionData | RichTextListData | RichTextQuoteData | RichTextPreformattedData;
55
+ export interface RichTextBlockData extends Omit<DeepReadonly<SlackRichTextBlock>, "elements"> {
56
+ readonly elements: readonly RichTextBlockElementData[];
57
+ }
58
+ export type TableCellData = DeepReadonly<RawTextElement> | RawNumberElement | RichTextBlockData;
59
+ export interface TableColumnSettings {
60
+ readonly align?: "left" | "center" | "right" | undefined;
61
+ readonly is_wrapped?: boolean | undefined;
62
+ }
63
+ export interface TableBlockData extends Omit<DeepReadonly<SlackTableBlock>, "rows" | "column_settings"> {
64
+ readonly rows: readonly (readonly TableCellData[])[];
65
+ readonly column_settings?: readonly (TableColumnSettings | null)[] | undefined;
66
+ }
67
+ export interface DataTableBlockData {
68
+ readonly type: "data_table";
69
+ readonly block_id?: string;
70
+ readonly rows: readonly (readonly TableCellData[])[];
71
+ readonly caption: string;
72
+ readonly page_size?: number;
73
+ readonly row_header_column_index?: number;
74
+ }
75
+ export interface PieChartSegment {
76
+ readonly label: string;
77
+ readonly value: number;
78
+ }
79
+ export interface PieChartData {
80
+ readonly type: "pie";
81
+ readonly segments: readonly PieChartSegment[];
82
+ }
83
+ export interface CartesianChartPoint {
84
+ readonly label: string;
85
+ readonly value: number;
86
+ }
87
+ export interface CartesianChartSeries {
88
+ readonly name: string;
89
+ readonly data: readonly CartesianChartPoint[];
90
+ }
91
+ export interface ChartAxisConfig {
92
+ readonly categories: readonly string[];
93
+ readonly x_label?: string;
94
+ readonly y_label?: string;
95
+ }
96
+ export interface CartesianChartData {
97
+ readonly type: "bar" | "area" | "line";
98
+ readonly series: readonly CartesianChartSeries[];
99
+ readonly axis_config: ChartAxisConfig;
100
+ }
101
+ export interface DataVisualizationBlockData {
102
+ readonly type: "data_visualization";
103
+ readonly block_id?: string;
104
+ readonly title: string;
105
+ readonly chart: PieChartData | CartesianChartData;
106
+ }
107
+ export interface CardBlockData extends Omit<DeepReadonly<SlackCardBlock>, "title" | "subtitle" | "body" | "actions" | "hero_image" | "icon"> {
108
+ readonly hero_image?: DeepReadonly<SlackCardBlock["hero_image"]>;
109
+ readonly icon?: DeepReadonly<SlackCardBlock["icon"]>;
110
+ readonly title?: DeepReadonly<TextObject>;
111
+ readonly subtitle?: DeepReadonly<TextObject>;
112
+ readonly body?: DeepReadonly<TextObject>;
113
+ readonly subtext?: DeepReadonly<TextObject>;
114
+ readonly actions?: readonly DeepReadonly<Button>[];
115
+ readonly slack_icon?: {
116
+ readonly type: "icon";
117
+ readonly name: string;
118
+ };
119
+ }
120
+ export interface CarouselBlockData {
121
+ readonly type: "carousel";
122
+ readonly block_id?: string;
123
+ readonly elements: readonly CardBlockData[];
124
+ }
125
+ export interface PlanBlockData {
126
+ readonly type: "plan";
127
+ readonly block_id?: string;
128
+ readonly title: string;
129
+ readonly tasks?: readonly DeepReadonly<TaskCardBlock>[];
130
+ }
131
+ type OfficialContainerChild = DeepReadonly<Extract<KnownBlock, {
132
+ readonly type: "actions" | "context" | "divider" | "file" | "header" | "image" | "input" | "rich_text" | "section" | "table" | "video";
133
+ }>>;
134
+ export type ContainerChildBlock = OfficialContainerChild | HeaderBlockData | RichTextBlockData | TableBlockData;
135
+ export interface ContainerBlockData {
136
+ readonly type: "container";
137
+ readonly block_id?: string;
138
+ readonly title?: DeepReadonly<PlainTextElement>;
139
+ readonly rich_text_title?: RichTextBlockData;
140
+ readonly subtitle?: DeepReadonly<PlainTextElement>;
141
+ readonly child_blocks: readonly ContainerChildBlock[];
142
+ readonly width?: "narrow" | "standard" | "wide" | "full";
143
+ readonly icon?: DeepReadonly<SlackCardBlock["icon"]>;
144
+ readonly is_collapsible?: boolean;
145
+ readonly default_collapsed?: boolean;
146
+ readonly has_header_divider?: boolean;
147
+ }
148
+ type ReplacedOfficialBlock = DeepReadonly<Exclude<KnownBlock, {
149
+ readonly type: "card" | "carousel" | "header" | "plan" | "rich_text" | "table";
150
+ }>>;
151
+ export type RenderableBlock = ReplacedOfficialBlock | CardBlockData | CarouselBlockData | ContainerBlockData | DataTableBlockData | DataVisualizationBlockData | HeaderBlockData | PlanBlockData | RichTextBlockData | TableBlockData;
152
+ export interface BlockKitPayload {
153
+ readonly blocks: readonly RenderableBlock[];
154
+ }
155
+ export type BlockKitData = readonly RenderableBlock[] | BlockKitPayload;
156
+ export type BlockKitInput = BlockKitData | string | readonly unknown[] | {
157
+ readonly blocks: readonly unknown[];
158
+ };
159
+ export interface BlockKitAction {
160
+ readonly actionId: string;
161
+ readonly blockId?: string;
162
+ readonly type: string;
163
+ readonly value?: string;
164
+ readonly values?: readonly string[];
165
+ }
166
+ export interface BlockKitResolvers {
167
+ readonly channel?: (id: string) => ReactNode;
168
+ readonly date?: (timestamp: number, format: string) => ReactNode;
169
+ readonly emoji?: (name: string, unicode?: string) => ReactNode;
170
+ readonly team?: (id: string) => ReactNode;
171
+ readonly user?: (id: string) => ReactNode;
172
+ readonly usergroup?: (id: string) => ReactNode;
173
+ }
174
+ export interface BlockComponentProps<TBlock> {
175
+ readonly block: TBlock;
176
+ readonly className?: string | undefined;
177
+ readonly path?: string | undefined;
178
+ }
179
+ export type ActionsBlockData = DeepReadonly<ActionsBlock>;
180
+ export type AlertBlockData = DeepReadonly<Extract<KnownBlock, {
181
+ readonly type: "alert";
182
+ }>>;
183
+ export type ContextBlockData = DeepReadonly<Extract<KnownBlock, {
184
+ readonly type: "context";
185
+ }>>;
186
+ export type ContextActionsBlockData = DeepReadonly<Extract<KnownBlock, {
187
+ readonly type: "context_actions";
188
+ }>>;
189
+ export type DividerBlockData = DeepReadonly<Extract<KnownBlock, {
190
+ readonly type: "divider";
191
+ }>>;
192
+ export type FileBlockData = DeepReadonly<Extract<KnownBlock, {
193
+ readonly type: "file";
194
+ }>>;
195
+ export type ImageBlockData = DeepReadonly<Extract<KnownBlock, {
196
+ readonly type: "image";
197
+ }>>;
198
+ export type InputBlockData = DeepReadonly<Extract<KnownBlock, {
199
+ readonly type: "input";
200
+ }>>;
201
+ export type MarkdownBlockData = DeepReadonly<Extract<KnownBlock, {
202
+ readonly type: "markdown";
203
+ }>>;
204
+ export type SectionBlockData = DeepReadonly<Extract<KnownBlock, {
205
+ readonly type: "section";
206
+ }>>;
207
+ export type TaskCardBlockData = DeepReadonly<Extract<KnownBlock, {
208
+ readonly type: "task_card";
209
+ }>>;
210
+ export type VideoBlockData = DeepReadonly<Extract<KnownBlock, {
211
+ readonly type: "video";
212
+ }>>;
213
+ export type InteractiveElementData = DeepReadonly<ActionsBlockElement | InputBlockElement | SectionBlockAccessory>;
214
+ export type ButtonElementData = DeepReadonly<Button>;
215
+ export type ImageElementData = DeepReadonly<Extract<SectionBlockAccessory, {
216
+ readonly type: "image";
217
+ }>>;
218
+ export type OptionData = DeepReadonly<Option>;
219
+ export type TextObjectData = DeepReadonly<TextObject>;
220
+ export type { ActionsBlock, AlertBlock, Button, Checkboxes, ContextActionsBlock, ContextBlock, DividerBlock, FileBlock, ImageBlock, ImageElement, InputBlock, MarkdownBlock, Option, PlainTextElement, PlanBlock, RichTextElement, SectionBlock, TaskCardBlock, TextObject, VideoBlock, } from "@slack/types";
221
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { BlockKitData, BlockKitInput, BlockKitSurface, RenderableBlock } from "./types.js";
2
+ export declare function assertTextObjectData(value: unknown, path?: string, max?: number): void;
3
+ export declare function assertImageElementData(value: unknown, path?: string): void;
4
+ export declare function assertInteractiveElementData(value: unknown, path?: string): void;
5
+ export declare function assertRichTextBlockData(value: unknown, path?: string): void;
6
+ export declare function assertRenderableBlock(value: unknown, surface?: BlockKitSurface, path?: string): asserts value is RenderableBlock;
7
+ export declare function assertBlockType(value: unknown, expected: RenderableBlock["type"], surface?: BlockKitSurface, path?: string): void;
8
+ export declare function assertBlockKitData(value: unknown, surface?: BlockKitSurface, path?: string): asserts value is BlockKitData;
9
+ export declare function parseBlockKitData(input: BlockKitInput, surface?: BlockKitSurface): BlockKitData;
10
+ export declare function blocksOf(data: BlockKitData): readonly RenderableBlock[];
11
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"AA4CA,OAAO,KAAK,EACV,YAAY,EACZ,aAAa,EAEb,eAAe,EACf,eAAe,EAChB,MAAM,YAAY,CAAC;AAgPpB,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,OAAO,EACd,IAAI,GAAE,MAAe,EACrB,GAAG,GAAE,MAA8B,GAClC,IAAI,CAEN;AA6CD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,GAAE,MAAkB,GAAG,IAAI,CAErF;AAgLD,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,GAAE,MAAkB,GAAG,IAAI,CAE3F;AAwJD,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,GAAE,MAAgB,GAAG,IAAI,CAEpF;AA+rBD,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,OAAO,EACd,OAAO,GAAE,eAA2B,EACpC,IAAI,GAAE,MAAgB,GACrB,OAAO,CAAC,KAAK,IAAI,eAAe,CAkFlC;AAED,wBAAgB,eAAe,CAC7B,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,eAAe,CAAC,MAAM,CAAC,EACjC,OAAO,GAAE,eAA2B,EACpC,IAAI,GAAE,MAAgB,GACrB,IAAI,CAGN;AAWD,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,OAAO,EACd,OAAO,GAAE,eAA2B,EACpC,IAAI,GAAE,MAAe,GACpB,OAAO,CAAC,KAAK,IAAI,YAAY,CA+D/B;AAED,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,aAAa,EACpB,OAAO,GAAE,eAA2B,GACnC,YAAY,CAcd;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,YAAY,GAAG,SAAS,eAAe,EAAE,CAEvE"}
@@ -0,0 +1,80 @@
1
+ # react-blockkit coverage matrix
2
+
3
+ Audited against `slackmark`'s `packages/core/src/blocks/types.ts`,
4
+ `@slack/types` 3.0.0, and the `react-blockkit` implementation on July 20, 2026.
5
+ “Fallback” means the renderer keeps a visible DOM node and human-readable
6
+ label; it never silently drops the value or stringifies an object.
7
+
8
+ ## Blocks
9
+
10
+ | Block | `slackmark` emits | Before | After |
11
+ | --- | --- | --- | --- |
12
+ | `rich_text` | Yes | Partial | Full containers and inline inventory; unknown descendants render a fallback |
13
+ | `header` + `level` | Yes | Levels 1–4; other numbers threw | Semantic `h1`–`h4`; out-of-range levels clamp safely |
14
+ | `divider` | Yes | Full | Full |
15
+ | `section` + `fields` + `accessory` | Yes (`accessory` is accepted from Slack payloads) | Full for known elements | Full; unknown accessories render a fallback |
16
+ | `image` + `slack_file` | Yes | URL images and an alt-labelled placeholder for file IDs | Same deliberate placeholder; never drops `alt_text` |
17
+ | `context` | Yes | Full | Full; unknown or text-less elements render a fallback |
18
+ | `markdown` | Yes | Full for the existing minimal Markdown subset | Same feature scope, hardened rendering |
19
+ | `table` (`raw_text`, `raw_number`, `rich_text`, alignment, wrapping) | Yes | Cells, alignment, and wrapping; first row used data cells | First row uses column-header semantics; unknown cells render a fallback |
20
+ | `data_table` | Yes | Header/row semantics and paging; empty rows or zero page size threw | Safe empty state, real `caption`, bounded page size, header/row semantics |
21
+ | `data_visualization` (`pie`, `bar`, `area`, `line`) | Yes | All chart types; an empty/zero-total pie failed | All chart types plus a labelled no-data fallback; unknown chart types render a fallback |
22
+ | `container` + collapsible state | Yes | Legal Slack child subset only | Legal Slack child subset, collapsible state, and visible illegal/future-child fallback |
23
+ | `actions` | No | Full for current element inventory | Same, plus unknown-element fallback |
24
+ | `alert` | No | Full | Full |
25
+ | `card` | No | Full | Full |
26
+ | `carousel` | No | Full | Full |
27
+ | `context_actions` | No | Full | Full |
28
+ | `file` | No | Full | Full |
29
+ | `input` | No | Full | Full |
30
+ | `plan` | No | Full | Full |
31
+ | `task_card` | No | Full | Full |
32
+ | `video` | No | Full | Full |
33
+ | Unknown future discriminator | Possible in retrieved Slack data | Threw `unsupported_block` | Visible `data-block-type` fallback |
34
+
35
+ ## Rich-text containers
36
+
37
+ | Element | Before | After |
38
+ | --- | --- | --- |
39
+ | `rich_text_section` | Rendered inline values | Same, with unknown-inline fallback and multiline preservation |
40
+ | `rich_text_list` | Real list and ordered `offset`; every indent used the same marker; indent over 8 threw | Real `ul`/`ol`, ordered offset, per-indent marker cycle, indent bounded to 0–8, `border` honored |
41
+ | `rich_text_preformatted` | Language exposed; `border` ignored | Language and `border` honored; empty content is safe |
42
+ | `rich_text_quote` | Always drew a border; payload `border` ignored | Payload `border: 0 \| 1` controls the inline border |
43
+ | Unknown future container | Threw `unsupported_element` | Visible fallback |
44
+
45
+ ## Rich-text inline elements and styles
46
+
47
+ | Element/style | Before | After |
48
+ | --- | --- | --- |
49
+ | `text` | Bold, italic, strike, underline, and code as combined CSS | Deterministically nested semantic elements; multiline text preserved |
50
+ | `link` | Safe protocols and labels | Same, with nested inline styles |
51
+ | `emoji` | Resolver, explicit Unicode, then `:shortcode:` | Resolver, explicit Unicode, core’s emitted shortcode set, then custom shortcode fallback |
52
+ | `user`, `channel`, `usergroup`, `team`, `broadcast` | Resolved mentions; inline style was lost | Resolved mentions with inline styles preserved |
53
+ | `date` | Resolver or fallback/ISO date; ignored format tokens and URL | Resolver or deterministic UTC Slack-token formatter; fallback on relative/unknown tokens; safe URL |
54
+ | `color` | Swatch and value | Same, with inline styles preserved |
55
+ | `citation` and Slack reference mentions | Compact textual fallback | Same documented fallback |
56
+ | Unknown future inline discriminator | Threw `unsupported_element` | Visible text/reference fallback |
57
+
58
+ ## Mrkdwn basics
59
+
60
+ | Behavior | Before | After |
61
+ | --- | --- | --- |
62
+ | `&amp;`, `&lt;`, `&gt;` | Decoded in ordinary text only | Also decoded in links, labels, and code |
63
+ | Bold/italic/strike/code nesting | Parsed recursively | Parsed recursively and snapshot-covered |
64
+ | `<url\|label>` | Rendered, but entities remained encoded in URL/label | Rendered with decoded entities and protocol guard |
65
+ | Date tokens | Fallback or ISO date only | Deterministic UTC token formatting with Slack fallback |
66
+ | Emoji shortcodes | Left as colon text | Core-known shortcodes render glyphs; custom names stay readable |
67
+
68
+ ## Deliberate fallbacks
69
+
70
+ - A `slack_file.id` has no renderable URL, so it remains an alt-labelled image
71
+ placeholder. A resolver would require new public API and is outside this
72
+ correctness pass.
73
+ - Workspace-specific names and custom emoji still require existing resolvers;
74
+ IDs/shortcodes remain visible when no resolver is supplied.
75
+ - Unknown future blocks/elements use a neutral fallback rather than guessed
76
+ Slack UI.
77
+ - Malformed JSON still throws `BlockKitInvariantError`. The never-throw
78
+ guarantee applies after JSON has a valid block-shaped structure.
79
+ - Pixel parity for unharvested Slack Builder permutations remains separate
80
+ style-harvest work; this pass does not guess or redesign those styles.