jky-component-lib 0.0.56 → 0.0.60

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/dist/es/add-input/AddInput.vue.d.ts +27 -0
  2. package/dist/es/add-input/AddInput.vue.js +151 -0
  3. package/dist/es/add-input/AddInput.vue3.js +5 -0
  4. package/dist/es/add-input/index.d.ts +4 -0
  5. package/dist/es/add-input/index.js +8 -0
  6. package/dist/es/add-input/style.css +35 -0
  7. package/dist/es/button-nav/ButtonNav.vue.d.ts +4 -4
  8. package/dist/es/code-mirror-editor/CodeMirrorEditor.vue.d.ts +4 -4
  9. package/dist/es/components.d.ts +3 -0
  10. package/dist/es/components.js +10 -1
  11. package/dist/es/form/Form.vue.d.ts +2 -2
  12. package/dist/es/form/FormItem.vue.js +12 -0
  13. package/dist/es/index.js +6 -0
  14. package/dist/es/node_modules/@element-plus/icons-vue/dist/index.js +32 -0
  15. package/dist/es/node_modules/@tinymce/tinymce-vue/lib/es2015/main/ts/ScriptLoader.js +52 -0
  16. package/dist/es/node_modules/@tinymce/tinymce-vue/lib/es2015/main/ts/TinyMCE.js +10 -0
  17. package/dist/es/node_modules/@tinymce/tinymce-vue/lib/es2015/main/ts/Utils.js +145 -0
  18. package/dist/es/node_modules/@tinymce/tinymce-vue/lib/es2015/main/ts/components/Editor.js +160 -0
  19. package/dist/es/node_modules/@tinymce/tinymce-vue/lib/es2015/main/ts/components/EditorPropTypes.js +26 -0
  20. package/dist/es/node_modules/@tinymce/tinymce-vue/lib/es2015/main/ts/index.js +4 -0
  21. package/dist/es/package.json.js +1 -1
  22. package/dist/es/page-header/PopoverMenu.vue.d.ts +1 -1
  23. package/dist/es/page-table/PageTable.vue.d.ts +6087 -0
  24. package/dist/es/page-table/PageTable.vue.js +378 -0
  25. package/dist/es/page-table/PageTable.vue3.js +5 -0
  26. package/dist/es/page-table/Toolbar.vue.d.ts +32 -0
  27. package/dist/es/page-table/Toolbar.vue.js +271 -0
  28. package/dist/es/page-table/Toolbar.vue3.js +5 -0
  29. package/dist/es/page-table/index.d.ts +4 -0
  30. package/dist/es/page-table/index.js +8 -0
  31. package/dist/es/page-table/style.css +4 -0
  32. package/dist/es/rich-editor/RichEditor.vue.d.ts +78 -0
  33. package/dist/es/rich-editor/RichEditor.vue.js +105 -0
  34. package/dist/es/rich-editor/RichEditor.vue3.js +5 -0
  35. package/dist/es/rich-editor/index.d.ts +4 -0
  36. package/dist/es/rich-editor/index.js +8 -0
  37. package/dist/es/rich-editor/style.css +34 -0
  38. package/dist/es/style.css +28 -0
  39. package/dist/es/styles.css +1 -1
  40. package/dist/es/utils/index.d.ts +1 -0
  41. package/dist/es/utils/responsive-toolbar.d.ts +78 -0
  42. package/dist/es/utils/responsive-toolbar.js +64 -0
  43. package/dist/lib/add-input/AddInput.vue.d.ts +27 -0
  44. package/dist/lib/add-input/AddInput.vue.js +151 -0
  45. package/dist/lib/add-input/AddInput.vue3.js +5 -0
  46. package/dist/lib/add-input/index.d.ts +4 -0
  47. package/dist/lib/add-input/index.js +8 -0
  48. package/dist/lib/add-input/style.css +35 -0
  49. package/dist/lib/button-nav/ButtonNav.vue.d.ts +4 -4
  50. package/dist/lib/code-mirror-editor/CodeMirrorEditor.vue.d.ts +4 -4
  51. package/dist/lib/components.d.ts +3 -0
  52. package/dist/lib/components.js +30 -21
  53. package/dist/lib/form/Form.vue.d.ts +2 -2
  54. package/dist/lib/form/FormItem.vue.js +20 -8
  55. package/dist/lib/index.js +20 -14
  56. package/dist/lib/node_modules/@element-plus/icons-vue/dist/index.js +32 -0
  57. package/dist/lib/node_modules/@tinymce/tinymce-vue/lib/es2015/main/ts/ScriptLoader.js +52 -0
  58. package/dist/lib/node_modules/@tinymce/tinymce-vue/lib/es2015/main/ts/TinyMCE.js +10 -0
  59. package/dist/lib/node_modules/@tinymce/tinymce-vue/lib/es2015/main/ts/Utils.js +145 -0
  60. package/dist/lib/node_modules/@tinymce/tinymce-vue/lib/es2015/main/ts/components/Editor.js +160 -0
  61. package/dist/lib/node_modules/@tinymce/tinymce-vue/lib/es2015/main/ts/components/EditorPropTypes.js +26 -0
  62. package/dist/lib/node_modules/@tinymce/tinymce-vue/lib/es2015/main/ts/index.js +4 -0
  63. package/dist/lib/package.json.js +1 -1
  64. package/dist/lib/page-header/PopoverMenu.vue.d.ts +1 -1
  65. package/dist/lib/page-table/PageTable.vue.d.ts +6087 -0
  66. package/dist/lib/page-table/PageTable.vue.js +378 -0
  67. package/dist/lib/page-table/PageTable.vue3.js +5 -0
  68. package/dist/lib/page-table/Toolbar.vue.d.ts +32 -0
  69. package/dist/lib/page-table/Toolbar.vue.js +271 -0
  70. package/dist/lib/page-table/Toolbar.vue3.js +5 -0
  71. package/dist/lib/page-table/index.d.ts +4 -0
  72. package/dist/lib/page-table/index.js +8 -0
  73. package/dist/lib/page-table/style.css +4 -0
  74. package/dist/lib/rich-editor/RichEditor.vue.d.ts +78 -0
  75. package/dist/lib/rich-editor/RichEditor.vue.js +105 -0
  76. package/dist/lib/rich-editor/RichEditor.vue3.js +5 -0
  77. package/dist/lib/rich-editor/index.d.ts +4 -0
  78. package/dist/lib/rich-editor/index.js +8 -0
  79. package/dist/lib/rich-editor/style.css +34 -0
  80. package/dist/lib/style.css +28 -0
  81. package/dist/lib/styles.css +1 -1
  82. package/dist/lib/utils/index.d.ts +1 -0
  83. package/dist/lib/utils/responsive-toolbar.d.ts +78 -0
  84. package/dist/lib/utils/responsive-toolbar.js +64 -0
  85. package/package.json +4 -1
  86. package/dist/umd/index.js +0 -3966
  87. package/dist/umd/styles.css +0 -1
