@carbon/vue 3.0.6-alpha.0 → 3.0.8-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (109) hide show
  1. package/README.md +7 -0
  2. package/dist/carbon-vue-3.common.js +16111 -9105
  3. package/dist/carbon-vue-3.common.js.map +1 -1
  4. package/dist/carbon-vue-3.umd.js +16111 -9105
  5. package/dist/carbon-vue-3.umd.js.map +1 -1
  6. package/dist/carbon-vue-3.umd.min.js +4 -4
  7. package/dist/carbon-vue-3.umd.min.js.map +1 -1
  8. package/package.json +9 -6
  9. package/src/components/CvAccordion/CvAccordion.stories.js +1 -0
  10. package/src/components/CvButton/CvButton.stories.js +3 -3
  11. package/src/components/CvButton/CvButtonSkeleton.stories.js +79 -0
  12. package/src/components/CvButton/CvButtonSkeleton.vue +19 -0
  13. package/src/components/CvButton/index.js +8 -1
  14. package/src/components/CvCheckbox/CvCheckbox.stories.js +18 -7
  15. package/src/components/CvCheckbox/CvCheckbox.vue +19 -3
  16. package/src/components/CvCheckbox/CvCheckboxSkeleton.vue +16 -0
  17. package/src/components/CvCheckbox/__tests__/__snapshots__/CvCheckboxSkeleton.spec.js.snap +3 -0
  18. package/src/components/CvCheckbox/index.js +2 -1
  19. package/src/components/CvDatePicker/CvDatePicker.vue +1 -1
  20. package/src/components/CvDropdown/CvDropdown.stories.mdx +407 -0
  21. package/src/components/CvDropdown/CvDropdown.vue +416 -0
  22. package/src/components/CvDropdown/CvDropdownItem.vue +86 -0
  23. package/src/components/CvDropdown/CvDropdownSkeleton.vue +17 -0
  24. package/src/components/CvDropdown/index.js +5 -0
  25. package/src/components/CvFileUploader/CvFileUploader.stories.mdx +333 -0
  26. package/src/components/CvFileUploader/CvFileUploader.vue +286 -0
  27. package/src/components/CvFileUploader/CvFileUploaderItem.vue +92 -0
  28. package/src/components/CvFileUploader/CvFileUploaderSkeleton.vue +16 -0
  29. package/src/components/CvFileUploader/const.js +10 -0
  30. package/src/components/CvFileUploader/index.js +5 -0
  31. package/src/components/CvForm/CvFormGroup.vue +1 -1
  32. package/src/components/CvInlineLoading/CvInlineLoading.stories.mdx +87 -0
  33. package/src/components/CvInlineLoading/CvInlineLoading.vue +144 -0
  34. package/src/components/CvInlineLoading/consts.js +9 -0
  35. package/src/components/CvInlineLoading/index.js +4 -0
  36. package/src/components/CvModal/CvModal.stories.mdx +4 -2
  37. package/src/components/CvModal/CvModal.vue +3 -5
  38. package/src/components/CvMultiSelect/CvMultiSelect.stories.mdx +333 -0
  39. package/src/components/CvMultiSelect/CvMultiSelect.vue +705 -0
  40. package/src/components/CvMultiSelect/consts.js +16 -0
  41. package/src/components/CvMultiSelect/index.js +3 -0
  42. package/src/components/CvNumberInput/CvNumberInput.stories.js +265 -0
  43. package/src/components/CvNumberInput/CvNumberInput.vue +227 -0
  44. package/src/components/CvNumberInput/CvNumberInputSkeleton.stories.js +30 -0
  45. package/src/components/CvNumberInput/CvNumberInputSkeleton.vue +10 -0
  46. package/src/components/CvNumberInput/StorybookGroupConst.js +1 -0
  47. package/src/components/CvNumberInput/__tests__/__snapshots__/CvNumberInput.spec.js.snap +21 -0
  48. package/src/components/CvNumberInput/index.js +5 -0
  49. package/src/components/CvProgress/CvProgress.stories.mdx +202 -0
  50. package/src/components/CvProgress/CvProgress.vue +78 -0
  51. package/src/components/CvProgress/CvProgressStep.vue +124 -0
  52. package/src/components/CvProgress/index.js +4 -0
  53. package/src/components/CvRadioButton/CvRadioButton.stories.js +166 -0
  54. package/src/components/CvRadioButton/CvRadioButton.vue +57 -0
  55. package/src/components/CvRadioButton/CvRadioGroup.vue +27 -0
  56. package/src/components/CvRadioButton/__tests__/__snapshots__/CvRadioButton.spec.js.snap +27 -0
  57. package/src/components/CvRadioButton/index.js +6 -0
  58. package/src/components/CvSearch/CvSearch.stories.mdx +168 -0
  59. package/src/components/CvSearch/CvSearch.vue +250 -0
  60. package/src/components/CvSearch/index.js +3 -0
  61. package/src/components/CvSelect/CvSelect.vue +27 -6
  62. package/src/components/CvSlider/CvSlider.stories.js +166 -0
  63. package/src/components/CvSlider/CvSlider.vue +324 -0
  64. package/src/components/CvSlider/CvSliderSkeleton.stories.js +26 -0
  65. package/src/components/CvSlider/CvSliderSkeleton.vue +18 -0
  66. package/src/components/CvSlider/__tests__/__snapshots__/CvSlider.spec.js.snap +13 -0
  67. package/src/components/CvSlider/__tests__/__snapshots__/CvSliderSkeleton.spec.js.snap +13 -0
  68. package/src/components/CvSlider/index.js +5 -0
  69. package/src/components/CvSlider/sbSliderPrefix.js +2 -0
  70. package/src/components/CvTabs/CvTab.vue +77 -0
  71. package/src/components/CvTabs/CvTabs.stories.mdx +175 -0
  72. package/src/components/CvTabs/CvTabs.vue +406 -0
  73. package/src/components/CvTabs/CvTabsSkeleton.vue +24 -0
  74. package/src/components/CvTabs/_SbContainer.vue +22 -0
  75. package/src/components/CvTabs/index.js +5 -0
  76. package/src/components/CvTextArea/CvTextArea.stories.js +2 -2
  77. package/src/components/CvTextArea/CvTextAreaSkeleton.stories.js +29 -0
  78. package/src/components/CvTextArea/CvTextAreaSkeleton.vue +10 -0
  79. package/src/components/CvTextArea/StorybookGroupConst.js +1 -0
  80. package/src/components/CvTextArea/__tests__/__snapshots__/CvTextAreaSkeleton.spec.js.snap +7 -0
  81. package/src/components/CvTextArea/index.js +2 -1
  82. package/src/components/CvTimePicker/CvTimePicker.stories.mdx +325 -0
  83. package/src/components/CvTimePicker/CvTimePicker.vue +217 -0
  84. package/src/components/CvTimePicker/index.js +21 -0
  85. package/src/components/CvToggle/CvToggle-Skeleton.vue +44 -0
  86. package/src/components/CvToggle/CvToggle.stories.js +249 -0
  87. package/src/components/CvToggle/CvToggle.vue +87 -0
  88. package/src/components/CvToggle/__tests__/__snapshots__/CvToggle.spec.js.snap +7 -0
  89. package/src/components/CvToggle/index.js +4 -0
  90. package/src/components/CvTooltip/CvDefinitionTooltip.stories.js +80 -0
  91. package/src/components/CvTooltip/CvDefinitionTooltip.vue +61 -0
  92. package/src/components/CvTooltip/CvInteractiveTooltip.stories.js +90 -0
  93. package/src/components/CvTooltip/CvInteractiveTooltip.vue +267 -0
  94. package/src/components/CvTooltip/CvTooltip.stories.js +128 -0
  95. package/src/components/CvTooltip/CvTooltip.vue +44 -0
  96. package/src/components/CvTooltip/__tests__/__snapshots__/CvTooltip.spec.js.snap +525 -0
  97. package/src/components/CvTooltip/consts.js +15 -0
  98. package/src/components/CvTooltip/index.js +6 -0
  99. package/src/components/CvTooltip/sbTooltipPrefix.js +2 -0
  100. package/src/components/CvUIShell/CvSideNav.vue +10 -1
  101. package/src/components/CvUIShell/CvUIShell.stories.mdx +116 -50
  102. package/src/global/storybook-utils/story-source-code.js +1 -0
  103. package/src/index.d.ts +6 -0
  104. package/src/index.js +11 -0
  105. package/src/use/cvCheck.js +3 -0
  106. package/src/use/cvInput.js +34 -0
  107. package/src/use/index.js +2 -0
  108. package/src/use/useMethods.js +18 -0
  109. package/src/use/useRadio.js +25 -0
