jky-component-lib 0.0.55 → 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 (93) 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 +5 -5
  9. package/dist/es/code-mirror-editor/CodeMirrorEditor.vue.js +9 -0
  10. package/dist/es/code-mirror-editor/style.css +6 -6
  11. package/dist/es/components.d.ts +3 -0
  12. package/dist/es/components.js +10 -1
  13. package/dist/es/form/Form.vue.d.ts +2 -2
  14. package/dist/es/form/FormItem.vue.js +18 -0
  15. package/dist/es/index.js +6 -0
  16. package/dist/es/node_modules/@element-plus/icons-vue/dist/index.js +32 -0
  17. package/dist/es/node_modules/@tinymce/tinymce-vue/lib/es2015/main/ts/ScriptLoader.js +52 -0
  18. package/dist/es/node_modules/@tinymce/tinymce-vue/lib/es2015/main/ts/TinyMCE.js +10 -0
  19. package/dist/es/node_modules/@tinymce/tinymce-vue/lib/es2015/main/ts/Utils.js +145 -0
  20. package/dist/es/node_modules/@tinymce/tinymce-vue/lib/es2015/main/ts/components/Editor.js +160 -0
  21. package/dist/es/node_modules/@tinymce/tinymce-vue/lib/es2015/main/ts/components/EditorPropTypes.js +26 -0
  22. package/dist/es/node_modules/@tinymce/tinymce-vue/lib/es2015/main/ts/index.js +4 -0
  23. package/dist/es/package.json.js +1 -1
  24. package/dist/es/page-header/PopoverMenu.vue.d.ts +1 -1
  25. package/dist/es/page-table/PageTable.vue.d.ts +6087 -0
  26. package/dist/es/page-table/PageTable.vue.js +378 -0
  27. package/dist/es/page-table/PageTable.vue3.js +5 -0
  28. package/dist/es/page-table/Toolbar.vue.d.ts +32 -0
  29. package/dist/es/page-table/Toolbar.vue.js +271 -0
  30. package/dist/es/page-table/Toolbar.vue3.js +5 -0
  31. package/dist/es/page-table/index.d.ts +4 -0
  32. package/dist/es/page-table/index.js +8 -0
  33. package/dist/es/page-table/style.css +4 -0
  34. package/dist/es/rich-editor/RichEditor.vue.d.ts +78 -0
  35. package/dist/es/rich-editor/RichEditor.vue.js +105 -0
  36. package/dist/es/rich-editor/RichEditor.vue3.js +5 -0
  37. package/dist/es/rich-editor/index.d.ts +4 -0
  38. package/dist/es/rich-editor/index.js +8 -0
  39. package/dist/es/rich-editor/style.css +34 -0
  40. package/dist/es/style.css +28 -0
  41. package/dist/es/styles.css +1 -1
  42. package/dist/es/utils/index.d.ts +1 -0
  43. package/dist/es/utils/responsive-toolbar.d.ts +78 -0
  44. package/dist/es/utils/responsive-toolbar.js +64 -0
  45. package/dist/lib/add-input/AddInput.vue.d.ts +27 -0
  46. package/dist/lib/add-input/AddInput.vue.js +151 -0
  47. package/dist/lib/add-input/AddInput.vue3.js +5 -0
  48. package/dist/lib/add-input/index.d.ts +4 -0
  49. package/dist/lib/add-input/index.js +8 -0
  50. package/dist/lib/add-input/style.css +35 -0
  51. package/dist/lib/button-nav/ButtonNav.vue.d.ts +4 -4
  52. package/dist/lib/code-mirror-editor/CodeMirrorEditor.vue.d.ts +5 -5
  53. package/dist/lib/code-mirror-editor/CodeMirrorEditor.vue.js +9 -0
  54. package/dist/lib/code-mirror-editor/style.css +6 -6
  55. package/dist/lib/components.d.ts +3 -0
  56. package/dist/lib/components.js +30 -21
  57. package/dist/lib/form/Form.vue.d.ts +2 -2
  58. package/dist/lib/form/FormItem.vue.js +24 -6
  59. package/dist/lib/index.js +20 -14
  60. package/dist/lib/node_modules/@element-plus/icons-vue/dist/index.js +32 -0
  61. package/dist/lib/node_modules/@tinymce/tinymce-vue/lib/es2015/main/ts/ScriptLoader.js +52 -0
  62. package/dist/lib/node_modules/@tinymce/tinymce-vue/lib/es2015/main/ts/TinyMCE.js +10 -0
  63. package/dist/lib/node_modules/@tinymce/tinymce-vue/lib/es2015/main/ts/Utils.js +145 -0
  64. package/dist/lib/node_modules/@tinymce/tinymce-vue/lib/es2015/main/ts/components/Editor.js +160 -0
  65. package/dist/lib/node_modules/@tinymce/tinymce-vue/lib/es2015/main/ts/components/EditorPropTypes.js +26 -0
  66. package/dist/lib/node_modules/@tinymce/tinymce-vue/lib/es2015/main/ts/index.js +4 -0
  67. package/dist/lib/package.json.js +1 -1
  68. package/dist/lib/page-header/PopoverMenu.vue.d.ts +1 -1
  69. package/dist/lib/page-table/PageTable.vue.d.ts +6087 -0
  70. package/dist/lib/page-table/PageTable.vue.js +378 -0
  71. package/dist/lib/page-table/PageTable.vue3.js +5 -0
  72. package/dist/lib/page-table/Toolbar.vue.d.ts +32 -0
  73. package/dist/lib/page-table/Toolbar.vue.js +271 -0
  74. package/dist/lib/page-table/Toolbar.vue3.js +5 -0
  75. package/dist/lib/page-table/index.d.ts +4 -0
  76. package/dist/lib/page-table/index.js +8 -0
  77. package/dist/lib/page-table/style.css +4 -0
  78. package/dist/lib/rich-editor/RichEditor.vue.d.ts +78 -0
  79. package/dist/lib/rich-editor/RichEditor.vue.js +105 -0
  80. package/dist/lib/rich-editor/RichEditor.vue3.js +5 -0
  81. package/dist/lib/rich-editor/index.d.ts +4 -0
  82. package/dist/lib/rich-editor/index.js +8 -0
  83. package/dist/lib/rich-editor/style.css +34 -0
  84. package/dist/lib/style.css +28 -0
  85. package/dist/lib/styles.css +1 -1
  86. package/dist/lib/utils/index.d.ts +1 -0
  87. package/dist/lib/utils/responsive-toolbar.d.ts +78 -0
  88. package/dist/lib/utils/responsive-toolbar.js +64 -0
  89. package/package.json +10 -1
  90. package/dist/es/code-mirror-editor/CodeMirrorEditor.test.d.ts +0 -1
  91. package/dist/lib/code-mirror-editor/CodeMirrorEditor.test.d.ts +0 -1
  92. package/dist/umd/index.js +0 -3955
  93. 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
