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,17 @@
1
+ import { h, isVNode, cloneVNode, Text } from "vue";
2
+ function createContent(content, extraProps = {}) {
3
+ if (!content) return null;
4
+ if (isVNode(content)) {
5
+ return cloneVNode(content, extraProps);
6
+ }
7
+ if (typeof content === "string") {
8
+ if (Object.keys(extraProps).length > 0) {
9
+ return h(content, extraProps, content);
10
+ }
11
+ return h(Text, null, content);
12
+ }
13
+ return h(content, extraProps);
14
+ }
15
+ export {
16
+ createContent
17
+ };
@@ -0,0 +1,51 @@
1
+ .layplux-root.dark,
2
+ .layplux-root.dark[data-theme='custom'],
3
+ .layplux-root.dark[data-theme='default'] {
4
+ --layplux-background: 222.34deg 10.43% 12.27%;
5
+ --layplux-background-deep: 220deg 13.06% 9%;
6
+ --layplux-foreground: 0 0% 95%;
7
+ --layplux-card: 222.34deg 10.43% 12.27%;
8
+ --layplux-card-foreground: 210 40% 98%;
9
+ --layplux-popover: 0 0% 14.2%;
10
+ --layplux-popover-foreground: 210 40% 98%;
11
+ --layplux-muted: 240 3.7% 15.9%;
12
+ --layplux-muted-foreground: 240 5% 64.9%;
13
+ --layplux-primary-foreground: 0 0% 98%;
14
+ --layplux-destructive: 359.21 68.47% 56.47%;
15
+ --layplux-destructive-foreground: 0 0% 98%;
16
+ --layplux-info: 180 1.54% 12.75%;
17
+ --layplux-info-foreground: 220 4% 58%;
18
+ --layplux-success: 144 57% 58%;
19
+ --layplux-success-foreground: 0 0% 98%;
20
+ --layplux-warning: 42 84% 61%;
21
+ --layplux-warning-foreground: 0 0% 98%;
22
+ --layplux-secondary: 240 5% 17%;
23
+ --layplux-secondary-foreground: 0 0% 98%;
24
+ --layplux-accent: 216 5% 19%;
25
+ --layplux-accent-dark: 240 0% 22%;
26
+ --layplux-accent-darker: 240 0% 26%;
27
+ --layplux-accent-lighter: 216 5% 12%;
28
+ --layplux-accent-hover: 216 5% 24%;
29
+ --layplux-accent-foreground: 0 0% 98%;
30
+ --layplux-heavy: 216 5% 24%;
31
+ --layplux-heavy-foreground: var(--layplux-accent-foreground);
32
+ --layplux-border: 220 4% 34%;
33
+ --layplux-input: 0deg 0% 100% / 10%;
34
+ --layplux-input-placeholder: 218deg 11% 65%;
35
+ --layplux-input-background: 0deg 0% 100% / 5%;
36
+ --layplux-ring: 222.2 84% 4.9%;
37
+ --layplux-radius: 0.5rem;
38
+ --layplux-overlay: 0deg 0% 0% / 40%;
39
+ --layplux-overlay-content: 0deg 0% 0% / 40%;
40
+ --layplux-font-size-base: 16px;
41
+ --layplux-sidebar: 222.34deg 10.43% 12.27%;
42
+ --layplux-sidebar-deep: 220deg 13.06% 9%;
43
+ --layplux-menu: var(--layplux-sidebar);
44
+ --layplux-header: 222.34deg 10.43% 12.27%;
45
+ --layplux-shadow: 0 0% 0%;
46
+ --layplux-hover: var(--layplux-foreground) / 0.08;
47
+ --layplux-active: var(--layplux-foreground) / 0.12;
48
+ --layplux-root-background: 210 6% 14%;
49
+
50
+ color-scheme: dark;
51
+ }
@@ -0,0 +1,56 @@
1
+ .layplux-root {
2
+ --layplux-popup-z-index: 2000;
3
+ --layplux-font-family:
4
+ -apple-system, blinkmacsystemfont, 'Segoe UI', roboto, 'Helvetica Neue', arial, 'Noto Sans',
5
+ sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';
6
+ --layplux-background: 0 0% 100%;
7
+ --layplux-background-deep: 216 20.11% 95.47%;
8
+ --layplux-foreground: 210 6% 21%;
9
+ --layplux-card: 0 0% 100%;
10
+ --layplux-card-foreground: 222.2 84% 4.9%;
11
+ --layplux-popover: 0 0% 100%;
12
+ --layplux-popover-foreground: 222.2 84% 4.9%;
13
+ --layplux-muted: 240 4.8% 95.9%;
14
+ --layplux-muted-foreground: 240 3.8% 46.1%;
15
+ --layplux-primary: 212 100% 45%;
16
+ --layplux-primary-foreground: 0 0% 98%;
17
+ --layplux-destructive: 359.33 100% 65.1%;
18
+ --layplux-destructive-foreground: 0 0% 98%;
19
+ --layplux-info: 240 5% 96%;
20
+ --layplux-info-foreground: 220 4% 58%;
21
+ --layplux-success: 144 57% 58%;
22
+ --layplux-success-foreground: 0 0% 98%;
23
+ --layplux-warning: 42 84% 61%;
24
+ --layplux-warning-foreground: 0 0% 98%;
25
+ --layplux-secondary: 240 5% 96%;
26
+ --layplux-secondary-foreground: 240 6% 10%;
27
+ --layplux-accent: 240 5% 96%;
28
+ --layplux-accent-dark: 216 14% 93%;
29
+ --layplux-accent-darker: 216 11% 91%;
30
+ --layplux-accent-lighter: 240 0% 98%;
31
+ --layplux-accent-hover: 200deg 10% 90%;
32
+ --layplux-accent-foreground: 240 6% 10%;
33
+ --layplux-heavy: 192deg 9.43% 89.61%;
34
+ --layplux-heavy-foreground: var(--layplux-accent-foreground);
35
+ --layplux-border: 220 6% 82%;
36
+ --layplux-input: 240deg 5.88% 90%;
37
+ --layplux-input-placeholder: 217 10.6% 65%;
38
+ --layplux-input-background: 0 0% 100%;
39
+ --layplux-ring: 222.2 84% 4.9%;
40
+ --layplux-radius: 0.5rem;
41
+ --layplux-overlay: 0 0% 0% / 45%;
42
+ --layplux-overlay-content: 0 0% 95% / 45%;
43
+ --layplux-font-size-base: 16px;
44
+ --layplux-sidebar: 0 0% 100%;
45
+ --layplux-sidebar-deep: 0 0% 100%;
46
+ --layplux-menu: var(--layplux-sidebar);
47
+ --layplux-header: 0 0% 100%;
48
+ --layplux-shadow: 0 0% 0%;
49
+ --layplux-hover: var(--layplux-foreground) / 0.08;
50
+ --layplux-active: var(--layplux-foreground) / 0.12;
51
+
52
+ accent-color: var(--layplux-primary);
53
+ color-scheme: light;
54
+
55
+ --layplux-root-background: 216 12% 92%;
56
+ }
@@ -0,0 +1,30 @@
1
+ .layplux-bottom-area {
2
+ display: flex;
3
+ flex-shrink: 0;
4
+ width: 100%;
5
+ height: 24px;
6
+ padding: 0 12px;
7
+ font-size: 11px;
8
+ color: hsl(var(--layplux-muted-foreground));
9
+ user-select: none;
10
+
11
+ &__left {
12
+ display: flex;
13
+ gap: 16px;
14
+ align-items: center;
15
+ }
16
+
17
+ &__center {
18
+ display: flex;
19
+ flex: 1;
20
+ gap: 16px;
21
+ align-items: center;
22
+ justify-content: center;
23
+ }
24
+
25
+ &__right {
26
+ display: flex;
27
+ gap: 16px;
28
+ align-items: center;
29
+ }
30
+ }
@@ -0,0 +1,8 @@
1
+ .layplux-bottom-left-area {
2
+ display: flex;
3
+ flex-shrink: 0;
4
+ flex-direction: column;
5
+ gap: 6px;
6
+ align-items: center;
7
+ padding: 6px 4px;
8
+ }
@@ -0,0 +1,8 @@
1
+ .layplux-bottom-right-area {
2
+ display: flex;
3
+ flex-shrink: 0;
4
+ flex-direction: column;
5
+ gap: 6px;
6
+ align-items: center;
7
+ padding: 6px 4px;
8
+ }
@@ -0,0 +1,162 @@
1
+ .layplux-center-area {
2
+ position: relative; // undocked 面板的定位父级
3
+ display: flex;
4
+ flex: 1;
5
+ flex-direction: column;
6
+ min-width: 0;
7
+ min-height: 0;
8
+
9
+ // ── 主区域(左 + 编辑器 + 右) ──────────────────────────────────────────
10
+ &__main {
11
+ display: flex;
12
+ flex: 1;
13
+ min-height: 0;
14
+ }
15
+
16
+ // ── 左 / 右侧面板列 ─────────────────────────────────────────────────────
17
+ &__left,
18
+ &__right {
19
+ display: flex;
20
+ flex-shrink: 0;
21
+ flex-direction: column;
22
+ min-height: 0;
23
+ }
24
+
25
+ // 面板列内部容器(负责上下分割)
26
+ &__docked-panels {
27
+ display: flex;
28
+ flex: 1;
29
+ flex-direction: column;
30
+ min-height: 0;
31
+
32
+ // 没有内部分割时,PanelView 撑满全部高度
33
+ > .layplux-panel {
34
+ flex: 1;
35
+ min-height: 0;
36
+ }
37
+ }
38
+
39
+ // ── 编辑器 ───────────────────────────────────────────────────────────────
40
+ &__editor {
41
+ position: relative;
42
+ flex: 1;
43
+ min-width: 0;
44
+ min-height: 0;
45
+ background-color: hsl(var(--layplux-background));
46
+ border-radius: var(--layplux-radius);
47
+ }
48
+
49
+ // ── 底部面板行 ───────────────────────────────────────────────────────────
50
+ &__bottom {
51
+ display: flex;
52
+ flex-shrink: 0;
53
+ min-height: 0;
54
+
55
+ // 没有内部分割时,PanelView 撑满全部宽度
56
+ > .layplux-panel {
57
+ flex: 1;
58
+ min-width: 0;
59
+ }
60
+ }
61
+ }
62
+
63
+ // ── 拖拽手柄 ─────────────────────────────────────────────────────────────────
64
+ .layplux-resize-handle {
65
+ z-index: 10;
66
+ flex-shrink: 0;
67
+ background-color: transparent;
68
+ transition: background-color 0.15s;
69
+
70
+ &:hover, // 横向手柄(调整左/右侧面板宽度,底部内部左右分割)
71
+ &--x {
72
+ align-self: stretch;
73
+ width: 4px;
74
+ cursor: col-resize;
75
+ }
76
+
77
+ // 纵向手柄(调整底部面板高度,左/右侧内部上下分割)
78
+ &--y {
79
+ align-self: stretch;
80
+ height: 4px;
81
+ cursor: row-resize;
82
+ }
83
+
84
+ // 底部面板的上边缘拖拽手柄(独立定位,不在 flex 流里)
85
+ &--bottom-edge {
86
+ align-self: auto;
87
+ }
88
+
89
+ // 最大化状态:视觉高亮
90
+ &--maximized {
91
+ background-color: hsl(var(--layplux-foreground) / 12%);
92
+ }
93
+ }
94
+
95
+ // ── Undocked 浮动面板 ─────────────────────────────────────────────────────────
96
+ .layplux-panel--undocked {
97
+ position: absolute;
98
+ z-index: 100;
99
+ display: flex; // 让内部 PanelView 和 edge 手柄并排 / 堆叠
100
+ &-left {
101
+ top: 0;
102
+ left: 0;
103
+ flex-direction: row; // PanelView + 右边缘手柄 横向排列
104
+ height: 100%;
105
+
106
+ > .layplux-panel {
107
+ flex: 1;
108
+ min-width: 0;
109
+ }
110
+ }
111
+
112
+ &-right {
113
+ top: 0;
114
+ right: 0;
115
+ flex-direction: row; // 左边缘手柄 + PanelView 横向排列
116
+ height: 100%;
117
+
118
+ > .layplux-panel {
119
+ flex: 1;
120
+ min-width: 0;
121
+ }
122
+ }
123
+
124
+ &-bottom {
125
+ right: 0;
126
+ bottom: 0;
127
+ left: 0;
128
+ flex-direction: column; // 上边缘手柄 + PanelView 纵向排列
129
+ > .layplux-panel {
130
+ flex: 1;
131
+ min-height: 0;
132
+ }
133
+ }
134
+
135
+ > .layplux-resize-handle {
136
+ background-color: hsl(var(--layplux-root-background));
137
+ }
138
+ }
139
+
140
+ // edge 手柄:absolute 贴边,覆盖在 undocked 容器边界上
141
+ .layplux-resize-handle {
142
+ &--edge-right {
143
+ flex-shrink: 0;
144
+ align-self: stretch;
145
+ width: 4px;
146
+ cursor: col-resize;
147
+ }
148
+
149
+ &--edge-left {
150
+ flex-shrink: 0;
151
+ align-self: stretch;
152
+ width: 4px;
153
+ cursor: col-resize;
154
+ }
155
+
156
+ &--edge-top {
157
+ flex-shrink: 0;
158
+ align-self: stretch;
159
+ height: 4px;
160
+ cursor: row-resize;
161
+ }
162
+ }
@@ -0,0 +1,17 @@
1
+ .corner-glow {
2
+ position: absolute;
3
+ top: -80px;
4
+ left: 50px;
5
+ z-index: 0;
6
+ width: 620px;
7
+ height: 420px;
8
+ pointer-events: none;
9
+ background: radial-gradient(
10
+ ellipse at 20% 5%,
11
+ hsl(var(--layplux-primary) / 16%) 0%,
12
+ hsl(var(--layplux-primary) / 10%) 30%,
13
+ hsl(var(--layplux-primary) / 6%) 60%,
14
+ transparent
15
+ );
16
+ filter: blur(40px);
17
+ }
@@ -0,0 +1,91 @@
1
+ .layplux-dropdown {
2
+ min-width: 100px;
3
+ padding: 4px;
4
+ background: hsl(var(--layplux-popover));
5
+ border-radius: var(--layplux-radius);
6
+ box-shadow:
7
+ 0 6px 16px 0 hsl(var(--layplux-shadow) / 8%),
8
+ 0 3px 6px -4px hsl(var(--layplux-shadow) / 12%),
9
+ 0 9px 28px 8px hsl(var(--layplux-shadow) / 5%);
10
+ }
11
+
12
+ .layplux-dropdown-menu {
13
+ display: flex;
14
+ flex-direction: column;
15
+ gap: 2px;
16
+
17
+ .layplux-popup-trigger {
18
+ display: flex;
19
+ padding: 6px 4px;
20
+ border-radius: calc(var(--layplux-radius) - 2px);
21
+ transition:
22
+ background-color 0.15s ease,
23
+ color 0.15s ease;
24
+
25
+ &:hover {
26
+ background: hsl(var(--layplux-accent-hover));
27
+ }
28
+ }
29
+
30
+ &__item {
31
+ display: flex;
32
+ flex: 1;
33
+ gap: 8px;
34
+ align-items: center;
35
+ padding: 6px 4px;
36
+ font-size: 13px;
37
+ color: hsl(var(--layplux-popover-foreground));
38
+ cursor: pointer;
39
+ user-select: none;
40
+ border-radius: calc(var(--layplux-radius) - 2px);
41
+ transition:
42
+ background-color 0.15s ease,
43
+ color 0.15s ease;
44
+
45
+ &:hover {
46
+ background: hsl(var(--layplux-accent-hover));
47
+ }
48
+
49
+ &--submenu {
50
+ justify-content: space-between;
51
+ padding: 0;
52
+ cursor: default;
53
+ background: transparent;
54
+ border-radius: 0;
55
+
56
+ &:hover {
57
+ background: transparent;
58
+ }
59
+ }
60
+
61
+ &--danger {
62
+ color: hsl(var(--layplux-destructive));
63
+
64
+ &:hover {
65
+ color: hsl(var(--layplux-destructive-foreground));
66
+ background: hsl(var(--layplux-destructive));
67
+ }
68
+ }
69
+
70
+ &--disabled {
71
+ color: hsl(var(--layplux-muted-foreground));
72
+ cursor: not-allowed;
73
+ background: transparent;
74
+
75
+ &:hover {
76
+ background: transparent;
77
+ }
78
+ }
79
+ }
80
+
81
+ &__divider {
82
+ height: 1px;
83
+ background: hsl(var(--layplux-border) / 50%);
84
+ }
85
+
86
+ &__submenu-arrow {
87
+ margin-left: auto;
88
+ font-size: 14px;
89
+ opacity: 0.5;
90
+ }
91
+ }
@@ -0,0 +1,6 @@
1
+ .glass-pane {
2
+ position: absolute;
3
+ inset: 0;
4
+ z-index: var(--layplux-popup-z-index);
5
+ pointer-events: none;
6
+ }
@@ -0,0 +1,6 @@
1
+ .layered-manager {
2
+ position: relative;
3
+ display: flex;
4
+ height: 100%;
5
+ min-height: 0;
6
+ }
@@ -0,0 +1,8 @@
1
+ .layplux-left-bottom-area {
2
+ display: flex;
3
+ flex-shrink: 0;
4
+ flex-direction: column;
5
+ gap: 6px;
6
+ align-items: center;
7
+ padding: 6px 4px;
8
+ }
@@ -0,0 +1,9 @@
1
+ .layplux-left-top-area {
2
+ display: flex;
3
+ flex: 1;
4
+ flex-direction: column;
5
+ gap: 6px;
6
+ align-items: center;
7
+ padding: 6px 4px;
8
+ overflow: hidden auto;
9
+ }
@@ -0,0 +1,79 @@
1
+ .layplux-panel {
2
+ position: relative;
3
+ display: flex;
4
+ flex-shrink: 0;
5
+ flex-direction: column;
6
+ min-height: 0;
7
+ overflow: hidden;
8
+ background-color: hsl(var(--layplux-sidebar-deep));
9
+ border-radius: var(--layplux-radius);
10
+
11
+ &__header {
12
+ display: flex;
13
+ flex-shrink: 0;
14
+ gap: 4px;
15
+ align-items: center;
16
+ height: 36px;
17
+ padding: 0 8px;
18
+ user-select: none;
19
+ border-bottom: 1px solid hsl(var(--layplux-border));
20
+ }
21
+
22
+ &__title {
23
+ flex: 1;
24
+ overflow: hidden;
25
+ text-overflow: ellipsis;
26
+ font-size: 12px;
27
+ font-weight: 600;
28
+ color: hsl(var(--layplux-muted-foreground));
29
+ text-transform: uppercase;
30
+ letter-spacing: 0.05em;
31
+ white-space: nowrap;
32
+ }
33
+
34
+ // viewMode 切换按钮组
35
+ &__actions {
36
+ display: flex;
37
+ gap: 2px;
38
+ align-items: center;
39
+ margin-left: auto;
40
+ }
41
+
42
+ &__action-btn {
43
+ display: flex;
44
+ align-items: center;
45
+ justify-content: center;
46
+ width: 22px;
47
+ height: 22px;
48
+ padding: 0;
49
+ color: hsl(var(--layplux-muted-foreground));
50
+ cursor: pointer;
51
+ background: transparent;
52
+ border: none;
53
+ border-radius: 4px;
54
+ transition:
55
+ background-color 0.1s,
56
+ color 0.1s;
57
+
58
+ &:hover {
59
+ color: hsl(var(--layplux-foreground));
60
+ background-color: hsl(var(--layplux-hover));
61
+ }
62
+
63
+ &--active {
64
+ color: hsl(var(--layplux-foreground));
65
+ background-color: hsl(var(--layplux-active));
66
+ }
67
+ }
68
+
69
+ &__body {
70
+ flex: 1;
71
+ min-height: 0;
72
+ overflow: hidden auto;
73
+ }
74
+
75
+ &__content {
76
+ height: 100%;
77
+ min-height: 0;
78
+ }
79
+ }
@@ -0,0 +1,19 @@
1
+ .layplux-popup-trigger {
2
+ display: inline-flex;
3
+ }
4
+
5
+ .layplux-popup {
6
+ pointer-events: none;
7
+ opacity: 0;
8
+ transform: scale(0.95);
9
+ transform-origin: top left;
10
+ transition:
11
+ opacity 0.2s ease,
12
+ transform 0.2s ease;
13
+
14
+ &--visible {
15
+ pointer-events: auto;
16
+ opacity: 1;
17
+ transform: scale(1);
18
+ }
19
+ }
@@ -0,0 +1,8 @@
1
+ .layplux-right-bottom-area {
2
+ display: flex;
3
+ flex-shrink: 0;
4
+ flex-direction: column;
5
+ gap: 6px;
6
+ align-items: center;
7
+ padding: 6px 4px;
8
+ }
@@ -0,0 +1,8 @@
1
+ .layplux-right-top-area {
2
+ display: flex;
3
+ flex-shrink: 0;
4
+ flex-direction: column;
5
+ gap: 6px;
6
+ align-items: center;
7
+ padding: 6px 4px;
8
+ }
@@ -0,0 +1,17 @@
1
+ .layplux-root {
2
+ position: relative;
3
+ width: 100%;
4
+ height: 100%;
5
+ contain: strict;
6
+ font-family: var(--layplux-font-family);
7
+ font-size: var(--layplux-font-size-base);
8
+ color: hsl(var(--layplux-foreground));
9
+ background-color: hsl(var(--layplux-root-background));
10
+ isolation: isolate;
11
+
12
+ *,
13
+ *::before,
14
+ *::after {
15
+ box-sizing: border-box;
16
+ }
17
+ }
@@ -0,0 +1,38 @@
1
+ .layplux-skeleton {
2
+ display: flex;
3
+ flex: 1;
4
+ flex-direction: column;
5
+ min-height: 0;
6
+
7
+ &__body {
8
+ display: flex;
9
+ flex: 1;
10
+ min-height: 0;
11
+ }
12
+
13
+ &__stripe {
14
+ display: flex;
15
+ flex-shrink: 0;
16
+ flex-direction: column;
17
+ min-width: 6px;
18
+
19
+ &-top {
20
+ flex: 1;
21
+ overflow: hidden auto;
22
+ }
23
+
24
+ &-separator {
25
+ flex-shrink: 0;
26
+ width: 24px;
27
+ height: 1px;
28
+ margin: 4px auto;
29
+ background: hsl(var(--layplux-border));
30
+ }
31
+ }
32
+
33
+ &__center {
34
+ display: flex;
35
+ flex: 1;
36
+ min-height: 0;
37
+ }
38
+ }