vueless 0.0.702 → 0.0.704
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.
- package/bin/constants.js +2 -2
- package/constants.js +2 -2
- package/package.json +1 -1
- package/ui.button/config.ts +8 -26
- package/ui.button/storybook/stories.ts +0 -3
- package/ui.button/types.ts +0 -5
- package/ui.button-link/config.ts +3 -9
- package/ui.button-link/storybook/stories.ts +0 -3
- package/ui.button-link/types.ts +0 -5
- package/ui.button-toggle/UToggle.vue +0 -1
- package/ui.button-toggle/config.ts +1 -6
- package/ui.button-toggle/types.ts +0 -5
- package/ui.button-toggle-item/UToggleItem.vue +0 -2
- package/ui.button-toggle-item/config.ts +1 -1
- package/ui.container-modal/UModal.vue +0 -1
- package/ui.container-page/UPage.vue +0 -1
- package/ui.dropdown-badge/config.ts +4 -5
- package/ui.dropdown-badge/storybook/stories.ts +0 -1
- package/ui.dropdown-button/config.ts +4 -5
- package/ui.dropdown-button/storybook/stories.ts +0 -1
- package/ui.dropdown-link/UDropdownLink.vue +0 -1
- package/ui.dropdown-link/config.ts +3 -7
- package/ui.dropdown-link/storybook/stories.ts +0 -3
- package/ui.dropdown-link/types.ts +0 -5
- package/ui.dropdown-list/config.ts +7 -3
- package/ui.dropdown-list/storybook/stories.ts +1 -0
- package/ui.form-calendar/UCalendar.vue +0 -4
- package/ui.form-calendar/UCalendarDayView.vue +0 -13
- package/ui.form-calendar/UCalendarMonthView.vue +0 -12
- package/ui.form-calendar/UCalendarYearView.vue +0 -12
- package/ui.form-checkbox/config.ts +9 -6
- package/ui.form-color-picker/UColorPicker.vue +0 -1
- package/ui.form-date-picker-range/UDatePickerRange.vue +0 -3
- package/ui.form-date-picker-range/UDatePickerRangePeriodMenu.vue +0 -12
- package/ui.form-date-picker-range/config.ts +7 -20
- package/ui.form-input/UInput.vue +2 -8
- package/ui.form-input/config.ts +6 -16
- package/ui.form-input/storybook/stories.ts +36 -22
- package/ui.form-input/types.ts +1 -1
- package/ui.form-input-file/UInputFile.vue +1 -2
- package/ui.form-input-file/config.ts +4 -7
- package/ui.form-input-money/UInputMoney.vue +5 -4
- package/ui.form-input-money/storybook/stories.ts +126 -49
- package/ui.form-input-number/storybook/stories.ts +43 -21
- package/ui.form-input-rating/UInputRating.vue +1 -0
- package/ui.form-input-rating/config.ts +5 -0
- package/ui.form-input-rating/storybook/stories.ts +62 -19
- package/ui.form-input-rating/types.ts +12 -7
- package/ui.form-input-search/UInputSearch.vue +1 -1
- package/ui.form-input-search/config.ts +8 -11
- package/ui.form-input-search/storybook/stories.ts +110 -31
- package/ui.form-input-search/types.ts +6 -6
- package/ui.form-label/config.ts +3 -3
- package/ui.form-radio/URadio.vue +5 -2
- package/ui.form-radio/config.ts +12 -6
- package/ui.form-radio-group/URadioGroup.vue +1 -0
- package/ui.form-select/config.ts +4 -7
- package/ui.form-switch/USwitch.vue +8 -2
- package/ui.form-switch/config.ts +11 -8
- package/ui.form-switch/types.ts +0 -1
- package/ui.form-textarea/config.ts +8 -14
- package/ui.navigation-breadcrumbs/UBreadcrumbs.vue +0 -1
- package/ui.navigation-breadcrumbs/types.ts +1 -1
- package/ui.navigation-pagination/UPagination.vue +22 -10
- package/ui.navigation-pagination/config.ts +15 -17
- package/ui.navigation-tab/UTab.vue +58 -20
- package/ui.navigation-tab/config.ts +14 -14
- package/ui.navigation-tab/storybook/stories.ts +1 -1
- package/ui.navigation-tab/types.ts +15 -4
- package/ui.navigation-tabs/UTabs.vue +6 -4
- package/ui.navigation-tabs/config.ts +4 -15
- package/ui.navigation-tabs/storybook/stories.ts +0 -3
- package/ui.navigation-tabs/types.ts +8 -3
- package/ui.text-alert/UAlert.vue +0 -1
- package/ui.text-badge/config.ts +3 -6
- package/ui.text-file/UFile.vue +2 -9
|
@@ -4,18 +4,13 @@ export default /*tw*/ {
|
|
|
4
4
|
base: "{UInput} {>searchInput}",
|
|
5
5
|
rightSlot: "pr-0",
|
|
6
6
|
},
|
|
7
|
-
|
|
7
|
+
inputIcon: {
|
|
8
8
|
base: "{UIcon}",
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
md: "sm",
|
|
13
|
-
lg: "md",
|
|
9
|
+
variants: {
|
|
10
|
+
disabled: {
|
|
11
|
+
true: "text-gray-400 pointer-events-none",
|
|
14
12
|
},
|
|
15
13
|
},
|
|
16
|
-
},
|
|
17
|
-
searchIcon: {
|
|
18
|
-
base: "{UIcon}",
|
|
19
14
|
defaults: {
|
|
20
15
|
size: {
|
|
21
16
|
sm: "xs",
|
|
@@ -24,13 +19,15 @@ export default /*tw*/ {
|
|
|
24
19
|
},
|
|
25
20
|
},
|
|
26
21
|
},
|
|
22
|
+
clearIcon: "{>inputIcon}",
|
|
23
|
+
searchIcon: "{>inputIcon}",
|
|
27
24
|
searchButton: {
|
|
28
25
|
base: "{UButton} rounded-l-none ml-1 outline outline-1 outline-gray-900",
|
|
29
26
|
defaults: {
|
|
30
27
|
size: {
|
|
31
28
|
sm: "xs",
|
|
32
|
-
md: "
|
|
33
|
-
lg: "
|
|
29
|
+
md: "sm",
|
|
30
|
+
lg: "md",
|
|
34
31
|
},
|
|
35
32
|
},
|
|
36
33
|
},
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { computed } from "vue";
|
|
1
2
|
import {
|
|
2
3
|
getArgTypes,
|
|
3
4
|
getSlotNames,
|
|
@@ -8,14 +9,17 @@ import {
|
|
|
8
9
|
import UInputSearch from "../../ui.form-input-search/UInputSearch.vue";
|
|
9
10
|
import UButton from "../../ui.button/UButton.vue";
|
|
10
11
|
import UIcon from "../../ui.image-icon/UIcon.vue";
|
|
12
|
+
import UCol from "../../ui.container-col/UCol.vue";
|
|
11
13
|
import URow from "../../ui.container-row/URow.vue";
|
|
14
|
+
import UAvatar from "../../ui.image-avatar/UAvatar.vue";
|
|
15
|
+
import UBadge from "../../ui.text-badge/UBadge.vue";
|
|
12
16
|
|
|
13
17
|
import type { Meta, StoryFn } from "@storybook/vue3";
|
|
14
18
|
import type { Props } from "../types.ts";
|
|
15
19
|
|
|
16
20
|
interface UInputSearchArgs extends Props {
|
|
17
21
|
slotTemplate?: string;
|
|
18
|
-
enum: "size";
|
|
22
|
+
enum: "size" | "labelAlign";
|
|
19
23
|
}
|
|
20
24
|
|
|
21
25
|
export default {
|
|
@@ -25,6 +29,9 @@ export default {
|
|
|
25
29
|
argTypes: {
|
|
26
30
|
...getArgTypes(UInputSearch.__name),
|
|
27
31
|
},
|
|
32
|
+
args: {
|
|
33
|
+
modelValue: "Which UI library is the best?",
|
|
34
|
+
},
|
|
28
35
|
parameters: {
|
|
29
36
|
docs: {
|
|
30
37
|
...getDocsDescription(UInputSearch.__name),
|
|
@@ -36,70 +43,142 @@ const DefaultTemplate: StoryFn<UInputSearchArgs> = (args: UInputSearchArgs) => (
|
|
|
36
43
|
components: { UInputSearch, UButton, UIcon },
|
|
37
44
|
setup() {
|
|
38
45
|
const slots = getSlotNames(UInputSearch.__name);
|
|
46
|
+
const errorMessage = computed(() =>
|
|
47
|
+
args.modelValue === "" && args.error !== ""
|
|
48
|
+
? "This field is required. Please enter a value."
|
|
49
|
+
: "",
|
|
50
|
+
);
|
|
39
51
|
|
|
40
|
-
return { args, slots };
|
|
52
|
+
return { args, slots, errorMessage };
|
|
41
53
|
},
|
|
42
54
|
template: `
|
|
43
|
-
<UInputSearch
|
|
55
|
+
<UInputSearch
|
|
56
|
+
v-bind="args"
|
|
57
|
+
v-model="args.modelValue"
|
|
58
|
+
:error="errorMessage"
|
|
59
|
+
class="max-w-96"
|
|
60
|
+
>
|
|
44
61
|
${args.slotTemplate || getSlotsFragment("")}
|
|
45
62
|
</UInputSearch>
|
|
46
63
|
`,
|
|
47
64
|
});
|
|
48
65
|
|
|
49
66
|
const EnumVariantTemplate: StoryFn<UInputSearchArgs> = (args: UInputSearchArgs, { argTypes }) => ({
|
|
50
|
-
components: { UInputSearch,
|
|
67
|
+
components: { UInputSearch, UCol },
|
|
51
68
|
setup() {
|
|
69
|
+
let filteredOptions = argTypes?.[args.enum]?.options;
|
|
70
|
+
|
|
71
|
+
if (args.enum === "labelAlign") {
|
|
72
|
+
filteredOptions = argTypes?.[args.enum]?.options?.filter(
|
|
73
|
+
(item) => item !== "right" && item !== "topWithDesc",
|
|
74
|
+
);
|
|
75
|
+
}
|
|
76
|
+
|
|
52
77
|
return {
|
|
53
78
|
args,
|
|
54
|
-
|
|
79
|
+
filteredOptions,
|
|
55
80
|
};
|
|
56
81
|
},
|
|
57
82
|
template: `
|
|
58
|
-
<
|
|
83
|
+
<UCol>
|
|
59
84
|
<UInputSearch
|
|
60
|
-
v-for="(option, index) in
|
|
85
|
+
v-for="(option, index) in filteredOptions"
|
|
61
86
|
:key="index"
|
|
62
87
|
v-bind="args"
|
|
63
88
|
v-model="args.modelValue"
|
|
64
89
|
:[args.enum]="option"
|
|
90
|
+
:placeholder="option"
|
|
91
|
+
class="max-w-96"
|
|
65
92
|
>
|
|
66
93
|
</UInputSearch>
|
|
67
|
-
</
|
|
94
|
+
</UCol>
|
|
68
95
|
`,
|
|
69
96
|
});
|
|
70
97
|
|
|
71
98
|
export const Default = DefaultTemplate.bind({});
|
|
72
99
|
Default.args = {};
|
|
73
100
|
|
|
74
|
-
export const
|
|
75
|
-
|
|
101
|
+
export const Label = DefaultTemplate.bind({});
|
|
102
|
+
Label.args = { label: "Search for product or brand" };
|
|
76
103
|
|
|
77
|
-
export const
|
|
78
|
-
|
|
104
|
+
export const Placeholder = DefaultTemplate.bind({});
|
|
105
|
+
Placeholder.args = { modelValue: "", placeholder: "Type to search...", error: "" };
|
|
106
|
+
|
|
107
|
+
export const Description = DefaultTemplate.bind({});
|
|
108
|
+
Description.args = { description: "Search for additional details." };
|
|
109
|
+
|
|
110
|
+
export const Error = DefaultTemplate.bind({});
|
|
111
|
+
Error.args = { modelValue: "" };
|
|
112
|
+
|
|
113
|
+
export const Disabled = DefaultTemplate.bind({});
|
|
114
|
+
Disabled.args = { disabled: true };
|
|
79
115
|
|
|
80
116
|
export const Sizes = EnumVariantTemplate.bind({});
|
|
81
|
-
Sizes.args = { enum: "size" };
|
|
117
|
+
Sizes.args = { enum: "size", modelValue: "" };
|
|
82
118
|
|
|
83
|
-
export const
|
|
84
|
-
|
|
119
|
+
export const LabelPlacement = EnumVariantTemplate.bind({});
|
|
120
|
+
LabelPlacement.args = { enum: "labelAlign", modelValue: "", label: "Search for product or brand" };
|
|
85
121
|
|
|
86
|
-
export const
|
|
87
|
-
|
|
122
|
+
export const SearchButton = DefaultTemplate.bind({});
|
|
123
|
+
SearchButton.args = { searchButtonLabel: "Search" };
|
|
124
|
+
SearchButton.parameters = {
|
|
125
|
+
docs: {
|
|
126
|
+
description: {
|
|
127
|
+
story:
|
|
128
|
+
// eslint-disable-next-line vue/max-len
|
|
129
|
+
"`searchButtonLabel` prop shows a button with a passed label instead of the default search icon. When clicked, it triggers the search event.",
|
|
130
|
+
},
|
|
131
|
+
},
|
|
132
|
+
};
|
|
88
133
|
|
|
89
|
-
export const
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
134
|
+
export const MinLength = DefaultTemplate.bind({});
|
|
135
|
+
MinLength.args = { minLength: 4 };
|
|
136
|
+
MinLength.parameters = {
|
|
137
|
+
docs: {
|
|
138
|
+
description: {
|
|
139
|
+
story:
|
|
140
|
+
"Determines minimum character length for search. If not met, search event is not fired.",
|
|
141
|
+
},
|
|
142
|
+
},
|
|
96
143
|
};
|
|
97
144
|
|
|
98
|
-
export const
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
145
|
+
export const IconProps: StoryFn<UInputSearchArgs> = (args) => ({
|
|
146
|
+
components: { UInputSearch, URow },
|
|
147
|
+
setup() {
|
|
148
|
+
return { args };
|
|
149
|
+
},
|
|
150
|
+
template: `
|
|
151
|
+
<URow>
|
|
152
|
+
<UInputSearch
|
|
153
|
+
left-icon="travel_explore"
|
|
154
|
+
placeholder="Search for a travel destination"
|
|
155
|
+
/>
|
|
156
|
+
<UInputSearch
|
|
157
|
+
right-icon="person_search"
|
|
158
|
+
placeholder="Search for a person"
|
|
159
|
+
/>
|
|
160
|
+
</URow>
|
|
104
161
|
`,
|
|
105
|
-
};
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
export const Slots: StoryFn<UInputSearchArgs> = (args) => ({
|
|
165
|
+
components: { UInputSearch, URow, UButton, UAvatar, UBadge },
|
|
166
|
+
setup() {
|
|
167
|
+
return { args };
|
|
168
|
+
},
|
|
169
|
+
template: `
|
|
170
|
+
<URow no-mobile>
|
|
171
|
+
<UInputSearch v-bind="args" :config="{ searchInput: { leftSlot: 'pl-0' } }">
|
|
172
|
+
<template #left>
|
|
173
|
+
<UAvatar size="sm" />
|
|
174
|
+
</template>
|
|
175
|
+
</UInputSearch>
|
|
176
|
+
|
|
177
|
+
<UInputSearch v-bind="args" :config="{ searchInput: { rightSlot: 'pr-0' } }">
|
|
178
|
+
<template #right>
|
|
179
|
+
<UBadge label="Search" size="sm" color="green" />
|
|
180
|
+
</template>
|
|
181
|
+
</UInputSearch>
|
|
182
|
+
</URow>
|
|
183
|
+
`,
|
|
184
|
+
});
|
|
@@ -5,6 +5,11 @@ import type { ComponentConfig } from "../types.ts";
|
|
|
5
5
|
export type Config = typeof defaultConfig;
|
|
6
6
|
|
|
7
7
|
export interface Props {
|
|
8
|
+
/**
|
|
9
|
+
* Input label.
|
|
10
|
+
*/
|
|
11
|
+
label?: string;
|
|
12
|
+
|
|
8
13
|
/**
|
|
9
14
|
* Search input value.
|
|
10
15
|
*/
|
|
@@ -23,12 +28,7 @@ export interface Props {
|
|
|
23
28
|
/**
|
|
24
29
|
* Label placement.
|
|
25
30
|
*/
|
|
26
|
-
labelAlign?: "
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* Input label.
|
|
30
|
-
*/
|
|
31
|
-
label?: string;
|
|
31
|
+
labelAlign?: "topInside" | "top" | "topWithDesc" | "left" | "right";
|
|
32
32
|
|
|
33
33
|
/**
|
|
34
34
|
* Input description.
|
package/ui.form-label/config.ts
CHANGED
|
@@ -33,13 +33,13 @@ export default /*tw*/ {
|
|
|
33
33
|
},
|
|
34
34
|
align: {
|
|
35
35
|
top: "font-medium",
|
|
36
|
-
topInside: "font-normal absolute left-3 text-gray-500 group-focus-within:text-brand-
|
|
36
|
+
topInside: "font-normal absolute left-3 text-gray-500 group-focus-within:text-brand-600",
|
|
37
37
|
topWithDesc: "font-medium",
|
|
38
38
|
left: "font-normal",
|
|
39
39
|
right: "font-normal",
|
|
40
40
|
},
|
|
41
41
|
error: {
|
|
42
|
-
true: "text-red-
|
|
42
|
+
true: "text-red-600 group-focus-within:text-red-600",
|
|
43
43
|
},
|
|
44
44
|
disabled: {
|
|
45
45
|
true: "text-gray-500 cursor-not-allowed",
|
|
@@ -75,7 +75,7 @@ export default /*tw*/ {
|
|
|
75
75
|
right: "pt-0.5",
|
|
76
76
|
},
|
|
77
77
|
error: {
|
|
78
|
-
true: "text-red-
|
|
78
|
+
true: "text-red-600",
|
|
79
79
|
},
|
|
80
80
|
},
|
|
81
81
|
},
|
package/ui.form-radio/URadio.vue
CHANGED
|
@@ -21,6 +21,7 @@ const setRadioGroupSelectedItem = inject<SetRadioGroupSelectedItem>(
|
|
|
21
21
|
const getRadioGroupName = inject("getRadioGroupName", null);
|
|
22
22
|
const getRadioGroupColor = inject("getRadioGroupColor", null);
|
|
23
23
|
const getRadioGroupSize = inject("getRadioGroupSize", null);
|
|
24
|
+
const getRadioGroupDisabled = inject("getRadioGroupDisabled", null);
|
|
24
25
|
const getRadioGroupSelectedItem = inject("getRadioGroupSelectedItem", null);
|
|
25
26
|
|
|
26
27
|
const props = withDefaults(defineProps<Props>(), {
|
|
@@ -42,6 +43,7 @@ const localValue = ref<LocalValueType>("");
|
|
|
42
43
|
const radioName = ref("");
|
|
43
44
|
const radioColor = ref(toValue(getRadioGroupColor) || props.color);
|
|
44
45
|
const radioSize = ref(toValue(getRadioGroupSize) || props.size);
|
|
46
|
+
const radioDisabled = ref(toValue(getRadioGroupDisabled) || props.disabled);
|
|
45
47
|
|
|
46
48
|
const isChecked = computed(() => {
|
|
47
49
|
const currentValue = props.modelValue ?? localValue.value;
|
|
@@ -65,6 +67,7 @@ onMounted(() => {
|
|
|
65
67
|
|
|
66
68
|
watchEffect(() => (radioColor.value = toValue(getRadioGroupColor) || props.color));
|
|
67
69
|
watchEffect(() => (radioSize.value = toValue(getRadioGroupSize) || props.size));
|
|
70
|
+
watchEffect(() => (radioDisabled.value = toValue(getRadioGroupDisabled) || props.disabled));
|
|
68
71
|
watchEffect(() => {
|
|
69
72
|
localValue.value = toValue(getRadioGroupSelectedItem) || null;
|
|
70
73
|
emit("update:modelValue", props.value);
|
|
@@ -101,7 +104,7 @@ const { radioAttrs, radioLabelAttrs } = useUI<Config>(defaultConfig, mutatedProp
|
|
|
101
104
|
:error="error"
|
|
102
105
|
:size="radioSize"
|
|
103
106
|
:align="labelAlign"
|
|
104
|
-
:disabled="
|
|
107
|
+
:disabled="radioDisabled"
|
|
105
108
|
:description="description"
|
|
106
109
|
interactive
|
|
107
110
|
v-bind="radioLabelAttrs"
|
|
@@ -121,7 +124,7 @@ const { radioAttrs, radioLabelAttrs } = useUI<Config>(defaultConfig, mutatedProp
|
|
|
121
124
|
:value="radioValue"
|
|
122
125
|
:name="radioName"
|
|
123
126
|
:checked="checked || isChecked"
|
|
124
|
-
:disabled="
|
|
127
|
+
:disabled="radioDisabled"
|
|
125
128
|
v-bind="radioAttrs"
|
|
126
129
|
:data-test="dataTest"
|
|
127
130
|
@change="onChange"
|
package/ui.form-radio/config.ts
CHANGED
|
@@ -2,11 +2,14 @@ export default /*tw*/ {
|
|
|
2
2
|
radioLabel: "{ULabel}",
|
|
3
3
|
radio: {
|
|
4
4
|
base: `
|
|
5
|
-
border cursor-pointer transition
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
checked:
|
|
5
|
+
border border-gray-300 bg-white cursor-pointer transition
|
|
6
|
+
hover:border-gray-400
|
|
7
|
+
active:border-{color}-600 active:bg-{color}-200
|
|
8
|
+
focus:ring-0 focus:ring-offset-0
|
|
9
|
+
checked:text-{color}-600
|
|
10
|
+
focus-visible:ring-{color}-600 focus-visible:ring-dynamic focus-visible:ring-offset-dynamic
|
|
11
|
+
disabled:border-gray-300 disabled:bg-gray-100 disabled:cursor-not-allowed
|
|
12
|
+
disabled:checked:bg-gray-400 disabled:checked:border-transparent
|
|
10
13
|
`,
|
|
11
14
|
variants: {
|
|
12
15
|
size: {
|
|
@@ -15,7 +18,10 @@ export default /*tw*/ {
|
|
|
15
18
|
lg: "size-6",
|
|
16
19
|
},
|
|
17
20
|
color: {
|
|
18
|
-
grayscale:
|
|
21
|
+
grayscale: `
|
|
22
|
+
focus-visible:ring-gray-900
|
|
23
|
+
checked:text-gray-900 checked:hover:text-gray-800 checked:active:text-gray-700
|
|
24
|
+
`,
|
|
19
25
|
},
|
|
20
26
|
},
|
|
21
27
|
},
|
|
@@ -41,6 +41,7 @@ provide("getRadioGroupSelectedItem", () => selectedItem.value);
|
|
|
41
41
|
provide("getRadioGroupName", () => props.name);
|
|
42
42
|
provide("getRadioGroupColor", () => props.color);
|
|
43
43
|
provide("getRadioGroupSize", () => props.size);
|
|
44
|
+
provide("getRadioGroupDisabled", () => props.disabled);
|
|
44
45
|
|
|
45
46
|
/**
|
|
46
47
|
* Get element / nested component attributes for each config token ✨
|
package/ui.form-select/config.ts
CHANGED
|
@@ -4,16 +4,13 @@ export default /*tw*/ {
|
|
|
4
4
|
base: `
|
|
5
5
|
flex flex-row-reverse justify-between w-full min-h-full box-border relative
|
|
6
6
|
rounded-dynamic border border-gray-300 bg-white
|
|
7
|
-
hover:border-gray-400 hover:transition hover:focus-within:border-brand-
|
|
8
|
-
focus-within:ring-brand-
|
|
9
|
-
focus-within:border-brand-
|
|
7
|
+
hover:border-gray-400 hover:transition hover:focus-within:border-brand-600
|
|
8
|
+
focus-within:ring-brand-600 focus-within:ring-dynamic focus-within:ring-offset-0
|
|
9
|
+
focus-within:border-brand-600 focus-within:outline-none
|
|
10
10
|
`,
|
|
11
11
|
variants: {
|
|
12
12
|
error: {
|
|
13
|
-
true:
|
|
14
|
-
bg-red-50 border-red-300 hover:border-red-300
|
|
15
|
-
focus-within:border-red-500 focus-within:ring-red-700/15
|
|
16
|
-
`,
|
|
13
|
+
true: "!border-red-600 focus-within:ring-red-600",
|
|
17
14
|
},
|
|
18
15
|
disabled: {
|
|
19
16
|
true: `
|
|
@@ -108,15 +108,21 @@ const {
|
|
|
108
108
|
<slot name="label" :label="label" />
|
|
109
109
|
</template>
|
|
110
110
|
|
|
111
|
-
<label
|
|
111
|
+
<label
|
|
112
|
+
tabindex="0"
|
|
113
|
+
:for="elementId"
|
|
114
|
+
v-bind="wrapperAttrs"
|
|
115
|
+
@keydown.enter="onKeydownSpace"
|
|
116
|
+
@keydown.space.prevent="onKeydownSpace"
|
|
117
|
+
>
|
|
112
118
|
<input
|
|
113
119
|
:id="elementId"
|
|
114
120
|
v-model="checkedValue"
|
|
121
|
+
tabindex="-1"
|
|
115
122
|
type="checkbox"
|
|
116
123
|
:disabled="disabled"
|
|
117
124
|
v-bind="inputAttrs"
|
|
118
125
|
@click="onClickToggle"
|
|
119
|
-
@keydown.space="onKeydownSpace"
|
|
120
126
|
/>
|
|
121
127
|
|
|
122
128
|
<span v-bind="circleAttrs">
|
package/ui.form-switch/config.ts
CHANGED
|
@@ -2,32 +2,35 @@ export default /*tw*/ {
|
|
|
2
2
|
switchLabel: "{ULabel}",
|
|
3
3
|
wrapper: {
|
|
4
4
|
base: `
|
|
5
|
-
flex items-center p-0.5 relative rounded-
|
|
6
|
-
focus-
|
|
5
|
+
flex items-center p-0.5 relative rounded-full cursor-pointer transition
|
|
6
|
+
focus-visible:ring-dynamic focus-visible:ring-offset-dynamic ring-{color}-600 outline-0
|
|
7
7
|
`,
|
|
8
8
|
variants: {
|
|
9
|
-
checked: {
|
|
10
|
-
true: "bg-{color}-600 ring-{color}-700/15 hover:bg-{color}-700 active:bg-{color}-800",
|
|
11
|
-
false: "bg-gray-300 ring-gray-700/15 hover:bg-gray-400 active:bg-gray-500",
|
|
12
|
-
},
|
|
13
9
|
size: {
|
|
14
10
|
sm: "w-6",
|
|
15
11
|
md: "w-8",
|
|
16
12
|
lg: "w-10",
|
|
17
13
|
},
|
|
14
|
+
color: {
|
|
15
|
+
grayscale: "ring-gray-900",
|
|
16
|
+
},
|
|
17
|
+
checked: {
|
|
18
|
+
true: "bg-{color}-600 hover:bg-{color}-700 active:bg-{color}-800",
|
|
19
|
+
false: "bg-gray-300 hover:bg-gray-400 active:bg-gray-600",
|
|
20
|
+
},
|
|
18
21
|
},
|
|
19
22
|
compoundVariants: [
|
|
20
23
|
{ toggleLabel: true, size: "sm", class: "w-10" },
|
|
21
24
|
{ toggleLabel: true, size: "md", class: "w-12" },
|
|
22
25
|
{ toggleLabel: true, size: "lg", class: "w-14" },
|
|
26
|
+
{ color: "grayscale", checked: true, class: "bg-gray-900 hover:bg-gray-800 active:bg-gray-700" },
|
|
23
27
|
{ disabled: true, checked: false, class: "bg-gray-300" },
|
|
24
28
|
{ disabled: true, checked: true, class: "bg-gray-400" },
|
|
25
|
-
{ color: "grayscale", disabled: false, checked: true, class: "bg-gray-900 ring-gray-700/15" },
|
|
26
29
|
],
|
|
27
30
|
},
|
|
28
31
|
input: "absolute size-0 opacity-0",
|
|
29
32
|
circle: {
|
|
30
|
-
base: "
|
|
33
|
+
base: "rounded-full bg-white flex items-center justify-center transition-all",
|
|
31
34
|
variants: {
|
|
32
35
|
size: {
|
|
33
36
|
sm: "size-3",
|
package/ui.form-switch/types.ts
CHANGED
|
@@ -1,27 +1,21 @@
|
|
|
1
1
|
export default /*tw*/ {
|
|
2
2
|
textareaLabel: "{ULabel}",
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
slot: "flex items-center justify-center whitespace-nowrap gap-1 rounded-dynamic",
|
|
4
|
+
leftSlot: "{>slot} pl-3 rounded-r-none",
|
|
5
|
+
rightSlot: "{>slot} pr-3 rounded-l-none",
|
|
5
6
|
wrapper: {
|
|
6
7
|
base: `
|
|
7
8
|
flex bg-white transition w-full
|
|
8
|
-
rounded-dynamic border border-gray-300 hover:border-gray-400 hover:focus-within:border-brand-
|
|
9
|
-
focus-within:border-brand-
|
|
10
|
-
focus-within:ring-brand-
|
|
9
|
+
rounded-dynamic border border-gray-300 hover:border-gray-400 hover:focus-within:border-brand-600
|
|
10
|
+
focus-within:border-brand-600 focus-within:ring-dynamic focus-within:ring-offset-0
|
|
11
|
+
focus-within:ring-brand-600 focus-within:outline-none
|
|
11
12
|
`,
|
|
12
13
|
variants: {
|
|
13
14
|
error: {
|
|
14
|
-
true:
|
|
15
|
-
bg-red-50 border-red-300
|
|
16
|
-
hover:border-red-400 hover:focus-within:border-red-500
|
|
17
|
-
focus-within:border-red-500 focus-within:ring-red-700/15
|
|
18
|
-
`,
|
|
15
|
+
true: "!border-red-600 focus-within:ring-red-600",
|
|
19
16
|
},
|
|
20
17
|
disabled: {
|
|
21
|
-
true:
|
|
22
|
-
focus-within:ring-0 focus-within:ring-offset-0 bg-gray-100
|
|
23
|
-
hover:border-gray-300 focus-within:border-gray-300 hover:focus-within:border-gray-300
|
|
24
|
-
`,
|
|
18
|
+
true: "!border-gray-300 focus-within:ring-0 bg-gray-100",
|
|
25
19
|
},
|
|
26
20
|
},
|
|
27
21
|
},
|
|
@@ -76,7 +76,6 @@ const { config, breadcrumbsAttrs, breadcrumbLinkAttrs, breadcrumbIconAttrs, divi
|
|
|
76
76
|
:underlined="underlined"
|
|
77
77
|
:dashed="dashed"
|
|
78
78
|
:disabled="link.disabled || (!link.to && !link.href)"
|
|
79
|
-
:ring="false"
|
|
80
79
|
v-bind="breadcrumbLinkAttrs"
|
|
81
80
|
:data-test="dataTest"
|
|
82
81
|
@click="onClickLink(link)"
|
|
@@ -124,7 +124,6 @@ const {
|
|
|
124
124
|
<div v-bind="paginationAttrs">
|
|
125
125
|
<UButton
|
|
126
126
|
v-if="showFirst"
|
|
127
|
-
:ring="false"
|
|
128
127
|
variant="thirdary"
|
|
129
128
|
:label="firstLabel"
|
|
130
129
|
:square="!firstLabel"
|
|
@@ -138,6 +137,7 @@ const {
|
|
|
138
137
|
<UIcon
|
|
139
138
|
v-if="!firstLabel"
|
|
140
139
|
internal
|
|
140
|
+
color="brand"
|
|
141
141
|
:name="config.defaults.firstIcon"
|
|
142
142
|
v-bind="firstIconAttrs"
|
|
143
143
|
/>
|
|
@@ -145,7 +145,6 @@ const {
|
|
|
145
145
|
</UButton>
|
|
146
146
|
|
|
147
147
|
<UButton
|
|
148
|
-
:ring="false"
|
|
149
148
|
variant="thirdary"
|
|
150
149
|
:label="prevLabel"
|
|
151
150
|
:square="!prevLabel"
|
|
@@ -156,7 +155,13 @@ const {
|
|
|
156
155
|
>
|
|
157
156
|
<!-- @slot Use it to add something instead of the "prev" label. -->
|
|
158
157
|
<slot name="prev">
|
|
159
|
-
<UIcon
|
|
158
|
+
<UIcon
|
|
159
|
+
v-if="!prevLabel"
|
|
160
|
+
internal
|
|
161
|
+
color="brand"
|
|
162
|
+
:name="config.defaults.prevIcon"
|
|
163
|
+
v-bind="prevIconAttrs"
|
|
164
|
+
/>
|
|
160
165
|
</slot>
|
|
161
166
|
</UButton>
|
|
162
167
|
|
|
@@ -165,7 +170,6 @@ const {
|
|
|
165
170
|
v-if="!isFinite(page.number)"
|
|
166
171
|
square
|
|
167
172
|
disabled
|
|
168
|
-
:ring="false"
|
|
169
173
|
variant="thirdary"
|
|
170
174
|
v-bind="inactiveButtonAttrs"
|
|
171
175
|
>
|
|
@@ -176,7 +180,6 @@ const {
|
|
|
176
180
|
<UButton
|
|
177
181
|
v-else-if="page.isActive"
|
|
178
182
|
filled
|
|
179
|
-
:ring="false"
|
|
180
183
|
:variant="variant"
|
|
181
184
|
:label="String(page.number)"
|
|
182
185
|
:disabled="disabled"
|
|
@@ -186,7 +189,6 @@ const {
|
|
|
186
189
|
|
|
187
190
|
<UButton
|
|
188
191
|
v-else
|
|
189
|
-
:ring="false"
|
|
190
192
|
variant="thirdary"
|
|
191
193
|
:label="String(page.number)"
|
|
192
194
|
:disabled="disabled"
|
|
@@ -197,7 +199,6 @@ const {
|
|
|
197
199
|
</template>
|
|
198
200
|
|
|
199
201
|
<UButton
|
|
200
|
-
:ring="false"
|
|
201
202
|
variant="thirdary"
|
|
202
203
|
:label="nextLabel"
|
|
203
204
|
:square="!nextLabel"
|
|
@@ -208,13 +209,18 @@ const {
|
|
|
208
209
|
>
|
|
209
210
|
<!-- @slot Use it to add something instead of the "next" label. -->
|
|
210
211
|
<slot name="next">
|
|
211
|
-
<UIcon
|
|
212
|
+
<UIcon
|
|
213
|
+
v-if="!nextLabel"
|
|
214
|
+
internal
|
|
215
|
+
color="brand"
|
|
216
|
+
:name="config.defaults.nextIcon"
|
|
217
|
+
v-bind="nextIconAttrs"
|
|
218
|
+
/>
|
|
212
219
|
</slot>
|
|
213
220
|
</UButton>
|
|
214
221
|
|
|
215
222
|
<UButton
|
|
216
223
|
v-if="showLast"
|
|
217
|
-
:ring="false"
|
|
218
224
|
variant="thirdary"
|
|
219
225
|
:label="lastLabel"
|
|
220
226
|
:square="!lastLabel"
|
|
@@ -225,7 +231,13 @@ const {
|
|
|
225
231
|
>
|
|
226
232
|
<!-- @slot Use it to add something instead of the "last" label. -->
|
|
227
233
|
<slot name="last">
|
|
228
|
-
<UIcon
|
|
234
|
+
<UIcon
|
|
235
|
+
v-if="!lastLabel"
|
|
236
|
+
internal
|
|
237
|
+
color="brand"
|
|
238
|
+
:name="config.defaults.lastIcon"
|
|
239
|
+
v-bind="lastIconAttrs"
|
|
240
|
+
/>
|
|
229
241
|
</slot>
|
|
230
242
|
</UButton>
|
|
231
243
|
</div>
|