machinalayout 0.2.0 → 0.3.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.
@@ -0,0 +1,126 @@
1
+ # Inspection and handoff bundles
2
+
3
+ MachinaLayout inspection helpers provide a small, framework-light contract for handing UI work from one person or model to another. The utilities standardize the data shapes that app-local workflows can combine with screenshots and layout snapshots, without adding browser automation to MachinaLayout itself.
4
+
5
+ ## Purpose
6
+
7
+ A useful UI handoff often contains four artifacts:
8
+
9
+ - a screenshot for visual truth, produced by userland tooling;
10
+ - a compact DOM summary for semantic/browser truth;
11
+ - a Machina layout snapshot for layout truth;
12
+ - a handoff manifest for route, viewport, screen, and artifact metadata.
13
+
14
+ M25c standardizes the DOM summary and handoff manifest/writer pieces. It does not capture screenshots, launch browsers, drive routes, run viewport matrices, or perform visual diffs.
15
+
16
+ ## DOM summary
17
+
18
+ Import DOM-safe helpers from the inspect subpath:
19
+
20
+ ```ts
21
+ import { summarizeMachinaDom } from "machinalayout/inspect";
22
+
23
+ const summary = summarizeMachinaDom({
24
+ root: document,
25
+ includeA11y: true,
26
+ includeTextExcerpt: true,
27
+ generatedAt: "2026-01-01T00:00:00.000Z",
28
+ });
29
+ ```
30
+
31
+ By default, `summarizeMachinaDom` selects `[data-machina-node-id]`, reads only compact debug metadata, calls `getBoundingClientRect()` for each selected element, and reconstructs the nearest matching ancestor hierarchy. It intentionally does not dump full HTML.
32
+
33
+ The standard Machina browser debug attributes are:
34
+
35
+ - `data-machina-node-id`
36
+ - `data-machina-view`
37
+ - `data-machina-slot`
38
+ - `data-machina-debug-label`
39
+ - `data-machina-layer`
40
+
41
+ When `includeA11y` is enabled, the summary includes `role` and `aria-label` if present. When `includeTextExcerpt` is enabled, the summary includes normalized `textContent` excerpts. Text excerpts are compact hints, not a lossless DOM serialization; the simple text collection may include descendant text in ancestor excerpts.
42
+
43
+ You can also provide a custom selector for app-specific annotations:
44
+
45
+ ```ts
46
+ const summary = summarizeMachinaDom({
47
+ selector: "[data-debug-node]",
48
+ includeTextExcerpt: true,
49
+ });
50
+ ```
51
+
52
+ ## Handoff bundle writer
53
+
54
+ Import Node-only handoff helpers from the handoff subpath:
55
+
56
+ ```ts
57
+ import { writeMachinaHandoffBundle } from "machinalayout/handoff";
58
+
59
+ await writeMachinaHandoffBundle({
60
+ outputDir: "./artifacts/provider-setup-phone",
61
+ artifactBaseName: "Provider Setup / Phone!",
62
+ screenshotPath: "./artifacts/screenshot.png",
63
+ domSummary: summary,
64
+ layoutSnapshot,
65
+ route: "/provider/setup",
66
+ tags: ["handoff", "phone"],
67
+ });
68
+ ```
69
+
70
+ `writeMachinaHandoffBundle` ensures the output directory exists, writes JSON with two-space indentation, copies an existing screenshot when one is supplied, and returns absolute output paths. The manifest stores relative artifact file names so the bundle can move as a directory.
71
+
72
+ The writer uses deterministic artifact names based on a slugged base name:
73
+
74
+ - `${base}__screenshot.<ext>`
75
+ - `${base}__dom-summary.json`
76
+ - `${base}__machina-snapshot.json`
77
+ - `${base}__handoff.json`
78
+
79
+ If no explicit base name is supplied, the writer uses `task.artifactBaseName`, then route/fixture/viewport metadata, then `machina-handoff`.
80
+
81
+ ## Manifest shape
82
+
83
+ The manifest has `schemaVersion: 1`, a `createdAt` timestamp, optional route/fixture/screen/viewport metadata, optional tags and metadata, and an `artifacts` object containing relative file names.
84
+
85
+ ```json
86
+ {
87
+ "schemaVersion": 1,
88
+ "createdAt": "2026-01-01T00:00:00.000Z",
89
+ "route": "/provider/setup",
90
+ "viewportKey": "phone",
91
+ "artifactBaseName": "provider-setup-phone",
92
+ "artifacts": {
93
+ "screenshot": "provider-setup-phone__screenshot.png",
94
+ "domSummary": "provider-setup-phone__dom-summary.json",
95
+ "layoutSnapshot": "provider-setup-phone__machina-snapshot.json",
96
+ "manifest": "provider-setup-phone__handoff.json"
97
+ }
98
+ }
99
+ ```
100
+
101
+ ## Composition with screen tasks
102
+
103
+ The handoff writer accepts a `MachinaScreenViewportTask` from the screen catalog and viewport matrix helpers. When provided, the writer copies `route`, `fixture`, `screenKey`, `viewportKey`, `viewport`, `task.artifactBaseName`, and task tags into the manifest. Input tags are merged after task tags with duplicates removed while preserving order.
104
+
105
+ ```ts
106
+ await writeMachinaHandoffBundle({
107
+ outputDir: "./artifacts",
108
+ task,
109
+ domSummary,
110
+ layoutSnapshot,
111
+ });
112
+ ```
113
+
114
+ ## Limitations and boundaries
115
+
116
+ These utilities are intentionally narrow:
117
+
118
+ - no Playwright dependency;
119
+ - no browser launch or browser automation;
120
+ - no screenshot capture;
121
+ - no viewport matrix runner;
122
+ - no visual diff;
123
+ - no adapter behavior changes;
124
+ - no layout resolver semantics changes.
125
+
126
+ Userland tooling remains responsible for route navigation, viewport setup, screenshots, and any visual comparison workflow. MachinaLayout provides the lightweight schemas and writing helpers that make those artifacts predictable.
@@ -90,3 +90,26 @@ Not used as geometry authority:
90
90
  - CSS classes determining solved geometry