+ "use strict";
2
+ Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
3
+ const withInstall = require("../utils/with-install.js");
4
+ const PageTable_vue_vue_type_script_setup_true_lang = require("./PageTable.vue.js");
5
+ ;/* empty css */
6
+ const JkyPageTable = withInstall.installWithSFC(PageTable_vue_vue_type_script_setup_true_lang.default);
7
+ exports.JkyPageTable = JkyPageTable;
8
+ exports.default = JkyPageTable;
@@ -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
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __defProps = Object.defineProperties;
4
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
5
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
8
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
9
+ var __spreadValues = (a, b) => {
10
+ for (var prop in b || (b = {}))
11
+ if (__hasOwnProp.call(b, prop))
12
+ __defNormalProp(a, prop, b[prop]);
13
+ if (__getOwnPropSymbols)
14
+ for (var prop of __getOwnPropSymbols(b)) {
15
+ if (__propIsEnum.call(b, prop))
16
+ __defNormalProp(a, prop, b[prop]);
17
+ }
18
+ return a;
19
+ };
20
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
21
+ Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
22
+ const vue = require("vue");
23
+ const Editor = require("../node_modules/@tinymce/tinymce-vue/lib/es2015/main/ts/components/Editor.js");
24
+ const _hoisted_1 = { class: "jky-rich-editor" };
25
+ const _sfc_main = /* @__PURE__ */ vue.defineComponent(__spreadProps(__spreadValues({}, {
26
+ name: "JkyRichEditor"
27
+ }), {
28
+ __name: "RichEditor",
29
+ props: /* @__PURE__ */ vue.mergeModels({
30
+ modelValue: { default: "" },
31
+ disabled: { type: Boolean, default: false },
32
+ placeholder: { default: "" },
33
+ height: { default: "400px" },
34
+ language: { default: "zh-CN" },
35
+ 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" },
36
+ 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" },
37
+ menubar: { type: [Boolean, String], default: true },
38
+ branding: { type: Boolean, default: false },
39
+ statusbar: { type: Boolean, default: true },
40
+ readonly: { type: Boolean, default: false },
41
+ apiKey: { default: "0hp1syn1u5hzcdgv20yow1bcp4mvba8xtqi6pcgpnuz61dul" },
42
+ init: { default: () => ({}) }
43
+ }, {
44
+ "modelValue": {
45
+ default: ""
46
+ },
47
+ "modelModifiers": {}
48
+ }),
49
+ emits: /* @__PURE__ */ vue.mergeModels(["update:modelValue", "change", "focus", "blur"], ["update:modelValue"]),
50
+ setup(__props, { expose: __expose, emit: __emit }) {
51
+ const props = __props;
52
+ const emit = __emit;
53
+ const modelValue = vue.useModel(__props, "modelValue");
54
+ const editorRef = vue.ref(null);
55
+ function handleEditorChange(content) {
56
+ modelValue.value = content;
57
+ emit("change", content);
58
+ }
59
+ function handleFocus(event) {
60
+ emit("focus", event);
61
+ }
62
+ function handleBlur(event) {
63
+ emit("blur", event);
64
+ }
65
+ const initConfig = __spreadValues({
66
+ language: props.language,
67
+ height: Number.parseInt(props.height.replace("px", ""), 10),
68
+ placeholder: props.placeholder,
69
+ plugins: props.plugins,
70
+ toolbar: props.toolbar,
71
+ menubar: props.menubar,
72
+ branding: props.branding,
73
+ statusbar: props.statusbar,
74
+ readonly: props.readonly || props.disabled,
75
+ content_style: `
76
+ body {
77
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
78
+ font-size: 14px;
79
+ line-height: 1.6;
80
+ }
81
+ `
82
+ }, props.init);
83
+ __expose({
84
+ editor: editorRef
85
+ });
86
+ return (_ctx, _cache) => {
87
+ return vue.openBlock(), vue.createElementBlock("div", _hoisted_1, [
88
+ vue.createVNode(vue.unref(Editor.Editor), {
89
+ ref_key: "editorRef",
90
+ ref: editorRef,
91
+ modelValue: modelValue.value,
92
+ "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => modelValue.value = $event),
93
+ "api-key": __props.apiKey,
94
+ init: initConfig,
95
+ disabled: __props.disabled,
96
+ readonly: __props.readonly,
97
+ onOnChange: handleEditorChange,
98
+ onOnFocus: handleFocus,
99
+ onOnBlur: handleBlur
100
+ }, null, 8, ["modelValue", "api-key", "disabled", "readonly"])
101
+ ]);
102
+ };
103
+ }
104
+ }));
105
+ exports.default = _sfc_main;
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
3
+ const RichEditor_vue_vue_type_script_setup_true_lang = require("./RichEditor.vue.js");
4
+ ;/* empty css */
5
+ exports.default = RichEditor_vue_vue_type_script_setup_true_lang.default;
@@ -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
+ "use strict";
2
+ Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
3
+ const RichEditor_vue_vue_type_script_setup_true_lang = require("./RichEditor.vue.js");
4
+ ;/* empty css */
5
+ const withInstall = require("../utils/with-install.js");
6
+ const JkyRichEditor = withInstall.installWithSFC(RichEditor_vue_vue_type_script_setup_true_lang.default);
7
+ exports.JkyRichEditor = JkyRichEditor;
8
+ exports.default = JkyRichEditor;
@@ -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
+ }
@@ -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:1px solid var(--j-code-mirror-border-color);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:#f5f7fa;border-right:1px solid #e4e7ed;color:#909399}html.dark .j-code-mirror-editor{border-color:#4c4d4f}html.dark .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
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const core = require("@vueuse/core");
4
+ const vue = require("vue");
5
+ function useResponsiveToolbar(options) {
6
+ const {
7
+ toolbarRef,
8
+ buttonLimit,
9
+ buttonGap = 8,
10
+ minVisibleButtons = 1,
11
+ widthPercentage = 0.5
12
+ } = options;
13
+ const { width: windowWidth, height: windowHeight } = core.useWindowSize();
14
+ const visibleCount = vue.ref(buttonLimit || minVisibleButtons);
15
+ const needCollapse = vue.ref(false);
16
+ function calculateVisibleButtons() {
17
+ if (!toolbarRef.value)
18
+ return;
19
+ const toolbarWidth = toolbarRef.value.clientWidth;
20
+ const buttons = toolbarRef.value.querySelectorAll(".el-button");
21
+ const totalButtons = buttons.length;
22
+ if (totalButtons === 0)
23
+ return;
24
+ if (buttonLimit !== void 0 && buttonLimit > 0) {
25
+ visibleCount.value = Math.min(buttonLimit, totalButtons);
26
+ needCollapse.value = totalButtons > buttonLimit;
27
+ return;
28
+ }
29
+ const availableWidth = toolbarWidth * widthPercentage;
30
+ let count = 0;
31
+ let usedWidth = 0;
32
+ for (let i = 0; i < totalButtons; i++) {
33
+ const button = buttons[i];
34
+ const buttonWidth = button.offsetWidth + buttonGap;
35
+ if (usedWidth + buttonWidth <= availableWidth) {
36
+ usedWidth += buttonWidth;
37
+ count++;
38
+ } else {
39
+ break;
40
+ }
41
+ }
42
+ visibleCount.value = Math.max(count, minVisibleButtons);
43
+ needCollapse.value = count < totalButtons;
44
+ }
45
+ vue.watch(
46
+ [windowWidth, windowHeight, () => {
47
+ var _a;
48
+ return (_a = toolbarRef.value) == null ? void 0 : _a.children.length;
49
+ }],
50
+ () => {
51
+ vue.nextTick(() => {
52
+ calculateVisibleButtons();
53
+ });
54
+ },
55
+ { immediate: true }
56
+ );
57
+ return {
58
+ visibleCount,
59
+ needCollapse,
60
+ windowWidth,
61
+ windowHeight
62
+ };
63
+ }
64
+ exports.useResponsiveToolbar = useResponsiveToolbar;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "jky-component-lib",
3
3
  "type": "module",
