sprintify-ui 0.0.10 → 0.0.12

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 (103) hide show
  1. package/dist/sprintify-ui.es.js +5174 -6624
  2. package/dist/style.css +1 -1
  3. package/dist/tailwindcss/index.js +23 -0
  4. package/dist/types/src/components/BaseAutocomplete.vue.d.ts +0 -1
  5. package/dist/types/src/components/BaseAutocompleteFetch.vue.d.ts +0 -1
  6. package/dist/types/src/components/BaseBelongsTo.vue.d.ts +13 -3
  7. package/dist/types/src/components/BaseCharacterCounter.vue.d.ts +143 -0
  8. package/dist/types/src/components/BaseDataTable.vue.d.ts +95 -64
  9. package/dist/types/src/components/BaseDialog.vue.d.ts +8 -8
  10. package/dist/types/src/components/BaseFilePicker.vue.d.ts +3 -3
  11. package/dist/types/src/components/BaseInput.vue.d.ts +39 -5
  12. package/dist/types/src/components/BaseLoadingCover.vue.d.ts +84 -12
  13. package/dist/types/src/components/BaseMenuItem.vue.d.ts +4 -4
  14. package/dist/types/src/components/BaseModalCenter.vue.d.ts +8 -8
  15. package/dist/types/src/components/BaseModalSide.vue.d.ts +8 -8
  16. package/dist/types/src/components/BaseNavbarItemContent.vue.d.ts +4 -4
  17. package/dist/types/src/components/BasePagination.vue.d.ts +105 -13
  18. package/dist/types/src/components/BasePaginationSimple.vue.d.ts +2 -2
  19. package/dist/types/src/components/BaseSelect.vue.d.ts +130 -26
  20. package/dist/types/src/components/BaseSwitch.vue.d.ts +15 -8
  21. package/dist/types/src/components/BaseTabItem.vue.d.ts +26 -4
  22. package/dist/types/src/components/BaseTableColumn.vue.d.ts +4 -4
  23. package/dist/types/src/components/BaseTextareaAutoresize.vue.d.ts +175 -21
  24. package/dist/types/src/components/index.d.ts +24 -1
  25. package/dist/types/src/index.d.ts +4 -0
  26. package/dist/types/src/svg/BaseEmptyState.vue.d.ts +2 -0
  27. package/dist/types/src/{components/BaseSpinner.vue.d.ts → svg/BaseSpinnerLarge.vue.d.ts} +0 -0
  28. package/dist/types/src/svg/BaseSpinnerSmall.vue.d.ts +44 -0
  29. package/dist/types/src/types/types.d.ts +1 -1
  30. package/package.json +4 -2
  31. package/src/components/BaseAutocomplete.stories.js +7 -4
  32. package/src/components/BaseAutocomplete.vue +44 -15
  33. package/src/components/BaseAutocompleteFetch.stories.js +6 -3
  34. package/src/components/BaseAutocompleteFetch.vue +8 -3
  35. package/src/components/BaseBelongsTo.stories.js +9 -4
  36. package/src/components/BaseBelongsTo.vue +1 -0
  37. package/src/components/BaseCard.vue +1 -1
  38. package/src/components/BaseCharacterCounter.stories.js +30 -0
  39. package/src/components/BaseCharacterCounter.vue +60 -0
  40. package/src/components/BaseDataIterator.stories.js +102 -3
  41. package/src/components/BaseDataIterator.vue +75 -49
  42. package/src/components/BaseDataTable.stories.js +149 -2
  43. package/src/components/BaseDataTable.vue +34 -28
  44. package/src/components/BaseDataTableToggleColumns.vue +1 -1
  45. package/src/components/BaseDateSelect.vue +6 -2
  46. package/src/components/BaseDescriptionListItem.vue +40 -4
  47. package/src/components/BaseDialog.stories.js +51 -0
  48. package/src/components/BaseDialog.vue +13 -7
  49. package/src/components/BaseFilePicker.stories.js +51 -0
  50. package/src/components/BaseFilePicker.vue +6 -6
  51. package/src/components/BaseFileUploader.stories.js +80 -0
  52. package/src/components/BaseFileUploader.vue +16 -3
  53. package/src/components/BaseInput.stories.js +46 -0
  54. package/src/components/BaseInput.vue +10 -2
  55. package/src/components/BaseInputLabel.stories.js +31 -0
  56. package/src/components/BaseInputLabel.vue +1 -1
  57. package/src/components/BaseLoadingCover.stories.js +55 -0
  58. package/src/components/BaseLoadingCover.vue +27 -17
  59. package/src/components/BaseMenu.stories.js +125 -0
  60. package/src/components/BaseModalCenter.stories.js +61 -0
  61. package/src/components/BaseModalCenter.vue +2 -2
  62. package/src/components/BaseModalSide.stories.js +55 -0
  63. package/src/components/BaseModalSide.vue +2 -2
  64. package/src/components/BaseNavbar.stories.js +150 -0
  65. package/src/components/BaseNavbar.vue +3 -0
  66. package/src/components/BaseNavbarItem.vue +1 -0
  67. package/src/components/BaseNavbarItemContent.vue +3 -0
  68. package/src/components/BasePagination.stories.js +32 -0
  69. package/src/components/BasePagination.vue +126 -40
  70. package/src/components/BasePaginationSimple.vue +3 -3
  71. package/src/components/BasePanel.stories.js +56 -0
  72. package/src/components/BasePassword.stories.js +36 -0
  73. package/src/components/BasePassword.vue +11 -5
  74. package/src/components/BaseProcessRing.stories.js +27 -0
  75. package/src/components/BaseReadMore.stories.js +30 -0
  76. package/src/components/BaseReadMore.vue +1 -1
  77. package/src/components/BaseSelect.stories.js +67 -0
  78. package/src/components/BaseSelect.vue +144 -44
  79. package/src/components/BaseSideNavigation.stories.js +55 -0
  80. package/src/components/BaseSideNavigation.vue +7 -2
  81. package/src/components/BaseSideNavigationItem.vue +11 -3
  82. package/src/components/BaseSkeleton.stories.js +36 -0
  83. package/src/components/BaseSwitch.stories.js +101 -0
  84. package/src/components/BaseSwitch.vue +90 -12
  85. package/src/components/BaseSystemAlert.stories.js +63 -0
  86. package/src/components/BaseTabItem.vue +19 -6
  87. package/src/components/BaseTable.vue +42 -29
  88. package/src/components/BaseTableColumn.vue +2 -2
  89. package/src/components/BaseTabs.stories.js +54 -0
  90. package/src/components/BaseTabs.vue +3 -3
  91. package/src/components/BaseTextarea.stories.js +35 -0
  92. package/src/components/BaseTextarea.vue +1 -1
  93. package/src/components/BaseTextareaAutoresize.stories.js +49 -0
  94. package/src/components/BaseTextareaAutoresize.vue +83 -87
  95. package/src/components/index.ts +46 -0
  96. package/src/lang/en.json +1 -0
  97. package/src/lang/fr.json +1 -0
  98. package/src/svg/BaseEmptyState.vue +34 -0
  99. package/src/{components/BaseSpinner.vue → svg/BaseSpinnerLarge.vue} +0 -0
  100. package/src/svg/BaseSpinnerSmall.vue +9 -0
  101. package/src/types/types.ts +1 -1
  102. package/dist/types/src/components/BaseWordCount.vue.d.ts +0 -31
  103. package/src/components/BaseWordCount.vue +0 -36
