ct-component-plus 0.0.1

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 (87) hide show
  1. package/README.md +3 -0
  2. package/package.json +37 -0
  3. package/packages/components/button/index.js +9 -0
  4. package/packages/components/button/src/button.vue +172 -0
  5. package/packages/components/cascader/index.js +8 -0
  6. package/packages/components/cascader/src/cascader.vue +224 -0
  7. package/packages/components/cascader/src/ct-cascader.vue +261 -0
  8. package/packages/components/cascader/src/index.js +51 -0
  9. package/packages/components/checkbox/index.js +8 -0
  10. package/packages/components/checkbox/src/checkbox.vue +48 -0
  11. package/packages/components/checkbox/src/index.js +13 -0
  12. package/packages/components/date-picker/index.js +9 -0
  13. package/packages/components/date-picker/src/clear-icon.vue +3 -0
  14. package/packages/components/date-picker/src/date-icon.vue +3 -0
  15. package/packages/components/date-picker/src/date-picker.vue +77 -0
  16. package/packages/components/date-picker/src/index.js +34 -0
  17. package/packages/components/dialog/index.js +9 -0
  18. package/packages/components/dialog/src/dialog.vue +104 -0
  19. package/packages/components/empty/index.js +9 -0
  20. package/packages/components/empty/src/empty.vue +98 -0
  21. package/packages/components/index.js +71 -0
  22. package/packages/components/input/index.js +8 -0
  23. package/packages/components/input/src/index.js +14 -0
  24. package/packages/components/input/src/input.vue +107 -0
  25. package/packages/components/input-range/index.js +8 -0
  26. package/packages/components/input-range/src/index.js +30 -0
  27. package/packages/components/input-range/src/input-range.vue +234 -0
  28. package/packages/components/menu/index.js +8 -0
  29. package/packages/components/menu/src/assets/plus_line.svg +1 -0
  30. package/packages/components/menu/src/item.vue +47 -0
  31. package/packages/components/menu/src/link.vue +29 -0
  32. package/packages/components/menu/src/logo.vue +26 -0
  33. package/packages/components/menu/src/menu-item.vue +104 -0
  34. package/packages/components/menu/src/menu.vue +192 -0
  35. package/packages/components/menu/src/utils/index.js +5 -0
  36. package/packages/components/message/icon/ErrorIcon.vue +25 -0
  37. package/packages/components/message/icon/InfoIcon.vue +25 -0
  38. package/packages/components/message/icon/SuccessIcon.vue +25 -0
  39. package/packages/components/message/icon/WarningIcon.vue +25 -0
  40. package/packages/components/message/index.js +9 -0
  41. package/packages/components/message/src/method.js +55 -0
  42. package/packages/components/message-box/index.js +8 -0
  43. package/packages/components/message-box/src/message-box.vue +108 -0
  44. package/packages/components/pagination/index.js +8 -0
  45. package/packages/components/pagination/src/pagination.vue +37 -0
  46. package/packages/components/radio/index.js +8 -0
  47. package/packages/components/radio/src/index.js +13 -0
  48. package/packages/components/radio/src/radio.vue +48 -0
  49. package/packages/components/search-box/index.js +25 -0
  50. package/packages/components/search-box/src/index.js +30 -0
  51. package/packages/components/search-box/src/search-box.vue +240 -0
  52. package/packages/components/search-box/src/slot.vue +5 -0
  53. package/packages/components/select/index.js +8 -0
  54. package/packages/components/select/src/arrow-down.vue +3 -0
  55. package/packages/components/select/src/clear-icon.vue +3 -0
  56. package/packages/components/select/src/empty.vue +14 -0
  57. package/packages/components/select/src/index.js +52 -0
  58. package/packages/components/select/src/select.vue +331 -0
  59. package/packages/components/table/index.js +8 -0
  60. package/packages/components/table/src/TableSort.vue +179 -0
  61. package/packages/components/table/src/index.js +47 -0
  62. package/packages/components/table/src/table.vue +249 -0
  63. package/packages/components/tabs/index.js +8 -0
  64. package/packages/components/tabs/src/tabs.vue +226 -0
  65. package/packages/components/year-select/index.js +8 -0
  66. package/packages/components/year-select/src/index.js +45 -0
  67. package/packages/components/year-select/src/year-select.vue +274 -0
  68. package/packages/constants/aria.ts +17 -0
  69. package/packages/constants/index.ts +1 -0
  70. package/packages/directives/click-outside/index.ts +118 -0
  71. package/packages/directives/index.js +1 -0
  72. package/packages/echarts/bar/index.js +64 -0
  73. package/packages/echarts/base.js +96 -0
  74. package/packages/echarts/line/index.js +107 -0
  75. package/packages/hooks/index.js +6 -0
  76. package/packages/hooks/use-buried/index.js +47 -0
  77. package/packages/hooks/use-checked-all/index.js +37 -0
  78. package/packages/hooks/use-echarts/index.js +2 -0
  79. package/packages/hooks/use-echarts/use-bar/index.js +67 -0
  80. package/packages/hooks/use-echarts/use-line/index.js +83 -0
  81. package/packages/hooks/use-namespace/index.js +66 -0
  82. package/packages/hooks/use-search-component/index.js +29 -0
  83. package/packages/style/element.less +600 -0
  84. package/packages/style/init.less +114 -0
  85. package/packages/utils/index.js +2 -0
  86. package/packages/utils/operate.js +78 -0
  87. package/packages/utils/types.js +35 -0
