From e289a6ce536ae113eee47ebdff8f17707f450b57 Mon Sep 17 00:00:00 2001 From: David Nixon Date: Mon, 28 Nov 2022 14:53:47 -0500 Subject: [PATCH] feat: add cv-content-switcher --- .../CvComboBox/__tests__/CvComboBox.spec.js | 2 +- .../CvContentSwitcher.stories.js | 199 +++++++++++++++--- .../CvContentSwitcher/CvContentSwitcher.vue | 67 +++++- .../CvContentSwitcherButton.vue | 120 ++++++++++- .../CvContentSwitcherContent.vue | 24 ++- .../cvContentSwitcherStore.js | 59 ++++++ src/components/CvContentSwitcher/index.js | 3 + src/use/cvTheme.js | 30 +++ 8 files changed, 452 insertions(+), 52 deletions(-) diff --git a/src/components/CvComboBox/__tests__/CvComboBox.spec.js b/src/components/CvComboBox/__tests__/CvComboBox.spec.js index 7336026c4..3defcd52e 100644 --- a/src/components/CvComboBox/__tests__/CvComboBox.spec.js +++ b/src/components/CvComboBox/__tests__/CvComboBox.spec.js @@ -92,7 +92,7 @@ describe('CvComboBox', () => { const wrapper = result.container.querySelector('.bx--list-box__wrapper'); expect(wrapper.getAttribute('aria-label')).toBe(ariaLabel); - await result.rerender({ ...props, invalidMessage: '' }); + await result.rerender({ invalidMessage: '' }); await result.findByText(props.helperText); }); diff --git a/src/components/CvContentSwitcher/CvContentSwitcher.stories.js b/src/components/CvContentSwitcher/CvContentSwitcher.stories.js index a716ded94..ebead289e 100644 --- a/src/components/CvContentSwitcher/CvContentSwitcher.stories.js +++ b/src/components/CvContentSwitcher/CvContentSwitcher.stories.js @@ -1,12 +1,14 @@ import { sbCompPrefix, storyParametersObject } from '@/global/storybook-utils'; import { CvContentSwitcher } from '.'; +import CvContentSwitcherButton from './CvContentSwitcherButton'; +import CvContentSwitcherContent from './CvContentSwitcherContent'; +import { IbmSecurity20 } from '@carbon/icons-vue'; import { action } from '@storybook/addon-actions'; -import { ref } from 'vue'; const initArgs = { - title: 'Combo Box title', - helperText: 'Combobox helper text', + light: false, + selectedIndex: 0, }; export default { @@ -15,41 +17,62 @@ export default { parameters: { a11y: { config: { - rules: [ - { - // The autocomplete rule will not run based on the CSS selector provided - id: 'aria-input-field-name', - selector: '.bx--combo-box', - }, - ], + rules: [], }, options: {}, manual: true, }, + controls: { exclude: ['default', 'selected'] }, }, argTypes: { - title: { type: String, description: 'Combo Box title' }, - options: { type: Array, description: 'Combo Box options' }, + light: { + description: 'light theme', + table: { + category: 'props', + }, + }, + size: { + type: 'select', + options: ['sm', 'md', 'xl'], + }, }, }; const template = ` -
- +
+ + Button Name 1 + Button Name 2 + Button Name 3 + +
+ +

This is the content for option 1

+
+ +

This is the content for option 2

+
+ +

This is more content for option 2

+
+ +

This is the content for option 3

+
+
-`; +`; const Template = args => { return { - components: { CvContentSwitcher }, + components: { + CvContentSwitcher, + CvContentSwitcherButton, + CvContentSwitcherContent, + }, setup: () => ({ args, - onChange: action('change'), - onFilter: action('filter'), + onSelected: action('selected'), + selectedIndex: args.selectedIndex, + iconSample: IbmSecurity20, }), template, }; @@ -57,8 +80,130 @@ const Template = args => { export const Default = Template.bind({}); Default.args = initArgs; -Default.parameters = storyParametersObject( - Default.parameters, - template, - Default.args +// Default.parameters = storyParametersObject( +// Default.parameters, +// template, +// Default.args +// ); +// Default.parameters.controls = { exclude: ['default', 'selected'] }; + +/** + * Direct DOM + */ +const templateDom = ` +
+ + Button Name 1 + Button Name 2 + Button Name 3 + +
+
+

This is the DOM content for option 1

+
+
+

This is the DOM content for option 2

+
+
+

This is more DOM content for option 2

+
+
+

This is the DOM content for option 3

+
+
+
+`; +const TemplateDom = args => { + return { + components: { + CvContentSwitcher, + CvContentSwitcherButton, + CvContentSwitcherContent, + }, + setup: () => ({ + args, + onSelected: action('selected'), + selectedIndex: args.selectedIndex, + iconSample: IbmSecurity20, + }), + template: templateDom, + }; +}; +export const directDom = TemplateDom.bind({}); +directDom.args = initArgs; +directDom.parameters = storyParametersObject( + directDom.parameters, + templateDom, + directDom.args +); +directDom.parameters.controls = { exclude: ['default', 'selected'] }; + +/** + * Multiple switchers + */ +const templateMultiple = ` +
+ + Episode 1 + Episode 2 + Episode 3 + +
+ +

Padme

+
+ +

Anakin

+
+ +

Zam

+
+ +

Yoda

+
+
+ + Book 1 + Book 2 + Book 3 + +
+ +

Bilbo

+
+ +

Frodo

+
+ +

Sauron

+
+ +

Gandalf

+
+
+
+`; +const TemplateMultiple = args => { + return { + components: { + CvContentSwitcher, + CvContentSwitcherButton, + CvContentSwitcherContent, + }, + setup: () => ({ + args, + onSelected: action('selected'), + selectedIndex: args.selectedIndex, + iconSample: IbmSecurity20, + }), + template: templateMultiple, + }; +}; +export const multipleSwitchers = TemplateMultiple.bind({}); +multipleSwitchers.args = initArgs; +multipleSwitchers.parameters = storyParametersObject( + multipleSwitchers.parameters, + templateMultiple, + multipleSwitchers.args ); +multipleSwitchers.parameters.controls = { exclude: ['default', 'selected'] }; diff --git a/src/components/CvContentSwitcher/CvContentSwitcher.vue b/src/components/CvContentSwitcher/CvContentSwitcher.vue index 891bc9ee8..39df456d0 100644 --- a/src/components/CvContentSwitcher/CvContentSwitcher.vue +++ b/src/components/CvContentSwitcher/CvContentSwitcher.vue @@ -1,13 +1,64 @@ - + - + diff --git a/src/components/CvContentSwitcher/CvContentSwitcherButton.vue b/src/components/CvContentSwitcher/CvContentSwitcherButton.vue index d972208e5..9c89fe25b 100644 --- a/src/components/CvContentSwitcher/CvContentSwitcherButton.vue +++ b/src/components/CvContentSwitcher/CvContentSwitcherButton.vue @@ -1,13 +1,117 @@ -