layplux 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 (201) hide show
  1. package/dist/cjs/components/center-view/index.cjs +41 -0
  2. package/dist/cjs/components/corner-glow/index.cjs +31 -0
  3. package/dist/cjs/components/dropdown/index.cjs +162 -0
  4. package/dist/cjs/components/icon/index.cjs +59 -0
  5. package/dist/cjs/components/index.cjs +25 -0
  6. package/dist/cjs/components/panel-view/index.cjs +166 -0
  7. package/dist/cjs/components/popup/index.cjs +280 -0
  8. package/dist/cjs/components/title/index.cjs +76 -0
  9. package/dist/cjs/components/tooltip/index.cjs +68 -0
  10. package/dist/cjs/components/widget/index.cjs +104 -0
  11. package/dist/cjs/index.cjs +40 -0
  12. package/dist/cjs/layout/glass-overlay.cjs +31 -0
  13. package/dist/cjs/layout/layered-manager.cjs +35 -0
  14. package/dist/cjs/layout/layplux.cjs +41 -0
  15. package/dist/cjs/layout/root-pane.cjs +46 -0
  16. package/dist/cjs/layout/skeleton/bottom-area.cjs +64 -0
  17. package/dist/cjs/layout/skeleton/bottom-left-area.cjs +42 -0
  18. package/dist/cjs/layout/skeleton/bottom-right-area.cjs +38 -0
  19. package/dist/cjs/layout/skeleton/center-area.cjs +467 -0
  20. package/dist/cjs/layout/skeleton/index.cjs +24 -0
  21. package/dist/cjs/layout/skeleton/left-bottom-area.cjs +42 -0
  22. package/dist/cjs/layout/skeleton/left-top-area.cjs +42 -0
  23. package/dist/cjs/layout/skeleton/right-bottom-area.cjs +38 -0
  24. package/dist/cjs/layout/skeleton/right-top-area.cjs +38 -0
  25. package/dist/cjs/layout/skeleton/skeleton.cjs +66 -0
  26. package/dist/cjs/layout/skeleton/top-area.cjs +64 -0
  27. package/dist/cjs/locales/en-US.cjs +34 -0
  28. package/dist/cjs/locales/index.cjs +39 -0
  29. package/dist/cjs/locales/zh-CN.cjs +34 -0
  30. package/dist/cjs/managers/area.cjs +32 -0
  31. package/dist/cjs/managers/index.cjs +20 -0
  32. package/dist/cjs/managers/pane.cjs +34 -0
  33. package/dist/cjs/managers/skeleton.cjs +208 -0
  34. package/dist/cjs/managers/theme.cjs +37 -0
  35. package/dist/cjs/managers/widget-container.cjs +96 -0
  36. package/dist/cjs/managers/widget.cjs +103 -0
  37. package/dist/cjs/types/config.cjs +16 -0
  38. package/dist/cjs/types/index.cjs +18 -0
  39. package/dist/cjs/types/locale.cjs +16 -0
  40. package/dist/cjs/utils/event-bus.cjs +154 -0
  41. package/dist/cjs/utils/focus-tracker.cjs +154 -0
  42. package/dist/cjs/utils/index.cjs +31 -0
  43. package/dist/cjs/utils/unique-id.cjs +27 -0
  44. package/dist/cjs/utils/vue.cjs +37 -0
  45. package/dist/esm/components/center-view/index.mjs +21 -0
  46. package/dist/esm/components/corner-glow/index.mjs +11 -0
  47. package/dist/esm/components/dropdown/index.mjs +146 -0
  48. package/dist/esm/components/icon/index.mjs +39 -0
  49. package/dist/esm/components/index.mjs +8 -0
  50. package/dist/esm/components/panel-view/index.mjs +152 -0
  51. package/dist/esm/components/popup/index.mjs +268 -0
  52. package/dist/esm/components/title/index.mjs +56 -0
  53. package/dist/esm/components/tooltip/index.mjs +48 -0
  54. package/dist/esm/components/widget/index.mjs +84 -0
  55. package/dist/esm/index.mjs +10 -0
  56. package/dist/esm/layout/glass-overlay.mjs +11 -0
  57. package/dist/esm/layout/layered-manager.mjs +15 -0
  58. package/dist/esm/layout/layplux.mjs +21 -0
  59. package/dist/esm/layout/root-pane.mjs +26 -0
  60. package/dist/esm/layout/skeleton/bottom-area.mjs +44 -0
  61. package/dist/esm/layout/skeleton/bottom-left-area.mjs +22 -0
  62. package/dist/esm/layout/skeleton/bottom-right-area.mjs +18 -0
  63. package/dist/esm/layout/skeleton/center-area.mjs +454 -0
  64. package/dist/esm/layout/skeleton/index.mjs +4 -0
  65. package/dist/esm/layout/skeleton/left-bottom-area.mjs +22 -0
  66. package/dist/esm/layout/skeleton/left-top-area.mjs +22 -0
  67. package/dist/esm/layout/skeleton/right-bottom-area.mjs +18 -0
  68. package/dist/esm/layout/skeleton/right-top-area.mjs +18 -0
  69. package/dist/esm/layout/skeleton/skeleton.mjs +46 -0
  70. package/dist/esm/layout/skeleton/top-area.mjs +44 -0
  71. package/dist/esm/locales/en-US.mjs +14 -0
  72. package/dist/esm/locales/index.mjs +19 -0
  73. package/dist/esm/locales/zh-CN.mjs +14 -0
  74. package/dist/esm/managers/area.mjs +12 -0
  75. package/dist/esm/managers/index.mjs +3 -0
  76. package/dist/esm/managers/pane.mjs +14 -0
  77. package/dist/esm/managers/skeleton.mjs +192 -0
  78. package/dist/esm/managers/theme.mjs +17 -0
  79. package/dist/esm/managers/widget-container.mjs +76 -0
  80. package/dist/esm/managers/widget.mjs +83 -0
  81. package/dist/esm/types/config.mjs +0 -0
  82. package/dist/esm/types/index.mjs +1 -0
  83. package/dist/esm/types/locale.mjs +0 -0
  84. package/dist/esm/utils/event-bus.mjs +124 -0
  85. package/dist/esm/utils/focus-tracker.mjs +135 -0
  86. package/dist/esm/utils/index.mjs +10 -0
  87. package/dist/esm/utils/unique-id.mjs +7 -0
  88. package/dist/esm/utils/vue.mjs +17 -0
  89. package/dist/style/base/_tokens-dark.scss +51 -0
  90. package/dist/style/base/_tokens.scss +56 -0
  91. package/dist/style/components/_bottom-area.scss +30 -0
  92. package/dist/style/components/_bottom-left-area.scss +8 -0
  93. package/dist/style/components/_bottom-right-area.scss +8 -0
  94. package/dist/style/components/_center-area.scss +162 -0
  95. package/dist/style/components/_corner-glow.scss +17 -0
  96. package/dist/style/components/_dropdown.scss +91 -0
  97. package/dist/style/components/_glass-pane.scss +6 -0
  98. package/dist/style/components/_layered-manager.scss +6 -0
  99. package/dist/style/components/_left-bottom-area.scss +8 -0
  100. package/dist/style/components/_left-top-area.scss +9 -0
  101. package/dist/style/components/_pane-view.scss +79 -0
  102. package/dist/style/components/_popup.scss +19 -0
  103. package/dist/style/components/_right-bottom-area.scss +8 -0
  104. package/dist/style/components/_right-top-area.scss +8 -0
  105. package/dist/style/components/_root-pane.scss +17 -0
  106. package/dist/style/components/_skeleton.scss +38 -0
  107. package/dist/style/components/_title-view.scss +176 -0
  108. package/dist/style/components/_tooltip.scss +65 -0
  109. package/dist/style/components/_top-area.scss +25 -0
  110. package/dist/style/index.css +768 -0
  111. package/dist/style/layplux.scss +21 -0
  112. package/dist/types/components/center-view/index.d.ts +16 -0
  113. package/dist/types/components/center-view/index.d.ts.map +1 -0
  114. package/dist/types/components/corner-glow/index.d.ts +2 -0
  115. package/dist/types/components/corner-glow/index.d.ts.map +1 -0
  116. package/dist/types/components/dropdown/index.d.ts +116 -0
  117. package/dist/types/components/dropdown/index.d.ts.map +1 -0
  118. package/dist/types/components/icon/index.d.ts +22 -0
  119. package/dist/types/components/icon/index.d.ts.map +1 -0
  120. package/dist/types/components/index.d.ts +9 -0
  121. package/dist/types/components/index.d.ts.map +1 -0
  122. package/dist/types/components/panel-view/index.d.ts +22 -0
  123. package/dist/types/components/panel-view/index.d.ts.map +1 -0
  124. package/dist/types/components/popup/index.d.ts +99 -0
  125. package/dist/types/components/popup/index.d.ts.map +1 -0
  126. package/dist/types/components/title/index.d.ts +57 -0
  127. package/dist/types/components/title/index.d.ts.map +1 -0
  128. package/dist/types/components/tooltip/index.d.ts +69 -0
  129. package/dist/types/components/tooltip/index.d.ts.map +1 -0
  130. package/dist/types/components/widget/index.d.ts +15 -0
  131. package/dist/types/components/widget/index.d.ts.map +1 -0
  132. package/dist/types/index.d.ts +10 -0
  133. package/dist/types/index.d.ts.map +1 -0
  134. package/dist/types/layout/glass-overlay.d.ts +2 -0
  135. package/dist/types/layout/glass-overlay.d.ts.map +1 -0
  136. package/dist/types/layout/layered-manager.d.ts +8 -0
  137. package/dist/types/layout/layered-manager.d.ts.map +1 -0
  138. package/dist/types/layout/layplux.d.ts +25 -0
  139. package/dist/types/layout/layplux.d.ts.map +1 -0
  140. package/dist/types/layout/root-pane.d.ts +8 -0
  141. package/dist/types/layout/root-pane.d.ts.map +1 -0
  142. package/dist/types/layout/skeleton/bottom-area.d.ts +9 -0
  143. package/dist/types/layout/skeleton/bottom-area.d.ts.map +1 -0
  144. package/dist/types/layout/skeleton/bottom-left-area.d.ts +9 -0
  145. package/dist/types/layout/skeleton/bottom-left-area.d.ts.map +1 -0
  146. package/dist/types/layout/skeleton/bottom-right-area.d.ts +9 -0
  147. package/dist/types/layout/skeleton/bottom-right-area.d.ts.map +1 -0
  148. package/dist/types/layout/skeleton/center-area.d.ts +11 -0
  149. package/dist/types/layout/skeleton/center-area.d.ts.map +1 -0
  150. package/dist/types/layout/skeleton/index.d.ts +2 -0
  151. package/dist/types/layout/skeleton/index.d.ts.map +1 -0
  152. package/dist/types/layout/skeleton/left-bottom-area.d.ts +9 -0
  153. package/dist/types/layout/skeleton/left-bottom-area.d.ts.map +1 -0
  154. package/dist/types/layout/skeleton/left-top-area.d.ts +9 -0
  155. package/dist/types/layout/skeleton/left-top-area.d.ts.map +1 -0
  156. package/dist/types/layout/skeleton/right-bottom-area.d.ts +9 -0
  157. package/dist/types/layout/skeleton/right-bottom-area.d.ts.map +1 -0
  158. package/dist/types/layout/skeleton/right-top-area.d.ts +9 -0
  159. package/dist/types/layout/skeleton/right-top-area.d.ts.map +1 -0
  160. package/dist/types/layout/skeleton/skeleton.d.ts +8 -0
  161. package/dist/types/layout/skeleton/skeleton.d.ts.map +1 -0
  162. package/dist/types/layout/skeleton/top-area.d.ts +9 -0
  163. package/dist/types/layout/skeleton/top-area.d.ts.map +1 -0
  164. package/dist/types/locales/en-US.d.ts +3 -0
  165. package/dist/types/locales/en-US.d.ts.map +1 -0
  166. package/dist/types/locales/index.d.ts +7 -0
  167. package/dist/types/locales/index.d.ts.map +1 -0
  168. package/dist/types/locales/zh-CN.d.ts +3 -0
  169. package/dist/types/locales/zh-CN.d.ts.map +1 -0
  170. package/dist/types/managers/area.d.ts +10 -0
  171. package/dist/types/managers/area.d.ts.map +1 -0
  172. package/dist/types/managers/index.d.ts +5 -0
  173. package/dist/types/managers/index.d.ts.map +1 -0
  174. package/dist/types/managers/pane.d.ts +8 -0
  175. package/dist/types/managers/pane.d.ts.map +1 -0
  176. package/dist/types/managers/skeleton.d.ts +38 -0
  177. package/dist/types/managers/skeleton.d.ts.map +1 -0
  178. package/dist/types/managers/theme.d.ts +2 -0
  179. package/dist/types/managers/theme.d.ts.map +1 -0
  180. package/dist/types/managers/widget-container.d.ts +21 -0
  181. package/dist/types/managers/widget-container.d.ts.map +1 -0
  182. package/dist/types/managers/widget.d.ts +26 -0
  183. package/dist/types/managers/widget.d.ts.map +1 -0
  184. package/dist/types/types/config.d.ts +54 -0
  185. package/dist/types/types/config.d.ts.map +1 -0
  186. package/dist/types/types/index.d.ts +2 -0
  187. package/dist/types/types/index.d.ts.map +1 -0
  188. package/dist/types/types/locale.d.ts +12 -0
  189. package/dist/types/types/locale.d.ts.map +1 -0
  190. package/dist/types/utils/event-bus.d.ts +18 -0
  191. package/dist/types/utils/event-bus.d.ts.map +1 -0
  192. package/dist/types/utils/focus-tracker.d.ts +37 -0
  193. package/dist/types/utils/focus-tracker.d.ts.map +1 -0
  194. package/dist/types/utils/index.d.ts +6 -0
  195. package/dist/types/utils/index.d.ts.map +1 -0
  196. package/dist/types/utils/unique-id.d.ts +2 -0
  197. package/dist/types/utils/unique-id.d.ts.map +1 -0
  198. package/dist/types/utils/vue.d.ts +5 -0
  199. package/dist/types/utils/vue.d.ts.map +1 -0
  200. package/dist/umd/index.js +4000 -0
  201. package/package.json +46 -0
