@vc-shell/framework 1.0.215 → 1.0.216

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 (104) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/core/composables/useSettings/index.ts +1 -1
  3. package/dist/core/composables/useSettings/index.d.ts.map +1 -1
  4. package/dist/framework.js +32268 -24226
  5. package/dist/index.css +1 -1
  6. package/dist/locales/en.json +8 -0
  7. package/dist/shared/modules/dynamic/components/FIELD_MAP.d.ts.map +1 -1
  8. package/dist/shared/modules/dynamic/components/factories.d.ts +2 -1
  9. package/dist/shared/modules/dynamic/components/factories.d.ts.map +1 -1
  10. package/dist/shared/modules/dynamic/components/fields/InputCurrency.d.ts.map +1 -1
  11. package/dist/shared/modules/dynamic/components/fields/RadioButtonGroup.d.ts +121 -0
  12. package/dist/shared/modules/dynamic/components/fields/RadioButtonGroup.d.ts.map +1 -0
  13. package/dist/shared/modules/dynamic/components/fields/storybook/RadioButtonGroup.stories.d.ts +362 -0
  14. package/dist/shared/modules/dynamic/components/fields/storybook/RadioButtonGroup.stories.d.ts.map +1 -0
  15. package/dist/shared/modules/dynamic/composables/useFilterBuilder/index.d.ts.map +1 -1
  16. package/dist/shared/modules/dynamic/factories/types/index.d.ts +1 -1
  17. package/dist/shared/modules/dynamic/factories/types/index.d.ts.map +1 -1
  18. package/dist/shared/modules/dynamic/pages/dynamic-blade-form.vue.d.ts.map +1 -1
  19. package/dist/shared/modules/dynamic/types/index.d.ts +67 -3
  20. package/dist/shared/modules/dynamic/types/index.d.ts.map +1 -1
  21. package/dist/shared/modules/dynamic/types/models.d.ts +4 -1
  22. package/dist/shared/modules/dynamic/types/models.d.ts.map +1 -1
  23. package/dist/tsconfig.tsbuildinfo +1 -1
  24. package/dist/ui/components/atoms/index.d.ts +0 -1
  25. package/dist/ui/components/atoms/index.d.ts.map +1 -1
  26. package/dist/ui/components/atoms/vc-card/vc-card.stories.d.ts +40 -28
  27. package/dist/ui/components/atoms/vc-card/vc-card.stories.d.ts.map +1 -1
  28. package/dist/ui/components/atoms/vc-switch/vc-switch.stories.d.ts +6 -6
  29. package/dist/ui/components/molecules/index.d.ts +2 -0
  30. package/dist/ui/components/molecules/index.d.ts.map +1 -1
  31. package/dist/ui/components/{atoms → molecules}/vc-checkbox/index.d.ts +16 -16
  32. package/dist/ui/components/{atoms → molecules}/vc-checkbox/index.d.ts.map +1 -1
  33. package/dist/ui/components/{atoms → molecules}/vc-checkbox/vc-checkbox.stories.d.ts +160 -160
  34. package/dist/ui/components/molecules/vc-checkbox/vc-checkbox.stories.d.ts.map +1 -0
  35. package/dist/ui/components/molecules/vc-checkbox/vc-checkbox.vue.d.ts.map +1 -0
  36. package/dist/ui/components/molecules/vc-input/vc-input.stories.d.ts +40 -28
  37. package/dist/ui/components/molecules/vc-input/vc-input.stories.d.ts.map +1 -1
  38. package/dist/ui/components/molecules/vc-input/vc-input.vue.d.ts +10 -0
  39. package/dist/ui/components/molecules/vc-input/vc-input.vue.d.ts.map +1 -1
  40. package/dist/ui/components/molecules/vc-input-currency/vc-input-currency.stories.d.ts +28 -28
  41. package/dist/ui/components/molecules/vc-multivalue/vc-multivalue.stories.d.ts +63 -63
  42. package/dist/ui/components/molecules/vc-multivalue/vc-multivalue.vue.d.ts +9 -9
  43. package/dist/ui/components/molecules/vc-radio-button/index.d.ts +2 -0
  44. package/dist/ui/components/molecules/vc-radio-button/index.d.ts.map +1 -0
  45. package/dist/ui/components/molecules/vc-radio-button/vc-radio-button.stories.d.ts +687 -0
  46. package/dist/ui/components/molecules/vc-radio-button/vc-radio-button.stories.d.ts.map +1 -0
  47. package/dist/ui/components/molecules/vc-radio-button/vc-radio-button.vue.d.ts +81 -0
  48. package/dist/ui/components/molecules/vc-radio-button/vc-radio-button.vue.d.ts.map +1 -0
  49. package/dist/ui/components/molecules/vc-select/vc-select.stories.d.ts +90 -90
  50. package/dist/ui/components/molecules/vc-select/vc-select.vue.d.ts +9 -9
  51. package/dist/ui/components/molecules/vc-select/vc-select.vue.d.ts.map +1 -1
  52. package/dist/ui/components/molecules/vc-textarea/vc-textarea.stories.d.ts +168 -168
  53. package/dist/ui/components/organisms/vc-blade/_internal/vc-blade-header/vc-blade-header.vue.d.ts +1 -0
  54. package/dist/ui/components/organisms/vc-blade/_internal/vc-blade-header/vc-blade-header.vue.d.ts.map +1 -1
  55. package/dist/ui/components/organisms/vc-blade/vc-blade.stories.d.ts +4 -4
  56. package/dist/ui/components/organisms/vc-blade/vc-blade.vue.d.ts +1 -1
  57. package/dist/ui/components/organisms/vc-blade/vc-blade.vue.d.ts.map +1 -1
  58. package/dist/ui/components/organisms/vc-dynamic-property/vc-dynamic-property.vue.d.ts.map +1 -1
  59. package/dist/ui/components/organisms/vc-gallery/vc-gallery.stories.d.ts +6 -6
  60. package/dist/ui/components/organisms/vc-login-form/index.d.ts +1 -72
  61. package/dist/ui/components/organisms/vc-login-form/index.d.ts.map +1 -1
  62. package/dist/ui/components/organisms/vc-login-form/vc-login-form.vue.d.ts +4 -2
  63. package/dist/ui/components/organisms/vc-login-form/vc-login-form.vue.d.ts.map +1 -1
  64. package/dist/ui/components/organisms/vc-table/_internal/vc-table-column-switcher/vc-table-column-switcher.vue.d.ts +3 -0
  65. package/dist/ui/components/organisms/vc-table/_internal/vc-table-column-switcher/vc-table-column-switcher.vue.d.ts.map +1 -1
  66. package/dist/ui/components/organisms/vc-table/_internal/vc-table-filter/vc-table-filter.vue.d.ts.map +1 -1
  67. package/dist/ui/components/organisms/vc-table/vc-table.vue.d.ts.map +1 -1
  68. package/package.json +5 -4
  69. package/shared/modules/dynamic/components/FIELD_MAP.ts +2 -0
  70. package/shared/modules/dynamic/components/factories.ts +10 -0
  71. package/shared/modules/dynamic/components/fields/InputCurrency.ts +4 -1
  72. package/shared/modules/dynamic/components/fields/RadioButtonGroup.ts +82 -0
  73. package/shared/modules/dynamic/components/fields/storybook/Checkbox.stories.ts +1 -1
  74. package/shared/modules/dynamic/components/fields/storybook/RadioButtonGroup.stories.ts +224 -0
  75. package/shared/modules/dynamic/composables/useFilterBuilder/index.ts +202 -33
  76. package/shared/modules/dynamic/factories/types/index.ts +1 -1
  77. package/shared/modules/dynamic/pages/dynamic-blade-form.vue +3 -3
  78. package/shared/modules/dynamic/pages/dynamic-blade-list.vue +1 -1
  79. package/shared/modules/dynamic/types/index.ts +72 -3
  80. package/shared/modules/dynamic/types/models.ts +5 -0
  81. package/ui/components/atoms/index.ts +0 -1
  82. package/ui/components/atoms/vc-label/vc-label.vue +1 -1
  83. package/ui/components/molecules/index.ts +2 -0
  84. package/ui/components/{atoms → molecules}/vc-checkbox/vc-checkbox.stories.ts +3 -3
  85. package/ui/components/molecules/vc-checkbox/vc-checkbox.vue +204 -0
  86. package/ui/components/molecules/vc-file-upload/vc-file-upload.vue +1 -1
  87. package/ui/components/molecules/vc-input/vc-input.vue +122 -33
  88. package/ui/components/molecules/vc-radio-button/index.ts +1 -0
  89. package/ui/components/molecules/vc-radio-button/vc-radio-button.stories.ts +97 -0
  90. package/ui/components/molecules/vc-radio-button/vc-radio-button.vue +197 -0
  91. package/ui/components/molecules/vc-select/vc-select.vue +1 -1
  92. package/ui/components/organisms/vc-blade/_internal/vc-blade-header/vc-blade-header.vue +42 -0
  93. package/ui/components/organisms/vc-blade/vc-blade.vue +4 -2
  94. package/ui/components/organisms/vc-dynamic-property/vc-dynamic-property.vue +4 -4
  95. package/ui/components/organisms/vc-login-form/index.ts +1 -10
  96. package/ui/components/organisms/vc-login-form/vc-login-form.vue +20 -0
  97. package/ui/components/organisms/vc-table/_internal/vc-table-column-switcher/vc-table-column-switcher.vue +8 -0
  98. package/ui/components/organisms/vc-table/_internal/vc-table-filter/vc-table-filter.vue +16 -22
  99. package/ui/components/organisms/vc-table/vc-table.vue +23 -3
  100. package/dist/ui/components/atoms/vc-checkbox/vc-checkbox.stories.d.ts.map +0 -1
  101. package/dist/ui/components/atoms/vc-checkbox/vc-checkbox.vue.d.ts.map +0 -1
  102. package/ui/components/atoms/vc-checkbox/vc-checkbox.vue +0 -146
  103. /package/dist/ui/components/{atoms → molecules}/vc-checkbox/vc-checkbox.vue.d.ts +0 -0
  104. /package/ui/components/{atoms → molecules}/vc-checkbox/index.ts +0 -0