@@ -0,0 +1,4 @@
1
+ import { InstallWithSFC } from '../utils/types';
2
+ import { default as PageTable } from './PageTable.vue';
3
+ export declare const JkyPageTable: InstallWithSFC<typeof PageTable>;
4
+ export default JkyPageTable;
@@ -0,0 +1,8 @@
1
+ import { installWithSFC } from "../utils/with-install.js";
2
+ import _sfc_main from "./PageTable.vue.js";
3
+ /* empty css */
4
+ const JkyPageTable = installWithSFC(_sfc_main);
5
+ export {
6
+ JkyPageTable,
7
+ JkyPageTable as default
8
+ };
@@ -0,0 +1,4 @@
1
+ /* PageTable 组件样式 */
2
+ .jky-page-table {
3
+ /* background-color: transparent; */
4
+ }
@@ -0,0 +1,78 @@
1
+ import { RichEditorProps } from './types';
2
+ type __VLS_Props = RichEditorProps;
3
+ type __VLS_PublicProps = {
4
+ modelValue?: string;
5
+ } & __VLS_Props;
6
+ declare const _default: import('vue').DefineComponent<__VLS_PublicProps, {
7
+ editor: globalThis.Ref<any, any>;
8
+ }, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
9
+ "update:modelValue": (value: string) => any;
10
+ } & {
11
+ "update:modelValue": (value: string) => any;
12
+ change: (value: string) => any;
13
+ blur: (event: Event) => any;
14
+ focus: (event: Event) => any;
15
+ }, string, import('vue').PublicProps, Readonly<__VLS_PublicProps> & Readonly<{
16
+ "onUpdate:modelValue"?: ((value: string) => any) | undefined;
17
+ onChange?: ((value: string) => any) | undefined;
18
+ onBlur?: ((event: Event) => any) | undefined;
19
+ onFocus?: ((event: Event) => any) | undefined;
20
+ }>, {
21
+ height: string;
22
+ modelValue: string;
23
+ disabled: boolean;
24
+ readonly: boolean;
25
+ placeholder: string;
26
+ language: string;
27
+ plugins: string;
28
+ toolbar: string | string[];
29
+ menubar: boolean | string;
30
+ branding: boolean;
31
+ statusbar: boolean;
32
+ apiKey: string;
33
+ init: Record<string, any>;
34
+ }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {
35
+ editorRef: import('vue').CreateComponentPublicInstanceWithMixins<Readonly<globalThis.ExtractPropTypes<import('@tinymce/tinymce-vue/lib/cjs/main/ts/components/EditorPropTypes').CopyProps<import('@tinymce/tinymce-vue/lib/cjs/main/ts/components/EditorPropTypes').IPropTypes>>>, () => any, unknown, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, import('vue').PublicProps, {
36
+ init: any;
37
+ apiKey: any;
38
+ licenseKey: any;
39
+ cloudChannel: any;
40
+ id: any;
41
+ initialValue: any;
42
+ outputFormat: any;
43
+ inline: any;
44
+ modelEvents: any;
45
+ plugins: any;
46
+ tagName: any;
47
+ toolbar: any;
48
+ modelValue: any;
49
+ disabled: any;
50
+ readonly: any;
51
+ tinymceScriptSrc: any;
52
+ }, true, {}, {}, import('vue').GlobalComponents, import('vue').GlobalDirectives, string, {}, any, import('vue').ComponentProvideOptions, {
53
+ P: {};
54
+ B: {};
55
+ D: {};
56
+ C: {};
57
+ M: {};
58
+ Defaults: {};
59
+ }, Readonly<globalThis.ExtractPropTypes<import('@tinymce/tinymce-vue/lib/cjs/main/ts/components/EditorPropTypes').CopyProps<import('@tinymce/tinymce-vue/lib/cjs/main/ts/components/EditorPropTypes').IPropTypes>>>, () => any, {}, {}, {}, {
60
+ init: any;
61
+ apiKey: any;
62
+ licenseKey: any;
63
+ cloudChannel: any;
64
+ id: any;
65
+ initialValue: any;
66
+ outputFormat: any;
67
+ inline: any;
68
+ modelEvents: any;
69
+ plugins: any;
70
+ tagName: any;
71
+ toolbar: any;
72
+ modelValue: any;
73
+ disabled: any;
74
+ readonly: any;
75
+ tinymceScriptSrc: any;
76
+ }> | null;
77
+ }, HTMLDivElement>;
78
+ export default _default;
@@ -0,0 +1,105 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __defProps = Object.defineProperties;
3
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
4
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
7
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
8
+ var __spreadValues = (a, b) => {
9
+ for (var prop in b || (b = {}))
10
+ if (__hasOwnProp.call(b, prop))
11
+ __defNormalProp(a, prop, b[prop]);
12
+ if (__getOwnPropSymbols)
13
+ for (var prop of __getOwnPropSymbols(b)) {
14
+ if (__propIsEnum.call(b, prop))
15
+ __defNormalProp(a, prop, b[prop]);
16
+ }
17
+ return a;
18
+ };
19
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
20
+ import { defineComponent, useModel, ref, openBlock, createElementBlock, createVNode, unref, mergeModels } from "vue";
21
+ import { Editor } from "../node_modules/@tinymce/tinymce-vue/lib/es2015/main/ts/components/Editor.js";
22
+ const _hoisted_1 = { class: "jky-rich-editor" };
23
+ const _sfc_main = /* @__PURE__ */ defineComponent(__spreadProps(__spreadValues({}, {
24
+ name: "JkyRichEditor"
25
+ }), {
26
+ __name: "RichEditor",
27
+ props: /* @__PURE__ */ mergeModels({
28
+ modelValue: { default: "" },
29
+ disabled: { type: Boolean, default: false },
30
+ placeholder: { default: "" },
31
+ height: { default: "400px" },
32
+ language: { default: "zh-CN" },
33
+ plugins: { default: "preview importcss searchreplace autolink autosave save directionality code visualblocks visualchars fullscreen image link media codesample table charmap pagebreak nonbreaking anchor insertdatetime advlist lists wordcount help charmap quickbars emoticons" },
34
+ toolbar: { default: "undo redo | blocks fontfamily fontsize | bold italic underline strikethrough | link image media table mergetags | addcomment showcomments | spellcheckdialog a11ycheck typography | alignleft aligncenter alignright alignjustify | outdent indent | checklist numlist bullist indent outdent | emoticons charmap | removeformat | codesample | code" },
35
+ menubar: { type: [Boolean, String], default: true },
36
+ branding: { type: Boolean, default: false },
37
+ statusbar: { type: Boolean, default: true },
38
+ readonly: { type: Boolean, default: false },
39
+ apiKey: { default: "0hp1syn1u5hzcdgv20yow1bcp4mvba8xtqi6pcgpnuz61dul" },
40
+ init: { default: () => ({}) }
41
+ }, {
42
+ "modelValue": {
43
+ default: ""
44
+ },
45
+ "modelModifiers": {}
46
+ }),
47
+ emits: /* @__PURE__ */ mergeModels(["update:modelValue", "change", "focus", "blur"], ["update:modelValue"]),
48
+ setup(__props, { expose: __expose, emit: __emit }) {
49
+ const props = __props;
50
+ const emit = __emit;
51
+ const modelValue = useModel(__props, "modelValue");
52
+ const editorRef = ref(null);
53
+ function handleEditorChange(content) {
54
+ modelValue.value = content;
55
+ emit("change", content);
56
+ }
57
+ function handleFocus(event) {
58
+ emit("focus", event);
59
+ }
60
+ function handleBlur(event) {
61
+ emit("blur", event);
62
+ }
63
+ const initConfig = __spreadValues({
64
+ language: props.language,
65
+ height: Number.parseInt(props.height.replace("px", ""), 10),
66
+ placeholder: props.placeholder,
67
+ plugins: props.plugins,
68
+ toolbar: props.toolbar,
69
+ menubar: props.menubar,
70
+ branding: props.branding,
71
+ statusbar: props.statusbar,
72
+ readonly: props.readonly || props.disabled,
73
+ content_style: `
74
+ body {
75
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
76
+ font-size: 14px;
77
+ line-height: 1.6;
78
+ }
79
+ `
80
+ }, props.init);
81
+ __expose({
82
+ editor: editorRef
83
+ });
84
+ return (_ctx, _cache) => {
85
+ return openBlock(), createElementBlock("div", _hoisted_1, [
86
+ createVNode(unref(Editor), {
87
+ ref_key: "editorRef",
88
+ ref: editorRef,
89
+ modelValue: modelValue.value,
90
+ "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => modelValue.value = $event),
91
+ "api-key": __props.apiKey,
92
+ init: initConfig,
93
+ disabled: __props.disabled,
94
+ readonly: __props.readonly,
95
+ onOnChange: handleEditorChange,
96
+ onOnFocus: handleFocus,
97
+ onOnBlur: handleBlur
98
+ }, null, 8, ["modelValue", "api-key", "disabled", "readonly"])
99
+ ]);
100
+ };
101
+ }
102
+ }));
103
+ export {
104
+ _sfc_main as default
105
+ };
@@ -0,0 +1,5 @@
1
+ import _sfc_main from "./RichEditor.vue.js";
2
+ /* empty css */
3
+ export {
4
+ _sfc_main as default
5
+ };
@@ -0,0 +1,4 @@
1
+ import { InstallWithSFC } from '../utils';
2
+ import { default as RichEditor } from './RichEditor.vue';
3
+ export declare const JkyRichEditor: InstallWithSFC<typeof RichEditor>;
4
+ export default JkyRichEditor;
@@ -0,0 +1,8 @@
1
+ import _sfc_main from "./RichEditor.vue.js";
2
+ /* empty css */
3
+ import { installWithSFC } from "../utils/with-install.js";
4
+ const JkyRichEditor = installWithSFC(_sfc_main);
5
+ export {
6
+ JkyRichEditor,
7
+ JkyRichEditor as default
8
+ };
@@ -0,0 +1,34 @@
1
+
2
+ /* 禁止使用 @apply,所有 TailwindCSS 工具类直接写在 class 中 */
3
+ /* 样式文件仅用于定义组件特定的自定义纯 CSS 样式 */
4
+ /* RichEditor 组件样式变量 */
5
+ :root {
6
+ --jky-rich-editor-border: #d9d9d9;
7
+ --jky-rich-editor-border-hover: #409eff;
8
+ --jky-rich-editor-border-radius: 4px;
9
+ --jky-rich-editor-box-shadow: 0 0 0 1px #409eff;
10
+ }
11
+ .jky-rich-editor {
12
+ width: 100%;
13
+ }
14
+ .jky-rich-editor .tox-tinymce {
15
+ border: 1px solid var(--jky-rich-editor-border);
16
+ border-radius: var(--jky-rich-editor-border-radius);
17
+ transition: border-color 0.2s;
18
+ }
19
+ .jky-rich-editor .tox-tinymce:hover {
20
+ border-color: var(--jky-rich-editor-border-hover);
21
+ }
22
+ .jky-rich-editor .tox-tinymce:focus-within {
23
+ border-color: var(--jky-rich-editor-border-hover);
24
+ box-shadow: var(--jky-rich-editor-box-shadow);
25
+ }
26
+ /* 禁用状态 */
27
+ .jky-rich-editor.is-disabled .tox-tinymce {
28
+ background-color: #f5f7fa;
29
+ cursor: not-allowed;
30
+ }
31
+ /* 只读状态 */
32
+ .jky-rich-editor.is-readonly .tox-tinymce {
33
+ background-color: #fafafa;
34
+ }
package/dist/es/style.css CHANGED
@@ -505,6 +505,10 @@
505
505
  margin-left: calc(var(--spacing) * 2);