@@ -1,9 +1,10 @@
1
1
  <template>
2
2
  <nav
3
3
  v-if="lastPage > 1 || lastPage < modelValue"
4
- class="flex items-center justify-between border-t border-slate-200 px-4 sm:px-0"
4
+ ref="paginationNode"
5
+ class="flex items-center justify-between border-t border-slate-200"
5
6
  >
6
- <div class="-mt-px flex w-0 flex-1">
7
+ <div class="flex -mt-px w-0 flex-1">
7
8
  <button
8
9
  type="button"
9
10
  :disabled="modelValue == 1"
@@ -17,23 +18,25 @@
17
18
  {{ $t('sui.previous') }}
18
19
  </button>
19
20
  </div>
20
- <div class="hidden md:-mt-px md:flex">
21
+ <div :class="[mobileLayout ? 'hidden' : 'flex -mt-px']">
21
22
  <button
22
- v-for="i in lastPage"
23
- :key="i"
23
+ v-for="(i, index) in items"
24
+ :key="i + (index + '')"
24
25
  type="button"
25
- class="inline-flex items-center border-t-2 px-4 py-4 text-sm font-medium hover:border-slate-300 hover:text-slate-700"
26
- :class="
27
- i == modelValue
28
- ? 'border-primary-500 text-primary-600'
29
- : 'border-transparent text-slate-500 hover:border-slate-300 hover:text-slate-700'
30
- "
31
- @click="$emit('model-value:update', i)"
26
+ class="inline-flex items-center border-t-2 px-4 py-4 text-sm font-medium"
27
+ :class="[
28
+ i == modelValue ? 'border-primary-500 text-primary-500' : '',
29
+ i != modelValue ? 'border-transparent text-slate-500' : '',
30
+ i != modelValue && isClickable(i)
31
+ ? 'hover:border-slate-300 hover:text-slate-700'
32
+ : '',
33
+ ]"
34
+ @click="onButtonClick(i)"
32
35
  >