@@ -1,7 +1,6 @@
1
1
  export * from "./vc-badge";
2
2
  export * from "./vc-button";
3
3
  export * from "./vc-card";
4
- export * from "./vc-checkbox";
5
4
  export * from "./vc-col";
6
5
  export * from "./vc-container";
7
6
  export * from "./vc-hint";
@@ -27,7 +27,7 @@
27
27
  v-if="tooltipVisible"
28
28
  ref="tooltipRef"
29
29
  :style="floatingStyles"
30
- class="tw-absolute tw-z-10 tw-bg-white tw-border tw-border-solid tw-border-[color:#eef0f2] tw-shadow-[1px_1px_8px_rgba(126,142,157,0.25)] tw-rounded-[3px] tw-text-[color:#8e9daa] tw-font-normal tw-py-1 tw-px-2 tw-ml-4"
30
+ class="tw-absolute tw-z-[101] tw-bg-white tw-border tw-border-solid tw-border-[color:#eef0f2] tw-shadow-[1px_1px_8px_rgba(126,142,157,0.25)] tw-rounded-[3px] tw-text-[color:#8e9daa] tw-font-normal tw-py-1 tw-px-2 tw-ml-4"
31
31
  >
32
32
  <slot name="tooltip"></slot>
33
33
  </span>
