@phoenix-cg/v-tabs 0.2.0 → 0.2.2

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/dist/v-tabs.css CHANGED
@@ -1 +1 @@
1
- .v-tabs{position:relative}.v-tabs_inner{display:flex}.v-tabs_tab{padding:10px 20px;background:#ddd;cursor:pointer;-webkit-user-select:none;user-select:none}.v-tabs_tab.__active{background:#b6b5b5}.v-tabs.__disabled{pointer-events:none;opacity:.5}.v-tabs_slider{position:absolute;height:2px;background:#000;left:0;bottom:0;transition:all .2s ease-in-out}
1
+ .v-tabs-wrap{position:relative;display:inline-flex;max-width:100%}.v-tabs{position:relative}.v-tabs_inner{display:flex}.v-tabs_tab{padding:10px 20px;background:#ddd;cursor:pointer;-webkit-user-select:none;user-select:none}.v-tabs_tab.__active{background:#b6b5b5}.v-tabs.__disabled{pointer-events:none;opacity:.5}.v-tabs_slider{position:absolute;height:2px;background:#000;left:0;bottom:0;transition:all .2s ease-in-out}.v-tabs-hint{transition:opacity .3s ease-in-out;opacity:0;pointer-events:none}.v-tabs-hint.__visible{opacity:1}
package/dist/v-tabs.es.js CHANGED
@@ -1,10 +1,10 @@
1
- import { mergeModels as y, useModel as R, ref as C, useTemplateRef as v, onMounted as x, onBeforeUnmount as z, watch as E, createElementBlock as n, openBlock as s, normalizeClass as b, createElementVNode as L, createCommentVNode as N, Fragment as h, renderList as $, renderSlot as M, toDisplayString as S, createTextVNode as F, normalizeStyle as O, nextTick as q } from "vue";
2
- const A = { class: "v-tabs_inner" }, D = ["data-id", "onClick"], P = {
1
+ import { mergeModels as S, useModel as F, ref as b, useTemplateRef as w, computed as M, onMounted as P, onBeforeUnmount as q, watch as g, createElementBlock as r, openBlock as n, createElementVNode as k, createBlock as B, normalizeClass as C, createCommentVNode as I, Fragment as T, renderList as A, resolveDynamicComponent as H, mergeProps as U, withCtx as X, renderSlot as j, toDisplayString as _, createTextVNode as G, normalizeStyle as J, unref as K, nextTick as Q } from "vue";
2
+ const W = { class: "v-tabs-wrap" }, Y = { class: "v-tabs_inner" }, Z = {
3
3
  key: 0,
4
4
  class: "v-tabs_tab_title"
5
- }, X = {
5
+ }, te = {
6
6
  __name: "VTabs",
7
- props: /* @__PURE__ */ y({
7
+ props: /* @__PURE__ */ S({
8
8
  direction: {
9
9
  type: String,
10
10
  default: "horizontal"
@@ -36,87 +36,137 @@ const A = { class: "v-tabs_inner" }, D = ["data-id", "onClick"], P = {
36
36
  wrapTitle: {
37
37
  type: Boolean,
38
38
  default: !1
39
+ },
40
+ mobileHintComponent: {
41
+ type: String
42
+ },
43
+ mobileHintShowDelay: {
44
+ type: Number,
45
+ default: 1500
46
+ },
47
+ mobileHintHideDelay: {
48
+ type: Number,
49
+ default: 2e3
50
+ },
51
+ tabComponent: {
52
+ type: String,
53
+ default: "div"
54
+ },
55
+ tabProps: {
56
+ type: Function,
57
+ default: () => ({})
39
58
  }
40
59
  }, {
41
60
  modelValue: {},
42
61
  modelModifiers: {}
43
62
  }),
44
- emits: /* @__PURE__ */ y(["update:modelValue"], ["update:modelValue"]),
45
- setup(a, { emit: g }) {
46
- const e = a, r = R(a, "modelValue"), k = g, u = C({});
47
- let i = null;
48
- const B = v("tabs"), f = v("root");
49
- function w() {
50
- e.withSlider && (i = new ResizeObserver(() => {
51
- d();
52
- }), B.value.forEach((t) => {
53
- i.observe(t);
63
+ emits: /* @__PURE__ */ S(["update:modelValue"], ["update:modelValue"]),
64
+ setup(i, { emit: V }) {
65
+ const e = i, s = F(i, "modelValue"), R = V, v = b({});
66
+ let a = null, c = b(!1), u = b(null);
67
+ const N = w("tabs"), d = w("root"), y = M(() => e.mobileHintComponent);
68
+ function x() {
69
+ e.withSlider && (a = new ResizeObserver(() => {
70
+ m();
71
+ }), N.value.forEach((t) => {
72
+ a.observe(t);
54
73
  }));
55
74
  }
56
- function T() {
57
- i == null || i.disconnect(), i = null;
75
+ function D() {
76
+ a == null || a.disconnect(), a = null;
77
+ }
78
+ function h() {
79
+ y.value && (u.value = new IntersectionObserver((t, o) => {
80
+ t.forEach((l) => {
81
+ l.isIntersecting && (E(), o.disconnect(), u.value = null);
82
+ });
83
+ }, {
84
+ threshold: 1
85
+ }), u.value.observe(d.value));
86
+ }
87
+ function E() {
88
+ setTimeout(() => {
89
+ c.value = !0, z();
90
+ }, e.mobileHintShowDelay);
91
+ }
92
+ function z() {
93
+ setTimeout(() => {
94
+ c.value = !1;
95
+ }, e.mobileHintShowDelay);
58
96
  }
59
- function c(t) {
60
- k("update:modelValue", t), d();
97
+ function f(t) {
98
+ R("update:modelValue", t), m();
61
99
  }
62
- async function d() {
63
- if (!e.withSlider || !f.value)
100
+ async function m() {
101
+ if (!e.withSlider || !d.value)
64
102
  return;
65
- const t = f.value;
66
- await q();
103
+ const t = d.value;
104
+ await Q();
67
105
  const { left: o } = t.getBoundingClientRect(), [l] = t.getElementsByClassName("__active");
68
106
  if (l) {
69
107
  const {
70
- left: m,
71
- width: _
72
- } = l.getBoundingClientRect(), p = t.scrollLeft, V = m + p - o;
73
- u.value = {
74
- transform: `translateX(${V}px)`,
75
- width: `${_}px`
108
+ left: p,
109
+ width: L
110
+ } = l.getBoundingClientRect(), O = t.scrollLeft, $ = p + O - o;
111
+ v.value = {
112
+ transform: `translateX(${$}px)`,
113
+ width: `${L}px`
76
114
  };
77
115
  }
78
116
  }
79
- return x(() => {
80
- if (e.selectFirst && e.list.length && !r.value && c(e.list[0]), e.initialTab && e.list.length && !r.value) {
117
+ return P(() => {
118
+ if (e.selectFirst && e.list.length && !s.value && f(e.list[0]), e.initialTab && e.list.length && !s.value) {
81
119
  const t = e.list.find((o) => o[e.trackBy] === e.initialTab);
82
- t && c(t);
120
+ t && f(t);
83
121
  }
84
- w();
85
- }), z(() => {
86
- T();
87
- }), E(r, () => {
88
- e.withSlider && d();
89
- }), (t, o) => (s(), n("div", {
90
- class: b(["v-tabs", [`__${e.direction}`]]),
91
- ref: "root"
92
- }, [
93
- L("div", A, [
94
- (s(!0), n(h, null, $(e.list, (l) => (s(), n("div", {
95
- key: l[a.trackBy],
96
- ref_for: !0,
97
- ref: "tabs",
98
- class: b(["v-tabs_tab", {
99
- __active: r.value && r.value[a.trackBy] === l[a.trackBy],
100
- _disabled: l && l._disabled
101
- }]),
102
- "data-id": l[a.trackBy],
103
- onClick: (m) => c(l)
104
- }, [
105
- M(t.$slots, "single-tab", { tab: l }, () => [
106
- a.wrapTitle ? (s(), n("div", P, S(l[a.label] || ""), 1)) : (s(), n(h, { key: 1 }, [
107
- F(S(l[a.label] || ""), 1)
108
- ], 64))
109
- ])
110
- ], 10, D))), 128))
111
- ]),
112
- e.withSlider ? (s(), n("div", {
113
- key: 0,
114
- style: O(u.value),
115
- class: "v-tabs_slider"
116
- }, null, 4)) : N("", !0)
117
- ], 2));
122
+ x(), h();
123
+ }), q(() => {
124
+ D();
125
+ }), g(s, () => {
126
+ e.withSlider && m();
127
+ }), g(y, () => {
128
+ h();
129
+ }), (t, o) => (n(), r("div", W, [
130
+ k("div", {
131
+ class: C(["v-tabs", [`__${e.direction}`]]),
132
+ ref: "root"
133
+ }, [
134
+ k("div", Y, [
135
+ (n(!0), r(T, null, A(e.list, (l) => (n(), B(H(e.tabComponent), U({
136
+ key: l[i.trackBy],
137
+ ref_for: !0,
138
+ ref: "tabs",
139
+ class: "v-tabs_tab"
140
+ }, e.tabProps, {
141
+ "data-id": l[i.trackBy],
142
+ class: {
143
+ __active: s.value && s.value[i.trackBy] === l[i.trackBy],
144
+ _disabled: l && l._disabled
145
+ },
146
+ onClick: (p) => f(l)
147
+ }), {
148
+ default: X(() => [
149
+ j(t.$slots, "single-tab", { tab: l }, () => [
150
+ i.wrapTitle ? (n(), r("div", Z, _(l[i.label] || ""), 1)) : (n(), r(T, { key: 1 }, [
151
+ G(_(l[i.label] || ""), 1)
152
+ ], 64))
153
+ ])
154
+ ]),
155
+ _: 2
156
+ }, 1040, ["data-id", "class", "onClick"]))), 128))
157
+ ]),
158
+ e.withSlider ? (n(), r("div", {
159
+ key: 0,
160
+ style: J(v.value),
161
+ class: "v-tabs_slider"
162
+ }, null, 4)) : I("", !0)
163
+ ], 2),
164
+ (n(), B(H(e.mobileHintComponent), {
165
+ class: C(["v-tabs-hint", { __visible: K(c) }])
166
+ }, null, 8, ["class"]))
167
+ ]));
118
168
  }
119
169
  };
120
170
  export {
121
- X as default
171
+ te as default
122
172
  };
@@ -1 +1 @@
1
- (function(e,o){typeof exports=="object"&&typeof module<"u"?module.exports=o(require("vue")):typeof define=="function"&&define.amd?define(["vue"],o):(e=typeof globalThis<"u"?globalThis:e||self,e.VTabs=o(e.Vue))})(this,function(e){"use strict";const o={class:"v-tabs_inner"},y=["data-id","onClick"],k={key:0,class:"v-tabs_tab_title"};return{__name:"VTabs",props:e.mergeModels({direction:{type:String,default:"horizontal"},trackBy:{type:String,default:"_id"},label:{type:String,default:"title"},list:{type:Array,required:!0},selectFirst:{type:Boolean,default:!0},withSlider:{type:Boolean,default:!1},initialTab:{type:[Number,String],default:null},wrapTitle:{type:Boolean,default:!1}},{modelValue:{},modelModifiers:{}}),emits:e.mergeModels(["update:modelValue"],["update:modelValue"]),setup(i,{emit:B}){const t=i,s=e.useModel(i,"modelValue"),b=B,f=e.ref({});let a=null;const h=e.useTemplateRef("tabs"),m=e.useTemplateRef("root");function p(){t.withSlider&&(a=new ResizeObserver(()=>{d()}),h.value.forEach(l=>{a.observe(l)}))}function g(){a==null||a.disconnect(),a=null}function c(l){b("update:modelValue",l),d()}async function d(){if(!t.withSlider||!m.value)return;const l=m.value;await e.nextTick();const{left:r}=l.getBoundingClientRect(),[n]=l.getElementsByClassName("__active");if(n){const{left:u,width:S}=n.getBoundingClientRect(),T=l.scrollLeft,w=u+T-r;f.value={transform:`translateX(${w}px)`,width:`${S}px`}}}return e.onMounted(()=>{if(t.selectFirst&&t.list.length&&!s.value&&c(t.list[0]),t.initialTab&&t.list.length&&!s.value){const l=t.list.find(r=>r[t.trackBy]===t.initialTab);l&&c(l)}p()}),e.onBeforeUnmount(()=>{g()}),e.watch(s,()=>{t.withSlider&&d()}),(l,r)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["v-tabs",[`__${t.direction}`]]),ref:"root"},[e.createElementVNode("div",o,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.list,n=>(e.openBlock(),e.createElementBlock("div",{key:n[i.trackBy],ref_for:!0,ref:"tabs",class:e.normalizeClass(["v-tabs_tab",{__active:s.value&&s.value[i.trackBy]===n[i.trackBy],_disabled:n&&n._disabled}]),"data-id":n[i.trackBy],onClick:u=>c(n)},[e.renderSlot(l.$slots,"single-tab",{tab:n},()=>[i.wrapTitle?(e.openBlock(),e.createElementBlock("div",k,e.toDisplayString(n[i.label]||""),1)):(e.openBlock(),e.createElementBlock(e.Fragment,{key:1},[e.createTextVNode(e.toDisplayString(n[i.label]||""),1)],64))])],10,y))),128))]),t.withSlider?(e.openBlock(),e.createElementBlock("div",{key:0,style:e.normalizeStyle(f.value),class:"v-tabs_slider"},null,4)):e.createCommentVNode("",!0)],2))}}});
1
+ (function(e,s){typeof exports=="object"&&typeof module<"u"?module.exports=s(require("vue")):typeof define=="function"&&define.amd?define(["vue"],s):(e=typeof globalThis<"u"?globalThis:e||self,e.VTabs=s(e.Vue))})(this,function(e){"use strict";const s={class:"v-tabs-wrap"},k={class:"v-tabs_inner"},B={key:0,class:"v-tabs_tab_title"};return{__name:"VTabs",props:e.mergeModels({direction:{type:String,default:"horizontal"},trackBy:{type:String,default:"_id"},label:{type:String,default:"title"},list:{type:Array,required:!0},selectFirst:{type:Boolean,default:!0},withSlider:{type:Boolean,default:!1},initialTab:{type:[Number,String],default:null},wrapTitle:{type:Boolean,default:!1},mobileHintComponent:{type:String},mobileHintShowDelay:{type:Number,default:1500},mobileHintHideDelay:{type:Number,default:2e3},tabComponent:{type:String,default:"div"},tabProps:{type:Function,default:()=>({})}},{modelValue:{},modelModifiers:{}}),emits:e.mergeModels(["update:modelValue"],["update:modelValue"]),setup(i,{emit:S}){const t=i,r=e.useModel(i,"modelValue"),g=S,b=e.ref({});let o=null,c=e.ref(!1),d=e.ref(null);const w=e.useTemplateRef("tabs"),f=e.useTemplateRef("root"),y=e.computed(()=>t.mobileHintComponent);function T(){t.withSlider&&(o=new ResizeObserver(()=>{u()}),w.value.forEach(l=>{o.observe(l)}))}function C(){o==null||o.disconnect(),o=null}function p(){y.value&&(d.value=new IntersectionObserver((l,a)=>{l.forEach(n=>{n.isIntersecting&&(_(),a.disconnect(),d.value=null)})},{threshold:1}),d.value.observe(f.value))}function _(){setTimeout(()=>{c.value=!0,H()},t.mobileHintShowDelay)}function H(){setTimeout(()=>{c.value=!1},t.mobileHintShowDelay)}function m(l){g("update:modelValue",l),u()}async function u(){if(!t.withSlider||!f.value)return;const l=f.value;await e.nextTick();const{left:a}=l.getBoundingClientRect(),[n]=l.getElementsByClassName("__active");if(n){const{left:h,width:V}=n.getBoundingClientRect(),E=l.scrollLeft,R=h+E-a;b.value={transform:`translateX(${R}px)`,width:`${V}px`}}}return e.onMounted(()=>{if(t.selectFirst&&t.list.length&&!r.value&&m(t.list[0]),t.initialTab&&t.list.length&&!r.value){const l=t.list.find(a=>a[t.trackBy]===t.initialTab);l&&m(l)}T(),p()}),e.onBeforeUnmount(()=>{C()}),e.watch(r,()=>{t.withSlider&&u()}),e.watch(y,()=>{p()}),(l,a)=>(e.openBlock(),e.createElementBlock("div",s,[e.createElementVNode("div",{class:e.normalizeClass(["v-tabs",[`__${t.direction}`]]),ref:"root"},[e.createElementVNode("div",k,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.list,n=>(e.openBlock(),e.createBlock(e.resolveDynamicComponent(t.tabComponent),e.mergeProps({key:n[i.trackBy],ref_for:!0,ref:"tabs",class:"v-tabs_tab"},t.tabProps,{"data-id":n[i.trackBy],class:{__active:r.value&&r.value[i.trackBy]===n[i.trackBy],_disabled:n&&n._disabled},onClick:h=>m(n)}),{default:e.withCtx(()=>[e.renderSlot(l.$slots,"single-tab",{tab:n},()=>[i.wrapTitle?(e.openBlock(),e.createElementBlock("div",B,e.toDisplayString(n[i.label]||""),1)):(e.openBlock(),e.createElementBlock(e.Fragment,{key:1},[e.createTextVNode(e.toDisplayString(n[i.label]||""),1)],64))])]),_:2},1040,["data-id","class","onClick"]))),128))]),t.withSlider?(e.openBlock(),e.createElementBlock("div",{key:0,style:e.normalizeStyle(b.value),class:"v-tabs_slider"},null,4)):e.createCommentVNode("",!0)],2),(e.openBlock(),e.createBlock(e.resolveDynamicComponent(t.mobileHintComponent),{class:e.normalizeClass(["v-tabs-hint",{__visible:e.unref(c)}])},null,8,["class"]))]))}}});
package/package.json CHANGED
@@ -1,10 +1,11 @@
1
1
  {
2
2
  "name": "@phoenix-cg/v-tabs",
3
- "version": "0.2.0",
3
+ "version": "0.2.2",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "module": "./dist/v-tabs.es.js",
7
7
  "browser": "dist/v-tabs.umd.js",
8
+ "main": "./dist/v-tabs.es.js",
8
9
  "scripts": {
9
10
  "dev": "vite",
10
11
  "build": "vite build",
@@ -1,36 +1,46 @@
1
1
  <template>
2
- <div class="v-tabs" :class="[`__${props.direction}`]" ref="root">
3
- <div class="v-tabs_inner">
4
- <div
5
- v-for="tab in props.list"
6
- :key="tab[trackBy]"
7
- ref="tabs"
8
- class="v-tabs_tab"
9
- :data-id="tab[trackBy]"
10
- :class="{
11
- __active: model && model[trackBy] === tab[trackBy],
12
- _disabled: tab && tab._disabled
13
- }"
14
- @click="handleTabSelect(tab, $event)"
15
- >
16
- <slot name="single-tab" :tab="tab">
17
- <template v-if="wrapTitle">
18
- <div class="v-tabs_tab_title">
2
+ <div class="v-tabs-wrap">
3
+ <div class="v-tabs" :class="[`__${props.direction}`]" ref="root">
4
+ <div class="v-tabs_inner">
5
+ <component
6
+ :is="props.tabComponent"
7
+ v-for="tab in props.list"
8
+ :key="tab[trackBy]"
9
+ ref="tabs"
10
+ class="v-tabs_tab"
11
+ v-bind="props.tabProps"
12
+ :data-id="tab[trackBy]"
13
+ :class="{
14
+ __active: model && model[trackBy] === tab[trackBy],
15
+ _disabled: tab && tab._disabled
16
+ }"
17
+ @click="handleTabSelect(tab, $event)"
18
+ >
19
+ <slot name="single-tab" :tab="tab">
20
+ <template v-if="wrapTitle">
21
+ <div class="v-tabs_tab_title">
22
+ {{ tab[label] || "" }}
23
+ </div>
24
+ </template>
25
+ <template v-else>
19
26
  {{ tab[label] || "" }}
20
- </div>
21
- </template>
22
- <template v-else>
23
- {{ tab[label] || "" }}
24
- </template>
25
- </slot>
27
+ </template>
28
+ </slot>
29
+ </component>
26
30
  </div>
31
+ <div v-if="props.withSlider" :style="sliderStyle" class="v-tabs_slider" />
27
32
  </div>
28
- <div v-if="props.withSlider" :style="sliderStyle" class="v-tabs_slider" />
33
+ <component
34
+ :is="props.mobileHintComponent"
35
+ class="v-tabs-hint"
36
+ :class="{ __visible: isHintVisible }"
37
+ />
29
38
  </div>
30
39
  </template>
31
40
 
32
41
  <script setup>
33
42
  import {
43
+ computed,
34
44
  nextTick,
35
45
  onBeforeUnmount,
36
46
  onMounted,
@@ -70,15 +80,38 @@ const props = defineProps({
70
80
  wrapTitle: {
71
81
  type: Boolean,
72
82
  default: false
83
+ },
84
+ mobileHintComponent: {
85
+ type: String
86
+ },
87
+ mobileHintShowDelay: {
88
+ type: Number,
89
+ default: 1500
90
+ },
91
+ mobileHintHideDelay: {
92
+ type: Number,
93
+ default: 2000
94
+ },
95
+ tabComponent: {
96
+ type: String,
97
+ default: 'div'
98
+ },
99
+ tabProps: {
100
+ type: Function,
101
+ default: () => ({})
73
102
  }
74
103
  })
75
104
  const model = defineModel()
76
105
  const emit = defineEmits(['update:modelValue'])
77
106
  const sliderStyle = ref({})
78
107
  let resizeObserver = null
108
+ let isHintVisible = ref(false)
109
+ let hintObserver = ref(null)
79
110
  const tabsRefs = useTemplateRef('tabs')
80
111
  const elRef = useTemplateRef('root')
81
112
 
113
+ const hintShowCondition = computed(() => props.mobileHintComponent)
114
+
82
115
  function createResizeObserver () {
83
116
  if (props.withSlider) {
84
117
  resizeObserver = new ResizeObserver(() => {
@@ -95,6 +128,36 @@ function destroyResizeObserver () {
95
128
  resizeObserver = null
96
129
  }
97
130
 
131
+ function createHintObserver () {
132
+ if (hintShowCondition.value) {
133
+ hintObserver.value = new IntersectionObserver((entries, observer) => {
134
+ entries.forEach(entry => {
135
+ if (entry.isIntersecting) {
136
+ queueShowHint()
137
+ observer.disconnect()
138
+ hintObserver.value = null
139
+ }
140
+ })
141
+ }, {
142
+ threshold: 1.0
143
+ })
144
+ hintObserver.value.observe(elRef.value)
145
+ }
146
+ }
147
+
148
+ function queueShowHint () {
149
+ setTimeout(() => {
150
+ isHintVisible.value = true
151
+ queueHideHint()
152
+ }, props.mobileHintShowDelay)
153
+ }
154
+
155
+ function queueHideHint () {
156
+ setTimeout(() => {
157
+ isHintVisible.value = false
158
+ }, props.mobileHintShowDelay)
159
+ }
160
+
98
161
  function handleTabSelect (tab) {
99
162
  emit('update:modelValue', tab)
100
163
  calcSlider()
@@ -131,6 +194,7 @@ onMounted(() => {
131
194
  tab && handleTabSelect(tab)
132
195
  }
133
196
  createResizeObserver()
197
+ createHintObserver()
134
198
  })
135
199
 
136
200
  onBeforeUnmount(() => {
@@ -140,9 +204,20 @@ onBeforeUnmount(() => {
140
204
  watch(model, () => {
141
205
  props.withSlider && calcSlider()
142
206
  })
207
+
208
+ watch(hintShowCondition, () => {
209
+
210
+
211
+ createHintObserver()
212
+ })
143
213
  </script>
144
214
 
145
215
  <style>
216
+ .v-tabs-wrap {
217
+ position: relative;
218
+ display: inline-flex;
219
+ max-width: 100%;
220
+ }
146
221
  .v-tabs {
147
222
  position: relative;
148
223
  }
@@ -170,4 +245,12 @@ watch(model, () => {
170
245
  bottom: 0;
171
246
  transition: all 0.2s ease-in-out;
172
247
  }
248
+ .v-tabs-hint {
249
+ transition: opacity .3s ease-in-out;
250
+ opacity: 0;
251
+ pointer-events: none;
252
+ }
253
+ .v-tabs-hint.__visible {
254
+ opacity: 1;
255
+ }
173
256
  </style>
@@ -1,8 +0,0 @@
1
- {
2
- "recommendations": [
3
- "Vue.volar",
4
- "vitest.explorer",
5
- "dbaeumer.vscode-eslint",
6
- "EditorConfig.EditorConfig"
7
- ]
8
- }
@@ -1,11 +0,0 @@
1
- {
2
- "explorer.fileNesting.enabled": true,
3
- "explorer.fileNesting.patterns": {
4
- "tsconfig.json": "tsconfig.*.json, env.d.ts",
5
- "vite.config.*": "jsconfig*, vitest.config.*, cypress.config.*, playwright.config.*",
6
- "package.json": "package-lock.json, pnpm*, .yarnrc*, yarn*, .eslint*, eslint*, .prettier*, prettier*, .editorconfig"
7
- },
8
- "editor.codeActionsOnSave": {
9
- "source.fixAll": "explicit"
10
- }
11
- }