windly-ui 1.0.1 → 1.0.3

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 (123) hide show
  1. package/dist/module.d.mts +3 -0
  2. package/dist/module.json +8 -0
  3. package/dist/module.mjs +26 -0
  4. package/dist/runtime/components/Accordion.d.vue.ts +39 -0
  5. package/{ui-library → dist/runtime}/components/Accordion.vue +44 -70
  6. package/dist/runtime/components/Accordion.vue.d.ts +39 -0
  7. package/dist/runtime/components/Avatar.d.vue.ts +141 -0
  8. package/dist/runtime/components/Avatar.vue +72 -0
  9. package/dist/runtime/components/Avatar.vue.d.ts +141 -0
  10. package/dist/runtime/components/Badge.d.vue.ts +133 -0
  11. package/dist/runtime/components/Badge.vue +99 -0
  12. package/dist/runtime/components/Badge.vue.d.ts +133 -0
  13. package/dist/runtime/components/Breadcrumbs.d.vue.ts +83 -0
  14. package/{ui-library → dist/runtime}/components/Breadcrumbs.vue +37 -59
  15. package/dist/runtime/components/Breadcrumbs.vue.d.ts +83 -0
  16. package/dist/runtime/components/Button.d.vue.ts +199 -0
  17. package/dist/runtime/components/Button.vue +125 -0
  18. package/dist/runtime/components/Button.vue.d.ts +199 -0
  19. package/dist/runtime/components/Card.d.vue.ts +83 -0
  20. package/{ui-library → dist/runtime}/components/Card.vue +26 -39
  21. package/dist/runtime/components/Card.vue.d.ts +83 -0
  22. package/dist/runtime/components/Checkbox.d.vue.ts +190 -0
  23. package/{ui-library → dist/runtime}/components/Checkbox.vue +45 -68
  24. package/dist/runtime/components/Checkbox.vue.d.ts +190 -0
  25. package/dist/runtime/components/CodeBlock.d.vue.ts +16 -0
  26. package/dist/runtime/components/CodeBlock.vue +75 -0
  27. package/dist/runtime/components/CodeBlock.vue.d.ts +16 -0
  28. package/dist/runtime/components/ColorPicker.d.vue.ts +91 -0
  29. package/dist/runtime/components/ColorPicker.vue +244 -0
  30. package/dist/runtime/components/ColorPicker.vue.d.ts +91 -0
  31. package/dist/runtime/components/Date.d.vue.ts +137 -0
  32. package/dist/runtime/components/Date.vue +201 -0
  33. package/dist/runtime/components/Date.vue.d.ts +137 -0
  34. package/dist/runtime/components/Dialog.d.vue.ts +103 -0
  35. package/{ui-library → dist/runtime}/components/Dialog.vue +30 -65
  36. package/dist/runtime/components/Dialog.vue.d.ts +103 -0
  37. package/dist/runtime/components/Divider.d.vue.ts +51 -0
  38. package/dist/runtime/components/Divider.vue +52 -0
  39. package/dist/runtime/components/Divider.vue.d.ts +51 -0
  40. package/dist/runtime/components/Drawer.d.vue.ts +30 -0
  41. package/dist/runtime/components/Drawer.vue +43 -0
  42. package/dist/runtime/components/Drawer.vue.d.ts +30 -0
  43. package/dist/runtime/components/Dropdown.d.vue.ts +34 -0
  44. package/dist/runtime/components/Dropdown.vue +127 -0
  45. package/dist/runtime/components/Dropdown.vue.d.ts +34 -0
  46. package/dist/runtime/components/FileUploader.d.vue.ts +58 -0
  47. package/dist/runtime/components/FileUploader.vue +202 -0
  48. package/dist/runtime/components/FileUploader.vue.d.ts +58 -0
  49. package/dist/runtime/components/Icon.d.vue.ts +41 -0
  50. package/dist/runtime/components/Icon.vue +66 -0
  51. package/dist/runtime/components/Icon.vue.d.ts +41 -0
  52. package/dist/runtime/components/Image.d.vue.ts +77 -0
  53. package/dist/runtime/components/Image.vue +61 -0
  54. package/dist/runtime/components/Image.vue.d.ts +77 -0
  55. package/dist/runtime/components/Input.d.vue.ts +66 -0
  56. package/dist/runtime/components/Input.vue +233 -0
  57. package/dist/runtime/components/Input.vue.d.ts +66 -0
  58. package/dist/runtime/components/Radio.d.vue.ts +41 -0
  59. package/dist/runtime/components/Radio.vue +222 -0
  60. package/dist/runtime/components/Radio.vue.d.ts +41 -0
  61. package/dist/runtime/components/ScrollArea.d.vue.ts +79 -0
  62. package/dist/runtime/components/ScrollArea.vue +36 -0
  63. package/dist/runtime/components/ScrollArea.vue.d.ts +79 -0
  64. package/dist/runtime/components/Select.d.vue.ts +43 -0
  65. package/dist/runtime/components/Select.vue +200 -0
  66. package/dist/runtime/components/Select.vue.d.ts +43 -0
  67. package/dist/runtime/components/Stepper.d.vue.ts +46 -0
  68. package/dist/runtime/components/Stepper.vue +218 -0
  69. package/dist/runtime/components/Stepper.vue.d.ts +46 -0
  70. package/dist/runtime/components/TabPanel.d.vue.ts +17 -0
  71. package/dist/runtime/components/TabPanel.vue +21 -0
  72. package/dist/runtime/components/TabPanel.vue.d.ts +17 -0
  73. package/dist/runtime/components/Table.d.vue.ts +40 -0
  74. package/dist/runtime/components/Table.vue +92 -0
  75. package/dist/runtime/components/Table.vue.d.ts +40 -0
  76. package/dist/runtime/components/Tabs.d.vue.ts +20 -0
  77. package/dist/runtime/components/Tabs.vue +62 -0
  78. package/dist/runtime/components/Tabs.vue.d.ts +20 -0
  79. package/dist/runtime/components/Textarea.d.vue.ts +208 -0
  80. package/dist/runtime/components/Textarea.vue +185 -0
  81. package/dist/runtime/components/Textarea.vue.d.ts +208 -0
  82. package/dist/runtime/components/Toggle.d.vue.ts +36 -0
  83. package/dist/runtime/components/Toggle.vue +173 -0
  84. package/dist/runtime/components/Toggle.vue.d.ts +36 -0
  85. package/dist/runtime/components/Tooltip.d.vue.ts +63 -0
  86. package/dist/runtime/components/Tooltip.vue +144 -0
  87. package/dist/runtime/components/Tooltip.vue.d.ts +63 -0
  88. package/dist/runtime/components/uiProps.d.ts +38 -0
  89. package/{ui-library/components/uiProps.ts → dist/runtime/components/uiProps.js} +2 -2
  90. package/dist/runtime/components/useUiClasses.d.ts +43 -0
  91. package/{ui-library/components/useUiClasses.ts → dist/runtime/components/useUiClasses.js} +25 -60
  92. package/dist/runtime/composables/plugin.d.ts +2 -0
  93. package/dist/runtime/composables/plugin.js +3 -0
  94. package/dist/runtime/tailwind-color.d.ts +2 -0
  95. package/dist/runtime/tailwind-color.js +5859 -0
  96. package/dist/types.d.mts +7 -0
  97. package/package.json +14 -16
  98. package/README.md +0 -208
  99. package/ui-library/components/Avatar.vue +0 -121
  100. package/ui-library/components/Badge.vue +0 -116
  101. package/ui-library/components/Button.vue +0 -154
  102. package/ui-library/components/CodeBlock.vue +0 -99
  103. package/ui-library/components/ColorPicker.vue +0 -302
  104. package/ui-library/components/Date.vue +0 -240
  105. package/ui-library/components/Divider.vue +0 -78
  106. package/ui-library/components/Drawer.vue +0 -67
  107. package/ui-library/components/Dropdown.vue +0 -248
  108. package/ui-library/components/FileUploader.vue +0 -330
  109. package/ui-library/components/Icon.vue +0 -82
  110. package/ui-library/components/Image.vue +0 -78
  111. package/ui-library/components/Input.vue +0 -531
  112. package/ui-library/components/Radio.vue +0 -356
  113. package/ui-library/components/ScrollArea.vue +0 -43
  114. package/ui-library/components/Select.vue +0 -309
  115. package/ui-library/components/Stepper.vue +0 -361
  116. package/ui-library/components/TabPanel.vue +0 -25
  117. package/ui-library/components/Table.vue +0 -152
  118. package/ui-library/components/Tabs.vue +0 -71
  119. package/ui-library/components/Textarea.vue +0 -233
  120. package/ui-library/components/Toggle.vue +0 -319
  121. package/ui-library/components/Tooltip.vue +0 -200
  122. package/ui-library/components/plugin.ts +0 -8
  123. package/ui-library/module.ts +0 -20