@@ -12,3 +12,5 @@ export * from "./vc-slider";
12
12
  export * from "./vc-textarea";
13
13
  export * from "./vc-multivalue";
14
14
  export * from "./vc-field";
15
+ export * from "./vc-radio-button";
16
+ export * from "./vc-checkbox";
@@ -1,9 +1,9 @@
1
1
  import type { Meta, StoryFn } from "@storybook/vue3";
2
2
  import { VcCheckbox } from "./";
3
- import { VcLabel } from "../vc-label";
3
+ import { VcLabel } from "../../atoms/vc-label";
4
4
 
5
5
  export default {
6
- title: "atoms/VcCheckbox",
6
+ title: "molecules/VcCheckbox",
7
7
  component: VcCheckbox,
8
8
  args: {
9
9
  modelValue: true,
@@ -66,7 +66,7 @@ export const Required = Template.bind({});
66
66
  Required.args = { required: true };
67
67
 
68
68
  export const Error = Template.bind({});
69
- Error.args = { errorMessage: "This is an error message" };
69
+ Error.args = { errorMessage: "This is an error message", modelValue: false };
70
70
 
71
71
  export const Tooltip = Template.bind({});
72
72
  Tooltip.args = { tooltip: "This is a tooltip" };
@@ -0,0 +1,204 @@
1
+ <template>
2
+ <div
3
+ class="vc-checkbox"
4
+ :class="{ 'vc-checkbox_disabled': disabled }"
5
+ >
6
+ <!-- Input label -->
7
+ <VcLabel
8
+ v-if="label"
9
+ class="tw-mb-2"
10
+ :required="required"
11
+ >
12
+ <span>{{ label }}</span>
13
+ <template
14
+ v-if="tooltip"
15
+ #tooltip
16
+ >{{ tooltip }}</template
17
+ >
18
+ </VcLabel>
19
+ <label class="tw-inline-flex tw-select-none tw-cursor-pointer tw-text-base tw-items-center">
20
+ <input
21
+ v-model="value"
22
+ type="checkbox"
23
+ class="vc-checkbox__input"
24
+ :disabled="disabled"
25
+ :true-value="trueValue"
26
+ :false-value="falseValue"
27
+ :class="{
28
+ 'vc-checkbox_error': errorMessage,
29
+ }"
30
+ />
31
+ <span
32
+ v-if="$slots['default']"
33
+ class="tw-ml-2"
34
+ >
35
+ <slot></slot>
36
+ </span>
37
+ <span
38
+ v-if="!label && required"
39
+ class="tw-text-[color:var(--checkbox-required-color)] tw-ml-1"
40
+ >*</span
41
+ >
42
+ </label>
43
+
44
+ <slot
45
+ v-if="errorMessage"
46
+ name="error"
47
+ >
48
+ <VcHint class="vc-checkbox__error tw-mt-1">
49
+ {{ errorMessage }}
50
+ </VcHint>
51
+ </slot>
52
+ </div>
53
+ </template>
54
+ <!-- eslint-disable @typescript-eslint/no-explicit-any -->
55
+ <script lang="ts" setup>
56
+ import { MaybeRef, computed, unref } from "vue";
57
+ import { VcHint } from "./../../atoms/vc-hint";
58
+ import { VcLabel } from "../../atoms/vc-label";
59
+ export interface Props {
60
+ modelValue: MaybeRef<boolean>;
61
+ disabled?: boolean;
62
+ required?: boolean;
63
+ name?: string;
64
+ errorMessage?: string;
65
+ trueValue?: boolean;
66
+ falseValue?: boolean;
67
+ label?: string;
68
+ tooltip?: string;
69
+ }
70
+
71
+ export interface Emits {
72
+ (event: "update:modelValue", value: boolean): void;
73
+ }
74
+
75
+ const props = withDefaults(defineProps<Props>(), { name: "Field", trueValue: true, falseValue: false });
76
+ const emit = defineEmits<Emits>();
77
+
78
+ defineSlots<{
79
+ default: (props: any) => any;
80
+ error: (props: any) => any;
81
+ }>();
82
+
83
+ const value = computed({
84
+ get() {
85
+ return unref(props.modelValue);
86
+ },
87
+ set(newValue) {
88
+ emit("update:modelValue", newValue);
89
+ },
90
+ });
91
+ </script>
92
+
93
+ <style lang="scss">
94
+ :root {
95
+ --checkbox-size: 14px;
96
+ --checkbox-border-radius: 2px;
97
+ --checkbox-background-color: #ffffff;
98
+ --checkbox-color-error: #f14e4e;
99
+ --checkbox-required-color: #f14e4e;
100
+
101
+ --checkbox-active: #43b0e6;
102
+ --checkbox-active-inner: #fff;
103
+ --checkbox-focus: 2px rgba(39, 94, 254, 0.3);
104
+ --checkbox-border: #bbc1e1;
105
+ --checkbox-border-hover: #43b0e6;
106
+ --checkbox-background: #fff;
107
+ --checkbox-disabled: #f6f8ff;
108
+ --checkbox-disabled-inner: #e1e6f9;
109
+ --checkbox-error: #f14e4e;
110
+ }
111
+
112
+ .vc-checkbox {
113
+ input[type="checkbox"] {
114
+ border-radius: 2px;
115
+ appearance: none;
116
+ height: var(--checkbox-size);
117
+ outline: none;
118
+ display: inline-block;
119
+ vertical-align: top;
120
+ position: relative;
121
+ margin: 0;
122
+ cursor: pointer;
123
+ border: 1px solid var(--checkbox-border-color, var(--checkbox-border));
124
+ background: var(--checkbox-bg, var(--checkbox-background));
125
+ width: var(--checkbox-size);
126
+ border-radius: 3px;
127
+ transition:
128
+ background 0.3s,
129
+ border-color 0.3s,
130
+ box-shadow 0.2s;
131
+
132
+ &:checked {
133
+ --checkbox-bg: var(--checkbox-active);
134
+ --checkbox-border-color: var(--checkbox-active);
135
+ --checkbox-after-opacity-duration: 0.3s;
136
+ --checkbox-after-transform-duration: 0.6s;
137
+ --checkbox-after-transform-ease: cubic-bezier(0.2, 0.85, 0.32, 1.2);
138
+ --checkbox-scale: 0.5;
139
+ --checkbox-after-opacity: 1;
140
+ --r: 43deg;
141
+ }
142
+
143
+ &:disabled {
144
+ --checkbox-bg: var(--checkbox-disabled);
145
+ cursor: not-allowed;
146
+ opacity: 0.9;
147
+ &:checked {
148
+ --checkbox-bg: var(--checkbox-disabled-inner);
149
+ --checkbox-border-color: var(--checkbox-border);
150
+ }
151
+ & + label {
152
+ cursor: not-allowed;
153
+ }
154
+ }
155
+
156
+ &:hover {
157
+ &:not(:checked) {
158
+ &:not(:disabled) {
159
+ --checkbox-border-color: var(--checkbox-border-hover);
160
+ }
161
+ }
162
+ }
163
+
164
+ &:after {
165
+ content: "";
166
+ display: block;
167
+ position: absolute;
168
+ width: 5px;
169
+ height: 9px;
170
+ border: 2px solid var(--checkbox-background);
171
+ border-top: 0;
172
+ border-left: 0;
173
+ left: 4px;
174
+ top: 1px;
175
+ transform: rotate(var(--r, 20deg));
176
+ opacity: var(--checkbox-after-opacity, 0);
177
+ transition:
178
+ transform var(--checkbox-after-transform-duration, 0.3s) var(--checkbox-after-transform-ease, ease),
179
+ opacity var(--checkbox-after-opacity-duration, 0.2s);
180
+ }
181
+
182
+ & + label {
183
+ font-size: 14px;
184
+ line-height: 21px;
185
+ display: inline-flex;
186
+ align-items: center;
187
+ cursor: pointer;
188
+ margin-left: 4px;
189
+ }
190
+
191
+ &.vc-checkbox_error {
192
+ --checkbox-border-color: var(--checkbox-error);
193
+ }
194
+ }
195
+
196
+ &_disabled &__label {
197
+ cursor: auto;
198
+ }
199
+
200
+ &__error {
201
+ --hint-color: var(--checkbox-error);
202
+ }
203
+ }
204
+ </style>
@@ -74,7 +74,7 @@ export interface Emits {
74
74
 
75
75
  const props = withDefaults(defineProps<Props>(), {
76
76
  variant: "gallery",
77
- accept: ".jpg, .png, .jpeg, .webp, .heic",
77
+ accept: ".jpg, .png, .jpeg, .webp, .heic, .svg",
78
78
  name: "Gallery",
79
79
  icon: "fas fa-cloud-upload-alt",
80
80
  });
@@ -58,19 +58,55 @@
58
58
  :emit-value="emitValue"
59
59
  :placeholder="placeholder"
60
60
  >
61
- <input
62
- ref="inputRef"
63
- v-model="handleValue"
64
- :placeholder="placeholder"
65
- :type="internalTypeComputed"
66
- :disabled="disabled"
67
- :name="name"
68
- :maxlength="maxlength"
69
- :autofocus="autofocus"
70
- :max="maxDate"
71
- class="vc-input__input"
72
- @keydown="onKeyDown"
73
- />
61
+ <template v-if="type === 'datetime-local' || type === 'date'">
62
+ <VueDatePicker
63
+ v-model="handleValue"
64
+ :placeholder="
65
+ placeholder || type === 'datetime-local'
66
+ ? $t('COMPONENTS.MOLECULES.VC_INPUT.DATE_TIME_PLACEHOLDER')
67
+ : $t('COMPONENTS.MOLECULES.VC_INPUT.DATE_PLACEHOLDER')
68
+ "
69
+ :disabled="disabled"
70
+ :name="name"
71
+ :maxlength="maxlength"
72
+ :autofocus="autofocus"
73
+ :max-date="maxDate"
74
+ time-picker-inline
75
+ :enable-time-picker="type === 'datetime-local'"
76
+ :format="formatDateWithLocale"
77
+ :locale="locale"
78
+ :start-time="{
79
+ hours: 0,
80
+ minutes: 0,
81
+ }"
82
+ :clearable="false"
83
+ :config="{
84
+ closeOnAutoApply: false,
85
+ }"
86
+ auto-apply
87
+ :teleport-center="$isMobile.value"
88
+ :is24="isBrowserLocale24h"
89
+ v-bind="datePickerOptions"
90
+ :teleport="$isDesktop.value ? 'body' : undefined"
91
+ class="vc-input__input"
92
+ @keydown="onKeyDown"
93
+ ></VueDatePicker>
94
+ </template>
95
+ <template v-else>
96
+ <input
97
+ ref="inputRef"
98
+ v-model="handleValue"
99
+ :placeholder="placeholder"
100
+ :type="internalTypeComputed"
101
+ :disabled="disabled"
102
+ :name="name"
103
+ :maxlength="maxlength"
104
+ :autofocus="autofocus"
105
+ :max="maxDate"
106
+ class="vc-input__input"
107
+ @keydown="onKeyDown"
108
+ />
109
+ </template>
74
110
  </slot>
