+
+
+
+ {navIndex !== 0 && (
+
+
+
+ )}
+ {chunkedTabs[navIndex].map((tab, index) => (
+
+ ))}
+ {hasNextNavIndex() && (
+
+
+
+ )}
+
+
+
+ {currentIndex !== false ? (
+ chunkedTabs[navIndex].map((tab, index) => (
+
+ {tab.content}
+
+ ))
+ ) : (
+ // Render if the selected tab index is outside the current rendered chunked array
+
+ {chunkedTabs[value[0]][value[1]].content}
+
+ )}
+
+ );
+};
diff --git a/packages/core/src/components/Tabs/index.ts b/packages/core/src/components/Tabs/index.ts
new file mode 100644
index 0000000000..835ab5a8c3
--- /dev/null
+++ b/packages/core/src/components/Tabs/index.ts
@@ -0,0 +1,17 @@
+/*
+ * Copyright 2020 Spotify AB
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+export { Tabs as default } from './Tabs';
diff --git a/packages/core/src/components/Tabs/utils.ts b/packages/core/src/components/Tabs/utils.ts
new file mode 100644
index 0000000000..3e0ab6f2c3
--- /dev/null
+++ b/packages/core/src/components/Tabs/utils.ts
@@ -0,0 +1,27 @@
+/*
+ * Copyright 2020 Spotify AB
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import { TabProps } from './Tabs';
+
+export const chunkArray = (
+ myArray: TabProps[],
+ chunkSize: number,
+): TabProps[][] => {
+ const results = [];
+ while (myArray.length) {
+ results.push(myArray.splice(0, chunkSize));
+ }
+ return results;
+};
diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts
index f3c5c5c778..c5749866b6 100644
--- a/packages/core/src/index.ts
+++ b/packages/core/src/index.ts
@@ -41,3 +41,4 @@ export * from './components/Status';
export * from './components/Button';
export * from './components/Link';
export { default as WarningPanel } from './components/WarningPanel';
+export { default as Tabs } from './components/Tabs';
diff --git a/packages/theme/src/themes.ts b/packages/theme/src/themes.ts
index fe3c71a212..3071c0289e 100644
--- a/packages/theme/src/themes.ts
+++ b/packages/theme/src/themes.ts
@@ -60,6 +60,9 @@ export const lightTheme = createTheme({
icon: '#BDBDBD',
background: '#404040',
},
+ tabbar: {
+ indicator: '#9BF0E1',
+ },
},
});
@@ -106,5 +109,8 @@ export const darkTheme = createTheme({
icon: '#181818',
background: '#BDBDBD',
},
+ tabbar: {
+ indicator: '#9BF0E1',
+ },
},
});
diff --git a/packages/theme/src/types.ts b/packages/theme/src/types.ts
index c38d67d063..fdb9e09869 100644
--- a/packages/theme/src/types.ts
+++ b/packages/theme/src/types.ts
@@ -44,6 +44,9 @@ type PaletteAdditions = {
link: string;
gold: string;
sidebar: string;
+ tabbar: {
+ indicator: string;
+ };
bursts: {
fontColor: string;
slackChannelText: string;