diff --git a/ivette/src/dome/src/renderer/frame/tabs.js b/ivette/src/dome/src/renderer/frame/tabs.js
deleted file mode 100644
index fe89a5691e857ff128406b1d2af3b85e5a780be5..0000000000000000000000000000000000000000
--- a/ivette/src/dome/src/renderer/frame/tabs.js
+++ /dev/null
@@ -1,127 +0,0 @@
-// --------------------------------------------------------------------------
-// --- Tabs
-// --------------------------------------------------------------------------
-
-/**
-   @packageDocumentation
-   @module dome/frame/tabs
-*/
-
-import React from 'react' ;
-import { Icon } from 'dome/controls/icons' ;
-
-import './style.css' ;
-
-/**
-   @class
-   @summary Pure Container for tab buttons.
-   @description
-   Shall contains only [[Tab]] instances.
-*/
-// --------------------------------------------------------------------------
-// --- Tabs Bar
-// --------------------------------------------------------------------------
-
-export function TabsBar(props) {
-  return (
-    <div className='dome-xTabsBar dome-color-frame'>
-      {props.children}
-    </div>
-  );
-}
-
-// --------------------------------------------------------------------------
-// --- Single Tab
-// --------------------------------------------------------------------------
-
-const VISIBLE = { display: 'block' };
-const HIDDEN  = { display: 'none' };
-
-/**
-   @class
-   @summary Pure Component for rendering a tab button.
-   @property {string} [id] - tab's identifier
-   @property {component} [label] - tab's label
-   @property {string} [title] - tab's tooltip
-   @property {string} [closing] - closing button's tooltip (defaults to `"Close Tab"`)
-   @property {string} [selection] - Currently selected tab identifier
-   @property {function} [onSelection] - selection callcack, feed with value
-   @property {function} [onClose] - selection callcack, feed with value
-   @property {boolean} [default] - if `true`, selected tab by default
-   @property {boolean} [content] - render content instead of tab
-   @description
-   A single tab selector. Shall only be used as a children
-   of [[TabsBar]].
-
-   When `content` is positionned, the component renders
-   its content children instead of the tab button. In such a case, content
-   is displayed only when selected.
-
-   __Remark__: on Mac OSX, the close button appears on the left-side of the tab.
-*/
-
-export function Tab(props) {
-  const selected = props.id === props.selection ;
-  if (props.content) {
-    //--- Content Rendering
-    const style = selected ? VISIBLE : HIDDEN ;
-    return (
-      <div className='dome-xTab-content dome-container' style={style}>
-        {props.children}
-      </div>
-    );
-  } else {
-    //--- Tab Rendering
-    const onClick = props.onSelection && (() => props.onSelection(props.id));
-    const onClose = props.onClose && (() => props.onClose(props.id));
-    var closing = onClose ? (
-      <Icon className="dome-xTab-closing"
-            title={props.closing || "Close Tab"}
-            name="CROSS" onClick={onClose} />
-    ) : undefined ;
-    const classes = 'dome-xTab' + ( selected ? ' dome-active' : ' dome-inactive' ) ;
-    return (
-      <label
-        className={classes} title={props.title} onClick={onClick}>
-        {props.label}
-        {closing}
-      </label>
-    );
-  }
-}
-
-// --------------------------------------------------------------------------
-// --- TabsPane
-// --------------------------------------------------------------------------
-
-/**
-   @class
-   @summary Pure Container for tab contents.
-   @property {string} selection - tab identifier to render
-   @property {Tab[]} children - tabs (content) to render
-   @description
-   Shall contains [[Tab]] instances.
-   Only the selected tab identifier will be displayed, although all tab
-   contents remains properly mounted. If no tab is selected,
-   no content is displayed.
-*/
-
-export function TabsPane({ selection, children }) {
-  const showTab = (elt) => React.cloneElement(elt, { content: true, selection });
-  return (
-    <React.Fragment>
-      {React.Children.map(children , showTab)}
-    </React.Fragment>
-  );
-}
-
-// --------------------------------------------------------------------------
-// --- Dome Class (private)
-// --------------------------------------------------------------------------
-
-import { register } from 'dome/misc/register' ;
-
-register(TabsBar, 'DOME_TABSBAR');
-register(Tab,     'DOME_TABSBAR_ITEM');
-
-// --------------------------------------------------------------------------
diff --git a/ivette/src/dome/src/renderer/frame/tabs.tsx b/ivette/src/dome/src/renderer/frame/tabs.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..0b48784125de6118455447f504fd29d25c1b7ee5
--- /dev/null
+++ b/ivette/src/dome/src/renderer/frame/tabs.tsx
@@ -0,0 +1,81 @@
+// --------------------------------------------------------------------------
+// --- Tabs
+// --------------------------------------------------------------------------
+
+/**
+   @packageDocumentation
+   @module dome/frame/tabs
+*/
+
+import React from 'react';
+import { Icon } from 'dome/controls/icons';
+
+import './style.css';
+
+// --------------------------------------------------------------------------
+// --- Tabs Bar
+// --------------------------------------------------------------------------
+
+export interface TabsBarProps {
+  children?: React.ReactNode;
+}
+
+/** Container for Tabs. */
+export function TabsBar(props: TabsBarProps) {
+  return (
+    <div className="dome-xTabsBar dome-color-frame">
+      {props.children}
+    </div>
+  );
+}
+
+// --------------------------------------------------------------------------
+// --- Single Tab
+// --------------------------------------------------------------------------
+
+export interface TabProps<A> {
+  /** Tab's identifier. */
+  value: A;
+  /** Tab's label. */
+  label?: string;
+  /** Tab's tooltip text. */
+  title?: string;
+  /** Close tab's tooltip text. */
+  closing?: string;
+  /** Currently selected tab. */
+  selection?: A;
+  /** Selection callback. */
+  onSelection?: (value: A) => void;
+  /** Closing callback. */
+  onClose?: (value: A) => void;
+}
+
+/** Tab Selector. */
+export function Tab<A>(props: TabProps<A>) {
+  const { value, selection, onSelection, onClose } = props;
+  const selected = value === selection;
+  // --- Tab Rendering
+  const onSelect = onSelection && (() => onSelection(value));
+  const onClosed = onClose && (() => onClose(value));
+  const closing = onClose ? (
+    <Icon
+      className="dome-xTab-closing"
+      title={props.closing || 'Close Tab'}
+      id="CROSS"
+      onClick={onClosed}
+    />
+  ) : undefined;
+  const classes = `dome-xTab${selected ? ' dome-active' : ' dome-inactive'}`;
+  return (
+    <label
+      className={classes}
+      title={props.title}
+      onClick={onSelect}
+    >
+      {props.label}
+      {closing}
+    </label>
+  );
+}
+
+// --------------------------------------------------------------------------