75
111
  <div
76
112
  v-if="suffix"
@@ -173,6 +209,10 @@
173
209
  import { computed, ref, unref, watch } from "vue";
174
210
  import { VcLabel, VcIcon, VcHint } from "./../../";
175
211
  import moment from "moment";
212
+ import VueDatePicker, { VueDatePickerProps } from "@vuepic/vue-datepicker";
213
+ import "@vuepic/vue-datepicker/dist/main.css";
214
+ import * as Locales from "date-fns/locale";
215
+ import { Locale } from "date-fns";
176
216
 
177
217
  export interface Props {
178
218
  /**
@@ -262,6 +302,14 @@ export interface Props {
262
302
  * Input current language
263
303
  */
264
304
  currentLanguage?: string;
305
+ /**
306
+ * VueDatePicker options
307
+ *
308
+ * Used only when type is 'date' or 'datetime-local'
309
+ *
310
+ * @see https://vue3datepicker.com/
311
+ */
312
+ datePickerOptions?: VueDatePickerProps;
265
313
  }
266
314
 
267
315
  export interface Emits {
@@ -338,7 +386,7 @@ let emitTimer: NodeJS.Timeout;
338
386
  let emitValueFn;
339
387
  const temp = ref();
340
388
  const inputRef = ref();
341
-
389
+ const locale = window.navigator.language;
342
390
  const internalType = ref(unref(props.type));
343
391
 
344
392
  const internalTypeComputed = computed({
@@ -370,13 +418,7 @@ const mutatedModel = ref();
370
418
  watch(
371
419
  rawModel,
372
420
  (newVal) => {
373
- if (props.type === "datetime-local" || props.type === "date") {
374
- if (newVal instanceof Date && !isNaN(newVal.valueOf())) {
375
- mutatedModel.value = moment(newVal).format(props.type === "datetime-local" ? "YYYY-MM-DDTHH:mm" : "YYYY-MM-DD");
376
- } else if (typeof newVal === "string") {
377
- mutatedModel.value = new Date(newVal).toISOString().slice(0, props.type === "datetime-local" ? 16 : 10);
378
- }
379
- } else if (props.type === "number" && newVal !== null) {
421
+ if (props.type === "number" && newVal !== null) {
380
422
  mutatedModel.value = parseFloat(newVal as string);
381
423
  } else if (props.type === "integer" && newVal !== null) {
382
424
  mutatedModel.value = Math.trunc(newVal as number);
@@ -391,6 +433,27 @@ watch(
391
433
  { immediate: true },
392
434
  );
393
435
 
436
+ const isBrowserLocale24h = (() => {
437
+ const hr = new Intl.DateTimeFormat(locale, { hour: "numeric" }).format();
438
+ return Number.isInteger(Number(hr));
439
+ })();
440
+
441
+ const formatDateWithLocale: (date: Date) => string = (date) => {
442
+ const options: Intl.DateTimeFormatOptions = {
443
+ year: "numeric",
444
+ month: "numeric",
445
+ day: "numeric",
446
+ };
447
+
448
+ if (props.type === "datetime-local") {
449
+ options.hour = "numeric";
450
+ options.minute = "numeric";
451
+ options.hour12 = !isBrowserLocale24h;
452
+ }
453
+
454
+ return new Intl.DateTimeFormat(locale, options).format(date);
455
+ };
456
+
394
457
  function onKeyDown(e: KeyboardEvent) {
395
458
  const allowedKeys = ["Backspace", "Delete", "ArrowUp", "ArrowDown", "ArrowLeft", "ArrowRight"];
396
459
  const keypressed = e.key;
@@ -411,9 +474,7 @@ function emitValue(val: string | number | Date | null) {
411
474
  emitValueFn = () => {
412
475
  if (mutatedModel.value !== val) {
413
476
  let value;
414
- if (internalTypeComputed.value === "datetime-local" || internalTypeComputed.value === "date") {
415
- value = val ? moment(val).toDate() : undefined;
416
- } else if (props.type === "number" && val !== null) {
477
+ if (props.type === "number" && val !== null) {
417
478
  value = parseFloat(val as string);
418
479
  } else if (props.type === "integer" && val !== null) {
419
480
  value = Math.trunc(parseInt(val as string));
@@ -451,6 +512,10 @@ function onReset() {
451
512
  --input-placeholder-color: #a5a5a5;
452
513
  --input-clear-color: #43b0e6;
453
514
  --input-clear-color-hover: #319ed4;
515
+ --dp-input-padding: 10px 0px 10px 10px;
516
+ --dp-input-icon-padding: 25px;
517
+ --dp-font-size: 13px;
518
+ --dp-font-family: "Roboto", sans-serif;
454
519
  }
455
520
 
456
521
  .vc-input {
@@ -531,20 +596,44 @@ function onReset() {
531
596
  &_disabled &__field {
532
597
  @apply tw-bg-[#fafafa] tw-text-[#424242];
533
598
  }
599
+
600
+ .slide-up-enter-active,
601
+ .slide-up-leave-active {
602
+ transition: all 0.25s ease-out;
603
+ }
604
+
605
+ .slide-up-enter-from {
606
+ opacity: 0;
607
+ transform: translateY(5px);
608
+ }
609
+
610
+ .slide-up-leave-to {
611
+ opacity: 0;
612
+ transform: translateY(-5px);
613
+ }
614
+ }
615
+
616
+ .dp__pm_am_button {
617
+ background: var(--dp-primary-color) !important;
618
+ color: var(--dp-primary-text-color) !important;
619
+ border: none !important;
620
+ padding: var(--dp-common-padding) !important;
621
+ border-radius: var(--dp-border-radius) !important;
622
+ cursor: pointer !important;
534
623
  }
535
624
 
536
- .slide-up-enter-active,
537
- .slide-up-leave-active {
538
- transition: all 0.25s ease-out;
625
+ .dp__input_icons {
626
+ padding: 6px 0 !important;
539
627
  }
540
628
 
541
- .slide-up-enter-from {
542
- opacity: 0;
543
- transform: translateY(5px);
629
+ .dp__input {
630
+ &::-ms-reveal,
631
+ &::-ms-clear {
632
+ @apply tw-hidden;
633
+ }
544
634
  }
545
635
 
546
- .slide-up-leave-to {
547
- opacity: 0;
548
- transform: translateY(-5px);
636
+ input.dp__input::placeholder {
637
+ color: #818181 !important;
549
638
  }
550
639
  </style>
@@ -0,0 +1 @@
1
+ export { default as VcRadioButton } from "./vc-radio-button.vue";
@@ -0,0 +1,97 @@
1
+ import type { Meta, StoryFn } from "@storybook/vue3";
2
+ import { VcRadioButton } from "./";
3
+ import { ref } from "vue";
4
+
5
+ export default {
6
+ title: "molecules/VcRadioButton",
7
+ component: VcRadioButton,
8
+ args: {
9
+ modelValue: "Product 1",
10
+ label: "Product 1",
11
+ value: "Product 1",
12
+ },
13
+ argTypes: {
14
+ modelValue: {
15
+ control: "text",
16
+ table: {
17
+ type: {
18
+ summary: "any",
19
+ },
20
+ },
21
+ },
22
+ value: {
23
+ control: "text",
24
+ table: {
25
+ type: {
26
+ summary: "any",
27
+ },
28
+ },
29
+ },
30
+ binary: {
31
+ control: "boolean",
32
+ },
33
+ disabled: {
34
+ control: "boolean",
35
+ },
36
+ name: {
37
+ control: "text",
38
+ },
39
+ error: {
40
+ control: "boolean",
41
+ },
42
+ errorMessage: {
43
+ control: "text",
44
+ },
45
+ label: {
46
+ control: "text",
47
+ },
48
+ },
49
+ } satisfies Meta<typeof VcRadioButton>;
50
+
51
+ export const Template: StoryFn<typeof VcRadioButton> = (args) => ({
52
+ components: { VcRadioButton },
53
+ setup() {
54
+ return { args };
55
+ },
56
+ template: '<vc-radio-button v-bind="args">{{args.default}}</vc-radio-button>',
57
+ });
58
+
59
+ export const Group: StoryFn<typeof VcRadioButton> = (args) => ({
60
+ components: { VcRadioButton },
61
+ setup() {
62
+ const products = ref([
63
+ { id: 1, name: "Product 1" },
64
+ { id: 2, name: "Product 2" },
65
+ { id: 3, name: "Product 3" },
66
+ ]);
67
+ const selectedProduct = ref("Product 1");
68
+ return { args, products, selectedProduct };
69
+ },
70
+ template: `
71
+ <div v-for="product in products" :key="product.id" class="tw-pb-1">
72
+ <vc-radio-button v-model="selectedProduct" :value="product.name" :label="product.name" />
73
+ </div>`,
74
+ });
75
+
76
+ export const StringGroup: StoryFn<typeof VcRadioButton> = (args) => ({
77
+ components: { VcRadioButton },
78
+ setup() {
79
+ const products = ref(["Product 1", "Product 2", "Product 3"]);
80
+ const selectedProduct = ref("Product 1");
81
+
82
+ return { args, products, selectedProduct };
83
+ },
84
+ template: `
85
+ <div v-for="product in products" :key="product" class="tw-pb-1">
86
+ <vc-radio-button v-model="selectedProduct" :value="product" :label="product" />
87
+ </div>`,
88
+ });
89
+
90
+ export const Disabled = Template.bind({});
91
+ Disabled.args = { disabled: true };
92
+
93
+ export const Error = Template.bind({});
94
+ Error.args = { errorMessage: "This is an error message", error: true, modelValue: null };
95
+
96
+ export const Label = Template.bind({});
97
+ Label.args = { label: "Radio button label" };