@weasel-js/labkit 0.1.0

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 (217) hide show
  1. package/README.md +72 -0
  2. package/dist/_dts/fitViewToBounds-rWrBI4a6.d.ts +870 -0
  3. package/dist/_dts/index-C6Yze7sQ.d.ts +93 -0
  4. package/dist/_dts/types-Si4Fw-1F.d.ts +48 -0
  5. package/dist/_dts/useExperimentState-eSvpwV_P.d.ts +102 -0
  6. package/dist/canvas/index.d.ts +34 -0
  7. package/dist/canvas/index.js +4 -0
  8. package/dist/canvas/index.js.map +1 -0
  9. package/dist/chunk-2QNYYL3V.js +86 -0
  10. package/dist/chunk-2QNYYL3V.js.map +1 -0
  11. package/dist/chunk-54IQ2DX7.js +222 -0
  12. package/dist/chunk-54IQ2DX7.js.map +1 -0
  13. package/dist/chunk-6FO7G5BB.js +6095 -0
  14. package/dist/chunk-6FO7G5BB.js.map +1 -0
  15. package/dist/chunk-7BKDG73Z.js +54 -0
  16. package/dist/chunk-7BKDG73Z.js.map +1 -0
  17. package/dist/chunk-B5ZUYRKN.js +23330 -0
  18. package/dist/chunk-B5ZUYRKN.js.map +1 -0
  19. package/dist/chunk-HXZHVU4G.js +126 -0
  20. package/dist/chunk-HXZHVU4G.js.map +1 -0
  21. package/dist/chunk-PWC7AQZM.js +8 -0
  22. package/dist/chunk-PWC7AQZM.js.map +1 -0
  23. package/dist/chunk-SD3HDXR7.js +161 -0
  24. package/dist/chunk-SD3HDXR7.js.map +1 -0
  25. package/dist/chunk-SSMHPMDV.js +350 -0
  26. package/dist/chunk-SSMHPMDV.js.map +1 -0
  27. package/dist/chunk-VLAHRJOC.js +201 -0
  28. package/dist/chunk-VLAHRJOC.js.map +1 -0
  29. package/dist/controls/index.d.ts +13 -0
  30. package/dist/controls/index.js +3 -0
  31. package/dist/controls/index.js.map +1 -0
  32. package/dist/dragdrop/index.d.ts +3 -0
  33. package/dist/dragdrop/index.js +3 -0
  34. package/dist/dragdrop/index.js.map +1 -0
  35. package/dist/fonts/oswald-latin-variable.woff2 +0 -0
  36. package/dist/index.d.ts +410 -0
  37. package/dist/index.js +1425 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/layers/index.d.ts +17 -0
  40. package/dist/layers/index.js +3 -0
  41. package/dist/layers/index.js.map +1 -0
  42. package/dist/passthrough/weasel-canvas.d.ts +258 -0
  43. package/dist/passthrough/weasel-canvas.js +3 -0
  44. package/dist/passthrough/weasel-canvas.js.map +1 -0
  45. package/dist/passthrough/weasel-ui.d.ts +2826 -0
  46. package/dist/passthrough/weasel-ui.js +4 -0
  47. package/dist/passthrough/weasel-ui.js.map +1 -0
  48. package/dist/primitives/index.d.ts +57 -0
  49. package/dist/primitives/index.js +4 -0
  50. package/dist/primitives/index.js.map +1 -0
  51. package/dist/state/index.d.ts +33 -0
  52. package/dist/state/index.js +34 -0
  53. package/dist/state/index.js.map +1 -0
  54. package/dist/styles.css +1224 -0
  55. package/dist/theme-interstellar.css +25 -0
  56. package/dist/theme-light.css +13 -0
  57. package/dist/ui/layers/index.d.ts +42 -0
  58. package/dist/ui/layers/index.js +5 -0
  59. package/dist/ui/layers/index.js.map +1 -0
  60. package/dist/undo/index.d.ts +30 -0
  61. package/dist/undo/index.js +3 -0
  62. package/dist/undo/index.js.map +1 -0
  63. package/package.json +99 -0
  64. package/src/canvas/AGENTS.md +72 -0
  65. package/src/canvas/CanvasStack.less +22 -0
  66. package/src/canvas/CanvasStack.stories.tsx +63 -0
  67. package/src/canvas/CanvasStack.test.tsx +82 -0
  68. package/src/canvas/CanvasStack.tsx +108 -0
  69. package/src/canvas/CanvasStackContext.ts +8 -0
  70. package/src/canvas/canvasCoords.test.ts +30 -0
  71. package/src/canvas/canvasCoords.ts +15 -0
  72. package/src/canvas/index.ts +6 -0
  73. package/src/canvas/useLayerScheduler.ts +72 -0
  74. package/src/canvas/usePanZoom.ts +98 -0
  75. package/src/controls/ControlPanel.less +61 -0
  76. package/src/controls/ControlPanel.stories.tsx +77 -0
  77. package/src/controls/ControlPanel.test.tsx +149 -0
  78. package/src/controls/ControlPanel.tsx +249 -0
  79. package/src/controls/index.ts +12 -0
  80. package/src/controls/types.ts +61 -0
  81. package/src/dragdrop/DragDropRuntime.tsx +135 -0
  82. package/src/dragdrop/DragGhost.less +17 -0
  83. package/src/dragdrop/DragGhost.tsx +24 -0
  84. package/src/dragdrop/Palette.less +34 -0
  85. package/src/dragdrop/Palette.tsx +27 -0
  86. package/src/dragdrop/dragDrop.test.tsx +145 -0
  87. package/src/dragdrop/index.ts +1 -0
  88. package/src/fonts/oswald-latin-variable.woff2 +0 -0
  89. package/src/index.ts +70 -0
  90. package/src/instrument/SineWave.smoke.test.tsx +94 -0
  91. package/src/instrument/capabilityDetector.test.ts +64 -0
  92. package/src/instrument/capabilityDetector.ts +17 -0
  93. package/src/instrument/defineInstrument.test.ts +27 -0
  94. package/src/instrument/defineInstrument.ts +5 -0
  95. package/src/instrument/index.ts +19 -0
  96. package/src/instrument/types.ts +65 -0
  97. package/src/instrument/validateConfigSchema.test.ts +125 -0
  98. package/src/instrument/validateConfigSchema.ts +65 -0
  99. package/src/lab/Lab.less +3 -0
  100. package/src/lab/Lab.stories.tsx +51 -0
  101. package/src/lab/Lab.test.tsx +126 -0
  102. package/src/lab/Lab.tsx +196 -0
  103. package/src/lab/LabContext.test.ts +11 -0
  104. package/src/lab/LabContext.ts +28 -0
  105. package/src/lab/LabShell.less +45 -0
  106. package/src/lab/LabShell.stories.tsx +39 -0
  107. package/src/lab/LabShell.test.tsx +59 -0
  108. package/src/lab/LabShell.tsx +33 -0
  109. package/src/lab/WorkspaceGrid.less +8 -0
  110. package/src/lab/WorkspaceGrid.stories.tsx +61 -0
  111. package/src/lab/WorkspaceGrid.test.tsx +40 -0
  112. package/src/lab/WorkspaceGrid.tsx +20 -0
  113. package/src/lab/gridDims.test.ts +35 -0
  114. package/src/lab/gridDims.ts +11 -0
  115. package/src/lab/index.ts +10 -0
  116. package/src/layers/AGENTS.md +65 -0
  117. package/src/layers/LayerList.less +53 -0
  118. package/src/layers/LayerList.test.tsx +49 -0
  119. package/src/layers/LayerList.tsx +105 -0
  120. package/src/layers/index.ts +3 -0
  121. package/src/passthrough/weasel-canvas.test.ts +30 -0
  122. package/src/passthrough/weasel-canvas.ts +23 -0
  123. package/src/passthrough/weasel-ui.test.ts +79 -0
  124. package/src/passthrough/weasel-ui.ts +150 -0
  125. package/src/primitives/FpsMeter.less +14 -0
  126. package/src/primitives/FpsMeter.stories.tsx +14 -0
  127. package/src/primitives/FpsMeter.test.tsx +38 -0
  128. package/src/primitives/FpsMeter.tsx +36 -0
  129. package/src/primitives/ScaleIndicator.less +25 -0
  130. package/src/primitives/ScaleIndicator.stories.tsx +16 -0
  131. package/src/primitives/ScaleIndicator.test.tsx +46 -0
  132. package/src/primitives/ScaleIndicator.tsx +48 -0
  133. package/src/primitives/Sidebar.less +57 -0
  134. package/src/primitives/Sidebar.stories.tsx +38 -0
  135. package/src/primitives/Sidebar.test.tsx +74 -0
  136. package/src/primitives/Sidebar.tsx +32 -0
  137. package/src/primitives/StatusBar.less +21 -0
  138. package/src/primitives/StatusBar.stories.tsx +24 -0
  139. package/src/primitives/StatusBar.test.tsx +25 -0
  140. package/src/primitives/StatusBar.tsx +18 -0
  141. package/src/primitives/Toolbar.less +43 -0
  142. package/src/primitives/Toolbar.stories.tsx +36 -0
  143. package/src/primitives/Toolbar.test.tsx +65 -0
  144. package/src/primitives/Toolbar.tsx +44 -0
  145. package/src/primitives/fpsAverage.test.ts +21 -0
  146. package/src/primitives/fpsAverage.ts +5 -0
  147. package/src/primitives/index.ts +9 -0
  148. package/src/state/SingletonExperiment.test.tsx +101 -0
  149. package/src/state/SingletonExperiment.tsx +52 -0
  150. package/src/state/adapters.test.ts +94 -0
  151. package/src/state/adapters.ts +102 -0
  152. package/src/state/context.tsx +42 -0
  153. package/src/state/helpers.test.ts +89 -0
  154. package/src/state/helpers.ts +61 -0
  155. package/src/state/index.ts +40 -0
  156. package/src/state/store.test.ts +243 -0
  157. package/src/state/store.ts +225 -0
  158. package/src/state/types.ts +53 -0
  159. package/src/state/useExperimentState.test.tsx +102 -0
  160. package/src/state/useExperimentState.ts +28 -0
  161. package/src/styles.less +20 -0
  162. package/src/test-setup.ts +17 -0
  163. package/src/theme/Interstellar.stories.less +92 -0
  164. package/src/theme/Interstellar.stories.tsx +243 -0
  165. package/src/theme/base.less +122 -0
  166. package/src/theme/interstellar.less +34 -0
  167. package/src/theme/light.less +14 -0
  168. package/src/theme/tokens.less +85 -0
  169. package/src/ui/format.ts +19 -0
  170. package/src/ui/layers/LayerStack.less +143 -0
  171. package/src/ui/layers/LayerStack.stories.tsx +45 -0
  172. package/src/ui/layers/LayerStack.test.tsx +170 -0
  173. package/src/ui/layers/LayerStack.tsx +215 -0
  174. package/src/ui/layers/index.ts +1 -0
  175. package/src/ui/properties/CheckboxRow.stories.tsx +27 -0
  176. package/src/ui/properties/ColorRow.stories.tsx +106 -0
  177. package/src/ui/properties/CurveField.less +48 -0
  178. package/src/ui/properties/CurveField.stories.tsx +20 -0
  179. package/src/ui/properties/CurveField.test.tsx +127 -0
  180. package/src/ui/properties/CurveField.tsx +181 -0
  181. package/src/ui/properties/EffectCard.tsx +312 -0
  182. package/src/ui/properties/Gallery.stories.tsx +178 -0
  183. package/src/ui/properties/NumberRow.stories.tsx +65 -0
  184. package/src/ui/properties/PropertyGroup.less +50 -0
  185. package/src/ui/properties/PropertyGroup.stories.tsx +34 -0
  186. package/src/ui/properties/PropertyGroup.test.tsx +33 -0
  187. package/src/ui/properties/PropertyGroup.tsx +44 -0
  188. package/src/ui/properties/PropertyList.stories.tsx +83 -0
  189. package/src/ui/properties/PropertyPanel.less +592 -0
  190. package/src/ui/properties/PropertyPanel.stories.tsx +191 -0
  191. package/src/ui/properties/PropertyPanel.test.tsx +193 -0
  192. package/src/ui/properties/PropertyPanel.tsx +441 -0
  193. package/src/ui/properties/PropertyRow.stories.tsx +53 -0
  194. package/src/ui/properties/SelectRow.stories.tsx +58 -0
  195. package/src/ui/properties/SliderRow.stories.tsx +74 -0
  196. package/src/ui/properties/SpeechBalloonPanels.stories.tsx +396 -0
  197. package/src/ui/properties/TextRow.stories.tsx +62 -0
  198. package/src/ui/properties/ToggleRow.stories.tsx +57 -0
  199. package/src/ui/properties/index.ts +39 -0
  200. package/src/ui/properties/storyLayouts.tsx +36 -0
  201. package/src/undo/eventBus.test.ts +49 -0
  202. package/src/undo/eventBus.ts +32 -0
  203. package/src/undo/index.ts +5 -0
  204. package/src/undo/undoStack.test.ts +70 -0
  205. package/src/undo/undoStack.ts +38 -0
  206. package/src/workspace/DefaultSidebar.tsx +26 -0
  207. package/src/workspace/DefaultStatusBar.tsx +15 -0
  208. package/src/workspace/DefaultToolbar.tsx +88 -0
  209. package/src/workspace/Workspace.less +58 -0
  210. package/src/workspace/Workspace.stories.tsx +78 -0
  211. package/src/workspace/Workspace.test.tsx +186 -0
  212. package/src/workspace/Workspace.tsx +255 -0
  213. package/src/workspace/WorkspaceChrome.tsx +150 -0
  214. package/src/workspace/index.ts +24 -0
  215. package/src/workspace/slotTypes.ts +44 -0
  216. package/src/workspace/workspaceOps.test.ts +142 -0
  217. package/src/workspace/workspaceOps.ts +78 -0