506
506
  }
507
507
 
508
+ .ml-3 {
509
+ margin-left: calc(var(--spacing) * 3);
510
+ }
511
+
508
512
  .icon-\[ant-design--menu-fold-outlined\] {
509
513
  width: 1em;
510
514
  height: 1em;
@@ -1005,6 +1009,10 @@
1005
1009
  display: inline;
1006
1010
  }
1007
1011
 
1012
+ .table {
1013
+ display: table;
1014
+ }
1015
+
1008
1016
  .h-4 {
1009
1017
  height: calc(var(--spacing) * 4);
1010
1018
  }
@@ -1110,6 +1118,10 @@
1110
1118
  justify-content: space-around;
1111
1119
  }
1112
1120
 
1121
+ .justify-between {
1122
+ justify-content: space-between;
1123
+ }
1124
+
1113
1125
  .justify-end {
1114
1126
  justify-content: flex-end;
1115
1127
  }
@@ -1267,6 +1279,10 @@
1267
1279
  background-color: var(--color-red-500) !important;
1268
1280
  }
1269
1281
 
1282
+ .bg-transparent {
1283
+ background-color: #0000;
1284
+ }
1285
+
1270
1286
  .bg-white {
1271
1287
  background-color: var(--color-white);
1272
1288
  }
@@ -1456,6 +1472,14 @@
1456
1472
  text-transform: lowercase;
