srcdev-nuxt-forms 0.2.0 → 1.0.1

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 (77) hide show
  1. package/assets/styles/brand/_brand.css +150 -0
  2. package/assets/styles/brand/_brand_dark.css +152 -0
  3. package/assets/styles/brand/_palette_dark.css +148 -0
  4. package/assets/styles/brand/_palette_light.css +148 -0
  5. package/assets/styles/brand/_typography.css +176 -0
  6. package/assets/styles/brand/index.css +1 -0
  7. package/assets/styles/forms/index.css +1 -2
  8. package/assets/styles/forms/themes/_default.css +3 -0
  9. package/assets/styles/forms/themes/_error.css +45 -11
  10. package/assets/styles/forms/themes/_ghost.css +42 -10
  11. package/assets/styles/forms/themes/_primary.css +42 -12
  12. package/assets/styles/forms/themes/_secondary.css +42 -12
  13. package/assets/styles/forms/themes/_success.css +42 -11
  14. package/assets/styles/forms/themes/_tertiary.css +42 -10
  15. package/assets/styles/forms/themes/_warning.css +42 -10
  16. package/assets/styles/forms/themes/index.css +1 -0
  17. package/assets/styles/forms/variables/_palette.css +104 -0
  18. package/assets/styles/forms/variables/_theme.css +1 -1
  19. package/assets/styles/forms/variables/index.css +2 -0
  20. package/assets/styles/main.css +2 -0
  21. package/assets/styles/scaffolding/_margin-helpers.css +308 -0
  22. package/assets/styles/scaffolding/_padding-helpers.css +308 -0
  23. package/assets/styles/scaffolding/_page.css +23 -0
  24. package/assets/styles/scaffolding/index.css +3 -0
  25. package/assets/styles/variables/colors/_blue.css +2 -2
  26. package/assets/styles/variables/colors/_gray.css +1 -1
  27. package/assets/styles/variables/colors/_green.css +2 -2
  28. package/assets/styles/variables/colors/_orange.css +2 -2
  29. package/assets/styles/variables/colors/_red.css +2 -2
  30. package/assets/styles/variables/colors/_yellow.css +1 -1
  31. package/components/forms/form-errors/InputError.vue +82 -37
  32. package/components/forms/input-button/InputButtonCore.vue +25 -104
  33. package/components/forms/input-checkbox/InputCheckboxCore.vue +37 -181
  34. package/components/forms/input-checkbox/InputCheckboxWithLabel.vue +42 -51
  35. package/components/forms/input-checkbox/variants/MultipleCheckboxes.vue +42 -69
  36. package/components/forms/input-checkbox/variants/SingleCheckbox.vue +126 -111
  37. package/components/forms/input-number/InputNumberCore.vue +184 -0
  38. package/components/forms/input-number/variants/InputNumberDefault.vue +155 -0
  39. package/components/forms/input-radio/InputRadiobuttonCore.vue +212 -0
  40. package/components/forms/input-radio/InputRadiobuttonWithLabel.vue +103 -0
  41. package/components/forms/input-radio/variants/MultipleRadiobuttons.vue +166 -0
  42. package/components/forms/input-range/InputRangeCore.vue +70 -88
  43. package/components/forms/input-range/variants/InputRangeDefault.vue +74 -46
  44. package/components/forms/input-text/InputTextCore.vue +141 -109
  45. package/components/forms/input-text/variants/material/InputPasswordWithLabel.vue +99 -0
  46. package/components/forms/input-text/variants/material/InputTextAsNumberWithLabel.vue +142 -0
  47. package/components/forms/input-text/variants/material/InputTextWithLabel.vue +125 -0
  48. package/components/forms/input-textarea/InputTextareaCore.vue +96 -105
  49. package/components/forms/input-textarea/variants/InputTextareaWithLabel.vue +106 -0
  50. package/components/scaffolding/footer/NavFooter.vue +62 -0
  51. package/composables/useApiRequest.ts +25 -0
  52. package/composables/useFormControl.ts +2 -0
  53. package/composables/useSleep.ts +2 -2
  54. package/composables/useStyleClassPassthrough.ts +30 -0
  55. package/composables/useZodValidation.ts +120 -0
  56. package/layouts/default.vue +21 -5
  57. package/package.json +13 -9
  58. package/pages/forms/examples/material/cssbattle.vue +60 -0
  59. package/pages/forms/examples/material/text-fields.vue +375 -153
  60. package/pages/index.vue +2 -2
  61. package/pages/typography.vue +83 -0
  62. package/server/data/places/cities.json +7 -1
  63. package/types/types.forms.ts +102 -0
  64. package/types/types.zodFormControl.ts +21 -0
  65. package/assets/styles/forms/utils/_a11y.css +0 -5
  66. package/assets/styles/forms/utils/index.css +0 -1
  67. package/components/forms/input-radio/InputRadioCore.vue +0 -226
  68. package/components/forms/input-radio/InputRadioWithLabel.vue +0 -118
  69. package/components/forms/input-radio/variants/MultipleRadio.vue +0 -183
  70. package/components/forms/input-radio/variants/SingleRadio.vue +0 -131
  71. package/components/forms/input-text/variants/material/InputEmailMaterial.vue +0 -72
  72. package/components/forms/input-text/variants/material/InputPasswordMaterial.vue +0 -114
  73. package/components/forms/input-text/variants/material/InputTextMaterial.vue +0 -68
  74. package/components/forms/input-text/variants/material/InputTextMaterialCore.vue +0 -313
  75. package/components/forms/input-textarea/variants/material/InputTextareaMaterial.vue +0 -75
  76. package/components/forms/input-textarea/variants/material/InputTextareaMaterialCore.vue +0 -290
  77. package/composables/useUpdateStyleClassPassthrough.ts +0 -29