4
- "version": "0.0.55",
4
+ "version": "0.0.60",
5
5
  "publishConfig": {
6
6
  "access": "public"
7
7
  },
@@ -68,9 +68,14 @@
68
68
  },
69
69
  "peerDependencies": {
70
70
  "@codemirror/lang-css": "^6.0.0",
71
+ "@codemirror/lang-html": "^6.0.0",
71
72
  "@codemirror/lang-javascript": "^6.0.0",
72
73
  "@codemirror/lang-json": "^6.0.0",
74
+ "@codemirror/lang-markdown": "^6.0.0",
75
+ "@codemirror/lang-vue": "^0.1.0",
73
76
  "@codemirror/theme-one-dark": "^6.0.0",
77
+ "@tinymce/tinymce-vue": "^6.0.0",
78
+ "@vueuse/core": "^14.2.1",
74
79
  "codemirror": "^6.0.0",
75
80
  "element-plus": "^2.0.0",
76
81
  "vue": "^3.2.0"
@@ -78,13 +83,17 @@
78
83
  "devDependencies": {
79
84
  "@antfu/eslint-config": "^4.13.0",
80
85
  "@codemirror/lang-css": "^6.3.1",
86
+ "@codemirror/lang-html": "^6.4.11",
81
87
  "@codemirror/lang-javascript": "^6.2.5",
82
88
  "@codemirror/lang-json": "^6.0.2",
89
+ "@codemirror/lang-markdown": "^6.5.0",
90
+ "@codemirror/lang-vue": "^0.1.3",
83
91
  "@codemirror/theme-one-dark": "^6.1.3",
84
92
  "@iconify/json": "^2.2.454",
85
93
  "@iconify/tailwind4": "^1.2.3",
86
94
  "@tailwindcss/postcss": "^4.2.2",
87
95
  "@tailwindcss/vite": "^4.2.2",
96
+ "@tinymce/tinymce-vue": "^6.3.0",
88
97
  "@types/jsdom": "^21.1.7",
89
98
  "@types/markdown-it": "^14.1.2",
90
99
  "@types/node": "^22.15.14",
@@ -1 +0,0 @@
1
- export {};