srcdev-nuxt-forms 2.4.4 → 2.4.6

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.
@@ -5,6 +5,8 @@
5
5
  </div>
6
6
 
7
7
  <div class="input-range-container">
8
+ <slot v-if="hasMarkers" name="markers"></slot>
9
+
8
10
  <input
9
11
  type="range"
10
12
  :id
@@ -14,14 +16,12 @@
14
16
  :max
15
17
  :step
16
18
  :list="hasDataList ? name + '-datalist' : ''"
17
- :class="['input-range-core', `input-range--${size}`, `input-range--${weight}`, styleClassPassthrough]"
19
+ :class="['input-range-core', `input-range--${size}`, `input-range--${weight}`, styleClassPassthrough, { 'has-markers': hasMarkers }]"
18
20
  v-model="modelValue"
19
21
  ref="inputRange"
20
22
  />
21
23
 
22
- <template v-if="hasDataList">
23
- <slot name="datalist"></slot>
24
- </template>
24
+ <slot v-if="hasDataList" name="datalist"></slot>
25
25
  </div>
26
26
  <div v-if="hasRightContent" class="slot right">
27
27
  <slot name="right"></slot>
@@ -87,13 +87,14 @@ const props = defineProps({
87
87
  default: false,
88
88
  },
89
89
  styleClassPassthrough: {
90
- type: String,
91
- default: '',
90
+ type: Array as PropType<string[]>,
91
+ default: () => [],
92
92
  },
93
93
  });
94
94
 
95
95
  const slots = useSlots();
96
96
  const hasDataList = computed(() => slots.datalist !== undefined);
97
+ const hasMarkers = computed(() => slots.markers !== undefined);
97
98
  const hasLeftContent = computed(() => slots.left !== undefined);
98
99
  const hasRightContent = computed(() => slots.right !== undefined);
99
100
 