1457
1473
  }
1458
1474
 
1475
+ .italic {
1476
+ font-style: italic;
1477
+ }
1478
+
1479
+ .underline {
1480
+ text-decoration-line: underline;
1481
+ }
1482
+
1459
1483
  .outline {
1460
1484
  outline-style: var(--tw-outline-style);
1461
1485
  outline-width: 1px;
@@ -1466,6 +1490,10 @@
1466
1490
  filter: var(--tw-blur, ) var(--tw-brightness, ) var(--tw-contrast, ) var(--tw-grayscale, ) var(--tw-hue-rotate, ) var(--tw-invert, ) var(--tw-saturate, ) var(--tw-sepia, ) var(--tw-drop-shadow, );
1467
1491
  }
1468
1492
 
1493
+ .filter {
1494
+ filter: var(--tw-blur, ) var(--tw-brightness, ) var(--tw-contrast, ) var(--tw-grayscale, ) var(--tw-hue-rotate, ) var(--tw-invert, ) var(--tw-saturate, ) var(--tw-sepia, ) var(--tw-drop-shadow, );
1495
+ }
1496
+
1469
1497
  .transition {
1470
1498
  transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to, opacity, box-shadow, transform, translate, scale, rotate, filter, -webkit-backdrop-filter, backdrop-filter, display, content-visibility, overlay, pointer-events;
1471
1499
  transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));
