@weasel-js/labkit 1.5.1 → 1.6.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 (160) hide show
  1. package/README.md +3 -7
  2. package/dist/_dts/{CanvasStackContext-CJNMS6mz.d.ts → CanvasStackContext-DQgcH1ny.d.ts} +1 -1
  3. package/dist/_dts/LayerList.d-2c9yup5Y.d.ts +83 -0
  4. package/dist/_dts/{PrefsForm.d-DPy9I8It.d.ts → PrefsRow.d-DFpPIeIC.d.ts} +16 -1
  5. package/dist/_dts/{Select.d-Gwr8fLpK.d.ts → Select.d-BchGMC2Y.d.ts} +129 -12
  6. package/dist/_dts/{frac-B4okC2lX.d.ts → frac-DTRq7Xpb.d.ts} +31 -13
  7. package/dist/_dts/inDialog-D5ZKGjiD.d.ts +23 -0
  8. package/dist/_dts/{index-CSJoj4LC.d.ts → index-B0--8PEM.d.ts} +5 -4
  9. package/dist/_dts/index-DINmCuLA.d.ts +453 -0
  10. package/dist/_dts/number.d-OeQYQoUO.d.ts +28 -0
  11. package/dist/_dts/{types-DzoNY1pO.d.ts → types-B7y8hX1D.d.ts} +6 -6
  12. package/dist/_dts/{usePanZoom-Pzf9f2jh.d.ts → usePanZoom-Bq73pwFe.d.ts} +4 -47
  13. package/dist/_dts/{useTrialState-uLlmaccn.d.ts → useTrialState-CP4jfuKl.d.ts} +1 -1
  14. package/dist/canvas/index.d.ts +6 -5
  15. package/dist/canvas/index.js +1 -1
  16. package/dist/chrome/index.d.ts +5 -4
  17. package/dist/chrome/index.js +7 -7
  18. package/dist/chunk-2RVCB2PT.js +3 -0
  19. package/dist/chunk-2RVCB2PT.js.map +1 -0
  20. package/dist/{chunk-UN4U4P63.js → chunk-3FI7Y4R4.js} +9 -9
  21. package/dist/chunk-3FI7Y4R4.js.map +1 -0
  22. package/dist/{chunk-7PFH3CNM.js → chunk-AWH3SRPW.js} +31 -5
  23. package/dist/chunk-AWH3SRPW.js.map +1 -0
  24. package/dist/{chunk-ZDHY47EV.js → chunk-BVL7Y574.js} +25 -9
  25. package/dist/chunk-BVL7Y574.js.map +1 -0
  26. package/dist/{chunk-IHUVQ3TX.js → chunk-H5VIV7MQ.js} +31 -27
  27. package/dist/chunk-H5VIV7MQ.js.map +1 -0
  28. package/dist/chunk-HFRE4QQV.js +400 -0
  29. package/dist/chunk-HFRE4QQV.js.map +1 -0
  30. package/dist/{chunk-IXTQI7JX.js → chunk-MOLIUNVH.js} +4 -4
  31. package/dist/{chunk-IXTQI7JX.js.map → chunk-MOLIUNVH.js.map} +1 -1
  32. package/dist/{chunk-CEIUBPPW.js → chunk-TT5C5S6R.js} +3 -86
  33. package/dist/chunk-TT5C5S6R.js.map +1 -0
  34. package/dist/chunk-USO6TERP.js +90 -0
  35. package/dist/chunk-USO6TERP.js.map +1 -0
  36. package/dist/{chunk-PHK4W562.js → chunk-VQ47KWD5.js} +3 -3
  37. package/dist/{chunk-PHK4W562.js.map → chunk-VQ47KWD5.js.map} +1 -1
  38. package/dist/chunk-WUJXJC5O.js +14568 -0
  39. package/dist/chunk-WUJXJC5O.js.map +1 -0
  40. package/dist/{chunk-EHGVROVV.js → chunk-ZORVNOKX.js} +6 -25
  41. package/dist/chunk-ZORVNOKX.js.map +1 -0
  42. package/dist/config/index.d.ts +53 -11
  43. package/dist/config/index.js +5 -5
  44. package/dist/controls/index.d.ts +6 -3
  45. package/dist/controls/index.js +4 -4
  46. package/dist/dragdrop/index.d.ts +4 -3
  47. package/dist/index.d.ts +139 -114
  48. package/dist/index.js +470 -479
  49. package/dist/index.js.map +1 -1
  50. package/dist/layers/index.d.ts +6 -35
  51. package/dist/layers/index.js +2 -3
  52. package/dist/loupe/index.d.ts +6 -5
  53. package/dist/passthrough/weasel-ui.d.ts +421 -215
  54. package/dist/passthrough/weasel-ui.js +1 -1
  55. package/dist/primitives/index.d.ts +2 -13
  56. package/dist/primitives/index.js +4 -4
  57. package/dist/state/index.d.ts +6 -5
  58. package/dist/state/index.js +5 -5
  59. package/dist/styles.css +410 -190
  60. package/dist/undo/index.d.ts +4 -3
  61. package/package.json +9 -13
  62. package/src/annotations/frac.test.ts +7 -0
  63. package/src/annotations/paint.test.ts +21 -0
  64. package/src/annotations/paint.ts +12 -0
  65. package/src/annotations/store.test.ts +31 -0
  66. package/src/annotations/types.ts +3 -2
  67. package/src/canvas/Stage.test.tsx +18 -0
  68. package/src/canvas/index.ts +0 -9
  69. package/src/chrome/labTypes.ts +1 -1
  70. package/src/chrome/regions/PaletteRegion.test.tsx +18 -0
  71. package/src/chrome/regions/PaletteRegion.tsx +5 -4
  72. package/src/chrome/regions/SidebarRegion.less +197 -0
  73. package/src/chrome/regions/SidebarRegion.test.tsx +20 -0
  74. package/src/chrome/regions/SidebarRegion.tsx +7 -2
  75. package/src/chrome/regions/TitleBarRegion.tsx +1 -1
  76. package/src/chrome/types.ts +13 -4
  77. package/src/config/autoConfig.ts +2 -2
  78. package/src/config/builder.ts +23 -5
  79. package/src/config/entry.test.ts +8 -0
  80. package/src/config/index.ts +2 -0
  81. package/src/config/rules.ts +2 -0
  82. package/src/config/sectionTree.test.ts +146 -0
  83. package/src/config/sectionTree.ts +124 -0
  84. package/src/config/types.ts +4 -4
  85. package/src/controls/AutoControls.stories.tsx +6 -6
  86. package/src/controls/ControlPanel.less +27 -0
  87. package/src/controls/ControlPanel.stories.tsx +95 -1
  88. package/src/controls/ControlPanel.test.tsx +82 -112
  89. package/src/controls/ControlPanel.tsx +159 -396
  90. package/src/controls/inDialog.test.tsx +82 -0
  91. package/src/controls/inDialog.tsx +46 -0
  92. package/src/controls/index.ts +1 -0
  93. package/src/index.test.ts +0 -2
  94. package/src/index.ts +14 -35
  95. package/src/instrument/types.ts +5 -2
  96. package/src/lab/Lab.nebula.test.tsx +31 -0
  97. package/src/lab/Lab.tsx +57 -18
  98. package/src/lab/LabBoundary.test.tsx +66 -0
  99. package/src/lab/LabBoundary.tsx +56 -0
  100. package/src/lab/LabHeader.tsx +4 -23
  101. package/src/lab/LabRoot.tsx +2 -3
  102. package/src/lab/LabShell.less +0 -1
  103. package/src/lab/LabShell.stories.tsx +15 -0
  104. package/src/lab/LabShell.test.tsx +18 -0
  105. package/src/lab/LabShell.tsx +14 -1
  106. package/src/lab/LabSwitcher.less +1 -1
  107. package/src/lab/LabSwitcher.test.tsx +41 -0
  108. package/src/lab/LabSwitcher.tsx +30 -8
  109. package/src/lab/index.ts +1 -0
  110. package/src/layers/AGENTS.md +18 -74
  111. package/src/layers/index.ts +4 -2
  112. package/src/passthrough/weasel-ui.ts +25 -10
  113. package/src/primitives/FpsMeter.less +6 -1
  114. package/src/primitives/FpsMeter.test.tsx +12 -4
  115. package/src/primitives/FpsMeter.tsx +6 -1
  116. package/src/primitives/JobProgress.stories.tsx +1 -1
  117. package/src/primitives/StatusBar.less +6 -0
  118. package/src/primitives/index.ts +0 -2
  119. package/src/specimen/Specimen.tsx +42 -56
  120. package/src/state/types.ts +8 -2
  121. package/src/state/view.test.ts +4 -4
  122. package/src/styles.less +4 -2
  123. package/src/theme/Interstellar.stories.tsx +8 -9
  124. package/src/theme/base.less +3 -20
  125. package/src/theme/interstellar.test.ts +6 -3
  126. package/src/theme/interstellar.theme.json +0 -56
  127. package/src/theme/interstellar.ts +2 -2
  128. package/src/trial/Trial.canvas.test.tsx +9 -5
  129. package/src/trial/Trial.config.test.tsx +1 -1
  130. package/src/trial/Trial.tsx +30 -8
  131. package/dist/_dts/index-BNdz-tNd.d.ts +0 -423
  132. package/dist/chunk-7PFH3CNM.js.map +0 -1
  133. package/dist/chunk-CEIUBPPW.js.map +0 -1
  134. package/dist/chunk-EH7UEQV7.js +0 -590
  135. package/dist/chunk-EH7UEQV7.js.map +0 -1
  136. package/dist/chunk-EHGVROVV.js.map +0 -1
  137. package/dist/chunk-IHUVQ3TX.js.map +0 -1
  138. package/dist/chunk-MDVTK5U3.js +0 -170
  139. package/dist/chunk-MDVTK5U3.js.map +0 -1
  140. package/dist/chunk-PJ7WEQBJ.js +0 -18
  141. package/dist/chunk-PJ7WEQBJ.js.map +0 -1
  142. package/dist/chunk-T3EC2DXD.js +0 -12628
  143. package/dist/chunk-T3EC2DXD.js.map +0 -1
  144. package/dist/chunk-UN4U4P63.js.map +0 -1
  145. package/dist/chunk-ZDHY47EV.js.map +0 -1
  146. package/dist/ui/layers/index.d.ts +0 -66
  147. package/dist/ui/layers/index.js +0 -3
  148. package/dist/ui/layers/index.js.map +0 -1
  149. package/src/canvas/useOrbit.test.ts +0 -167
  150. package/src/canvas/useOrbit.ts +0 -156
  151. package/src/lab/useSystemMode.ts +0 -30
  152. package/src/layers/LayerList.less +0 -93
  153. package/src/layers/LayerList.stories.tsx +0 -66
  154. package/src/layers/LayerList.test.tsx +0 -232
  155. package/src/layers/LayerList.tsx +0 -268
  156. package/src/primitives/Sidebar.less +0 -112
  157. package/src/primitives/Sidebar.stories.tsx +0 -38
  158. package/src/primitives/Sidebar.test.tsx +0 -74
  159. package/src/primitives/Sidebar.tsx +0 -35
  160. package/src/ui/layers/index.ts +0 -5
