diff --git a/src/components/DataTable/DataTable.Story.svelte b/src/components/DataTable/DataTable.Story.svelte
new file mode 100644
index 00000000..facc39f9
--- /dev/null
+++ b/src/components/DataTable/DataTable.Story.svelte
@@ -0,0 +1,126 @@
+
+
+
+ {#if story === 'composed'}
+
+
+
+
+
+ {#each props.headers as header, i (header.key)}
+ {header.header}
+ {/each}
+
+
+
+ {#each props.rows as row, i}
+
+ {#each row.cells as cell, j}
+ {cell.value}
+ {/each}
+
+ {/each}
+
+
+
+
+ {:else}
+ {
+ console.log('on:click:header', detail);
+ }}
+ on:click:row={({ detail }) => {
+ console.log('on:click:row', detail);
+ }}
+ on:click:cell={({ detail }) => {
+ console.log('on:click:cell', detail);
+ }}
+ {rows}
+ {headers} />
+ {/if}
+
diff --git a/src/components/DataTable/DataTable.stories.js b/src/components/DataTable/DataTable.stories.js
new file mode 100644
index 00000000..4137fccf
--- /dev/null
+++ b/src/components/DataTable/DataTable.stories.js
@@ -0,0 +1,19 @@
+import { withKnobs, boolean, select, text } from '@storybook/addon-knobs';
+import Component from './DataTable.Story.svelte';
+
+export default { title: 'DataTable', decorators: [withKnobs] };
+
+export const Default = () => ({
+ Component,
+ props: {
+ title: text('Optional DataTable title (title)', ''),
+ description: text('Optional DataTable description (description)', ''),
+ zebra: boolean('Zebra row styles (zebra)', false),
+ size: select(
+ 'Row height (size)',
+ { compact: 'compact', short: 'short', tall: 'tall', none: null },
+ null
+ ),
+ stickyHeader: boolean('Sticky header (experimental)', false)
+ }
+});
diff --git a/src/components/DataTable/DataTable.svelte b/src/components/DataTable/DataTable.svelte
new file mode 100644
index 00000000..41dd9485
--- /dev/null
+++ b/src/components/DataTable/DataTable.svelte
@@ -0,0 +1,68 @@
+
+
+
+
+
+
+
+ {#each headers as header, i (header.key)}
+ {
+ dispatch('click:header', { header });
+ }}>
+ {header.value}
+
+ {/each}
+
+
+
+ {#each rows as row, i (row.id)}
+ {
+ dispatch('click:row', { row });
+ }}>
+ {#each row.cells as cell, j (cell.key)}
+ {
+ dispatch('click:cell', { row, cell });
+ }}>
+ {cell.value}
+
+ {/each}
+
+ {/each}
+
+
+
+
diff --git a/src/components/DataTable/Table.svelte b/src/components/DataTable/Table.svelte
new file mode 100644
index 00000000..d0de7c2f
--- /dev/null
+++ b/src/components/DataTable/Table.svelte
@@ -0,0 +1,28 @@
+
+
+{#if stickyHeader}
+
+{:else}
+
+{/if}
diff --git a/src/components/DataTable/TableBody.svelte b/src/components/DataTable/TableBody.svelte
new file mode 100644
index 00000000..fcb38748
--- /dev/null
+++ b/src/components/DataTable/TableBody.svelte
@@ -0,0 +1,9 @@
+
+
+
+
+
diff --git a/src/components/DataTable/TableCell.svelte b/src/components/DataTable/TableCell.svelte
new file mode 100644
index 00000000..1d3e93cd
--- /dev/null
+++ b/src/components/DataTable/TableCell.svelte
@@ -0,0 +1,9 @@
+
+
+
+
+ |
diff --git a/src/components/DataTable/TableContainer.svelte b/src/components/DataTable/TableContainer.svelte
new file mode 100644
index 00000000..5d5adc3d
--- /dev/null
+++ b/src/components/DataTable/TableContainer.svelte
@@ -0,0 +1,22 @@
+
+
+
+ {#if title}
+
+ {/if}
+
+
diff --git a/src/components/DataTable/TableHead.svelte b/src/components/DataTable/TableHead.svelte
new file mode 100644
index 00000000..522cd18b
--- /dev/null
+++ b/src/components/DataTable/TableHead.svelte
@@ -0,0 +1,9 @@
+
+
+
+
+
diff --git a/src/components/DataTable/TableHeader.svelte b/src/components/DataTable/TableHeader.svelte
new file mode 100644
index 00000000..5b2b2617
--- /dev/null
+++ b/src/components/DataTable/TableHeader.svelte
@@ -0,0 +1,49 @@
+
+
+{#if !isSortable}
+
+
+ |
+{:else}
+
+
+ |
+{/if}
diff --git a/src/components/DataTable/TableRow.svelte b/src/components/DataTable/TableRow.svelte
new file mode 100644
index 00000000..ca89ca26
--- /dev/null
+++ b/src/components/DataTable/TableRow.svelte
@@ -0,0 +1,20 @@
+
+
+
+
+
diff --git a/src/components/DataTable/index.js b/src/components/DataTable/index.js
new file mode 100644
index 00000000..e69de29b