91
91
 
92
92
  React components render payload UI inside adapter-owned rectangles; React does not own outer layout geometry.
93
+
94
+ ## Inspection handoff surface
95
+
96
+ React DOM rendering includes the standard Machina `data-machina-*` debug attributes used by the framework-light DOM summary helpers. See [Inspection and handoff bundles](inspection-and-handoff.md) for the `machinalayout/inspect` and `machinalayout/handoff` workflow.
97
+
98
+ ## Debug overlay
99
+
100
+ `MachinaReactView` accepts an optional controlled `debugOverlay` prop:
101
+
102
+ ```tsx
103
+ <MachinaReactView
104
+ layout={layout}
105
+ debugOverlay={{ mode: "nonInteractiveOverlay", labels: true, borders: true }}
106
+ />
107
+ ```
108
+
109
+ Modes:
110
+
111
+ - `collapsed`: no overlay labels or borders are rendered and app interactions are not blocked.
112
+ - `nonInteractiveOverlay`: overlay labels and borders render when enabled, do not consume layout space, and use `pointer-events: none`, making the mode suitable for screenshots and browser automation.
113
+ - `interactivePanel`: overlay labels/borders can render with a small panel and `pointer-events: auto` for human inspection.
114
+
115
+ The prop is controlled. M26 does not add React state management or hooks; DeusMachina provides the standalone behavior helpers used to derive the rendering semantics. In `nonInteractiveOverlay`, overlay artifacts use `pointer-events: none` and do not consume layout space; in `collapsed`, overlay artifacts are not rendered. Labels and borders remain controlled booleans and do not change existing `data-machina-*` attributes on node wrappers.
@@ -0,0 +1,124 @@
1
+ # Screen catalog and viewport matrix
2
+
3
+ Machina screen catalog helpers describe named app screens and responsive viewport presets as plain TypeScript data. They are intended for future capture, inspection, and handoff tooling, but they do not perform any browser automation themselves.
4
+
5
+ These utilities model this relationship:
6
+
7
+ ```ts
8
+ screen + viewport -> task metadata
9
+ ```
10
+
11
+ A future runner can consume each task to navigate an app route, set a viewport, capture screenshots, inspect DOM, collect layout snapshots, or write handoff bundles.
12
+
13
+ ## Screen catalog
14
+
15
+ A `MachinaScreen` is a stable, named screen entry:
16
+
17
+ ```ts
18
+ const screens = defineMachinaScreens([
19
+ {
20
+ key: "provider-setup",
21
+ route: "/apps/scheduling/setup",
22
+ fixture: "provider-setup",
23
+ viewports: ["desktop", "tablet", "phone"],
24
+ tags: ["scheduling", "setup"],
25
+ },
26
+ ]);
27
+ ```
28
+
29
+ The `route` value is opaque app metadata. Machina does not parse it, validate URL semantics, or integrate with a router. `fixture`, `tags`, `title`, and `metadata` are also app-owned metadata for downstream tools.
30
+
31
+ `defineMachinaScreens` validates screen keys and routes, rejects duplicate keys, returns fresh screen objects, and preserves author order in `catalog.order`.
32
+
33
+ ## Viewport matrix
34
+
35
+ A `MachinaViewport` is a stable viewport preset:
36
+
37
+ ```ts
38
+ const viewports = createViewportMatrix("standard-responsive");
39
+ ```
40
+
41
+ Built-in presets:
42
+
43
+ | Preset | Order | Sizes |
44
+ | --- | --- | --- |
45
+ | `standard-responsive` | desktop, tablet, phone | 1440×900, 1024×768, 390×844 |
46
+ | `desktop-only` | desktop | 1440×900 |
47
+ | `mobile-first` | phone, tablet, desktop | 390×844, 1024×768, 1440×900 |
48
+
49
+ Default preset is `standard-responsive`. Built-in viewport tags are:
50
+
51
+ - desktop: `desktop`
52
+ - tablet: `tablet`
53
+ - phone: `phone`, `mobile`
54
+
55
+ Use `defineMachinaViewports` for custom matrices. It validates unique non-empty keys, positive finite width/height, optional positive finite `deviceScaleFactor`, and preserves input order.
56
+
57
+ ## Task expansion
58
+
59
+ `expandScreenViewportTasks` expands a screen catalog and viewport matrix into deterministic `MachinaScreenViewportTask[]` values:
60
+
61
+ ```ts
62
+ const screens = defineMachinaScreens([
63
+ {
64
+ key: "provider-setup",
65
+ route: "/apps/scheduling/setup",
66
+ fixture: "provider-setup",
67
+ viewports: ["desktop", "tablet", "phone"],
68
+ tags: ["scheduling", "setup"],
69
+ },
70
+ ]);
71
+
72
+ const viewports = createViewportMatrix("standard-responsive");
73
+ const tasks = expandScreenViewportTasks(screens, viewports);
74
+ ```
75
+
76
+ Task ordering is always catalog order first, then viewport matrix order. One task represents one screen at one viewport and includes the raw screen route, fixture, copied screen/viewport references, merged tags, a deterministic task key, and a filesystem-safe artifact base name.
77
+
78
+ ## Filtering semantics
79
+
80
+ Expansion accepts optional filters:
81
+
82
+ ```ts
83
+ const phoneSchedulingTasks = expandScreenViewportTasks(screens, viewports, {
84
+ screenKeys: ["provider-setup"],
85
+ viewportKeys: ["phone"],
86
+ tags: ["scheduling", "mobile"],
87
+ });
88
+ ```
89
+
90
+ Filtering is deterministic:
91
+
92
+ 1. Start with screens in catalog order.
93
+ 2. If `screenKeys` is present, include only those screens. Unknown requested screen keys throw `UnknownScreenKey`.
94
+ 3. A screen's `viewports` list limits the default eligible viewport set for that screen.
95
+ 4. If `viewportKeys` is present, it further filters eligible viewport keys. Unknown requested viewport keys throw `UnknownViewportKey`.
96
+ 5. Screen-referenced viewport keys must exist in the provided viewport matrix or expansion throws `UnknownViewportKey`.
97
+ 6. Tags merge screen tags first, then viewport tags, with duplicates removed while preserving order.
98
+ 7. If `tags` is present, a task is included only when every requested tag is in the merged task tags.
99
+
100
+ ## Artifact base names
101
+
102
+ Task keys use raw keys joined by `__`, for example `provider-setup__phone`. Artifact base names slug each side independently:
103
+
104
+ ```ts
105
+ slugMachinaArtifactName("Provider Setup!"); // "provider-setup"
106
+ ```
107
+
108
+ A task for screen key `Provider Setup` and viewport key `Phone XL` receives `artifactBaseName: "provider-setup__phone-xl"`.
109
+
110
+ ## Limitations
111
+
112
+ This is a framework-independent metadata layer only. It intentionally does not include:
113
+
114
+ - browser automation,
115
+ - screenshot capture,
116
+ - DOM inspection or DOM summaries,
117
+ - handoff bundle writing,
118
+ - router integration,
119
+ - route parsing,
120
+ - fixture serving,
121
+ - adapter behavior,
122
+ - layout resolver semantic changes.
123
+
124
+ The helpers work in Node or the browser and have no Playwright, DOM, React, Vue, or React Native dependency.
@@ -0,0 +1,115 @@
1
+ # Stack geometry helpers
2
+
3
+ MachinaLayout stack geometry helpers are pure query utilities for resolved layout documents. They make common stack arithmetic inspectable without introducing new layout primitives or changing resolver behavior.
4
+
5
+ ## Why these helpers exist
6
+
7
+ Apps with fixed chrome, content panes, sidebars, and inspectors often need to ask questions like:
8
+
9
+ - What rectangle is left after stack padding?
10
+ - How much of a stack main axis is consumed by direct children and gaps?
11
+ - Where is the interval between a header-like child and an inspector-like child?
12
+
13
+ The resolver already computes deterministic rectangles. These helpers expose that resolved state so humans and LLMs do not have to hand-copy padding, gap, and fixed/fill calculations.
14
+
15
+ ## Resolved-document query boundary
16
+
17
+ These helpers inspect existing rectangles. They do not:
18
+
19
+ - mutate the resolved layout document,
20
+ - recompute layout from `LayoutRow[]`,
21
+ - account for DOM measurements,
22
+ - inspect descendants when a helper is scoped to direct stack children,
23
+ - change `StackArrange` or `GridArrange` semantics.
24
+
25
+ They report resolved state, including resolved fill allocations, rather than pre-resolution authoring guesses.
26
+
27
+ ## `getArrangeContentRect(parentRect, arrange)`
28
+
29
+ `getArrangeContentRect` returns a fresh content rectangle for an arranger:
30
+
31
+ - `stack`: subtracts normalized stack padding and throws `StackContentNegative` if padding makes content negative.
32
+ - `grid`: subtracts normalized grid padding and throws `GridContentNegative` if padding makes content negative.
33
+ - omitted or unsupported arranger: returns a fresh copy of the parent rectangle.
34
+
35
+ ```ts
36
+ const contentRect = getArrangeContentRect(parent.rect, parent.arrange);
37
+ ```
38
+
39
+ ## `getStackContentRect(layout, parentId)`
40
+
41
+ `getStackContentRect` looks up a resolved stack parent and returns its content rectangle after stack padding.
42
+
43
+ ```ts
44
+ const content = getStackContentRect(layout, "scheduling-content");
45
+ ```
46
+
47
+ The parent must exist and must have `arrange.kind === "stack"`. A non-stack parent throws `ExpectedStackArrange`.
48
+
49
+ ## `getStackMainAxisMetrics(layout, parentId)`
50
+
51
+ `getStackMainAxisMetrics` returns main-axis and cross-axis data for a resolved stack parent:
52
+
53
+ - parent and content rectangles,
54
+ - normalized padding and gap,
55
+ - direct child ids in resolved child order,
56
+ - per-child rectangles and main/cross starts, ends, and sizes relative to the content rectangle,
57
+ - content main/cross sizes,
58
+ - total child main size,
59
+ - total gap size,
60
+ - used main size,
61
+ - unused main size.
62
+
63
+ Because the input is a resolved document, fill children are reported at their actual resolved sizes.
64
+
65
+ ```ts
66
+ const metrics = getStackMainAxisMetrics(layout, "root");
67
+ const remaining = metrics.unusedMainSize;
68
+ ```
69
+
70
+ ## `getStackChildRects(layout, parentId)`
71
+
72
+ `getStackChildRects` returns fresh direct-child rectangle copies keyed by child id.
73
+
74
+ ```ts
75
+ const childRects = getStackChildRects(layout, "root");
76
+ const sidebar = childRects.sidebar;
77
+ ```
78
+
79
+ Only direct stack children are returned. Descendant rectangles should be queried from `layout.nodes` or from a helper scoped to their own parent.
80
+
81
+ ## `getRemainingStackRect(layout, options)`
82
+
83
+ `getRemainingStackRect` is a narrow interval query over direct children of one resolved stack parent.
84
+
85
+ It computes the interval between:
86
+
87
+ - the latest `mainEnd` among `afterChildren`, or the content start when no `afterChildren` are provided, and
88
+ - the earliest `mainStart` among `beforeChildren`, or the content end when no `beforeChildren` are provided.
89
+
90
+ The returned rectangle preserves the full content cross-axis size.
91
+
92
+ ```ts
93
+ const shellContent = getRemainingStackRect(layout, {
94
+ parentId: "root",
95
+ afterChildren: ["hero"],
96
+ beforeChildren: ["inspector"],
97
+ });
98
+ ```
99
+
100
+ If the computed interval is negative, the helper throws `StackQueryInvalidRange`. This helper is a query helper, not a solver; it does not move children or search descendants.
101
+
102
+ ## Inspector/content shell example
103
+
104
+ ```ts
105
+ const metrics = getStackMainAxisMetrics(layout, "root");
106
+ const content = getStackContentRect(layout, "scheduling-content");
107
+
108
+ const interactiveRegion = getRemainingStackRect(layout, {
109
+ parentId: "root",
110
+ afterChildren: ["toolbar"],
111
+ beforeChildren: ["inspector"],
112
+ });
113
+ ```
114
+
115
+ This pattern is useful for app shells that place fixed controls around an interactive content region while still keeping all geometry framework-independent.
package/package.json CHANGED
@@ -1,115 +1,127 @@
1
- {
2
- "name": "machinalayout",
3
- "version": "0.2.0",
4
- "type": "module",
5
- "scripts": {
6
- "typecheck": "tsc --noEmit",
7
- "build": "npm run typecheck && tsup --config tsup.config.ts --tsconfig tsconfig.build.json",
8
- "test": "vitest run",
9
- "format": "biome format --write .",
10
- "format:check": "biome format .",
11
- "lint": "biome lint .",
12
- "check": "biome check ."
13
- },
14
- "devDependencies": {
15
- "@biomejs/biome": "^2.4.15",
16
- "@testing-library/jest-dom": "^6.9.1",
17
- "@testing-library/react": "^16.3.2",
18
- "@types/react": "^19.2.14",
19
- "@types/react-dom": "^19.2.3",
20
- "@types/react-test-renderer": "^19.1.0",
21
- "@vue/test-utils": "^2.4.6",
22
- "jsdom": "^29.1.1",
23
- "react": "^19.2.6",
24
- "react-dom": "^19.2.6",
25
- "react-native": "^0.82.0",
26
- "react-test-renderer": "^19.2.6",
27
- "tsup": "^8.5.1",
28
- "typescript": "^5.6.3",
29
- "vitest": "^2.1.8",
30
- "vue": "^3.5.22"
31
- },
32
- "peerDependencies": {
33
- "react": ">=18 <20",
34
- "react-dom": ">=18 <20",
35
- "react-native": ">=0.72 <1",
36
- "vue": ">=3.4 <4"
37
- },
38
- "description": "Machine-native layout and text primitives for deterministic app UI records.",
39
- "license": "MIT",
40
- "author": "MachinaLayout contributors",
41
- "repository": {
42
- "type": "git",
43
- "url": "https://github.com/machinalayout/MachinaLayout.JS.git"
44
- },
45
- "homepage": "https://github.com/machinalayout/MachinaLayout.JS#readme",
46
- "bugs": {
47
- "url": "https://github.com/machinalayout/MachinaLayout.JS/issues"
48
- },
49
- "keywords": [
50
- "layout",
51
- "ui",
52
- "react",
53
- "typescript",
54
- "machina",
55
- "text",
56
- "rectangles"
57
- ],
58
- "main": "./dist/index.js",
59
- "module": "./dist/index.js",
60
- "types": "./dist/index.d.ts",
61
- "exports": {
62
- ".": {
63
- "types": "./dist/index.d.ts",
64
- "import": "./dist/index.js"
65
- },
66
- "./react": {
67
- "types": "./dist/react/index.d.ts",
68
- "import": "./dist/react/index.js"
69
- },
70
- "./text": {
71
- "types": "./dist/text/index.d.ts",
72
- "import": "./dist/text/index.js"
73
- },
74
- "./text/react": {
75
- "types": "./dist/text/react/index.d.ts",
76
- "import": "./dist/text/react/index.js"
77
- },
78
- "./package.json": "./package.json",
79
- "./react-native": {
80
- "types": "./dist/react-native/index.d.ts",
81
- "import": "./dist/react-native/index.js"
82
- },
83
- "./vue": {
84
- "types": "./dist/vue/index.d.ts",
85
- "import": "./dist/vue/index.js"
86
- },
87
- "./text/react-native": {
88
- "types": "./dist/text/react-native/index.d.ts",
89
- "import": "./dist/text/react-native/index.js"
90
- },
91
- "./text/vue": {
92
- "types": "./dist/text/vue/index.d.ts",
93
- "import": "./dist/text/vue/index.js"
94
- },
95
- "./dispatch": {
96
- "types": "./dist/dispatch/index.d.ts",
97
- "import": "./dist/dispatch/index.js"
98
- }
99
- },
100
- "files": [
101
- "dist",
102
- "README.md",
103
- "LICENSE",
104
- "docs"
105
- ],
106
- "sideEffects": false,
107
- "peerDependenciesMeta": {
108
- "react-native": {
109
- "optional": true
110
- },
111
- "vue": {
112
- "optional": true
113
- }
114
- }
115
- }
1
+ {
2
+ "name": "machinalayout",
3
+ "version": "0.3.0",
4
+ "type": "module",
5
+ "scripts": {
6
+ "typecheck": "tsc --noEmit",
7
+ "build": "npm run typecheck && tsup --config tsup.config.ts --tsconfig tsconfig.build.json",
8
+ "test": "vitest run",
9
+ "format": "biome format --write .",
10
+ "format:check": "biome format .",
11
+ "lint": "biome lint .",
12
+ "check": "biome check ."
13
+ },
14
+ "devDependencies": {
15
+ "@biomejs/biome": "^2.4.15",
16
+ "@testing-library/jest-dom": "^6.9.1",
17
+ "@testing-library/react": "^16.3.2",
18
+ "@types/react": "^19.2.14",
19
+ "@types/react-dom": "^19.2.3",
20
+ "@types/react-test-renderer": "^19.1.0",
21
+ "@vue/test-utils": "^2.4.6",
22
+ "jsdom": "^29.1.1",
23
+ "react": "^19.2.6",
24
+ "react-dom": "^19.2.6",
25
+ "react-native": "^0.82.0",
26
+ "react-test-renderer": "^19.2.6",
27
+ "tsup": "^8.5.1",
28
+ "typescript": "^5.6.3",
29
+ "vitest": "^2.1.8",
30
+ "vue": "^3.5.22"
31
+ },
32
+ "peerDependencies": {
33
+ "react": ">=18 <20",
34
+ "react-dom": ">=18 <20",
35
+ "react-native": ">=0.72 <1",
36
+ "vue": ">=3.4 <4"
37
+ },
38
+ "description": "Machine-native layout and text primitives for deterministic app UI records.",
39
+ "license": "MIT",
40
+ "author": "MachinaLayout contributors",
41
+ "repository": {
42
+ "type": "git",
43
+ "url": "https://github.com/machinalayout/MachinaLayout.JS.git"
44
+ },
45
+ "homepage": "https://github.com/machinalayout/MachinaLayout.JS#readme",
46
+ "bugs": {
47
+ "url": "https://github.com/machinalayout/MachinaLayout.JS/issues"
48
+ },
49
+ "keywords": [
50
+ "layout",
51
+ "ui",
52
+ "react",
53
+ "typescript",
54
+ "machina",
55
+ "text",
56
+ "rectangles"
57
+ ],
58
+ "main": "./dist/index.js",
59
+ "module": "./dist/index.js",
60
+ "types": "./dist/index.d.ts",
61
+ "exports": {
62
+ ".": {
63
+ "types": "./dist/index.d.ts",
64
+ "import": "./dist/index.js"
65
+ },
66
+ "./inspect": {
67
+ "types": "./dist/inspect/index.d.ts",
68
+ "import": "./dist/inspect/index.js"
69
+ },
70
+ "./handoff": {
71
+ "types": "./dist/handoff/index.d.ts",
72
+ "import": "./dist/handoff/index.js"
73
+ },
74
+ "./deus": {
75
+ "types": "./dist/deus/index.d.ts",
76
+ "import": "./dist/deus/index.js"
77
+ },
78
+ "./react": {
79
+ "types": "./dist/react/index.d.ts",
80
+ "import": "./dist/react/index.js"
81
+ },
82
+ "./text": {
83
+ "types": "./dist/text/index.d.ts",
84
+ "import": "./dist/text/index.js"
85
+ },
86
+ "./text/react": {
87
+ "types": "./dist/text/react/index.d.ts",
88
+ "import": "./dist/text/react/index.js"
89
+ },
90
+ "./package.json": "./package.json",
91
+ "./react-native": {
92
+ "types": "./dist/react-native/index.d.ts",
93
+ "import": "./dist/react-native/index.js"
94
+ },
95
+ "./vue": {
96
+ "types": "./dist/vue/index.d.ts",
97
+ "import": "./dist/vue/index.js"
98
+ },
99
+ "./text/react-native": {
100
+ "types": "./dist/text/react-native/index.d.ts",
101
+ "import": "./dist/text/react-native/index.js"
102
+ },
103
+ "./text/vue": {
104
+ "types": "./dist/text/vue/index.d.ts",
105
+ "import": "./dist/text/vue/index.js"
106
+ },
107
+ "./dispatch": {
108
+ "types": "./dist/dispatch/index.d.ts",
109
+ "import": "./dist/dispatch/index.js"
110
+ }
111
+ },
112
+ "files": [
113
+ "dist",
114
+ "README.md",
115
+ "LICENSE",
116
+ "docs"
117
+ ],
118
+ "sideEffects": false,
119
+ "peerDependenciesMeta": {
120
+ "react-native": {
121
+ "optional": true
122
+ },
123
+ "vue": {
124
+ "optional": true
125
+ }
126
+ }
127
+ }