agent-web-interface 4.2.0 → 4.4.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.
- package/dist/src/browser/connection-utils.d.ts +48 -0
- package/dist/src/browser/connection-utils.d.ts.map +1 -0
- package/dist/src/browser/connection-utils.js +129 -0
- package/dist/src/browser/connection-utils.js.map +1 -0
- package/dist/src/browser/index.d.ts +3 -1
- package/dist/src/browser/index.d.ts.map +1 -1
- package/dist/src/browser/index.js +2 -1
- package/dist/src/browser/index.js.map +1 -1
- package/dist/src/browser/session-manager.d.ts +1 -89
- package/dist/src/browser/session-manager.d.ts.map +1 -1
- package/dist/src/browser/session-manager.js +1 -116
- package/dist/src/browser/session-manager.js.map +1 -1
- package/dist/src/browser/session-manager.types.d.ts +90 -0
- package/dist/src/browser/session-manager.types.d.ts.map +1 -0
- package/dist/src/browser/session-manager.types.js +7 -0
- package/dist/src/browser/session-manager.types.js.map +1 -0
- package/dist/src/form/constraint-extraction.d.ts +31 -0
- package/dist/src/form/constraint-extraction.d.ts.map +1 -0
- package/dist/src/form/constraint-extraction.js +110 -0
- package/dist/src/form/constraint-extraction.js.map +1 -0
- package/dist/src/form/field-extractor.d.ts.map +1 -1
- package/dist/src/form/field-extractor.js +3 -444
- package/dist/src/form/field-extractor.js.map +1 -1
- package/dist/src/form/field-state-extractor.d.ts +22 -0
- package/dist/src/form/field-state-extractor.d.ts.map +1 -0
- package/dist/src/form/field-state-extractor.js +55 -0
- package/dist/src/form/field-state-extractor.js.map +1 -0
- package/dist/src/form/form-actions.d.ts +45 -0
- package/dist/src/form/form-actions.d.ts.map +1 -0
- package/dist/src/form/form-actions.js +108 -0
- package/dist/src/form/form-actions.js.map +1 -0
- package/dist/src/form/form-detector.d.ts +0 -36
- package/dist/src/form/form-detector.d.ts.map +1 -1
- package/dist/src/form/form-detector.js +11 -376
- package/dist/src/form/form-detector.js.map +1 -1
- package/dist/src/form/input-clustering.d.ts +15 -0
- package/dist/src/form/input-clustering.d.ts.map +1 -0
- package/dist/src/form/input-clustering.js +61 -0
- package/dist/src/form/input-clustering.js.map +1 -0
- package/dist/src/form/intent-inference.d.ts +28 -0
- package/dist/src/form/intent-inference.d.ts.map +1 -0
- package/dist/src/form/intent-inference.js +137 -0
- package/dist/src/form/intent-inference.js.map +1 -0
- package/dist/src/form/purpose-inference.d.ts +50 -0
- package/dist/src/form/purpose-inference.d.ts.map +1 -0
- package/dist/src/form/purpose-inference.js +313 -0
- package/dist/src/form/purpose-inference.js.map +1 -0
- package/dist/src/form/submit-detection.d.ts +36 -0
- package/dist/src/form/submit-detection.d.ts.map +1 -0
- package/dist/src/form/submit-detection.js +101 -0
- package/dist/src/form/submit-detection.js.map +1 -0
- package/dist/src/form/types.d.ts +2 -2
- package/dist/src/index.js +65 -48
- package/dist/src/index.js.map +1 -1
- package/dist/src/observation/observation-accumulator.d.ts +1 -1
- package/dist/src/observation/observation-accumulator.js +1 -1
- package/dist/src/observation/observer-script.d.ts +1 -1
- package/dist/src/observation/observer-script.d.ts.map +1 -1
- package/dist/src/observation/observer-script.js +129 -7
- package/dist/src/observation/observer-script.js.map +1 -1
- package/dist/src/query/disambiguation.d.ts +18 -0
- package/dist/src/query/disambiguation.d.ts.map +1 -0
- package/dist/src/query/disambiguation.js +123 -0
- package/dist/src/query/disambiguation.js.map +1 -0
- package/dist/src/query/fuzzy-match.d.ts +17 -0
- package/dist/src/query/fuzzy-match.d.ts.map +1 -0
- package/dist/src/query/fuzzy-match.js +34 -0
- package/dist/src/query/fuzzy-match.js.map +1 -0
- package/dist/src/query/index.d.ts +3 -0
- package/dist/src/query/index.d.ts.map +1 -1
- package/dist/src/query/index.js +6 -0
- package/dist/src/query/index.js.map +1 -1
- package/dist/src/query/query-engine.d.ts +0 -35
- package/dist/src/query/query-engine.d.ts.map +1 -1
- package/dist/src/query/query-engine.js +9 -309
- package/dist/src/query/query-engine.js.map +1 -1
- package/dist/src/query/scoring.d.ts +52 -0
- package/dist/src/query/scoring.d.ts.map +1 -0
- package/dist/src/query/scoring.js +162 -0
- package/dist/src/query/scoring.js.map +1 -0
- package/dist/src/server/mcp-server.d.ts.map +1 -1
- package/dist/src/server/mcp-server.js +29 -1
- package/dist/src/server/mcp-server.js.map +1 -1
- package/dist/src/snapshot/element-resolver.d.ts +50 -18
- package/dist/src/snapshot/element-resolver.d.ts.map +1 -1
- package/dist/src/snapshot/element-resolver.js +180 -101
- package/dist/src/snapshot/element-resolver.js.map +1 -1
- package/dist/src/snapshot/extractors/ax-extractor.d.ts +1 -1
- package/dist/src/snapshot/extractors/ax-extractor.d.ts.map +1 -1
- package/dist/src/snapshot/extractors/ax-extractor.js +4 -1
- package/dist/src/snapshot/extractors/ax-extractor.js.map +1 -1
- package/dist/src/snapshot/extractors/index.d.ts +1 -1
- package/dist/src/snapshot/extractors/index.d.ts.map +1 -1
- package/dist/src/snapshot/extractors/index.js +1 -1
- package/dist/src/snapshot/extractors/index.js.map +1 -1
- package/dist/src/snapshot/extractors/region-resolver.d.ts.map +1 -1
- package/dist/src/snapshot/extractors/region-resolver.js +8 -0
- package/dist/src/snapshot/extractors/region-resolver.js.map +1 -1
- package/dist/src/snapshot/extractors/types.d.ts +8 -0
- package/dist/src/snapshot/extractors/types.d.ts.map +1 -1
- package/dist/src/snapshot/extractors/types.js +16 -0
- package/dist/src/snapshot/extractors/types.js.map +1 -1
- package/dist/src/snapshot/frame-context.d.ts +68 -0
- package/dist/src/snapshot/frame-context.d.ts.map +1 -0
- package/dist/src/snapshot/frame-context.js +131 -0
- package/dist/src/snapshot/frame-context.js.map +1 -0
- package/dist/src/snapshot/heading-index.d.ts +28 -0
- package/dist/src/snapshot/heading-index.d.ts.map +1 -0
- package/dist/src/snapshot/heading-index.js +108 -0
- package/dist/src/snapshot/heading-index.js.map +1 -0
- package/dist/src/snapshot/index.d.ts +5 -3
- package/dist/src/snapshot/index.d.ts.map +1 -1
- package/dist/src/snapshot/index.js +3 -2
- package/dist/src/snapshot/index.js.map +1 -1
- package/dist/src/snapshot/kind-mapping.d.ts +30 -0
- package/dist/src/snapshot/kind-mapping.d.ts.map +1 -0
- package/dist/src/snapshot/kind-mapping.js +114 -0
- package/dist/src/snapshot/kind-mapping.js.map +1 -0
- package/dist/src/snapshot/node-filter.d.ts +31 -0
- package/dist/src/snapshot/node-filter.d.ts.map +1 -0
- package/dist/src/snapshot/node-filter.js +137 -0
- package/dist/src/snapshot/node-filter.js.map +1 -0
- package/dist/src/snapshot/node-synthesizer.d.ts +62 -0
- package/dist/src/snapshot/node-synthesizer.d.ts.map +1 -0
- package/dist/src/snapshot/node-synthesizer.js +185 -0
- package/dist/src/snapshot/node-synthesizer.js.map +1 -0
- package/dist/src/snapshot/snapshot-compiler.d.ts +2 -36
- package/dist/src/snapshot/snapshot-compiler.d.ts.map +1 -1
- package/dist/src/snapshot/snapshot-compiler.js +28 -520
- package/dist/src/snapshot/snapshot-compiler.js.map +1 -1
- package/dist/src/snapshot/snapshot.types.d.ts +7 -2
- package/dist/src/snapshot/snapshot.types.d.ts.map +1 -1
- package/dist/src/snapshot/snapshot.types.js +9 -0
- package/dist/src/snapshot/snapshot.types.js.map +1 -1
- package/dist/src/state/actionables-filter.d.ts +5 -0
- package/dist/src/state/actionables-filter.d.ts.map +1 -1
- package/dist/src/state/actionables-filter.js +22 -3
- package/dist/src/state/actionables-filter.js.map +1 -1
- package/dist/src/state/diff-engine.js +3 -3
- package/dist/src/state/diff-engine.js.map +1 -1
- package/dist/src/state/element-registry.d.ts.map +1 -1
- package/dist/src/state/element-registry.js +6 -4
- package/dist/src/state/element-registry.js.map +1 -1
- package/dist/src/state/hash-utils.d.ts +24 -0
- package/dist/src/state/hash-utils.d.ts.map +1 -0
- package/dist/src/state/hash-utils.js +41 -0
- package/dist/src/state/hash-utils.js.map +1 -0
- package/dist/src/state/layer-detector.d.ts.map +1 -1
- package/dist/src/state/layer-detector.js +15 -286
- package/dist/src/state/layer-detector.js.map +1 -1
- package/dist/src/state/layer-detectors/drawer-detector.d.ts +32 -0
- package/dist/src/state/layer-detectors/drawer-detector.d.ts.map +1 -0
- package/dist/src/state/layer-detectors/drawer-detector.js +96 -0
- package/dist/src/state/layer-detectors/drawer-detector.js.map +1 -0
- package/dist/src/state/layer-detectors/index.d.ts +10 -0
- package/dist/src/state/layer-detectors/index.d.ts.map +1 -0
- package/dist/src/state/layer-detectors/index.js +10 -0
- package/dist/src/state/layer-detectors/index.js.map +1 -0
- package/dist/src/state/layer-detectors/modal-detector.d.ts +30 -0
- package/dist/src/state/layer-detectors/modal-detector.d.ts.map +1 -0
- package/dist/src/state/layer-detectors/modal-detector.js +127 -0
- package/dist/src/state/layer-detectors/modal-detector.js.map +1 -0
- package/dist/src/state/layer-detectors/popover-detector.d.ts +20 -0
- package/dist/src/state/layer-detectors/popover-detector.d.ts.map +1 -0
- package/dist/src/state/layer-detectors/popover-detector.js +76 -0
- package/dist/src/state/layer-detectors/popover-detector.js.map +1 -0
- package/dist/src/state/layer-detectors/toast-detector.d.ts +24 -0
- package/dist/src/state/layer-detectors/toast-detector.d.ts.map +1 -0
- package/dist/src/state/layer-detectors/toast-detector.js +48 -0
- package/dist/src/state/layer-detectors/toast-detector.js.map +1 -0
- package/dist/src/state/region-mapping.d.ts +13 -0
- package/dist/src/state/region-mapping.d.ts.map +1 -0
- package/dist/src/state/region-mapping.js +25 -0
- package/dist/src/state/region-mapping.js.map +1 -0
- package/dist/src/state/state-manager.d.ts.map +1 -1
- package/dist/src/state/state-manager.js +8 -192
- package/dist/src/state/state-manager.js.map +1 -1
- package/dist/src/state/state-renderer.d.ts.map +1 -1
- package/dist/src/state/state-renderer.js +16 -2
- package/dist/src/state/state-renderer.js.map +1 -1
- package/dist/src/state/types.d.ts +8 -4
- package/dist/src/state/types.d.ts.map +1 -1
- package/dist/src/state/url-sanitization.d.ts +22 -0
- package/dist/src/state/url-sanitization.d.ts.map +1 -0
- package/dist/src/state/url-sanitization.js +60 -0
- package/dist/src/state/url-sanitization.js.map +1 -0
- package/dist/src/state/value-masking.d.ts +36 -0
- package/dist/src/state/value-masking.d.ts.map +1 -0
- package/dist/src/state/value-masking.js +86 -0
- package/dist/src/state/value-masking.js.map +1 -0
- package/dist/src/tools/action-context.d.ts +60 -0
- package/dist/src/tools/action-context.d.ts.map +1 -0
- package/dist/src/tools/action-context.js +78 -0
- package/dist/src/tools/action-context.js.map +1 -0
- package/dist/src/tools/action-stabilization.d.ts +48 -0
- package/dist/src/tools/action-stabilization.d.ts.map +1 -0
- package/dist/src/tools/action-stabilization.js +87 -0
- package/dist/src/tools/action-stabilization.js.map +1 -0
- package/dist/src/tools/browser-tools.d.ts +8 -146
- package/dist/src/tools/browser-tools.d.ts.map +1 -1
- package/dist/src/tools/browser-tools.js +13 -689
- package/dist/src/tools/browser-tools.js.map +1 -1
- package/dist/src/tools/canvas-tools.d.ts +32 -0
- package/dist/src/tools/canvas-tools.d.ts.map +1 -0
- package/dist/src/tools/canvas-tools.js +370 -0
- package/dist/src/tools/canvas-tools.js.map +1 -0
- package/dist/src/tools/effect-tracker.d.ts +25 -0
- package/dist/src/tools/effect-tracker.d.ts.map +1 -0
- package/dist/src/tools/effect-tracker.js +69 -0
- package/dist/src/tools/effect-tracker.js.map +1 -0
- package/dist/src/tools/execute-action.d.ts +1 -31
- package/dist/src/tools/execute-action.d.ts.map +1 -1
- package/dist/src/tools/execute-action.js +7 -276
- package/dist/src/tools/execute-action.js.map +1 -1
- package/dist/src/tools/form-tools.d.ts +4 -6
- package/dist/src/tools/form-tools.d.ts.map +1 -1
- package/dist/src/tools/form-tools.js +10 -42
- package/dist/src/tools/form-tools.js.map +1 -1
- package/dist/src/tools/index.d.ts +6 -4
- package/dist/src/tools/index.d.ts.map +1 -1
- package/dist/src/tools/index.js +21 -10
- package/dist/src/tools/index.js.map +1 -1
- package/dist/src/tools/interaction-tools.d.ts +46 -0
- package/dist/src/tools/interaction-tools.d.ts.map +1 -0
- package/dist/src/tools/interaction-tools.js +138 -0
- package/dist/src/tools/interaction-tools.js.map +1 -0
- package/dist/src/tools/navigation-detection.d.ts +31 -0
- package/dist/src/tools/navigation-detection.d.ts.map +1 -0
- package/dist/src/tools/navigation-detection.js +46 -0
- package/dist/src/tools/navigation-detection.js.map +1 -0
- package/dist/src/tools/navigation-tools.d.ts +57 -0
- package/dist/src/tools/navigation-tools.d.ts.map +1 -0
- package/dist/src/tools/navigation-tools.js +178 -0
- package/dist/src/tools/navigation-tools.js.map +1 -0
- package/dist/src/tools/observation-tools.d.ts +53 -0
- package/dist/src/tools/observation-tools.d.ts.map +1 -0
- package/dist/src/tools/observation-tools.js +247 -0
- package/dist/src/tools/observation-tools.js.map +1 -0
- package/dist/src/tools/response-builder.js +2 -2
- package/dist/src/tools/response-builder.js.map +1 -1
- package/dist/src/tools/stale-element-retry.d.ts +37 -0
- package/dist/src/tools/stale-element-retry.d.ts.map +1 -0
- package/dist/src/tools/stale-element-retry.js +68 -0
- package/dist/src/tools/stale-element-retry.js.map +1 -0
- package/dist/src/tools/state-manager-registry.d.ts +26 -0
- package/dist/src/tools/state-manager-registry.d.ts.map +1 -0
- package/dist/src/tools/state-manager-registry.js +39 -0
- package/dist/src/tools/state-manager-registry.js.map +1 -0
- package/dist/src/tools/tool-context.d.ts +53 -0
- package/dist/src/tools/tool-context.d.ts.map +1 -0
- package/dist/src/tools/tool-context.js +119 -0
- package/dist/src/tools/tool-context.js.map +1 -0
- package/dist/src/tools/tool-result.types.d.ts +16 -1
- package/dist/src/tools/tool-result.types.d.ts.map +1 -1
- package/dist/src/tools/tool-result.types.js +11 -0
- package/dist/src/tools/tool-result.types.js.map +1 -1
- package/dist/src/tools/tool-schemas.d.ts +358 -146
- package/dist/src/tools/tool-schemas.d.ts.map +1 -1
- package/dist/src/tools/tool-schemas.js +142 -19
- package/dist/src/tools/tool-schemas.js.map +1 -1
- package/dist/src/tools/viewport-tools.d.ts +36 -0
- package/dist/src/tools/viewport-tools.d.ts.map +1 -0
- package/dist/src/tools/viewport-tools.js +105 -0
- package/dist/src/tools/viewport-tools.js.map +1 -0
- package/package.json +1 -1
|
@@ -5,6 +5,10 @@
|
|
|
5
5
|
* Only return actionables from the active (topmost) layer.
|
|
6
6
|
*/
|
|
7
7
|
import { computeEid } from './element-identity.js';
|
|
8
|
+
import { detectModal } from './layer-detectors/modal-detector.js';
|
|
9
|
+
import { detectDrawer } from './layer-detectors/drawer-detector.js';
|
|
10
|
+
import { detectPopover } from './layer-detectors/popover-detector.js';
|
|
11
|
+
import { detectToast } from './layer-detectors/toast-detector.js';
|
|
8
12
|
// ============================================================================
|
|
9
13
|
// Layer Detection
|
|
10
14
|
// ============================================================================
|
|
@@ -41,6 +45,12 @@ export function detectLayers(snapshot) {
|
|
|
41
45
|
const popoverMatch = detectPopover(node);
|
|
42
46
|
if (popoverMatch) {
|
|
43
47
|
candidates.push(popoverMatch);
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
// Toast detection (lowest priority overlay)
|
|
51
|
+
const toastMatch = detectToast(node);
|
|
52
|
+
if (toastMatch) {
|
|
53
|
+
candidates.push(toastMatch);
|
|
44
54
|
}
|
|
45
55
|
}
|
|
46
56
|
// Sort by z-index (highest first), filter low confidence
|
|
@@ -57,8 +67,11 @@ export function detectLayers(snapshot) {
|
|
|
57
67
|
isModal: layer.isModal,
|
|
58
68
|
});
|
|
59
69
|
}
|
|
60
|
-
// Determine active layer (topmost)
|
|
61
|
-
|
|
70
|
+
// Determine active layer (topmost non-toast layer)
|
|
71
|
+
// Toast layers are non-blocking and should never become the active layer.
|
|
72
|
+
// Main is always at index 0, so the filtered stack is never empty.
|
|
73
|
+
const nonToastStack = stack.filter((l) => l.type !== 'toast');
|
|
74
|
+
const active = nonToastStack[nonToastStack.length - 1].type;
|
|
62
75
|
// Find focused element
|
|
63
76
|
const focusEid = detectFocusedElement(snapshot);
|
|
64
77
|
return {
|
|
@@ -69,290 +82,6 @@ export function detectLayers(snapshot) {
|
|
|
69
82
|
};
|
|
70
83
|
}
|
|
71
84
|
// ============================================================================
|
|
72
|
-
// Modal Detection
|
|
73
|
-
// ============================================================================
|
|
74
|
-
/**
|
|
75
|
-
* Detect if node is a modal layer.
|
|
76
|
-
*
|
|
77
|
-
* Patterns:
|
|
78
|
-
* - role="dialog" or role="alertdialog" + aria-modal="true"
|
|
79
|
-
* - <dialog open>
|
|
80
|
-
* - High z-index (>1000) with dialog role
|
|
81
|
-
* - React/Vue portal containers with modal content
|
|
82
|
-
*
|
|
83
|
-
* @param node - Node to check
|
|
84
|
-
* @returns Layer candidate or null
|
|
85
|
-
*/
|
|
86
|
-
function detectModal(node) {
|
|
87
|
-
const attrs = node.attributes;
|
|
88
|
-
const role = node.attributes?.role;
|
|
89
|
-
// Pattern 1: role="dialog" or role="alertdialog" + aria-modal="true"
|
|
90
|
-
if ((role === 'dialog' || role === 'alertdialog') && attrs?.['aria-modal'] === 'true') {
|
|
91
|
-
return {
|
|
92
|
-
type: 'modal',
|
|
93
|
-
rootEid: computeEid(node, 'modal'),
|
|
94
|
-
zIndex: node.layout.zIndex ?? 0,
|
|
95
|
-
isModal: true,
|
|
96
|
-
confidence: 1.0,
|
|
97
|
-
};
|
|
98
|
-
}
|
|
99
|
-
// Pattern 2: <dialog> element with open attribute
|
|
100
|
-
if (node.kind === 'dialog' && attrs?.open === true) {
|
|
101
|
-
return {
|
|
102
|
-
type: 'modal',
|
|
103
|
-
rootEid: computeEid(node, 'modal'),
|
|
104
|
-
zIndex: node.layout.zIndex ?? 0,
|
|
105
|
-
isModal: true,
|
|
106
|
-
confidence: 0.95,
|
|
107
|
-
};
|
|
108
|
-
}
|
|
109
|
-
// Pattern 3: alertdialog without aria-modal (still modal by nature)
|
|
110
|
-
if (role === 'alertdialog') {
|
|
111
|
-
return {
|
|
112
|
-
type: 'modal',
|
|
113
|
-
rootEid: computeEid(node, 'modal'),
|
|
114
|
-
zIndex: node.layout.zIndex ?? 0,
|
|
115
|
-
isModal: true,
|
|
116
|
-
confidence: 0.9,
|
|
117
|
-
};
|
|
118
|
-
}
|
|
119
|
-
// Pattern 4: High z-index dialog (>1000)
|
|
120
|
-
if (role === 'dialog' && (node.layout.zIndex ?? 0) > 1000) {
|
|
121
|
-
return {
|
|
122
|
-
type: 'modal',
|
|
123
|
-
rootEid: computeEid(node, 'modal'),
|
|
124
|
-
zIndex: node.layout.zIndex ?? 0,
|
|
125
|
-
isModal: true,
|
|
126
|
-
confidence: 0.8,
|
|
127
|
-
};
|
|
128
|
-
}
|
|
129
|
-
// Pattern 5: Portal container detection (React/Vue/Angular)
|
|
130
|
-
// Common portal container patterns
|
|
131
|
-
if (isPortalContainer(node, attrs)) {
|
|
132
|
-
return {
|
|
133
|
-
type: 'modal',
|
|
134
|
-
rootEid: computeEid(node, 'modal'),
|
|
135
|
-
zIndex: node.layout.zIndex ?? 0,
|
|
136
|
-
isModal: true,
|
|
137
|
-
confidence: 0.75,
|
|
138
|
-
};
|
|
139
|
-
}
|
|
140
|
-
return null;
|
|
141
|
-
}
|
|
142
|
-
/**
|
|
143
|
-
* Check if node is a portal container (React/Vue/Angular patterns).
|
|
144
|
-
*
|
|
145
|
-
* @param node - Node to check
|
|
146
|
-
* @param attrs - Node attributes
|
|
147
|
-
* @returns True if portal container
|
|
148
|
-
*/
|
|
149
|
-
function isPortalContainer(node, attrs) {
|
|
150
|
-
const zIndex = node.layout.zIndex ?? 0;
|
|
151
|
-
// Must have high z-index
|
|
152
|
-
if (zIndex < 100) {
|
|
153
|
-
return false;
|
|
154
|
-
}
|
|
155
|
-
// Check for common portal container attributes/classes
|
|
156
|
-
const className = attrs?.class ?? attrs?.className;
|
|
157
|
-
if (typeof className === 'string') {
|
|
158
|
-
const portalPatterns = [
|
|
159
|
-
'modal',
|
|
160
|
-
'dialog',
|
|
161
|
-
'overlay',
|
|
162
|
-
'portal',
|
|
163
|
-
'ReactModal',
|
|
164
|
-
'MuiModal',
|
|
165
|
-
'chakra-modal',
|
|
166
|
-
'ant-modal',
|
|
167
|
-
'el-dialog', // Element UI
|
|
168
|
-
'v-dialog', // Vuetify
|
|
169
|
-
];
|
|
170
|
-
const lowerClassName = className.toLowerCase();
|
|
171
|
-
if (portalPatterns.some((p) => lowerClassName.includes(p.toLowerCase()))) {
|
|
172
|
-
return true;
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
// Check for data attributes indicating portal
|
|
176
|
-
const dataPortal = attrs?.['data-portal'];
|
|
177
|
-
const dataOverlay = attrs?.['data-overlay'];
|
|
178
|
-
const dataModal = attrs?.['data-modal'];
|
|
179
|
-
if (dataPortal === true || dataOverlay === true || dataModal === true) {
|
|
180
|
-
return true;
|
|
181
|
-
}
|
|
182
|
-
// Check for aria-hidden siblings pattern (portal often has aria-hidden on root)
|
|
183
|
-
// This is detected by high z-index + covering most of viewport
|
|
184
|
-
const bbox = node.layout.bbox;
|
|
185
|
-
if (bbox && zIndex > 500) {
|
|
186
|
-
// If element covers significant viewport area with high z-index
|
|
187
|
-
if (bbox.w > 200 && bbox.h > 200) {
|
|
188
|
-
return true;
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
return false;
|
|
192
|
-
}
|
|
193
|
-
// ============================================================================
|
|
194
|
-
// Drawer Detection
|
|
195
|
-
// ============================================================================
|
|
196
|
-
/**
|
|
197
|
-
* Detect if node is a drawer layer.
|
|
198
|
-
*
|
|
199
|
-
* Patterns:
|
|
200
|
-
* - role="complementary" or role="navigation" + edge-positioned + high z-index
|
|
201
|
-
* - Slide-in panel patterns from UI libraries
|
|
202
|
-
*
|
|
203
|
-
* @param node - Node to check
|
|
204
|
-
* @returns Layer candidate or null
|
|
205
|
-
*/
|
|
206
|
-
function detectDrawer(node) {
|
|
207
|
-
const role = node.attributes?.role;
|
|
208
|
-
const zIndex = node.layout.zIndex ?? 0;
|
|
209
|
-
const attrs = node.attributes;
|
|
210
|
-
// Must have moderate z-index for overlay drawer
|
|
211
|
-
if (zIndex <= 50) {
|
|
212
|
-
return null;
|
|
213
|
-
}
|
|
214
|
-
// Pattern 1: Complementary role with high z-index
|
|
215
|
-
if (role === 'complementary' && zIndex > 100) {
|
|
216
|
-
return {
|
|
217
|
-
type: 'drawer',
|
|
218
|
-
rootEid: computeEid(node, 'drawer'),
|
|
219
|
-
zIndex,
|
|
220
|
-
isModal: false,
|
|
221
|
-
confidence: 0.7,
|
|
222
|
-
};
|
|
223
|
-
}
|
|
224
|
-
// Pattern 2: Navigation role with high z-index + edge position
|
|
225
|
-
if (role === 'navigation' && zIndex > 100) {
|
|
226
|
-
const bbox = node.layout.bbox;
|
|
227
|
-
if (bbox && isEdgePositioned(bbox)) {
|
|
228
|
-
return {
|
|
229
|
-
type: 'drawer',
|
|
230
|
-
rootEid: computeEid(node, 'drawer'),
|
|
231
|
-
zIndex,
|
|
232
|
-
isModal: false,
|
|
233
|
-
confidence: 0.75,
|
|
234
|
-
};
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
// Pattern 3: Common drawer class patterns
|
|
238
|
-
const className = attrs?.class ?? attrs?.className;
|
|
239
|
-
if (typeof className === 'string' && zIndex > 50) {
|
|
240
|
-
const drawerPatterns = [
|
|
241
|
-
'drawer',
|
|
242
|
-
'sidebar',
|
|
243
|
-
'side-nav',
|
|
244
|
-
'sidenav',
|
|
245
|
-
'offcanvas',
|
|
246
|
-
'slide-in',
|
|
247
|
-
'MuiDrawer',
|
|
248
|
-
'ant-drawer',
|
|
249
|
-
'el-drawer',
|
|
250
|
-
'v-navigation-drawer',
|
|
251
|
-
];
|
|
252
|
-
const lowerClassName = className.toLowerCase();
|
|
253
|
-
if (drawerPatterns.some((p) => lowerClassName.includes(p.toLowerCase()))) {
|
|
254
|
-
return {
|
|
255
|
-
type: 'drawer',
|
|
256
|
-
rootEid: computeEid(node, 'drawer'),
|
|
257
|
-
zIndex,
|
|
258
|
-
isModal: false,
|
|
259
|
-
confidence: 0.7,
|
|
260
|
-
};
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
|
-
return null;
|
|
264
|
-
}
|
|
265
|
-
/**
|
|
266
|
-
* Check if bounding box is edge-positioned (left or right edge).
|
|
267
|
-
*
|
|
268
|
-
* @param bbox - Bounding box {x, y, w, h}
|
|
269
|
-
* @returns True if positioned at edge
|
|
270
|
-
*/
|
|
271
|
-
function isEdgePositioned(bbox) {
|
|
272
|
-
// Left edge: x near 0
|
|
273
|
-
if (bbox.x < 10) {
|
|
274
|
-
return true;
|
|
275
|
-
}
|
|
276
|
-
// Right edge: x + width near typical viewport widths
|
|
277
|
-
// This is a heuristic - ideally we'd have viewport width
|
|
278
|
-
const rightEdge = bbox.x + bbox.w;
|
|
279
|
-
if (rightEdge > 1200 && bbox.x > 800) {
|
|
280
|
-
return true;
|
|
281
|
-
}
|
|
282
|
-
return false;
|
|
283
|
-
}
|
|
284
|
-
// ============================================================================
|
|
285
|
-
// Popover Detection
|
|
286
|
-
// ============================================================================
|
|
287
|
-
/**
|
|
288
|
-
* Detect if node is a popover layer.
|
|
289
|
-
*
|
|
290
|
-
* Patterns:
|
|
291
|
-
* - role="menu", "listbox", "tooltip", "dialog" (non-modal) + z-index > 100
|
|
292
|
-
* - Dropdown/popup class patterns
|
|
293
|
-
*
|
|
294
|
-
* @param node - Node to check
|
|
295
|
-
* @returns Layer candidate or null
|
|
296
|
-
*/
|
|
297
|
-
function detectPopover(node) {
|
|
298
|
-
const role = node.attributes?.role;
|
|
299
|
-
const zIndex = node.layout.zIndex ?? 0;
|
|
300
|
-
const attrs = node.attributes;
|
|
301
|
-
if (zIndex <= 100) {
|
|
302
|
-
return null;
|
|
303
|
-
}
|
|
304
|
-
// Pattern 1: Standard popover roles
|
|
305
|
-
const popoverRoles = ['menu', 'listbox', 'tooltip', 'tree'];
|
|
306
|
-
if (role && popoverRoles.includes(role)) {
|
|
307
|
-
return {
|
|
308
|
-
type: 'popover',
|
|
309
|
-
rootEid: computeEid(node, 'popover'),
|
|
310
|
-
zIndex,
|
|
311
|
-
isModal: false,
|
|
312
|
-
confidence: 0.8,
|
|
313
|
-
};
|
|
314
|
-
}
|
|
315
|
-
// Pattern 2: Non-modal dialog (popup)
|
|
316
|
-
if (role === 'dialog' && attrs?.['aria-modal'] !== 'true') {
|
|
317
|
-
return {
|
|
318
|
-
type: 'popover',
|
|
319
|
-
rootEid: computeEid(node, 'popover'),
|
|
320
|
-
zIndex,
|
|
321
|
-
isModal: false,
|
|
322
|
-
confidence: 0.6,
|
|
323
|
-
};
|
|
324
|
-
}
|
|
325
|
-
// Pattern 3: Common popover/dropdown class patterns
|
|
326
|
-
const className = attrs?.class ?? attrs?.className;
|
|
327
|
-
if (typeof className === 'string') {
|
|
328
|
-
const popoverPatterns = [
|
|
329
|
-
'dropdown',
|
|
330
|
-
'popover',
|
|
331
|
-
'popup',
|
|
332
|
-
'tooltip',
|
|
333
|
-
'menu',
|
|
334
|
-
'autocomplete',
|
|
335
|
-
'suggestions',
|
|
336
|
-
'MuiPopover',
|
|
337
|
-
'MuiMenu',
|
|
338
|
-
'ant-dropdown',
|
|
339
|
-
'el-dropdown',
|
|
340
|
-
'el-popover',
|
|
341
|
-
];
|
|
342
|
-
const lowerClassName = className.toLowerCase();
|
|
343
|
-
if (popoverPatterns.some((p) => lowerClassName.includes(p.toLowerCase()))) {
|
|
344
|
-
return {
|
|
345
|
-
type: 'popover',
|
|
346
|
-
rootEid: computeEid(node, 'popover'),
|
|
347
|
-
zIndex,
|
|
348
|
-
isModal: false,
|
|
349
|
-
confidence: 0.65,
|
|
350
|
-
};
|
|
351
|
-
}
|
|
352
|
-
}
|
|
353
|
-
return null;
|
|
354
|
-
}
|
|
355
|
-
// ============================================================================
|
|
356
85
|
// Focused Element Detection
|
|
357
86
|
// ============================================================================
|
|
358
87
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layer-detector.js","sourceRoot":"","sources":["../../../src/state/layer-detector.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"layer-detector.js","sourceRoot":"","sources":["../../../src/state/layer-detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Drawer Detector
|
|
3
|
+
*
|
|
4
|
+
* Detect drawer layers in the snapshot.
|
|
5
|
+
* Patterns: role="complementary" or "navigation" + edge-positioned + high z-index.
|
|
6
|
+
*/
|
|
7
|
+
import type { ReadableNode } from '../../snapshot/snapshot.types.js';
|
|
8
|
+
import type { LayerCandidate } from '../types.js';
|
|
9
|
+
/**
|
|
10
|
+
* Detect if node is a drawer layer.
|
|
11
|
+
*
|
|
12
|
+
* Patterns:
|
|
13
|
+
* - role="complementary" or role="navigation" + edge-positioned + high z-index
|
|
14
|
+
* - Slide-in panel patterns from UI libraries
|
|
15
|
+
*
|
|
16
|
+
* @param node - Node to check
|
|
17
|
+
* @returns Layer candidate or null
|
|
18
|
+
*/
|
|
19
|
+
export declare function detectDrawer(node: ReadableNode): LayerCandidate | null;
|
|
20
|
+
/**
|
|
21
|
+
* Check if bounding box is edge-positioned (left or right edge).
|
|
22
|
+
*
|
|
23
|
+
* @param bbox - Bounding box {x, y, w, h}
|
|
24
|
+
* @returns True if positioned at edge
|
|
25
|
+
*/
|
|
26
|
+
export declare function isEdgePositioned(bbox: {
|
|
27
|
+
x: number;
|
|
28
|
+
y: number;
|
|
29
|
+
w: number;
|
|
30
|
+
h: number;
|
|
31
|
+
}): boolean;
|
|
32
|
+
//# sourceMappingURL=drawer-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drawer-detector.d.ts","sourceRoot":"","sources":["../../../../src/state/layer-detectors/drawer-detector.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAGlD;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,YAAY,GAAG,cAAc,GAAG,IAAI,CAgEtE;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAc9F"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Drawer Detector
|
|
3
|
+
*
|
|
4
|
+
* Detect drawer layers in the snapshot.
|
|
5
|
+
* Patterns: role="complementary" or "navigation" + edge-positioned + high z-index.
|
|
6
|
+
*/
|
|
7
|
+
import { computeEid } from '../element-identity.js';
|
|
8
|
+
/**
|
|
9
|
+
* Detect if node is a drawer layer.
|
|
10
|
+
*
|
|
11
|
+
* Patterns:
|
|
12
|
+
* - role="complementary" or role="navigation" + edge-positioned + high z-index
|
|
13
|
+
* - Slide-in panel patterns from UI libraries
|
|
14
|
+
*
|
|
15
|
+
* @param node - Node to check
|
|
16
|
+
* @returns Layer candidate or null
|
|
17
|
+
*/
|
|
18
|
+
export function detectDrawer(node) {
|
|
19
|
+
const role = node.attributes?.role;
|
|
20
|
+
const zIndex = node.layout.zIndex ?? 0;
|
|
21
|
+
const attrs = node.attributes;
|
|
22
|
+
// Must have moderate z-index for overlay drawer
|
|
23
|
+
if (zIndex <= 50) {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
// Pattern 1: Complementary role with high z-index
|
|
27
|
+
if (role === 'complementary' && zIndex > 100) {
|
|
28
|
+
return {
|
|
29
|
+
type: 'drawer',
|
|
30
|
+
rootEid: computeEid(node, 'drawer'),
|
|
31
|
+
zIndex,
|
|
32
|
+
isModal: false,
|
|
33
|
+
confidence: 0.7,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
// Pattern 2: Navigation role with high z-index + edge position
|
|
37
|
+
if (role === 'navigation' && zIndex > 100) {
|
|
38
|
+
const bbox = node.layout.bbox;
|
|
39
|
+
if (bbox && isEdgePositioned(bbox)) {
|
|
40
|
+
return {
|
|
41
|
+
type: 'drawer',
|
|
42
|
+
rootEid: computeEid(node, 'drawer'),
|
|
43
|
+
zIndex,
|
|
44
|
+
isModal: false,
|
|
45
|
+
confidence: 0.75,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
// Pattern 3: Common drawer class patterns
|
|
50
|
+
const className = attrs?.class ?? attrs?.className;
|
|
51
|
+
if (typeof className === 'string' && zIndex > 50) {
|
|
52
|
+
const drawerPatterns = [
|
|
53
|
+
'drawer',
|
|
54
|
+
'sidebar',
|
|
55
|
+
'side-nav',
|
|
56
|
+
'sidenav',
|
|
57
|
+
'offcanvas',
|
|
58
|
+
'slide-in',
|
|
59
|
+
'MuiDrawer',
|
|
60
|
+
'ant-drawer',
|
|
61
|
+
'el-drawer',
|
|
62
|
+
'v-navigation-drawer',
|
|
63
|
+
];
|
|
64
|
+
const lowerClassName = className.toLowerCase();
|
|
65
|
+
if (drawerPatterns.some((p) => lowerClassName.includes(p.toLowerCase()))) {
|
|
66
|
+
return {
|
|
67
|
+
type: 'drawer',
|
|
68
|
+
rootEid: computeEid(node, 'drawer'),
|
|
69
|
+
zIndex,
|
|
70
|
+
isModal: false,
|
|
71
|
+
confidence: 0.7,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Check if bounding box is edge-positioned (left or right edge).
|
|
79
|
+
*
|
|
80
|
+
* @param bbox - Bounding box {x, y, w, h}
|
|
81
|
+
* @returns True if positioned at edge
|
|
82
|
+
*/
|
|
83
|
+
export function isEdgePositioned(bbox) {
|
|
84
|
+
// Left edge: x near 0
|
|
85
|
+
if (bbox.x < 10) {
|
|
86
|
+
return true;
|
|
87
|
+
}
|
|
88
|
+
// Right edge: x + width near typical viewport widths
|
|
89
|
+
// This is a heuristic - ideally we'd have viewport width
|
|
90
|
+
const rightEdge = bbox.x + bbox.w;
|
|
91
|
+
if (rightEdge > 1200 && bbox.x > 800) {
|
|
92
|
+
return true;
|
|
93
|
+
}
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=drawer-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drawer-detector.js","sourceRoot":"","sources":["../../../../src/state/layer-detectors/drawer-detector.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEpD;;;;;;;;;GASG;AACH,MAAM,UAAU,YAAY,CAAC,IAAkB;IAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC;IACnC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;IACvC,MAAM,KAAK,GAAG,IAAI,CAAC,UAAiD,CAAC;IAErE,gDAAgD;IAChD,IAAI,MAAM,IAAI,EAAE,EAAE,CAAC;QACjB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,kDAAkD;IAClD,IAAI,IAAI,KAAK,eAAe,IAAI,MAAM,GAAG,GAAG,EAAE,CAAC;QAC7C,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC;YACnC,MAAM;YACN,OAAO,EAAE,KAAK;YACd,UAAU,EAAE,GAAG;SAChB,CAAC;IACJ,CAAC;IAED,+DAA+D;IAC/D,IAAI,IAAI,KAAK,YAAY,IAAI,MAAM,GAAG,GAAG,EAAE,CAAC;QAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;QAC9B,IAAI,IAAI,IAAI,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;YACnC,OAAO;gBACL,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC;gBACnC,MAAM;gBACN,OAAO,EAAE,KAAK;gBACd,UAAU,EAAE,IAAI;aACjB,CAAC;QACJ,CAAC;IACH,CAAC;IAED,0CAA0C;IAC1C,MAAM,SAAS,GAAG,KAAK,EAAE,KAAK,IAAI,KAAK,EAAE,SAAS,CAAC;IACnD,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,MAAM,GAAG,EAAE,EAAE,CAAC;QACjD,MAAM,cAAc,GAAG;YACrB,QAAQ;YACR,SAAS;YACT,UAAU;YACV,SAAS;YACT,WAAW;YACX,UAAU;YACV,WAAW;YACX,YAAY;YACZ,WAAW;YACX,qBAAqB;SACtB,CAAC;QAEF,MAAM,cAAc,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC;QAC/C,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,CAAC;YACzE,OAAO;gBACL,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC;gBACnC,MAAM;gBACN,OAAO,EAAE,KAAK;gBACd,UAAU,EAAE,GAAG;aAChB,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAoD;IACnF,sBAAsB;IACtB,IAAI,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC;QAChB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,qDAAqD;IACrD,yDAAyD;IACzD,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IAClC,IAAI,SAAS,GAAG,IAAI,IAAI,IAAI,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC;QACrC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Layer Detectors
|
|
3
|
+
*
|
|
4
|
+
* Individual layer detection functions for modal, drawer, popover, and toast patterns.
|
|
5
|
+
*/
|
|
6
|
+
export { detectModal, isPortalContainer } from './modal-detector.js';
|
|
7
|
+
export { detectDrawer, isEdgePositioned } from './drawer-detector.js';
|
|
8
|
+
export { detectPopover } from './popover-detector.js';
|
|
9
|
+
export { detectToast, TOAST_ROLES } from './toast-detector.js';
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/state/layer-detectors/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACrE,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Layer Detectors
|
|
3
|
+
*
|
|
4
|
+
* Individual layer detection functions for modal, drawer, popover, and toast patterns.
|
|
5
|
+
*/
|
|
6
|
+
export { detectModal, isPortalContainer } from './modal-detector.js';
|
|
7
|
+
export { detectDrawer, isEdgePositioned } from './drawer-detector.js';
|
|
8
|
+
export { detectPopover } from './popover-detector.js';
|
|
9
|
+
export { detectToast, TOAST_ROLES } from './toast-detector.js';
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/state/layer-detectors/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACrE,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Modal Detector
|
|
3
|
+
*
|
|
4
|
+
* Detect modal layers in the snapshot.
|
|
5
|
+
* Patterns: role="dialog" + aria-modal, <dialog open>, portal containers.
|
|
6
|
+
*/
|
|
7
|
+
import type { ReadableNode } from '../../snapshot/snapshot.types.js';
|
|
8
|
+
import type { LayerCandidate } from '../types.js';
|
|
9
|
+
/**
|
|
10
|
+
* Detect if node is a modal layer.
|
|
11
|
+
*
|
|
12
|
+
* Patterns:
|
|
13
|
+
* - role="dialog" or role="alertdialog" + aria-modal="true"
|
|
14
|
+
* - <dialog open>
|
|
15
|
+
* - High z-index (>1000) with dialog role
|
|
16
|
+
* - React/Vue portal containers with modal content
|
|
17
|
+
*
|
|
18
|
+
* @param node - Node to check
|
|
19
|
+
* @returns Layer candidate or null
|
|
20
|
+
*/
|
|
21
|
+
export declare function detectModal(node: ReadableNode): LayerCandidate | null;
|
|
22
|
+
/**
|
|
23
|
+
* Check if node is a portal container (React/Vue/Angular patterns).
|
|
24
|
+
*
|
|
25
|
+
* @param node - Node to check
|
|
26
|
+
* @param attrs - Node attributes
|
|
27
|
+
* @returns True if portal container
|
|
28
|
+
*/
|
|
29
|
+
export declare function isPortalContainer(node: ReadableNode, attrs: Record<string, unknown> | undefined): boolean;
|
|
30
|
+
//# sourceMappingURL=modal-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modal-detector.d.ts","sourceRoot":"","sources":["../../../../src/state/layer-detectors/modal-detector.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAGlD;;;;;;;;;;;GAWG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,YAAY,GAAG,cAAc,GAAG,IAAI,CA6DrE;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,YAAY,EAClB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GACzC,OAAO,CAkDT"}
|