@antify/ui 1.1.0 → 1.3.0

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 (105) hide show
  1. package/dist/components/AntAccordion.vue +15 -7
  2. package/dist/components/AntAccordionItem.vue +19 -5
  3. package/dist/components/AntAlert.vue +8 -6
  4. package/dist/components/AntDropdown.vue +50 -36
  5. package/dist/components/AntIcon.vue +8 -6
  6. package/dist/components/AntKeycap.vue +10 -10
  7. package/dist/components/AntListGroup.vue +5 -3
  8. package/dist/components/AntModal.vue +17 -7
  9. package/dist/components/AntPopover.vue +118 -42
  10. package/dist/components/AntSkeleton.vue +1 -1
  11. package/dist/components/AntTooltip.vue +127 -80
  12. package/dist/components/__stories/AntAccordion.stories.js +12 -3
  13. package/dist/components/__stories/AntAccordion.stories.mjs +12 -3
  14. package/dist/components/__stories/AntDropdown.stories.js +27 -23
  15. package/dist/components/__stories/AntDropdown.stories.mjs +26 -22
  16. package/dist/components/__stories/AntListGroup.stories.js +1 -1
  17. package/dist/components/__stories/AntListGroup.stories.mjs +1 -1
  18. package/dist/components/__stories/AntModal.stories.js +2 -1
  19. package/dist/components/__stories/AntModal.stories.mjs +2 -1
  20. package/dist/components/__stories/AntPopover.stories.js +22 -21
  21. package/dist/components/__stories/AntPopover.stories.mjs +22 -20
  22. package/dist/components/__stories/AntTooltip.stories.d.ts +0 -10
  23. package/dist/components/__stories/AntTooltip.stories.js +34 -212
  24. package/dist/components/__stories/AntTooltip.stories.mjs +29 -193
  25. package/dist/components/buttons/AntButton.vue +41 -44
  26. package/dist/components/crud/AntCrud.vue +1 -1
  27. package/dist/components/crud/AntCrudDetailActions.vue +1 -0
  28. package/dist/components/crud/AntCrudDetailNav.vue +1 -0
  29. package/dist/components/crud/AntCrudTableFilter.vue +20 -18
  30. package/dist/components/forms/AntField.vue +7 -2
  31. package/dist/components/forms/__stories/AntField.stories.js +0 -16
  32. package/dist/components/forms/__stories/AntField.stories.mjs +2 -16
  33. package/dist/components/index.d.ts +2 -2
  34. package/dist/components/index.js +7 -7
  35. package/dist/components/index.mjs +2 -2
  36. package/dist/components/inputs/AntCheckbox.vue +25 -6
  37. package/dist/components/inputs/AntDateInput.vue +1 -1
  38. package/dist/components/inputs/AntRadio.vue +2 -1
  39. package/dist/components/inputs/AntSelect.vue +25 -22
  40. package/dist/components/inputs/AntSwitch.vue +2 -7
  41. package/dist/components/inputs/AntTagInput.vue +91 -114
  42. package/dist/components/inputs/AntTextarea.vue +16 -4
  43. package/dist/components/inputs/Elements/AntBaseInput.vue +2 -2
  44. package/dist/components/inputs/Elements/{AntDropDown.vue → AntSelectMenu.vue} +84 -40
  45. package/dist/components/inputs/Elements/__stories/AntBaseInput.stories.d.ts +0 -1
  46. package/dist/components/inputs/Elements/__stories/AntBaseInput.stories.js +1 -29
  47. package/dist/components/inputs/Elements/__stories/AntBaseInput.stories.mjs +0 -22
  48. package/dist/components/inputs/Elements/index.d.ts +2 -1
  49. package/dist/components/inputs/Elements/index.js +7 -0
  50. package/dist/components/inputs/Elements/index.mjs +3 -1
  51. package/dist/components/inputs/__stories/AntCheckbox.stories.d.ts +0 -1
  52. package/dist/components/inputs/__stories/AntCheckbox.stories.js +1 -43
  53. package/dist/components/inputs/__stories/AntCheckbox.stories.mjs +0 -35
  54. package/dist/components/inputs/__stories/AntCheckboxGroup.stories.d.ts +0 -1
  55. package/dist/components/inputs/__stories/AntCheckboxGroup.stories.js +1 -31
  56. package/dist/components/inputs/__stories/AntCheckboxGroup.stories.mjs +0 -28
  57. package/dist/components/inputs/__stories/AntDateInput.stories.d.ts +0 -1
  58. package/dist/components/inputs/__stories/AntDateInput.stories.js +1 -32
  59. package/dist/components/inputs/__stories/AntDateInput.stories.mjs +0 -28
  60. package/dist/components/inputs/__stories/AntNumberInput.stories.d.ts +0 -2
  61. package/dist/components/inputs/__stories/AntNumberInput.stories.js +1 -65
  62. package/dist/components/inputs/__stories/AntNumberInput.stories.mjs +1 -54
  63. package/dist/components/inputs/__stories/AntPasswordInput.stories.d.ts +0 -1
  64. package/dist/components/inputs/__stories/AntPasswordInput.stories.js +1 -35
  65. package/dist/components/inputs/__stories/AntPasswordInput.stories.mjs +0 -25
  66. package/dist/components/inputs/__stories/AntRadioGroup.stories.d.ts +0 -1
  67. package/dist/components/inputs/__stories/AntRadioGroup.stories.js +1 -47
  68. package/dist/components/inputs/__stories/AntRadioGroup.stories.mjs +0 -46
  69. package/dist/components/inputs/__stories/AntRangeSlider.stories.d.ts +0 -1
  70. package/dist/components/inputs/__stories/AntRangeSlider.stories.js +1 -33
  71. package/dist/components/inputs/__stories/AntRangeSlider.stories.mjs +1 -28
  72. package/dist/components/inputs/__stories/AntSelect.stories.d.ts +0 -1
  73. package/dist/components/inputs/__stories/AntSelect.stories.js +18 -46
  74. package/dist/components/inputs/__stories/AntSelect.stories.mjs +16 -47
  75. package/dist/components/inputs/__stories/AntSwitch.stories.d.ts +0 -1
  76. package/dist/components/inputs/__stories/AntSwitch.stories.js +1 -42
  77. package/dist/components/inputs/__stories/AntSwitch.stories.mjs +1 -37
  78. package/dist/components/inputs/__stories/AntSwitcher.stories.d.ts +0 -1
  79. package/dist/components/inputs/__stories/AntSwitcher.stories.js +1 -51
  80. package/dist/components/inputs/__stories/AntSwitcher.stories.mjs +1 -51
  81. package/dist/components/inputs/__stories/AntTagInput.stories.d.ts +0 -1
  82. package/dist/components/inputs/__stories/AntTagInput.stories.js +1 -35
  83. package/dist/components/inputs/__stories/AntTagInput.stories.mjs +0 -33
  84. package/dist/components/inputs/__stories/AntTextInput.stories.d.ts +0 -2
  85. package/dist/components/inputs/__stories/AntTextInput.stories.js +2 -107
  86. package/dist/components/inputs/__stories/AntTextInput.stories.mjs +1 -104
  87. package/dist/components/inputs/__stories/AntTextarea.stories.d.ts +0 -2
  88. package/dist/components/inputs/__stories/AntTextarea.stories.js +7 -66
  89. package/dist/components/inputs/__stories/AntTextarea.stories.mjs +6 -55
  90. package/dist/components/inputs/__stories/AntUnitInput.stories.d.ts +0 -2
  91. package/dist/components/inputs/__stories/AntUnitInput.stories.js +1 -61
  92. package/dist/components/inputs/__stories/AntUnitInput.stories.mjs +0 -53
  93. package/dist/components/table/AntTable.vue +17 -15
  94. package/dist/components/table/AntTd.vue +1 -2
  95. package/dist/components/table/__stories/AntTable.stories.js +7 -14
  96. package/dist/components/table/__stories/AntTable.stories.mjs +7 -15
  97. package/dist/components/tabs/AntTabItem.vue +24 -7
  98. package/dist/components/tabs/AntTabs.vue +14 -2
  99. package/dist/components/tabs/__stories/AntTabs.stories.d.ts +1 -0
  100. package/dist/components/tabs/__stories/AntTabs.stories.js +112 -6
  101. package/dist/components/tabs/__stories/AntTabs.stories.mjs +120 -5
  102. package/dist/components/tabs/__types/AntTabItem.types.d.ts +2 -0
  103. package/dist/components/tabs/__types/AntTabItem.types.js +1 -0
  104. package/dist/components/tabs/__types/AntTabItem.types.mjs +1 -0
  105. package/package.json +2 -1