@@ -0,0 +1,1224 @@
1
+ :root {
2
+ --lk-bg: #0a0a14;
3
+ --lk-bg-elevated: rgba(20, 20, 36, 0.55);
4
+ --lk-bg-canvas: #02020a;
5
+ --lk-border: rgba(255, 255, 255, 0.14);
6
+ --lk-divider: rgba(255, 255, 255, 0.08);
7
+ --lk-glass-blur: 12px;
8
+ --lk-text: #e8e8f0;
9
+ --lk-text-muted: #a8a8c0;
10
+ --lk-text-disabled: #5a5a78;
11
+ --lk-accent: #b08adb;
12
+ --lk-accent-hover: #c6a3ee;
13
+ --lk-focus-ring: rgba(176, 138, 219, 0.45);
14
+ --lk-swatch-green: #2fdd18;
15
+ --lk-swatch-pink: #ff5885;
16
+ --lk-swatch-cyan: #00dfff;
17
+ --lk-swatch-gold: #dcb700;
18
+ --lk-swatch-amber: #ff8c00;
19
+ --lk-swatch-violet: #a497ff;
20
+ --lk-swatch-mint: #00e7af;
21
+ --lk-swatch-sky: #00b8ff;
22
+ --lk-swatch-orange: #ff6b00;
23
+ --lk-swatch-magenta: #ff6eff;
24
+ --lk-space-nebula: radial-gradient(ellipse 60% 80% at 18% 30%, rgba(150, 80, 200, 0.22), transparent 70%), radial-gradient(ellipse 55% 90% at 78% 70%, rgba(220, 100, 140, 0.18), transparent 65%), radial-gradient(ellipse 50% 70% at 50% 50%, rgba(60, 110, 200, 0.18), transparent 75%), radial-gradient(ellipse at center, #0a0a18 0%, #02020a 100%);
25
+ --lk-radius: 6px;
26
+ --lk-radius-sm: 3px;
27
+ --lk-radius-lg: 14px;
28
+ --lk-control-height: 28px;
29
+ --lk-spacing-xs: 4px;
30
+ --lk-spacing-sm: 8px;
31
+ --lk-spacing-md: 12px;
32
+ --lk-spacing-lg: 16px;
33
+ --lk-font: 'Oswald', system-ui, -apple-system, sans-serif;
34
+ --lk-font-mono: ui-monospace, SFMono-Regular, monospace;
35
+ --lk-font-display: 'Oswald', system-ui, sans-serif;
36
+ --lk-font-size: 13px;
37
+ --lk-font-size-sm: 11px;
38
+ --lk-font-weight-light: 300;
39
+ --lk-font-weight-medium: 500;
40
+ --lk-font-weight-bold: 700;
41
+ --lk-z-toolbar: 10;
42
+ --lk-z-overlay: 20;
43
+ --lk-z-modal: 30;
44
+ }
45
+ @media (prefers-color-scheme: light) {
46
+ :root {
47
+ --lk-bg: #fafaf7;
48
+ --lk-bg-elevated: #ffffff;
49
+ --lk-bg-canvas: #f0ebe2;
50
+ --lk-border: #c9bba5;
51
+ --lk-divider: rgba(0, 0, 0, 0.08);
52
+ --lk-text: #2a2018;
53
+ --lk-text-muted: #6b5c4a;
54
+ --lk-text-disabled: #a89b85;
55
+ --lk-accent: #a86f3c;
56
+ --lk-accent-hover: #c2854f;
57
+ --lk-focus-ring: rgba(168, 111, 60, 0.35);
58
+ }
59
+ }
60
+ @font-face {
61
+ font-family: 'Oswald';
62
+ font-style: normal;
63
+ font-weight: 100 900;
64
+ font-display: swap;
65
+ src: url('./fonts/oswald-latin-variable.woff2') format('woff2');
66
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
67
+ }
68
+ .lk-root {
69
+ font-family: var(--lk-font);
70
+ font-size: var(--lk-font-size);
71
+ font-weight: var(--lk-font-weight-light, 300);
72
+ color: var(--lk-text);
73
+ background: var(--lk-bg);
74
+ line-height: 1.4;
75
+ }
76
+ .lk-root *,
77
+ .lk-root *::before,
78
+ .lk-root *::after {
79
+ box-sizing: border-box;
80
+ }
81
+ .lk-root button {
82
+ font: inherit;
83
+ color: inherit;
84
+ background: var(--lk-bg-elevated);
85
+ border: 1px solid var(--lk-border);
86
+ border-radius: var(--lk-radius);
87
+ height: var(--lk-control-height);
88
+ padding: 0 var(--lk-spacing-md);
89
+ cursor: pointer;
90
+ backdrop-filter: blur(var(--lk-glass-blur, 0));
91
+ -webkit-backdrop-filter: blur(var(--lk-glass-blur, 0));
92
+ }
93
+ .lk-root button:hover {
94
+ border-color: var(--lk-accent);
95
+ color: var(--lk-accent);
96
+ }
97
+ .lk-root button:focus-visible {
98
+ outline: 2px solid var(--lk-focus-ring);
99
+ outline-offset: 1px;
100
+ }
101
+ .lk-root button:disabled {
102
+ color: var(--lk-text-disabled);
103
+ cursor: not-allowed;
104
+ }
105
+ .lk-root input[type="range"] {
106
+ accent-color: var(--lk-accent);
107
+ }
108
+ .lk-lab {
109
+ position: relative;
110
+ isolation: isolate;
111
+ background: var(--lk-space-nebula, var(--lk-bg));
112
+ background-attachment: fixed;
113
+ }
114
+ .lk-lab::before {
115
+ content: '';
116
+ position: absolute;
117
+ inset: 0;
118
+ pointer-events: none;
119
+ z-index: 0;
120
+ background-image: radial-gradient(1.2px 1.2px at 4% 18%, #fff, transparent 60%), radial-gradient(1px 1px at 9% 64%, #fff, transparent 60%), radial-gradient(1.5px 1.5px at 14% 36%, #fff, transparent 60%), radial-gradient(1px 1px at 19% 82%, #cce, transparent 60%), radial-gradient(0.8px 0.8px at 23% 28%, #fff, transparent 60%), radial-gradient(1.4px 1.4px at 28% 55%, #fff, transparent 60%), radial-gradient(1px 1px at 33% 12%, #ffe, transparent 60%), radial-gradient(1.2px 1.2px at 37% 70%, #fff, transparent 60%), radial-gradient(0.7px 0.7px at 42% 40%, #fff, transparent 60%), radial-gradient(1.5px 1.5px at 47% 88%, #fff, transparent 60%), radial-gradient(1px 1px at 52% 22%, #cef, transparent 60%), radial-gradient(1.3px 1.3px at 57% 60%, #fff, transparent 60%), radial-gradient(0.9px 0.9px at 62% 35%, #fff, transparent 60%), radial-gradient(1.1px 1.1px at 66% 75%, #fff, transparent 60%), radial-gradient(1.4px 1.4px at 71% 14%, #fff, transparent 60%), radial-gradient(1px 1px at 76% 50%, #fff, transparent 60%), radial-gradient(0.8px 0.8px at 81% 80%, #ffe, transparent 60%), radial-gradient(1.3px 1.3px at 85% 25%, #fff, transparent 60%), radial-gradient(1px 1px at 89% 62%, #cce, transparent 60%), radial-gradient(1.5px 1.5px at 93% 38%, #fff, transparent 60%), radial-gradient(0.9px 0.9px at 97% 78%, #fff, transparent 60%);
121
+ background-repeat: no-repeat;
122
+ }
123
+ .lk-theme-light.lk-lab {
124
+ background: var(--lk-bg);
125
+ background-attachment: scroll;
126
+ }
127
+ .lk-theme-light.lk-lab::before {
128
+ display: none;
129
+ }
130
+ .lk-lab h1,
131
+ .lk-lab h2,
132
+ .lk-lab h3 {
133
+ font-family: var(--lk-font-display);
134
+ font-weight: var(--lk-font-weight-light, 300);
135
+ letter-spacing: 0.01em;
136
+ line-height: 1.2;
137
+ }
138
+ .lk-workspace-grid {
139
+ display: grid;
140
+ grid-template-columns: repeat(var(--lk-grid-cols, 1), 1fr);
141
+ grid-template-rows: repeat(var(--lk-grid-rows, 1), 1fr);
142
+ gap: var(--lk-spacing-md);
143
+ width: 100%;
144
+ height: 100%;
145
+ }
146
+ .lk-shell {
147
+ display: flex;
148
+ flex-direction: column;
149
+ width: 100%;
150
+ height: 100vh;
151
+ background: var(--lk-bg);
152
+ }
153
+ .lk-shell-header {
154
+ display: flex;
155
+ align-items: center;
156
+ gap: var(--lk-spacing-md);
157
+ padding: var(--lk-spacing-sm) var(--lk-spacing-md);
158
+ background: var(--lk-bg-elevated);
159
+ border-bottom: 1px solid var(--lk-border);
160
+ z-index: var(--lk-z-toolbar);
161
+ }
162
+ .lk-shell-title {
163
+ margin: 0;
164
+ font-size: 16px;
165
+ font-weight: 600;
166
+ color: var(--lk-text);
167
+ }
168
+ .lk-shell-header-actions {
169
+ margin-left: auto;
170
+ display: flex;
171
+ gap: var(--lk-spacing-sm);
172
+ }
173
+ .lk-shell-body {
174
+ flex: 1;
175
+ min-height: 0;
176
+ overflow: auto;
177
+ padding: var(--lk-spacing-md);
178
+ }
179
+ .lk-shell-footer {
180
+ border-top: 1px solid var(--lk-border);
181
+ padding: var(--lk-spacing-xs) var(--lk-spacing-md);
182
+ background: var(--lk-bg-elevated);
183
+ color: var(--lk-text-muted);
184
+ font-size: var(--lk-font-size-sm);
185
+ }
186
+ .lk-toolbar {
187
+ display: flex;
188
+ align-items: center;
189
+ gap: var(--lk-spacing-sm);
190
+ padding: var(--lk-spacing-xs) var(--lk-spacing-sm);
191
+ background: var(--lk-bg-elevated);
192
+ border-bottom: 1px solid var(--lk-border);
193
+ min-height: calc(var(--lk-control-height) + 2 * var(--lk-spacing-xs));
194
+ }
195
+ .lk-toolbar-title {
196
+ font-weight: 600;
197
+ color: var(--lk-text);
198
+ margin-right: var(--lk-spacing-sm);
199
+ }
200
+ .lk-toolbar-spacer {
201
+ flex: 1;
202
+ }
203
+ .lk-toolbar-button {
204
+ height: var(--lk-control-height);
205
+ padding: 0 var(--lk-spacing-sm);
206
+ font-size: var(--lk-font-size);
207
+ color: var(--lk-text);
208
+ background: transparent;
209
+ border: 1px solid transparent;
210
+ border-radius: var(--lk-radius);
211
+ cursor: pointer;
212
+ }
213
+ .lk-toolbar-button:hover:not(:disabled) {
214
+ background: var(--lk-bg);
215
+ border-color: var(--lk-border);
216
+ }
217
+ .lk-toolbar-button:focus-visible {
218
+ outline: 2px solid var(--lk-focus-ring);
219
+ outline-offset: 1px;
220
+ }
221
+ .lk-toolbar-button:disabled {
222
+ color: var(--lk-text-disabled);
223
+ cursor: not-allowed;
224
+ }
225
+ .lk-sidebar {
226
+ display: flex;
227
+ flex-direction: column;
228
+ width: 280px;
229
+ background: var(--lk-bg-elevated);
230
+ border-left: 1px solid var(--lk-border);
231
+ transition: width 150ms ease;
232
+ }
233
+ .lk-sidebar--collapsed {
234
+ width: 32px;
235
+ }
236
+ .lk-sidebar-header {
237
+ display: flex;
238
+ align-items: center;
239
+ padding: var(--lk-spacing-xs) var(--lk-spacing-sm);
240
+ border-bottom: 1px solid var(--lk-divider);
241
+ min-height: var(--lk-control-height);
242
+ }
243
+ .lk-sidebar-title {
244
+ flex: 1;
245
+ font-weight: 600;
246
+ color: var(--lk-text);
247
+ font-size: var(--lk-font-size);
248
+ }
249
+ .lk-sidebar--collapsed .lk-sidebar-title {
250
+ display: none;
251
+ }
252
+ .lk-sidebar-toggle {
253
+ height: 24px;
254
+ width: 24px;
255
+ padding: 0;
256
+ background: transparent;
257
+ border: 1px solid transparent;
258
+ border-radius: var(--lk-radius-sm);
259
+ color: var(--lk-text-muted);
260
+ cursor: pointer;
261
+ }
262
+ .lk-sidebar-toggle:hover {
263
+ background: var(--lk-bg);
264
+ color: var(--lk-text);
265
+ }
266
+ .lk-sidebar-body {
267
+ flex: 1;
268
+ overflow: auto;
269
+ padding: var(--lk-spacing-sm);
270
+ }
271
+ .lk-sidebar--collapsed .lk-sidebar-body {
272
+ display: none;
273
+ }
274
+ .lk-status-bar {
275
+ display: flex;
276
+ align-items: center;
277
+ gap: var(--lk-spacing-md);
278
+ padding: var(--lk-spacing-xs) var(--lk-spacing-sm);
279
+ background: var(--lk-bg-elevated);
280
+ border-top: 1px solid var(--lk-border);
281
+ font-size: var(--lk-font-size-sm);
282
+ color: var(--lk-text-muted);
283
+ font-family: var(--lk-font-mono);
284
+ }
285
+ .lk-status-bar-section {
286
+ display: inline-flex;
287
+ align-items: center;
288
+ gap: var(--lk-spacing-xs);
289
+ padding: 0 var(--lk-spacing-xs);
290
+ border-right: 1px solid var(--lk-divider);
291
+ }
292
+ .lk-status-bar-section:last-child {
293
+ border-right: none;
294
+ }
295
+ .lk-fps-meter {
296
+ display: inline-flex;
297
+ align-items: center;
298
+ gap: var(--lk-spacing-xs);
299
+ font-family: var(--lk-font-mono);
300
+ font-size: var(--lk-font-size-sm);
301
+ color: var(--lk-text-muted);
302
+ }
303
+ .lk-fps-meter-value {
304
+ color: var(--lk-text);
305
+ min-width: 2.5ch;
306
+ text-align: right;
307
+ }
308
+ .lk-scale-indicator {
309
+ display: inline-flex;
310
+ align-items: center;
311
+ gap: var(--lk-spacing-xs);
312
+ font-family: var(--lk-font-mono);
313
+ font-size: var(--lk-font-size-sm);
314
+ color: var(--lk-text-muted);
315
+ }
316
+ .lk-scale-indicator-bar {
317
+ height: 6px;
318
+ border: 1px solid var(--lk-text-muted);
319
+ border-top: none;
320
+ background: linear-gradient(to right, var(--lk-text-muted) 1px, transparent 1px, transparent calc(100% - 1px), var(--lk-text-muted) calc(100% - 1px));
321
+ }
322
+ .lk-scale-indicator-label {
323
+ white-space: nowrap;
324
+ }
325
+ .lk-lab {
326
+ height: 100%;
327
+ }
328
+ .lk-workspace {
329
+ display: flex;
330
+ flex-direction: column;
331
+ height: 100%;
332
+ background: var(--lk-bg);
333
+ border: 1px solid var(--lk-border);
334
+ border-radius: var(--lk-radius);
335
+ overflow: hidden;
336
+ }
337
+ .lk-workspace__body {
338
+ display: flex;
339
+ flex: 1;
340
+ overflow: hidden;
341
+ }
342
+ .lk-workspace__sidebar {
343
+ flex-shrink: 0;
344
+ }
345
+ .lk-workspace__content {
346
+ flex: 1;
347
+ overflow: auto;
348
+ }
349
+ .lk-workspace__toolbar {
350
+ flex-shrink: 0;
351
+ border-bottom: 1px solid var(--lk-divider);
352
+ }
353
+ .lk-workspace__status {
354
+ flex-shrink: 0;
355
+ border-top: 1px solid var(--lk-divider);
356
+ }
357
+ .lk-workspace--unknown {
358
+ display: flex;
359
+ align-items: center;
360
+ justify-content: center;
361
+ color: var(--lk-text-muted);
362
+ font-size: var(--lk-font-size-sm);
363
+ }
364
+ .lk-toolbar__zoom-label {
365
+ font-size: var(--lk-font-size-sm);
366
+ color: var(--lk-text-muted);
367
+ padding: 0 var(--lk-space-2);
368
+ }
369
+ .lk-toolbar__load-select {
370
+ font-size: var(--lk-font-size-sm);
371
+ }
372
+ .lk-sidebar__placeholder {
373
+ padding: var(--lk-space-2);
374
+ color: var(--lk-text-muted);
375
+ font-size: var(--lk-font-size-sm);
376
+ }
377
+ .lk-control-panel {
378
+ display: flex;
379
+ flex-direction: column;
380
+ gap: var(--lk-spacing-sm, 8px);
381
+ padding: var(--lk-spacing-sm, 8px);
382
+ }
383
+ .lk-control-row {
384
+ display: flex;
385
+ flex-direction: column;
386
+ gap: var(--lk-spacing-xs, 4px);
387
+ }
388
+ .lk-control-row--inline {
389
+ flex-direction: row;
390
+ align-items: center;
391
+ gap: var(--lk-spacing-sm, 8px);
392
+ }
393
+ .lk-control-label {
394
+ font-size: var(--lk-font-size-sm, 12px);
395
+ color: var(--lk-color-text, #222);
396
+ }
397
+ .lk-control-input {
398
+ width: 100%;
399
+ background: var(--lk-color-surface, #fff);
400
+ color: var(--lk-color-text, #222);
401
+ border: 1px solid var(--lk-color-border, #ccc);
402
+ border-radius: 4px;
403
+ padding: 2px 6px;
404
+ }
405
+ .lk-control-input--range {
406
+ padding: 0;
407
+ border: none;
408
+ }
409
+ .lk-control-input--checkbox {
410
+ width: auto;
411
+ }
412
+ .lk-control-input--color {
413
+ width: 40px;
414
+ height: 24px;
415
+ padding: 0;
416
+ }
417
+ .lk-control-slider-value {
418
+ font-size: var(--lk-font-size-sm, 12px);
419
+ font-variant-numeric: tabular-nums;
420
+ color: var(--lk-color-text-muted, #666);
421
+ min-width: 3ch;
422
+ text-align: right;
423
+ }
424
+ .lk-control-slider-row {
425
+ display: flex;
426
+ align-items: center;
427
+ gap: var(--lk-spacing-sm, 8px);
428
+ }
429
+ .lk-canvas-stack {
430
+ position: relative;
431
+ overflow: hidden;
432
+ background: var(--lk-color-canvas-bg, #f6f6f6);
433
+ touch-action: none;
434
+ }
435
+ .lk-canvas-stack__canvas {
436
+ position: absolute;
437
+ top: 0;
438
+ left: 0;
439
+ }
440
+ .lk-canvas-stack__overlay {
441
+ position: absolute;
442
+ inset: 0;
443
+ pointer-events: none;
444
+ }
445
+ .lk-canvas-stack__overlay > * {
446
+ pointer-events: auto;
447
+ }
448
+ .lk-layer-list {
449
+ display: flex;
450
+ flex-direction: column;
451
+ gap: 2px;
452
+ padding: var(--lk-spacing-sm, 8px);
453
+ }
454
+ .lk-layer-list__empty {
455
+ color: var(--lk-color-text-muted, #888);
456
+ font-size: var(--lk-font-size-sm, 12px);
457
+ font-style: italic;
458
+ }
459
+ .lk-layer-list__row {
460
+ display: flex;
461
+ align-items: center;
462
+ gap: var(--lk-spacing-sm, 8px);
463
+ padding: 4px 6px;
464
+ border-radius: 3px;
465
+ user-select: none;
466
+ }
467
+ .lk-layer-list__row:hover {
468
+ background: var(--lk-color-hover, rgba(0, 0, 0, 0.04));
469
+ }
470
+ .lk-layer-list__row--dragging {
471
+ background: var(--lk-color-active, rgba(0, 0, 0, 0.08));
472
+ opacity: 0.7;
473
+ }
474
+ .lk-layer-list__row--pinned {
475
+ opacity: 0.7;
476
+ }
477
+ .lk-layer-list__handle {
478
+ cursor: grab;
479
+ color: var(--lk-color-text-muted, #888);
480
+ font-family: monospace;
481
+ }
482
+ .lk-layer-list__handle:active {
483
+ cursor: grabbing;
484
+ }
485
+ .lk-layer-list__lock {
486
+ color: var(--lk-color-text-muted, #888);
487
+ }
488
+ .lk-layer-list__label {
489
+ flex: 1;
490
+ font-size: var(--lk-font-size-sm, 12px);
491
+ }
492
+ .lk-palette {
493
+ display: grid;
494
+ grid-template-columns: repeat(2, 1fr);
495
+ gap: var(--lk-spacing-sm, 8px);
496
+ padding: var(--lk-spacing-sm, 8px);
497
+ }
498
+ .lk-palette__item {
499
+ display: flex;
500
+ align-items: center;
501
+ justify-content: center;
502
+ min-height: 48px;
503
+ padding: var(--lk-spacing-sm, 8px);
504
+ background: var(--lk-color-surface, #fff);
505
+ border: 1px solid var(--lk-color-border, #d0d0d0);
506
+ border-radius: 4px;
507
+ cursor: grab;
508
+ font: inherit;
509
+ color: inherit;
510
+ user-select: none;
511
+ touch-action: none;
512
+ }
513
+ .lk-palette__item:hover {
514
+ background: var(--lk-color-surface-hover, #f4f4f4);
515
+ }
516
+ .lk-palette__item:active {
517
+ cursor: grabbing;
518
+ }
519
+ .lk-palette__label {
520
+ pointer-events: none;
521
+ }
522
+ .lk-drag-ghost {
523
+ position: fixed;
524
+ pointer-events: none;
525
+ z-index: 9999;
526
+ padding: 4px 8px;
527
+ background: var(--lk-color-surface, #fff);
528
+ border: 1px solid var(--lk-color-border, #999);
529
+ border-radius: 4px;
530
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.18);
531
+ font: inherit;
532
+ color: inherit;
533
+ opacity: 0.9;
534
+ }
535
+ .lk-drag-ghost__label {
536
+ white-space: nowrap;
537
+ }
538
+ .lk-property-panel {
539
+ background: var(--lk-bg-elevated);
540
+ border: 1px solid var(--lk-border);
541
+ border-radius: var(--lk-radius-lg, 14px);
542
+ padding: 14px 16px;
543
+ backdrop-filter: blur(var(--lk-glass-blur, 0));
544
+ -webkit-backdrop-filter: blur(var(--lk-glass-blur, 0));
545
+ }
546
+ .lk-property-panel__title {
547
+ font-family: var(--lk-font-display);
548
+ font-weight: var(--lk-font-weight-light, 300);
549
+ font-size: 1.05rem;
550
+ line-height: 1.2;
551
+ letter-spacing: 0.01em;
552
+ color: var(--lk-text);
553
+ margin: 0 0 12px;
554
+ }
555
+ .lk-property-list {
556
+ display: grid;
557
+ grid-template-columns: 1fr 1fr;
558
+ column-gap: 18px;
559
+ row-gap: 6px;
560
+ align-items: stretch;
561
+ }
562
+ .lk-property-list:not(.lk-property-list--pairs) > :not(.lk-property-row--color) {
563
+ grid-column: 1 / -1;
564
+ }
565
+ .lk-property-list--pairs > * {
566
+ min-width: 0;
567
+ }
568
+ .lk-property-list--pairs > .lk-property-list__span,
569
+ .lk-property-list--pairs > .lk-subpanel,
570
+ .lk-property-list--pairs > h3 {
571
+ grid-column: 1 / -1;
572
+ }
573
+ .lk-property-row {
574
+ display: flex;
575
+ flex-direction: column;
576
+ gap: 0;
577
+ min-width: 0;
578
+ }
579
+ .lk-property-row:has(> input[type='range']) {
580
+ justify-content: flex-end;
581
+ }
582
+ .lk-property-row:has(> input[type='range']) > .lk-property-row__label {
583
+ align-items: baseline;
584
+ justify-content: space-between;
585
+ gap: 4px;
586
+ margin-bottom: -4px;
587
+ }
588
+ .lk-property-row > input[type='range'] {
589
+ margin-top: auto;
590
+ }
591
+ .lk-property-row__label {
592
+ font-family: var(--lk-font-display);
593
+ font-weight: var(--lk-font-weight-light, 300);
594
+ font-size: 0.78rem;
595
+ line-height: 1.2;
596
+ color: var(--lk-text-muted);
597
+ text-transform: uppercase;
598
+ letter-spacing: 0.05em;
599
+ display: flex;
600
+ align-items: center;
601
+ gap: 6px;
602
+ }
603
+ .lk-property-row__readout {
604
+ font-style: normal;
605
+ font-weight: var(--lk-font-weight-medium, 500);
606
+ color: var(--lk-accent);
607
+ margin-left: auto;
608
+ }
609
+ .lk-property-row__readout-input {
610
+ font: inherit;
611
+ font-weight: var(--lk-font-weight-medium, 500);
612
+ line-height: 1;
613
+ color: var(--lk-accent);
614
+ background: transparent;
615
+ border: 1px solid transparent;
616
+ border-radius: 3px;
617
+ padding: 1px 0;
618
+ margin: 0;
619
+ width: calc(5em - 24px);
620
+ text-align: right;
621
+ cursor: text;
622
+ outline: none;
623
+ transition: background 80ms ease, border-color 80ms ease;
624
+ -moz-appearance: textfield;
625
+ }
626
+ .lk-property-row__readout-input:hover {
627
+ background: rgba(255, 255, 255, 0.06);
628
+ }
629
+ .lk-property-row__readout-input:focus {
630
+ background: rgba(0, 0, 0, 0.4);
631
+ border-color: var(--lk-accent);
632
+ }
633
+ .lk-property-row__readout-input::-webkit-inner-spin-button,
634
+ .lk-property-row__readout-input::-webkit-outer-spin-button {
635
+ -webkit-appearance: none;
636
+ margin: 0;
637
+ }
638
+ .lk-property-row__readout-group {
639
+ display: inline-block;
640
+ white-space: nowrap;
641
+ }
642
+ .lk-property-row__readout-unit {
643
+ color: var(--lk-text-muted);
644
+ font-size: 0.78em;
645
+ line-height: 1;
646
+ pointer-events: none;
647
+ }
648
+ .lk-property-row__readout-group sup {
649
+ color: var(--lk-text-muted);
650
+ font-size: 0.7em;
651
+ pointer-events: none;
652
+ }
653
+ .lk-property-row input[type='range'] {
654
+ -webkit-appearance: none;
655
+ appearance: none;
656
+ background: transparent;
657
+ width: 100%;
658
+ height: 12px;
659
+ margin: 0;
660
+ padding: 0;
661
+ cursor: pointer;
662
+ }
663
+ .lk-property-row input[type='range']::-webkit-slider-runnable-track {
664
+ height: 4px;
665
+ border-radius: 2px;
666
+ background: color-mix(in srgb, var(--lk-accent) 18%, transparent);
667
+ }
668
+ .lk-property-row input[type='range']::-moz-range-track {
669
+ height: 4px;
670
+ border-radius: 2px;
671
+ background: color-mix(in srgb, var(--lk-accent) 18%, transparent);
672
+ }
673
+ .lk-property-row input[type='range']::-webkit-slider-thumb {
674
+ -webkit-appearance: none;
675
+ appearance: none;
676
+ width: 8px;
677
+ height: 8px;
678
+ border-radius: 50%;
679
+ background: color-mix(in srgb, var(--lk-accent) 70%, transparent);
680
+ border: none;
681
+ margin-top: -2px;
682
+ }
683
+ .lk-property-row input[type='range']::-moz-range-thumb {
684
+ width: 8px;
685
+ height: 8px;
686
+ border-radius: 50%;
687
+ background: color-mix(in srgb, var(--lk-accent) 70%, transparent);
688
+ border: none;
689
+ }
690
+ .lk-property-row--inline {
691
+ flex-direction: row;
692
+ align-items: center;
693
+ gap: 8px;
694
+ }
695
+ .lk-property-row--inline .lk-property-row__label {
696
+ flex: 0 0 auto;
697
+ }
698
+ .lk-property-row--inline > input,
699
+ .lk-property-row--inline > select,
700
+ .lk-property-row--inline > .lk-property-row__toggle {
701
+ flex: 1 1 auto;
702
+ min-width: 0;
703
+ }
704
+ .lk-property-row--inline input[type='range'] {
705
+ width: auto;
706
+ }
707
+ .lk-property-row input[type='text']:not(.lk-property-row__readout-input),
708
+ .lk-property-row input[type='number'] {
709
+ background: rgba(0, 0, 0, 0.35);
710
+ color: var(--lk-text);
711
+ border: 1px solid var(--lk-border);
712
+ border-radius: var(--lk-radius-sm);
713
+ padding: 6px 8px;
714
+ font: 400 0.85rem/1 var(--lk-font);
715
+ }
716
+ .lk-property-row input[type='text']:not(.lk-property-row__readout-input):focus,
717
+ .lk-property-row input[type='number']:focus {
718
+ outline: 1px solid var(--lk-accent);
719
+ }
720
+ .lk-property-row select {
721
+ background: transparent;
722
+ color: var(--lk-text);
723
+ border: 0;
724
+ border-radius: 0;
725
+ padding: 2px 0;
726
+ font: 400 0.85rem/1 var(--lk-font);
727
+ cursor: pointer;
728
+ }
729
+ .lk-property-row select:focus {
730
+ outline: 1px solid var(--lk-accent);
731
+ outline-offset: 2px;
732
+ }
733
+ .lk-property-row--color {
734
+ display: grid;
735
+ grid-template-columns: 1fr auto;
736
+ grid-template-rows: auto;
737
+ align-content: end;
738
+ column-gap: 8px;
739
+ row-gap: 0;
740
+ min-width: 0;
741
+ }
742
+ .lk-property-row--color .lk-property-row__label {
743
+ grid-column: 1;
744
+ grid-row: 1;
745
+ align-self: center;
746
+ flex: initial;
747
+ min-width: 0;
748
+ }
749
+ .lk-property-row--color input[type='color'] {
750
+ grid-column: 2;
751
+ grid-row: 1;
752
+ align-self: center;
753
+ box-sizing: border-box;
754
+ width: 36px;
755
+ height: 18px;
756
+ background: transparent;
757
+ border: 0;
758
+ border-radius: var(--lk-radius-sm);
759
+ padding: 0;
760
+ cursor: pointer;
761
+ flex-shrink: 0;
762
+ }
763
+ .lk-property-row--color input[type='range'].lk-property-row__alpha {
764
+ grid-column: 1 / -1;
765
+ grid-row: 2;
766
+ height: 12px;
767
+ width: 100%;
768
+ margin: 0;
769
+ }
770
+ .lk-property-row--color input[type='range'].lk-property-row__alpha::-webkit-slider-runnable-track {
771
+ background: color-mix(in srgb, var(--lk-accent) 10%, transparent);
772
+ }
773
+ .lk-property-row--color input[type='range'].lk-property-row__alpha::-moz-range-track {
774
+ background: color-mix(in srgb, var(--lk-accent) 10%, transparent);
775
+ }
776
+ .lk-property-row--color.lk-property-row--alpha-disabled input[type='range'].lk-property-row__alpha {
777
+ cursor: not-allowed;
778
+ opacity: 0.55;
779
+ }
780
+ .lk-property-row--color.lk-property-row--alpha-disabled input[type='range'].lk-property-row__alpha::-webkit-slider-runnable-track {
781
+ background: rgba(255, 255, 255, 0.05);
782
+ }
783
+ .lk-property-row--color.lk-property-row--alpha-disabled input[type='range'].lk-property-row__alpha::-moz-range-track {
784
+ background: rgba(255, 255, 255, 0.05);
785
+ }
786
+ .lk-property-row--color.lk-property-row--alpha-disabled input[type='range'].lk-property-row__alpha::-webkit-slider-thumb {
787
+ background: transparent;
788
+ }
789
+ .lk-property-row--color.lk-property-row--alpha-disabled input[type='range'].lk-property-row__alpha::-moz-range-thumb {
790
+ background: transparent;
791
+ }
792
+ .lk-property-row--checkbox {
793
+ flex-direction: row;
794
+ align-items: center;
795
+ gap: 8px;
796
+ cursor: pointer;
797
+ }
798
+ .lk-property-row--checkbox .lk-property-row__label {
799
+ text-transform: none;
800
+ letter-spacing: normal;
801
+ font-size: 0.85rem;
802
+ color: var(--lk-text);
803
+ order: 1;
804
+ }
805
+ .lk-property-row--checkbox input[type='checkbox'] {
806
+ accent-color: var(--lk-accent);
807
+ width: 14px;
808
+ height: 14px;
809
+ cursor: pointer;
810
+ }
811
+ .lk-property-row__toggle {
812
+ display: flex;
813
+ width: 100%;
814
+ border: 1px solid var(--lk-border);
815
+ border-radius: var(--lk-radius-sm);
816
+ overflow: hidden;
817
+ }
818
+ .lk-property-row__toggle-button {
819
+ flex: 1;
820
+ height: 26px;
821
+ padding: 0 8px;
822
+ background: rgba(0, 0, 0, 0.25);
823
+ color: var(--lk-text-muted);
824
+ border: 0;
825
+ border-radius: 0;
826
+ font: 400 0.78rem/1 var(--lk-font);
827
+ cursor: pointer;
828
+ backdrop-filter: none;
829
+ -webkit-backdrop-filter: none;
830
+ }
831
+ .lk-property-row__toggle-button + .lk-property-row__toggle-button {
832
+ border-left: 1px solid var(--lk-border);
833
+ }
834
+ .lk-property-row__toggle-button:hover {
835
+ color: var(--lk-text);
836
+ border-color: var(--lk-border);
837
+ }
838
+ .lk-property-row__toggle-button--selected {
839
+ background: var(--lk-accent);
840
+ color: #0a0a14;
841
+ font-weight: var(--lk-font-weight-medium, 500);
842
+ }
843
+ .lk-property-row__toggle-button--selected:hover {
844
+ color: #0a0a14;
845
+ }
846
+ .lk-subpanel {
847
+ display: grid;
848
+ grid-template-columns: 1fr 1fr;
849
+ column-gap: 10px;
850
+ row-gap: 3px;
851
+ align-items: stretch;
852
+ background: transparent;
853
+ border: 0;
854
+ padding: 0;
855
+ margin: 0;
856
+ }
857
+ .lk-subpanel > * {
858
+ min-width: 0;
859
+ }
860
+ .lk-subpanel > .lk-subpanel__title,
861
+ .lk-subpanel > .lk-property-list__span {
862
+ grid-column: 1 / -1;
863
+ }
864
+ .lk-subpanel__title {
865
+ font-family: var(--lk-font-display);
866
+ font-weight: 400;
867
+ font-size: 0.72rem;
868
+ line-height: 1;
869
+ color: var(--lk-text);
870
+ text-transform: uppercase;
871
+ letter-spacing: 0.08em;
872
+ margin: 0;
873
+ padding: 6px 0 4px;
874
+ display: flex;
875
+ align-items: center;
876
+ gap: 8px;
877
+ }
878
+ .lk-subpanel__title > span {
879
+ flex: 0 0 auto;
880
+ }
881
+ .lk-subpanel__title > hr {
882
+ flex: 1 1 auto;
883
+ border: 0;
884
+ border-top: 1px solid rgba(255, 255, 255, 0.12);
885
+ margin: 0;
886
+ }
887
+ .lk-effect-card {
888
+ background: rgba(0, 0, 0, 0.25);
889
+ border: 1px solid var(--lk-border);
890
+ border-radius: var(--lk-radius-sm);
891
+ display: flex;
892
+ flex-direction: column;
893
+ overflow: hidden;
894
+ transition: background 120ms ease, border-color 120ms ease;
895
+ }
896
+ .lk-effect-card.is-dragging {
897
+ opacity: 0.45;
898
+ }
899
+ .lk-effect-card.is-expanded {
900
+ background: rgba(0, 0, 0, 0.3);
901
+ }
902
+ .lk-effect-card.has-accent {
903
+ --lk-accent: var(--lk-panel-accent);
904
+ background: color-mix(in srgb, var(--lk-panel-accent) 4%, rgba(0, 0, 0, 0.28));
905
+ border-color: color-mix(in srgb, var(--lk-panel-accent) 28%, var(--lk-border));
906
+ border-left-width: 4px;
907
+ border-left-color: var(--lk-panel-accent);
908
+ }
909
+ .lk-effect-card.has-accent.is-expanded {
910
+ background: color-mix(in srgb, var(--lk-panel-accent) 5%, rgba(0, 0, 0, 0.35));
911
+ }
912
+ .lk-effect-card.has-accent .lk-effect-card__head {
913
+ background: color-mix(in srgb, var(--lk-panel-accent) 38%, rgba(0, 0, 0, 0.4));
914
+ }
915
+ .lk-effect-card.has-accent .lk-effect-card__head:hover {
916
+ background: color-mix(in srgb, var(--lk-panel-accent) 48%, rgba(0, 0, 0, 0.35));
917
+ }
918
+ .lk-effect-card__head {
919
+ display: flex;
920
+ align-items: baseline;
921
+ gap: 8px;
922
+ padding: 2px 10px;
923
+ cursor: pointer;
924
+ user-select: none;
925
+ }
926
+ .lk-effect-card__head:hover {
927
+ background: rgba(255, 255, 255, 0.03);
928
+ }
929
+ .lk-effect-card__handle {
930
+ display: inline-flex;
931
+ align-items: center;
932
+ justify-content: center;
933
+ color: var(--lk-text-muted);
934
+ cursor: grab;
935
+ padding: 0 2px;
936
+ }
937
+ .lk-effect-card__handle:active {
938
+ cursor: grabbing;
939
+ }
940
+ .lk-effect-card__index-badge {
941
+ appearance: none;
942
+ border: 0;
943
+ background: none;
944
+ display: inline-flex;
945
+ align-items: baseline;
946
+ justify-content: center;
947
+ min-width: 14px;
948
+ padding: 0 2px;
949
+ color: var(--lk-panel-accent, var(--lk-text-muted));
950
+ font-size: 14px;
951
+ font-weight: 700;
952
+ font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
953
+ line-height: 1;
954
+ }
955
+ .lk-effect-card__title {
956
+ font-family: var(--lk-font-display);
957
+ font-weight: 500;
958
+ font-size: 0.9rem;
959
+ line-height: 1;
960
+ color: var(--lk-text);
961
+ text-transform: uppercase;
962
+ letter-spacing: 0.04em;
963
+ }
964
+ .lk-effect-card__primary {
965
+ font: 400 0.75rem/1 var(--lk-font);
966
+ color: var(--lk-text);
967
+ background: rgba(0, 0, 0, 0.3);
968
+ border: 1px solid var(--lk-border);
969
+ border-radius: var(--lk-radius-sm);
970
+ padding: 2px 6px;
971
+ margin-left: auto;
972
+ }
973
+ .lk-effect-card__head .lk-effect-card__remove,
974
+ .lk-effect-card__head .lk-effect-card__primary + .lk-effect-card__remove {
975
+ margin-left: auto;
976
+ }
977
+ .lk-effect-card__head .lk-effect-card__primary ~ .lk-effect-card__remove {
978
+ margin-left: 4px;
979
+ }
980
+ .lk-effect-card__remove {
981
+ background: transparent;
982
+ color: var(--lk-text-muted);
983
+ border: 1px solid transparent;
984
+ border-radius: 4px;
985
+ width: 22px;
986
+ height: 22px;
987
+ font-size: 0.85rem;
988
+ cursor: pointer;
989
+ display: inline-flex;
990
+ align-items: center;
991
+ justify-content: center;
992
+ }
993
+ .lk-effect-card__remove:hover {
994
+ color: #ffb3a8;
995
+ border-color: rgba(240, 68, 56, 0.4);
996
+ background: rgba(240, 68, 56, 0.08);
997
+ }
998
+ .lk-effect-card__body {
999
+ padding: 4px 12px 12px;
1000
+ border-top: 1px solid var(--lk-border);
1001
+ }
1002
+ .lk-effect-card-list {
1003
+ display: flex;
1004
+ flex-direction: column;
1005
+ gap: 6px;
1006
+ }
1007
+ .lk-effect-card-list__wrap {
1008
+ position: relative;
1009
+ }
1010
+ .lk-effect-card-list__drop-hint {
1011
+ height: 0;
1012
+ border-top: 2px solid var(--lk-accent);
1013
+ border-radius: 2px;
1014
+ margin: 2px 0;
1015
+ box-shadow: 0 0 6px color-mix(in srgb, var(--lk-accent) 60%, transparent);
1016
+ }
1017
+ .lk-effect-card-list__empty {
1018
+ font: var(--lk-font-weight-light, 300) 0.78rem/1.4 var(--lk-font-display);
1019
+ color: var(--lk-text-muted);
1020
+ text-align: center;
1021
+ padding: 16px 12px;
1022
+ border: 1px dashed var(--lk-border);
1023
+ border-radius: var(--lk-radius-sm);
1024
+ }
1025
+ .lk-property-group {
1026
+ grid-column: 1 / -1;
1027
+ background: var(--lk-bg-sunken, rgba(0, 0, 0, 0.18));
1028
+ border-radius: var(--lk-radius-md, 8px);
1029
+ padding: 10px 12px 12px;
1030
+ }
1031
+ .lk-property-group__title {
1032
+ display: grid;
1033
+ grid-template-columns: 1fr auto 1fr;
1034
+ align-items: center;
1035
+ gap: 10px;
1036
+ margin: 0 0 8px;
1037
+ font-family: var(--lk-font-display);
1038
+ font-weight: var(--lk-font-weight-light, 300);
1039
+ font-size: 0.78rem;
1040
+ letter-spacing: 0.08em;
1041
+ text-transform: uppercase;
1042
+ color: var(--lk-text-dim);
1043
+ }
1044
+ .lk-property-group__title hr {
1045
+ border: 0;
1046
+ border-top: 1px solid var(--lk-border);
1047
+ margin: 0;
1048
+ }
1049
+ .lk-property-group__body {
1050
+ display: grid;
1051
+ grid-template-columns: 1fr 1fr;
1052
+ column-gap: 16px;
1053
+ row-gap: 10px;
1054
+ align-items: stretch;
1055
+ }
1056
+ .lk-property-group:not(.lk-property-group--pairs) .lk-property-group__body > :not(.lk-property-row--color) {
1057
+ grid-column: 1 / -1;
1058
+ }
1059
+ .lk-property-group--pairs .lk-property-group__body > * {
1060
+ grid-column: auto;
1061
+ }
1062
+ .lk-property-group--pairs .lk-property-group__body > h3,
1063
+ .lk-property-group--pairs .lk-property-group__body > .lk-property-group__span {
1064
+ grid-column: 1 / -1;
1065
+ }
1066
+ .lk-curve-field {
1067
+ display: grid;
1068
+ gap: 6px;
1069
+ grid-column: 1 / -1;
1070
+ }
1071
+ .lk-curve-field__plot {
1072
+ position: relative;
1073
+ width: 100%;
1074
+ }
1075
+ .lk-curve-field__marks {
1076
+ position: absolute;
1077
+ inset: 0;
1078
+ pointer-events: none;
1079
+ }
1080
+ .lk-curve-field__readouts {
1081
+ display: flex;
1082
+ justify-content: space-between;
1083
+ font-variant-numeric: tabular-nums;
1084
+ font-size: 0.85rem;
1085
+ color: var(--lk-text-dim);
1086
+ }
1087
+ .lk-curve-field__readout {
1088
+ font-style: normal;
1089
+ }
1090
+ .lk-curve-field__actions {
1091
+ display: flex;
1092
+ gap: 6px;
1093
+ justify-self: start;
1094
+ }
1095
+ .lk-curve-field__action {
1096
+ background: transparent;
1097
+ border: 1px solid var(--lk-border);
1098
+ border-radius: var(--lk-radius-sm, 6px);
1099
+ color: var(--lk-text);
1100
+ padding: 4px 10px;
1101
+ font-size: 0.78rem;
1102
+ cursor: pointer;
1103
+ }
1104
+ .lk-curve-field__action:hover {
1105
+ background: var(--lk-bg-elevated);
1106
+ }
1107
+ .lk-layer-stack {
1108
+ display: grid;
1109
+ gap: 8px;
1110
+ }
1111
+ .lk-layer-stack__head {
1112
+ display: flex;
1113
+ align-items: center;
1114
+ justify-content: space-between;
1115
+ gap: 8px;
1116
+ }
1117
+ .lk-layer-stack__title {
1118
+ margin: 0;
1119
+ font-family: var(--lk-font-display);
1120
+ font-weight: var(--lk-font-weight-light, 300);
1121
+ font-size: 1rem;
1122
+ color: var(--lk-text);
1123
+ }
1124
+ .lk-layer-stack__palette {
1125
+ display: flex;
1126
+ gap: 4px;
1127
+ }
1128
+ .lk-layer-stack__add {
1129
+ background: transparent;
1130
+ border: 1px dashed var(--lk-border);
1131
+ border-radius: var(--lk-radius-sm, 6px);
1132
+ padding: 2px 8px;
1133
+ font-size: 0.78rem;
1134
+ color: var(--lk-text-dim);
1135
+ cursor: pointer;
1136
+ }
1137
+ .lk-layer-stack__add:hover {
1138
+ background: var(--lk-bg-elevated);
1139
+ color: var(--lk-text);
1140
+ }
1141
+ .lk-layer-stack__list {
1142
+ display: grid;
1143
+ gap: 6px;
1144
+ }
1145
+ .lk-layer-stack__drop-hint {
1146
+ height: 2px;
1147
+ background: var(--lk-accent, #6cf);
1148
+ border-radius: 1px;
1149
+ }
1150
+ .lk-layer-stack__empty {
1151
+ color: var(--lk-text-dim);
1152
+ font-size: 0.85rem;
1153
+ padding: 8px;
1154
+ text-align: center;
1155
+ }
1156
+ .lk-layer-card {
1157
+ background: var(--lk-bg-elevated);
1158
+ border: 1px solid var(--lk-border);
1159
+ border-radius: var(--lk-radius-md, 8px);
1160
+ overflow: hidden;
1161
+ }
1162
+ .lk-layer-card.has-accent {
1163
+ --lk-accent: var(--lk-layer-card-accent);
1164
+ border-left: 3px solid var(--lk-layer-card-accent);
1165
+ }
1166
+ .lk-layer-card.is-dragging {
1167
+ opacity: 0.5;
1168
+ }
1169
+ .lk-layer-card__head {
1170
+ display: flex;
1171
+ align-items: center;
1172
+ gap: 6px;
1173
+ padding: 6px 8px;
1174
+ }
1175
+ .lk-root .lk-layer-card__handle {
1176
+ background: transparent;
1177
+ border: 0;
1178
+ color: var(--lk-text-dim);
1179
+ padding: 2px 4px;
1180
+ cursor: grab;
1181
+ display: inline-flex;
1182
+ align-items: center;
1183
+ justify-content: center;
1184
+ min-width: 22px;
1185
+ height: 22px;
1186
+ border-radius: var(--lk-radius-sm, 6px);
1187
+ font-weight: 600;
1188
+ font-size: 0.85rem;
1189
+ }
1190
+ .lk-layer-card.has-accent .lk-layer-card__handle {
1191
+ background: var(--lk-layer-card-accent);
1192
+ color: white;
1193
+ }
1194
+ .lk-layer-card__handle:active {
1195
+ cursor: grabbing;
1196
+ }
1197
+ .lk-layer-card__kind,
1198
+ .lk-layer-card__primary {
1199
+ flex: 1;
1200
+ font-size: 0.9rem;
1201
+ }
1202
+ .lk-layer-card__primary {
1203
+ background: transparent;
1204
+ border: 0;
1205
+ color: var(--lk-text);
1206
+ font: inherit;
1207
+ text-transform: uppercase;
1208
+ letter-spacing: 0.06em;
1209
+ }
1210
+ .lk-root .lk-layer-card__remove {
1211
+ background: transparent;
1212
+ border: 0;
1213
+ color: var(--lk-text-dim);
1214
+ font-size: 1rem;
1215
+ cursor: pointer;
1216
+ padding: 2px 6px;
1217
+ }
1218
+ .lk-layer-card__remove:hover {
1219
+ color: var(--lk-text);
1220
+ }
1221
+ .lk-layer-card__body {
1222
+ padding: 8px;
1223
+ border-top: 1px solid var(--lk-border);
1224
+ }