From 43f06f2be304b5b20809e64039adc1b389533454 Mon Sep 17 00:00:00 2001 From: Eric Liu Date: Sun, 29 Nov 2020 15:00:22 -0800 Subject: [PATCH] feat(tabs): proof of concept for keyed tabs --- COMPONENT_INDEX.md | 41 +++++- docs/src/COMPONENT_API.json | 100 ++++++++++++- docs/src/pages/framed/Tabs/TabsV2.svelte | 86 +++++++++++ src/Tabs/TabsV2.svelte | 178 +++++++++++++++++++++++ src/Tabs/index.js | 1 + src/index.js | 2 +- types/Tabs/TabsV2.d.ts | 60 ++++++++ types/index.d.ts | 1 + 8 files changed, 466 insertions(+), 3 deletions(-) create mode 100644 docs/src/pages/framed/Tabs/TabsV2.svelte create mode 100644 src/Tabs/TabsV2.svelte create mode 100644 types/Tabs/TabsV2.d.ts diff --git a/COMPONENT_INDEX.md b/COMPONENT_INDEX.md index addbd6e2..088058dc 100644 --- a/COMPONENT_INDEX.md +++ b/COMPONENT_INDEX.md @@ -1,6 +1,6 @@ # Component Index -> 155 components exported from carbon-components-svelte@0.25.1. +> 156 components exported from carbon-components-svelte@0.25.1. ## Components @@ -134,6 +134,7 @@ - [`TableRow`](#tablerow) - [`Tabs`](#tabs) - [`TabsSkeleton`](#tabsskeleton) +- [`TabsV2`](#tabsv2) - [`Tag`](#tag) - [`TagSkeleton`](#tagskeleton) - [`TextArea`](#textarea) @@ -3582,6 +3583,44 @@ None. | mouseenter | forwarded | -- | | mouseleave | forwarded | -- | +## `TabsV2` + +### Types + +```ts +export type TabsV2ItemId = number | string; + +export interface TabsV2Item { + id: TabsV2ItemId; + label?: string; + disabled?: boolean; +} +``` + +### Props + +| Prop name | Kind | Reactive | Type | Default value | Description | +| :-------------- | :--------------- | :------- | :---------------------------------------- | -------------------------------- | ------------------------------------------- | +| selectedId | let | Yes | TabsV2ItemId | -- | Specify the selected tab id | +| selectedIndex | let | Yes | number | 0 | Specify the selected tab index | +| items | let | No | TabsV2Item[] | [] | Provide the tab items | +| type | let | No | "default" | "container" | "default" | Specify the type of tabs | +| iconDescription | let | No | string | "Show menu options" | Specify the ARIA label for the chevron icon | +| triggerHref | let | No | string | "#" | Specify the tab trigger href attribute | + +### Slots + +| Slot name | Default | Props | Fallback | +| :-------- | :------ | :------------------------------------------------------------------- | :------------------------ | +| -- | Yes | { id: TabsV2ItemId; index: number; item: TabsV2Item; } | -- | +| tab | No | -- | {item.label} | + +### Events + +| Event name | Type | Detail | +| :--------- | :--------- | :---------------------------------------------------------------------------------------- | +| change | dispatched | { selectedIndex: number; selectedId: TabsV2ItemId; currentItem: TabsV2Item } | + ## `Tag` ### Props diff --git a/docs/src/COMPONENT_API.json b/docs/src/COMPONENT_API.json index 799b29d9..ac9d6dc9 100644 --- a/docs/src/COMPONENT_API.json +++ b/docs/src/COMPONENT_API.json @@ -1,5 +1,5 @@ { - "total": 155, + "total": 156, "components": [ { "moduleName": "SkeletonText", @@ -7637,6 +7637,104 @@ "typedefs": [], "rest_props": { "type": "Element", "name": "div" } }, + { + "moduleName": "TabsV2", + "filePath": "/src/Tabs/TabsV2.svelte", + "props": [ + { + "name": "items", + "kind": "let", + "description": "Provide the tab items", + "type": "TabsV2Item[]", + "value": "[]", + "isFunction": false, + "constant": false, + "reactive": false + }, + { + "name": "selectedIndex", + "kind": "let", + "description": "Specify the selected tab index", + "type": "number", + "value": "0", + "isFunction": false, + "constant": false, + "reactive": true + }, + { + "name": "selectedId", + "kind": "let", + "description": "Specify the selected tab id", + "type": "TabsV2ItemId", + "isFunction": false, + "constant": false, + "reactive": true + }, + { + "name": "type", + "kind": "let", + "description": "Specify the type of tabs", + "type": "\"default\" | \"container\"", + "value": "\"default\"", + "isFunction": false, + "constant": false, + "reactive": false + }, + { + "name": "iconDescription", + "kind": "let", + "description": "Specify the ARIA label for the chevron icon", + "type": "string", + "value": "\"Show menu options\"", + "isFunction": false, + "constant": false, + "reactive": false + }, + { + "name": "triggerHref", + "kind": "let", + "description": "Specify the tab trigger href attribute", + "type": "string", + "value": "\"#\"", + "isFunction": false, + "constant": false, + "reactive": false + } + ], + "slots": [ + { + "name": "__default__", + "default": true, + "slot_props": "{ id: TabsV2ItemId; index: number; item: TabsV2Item; }" + }, + { + "name": "tab", + "default": false, + "fallback": "{item.label}", + "slot_props": "{}" + } + ], + "events": [ + { + "type": "dispatched", + "name": "change", + "detail": "{ selectedIndex: number; selectedId: TabsV2ItemId; currentItem: TabsV2Item }" + } + ], + "typedefs": [ + { + "type": "number | string", + "name": "TabsV2ItemId", + "ts": "type TabsV2ItemId = number | string" + }, + { + "type": "{ id: TabsV2ItemId; label?: string; disabled?: boolean; }", + "name": "TabsV2Item", + "ts": "interface TabsV2Item { id: TabsV2ItemId; label?: string; disabled?: boolean; }" + } + ], + "rest_props": { "type": "Element", "name": "div" } + }, { "moduleName": "TagSkeleton", "filePath": "/src/Tag/TagSkeleton.svelte", diff --git a/docs/src/pages/framed/Tabs/TabsV2.svelte b/docs/src/pages/framed/Tabs/TabsV2.svelte new file mode 100644 index 00000000..9e0ced98 --- /dev/null +++ b/docs/src/pages/framed/Tabs/TabsV2.svelte @@ -0,0 +1,86 @@ + + +
selectedIndex: {selectedIndex}
+ +
selectedId: {selectedId}
+ + + + + + + + + + + + {#if index === 1} + + {/if} + {item.label} + + {#if selectedIndex === 0}Tab content {id} {index}{/if} + {#if selectedIndex === 1}Tab content {id} {index}{/if} + {#if selectedIndex === 2}Tab content {id} {index}{/if} + {#if selectedIndex === 3}Tab content {id} {index}{/if} + {#if selectedIndex === 4}Tab content {id} {index}{/if} + diff --git a/src/Tabs/TabsV2.svelte b/src/Tabs/TabsV2.svelte new file mode 100644 index 00000000..65ae57b1 --- /dev/null +++ b/src/Tabs/TabsV2.svelte @@ -0,0 +1,178 @@ + + +
+
+ + {#if currentItem}{currentItem.label}{/if} + +
+ +
+ +{#each items as item, i (item.id)} + +{/each} diff --git a/src/Tabs/index.js b/src/Tabs/index.js index 34945487..c3b6e012 100644 --- a/src/Tabs/index.js +++ b/src/Tabs/index.js @@ -2,3 +2,4 @@ export { default as Tabs } from "./Tabs.svelte"; export { default as Tab } from "./Tab.svelte"; export { default as TabContent } from "./TabContent.svelte"; export { default as TabsSkeleton } from "./TabsSkeleton.svelte"; +export { default as TabsV2 } from "./TabsV2.svelte"; diff --git a/src/index.js b/src/index.js index 522bc154..4f433691 100644 --- a/src/index.js +++ b/src/index.js @@ -96,7 +96,7 @@ export { StructuredListRow, StructuredListInput, } from "./StructuredList"; -export { Tabs, Tab, TabContent, TabsSkeleton } from "./Tabs"; +export { Tabs, Tab, TabContent, TabsSkeleton, TabsV2 } from "./Tabs"; export { Tag, TagSkeleton } from "./Tag"; export { TextArea, TextAreaSkeleton } from "./TextArea"; export { TextInput, TextInputSkeleton, PasswordInput } from "./TextInput"; diff --git a/types/Tabs/TabsV2.d.ts b/types/Tabs/TabsV2.d.ts new file mode 100644 index 00000000..47df3f06 --- /dev/null +++ b/types/Tabs/TabsV2.d.ts @@ -0,0 +1,60 @@ +/// + +export type TabsV2ItemId = number | string; + +export interface TabsV2Item { + id: TabsV2ItemId; + label?: string; + disabled?: boolean; +} + +export interface TabsV2Props extends svelte.JSX.HTMLAttributes { + /** + * Provide the tab items + * @default [] + */ + items?: TabsV2Item[]; + + /** + * Specify the selected tab index + * @default 0 + */ + selectedIndex?: number; + + /** + * Specify the selected tab id + */ + selectedId?: TabsV2ItemId; + + /** + * Specify the type of tabs + * @default "default" + */ + type?: "default" | "container"; + + /** + * Specify the ARIA label for the chevron icon + * @default "Show menu options" + */ + iconDescription?: string; + + /** + * Specify the tab trigger href attribute + * @default "#" + */ + triggerHref?: string; +} + +export default class TabsV2 { + $$prop_def: TabsV2Props; + $$slot_def: { + default: { id: TabsV2ItemId; index: number; item: TabsV2Item }; + tab: {}; + }; + + $on( + eventname: "change", + cb: (event: CustomEvent<{ selectedIndex: number; selectedId: TabsV2ItemId; currentItem: TabsV2Item }>) => void + ): () => void; + $on(eventname: string, cb: (event: Event) => void): () => void; +} diff --git a/types/index.d.ts b/types/index.d.ts index c1862c40..4f85c41d 100644 --- a/types/index.d.ts +++ b/types/index.d.ts @@ -110,6 +110,7 @@ export { default as Tabs } from "./Tabs/Tabs"; export { default as Tab } from "./Tabs/Tab"; export { default as TabContent } from "./Tabs/TabContent"; export { default as TabsSkeleton } from "./Tabs/TabsSkeleton"; +export { default as TabsV2 } from "./Tabs/TabsV2"; export { default as TagSkeleton } from "./Tag/TagSkeleton"; export { default as Tag } from "./Tag/Tag"; export { default as TextArea } from "./TextArea/TextArea";