vueless 0.0.186 → 0.0.188

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 (28) hide show
  1. package/package.json +1 -1
  2. package/ui.button/configs/default.config.js +1 -1
  3. package/ui.button-link/configs/default.config.js +2 -2
  4. package/ui.container-accordion/composables/attrs.composable.js +22 -7
  5. package/ui.container-accordion/configs/default.config.js +7 -7
  6. package/ui.container-accordion/index.stories.js +24 -65
  7. package/ui.container-accordion/index.vue +24 -15
  8. package/ui.data-table/configs/default.config.js +1 -1
  9. package/ui.dropdown-badge/configs/default.config.js +1 -1
  10. package/ui.dropdown-button/configs/default.config.js +1 -1
  11. package/ui.dropdown-link/configs/default.config.js +1 -1
  12. package/ui.dropdown-list/configs/default.config.js +1 -1
  13. package/ui.form-checkbox/configs/default.config.js +1 -1
  14. package/ui.form-input/configs/default.config.js +3 -3
  15. package/ui.form-input/index.vue +10 -8
  16. package/ui.form-input-file/configs/default.config.js +1 -1
  17. package/ui.form-input-search/configs/default.config.js +2 -2
  18. package/ui.form-input-search/index.stories.js +3 -2
  19. package/ui.form-input-search/index.vue +71 -75
  20. package/ui.form-select/configs/default.config.js +3 -3
  21. package/ui.form-switch/configs/default.config.js +3 -3
  22. package/ui.form-textarea/configs/default.config.js +2 -2
  23. package/ui.form-textarea/index.vue +8 -15
  24. package/ui.loader-rendering/configs/default.config.js +1 -1
  25. package/ui.loader-top/configs/default.config.js +1 -1
  26. package/ui.navigation-progress/configs/default.config.js +3 -3
  27. package/ui.text-notify/configs/default.config.js +3 -3
  28. package/web-types.json +42 -60
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vueless",
3
- "version": "0.0.186",
3
+ "version": "0.0.188",
4
4
  "license": "MIT",
5
5
  "description": "Vue Styleless Component Framework.",
6
6
  "homepage": "https://vueless.com",
