@carbon/vue 3.0.7-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 (73) hide show
  1. package/README.md +7 -0
  2. package/dist/carbon-vue-3.common.js +3438 -177
  3. package/dist/carbon-vue-3.common.js.map +1 -1
  4. package/dist/carbon-vue-3.umd.js +3438 -177
  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 +7 -4
  9. package/src/components/CvCheckbox/CvCheckbox.stories.js +18 -7
  10. package/src/components/CvCheckbox/CvCheckbox.vue +19 -3
  11. package/src/components/CvCheckbox/CvCheckboxSkeleton.vue +16 -0
  12. package/src/components/CvCheckbox/__tests__/__snapshots__/CvCheckboxSkeleton.spec.js.snap +3 -0
  13. package/src/components/CvCheckbox/index.js +2 -1
  14. package/src/components/CvDropdown/CvDropdown.vue +0 -2
  15. package/src/components/CvFileUploader/CvFileUploader.stories.mdx +333 -0
  16. package/src/components/CvFileUploader/CvFileUploader.vue +286 -0
  17. package/src/components/CvFileUploader/CvFileUploaderItem.vue +92 -0
  18. package/src/components/CvFileUploader/CvFileUploaderSkeleton.vue +16 -0
  19. package/src/components/CvFileUploader/const.js +10 -0
  20. package/src/components/CvFileUploader/index.js +5 -0
  21. package/src/components/CvMultiSelect/CvMultiSelect.stories.mdx +1 -1
  22. package/src/components/CvProgress/CvProgress.stories.mdx +202 -0
  23. package/src/components/CvProgress/CvProgress.vue +78 -0
  24. package/src/components/CvProgress/CvProgressStep.vue +124 -0
  25. package/src/components/CvProgress/index.js +4 -0
  26. package/src/components/CvRadioButton/CvRadioButton.stories.js +166 -0
  27. package/src/components/CvRadioButton/CvRadioButton.vue +57 -0
  28. package/src/components/CvRadioButton/CvRadioGroup.vue +27 -0
  29. package/src/components/CvRadioButton/__tests__/__snapshots__/CvRadioButton.spec.js.snap +27 -0
  30. package/src/components/CvRadioButton/index.js +6 -0
  31. package/src/components/CvSearch/CvSearch.stories.mdx +168 -0
  32. package/src/components/CvSearch/CvSearch.vue +250 -0
  33. package/src/components/CvSearch/index.js +3 -0
  34. package/src/components/CvSelect/CvSelect.vue +27 -6
  35. package/src/components/CvSlider/CvSlider.stories.js +166 -0
  36. package/src/components/CvSlider/CvSlider.vue +324 -0
  37. package/src/components/CvSlider/CvSliderSkeleton.stories.js +26 -0
  38. package/src/components/CvSlider/CvSliderSkeleton.vue +18 -0
  39. package/src/components/CvSlider/__tests__/__snapshots__/CvSlider.spec.js.snap +13 -0
  40. package/src/components/CvSlider/__tests__/__snapshots__/CvSliderSkeleton.spec.js.snap +13 -0
  41. package/src/components/CvSlider/index.js +5 -0
  42. package/src/components/CvSlider/sbSliderPrefix.js +2 -0
  43. package/src/components/CvTextArea/CvTextArea.stories.js +2 -2
  44. package/src/components/CvTextArea/CvTextAreaSkeleton.stories.js +29 -0
  45. package/src/components/CvTextArea/CvTextAreaSkeleton.vue +10 -0
  46. package/src/components/CvTextArea/StorybookGroupConst.js +1 -0
  47. package/src/components/CvTextArea/__tests__/__snapshots__/CvTextAreaSkeleton.spec.js.snap +7 -0
  48. package/src/components/CvTextArea/index.js +2 -1
  49. package/src/components/CvTimePicker/CvTimePicker.stories.mdx +325 -0
  50. package/src/components/CvTimePicker/CvTimePicker.vue +217 -0
  51. package/src/components/CvTimePicker/index.js +21 -0
  52. package/src/components/CvToggle/CvToggle-Skeleton.vue +27 -12
  53. package/src/components/CvToggle/CvToggle.stories.js +20 -3
  54. package/src/components/CvToggle/CvToggle.vue +22 -5
  55. package/src/components/CvToggle/__tests__/__snapshots__/CvToggle.spec.js.snap +3 -3
  56. package/src/components/CvTooltip/CvDefinitionTooltip.stories.js +80 -0
  57. package/src/components/CvTooltip/CvDefinitionTooltip.vue +61 -0
  58. package/src/components/CvTooltip/CvInteractiveTooltip.stories.js +90 -0
  59. package/src/components/CvTooltip/CvInteractiveTooltip.vue +267 -0
  60. package/src/components/CvTooltip/CvTooltip.stories.js +128 -0
  61. package/src/components/CvTooltip/CvTooltip.vue +44 -0
  62. package/src/components/CvTooltip/__tests__/__snapshots__/CvTooltip.spec.js.snap +525 -0
  63. package/src/components/CvTooltip/consts.js +15 -0
  64. package/src/components/CvTooltip/index.js +6 -0
  65. package/src/components/CvTooltip/sbTooltipPrefix.js +2 -0
  66. package/src/components/CvUIShell/CvSideNav.vue +10 -1
  67. package/src/components/CvUIShell/CvUIShell.stories.mdx +116 -50
  68. package/src/index.d.ts +6 -0
  69. package/src/index.js +11 -0
  70. package/src/use/cvCheck.js +3 -0
  71. package/src/use/index.js +2 -0
  72. package/src/use/useMethods.js +18 -0
  73. package/src/use/useRadio.js +25 -0