@@ -1,38 +0,0 @@
1
- import type { Meta, StoryObj } from '@weasel-js/forge';
2
- import { useState } from 'react';
3
- import { Sidebar } from './Sidebar';
4
-
5
- const meta: Meta<typeof Sidebar> = {
6
- title: 'labkit/Primitives/Sidebar',
7
- component: Sidebar,
8
- };
9
- export default meta;
10
-
11
- type Story = StoryObj<typeof Sidebar>;
12
-
13
- export const Default: Story = {
14
- render: () => (
15
- <div style={{ display: 'flex', height: 400 }}>
16
- <div style={{ flex: 1 }}>main content area</div>
17
- <Sidebar title="Controls">
18
- <p>One slider here</p>
19
- <p>Another slider</p>
20
- </Sidebar>
21
- </div>
22
- ),
23
- };
24
-
25
- export const Collapsible: Story = {
26
- render: function Render() {
27
- const [collapsed, setCollapsed] = useState(false);
28
- return (
29
- <div style={{ display: 'flex', height: 400 }}>
30
- <div style={{ flex: 1, padding: 16 }}>main content area</div>
31
- <Sidebar title="Controls" collapsed={collapsed} onToggle={() => setCollapsed((c) => !c)}>
32
- <p>One slider here</p>
33
- <p>Another slider</p>
34
- </Sidebar>
35
- </div>
36
- );
37
- },
38
- };
@@ -1,74 +0,0 @@
1
- import { render, screen } from '@testing-library/react';
2
- import { describe, expect, test } from 'vitest';
3
- import { Sidebar } from './Sidebar';
4
-
5
- describe('Sidebar', () => {
6
- test('renders children when expanded (default)', () => {
7
- render(
8
- <Sidebar>
9
- <p>content</p>
10
- </Sidebar>,
11
- );
12
- expect(screen.getByText('content')).toBeInTheDocument();
13
- });
14
-
15
- test('renders title when provided', () => {
16
- render(
17
- <Sidebar title="Controls">
18
- <p>x</p>
19
- </Sidebar>,
20
- );
21
- expect(screen.getByText('Controls')).toBeInTheDocument();
22
- });
23
-
24
- test('marks the sidebar collapsed and nests body inside the collapsed root', () => {
25
- const { container } = render(
26
- <Sidebar collapsed>
27
- <p>content</p>
28
- </Sidebar>,
29
- );
30
- const root = container.querySelector('.lk-sidebar');
31
- const body = container.querySelector('.lk-sidebar-body');
32
- expect(root).not.toBeNull();
33
- expect(body).not.toBeNull();
34
- expect(root?.classList.contains('lk-sidebar--collapsed')).toBe(true);
35
- // Body is still rendered (children stay in DOM), but lives inside the collapsed
36
- // root so the CSS rule `.lk-sidebar--collapsed .lk-sidebar-body { display:none }` applies.
37
- expect(body?.parentElement).toBe(root);
38
- expect(body?.textContent).toBe('content');
39
- });
40
-
41
- test('toggle button calls onToggle when clicked', () => {
42
- let toggled = false;
43
- render(
44
- <Sidebar
45
- title="C"
46
- onToggle={() => {
47
- toggled = true;
48
- }}
49
- >
50
- <p>x</p>
51
- </Sidebar>,
52
- );
53
- screen.getByRole('button', { name: /collapse|expand/i }).click();
54
- expect(toggled).toBe(true);
55
- });
56
-
57
- test('shows expand label when collapsed', () => {
58
- render(
59
- <Sidebar title="C" collapsed onToggle={() => {}}>
60
- <p>x</p>
61
- </Sidebar>,
62
- );
63
- expect(screen.getByRole('button', { name: /expand/i })).toBeInTheDocument();
64
- });
65
-
66
- test('shows collapse label when expanded', () => {
67
- render(
68
- <Sidebar title="C" onToggle={() => {}}>
69
- <p>x</p>
70
- </Sidebar>,
71
- );
72
- expect(screen.getByRole('button', { name: /collapse/i })).toBeInTheDocument();
73
- });
74
- });
@@ -1,35 +0,0 @@
1
- import type { ReactNode } from 'react';
2
-
3
- /** Props for `<Sidebar>`. */
4
- export interface SidebarProps {
5
- children: ReactNode;
6
- title?: string;
7
- collapsed?: boolean;
8
- onToggle?: () => void;
9
- }
10
-
11
- /** A collapsible side panel with an optional title. Collapse state is the
12
- * caller's to hold. */
13
- export function Sidebar({ children, title, collapsed = false, onToggle }: SidebarProps) {
14
- const className = `lk-sidebar${collapsed ? ' lk-sidebar--collapsed' : ''}`;
15
- return (
16
- <aside className={className}>
17
- {(title || onToggle) && (
18
- <div className="lk-sidebar-header">
19
- {title && <span className="lk-sidebar-title">{title}</span>}
20
- {onToggle && (
21
- <button
22
- type="button"
23
- className="lk-sidebar-toggle"
24
- onClick={onToggle}
25
- aria-label={collapsed ? 'Expand sidebar' : 'Collapse sidebar'}
26
- >
27
- {collapsed ? '›' : '‹'}
28
- </button>
29
- )}
30
- </div>
31
- )}
32
- <div className="lk-sidebar-body">{children}</div>
33
- </aside>
34
- );
35
- }
@@ -1,5 +0,0 @@
1
- // LayerStack lives in `@weasel-js/ui` now; labkit re-exports it so existing
2
- // `@weasel-js/labkit/ui/layers` imports keep resolving. Named, not `export *`
3
- // — a star re-export of an external package emits no binding in the bundle.
4
- export type { LayerStackItem, LayerStackProps } from '@weasel-js/ui';
5
- export { LayerStack } from '@weasel-js/ui';