@hlang-tech/editor-ui 0.0.0-stage → 0.1.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.
- package/LICENSE +21 -0
- package/README.md +78 -2
- package/lib/canvas/CanvasChrome.css +45 -0
- package/lib/canvas/CanvasDock.css +82 -0
- package/lib/canvas/EmptyState.css +23 -0
- package/lib/command-palette/NodeSearch.css +153 -0
- package/lib/context-menu/NodeContextMenu.css +102 -0
- package/lib/edges/FlowEdge.css +80 -0
- package/lib/index.d.mts +971 -0
- package/lib/index.d.ts +971 -0
- package/lib/index.js +2402 -0
- package/lib/index.js.map +1 -0
- package/lib/index.mjs +2318 -0
- package/lib/index.mjs.map +1 -0
- package/lib/nodes/AssetNode.css +146 -0
- package/lib/nodes/HlangNode.css +192 -0
- package/lib/nodes/PillNode.css +185 -0
- package/lib/overlays/Cheatsheet.css +107 -0
- package/lib/overlays/Toast.css +34 -0
- package/lib/panels/AssetGrid.css +38 -0
- package/lib/panels/InspectorPanel.css +161 -0
- package/lib/panels/OutlineTree.css +208 -0
- package/lib/panels/ParamForm.css +88 -0
- package/lib/panels/PositionPanel.css +87 -0
- package/lib/panels/PreviewPanel.css +51 -0
- package/lib/panels/RailTabs.css +34 -0
- package/lib/shell/EditorShell.css +75 -0
- package/lib/styles.css +33 -0
- package/lib/tokens/tokens.css +100 -0
- package/lib/toolbar/ToolCluster.css +48 -0
- package/lib/toolbar/Toolbar.css +126 -0
- package/package.json +97 -4
package/lib/styles.css
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @hlang-org/editor-ui — single stylesheet entry.
|
|
3
|
+
*
|
|
4
|
+
* Import this once at your app root to get the full design system: design
|
|
5
|
+
* tokens plus every component's structural styling. Because the components'
|
|
6
|
+
* `import './*.css'` statements are compiled to no-ops (the JS bundle carries
|
|
7
|
+
* no CSS), this aggregated stylesheet is the delivery path for all styles.
|
|
8
|
+
*
|
|
9
|
+
* import '@hlang-org/editor-ui/styles.css';
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
@import './tokens/tokens.css';
|
|
13
|
+
@import './nodes/HlangNode.css';
|
|
14
|
+
@import './nodes/AssetNode.css';
|
|
15
|
+
@import './nodes/PillNode.css';
|
|
16
|
+
@import './edges/FlowEdge.css';
|
|
17
|
+
@import './shell/EditorShell.css';
|
|
18
|
+
@import './toolbar/Toolbar.css';
|
|
19
|
+
@import './toolbar/ToolCluster.css';
|
|
20
|
+
@import './canvas/CanvasChrome.css';
|
|
21
|
+
@import './canvas/CanvasDock.css';
|
|
22
|
+
@import './canvas/EmptyState.css';
|
|
23
|
+
@import './panels/ParamForm.css';
|
|
24
|
+
@import './panels/InspectorPanel.css';
|
|
25
|
+
@import './panels/OutlineTree.css';
|
|
26
|
+
@import './panels/PreviewPanel.css';
|
|
27
|
+
@import './panels/RailTabs.css';
|
|
28
|
+
@import './panels/AssetGrid.css';
|
|
29
|
+
@import './panels/PositionPanel.css';
|
|
30
|
+
@import './command-palette/NodeSearch.css';
|
|
31
|
+
@import './context-menu/NodeContextMenu.css';
|
|
32
|
+
@import './overlays/Cheatsheet.css';
|
|
33
|
+
@import './overlays/Toast.css';
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @hlang-org/editor-ui — design tokens: "Liquid Glass · Black & Silver".
|
|
3
|
+
*
|
|
4
|
+
* A calm, expensive, tech-crafted language. Near-black graphite surfaces, a
|
|
5
|
+
* bright metallic SILVER as the single accent (selection, primary actions,
|
|
6
|
+
* resting edges), frosted-glass panels, and generous radii. The one bold,
|
|
7
|
+
* memorable element is the LIVING STREAM: a cold spark that travels a silver
|
|
8
|
+
* hairline edge only while a flow is actually running — something a static
|
|
9
|
+
* node board cannot do. Everything at rest stays quiet black/silver glass.
|
|
10
|
+
*
|
|
11
|
+
* All tokens are namespaced `--hl-*`. Override any subset under a scope class
|
|
12
|
+
* (see createTheme).
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
:root {
|
|
16
|
+
/* Graphite surface ramp (near-black → raised) */
|
|
17
|
+
--hl-void: #08090b;
|
|
18
|
+
--hl-void-2: #0b0c0f;
|
|
19
|
+
--hl-surface: #0f1114;
|
|
20
|
+
--hl-surface-2: #15171c;
|
|
21
|
+
--hl-line: #212429;
|
|
22
|
+
--hl-line-strong: #2d323a;
|
|
23
|
+
|
|
24
|
+
/* Silver — the primary accent (metallic ramp) */
|
|
25
|
+
--hl-silver: #c8ccd4; /* base silver: selection, primary, resting edges */
|
|
26
|
+
--hl-silver-hi: #eef1f6; /* bright edge / highlight */
|
|
27
|
+
--hl-silver-lo: #7d828c; /* dim silver / secondary */
|
|
28
|
+
|
|
29
|
+
/* Frosted glass primitives */
|
|
30
|
+
--hl-glass: rgba(22, 24, 28, 0.55);
|
|
31
|
+
--hl-glass-2: rgba(28, 31, 37, 0.62);
|
|
32
|
+
--hl-glass-blur: 20px;
|
|
33
|
+
--hl-glass-sat: 1.1;
|
|
34
|
+
/* 1px inner light border that gives glass its lit edge */
|
|
35
|
+
--hl-glass-edge: inset 0 0 0 1px rgba(255, 255, 255, 0.06);
|
|
36
|
+
--hl-glass-edge-hi: inset 0 0 0 1px rgba(255, 255, 255, 0.12);
|
|
37
|
+
|
|
38
|
+
/* The single cold spark — ONLY for live/flowing signal, never resting UI */
|
|
39
|
+
--hl-spark: #a7c7ff;
|
|
40
|
+
|
|
41
|
+
/* Node-kind temperatures — muted/desaturated to sit in the silver world;
|
|
42
|
+
used as a small dot/icon on the node, not a large fill. */
|
|
43
|
+
--hl-r: #7fb8bd; /* Readable — a quiet source */
|
|
44
|
+
--hl-t: #9298c9; /* Transform — quiet processing */
|
|
45
|
+
--hl-w: #86bda2; /* Writable — quiet landing */
|
|
46
|
+
--hl-error: #d98a92; /* @node/error — muted coral */
|
|
47
|
+
--hl-warning: #e0b877; /* predictive edit-time diagnostic — muted amber */
|
|
48
|
+
|
|
49
|
+
/* Text (cool grey ramp) */
|
|
50
|
+
--hl-ink: #e8eaef;
|
|
51
|
+
--hl-ink-2: #9ba0aa;
|
|
52
|
+
--hl-ink-3: #656a74;
|
|
53
|
+
|
|
54
|
+
/* Type */
|
|
55
|
+
--hl-font-ui: 'Inter', ui-sans-serif, system-ui, -apple-system, sans-serif;
|
|
56
|
+
--hl-font-mono: ui-monospace, 'SF Mono', 'JetBrains Mono', 'Fira Code', monospace;
|
|
57
|
+
|
|
58
|
+
/* Radii / depth */
|
|
59
|
+
--hl-r-sm: 8px;
|
|
60
|
+
--hl-r-md: 12px;
|
|
61
|
+
--hl-r-lg: 16px;
|
|
62
|
+
--hl-r-pill: 999px;
|
|
63
|
+
/* Soft, expensive shadow (two-layer: contact + ambient) */
|
|
64
|
+
--hl-shadow-node: 0 1px 1px rgba(0, 0, 0, 0.4), 0 10px 30px -12px rgba(0, 0, 0, 0.75);
|
|
65
|
+
--hl-shadow-glass: 0 2px 4px rgba(0, 0, 0, 0.3), 0 16px 48px -20px rgba(0, 0, 0, 0.85);
|
|
66
|
+
/* Silver selection glow (subtle, not neon) */
|
|
67
|
+
--hl-glow-silver: 0 0 0 1px rgba(200, 204, 212, 0.5),
|
|
68
|
+
0 0 20px -4px rgba(200, 204, 212, 0.3);
|
|
69
|
+
|
|
70
|
+
--hl-ease: cubic-bezier(0.22, 1, 0.36, 1);
|
|
71
|
+
|
|
72
|
+
/* Live dimension — written imperatively per node/edge by useLiveSignals.
|
|
73
|
+
Defaults keep a static graph fully lit. */
|
|
74
|
+
--hl-activity: 1;
|
|
75
|
+
--hl-cost: 0;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/* Utility: numbers and codes align cleanly */
|
|
79
|
+
.hl-mono {
|
|
80
|
+
font-family: var(--hl-font-mono);
|
|
81
|
+
font-variant-numeric: tabular-nums;
|
|
82
|
+
letter-spacing: -0.01em;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/* Reusable frosted-glass surface — the material of panels, toolbars, popovers. */
|
|
86
|
+
.hl-glass {
|
|
87
|
+
background: var(--hl-glass);
|
|
88
|
+
backdrop-filter: blur(var(--hl-glass-blur)) saturate(var(--hl-glass-sat));
|
|
89
|
+
-webkit-backdrop-filter: blur(var(--hl-glass-blur)) saturate(var(--hl-glass-sat));
|
|
90
|
+
box-shadow: var(--hl-glass-edge), var(--hl-shadow-glass);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
@media (prefers-reduced-motion: reduce) {
|
|
94
|
+
.hl-app *,
|
|
95
|
+
.hl-node *,
|
|
96
|
+
.hl-edge * {
|
|
97
|
+
animation-duration: 0.001ms !important;
|
|
98
|
+
transition-duration: 0.001ms !important;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/** ToolCluster — centred glass row of icon tools in the top bar. */
|
|
2
|
+
|
|
3
|
+
.hl-toolcluster {
|
|
4
|
+
display: flex;
|
|
5
|
+
align-items: center;
|
|
6
|
+
gap: 2px;
|
|
7
|
+
padding: 4px;
|
|
8
|
+
background: rgba(255, 255, 255, 0.03);
|
|
9
|
+
border: 1px solid var(--hl-line);
|
|
10
|
+
border-radius: var(--hl-r-pill);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
.hl-toolcluster-slot {
|
|
14
|
+
display: inline-flex;
|
|
15
|
+
align-items: center;
|
|
16
|
+
}
|
|
17
|
+
.hl-toolcluster-sep {
|
|
18
|
+
width: 1px;
|
|
19
|
+
height: 18px;
|
|
20
|
+
margin: 0 5px;
|
|
21
|
+
background: var(--hl-line-strong);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
.hl-toolcluster-btn {
|
|
25
|
+
width: 32px;
|
|
26
|
+
height: 32px;
|
|
27
|
+
display: grid;
|
|
28
|
+
place-items: center;
|
|
29
|
+
border: none;
|
|
30
|
+
background: transparent;
|
|
31
|
+
color: var(--hl-ink-2);
|
|
32
|
+
border-radius: var(--hl-r-pill);
|
|
33
|
+
cursor: pointer;
|
|
34
|
+
transition: background 0.14s var(--hl-ease), color 0.14s var(--hl-ease);
|
|
35
|
+
}
|
|
36
|
+
.hl-toolcluster-btn:hover:not(:disabled) {
|
|
37
|
+
background: rgba(255, 255, 255, 0.07);
|
|
38
|
+
color: var(--hl-ink);
|
|
39
|
+
}
|
|
40
|
+
.hl-toolcluster-btn.is-active {
|
|
41
|
+
background: color-mix(in oklab, var(--hl-silver) 22%, transparent);
|
|
42
|
+
color: var(--hl-silver-hi);
|
|
43
|
+
box-shadow: inset 0 0 0 1px color-mix(in oklab, var(--hl-silver) 30%, transparent);
|
|
44
|
+
}
|
|
45
|
+
.hl-toolcluster-btn:disabled {
|
|
46
|
+
opacity: 0.35;
|
|
47
|
+
cursor: not-allowed;
|
|
48
|
+
}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/** Frosted-glass toolbar with a wordmark and a right-aligned action cluster. */
|
|
2
|
+
|
|
3
|
+
.hl-toolbar {
|
|
4
|
+
position: relative;
|
|
5
|
+
display: flex;
|
|
6
|
+
align-items: center;
|
|
7
|
+
justify-content: space-between;
|
|
8
|
+
height: 54px;
|
|
9
|
+
padding: 0 16px;
|
|
10
|
+
border-bottom: 1px solid var(--hl-line);
|
|
11
|
+
background: var(--hl-glass);
|
|
12
|
+
backdrop-filter: blur(var(--hl-glass-blur)) saturate(var(--hl-glass-sat));
|
|
13
|
+
-webkit-backdrop-filter: blur(var(--hl-glass-blur)) saturate(var(--hl-glass-sat));
|
|
14
|
+
box-shadow: var(--hl-glass-edge);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/* The centre tool cluster is absolutely centred so it never shifts with the
|
|
18
|
+
width of the brand or the action cluster on either side. */
|
|
19
|
+
.hl-toolbar-center {
|
|
20
|
+
position: absolute;
|
|
21
|
+
left: 50%;
|
|
22
|
+
top: 50%;
|
|
23
|
+
transform: translate(-50%, -50%);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
.hl-toolbar-brand {
|
|
27
|
+
display: flex;
|
|
28
|
+
align-items: center;
|
|
29
|
+
gap: 10px;
|
|
30
|
+
}
|
|
31
|
+
.hl-toolbar-glyph {
|
|
32
|
+
width: 14px;
|
|
33
|
+
height: 14px;
|
|
34
|
+
border-radius: 5px;
|
|
35
|
+
/* A brushed-silver bead with a faint kind shimmer — subtle, not rainbow. */
|
|
36
|
+
background: radial-gradient(circle at 30% 25%, var(--hl-silver-hi), var(--hl-silver-lo) 70%);
|
|
37
|
+
box-shadow: 0 0 10px -3px var(--hl-silver), var(--hl-glass-edge-hi);
|
|
38
|
+
}
|
|
39
|
+
.hl-toolbar-wordmark {
|
|
40
|
+
font-size: 15px;
|
|
41
|
+
font-weight: 600;
|
|
42
|
+
letter-spacing: -0.02em;
|
|
43
|
+
color: var(--hl-ink);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
.hl-toolbar-actions {
|
|
47
|
+
display: flex;
|
|
48
|
+
align-items: center;
|
|
49
|
+
gap: 8px;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/* Read-only stat pill (node/vertex count). */
|
|
53
|
+
.hl-toolbar-stat {
|
|
54
|
+
font-size: 11.5px;
|
|
55
|
+
color: var(--hl-ink-2);
|
|
56
|
+
background: rgba(255, 255, 255, 0.04);
|
|
57
|
+
border: 1px solid var(--hl-line);
|
|
58
|
+
border-radius: var(--hl-r-pill);
|
|
59
|
+
padding: 5px 11px;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/* Ghost glass buttons for secondary actions (undo/redo). */
|
|
63
|
+
.hl-toolbar-btn {
|
|
64
|
+
font-family: var(--hl-font-ui);
|
|
65
|
+
font-size: 12.5px;
|
|
66
|
+
font-weight: 550;
|
|
67
|
+
color: var(--hl-ink-2);
|
|
68
|
+
background: rgba(255, 255, 255, 0.03);
|
|
69
|
+
border: 1px solid var(--hl-line-strong);
|
|
70
|
+
border-radius: var(--hl-r-sm);
|
|
71
|
+
padding: 7px 13px;
|
|
72
|
+
cursor: pointer;
|
|
73
|
+
transition: color 0.15s var(--hl-ease), border-color 0.15s var(--hl-ease),
|
|
74
|
+
background 0.15s var(--hl-ease);
|
|
75
|
+
}
|
|
76
|
+
.hl-toolbar-btn:hover:not(:disabled) {
|
|
77
|
+
color: var(--hl-ink);
|
|
78
|
+
background: rgba(255, 255, 255, 0.06);
|
|
79
|
+
border-color: color-mix(in oklab, var(--hl-silver) 40%, var(--hl-line-strong));
|
|
80
|
+
}
|
|
81
|
+
.hl-toolbar-btn:focus-visible {
|
|
82
|
+
outline: 2px solid var(--hl-silver);
|
|
83
|
+
outline-offset: 2px;
|
|
84
|
+
}
|
|
85
|
+
.hl-toolbar-btn:disabled {
|
|
86
|
+
opacity: 0.4;
|
|
87
|
+
cursor: not-allowed;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/* The primary action — a brushed-silver frosted capsule. The hero button. */
|
|
91
|
+
.hl-toolbar-run {
|
|
92
|
+
display: inline-flex;
|
|
93
|
+
align-items: center;
|
|
94
|
+
gap: 7px;
|
|
95
|
+
color: #14161a;
|
|
96
|
+
border-radius: var(--hl-r-pill);
|
|
97
|
+
border: 1px solid rgba(255, 255, 255, 0.35);
|
|
98
|
+
background: linear-gradient(180deg, var(--hl-silver-hi), var(--hl-silver) 60%, var(--hl-silver-lo));
|
|
99
|
+
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.6),
|
|
100
|
+
0 2px 8px -2px rgba(0, 0, 0, 0.5), 0 0 20px -8px var(--hl-silver);
|
|
101
|
+
font-weight: 600;
|
|
102
|
+
padding: 7px 16px;
|
|
103
|
+
}
|
|
104
|
+
.hl-toolbar-run:hover:not(:disabled) {
|
|
105
|
+
color: #14161a;
|
|
106
|
+
background: linear-gradient(180deg, #ffffff, var(--hl-silver-hi) 60%, var(--hl-silver));
|
|
107
|
+
border-color: rgba(255, 255, 255, 0.5);
|
|
108
|
+
}
|
|
109
|
+
.hl-toolbar-run-icon {
|
|
110
|
+
width: 7px;
|
|
111
|
+
height: 7px;
|
|
112
|
+
border-radius: 50%;
|
|
113
|
+
background: #14161a;
|
|
114
|
+
opacity: 0.85;
|
|
115
|
+
transition: border-radius 0.15s var(--hl-ease);
|
|
116
|
+
}
|
|
117
|
+
/* While running, the icon becomes a square (Stop) and pulses. */
|
|
118
|
+
.hl-toolbar-run-icon.is-stop {
|
|
119
|
+
border-radius: 1px;
|
|
120
|
+
animation: hl-toolbar-pulse 0.9s var(--hl-ease) infinite;
|
|
121
|
+
}
|
|
122
|
+
@keyframes hl-toolbar-pulse {
|
|
123
|
+
50% {
|
|
124
|
+
opacity: 0.25;
|
|
125
|
+
}
|
|
126
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,99 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hlang-tech/editor-ui",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"description": "Lumen design system for hlang: node, edge, panel, and shell components for a React Flow node editor, built on @hlang-org/editor-react.",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"hlang",
|
|
7
|
+
"lumen",
|
|
8
|
+
"node-editor",
|
|
9
|
+
"design-system",
|
|
10
|
+
"react",
|
|
11
|
+
"react-flow",
|
|
12
|
+
"xyflow"
|
|
13
|
+
],
|
|
14
|
+
"homepage": "https://github.com/hlang-tech/hlang/tree/main/packages/editor-ui#readme",
|
|
15
|
+
"bugs": {
|
|
16
|
+
"url": "https://github.com/hlang-tech/hlang/issues"
|
|
17
|
+
},
|
|
18
|
+
"repository": {
|
|
19
|
+
"type": "git",
|
|
20
|
+
"url": "git+https://github.com/hlang-tech/hlang.git",
|
|
21
|
+
"directory": "packages/editor-ui"
|
|
22
|
+
},
|
|
23
|
+
"license": "MIT",
|
|
24
|
+
"author": "hlang-tech",
|
|
25
|
+
"contributors": [
|
|
26
|
+
"Archer <qddegtya@gmail.com>",
|
|
27
|
+
"archersado <archersado@hotmail.com>"
|
|
28
|
+
],
|
|
29
|
+
"type": "commonjs",
|
|
30
|
+
"sideEffects": [
|
|
31
|
+
"**/*.css"
|
|
32
|
+
],
|
|
33
|
+
"engines": {
|
|
34
|
+
"node": ">=18"
|
|
35
|
+
},
|
|
36
|
+
"main": "lib/index.js",
|
|
37
|
+
"module": "lib/index.mjs",
|
|
38
|
+
"types": "lib/index.d.ts",
|
|
39
|
+
"exports": {
|
|
40
|
+
".": {
|
|
41
|
+
"import": {
|
|
42
|
+
"types": "./lib/index.d.mts",
|
|
43
|
+
"default": "./lib/index.mjs"
|
|
44
|
+
},
|
|
45
|
+
"require": {
|
|
46
|
+
"types": "./lib/index.d.ts",
|
|
47
|
+
"default": "./lib/index.js"
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
"./styles.css": "./lib/styles.css",
|
|
51
|
+
"./tokens.css": "./lib/tokens/tokens.css"
|
|
52
|
+
},
|
|
53
|
+
"files": [
|
|
54
|
+
"lib",
|
|
55
|
+
"README.md",
|
|
56
|
+
"LICENSE"
|
|
57
|
+
],
|
|
58
|
+
"publishConfig": {
|
|
59
|
+
"access": "public"
|
|
60
|
+
},
|
|
61
|
+
"dependencies": {
|
|
62
|
+
"@hlang-tech/editor-react": "^0.1.1",
|
|
63
|
+
"@hlang-tech/interpreter": "^1.0.1",
|
|
64
|
+
"@hlang-tech/editor-core": "^0.1.1"
|
|
65
|
+
},
|
|
66
|
+
"peerDependencies": {
|
|
67
|
+
"@xyflow/react": "^12.0.0",
|
|
68
|
+
"react": ">=18",
|
|
69
|
+
"react-dom": ">=18"
|
|
70
|
+
},
|
|
71
|
+
"devDependencies": {
|
|
72
|
+
"@arethetypeswrong/cli": "^0.18.4",
|
|
73
|
+
"@testing-library/react": "^16.3.2",
|
|
74
|
+
"@types/jest": "^29.5.14",
|
|
75
|
+
"@types/react": "^19.0.0",
|
|
76
|
+
"@types/react-dom": "^19.0.0",
|
|
77
|
+
"@xyflow/react": "^12.11.1",
|
|
78
|
+
"copyfiles": "^2.4.1",
|
|
79
|
+
"eslint": "^9.15.0",
|
|
80
|
+
"eslint-plugin-react-hooks": "^5.1.0",
|
|
81
|
+
"jest": "^29.7.0",
|
|
82
|
+
"jest-environment-jsdom": "^29.7.0",
|
|
83
|
+
"publint": "^0.3.21",
|
|
84
|
+
"react": "^19.2.0",
|
|
85
|
+
"react-dom": "^19.2.0",
|
|
86
|
+
"ts-jest": "^29.4.11",
|
|
87
|
+
"tsup": "^8.5.1",
|
|
88
|
+
"typescript": "^5.5.4",
|
|
89
|
+
"typescript-eslint": "^8.62.1"
|
|
90
|
+
},
|
|
91
|
+
"scripts": {
|
|
92
|
+
"build": "tsup && copyfiles -u 1 \"src/**/*.css\" lib",
|
|
93
|
+
"test": "jest --coverage",
|
|
94
|
+
"lint": "eslint \"src/**/*.ts\" \"src/**/*.tsx\"",
|
|
95
|
+
"lint:pkg": "publint && attw --pack --exclude-entrypoints ./tokens.css ./styles.css",
|
|
96
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
97
|
+
"clean": "rm -rf lib coverage"
|
|
98
|
+
}
|
|
99
|
+
}
|