@@ -0,0 +1,324 @@
1
+ <template>
2
+ <div :class="`cv-slider ${carbonPrefix}--form-item`">
3
+ <label
4
+ v-show="label"
5
+ :for="cvId"
6
+ :class="[
7
+ `${carbonPrefix}--label`,
8
+ { [`${carbonPrefix}--label--disabled`]: disabled },
9
+ ]"
10
+ :id="labelId"
11
+ >
12
+ {{ label }}
13
+ </label>
14
+
15
+ <div :class="`${carbonPrefix}--slider-container`">
16
+ <span :class="`${carbonPrefix}--slider__range-label`">
17
+ {{ internalMinLabel }}
18
+ </span>
19
+
20
+ <div
21
+ :class="[
22
+ `${carbonPrefix}--slider`,
23
+ { [`${carbonPrefix}--slider--disabled`]: disabled },
24
+ ]"
25
+ data-slider
26
+ data-slider-input-box="#slider-input-box"
27
+ >
28
+ <div
29
+ :class="`${carbonPrefix}--slider__track`"
30
+ @click="onTrackClick"
31
+ ref="track"
32
+ ></div>
33
+
34
+ <div
35
+ :class="`${carbonPrefix}--slider__filled-track`"
36
+ :style="`width: ${percentage};`"
37
+ ></div>
38
+
39
+ <div
40
+ :class="[
41
+ `${carbonPrefix}--slider__thumb`,
42
+ {
43
+ [`${carbonPrefix}--slider__thumb--clicked`]: animateClick,
44
+ },
45
+ ]"
46
+ tabindex="0"
47
+ :aria-labelledby="labelId"
48
+ :style="`left: ${percentage};`"
49
+ ref="thumb"
50
+ @keydown.up.right.prevent="onUp"
51
+ @keydown.down.left.prevent="onDown"
52
+ @mousedown="onStartDrag"
53
+ ></div>
54
+
55
+ <input
56
+ :id="cvId"
57
+ :class="`${carbonPrefix}--slider__input`"
58
+ type="range"
59
+ :step="step"
60
+ :min="min"
61
+ :max="max"
62
+ ref="range"
63
+ />
64
+ </div>
65
+
66
+ <span :class="`${carbonPrefix}--slider__range-label`">
67
+ {{ internalMaxLabel }}
68
+ </span>
69
+
70
+ <input
71
+ type="string"
72
+ :class="[
73
+ `${carbonPrefix}--text-input ${carbonPrefix}--slider-text-input`,
74
+ { [`${carbonPrefix}--text-input--light`]: isLight },
75
+ ]"
76
+ :placeholder="min"
77
+ v-model="internalValue"
78
+ @change="onChange"
79
+ ref="inputBox"
80
+ @keydown.up.prevent="onUp"
81
+ @keydown.down.prevent="onDown"
82
+ :disabled="disabled"
83
+ />
84
+ </div>
85
+ </div>
86
+ </template>
87
+
88
+ <script setup>
89
+ import { computed, ref, onMounted, nextTick, watch } from 'vue';
90
+ import { carbonPrefix } from '../../global/settings';
91
+ import { props as propsCvId, useCvId } from '../../use/cvId';
92
+ import { useIsLight, props as propsTheme } from '../../use/cvTheme';
93
+
94
+ const props = defineProps({
95
+ modelValue: {
96
+ type: String,
97
+ default: undefined,
98
+ },
99
+ value: {
100
+ type: String,
101
+ default: undefined,
102
+ },
103
+ disabled: Boolean,
104
+ label: {
105
+ type: String,
106
+ default: undefined,
107
+ },
108
+ // NOTE: It is not safe to rely on Numbers for non-integer steps
109
+ min: {
110
+ type: String,
111
+ default: '0',
112
+ },
113
+ max: {
114
+ type: String,
115
+ default: '100',
116
+ },
117
+ minLabel: {
118
+ type: String,
119
+ default: undefined,
120
+ },
121
+ maxLabel: {
122
+ type: String,
123
+ default: undefined,
124
+ },
125
+ step: {
126
+ type: String,
127
+ default: '1',
128
+ },
129
+ stepMultiplier: {
130
+ type: String,
131
+ default: '4',
132
+ validator(val) {
133
+ if (val.length) {
134
+ let intMultiplier = parseInt(val);
135
+ if (isNaN(intMultiplier) || intMultiplier < 1) {
136
+ console.warn('cv-slider: multiplier must be >= 1');
137
+ return false;
138
+ }
139
+ }
140
+ return true;
141
+ },
142
+ },
143
+ ...propsTheme,
144
+ ...propsCvId,
145
+ });
146
+
147
+ const range = ref(null);
148
+ const thumb = ref(null);
149
+ const track = ref(null);
150
+ const DefaultRangeMin = 0;
151
+ const DefaultRangeMax = 100;
152
+ const DefaultValue = 0;
153
+ const StepNaNReplacement = 0;
154
+ const StepDefaultValue = 1;
155
+ const DefaultMultiplier = 4;
156
+
157
+ const emit = defineEmits(['update:modelValue', 'change', 'update:value']);
158
+
159
+ const cvId = useCvId(props, true);
160
+ const isLight = useIsLight(props);
161
+ const internalValue = ref('');
162
+ const animateClick = ref(false);
163
+ const isDragging = ref(false);
164
+ const dragStartX = ref(0);
165
+ const dragStartValue = ref(0);
166
+ const percentage = ref('0%');
167
+
168
+ const labelId = computed(() => `${cvId.value}-label`);
169
+
170
+ const internalMinLabel = computed(() => props.minLabel ?? getMin());
171
+
172
+ const internalMaxLabel = computed(() => props.maxLabel ?? getMax());
173
+
174
+ const rangePropsObserver = computed(() => ({
175
+ min: props.min,
176
+ max: props.max,
177
+ step: props.step,
178
+ }));
179
+
180
+ const internalMultiplier = computed(() => {
181
+ let intMultiplier = parseInt(props.stepMultiplier);
182
+ // default to 4 fro multiplier
183
+ return isNaN(intMultiplier) ? DefaultMultiplier : Math.max(intMultiplier, 1);
184
+ });
185
+
186
+ const getRangeAttributeValue = (
187
+ attributeName,
188
+ defaultForNaN,
189
+ defaultReturnValue
190
+ ) => {
191
+ if (range?.value) {
192
+ const val = parseFloat(range.value[attributeName]);
193
+ return isNaN(val) ? defaultForNaN : val;
194
+ }
195
+ return defaultReturnValue ?? defaultForNaN;
196
+ };
197
+
198
+ const getMin = () => {
199
+ return getRangeAttributeValue('min', DefaultRangeMin);
200
+ };
201
+
202
+ const getMax = () => {
203
+ return getRangeAttributeValue('max', DefaultRangeMax);
204
+ };
205
+
206
+ const getValue = () => {
207
+ const middleValue = (getMax() + getMin()) / 2;
208
+ return getRangeAttributeValue('value', DefaultValue, middleValue);
209
+ };
210
+
211
+ const getStep = () => {
212
+ return getRangeAttributeValue('step', StepNaNReplacement, StepDefaultValue);
213
+ };
214
+
215
+ const setValue = newValue => {
216
+ if (props.disabled) return;
217
+
218
+ range.value.value = newValue;
219
+ internalValue.value = range.value.value;
220
+
221
+ percentage.value = `${
222
+ ((internalValue.value - getMin()) * 100) / (getMax() - getMin())
223
+ }%`;
224
+
225
+ const { value: rangeValue } = range.value;
226
+ emit('update:modelValue', rangeValue);
227
+ emit('update:value', rangeValue);
228
+ emit('change', rangeValue);
229
+ };
230
+
231
+ const onChange = () => {
232
+ let newValue = internalValue.value.length
233
+ ? parseFloat(internalValue.value)
234
+ : getMin();
235
+ setValue(newValue);
236
+ };
237
+
238
+ const onStartDrag = ev => {
239
+ document.body.addEventListener('mousemove', onDrag);
240
+ document.body.addEventListener('mouseup', onStopDrag);
241
+
242
+ dragStartX.value = ev.clientX;
243
+ dragStartValue.value = getValue();
244
+ isDragging.value = true;
245
+ };
246
+
247
+ const onDrag = ev => {
248
+ if (isDragging.value) {
249
+ // percentage change
250
+ let newValue = (ev.clientX - dragStartX.value) / track.value.offsetWidth;
251
+ // uncapped new value
252
+ newValue = dragStartValue.value + (getMax() - getMin()) * newValue;
253
+ setValue(newValue);
254
+ }
255
+ };
256
+
257
+ const onStopDrag = () => {
258
+ isDragging.value = false;
259
+ document.body.removeEventListener('mousemove', onDrag);
260
+ document.body.removeEventListener('mouseup', onStopDrag);
261
+ };
262
+
263
+ const onTrackClick = ev => {
264
+ const afterAnimate = ev => {
265
+ if (ev.propertyName === 'left') {
266
+ animateClick.value = false;
267
+ thumb.value.removeEventListener('transitionend', afterAnimate);
268
+ }
269
+ };
270
+
271
+ let newValue = ev.offsetX / track.value.offsetWidth;
272
+ const min = getMin();
273
+ newValue = (getMax() - min) * newValue + min;
274
+ thumb.value.addEventListener('transitionend', afterAnimate);
275
+ animateClick.value = true;
276
+ setValue(newValue);
277
+ };
278
+
279
+ const onUpDown = (ev, isUp = true) => {
280
+ let curValue =
281
+ ev.target.type === 'number' ? parseFloat(ev.target.value) : getValue();
282
+ const step = getStep();
283
+ const progressValue = ev.shiftKey ? internalMultiplier.value * step : step;
284
+ const direction = isUp ? 1 : -1;
285
+ let newValue = curValue + progressValue * direction;
286
+ setValue(newValue);
287
+ };
288
+
289
+ const onUp = ev => {
290
+ onUpDown(ev);
291
+ };
292
+
293
+ const onDown = ev => {
294
+ onUpDown(ev, false);
295
+ };
296
+
297
+ onMounted(() => {
298
+ range.value.value = props.value ?? props.modelValue;
299
+ internalValue.value = range.value.value;
300
+ percentage.value = `${
301
+ ((internalValue.value - getMin()) * 100) / (getMax() - getMin())
302
+ }%`;
303
+ });
304
+
305
+ watch(
306
+ () => props.modelValue,
307
+ modelValue => {
308
+ setValue(modelValue);
309
+ }
310
+ );
311
+
312
+ watch(
313
+ () => props.value,
314
+ value => {
315
+ setValue(value);
316
+ }
317
+ );
318
+
319
+ watch(rangePropsObserver, () => {
320
+ nextTick(() => {
321
+ setValue(internalValue.value);
322
+ });
323
+ });
324
+ </script>
@@ -0,0 +1,26 @@
1
+ import {
2
+ sbCompPrefix,
3
+ storyParametersObject,
4
+ } from '../../global/storybook-utils';
5
+ import { sbSliderPrefix } from './sbSliderPrefix';
6
+ import { CvSliderSkeleton } from '.';
7
+
8
+ export default {
9
+ title: `${sbCompPrefix}/${sbSliderPrefix}/CvSliderSkeleton`,
10
+ component: CvSliderSkeleton,
11
+ };
12
+
13
+ const template = `<cv-slider-skeleton />`;
14
+ const Template = () => {
15
+ return {
16
+ components: { CvSliderSkeleton },
17
+ template,
18
+ };
19
+ };
20
+
21
+ export const Default = Template.bind({});
22
+ Default.parameters = storyParametersObject(
23
+ Default.parameters,
24
+ template,
25
+ Default.args
26
+ );
@@ -0,0 +1,18 @@
1
+ <template>
2
+ <div :class="`cv-slider ${carbonPrefix}--form-item`">
3
+ <label :class="`${carbonPrefix}--label ${carbonPrefix}--skeleton`"></label>
4
+ <div :class="`${carbonPrefix}--slider-container ${carbonPrefix}--skeleton`">
5
+ <span :class="`${carbonPrefix}--slider__range-label`"></span>
6
+ <div :class="`${carbonPrefix}--slider`">
7
+ <div :class="`${carbonPrefix}--slider__track`"></div>
8
+ <div :class="`${carbonPrefix}--slider__filled-track`"></div>
9
+ <div :class="`${carbonPrefix}--slider__thumb`"></div>
10
+ </div>
11
+ <span :class="`${carbonPrefix}--slider__range-label`"></span>
12
+ </div>
13
+ </div>
14
+ </template>
15
+
16
+ <script setup>
17
+ import { carbonPrefix } from '../../global/settings';
18
+ </script>
@@ -0,0 +1,13 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`CvSlider should match snapshot 1`] = `
4
+ <div class="cv-slider bx--form-item"><label for="abc" class="bx--label" id="abc-label" style="display: none;"></label>
5
+ <div class="bx--slider-container"><span class="bx--slider__range-label">0</span>
6
+ <div class="bx--slider" data-slider="" data-slider-input-box="#slider-input-box">
7
+ <div class="bx--slider__track"></div>
8
+ <div class="bx--slider__filled-track" style="width: 0%;"></div>
9
+ <div class="bx--slider__thumb" tabindex="0" aria-labelledby="abc-label" style="left: 0%;"></div><input id="abc" class="bx--slider__input" type="range" step="1" min="0" max="100">
10
+ </div><span class="bx--slider__range-label">100</span><input type="string" class="bx--text-input bx--slider-text-input" placeholder="0">
11
+ </div>
12
+ </div>
13
+ `;
@@ -0,0 +1,13 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`CvSliderSkeleton should match snapshot 1`] = `
4
+ <div class="cv-slider bx--form-item"><label class="bx--label bx--skeleton"></label>
5
+ <div class="bx--slider-container bx--skeleton"><span class="bx--slider__range-label"></span>
6
+ <div class="bx--slider">
7
+ <div class="bx--slider__track"></div>
8
+ <div class="bx--slider__filled-track"></div>
9
+ <div class="bx--slider__thumb"></div>
10
+ </div><span class="bx--slider__range-label"></span>
11
+ </div>
12
+ </div>
13
+ `;
@@ -0,0 +1,5 @@
1
+ import { default as CvSlider } from './CvSlider.vue';
2
+ import { default as CvSliderSkeleton } from './CvSliderSkeleton.vue';
3
+
4
+ export { CvSlider, CvSliderSkeleton };
5
+ export default CvSlider;
@@ -0,0 +1,2 @@
1
+ /* istanbul ignore next */
2
+ export const sbSliderPrefix = 'CvSlider';
@@ -2,12 +2,12 @@ import {
2
2
  sbCompPrefix,
3
3
  storyParametersObject,
4
4
  } from '../../global/storybook-utils';