@@ -1,78 +0,0 @@
1
- <script setup lang="ts">
2
- defineOptions({
3
- inheritAttrs: false,
4
- })
5
-
6
- import { computed, ref } from 'vue'
7
-
8
- const props = defineProps({
9
- src: { type: String, required: true },
10
-
11
- alt: { type: String, default: '' },
12
-
13
- placeholder: {
14
- type: String,
15
- default: '/images/placeholder.png'
16
- },
17
-
18
- width: { type: String, default: '100%' },
19
- height: { type: String, default: 'auto' },
20
-
21
- fit: {
22
- type: String,
23
- default: 'cover',
24
- },
25
-
26
- borderColor: {
27
- type: String,
28
- default: '',
29
- },
30
-
31
- borderType: {
32
- type: String,
33
- default: 'none',
34
- },
35
- })
36
-
37
- const imageSrc = ref(props.src)
38
-
39
- const isHex = (val: string) => val.startsWith('#')
40
-
41
- const imageStyle = computed(() => {
42
- const style: Record<string, string> = {
43
- width: props.width,
44
- height: props.height,
45
- objectFit: props.fit,
46
- }
47
-
48
- if (isHex(props.borderColor)) {
49
- style.borderColor = props.borderColor
50
- }
51
-
52
- return style
53
- })
54
-
55
- const imageClass = computed(() => [
56
- props.borderType !== 'none' ? 'border' : '',
57
- props.borderType === 'dashed' ? 'border-dashed' : '',
58
- props.borderType === 'dotted' ? 'border-dotted' : '',
59
- !isHex(props.borderColor)
60
- ? `border-${props.borderColor}`
61
- : '',
62
- ])
63
-
64
- function onError() {
65
- imageSrc.value = props.placeholder
66
- }
67
- </script>
68
-
69
- <template>
70
- <img
71
- :src="imageSrc"
72
- :alt="alt"
73
- :class="imageClass"
74
- :style="imageStyle"
75
- @error="onError"
76
- v-bind="$attrs"
77
- >
78
- </template>
@@ -1,531 +0,0 @@
1
- <script setup lang="ts">
2
- import { computed, ref } from "vue";
3
-
4
- type SupportedInputType =
5
- | 'text'
6
- | 'email'
7
- | 'password'
8
- | 'number'
9
- | 'tel'
10
- | 'url'
11
- | 'search'
12
- | 'date'
13
- | 'datetime-local'
14
- | 'month'
15
- | 'week'
16
- | 'time';
17
-
18
- type ValidationRule =
19
- | "alphabets"
20
- | "numbers"
21
- | "spaces"
22
- | "name"
23
- | "punctuation"
24
- | "integer"
25
- | "positive"
26
- | "negative"
27
- | "decimal"
28
- | "scientific"
29
- | "uppercase"
30
- | "lowercase";
31
-
32
- type ValidateOn = "input" | "blur";
33
-
34
- const props = withDefaults(
35
- defineProps<{
36
- modelValue: string | number;
37
-
38
- label: string;
39
- hint?: string;
40
- placeholder?: string;
41
-
42
- case?: "upper" | "lower" | "capitalize" | "normal" | null;
43
-
44
- size?: string;
45
- color?: string;
46
- rounded?: string;
47
- dense?: boolean;
48
-
49
- outlined?: boolean;
50
- borderless?: boolean;
51
- flat?: boolean;
52
-
53
- type?: SupportedInputType;
54
-
55
- allow?: ValidationRule[];
56
- deny?: ValidationRule[];
57
-
58
- supportedValues?: Array<string | number>;
59
- unsupportedValues?: Array<string | number>;
60
-
61
- required?: boolean;
62
-
63
- regex?: string | RegExp;
64
-
65
- minLength?: number;
66
- maxLength?: number;
67
-
68
- disabled?: boolean;
69
- readonly?: boolean;
70
- autocomplete?: string;
71
-
72
- validateOn?: ValidateOn;
73
- }>(),
74
- {
75
- modelValue: "",
76
-
77
- hint: "",
78
- placeholder: "",
79
-
80
- case: null,
81
-
82
- size: "md",
83
- color: "primary",
84
- rounded: "md",
85
- dense: false,
86
-
87
- outlined: false,
88
- borderless: false,
89
- flat: false,
90
-
91
- type: "text",
92
-
93
- allow: () => [],
94
- deny: () => [],
95
-
96
- supportedValues: () => [],
97
- unsupportedValues: () => [],
98
-
99
- required: false,
100
-
101
- regex: "",
102
-
103
- minLength: undefined,
104
- maxLength: undefined,
105
-
106
- disabled: false,
107
- readonly: false,
108
- autocomplete: "off",
109
-
110
- validateOn: "input",
111
- }
112
- );
113
-
114
- const emit = defineEmits<{
115
- (e: "update:modelValue", value: string): void;
116
- (e: "valid"): void;
117
- (e: "invalid", error: string): void;
118
- }>();
119
-
120
- const validationError = ref("");
121
-
122
- const NATIVE_PATTERNS: Record<string, RegExp> = {
123
- email: /^[^\s@]+@[^\s@]+\.[^\s@]+$/,
124
- url: /^(https?:\/\/)?([\w-]+\.)+[\w-]{2,}(\/\S*)?$/i,
125
- tel: /^\+?[1-9]\d{6,14}$/,
126
- };
127
-
128
- const RULE_PATTERNS: Record<ValidationRule, RegExp> = {
129
- alphabets: /^[A-Za-z]+$/,
130
- numbers: /^[0-9]+$/,
131
- spaces: /\s/,
132
- name: /^[A-Za-z.'-\s]+$/,
133
- punctuation: /[.,!?;:'"()-]/,
134
- integer: /^-?\d+$/,
135
- positive: /^\d+$/,
136
- negative: /^-\d+$/,
137
- decimal: /^-?\d*\.?\d+$/,
138
- scientific: /^-?\d+(\.\d+)?e[-+]?\d+$/i,
139
- uppercase: /^[A-Z]+$/,
140
- lowercase: /^[a-z]+$/,
141
- };
142
-
143
- function validate(value: string): boolean {
144
- validationError.value = "";
145
-
146
- if (props.required && !value.trim()) {
147
- validationError.value = "This field is required.";
148
- return false;
149
- }
150
-
151
- if (
152
- props.minLength !== undefined &&
153
- value.length < props.minLength
154
- ) {
155
- validationError.value =
156
- `Minimum ${props.minLength} characters required.`;
157
- return false;
158
- }
159
-
160
- if (
161
- props.maxLength !== undefined &&
162
- value.length > props.maxLength
163
- ) {
164
- validationError.value =
165
- `Maximum ${props.maxLength} characters allowed.`;
166
- return false;
167
- }
168
-
169
- if (
170
- props.supportedValues.length &&
171
- !props.supportedValues.includes(value)
172
- ) {
173
- validationError.value = "Value is not allowed.";
174
- return false;
175
- }
176
-
177
- if (
178
- props.unsupportedValues.includes(value)
179
- ) {
180
- validationError.value = "Value is not permitted.";
181
- return false;
182
- }
183
-
184
- const nativePattern = NATIVE_PATTERNS[props.type];
185
-
186
- if (
187
- nativePattern &&
188
- value &&
189
- !nativePattern.test(value)
190
- ) {
191
- validationError.value =
192
- `Invalid ${props.type} format.`;
193
- return false;
194
- }
195
-
196
- for (const rule of props.allow) {
197
- const regex = RULE_PATTERNS[rule];
198
-
199
- if (
200
- regex &&
201
- value &&
202
- !regex.test(value)
203
- ) {
204
- validationError.value =
205
- `Failed validation: ${rule}`;
206
- return false;
207
- }
208
- }
209
-
210
- for (const rule of props.deny) {
211
- const regex = RULE_PATTERNS[rule];
212
-
213
- if (
214
- regex &&
215
- regex.test(value)
216
- ) {
217
- validationError.value =
218
- `Contains unsupported value: ${rule}`;
219
- return false;
220
- }
221
- }
222
-
223
- if (props.regex) {
224
- const regex =
225
- props.regex instanceof RegExp
226
- ? props.regex
227
- : new RegExp(props.regex);
228
-
229
- if (!regex.test(value)) {
230
- validationError.value =
231
- "Custom validation failed.";
232
- return false;
233
- }
234
- }
235
-
236
- return true;
237
- }
238
-
239
- function runValidation(value: string) {
240
- const isValid = validate(value);
241
-
242
- if (isValid) {
243
- emit("valid");
244
- } else {
245
- emit("invalid", validationError.value);
246
- }
247
-
248
- return isValid;
249
- }
250
-
251
- function handleInput(event: Event) {
252
- const target = event.target as HTMLInputElement;
253
- let value = target.value;
254
-
255
- if (
256
- props.maxLength !== undefined &&
257
- value.length > props.maxLength
258
- ) {
259
- value = value.slice(0, props.maxLength);
260
- }
261
-
262
- emit("update:modelValue", value);
263
-
264
- if (props.validateOn === "input") {
265
- runValidation(value);
266
- }
267
- }
268
-
269
- function handleBlur(event: Event) {
270
- if (props.validateOn !== "blur") return;
271
-
272
- const target = event.target as HTMLInputElement;
273
-
274
- runValidation(target.value);
275
- }
276
-
277
- const isHex = (val: string) => val.startsWith('#')
278
-
279
- const roundedMap = {
280
- none: "rounded-none",
281
- sm: "rounded-sm",
282
- md: "rounded-md",
283
- lg: "rounded-lg",
284
- xl: "rounded-xl",
285
- full: "rounded-full",
286
- };
287
-
288
- const computedClass = computed(() => {
289
- let classes =
290
- "input block w-full transition-all duration-300";
291
-
292
- // style mode
293
- if (props.borderless) {
294
- classes += " border-none bg-transparent";
295
- } else if (props.outlined) {
296
- classes += " border";
297
- } else {
298
- classes += " border-0 border-b";
299
- }
300
-
301
- // rounded
302
- classes += ` ${
303
- roundedMap[props.rounded as keyof typeof roundedMap] ?? roundedMap.md
304
- }`;
305
-
306
- // flat
307
- if (!props.flat) {
308
- classes += " shadow-sm";
309
- }
310
-
311
- // disabled
312
- if (props.disabled) {
313
- classes += " opacity-50 cursor-not-allowed";
314
- }
315
-
316
- // size
317
- if (props.size === "sm") {
318
- classes += " text-sm";
319
- } else if (props.size === "lg") {
320
- classes += " text-lg";
321
- } else {
322
- classes += " text-base";
323
- }
324
-
325
- if (props.case === "upper") {
326
- classes += " uppercase";
327
- } else if (props.case === "lower") {
328
- classes += " lowercase";
329
- } else if (props.case === "capitalize") {
330
- classes += " capitalize";
331
- }
332
-
333
- // color / error
334
- if (validationError.value) {
335
- classes += " border-red-500";
336
- } else {
337
- classes += ` ${
338
- props.color && !isHex(props.color)
339
- ? `border-${props.color} focus:ring-${props.color} text-${props.color} `
340
- : ""
341
- }`;
342
- }
343
-
344
- if (props.modelValue !== null && props.modelValue !== '' && props.modelValue !== undefined)
345
- classes += " has-value";
346
-
347
- return classes;
348
- });
349
-
350
- const computedStyle = computed(() => {
351
- let styles: Record<string, string> = {};
352
-
353
- if (props.color && isHex(props.color)) {
354
- styles["--tw-ring-color"] = props.color;
355
- styles["border-color"] = props.color;
356
- }
357
-
358
- return styles;
359
- });
360
-
361
- const visibility = ref(false);
362
-
363
- const inputType = computed(() => props.type === "password" ? visibility.value ? "text" : "password" : props.type);
364
-
365
- const inputAttrs = computed(() => {
366
- let inputAttrs = {}
367
- if (props.type) inputAttrs = { ...inputAttrs, type: props.type === "password" ? inputType.value : props.type }
368
- if (props.placeholder) inputAttrs = { ...inputAttrs, placeholder: props.placeholder }
369
- if (props.disabled) inputAttrs = { ...inputAttrs, disabled: props.disabled }
370
- if (props.readonly) inputAttrs = { ...inputAttrs, readonly: props.readonly }
371
- if (props.autocomplete) inputAttrs = { ...inputAttrs, autocomplete: props.autocomplete }
372
- if (props.required) inputAttrs = { ...inputAttrs, required: props.required }
373
- if (props.maxLength) inputAttrs = { ...inputAttrs, maxlength: props.maxLength }
374
- return inputAttrs
375
- });
376
- </script>
377
-
378
- <template>
379
- <div class="input-container" :class="{ dense: !outlined || dense, [`input-${size}`]: size }">
380
- <input
381
- :value="modelValue"
382
- :class="computedClass"
383
- :style="computedStyle"
384
- @input="handleInput"
385
- @blur="handleBlur"
386
- v-bind="inputAttrs"
387
- />
388
-
389
- <label class="label" :class="!isHex(color) ? `text-${color}` : ''" :style="isHex(color) ? { color: color } : {}">
390
- {{ label }}
391
- </label>
392
-
393
- <div class="absolute right-0 top-1/2 transform -translate-y-1/2">
394
- <UIButton v-if="type==='password'" :icon="visibility ? 'visibility_off' : 'visibility'" flat dense color="gray-400" @click="visibility = !visibility" />
395
- </div>
396
- <p
397
- v-if="hint && !validationError"
398
- class="hint-text"
399
- >
400
- {{ hint }}
401
- </p>
402
-
403
- <p
404
- v-if="validationError"
405
- class="error-text"
406
- >
407
- {{ validationError }}
408
- </p>
409
- </div>
410
- </template>
411
- <style scoped>
412
- .input-container {
413
- position: relative;
414
- margin: 20px 0px 10px 0px;
415
- }
416
-
417
- .input-container.dense {
418
- margin: 10px 0;
419
- }
420
-
421
- .input-container .input {
422
- padding: 10px;
423
- }
424
-
425
- .input-container.dense .input {
426
- padding: 6px 10px;
427
- }
428
-
429
- .input:focus {
430
- outline: none;
431
- }
432
-
433
- .label {
434
- position: absolute;
435
- left: 10px;
436
- top: 50%;
437
- transform: translateY(-50%);
438
- color: #9ca3af;
439
- padding: 0 5px;
440
- pointer-events: none;
441
- transition:
442
- top 0.2s ease,
443
- font-size 0.2s ease,
444
- color 0.2s ease,
445
- transform 0.2s ease;
446
- }
447
-
448
-
449
- .input-container:has(input[type="date"]) .label,
450
- .input-container:has(input[type="datetime-local"]) .label,
451
- .input-container:has(input[type="time"]) .label,
452
- .input-container:has(input[type="month"]) .label,
453
- .input-container:has(input[type="week"]) .label {
454
- top: -20%;
455
- left: 5px;
456
- transform: none;
457
- color: gray;
458
- z-index: 1;
459
- }
460
-
461
- .input:focus + .label,
462
- .input.has-value + .label,
463
- .input:placeholder-shown + .label,
464
- .input-container.input-lg.dense .input:focus + .label,
465
- .input-container.input-lg.dense .input.has-value + .label,
466
- .input-container.input-lg.dense .input:placeholder-shown + .label {
467
- top: -20px;
468
- left: 5px;
469
- transform: none;
470
- color: gray;
471
- z-index: 1;
472
- }
473
-
474
- .input-container.dense .input:focus + .label,
475
- .input-container.dense .input.has-value + .label,
476
- .input-container.dense .input:placeholder-shown + .label {
477
- top: -10px;
478
- }
479
-
480
- .input-container.input-lg .input:focus + .label,
481
- .input-container.input-lg .input.has-value + .label,
482
- .input-container.input-lg .input:placeholder-shown + .label {
483
- top: -24px;
484
- }
485
-
486
- .input-container.input-sm .label {
487
- font-size: 14px;
488
- }
489
- .input-container.input-md .label {
490
- font-size: 16px;
491
- }
492
- .input-container.input-lg .label {
493
- font-size: 18px;
494
- }
495
-
496
- .input-container.input-sm .input:focus + .label,
497
- .input-container.input-sm .input.has-value + .label,
498
- .input-container.input-sm .input:placeholder-shown + .label {
499
- font-size: 12px;
500
- }
501
-
502
- .input-container.input-md .input:focus + .label,
503
- .input-container.input-md .input.has-value + .label,
504
- .input-container.input-md .input:placeholder-shown + .label {
505
- font-size: 14px;
506
- }
507
-
508
- .input-container.input-lg .input:focus + .label,
509
- .input-container.input-lg .input.has-value + .label,
510
- .input-container.input-lg .input:placeholder-shown + .label {
511
- font-size: 16px;
512
- }
513
-
514
- .hint-text {
515
- font-size: 12px;
516
- color: #6b7280;
517
- margin-left: 5px;
518
- }
519
-
520
- .char-count {
521
- margin-top: 4px;
522
- font-size: 0.875rem;
523
- color: #6b7280;
524
- }
525
-
526
- .error-text {
527
- margin-top: 4px;
528
- font-size: 0.875rem;
529
- color: #ef4444;
530
- }
531
- </style>