@@ -0,0 +1,23 @@
1
+ :root {
2
+ /* color-scheme: light dark; */
3
+ }
4
+
5
+ html {
6
+ background-color: var(--body-background-color);
7
+ /* background-color: light-dark(var(--light-body-background-color), var(--dark-body-background-color)); */
8
+
9
+ font-size: 62.5%;
10
+ }
11
+ body,
12
+ p,
13
+ span,
14
+ pre,
15
+ code,
16
+ div,
17
+ fieldset,
18
+ legend,
19
+ li,
20
+ a {
21
+ font-family: var(--font-family);
22
+ font-size: var(--step-1);
23
+ }
@@ -0,0 +1,3 @@
1
+ @import './_page.css';
2
+ @import './_margin-helpers.css';
3
+ @import './_padding-helpers.css';
@@ -1,4 +1,4 @@
1
- :where(html) {
1
+ :root {
2
2
  --blue-0: #e7f5ff;
3
3
  --blue-1: #d0ebff;
4
4
  --blue-2: #a5d8ff;
@@ -11,5 +11,5 @@
11
11
  --blue-9: #1864ab;
12
12
  --blue-10: #145591;
13
13
  --blue-11: #114678;
14
- --blue-12: #0d375e;
14
+ --blue-12: #0e01cd;
15
15
  }
@@ -1,4 +1,4 @@
1
- :where(html) {
1
+ :root {
2
2
  --gray-00: #ffffff;
3
3
  --gray-0: #f8f9fa;
4
4
  --gray-1: #f1f3f5;
@@ -1,4 +1,4 @@
1
- :where(html) {
1
+ :root {
2
2
  --green-0: #ebfbee;
3
3
  --green-1: #d3f9d8;
4
4
  --green-2: #b2f2bb;
@@ -11,5 +11,5 @@
11
11
  --green-9: #2b8a3e;
12
12
  --green-10: #237032;
13
13
  --green-11: #1b5727;
14
- --green-12: #133d1b;
14
+ --green-12: #00a21e;
15
15
  }
@@ -1,4 +1,4 @@
1
- :where(html) {
1
+ :root {
2
2
  --orange-0: #fff4e6;
3
3
  --orange-1: #ffe8cc;
4
4
  --orange-2: #ffd8a8;
@@ -11,5 +11,5 @@
11
11
  --orange-9: #d9480f;
12
12
  --orange-10: #bf400d;
13
13
  --orange-11: #99330b;
14
- --orange-12: #802b09;
14
+ --orange-12: #db3e00;
15
15
  }
@@ -1,4 +1,4 @@
1
- :where(html) {
1
+ :root {
2
2
  --red-0: #fff5f5;
3
3
  --red-1: #ffe3e3;
4
4
  --red-2: #ffc9c9;
@@ -11,5 +11,5 @@
11
11
  --red-9: #ff0b0b;
12
12
  --red-10: #b02525;
13
13
  --red-11: #962020;
14
- --red-12: #7d1a1a;
14
+ --red-12: #cc0000;
15
15
  }
@@ -1,4 +1,4 @@
1
- :where(html) {
1
+ :root {
2
2
  --yellow-0: #fff9db;
3
3
  --yellow-1: #fff3bf;
4
4
  --yellow-2: #ffec99;
@@ -1,13 +1,18 @@
1
1
  <template>
2
- <div class="input-error-message" :class="[{ show: fieldHasError }, { detached: isDetached }, { hide: !fieldHasError }]">
2
+ <div class="input-error-message" :class="[elementClasses, { show: fieldHasError }, { detached: isDetached }, { hide: !fieldHasError }]">
3
3
  <div class="inner" :class="[{ show: fieldHasError }]">
4
- <div class="message" :id="`${id}-error-message`">
5
- <ul v-if="isArray">
6
- <li v-for="(message, index) in errorMessaging" :key="index">{{ message }}</li>
7
- </ul>
8
- <span v-else>
9
- {{ errorMessaging }}
10
- </span>
4
+ <div class="inner-content">
5
+ <div class="inner-icon">
6
+ <Icon name="radix-icons:circle-backslash" class="icon" />
7
+ </div>
8
+ <div class="message" :id="`${id}-error-message`">
9
+ <ul v-if="isArray" class="message-list">
10
+ <li v-for="(message, index) in errorMessage" :key="index" class="message-list-item">{{ message }}</li>
11
+ </ul>
12
+ <span v-else class="message-single">
13
+ {{ errorMessage }}
14
+ </span>
15
+ </div>
11
16
  </div>
12
17
  </div>
13
18
  </div>
@@ -15,8 +20,8 @@
15
20
 
16
21
  <script setup lang="ts">
17
22
  const props = defineProps({
18
- errorMessaging: {
19
- type: [Object, String],
23
+ errorMessage: {
24
+ type: [Array, Object, String],
20
25
  required: true,
21
26
  },
22
27
  fieldHasError: {
@@ -28,8 +33,8 @@ const props = defineProps({
28
33
  required: true,
29
34
  },
30
35
  styleClassPassthrough: {
31
- type: String,
32
- default: '',
36
+ type: Array as PropType<string[]>,
37
+ default: () => [],
33
38
  },
34
39
  compact: {
35
40
  type: Boolean,
@@ -42,8 +47,10 @@ const props = defineProps({
42
47
  });
43
48
 
44
49
  const isArray = computed(() => {
45
- return Array.isArray(props.errorMessaging);
50
+ return Array.isArray(props.errorMessage);
46
51
  });
52
+
53
+ const { elementClasses, updateElementClasses } = useStyleClassPassthrough(props.styleClassPassthrough);
47
54
  </script>
48
55
 
49
56
  <style lang="css" scoped>
@@ -62,7 +69,7 @@ const isArray = computed(() => {
62
69
  --_transition-duration: 500ms;
63
70
  --_transition-timing-function: linear;
64
71
  --_message-translate-y-hide: calc(var(--_gutter) * -2);
65
- --_message-translate-y-show: 2px;
72
+ --_message-translate-y-show: 0;
66
73
  --_message-translate-y: var(--_message-translate-y-hide);
67
74
  --_padding-message-show: var(--_gutter);
68
75
  --_padding-message-hide: 0;
@@ -73,8 +80,9 @@ const isArray = computed(() => {
73
80
  display: grid;
74
81
  grid-template-rows: var(--_grid-template-rows);
75
82
 
76
- color: hsl(from var(--theme-error) h s 95%);
77
- background-color: var(--theme-error);
83
+ color: var(--theme-error-text);
84
+ background-color: var(--theme-error-surface);
85
+ border-radius: 0 0 4px 4px;
78
86
 
79
87
  transition-property: grid-template-rows;
80
88
  transition-duration: var(--_transition-duration);
@@ -83,8 +91,19 @@ const isArray = computed(() => {
83
91
 
84
92
  &.detached {
85
93
  border-radius: var(--input-border-radius);
94
+ margin-block-start: 20px;
86
95
  }
87
96
 
97
+ /* &.mbs-12 {
98
+ transition: margin-block-start var(--_transition-duration) var(--_transition-timing-function);
99
+ &.hide {
100
+ margin-block-start: 0;
101
+ }
102
+ &.show {
103
+ margin-block-start: 12px;
104
+ }
105
+ } */
106
+
88
107
  &.show {
89
108
  --_grid-template-rows: 1fr;
90
109
  --_opacity: var(--_opacity-show);
@@ -95,8 +114,9 @@ const isArray = computed(() => {
95
114
  }
96
115
 
97
116
  .inner {
98
- overflow: hidden;
117
+ align-items: center;
99
118
 
119
+ overflow: hidden;
100
120
  transition: opacity var(--_transition-duration) var(--_transition-timing-function), display var(--_transition-duration) var(--_transition-timing-function) allow-discrete;
101
121
 
102
122
  &.show {
@@ -104,26 +124,51 @@ const isArray = computed(() => {
104
124
  opacity: var(--_opacity-show);
105
125
  }
106
126
 
107
- .message {
108
- font-family: var(--font-family);
109
- font-size: 16px;
110
- font-weight: 500;
111
- padding-block: var(--_padding-message);
112
- padding-inline: var(--_gutter-inline);
113
- transform: translateY(var(--_message-translate-y));
114
-
115
- transition-property: transform, padding;
116
- transition-duration: var(--_transition-duration);
117
- transition-timing-function: linear;
118
-
119
- ul {
120
- list-style-type: none;
121
- padding-inline-start: 0;
122
- margin-block-start: 0;
123
- margin-block-end: 0;
124
-
125
- li + li {
126
- margin-block-start: 6px;
127
+ .inner-content {
128
+ display: flex;
129
+ align-items: center;
130
+
131
+ .inner-icon {
132
+ display: inline-block;
133
+ padding-left: 12px;
134
+
135
+ .icon {
136
+ color: white;
137
+ transform: translateY(3px);
138
+ }
139
+ }
140
+
141
+ .message {
142
+ display: inline-block;
143
+ flex-grow: 1;
144
+ font-family: var(--font-family);
145
+ font-size: 16px;
146
+ font-weight: 500;
147
+ padding-block: var(--_padding-message);
148
+ padding-inline: var(--_gutter-inline);
149
+ transform: translateY(var(--_message-translate-y));
150
+
151
+ transition-property: transform, padding;
152
+ transition-duration: var(--_transition-duration);
153
+ transition-timing-function: linear;
154
+
155
+ .message-single {
156
+ color: white;
157
+ }
158
+
159
+ .message-list {
160
+ list-style-type: none;
161
+ padding-inline-start: 0;
162
+ margin-block-start: 0;
163
+ margin-block-end: 0;
164
+
165
+ .message-list-item {
166
+ color: white;
167
+ }
168
+
169
+ .message-list-item + .message-list-item {
170
+ margin-block-start: 6px;
171
+ }
127
172
  }
128
173
  }
129
174
  }
@@ -1,11 +1,12 @@
1
1
  <template>
2
2
  <button
3
- :type="type"
3
+ :type
4
4
  :readonly
5
5
  :aria-disabled="readonly"
6
6
  :data-test-id="dataTestId"
7
+ :data-btn-theme="theme"
7
8
  class="input-button-core btn"
8
- :class="[`btn-${type}`, `theme-${theme}`, size, effectClass, styleClassPassthrough, { 'icon-only': isIconOnly }]"
9
+ :class="[`btn-${type}`, size, effectClass, styleClassPassthrough, { 'icon-only': isIconOnly }]"
9
10
  >
10
11
  <span v-if="useEffect && effect == 'fancy'" class="fancy"></span>
11
12
  <template v-if="hasLeftContent && !isIconOnly">
@@ -112,6 +113,8 @@ const isIconOnly = computed(() => slots.iconOnly !== undefined);
112
113
  --_padding-block: var(--theme-form-button-padding-block-normal);
113
114
  --_padding-inline: var(--theme-form-button-padding-inline-normal);
114
115
  --_icon-gap: var(--theme-form-button-icon-gap-normal);
116
+ --_border-width: var(--input-border-width-default);
117
+ --_outline-width: var(--input-outline-width-thin);
115
118
 
116
119
  align-items: center;
117
120
  display: flex;
@@ -126,13 +129,31 @@ const isIconOnly = computed(() => slots.iconOnly !== undefined);
126
129
 
127
130
  transition: all 0.2s ease-in-out;
128
131
 
132
+ background-color: var(--theme-btn-bg);
133
+ border: var(--_border-width) solid var(--theme-btn-border);
134
+ color: var(--theme-btn-text);
135
+ outline: 1px solid var(--theme-btn-outline);
136
+
137
+ /*
138
+ * States
139
+ **/
140
+ &:hover {
141
+ --theme-btn-bg: var(--theme-btn-bg-hover);
142
+ --theme-btn-border: var(--theme-btn-border-hover);
143
+ --theme-btn-text: var(--theme-btn-text-hover);
144
+ --theme-btn-outline: var(--theme-btn-outline-hover);
145
+ }
146
+
129
147
  &:hover {
130
148
  cursor: pointer;
131
149
  }
132
150
 
133
151
  &:focus-visible {
134
- outline: var(--focus-visible-outline);
135
- box-shadow: var(--focus-visible-box-shadow);
152
+ --theme-btn-bg: var(--theme-btn-bg-focus);
153
+ --theme-btn-border: var(--theme-btn-border-focus);
154
+ --theme-btn-text: var(--theme-btn-text-focus);
155
+ --theme-btn-outline: var(--theme-btn-outline-focus);
156
+ box-shadow: var(--theme-form-focus-box-shadow);
136
157
  }
137
158
 
138
159
  &[readonly] {
@@ -266,105 +287,5 @@ const isIconOnly = computed(() => slots.iconOnly !== undefined);
266
287
  }
267
288
  }
268
289
  }
269
-
270
- --_border-width: var(--input-border-width-default);
271
- --_outline-width: var(--input-outline-width-thin);
272
-
273
- /*
274
- * Initial theme (primary)
275
- **/
276
- --_theme-form-border: var(--theme-form-primary-border);
277
- --_theme-form-border-hover: var(--theme-form-primary-border-hover);
278
- --_theme-form-outline: var(--theme-form-primary-outline);
279
- --_theme-form-outline-hover: var(--theme-form-primary-outline-hover);
280
- --_theme-form-bg: var(--theme-form-primary-bg);
281
- --_theme-form-bg-hover: var(--theme-form-primary-bg-hover);
282
- --_theme-form-color: var(--theme-form-primary-color);
283
- --_theme-form-color-hover: var(--theme-form-primary-color-hover);
284
-
285
- background-color: var(--_theme-form-bg);
286
- border: var(--_border-width) solid var(--_theme-form-border);
287
- color: var(--_theme-form-color);
288
- outline: 1px solid var(--_theme-form-outline);
289
-
290
- /*
291
- * Themes (alternate)
292
- **/
293
- &.theme-secondary {
294
- --_theme-form-border: var(--theme-form-secondary-border);
295
- --_theme-form-border-hover: var(--theme-form-secondary-border-hover);
296
- --_theme-form-outline: var(--theme-form-secondary-outline);
297
- --_theme-form-outline-hover: var(--theme-form-secondary-outline-hover);
298
- --_theme-form-bg: var(--theme-form-secondary-bg);
299
- --_theme-form-bg-hover: var(--theme-form-secondary-bg-hover);
300
- --_theme-form-color: var(--theme-form-secondary-color);
301
- --_theme-form-color-hover: var(--theme-form-secondary-color-hover);
302
- }
303
-
304
- &.theme-tertiary {
305
- --_theme-form-border: var(--theme-form-tertiary-border);
306
- --_theme-form-border-hover: var(--theme-form-tertiary-border-hover);
307
- --_theme-form-outline: var(--theme-form-tertiary-outline);
308
- --_theme-form-outline-hover: var(--theme-form-tertiary-outline-hover);
309
- --_theme-form-bg: var(--theme-form-tertiary-bg);
310
- --_theme-form-bg-hover: var(--theme-form-tertiary-bg-hover);
311
- --_theme-form-color: var(--theme-form-tertiary-color);
312
- --_theme-form-color-hover: var(--theme-form-tertiary-color-hover);
313
- }
314
-
315
- &.theme-warning {
316
- --_theme-form-border: var(--theme-form-warning-border);
317
- --_theme-form-border-hover: var(--theme-form-warning-border-hover);
318
- --_theme-form-outline: var(--theme-form-warning-outline);
319
- --_theme-form-outline-hover: var(--theme-form-warning-outline-hover);
320
- --_theme-form-bg: var(--theme-form-warning-bg);
321
- --_theme-form-bg-hover: var(--theme-form-warning-bg-hover);
322
- --_theme-form-color: var(--theme-form-warning-color);
323
- --_theme-form-color-hover: var(--theme-form-warning-color-hover);
324
- }
325
-
326
- &.theme-error {
327
- --_theme-form-border: var(--theme-form-error-border);
328
- --_theme-form-border-hover: var(--theme-form-error-border-hover);
329
- --_theme-form-outline: var(--theme-form-error-outline);
330
- --_theme-form-outline-hover: var(--theme-form-error-outline-hover);
331
- --_theme-form-bg: var(--theme-form-error-bg);
332
- --_theme-form-bg-hover: var(--theme-form-error-bg-hover);
333
- --_theme-form-color: var(--theme-form-error-color);
334
- --_theme-form-color-hover: var(--theme-form-error-color-hover);
335
- }
336
-
337
- &.theme-success {
338
- --_theme-form-border: var(--theme-form-success-border);
339
- --_theme-form-border-hover: var(--theme-form-success-border-hover);
340
- --_theme-form-outline: var(--theme-form-success-outline);
341
- --_theme-form-outline-hover: var(--theme-form-success-outline-hover);
342
- --_theme-form-bg: var(--theme-form-success-bg);
343
- --_theme-form-bg-hover: var(--theme-form-success-bg-hover);
344
- --_theme-form-color: var(--theme-form-success-color);
345
- --_theme-form-color-hover: var(--theme-form-success-color-hover);
346
- }
347
-
348
- &.theme-ghost {
349
- --_theme-form-border: var(--theme-form-ghost-border);
350
- --_theme-form-border-hover: var(--theme-form-ghost-border-hover);
351
- --_theme-form-outline: var(--theme-form-ghost-outline);
352
- --_theme-form-outline-hover: var(--theme-form-ghost-outline-hover);
353
- --_theme-form-bg: var(--theme-form-ghost-bg);
354
- --_theme-form-bg-hover: var(--theme-form-ghost-bg-hover);
355
- --_theme-form-color: var(--theme-form-ghost-color);
356
- --_theme-form-color-hover: var(--theme-form-ghost-color-hover);
357
- }
358
-
359
- /*
360
- * States
361
- **/
362
- &:hover,
363
- &:focus-visible {
364
- --_theme-form-color: var(--_theme-form-color-hover);
365
- --_theme-form-bg: var(--_theme-form-bg-hover);
366
- --_theme-form-border: var(--_theme-form-border-hover);
367
- --_theme-form-outline: var(--_theme-form-outline-hover);
368
- }
369
290
  }
370
291
  </style>