Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
b866f53
docs: add superchat plan for multi-agent/multi-human chat
horner Jun 7, 2026
02aba9f
feat(SuperChat): multi-participant chat with pluggable markdown pipeline
horner Jun 8, 2026
5e1f36d
feat(SuperChat): add mermaid, image-lightbox, and NITRO-table render …
horner Jun 8, 2026
3d05fc3
docs(SuperChat): add Sources & Guards story documenting per-feature s…
horner Jun 8, 2026
d5f5b1d
fix(superchat): resolve reviewer findings and CI typecheck error
Copilot Jun 8, 2026
0107399
style(SuperChat): apply prettier formatting
horner Jun 9, 2026
73d6739
fix(SuperChat): guard clipboard copy in non-secure contexts; mark pla…
horner Jun 9, 2026
3acaf0b
fix(storybook): pre-bundle CJS i18n chain to fix void-elements interop
horner Jun 13, 2026
f4070e0
feat(SuperChat): a11y roles/names + semantic data-slots, add consumer…
horner Jun 13, 2026
92c5a7f
refactor(SuperChat): split into SuperChat panel, SuperChatConversatio…
horner Jun 13, 2026
c8832cd
docs(SuperChat): single-source Storybook Overview from README; trim s…
horner Jun 13, 2026
fbf581e
fix(storybook): brand-conform docs/toolbar colors and dark-mode prose…
horner Jun 13, 2026
3bc615a
docs(SuperChat): fold superchat-plan into MAINTAINERS as Mission section
horner Jun 13, 2026
5e3256a
Merge remote-tracking branch 'origin/main' into superchat
horner Jun 14, 2026
9c15786
style(SuperChat): apply prettier formatting to satisfy CI format check
horner Jun 14, 2026
94d2468
fix(SuperChat): address PR review findings
horner Jun 14, 2026
4e38ecf
fix(SuperChat): guard mention insert + safelist primary-* utilities
horner Jun 14, 2026
858c1e3
fix(SuperChat): responsive inbox — collapse conversation list on smal…
horner Jun 14, 2026
2891230
fix(SuperChat): cap story decorator height so Docs pages don't add hu…
horner Jun 14, 2026
0b10f43
perf(SuperChat): memoize message rows + add reverse-chronological order
horner Jun 14, 2026
1255c62
docs(SuperChat): add Reverse (newest-first) story
horner Jun 14, 2026
ccb4b71
docs(SuperChat): add Long and Long Reverse stories (300 messages)
horner Jun 14, 2026
7b36755
perf(SuperChat): add opt-in virtualization for long threads
horner Jun 14, 2026
0078aaa
feat(SuperChat): inline editing for the local user's own messages
horner Jun 14, 2026
e396c6f
fix(SuperChat): auto-size the message editor to its content
horner Jun 14, 2026
b249fd1
feat(SuperChat): preserve single newlines in messages as hard breaks
horner Jun 14, 2026
3203901
fix(SuperChat): restore list markers in rendered markdown
horner Jun 14, 2026
393fa91
fix(SuperChat): tighten markdown list spacing to a single line per item
horner Jun 14, 2026
6332bcb
fix(SuperChat): drop list vertical margin so bullet bubbles match pla…
horner Jun 14, 2026
bde7663
fix(SuperChat): style markdown headings and hr (preflight flattens them)
horner Jun 14, 2026
acdbac3
test(SuperChat): add markdown showcase story + element rendering test
horner Jun 14, 2026
6c02576
feat(SuperChat): add per-message copy menu (smart rich+markdown / mar…
horner Jun 14, 2026
7f688bf
feat(SuperChat): make per-message copy control sticky to the viewport…
horner Jun 14, 2026
04c34a7
fix(SuperChat): raise copy menu above rich content stacking (tables)
horner Jun 14, 2026
ddace7e
feat(SuperChat): paste images into the composer
horner Jun 14, 2026
d3bb411
feat(SuperChat): paste images into the message editor
horner Jun 14, 2026
69c77a3
fix(SuperChat): keep native undo for image paste in the editor
horner Jun 14, 2026
a46bf6b
feat(SuperChat): add paperclip file attach button to the composer
horner Jun 14, 2026
36be2a9
feat(SuperChat): configurable attachment types (image/video/audio/pdf)
horner Jun 14, 2026
096e873
feat(SuperChat): inline media attachments with offline IndexedDB cache
horner Jun 14, 2026
86cb250
feat(SuperChat): LRU size-cap eviction for the attachment cache
horner Jun 14, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 44 additions & 0 deletions .storybook/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,43 @@ const datavisLegacySubpathDependencies = [
'core-js/es/string/replace-all',
] as const;

// CJS-only transitive dependencies (via react-i18next → html-parse-stringify →
// void-elements) that live only in the pnpm virtual store. They must be aliased
// to a resolvable path and force-included so Vite pre-bundles them with proper
// CJS→ESM default-export interop; otherwise `void-elements` is served raw and
// throws "does not provide an export named 'default'".
//
// The shared `pnpmVirtualNodeModulesDir` is computed from `monorepoRoot`, which
// does not match this repo's layout; resolve against the workspace-local pnpm
// store instead.
const workspacePnpmVirtualNodeModulesDir = path.join(
rootNodeModulesDir,
'.pnpm/node_modules',
);
Comment on lines +93 to +99
Comment on lines +96 to +99

const pnpmVirtualCjsInteropDependencies = [
'react-i18next',
'html-parse-stringify',
'void-elements',
] as const;

const pnpmVirtualCjsInteropAliases = pnpmVirtualCjsInteropDependencies
.filter(
(dependencyName) =>
!existsSync(path.join(rootNodeModulesDir, dependencyName)) &&
existsSync(path.join(workspacePnpmVirtualNodeModulesDir, dependencyName)),
)
.map((dependencyName) => ({
find: new RegExp(`^${escapeRegExp(dependencyName)}(\/.*)?$`),
replacement: `${path.join(workspacePnpmVirtualNodeModulesDir, dependencyName)}$1`,
}));

const pnpmVirtualCjsInteropIncludes = pnpmVirtualCjsInteropDependencies.filter(
(dependencyName) =>
existsSync(path.join(rootNodeModulesDir, dependencyName)) ||
existsSync(path.join(workspacePnpmVirtualNodeModulesDir, dependencyName)),
);

function getPackageRootName(dependencyName: string): string {
if (dependencyName.startsWith('@')) {
return dependencyName.split('/').slice(0, 2).join('/');
Expand Down Expand Up @@ -188,6 +225,7 @@ const config: StorybookConfig = {
: []),
...localUiAliases,
...buildVirtualStoreAliases(optimizeDepNames),
...pnpmVirtualCjsInteropAliases,
...esheetSourceAliases,
];

Expand Down Expand Up @@ -222,6 +260,12 @@ const config: StorybookConfig = {
...optimizeDepNames,
].filter(isLocalNodeModuleDependency)),
);
config.optimizeDeps.include = Array.from(
new Set([
...(config.optimizeDeps.include ?? []),
...pnpmVirtualCjsInteropIncludes,
]),
);
config.optimizeDeps.esbuildOptions = {
...config.optimizeDeps.esbuildOptions,
jsx: 'automatic',
Expand Down
8 changes: 8 additions & 0 deletions .storybook/manager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -268,6 +268,14 @@ function injectBrandCSS(brandKey: BrandKey, isDark = false) {
[role="toolbar"] button[data-active="true"] {
color: ${brand.primary} !important;
}

/* Brand-theme switcher reflects the active brand (higher specificity than
the generic muted toolbar-button rule, so it wins in both light/dark). */
[role="toolbar"] button[aria-label*="brand themes"],
[class*="toolbar"] button[aria-label*="brand themes"],
[class*="bar"] button[aria-label*="brand themes"] {
color: ${brand.primary} !important;
}

/* Links */
a[href]:hover {
Expand Down
31 changes: 27 additions & 4 deletions .storybook/preview.css
Original file line number Diff line number Diff line change
Expand Up @@ -144,10 +144,33 @@ html, body {
[data-theme="dark"] .docblock-argstable code,
[data-theme="dark"] .sbdocs code {
background-color: var(--mieweb-card, #27272a) !important;
color: var(--mieweb-primary, #3b82f6) !important;
color: var(--mieweb-primary-400, #3b82f6) !important;
border-color: var(--mieweb-border, #3f3f46) !important;
}

/* ============================================
PROSE TABLES (Markdown / README) - DARK MODE
============================================ */

/* Markdown-authored tables in docs (e.g. the README rendered on the Overview
page) are plain <table>/<th>/<td>, NOT .docblock-argstable. Storybook's docs
theme hardcodes a dark cell color (rgb(46,51,56)) that is unreadable on the
dark background, so force the themed foreground + borders here. */
[data-theme="dark"] .sbdocs-content table th,
[data-theme="dark"] .sbdocs-content table td {
color: var(--mieweb-foreground) !important;
border-color: var(--mieweb-border, #3f3f46) !important;
}

/* Header row + zebra striping for legibility. */
[data-theme="dark"] .sbdocs-content table th {
background-color: var(--mieweb-card, #27272a) !important;
}

[data-theme="dark"] .sbdocs-content table tr:nth-child(even) td {
background-color: var(--mieweb-card, #27272a) !important;
}

/* ============================================
CONTROLS / INPUTS - DARK MODE
============================================ */
Expand Down Expand Up @@ -201,7 +224,7 @@ html, body {
}

[data-theme="dark"] .docblock-argstable button:hover {
background-color: var(--mieweb-accent, #3f3f46) !important;
background-color: var(--mieweb-muted, #3f3f46) !important;
}

/* ============================================
Expand Down Expand Up @@ -233,7 +256,7 @@ html, body {
/* Story name labels */
[data-theme="dark"] .sbdocs-a,
[data-theme="dark"] .sbdocs a:not(.docs-story a):not(.sb-story a):not(.sb-unstyled a) {
color: var(--mieweb-primary, #3b82f6) !important;
color: var(--mieweb-primary-400, #3b82f6) !important;
}

/* ============================================
Expand All @@ -246,7 +269,7 @@ html, body {
}

[data-theme="dark"] [class*="IconButton"]:hover {
background-color: var(--mieweb-accent, #3f3f46) !important;
background-color: var(--mieweb-muted, #3f3f46) !important;
}

/* Show code button */
Expand Down
7 changes: 7 additions & 0 deletions eslint.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,13 @@ export default [
IntersectionObserver: 'readonly',
IntersectionObserverEntry: 'readonly',
MutationObserver: 'readonly',
// IndexedDB
indexedDB: 'readonly',
IDBDatabase: 'readonly',
IDBObjectStore: 'readonly',
IDBTransactionMode: 'readonly',
IDBOpenDBRequest: 'readonly',
IDBRequest: 'readonly',
// DOM types
Element: 'readonly',
Document: 'readonly',
Expand Down
43 changes: 40 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -198,10 +198,17 @@
"ag-grid-react": ">=32.0.0",
"datavis-ace": "=4.0.0-PRE.2",
"js-yaml": ">=4.0.0",
"mermaid": ">=10.0.0",
"katex": ">=0.16.0",
"mermaid": ">=11.0.0",
"papaparse": ">=5.0.0",
"react": ">=18.0.0",
"react-dom": ">=18.0.0",
"react-markdown": ">=9.0.0",
"rehype-highlight": ">=7.0.0",
"rehype-katex": ">=7.0.0",
"rehype-sanitize": ">=6.0.0",
"remark-gfm": ">=4.0.0",
"remark-math": ">=6.0.0",
"wavesurfer.js": ">=7.0.0"
},
"peerDependenciesMeta": {
Expand Down Expand Up @@ -235,6 +242,27 @@
"papaparse": {
"optional": true
},
"react-markdown": {
"optional": true
},
"remark-gfm": {
"optional": true
},
"remark-math": {
"optional": true
},
"rehype-katex": {
"optional": true
},
"katex": {
"optional": true
},
"rehype-sanitize": {
"optional": true
},
"rehype-highlight": {
"optional": true
},
"react": {
"optional": false
},
Expand All @@ -247,6 +275,7 @@
},
"dependencies": {
"@swc/helpers": "^0.5.19",
"@tanstack/react-virtual": "^3.14.2",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
"dompurify": "^3.4.0",
Expand All @@ -272,6 +301,7 @@
"@kerebron/editor": "0.7.9",
"@kerebron/editor-kits": "0.7.9",
"@kerebron/wasm": "0.7.9",
"@mieweb/datavis": "=0.0.0-PRE.2",
"@monaco-editor/react": "^4.7.0",
"@playwright/test": "^1.58.2",
"@storybook/addon-a11y": "^10.2.11",
Expand Down Expand Up @@ -309,21 +339,28 @@
"d3-selection": "^3.0.0",
"d3-shape": "^3.2.0",
"d3-zoom": "^3.0.0",
"@mieweb/datavis": "=0.0.0-PRE.2",
"eslint": "^9.39.3",
"eslint-plugin-jsx-a11y": "^6.10.2",
"eslint-plugin-react": "^7.37.5",
"eslint-plugin-react-hooks": "^5.2.0",
"eslint-plugin-storybook": "^10.2.11",
"fake-indexeddb": "^6.2.5",
"js-yaml": "^4.1.1",
"jsdom": "^26.1.0",
"mermaid": "^11.12.3",
"katex": "^0.17.0",
"mermaid": "^11.15.0",
"papaparse": "^5.5.3",
"postcss": "^8.5.10",
"prettier": "^3.8.1",
"prettier-plugin-tailwindcss": "^0.6.14",
"react": "^19.2.4",
"react-dom": "^19.2.4",
"react-markdown": "^10.1.0",
"rehype-highlight": "^7.0.2",
"rehype-katex": "^7.0.1",
"rehype-sanitize": "^6.0.0",
"remark-gfm": "^4.0.1",
"remark-math": "^6.0.0",
"sass": "1.100.0",
"sortablejs": "^1.15.7",
"storybook": "^10.2.11",
Expand Down
Loading
Loading