@@ -3,7 +3,7 @@ export default /*tw*/ {
3
3
  base: `
4
4
  flex items-center justify-center
5
5
  text-base font-medium outline-none
6
- border border-solid transition-all
6
+ border border-solid transition
7
7
  focus:ring-opacity-20 focus:ring-4 focus:ring-{color}-700
8
8
  focus-within:ring-opacity-20 focus-within:ring-4 focus-within:ring-{color}-700
9
9
  disabled:ring-0 disabled:cursor-no-drop
@@ -1,7 +1,7 @@
1
1
  export default /*tw*/ {
2
2
  wrapper: {
3
3
  base: `
4
- w-fit inline-flex rounded transition-all
4
+ w-fit inline-flex rounded transition
5
5
  focus-within:ring-4 focus-within:ring-{color}-500 focus-within:ring-opacity-15 focus-visible:outline-none
6
6
  `,
7
7
  variants: {
@@ -28,7 +28,7 @@ export default /*tw*/ {
28
28
  },
29
29
  link: {
30
30
  base: `
31
- w-full inline-block !leading-none transition-all
31
+ w-full inline-block !leading-none transition
32
32
  text-{color}-500 decoration-{color}-500 underline-offset-4
33
33
  hover:text-opacity-80
34
34
  active:text-opacity-70
@@ -6,7 +6,7 @@ import defaultConfig from "../configs/default.config";
6
6
 
7
7
  export function useAttrs(props, { isOpened }) {
8
8
  const { config, getAttrs } = useUI(defaultConfig, () => props.config);
9
- const { wrapper, description } = config.value;
9
+ const { wrapper, title, description } = config.value;
10
10
 
11
11
  const cvaWrapper = cva({
12
12
  base: wrapper.base,
@@ -14,6 +14,12 @@ export function useAttrs(props, { isOpened }) {
14
14
  compoundVariants: wrapper.compoundVariants,
15
15
  });
16
16
 
17
+ const cvaTitle = cva({
18
+ base: title.base,
19
+ variants: title.variants,
20
+ compoundVariants: title.compoundVariants,
21
+ });
22
+
17
23
  const cvaDescription = cva({
18
24
  base: description.base,
19
25
  variants: description.variants,
@@ -22,24 +28,33 @@ export function useAttrs(props, { isOpened }) {
22
28
 
23
29
  const wrapperClasses = computed(() => cvaWrapper({ size: props.size }));
24
30
 
31
+ const titleClasses = computed(() =>
32
+ cvaTitle({
33
+ size: props.size,
34
+ }),
35
+ );
36
+
25
37
  const descriptionClasses = computed(() =>
26
- cvaDescription({ size: props.size, isOpened: isOpened.value }),
38
+ cvaDescription({
39
+ size: props.size,
40
+ isOpened: isOpened.value,
41
+ }),
27
42
  );
28
43
 
29
44
  const wrapperAttrs = getAttrs("wrapper", { classes: wrapperClasses });
45
+ const bodyAttrs = getAttrs("body");
46
+ const titleAttrs = getAttrs("title", { classes: titleClasses });
30
47
  const descriptionAttrs = getAttrs("description", { classes: descriptionClasses });
31
- const infoAttrs = getAttrs("info");
32
- const titleAttrs = getAttrs("title");
33
48
  const iconAttrs = getAttrs("icon", { isComponent: true });
34
- const separatorAttrs = getAttrs("separator");
49
+ const dividerAttrs = getAttrs("divider", { isComponent: true });
35
50
 
36
51
  return {
37
52
  config,
38
53
  wrapperAttrs,
39
54
  descriptionAttrs,
40
- infoAttrs,
55
+ bodyAttrs,
41
56
  titleAttrs,
42
57
  iconAttrs,
43
- separatorAttrs,
58
+ dividerAttrs,
44
59
  };
45
60
  }
@@ -1,6 +1,8 @@
1
1
  export default /*tw*/ {
2
- wrapper: {
3
- base: "group cursor-pointer [&:not(:first-child)]:pt-6",
2
+ wrapper: "group cursor-pointer",
3
+ body: "",
4
+ title: {
5
+ base: "flex items-center justify-between font-medium text-gray-900",
4
6
  variants: {
5
7
  size: {
6
8
  sm: "text-sm",
@@ -9,10 +11,8 @@ export default /*tw*/ {
9
11
  },
10
12
  },
11
13
  },
12
- info: "leading-6",
13
- title: "flex items-center justify-between font-medium text-gray-800",
14
14
  description: {
15
- base: "text-gray-600 leading-normal h-0 overflow-hidden opacity-0",
15
+ base: "text-gray-600 h-0 opacity-0 transition-all",
16
16
  variants: {
17
17
  size: {
18
18
  sm: "text-xs",
@@ -20,14 +20,14 @@ export default /*tw*/ {
20
20
  lg: "text-base",
21
21
  },
22
22
  isOpened: {
23
- true: "h-full pt-3 opacity-100 transition-all",
23
+ true: "pt-2 h-full opacity-100",
24
24
  },
25
25
  },
26
26
  },
27
27
  icon: "",
28
28
  expandIconName: "add",
29
29
  collapseIconName: "remove",
30
- separator: "mt-2 h-px w-full lg:mt-6 bg-gray-100 mt-2.5 group-last:hidden",
30
+ divider: "group-last:hidden",
31
31
  defaultVariants: {
32
32
  size: "md",
33
33
  },
@@ -1,8 +1,6 @@
1
1
  import { getArgTypes } from "../service.storybook";
2
2
 
3
3
  import UAccordion from "../ui.container-accordion";
4
- import UCard from "../ui.container-card";
5
- import UGroup from "../ui.container-group";
6
4
 
7
5
  /**
8
6
  * The `UAccordion` component. | [View on GitHub](https://github.com/vuelessjs/vueless/tree/main/src/ui.container-accordion)
@@ -17,76 +15,37 @@ export default {
17
15
  };
18
16
 
19
17
  const DefaultTemplate = (args) => ({
20
- components: { UAccordion, UCard },
18
+ components: { UAccordion },
21
19
  setup() {
22
20
  return { args };
23
21
  },
24
22
  template: `
25
- <UCard>
26
- <UAccordion
27
- name="accordion1"
28
- title="Excellence by necessity"
29
- description="As creators and maintainers of the technologies you are using,
30
- our services are here to showcase the full power of our softwares."
31
- />
32
- <UAccordion
33
- name="accordion1"
34
- title="Unique expertise"
35
- description="All the peoples that will be involved in delivering your project are contributing
36
- to the technologies you are using, when they are not the creators themselves."
37
- />
38
- <UAccordion
39
- name="accordion1"
40
- title="Commitment to innovation"
41
- description="By working with us, you are directly supporting the open source community,
42
- ensuring the ecosystem continuity and enabling Nuxt development."
43
- />
44
- </UCard>
45
- `,
46
- });
47
-
48
- const SizesTemplate = (args, { argTypes } = {}) => ({
49
- components: { UAccordion, UCard, UGroup },
50
- setup() {
51
- return {
52
- args,
53
- sizes: argTypes.size.options,
54
- };
55
- },
56
- template: `
57
- <UGroup>
58
- <UCard v-for="(sizes, index) in sizes" :padding="sizes">
59
- <UAccordion
60
- :size="size"
61
- :name="size"
62
- title="Excellence by necessity"
63
- description="As creators and maintainers of the technologies you are using,
64
- our services are here to showcase the full power of our softwares."
65
- :key="index"
66
- />
67
- <UAccordion
68
- :size="size"
69
- :name="size"
70
- title="Unique expertise"
71
- description="All the peoples that will be involved in delivering your project are contributing
72
- to the technologies you are using, when they are not the creators themselves."
73
- :key="index"
74
- />
75
- <UAccordion
76
- :size="size"
77
- :name="size"
78
- title="Commitment to innovation"
79
- description="By working with us, you are directly supporting the open source community,
80
- ensuring the ecosystem continuity and enabling Nuxt development."
81
- :key="index"
82
- />
83
- </UCard>
84
- </UGroup>
23
+ <UAccordion
24
+ v-bind="args"
25
+ name="Excellence"
26
+ title="Excellence by necessity"
27
+ description="As creators and maintainers of the technologies you are using,
28
+ our services are here to showcase the full power of our softwares."
29
+ />
30
+ <UAccordion
31
+ v-bind="args"
32
+ name="Unique"
33
+ title="Unique expertise"
34
+ description="All the peoples that will be involved in delivering your project are contributing
35
+ to the technologies you are using, when they are not the creators themselves."
36
+ />
37
+ <UAccordion
38
+ v-bind="args"
39
+ name="Commitment"
40
+ title="Commitment to innovation"
41
+ description="By working with us, you are directly supporting the open source community,
42
+ ensuring the ecosystem continuity and enabling Nuxt development."
43
+ />
85
44
  `,
86
45
  });
87
46
 
88
47
  export const Default = DefaultTemplate.bind({});
89
48
  Default.args = {};
90
49
 
91
- export const Sizes = SizesTemplate.bind({});
92
- Sizes.args = {};
50
+ export const Size = DefaultTemplate.bind({});
51
+ Size.args = { size: "sm" };
@@ -1,9 +1,8 @@
1
1
  <template>
2
2
  <div :data-cy="dataCy" v-bind="wrapperAttrs" @click="onClickItem">
3
- <div v-bind="infoAttrs">
3
+ <div v-bind="bodyAttrs">
4
4
  <div v-bind="titleAttrs">
5
- <div v-text="title" />
6
-
5
+ {{ title }}
7
6
  <UIcon
8
7
  :name="isOpened ? config.collapseIconName : config.expandIconName"
9
8
  :size="size"
@@ -16,14 +15,15 @@
16
15
  <div :id="`description-${id}`" v-bind="descriptionAttrs" v-text="description" />
17
16
  </div>
18
17
 
19
- <div v-bind="separatorAttrs" />
18
+ <UDivider :size="dividerSize" v-bind="dividerAttrs" />
20
19
  </div>
21
20
  </template>
22
21
 
23
22
  <script setup>
24
- import { ref } from "vue";
23
+ import { computed, ref } from "vue";
25
24
 
26
25
  import UIcon from "../ui.image-icon";
26
+ import UDivider from "../ui.container-divider";
27
27
  import UIService, { getRandomId } from "../service.ui";
28
28
 
29
29
  import { UAccordion } from "./constants/index";
@@ -35,7 +35,7 @@ defineOptions({ name: "UAccordion", inheritAttrs: false });
35
35
 
36
36
  const props = defineProps({
37
37
  /**
38
- * Set component title.
38
+ * Accordion title.
39
39
  */
40
40
  title: {
41
41
  type: String,
@@ -43,7 +43,7 @@ const props = defineProps({
43
43
  },
44
44
 
45
45
  /**
46
- * Set component description.
46
+ * Accordion description.
47
47
  */
48
48
  description: {
49
49
  type: String,
@@ -51,16 +51,15 @@ const props = defineProps({
51
51
  },
52
52
 
53
53
  /**
54
- * Set unique block name.
55
- * @ignore
54
+ * Unique block name.
56
55
  */
57
56
  name: {
58
57
  type: String,
59
- required: true,
58
+ default: "",
60
59
  },
61
60
 
62
61
  /**
63
- * The size of component.
62
+ * Accordion size.
64
63
  * @values sm, md, lg
65
64
  */
66
65
  size: {
@@ -78,7 +77,7 @@ const props = defineProps({
78
77
  },
79
78
 
80
79
  /**
81
- * Sets data-cy attribute for automated testing.
80
+ * Data-cy attribute for automated testing.
82
81
  */
83
82
  dataCy: {
84
83
  type: String,
@@ -86,16 +85,26 @@ const props = defineProps({
86
85
  },
87
86
  });
88
87
 
89
- const emit = defineEmits(["itemClicked"]);
88
+ const emit = defineEmits(["click"]);
90
89
 
91
90
  const isOpened = ref(false);
92
91
 
93
- const { config, wrapperAttrs, descriptionAttrs, infoAttrs, titleAttrs, iconAttrs, separatorAttrs } =
92
+ const { config, wrapperAttrs, descriptionAttrs, bodyAttrs, titleAttrs, iconAttrs, dividerAttrs } =
94
93
  useAttrs(props, { isOpened });
95
94
 
95
+ const dividerSize = computed(() => {
96
+ const sizes = {
97
+ sm: "md",
98
+ md: "lg",
99
+ lg: "xl",
100
+ };
101
+
102
+ return sizes[props.size];
103
+ });
104
+
96
105
  function onClickItem() {
97
106
  isOpened.value = !isOpened.value;
98
107
 
99
- emit("itemClicked", props.name);
108
+ emit("click", props.name);
100
109
  }
101
110
  </script>
@@ -43,7 +43,7 @@ export default /*tw*/ {
43
43
  headerLoader: "absolute !top-auto",
44
44
  body: "group/body divide-none",
45
45
  bodyRow: "hover:bg-gray-50",
46
- bodyRowChecked: "bg-gray-100 transition-all",
46
+ bodyRowChecked: "bg-gray-100 transition",
47
47
  bodyRowBefore: "!p-0",
48
48
  bodyRowBeforeCell: "py-1",
49
49
  bodyRowAfter: "!p-0",
@@ -1,7 +1,7 @@
1
1
  export default /*tw*/ {
2
2
  wrapper: "relative inline-block",
3
3
  badge: "cursor-pointer",
4
- icon: "transition-all duration-300",
4
+ icon: "transition duration-300",
5
5
  iconName: "keyboard_arrow_down",
6
6
  iconRotate: "rotate-180",
7
7
  listWrapper: {
@@ -1,7 +1,7 @@
1
1
  export default /*tw*/ {
2
2
  wrapper: "relative inline-block",
3
3
  button: "",
4
- icon: "transition-all duration-300",
4
+ icon: "transition duration-300",
5
5
  iconName: "keyboard_arrow_down",
6
6
  iconRotate: "rotate-180",
7
7
  listWrapper: {
@@ -2,7 +2,7 @@ export default /*tw*/ {
2
2
  wrapper: "relative inline-block",
3
3
  trigger: "flex items-center relative space-x-0.5",
4
4
  link: "",
5
- icon: "block transition-all duration-300",
5
+ icon: "block transition duration-300",
6
6
  iconName: "keyboard_arrow_down",
7
7
  iconRotate: "rotate-180",
8
8
  listWrapper: {
@@ -5,7 +5,7 @@ export default /*tw*/ {
5
5
  overflow-auto [-webkit-overflow-scrolling:touch]
6
6
  focus:outline-none
7
7
  `,
8
- list: "inline-block list-none align-top m-0 min-w-full p-0 bg-white opacity-1 hover:transition-all",
8
+ list: "inline-block list-none align-top m-0 min-w-full p-0 bg-white opacity-1 hover:transition",
9
9
  subGroupLabel: {
10
10
  base: "pointer-events-none bg-transparent !font-medium !leading-none !uppercase !text-gray-500/[85] pt-1",
11
11
  variants: {
@@ -20,7 +20,7 @@ export default /*tw*/ {
20
20
  icon: "",
21
21
  checkbox: {
22
22
  base: `
23
- border border-solid rounded border-gray-300 bg-white hover:transition-all
23
+ border border-solid rounded border-gray-300 bg-white hover:transition
24
24
  hover:border-gray-400
25
25
  focus:border-{color}-500 focus:ring-4 focus:ring-opacity-20 focus:ring-offset-0 focus:ring-{color}-500
26
26
  active:border-{color}-500 active:bg-{color}-500
@@ -8,7 +8,7 @@ export default /*tw*/ {
8
8
  passwordHiddenIconName: "visibility_off-fill",
9
9
  block: {
10
10
  base: `
11
- rounded-lg border border-solid border-gray-300 bg-white !opacity-100 relative flex transition-all
11
+ rounded-lg border border-solid border-gray-300 bg-white !opacity-100 relative flex transition
12
12
  hover:border-gray-400 hover:focus-within:border-brand-500
13
13
  focus-within:border-brand-500 focus-within:ring-4 focus-within:ring-brand-600/[.15]
14
14
  `,
@@ -31,7 +31,7 @@ export default /*tw*/ {
31
31
  input: {
32
32
  base: `
33
33
  block w-full pb-2 px-4 font-normal leading-none text-gray-900 placeholder:font-normal placeholder-gray-400
34
- transition-all bg-white border-none border-gray-300 rounded-lg shadow-none
34
+ transition bg-white border-none border-gray-300 rounded-lg shadow-none
35
35
  focus:outline-none focus:ring-0 disabled:opacity-50
36
36
  disabled:cursor-not-allowed disabled:text-gray-900 disabled:border-gray-100
37
37
  read-only:border-gray-300 read-only:ring-0
@@ -56,7 +56,7 @@ export default /*tw*/ {
56
56
  defaultVariants: {
57
57
  size: "md",
58
58
  type: "text",
59
- inputMode: "text",
59
+ inputmode: "text",
60
60
  error: false,
61
61
  readonly: false,
62
62
  disabled: false,
@@ -32,7 +32,7 @@
32
32
  :readonly="readonly"
33
33
  :disabled="disabled"
34
34
  :maxlength="maxLength"
35
- :inputmode="inputMode"
35
+ :inputmode="inputmode"
36
36
  :data-cy="dataCy"
37
37
  v-bind="inputAttrs"
38
38
  @focus="onFocus"
@@ -181,8 +181,8 @@ const props = defineProps({
181
181
  },
182
182
 
183
183
  /**
184
- * Input type.
185
- * @values text, number, email, tel, password, url
184
+ * Input type
185
+ * @values text, number, tel, email, url, search, password
186
186
  */
187
187
  type: {
188
188
  type: String,
@@ -191,12 +191,12 @@ const props = defineProps({
191
191
  },
192
192
 
193
193
  /**
194
- * Input mode (to show different mobile keyboard).
195
- * @values none, text, decimal, numeric, tel, email, url
194
+ * Set proper keyboard on mobile devices.
195
+ * @values text, decimal, numeric, tel, email, url, search, none
196
196
  */
197
- inputMode: {
197
+ inputmode: {
198
198
  type: String,
199
- default: UIService.get(defaultConfig, UInput).default.inputMode,
199
+ default: UIService.get(defaultConfig, UInput).default.inputmode,
200
200
  },
201
201
 
202
202
  /**
@@ -392,7 +392,9 @@ function setLabelPosition() {
392
392
  }
393
393
  }
394
394
 
395
- labelComponent.value.labelElement.style.left = `${leftSlotOrIconWidth}px`;
395
+ if (labelComponent.value.labelElement) {
396
+ labelComponent.value.labelElement.style.left = `${leftSlotOrIconWidth}px`;
397
+ }
396
398
  }
397
399
  </script>
398
400
 
@@ -12,7 +12,7 @@ export default /*tw*/ {
12
12
  dropzoneWrapper: {
13
13
  base: `
14
14
  size-auto w-full rounded-lg border border-solid border-gray-300 bg-white
15
- p-4 px-5 py-6 transition-all hover:border-gray-400
15
+ p-4 px-5 py-6 transition hover:border-gray-400
16
16
  `,
17
17
  variants: {
18
18
  error: {
@@ -8,9 +8,9 @@ export default /*tw*/ {
8
8
  },
9
9
  closeIcon: "flex h-full items-center mr-2",
10
10
  closeIconName: "close",
11
- searchIcon: "mr-2",
11
+ searchIcon: "mr-3",
12
12
  searchIconName: "search",
13
- button: "",
13
+ button: "rounded-l-none ml-1 !ring-0 outline outline-1 outline-gray-900",
14
14
  defaultVariants: {
15
15
  size: "md",
16
16
  labelAlign: "topInside",
@@ -44,7 +44,7 @@ const SlotTemplate = (args) => ({
44
44
  },
45
45
  template: `
46
46
  <UInputSearch v-bind="args">
47
- ${args.slotTemplate}
47
+ ${args.slotTemplate || ""}
48
48
  </UInputSearch>
49
49
  `,
50
50
  });
@@ -74,7 +74,7 @@ export const Default = DefaultTemplate.bind({});
74
74
  Default.args = {};
75
75
 
76
76
  export const searchButton = DefaultTemplate.bind({});
77
- searchButton.args = { searchButton: true, text: "Search" };
77
+ searchButton.args = { searchButtonLabel: "Search" };
78
78
 
79
79
  export const sizes = SizesTemplate.bind({});
80
80
  sizes.args = {};
@@ -87,6 +87,7 @@ slotLeft.args = {
87
87
  label="filter"
88
88
  variant="thirdary"
89
89
  filled
90
+ class="rounded-r-none !ring-0"
90
91
  />
91
92
  </template>
92
93
  `,
@@ -5,14 +5,13 @@
5
5
  v-model="search"
6
6
  :size="size"
7
7
  :disabled="disabled"
8
- :description="description"
8
+ :label-align="labelAlign"
9
9
  :label="label"
10
10
  :error="error"
11
+ :description="description"
11
12
  :placeholder="placeholder"
12
- :type="search"
13
- :input-mode="search"
13
+ inputmode="search"
14
14
  :data-cy="dataCy"
15
- :label-align="labelAlign"
16
15
  v-bind="inputAttrs"
17
16
  @keyup.enter="onClickSearch"
18
17
  >
@@ -25,44 +24,44 @@
25
24
  <!-- @slot Use it to add something before text. -->
26
25
  <slot name="right" />
27
26
 
28
- <UButton
29
- v-if="searchButton && !hasSlotContent($slots['right'])"
30
- :label="text"
31
- v-bind="buttonAttrs"
32
- :data-cy="`${dataCy}-right`"
33
- @click="onClickSearch"
34
- />
35
- </template>
36
-
37
- <template #right-icon>
38
- <UIcon
39
- internal
40
- interactive
41
- color="gray"
42
- :name="config.closeIconName"
43
- :data-cy="`${dataCy}-close`"
44
- :size="iconSize"
45
- v-bind="closeIconAttrs"
46
- @click="onClickClear"
47
- />
48
-
49
- <UIcon
50
- v-if="!searchButton"
51
- internal
52
- interactive
53
- :size="iconSize"
54
- color="grayscale"
55
- :name="config.searchIconName"
56
- :data-cy="`${dataCy}-search`"
57
- v-bind="searchIconAttrs"
58
- @click="onClickSearch"
59
- />
27
+ <template v-if="!hasSlotContent($slots['right'])">
28
+ <UIcon
29
+ internal
30
+ interactive
31
+ color="gray"
32
+ :name="config.closeIconName"
33
+ :data-cy="`${dataCy}-close`"
34
+ :size="iconSize"
35
+ v-bind="closeIconAttrs"
36
+ @click="onClickClear"
37
+ />
38
+
39
+ <UButton
40
+ v-if="searchButtonLabel"
41
+ :label="searchButtonLabel"
42
+ v-bind="buttonAttrs"
43
+ :data-cy="`${dataCy}-right`"
44
+ @click="onClickSearch"
45
+ />
46
+
47
+ <UIcon
48
+ v-else
49
+ internal
50
+ interactive
51
+ :size="iconSize"
52
+ color="grayscale"
53
+ :name="config.searchIconName"
54
+ :data-cy="`${dataCy}-search`"
55
+ v-bind="searchIconAttrs"
56
+ @click="onClickSearch"
57
+ />
58
+ </template>
60
59
  </template>
61
60
  </UInput>
62
61
  </template>
63
62
 
64
63
  <script setup>
65
- import { computed } from "vue";
64
+ import { computed, ref } from "vue";
66
65
 
67
66
  import UIcon from "../ui.image-icon";
68
67
  import UInput from "../ui.form-input";
@@ -78,7 +77,7 @@ defineOptions({ name: "UInputSearch" });
78
77
 
79
78
  const props = defineProps({
80
79
  /**
81
- * Set component value.
80
+ * Search input value.
82
81
  */
83
82
  modelValue: {
84
83
  type: String,
@@ -86,7 +85,7 @@ const props = defineProps({
86
85
  },
87
86
 
88
87
  /**
89
- * Set input size.
88
+ * Input size.
90
89
  * @values sm, md, lg
91
90
  */
92
91
  size: {
@@ -95,38 +94,30 @@ const props = defineProps({
95
94
  },
96
95
 
97
96
  /**
98
- * Generates unique element id.
99
- * @ignore
97
+ * Input placeholder.
100
98
  */
101
- id: {
99
+ placeholder: {
102
100
  type: String,
103
- default: () => getRandomId(),
101
+ default: "",
104
102
  },
105
103
 
106
104
  /**
107
- * Set input disabled.
105
+ * Label placement.
106
+ * @values top, topInside, topWithDesc, bottom, left, right
108
107
  */
109
- disabled: {
110
- type: Boolean,
111
- default: UIService.get(defaultConfig, UInputSearch).default.disabled,
108
+ labelAlign: {
109
+ type: String,
110
+ default: UIService.get(defaultConfig, UInputSearch).default.labelAlign,
112
111
  },
113
112
 
114
113
  /**
115
- * Search button text..
114
+ * Input label.
116
115
  */
117
- text: {
116
+ label: {
118
117
  type: String,
119
118
  default: "",
120
119
  },
121
120
 
122
- /**
123
- * Show / hide search button.
124
- */
125
- searchButton: {
126
- type: Boolean,
127
- default: UIService.get(defaultConfig, UInputSearch).default.searchButton,
128
- },
129
-
130
121
  /**
131
122
  * Input description.
132
123
  */
@@ -136,40 +127,40 @@ const props = defineProps({
136
127
  },
137
128
 
138
129
  /**
139
- * Set label placement related from the default slot.
140
- * @values top, topInside, topWithDesc, bottom, left, right
130
+ * Error message.
141
131
  */
142
- labelAlign: {
132
+ error: {
143
133
  type: String,
144
- default: UIService.get(defaultConfig, UInputSearch).default.labelAlign,
134
+ default: "",
145
135
  },
146
136
 
147
137
  /**
148
- * Input placeholder.
138
+ * Search button label.
149
139
  */
150
- placeholder: {
140
+ searchButtonLabel: {
151
141
  type: String,
152
142
  default: "",
153
143
  },
154
144
 
155
145
  /**
156
- * Input label.
146
+ * Set input disabled.
157
147
  */
158
- label: {
159
- type: String,
160
- default: "",
148
+ disabled: {
149
+ type: Boolean,
150
+ default: UIService.get(defaultConfig, UInputSearch).default.disabled,
161
151
  },
162
152
 
163
153
  /**
164
- * Error message.
154
+ * Unique element id.
155
+ * @ignore
165
156
  */
166
- error: {
157
+ id: {
167
158
  type: String,
168
- default: "",
159
+ default: () => getRandomId(),
169
160
  },
170
161
 
171
162
  /**
172
- * Sets component ui config object.
163
+ * Component ui config object.
173
164
  */
174
165
  config: {
175
166
  type: Object,
@@ -177,7 +168,7 @@ const props = defineProps({
177
168
  },
178
169
 
179
170
  /**
180
- * Sets data-cy attribute for automated testing.
171
+ * Data-cy attribute for automated testing.
181
172
  */
182
173
  dataCy: {
183
174
  type: String,
@@ -187,12 +178,17 @@ const props = defineProps({
187
178
 
188
179
  const emit = defineEmits(["update:modelValue", "clear", "search"]);
189
180
 
181
+ const localValue = ref("");
182
+
190
183
  const { config, inputAttrs, searchIconAttrs, closeIconAttrs, buttonAttrs, hasSlotContent } =
191
184
  useAttrs(props);
192
185
 
193
186
  const search = computed({
194
187
  get: () => props.modelValue,
195
- set: (value) => emit("update:modelValue", value),
188
+ set: (value) => {
189
+ localValue.value = value;
190
+ emit("update:modelValue", value);
191
+ },
196
192
  });
197
193
 
198
194
  const iconSize = computed(() => {
@@ -211,7 +207,7 @@ function onClickClear() {
211
207
  }
212
208
 
213
209
  function onClickSearch() {
214
- if (!search.value) return;
215
- emit("search", search.value);
210
+ if (!localValue.value) return;
211
+ emit("search", localValue.value);
216
212
  }
217
213
  </script>
@@ -4,7 +4,7 @@ export default /*tw*/ {
4
4
  base: `
5
5
  pb-2 pt-2 flex flex-row-reverse justify-between w-full min-h-full box-border relative
6
6
  rounded-lg border border-gray-300 bg-white
7
- hover:border-gray-400 hover:transition-all hover:focus-within:border-brand-500
7
+ hover:border-gray-400 hover:transition hover:focus-within:border-brand-500
8
8
  focus-within:border-brand-500 focus-within:ring-4 focus-within:ring-brand-600/[.15] focus-within:outline-none
9
9
  `,
10
10
  variants: {
@@ -55,7 +55,7 @@ export default /*tw*/ {
55
55
  beforeCaretSlot: "",
56
56
  afterCaretSlot: "mr-3",
57
57
  caretToggle: "mr-3",
58
- toggleIcon: "transform transition-all duration-300 group-[]/active:rotate-180",
58
+ toggleIcon: "transform transition duration-300 group-[]/active:rotate-180",
59
59
  toggleIconName: "expand_more",
60
60
  clearIcon: "",
61
61
  clearIconName: "close_small",
@@ -63,7 +63,7 @@ export default /*tw*/ {
63
63
  removeItemIconName: "close_small",
64
64
  caretRemoveItem: "flex items-center",
65
65
  caretClearText: {
66
- base: "cursor-pointer flex items-center text-sm font-normal text-gray-400 hover:text-gray-500 transition-all",
66
+ base: "cursor-pointer flex items-center text-sm font-normal text-gray-400 hover:text-gray-500 transition",
67
67
  compoundVariants: [
68
68
  { size: "sm", class: "text-sm" },
69
69
  { size: "md", class: "text-base" },
@@ -2,7 +2,7 @@ export default /*tw*/ {
2
2
  label: "flex items-start",
3
3
  wrapper: {
4
4
  base: `
5
- transition-all duration-300
5
+ transition duration-300
6
6
  flex items-center p-0.5 relative rounded-3xl cursor-pointer
7
7
  ring-opacity-10 focus-within:ring-4
8
8
  `,
@@ -28,7 +28,7 @@ export default /*tw*/ {
28
28
  },
29
29
  input: "absolute size-0 opacity-0",
30
30
  circle: {
31
- base: "transition-all duration-300 rounded-full bg-white flex items-center justify-center",
31
+ base: "transition duration-300 rounded-full bg-white flex items-center justify-center",
32
32
  variants: {
33
33
  size: {
34
34
  sm: "size-4",
@@ -46,7 +46,7 @@ export default /*tw*/ {
46
46
  selectedIconName: "check",
47
47
  unselectedIconName: "close",
48
48
  toggleLabel: {
49
- base: "absolute text-center text-2xs font-medium uppercase text-white transition-all duration-300",
49
+ base: "absolute text-center text-2xs font-medium uppercase text-white transition duration-300",
50
50
  compoundVariants: [
51
51
  { toggleLabel: true, checked: true, class: "w-1/2 left-1" },
52
52
  { toggleLabel: true, checked: false, class: "w-1/2 right-1" },
@@ -4,7 +4,7 @@ export default /*tw*/ {
4
4
  rightSlot: "flex items-center justify-center h-full w-11 absolute right-0",
5
5
  textareaWrapper: {
6
6
  base: `
7
- transition-all focus-within:outline-none
7
+ transition focus-within:outline-none
8
8
  rounded-lg border border-solid border-gray-300 ring-0 cursor-text bg-white pr-4
9
9
  hover:border-gray-400 pl-4 hover:focus-within:border-gray-500
10
10
  focus-within:border-gray-500 focus-within:ring-4 focus-within:ring-gray-600/[.15]
@@ -53,7 +53,7 @@ export default /*tw*/ {
53
53
  defaultVariants: {
54
54
  size: "md",
55
55
  type: "text",
56
- inputMode: "text",
56
+ inputmode: "text",
57
57
  rows: "2",
58
58
  labelAlign: "topInside",
59
59
  error: false,
@@ -27,11 +27,10 @@
27
27
  v-model="localValue"
28
28
  :value="modelValue"
29
29
  :placeholder="placeholder"
30
- :type="type"
31
30
  :readonly="readonly"
32
31
  :disabled="disabled"
33
32
  :rows="rows"
34
- :inputmode="inputMode"
33
+ :inputmode="inputmode"
35
34
  :data-cy="dataCy"
36
35
  v-bind="textareaAttrs"
37
36
  @focus="onFocus"
@@ -129,22 +128,13 @@ const props = defineProps({
129
128
  default: UIService.get(defaultConfig, UTextarea).default.disabled,
130
129
  },
131
130
 
132
- /**
133
- * Set input type.
134
- * @values text, number, email, tel, password, url
135
- */
136
- type: {
137
- type: String,
138
- default: UIService.get(defaultConfig, UTextarea).default.type,
139
- },
140
-
141
131
  /**
142
132
  * Set proper keyboard on mobile devices.
143
- * @values text, none, decimal, tel, numeric, search, email, url,
133
+ * @values text, decimal, numeric, tel, email, url, search, none
144
134
  */
145
- inputMode: {
135
+ inputmode: {
146
136
  type: String,
147
- default: UIService.get(defaultConfig, UTextarea).default.inputMode,
137
+ default: UIService.get(defaultConfig, UTextarea).default.inputmode,
148
138
  },
149
139
 
150
140
  /**
@@ -273,7 +263,10 @@ function setLabelPosition() {
273
263
 
274
264
  const leftSlotWidth = leftSlotWrapper.value.getBoundingClientRect().width;
275
265
 
276
- labelComponent.value.labelElement.style.left = `${leftSlotWidth}px`;
266
+ if (labelComponent.value.labelElement) {
267
+ labelComponent.value.labelElement.style.left = `${leftSlotWidth}px`;
268
+ }
269
+
277
270
  textareaWrapper.value.style.paddingLeft = `${leftSlotWidth}px`;
278
271
  }
279
272
 
@@ -5,7 +5,7 @@ export default /*tw*/ {
5
5
  h-screen w-screen
6
6
  flex justify-center items-center
7
7
  fixed left-0 top-0 z-[9999]
8
- transition-all duration-300
8
+ transition duration-300
9
9
  `,
10
10
  variants: {
11
11
  color: {
@@ -1,6 +1,6 @@
1
1
  export default /*tw*/ {
2
2
  progress: {
3
- base: "top-0 left-0 right-0 fixed h-[3px] transition-all ease-linear bg-{color}-500",
3
+ base: "top-0 left-0 right-0 fixed h-[3px] transition ease-linear bg-{color}-500",
4
4
  variants: {
5
5
  error: {
6
6
  true: "bg-red-500",
@@ -8,7 +8,7 @@ export default /*tw*/ {
8
8
  [&::-webkit-progress-bar]:w-full [&::-webkit-progress-bar]:rounded-full
9
9
  [&::-webkit-progress-bar]:bg-gray-100 [@supports(selector(&::-moz-progress-bar))]:bg-gray-100
10
10
  [&::-webkit-progress-value]:rounded-full [&::-moz-progress-bar]:rounded-full
11
- [&::-webkit-progress-value]:transition-all [&::-moz-progress-bar]:transition-all
11
+ [&::-webkit-progress-value]:transition [&::-moz-progress-bar]:transition
12
12
  [&::-webkit-progress-value]:bg-current [&::-moz-progress-bar]:bg-current
13
13
  `,
14
14
  variants: {
@@ -28,7 +28,7 @@ export default /*tw*/ {
28
28
  },
29
29
  },
30
30
  indicator: {
31
- base: "text-{color}-500 flex justify-end w-full min-w-fit font-medium transition-all",
31
+ base: "text-{color}-500 flex justify-end w-full min-w-fit font-medium transition",
32
32
  variants: {
33
33
  color: {
34
34
  white: "text-gray-200",
@@ -46,7 +46,7 @@ export default /*tw*/ {
46
46
  },
47
47
  firstStep: "text-gray-500",
48
48
  step: {
49
- base: "text-{color}-500 flex justify-end w-full transition-all",
49
+ base: "text-{color}-500 flex justify-end w-full transition",
50
50
  variants: {
51
51
  color: {
52
52
  white: "text-gray-200",
@@ -1,9 +1,9 @@
1
1
  export default /*tw*/ {
2
2
  wrapper: "absolute overflow-visible md:w-[22rem]",
3
3
  transitionGroup: {
4
- moveClass: "transition-all duration-500",
5
- enterActiveClass: "transition-all duration-500",
6
- leaveActiveClass: "transition-all duration-500 absolute",
4
+ moveClass: "transition duration-500",
5
+ enterActiveClass: "transition duration-500",
6
+ leaveActiveClass: "transition duration-500 absolute",
7
7
  enterFromClass: "opacity-0",
8
8
  leaveToClass: "opacity-0",
9
9
  },
package/web-types.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "framework": "vue",
3
3
  "name": "vueless",
4
- "version": "0.0.186",
4
+ "version": "0.0.188",
5
5
  "contributions": {
6
6
  "html": {
7
7
  "description-markup": "markdown",
@@ -275,7 +275,7 @@
275
275
  {
276
276
  "name": "title",
277
277
  "required": true,
278
- "description": "Set component title.",
278
+ "description": "Accordion title.",
279
279
  "value": {
280
280
  "kind": "expression",
281
281
  "type": "string"
@@ -284,7 +284,7 @@
284
284
  {
285
285
  "name": "description",
286
286
  "required": true,
287
- "description": "Set component description.",
287
+ "description": "Accordion description.",
288
288
  "value": {
289
289
  "kind": "expression",
290
290
  "type": "string"
@@ -292,16 +292,16 @@
292
292
  },
293
293
  {
294
294
  "name": "name",
295
- "required": true,
296
- "description": "@ignore: Set unique block name.",
295
+ "description": "Unique block name.",
297
296
  "value": {
298
297
  "kind": "expression",
299
298
  "type": "string"
300
- }
299
+ },
300
+ "default": "\"\""
301
301
  },
302
302
  {
303
303
  "name": "size",
304
- "description": "The size of component.",
304
+ "description": "Accordion size.",
305
305
  "value": {
306
306
  "kind": "expression",
307
307
  "type": "'sm' | 'md' | 'lg'"
@@ -319,7 +319,7 @@
319
319
  },
320
320
  {
321
321
  "name": "dataCy",
322
- "description": "Sets data-cy attribute for automated testing.",
322
+ "description": "Data-cy attribute for automated testing.",
323
323
  "value": {
324
324
  "kind": "expression",
325
325
  "type": "string"
@@ -329,7 +329,7 @@
329
329
  ],
330
330
  "events": [
331
331
  {
332
- "name": "itemClicked"
332
+ "name": "click"
333
333
  }
334
334
  ],
335
335
  "source": {
@@ -3572,19 +3572,19 @@
3572
3572
  },
3573
3573
  {
3574
3574
  "name": "type",
3575
- "description": "Input type.",
3575
+ "description": "Input type",
3576
3576
  "value": {
3577
3577
  "kind": "expression",
3578
- "type": "'text' | 'number' | 'email' | 'tel' | 'password' | 'url'"
3578
+ "type": "'text' | 'number' | 'tel' | 'email' | 'url' | 'search' | 'password'"
3579
3579
  },
3580
3580
  "default": "text"
3581
3581
  },
3582
3582
  {
3583
- "name": "inputMode",
3584
- "description": "Input mode (to show different mobile keyboard).",
3583
+ "name": "inputmode",
3584
+ "description": "Set proper keyboard on mobile devices.",
3585
3585
  "value": {
3586
3586
  "kind": "expression",
3587
- "type": "'none' | 'text' | 'decimal' | 'numeric' | 'tel' | 'email' | 'url'"
3587
+ "type": "'text' | 'decimal' | 'numeric' | 'tel' | 'email' | 'url' | 'search' | 'none'"
3588
3588
  },
3589
3589
  "default": "text"
3590
3590
  },
@@ -4256,7 +4256,7 @@
4256
4256
  "attributes": [
4257
4257
  {
4258
4258
  "name": "modelValue",
4259
- "description": "Set component value.",
4259
+ "description": "Search input value.",
4260
4260
  "value": {
4261
4261
  "kind": "expression",
4262
4262
  "type": "string"
@@ -4265,7 +4265,7 @@
4265
4265
  },
4266
4266
  {
4267
4267
  "name": "size",
4268
- "description": "Set input size.",
4268
+ "description": "Input size.",
4269
4269
  "value": {
4270
4270
  "kind": "expression",
4271
4271
  "type": "'sm' | 'md' | 'lg'"
@@ -4273,41 +4273,32 @@
4273
4273
  "default": "md"
4274
4274
  },
4275
4275
  {
4276
- "name": "id",
4277
- "description": "@ignore: Generates unique element id.",
4276
+ "name": "placeholder",
4277
+ "description": "Input placeholder.",
4278
4278
  "value": {
4279
4279
  "kind": "expression",
4280
4280
  "type": "string"
4281
4281
  },
4282
- "default": "() => getRandomId()"
4282
+ "default": "\"\""
4283
4283
  },
4284
4284
  {
4285
- "name": "disabled",
4286
- "description": "Set input disabled.",
4285
+ "name": "labelAlign",
4286
+ "description": "Label placement.",
4287
4287
  "value": {
4288
4288
  "kind": "expression",
4289
- "type": "boolean"
4289
+ "type": "'top' | 'topInside' | 'topWithDesc' | 'bottom' | 'left' | 'right'"
4290
4290
  },
4291
- "default": "false"
4291
+ "default": "topInside"
4292
4292
  },
4293
4293
  {
4294
- "name": "text",
4295
- "description": "Search button text..",
4294
+ "name": "label",
4295
+ "description": "Input label.",
4296
4296
  "value": {
4297
4297
  "kind": "expression",
4298
4298
  "type": "string"
4299
4299
  },
4300
4300
  "default": "\"\""
4301
4301
  },
4302
- {
4303
- "name": "searchButton",
4304
- "description": "Show / hide search button.",
4305
- "value": {
4306
- "kind": "expression",
4307
- "type": "boolean"
4308
- },
4309
- "default": "false"
4310
- },
4311
4302
  {
4312
4303
  "name": "description",
4313
4304
  "description": "Input description.",
@@ -4318,17 +4309,17 @@
4318
4309
  "default": "\"\""
4319
4310
  },
4320
4311
  {
4321
- "name": "labelAlign",
4322
- "description": "Set label placement related from the default slot.",
4312
+ "name": "error",
4313
+ "description": "Error message.",
4323
4314
  "value": {
4324
4315
  "kind": "expression",
4325
- "type": "'top' | 'topInside' | 'topWithDesc' | 'bottom' | 'left' | 'right'"
4316
+ "type": "string"
4326
4317
  },
4327
- "default": "topInside"
4318
+ "default": "\"\""
4328
4319
  },
4329
4320
  {
4330
- "name": "placeholder",
4331
- "description": "Input placeholder.",
4321
+ "name": "searchButtonLabel",
4322
+ "description": "Search button label.",
4332
4323
  "value": {
4333
4324
  "kind": "expression",
4334
4325
  "type": "string"
@@ -4336,26 +4327,26 @@
4336
4327
  "default": "\"\""
4337
4328
  },
4338
4329
  {
4339
- "name": "label",
4340
- "description": "Input label.",
4330
+ "name": "disabled",
4331
+ "description": "Set input disabled.",
4341
4332
  "value": {
4342
4333
  "kind": "expression",
4343
- "type": "string"
4334
+ "type": "boolean"
4344
4335
  },
4345
- "default": "\"\""
4336
+ "default": "false"
4346
4337
  },
4347
4338
  {
4348
- "name": "error",
4349
- "description": "Error message.",
4339
+ "name": "id",
4340
+ "description": "@ignore: Unique element id.",
4350
4341
  "value": {
4351
4342
  "kind": "expression",
4352
4343
  "type": "string"
4353
4344
  },
4354
- "default": "\"\""
4345
+ "default": "() => getRandomId()"
4355
4346
  },
4356
4347
  {
4357
4348
  "name": "config",
4358
- "description": "Sets component ui config object.",
4349
+ "description": "Component ui config object.",
4359
4350
  "value": {
4360
4351
  "kind": "expression",
4361
4352
  "type": "object"
@@ -4364,7 +4355,7 @@
4364
4355
  },
4365
4356
  {
4366
4357
  "name": "dataCy",
4367
- "description": "Sets data-cy attribute for automated testing.",
4358
+ "description": "Data-cy attribute for automated testing.",
4368
4359
  "value": {
4369
4360
  "kind": "expression",
4370
4361
  "type": "string"
@@ -6988,20 +6979,11 @@
6988
6979
  "default": "false"
6989
6980
  },
6990
6981
  {
6991
- "name": "type",
6992
- "description": "Set input type.",
6993
- "value": {
6994
- "kind": "expression",
6995
- "type": "'text' | 'number' | 'email' | 'tel' | 'password' | 'url'"
6996
- },
6997
- "default": "text"
6998
- },
6999
- {
7000
- "name": "inputMode",
6982
+ "name": "inputmode",
7001
6983
  "description": "Set proper keyboard on mobile devices.",
7002
6984
  "value": {
7003
6985
  "kind": "expression",
7004
- "type": "'text' | 'none' | 'decimal' | 'tel' | 'numeric' | 'search' | 'email' | 'url' | ''"
6986
+ "type": "'text' | 'decimal' | 'numeric' | 'tel' | 'email' | 'url' | 'search' | 'none'"
7005
6987
  },
7006
6988
  "default": "text"
7007
6989
  },