srcdev-nuxt-forms 6.1.10 → 6.1.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.
@@ -0,0 +1,259 @@
1
+ <template>
2
+ <div class="triple-toggle-switch" :data-size="size" :data-theme="theme">
3
+ <div class="triple-toggle-switch-wrapper">
4
+ <div class="selected-option-marker-wrapper">
5
+ <div class="selected-option-marker" :class="[{ show: showMarker }]"></div>
6
+ </div>
7
+ <div class="option-group-wrapper">
8
+ <label
9
+ v-for="(option, index) in fieldData.data"
10
+ :key="option.id"
11
+ :for="option.id"
12
+ class="option-group"
13
+ ref="optionGroup"
14
+ >
15
+ <span class="sr-only">{{ option.label }}</span>
16
+ <Icon v-if="option.icon" :name="option.icon" class="option-icon" ref="optionIcons" />
17
+ <input
18
+ type="radio"
19
+ :id="option.id"
20
+ name="colour-scheme"
21
+ class="option-input"
22
+ v-model="modelValue"
23
+ :value="option.value"
24
+ :aria-selected="modelValue === option.value"
25
+ />
26
+ </label>
27
+ </div>
28
+ </div>
29
+ </div>
30
+ </template>
31
+
32
+ <script setup lang="ts">
33
+ import propValidators from "../../forms/c12/prop-validators"
34
+
35
+ const props = defineProps({
36
+ name: {
37
+ type: String,
38
+ defaul: "triple-toggle-switch",
39
+ },
40
+ size: {
41
+ type: String as PropType<string>,
42
+ default: "medium",
43
+ validator(value: string) {
44
+ return propValidators.size.includes(value)
45
+ },
46
+ },
47
+ theme: {
48
+ type: String as PropType<string>,
49
+ default: "primary",
50
+ validator(value: string) {
51
+ return propValidators.theme.includes(value)
52
+ },
53
+ },
54
+ stepAnimationDuration: {
55
+ type: Number as PropType<number>,
56
+ default: 100,
57
+ },
58
+ styleClassPassthrough: {
59
+ type: Array as PropType<string[]>,
60
+ default: () => [],
61
+ },
62
+ })
63
+
64
+ const modelValue = defineModel()
65
+
66
+ const fieldData = defineModel("fieldData") as Ref<IFormMultipleOptions>
67
+
68
+ const optionGroupRefs = useTemplateRef<HTMLDivElement>("optionGroup")
69
+
70
+ const iconWidth = ref("0px")
71
+ const showMarker = ref(false)
72
+
73
+ const selectedOptionIndex = computed(() => {
74
+ return fieldData.value.data.findIndex((option) => option.value === modelValue.value)
75
+ })
76
+
77
+ const setupDefaults = () => {
78
+ if (Array.isArray(optionGroupRefs.value) && optionGroupRefs.value[0]) {
79
+ iconWidth.value = optionGroupRefs.value[0].getBoundingClientRect().width + "px"
80
+ }
81
+ }
82
+
83
+ onMounted(() => {
84
+ setupDefaults()
85
+ })
86
+ </script>
87
+
88
+ <style lang="css">
89
+ .triple-toggle-switch {
90
+ --_form-border-colour: var(--theme-form-radio-border);
91
+
92
+ --_form-outline-colour: var(--theme-form-radio-outline);
93
+
94
+ --_form-border-radius: calc(
95
+ (var(--_scheme-icon-font-size) / 2) + var(--form-element-border-width) + var(--form-element-outline-width) +
96
+ var(--_form-padding) + var(--_select-scheme-group-padding) + var(--form-element-border-width) +
97
+ var(--form-element-outline-width)
98
+ );
99
+
100
+ --_form-items-gap: 1rem;
101
+ --_form-padding: 0.6rem;
102
+
103
+ --_select-scheme-group-background-color: var(--theme-form-checkbox-bg);
104
+ --_select-scheme-group-background-image: none;
105
+ --_select-scheme-group-padding: 0.5rem;
106
+ --_scheme-icon-font-size: 2rem;
107
+ --_scheme-icon-colour: black;
108
+
109
+ &:has(input[value="auto"]:checked) {
110
+ --_select-scheme-group-background-color: transparent;
111
+ --_select-scheme-group-background-image: radial-gradient(
112
+ circle,
113
+ rgb(66, 180, 58) 0%,
114
+ rgb(17, 199, 0) 27%,
115
+ rgb(8, 117, 3) 100%
116
+ );
117
+ }
118
+
119
+ &:has(input[value="light"]:checked) {
120
+ --_select-scheme-group-background-color: transparent;
121
+ --_select-scheme-group-background-image: radial-gradient(
122
+ circle,
123
+ rgba(180, 58, 91, 1) 0%,
124
+ rgba(253, 29, 29, 1) 27%,
125
+ rgba(252, 176, 69, 1) 100%
126
+ );
127
+ }
128
+
129
+ &:has(input[value="dark"]:checked) {
130
+ --_select-scheme-group-background-color: transparent;
131
+ --_select-scheme-group-background-image: radial-gradient(
132
+ circle,
133
+ rgb(50, 20, 25) 0%,
134
+ rgb(0, 0, 0) 27%,
135
+ rgb(100, 100, 100) 100%
136
+ );
137
+ }
138
+
139
+ .triple-toggle-switch-wrapper {
140
+ display: inline-grid;
141
+ grid-template-areas: "select-stack";
142
+ width: fit-content;
143
+
144
+ background-color: var(--theme-input-surface);
145
+ border: var(--form-element-border-width) solid var(--theme-input-border);
146
+ outline: var(--form-element-outline-width) solid var(--theme-input-outline);
147
+ border-radius: var(--_form-border-radius);
148
+ padding: var(--_form-padding);
149
+
150
+ transition: all var(--theme-form-transition-duration) ease-in-out;
151
+
152
+ &:has(input:focus-visible) {
153
+ outline: var(--form-element-outline-width) solid var(--theme-input-outline-hover);
154
+ outline-offset: 0.2rem;
155
+ }
156
+
157
+ .selected-option-marker-wrapper {
158
+ grid-area: select-stack;
159
+ z-index: 1;
160
+ display: flex;
161
+ align-items: center;
162
+ position: relative;
163
+
164
+ .selected-option-marker {
165
+ aspect-ratio: 1;
166
+ width: v-bind(iconWidth);
167
+ transition: all 400ms ease-in-out;
168
+ background-color: var(--_select-scheme-group-background-color);
169
+ background-image: var(--_select-scheme-group-background-image);
170
+ border: var(--form-element-border-width) solid light-dark(var(--gray-12), var(--gray-0));
171
+
172
+ border-radius: 50%;
173
+
174
+ position: absolute;
175
+ left: calc(
176
+ v-bind(selectedOptionIndex) * v-bind(iconWidth) + (var(--_form-items-gap) * v-bind(selectedOptionIndex))
177
+ );
178
+
179
+ opacity: 1;
180
+
181
+ &.show {
182
+ opacity: 1;
183
+ }
184
+ }
185
+ }
186
+
187
+ .option-group-wrapper {
188
+ display: grid;
189
+ grid-area: select-stack;
190
+ grid-template-columns: repeat(3, 1fr);
191
+ align-items: center;
192
+ width: fit-content;
193
+ z-index: 2;
194
+ gap: var(--_form-items-gap);
195
+ position: relative;
196
+
197
+ .option-group {
198
+ aspect-ratio: 1;
199
+ display: grid;
200
+ grid-template-areas: "icon-stack";
201
+ place-content: center;
202
+ background: transparent;
203
+ border: var(--form-element-border-width) solid #ffffff50;
204
+ outline: var(--form-element-outline-width) solid transparent;
205
+ border-radius: 50%;
206
+ padding: var(--_select-scheme-group-padding);
207
+ overflow: hidden;
208
+
209
+ transition: all calc(var(--theme-form-transition-duration) / 3);
210
+
211
+ &:has(.option-icon:hover) {
212
+ outline: var(--form-element-outline-width) solid light-dark(var(--gray-12), var(--gray-0));
213
+ }
214
+ &:has(input:focus-visible) {
215
+ outline: var(--form-element-outline-width) solid var(--theme-input-outline-hover);
216
+ outline-offset: 0.2rem;
217
+ }
218
+
219
+ .option-icon {
220
+ grid-area: icon-stack;
221
+ display: block;
222
+ color: light-dark(var(--gray-12), var(--gray-0));
223
+ font-size: var(--_scheme-icon-font-size);
224
+
225
+ .icon {
226
+ background-color: transparent;
227
+ }
228
+
229
+ &:hover {
230
+ cursor: pointer;
231
+ }
232
+ }
233
+
234
+ .option-input {
235
+ grid-area: icon-stack;
236
+ opacity: 0;
237
+ aspect-ratio: 1;
238
+ width: var(--_scheme-icon-font-size);
239
+ &:hover {
240
+ cursor: pointer;
241
+ }
242
+ }
243
+
244
+ &:has(input[value="auto"]:checked) {
245
+ --_scheme-icon-colour: white;
246
+ }
247
+
248
+ &:has(input[value="light"]:checked) {
249
+ --_scheme-icon-colour: white;
250
+ }
251
+
252
+ &:has(input[value="dark"]:checked) {
253
+ --_scheme-icon-colour: white;
254
+ }
255
+ }
256
+ }
257
+ }
258
+ }
259
+ </style>
@@ -54,10 +54,10 @@ defineProps({
54
54
 
55
55
  const colourMode = ref<"light" | "dark" | "auto">("dark")
56
56
 
57
- const { currentColourScheme, setColourScheme } = useSettingsStore()
57
+ // const { currentColourScheme, setColourScheme } = useSettingsStore()
58
58
 
59
59
  watch(colourMode, (newVal) => {
60
- console.log("Colour mode changed:", newVal)
61
- setColourScheme(newVal)
60
+ // console.log("Colour mode changed:", newVal)
61
+ // setColourScheme(newVal)
62
62
  })
63
63
  </script>
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "srcdev-nuxt-forms",
3
3
  "type": "module",
4
- "version": "6.1.10",
4
+ "version": "6.1.12",
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",
@@ -1,28 +0,0 @@
1
- // const delay = (t: number) => new Promise((r) => setTimeout(r, t))
2
-
3
- export const useSettingsStore = defineStore(
4
- "settingsStore",
5
- () => {
6
- // State
7
- const colourScheme = ref<"auto" | "dark" | "light" | null>(null)
8
-
9
- // Getters
10
- const currentColourScheme = computed(() => colourScheme.value)
11
-
12
- // Actions
13
- const setColourScheme = (state: "auto" | "dark" | "light" | null) => {
14
- console.log("Setting colour scheme:", state)
15
- colourScheme.value = state
16
- }
17
-
18
- return {
19
- currentColourScheme,
20
- setColourScheme,
21
- }
22
- },
23
- {
24
- persist: {
25
- storage: piniaPluginPersistedstate.cookies(),
26
- },
27
- }
28
- )