@x1a0f3n9/dsh-client-ui-dockkit 0.1.5-rc.3
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.
- package/LICENSE +21 -0
- package/README.i18n.yaml +6 -0
- package/README.md +107 -0
- package/README.zh.md +107 -0
- package/lib/components/dockkit.module.css +731 -0
- package/lib/index.js +3133 -0
- package/lib/types/components/DockSurface.d.ts +60 -0
- package/lib/types/components/FloatLayer.d.ts +17 -0
- package/lib/types/components/PaneTree.d.ts +18 -0
- package/lib/types/components/TabMenu.d.ts +17 -0
- package/lib/types/components/TabPanel.d.ts +12 -0
- package/lib/types/components/TabTitle.d.ts +6 -0
- package/lib/types/components/measure.d.ts +40 -0
- package/lib/types/components/pointer.d.ts +47 -0
- package/lib/types/components/render.d.ts +47 -0
- package/lib/types/contract/adapter.d.ts +94 -0
- package/lib/types/contract/types.d.ts +255 -0
- package/lib/types/engine/constraints.d.ts +61 -0
- package/lib/types/engine/controller.d.ts +191 -0
- package/lib/types/engine/geometry.d.ts +162 -0
- package/lib/types/engine/initial.d.ts +36 -0
- package/lib/types/engine/operations.d.ts +26 -0
- package/lib/types/engine/planner.d.ts +187 -0
- package/lib/types/engine/sequence.d.ts +131 -0
- package/lib/types/engine/tree.d.ts +180 -0
- package/lib/types/index.d.ts +38 -0
- package/package.json +44 -0
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Linear operation history over `applyOp`. Recording is total — every operation
|
|
3
|
+
* lands in the sequence, focus moves included — and grouped by intent: the
|
|
4
|
+
* operations one gesture or command produced form one entry, so stepping lands
|
|
5
|
+
* on a point the user actually stopped at. Stepping is coarser still across
|
|
6
|
+
* focus: a run of consecutive focus-only entries undoes and redoes as one step.
|
|
7
|
+
*
|
|
8
|
+
* Redoing re-applies the recorded operations; undoing applies the inverses that
|
|
9
|
+
* were captured when they ran, so both directions stay exact. A new entry after
|
|
10
|
+
* an undo drops the redo branch.
|
|
11
|
+
*
|
|
12
|
+
* Two shapes, one implementation. `record`/`stepBack`/`stepForward` are pure
|
|
13
|
+
* functions over a plain `History`, which is what an embedder holding its layout
|
|
14
|
+
* in an external store needs; `Sequencer` is a thin mutable wrapper over exactly
|
|
15
|
+
* those functions, for an embedder that would rather hold the state here.
|
|
16
|
+
*/
|
|
17
|
+
import type { LayoutOp, LayoutState } from '../contract/types.ts';
|
|
18
|
+
/** One recorded intent: its operations, and the operations that undo them all. */
|
|
19
|
+
export interface HistoryEntry {
|
|
20
|
+
readonly ops: readonly LayoutOp[];
|
|
21
|
+
/** Already ordered for application: the last operation's inverse comes first. */
|
|
22
|
+
readonly inverse: readonly LayoutOp[];
|
|
23
|
+
}
|
|
24
|
+
/** A recorded sequence and how much of it is applied. Plain data, safe to store. */
|
|
25
|
+
export interface History {
|
|
26
|
+
readonly entries: readonly HistoryEntry[];
|
|
27
|
+
/** How many entries are applied; entries beyond it are the redo branch. */
|
|
28
|
+
readonly cursor: number;
|
|
29
|
+
}
|
|
30
|
+
/** A sequence that has recorded nothing. */
|
|
31
|
+
export declare const EMPTY_HISTORY: History;
|
|
32
|
+
/** A history and the state it produced, returned together so neither can drift. */
|
|
33
|
+
export interface HistoryStep {
|
|
34
|
+
readonly history: History;
|
|
35
|
+
readonly state: LayoutState;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Whether an operation only moves focus, and so merges into its neighbours' undo step.
|
|
39
|
+
* @param op - the operation.
|
|
40
|
+
* @returns whether its type is a `FocusOpType`.
|
|
41
|
+
*/
|
|
42
|
+
export declare function isFocusOp(op: LayoutOp): boolean;
|
|
43
|
+
/**
|
|
44
|
+
* Whether a step back exists.
|
|
45
|
+
* @param history - the sequence so far.
|
|
46
|
+
* @returns whether any entry is applied.
|
|
47
|
+
*/
|
|
48
|
+
export declare function canStepBack(history: History): boolean;
|
|
49
|
+
/**
|
|
50
|
+
* Whether a step forward exists.
|
|
51
|
+
* @param history - the sequence so far.
|
|
52
|
+
* @returns whether a redo branch remains.
|
|
53
|
+
*/
|
|
54
|
+
export declare function canStepForward(history: History): boolean;
|
|
55
|
+
/**
|
|
56
|
+
* The operations a sequence has recorded, redo branch included.
|
|
57
|
+
* @param history - the sequence so far.
|
|
58
|
+
* @returns every entry's operations, in recorded order.
|
|
59
|
+
*/
|
|
60
|
+
export declare function recordedOps(history: History): readonly LayoutOp[];
|
|
61
|
+
/**
|
|
62
|
+
* Apply one intent's operations and record them as one entry, dropping any redo
|
|
63
|
+
* branch first. An intent with no operations records nothing.
|
|
64
|
+
* @param history - the sequence so far.
|
|
65
|
+
* @param state - the state the operations apply to.
|
|
66
|
+
* @param ops - the intent's operations, in application order.
|
|
67
|
+
* @returns the extended history and the state after the operations.
|
|
68
|
+
* @throws when an operation is invalid against the state it reaches; nothing is
|
|
69
|
+
* recorded.
|
|
70
|
+
*/
|
|
71
|
+
export declare function record(history: History, state: LayoutState, ops: readonly LayoutOp[]): HistoryStep;
|
|
72
|
+
/**
|
|
73
|
+
* Step back one intent, or one whole run of consecutive focus-only intents.
|
|
74
|
+
* @param history - the sequence so far.
|
|
75
|
+
* @param state - the current state.
|
|
76
|
+
* @returns the stepped-back pair, or `undefined` when nothing can be undone.
|
|
77
|
+
*/
|
|
78
|
+
export declare function stepBack(history: History, state: LayoutState): HistoryStep | undefined;
|
|
79
|
+
/**
|
|
80
|
+
* Step forward over the intents the matching step back undid.
|
|
81
|
+
* @param history - the sequence so far.
|
|
82
|
+
* @param state - the current state.
|
|
83
|
+
* @returns the stepped-forward pair, or `undefined` when nothing can be redone.
|
|
84
|
+
*/
|
|
85
|
+
export declare function stepForward(history: History, state: LayoutState): HistoryStep | undefined;
|
|
86
|
+
/** Layout state plus its history cursor, held here instead of by the embedder. */
|
|
87
|
+
export declare class Sequencer {
|
|
88
|
+
private current;
|
|
89
|
+
private recorded;
|
|
90
|
+
/** @param initial - state the sequence replays from; never mutated. */
|
|
91
|
+
constructor(initial: LayoutState);
|
|
92
|
+
/** Current state. */
|
|
93
|
+
get state(): LayoutState;
|
|
94
|
+
/** The recorded sequence as plain data. */
|
|
95
|
+
get history(): History;
|
|
96
|
+
/** The whole recorded sequence, including a redo branch that is not applied. */
|
|
97
|
+
get ops(): readonly LayoutOp[];
|
|
98
|
+
/** How many recorded operations are currently applied. */
|
|
99
|
+
get cursor(): number;
|
|
100
|
+
/** Whether a step back exists. */
|
|
101
|
+
get canUndo(): boolean;
|
|
102
|
+
/** Whether a step forward exists. */
|
|
103
|
+
get canRedo(): boolean;
|
|
104
|
+
/**
|
|
105
|
+
* Apply and record one operation as its own entry, dropping any redo branch first.
|
|
106
|
+
* @param op - the operation to record.
|
|
107
|
+
* @returns the state after it.
|
|
108
|
+
* @throws when the operation is invalid against the current state; the
|
|
109
|
+
* sequence is left untouched.
|
|
110
|
+
*/
|
|
111
|
+
dispatch(op: LayoutOp): LayoutState;
|
|
112
|
+
/**
|
|
113
|
+
* Apply and record one intent's operations as one entry, dropping any redo
|
|
114
|
+
* branch first.
|
|
115
|
+
* @param ops - the intent's operations; none records nothing.
|
|
116
|
+
* @returns the state after them.
|
|
117
|
+
* @throws when an operation is invalid; the sequence is left untouched.
|
|
118
|
+
*/
|
|
119
|
+
dispatchAll(ops: readonly LayoutOp[]): LayoutState;
|
|
120
|
+
/**
|
|
121
|
+
* Step back one intent, or one whole run of consecutive focus-only intents.
|
|
122
|
+
* @returns false when there is nothing to undo.
|
|
123
|
+
*/
|
|
124
|
+
undo(): boolean;
|
|
125
|
+
/**
|
|
126
|
+
* Step forward over the intents the matching undo stepped back.
|
|
127
|
+
* @returns false when there is nothing to redo.
|
|
128
|
+
*/
|
|
129
|
+
redo(): boolean;
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=sequence.d.ts.map
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure tree helpers over `LayoutState`. Every reader throws on a dangling id
|
|
3
|
+
* (the operation vocabulary is closed, so a miss is a caller defect), and every
|
|
4
|
+
* writer returns a new state that keeps untouched nodes at their old identity.
|
|
5
|
+
*/
|
|
6
|
+
import type { FloatRect, LayoutNode, LayoutState, NodeId, PaneId, PaneNode, SplitNode, TabId, TabRecord } from '../contract/types.ts';
|
|
7
|
+
/**
|
|
8
|
+
* Reject an unhandled discriminant at the end of a closed switch.
|
|
9
|
+
* @param value - the discriminant the switch did not handle.
|
|
10
|
+
* @param what - the union being switched on, for the message.
|
|
11
|
+
* @returns never; it throws.
|
|
12
|
+
*/
|
|
13
|
+
export declare function assertNever(value: never, what: string): never;
|
|
14
|
+
/**
|
|
15
|
+
* Read any node.
|
|
16
|
+
* @param state - current layout.
|
|
17
|
+
* @param id - the node.
|
|
18
|
+
* @returns the split or pane.
|
|
19
|
+
* @throws when `id` is not in the tree.
|
|
20
|
+
*/
|
|
21
|
+
export declare function getNode(state: LayoutState, id: NodeId): LayoutNode;
|
|
22
|
+
/**
|
|
23
|
+
* Read a pane.
|
|
24
|
+
* @param state - current layout.
|
|
25
|
+
* @param id - the pane.
|
|
26
|
+
* @returns the pane node.
|
|
27
|
+
* @throws when `id` is missing or names a split.
|
|
28
|
+
*/
|
|
29
|
+
export declare function getPane(state: LayoutState, id: NodeId): PaneNode;
|
|
30
|
+
/**
|
|
31
|
+
* Read a split.
|
|
32
|
+
* @param state - current layout.
|
|
33
|
+
* @param id - the split.
|
|
34
|
+
* @returns the split node.
|
|
35
|
+
* @throws when `id` is missing or names a pane.
|
|
36
|
+
*/
|
|
37
|
+
export declare function getSplit(state: LayoutState, id: NodeId): SplitNode;
|
|
38
|
+
/**
|
|
39
|
+
* Read a tab record.
|
|
40
|
+
* @param state - current layout.
|
|
41
|
+
* @param id - the tab.
|
|
42
|
+
* @returns the record.
|
|
43
|
+
* @throws when `id` is not open.
|
|
44
|
+
*/
|
|
45
|
+
export declare function getTab(state: LayoutState, id: TabId): TabRecord;
|
|
46
|
+
/**
|
|
47
|
+
* A floating pane's rectangle.
|
|
48
|
+
* @param pane - the pane.
|
|
49
|
+
* @returns its viewport rectangle.
|
|
50
|
+
* @throws when `pane` is docked.
|
|
51
|
+
*/
|
|
52
|
+
export declare function floatRect(pane: PaneNode): FloatRect;
|
|
53
|
+
/**
|
|
54
|
+
* A floating pane's position in the z order.
|
|
55
|
+
* @param state - current layout.
|
|
56
|
+
* @param id - the floating pane.
|
|
57
|
+
* @returns its index in `floats`, bottom first.
|
|
58
|
+
* @throws when `id` is not listed in `floats`.
|
|
59
|
+
*/
|
|
60
|
+
export declare function floatIndex(state: LayoutState, id: PaneId): number;
|
|
61
|
+
/**
|
|
62
|
+
* The one tab a pane holds.
|
|
63
|
+
* @param pane - the pane.
|
|
64
|
+
* @returns its tab's id.
|
|
65
|
+
* @throws when `pane` holds any other number of tabs.
|
|
66
|
+
*/
|
|
67
|
+
export declare function onlyTabId(pane: PaneNode): TabId;
|
|
68
|
+
/**
|
|
69
|
+
* The split holding a node.
|
|
70
|
+
* @param state - current layout.
|
|
71
|
+
* @param id - the node.
|
|
72
|
+
* @returns its parent split, or `undefined` for the docked root and floating panes.
|
|
73
|
+
*/
|
|
74
|
+
export declare function findParent(state: LayoutState, id: NodeId): SplitNode | undefined;
|
|
75
|
+
/**
|
|
76
|
+
* The pane holding a tab.
|
|
77
|
+
* @param state - current layout.
|
|
78
|
+
* @param tabId - the tab.
|
|
79
|
+
* @returns the pane whose strip lists it.
|
|
80
|
+
* @throws when no pane lists it.
|
|
81
|
+
*/
|
|
82
|
+
export declare function findTabPane(state: LayoutState, tabId: TabId): PaneNode;
|
|
83
|
+
/**
|
|
84
|
+
* Docked pane ids in visual order (depth-first through the split tree).
|
|
85
|
+
* @param state - current layout.
|
|
86
|
+
* @returns every docked pane's id; floating panes are absent.
|
|
87
|
+
*/
|
|
88
|
+
export declare function dockPaneIds(state: LayoutState): PaneId[];
|
|
89
|
+
/**
|
|
90
|
+
* Scale `sizes` so they sum to 1. Input that already sums to 1 is copied
|
|
91
|
+
* unchanged, so restoring recorded sizes never drifts.
|
|
92
|
+
* @param sizes - fractions or any positive weights.
|
|
93
|
+
* @returns the fractions, summing to 1.
|
|
94
|
+
* @throws when the input cannot be normalized.
|
|
95
|
+
*/
|
|
96
|
+
export declare function normalizeSizes(sizes: readonly number[]): number[];
|
|
97
|
+
/**
|
|
98
|
+
* `Object.entries` keeping the record's own key type: the keys were written from
|
|
99
|
+
* ids, so reading them back as ids is exact.
|
|
100
|
+
* @param record - an id-keyed record.
|
|
101
|
+
* @returns its entries with typed keys.
|
|
102
|
+
*/
|
|
103
|
+
export declare function entriesOf<K extends string, V>(record: Readonly<Record<K, V>>): readonly (readonly [K, V])[];
|
|
104
|
+
/**
|
|
105
|
+
* `Object.keys` keeping the record's own key type; see {@link entriesOf}.
|
|
106
|
+
* @param record - an id-keyed record.
|
|
107
|
+
* @returns its keys, typed.
|
|
108
|
+
*/
|
|
109
|
+
export declare function keysOf<K extends string>(record: Readonly<Record<K, unknown>>): readonly K[];
|
|
110
|
+
/**
|
|
111
|
+
* Replace or delete nodes.
|
|
112
|
+
* @param state - current layout.
|
|
113
|
+
* @param updates - nodes by id; a `null` update deletes that id.
|
|
114
|
+
* @returns the layout with those nodes replaced; untouched nodes keep their identity.
|
|
115
|
+
*/
|
|
116
|
+
export declare function withNodes(state: LayoutState, updates: Readonly<Record<NodeId, LayoutNode | null>>): LayoutState;
|
|
117
|
+
/**
|
|
118
|
+
* Replace or delete tab records.
|
|
119
|
+
* @param state - current layout.
|
|
120
|
+
* @param updates - records by id; a `null` update deletes that id.
|
|
121
|
+
* @returns the layout with those records replaced; untouched records keep their identity.
|
|
122
|
+
*/
|
|
123
|
+
export declare function withTabs(state: LayoutState, updates: Readonly<Record<TabId, TabRecord | null>>): LayoutState;
|
|
124
|
+
/**
|
|
125
|
+
* Insert a value into a list.
|
|
126
|
+
* @param items - the list.
|
|
127
|
+
* @param index - the slot, clamped to the list's bounds.
|
|
128
|
+
* @param value - what to insert.
|
|
129
|
+
* @returns a new list with the value at the slot.
|
|
130
|
+
*/
|
|
131
|
+
export declare function insertAt<T>(items: readonly T[], index: number, value: T): T[];
|
|
132
|
+
/**
|
|
133
|
+
* Remove one entry from a list.
|
|
134
|
+
* @param items - the list.
|
|
135
|
+
* @param index - the entry to drop.
|
|
136
|
+
* @returns a new list without it.
|
|
137
|
+
*/
|
|
138
|
+
export declare function removeAt<T>(items: readonly T[], index: number): T[];
|
|
139
|
+
/**
|
|
140
|
+
* Which tab a pane focuses after one leaves it.
|
|
141
|
+
* @param tabs - the strip before the removal.
|
|
142
|
+
* @param removedIndex - the leaving tab's slot.
|
|
143
|
+
* @returns the previous neighbour when one exists, otherwise the next, otherwise `undefined`.
|
|
144
|
+
*/
|
|
145
|
+
export declare function neighbourTabId(tabs: readonly TabId[], removedIndex: number): TabId | undefined;
|
|
146
|
+
/**
|
|
147
|
+
* Copy a pane with a new tab list.
|
|
148
|
+
* @param pane - the pane.
|
|
149
|
+
* @param tabs - its new strip.
|
|
150
|
+
* @param activeTabId - the active tab, which the caller keeps consistent with `tabs`.
|
|
151
|
+
* @returns the copied pane.
|
|
152
|
+
*/
|
|
153
|
+
export declare function paneWithTabs(pane: PaneNode, tabs: readonly TabId[], activeTabId: TabId | undefined): PaneNode;
|
|
154
|
+
/**
|
|
155
|
+
* Swap a node for another in its parent's slot, or make the replacement the docked root.
|
|
156
|
+
* @param state - current layout.
|
|
157
|
+
* @param targetId - the node to swap out.
|
|
158
|
+
* @param replacementId - the node taking its slot.
|
|
159
|
+
* @returns the layout with the slot rewritten.
|
|
160
|
+
* @throws when `targetId` is neither rooted nor parented.
|
|
161
|
+
*/
|
|
162
|
+
export declare function replaceInParent(state: LayoutState, targetId: NodeId, replacementId: NodeId): LayoutState;
|
|
163
|
+
/**
|
|
164
|
+
* The first docked pane in visual order: the docked root, or the first leaf
|
|
165
|
+
* under it. Focus falls back here when the focused pane is removed, and a new
|
|
166
|
+
* tab lands here when the focused pane floats.
|
|
167
|
+
* @param state - current layout.
|
|
168
|
+
* @returns the first docked pane's id.
|
|
169
|
+
*/
|
|
170
|
+
export declare function firstDockPaneId(state: LayoutState): PaneId;
|
|
171
|
+
/**
|
|
172
|
+
* The docked pane in the top-right corner: from the root, the last child of
|
|
173
|
+
* every row split and the first child of every column split. Its tab strip is
|
|
174
|
+
* where an embedder's surface-wide controls sit, so they read as the surface's
|
|
175
|
+
* own top-right corner however the tree is divided.
|
|
176
|
+
* @param state - current layout.
|
|
177
|
+
* @returns the top-right docked pane's id.
|
|
178
|
+
*/
|
|
179
|
+
export declare function topRightPaneId(state: LayoutState): PaneId;
|
|
180
|
+
//# sourceMappingURL=tree.d.ts.map
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A docking layout kit: a split tree of tabbed panes with invertible operations,
|
|
3
|
+
* and the React components that render and drive it.
|
|
4
|
+
*
|
|
5
|
+
* Two layers, and the boundary between them is the point of the package. The
|
|
6
|
+
* engine (`applyOp`, `Sequencer`, `DockController`) is pure TypeScript with no
|
|
7
|
+
* React, no DOM, and no host concepts; replaying a recorded sequence over the
|
|
8
|
+
* same initial state reproduces the same tree, because every operation carries
|
|
9
|
+
* the ids it creates. The components render a layout snapshot and report settled
|
|
10
|
+
* intents — one per gesture, never a drag frame — so the embedder's sequence
|
|
11
|
+
* stays the single source of truth.
|
|
12
|
+
*
|
|
13
|
+
* Nothing host-specific lives here: rendered strings arrive as `DockLabels`, tab
|
|
14
|
+
* bodies as a `TabRenderer`, and a tab's `kind` is an opaque string this kit
|
|
15
|
+
* never interprets.
|
|
16
|
+
*
|
|
17
|
+
* @module
|
|
18
|
+
*/
|
|
19
|
+
export type { ApplyResult, DockMode, DockZone, FloatRect, LayoutNode, LayoutOp, LayoutState, NodeId, PaneAttachment, PaneHost, PaneId, PaneNode, SplitAxis, SplitDirection, SplitId, SplitNode, TabId, TabRecord, } from './contract/types.ts';
|
|
20
|
+
export { applyOp, replay } from './engine/operations.ts';
|
|
21
|
+
export { canStepBack, canStepForward, EMPTY_HISTORY, isFocusOp, record, recordedOps, Sequencer, stepBack, stepForward, } from './engine/sequence.ts';
|
|
22
|
+
export type { History, HistoryEntry, HistoryStep } from './engine/sequence.ts';
|
|
23
|
+
export { dockPaneIds, findParent, findTabPane, getNode, getPane, getSplit, getTab, topRightPaneId, } from './engine/tree.ts';
|
|
24
|
+
export { canSplit, clampSizes, DOCK_EDGE_FRACTION, DOCK_ZONES, dockPaneCount, FLOAT_DEFAULT_SIZE, FLOAT_MIN_SIZE, MAX_DOCK_PANES, MIN_PANE_FRACTION, zoneAt, zoneSplit, } from './engine/constraints.ts';
|
|
25
|
+
export { containsPoint, dividerSizes, DRAG_THRESHOLD, floatRectAt, halvesFit, insertionIndex, movedRect, passedThreshold, resizedRect, SPLIT_MINIMUMS, zoneInRect, } from './engine/geometry.ts';
|
|
26
|
+
export type { DropTarget, HalvesFit, PaneMeasure, Rect, Size, SplitMinimums } from './engine/geometry.ts';
|
|
27
|
+
export { activeDockPaneId, findContentTab, findPaneContentTab, planAddTab, planDropTab, planDuplicateTab, planFloatTab, planOpenContent, planPlaceTab, planResizeSplit, planSetExpanded, planSetMode, planSettle, planSplitPane, planUnfloatPane, } from './engine/planner.ts';
|
|
28
|
+
export type { Mint, OpenContentInput, PlannedTab } from './engine/planner.ts';
|
|
29
|
+
export { DockController } from './engine/controller.ts';
|
|
30
|
+
export type { DockControllerOptions, DockSnapshot } from './engine/controller.ts';
|
|
31
|
+
export { createIdMinter, createInitialState } from './engine/initial.ts';
|
|
32
|
+
export type { IdMinter, TabFactory } from './engine/initial.ts';
|
|
33
|
+
export type { DockIntents, DockLabels, TabMenuExtras, TabRenderer } from './contract/adapter.ts';
|
|
34
|
+
export { DockSurface } from './components/DockSurface.tsx';
|
|
35
|
+
export type { DockSurfaceProps } from './components/DockSurface.tsx';
|
|
36
|
+
export { FloatLayer } from './components/FloatLayer.tsx';
|
|
37
|
+
export type { FloatLayerProps } from './components/FloatLayer.tsx';
|
|
38
|
+
//# sourceMappingURL=index.d.ts.map
|
package/package.json
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@x1a0f3n9/dsh-client-ui-dockkit",
|
|
3
|
+
"description": "Docking layout kit: split-tree engine with invertible operations, and the React components that render and drive it (zero cordis)",
|
|
4
|
+
"version": "0.1.5-rc.3",
|
|
5
|
+
"publishConfig": {
|
|
6
|
+
"access": "public"
|
|
7
|
+
},
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "git+https://github.com/deepseek-ai/deepseek-harness.git",
|
|
11
|
+
"directory": "packages/client/ui-dockkit"
|
|
12
|
+
},
|
|
13
|
+
"type": "module",
|
|
14
|
+
"main": "lib/index.js",
|
|
15
|
+
"types": "lib/types/index.d.ts",
|
|
16
|
+
"exports": {
|
|
17
|
+
".": {
|
|
18
|
+
"types": "./lib/types/index.d.ts",
|
|
19
|
+
"default": "./lib/index.js"
|
|
20
|
+
},
|
|
21
|
+
"./src/*": "./src/*",
|
|
22
|
+
"./package.json": "./package.json"
|
|
23
|
+
},
|
|
24
|
+
"license": "MIT",
|
|
25
|
+
"devDependencies": {
|
|
26
|
+
"@testing-library/react": "^16.1.0",
|
|
27
|
+
"@types/react": "~18.3.1",
|
|
28
|
+
"@types/react-dom": "~18.3.0",
|
|
29
|
+
"react-dom": "^18.2.0",
|
|
30
|
+
"react": "^18.2.0",
|
|
31
|
+
"clsx": "^2.0.0",
|
|
32
|
+
"@deepseek-ai/cordis": "^4.0.2",
|
|
33
|
+
"@x1a0f3n9/dsh-brand": "^0.1.5-rc.3",
|
|
34
|
+
"@x1a0f3n9/dsh-client-ui-primitives": "^0.1.5-rc.3"
|
|
35
|
+
},
|
|
36
|
+
"files": [
|
|
37
|
+
"lib/index.js",
|
|
38
|
+
"lib/**/*.css",
|
|
39
|
+
"lib/types/**/*.d.ts"
|
|
40
|
+
],
|
|
41
|
+
"peerDependencies": {
|
|
42
|
+
"@deepseek-ai/cordis": "^4.0.2"
|
|
43
|
+
}
|
|
44
|
+
}
|