5
-
5
+ import { StorybookGroupConst } from './StorybookGroupConst';
6
6
  import CvTextArea from '.';
7
7
  import { ref } from 'vue';
8
8
 
9
9
  export default {
10
- title: `${sbCompPrefix}/CvTextArea`,
10
+ title: `${sbCompPrefix}/${StorybookGroupConst}/CvTextArea`,
11
11
  component: CvTextArea,
12
12
  argTypes: {
13
13
  // attrs
@@ -0,0 +1,29 @@
1
+ import {
2
+ sbCompPrefix,
3
+ storyParametersObject,
4
+ } from '../../global/storybook-utils';
5
+ import { StorybookGroupConst } from './StorybookGroupConst';
6
+ import { CvTextAreaSkeleton } from './';
7
+
8
+ export default {
9
+ title: `${sbCompPrefix}/${StorybookGroupConst}/CvTextAreaSkeleton`,
10
+ component: CvTextAreaSkeleton,
11
+ };
12
+
13
+ const template = `<cv-text-area-skeleton></cv-text-area-skeleton>`;
14
+ const Template = args => {
15
+ return {
16
+ components: { CvTextAreaSkeleton },
17
+ template,
18
+ setup() {
19
+ return { args };
20
+ },
21
+ };
22
+ };
23
+
24
+ export const Default = Template.bind({});
25
+ Default.parameters = storyParametersObject(
26
+ Default.parameters,
27
+ template,
28
+ Default.args
29
+ );
@@ -0,0 +1,10 @@
1
+ <template>
2
+ <div :class="`${carbonPrefix}--form-item`">
3
+ <label :class="`${carbonPrefix}--label ${carbonPrefix}--skeleton`" />
4
+ <div :class="`${carbonPrefix}--text-area ${carbonPrefix}--skeleton`" />
5
+ </div>
6
+ </template>
7
+
8
+ <script setup>
9
+ import { carbonPrefix } from '../../global/settings';
10
+ </script>
@@ -0,0 +1 @@
1
+ export const StorybookGroupConst = 'CvTextArea';
@@ -0,0 +1,7 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`CvTextAreaSkeleton should match snapshot 1`] = `
4
+ <div class="bx--form-item"><label class="bx--label bx--skeleton"></label>
5
+ <div class="bx--text-area bx--skeleton"></div>
6
+ </div>
7
+ `;
@@ -1,4 +1,5 @@
1
1
  import CvTextArea from './CvTextArea.vue';
2
+ import CvTextAreaSkeleton from './CvTextAreaSkeleton';
2
3
 
3
- export { CvTextArea };
4
+ export { CvTextArea, CvTextAreaSkeleton };
4
5
  export default CvTextArea;