package/README.md ADDED
@@ -0,0 +1,3 @@
1
+ # Vue 3 + Vite
2
+
3
+ 青塔组件库的 Vue 3 版本,使用 Vite 构建。
package/package.json ADDED
@@ -0,0 +1,37 @@
1
+ {
2
+ "name": "ct-component-plus",
3
+ "private": false,
4
+ "version": "0.0.1",
5
+ "type": "module",
6
+ "main": "packages/index.js",
7
+ "files": [
8
+ "packages"
9
+ ],
10
+ "scripts": {
11
+ "dev": "vite",
12
+ "build": "vite build",
13
+ "lib": "vite build --target lib --outDir lib packages/index.js",
14
+ "preview": "vite preview",
15
+ "docs:dev": "vuepress dev docs",
16
+ "docs:build": "vuepress build docs"
17
+ },
18
+ "dependencies": {
19
+ "cingta-animation": "^0.2.3",
20
+ "cingta-icon": "^2.0.0",
21
+ "element-plus": "^2.3.4",
22
+ "vue": "^3.2.47"
23
+ },
24
+ "devDependencies": {
25
+ "@vitejs/plugin-vue": "^4.1.0",
26
+ "@vuepress/bundler-webpack": "^2.0.0-beta.63",
27
+ "axios": "^1.4.0",
28
+ "clipboard-copy": "^4.0.1",
29
+ "echarts": "^5.4.2",
30
+ "less": "^4.1.3",
31
+ "less-loader": "^11.1.0",
32
+ "vite": "^4.3.2",
33
+ "vue-echarts": "^6.5.5",
34
+ "vuepress": "^2.0.0-beta.63",
35
+ "vuepress-plugin-demo-container": "^0.2.0"
36
+ }
37
+ }
@@ -0,0 +1,9 @@
1
+ import CtButton from './src/button.vue';
2
+
3
+ /* istanbul ignore next */
4
+ CtButton.install = function (Vue) {
5
+ // TODO 这里的组件名是这这里写死的,不是使用CtButton.name的形式,因为setup里面不可以直接什么组件的name属性,故而这里没有这个属性,后续可以考虑使用defineOptions(需要安装unplugin-vue-macros插件)
6
+ Vue.component('CtButton', CtButton);
7
+ };
8
+
9
+ export default CtButton;
@@ -0,0 +1,172 @@
1
+ <template>
2
+ <component
3
+ :is="tag"
4
+ ref="_ref"
5
+ :data-size="mapSize"
6
+ :class="[
7
+ ns.b(),
8
+ ns.m(type),
9
+ ns.m(mapSize),
10
+ ns.is('disabled', disabled),
11
+ ns.is('text', isText),
12
+ ]"
13
+ v-bind="$attrs"
14
+ @click="handleClick"
15
+ >
16
+ <span v-if="$slots.default" :class="[ns.e('text')]">
17
+ <slot />
18
+ </span>
19
+ </component>
20
+ </template>
21
+
22
+ <script setup>
23
+ import { computed, onMounted, ref } from "vue";
24
+ import { useNamespace } from "../../../hooks";
25
+ const props = defineProps({
26
+ tag: {
27
+ type: String,
28
+ default: "button",
29
+ },
30
+ type: {
31
+ type: String,
32
+ default: "default",
33
+ },
34
+ size: String,
35
+ disabled: Boolean,
36
+ });
37
+ const emit = defineEmits(["click"]);
38
+ const ns = useNamespace("button");
39
+ const _ref = ref(null);
40
+ const isText = computed(() => props.type.includes("text"));
41
+ const mapSize = computed(() => {
42
+ if (props.size === "default") return "";
43
+ return props.size || (isText.value ? "small" : "");
44
+ });
45
+ const handleClick = (evt) => {
46
+ if (!props.disabled) {
47
+ // 禁用状态,点击事件也禁用
48
+ emit("click", evt);
49
+ }
50
+ };
51
+ defineExpose({
52
+ ref: _ref,
53
+ });
54
+ </script>
55
+ <style lang='less'>
56
+ .ct-button {
57
+ cursor: pointer;
58
+ box-sizing: border-box;
59
+ text-align: center;
60
+ height: 32px;
61
+ padding: 0 16px;
62
+ border-radius: 3px;
63
+ border: none;
64
+ background-color: var(--ct-color-primary);
65
+ color: #fff;
66
+ --button-hover-opacity: 0.8;
67
+ &.is-text {
68
+ font-size: 15px;
69
+ }
70
+ &.is-disabled {
71
+ cursor: not-allowed;
72
+ }
73
+ &--default {
74
+ &:hover:not(.is-disabled) {
75
+ opacity: var(--button-hover-opacity);
76
+ }
77
+ &.is-disabled {
78
+ background: #a4afbb;
79
+ }
80
+ }
81
+ &--plain {
82
+ background-color: #f0f3f9;
83
+ color: var(--ct-color-black);
84
+ &:hover:not(.is-disabled) {
85
+ background-color: var(--ct-color-primary-bg);
86
+ }
87
+ &.is-disabled {
88
+ color: var(--ct-color-disabled);
89
+ }
90
+ }
91
+ &--border {
92
+ border: 1px solid var(--ct-color-primary);
93
+ background-color: #fff;
94
+ color: var(--ct-color-primary);
95
+ &:hover:not(.is-disabled) {
96
+ background-color: var(--ct-color-primary-bg);
97
+ }
98
+ &.is-disabled {
99
+ border-color: var(--ct-color-disabled);
100
+ color: var(--ct-color-disabled);
101
+ }
102
+ }
103
+ &--border-plain {
104
+ border: 1px solid var(--ct-border-color);
105
+ background-color: #fff;
106
+ color: var(--ct-color-black);
107
+ &:hover:not(.is-disabled) {
108
+ border-color: var(--ct-color-primary);
109
+ color: var(--ct-color-primary);
110
+ }
111
+ &.is-disabled {
112
+ border-color: var(--ct-color-disabled);
113
+ color: var(--ct-color-disabled);
114
+ }
115
+ }
116
+ &--text {
117
+ background-color: #fff;
118
+ color: var(--ct-color-primary);
119
+ &:hover:not(.is-disabled) {
120
+ opacity: var(--button-hover-opacity);
121
+ }
122
+ &.is-disabled {
123
+ color: var(--ct-color-disabled);
124
+ }
125
+ }
126
+ &--text-plain {
127
+ background-color: #fff;
128
+ color: var(--ct-color-black);
129
+ &:hover:not(.is-disabled) {
130
+ color: var(--ct-color-primary);
131
+ }
132
+ &.is-disabled {
133
+ color: var(--ct-color-disabled);
134
+ }
135
+ }
136
+ &--mini {
137
+ height: 24px;
138
+ padding: 0 12px;
139
+ font-size: 12px;
140
+ &.is-text {
141
+ font-size: 13px;
142
+ }
143
+ }
144
+ &--small {
145
+ height: 28px;
146
+ padding: 0 14px;
147
+ font-size: 13px;
148
+ &.is-text {
149
+ font-size: 14px;
150
+ }
151
+ }
152
+ &--default {
153
+ font-size: 14px;
154
+ }
155
+ &--large {
156
+ height: 36px;
157
+ padding: 0 20px;
158
+ font-size: 14px;
159
+ &.is-text {
160
+ font-size: 16px;
161
+ }
162
+ }
163
+ &__text {
164
+ display: inline-flex;
165
+ align-items: center;
166
+ }
167
+
168
+ & + & {
169
+ margin-left: 8px;
170
+ }
171
+ }
172
+ </style>
@@ -0,0 +1,8 @@
1
+ import CtCascader from './src/cascader.vue';
2
+
3
+ /* istanbul ignore next */
4
+ CtCascader.install = function (Vue) {
5
+ Vue.component('CtCascader', CtCascader);
6
+ };
7
+
8
+ export default CtCascader;
@@ -0,0 +1,224 @@
1
+ <template>
2
+ <el-cascader
3
+ ref="cascaderRef"
4
+ :class="[
5
+ ns.b(),
6
+ ns.is('disabled', disabled),
7
+ ns.is('filterable', filterable),
8
+ ]"
9
+ v-model="showValue"
10
+ :props="propsShow"
11
+ :options="optionsShow"
12
+ :show-all-levels="showAllLevels"
13
+ :filterable="filterable"
14
+ :clearable="clearable"
15
+ :popper-class="popperClassShow"
16
+ v-bind="{ ...$attrs, ...rawAttr }"
17
+ />
18
+ <!-- <Teleport :to="appendPanelDom">
19
+ <span>大写的六</span>
20
+ </Teleport> -->
21
+ </template>
22
+
23
+ <script setup>
24
+ import { onMounted, computed, ref, watch, inject, watchEffect } from "vue";
25
+ import { cascaderEmits, cascaderProps } from "./index";
26
+ import { useNamespace, useBuriedParams } from "../../../hooks";
27
+ import { isArray, isFunction } from "../../../utils";
28
+ const props = defineProps(cascaderProps);
29
+ const emit = defineEmits(cascaderEmits);
30
+ const baseDao = inject("$ctBaseDao");
31
+ const serviceConfig = inject("$ctServiceConfig");
32
+
33
+ const ns = useNamespace("cascader");
34
+ const cascaderRef = ref(null);
35
+ const checkedText = ref("");
36
+ const propsShow = computed(() => {
37
+ return {
38
+ ...(props.props || {}),
39
+ multiple: props.multiple || props.props?.multiple || false,
40
+ label: props.mapObj?.label || "label",
41
+ value: props.mapObj?.value || "value",
42
+ children: props.mapObj?.children || "children",
43
+ };
44
+ });
45
+ const optionsByApi = ref([]);
46
+ const optionsShow = computed(() => {
47
+ return optionsByApi.value.length ? optionsByApi.value : props.options;
48
+ });
49
+ const showValue = computed({
50
+ get() {
51
+ return props.modelValue;
52
+ },
53
+ set(newValue) {
54
+ emit("update:modelValue", newValue);
55
+ },
56
+ });
57
+ const popperClassShow = computed(() => {
58
+ let popperClass = ns.e("dropdown");
59
+ popperClass += props.popperClass || "";
60
+ if (propsShow.value.multiple) {
61
+ popperClass += " " + ns.is("multiple");
62
+ }
63
+ return popperClass;
64
+ });
65
+ watch(
66
+ () => props.modelValue,
67
+ (newValue) => {
68
+ getCheckedText();
69
+ }
70
+ );
71
+ const appendPanelDom = document.createElement("div");
72
+
73
+ const getCheckedText = () => {
74
+ const getCheckedNodes = cascaderRef.value?.getCheckedNodes;
75
+ if (getCheckedNodes) {
76
+ const textArr = getCheckedNodes();
77
+ if (props.showAllLevels)
78
+ checkedText.value = textArr
79
+ .map((item) => {
80
+ if (isArray(item.pathLabels))
81
+ return item.pathLabels.join(props.separator);
82
+ return item.label;
83
+ })
84
+ .join(props.separatorMultiple);
85
+ else {
86
+ checkedText.value = textArr
87
+ .map((item) => item.label)
88
+ .join(props.separatorMultiple);
89
+ }
90
+ }
91
+ };
92
+
93
+ const appendDom2Panel = () => {
94
+ const dom = cascaderRef.value?.contentRef;
95
+ if (dom) {
96
+ const referenceNode = dom?.children[0];
97
+ // appendPanelDom = document.createElement("div");
98
+ appendPanelDom.setAttribute("id", "cascader-panel-append");
99
+ dom.insertBefore(appendPanelDom, referenceNode);
100
+ // dom.appendChild(div);
101
+ }
102
+ };
103
+ useBuriedParams(props, emit);
104
+ watchEffect(async () => {
105
+ // 通过api获取数据,会监听api以及serviceParams的改变(收集到的依赖改变)都会触发重新查询
106
+ const cbs = props.cbs || {};
107
+ if (props.api && baseDao) {
108
+ try {
109
+ const method = props.serviceMethod || serviceConfig.defaultMethod;
110
+ let params = props.serviceParams || {};
111
+ if (isFunction(cbs.beforeSearch)) {
112
+ const paramsHandle = await cbs.beforeSearch(params);
113
+ if (paramsHandle === false) return;
114
+ params = paramsHandle || params;
115
+ }
116
+
117
+ baseDao[method](props.api, params).then((res) => {
118
+ const mapObj = props.mapObj || {};
119
+ const { list } = mapObj; //其他参数放入propsShow
120
+ let data = [];
121
+ if (list) {
122
+ data = res[list];
123
+ } else {
124
+ data = res;
125
+ }
126
+
127
+ optionsByApi.value = data;
128
+ if (isFunction(cbs.afterSearch)) {
129
+ cbs.afterSearch(res, optionsByApi, showValue);
130
+ }
131
+ });
132
+ } catch (error) {}
133
+ }
134
+ if (isFunction(cbs.defineSearch)) {
135
+ try {
136
+ const defineSearchHandle = await cbs.defineSearch(
137
+ optionsByApi,
138
+ showValue
139
+ );
140
+ if (defineSearchHandle === false) return;
141
+ if (defineSearchHandle) {
142
+ optionsByApi.value = defineSearchHandle;
143
+ }
144
+ } catch (error) {}
145
+ }
146
+ });
147
+ onMounted(() => {
148
+ appendDom2Panel();
149
+ });
150
+ </script>
151
+ <style lang='less'>
152
+ .ct-cascader {
153
+ width: var(--ct-component-width);
154
+ --ct-cascader-inner-height: var(--ct-component-inner-height);
155
+ &.is-filterable {
156
+ .el-cascader__tags {
157
+ &:focus-within {
158
+ .el-tag {
159
+ display: none;
160
+ }
161
+ }
162
+ }
163
+ }
164
+ .el-cascader__tags {
165
+ display: inline-flex;
166
+ // display: inline-block;
167
+ align-items: center;
168
+ flex-wrap: nowrap;
169
+ height: var(--ct-cascader-inner-height);
170
+ padding-left: var(--ct-component-inner-padding);
171
+ text-overflow: ellipsis;
172
+ overflow: hidden;
173
+ white-space: nowrap;
174
+ .el-tag {
175
+ display: inline;
176
+ height: auto;
177
+ padding: 0;
178
+ margin: 0;
179
+ background-color: inherit;
180
+ font-size: var(--ct-font-size);
181
+ color: var(--ct-color-black);
182
+ &:not(:last-of-type)::after {
183
+ content: "、";
184
+ }
185
+ }
186
+ .el-tag__close {
187
+ display: none;
188
+ }
189
+ }
190
+ &__dropdown {
191
+ &:not(.is-multiple) {
192
+ .el-cascader__suggestion-item {
193
+ &.is-checked {
194
+ .el-icon {
195
+ display: none;
196
+ }
197
+ }
198
+ }
199
+ }
200
+ }
201
+ .el-cascader__search-input {
202
+ position: absolute;
203
+ left: var(--ct-component-inner-padding);
204
+ top: 50%;
205
+ transform: translateY(-50%);
206
+ height: var(--ct-cascader-inner-height);
207
+ width: calc(100% - var(--ct-component-inner-padding));
208
+ font-size: var(--ct-font-size);
209
+ margin: 0;
210
+ }
211
+ .el-input__wrapper {
212
+ position: relative;
213
+ .el-input__inner {
214
+ height: var(--ct-cascader-inner-height) !important;
215
+ }
216
+ &::after {
217
+ position: absolute;
218
+ content: v-bind(checkedText);
219
+ // content: "11111";
220
+ left: var(--ct-component-inner-padding);
221
+ }
222
+ }
223
+ }
224
+ </style>