@@ -0,0 +1,268 @@
1
+ import { Fragment, jsx, jsxs } from "vue/jsx-runtime";
2
+ import {
3
+ defineComponent,
4
+ ref,
5
+ watch,
6
+ nextTick,
7
+ onMounted,
8
+ onUnmounted,
9
+ Teleport
10
+ } from "vue";
11
+ function computePosition(triggerRect, popupW, popupH, placement, offsetX, offsetY) {
12
+ const vw = window.innerWidth;
13
+ const vh = window.innerHeight;
14
+ const PADDING = 8;
15
+ let top = 0;
16
+ let left = 0;
17
+ const [main, align] = placement.split("-");
18
+ if (main === "bottom") {
19
+ top = triggerRect.bottom + offsetY;
20
+ if (align === "start") left = triggerRect.left + offsetX;
21
+ else if (align === "end") left = triggerRect.right - popupW + offsetX;
22
+ else left = triggerRect.left + triggerRect.width / 2 - popupW / 2 + offsetX;
23
+ if (top + popupH > vh - PADDING) {
24
+ top = triggerRect.top - popupH - offsetY;
25
+ placement = align ? `top-${align}` : "top";
26
+ }
27
+ } else if (main === "top") {
28
+ top = triggerRect.top - popupH - offsetY;
29
+ if (align === "start") left = triggerRect.left + offsetX;
30
+ else if (align === "end") left = triggerRect.right - popupW + offsetX;
31
+ else left = triggerRect.left + triggerRect.width / 2 - popupW / 2 + offsetX;
32
+ if (top < PADDING) {
33
+ top = triggerRect.bottom + offsetY;
34
+ placement = align ? `bottom-${align}` : "bottom";
35
+ }
36
+ } else if (main === "right") {
37
+ left = triggerRect.right + offsetX;
38
+ if (align === "start") top = triggerRect.top + offsetY;
39
+ else if (align === "end") top = triggerRect.bottom - popupH + offsetY;
40
+ else top = triggerRect.top + triggerRect.height / 2 - popupH / 2 + offsetY;
41
+ if (left + popupW > vw - PADDING) {
42
+ left = triggerRect.left - popupW - offsetX;
43
+ placement = align ? `left-${align}` : "left";
44
+ }
45
+ } else if (main === "left") {
46
+ left = triggerRect.left - popupW - offsetX;
47
+ if (align === "start") top = triggerRect.top + offsetY;
48
+ else if (align === "end") top = triggerRect.bottom - popupH + offsetY;
49
+ else top = triggerRect.top + triggerRect.height / 2 - popupH / 2 + offsetY;
50
+ if (left < PADDING) {
51
+ left = triggerRect.right + offsetX;
52
+ placement = align ? `right-${align}` : "right";
53
+ }
54
+ }
55
+ top = Math.max(PADDING, Math.min(top, vh - popupH - PADDING));
56
+ left = Math.max(PADDING, Math.min(left, vw - popupW - PADDING));
57
+ return { position: { top, left }, placement };
58
+ }
59
+ const Popup = defineComponent({
60
+ name: "LaypluxPopup",
61
+ props: {
62
+ visible: Boolean,
63
+ trigger: { type: String, default: "hover" },
64
+ placement: { type: String, default: "bottom" },
65
+ offset: { type: Object, default: () => ({ y: 4 }) },
66
+ mouseEnterDelay: { type: Number, default: 100 },
67
+ mouseLeaveDelay: { type: Number, default: 100 },
68
+ disabled: { type: Boolean, default: false },
69
+ destroyOnClose: { type: Boolean, default: true },
70
+ getContainer: { type: Function, default: () => document.body }
71
+ },
72
+ emits: ["update:visible"],
73
+ setup(props, { emit, slots }) {
74
+ const triggerRef = ref();
75
+ const popupRef = ref();
76
+ const position = ref({ top: 0, left: 0 });
77
+ const currentPlacement = ref(props.placement);
78
+ const mounted = ref(false);
79
+ const animatingIn = ref(false);
80
+ let enterTimer = null;
81
+ let leaveTimer = null;
82
+ let leaveAnimationTimer = null;
83
+ const clearTimers = () => {
84
+ if (enterTimer) {
85
+ clearTimeout(enterTimer);
86
+ enterTimer = null;
87
+ }
88
+ if (leaveTimer) {
89
+ clearTimeout(leaveTimer);
90
+ leaveTimer = null;
91
+ }
92
+ if (leaveAnimationTimer) {
93
+ clearTimeout(leaveAnimationTimer);
94
+ leaveAnimationTimer = null;
95
+ }
96
+ };
97
+ const updatePosition = () => {
98
+ if (!triggerRef.value || !popupRef.value) return;
99
+ const triggerRect = triggerRef.value.getBoundingClientRect();
100
+ const popupRect = popupRef.value.getBoundingClientRect();
101
+ const { x: ox = 0, y: oy = 0 } = props.offset;
102
+ const result = computePosition(
103
+ triggerRect,
104
+ popupRect.width,
105
+ popupRect.height,
106
+ props.placement,
107
+ ox,
108
+ oy
109
+ );
110
+ position.value = result.position;
111
+ currentPlacement.value = result.placement;
112
+ };
113
+ const show = () => {
114
+ if (props.disabled) return;
115
+ clearTimers();
116
+ enterTimer = setTimeout(() => {
117
+ mounted.value = true;
118
+ emit("update:visible", true);
119
+ void nextTick(() => {
120
+ updatePosition();
121
+ requestAnimationFrame(() => {
122
+ animatingIn.value = true;
123
+ });
124
+ });
125
+ }, props.mouseEnterDelay);
126
+ };
127
+ const hide = (immediate = false) => {
128
+ clearTimers();
129
+ const delay = immediate ? 0 : props.mouseLeaveDelay;
130
+ leaveTimer = setTimeout(() => {
131
+ animatingIn.value = false;
132
+ leaveAnimationTimer = setTimeout(() => {
133
+ mounted.value = false;
134
+ emit("update:visible", false);
135
+ }, 200);
136
+ }, delay);
137
+ };
138
+ const toggle = () => {
139
+ if (mounted.value && animatingIn.value) {
140
+ hide(true);
141
+ } else {
142
+ clearTimers();
143
+ show();
144
+ }
145
+ };
146
+ watch(
147
+ () => props.visible,
148
+ (v) => {
149
+ if (v && !mounted.value) show();
150
+ else if (!v && mounted.value) hide(true);
151
+ }
152
+ );
153
+ watch(
154
+ () => props.placement,
155
+ (p) => {
156
+ currentPlacement.value = p;
157
+ }
158
+ );
159
+ const onResize = () => {
160
+ if (mounted.value && animatingIn.value) updatePosition();
161
+ };
162
+ onMounted(() => {
163
+ window.addEventListener("resize", onResize);
164
+ window.addEventListener("scroll", onResize, true);
165
+ document.addEventListener("mousedown", onClickOutside, true);
166
+ document.addEventListener("keydown", onEsc);
167
+ });
168
+ onUnmounted(() => {
169
+ clearTimers();
170
+ window.removeEventListener("resize", onResize);
171
+ window.removeEventListener("scroll", onResize, true);
172
+ document.removeEventListener("mousedown", onClickOutside, true);
173
+ document.removeEventListener("keydown", onEsc);
174
+ });
175
+ const onClickOutside = (e) => {
176
+ if (!mounted.value) return;
177
+ const target = e.target;
178
+ const trigger = triggerRef.value;
179
+ const popup = popupRef.value;
180
+ if (trigger && trigger.contains(target)) return;
181
+ if (popup && popup.contains(target)) return;
182
+ if (props.trigger === "click" || props.trigger === "contextmenu") {
183
+ hide(true);
184
+ }
185
+ };
186
+ const onEsc = (e) => {
187
+ if (e.key === "Escape" && mounted.value) {
188
+ hide(true);
189
+ }
190
+ };
191
+ const onTriggerMouseEnter = () => {
192
+ if (props.trigger === "hover") show();
193
+ };
194
+ const onTriggerMouseLeave = () => {
195
+ if (props.trigger === "hover") hide();
196
+ };
197
+ const onTriggerClick = (e) => {
198
+ if (props.trigger === "click") {
199
+ e.stopPropagation();
200
+ toggle();
201
+ }
202
+ };
203
+ const onTriggerFocus = () => {
204
+ if (props.trigger === "focus") show();
205
+ };
206
+ const onTriggerBlur = () => {
207
+ if (props.trigger === "focus") hide(true);
208
+ };
209
+ const onTriggerContextmenu = (e) => {
210
+ if (props.trigger === "contextmenu") {
211
+ e.preventDefault();
212
+ show();
213
+ }
214
+ };
215
+ const onPopupMouseEnter = () => {
216
+ if (leaveTimer) {
217
+ clearTimeout(leaveTimer);
218
+ leaveTimer = null;
219
+ }
220
+ };
221
+ const onPopupMouseLeave = () => {
222
+ if (props.trigger === "hover") hide();
223
+ };
224
+ return () => {
225
+ const container = props.getContainer();
226
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
227
+ /* @__PURE__ */ jsx(
228
+ "span",
229
+ {
230
+ ref: triggerRef,
231
+ class: "layplux-popup-trigger",
232
+ onMouseenter: onTriggerMouseEnter,
233
+ onMouseleave: onTriggerMouseLeave,
234
+ onClick: onTriggerClick,
235
+ onFocus: onTriggerFocus,
236
+ onBlur: onTriggerBlur,
237
+ onContextmenu: onTriggerContextmenu,
238
+ children: slots.default?.()
239
+ }
240
+ ),
241
+ (mounted.value || !props.destroyOnClose) && /* @__PURE__ */ jsx(Teleport, { to: container, children: /* @__PURE__ */ jsx(
242
+ "div",
243
+ {
244
+ ref: popupRef,
245
+ class: [
246
+ "layplux-portal",
247
+ "layplux-popup",
248
+ currentPlacement.value,
249
+ animatingIn.value && "layplux-popup--visible"
250
+ ],
251
+ style: {
252
+ position: "fixed",
253
+ top: `${position.value.top}px`,
254
+ left: `${position.value.left}px`,
255
+ zIndex: "var(--layplux-popup-z-index, 2000)"
256
+ },
257
+ onMouseenter: onPopupMouseEnter,
258
+ onMouseleave: onPopupMouseLeave,
259
+ children: slots.content?.()
260
+ }
261
+ ) })
262
+ ] });
263
+ };
264
+ }
265
+ });
266
+ export {
267
+ Popup
268
+ };
@@ -0,0 +1,56 @@
1
+ import { jsx, jsxs } from "vue/jsx-runtime";
2
+ import { defineComponent } from "vue";
3
+ import { createContent } from "../../utils";
4
+ const TitleView = defineComponent({
5
+ name: "TitleView",
6
+ inheritAttrs: false,
7
+ props: {
8
+ icon: [String, Object, Function],
9
+ title: [String, Object, Function],
10
+ mode: {
11
+ type: String,
12
+ default: "icon-only"
13
+ },
14
+ /** 交互状态:idle / active / disabled / error。idle 时 hover 由 CSS :hover 处理 */
15
+ state: {
16
+ type: String,
17
+ default: "idle"
18
+ },
19
+ /** 聚焦/选中态,独立于 state,可与任何状态叠加 */
20
+ focused: {
21
+ type: Boolean,
22
+ default: false
23
+ },
24
+ size: {
25
+ type: String,
26
+ default: "middle"
27
+ },
28
+ className: {
29
+ type: String,
30
+ default: ""
31
+ },
32
+ onClick: Function
33
+ },
34
+ setup(props) {
35
+ return () => {
36
+ const { icon, title, mode, state, size, focused, className, onClick } = props;
37
+ const iconNode = icon ? createContent(icon) : null;
38
+ const titleNode = title ? createContent(title) : null;
39
+ const classes = [
40
+ "title-view",
41
+ `title-view--${mode}`,
42
+ `title-view--${state}`,
43
+ `title-view--${size}`,
44
+ focused && "title-view--focused",
45
+ className
46
+ ].filter(Boolean).join(" ");
47
+ return /* @__PURE__ */ jsxs("span", { class: classes, onClick, children: [
48
+ /* @__PURE__ */ jsx("span", { class: "title-view__icon", children: iconNode }),
49
+ /* @__PURE__ */ jsx("span", { class: "title-view__label", children: titleNode })
50
+ ] });
51
+ };
52
+ }
53
+ });
54
+ export {
55
+ TitleView
56
+ };
@@ -0,0 +1,48 @@
1
+ import { jsx, jsxs } from "vue/jsx-runtime";
2
+ import { defineComponent } from "vue";
3
+ import { createContent } from "../../utils";
4
+ import { Popup } from "../popup";
5
+ const Tooltip = defineComponent({
6
+ name: "LaypluxTooltip",
7
+ props: {
8
+ title: [String, Object, Function],
9
+ trigger: { type: String, default: "hover" },
10
+ placement: { type: String, default: "top" },
11
+ mouseEnterDelay: { type: Number, default: 100 },
12
+ mouseLeaveDelay: { type: Number, default: 100 },
13
+ visible: Boolean,
14
+ disabled: { type: Boolean, default: false },
15
+ getContainer: { type: Function, default: () => document.body }
16
+ },
17
+ emits: ["update:visible"],
18
+ setup(props, { emit, slots }) {
19
+ return () => /* @__PURE__ */ jsx(
20
+ Popup,
21
+ {
22
+ visible: props.visible,
23
+ trigger: props.trigger,
24
+ placement: props.placement,
25
+ disabled: props.disabled,
26
+ mouseEnterDelay: props.mouseEnterDelay,
27
+ mouseLeaveDelay: props.mouseLeaveDelay,
28
+ destroyOnClose: true,
29
+ getContainer: props.getContainer,
30
+ "onUpdate:visible": (v) => emit("update:visible", v),
31
+ children: {
32
+ default: () => slots.default?.(),
33
+ content: () => {
34
+ const hasContent = slots.content;
35
+ const titleNode = hasContent ? slots.content?.() : createContent(props.title);
36
+ return /* @__PURE__ */ jsxs("div", { class: "layplux-tooltip", children: [
37
+ /* @__PURE__ */ jsx("div", { class: "layplux-tooltip__arrow" }),
38
+ /* @__PURE__ */ jsx("div", { class: "layplux-tooltip__inner", children: titleNode })
39
+ ] });
40
+ }
41
+ }
42
+ }
43
+ );
44
+ }
45
+ });
46
+ export {
47
+ Tooltip
48
+ };
@@ -0,0 +1,84 @@
1
+ import { jsx, jsxs } from "vue/jsx-runtime";
2
+ import { defineComponent, Fragment, ref, onErrorCaptured, h } from "vue";
3
+ import { TitleView } from "../title";
4
+ import { Tooltip } from "../tooltip";
5
+ const WidgetView = defineComponent({
6
+ name: "WidgetView",
7
+ inheritAttrs: false,
8
+ props: {
9
+ widget: Object
10
+ },
11
+ setup(props) {
12
+ const hasError = ref(false);
13
+ const errorMessage = ref("");
14
+ onErrorCaptured((err) => {
15
+ hasError.value = true;
16
+ errorMessage.value = err.message;
17
+ console.error(`[Layplux] Widget "${props.widget?.name}" crashed:`, err);
18
+ return false;
19
+ });
20
+ return () => {
21
+ const { widget } = props;
22
+ if (hasError.value) {
23
+ const fallback = widget?.config.props?.errorFallback;
24
+ if (fallback) {
25
+ return h(fallback, { error: errorMessage.value, widget });
26
+ }
27
+ return /* @__PURE__ */ jsxs("div", { class: "layplux-widget-error", children: [
28
+ /* @__PURE__ */ jsxs("span", { children: [
29
+ '\u7EC4\u4EF6 "',
30
+ widget?.name,
31
+ '" \u53D1\u751F\u9519\u8BEF'
32
+ ] }),
33
+ /* @__PURE__ */ jsx("pre", { children: errorMessage.value })
34
+ ] });
35
+ }
36
+ return /* @__PURE__ */ jsx(Fragment, { children: widget?.renderBody() });
37
+ };
38
+ }
39
+ });
40
+ const WidgetTitleView = defineComponent({
41
+ name: "WidgetTitleView",
42
+ inheritAttrs: false,
43
+ props: {
44
+ widget: Object
45
+ },
46
+ setup(props) {
47
+ const tooltipVisible = ref(false);
48
+ const handleClick = () => {
49
+ tooltipVisible.value = false;
50
+ props.widget?.container?.toggleActive(props.widget?.name);
51
+ };
52
+ return () => {
53
+ const { widget } = props;
54
+ const tooltipTitle = widget?.config.props?.title ?? widget?.name ?? "";
55
+ return /* @__PURE__ */ jsx("div", { class: "widget-title-view", children: /* @__PURE__ */ jsx(
56
+ Tooltip,
57
+ {
58
+ visible: tooltipVisible.value,
59
+ "onUpdate:visible": (v) => {
60
+ tooltipVisible.value = v;
61
+ },
62
+ title: tooltipTitle,
63
+ placement: "right",
64
+ mouseEnterDelay: 500,
65
+ getContainer: () => document.querySelector(".layplux-root") || document.body,
66
+ children: /* @__PURE__ */ jsx(
67
+ TitleView,
68
+ {
69
+ onClick: handleClick,
70
+ focused: widget?.focused.value,
71
+ state: widget?.active.value ? "active" : "idle",
72
+ icon: widget?.config.props?.icon,
73
+ title: widget?.config.props?.title
74
+ }
75
+ )
76
+ }
77
+ ) });
78
+ };
79
+ }
80
+ });
81
+ export {
82
+ WidgetTitleView,
83
+ WidgetView
84
+ };
@@ -0,0 +1,10 @@
1
+ import { default as default2 } from "./layout/layplux";
2
+ import { useSkeleton } from "./managers/skeleton";
3
+ import { createPluginEventBus } from "./utils/event-bus";
4
+ import { FocusTracker } from "./utils/focus-tracker";
5
+ export {
6
+ FocusTracker,
7
+ default2 as Layplux,
8
+ createPluginEventBus,
9
+ useSkeleton
10
+ };
@@ -0,0 +1,11 @@
1
+ import { jsx } from "vue/jsx-runtime";
2
+ import { defineComponent } from "vue";
3
+ const GlassOverlay = defineComponent({
4
+ name: "GlassOverlay",
5
+ setup() {
6
+ return () => /* @__PURE__ */ jsx("div", {});
7
+ }
8
+ });
9
+ export {
10
+ GlassOverlay
11
+ };
@@ -0,0 +1,15 @@
1
+ import { jsx } from "vue/jsx-runtime";
2
+ import { defineComponent } from "vue";
3
+ import { Skeleton } from "./skeleton";
4
+ const LayeredManager = defineComponent({
5
+ name: "LayeredManager",
6
+ props: {
7
+ skeleton: Object
8
+ },
9
+ setup(props) {
10
+ return () => /* @__PURE__ */ jsx("div", { class: "layered-manager", children: /* @__PURE__ */ jsx(Skeleton, { skeleton: props.skeleton }) });
11
+ }
12
+ });
13
+ export {
14
+ LayeredManager
15
+ };
@@ -0,0 +1,21 @@
1
+ import { jsx } from "vue/jsx-runtime";
2
+ import { defineComponent } from "vue";
3
+ import { RootPane } from "./root-pane";
4
+ const Layplux = defineComponent({
5
+ name: "Layplux",
6
+ props: {
7
+ skeleton: Object
8
+ },
9
+ setup(props) {
10
+ return () => /* @__PURE__ */ jsx(RootPane, { skeleton: props.skeleton, children: "Layplux" });
11
+ }
12
+ });
13
+ var layplux_default = Object.assign(Layplux, {
14
+ install: (app) => {
15
+ app.component("Layplux", Layplux);
16
+ return app;
17
+ }
18
+ });
19
+ export {
20
+ layplux_default as default
21
+ };
@@ -0,0 +1,26 @@
1
+ import { jsx, jsxs } from "vue/jsx-runtime";
2
+ import { computed, defineComponent, provide } from "vue";
3
+ import { LayeredManager } from "./layered-manager";
4
+ import { GlassOverlay } from "./glass-overlay";
5
+ import { CornerGlow } from "../components";
6
+ const RootPane = defineComponent({
7
+ name: "RootPane",
8
+ props: {
9
+ skeleton: Object
10
+ },
11
+ setup(props) {
12
+ provide("layplux-locale", props.skeleton?.locale);
13
+ const rootClass = computed(() => {
14
+ const dark = props.skeleton?.isDark();
15
+ return ["layplux-root", dark ? "dark" : ""].filter(Boolean);
16
+ });
17
+ return () => /* @__PURE__ */ jsxs("div", { class: rootClass.value, "data-theme": props.skeleton?.themeName?.value, children: [
18
+ /* @__PURE__ */ jsx(CornerGlow, {}),
19
+ /* @__PURE__ */ jsx(LayeredManager, { skeleton: props.skeleton }),
20
+ /* @__PURE__ */ jsx(GlassOverlay, {})
21
+ ] });
22
+ }
23
+ });
24
+ export {
25
+ RootPane
26
+ };
@@ -0,0 +1,44 @@
1
+ import { jsx, jsxs } from "vue/jsx-runtime";
2
+ import { defineComponent } from "vue";
3
+ const BottomArea = defineComponent({
4
+ name: "BottomArea",
5
+ props: {
6
+ area: Object
7
+ },
8
+ setup(props) {
9
+ return () => {
10
+ const { area } = props;
11
+ const left = [];
12
+ const center = [];
13
+ const right = [];
14
+ area?.container.items.value.slice().toSorted((a, b) => {
15
+ const index1 = a.config?.index || 0;
16
+ const index2 = b.config?.index || 0;
17
+ return index1 === index2 ? 0 : index1 > index2 ? 1 : -1;
18
+ }).forEach((item) => {
19
+ const content = /* @__PURE__ */ jsx("div", { children: item.renderContent() }, `bottom-area-${item.name}`);
20
+ if (item.align === "left") {
21
+ left.push(content);
22
+ } else if (item.align === "center") {
23
+ center.push(content);
24
+ } else {
25
+ right.push(content);
26
+ }
27
+ });
28
+ return /* @__PURE__ */ jsxs("div", { class: "layplux-bottom-area", children: [
29
+ /* @__PURE__ */ jsxs("div", { class: "layplux-bottom-area__left", children: [
30
+ ...left
31
+ ] }),
32
+ /* @__PURE__ */ jsxs("div", { class: "layplux-bottom-area__center", children: [
33
+ ...center
34
+ ] }),
35
+ /* @__PURE__ */ jsxs("div", { class: "layplux-bottom-area__right", children: [
36
+ ...right
37
+ ] })
38
+ ] });
39
+ };
40
+ }
41
+ });
42
+ export {
43
+ BottomArea
44
+ };
@@ -0,0 +1,22 @@
1
+ import { jsx } from "vue/jsx-runtime";
2
+ import { defineComponent } from "vue";
3
+ const BottomLeftArea = defineComponent({
4
+ name: "BottomLeftArea",
5
+ props: {
6
+ area: Object
7
+ },
8
+ setup(props) {
9
+ return () => {
10
+ const items = props.area?.container.items.value;
11
+ if (!items || items.length === 0) return null;
12
+ return /* @__PURE__ */ jsx("div", { class: "layplux-bottom-left-area", children: items.slice().toSorted((a, b) => {
13
+ const i1 = a.config?.index ?? 0;
14
+ const i2 = b.config?.index ?? 0;
15
+ return i1 === i2 ? 0 : i1 > i2 ? 1 : -1;
16
+ }).map((widget) => widget.renderTitle()) });
17
+ };
18
+ }
19
+ });
20
+ export {
21
+ BottomLeftArea
22
+ };
@@ -0,0 +1,18 @@
1
+ import { jsx } from "vue/jsx-runtime";
2
+ import { defineComponent } from "vue";
3
+ const BottomRightArea = defineComponent({
4
+ name: "BottomRightArea",
5
+ props: {
6
+ area: Object
7
+ },
8
+ setup(props) {
9
+ return () => {
10
+ const items = props.area?.container.items.value;
11
+ if (!items || items.length === 0) return null;
12
+ return /* @__PURE__ */ jsx("div", { class: "layplux-bottom-right-area", children: items.slice().toSorted((a, b) => (a.config?.index ?? 0) - (b.config?.index ?? 0)).map((widget) => widget.renderTitle()) });
13
+ };
14
+ }
15
+ });
16
+ export {
17
+ BottomRightArea
18
+ };