diff --git a/package.json b/package.json
index d0a5d4fa..f1700cda 100644
--- a/package.json
+++ b/package.json
@@ -56,34 +56,34 @@
},
"dependencies": {
"hightable": "0.17.2",
- "hyparquet": "1.16.2",
+ "hyparquet": "1.17.1",
"hyparquet-compressors": "1.1.1",
"icebird": "0.3.0",
"react": "18.3.1",
"react-dom": "18.3.1"
},
"devDependencies": {
- "@eslint/js": "9.29.0",
- "@storybook/react-vite": "9.0.13",
+ "@eslint/js": "9.30.1",
+ "@storybook/react-vite": "9.0.15",
"@testing-library/react": "16.3.0",
- "@types/node": "24.0.4",
+ "@types/node": "24.0.10",
"@types/react": "19.1.8",
"@types/react-dom": "19.1.6",
"@vitejs/plugin-react": "4.6.0",
"@vitest/coverage-v8": "3.2.4",
- "eslint": "9.29.0",
+ "eslint": "9.30.1",
"eslint-plugin-react": "7.37.5",
"eslint-plugin-react-hooks": "5.2.0",
"eslint-plugin-react-refresh": "0.4.20",
- "eslint-plugin-storybook": "9.0.13",
- "globals": "16.2.0",
+ "eslint-plugin-storybook": "9.0.15",
+ "globals": "16.3.0",
"jsdom": "26.1.0",
"nodemon": "3.1.10",
"npm-run-all": "4.1.5",
- "storybook": "9.0.13",
+ "storybook": "9.0.15",
"typescript": "5.8.3",
- "typescript-eslint": "8.35.0",
- "vite": "6.3.5",
+ "typescript-eslint": "8.35.1",
+ "vite": "7.0.1",
"vitest": "3.2.4"
},
"eslintConfig": {
diff --git a/src/components/Markdown/Markdown.test.tsx b/src/components/Markdown/Markdown.test.tsx
index 64767c1e..517dd83d 100644
--- a/src/components/Markdown/Markdown.test.tsx
+++ b/src/components/Markdown/Markdown.test.tsx
@@ -512,4 +512,28 @@ describe('Markdown with tables', () => {
expect(getByText('Cell with | escaped pipe')).toBeDefined()
expect(getByText('Normal cell')).toBeDefined()
})
+
+ it('renders a table even with unicode en dash', () => {
+ const text = 'Header 1 | Header 2\n–|–\nRow 1 | Data 1\nRow 2 | Data 2'
+ const { getByText, getByRole } = render()
+ expect(getByRole('table')).toBeDefined()
+ expect(getByText('Header 1')).toBeDefined()
+ expect(getByText('Header 2')).toBeDefined()
+ expect(getByText('Row 1')).toBeDefined()
+ expect(getByText('Data 1')).toBeDefined()
+ expect(getByText('Row 2')).toBeDefined()
+ expect(getByText('Data 2')).toBeDefined()
+ })
+
+ it('renders a table even with unicode em dash', () => {
+ const text = 'Header 1 | Header 2\n—|—\nRow 1 | Data 1\nRow 2 | Data 2'
+ const { getByText, getByRole } = render()
+ expect(getByRole('table')).toBeDefined()
+ expect(getByText('Header 1')).toBeDefined()
+ expect(getByText('Header 2')).toBeDefined()
+ expect(getByText('Row 1')).toBeDefined()
+ expect(getByText('Data 1')).toBeDefined()
+ expect(getByText('Row 2')).toBeDefined()
+ expect(getByText('Data 2')).toBeDefined()
+ })
})
diff --git a/src/components/Markdown/Markdown.tsx b/src/components/Markdown/Markdown.tsx
index 17858e4c..1be5ccc1 100644
--- a/src/components/Markdown/Markdown.tsx
+++ b/src/components/Markdown/Markdown.tsx
@@ -118,7 +118,7 @@ function parseMarkdown(text: string): Token[] {
const sepLine = lines[i + 1] ?? ''
// Check if the next line is a valid table separator
// Extended markdown alignment syntax: |:--|, |:--:|, |--:|
- const tableSepRegex = /^\s*\|?\s*:?-+:?\s*(\|\s*:?-+:?\s*)*\|?\s*$/
+ const tableSepRegex = /^\s*\|?\s*:?[-–—]+:?\s*(\|\s*:?[-–—]+:?\s*)*\|?\s*$/
if (sepLine.includes('|') && tableSepRegex.test(sepLine)) {
// collect header cells
const headerCells = splitTableRow(line)
diff --git a/table.md b/table.md
new file mode 100644
index 00000000..58982a19
--- /dev/null
+++ b/table.md
@@ -0,0 +1,34 @@
+
+# Test Tables with Unicode Dashes
+
+## Regular dash table
+Header 1 | Header 2
+-|-
+Row 1 | Data 1
+Row 2 | Data 2
+
+## En dash table (–)
+Header 1 | Header 2
+–|–
+Row 1 | Data 1
+Row 2 | Data 2
+
+## Em dash table (—)
+Header 1 | Header 2
+—|—
+Row 1 | Data 1
+Row 2 | Data 2
+
+## Mixed dashes table
+Header 1 | Header 2 | Header 3
+-|–|—
+Row 1 | Data 1 | Data 1
+Row 2 | Data 2 | Data 2
+
+## Original Table
+
+| Name | Age | Occupation |
+|----------|-----|----------------|
+| Alice | 30 | Engineer |
+| Bob | 25 | Designer |
+| Charlie | 35 | Product Manager|