@@ -134,7 +135,40 @@ const changeBackgroundColor = () => {
134
135
 
135
136
  .input-range-container {
136
137
  flex-grow: 1;
138
+
139
+ display: grid;
140
+ grid-template-areas: 'element-stack';
141
+
142
+ .input-range-markers {
143
+ grid-area: element-stack;
144
+ display: flex;
145
+ align-items: center;
146
+ justify-content: space-between;
147
+ width: 100%;
148
+ z-index: 2;
149
+
150
+ .marker {
151
+ background-color: black;
152
+ padding: 0.5rem;
153
+ border-radius: 50%;
154
+ overflow: hidden;
155
+ outline: 1px solid gray;
156
+
157
+ &:hover {
158
+ cursor: pointer;
159
+ }
160
+
161
+ .marker-icon {
162
+ font-size: 2rem;
163
+ display: block;
164
+ color: var(--theme-form-range-accent-color);
165
+ }
166
+ }
167
+ }
168
+
137
169
  .input-range-core {
170
+ grid-area: element-stack;
171
+
138
172
  accent-color: var(--theme-form-range-accent-color);
139
173
  height: var(--_input-range-height);
140
174
  margin: 0;
@@ -205,6 +239,21 @@ const changeBackgroundColor = () => {
205
239
  &:focus-visible {
206
240
  box-shadow: var(--form-focus-box-shadow);
207
241
  }
242
+
243
+ &.has-markers {
244
+ accent-color: var(--theme-form-range-accent-color);
245
+ height: 2px;
246
+ z-index: 2;
247
+ translate: 0 13px;
248
+
249
+ &::-webkit-slider-thumb {
250
+ /* display: none; */
251
+ opacity: 0;
252
+ &:hover {
253
+ cursor: pointer;
254
+ }
255
+ }
256
+ }
208
257
  }
209
258
 
210
259
  .input-range-datalist {
@@ -0,0 +1,249 @@
1
+ <template>
2
+ <div class="colour-scheme-select" :data-size="size" :data-form-theme="theme">
3
+ <p>Color Scheme select</p>
4
+
5
+ <form class="colour-scheme-select-form mbe-20" ref="colourSchemeWrapper">
6
+ <div class="select-scheme-marker-wrapper">
7
+ <div class="select-scheme-marker"></div>
8
+ </div>
9
+ <div class="select-scheme-group-wrapper">
10
+ <div class="select-scheme-group">
11
+ <LazyIcon name="material-symbols:night-sight-auto-sharp" class="scheme-icon" />
12
+ <input type="radio" id="auto" name="colour-scheme" class="scheme-input" v-model="currentColourScheme" value="auto" />
13
+ <label for="auto" class="sr-only">Auto</label>
14
+ </div>
15
+ <div class="select-scheme-group">
16
+ <LazyIcon name="radix-icons:sun" class="scheme-icon" />
17
+ <input type="radio" id="light" name="colour-scheme" class="scheme-input" v-model="currentColourScheme" value="light" />
18
+ <label for="light" class="sr-only">Light</label>
19
+ </div>
20
+ <div class="select-scheme-group">
21
+ <LazyIcon name="radix-icons:moon" class="scheme-icon" />
22
+ <input type="radio" id="dark" name="colour-scheme" class="scheme-input" v-model="currentColourScheme" value="dark" />
23
+ <label for="dark" class="sr-only">Dark</label>
24
+ </div>
25
+ </div>
26
+ </form>
27
+ </div>
28
+ </template>
29
+
30
+ <script setup lang="ts">
31
+ import propValidators from '../../forms/c12/prop-validators';
32
+
33
+ defineProps({
34
+ name: {
35
+ type: String,
36
+ defaul: 'colour-scheme-select',
37
+ },
38
+ size: {
39
+ type: String as PropType<string>,
40
+ default: 'medium',
41
+ validator(value: string) {
42
+ return propValidators.size.includes(value);
43
+ },
44
+ },
45
+ theme: {
46
+ type: String as PropType<string>,
47
+ default: 'primary',
48
+ validator(value: string) {
49
+ return propValidators.theme.includes(value);
50
+ },
51
+ },
52
+ styleClassPassthrough: {
53
+ type: Array as PropType<string[]>,
54
+ default: () => [],
55
+ },
56
+ });
57
+
58
+ const { currentColourScheme } = useColourScheme();
59
+
60
+ const colourSchemeWrapper = ref<HTMLFormElement | null>(null);
61
+ const colourSchemeInputElements = ref<HTMLDivElement[]>([]);
62
+
63
+ // console.log('colourSchemeInputElements');
64
+ // console.log(colourSchemeInputElements);
65
+
66
+ const findIndexOfInputValueFromCurrentColourScheme = () => {
67
+ if (currentColourScheme.value === 'auto') return 1;
68
+ if (currentColourScheme.value === 'light') return 2;
69
+ if (currentColourScheme.value === 'dark') return 3;
70
+ return undefined;
71
+ };
72
+
73
+ // const findLeftOffsetOfInputValueFromCurrentColourScheme = (index: number) => {
74
+ // const normalisedIndex = index - 1;
75
+
76
+ // console.log(`findLeftOffsetOfInputValueFromCurrentColourScheme: ${normalisedIndex}`);
77
+ // console.log(colourSchemeInputElements.value[normalisedIndex].offsetLeft);
78
+
79
+ // return colourSchemeInputElements.value?.[normalisedIndex]?.getBoundingClientRect().left;
80
+ // };
81
+
82
+ const setColourSchemeAttr = () => {
83
+ const index = findIndexOfInputValueFromCurrentColourScheme() ?? 0;
84
+ const wrapperLeftPosition = colourSchemeWrapper.value?.getBoundingClientRect().left ?? 0;
85
+ colourSchemeWrapper.value?.style.setProperty('--_select-scheme-marker-position', index !== undefined ? index.toString() : '0');
86
+ colourSchemeWrapper.value?.style.setProperty('--_select-scheme-marker-left-offset', colourSchemeInputElements.value?.[index - 1]?.offsetLeft - wrapperLeftPosition + 'px');
87
+ colourSchemeWrapper.value?.style.setProperty('--_select-scheme-marker-width', colourSchemeInputElements.value?.[index - 1]?.getBoundingClientRect().width + 'px');
88
+ };
89
+
90
+ onMounted(() => {
91
+ colourSchemeInputElements.value = Array.from(colourSchemeWrapper.value?.querySelectorAll('.select-scheme-group') || []) as HTMLInputElement[];
92
+
93
+ if (colourSchemeWrapper.value !== null) {
94
+ setColourSchemeAttr();
95
+ }
96
+ });
97
+
98
+ watch(currentColourScheme, () => {
99
+ setColourSchemeAttr();
100
+ });
101
+ </script>
102
+
103
+ <style lang="css">
104
+ .colour-scheme-select {
105
+ --_form-background-color: var(--theme-form-checkbox-bg);
106
+ --_form-border-width: 0.1rem;
107
+ --_form-border-colour: var(--theme-form-radio-border);
108
+ --_form-outline-width: 0.1rem;
109
+
110
+ --_form-outline-colour: var(--theme-form-radio-outline);
111
+
112
+ --_form-border-radius: calc(
113
+ (var(--_scheme-icon-font-size) / 2) + var(--_form-border-width) + var(--_form-outline-width) + var(--_form-padding) + var(--_select-scheme-group-padding) + var(--_select-scheme-group-border-width) +
114
+ var(--_select-scheme-group-outline-width)
115
+ );
116
+
117
+ --_form-items-gap: 1rem;
118
+ --_form-padding: 0.6rem;
119
+
120
+ /* --_select-scheme-marker-position: 1; */
121
+
122
+ --_select-scheme-group-background-color: red;
123
+ --_select-scheme-group-padding: 0.5rem;
124
+ --_select-scheme-group-border-width: 0.2rem;
125
+ --_select-scheme-group-border-colour: transparent;
126
+ --_select-scheme-group-outline-width: 0.2rem;
127
+ --_select-scheme-group-outline-colour: transparent;
128
+ --_select-scheme-group-width: calc(
129
+ var(--_scheme-icon-font-size) + (var(--_select-scheme-group-padding) * 2) + (var(--_select-scheme-group-border-width) * 2) + (var(--_select-scheme-group-outline-width) * 2)
130
+ );
131
+
132
+ --_scheme-icon-font-size: 2rem;
133
+ --_scheme-icon-colour: white;
134
+
135
+ .colour-scheme-select-form {
136
+ display: grid;
137
+ grid-template-areas: 'select-stack';
138
+ width: fit-content;
139
+
140
+ background-color: var(--_form-background-color);
141
+ border: var(--_form-border-width) solid var(--_form-border-colour);
142
+ outline: var(--_form-outline-width) solid var(--_form-outline-colour);
143
+ border-radius: var(--_form-border-radius);
144
+
145
+ .select-scheme-marker-wrapper {
146
+ grid-area: select-stack;
147
+ /* display: grid; */
148
+ /* grid-template-columns: repeat(3, 1fr); */
149
+ z-index: 1;
150
+ /* grid-area: select-stack; */
151
+ /* gap: var(--_form-items-gap); */
152
+ /* transition: all 200ms; */
153
+ /* transition-behavior: allow-discrete; */
154
+
155
+ /* display: none; */
156
+
157
+ display: flex;
158
+ align-items: center;
159
+ position: relative;
160
+
161
+ .select-scheme-marker {
162
+ /* grid-column: var(--_select-scheme-marker-position); */
163
+ aspect-ratio: 1;
164
+ /* width: calc(var(--_select-scheme-group-width) + (var(--_form-outline-width) * 2)); */
165
+ /* translate: -1px 0; */
166
+ width: var(--_select-scheme-group-width);
167
+ /* translate: calc(var(--_select-scheme-marker-left-offset) - var(--_form-items-gap) - (var(--_select-scheme-group-outline-width) * 1) - (var(--_select-scheme-group-border-width) * 1)) 0; */
168
+ /* translate: calc(var(--_select-scheme-marker-left-offset) - (var(--_select-scheme-group-outline-width) * 1) - (var(--_select-scheme-group-border-width) * 1)) 0; */
169
+ transition: all 300ms ease-in-out;
170
+ background-color: var(--theme-form-radio-border);
171
+ border-radius: 50%;
172
+
173
+ position: absolute;
174
+ left: calc(var(--_select-scheme-marker-left-offset) - var(--_form-border-width) - var(--_form-outline-width) - 1px);
175
+ }
176
+ }
177
+
178
+ .select-scheme-group-wrapper {
179
+ display: grid;
180
+ grid-area: select-stack;
181
+ grid-template-columns: repeat(3, 1fr);
182
+ align-items: center;
183
+ width: fit-content;
184
+ padding: var(--_form-padding);
185
+ z-index: 2;
186
+ gap: var(--_form-items-gap);
187
+
188
+ .select-scheme-group {
189
+ aspect-ratio: 1;
190
+ display: grid;
191
+ grid-template-areas: 'icon-stack';
192
+ /* width: var(--_select-scheme-marker-width); */
193
+ place-content: center;
194
+ background-color: var(--_select-scheme-group-background-color);
195
+ border: var(--_select-scheme-group-border-width) solid var(--_select-scheme-group-border-colour);
196
+ outline: var(--_select-scheme-group-outline-width) solid var(--_select-scheme-group-outline-colour);
197
+ border-radius: 50%;
198
+ padding: var(--_select-scheme-group-padding);
199
+
200
+ .scheme-icon {
201
+ grid-area: icon-stack;
202
+ display: block;
203
+ color: var(--_scheme-icon-colour);
204
+ font-size: var(--_scheme-icon-font-size);
205
+ }
206
+
207
+ .scheme-input {
208
+ grid-area: icon-stack;
209
+ opacity: 0;
210
+
211
+ &:hover {
212
+ cursor: pointer;
213
+ }
214
+ }
215
+
216
+ &:has(input[value='auto']) {
217
+ --_select-scheme-group-background-color: green;
218
+
219
+ &:has(input[value='auto']:checked) {
220
+ /* --_select-scheme-marker-position: 1; */
221
+ /* --_select-scheme-group-border-colour: var(--theme-form-radio-border); */
222
+ /* --_select-scheme-group-outline-colour: var(--theme-form-radio-outline); */
223
+ }
224
+ }
225
+
226
+ &:has(input[value='light']) {
227
+ --_select-scheme-group-background-color: orange;
228
+
229
+ &:has(input[value='light']:checked) {
230
+ /* --_select-scheme-marker-position: 2; */
231
+ /* --_select-scheme-group-border-colour: var(--theme-form-radio-border); */
232
+ /* --_select-scheme-group-outline-colour: var(--theme-form-radio-outline); */
233
+ }
234
+ }
235
+
236
+ &:has(input[value='dark']) {
237
+ --_select-scheme-group-background-color: black;
238
+
239
+ &:has(input[value='dark']:checked) {
240
+ /* --_select-scheme-marker-position: 3; */
241
+ /* --_select-scheme-group-border-colour: var(--theme-form-radio-border); */
242
+ /* --_select-scheme-group-outline-colour: var(--theme-form-radio-outline); */
243
+ }
244
+ }
245
+ }
246
+ }
247
+ }
248
+ }
249
+ </style>
@@ -0,0 +1,225 @@
1
+ <template>
2
+ <div class="colour-scheme-select" :data-size="size" :data-form-theme="theme">
3
+ <p>Color Scheme select</p>
4
+
5
+ <form class="colour-scheme-select-form mbe-20">
6
+ <div class="input-range-markers">
7
+ <div class="marker">
8
+ <LazyIcon name="material-symbols:night-sight-auto-sharp" class="marker-icon" />
9
+ </div>
10
+ <div class="marker">
11
+ <LazyIcon name="radix-icons:sun" class="marker-icon" />
12
+ </div>
13
+ <div class="marker" v>
14
+ <LazyIcon name="radix-icons:moon" class="marker-icon" />
15
+ </div>
16
+ </div>
17
+
18
+ <div class="scheme-marker-wrapper">
19
+ <div class="scheme-marker-indicator"></div>
20
+ </div>
21
+
22
+ <div class="form-elements">
23
+ <div class="form-input">
24
+ <input type="radio" id="auto" name="colour-scheme" v-model="colourScheme" value="auto" />
25
+ <label for="auto" class="sr-only">Auto</label>
26
+ </div>
27
+ <div class="form-input">
28
+ <input type="radio" id="light" name="colour-scheme" v-model="colourScheme" value="light" />
29
+ <label for="light" class="sr-only">Light</label>
30
+ </div>
31
+ <div class="form-input">
32
+ <input type="radio" id="dark" name="colour-scheme" v-model="colourScheme" value="dark" />
33
+ <label for="dark" class="sr-only">Dark</label>
34
+ </div>
35
+ </div>
36
+ </form>
37
+ </div>
38
+ </template>
39
+
40
+ <script setup lang="ts">
41
+ import propValidators from '../../forms/c12/prop-validators';
42
+
43
+ defineProps({
44
+ name: {
45
+ type: String,
46
+ defaul: useId(),
47
+ },
48
+ size: {
49
+ type: String as PropType<string>,
50
+ default: 'medium',
51
+ validator(value: string) {
52
+ return propValidators.size.includes(value);
53
+ },
54
+ },
55
+ theme: {
56
+ type: String as PropType<string>,
57
+ default: 'primary',
58
+ validator(value: string) {
59
+ return propValidators.theme.includes(value);
60
+ },
61
+ },
62
+ styleClassPassthrough: {
63
+ type: Array as PropType<string[]>,
64
+ default: () => [],
65
+ },
66
+ });
67
+
68
+ const colourScheme = ref<'auto' | 'dark' | 'light'>('auto');
69
+
70
+ useColourScheme(colourScheme);
71
+ </script>
72
+
73
+ <style lang="css">
74
+ .colour-scheme-select {
75
+ --_outline-width: 0.1rem;
76
+ --_border-width: 0.1rem;
77
+ --_border-radius: 50%;
78
+ --_background-color: var(--theme-form-checkbox-bg);
79
+ --_box-shadow: none;
80
+
81
+ --_icon-size: var(--form-input-checkbox-radio-button-size);
82
+
83
+ --_background-color: var(--theme-form-radio-bg);
84
+ --_border-color: var(--theme-form-radio-border);
85
+ --_border-radius: 50%;
86
+ --_outline-color: var(--theme-form-radio-outline);
87
+
88
+ --_form-padding: 0.5rem;
89
+ --_form-input-outline-width: 0.2rem;
90
+
91
+ --_scheme-marker-position: start;
92
+
93
+ .colour-scheme-select-form {
94
+ display: grid;
95
+ grid-template-areas: 'element-stack';
96
+ align-items: center;
97
+
98
+ background-color: var(--theme-form-radio-bg);
99
+ border: var(--_border-width) solid var(--_border-color);
100
+
101
+ border-radius: calc((var(--_icon-size) / 2) + var(--_form-padding) + var(--_border-width) + var(--_outline-width) + var(--_form-input-outline-width));
102
+
103
+ outline: var(--_outline-width) solid var(--_outline-color);
104
+ box-shadow: var(--_box-shadow);
105
+
106
+ /* height: calc(var(--_icon-size) + 4px); */
107
+ width: calc((var(--_icon-size) * 3) + (var(--_form-padding) * 17));
108
+
109
+ transition: all 0.2s ease-in-out;
110
+
111
+ .input-range-markers {
112
+ grid-area: element-stack;
113
+ display: flex;
114
+ align-items: center;
115
+ justify-content: space-between;
116
+ width: 100%;
117
+ padding: var(--_form-padding);
118
+
119
+ .marker {
120
+ background-color: black;
121
+ padding: var(--_form-padding);
122
+ border-radius: 50%;
123
+ overflow: hidden;
124
+ /* outline: 1px solid gray; */
125
+
126
+ &:hover {
127
+ cursor: pointer;
128
+ }
129
+
130
+ .marker-icon {
131
+ /* font-size: 2rem; */
132
+ display: block;
133
+ color: white;
134
+ height: var(--_icon-size);
135
+ width: var(--_icon-size);
136
+ }
137
+ }
138
+ }
139
+
140
+ .scheme-marker-wrapper {
141
+ grid-area: element-stack;
142
+ display: grid;
143
+ gap: 1rem;
144
+
145
+ grid-template-columns: repeat(3, 1fr);
146
+ /* transition: grid-template-columns 0.2s; */
147
+ /* text-align: var(--_scheme-marker-position); */
148
+ padding: var(--_form-padding);
149
+ /* z-index: 9; */
150
+
151
+ .scheme-marker-indicator {
152
+ grid-column: 3;
153
+ aspect-ratio: 1;
154
+ background-color: var(--theme-form-radio-bg);
155
+ background-color: red;
156
+ border-radius: 50%;
157
+ height: calc(var(--_icon-size) + var(--_form-padding));
158
+ /* width: calc(var(--_icon-size) + var(--_form-padding)); */
159
+ padding: var(--_form-padding);
160
+ transition: grid-columns 0.2s;
161
+ }
162
+ }
163
+
164
+ .form-elements {
165
+ grid-area: element-stack;
166
+ display: flex;
167
+ align-items: center;
168
+ justify-content: space-between;
169
+ gap: 1rem;
170
+ padding: var(--_form-padding);
171
+
172
+ .form-input {
173
+ border-radius: 50%;
174
+ display: flex;
175
+ place-content: center;
176
+ padding: var(--_form-padding);
177
+ outline: var(--_form-input-outline-width) solid gray;
178
+ opacity: 0.75;
179
+
180
+ &:has(input[value='auto']) {
181
+ background-color: green;
182
+
183
+ &:has(input[value='auto']:checked) {
184
+ --_scheme-marker-position: start;
185
+ outline: var(--_form-input-outline-width) solid var(--_border-color);
186
+ opacity: 1;
187
+ }
188
+ }
189
+
190
+ &:has(input[value='light']) {
191
+ background-color: orange;
192
+
193
+ &:has(input[value='light']:checked) {
194
+ --_scheme-marker-position: center;
195
+ outline: var(--_form-input-outline-width) solid var(--_border-color);
196
+ opacity: 1;
197
+ }
198
+ }
199
+
200
+ &:has(input[value='dark']) {
201
+ background-color: black;
202
+
203
+ &:has(input[value='dark']:checked) {
204
+ --_scheme-marker-position: end;
205
+ outline: var(--_form-input-outline-width) solid var(--_border-color);
206
+ opacity: 1;
207
+ }
208
+ }
209
+
210
+ input[type='radio'] {
211
+ opacity: 0;
212
+ height: var(--_icon-size);
213
+ width: var(--_icon-size);
214
+ margin: 0;
215
+ padding: 0;
216
+
217
+ &:hover {
218
+ cursor: pointer;
219
+ }
220
+ }
221
+ }
222
+ }
223
+ }
224
+ }
225
+ </style>
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <ToggleSwitchWithLabelInline v-model="displayMode" :name :label labelWeight="normal" :size trueValue="dark" falseValue="light" :style-class-passthrough>
2
+ <ToggleSwitchWithLabelInline v-model="currentColourScheme" :name :label labelWeight="normal" :size trueValue="dark" falseValue="light" :style-class-passthrough>
3
3
  <template #iconOn>
4
4
  <LazyIcon name="radix-icons:moon" class="icon" />
5
5
  </template>
@@ -41,7 +41,7 @@ defineProps({
41
41
  },
42
42
  });
43
43
 
44
- const displayMode = ref<'auto' | 'dark' | 'light'>('auto');
44
+ // const displayMode = ref<'auto' | 'dark' | 'light'>('auto');
45
45
 
46
- useColourScheme(displayMode);
46
+ const { currentColourScheme } = useColourScheme();
47
47
  </script>
@@ -1,41 +1,58 @@
1
- export const useColourScheme = (colourScheme: Ref<'auto' | 'dark' | 'light'> = ref('light')) => {
2
- const updateColourScheme = (newColourScheme: 'auto' | 'dark' | 'light') => {
3
- colourScheme.value = newColourScheme;
4
- };
1
+ export const useColourScheme = () => {
2
+ // const currentColourScheme = computed(() => {
3
+ // return colourScheme.value;
4
+ // });
5
+
6
+ const currentColourScheme = ref<'auto' | 'dark' | 'light' | null>(null);
7
+
8
+ // const updateColourScheme = (newColourScheme: 'auto' | 'dark' | 'light') => {
9
+ // colourScheme.value = newColourScheme;
10
+ // };
11
+
12
+ // const getSetPrefereredColourScheme = () => {
13
+ // if (import.meta.client) {
14
+ // if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches && !document.documentElement.dataset.colorScheme) {
15
+ // colourScheme.value = 'dark';
16
+ // } else {
17
+ // colourScheme.value = 'light';
18
+ // }
19
+ // }
20
+ // };
5
21
 
6
- const getSetPrefereredColourScheme = () => {
22
+ const returnSavedColourPreferenceFromLocalStorage = () => {
7
23
  if (import.meta.client) {
8
- if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches && !document.documentElement.dataset.colorScheme) {
9
- colourScheme.value = 'dark';
10
- } else {
11
- colourScheme.value = 'light';
12
- }
24
+ return localStorage.getItem('colourScheme') as 'auto' | 'dark' | 'light' | null;
13
25
  }
14
26
  };
15
27
 
16
28
  onMounted(() => {
17
- if (import.meta.client) {
18
- const storedMode = localStorage.getItem('colourScheme');
19
- if (storedMode) {
20
- colourScheme.value = storedMode as 'dark' | 'light';
21
- } else if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {
22
- colourScheme.value = 'dark';
23
- } else {
24
- colourScheme.value = 'light';
25
- }
26
- }
29
+ currentColourScheme.value = returnSavedColourPreferenceFromLocalStorage() || 'auto';
30
+ // colourScheme.value = currentColourScheme.value;
31
+ //
32
+ // if (import.meta.client) {
33
+ // const savedColourScheme = localStorage.getItem('colourScheme');
34
+ // if (savedColourScheme) {
35
+ // colourScheme.value = savedColourScheme as 'dark' | 'light';
36
+ // } else if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {
37
+ // colourScheme.value = 'dark';
38
+ // } else {
39
+ // colourScheme.value = 'light';
40
+ // }
41
+ // }
27
42
  });
28
43
 
29
- watch(colourScheme, (newVal) => {
30
- if (import.meta.client) {
44
+ watch(currentColourScheme, (newVal) => {
45
+ if (import.meta.client && newVal !== null) {
31
46
  localStorage.setItem('colourScheme', newVal);
32
47
  document.documentElement.dataset.colorScheme = newVal;
48
+ currentColourScheme.value = newVal;
33
49
  }
34
50
  });
35
51
 
36
52
  return {
37
- colourScheme,
38
- updateColourScheme,
39
- getSetPrefereredColourScheme,
53
+ currentColourScheme,
54
+ // colourScheme,
55
+ // updateColourScheme,
56
+ // getSetPrefereredColourScheme,
40
57
  };
41
58
  };
@@ -104,9 +104,8 @@ const useZodValidation = (formSchema: any, formRef: Ref<HTMLFormElement | null>)
104
104
  const fieldMaxLength = (name: string) => {
105
105
  const fieldSchema = formSchema.shape[name];
106
106
  if (fieldSchema instanceof z.ZodString) {
107
- return fieldSchema._def.checks.find((check) => check.kind === 'max')?.value || null;
107
+ return fieldSchema._def.checks.find((check) => check.kind === 'max')?.value;
108
108
  }
109
- return null;
110
109
  };
111
110
 
112
111
  const scrollToFirstError = async () => {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "srcdev-nuxt-forms",
3
3
  "type": "module",
4
- "version": "2.4.4",
4
+ "version": "2.4.6",
5
5
  "main": "nuxt.config.ts",
6
6
  "scripts": {
7
7
  "clean": "rm -rf .nuxt && rm -rf .output && rm -rf .playground/.nuxt && rm -rf .playground/.output",