@lukso/transaction-view-core 0.6.3-dev.e33b252 → 0.6.4-dev.ba618e9
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/.turbo/turbo-build.log +18 -18
- package/.turbo/turbo-typecheck.log +1 -1
- package/CHANGELOG.md +15 -0
- package/dist/index.cjs +281 -6
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +93 -2
- package/dist/index.d.ts +93 -2
- package/dist/index.js +285 -6
- package/dist/index.js.map +1 -1
- package/dist/shared/index.cjs +1 -1
- package/dist/shared/index.cjs.map +1 -1
- package/dist/shared/index.js +1 -1
- package/dist/shared/index.js.map +1 -1
- package/dist/styles/index.cjs +1 -1
- package/dist/styles/index.cjs.map +1 -1
- package/dist/styles/index.js +1 -1
- package/dist/styles/index.js.map +1 -1
- package/package.json +5 -5
- package/src/components/transaction-playback.ts +144 -186
- package/src/index.ts +1 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lukso/transaction-view-core",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.4-dev.ba618e9",
|
|
4
4
|
"description": "Core components and hooks for LUKSO transaction display",
|
|
5
5
|
"main": "./dist/index.cjs",
|
|
6
6
|
"module": "./dist/index.js",
|
|
@@ -31,12 +31,12 @@
|
|
|
31
31
|
},
|
|
32
32
|
"dependencies": {
|
|
33
33
|
"@lit/task": "^1.0.3",
|
|
34
|
-
"@lukso/web-components": "^1.172.
|
|
34
|
+
"@lukso/web-components": "^1.172.18",
|
|
35
35
|
"@preact/signals-core": "^1.12.1",
|
|
36
36
|
"ethereum-blockies-base64": "^1.0.2",
|
|
37
|
-
"lit": "
|
|
38
|
-
"@lukso/transaction-decoder": "1.3.
|
|
39
|
-
"@lukso/transaction-view-headless": "0.4.
|
|
37
|
+
"lit": "3.3.1",
|
|
38
|
+
"@lukso/transaction-decoder": "1.3.4-dev.ba618e9",
|
|
39
|
+
"@lukso/transaction-view-headless": "0.4.4-dev.ba618e9"
|
|
40
40
|
},
|
|
41
41
|
"devDependencies": {
|
|
42
42
|
"@tailwindcss/typography": "^0.5.19",
|
|
@@ -1,17 +1,21 @@
|
|
|
1
1
|
import type { DecoderResult } from '@lukso/transaction-decoder'
|
|
2
2
|
import {
|
|
3
3
|
createTransactionPlayback,
|
|
4
|
+
isHeaderInfoEvent,
|
|
4
5
|
type PlaybackIndexResult,
|
|
6
|
+
type TransactionHeaderInfo,
|
|
5
7
|
type TransactionPlaybackState,
|
|
8
|
+
TransactionViewEvents,
|
|
6
9
|
type ViewContext,
|
|
7
10
|
type ViewVariant,
|
|
8
11
|
} from '@lukso/transaction-view-headless'
|
|
9
|
-
import {
|
|
12
|
+
import { html, type PropertyValues } from 'lit'
|
|
10
13
|
import { property, state } from 'lit/decorators.js'
|
|
11
14
|
import { createRef, type Ref, ref } from 'lit/directives/ref.js'
|
|
12
15
|
import { when } from 'lit/directives/when.js'
|
|
13
16
|
import { getGlobalLitLoader } from '../registry/lit-view-loader'
|
|
14
17
|
import { safeCustomElement } from '../shared/safe-custom-element'
|
|
18
|
+
import { CoreLitElement } from '../styles'
|
|
15
19
|
|
|
16
20
|
/**
|
|
17
21
|
* Lit Transaction Playback Component
|
|
@@ -34,6 +38,11 @@ import { safeCustomElement } from '../shared/safe-custom-element'
|
|
|
34
38
|
* - context: WHERE the transaction is displayed (approval, feed, list, detail, etc.)
|
|
35
39
|
* - variant: HOW the transaction should be rendered (full, collapsed, minimal, etc.)
|
|
36
40
|
*
|
|
41
|
+
* **Header Events:**
|
|
42
|
+
* - Listens for 'header-info' events from child views
|
|
43
|
+
* - Child views can emit header-info to override default from/to addresses
|
|
44
|
+
* - Example: Transfer view can show transfer's from/to instead of execute's from/to
|
|
45
|
+
*
|
|
37
46
|
* @example
|
|
38
47
|
* ```html
|
|
39
48
|
* <!-- Activity feed: compact view -->
|
|
@@ -42,6 +51,7 @@ import { safeCustomElement } from '../shared/safe-custom-element'
|
|
|
42
51
|
* index="1"
|
|
43
52
|
* context="feed"
|
|
44
53
|
* variant="compact"
|
|
54
|
+
* @header-info="${(e) => console.log('Header:', e.detail)}"
|
|
45
55
|
* ></transaction-playback>
|
|
46
56
|
*
|
|
47
57
|
* <!-- Approval flow: full detailed view -->
|
|
@@ -62,7 +72,7 @@ import { safeCustomElement } from '../shared/safe-custom-element'
|
|
|
62
72
|
* ```
|
|
63
73
|
*/
|
|
64
74
|
@safeCustomElement('transaction-playback')
|
|
65
|
-
export class TransactionPlayback extends
|
|
75
|
+
export class TransactionPlayback extends CoreLitElement {
|
|
66
76
|
/** The root transaction to display */
|
|
67
77
|
@property({ type: Object })
|
|
68
78
|
transaction?: DecoderResult
|
|
@@ -71,9 +81,9 @@ export class TransactionPlayback extends LitElement {
|
|
|
71
81
|
@property({ type: Number })
|
|
72
82
|
index = 1 // Default to index 1 (main transaction, skips batch summary)
|
|
73
83
|
|
|
74
|
-
/** Fallback view ID if no match found */
|
|
84
|
+
/** Fallback view ID if no match found (optional - fallback-screen is registered with lowest priority) */
|
|
75
85
|
@property({ type: String })
|
|
76
|
-
fallbackViewId
|
|
86
|
+
fallbackViewId?: string
|
|
77
87
|
|
|
78
88
|
/** Context: WHERE the transaction is displayed */
|
|
79
89
|
@property({ type: String })
|
|
@@ -102,123 +112,12 @@ export class TransactionPlayback extends LitElement {
|
|
|
102
112
|
@state()
|
|
103
113
|
private loadedComponent?: HTMLElement
|
|
104
114
|
|
|
115
|
+
@state()
|
|
116
|
+
private headerInfo?: TransactionHeaderInfo
|
|
117
|
+
|
|
105
118
|
private componentContainerRef: Ref<HTMLDivElement> = createRef()
|
|
106
119
|
private loader = getGlobalLitLoader()
|
|
107
120
|
|
|
108
|
-
static styles = css`
|
|
109
|
-
:host {
|
|
110
|
-
display: block;
|
|
111
|
-
font-family: Inter, -apple-system, BlinkMacSystemFont, sans-serif;
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
.playback-container {
|
|
115
|
-
position: relative;
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
.loading-state {
|
|
119
|
-
display: flex;
|
|
120
|
-
flex-direction: column;
|
|
121
|
-
align-items: center;
|
|
122
|
-
justify-content: center;
|
|
123
|
-
padding: 60px 20px;
|
|
124
|
-
color: #6b7280;
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
.loading-spinner {
|
|
128
|
-
font-size: 32px;
|
|
129
|
-
margin-bottom: 16px;
|
|
130
|
-
animation: spin 2s linear infinite;
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
@keyframes spin {
|
|
134
|
-
from {
|
|
135
|
-
transform: rotate(0deg);
|
|
136
|
-
}
|
|
137
|
-
to {
|
|
138
|
-
transform: rotate(360deg);
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
.loading-text {
|
|
143
|
-
font-size: 16px;
|
|
144
|
-
font-weight: 500;
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
.error-state {
|
|
148
|
-
display: flex;
|
|
149
|
-
flex-direction: column;
|
|
150
|
-
align-items: center;
|
|
151
|
-
justify-content: center;
|
|
152
|
-
padding: 60px 20px;
|
|
153
|
-
color: #dc2626;
|
|
154
|
-
background: #fef2f2;
|
|
155
|
-
border: 1px solid #fecaca;
|
|
156
|
-
border-radius: 12px;
|
|
157
|
-
margin: 20px;
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
.error-icon {
|
|
161
|
-
font-size: 48px;
|
|
162
|
-
margin-bottom: 16px;
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
.error-title {
|
|
166
|
-
font-size: 18px;
|
|
167
|
-
font-weight: 600;
|
|
168
|
-
margin-bottom: 8px;
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
.error-message {
|
|
172
|
-
font-size: 14px;
|
|
173
|
-
text-align: center;
|
|
174
|
-
line-height: 1.4;
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
.debug-panel {
|
|
178
|
-
margin-top: 16px;
|
|
179
|
-
padding: 12px;
|
|
180
|
-
background: #f9fafb;
|
|
181
|
-
border: 1px solid #e5e7eb;
|
|
182
|
-
border-radius: 8px;
|
|
183
|
-
font-size: 12px;
|
|
184
|
-
font-family: 'Monaco', 'Menlo', monospace;
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
.debug-title {
|
|
188
|
-
font-weight: 600;
|
|
189
|
-
margin-bottom: 8px;
|
|
190
|
-
color: #374151;
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
.debug-item {
|
|
194
|
-
display: flex;
|
|
195
|
-
gap: 8px;
|
|
196
|
-
margin-bottom: 4px;
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
.debug-label {
|
|
200
|
-
font-weight: 500;
|
|
201
|
-
color: #6b7280;
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
.debug-value {
|
|
205
|
-
color: #111827;
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
.debug-valid {
|
|
209
|
-
color: #059669;
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
.debug-invalid {
|
|
213
|
-
color: #dc2626;
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
/* Component container for dynamically loaded content */
|
|
217
|
-
.component-container {
|
|
218
|
-
display: contents;
|
|
219
|
-
}
|
|
220
|
-
`
|
|
221
|
-
|
|
222
121
|
protected willUpdate(changedProperties: PropertyValues): void {
|
|
223
122
|
// Reload when transaction, index, context, or variant changes
|
|
224
123
|
if (
|
|
@@ -241,6 +140,38 @@ export class TransactionPlayback extends LitElement {
|
|
|
241
140
|
}
|
|
242
141
|
}
|
|
243
142
|
|
|
143
|
+
connectedCallback(): void {
|
|
144
|
+
super.connectedCallback()
|
|
145
|
+
// Listen for header-info events from child views
|
|
146
|
+
this.addEventListener(
|
|
147
|
+
TransactionViewEvents.HEADER_INFO,
|
|
148
|
+
this.handleHeaderInfo as EventListener
|
|
149
|
+
)
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
disconnectedCallback(): void {
|
|
153
|
+
super.disconnectedCallback()
|
|
154
|
+
this.removeEventListener(
|
|
155
|
+
TransactionViewEvents.HEADER_INFO,
|
|
156
|
+
this.handleHeaderInfo as EventListener
|
|
157
|
+
)
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
private handleHeaderInfo = (event: Event): void => {
|
|
161
|
+
if (isHeaderInfoEvent(event)) {
|
|
162
|
+
this.headerInfo = event.detail
|
|
163
|
+
|
|
164
|
+
// Re-emit the event so parent containers can also listen
|
|
165
|
+
this.dispatchEvent(
|
|
166
|
+
new CustomEvent(TransactionViewEvents.HEADER_INFO, {
|
|
167
|
+
bubbles: true,
|
|
168
|
+
composed: true,
|
|
169
|
+
detail: event.detail,
|
|
170
|
+
})
|
|
171
|
+
)
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
|
|
244
175
|
private async loadView() {
|
|
245
176
|
if (!this.transaction) {
|
|
246
177
|
this.error = 'No transaction provided'
|
|
@@ -250,6 +181,7 @@ export class TransactionPlayback extends LitElement {
|
|
|
250
181
|
this.isLoading = true
|
|
251
182
|
this.error = undefined
|
|
252
183
|
this.loadedComponent = undefined
|
|
184
|
+
this.headerInfo = undefined // Reset header info on new load
|
|
253
185
|
|
|
254
186
|
try {
|
|
255
187
|
// Create playback state
|
|
@@ -281,13 +213,11 @@ export class TransactionPlayback extends LitElement {
|
|
|
281
213
|
)
|
|
282
214
|
|
|
283
215
|
// Create component instance with transaction data
|
|
216
|
+
// Pass transaction (required) and context/variant (optional) for context-aware rendering
|
|
284
217
|
this.loadedComponent = this.loader.createInstance(componentClass, {
|
|
285
218
|
transaction: this.currentResult.transaction,
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
enhancedInfo: (this.currentResult.transaction as any).enhancedInfo,
|
|
289
|
-
title: this.generateTitle(this.currentResult),
|
|
290
|
-
standard: (this.currentResult.transaction as any).standard,
|
|
219
|
+
...(this.context && { context: this.context }),
|
|
220
|
+
...(this.variant && { variant: this.variant }),
|
|
291
221
|
})
|
|
292
222
|
|
|
293
223
|
this.isLoading = false
|
|
@@ -299,87 +229,92 @@ export class TransactionPlayback extends LitElement {
|
|
|
299
229
|
}
|
|
300
230
|
}
|
|
301
231
|
|
|
302
|
-
private generateTitle(result: PlaybackIndexResult): string {
|
|
303
|
-
if (result.indexInfo.isBatchSummary) {
|
|
304
|
-
const childCount = result.batchInfo.childCount
|
|
305
|
-
return `Batch Operation (${childCount} ${childCount === 1 ? 'transaction' : 'transactions'})`
|
|
306
|
-
}
|
|
307
|
-
|
|
308
|
-
const transaction = result.transaction
|
|
309
|
-
if (!transaction) return 'Transaction'
|
|
310
|
-
|
|
311
|
-
const resultType = transaction.resultType
|
|
312
|
-
|
|
313
|
-
if (!resultType) return 'Transaction'
|
|
314
|
-
|
|
315
|
-
switch (resultType) {
|
|
316
|
-
case 'setData':
|
|
317
|
-
case 'setDataBatch':
|
|
318
|
-
return 'Set Data'
|
|
319
|
-
case 'execute':
|
|
320
|
-
case 'executeBatch':
|
|
321
|
-
return 'Execute'
|
|
322
|
-
case 'create':
|
|
323
|
-
return 'Contract Deployment'
|
|
324
|
-
default:
|
|
325
|
-
if (resultType.includes('transfer')) {
|
|
326
|
-
return 'Transfer'
|
|
327
|
-
}
|
|
328
|
-
return resultType.charAt(0).toUpperCase() + resultType.slice(1)
|
|
329
|
-
}
|
|
330
|
-
}
|
|
331
|
-
|
|
332
232
|
private renderDebugPanel() {
|
|
333
233
|
if (!this.debug || !this.playbackState || !this.currentResult) {
|
|
334
234
|
return html``
|
|
335
235
|
}
|
|
336
236
|
|
|
337
237
|
return html`
|
|
338
|
-
<div class="
|
|
339
|
-
<div class="
|
|
340
|
-
<div class="
|
|
341
|
-
<span class="
|
|
342
|
-
<span class="
|
|
238
|
+
<div class="mt-4 p-3 bg-neutral-10 border border-neutral-20 rounded-lg text-12 font-mono">
|
|
239
|
+
<div class="font-600 mb-2 text-neutral-80">🐛 Playback Debug Info</div>
|
|
240
|
+
<div class="flex gap-2 mb-1">
|
|
241
|
+
<span class="font-500 text-neutral-60">Requested Index:</span>
|
|
242
|
+
<span class="text-neutral-100">${this.currentResult.indexInfo.requested}</span>
|
|
343
243
|
</div>
|
|
344
|
-
<div class="
|
|
345
|
-
<span class="
|
|
346
|
-
<span class="${this.currentResult.indexInfo.isValid ? '
|
|
244
|
+
<div class="flex gap-2 mb-1">
|
|
245
|
+
<span class="font-500 text-neutral-60">Is Valid:</span>
|
|
246
|
+
<span class="${this.currentResult.indexInfo.isValid ? 'text-green-600' : 'text-red-600'}">
|
|
347
247
|
${this.currentResult.indexInfo.isValid ? '✓ Yes' : '✗ No'}
|
|
348
248
|
</span>
|
|
349
249
|
</div>
|
|
350
|
-
<div class="
|
|
351
|
-
<span class="
|
|
352
|
-
<span class="
|
|
250
|
+
<div class="flex gap-2 mb-1">
|
|
251
|
+
<span class="font-500 text-neutral-60">Is Batch:</span>
|
|
252
|
+
<span class="text-neutral-100">
|
|
353
253
|
${this.playbackState.isBatch ? 'Yes' : 'No'}
|
|
354
254
|
</span>
|
|
355
255
|
</div>
|
|
356
|
-
<div class="
|
|
357
|
-
<span class="
|
|
358
|
-
<span class="
|
|
256
|
+
<div class="flex gap-2 mb-1">
|
|
257
|
+
<span class="font-500 text-neutral-60">Is Batch Summary:</span>
|
|
258
|
+
<span class="text-neutral-100">
|
|
359
259
|
${this.currentResult.indexInfo.isBatchSummary ? 'Yes' : 'No'}
|
|
360
260
|
</span>
|
|
361
261
|
</div>
|
|
362
262
|
${when(
|
|
363
263
|
this.currentResult.indexInfo.childIndex != null,
|
|
364
264
|
() => html`
|
|
365
|
-
<div class="
|
|
366
|
-
<span class="
|
|
367
|
-
<span class="
|
|
265
|
+
<div class="flex gap-2 mb-1">
|
|
266
|
+
<span class="font-500 text-neutral-60">Child Index:</span>
|
|
267
|
+
<span class="text-neutral-100">${this.currentResult?.indexInfo.childIndex}</span>
|
|
368
268
|
</div>
|
|
369
269
|
`
|
|
370
270
|
)}
|
|
371
|
-
<div class="
|
|
372
|
-
<span class="
|
|
373
|
-
<span class="
|
|
271
|
+
<div class="flex gap-2 mb-1">
|
|
272
|
+
<span class="font-500 text-neutral-60">Available Indices:</span>
|
|
273
|
+
<span class="text-neutral-100">
|
|
374
274
|
[${this.playbackState?.batchInfo.availableIndices.join(', ')}]
|
|
375
275
|
</span>
|
|
376
276
|
</div>
|
|
377
277
|
${when(
|
|
378
278
|
this.currentResult.match,
|
|
379
279
|
() => html`
|
|
380
|
-
<div class="
|
|
381
|
-
<span class="
|
|
382
|
-
<span class="
|
|
280
|
+
<div class="flex gap-2 mb-1">
|
|
281
|
+
<span class="font-500 text-neutral-60">Matched View:</span>
|
|
282
|
+
<span class="text-neutral-100">${this.currentResult?.match?.view.id}</span>
|
|
283
|
+
</div>
|
|
284
|
+
`
|
|
285
|
+
)}
|
|
286
|
+
${when(
|
|
287
|
+
this.headerInfo,
|
|
288
|
+
() => html`
|
|
289
|
+
<div class="mt-2 pt-2 border-t border-neutral-20">
|
|
290
|
+
<div class="font-600 mb-1 text-neutral-80">📋 Header Info</div>
|
|
291
|
+
${when(
|
|
292
|
+
this.headerInfo?.from,
|
|
293
|
+
() => html`
|
|
294
|
+
<div class="flex gap-2 mb-1">
|
|
295
|
+
<span class="font-500 text-neutral-60">From:</span>
|
|
296
|
+
<span class="text-neutral-100">${this.headerInfo?.from}</span>
|
|
297
|
+
</div>
|
|
298
|
+
`
|
|
299
|
+
)}
|
|
300
|
+
${when(
|
|
301
|
+
this.headerInfo?.to,
|
|
302
|
+
() => html`
|
|
303
|
+
<div class="flex gap-2 mb-1">
|
|
304
|
+
<span class="font-500 text-neutral-60">To:</span>
|
|
305
|
+
<span class="text-neutral-100">${this.headerInfo?.to}</span>
|
|
306
|
+
</div>
|
|
307
|
+
`
|
|
308
|
+
)}
|
|
309
|
+
${when(
|
|
310
|
+
this.headerInfo?.title,
|
|
311
|
+
() => html`
|
|
312
|
+
<div class="flex gap-2 mb-1">
|
|
313
|
+
<span class="font-500 text-neutral-60">Title:</span>
|
|
314
|
+
<span class="text-neutral-100">${this.headerInfo?.title}</span>
|
|
315
|
+
</div>
|
|
316
|
+
`
|
|
317
|
+
)}
|
|
383
318
|
</div>
|
|
384
319
|
`
|
|
385
320
|
)}
|
|
@@ -391,9 +326,9 @@ export class TransactionPlayback extends LitElement {
|
|
|
391
326
|
// Loading state
|
|
392
327
|
if (this.isLoading) {
|
|
393
328
|
return html`
|
|
394
|
-
<div class="
|
|
395
|
-
<div class="
|
|
396
|
-
<div class="
|
|
329
|
+
<div class="flex flex-col items-center justify-center py-15 px-5 text-neutral-60">
|
|
330
|
+
<div class="text-32 mb-4 animate-spin">⏳</div>
|
|
331
|
+
<div class="text-16 font-500">Loading transaction view...</div>
|
|
397
332
|
</div>
|
|
398
333
|
`
|
|
399
334
|
}
|
|
@@ -401,19 +336,42 @@ export class TransactionPlayback extends LitElement {
|
|
|
401
336
|
// Error state
|
|
402
337
|
if (this.error) {
|
|
403
338
|
return html`
|
|
404
|
-
<div class="
|
|
405
|
-
<div class="
|
|
406
|
-
<div class="
|
|
407
|
-
<div class="
|
|
339
|
+
<div class="flex flex-col items-center justify-center py-15 px-5 text-red-600 bg-red-50 border border-red-200 rounded-xl m-5">
|
|
340
|
+
<div class="text-48 mb-4">❌</div>
|
|
341
|
+
<div class="text-18 font-600 mb-2">Error</div>
|
|
342
|
+
<div class="text-14 text-center leading-normal">${this.error}</div>
|
|
408
343
|
</div>
|
|
409
344
|
${this.renderDebugPanel()}
|
|
410
345
|
`
|
|
411
346
|
}
|
|
412
347
|
|
|
413
|
-
//
|
|
348
|
+
// Batch summary rendering (index 0 of executeBatch)
|
|
349
|
+
if (this.currentResult?.indexInfo.isBatchSummary && this.transaction) {
|
|
350
|
+
const children = (this.transaction as any).children || []
|
|
351
|
+
return html`
|
|
352
|
+
<div class="relative">
|
|
353
|
+
<div class="flex flex-col gap-4">
|
|
354
|
+
${children.map(
|
|
355
|
+
(child: any) => html`
|
|
356
|
+
<transaction-playback
|
|
357
|
+
.transaction=${child}
|
|
358
|
+
.index=${1}
|
|
359
|
+
context="summary"
|
|
360
|
+
.variant=${this.variant}
|
|
361
|
+
?debug=${this.debug}
|
|
362
|
+
></transaction-playback>
|
|
363
|
+
`
|
|
364
|
+
)}
|
|
365
|
+
</div>
|
|
366
|
+
${this.renderDebugPanel()}
|
|
367
|
+
</div>
|
|
368
|
+
`
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
// Render loaded component (single transaction or batch child)
|
|
414
372
|
return html`
|
|
415
|
-
<div class="
|
|
416
|
-
<div class="
|
|
373
|
+
<div class="relative">
|
|
374
|
+
<div class="contents" ${ref(this.componentContainerRef)}>
|
|
417
375
|
<!-- Component will be mounted here via updated() lifecycle -->
|
|
418
376
|
</div>
|
|
419
377
|
${this.renderDebugPanel()}
|
package/src/index.ts
CHANGED
|
@@ -18,6 +18,7 @@ import './components/description-view.js'
|
|
|
18
18
|
import './components/universal-token-view.js'
|
|
19
19
|
import './components/contract-card.js'
|
|
20
20
|
import './components/permissions-block.js'
|
|
21
|
+
import './components/transaction-playback.js'
|
|
21
22
|
|
|
22
23
|
// Explicit import/export for fonts to ensure d.ts generation doesn't tree-shake it
|
|
23
24
|
|