@@ -1 +1 @@
1
- :root{--jky-button-primary-bg:#007bff;--jky-button-primary-text:#fff;--jky-button-primary-hover-bg:#0056b3;--jky-button-success-bg:#28a745;--jky-button-success-text:#fff;--jky-button-success-hover-bg:#1e7e34;--jky-button-warning-bg:#ffc107;--jky-button-warning-text:#fff;--jky-button-warning-hover-bg:#e0a800;--jky-button-danger-bg:#dc3545;--jky-button-danger-text:#fff;--jky-button-danger-hover-bg:#c82333;--jky-button-info-bg:#6c757d;--jky-button-info-text:#fff;--jky-button-info-hover-bg:#5a6268;--jky-button-default-bg:#fff;--jky-button-default-text:#606266;--jky-button-default-border:#dcdfe6;--jky-button-default-hover-bg:#f5f7fa;--jky-button-font-size:14px;--jky-button-font-size-small:12px;--jky-button-font-size-large:16px;--jky-button-padding:0 16px;--jky-button-padding-small:0 12px;--jky-button-padding-large:0 20px;--jky-button-height:40px;--jky-button-height-small:32px;--jky-button-height-large:48px;--jky-button-border-radius:0.375rem;--jky-button-disabled-opacity:0.5;--jky-button-disabled-bg:#f5f7fa;--jky-button-disabled-text:#c0c4cc;--jky-button-loading-opacity:0.7;--jky-button-icon-size:1.25rem;--jky-button-icon-margin:0.5rem}.jky-button{align-items:center;background-color:var(--jky-button-default-bg);border:1px solid var(--jky-button-default-border);border-radius:var(--jky-button-border-radius);color:var(--jky-button-default-text);cursor:pointer;display:inline-flex;font-size:var(--jky-button-font-size);font-weight:500;height:var(--jky-button-height);justify-content:center;padding:var(--jky-button-padding);transition:color .2s,background-color .2s}.jky-button--primary{background-color:var(--jky-button-primary-bg);border:none;color:var(--jky-button-primary-text)}.jky-button--primary:hover{background-color:var(--jky-button-primary-hover-bg)}.jky-button--success{background-color:var(--jky-button-success-bg);border:none;color:var(--jky-button-success-text)}.jky-button--success:hover{background-color:var(--jky-button-success-hover-bg)}.jky-button--warning{background-color:var(--jky-button-warning-bg);border:none;color:var(--jky-button-warning-text)}.jky-button--warning:hover{background-color:var(--jky-button-warning-hover-bg)}.jky-button--danger{background-color:var(--jky-button-danger-bg);border:none;color:var(--jky-button-danger-text)}.jky-button--danger:hover{background-color:var(--jky-button-danger-hover-bg)}.jky-button--info{background-color:var(--jky-button-info-bg);border:none;color:var(--jky-button-info-text)}.jky-button--info:hover{background-color:var(--jky-button-info-hover-bg)}.jky-button--small{font-size:var(--jky-button-font-size-small);height:var(--jky-button-height-small);padding:var(--jky-button-padding-small)}.jky-button--large{font-size:var(--jky-button-font-size-large);height:var(--jky-button-height-large);padding:var(--jky-button-padding-large)}.jky-button.is-disabled{background-color:var(--jky-button-disabled-bg);color:var(--jky-button-disabled-text);cursor:not-allowed;opacity:var(--jky-button-disabled-opacity);pointer-events:none}.jky-button.is-loading{opacity:var(--jky-button-loading-opacity);pointer-events:none;position:relative}.jky-button__loading{display:flex;inset:0;position:absolute}.jky-button__icon,.jky-button__loading{align-items:center;justify-content:center}.jky-button__icon{display:inline-flex;font-size:1em;margin-right:var(--jky-button-icon-margin)}.jky-button__icon:only-child{margin-right:0}.jky-button--suffix .jky-button__icon{margin-left:var(--jky-button-icon-margin);margin-right:0}.jky-button:focus-visible{box-shadow:0 0 0 2px #fff,0 0 0 4px #000;outline:2px solid transparent;outline-offset:2px}.loading-spinner{animation:spin 1s linear infinite;height:var(--jky-button-icon-size);width:var(--jky-button-icon-size)}@keyframes spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}:root{--jky-button-nav-active-bg:var(--el-color-primary);--jky-button-nav-active-text:#fff;--jky-button-nav-inactive-bg:var(--el-fill-color-light);--jky-button-nav-inactive-text:var(--el-text-color-regular);--el-dropdown-menu-margin-left:12px}.jky-button-nav{align-items:center;display:flex;flex-wrap:wrap;.el-dropdown{margin-left:var(--el-dropdown-menu-margin-left)}}.jky-button-nav-item{background-color:var(--jky-button-nav-inactive-bg);color:var(--jky-button-nav-inactive-text);&.is-active,&[aria-pressed=true]{background-color:var(--jky-button-nav-active-bg);color:var(--jky-button-nav-active-text)}}:root{--j-code-mirror-border-color:#dcdfe6;--j-code-mirror-border-radius:4px;--j-code-mirror-height:400px}.j-code-mirror-editor{border-radius:var(--j-code-mirror-border-radius);height:var(--j-code-mirror-height);overflow:hidden;width:100%}.code-mirror-container{height:100%;overflow:auto;width:100%}.code-mirror-container .cm-editor{height:100%}.code-mirror-container .cm-scroller{font-family:Consolas,Monaco,Courier New,monospace;font-size:14px;line-height:1.5;overflow:auto}.code-mirror-container .cm-gutters{background-color:#2c2d2d;border-color:#4c4d4f;color:#909399}:root{--jky-form-item-border-width:4px;--jky-form-item-border-color:var(--el-color-primary);--jky-form-item-bg-color:rgba(var(--el-color-primary-rgb),0.5)}:root{--jky-menu-bg-color:#fff;--jky-menu-text-color:#303133;--jky-menu-active-color:#409eff;--jky-menu-hover-bg-color:#f5f7fa;--jky-menu-hover-text-color:#606266;--jky-menu-item-height:56px;--jky-menu-item-padding:0 20px;--jky-menu-item-font-size:14px;--jky-menu-icon-size:18px;--jky-menu-icon-margin:8px;--jky-menu-border-color:#e4e7ed;--jky-menu-disabled-opacity:0.5;--jky-menu-disabled-text-color:#c0c4cc}.jky-menu{li+li{margin-top:0}}.jky-menu-item__icon{align-items:center;display:inline-flex;flex-shrink:0;font-size:var(--jky-menu-icon-size);height:var(--jky-menu-icon-size);justify-content:center;margin-right:var(--jky-menu-icon-margin);width:var(--jky-menu-icon-size)}:root{--jky-page-header-bg-color:#1890ff;--jky-page-header-bg-size:cover;--jky-page-header-bg-position:center;--jky-page-header-box-shadow:0 2px 8px rgba(0,0,0,.15);--jky-page-header-padding-x:24px;--jky-page-header-padding-x-mobile:16px;--jky-page-header-gap:16px;--jky-page-header-gap-mobile:12px;--jky-page-header-gap-left:12px;--jky-page-header-gap-status:12px;--jky-page-header-gap-center:24px;--jky-page-header-gap-center-mobile:12px;--jky-page-header-title-color:#fff;--jky-page-header-title-size:20px;--jky-page-header-title-size-mobile:16px;--jky-page-header-title-weight:600;--jky-page-header-text-color:hsla(0,0%,100%,.85);--jky-page-header-text-size:16px;--jky-page-header-icon-color:#fff;--jky-page-header-icon-size:20px;--jky-page-header-icon-hover-opacity:0.8;--jky-page-header-logo-height:40px;--jky-page-header-avatar-size:32px}.jky-page-header{background-color:var(--jky-page-header-bg-color);background-position:var(--jky-page-header-bg-position);background-size:var(--jky-page-header-bg-size);box-shadow:var(--jky-page-header-box-shadow);width:100%}.jky-page-header__container{align-items:center;display:flex;height:100%;justify-content:space-between;margin:0 auto;max-width:100%;padding:0 var(--jky-page-header-padding-x)}.jky-page-header__left{align-items:center;display:flex;flex-shrink:0;gap:var(--jky-page-header-gap-left)}.jky-page-header__logo{height:var(--jky-page-header-logo-height);object-fit:contain;width:auto}.jky-page-header__title{color:var(--jky-page-header-title-color);font-size:var(--jky-page-header-title-size);font-weight:var(--jky-page-header-title-weight);white-space:nowrap}.jky-page-header__center{align-items:center;display:flex;flex:1;justify-content:center;margin:0 var(--jky-page-header-gap-center);min-width:0}.jky-page-header__right{align-items:center;display:flex;flex-shrink:0;gap:var(--jky-page-header-gap)}.jky-page-header__status-icons{align-items:center;display:flex;gap:var(--jky-page-header-gap-status)}.jky-page-header__status-icon{color:var(--jky-page-header-icon-color);cursor:pointer;transition:opacity .2s;&:hover{opacity:var(--jky-page-header-icon-hover-opacity)}}.jky-page-header__time{color:var(--jky-page-header-text-color);font-size:var(--jky-page-header-text-size);white-space:nowrap}.jky-page-header__user{align-items:center;color:var(--jky-page-header-text-color);cursor:pointer;display:flex;gap:8px}.jky-page-header__avatar{color:var(--jky-page-header-icon-color);img{height:100%;object-fit:cover;width:100%}}.jky-page-header__username{white-space:nowrap}.jky-page-header__logout,.jky-page-header__username{color:var(--jky-page-header-text-color);font-size:var(--jky-page-header-text-size)}@media (max-width:768px){.jky-page-header__container{padding:0 var(--jky-page-header-padding-x-mobile)}.jky-page-header__title{font-size:var(--jky-page-header-title-size-mobile)}.jky-page-header__center{margin:0 var(--jky-page-header-gap-center-mobile)}.jky-page-header__right{gap:var(--jky-page-header-gap-mobile)}}:root{--jky-say-hello-bg:#42b883;--jky-say-hello-text:#fff;--jky-say-hello-hover-bg:#3aa876;--jky-say-hello-font-size:16px;--jky-say-hello-padding:8px 20px;--jky-say-hello-margin:4px 2px;--jky-say-hello-border-radius:6px}.jky-say-hello{background-color:var(--jky-say-hello-bg);border-radius:var(--jky-say-hello-border-radius);color:var(--jky-say-hello-text);cursor:pointer;display:inline-block;font-size:var(--jky-say-hello-font-size);margin:var(--jky-say-hello-margin);padding:var(--jky-say-hello-padding);text-align:center;text-decoration:none;transition:background-color .2s ease}.jky-say-hello:hover{background-color:var(--jky-say-hello-hover-bg)}@import "tailwindcss";@plugin "@iconify/tailwind4";@source "../node_modules/jky-component-lib/dist/es/";@source "../docs/**/*.md";@source "./**/*.md";@source "./**/*.vue";@source "./**/*.css";@custom-variant dark (&:is(.dark *))
1
+ :root{--jky-add-input-gap:12px;--jky-add-input-row-gap:8px;--jky-add-input-min-width:100px;--jky-add-input-action-width:80px}.jky-add-input{display:flex;flex-direction:column;gap:var(--jky-add-input-row-gap);min-width:var(--jky-add-input-min-width)}.jky-add-input__row{align-items:center;display:flex;gap:var(--jky-add-input-gap)}.jky-add-input__key,.jky-add-input__value{flex:1;min-width:0}.jky-add-input__actions{display:flex;flex-shrink:0;gap:var(--jky-add-input-gap);width:var(--jky-add-input-action-width)}:root{--jky-button-primary-bg:#007bff;--jky-button-primary-text:#fff;--jky-button-primary-hover-bg:#0056b3;--jky-button-success-bg:#28a745;--jky-button-success-text:#fff;--jky-button-success-hover-bg:#1e7e34;--jky-button-warning-bg:#ffc107;--jky-button-warning-text:#fff;--jky-button-warning-hover-bg:#e0a800;--jky-button-danger-bg:#dc3545;--jky-button-danger-text:#fff;--jky-button-danger-hover-bg:#c82333;--jky-button-info-bg:#6c757d;--jky-button-info-text:#fff;--jky-button-info-hover-bg:#5a6268;--jky-button-default-bg:#fff;--jky-button-default-text:#606266;--jky-button-default-border:#dcdfe6;--jky-button-default-hover-bg:#f5f7fa;--jky-button-font-size:14px;--jky-button-font-size-small:12px;--jky-button-font-size-large:16px;--jky-button-padding:0 16px;--jky-button-padding-small:0 12px;--jky-button-padding-large:0 20px;--jky-button-height:40px;--jky-button-height-small:32px;--jky-button-height-large:48px;--jky-button-border-radius:0.375rem;--jky-button-disabled-opacity:0.5;--jky-button-disabled-bg:#f5f7fa;--jky-button-disabled-text:#c0c4cc;--jky-button-loading-opacity:0.7;--jky-button-icon-size:1.25rem;--jky-button-icon-margin:0.5rem}.jky-button{align-items:center;background-color:var(--jky-button-default-bg);border:1px solid var(--jky-button-default-border);border-radius:var(--jky-button-border-radius);color:var(--jky-button-default-text);cursor:pointer;display:inline-flex;font-size:var(--jky-button-font-size);font-weight:500;height:var(--jky-button-height);justify-content:center;padding:var(--jky-button-padding);transition:color .2s,background-color .2s}.jky-button--primary{background-color:var(--jky-button-primary-bg);border:none;color:var(--jky-button-primary-text)}.jky-button--primary:hover{background-color:var(--jky-button-primary-hover-bg)}.jky-button--success{background-color:var(--jky-button-success-bg);border:none;color:var(--jky-button-success-text)}.jky-button--success:hover{background-color:var(--jky-button-success-hover-bg)}.jky-button--warning{background-color:var(--jky-button-warning-bg);border:none;color:var(--jky-button-warning-text)}.jky-button--warning:hover{background-color:var(--jky-button-warning-hover-bg)}.jky-button--danger{background-color:var(--jky-button-danger-bg);border:none;color:var(--jky-button-danger-text)}.jky-button--danger:hover{background-color:var(--jky-button-danger-hover-bg)}.jky-button--info{background-color:var(--jky-button-info-bg);border:none;color:var(--jky-button-info-text)}.jky-button--info:hover{background-color:var(--jky-button-info-hover-bg)}.jky-button--small{font-size:var(--jky-button-font-size-small);height:var(--jky-button-height-small);padding:var(--jky-button-padding-small)}.jky-button--large{font-size:var(--jky-button-font-size-large);height:var(--jky-button-height-large);padding:var(--jky-button-padding-large)}.jky-button.is-disabled{background-color:var(--jky-button-disabled-bg);color:var(--jky-button-disabled-text);cursor:not-allowed;opacity:var(--jky-button-disabled-opacity);pointer-events:none}.jky-button.is-loading{opacity:var(--jky-button-loading-opacity);pointer-events:none;position:relative}.jky-button__loading{display:flex;inset:0;position:absolute}.jky-button__icon,.jky-button__loading{align-items:center;justify-content:center}.jky-button__icon{display:inline-flex;font-size:1em;margin-right:var(--jky-button-icon-margin)}.jky-button__icon:only-child{margin-right:0}.jky-button--suffix .jky-button__icon{margin-left:var(--jky-button-icon-margin);margin-right:0}.jky-button:focus-visible{box-shadow:0 0 0 2px #fff,0 0 0 4px #000;outline:2px solid transparent;outline-offset:2px}.loading-spinner{animation:spin 1s linear infinite;height:var(--jky-button-icon-size);width:var(--jky-button-icon-size)}@keyframes spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}:root{--jky-button-nav-active-bg:var(--el-color-primary);--jky-button-nav-active-text:#fff;--jky-button-nav-inactive-bg:var(--el-fill-color-light);--jky-button-nav-inactive-text:var(--el-text-color-regular);--el-dropdown-menu-margin-left:12px}.jky-button-nav{align-items:center;display:flex;flex-wrap:wrap;.el-dropdown{margin-left:var(--el-dropdown-menu-margin-left)}}.jky-button-nav-item{background-color:var(--jky-button-nav-inactive-bg);color:var(--jky-button-nav-inactive-text);&.is-active,&[aria-pressed=true]{background-color:var(--jky-button-nav-active-bg);color:var(--jky-button-nav-active-text)}}:root{--j-code-mirror-border-color:#dcdfe6;--j-code-mirror-border-radius:4px;--j-code-mirror-height:400px}.j-code-mirror-editor{border-radius:var(--j-code-mirror-border-radius);height:var(--j-code-mirror-height);overflow:hidden;width:100%}.code-mirror-container{height:100%;overflow:auto;width:100%}.code-mirror-container .cm-editor{height:100%}.code-mirror-container .cm-scroller{font-family:Consolas,Monaco,Courier New,monospace;font-size:14px;line-height:1.5;overflow:auto}.code-mirror-container .cm-gutters{background-color:#2c2d2d;border-color:#4c4d4f;color:#909399}:root{--jky-form-item-border-width:4px;--jky-form-item-border-color:var(--el-color-primary);--jky-form-item-bg-color:rgba(var(--el-color-primary-rgb),0.5)}:root{--jky-menu-bg-color:#fff;--jky-menu-text-color:#303133;--jky-menu-active-color:#409eff;--jky-menu-hover-bg-color:#f5f7fa;--jky-menu-hover-text-color:#606266;--jky-menu-item-height:56px;--jky-menu-item-padding:0 20px;--jky-menu-item-font-size:14px;--jky-menu-icon-size:18px;--jky-menu-icon-margin:8px;--jky-menu-border-color:#e4e7ed;--jky-menu-disabled-opacity:0.5;--jky-menu-disabled-text-color:#c0c4cc}.jky-menu{li+li{margin-top:0}}.jky-menu-item__icon{align-items:center;display:inline-flex;flex-shrink:0;font-size:var(--jky-menu-icon-size);height:var(--jky-menu-icon-size);justify-content:center;margin-right:var(--jky-menu-icon-margin);width:var(--jky-menu-icon-size)}:root{--jky-page-header-bg-color:#1890ff;--jky-page-header-bg-size:cover;--jky-page-header-bg-position:center;--jky-page-header-box-shadow:0 2px 8px rgba(0,0,0,.15);--jky-page-header-padding-x:24px;--jky-page-header-padding-x-mobile:16px;--jky-page-header-gap:16px;--jky-page-header-gap-mobile:12px;--jky-page-header-gap-left:12px;--jky-page-header-gap-status:12px;--jky-page-header-gap-center:24px;--jky-page-header-gap-center-mobile:12px;--jky-page-header-title-color:#fff;--jky-page-header-title-size:20px;--jky-page-header-title-size-mobile:16px;--jky-page-header-title-weight:600;--jky-page-header-text-color:hsla(0,0%,100%,.85);--jky-page-header-text-size:16px;--jky-page-header-icon-color:#fff;--jky-page-header-icon-size:20px;--jky-page-header-icon-hover-opacity:0.8;--jky-page-header-logo-height:40px;--jky-page-header-avatar-size:32px}.jky-page-header{background-color:var(--jky-page-header-bg-color);background-position:var(--jky-page-header-bg-position);background-size:var(--jky-page-header-bg-size);box-shadow:var(--jky-page-header-box-shadow);width:100%}.jky-page-header__container{align-items:center;display:flex;height:100%;justify-content:space-between;margin:0 auto;max-width:100%;padding:0 var(--jky-page-header-padding-x)}.jky-page-header__left{align-items:center;display:flex;flex-shrink:0;gap:var(--jky-page-header-gap-left)}.jky-page-header__logo{height:var(--jky-page-header-logo-height);object-fit:contain;width:auto}.jky-page-header__title{color:var(--jky-page-header-title-color);font-size:var(--jky-page-header-title-size);font-weight:var(--jky-page-header-title-weight);white-space:nowrap}.jky-page-header__center{align-items:center;display:flex;flex:1;justify-content:center;margin:0 var(--jky-page-header-gap-center);min-width:0}.jky-page-header__right{align-items:center;display:flex;flex-shrink:0;gap:var(--jky-page-header-gap)}.jky-page-header__status-icons{align-items:center;display:flex;gap:var(--jky-page-header-gap-status)}.jky-page-header__status-icon{color:var(--jky-page-header-icon-color);cursor:pointer;transition:opacity .2s;&:hover{opacity:var(--jky-page-header-icon-hover-opacity)}}.jky-page-header__time{color:var(--jky-page-header-text-color);font-size:var(--jky-page-header-text-size);white-space:nowrap}.jky-page-header__user{align-items:center;color:var(--jky-page-header-text-color);cursor:pointer;display:flex;gap:8px}.jky-page-header__avatar{color:var(--jky-page-header-icon-color);img{height:100%;object-fit:cover;width:100%}}.jky-page-header__username{white-space:nowrap}.jky-page-header__logout,.jky-page-header__username{color:var(--jky-page-header-text-color);font-size:var(--jky-page-header-text-size)}@media (max-width:768px){.jky-page-header__container{padding:0 var(--jky-page-header-padding-x-mobile)}.jky-page-header__title{font-size:var(--jky-page-header-title-size-mobile)}.jky-page-header__center{margin:0 var(--jky-page-header-gap-center-mobile)}.jky-page-header__right{gap:var(--jky-page-header-gap-mobile)}}:root{--jky-rich-editor-border:#d9d9d9;--jky-rich-editor-border-hover:#409eff;--jky-rich-editor-border-radius:4px;--jky-rich-editor-box-shadow:0 0 0 1px #409eff}.jky-rich-editor{width:100%}.jky-rich-editor .tox-tinymce{border:1px solid var(--jky-rich-editor-border);border-radius:var(--jky-rich-editor-border-radius);transition:border-color .2s}.jky-rich-editor .tox-tinymce:hover{border-color:var(--jky-rich-editor-border-hover)}.jky-rich-editor .tox-tinymce:focus-within{border-color:var(--jky-rich-editor-border-hover);box-shadow:var(--jky-rich-editor-box-shadow)}.jky-rich-editor.is-disabled .tox-tinymce{background-color:#f5f7fa;cursor:not-allowed}.jky-rich-editor.is-readonly .tox-tinymce{background-color:#fafafa}:root{--jky-say-hello-bg:#42b883;--jky-say-hello-text:#fff;--jky-say-hello-hover-bg:#3aa876;--jky-say-hello-font-size:16px;--jky-say-hello-padding:8px 20px;--jky-say-hello-margin:4px 2px;--jky-say-hello-border-radius:6px}.jky-say-hello{background-color:var(--jky-say-hello-bg);border-radius:var(--jky-say-hello-border-radius);color:var(--jky-say-hello-text);cursor:pointer;display:inline-block;font-size:var(--jky-say-hello-font-size);margin:var(--jky-say-hello-margin);padding:var(--jky-say-hello-padding);text-align:center;text-decoration:none;transition:background-color .2s ease}.jky-say-hello:hover{background-color:var(--jky-say-hello-hover-bg)}@import "tailwindcss";@plugin "@iconify/tailwind4";@source "../node_modules/jky-component-lib/dist/es/";@source "../docs/**/*.md";@source "./**/*.md";@source "./**/*.vue";@source "./**/*.css";@custom-variant dark (&:is(.dark *))
@@ -1,4 +1,5 @@
1
1
  export * from './installer';
2
+ export * from './responsive-toolbar';
2
3
  export * from './string';
3
4
  export * from './types';
4
5
  export * from './with-install';
@@ -0,0 +1,78 @@
1
+ import { Ref } from 'vue';
2
+ /**
3
+ * 响应式工具栏配置
4
+ */
5
+ export interface UseResponsiveToolbarOptions {
6
+ /** 工具栏容器引用 */
7
+ toolbarRef: Ref<HTMLElement | null>;
8
+ /** 按钮数量限制(可选),超出此数量则折叠 */
9
+ buttonLimit?: number;
10
+ /** 按钮之间的间距(像素) */
11
+ buttonGap?: number;
12
+ /** 最小可见按钮数量(即使空间不够也会显示) */
13
+ minVisibleButtons?: number;
14
+ /** 工具栏可用宽度百分比(默认 0.5,即 50%) */
15
+ widthPercentage?: number;
16
+ }
17
+ /**
18
+ * 响应式工具栏返回值
19
+ */
20
+ export interface UseResponsiveToolbarReturn {
21
+ /** 可见的按钮数量 */
22
+ visibleCount: Ref<number>;
23
+ /** 是否需要折叠 */
24
+ needCollapse: Ref<boolean>;
25
+ /** 窗口宽度 */
26
+ windowWidth: Ref<number>;
27
+ /** 窗口高度 */
28
+ windowHeight: Ref<number>;
29
+ }
30
+ /**
31
+ * 响应式工具栏 Hook
32
+ * 用于监听窗口大小变化,自动计算工具栏按钮的折叠状态
33
+ *
34
+ * @param options 配置选项
35
+ * @returns 工具栏状态
36
+ *
37
+ * @example
38
+ * ```vue
39
+ * <script setup lang="ts">
40
+ * import { useResponsiveToolbar } from '../utils'
41
+ *
42
+ * const toolbarRef = ref<HTMLElement | null>(null)
43
+ * const { visibleCount, needCollapse, windowWidth } = useResponsiveToolbar({
44
+ * toolbarRef,
45
+ * buttonLimit: 3, // 最多显示 3 个按钮
46
+ * buttonGap: 8, // 按钮间距 8px
47
+ * minVisibleButtons: 1, // 至少显示 1 个按钮
48
+ * })
49
+ * </script>
50
+ *
51
+ * <template>
52
+ * <div ref="toolbarRef" class="toolbar">
53
+ * <template v-for="(button, index) in buttons" :key="index">
54
+ * <ElButton
55
+ * v-if="index < visibleCount || !needCollapse"
56
+ * :type="index < visibleCount ? 'primary' : 'default'"
57
+ * >
58
+ * {{ button.label }}
59
+ * </ElButton>
60
+ * </template>
61
+ * <ElDropdown v-if="needCollapse">
62
+ * <ElButton>更多</ElButton>
63
+ * <template #dropdown>
64
+ * <ElDropdownMenu>
65
+ * <ElDropdownItem
66
+ * v-for="(button, index) in buttons.slice(visibleCount)"
67
+ * :key="index"
68
+ * >
69
+ * {{ button.label }}
70
+ * </ElDropdownItem>
71
+ * </ElDropdownMenu>
72
+ * </template>
73
+ * </ElDropdown>
74
+ * </div>
75
+ * </template>
76
+ * ```
77
+ */
78
+ export declare function useResponsiveToolbar(options: UseResponsiveToolbarOptions): UseResponsiveToolbarReturn;
@@ -0,0 +1,64 @@
1
+ import { useWindowSize } from "@vueuse/core";
2
+ import { ref, watch, nextTick } from "vue";
3
+ function useResponsiveToolbar(options) {
4
+ const {
5
+ toolbarRef,
6
+ buttonLimit,
7
+ buttonGap = 8,
8
+ minVisibleButtons = 1,
9
+ widthPercentage = 0.5
10
+ } = options;
11
+ const { width: windowWidth, height: windowHeight } = useWindowSize();
12
+ const visibleCount = ref(buttonLimit || minVisibleButtons);
13
+ const needCollapse = ref(false);
14
+ function calculateVisibleButtons() {
15
+ if (!toolbarRef.value)
16
+ return;
17
+ const toolbarWidth = toolbarRef.value.clientWidth;
18
+ const buttons = toolbarRef.value.querySelectorAll(".el-button");
19
+ const totalButtons = buttons.length;
20
+ if (totalButtons === 0)
21
+ return;
22
+ if (buttonLimit !== void 0 && buttonLimit > 0) {
23
+ visibleCount.value = Math.min(buttonLimit, totalButtons);
24
+ needCollapse.value = totalButtons > buttonLimit;
25
+ return;
26
+ }
27
+ const availableWidth = toolbarWidth * widthPercentage;
28
+ let count = 0;
29
+ let usedWidth = 0;
30
+ for (let i = 0; i < totalButtons; i++) {
31
+ const button = buttons[i];
32
+ const buttonWidth = button.offsetWidth + buttonGap;
33
+ if (usedWidth + buttonWidth <= availableWidth) {
34
+ usedWidth += buttonWidth;
35
+ count++;
36
+ } else {
37
+ break;
38
+ }
39
+ }
40
+ visibleCount.value = Math.max(count, minVisibleButtons);
41
+ needCollapse.value = count < totalButtons;
42
+ }
43
+ watch(
44
+ [windowWidth, windowHeight, () => {
45
+ var _a;
46
+ return (_a = toolbarRef.value) == null ? void 0 : _a.children.length;
47
+ }],
48
+ () => {
49
+ nextTick(() => {
50
+ calculateVisibleButtons();
51
+ });
52
+ },
53
+ { immediate: true }
54
+ );
55
+ return {
56
+ visibleCount,
57
+ needCollapse,
58
+ windowWidth,
59
+ windowHeight
60
+ };
61
+ }
62
+ export {
63
+ useResponsiveToolbar
64
+ };
@@ -0,0 +1,27 @@
1
+ import { AddInputItem, AddInputProps } from './types';
2
+ type __VLS_Props = AddInputProps;
3
+ type __VLS_PublicProps = {
4
+ modelValue?: AddInputItem[];
5
+ } & __VLS_Props;
6
+ declare const _default: import('vue').DefineComponent<__VLS_PublicProps, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
7
+ "update:modelValue": (value: AddInputItem[]) => any;
8
+ } & {
9
+ "update:modelValue": (value: AddInputItem[]) => any;
10
+ change: (value: AddInputItem[]) => any;
11
+ add: () => any;
12
+ delete: (index: number) => any;
13
+ }, string, import('vue').PublicProps, Readonly<__VLS_PublicProps> & Readonly<{
14
+ "onUpdate:modelValue"?: ((value: AddInputItem[]) => any) | undefined;
15
+ onChange?: ((value: AddInputItem[]) => any) | undefined;
16
+ onAdd?: (() => any) | undefined;
17
+ onDelete?: ((index: number) => any) | undefined;
18
+ }>, {
19
+ modelValue: AddInputItem[];
20
+ disabled: boolean;
21
+ readonly: boolean;
22
+ keyPlaceholder: string;
23
+ valuePlaceholder: string;
24
+ addButtonText: string;
25
+ deleteButtonText: string;
26
+ }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, HTMLDivElement>;
27
+ export default _default;