koru-ui 1.0.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.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 奋进的蜗牛
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,25 @@
1
+ <p align="center">
2
+ <img src="./public/logo.svg" alt="Koru UI Logo" width="200" />
3
+ <img src="./public/logo2.svg" alt="Koru UI Logo" width="200" />
4
+ </p>
5
+
6
+ <h1 align="center">Koru UI</h1>
7
+
8
+ ---
9
+
10
+ ## 简介
11
+
12
+ Koru UI 是一个基于 Vue 3 和 TypeScript 的现代化组件库,其设计灵感来源于蜗牛的坚韧和稳健。我们相信,如同蜗牛一样,优秀的组件库应该以稳定可靠为核心,逐步前行,为开发者提供坚实的支持。
13
+
14
+ ## 安装
15
+
16
+ ```bash
17
+ # 使用 npm
18
+ npm install @koru/ui
19
+
20
+ # 使用 yarn
21
+ yarn add @koru/ui
22
+
23
+ # 使用 pnpm
24
+ pnpm add @koru/ui
25
+ ```
package/dist/logo.svg ADDED
@@ -0,0 +1,28 @@
1
+ <svg width="200" height="200" viewBox="0 0 200 200" xmlns="http://www.w3.org/2000/svg">
2
+ <!-- 蜗牛身体 -->
3
+ <path d="M100 140 Q120 130 125 110 Q130 90 120 70 Q100 40 80 60 Q70 70 75 90 Q80 110 100 120"
4
+ fill="#4FC08D" stroke="#35495E" stroke-width="2"/>
5
+
6
+ <!-- 蜗牛头部 -->
7
+ <circle cx="120" cy="70" r="12" fill="#4FC08D" stroke="#35495E" stroke-width="2"/>
8
+
9
+ <!-- 蜗牛眼睛 -->
10
+ <circle cx="125" cy="65" r="3" fill="#35495E"/>
11
+
12
+ <!-- 蜗牛触角 -->
13
+ <line x1="118" y1="60" x2="110" y2="45" stroke="#35495E" stroke-width="2"/>
14
+ <line x1="122" y1="60" x2="130" y2="45" stroke="#35495E" stroke-width="2"/>
15
+
16
+ <!-- 蜗牛壳 -->
17
+ <path d="M100 120 C80 110, 70 90, 80 70 C90 50, 110 50, 120 70 C130 90, 120 110, 100 120
18
+ C90 115, 85 105, 90 95 C95 85, 105 85, 110 95 C115 105, 110 115, 100 120"
19
+ fill="#41B883" stroke="#35495E" stroke-width="2"/>
20
+
21
+ <!-- 壳上的纹理 -->
22
+ <path d="M100 100 C95 98, 93 93, 95 88 C97 83, 103 83, 105 88 C107 93, 105 98, 100 100"
23
+ fill="none" stroke="#35495E" stroke-width="1"/>
24
+
25
+ <!-- 蜗牛路径 -->
26
+ <path d="M50 170 C60 160, 70 160, 80 170 C90 180, 110 180, 120 170 C130 160, 140 160, 150 170"
27
+ fill="none" stroke="#C0C0C0" stroke-width="1" stroke-dasharray="4,4"/>
28
+ </svg>
package/dist/logo2.svg ADDED
@@ -0,0 +1,40 @@
1
+ <svg width="200" height="200" viewBox="0 0 200 200" xmlns="http://www.w3.org/2000/svg">
2
+ <!-- 蜗牛身体 -->
3
+ <path d="M60 130
4
+ C40 130 30 110 40 90
5
+ C50 70 70 60 90 60
6
+ C100 60 110 65 110 75
7
+ C110 85 100 95 90 100
8
+ C80 105 70 110 60 110
9
+ C50 110 40 120 40 130
10
+ Z"
11
+ fill="#F7D3B8" stroke="#A06E4E" stroke-width="4" stroke-linecap="round"/>
12
+
13
+ <!-- 蜗牛壳 -->
14
+ <path d="M50 90
15
+ C35 80 30 60 40 45
16
+ C50 30 70 30 85 45
17
+ C100 60 95 80 80 90
18
+ C70 95 60 95 50 90 Z"
19
+ fill="#FFC15A" stroke="#A06E4E" stroke-width="4" stroke-linecap="round"/>
20
+
21
+ <!-- 壳内螺旋线 -->
22
+ <path d="M55 85
23
+ C50 80 48 70 50 65
24
+ C52 60 60 60 65 65
25
+ C70 70 70 75 65 80
26
+ C60 85 55 85 55 85 Z"
27
+ fill="none" stroke="#A06E4E" stroke-width="2"/>
28
+
29
+ <!-- 触角 -->
30
+ <line x1="100" y1="60" x2="105" y2="40" stroke="#A06E4E" stroke-width="4"/>
31
+ <line x1="110" y1="60" x2="115" y2="40" stroke="#A06E4E" stroke-width="4"/>
32
+
33
+ <!-- 触角顶端(眼睛) -->
34
+ <circle cx="105" cy="40" r="8" fill="#A06E4E"/>
35
+ <circle cx="115" cy="40" r="8" fill="#A06E4E"/>
36
+
37
+ <!-- 身体上的弧线(装饰) -->
38
+ <path d="M100 80 Q105 75 105 70 Q105 65 100 65"
39
+ fill="none" stroke="#A06E4E" stroke-width="2"/>
40
+ </svg>
@@ -0,0 +1,154 @@
1
+ import { defineComponent as r, openBlock as s, createElementBlock as l, normalizeClass as m, createCommentVNode as u, renderSlot as c, createElementVNode as i, toDisplayString as v, ref as y, normalizeStyle as _ } from "vue";
2
+ const b = ["disabled"], w = {
3
+ key: 0,
4
+ class: "m-btn__loading-spinner"
5
+ }, g = {
6
+ key: 1,
7
+ class: "m-btn__icon"
8
+ }, $ = ["innerHTML"], k = { class: "m-btn__text" }, x = /* @__PURE__ */ r({
9
+ __name: "index",
10
+ props: {
11
+ type: { default: "default" },
12
+ size: { default: "medium" },
13
+ disabled: { type: Boolean, default: !1 },
14
+ loading: { type: Boolean, default: !1 },
15
+ icon: {}
16
+ },
17
+ emits: ["click"],
18
+ setup(e, { emit: n }) {
19
+ const t = e, d = n, o = (a) => {
20
+ !t.disabled && !t.loading && d("click", a);
21
+ };
22
+ return (a, f) => (s(), l("button", {
23
+ class: m([
24
+ "m-btn",
25
+ `m-btn--${e.type}`,
26
+ `m-btn--${e.size}`,
27
+ {
28
+ "m-btn--disabled": e.disabled,
29
+ "m-btn--loading": e.loading
30
+ }
31
+ ]),
32
+ disabled: e.disabled || e.loading,
33
+ onClick: o
34
+ }, [
35
+ e.loading ? (s(), l("span", w)) : u("", !0),
36
+ a.$slots.icon || e.icon ? (s(), l("span", g, [
37
+ c(a.$slots, "icon", {}, () => [
38
+ i("span", { innerHTML: e.icon }, null, 8, $)
39
+ ], !0)
40
+ ])) : u("", !0),
41
+ i("span", k, [
42
+ c(a.$slots, "default", {}, void 0, !0)
43
+ ])
44
+ ], 10, b));
45
+ }
46
+ });
47
+ const h = (e, n) => {
48
+ const t = e.__vccOpts || e;
49
+ for (const [d, o] of n)
50
+ t[d] = o;
51
+ return t;
52
+ }, M = /* @__PURE__ */ h(x, [["__scopeId", "data-v-1a2c5926"]]), B = { class: "m-switch__core" }, C = { class: "m-switch__action" }, V = {
53
+ key: 0,
54
+ class: "m-switch__loading"
55
+ }, T = {
56
+ key: 1,
57
+ class: "m-switch__inner"
58
+ }, S = /* @__PURE__ */ r({
59
+ __name: "index",
60
+ props: {
61
+ modelValue: { type: Boolean },
62
+ disabled: { type: Boolean, default: !1 },
63
+ loading: { type: Boolean, default: !1 },
64
+ activeText: { default: "" },
65
+ inactiveText: { default: "" },
66
+ activeColor: { default: "#409eff" },
67
+ inactiveColor: { default: "#dcdfe6" },
68
+ width: { default: 40 }
69
+ },
70
+ emits: ["update:modelValue", "change"],
71
+ setup(e, { emit: n }) {
72
+ const t = e, d = n, o = () => {
73
+ if (t.disabled || t.loading)
74
+ return;
75
+ const a = !t.modelValue;
76
+ d("update:modelValue", a), d("change", a);
77
+ };
78
+ return (a, f) => (s(), l("div", {
79
+ class: m(["m-switch", {
80
+ "m-switch--checked": e.modelValue,
81
+ "m-switch--disabled": e.disabled,
82
+ "m-switch--loading": e.loading
83
+ }]),
84
+ onClick: o
85
+ }, [
86
+ i("div", B, [
87
+ i("div", C, [
88
+ e.loading ? (s(), l("span", V)) : (s(), l("span", T, v(e.modelValue ? e.activeText : e.inactiveText), 1))
89
+ ])
90
+ ])
91
+ ], 2));
92
+ }
93
+ });
94
+ const H = /* @__PURE__ */ h(S, [["__scopeId", "data-v-05179423"]]), L = {
95
+ key: 0,
96
+ class: "m-card__header"
97
+ }, z = ["innerHTML"], E = /* @__PURE__ */ r({
98
+ __name: "index",
99
+ props: {
100
+ header: {},
101
+ bodyStyle: {},
102
+ width: { default: "100%" },
103
+ shadow: { default: "always" },
104
+ border: { type: Boolean, default: !0 }
105
+ },
106
+ setup(e) {
107
+ const n = e, t = y(!1), d = () => {
108
+ n.shadow === "hover" && (t.value = !0);
109
+ }, o = () => {
110
+ t.value = !1;
111
+ };
112
+ return (a, f) => (s(), l("div", {
113
+ class: m(["m-card", {
114
+ "m-card--shadow": e.shadow === "always" || e.shadow === "hover" && t.value,
115
+ "m-card--bordered": e.border
116
+ }]),
117
+ style: _({ width: typeof e.width == "number" ? e.width + "px" : e.width }),
118
+ onMouseenter: d,
119
+ onMouseleave: o
120
+ }, [
121
+ a.$slots.header || e.header ? (s(), l("div", L, [
122
+ c(a.$slots, "header", {}, () => [
123
+ i("div", {
124
+ class: "m-card__header-content",
125
+ innerHTML: e.header
126
+ }, null, 8, z)
127
+ ], !0)
128
+ ])) : u("", !0),
129
+ i("div", {
130
+ class: "m-card__body",
131
+ style: _(e.bodyStyle)
132
+ }, [
133
+ c(a.$slots, "default", {}, void 0, !0)
134
+ ], 4)
135
+ ], 38));
136
+ }
137
+ });
138
+ const I = /* @__PURE__ */ h(E, [["__scopeId", "data-v-f3a09677"]]), N = [
139
+ M,
140
+ H,
141
+ I
142
+ ], p = (e) => {
143
+ N.forEach((n) => {
144
+ e.component(n.name || n.displayName, n);
145
+ });
146
+ }, O = {
147
+ install: p
148
+ };
149
+ export {
150
+ M as MButton,
151
+ I as MCard,
152
+ H as MSwitch,
153
+ O as default
154
+ };
@@ -0,0 +1 @@
1
+ (function(l,e){typeof exports=="object"&&typeof module<"u"?e(exports,require("vue")):typeof define=="function"&&define.amd?define(["exports","vue"],e):(l=typeof globalThis<"u"?globalThis:l||self,e(l["mollu-ui"]={},l.Vue))})(this,function(l,e){"use strict";const h=["disabled"],u={key:0,class:"m-btn__loading-spinner"},_={key:1,class:"m-btn__icon"},y=["innerHTML"],b={class:"m-btn__text"},k=e.defineComponent({__name:"index",props:{type:{default:"default"},size:{default:"medium"},disabled:{type:Boolean,default:!1},loading:{type:Boolean,default:!1},icon:{}},emits:["click"],setup(t,{emit:a}){const n=t,d=a,s=o=>{!n.disabled&&!n.loading&&d("click",o)};return(o,f)=>(e.openBlock(),e.createElementBlock("button",{class:e.normalizeClass(["m-btn",`m-btn--${t.type}`,`m-btn--${t.size}`,{"m-btn--disabled":t.disabled,"m-btn--loading":t.loading}]),disabled:t.disabled||t.loading,onClick:s},[t.loading?(e.openBlock(),e.createElementBlock("span",u)):e.createCommentVNode("",!0),o.$slots.icon||t.icon?(e.openBlock(),e.createElementBlock("span",_,[e.renderSlot(o.$slots,"icon",{},()=>[e.createElementVNode("span",{innerHTML:t.icon},null,8,y)],!0)])):e.createCommentVNode("",!0),e.createElementVNode("span",b,[e.renderSlot(o.$slots,"default",{},void 0,!0)])],10,h))}}),x="",c=(t,a)=>{const n=t.__vccOpts||t;for(const[d,s]of a)n[d]=s;return n},i=c(k,[["__scopeId","data-v-1a2c5926"]]),w={class:"m-switch__core"},B={class:"m-switch__action"},g={key:0,class:"m-switch__loading"},M={key:1,class:"m-switch__inner"},V=e.defineComponent({__name:"index",props:{modelValue:{type:Boolean},disabled:{type:Boolean,default:!1},loading:{type:Boolean,default:!1},activeText:{default:""},inactiveText:{default:""},activeColor:{default:"#409eff"},inactiveColor:{default:"#dcdfe6"},width:{default:40}},emits:["update:modelValue","change"],setup(t,{emit:a}){const n=t,d=a,s=()=>{if(n.disabled||n.loading)return;const o=!n.modelValue;d("update:modelValue",o),d("change",o)};return(o,f)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["m-switch",{"m-switch--checked":t.modelValue,"m-switch--disabled":t.disabled,"m-switch--loading":t.loading}]),onClick:s},[e.createElementVNode("div",w,[e.createElementVNode("div",B,[t.loading?(e.openBlock(),e.createElementBlock("span",g)):(e.openBlock(),e.createElementBlock("span",M,e.toDisplayString(t.modelValue?t.activeText:t.inactiveText),1))])])],2))}}),T="",r=c(V,[["__scopeId","data-v-05179423"]]),C={key:0,class:"m-card__header"},E=["innerHTML"],$=e.defineComponent({__name:"index",props:{header:{},bodyStyle:{},width:{default:"100%"},shadow:{default:"always"},border:{type:Boolean,default:!0}},setup(t){const a=t,n=e.ref(!1),d=()=>{a.shadow==="hover"&&(n.value=!0)},s=()=>{n.value=!1};return(o,f)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["m-card",{"m-card--shadow":t.shadow==="always"||t.shadow==="hover"&&n.value,"m-card--bordered":t.border}]),style:e.normalizeStyle({width:typeof t.width=="number"?t.width+"px":t.width}),onMouseenter:d,onMouseleave:s},[o.$slots.header||t.header?(e.openBlock(),e.createElementBlock("div",C,[e.renderSlot(o.$slots,"header",{},()=>[e.createElementVNode("div",{class:"m-card__header-content",innerHTML:t.header},null,8,E)],!0)])):e.createCommentVNode("",!0),e.createElementVNode("div",{class:"m-card__body",style:e.normalizeStyle(t.bodyStyle)},[e.renderSlot(o.$slots,"default",{},void 0,!0)],4)],38))}}),N="",m=c($,[["__scopeId","data-v-f3a09677"]]),S=[i,r,m],p={install:t=>{S.forEach(a=>{t.component(a.name||a.displayName,a)})}};l.MButton=i,l.MCard=m,l.MSwitch=r,l.default=p,Object.defineProperties(l,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})});
package/dist/style.css ADDED
@@ -0,0 +1 @@
1
+ .m-btn[data-v-1a2c5926]{position:relative;display:inline-flex;align-items:center;justify-content:center;line-height:1;white-space:nowrap;cursor:pointer;color:#606266;-webkit-appearance:none;text-align:center;box-sizing:border-box;outline:none;margin:0;transition:.1s;font-weight:500;user-select:none;vertical-align:middle;-webkit-user-select:none;padding:12px 20px;font-size:14px;border-radius:4px;border:1px solid #dcdfe6;background-color:#fff}.m-btn--primary[data-v-1a2c5926]{color:#fff;background-color:#409eff;border-color:#409eff}.m-btn--success[data-v-1a2c5926]{color:#fff;background-color:#67c23a;border-color:#67c23a}.m-btn--warning[data-v-1a2c5926]{color:#fff;background-color:#e6a23c;border-color:#e6a23c}.m-btn--danger[data-v-1a2c5926]{color:#fff;background-color:#f56c6c;border-color:#f56c6c}.m-btn--small[data-v-1a2c5926]{padding:7px 15px;font-size:12px;border-radius:3px}.m-btn--medium[data-v-1a2c5926]{padding:9px 15px;font-size:14px;border-radius:4px}.m-btn--large[data-v-1a2c5926]{padding:11px 19px;font-size:16px;border-radius:6px}.m-btn--disabled[data-v-1a2c5926]{opacity:.5;cursor:not-allowed}.m-btn__icon[data-v-1a2c5926]{margin-right:5px}.m-btn__loading-spinner[data-v-1a2c5926]{margin-right:5px;width:1em;height:1em;border:2px solid transparent;border-top:2px solid currentColor;border-radius:50%;animation:rotate-1a2c5926 1s linear infinite}@keyframes rotate-1a2c5926{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.m-switch[data-v-05179423]{position:relative;display:inline-flex;align-items:center;width:var(--switch-width, 40px);height:var(--switch-height, 20px);border-radius:var(--switch-height, 20px);box-sizing:border-box;cursor:pointer;transition:border-color .3s,background-color .3s;background-color:#dcdfe6;border:1px solid #dcdfe6}.m-switch__core[data-v-05179423]{position:relative;width:100%;height:100%;overflow:hidden;border-radius:var(--switch-height, 20px)}.m-switch__action[data-v-05179423]{position:absolute;top:0;left:0;width:calc(var(--switch-width, 40px) - var(--switch-height, 20px));height:calc(var(--switch-height, 20px) - 2px);margin:1px;transition:all .3s;border-radius:calc(var(--switch-height, 20px) / 2);background-color:#fff;display:flex;align-items:center;justify-content:center}.m-switch--checked[data-v-05179423]{background-color:var(--switch-active-color, #409eff);border-color:var(--switch-active-color, #409eff)}.m-switch--checked .m-switch__action[data-v-05179423]{transform:translate(calc(var(--switch-width, 40px) - var(--switch-height, 20px)))}.m-switch__inner[data-v-05179423]{font-size:12px;color:#fff;transition:margin .3s}.m-switch--checked .m-switch__inner[data-v-05179423]{margin-left:6px}.m-switch--unchecked .m-switch__inner[data-v-05179423]{margin-right:6px}.m-switch__loading[data-v-05179423]{width:12px;height:12px;border:2px solid transparent;border-top:2px solid currentColor;border-radius:50%;animation:rotate-05179423 1s linear infinite}.m-switch--disabled[data-v-05179423]{opacity:.6;cursor:not-allowed}@keyframes rotate-05179423{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.m-card[data-v-f3a09677]{border:1px solid #ebeef5;background-color:#fff;color:#303133;transition:.3s;border-radius:6px;overflow:hidden}.m-card--bordered[data-v-f3a09677]{border:1px solid #ebeef5}.m-card--shadow[data-v-f3a09677]{box-shadow:0 2px 12px #0000001a}.m-card__header[data-v-f3a09677]{padding:18px 20px;border-bottom:1px solid #ebeef5;box-sizing:border-box;font-size:16px;font-weight:500;color:#303133;background-color:#fafafa}.m-card__body[data-v-f3a09677]{padding:20px}.m-card--no-header .m-card__body[data-v-f3a09677]{padding-top:20px}
package/package.json ADDED
@@ -0,0 +1,74 @@
1
+ {
2
+ "name": "koru-ui",
3
+ "version": "1.0.0",
4
+ "description": "A Vue component library inspired by the persistence of a snail",
5
+ "main": "dist/koru-ui.cjs.js",
6
+ "module": "dist/koru-ui.es.js",
7
+ "types": "dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "import": "./dist/koru-ui.es.js",
11
+ "require": "./dist/koru-ui.cjs.js",
12
+ "types": "./dist/index.d.ts"
13
+ },
14
+ "./dist/style.css": "./dist/style.css"
15
+ },
16
+ "files": [
17
+ "dist"
18
+ ],
19
+ "keywords": [
20
+ "vue3",
21
+ "typescript",
22
+ "unocss",
23
+ "koru-ui",
24
+ "component-library",
25
+ "ui-components"
26
+ ],
27
+ "author": "Mollu UI Team",
28
+ "license": "MIT",
29
+ "repository": {
30
+ "type": "git",
31
+ "url": "https://github.com/kairolin/koru-ui.git"
32
+ },
33
+ "bugs": {
34
+ "url": "https://github.com/kairolin/koru-ui/issues"
35
+ },
36
+ "homepage": "https://github.com/kairolin/koru-ui#readme",
37
+ "peerDependencies": {
38
+ "vue": "^3.2.0"
39
+ },
40
+ "dependencies": {
41
+ "@vue/shared": "^3.2.0"
42
+ },
43
+ "devDependencies": {
44
+ "@vitejs/plugin-vue": "^4.0.0",
45
+ "typescript": "^4.9.0",
46
+ "vite": "^4.1.0",
47
+ "vitepress": "^1.0.0-alpha.45",
48
+ "vue": "^3.2.0",
49
+ "vue-tsc": "^1.0.0",
50
+ "@unocss/core": "^0.50.0",
51
+ "@unocss/preset-attributify": "^0.50.0",
52
+ "@unocss/preset-uno": "^0.50.0",
53
+ "@unocss/reset": "^0.50.0",
54
+ "unocss": "^0.50.0",
55
+ "@types/node": "^18.14.0",
56
+ "@typescript-eslint/eslint-plugin": "^5.54.0",
57
+ "@typescript-eslint/parser": "^5.54.0",
58
+ "eslint": "^8.35.0",
59
+ "eslint-plugin-vue": "^9.9.0",
60
+ "@vue/eslint-config-typescript": "^11.0.0"
61
+ },
62
+ "scripts": {
63
+ "dev": "vite",
64
+ "build": "npx vue-tsc && vite build",
65
+ "preview": "vite preview",
66
+ "docs:dev": "vitepress dev docs",
67
+ "docs:build": "vitepress build docs",
68
+ "docs:preview": "vitepress preview docs",
69
+ "build:components": "vite build --config vite.components.config.ts",
70
+ "type-check": "npx vue-tsc --noEmit",
71
+ "lint": "eslint . --ext .vue,.ts,.tsx",
72
+ "lint:fix": "eslint . --ext .vue,.ts,.tsx --fix"
73
+ }
74
+ }