33
36
  {{ i }}
34
37
  </button>
35
38
  </div>
36
- <div class="-mt-px flex w-0 flex-1 justify-end">
39
+ <div class="flex -mt-px w-0 flex-1 justify-end">
37
40
  <button
38
41
  :disabled="modelValue >= lastPage"
39
42
  class="inline-flex items-center border-t-2 border-transparent px-1 py-4 text-sm font-medium text-slate-500 hover:enabled:border-slate-300 hover:enabled:text-slate-700 disabled:cursor-not-allowed disabled:opacity-60"
@@ -49,34 +52,117 @@
49
52
  </nav>
50
53
  </template>
51
54
 
52
- <script lang="ts">
53
- import { defineComponent } from 'vue';
54
-
55
- export default defineComponent({
56
- props: {
57
- modelValue: {
58
- required: true,
59
- type: Number,
60
- },
61
- lastPage: {
62
- required: true,
63
- type: Number,
64
- },
55
+ <script lang="ts" setup>
56
+ import { useResizeObserver } from '@vueuse/core';
57
+ import { range } from 'lodash';
58
+ import { Ref } from 'vue';
59
+
60
+ const props = defineProps({
61
+ modelValue: {
62
+ default: 1,
63
+ required: true,
64
+ type: Number,
65
+ },
66
+ lastPage: {
67
+ required: true,
68
+ type: Number,
65
69
  },
66
- emits: ['model-value:update'],
67
- methods: {
68
- next() {
69
- if (this.modelValue >= this.lastPage) {
70
- return;
71
- }
72
- this.$emit('model-value:update', this.modelValue + 1);
73
- },
74
- previous() {
75
- if (this.modelValue == 1) {
76
- return;
77
- }
78
- this.$emit('model-value:update', this.modelValue - 1);
79
- },
70
+ totalVisible: {
71
+ default: 10,
72
+ type: Number,
80
73
  },
81
74
  });
75
+
76
+ const emit = defineEmits(['update:model-value']);
77
+
78
+ function next() {
79
+ if (props.modelValue >= props.lastPage) {
80
+ return;
81
+ }
82
+ emit('update:model-value', props.modelValue + 1);
83
+ }
84
+
85
+ function previous() {
86
+ if (props.modelValue == 1) {
87
+ return;
88
+ }
89
+ emit('update:model-value', props.modelValue - 1);
90
+ }
91
+
92
+ const paginationNode = ref(null) as Ref<null | HTMLElement>;
93
+ const width = ref(800);
94
+
95
+ useResizeObserver(paginationNode, () => {
96
+ width.value = paginationNode.value?.clientWidth ?? 800;
97
+ maxButtons.value = Math.floor((width.value - 96) / 56);
98
+ });
99
+
100
+ const mobileLayout = computed(() => {
101
+ return width.value < 600;
102
+ });
103
+
104
+ const length = computed(() => {
105
+ return props.lastPage + 1;
106
+ });
107
+
108
+ const maxButtons = ref(0);
109
+
110
+ const items = computed(() => {
111
+ const totalVisible = props.totalVisible + 2;
112
+
113
+ if (
114
+ totalVisible === 0 ||
115
+ isNaN(length.value) ||
116
+ length.value > Number.MAX_SAFE_INTEGER
117
+ ) {
118
+ return [];
119
+ }
120
+
121
+ const maxLength = Math.min(
122
+ Math.max(0, totalVisible) || length.value,
123
+ Math.max(0, maxButtons.value) || length.value,
124
+ length.value
125
+ );
126
+
127
+ if (length.value <= maxLength) {
128
+ return range(1, length.value);
129
+ }
130
+
131
+ const even = maxLength % 2 === 0 ? 1 : 0;
132
+ const left = Math.floor(maxLength / 2);
133
+ const right = length.value - left + 1 + even;
134
+
135
+ if (props.modelValue > left && props.modelValue < right) {
136
+ const firstItem = 1;
137
+ const lastItem = length.value;
138
+ const start = props.modelValue - left + 2;
139
+ const end = props.modelValue + left - 2 - even;
140
+ const secondItem = start - 1 === firstItem + 1 ? 2 : '...';
141
+ const beforeLastItem = end + 1 === lastItem - 1 ? end + 1 : '...';
142
+
143
+ return [1, secondItem, ...range(start, end), beforeLastItem, length.value];
144
+ } else if (props.modelValue === left) {
145
+ const end = props.modelValue + left - 1 - even;
146
+ return [...range(1, end), '...', length.value];
147
+ } else if (props.modelValue === right) {
148
+ const start = props.modelValue - left + 1;
149
+ return [1, '...', ...range(start, length.value)];
150
+ } else {
151
+ return [...range(1, left), '...', ...range(right, length.value)];
152
+ }
153
+ });
154
+
155
+ function isClickable(i: number | string) {
156
+ if (i == '...') {
157
+ return false;
158
+ }
159
+ return true;
160
+ }
161
+
162
+ function onButtonClick(i: number | string) {
163
+ if (!isClickable(i)) {
164
+ return;
165
+ }
166
+ emit('update:model-value', i);
167
+ }
82
168
  </script>
@@ -41,19 +41,19 @@ export default defineComponent({
41
41
  type: Number,
42
42
  },
43
43
  },
44
- emits: ['model-value:update'],
44
+ emits: ['update:model-value'],
45
45
  methods: {
46
46
  next() {
47
47
  if (this.modelValue >= this.lastPage) {
48
48
  return;
49
49
  }
50
- this.$emit('model-value:update', this.modelValue + 1);
50
+ this.$emit('update:model-value', this.modelValue + 1);
51
51
  },
52
52
  previous() {
53
53
  if (this.modelValue == 1) {
54
54
  return;
55
55
  }
56
- this.$emit('model-value:update', this.modelValue - 1);
56
+ this.$emit('update:model-value', this.modelValue - 1);
57
57
  },
58
58
  },
59
59
  });
@@ -0,0 +1,56 @@
1
+ import BaseContainer from './BaseContainer.vue';
2
+ import BasePanel from './BasePanel.vue';
3
+ import BaseCard from './BaseCard.vue';
4
+ import BaseCardRow from './BaseCardRow.vue';
5
+ import BaseInputLabel from './BaseInputLabel.vue';
6
+ import BaseInput from './BaseInput.vue';
7
+
8
+ export default {
9
+ title: 'Layout/BasePanel',
10
+ component: BasePanel,
11
+ args: {
12
+ title: 'General information',
13
+ description:
14
+ 'Enter general user information, name and age. User must be more than 10 years old to participate.',
15
+ },
16
+ };
17
+
18
+ const Template = (args) => ({
19
+ components: {
20
+ BaseContainer,
21
+ BasePanel,
22
+ BaseCard,
23
+ BaseCardRow,
24
+ BaseInputLabel,
25
+ BaseInput,
26
+ },
27
+ setup() {
28
+ return { args };
29
+ },
30
+ template: `
31
+ <div class="bg-slate-100 py-10">
32
+ <BaseContainer>
33
+ <BasePanel v-bind="args">
34
+ <BaseCard>
35
+ <BaseCardRow>
36
+ <div class="mb-4">
37
+ <BaseInputLabel label="Name" />
38
+ <BaseInput name="name" class="w-full" placeholder="Enter you name" />
39
+ </div>
40
+
41
+ <div class="mb-4">
42
+ <BaseInputLabel label="Age" />
43
+ <BaseInput name="age" class="w-full" placeholder="Enter you age" />
44
+ </div>
45
+
46
+ <button class="btn btn-primary mt-2">Submit</button>
47
+ </BaseCardRow>
48
+ </BaseCard>
49
+ </BasePanel>
50
+ </BaseContainer>
51
+ </div>
52
+ `,
53
+ });
54
+
55
+ export const Demo = Template.bind({});
56
+ Demo.args = {};
@@ -0,0 +1,36 @@
1
+ import BasePassword from './BasePassword.vue';
2
+
3
+ export default {
4
+ title: 'Form/BasePassword',
5
+ component: BasePassword,
6
+ args: {
7
+ required: true,
8
+ name: 'password',
9
+ },
10
+ };
11
+
12
+ const Template = (args) => ({
13
+ components: {
14
+ BasePassword,
15
+ },
16
+ setup() {
17
+ const value = ref('');
18
+ return { args, value };
19
+ },
20
+ template: `
21
+ <form @submit.prevent="">
22
+ <BasePassword class="border-slate-300" v-model="value" v-bind="args"></BasePassword>
23
+ </form>
24
+ `,
25
+ });
26
+
27
+ export const Demo = Template.bind({});
28
+ Demo.args = {
29
+ placeholder: 'Enter your password',
30
+ };
31
+
32
+ export const Disabled = Template.bind({});
33
+ Disabled.args = {
34
+ disabled: true,
35
+ placeholder: 'Enter your password',
36
+ };
@@ -1,5 +1,8 @@
1
1
  <template>
2
- <div class="flex border bg-white">
2
+ <div
3
+ class="flex rounded border border-slate-300 bg-white"
4
+ :class="[disabled ? 'cursor-not-allowed text-slate-300' : '']"
5
+ >
3
6
  <input
4
7
  ref="input"
5
8
  :value="modelValue"
@@ -8,7 +11,7 @@
8
11
  :disabled="disabled"
9
12
  :placeholder="placeholder"
10
13
  :required="required"
11
- class="grow rounded-l border-none focus:ring-2 focus:ring-primary-500"
14
+ class="grow rounded-l rounded-r-none border-none focus:ring-2 focus:ring-primary-500 disabled:cursor-not-allowed"
12
15
  :class="inputClass"
13
16
  @input="onInput"
14
17
  />
@@ -16,15 +19,16 @@
16
19
  <button
17
20
  tabindex="-1"
18
21
  type="button"
19
- class="pr-3 text-slate-500"
22
+ class="pr-3 text-slate-500 disabled:cursor-not-allowed disabled:text-slate-300"
23
+ :disabled="disabled"
20
24
  @click="showPassword = !showPassword"
21
25
  >
22
26
  <BaseIcon
23
27
  v-if="!showPassword"
24
- icon="heroicons:eye-off"
28
+ icon="heroicons:eye-slash-20-solid"
25
29
  class="h-5 w-5"
26
30
  />
27
- <BaseIcon v-else icon="heroicons:eye" class="h-5 w-5" />
31
+ <BaseIcon v-else icon="heroicons:eye-20-solid" class="h-5 w-5" />
28
32
  </button>
29
33
  </div>
30
34
  </div>
@@ -33,8 +37,10 @@
33
37
  <script lang="ts">
34
38
  import { trim } from 'lodash';
35
39
  import { defineComponent, PropType } from 'vue';
40
+ import { Icon as BaseIcon } from '@iconify/vue';
36
41
 
37
42
  export default defineComponent({
43
+ components: { BaseIcon },
38
44
  props: {
39
45
  modelValue: {
40
46
  default: '',
@@ -0,0 +1,27 @@
1
+ import BaseProcessRing from './BaseProcessRing.vue';
2
+
3
+ export default {
4
+ title: 'Components/BaseProcessRing',
5
+ component: BaseProcessRing,
6
+ args: {
7
+ class: 'text-primary-500',
8
+ radius: 100,
9
+ stroke: 5,
10
+ progress: 0.6,
11
+ },
12
+ };
13
+
14
+ const Template = (args) => ({
15
+ components: {
16
+ BaseProcessRing,
17
+ },
18
+ setup() {
19
+ return { args };
20
+ },
21
+ template: `
22
+ <BaseProcessRing v-bind="args"></BaseProcessRing>
23
+ `,
24
+ });
25
+
26
+ export const Demo = Template.bind({});
27
+ Demo.args = {};
@@ -0,0 +1,30 @@
1
+ import BaseReadMore from './BaseReadMore.vue';
2
+ import BaseContainer from './BaseContainer.vue';
3
+
4
+ export default {
5
+ title: 'Components/BaseReadMore',
6
+ component: BaseReadMore,
7
+ args: {},
8
+ };
9
+
10
+ const Template = (args) => ({
11
+ components: {
12
+ BaseReadMore,
13
+ BaseContainer,
14
+ },
15
+ setup() {
16
+ return { args };
17
+ },
18
+ template: `
19
+ <BaseContainer size="3xl">
20
+ <BaseReadMore v-bind="args">
21
+ <p class="text-slate-600">
22
+ Aute incididunt laborum in sint commodo reprehenderit et aliquip aliqua proident exercitation nostrud sunt. Consectetur laborum elit do non ullamco anim fugiat laboris non aliqua consequat culpa. Veniam aliquip irure et qui dolore eiusmod exercitation elit exercitation ad excepteur reprehenderit enim. Id laboris do eu amet qui Lorem excepteur. Eiusmod eiusmod est qui minim consectetur aliqua occaecat sit tempor nulla. Velit et eiusmod id ut adipisicing occaecat deserunt.Excepteur occaecat nulla deserunt Lorem eu mollit non esse. Velit do proident adipisicing labore ipsum nostrud ipsum pariatur magna. Consequat do reprehenderit eiusmod cupidatat cupidatat cupidatat reprehenderit. Aute fugiat ex fugiat in ut enim dolore est qui. Lorem irure eiusmod eiusmod cillum aute nostrud sint aute enim aute. Aliquip aliqua quis deserunt commodo fugiat incididunt sint qui proident.
23
+ </p>
24
+ </BaseReadMore>
25
+ </BaseContainer>
26
+ `,
27
+ });
28
+
29
+ export const Demo = Template.bind({});
30
+ Demo.args = {};
@@ -13,7 +13,7 @@
13
13
  class="mt-1 inline appearance-none border-b border-dashed border-slate-400 bg-transparent px-0.5 py-0 text-slate-900 hover:text-slate-600"
14
14
  @click="showMore = true"
15
15
  >
16
- <span class="text-base font-semibold">{{ $t('sui.read_more') }}</span>
16
+ <span class="text-base font-medium">{{ $t('sui.read_more') }}</span>
17
17
  </button>
18
18
  </div>
19
19
  </template>
@@ -0,0 +1,67 @@
1
+ import BaseSelect from './BaseSelect.vue';
2
+ import BaseInputLabel from './BaseInputLabel.vue';
3
+
4
+ export default {
5
+ title: 'Form/BaseSelect',
6
+ component: BaseSelect,
7
+ args: {
8
+ name: 'name',
9
+ class: 'w-full',
10
+ },
11
+ };
12
+
13
+ const Template = (args) => ({
14
+ components: {
15
+ BaseSelect,
16
+ BaseInputLabel,
17
+ },
18
+ setup() {
19
+ function onSubmit() {
20
+ alert('submit');
21
+ }
22
+ // To test, you should try the following scenarios
23
+ // - valid (ex: 'javascript')
24
+ // - invalid (ex: 'test')
25
+ // - empty string ''
26
+ // - null
27
+ // - undefined
28
+
29
+ // Test on Safari AND Chrome
30
+
31
+ // For optional, make sure the default option is selected
32
+ // For required, try to submit, it should be prevented
33
+ const value = ref('test');
34
+ return { args, value, onSubmit };
35
+ },
36
+ template: `
37
+ <form @submit.prevent="onSubmit" class="border-none">
38
+ <BaseInputLabel :required="args.required" label="Choose your favorite programing language" />
39
+ <BaseSelect v-model="value" v-bind="args">
40
+ <option value="javascript">JavaScript</option>
41
+ <option value="typescript">Typescript</option>
42
+ <option value="golang">Golang</option>
43
+ </BaseSelect>
44
+ <button type="submit" class="btn btn-primary mt-5">Submit</button>
45
+ </form>
46
+ <pre class="mt-4 bg-slate-800 font-light text-xs p-3 rounded text-white">{{ {value} }}</pre>
47
+ `,
48
+ });
49
+
50
+ export const Optional = Template.bind({});
51
+ Optional.args = {
52
+ required: false,
53
+ placeholder: 'I dont like programing languages',
54
+ };
55
+
56
+ export const Required = Template.bind({});
57
+ Required.args = {
58
+ required: true,
59
+ placeholder: 'Choose a language',
60
+ };
61
+
62
+ export const Disabled = Template.bind({});
63
+ Disabled.args = {
64
+ required: true,
65
+ placeholder: 'Choose a language',
66
+ disabled: true,
67
+ };