@@ -2,8 +2,6 @@ import { Size } from "../../../enums/Size.enum.mjs";
2
2
  import AntUnitInput from "../AntUnitInput.vue";
3
3
  import { faEuroSign } from "@fortawesome/free-solid-svg-icons";
4
4
  import { InputState } from "../../../enums/index.mjs";
5
- import { isRequiredRule, useFieldValidator } from "@antify/validate";
6
- import { reactive } from "vue";
7
5
  const meta = {
8
6
  title: "Inputs/Unit Input",
9
7
  component: AntUnitInput,
@@ -56,57 +54,6 @@ export const Docs = {
56
54
  description: "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod"
57
55
  }
58
56
  };
59
- export const withValidator = {
60
- render: (args) => ({
61
- components: { AntUnitInput },
62
- setup() {
63
- const validator = reactive(useFieldValidator([isRequiredRule]));
64
- return { args, validator, InputState };
65
- },
66
- template: `
67
- <AntUnitInput
68
- v-bind="args"
69
- v-model="args.modelValue"
70
- :unit="args.unit"
71
- :state="args.state ? args.state : (validator.hasErrors() ? InputState.danger : undefined)"
72
- :messages="Array.isArray(args.messages) ? args.messages : validator.getErrors()"
73
- @validate="(val) => validator.validate(val)"
74
- />`
75
- }),
76
- args: {
77
- modelValue: null,
78
- unit: "\u20AC",
79
- label: "Label",
80
- description: "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod"
81
- }
82
- };
83
- export const Limited = {
84
- render: (args) => ({
85
- components: { AntUnitInput },
86
- setup() {
87
- const validator = reactive(useFieldValidator([
88
- isRequiredRule,
89
- (val) => val <= 10 || "Value should not be bigger than 10",
90
- (val) => val <= 11 || "It should be really not bigger than 10!!!!"
91
- ]));
92
- return { args, validator };
93
- },
94
- template: `
95
- <AntUnitInput
96
- v-bind="args"
97
- v-model="args.modelValue"
98
- :unit="args.unit"
99
- :errors="Array.isArray(args.errors) ? args.errors : validator.getErrors()"
100
- @validate="(val) => validator.validate(val)"
101
- />`
102
- }),
103
- args: {
104
- ...Docs.args,
105
- modelValue: 50,
106
- limiter: true,
107
- max: 10
108
- }
109
- };
110
57
  export const UnitAsIcon = {
111
58
  render: Docs.render,
112
59
  args: {
@@ -27,13 +27,15 @@ const props = withDefaults(
27
27
  loading?: boolean;
28
28
  selectableRows?: boolean;
29
29
  showLightVersion?: boolean;
30
- size?: AntTableSize
30
+ size?: AntTableSize;
31
+ headerColor?: string;
31
32
  }>(), {
32
33
  rowKey: 'id',
33
34
  loading: false,
34
35
  selectableRows: false,
35
36
  showLightVersion: false,
36
- size: AntTableSize.md
37
+ size: AntTableSize.md,
38
+ headerColor: 'bg-neutral-200'
37
39
  });
38
40
 
39
41
  const selected: Ref<Record<string, unknown> | undefined> = useVModel(props, 'selectedRow', emits);
@@ -96,7 +98,7 @@ function rowClick(elem: Record<string, unknown>): void {
96
98
  class="min-w-full max-h-full relative"
97
99
  :class="{'h-full': data.length === 0 && !_loading}"
98
100
  >
99
- <thead class="bg-neutral-200 sticky top-0 z-10">
101
+ <thead class="sticky top-0 z-10" :class="headerColor">
100
102
  <tr>
101
103
  <slot name="headerFirstCell"/>
102
104
 
@@ -124,15 +126,15 @@ function rowClick(elem: Record<string, unknown>): void {
124
126
  <tbody class="bg-white relative">
125
127
  <!-- TODO:: Add some kind of virtual list for very large tree data (or required pagination??) -->
126
128
  <tr
127
- v-for="(elem, index) in data"
129
+ v-for="(elem, rowIndex) in data"
128
130
  :id="elem[rowKey] as string"
129
- :key="`table-row-${elem[rowKey]}-${index}`"
130
- class="transition-all"
131
+ :key="`table-row-${elem[rowKey]}-${rowIndex}`"
131
132
  :class="{
132
- 'bg-primary-200 text-primary-200-font': elem === selected,
133
- 'bg-white text-for-white-bg-font': elem !== selected && index % 2 === 0,
134
- 'bg-neutral-100 text-neutral-100-font': elem !== selected && index % 2 !== 0,
135
- 'cursor-pointer': selectableRows
133
+ 'bg-primary-200 text-primary-200-font transition-colors': elem === selected,
134
+ 'bg-white text-for-white-bg-font': elem !== selected && rowIndex % 2 === 0,
135
+ 'bg-neutral-100 text-neutral-100-font': elem !== selected && rowIndex % 2 !== 0,
136
+ 'cursor-pointer': selectableRows,
137
+ 'hover:bg-neutral-200': selectableRows && elem !== selected,
136
138
  }"
137
139
  >
138
140
  <slot
@@ -140,10 +142,10 @@ function rowClick(elem: Record<string, unknown>): void {
140
142
  v-bind="{ elem }"
141
143
  />
142
144
 
143
- <template v-for="(header, index) in _headers">
145
+ <template v-for="(header, colIndex) in _headers">
144
146
  <AntTd
145
147
  v-if="!_showLightVersion || (_showLightVersion && header.lightVersion)"
146
- :key="`table-cell-${header.identifier}-${index}`"
148
+ :key="`table-cell-${header.identifier}-${colIndex}`"
147
149
  :header="header"
148
150
  :element="elem"
149
151
  :align="header.align"
@@ -153,21 +155,21 @@ function rowClick(elem: Record<string, unknown>): void {
153
155
  <template #beforeCellContent="props">
154
156
  <slot
155
157
  name="beforeCellContent"
156
- v-bind="props"
158
+ v-bind="{...props, colIndex, rowIndex}"
157
159
  />
158
160
  </template>
159
161
 
160
162
  <template #cellContent="props">
161
163
  <slot
162
164
  name="cellContent"
163
- v-bind="props"
165
+ v-bind="{...props, colIndex, rowIndex}"
164
166
  />
165
167
  </template>
166
168
 
167
169
  <template #afterCellContent="props">
168
170
  <slot
169
171
  name="afterCellContent"
170
- v-bind="props"
172
+ v-bind="{...props, colIndex, rowIndex}"
171
173
  />
172
174
  </template>
173
175
  </AntTd>
@@ -1,8 +1,7 @@
1
1
  <script setup lang="ts">
2
-
3
2
  import {AntTableAlign, AntTableRowTypes, AntTableSize, type TableHeader} from './__types/TableHeader.types';
4
3
  import {computed} from 'vue';
5
- import type {RouteLocationRaw} from 'vue-router';
4
+ import {type RouteLocationRaw, RouterLink} from 'vue-router';
6
5
 
7
6
  const props =
8
7
  withDefaults(
@@ -136,7 +136,7 @@ const meta = {
136
136
  }
137
137
  };
138
138
  module.exports = meta;
139
- const testData = [];
139
+ const testData = (0, _vue.ref)([]);
140
140
  for (let i = 0; i < 100; i++) {
141
141
  const randomName = _faker.faker.person.firstName() + " " + _faker.faker.person.lastName();
142
142
  const randomNumber = _faker.faker.number.int({
@@ -145,13 +145,11 @@ for (let i = 0; i < 100; i++) {
145
145
  });
146
146
  const randomEmail = _faker.faker.internet.email();
147
147
  const randomBoolean = _faker.faker.datatype.boolean();
148
- testData.push({
148
+ testData.value.push({
149
149
  name: randomName,
150
150
  age: randomNumber,
151
151
  email: randomEmail,
152
- employeed: randomBoolean,
153
- linkLabel: "Link here",
154
- link: "/"
152
+ employed: randomBoolean
155
153
  });
156
154
  }
157
155
  const Docs = exports.Docs = {
@@ -169,10 +167,10 @@ const Docs = exports.Docs = {
169
167
  },
170
168
  template: `
171
169
  <div class="h-96 border border-dashed border-neutral-300">
172
- <AntTable v-bind="args" v-model="selected">
170
+ <AntTable v-bind="args" v-model="selected" :selected-row="selected" @row-click="(val) => selected = val">
173
171
  <template #cellContent="{element: entry, header}">
174
172
  <div v-if="header.identifier === 'employeed'">
175
- <AntSwitch :model-value="entry.employeed"/>
173
+ <AntSwitch v-model="entry.employeed"/>
176
174
  </div>
177
175
  </template>
178
176
  </AntTable>
@@ -202,13 +200,8 @@ const Docs = exports.Docs = {
202
200
  identifier: "employeed",
203
201
  rowClassList: "",
204
202
  type: _TableHeader.AntTableRowTypes.slot
205
- }, {
206
- title: "Link",
207
- identifier: "linkLabel",
208
- toProp: "link",
209
- type: _TableHeader.AntTableRowTypes.link
210
203
  }],
211
- data: testData
204
+ data: testData.value
212
205
  }
213
206
  };
214
207
  const Empty = exports.Empty = {
@@ -303,6 +296,6 @@ const Loading = exports.Loading = {
303
296
  toProp: "link",
304
297
  type: _TableHeader.AntTableRowTypes.link
305
298
  }],
306
- data: testData
299
+ data: testData.value
307
300
  }
308
301
  };
@@ -89,19 +89,17 @@ const meta = {
89
89
  }
90
90
  };
91
91
  export default meta;
92
- const testData = [];
92
+ const testData = ref([]);
93
93
  for (let i = 0; i < 100; i++) {
94
94
  const randomName = faker.person.firstName() + " " + faker.person.lastName();
95
95
  const randomNumber = faker.number.int({ min: 18, max: 60 });
96
96
  const randomEmail = faker.internet.email();
97
97
  const randomBoolean = faker.datatype.boolean();
98
- testData.push({
98
+ testData.value.push({
99
99
  name: randomName,
100
100
  age: randomNumber,
101
101
  email: randomEmail,
102
- employeed: randomBoolean,
103
- linkLabel: "Link here",
104
- link: "/"
102
+ employed: randomBoolean
105
103
  });
106
104
  }
107
105
  export const Docs = {
@@ -113,10 +111,10 @@ export const Docs = {
113
111
  },
114
112
  template: `
115
113
  <div class="h-96 border border-dashed border-neutral-300">
116
- <AntTable v-bind="args" v-model="selected">
114
+ <AntTable v-bind="args" v-model="selected" :selected-row="selected" @row-click="(val) => selected = val">
117
115
  <template #cellContent="{element: entry, header}">
118
116
  <div v-if="header.identifier === 'employeed'">
119
- <AntSwitch :model-value="entry.employeed"/>
117
+ <AntSwitch v-model="entry.employeed"/>
120
118
  </div>
121
119
  </template>
122
120
  </AntTable>
@@ -150,15 +148,9 @@ export const Docs = {
150
148
  identifier: "employeed",
151
149
  rowClassList: "",
152
150
  type: AntTableRowTypes.slot
153
- },
154
- {
155
- title: "Link",
156
- identifier: "linkLabel",
157
- toProp: "link",
158
- type: AntTableRowTypes.link
159
151
  }
160
152
  ],
161
- data: testData
153
+ data: testData.value
162
154
  }
163
155
  };
164
156
  export const Empty = {
@@ -268,6 +260,6 @@ export const Loading = {
268
260
  type: AntTableRowTypes.link
269
261
  }
270
262
  ],
271
- data: testData
263
+ data: testData.value
272
264
  }
273
265
  };
@@ -1,6 +1,7 @@
1
1
  <script setup lang="ts">
2
2
  import AntIcon from '../AntIcon.vue';
3
3
  import {
4
+ faCircleInfo,
4
5
  faExclamationCircle,
5
6
  faExclamationTriangle,
6
7
  type IconDefinition
@@ -8,34 +9,40 @@ import {
8
9
  import {computed} from 'vue';
9
10
  import {type RouteLocationRaw, useRoute} from 'vue-router';
10
11
  import {TabItemState} from './__types/AntTabItem.types';
12
+ import {AntSkeleton} from "../../../dist";
11
13
 
12
14
  const props = withDefaults(defineProps<{
13
15
  label: string;
14
16
  active: boolean;
17
+ disabled?: boolean;
15
18
  state?: TabItemState
16
19
  showIcon?: boolean;
17
20
  icon?: IconDefinition;
18
21
  to?: RouteLocationRaw;
19
22
  expanded?: boolean;
23
+ skeleton?: boolean;
20
24
  }>(), {
21
25
  state: TabItemState.base,
22
26
  showIcon: true,
27
+ disabled: false,
28
+ skeleton: false,
23
29
  });
24
30
  const route = useRoute();
25
31
 
26
32
  const icons = {
27
33
  [TabItemState.base]: null,
34
+ [TabItemState.info]: faCircleInfo,
28
35
  [TabItemState.danger]: faExclamationCircle,
29
36
  [TabItemState.warning]: faExclamationTriangle,
30
37
  };
31
38
  const iconRight = computed<IconDefinition | null>(() => icons[props.state]);
32
39
  const _active = computed<boolean>(() => {
33
40
  if (typeof props.to === 'string') {
34
- return route.path === props.to;
41
+ return route.path.startsWith(props.to);
35
42
  }
36
43
 
37
44
  if (typeof props.to === 'object' && props.to?.name !== undefined) {
38
- return route.name === props.to.name;
45
+ return route.name.startsWith(props.to.name);
39
46
  }
40
47
 
41
48
  return props.active;
@@ -43,31 +50,37 @@ const _active = computed<boolean>(() => {
43
50
  const containerClasses = computed(() => {
44
51
  const variants: Record<TabItemState, string> = {
45
52
  [TabItemState.base]: 'hover:bg-neutral-100',
53
+ [TabItemState.info]: 'hover:bg-neutral-100',
46
54
  [TabItemState.warning]: 'hover:bg-warning-100',
47
55
  [TabItemState.danger]: 'hover:bg-danger-100',
48
56
  };
49
57
  const activeVariants: Record<TabItemState, string> = {
50
58
  [TabItemState.base]: 'text-primary-500 border-primary-500',
59
+ [TabItemState.info]: 'text-info-500 border-info-500',
51
60
  [TabItemState.warning]: 'text-warning-500 border-warning-500',
52
61
  [TabItemState.danger]: 'text-danger-500 border-danger-500',
53
62
  };
54
63
  const notActiveVariants: Record<TabItemState, string> = {
55
- [TabItemState.base]: 'text-for-white-bg-font border-white',
64
+ [TabItemState.base]: 'text-for-white-bg-font',
65
+ [TabItemState.info]: 'text-info-500',
56
66
  [TabItemState.warning]: 'text-warning-500',
57
67
  [TabItemState.danger]: 'text-danger-500',
58
68
  };
59
69
 
60
70
  return {
61
- 'p-2 hover:cursor-pointer text-center flex items-center justify-center gap-2 bg-white transition-[background-color] relative text-sm': true,
71
+ 'p-2 text-center flex items-center justify-center gap-2 bg-white transition-[background-color] relative text-sm text-nowrap': true,
62
72
  'grow': props.expanded,
63
- [variants[props.state]]: true,
73
+ [variants[props.state]]: !props.disabled,
64
74
  [activeVariants[props.state]]: _active.value,
65
75
  [notActiveVariants[props.state]]: !_active.value,
76
+ 'hover:cursor-pointer': !props.disabled,
77
+ 'hover:cursor-not-allowed opacity-50': props.disabled,
66
78
  };
67
79
  });
68
80
  const borderBoxClasses = computed(() => {
69
81
  const variants: Record<TabItemState, string> = {
70
82
  [TabItemState.base]: 'bg-primary-500',
83
+ [TabItemState.info]: 'bg-info-500',
71
84
  [TabItemState.warning]: 'bg-warning-500',
72
85
  [TabItemState.danger]: 'bg-danger-500',
73
86
  };
@@ -80,6 +93,7 @@ const borderBoxClasses = computed(() => {
80
93
  const iconColor = computed(() => {
81
94
  const variants = {
82
95
  [TabItemState.base]: 'text-neutral-100-font',
96
+ [TabItemState.info]: 'text-info-500',
83
97
  [TabItemState.warning]: 'text-warning-500',
84
98
  [TabItemState.danger]: 'text-danger-500',
85
99
  };
@@ -90,7 +104,7 @@ const iconColor = computed(() => {
90
104
 
91
105
  <template>
92
106
  <component
93
- :is="to !== undefined ? 'router-link' : 'div'"
107
+ :is="to !== undefined && !disabled ? 'router-link' : 'div'"
94
108
  :to="to"
95
109
  :class="containerClasses"
96
110
  >
@@ -102,7 +116,10 @@ const iconColor = computed(() => {
102
116
  />
103
117
  </slot>
104
118
 
105
- <slot>{{ label }}</slot>
119
+ <div class="relative">
120
+ <slot>{{ label }}</slot>
121
+ <AntSkeleton v-if="skeleton" rounded absolute/>
122
+ </div>
106
123
 
107
124
  <AntIcon
108
125
  v-if="iconRight && showIcon"
@@ -9,14 +9,18 @@ const props = withDefaults(defineProps<{
9
9
  modelValue?: string;
10
10
  tabItems?: TabItem[];
11
11
  expanded?: boolean;
12
+ skeleton?: boolean;
12
13
  }>(), {
13
14
  expanded: false,
15
+ skeleton: false,
14
16
  });
15
17
 
16
18
  const currentActive = useVModel(props, 'modelValue', emits);
17
19
  const containerClasses = computed(() => ({
18
- 'flex items-stretch bg-neutral-300 gap-px transition-all h-full': true,
19
- 'w-fit': !props.expanded,
20
+ 'flex transition-all h-full': true,
21
+ }));
22
+
23
+ const scrollContainerClasses = computed(() => ({
20
24
  'w-full': props.expanded,
21
25
  }));
22
26
 
@@ -25,12 +29,17 @@ function clickTab(tabItem: TabItem) {
25
29
  tabItem.clickHandler();
26
30
  }
27
31
 
32
+ if (tabItem.disabled){
33
+ return
34
+ }
35
+
28
36
  currentActive.value = tabItem.id;
29
37
  }
30
38
  </script>
31
39
 
32
40
  <template>
33
41
  <div :class="containerClasses">
42
+ <div class="flex gap-px bg-neutral-300 border-l border-r border-neutral-300 overflow-x-auto" :class="scrollContainerClasses">
34
43
  <slot>
35
44
  <AntTabItem
36
45
  v-for="(tabItem, index) in tabItems"
@@ -39,9 +48,12 @@ function clickTab(tabItem: TabItem) {
39
48
  @click="clickTab(tabItem)"
40
49
  :active="currentActive === tabItem.id"
41
50
  :expanded="expanded"
51
+ :disabled="tabItem.disabled"
52
+ :skeleton="skeleton"
42
53
  >
43
54
  <slot name="content" v-bind="{item: tabItem, isActive: currentActive === tabItem.id}"></slot>
44
55
  </AntTabItem>
45
56
  </slot>
57
+ </div>
46
58
  </div>
47
59
  </template>
@@ -5,5 +5,6 @@ export default meta;
5
5
  type Story = StoryObj<typeof AntTabs>;
6
6
  export declare const Docs: Story;
7
7
  export declare const FixedHeight: Story;
8
+ export declare const HorizontalScrolling: Story;
8
9
  export declare const DifferentStates: Story;
9
10
  export declare const Summary: Story;
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- module.exports = exports.Summary = exports.FixedHeight = exports.Docs = exports.DifferentStates = void 0;
6
+ module.exports = exports.Summary = exports.HorizontalScrolling = exports.FixedHeight = exports.Docs = exports.DifferentStates = void 0;
7
7
  var _AntTabs = _interopRequireDefault(require("../AntTabs.vue"));
8
8
  var _AntFormGroupLabel = _interopRequireDefault(require("../../forms/AntFormGroupLabel.vue"));
9
9
  var _AntFormGroup = _interopRequireDefault(require("../../forms/AntFormGroup.vue"));
@@ -83,6 +83,68 @@ const FixedHeight = exports.FixedHeight = {
83
83
  }),
84
84
  args: Docs.args
85
85
  };
86
+ const HorizontalScrolling = exports.HorizontalScrolling = {
87
+ render: args => ({
88
+ components: {
89
+ AntTabs: _AntTabs.default,
90
+ AntFormGroupLabel: _AntFormGroupLabel.default,
91
+ AntFormGroup: _AntFormGroup.default
92
+ },
93
+ setup() {
94
+ return {
95
+ args
96
+ };
97
+ },
98
+ template: `
99
+ <AntFormGroup>
100
+
101
+ <AntFormGroupLabel>Default Small</AntFormGroupLabel>
102
+ <AntFormGroup class="dashed max-w-[320px] overflow-hidden">
103
+ <AntTabs v-bind="args" v-model="args.modelValue" />
104
+ </AntFormGroup>
105
+
106
+ <AntFormGroupLabel>Expanded Small</AntFormGroupLabel>
107
+ <AntFormGroup class="dashed max-w-[320px] overflow-hidden">
108
+ <AntTabs v-bind="args" v-model="args.modelValue" expanded />
109
+ </AntFormGroup>
110
+
111
+ <AntFormGroupLabel>Default Large</AntFormGroupLabel>
112
+ <AntFormGroup class="dashed">
113
+ <AntTabs v-bind="args" v-model="args.modelValue" />
114
+ </AntFormGroup>
115
+
116
+ <AntFormGroupLabel>Expanded Large</AntFormGroupLabel>
117
+ <AntFormGroup class="dashed">
118
+ <AntTabs v-bind="args" v-model="args.modelValue" expanded />
119
+ </AntFormGroup>
120
+
121
+ </AntFormGroup>
122
+ `
123
+ }),
124
+ args: {
125
+ tabItems: [{
126
+ id: "1",
127
+ label: "First tab"
128
+ }, {
129
+ id: "2",
130
+ label: "Second tab"
131
+ }, {
132
+ id: "3",
133
+ label: "Third tab",
134
+ state: _AntTabItem.TabItemState.warning
135
+ }, {
136
+ id: "4",
137
+ label: "Fourth tab",
138
+ state: _AntTabItem.TabItemState.danger
139
+ }, {
140
+ id: "5",
141
+ label: "Fifth tab"
142
+ }, {
143
+ id: "6",
144
+ label: "Sixth tab"
145
+ }]
146
+ }
147
+ };
86
148
  const DifferentStates = exports.DifferentStates = {
87
149
  render: Docs.render,
88
150
  args: {
@@ -100,6 +162,10 @@ const DifferentStates = exports.DifferentStates = {
100
162
  id: "4",
101
163
  label: "Fourth tab",
102
164
  state: _AntTabItem.TabItemState.danger
165
+ }, {
166
+ id: "5",
167
+ label: "Fifth tab",
168
+ state: _AntTabItem.TabItemState.info
103
169
  }]
104
170
  }
105
171
  };
@@ -114,6 +180,7 @@ const Summary = exports.Summary = {
114
180
  const value_1 = (0, _vue.ref)();
115
181
  const value_2 = (0, _vue.ref)();
116
182
  const value_3 = (0, _vue.ref)("2");
183
+ const value_4 = (0, _vue.ref)();
117
184
  const tabItems_1 = [{
118
185
  id: "1",
119
186
  label: "My account"
@@ -146,14 +213,38 @@ const Summary = exports.Summary = {
146
213
  label: "Messages",
147
214
  to: "/#"
148
215
  }];
216
+ const tabItems_4 = [{
217
+ id: "1",
218
+ label: "First tab"
219
+ }, {
220
+ id: "2",
221
+ label: "Second tab"
222
+ }, {
223
+ id: "3",
224
+ label: "Third tab",
225
+ state: _AntTabItem.TabItemState.warning
226
+ }, {
227
+ id: "4",
228
+ label: "Fourth tab",
229
+ state: _AntTabItem.TabItemState.danger
230
+ }, {
231
+ id: "5",
232
+ label: "Fifth tab",
233
+ state: _AntTabItem.TabItemState.info
234
+ }, {
235
+ id: "6",
236
+ label: "Sixth tab"
237
+ }];
149
238
  return {
150
239
  args,
151
240
  value_1,
152
241
  value_2,
153
242
  value_3,
243
+ value_4,
154
244
  tabItems_1,
155
245
  tabItems_2,
156
- tabItems_3
246
+ tabItems_3,
247
+ tabItems_4
157
248
  };
158
249
  },
159
250
  template: `
@@ -167,15 +258,30 @@ const Summary = exports.Summary = {
167
258
 
168
259
  <AntFormGroupLabel>Expanded</AntFormGroupLabel>
169
260
  <AntFormGroup>
170
- <div class="dashed"><AntTabs v-model="value_1" :tab-items="tabItems_1" expanded separators/></div>
171
- <div class="dashed"><AntTabs v-model="value_2" :tab-items="tabItems_2" expanded separators/></div>
172
- <div class="dashed"><AntTabs v-model="value_3" :tab-items="tabItems_3" expanded separators/></div>
261
+ <div class="dashed"><AntTabs v-model="value_1" :tab-items="tabItems_1" expanded/></div>
262
+ <div class="dashed"><AntTabs v-model="value_2" :tab-items="tabItems_2" expanded/></div>
263
+ <div class="dashed"><AntTabs v-model="value_3" :tab-items="tabItems_3" expanded/></div>
173
264
  </AntFormGroup>
174
265
 
175
266
  <AntFormGroupLabel>Larger container</AntFormGroupLabel>
176
267
  <div class="h-16 dashed">
177
- <AntTabs v-model="value_3" :tab-items="tabItems_3" expanded separators/>
268
+ <AntTabs v-model="value_3" :tab-items="tabItems_3" expanded/>
269
+ </div>
270
+
271
+ <AntFormGroupLabel>Different States</AntFormGroupLabel>
272
+ <div class="dashed">
273
+ <AntTabs v-model="value_4" :tab-items="tabItems_4" />
178
274
  </div>
275
+
276
+ <AntFormGroupLabel>Default Small Parent Container</AntFormGroupLabel>
277
+ <AntFormGroup class="dashed max-w-[320px] overflow-hidden">
278
+ <AntTabs v-model="value_4" :tab-items="tabItems_4" />
279
+ </AntFormGroup>
280
+
281
+ <AntFormGroupLabel>Expanded Small Parent Container</AntFormGroupLabel>
282
+ <AntFormGroup class="dashed max-w-[320px] overflow-hidden">
283
+ <AntTabs v-model="value_4" :tab-items="tabItems_4" expanded />
284
+ </AntFormGroup>
179
285
  </AntFormGroup>
180
286
  `
181
287
  }),