@@ -0,0 +1,202 @@
1
+ import { Canvas, Meta, Story } from '@storybook/addon-docs';
2
+ import { CvProgress, CvProgressStep } from '.';
3
+ import { Time20 as TimeIcon } from '@carbon/icons-vue';
4
+ // noinspection ES6PreferShortImport
5
+ import { sbCompPrefix } from '../../global/storybook-utils';
6
+ import { action } from '@storybook/addon-actions';
7
+
8
+ <Meta title={`${sbCompPrefix}/CvProgress`} component={CvProgress} />
9
+
10
+ export const Template = args => ({
11
+ // Components used in your story `template` are defined in the `components` object
12
+ components: {
13
+ CvProgress,
14
+ CvProgressStep,
15
+ TimeIcon,
16
+ },
17
+ // The story's `args` need to be mapped into the template through the `setup()` method
18
+ setup() {
19
+ return {
20
+ initialStep: args.initialStep,
21
+ steps: args.steps,
22
+ vertical: args.vertical,
23
+ spaceEqually: args.spaceEqually,
24
+ step1: args.step1,
25
+ step2: args.step2,
26
+ step3: args.step3,
27
+ step4: args.step4,
28
+ step5: args.step5,
29
+ completeIds: args.completeIds,
30
+ invalidIds: args.invalidIds,
31
+ disabledIds: args.disabledIds,
32
+ onStepClicked: action('step-clicked'),
33
+ };
34
+ },
35
+ // And then the `args` are bound to your component with `v-bind="args"`
36
+ template: args.template,
37
+ });
38
+ const defaultTemplate = `
39
+ <cv-progress
40
+ :initial-step="initialStep"
41
+ :steps="steps"
42
+ :vertical="vertical"
43
+ :space-equally="spaceEqually"
44
+ @step-clicked="onStepClicked">
45
+ </cv-progress>
46
+ `;
47
+ const slotTemplate = `
48
+ <cv-progress
49
+ :initial-step="initialStep"
50
+ :vertical="vertical"
51
+ :spaceEqually="spaceEqually"
52
+ >
53
+ <cv-progress-step
54
+ id="step-1"
55
+ :label="step1"
56
+ :complete="completeIds.includes('step-1')"
57
+ :invalid="invalidIds.includes('step-1')"
58
+ :disabled="disabledIds.includes('step-1')"
59
+ additionalInfo="with Meg Murry"
60
+ description="time icon description"
61
+ @step-clicked="onStepClicked"
62
+ >
63
+ <template v-slot:step-icon>
64
+ <time-icon :class="[{['bx--progress__warning']:invalidIds.includes('step-1')}]"/>
65
+ </template>
66
+ </cv-progress-step>
67
+ <cv-progress-step
68
+ id="step-2"
69
+ :label="step2"
70
+ :complete="completeIds.includes('step-2')"
71
+ :invalid="invalidIds.includes('step-2')"
72
+ :disabled="disabledIds.includes('step-2')"
73
+ additionalInfo="save Charles Wallace"
74
+ @step-clicked="onStepClicked"
75
+ >
76
+ </cv-progress-step>
77
+ <cv-progress-step
78
+ id="step-3"
79
+ :label="step3"
80
+ :complete="completeIds.includes('step-3')"
81
+ :invalid="invalidIds.includes('step-3')"
82
+ :disabled="disabledIds.includes('step-3')"
83
+ additionalInfo="save the world"
84
+ @step-clicked="onStepClicked"
85
+ >
86
+ </cv-progress-step>
87
+ <cv-progress-step
88
+ id="step-4"
89
+ :label="step4"
90
+ :complete="completeIds.includes('step-4')"
91
+ :invalid="invalidIds.includes('step-4')"
92
+ :disabled="disabledIds.includes('step-4')"
93
+ additionalInfo="Twins Dennys and Sandy"
94
+ @step-clicked="onStepClicked"
95
+ >
96
+ </cv-progress-step>
97
+ <cv-progress-step
98
+ id="step-5"
99
+ :label="step5"
100
+ :complete="completeIds.includes('step-5')"
101
+ :invalid="invalidIds.includes('step-5')"
102
+ :disabled="disabledIds.includes('step-5')"
103
+ additionalInfo="with Polyhymnia O'Keefe"
104
+ @step-clicked="onStepClicked"
105
+ >
106
+ </cv-progress-step>
107
+ </cv-progress>
108
+ `;
109
+
110
+ # CvProgress
111
+
112
+ **Migration notes:**
113
+
114
+ - The "current" icon is updated to match Carbon React
115
+ - Added the property `spaceEqually` to match Carbon React
116
+ - The property name `initialStep` is misleading. It is treated as the Current progress (currentIndex).
117
+ - To override the default icons, provide an icon in the `step-icon` slot in the `cv-progress-step`
118
+
119
+ <Canvas>
120
+ <Story
121
+ name="Default"
122
+ parameters={{
123
+ controls: {
124
+ exclude: ['default', 'template', 'step-clicked'],
125
+ },
126
+ docs: { source: { code: defaultTemplate } },
127
+ }}
128
+ args={{
129
+ template: defaultTemplate,
130
+ steps: [
131
+ 'Planet Uriel',
132
+ 'The Happy Medium',
133
+ 'The Black Thing',
134
+ 'Rescue Dr. Murry',
135
+ 'Rescue Charles Wallace',
136
+ 'Back to Earth',
137
+ ],
138
+ }}
139
+ argTypes={{
140
+ initialStep: {
141
+ control: {
142
+ type: 'number',
143
+ min: -1,
144
+ max: 6,
145
+ },
146
+ },
147
+ }}
148
+ >
149
+ {Template.bind({})}
150
+ </Story>
151
+ </Canvas>
152
+
153
+ # Slotted
154
+
155
+ Use `cv-progress-step` for more control over the display.
156
+
157
+ <Canvas>
158
+ <Story
159
+ name="slotted"
160
+ parameters={{
161
+ controls: {
162
+ exclude: ['default', 'template', 'step-clicked', 'steps'],
163
+ },
164
+ docs: { source: { code: slotTemplate } },
165
+ }}
166
+ args={{
167
+ template: slotTemplate,
168
+ step1: 'A Wrinkle in Time',
169
+ step2: 'A Wind in the Door',
170
+ step3: 'A Swiftly Tilting Planet',
171
+ step4: 'Many Waters',
172
+ step5: 'An Acceptable Time',
173
+ vertical: true,
174
+ completeIds: [],
175
+ invalidIds: [],
176
+ disabledIds: [],
177
+ }}
178
+ argTypes={{
179
+ initialStep: {
180
+ control: {
181
+ type: 'number',
182
+ min: -1,
183
+ max: 6,
184
+ },
185
+ },
186
+ disabledIds: {
187
+ control: 'multi-select',
188
+ options: ['step-1', 'step-2', 'step-3', 'step-4', 'step-5'],
189
+ },
190
+ completeIds: {
191
+ control: 'multi-select',
192
+ options: ['step-1', 'step-2', 'step-3', 'step-4', 'step-5'],
193
+ },
194
+ invalidIds: {
195
+ control: 'multi-select',
196
+ options: ['step-1', 'step-2', 'step-3', 'step-4', 'step-5'],
197
+ },
198
+ }}
199
+ >
200
+ {Template.bind({})}
201
+ </Story>
202
+ </Canvas>
@@ -0,0 +1,78 @@
1
+ <template>
2
+ <ul
3
+ data-progress
4
+ data-progress-current
5
+ :class="[
6
+ `cv-progress ${carbonPrefix}--progress`,
7
+ { [`${carbonPrefix}--progress--space-equal`]: isEqual },
8
+ { [`${carbonPrefix}--progress--vertical`]: vertical },
9
+ ]"
10
+ >
11
+ <slot>
12
+ <cv-progress-step
13
+ v-for="(step, index) in steps"
14
+ :key="`step:${index}:${initialStep > index}`"
15
+ :label="step"
16
+ :complete="initialStep > index"
17
+ @step-clicked="emit('step-clicked', { ...$event, index })"
18
+ />
19
+ </slot>
20
+ </ul>
21
+ </template>
22
+
23
+ <script setup>
24
+ // noinspection ES6PreferShortImport
25
+ import { carbonPrefix } from '../../global/settings';
26
+ import CvProgressStep from './CvProgressStep.vue';
27
+ import { computed, onMounted, provide, ref, watch } from 'vue';
28
+
29
+ const props = defineProps({
30
+ /**
31
+ * Optionally specify the current step array index
32
+ */
33
+ initialStep: { type: Number, default: 0 },
34
+ /**
35
+ * An array of labels for the steps. Use `cv-progress-step` components for more control over the step logic.
36
+ */
37
+ steps: Array,
38
+ /**
39
+ * Determines whether the ProgressIndicator should be rendered vertically.
40
+ */
41
+ vertical: { type: Boolean, default: false },
42
+ /**
43
+ * Specify whether the progress steps should be split equally in size in the div
44
+ */
45
+ spaceEqually: { type: Boolean, default: false },
46
+ });
47
+ const emit = defineEmits(['step-clicked']);
48
+
49
+ const isEqual = computed(() => props.spaceEqually && !props.vertical);
50
+ provide('progress-space-equally', isEqual);
51
+ const completedSteps = ref(new Set());
52
+ provide('progress-completed-steps', completedSteps);
53
+
54
+ /**
55
+ * @typedef ProgressStepData
56
+ * @type {string} uid
57
+ * @type {string} label
58
+ */
59
+ /**
60
+ * @type {Ref<UnwrapRef<Array<ProgressStepData>>>}
61
+ */
62
+ const progressSteps = ref([]);
63
+ provide('progress-steps', progressSteps);
64
+
65
+ const currentStep = ref('');
66
+ provide('progress-current-step', currentStep);
67
+ function updateSteps() {
68
+ if (
69
+ props.initialStep > -1 &&
70
+ props.initialStep < progressSteps.value.length
71
+ ) {
72
+ const step = progressSteps.value[props.initialStep];
73
+ currentStep.value = step.uid;
74
+ } else currentStep.value = '';
75
+ }
76
+ onMounted(updateSteps);
77
+ watch(() => props.initialStep, updateSteps);
78
+ </script>
@@ -0,0 +1,124 @@
1
+ <!--suppress HtmlUnknownTag -->
2
+ <template>
3
+ <li
4
+ :class="[
5
+ `cv-progress-step ${carbonPrefix}--progress-step`,
6
+ `${carbonPrefix}--progress-step--${internalState}`,
7
+ ]"
8
+ :id="uid"
9
+ :aria-disabled="disabled"
10
+ >
11
+ <button
12
+ type="button"
13
+ :class="[
14
+ `${carbonPrefix}--progress-step-button`,
15
+ { [`${carbonPrefix}--progress-step-button--unclickable`]: isCurrent },
16
+ ]"
17
+ tabindex="-1"
18
+ :title="label"
19
+ @click.prevent="emit('step-clicked', { uid })"
20
+ >
21
+ <span v-if="isCurrent" :class="`${carbonPrefix}--assistive-text`"
22
+ >Current</span
23
+ >
24
+ <slot name="step-icon">
25
+ <component :is="stepIcon" :class="stepClass">
26
+ <title>{{ description }}</title>
27
+ </component>
28
+ </slot>
29
+ <div
30
+ :class="`${carbonPrefix}--progress-text`"
31
+ :style="{ maxWidth: isEqual ? 'calc(100% - 1rem)' : undefined }"
32
+ >
33
+ <!-- todo: add tooltip when tooltip is implemented -->
34
+ <!-- <cv-tooltip v-if="tipText" ... v-else -->
35
+ <div :class="[`${carbonPrefix}--progress-label`]">
36
+ {{ label }}
37
+ </div>
38
+ <p v-if="additionalInfo" class="bx--progress-optional">
39
+ {{ additionalInfo }}
40
+ </p>
41
+ </div>
42
+ <span :class="`${carbonPrefix}--progress-line`"></span>
43
+ </button>
44
+ </li>
45
+ </template>
46
+
47
+ <script setup>
48
+ import {
49
+ Incomplete16,
50
+ CheckmarkOutline16,
51
+ Warning16,
52
+ CircleDash16,
53
+ } from '@carbon/icons-vue';
54
+ // noinspection ES6PreferShortImport
55
+ import { carbonPrefix } from '../../global/settings';
56
+ import { useCvId, props as propsCvId } from '../../use/cvId';
57
+ import { computed, inject, onBeforeUnmount, onMounted, ref, watch } from 'vue';
58
+
59
+ const STEP_CURRENT = 'current';
60
+ const STEP_COMPLETE = 'complete';
61
+ const STEP_INCOMPLETE = 'incomplete';
62
+ const STEP_DISABLED = 'disabled';
63
+
64
+ const props = defineProps({
65
+ additionalInfo: String,
66
+ description: String,
67
+ disabled: Boolean,
68
+ invalid: Boolean,
69
+ label: String,
70
+ tipText: String,
71
+ complete: Boolean,
72
+ ...propsCvId,
73
+ });
74
+ const uid = useCvId(props, true);
75
+ const isEqual = inject('progress-space-equally');
76
+
77
+ const emit = defineEmits(['step-clicked']);
78
+
79
+ const internalState = ref(STEP_INCOMPLETE);
80
+ /**
81
+ * @type {Ref<UnwrapRef<string>>}
82
+ */
83
+ const currentStep = inject('progress-current-step');
84
+ const isCurrent = computed(() => {
85
+ return uid.value === currentStep.value;
86
+ });
87
+ /**
88
+ * @type {Ref<UnwrapRef<Array<ProgressStepData>>>}
89
+ */
90
+ const progressSteps = inject('progress-steps');
91
+ /**
92
+ * @type {Ref<UnwrapRef<Set<string>>>}
93
+ */
94
+ const completedSteps = inject('progress-completed-steps');
95
+ function checkCurrentStep() {
96
+ if (props.disabled) internalState.value = STEP_DISABLED;
97
+ else if (isCurrent.value) internalState.value = STEP_CURRENT;
98
+ else if (props.complete) internalState.value = STEP_COMPLETE;
99
+ else internalState.value = STEP_INCOMPLETE;
100
+
101
+ const stepData = { uid: uid.value, state: internalState.value };
102
+ const index = progressSteps.value.findIndex(step => step.uid === uid.value);
103
+ if (index > -1) progressSteps.value.splice(index, 1, stepData);
104
+ else progressSteps.value.push(stepData);
105
+ }
106
+ onMounted(checkCurrentStep);
107
+ watch(currentStep, checkCurrentStep);
108
+ watch(completedSteps, checkCurrentStep);
109
+
110
+ onBeforeUnmount(() => {
111
+ const index = progressSteps.value.findIndex(step => step.uid === uid.value);
112
+ if (index > -1) progressSteps.value.splice(index, 1);
113
+ });
114
+ const stepClass = computed(() => {
115
+ return props.invalid ? `${carbonPrefix}--progress__warning` : '';
116
+ });
117
+
118
+ const stepIcon = computed(() => {
119
+ if (props.invalid) return Warning16;
120
+ else if (internalState.value === STEP_CURRENT) return Incomplete16;
121
+ else if (internalState.value === STEP_COMPLETE) return CheckmarkOutline16;
122
+ else return CircleDash16;
123
+ });
124
+ </script>
@@ -0,0 +1,4 @@
1
+ import CvProgress from './CvProgress.vue';
2
+ import CvProgressStep from './CvProgressStep.vue';
3
+
4
+ export { CvProgress, CvProgressStep };
@@ -0,0 +1,166 @@
1
+ import { action } from '@storybook/addon-actions';
2
+ import { CvRadioButton, CvRadioGroup } from '.';
3
+ import {
4
+ sbCompPrefix,
5
+ storyParametersObject,
6
+ } from '../../global/storybook-utils';
7
+ import { ref } from 'vue';
8
+
9
+ export default {
10
+ title: `${sbCompPrefix}/CvRadioButton`,
11
+ component: CvRadioButton,
12
+ argTypes: {
13
+ checked: {
14
+ type: 'boolean',
15
+ control: false,
16
+ table: {
17
+ type: { summary: 'boolean' },
18
+ category: 'props',
19
+ },
20
+ },
21
+ label: {
22
+ description: 'radio-button label',
23
+ control: false,
24
+ },
25
+ hideLabel: {
26
+ description:
27
+ 'makes the label visually hidden but still labels the radio input',
28
+ },
29
+ labelLeft: {
30
+ type: 'boolean',
31
+ table: {
32
+ type: { summary: 'boolean' },
33
+ category: 'props',
34
+ },
35
+ description: 'position label on left',
36
+ },
37
+ vertical: {
38
+ type: 'boolean',
39
+ table: {
40
+ type: { summary: 'boolean' },
41
+ category: 'props',
42
+ },
43
+ description:
44
+ 'Property of CvRadioGroup component - stacks inside radio components vertically',
45
+ },
46
+ },
47
+ };
48
+
49
+ const DefaultRadioItems = [
50
+ {
51
+ label: 'radio-1',
52
+ id: 'value-1',
53
+ checked: true,
54
+ },
55
+ {
56
+ label: 'radio-2',
57
+ id: 'value-2',
58
+ disabled: true,
59
+ },
60
+ {
61
+ label: 'radio-3',
62
+ id: 'value-3',
63
+ },
64
+ ];
65
+
66
+ const DefaultStoryParameters = {
67
+ controls: {
68
+ exclude: ['change', 'update:modelValue', 'modelValue'],
69
+ },
70
+ };
71
+
72
+ const defaultTemplate = `
73
+ <cv-radio-group v-bind="args" @change="onChange">
74
+ <cv-radio-button
75
+ v-for="({id, label, checked, disabled}, index) in DefaultRadioItems"
76
+ :key="index"
77
+ name="group-1"
78
+ :label="label"
79
+ :value="id"
80
+ :checked="checked"
81
+ :disabled="disabled"
82
+ :hide-label="hideLabel"
83
+ :label-left='labelLeft'
84
+ />
85
+ </cv-radio-group>
86
+ `;
87
+
88
+ const Template = (args, { argTypes }) => {
89
+ return {
90
+ props: Object.keys(argTypes),
91
+ components: { CvRadioButton, CvRadioGroup },
92
+ template: defaultTemplate,
93
+ setup() {
94
+ return {
95
+ args,
96
+ hideLabel: args.hideLabel,
97
+ labelLeft: args.labelLeft,
98
+ onChange: action('change'),
99
+ DefaultRadioItems,
100
+ };
101
+ },
102
+ };
103
+ };
104
+
105
+ export const Default = Template.bind({});
106
+ Default.args = {
107
+ vertical: false,
108
+ };
109
+ Default.parameters = storyParametersObject(
110
+ DefaultStoryParameters,
111
+ defaultTemplate,
112
+ Default.args
113
+ );
114
+
115
+ const vModelTemplate = `
116
+ <cv-radio-group v-bind="args" @change="onChange">
117
+ <cv-radio-button
118
+ v-for="({id, label, checked, disabled}, index) in DefaultRadioItems"
119
+ v-model="modelValue"
120
+ :key="index"
121
+ name="group-1"
122
+ :label="label"
123
+ :value="id"
124
+ :disabled="disabled"
125
+ :hide-label="hideLabel"
126
+ :label-left='labelLeft'
127
+ />
128
+ </cv-radio-group>
129
+
130
+ <div style="margin-top:1rem; background-color: #888888; padding:1rem">
131
+ V-model:
132
+ <template
133
+ v-for="({id, label}, index) in DefaultRadioItems"
134
+ :key="index"
135
+ >
136
+ <input name="modelValue" :id="id" type="radio" @change="(ev) => {modelValue = ev.target.id}" :checked="id === modelValue" />
137
+ <label :for="id" style="margin-right: 16px;">{{label}}:</label>
138
+ </template>
139
+
140
+ <div style="margin-top: 16px;">Checked: <span style="font-weight: bold;">{{modelValue}}</span></div>
141
+ </div>
142
+ `;
143
+
144
+ const VModelTemplate = args => {
145
+ return {
146
+ components: { CvRadioButton, CvRadioGroup },
147
+ template: vModelTemplate,
148
+ setup() {
149
+ return {
150
+ args,
151
+ hideLabel: args.hideLabel,
152
+ labelLeft: args.labelLeft,
153
+ modelValue: ref(DefaultRadioItems[0].id),
154
+ onChange: action('change'),
155
+ DefaultRadioItems,
156
+ };
157
+ },
158
+ };
159
+ };
160
+
161
+ export const VModel = VModelTemplate.bind({});
162
+ VModel.parameters = storyParametersObject(
163
+ DefaultStoryParameters,
164
+ vModelTemplate,
165
+ VModel.args
166
+ );
@@ -0,0 +1,57 @@
1
+ <template>
2
+ <div
3
+ :class="[
4
+ `cv-radio-button ${carbonPrefix}--radio-button-wrapper`,
5
+ { [`${carbonPrefix}--radio-button-wrapper--label-left`]: labelLeft },
6
+ ]"
7
+ >
8
+ <input
9
+ v-bind="$attrs"
10
+ :id="cvId"
11
+ :checked="isChecked"
12
+ :class="`${carbonPrefix}--radio-button`"
13
+ ref="input"
14
+ type="radio"
15
+ :value="value"
16
+ @change="onChange"
17
+ />
18
+ <!-- symbol causes problem in codepen? -->
19
+ <label :for="cvId" :class="`${carbonPrefix}--radio-button__label`">
20
+ <span :class="`${carbonPrefix}--radio-button__appearance`"></span>
21
+ <span
22
+ v-if="label"
23
+ :class="{ [`${carbonPrefix}--visually-hidden`]: hideLabel }"
24
+ >
25
+ {{ label }}
26
+ </span>
27
+ </label>
28
+ </div>
29
+ </template>
30
+
31
+ <script setup>
32
+ import { carbonPrefix } from '../../global/settings';
33
+ import { useCvId, propsCvId, useMethods, useRadio } from '../../use';
34
+
35
+ const props = defineProps({
36
+ modelValue: String,
37
+ checked: Boolean,
38
+ label: String,
39
+ value: { type: String, required: true },
40
+ hideLabel: Boolean,
41
+ labelLeft: Boolean,
42
+ ...propsCvId,
43
+ });
44
+
45
+ const cvId = useCvId(props);
46
+
47
+ const emit = defineEmits(['update:modelValue', 'change']);
48
+
49
+ useMethods({ input: ['blur', 'focus'] });
50
+ const { isChecked, onChange } = useRadio(props, emit);
51
+ </script>
52
+
53
+ <script>
54
+ export default {
55
+ inheritAttrs: false,
56
+ };
57
+ </script>
@@ -0,0 +1,27 @@
1
+ <template>
2
+ <div :class="`cv-radio-group ${carbonPrefix}--form-item`">
3
+ <div
4
+ :class="[
5
+ `${carbonPrefix}--radio-button-group`,
6
+ { [`${carbonPrefix}--radio-button-group--vertical`]: vertical },
7
+ ]"
8
+ >
9
+ <slot></slot>
10
+ </div>
11
+ </div>
12
+ </template>
13
+
14
+ <script setup>
15
+ import { provide } from 'vue';
16
+ import { carbonPrefix } from '../../global/settings';
17
+
18
+ defineProps({
19
+ vertical: Boolean,
20
+ });
21
+
22
+ const emit = defineEmits(['change']);
23
+
24
+ provide('onRadioItemChange', clickedItemCvId => {
25
+ emit('change', clickedItemCvId);
26
+ });
27
+ </script>
@@ -0,0 +1,27 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`CvRadioButton matches render when checked 1`] = `<div class="cv-radio-button bx--radio-button-wrapper"><input id="1" class="bx--radio-button" type="radio" value=""><!-- symbol causes problem in codepen? --><label for="1" class="bx--radio-button__label"><span class="bx--radio-button__appearance"></span><span class="">test label</span></label></div>`;
4
+
5
+ exports[`CvRadioButton matches render when modelValue is equal to value 1`] = `<div class="cv-radio-button bx--radio-button-wrapper"><input id="1" class="bx--radio-button" type="radio" value="test value"><!-- symbol causes problem in codepen? --><label for="1" class="bx--radio-button__label"><span class="bx--radio-button__appearance"></span><span class="">test label</span></label></div>`;
6
+
7
+ exports[`CvRadioButton matches render when modelValue is not equal to value 1`] = `<div class="cv-radio-button bx--radio-button-wrapper"><input id="1" class="bx--radio-button" type="radio" value="test value"><!-- symbol causes problem in codepen? --><label for="1" class="bx--radio-button__label"><span class="bx--radio-button__appearance"></span><span class="">test label</span></label></div>`;
8
+
9
+ exports[`CvRadioButton matches render with left label 1`] = `<div class="cv-radio-button bx--radio-button-wrapper bx--radio-button-wrapper--label-left"><input id="1" class="bx--radio-button" type="radio" value=""><!-- symbol causes problem in codepen? --><label for="1" class="bx--radio-button__label"><span class="bx--radio-button__appearance"></span><span class="">left label</span></label></div>`;
10
+
11
+ exports[`CvRadioButton matches render with right label 1`] = `<div class="cv-radio-button bx--radio-button-wrapper"><input id="1" class="bx--radio-button" type="radio" value=""><!-- symbol causes problem in codepen? --><label for="1" class="bx--radio-button__label"><span class="bx--radio-button__appearance"></span><span class="">right label</span></label></div>`;
12
+
13
+ exports[`CvRadioGroup matches render when horizontal 1`] = `
14
+ <div class="cv-radio-group bx--form-item">
15
+ <div class="bx--radio-button-group">
16
+ <div class="cv-radio-button-stub">RadioButtonStub</div>
17
+ </div>
18
+ </div>
19
+ `;
20
+
21
+ exports[`CvRadioGroup matches render when vertical 1`] = `
22
+ <div class="cv-radio-group bx--form-item">
23
+ <div class="bx--radio-button-group bx--radio-button-group--vertical">
24
+ <div class="cv-radio-button-stub">RadioButtonStub</div>
25
+ </div>
26
+ </div>
27
+ `;
@@ -0,0 +1,6 @@
1
+ import CvRadioButton from './CvRadioButton.vue';
2
+ import CvRadioGroup from './CvRadioGroup.vue';
3
+
4
+ export { CvRadioButton, CvRadioGroup };
5
+
6
+ export default CvRadioButton;