@livetemplate/client 0.1.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/README.md +179 -0
- package/dist/constants.d.ts +2 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +19 -0
- package/dist/constants.js.map +1 -0
- package/dist/dom/directives.d.ts +13 -0
- package/dist/dom/directives.d.ts.map +1 -0
- package/dist/dom/directives.js +137 -0
- package/dist/dom/directives.js.map +1 -0
- package/dist/dom/event-delegation.d.ts +24 -0
- package/dist/dom/event-delegation.d.ts.map +1 -0
- package/dist/dom/event-delegation.js +437 -0
- package/dist/dom/event-delegation.js.map +1 -0
- package/dist/dom/focus-manager.d.ts +19 -0
- package/dist/dom/focus-manager.d.ts.map +1 -0
- package/dist/dom/focus-manager.js +144 -0
- package/dist/dom/focus-manager.js.map +1 -0
- package/dist/dom/form-disabler.d.ts +8 -0
- package/dist/dom/form-disabler.d.ts.map +1 -0
- package/dist/dom/form-disabler.js +32 -0
- package/dist/dom/form-disabler.js.map +1 -0
- package/dist/dom/loading-indicator.d.ts +9 -0
- package/dist/dom/loading-indicator.d.ts.map +1 -0
- package/dist/dom/loading-indicator.js +50 -0
- package/dist/dom/loading-indicator.js.map +1 -0
- package/dist/dom/modal-manager.d.ts +11 -0
- package/dist/dom/modal-manager.d.ts.map +1 -0
- package/dist/dom/modal-manager.js +62 -0
- package/dist/dom/modal-manager.js.map +1 -0
- package/dist/dom/observer-manager.d.ts +19 -0
- package/dist/dom/observer-manager.d.ts.map +1 -0
- package/dist/dom/observer-manager.js +64 -0
- package/dist/dom/observer-manager.js.map +1 -0
- package/dist/livetemplate-client.browser.js +44 -0
- package/dist/livetemplate-client.browser.js.map +7 -0
- package/dist/livetemplate-client.d.ts +106 -0
- package/dist/livetemplate-client.d.ts.map +1 -0
- package/dist/livetemplate-client.js +507 -0
- package/dist/livetemplate-client.js.map +1 -0
- package/dist/state/form-lifecycle-manager.d.ts +19 -0
- package/dist/state/form-lifecycle-manager.d.ts.map +1 -0
- package/dist/state/form-lifecycle-manager.js +64 -0
- package/dist/state/form-lifecycle-manager.js.map +1 -0
- package/dist/state/tree-renderer.d.ts +27 -0
- package/dist/state/tree-renderer.d.ts.map +1 -0
- package/dist/state/tree-renderer.js +359 -0
- package/dist/state/tree-renderer.js.map +1 -0
- package/dist/tests/event-delegation.test.d.ts +2 -0
- package/dist/tests/event-delegation.test.d.ts.map +1 -0
- package/dist/tests/event-delegation.test.js +102 -0
- package/dist/tests/event-delegation.test.js.map +1 -0
- package/dist/tests/focus-manager.test.d.ts +2 -0
- package/dist/tests/focus-manager.test.d.ts.map +1 -0
- package/dist/tests/focus-manager.test.js +45 -0
- package/dist/tests/focus-manager.test.js.map +1 -0
- package/dist/tests/form-disabler.test.d.ts +2 -0
- package/dist/tests/form-disabler.test.d.ts.map +1 -0
- package/dist/tests/form-disabler.test.js +35 -0
- package/dist/tests/form-disabler.test.js.map +1 -0
- package/dist/tests/form-lifecycle-manager.test.d.ts +2 -0
- package/dist/tests/form-lifecycle-manager.test.d.ts.map +1 -0
- package/dist/tests/form-lifecycle-manager.test.js +90 -0
- package/dist/tests/form-lifecycle-manager.test.js.map +1 -0
- package/dist/tests/modal-manager.test.d.ts +2 -0
- package/dist/tests/modal-manager.test.d.ts.map +1 -0
- package/dist/tests/modal-manager.test.js +80 -0
- package/dist/tests/modal-manager.test.js.map +1 -0
- package/dist/tests/rate-limit.test.d.ts +2 -0
- package/dist/tests/rate-limit.test.d.ts.map +1 -0
- package/dist/tests/rate-limit.test.js +38 -0
- package/dist/tests/rate-limit.test.js.map +1 -0
- package/dist/tests/test-conditional-debug.test.d.ts +8 -0
- package/dist/tests/test-conditional-debug.test.d.ts.map +1 -0
- package/dist/tests/test-conditional-debug.test.js +187 -0
- package/dist/tests/test-conditional-debug.test.js.map +1 -0
- package/dist/tests/test-reconstruction.test.d.ts +8 -0
- package/dist/tests/test-reconstruction.test.d.ts.map +1 -0
- package/dist/tests/test-reconstruction.test.js +284 -0
- package/dist/tests/test-reconstruction.test.js.map +1 -0
- package/dist/transport/websocket.d.ts +62 -0
- package/dist/transport/websocket.d.ts.map +1 -0
- package/dist/transport/websocket.js +194 -0
- package/dist/transport/websocket.js.map +1 -0
- package/dist/types.d.ts +34 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/logger.d.ts +32 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +77 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/rate-limit.d.ts +10 -0
- package/dist/utils/rate-limit.d.ts.map +1 -0
- package/dist/utils/rate-limit.js +37 -0
- package/dist/utils/rate-limit.js.map +1 -0
- package/dist/utils/testing.d.ts +14 -0
- package/dist/utils/testing.d.ts.map +1 -0
- package/dist/utils/testing.js +51 -0
- package/dist/utils/testing.js.map +1 -0
- package/package.json +57 -0
|
@@ -0,0 +1,507 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* LiveTemplate TypeScript Client
|
|
4
|
+
*
|
|
5
|
+
* Reconstructs HTML from tree-based updates using cached static structure,
|
|
6
|
+
* following the Phoenix LiveView optimization approach.
|
|
7
|
+
*/
|
|
8
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
9
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.LiveTemplateClient = exports.compareHTML = exports.loadAndApplyUpdate = void 0;
|
|
13
|
+
const morphdom_1 = __importDefault(require("morphdom"));
|
|
14
|
+
const focus_manager_1 = require("./dom/focus-manager");
|
|
15
|
+
const directives_1 = require("./dom/directives");
|
|
16
|
+
const event_delegation_1 = require("./dom/event-delegation");
|
|
17
|
+
const observer_manager_1 = require("./dom/observer-manager");
|
|
18
|
+
const modal_manager_1 = require("./dom/modal-manager");
|
|
19
|
+
const loading_indicator_1 = require("./dom/loading-indicator");
|
|
20
|
+
const form_disabler_1 = require("./dom/form-disabler");
|
|
21
|
+
const tree_renderer_1 = require("./state/tree-renderer");
|
|
22
|
+
const form_lifecycle_manager_1 = require("./state/form-lifecycle-manager");
|
|
23
|
+
const websocket_1 = require("./transport/websocket");
|
|
24
|
+
const logger_1 = require("./utils/logger");
|
|
25
|
+
var testing_1 = require("./utils/testing");
|
|
26
|
+
Object.defineProperty(exports, "loadAndApplyUpdate", { enumerable: true, get: function () { return testing_1.loadAndApplyUpdate; } });
|
|
27
|
+
Object.defineProperty(exports, "compareHTML", { enumerable: true, get: function () { return testing_1.compareHTML; } });
|
|
28
|
+
class LiveTemplateClient {
|
|
29
|
+
constructor(options = {}) {
|
|
30
|
+
this.lvtId = null;
|
|
31
|
+
this.ws = null;
|
|
32
|
+
this.wrapperElement = null;
|
|
33
|
+
this.useHTTP = false; // True when WebSocket is unavailable
|
|
34
|
+
this.sessionCookie = null; // For HTTP mode session tracking
|
|
35
|
+
// Rate limiting: cache of debounced/throttled handlers per element+eventType
|
|
36
|
+
this.rateLimitedHandlers = new WeakMap();
|
|
37
|
+
// Initialization tracking for loading indicator
|
|
38
|
+
this.isInitialized = false;
|
|
39
|
+
// Message tracking for deterministic E2E testing
|
|
40
|
+
this.messageCount = 0;
|
|
41
|
+
const { logger: providedLogger, logLevel, debug, ...restOptions } = options;
|
|
42
|
+
const resolvedLevel = logLevel ?? (debug ? "debug" : "info");
|
|
43
|
+
const baseLogger = providedLogger ?? (0, logger_1.createLogger)({ level: resolvedLevel });
|
|
44
|
+
if (providedLogger) {
|
|
45
|
+
if (logLevel) {
|
|
46
|
+
providedLogger.setLevel(logLevel);
|
|
47
|
+
}
|
|
48
|
+
else if (debug) {
|
|
49
|
+
providedLogger.setLevel("debug");
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
baseLogger.setLevel(resolvedLevel);
|
|
54
|
+
}
|
|
55
|
+
this.logger = baseLogger.child("Client");
|
|
56
|
+
this.options = {
|
|
57
|
+
autoReconnect: false, // Disable autoReconnect by default to avoid connection loops
|
|
58
|
+
reconnectDelay: 1000,
|
|
59
|
+
liveUrl: window.location.pathname, // Connect to current page
|
|
60
|
+
...restOptions,
|
|
61
|
+
};
|
|
62
|
+
this.treeRenderer = new tree_renderer_1.TreeRenderer(this.logger.child("TreeRenderer"));
|
|
63
|
+
this.focusManager = new focus_manager_1.FocusManager(this.logger.child("FocusManager"));
|
|
64
|
+
this.modalManager = new modal_manager_1.ModalManager(this.logger.child("ModalManager"));
|
|
65
|
+
this.formLifecycleManager = new form_lifecycle_manager_1.FormLifecycleManager(this.modalManager);
|
|
66
|
+
this.loadingIndicator = new loading_indicator_1.LoadingIndicator();
|
|
67
|
+
this.formDisabler = new form_disabler_1.FormDisabler();
|
|
68
|
+
this.eventDelegator = new event_delegation_1.EventDelegator({
|
|
69
|
+
getWrapperElement: () => this.wrapperElement,
|
|
70
|
+
getRateLimitedHandlers: () => this.rateLimitedHandlers,
|
|
71
|
+
parseValue: (value) => this.parseValue(value),
|
|
72
|
+
send: (message) => this.send(message),
|
|
73
|
+
setActiveSubmission: (form, button, originalButtonText) => this.formLifecycleManager.setActiveSubmission(form, button, originalButtonText),
|
|
74
|
+
openModal: (modalId) => this.modalManager.open(modalId),
|
|
75
|
+
closeModal: (modalId) => this.modalManager.close(modalId),
|
|
76
|
+
getWebSocketReadyState: () => this.webSocketManager.getReadyState(),
|
|
77
|
+
}, this.logger.child("EventDelegator"));
|
|
78
|
+
this.observerManager = new observer_manager_1.ObserverManager({
|
|
79
|
+
getWrapperElement: () => this.wrapperElement,
|
|
80
|
+
send: (message) => this.send(message),
|
|
81
|
+
}, this.logger.child("ObserverManager"));
|
|
82
|
+
this.webSocketManager = new websocket_1.WebSocketManager({
|
|
83
|
+
options: this.options,
|
|
84
|
+
logger: this.logger.child("Transport"),
|
|
85
|
+
onConnected: () => {
|
|
86
|
+
this.ws = this.webSocketManager.getSocket();
|
|
87
|
+
this.logger.info("WebSocket connected");
|
|
88
|
+
this.options.onConnect?.();
|
|
89
|
+
this.wrapperElement?.dispatchEvent(new Event("lvt:connected"));
|
|
90
|
+
},
|
|
91
|
+
onDisconnected: () => {
|
|
92
|
+
this.ws = null;
|
|
93
|
+
this.logger.info("WebSocket disconnected");
|
|
94
|
+
this.options.onDisconnect?.();
|
|
95
|
+
this.wrapperElement?.dispatchEvent(new Event("lvt:disconnected"));
|
|
96
|
+
},
|
|
97
|
+
onMessage: (response, event) => {
|
|
98
|
+
this.handleWebSocketPayload(response, event);
|
|
99
|
+
},
|
|
100
|
+
onReconnectAttempt: () => {
|
|
101
|
+
this.logger.info("Attempting to reconnect...");
|
|
102
|
+
},
|
|
103
|
+
onError: (error) => {
|
|
104
|
+
this.logger.error("WebSocket error:", error);
|
|
105
|
+
this.options.onError?.(error);
|
|
106
|
+
},
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Auto-initialize when DOM is ready
|
|
111
|
+
* Called automatically when script loads
|
|
112
|
+
*/
|
|
113
|
+
static autoInit() {
|
|
114
|
+
const autoInitLogger = (0, logger_1.createLogger)({ scope: "Client:autoInit" });
|
|
115
|
+
const init = () => {
|
|
116
|
+
const wrapper = document.querySelector("[data-lvt-id]");
|
|
117
|
+
if (wrapper) {
|
|
118
|
+
const client = new LiveTemplateClient();
|
|
119
|
+
client.wrapperElement = wrapper;
|
|
120
|
+
// Check if loading indicator should be shown
|
|
121
|
+
const shouldShowLoading = wrapper.getAttribute("data-lvt-loading") === "true";
|
|
122
|
+
if (shouldShowLoading) {
|
|
123
|
+
client.loadingIndicator.show();
|
|
124
|
+
client.formDisabler.disable(client.wrapperElement);
|
|
125
|
+
}
|
|
126
|
+
client.connect().catch((error) => {
|
|
127
|
+
autoInitLogger.error("Auto-initialization connect failed:", error);
|
|
128
|
+
});
|
|
129
|
+
// Expose as global for programmatic access
|
|
130
|
+
window.liveTemplateClient = client;
|
|
131
|
+
}
|
|
132
|
+
};
|
|
133
|
+
// Initialize when DOM is ready
|
|
134
|
+
if (document.readyState === "loading") {
|
|
135
|
+
document.addEventListener("DOMContentLoaded", init);
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
init();
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Handle server-sent updates delivered via WebSocket or HTTP fallback.
|
|
143
|
+
*/
|
|
144
|
+
handleWebSocketPayload(response, event) {
|
|
145
|
+
if (event) {
|
|
146
|
+
window.__lastWSMessage = event.data;
|
|
147
|
+
if (!window.__wsMessages) {
|
|
148
|
+
window.__wsMessages = [];
|
|
149
|
+
}
|
|
150
|
+
window.__wsMessages.push(response);
|
|
151
|
+
}
|
|
152
|
+
if (!this.isInitialized) {
|
|
153
|
+
this.loadingIndicator.hide();
|
|
154
|
+
this.formDisabler.enable(this.wrapperElement);
|
|
155
|
+
if (this.wrapperElement &&
|
|
156
|
+
this.wrapperElement.hasAttribute("data-lvt-loading")) {
|
|
157
|
+
this.wrapperElement.removeAttribute("data-lvt-loading");
|
|
158
|
+
}
|
|
159
|
+
this.isInitialized = true;
|
|
160
|
+
}
|
|
161
|
+
if (this.wrapperElement) {
|
|
162
|
+
this.updateDOM(this.wrapperElement, response.tree, response.meta);
|
|
163
|
+
this.messageCount++;
|
|
164
|
+
window.__wsMessageCount = this.messageCount;
|
|
165
|
+
this.wrapperElement.dispatchEvent(new CustomEvent("lvt:updated", {
|
|
166
|
+
detail: {
|
|
167
|
+
messageCount: this.messageCount,
|
|
168
|
+
action: response.meta?.action,
|
|
169
|
+
success: response.meta?.success,
|
|
170
|
+
},
|
|
171
|
+
}));
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Connect to WebSocket and start receiving updates
|
|
176
|
+
* @param wrapperSelector - CSS selector for the LiveTemplate wrapper (defaults to '[data-lvt-id]')
|
|
177
|
+
*/
|
|
178
|
+
async connect(wrapperSelector = "[data-lvt-id]") {
|
|
179
|
+
// Find the wrapper element
|
|
180
|
+
this.wrapperElement = document.querySelector(wrapperSelector);
|
|
181
|
+
if (!this.wrapperElement) {
|
|
182
|
+
throw new Error(`LiveTemplate wrapper not found with selector: ${wrapperSelector}`);
|
|
183
|
+
}
|
|
184
|
+
this.webSocketManager.disconnect();
|
|
185
|
+
const connectionResult = await this.webSocketManager.connect();
|
|
186
|
+
this.useHTTP = !connectionResult.usingWebSocket;
|
|
187
|
+
if (this.useHTTP) {
|
|
188
|
+
this.ws = null;
|
|
189
|
+
this.logger.info("WebSocket not available, using HTTP mode");
|
|
190
|
+
this.options.onConnect?.();
|
|
191
|
+
if (connectionResult.initialState && this.wrapperElement) {
|
|
192
|
+
this.handleWebSocketPayload(connectionResult.initialState);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
// Set up event delegation for lvt-* attributes
|
|
196
|
+
this.eventDelegator.setupEventDelegation();
|
|
197
|
+
// Set up window-* event delegation
|
|
198
|
+
this.eventDelegator.setupWindowEventDelegation();
|
|
199
|
+
// Set up click-away delegation
|
|
200
|
+
this.eventDelegator.setupClickAwayDelegation();
|
|
201
|
+
// Set up modal delegation
|
|
202
|
+
this.eventDelegator.setupModalDelegation();
|
|
203
|
+
// Initialize focus tracking
|
|
204
|
+
this.focusManager.attach(this.wrapperElement);
|
|
205
|
+
// Set up infinite scroll observers
|
|
206
|
+
this.observerManager.setupInfiniteScrollObserver();
|
|
207
|
+
this.observerManager.setupInfiniteScrollMutationObserver();
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Disconnect from WebSocket
|
|
211
|
+
*/
|
|
212
|
+
disconnect() {
|
|
213
|
+
this.webSocketManager.disconnect();
|
|
214
|
+
this.ws = null;
|
|
215
|
+
this.useHTTP = false;
|
|
216
|
+
this.observerManager.teardown();
|
|
217
|
+
this.formLifecycleManager.reset();
|
|
218
|
+
this.loadingIndicator.hide();
|
|
219
|
+
this.formDisabler.enable(this.wrapperElement);
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Determine whether the client finished its initial load and has an active transport.
|
|
223
|
+
*/
|
|
224
|
+
isReady() {
|
|
225
|
+
const wrapper = this.wrapperElement;
|
|
226
|
+
if (!wrapper || wrapper.hasAttribute("data-lvt-loading")) {
|
|
227
|
+
return false;
|
|
228
|
+
}
|
|
229
|
+
if (this.useHTTP) {
|
|
230
|
+
return true;
|
|
231
|
+
}
|
|
232
|
+
const readyState = this.webSocketManager.getReadyState();
|
|
233
|
+
return readyState === WebSocket.OPEN;
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Send a message to the server via WebSocket or HTTP
|
|
237
|
+
* @param message - Message to send (will be JSON stringified)
|
|
238
|
+
*/
|
|
239
|
+
send(message) {
|
|
240
|
+
// Debug flag for testing
|
|
241
|
+
window.__lvtSendCalled = true;
|
|
242
|
+
window.__lvtMessageAction = message?.action;
|
|
243
|
+
const readyState = this.webSocketManager.getReadyState();
|
|
244
|
+
if (this.logger.isDebugEnabled()) {
|
|
245
|
+
this.logger.debug("send() invoked", {
|
|
246
|
+
message,
|
|
247
|
+
useHTTP: this.useHTTP,
|
|
248
|
+
hasWebSocket: readyState !== undefined,
|
|
249
|
+
readyState,
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
if (this.useHTTP) {
|
|
253
|
+
// HTTP mode: send via POST and handle response
|
|
254
|
+
this.logger.debug("Using HTTP mode for send");
|
|
255
|
+
window.__lvtSendPath = "http";
|
|
256
|
+
this.sendHTTP(message);
|
|
257
|
+
}
|
|
258
|
+
else if (readyState === WebSocket.OPEN) {
|
|
259
|
+
// WebSocket mode
|
|
260
|
+
this.logger.debug("Sending via WebSocket");
|
|
261
|
+
window.__lvtSendPath = "websocket";
|
|
262
|
+
window.__lvtWSMessage = JSON.stringify(message);
|
|
263
|
+
this.webSocketManager.send(JSON.stringify(message));
|
|
264
|
+
this.logger.debug("WebSocket send complete");
|
|
265
|
+
window.__lvtWSSendComplete = true;
|
|
266
|
+
}
|
|
267
|
+
else if (readyState !== undefined) {
|
|
268
|
+
// WebSocket is connecting or closing, fall back to HTTP temporarily
|
|
269
|
+
this.logger.warn(`WebSocket not ready (state: ${readyState}), using HTTP fallback`);
|
|
270
|
+
window.__lvtSendPath = "http-fallback";
|
|
271
|
+
this.sendHTTP(message);
|
|
272
|
+
}
|
|
273
|
+
else {
|
|
274
|
+
this.logger.error("No transport available");
|
|
275
|
+
window.__lvtSendPath = "no-transport";
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Send action via HTTP POST
|
|
280
|
+
*/
|
|
281
|
+
async sendHTTP(message) {
|
|
282
|
+
try {
|
|
283
|
+
const liveUrl = this.options.liveUrl || "/live";
|
|
284
|
+
const response = await fetch(liveUrl, {
|
|
285
|
+
method: "POST",
|
|
286
|
+
credentials: "include", // Include cookies for session
|
|
287
|
+
headers: {
|
|
288
|
+
"Content-Type": "application/json",
|
|
289
|
+
Accept: "application/json",
|
|
290
|
+
},
|
|
291
|
+
body: JSON.stringify(message),
|
|
292
|
+
});
|
|
293
|
+
if (!response.ok) {
|
|
294
|
+
throw new Error(`HTTP request failed: ${response.status}`);
|
|
295
|
+
}
|
|
296
|
+
// Handle the update response
|
|
297
|
+
const updateResponse = await response.json();
|
|
298
|
+
if (this.wrapperElement) {
|
|
299
|
+
this.updateDOM(this.wrapperElement, updateResponse.tree, updateResponse.meta);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
catch (error) {
|
|
303
|
+
this.logger.error("Failed to send HTTP request:", error);
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* Parse a string value into appropriate type (number, boolean, or string)
|
|
308
|
+
* @param value - String value to parse
|
|
309
|
+
* @returns Parsed value with correct type
|
|
310
|
+
*/
|
|
311
|
+
parseValue(value) {
|
|
312
|
+
// Try to parse as number
|
|
313
|
+
const num = parseFloat(value);
|
|
314
|
+
if (!isNaN(num) && value.trim() === num.toString()) {
|
|
315
|
+
return num;
|
|
316
|
+
}
|
|
317
|
+
// Try to parse as boolean
|
|
318
|
+
if (value === "true")
|
|
319
|
+
return true;
|
|
320
|
+
if (value === "false")
|
|
321
|
+
return false;
|
|
322
|
+
// Return as string
|
|
323
|
+
return value;
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* Apply an update to the current state and reconstruct HTML
|
|
327
|
+
* @param update - Tree update object from LiveTemplate server
|
|
328
|
+
* @returns Reconstructed HTML and whether anything changed
|
|
329
|
+
*/
|
|
330
|
+
applyUpdate(update) {
|
|
331
|
+
return this.treeRenderer.applyUpdate(update);
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* Apply updates to existing HTML using morphdom for efficient DOM updates
|
|
335
|
+
* @param existingHTML - Current full HTML document
|
|
336
|
+
* @param update - Tree update object from LiveTemplate server
|
|
337
|
+
* @returns Updated HTML content
|
|
338
|
+
*/
|
|
339
|
+
applyUpdateToHTML(existingHTML, update) {
|
|
340
|
+
// Apply the update to our internal state
|
|
341
|
+
const result = this.applyUpdate(update);
|
|
342
|
+
// Extract lvt-id from existing HTML if we don't have it
|
|
343
|
+
if (!this.lvtId) {
|
|
344
|
+
const match = existingHTML.match(/data-lvt-id="([^"]+)"/);
|
|
345
|
+
if (match) {
|
|
346
|
+
this.lvtId = match[1];
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
// The new tree includes complete HTML structure, so we can reconstruct properly
|
|
350
|
+
const innerContent = result.html;
|
|
351
|
+
// Find where to insert the reconstructed content
|
|
352
|
+
const bodyMatch = existingHTML.match(/<body>([\s\S]*?)<\/body>/);
|
|
353
|
+
if (!bodyMatch) {
|
|
354
|
+
return existingHTML;
|
|
355
|
+
}
|
|
356
|
+
// Replace the body content with our reconstructed HTML
|
|
357
|
+
// We need to preserve the wrapper div with data-lvt-id
|
|
358
|
+
const wrapperStart = `<div data-lvt-id="${this.lvtId || "lvt-unknown"}">`;
|
|
359
|
+
const wrapperEnd = "</div>";
|
|
360
|
+
const newBodyContent = wrapperStart + innerContent + wrapperEnd;
|
|
361
|
+
return existingHTML.replace(/<body>[\s\S]*?<\/body>/, `<body>${newBodyContent}</body>`);
|
|
362
|
+
}
|
|
363
|
+
/**
|
|
364
|
+
* Update a live DOM element with new tree data
|
|
365
|
+
* @param element - DOM element containing the LiveTemplate content (the wrapper div)
|
|
366
|
+
* @param update - Tree update object from LiveTemplate server
|
|
367
|
+
* @param meta - Optional metadata about the update (action, success, errors)
|
|
368
|
+
*/
|
|
369
|
+
updateDOM(element, update, meta) {
|
|
370
|
+
// Apply update to internal state and get reconstructed HTML
|
|
371
|
+
const result = this.applyUpdate(update);
|
|
372
|
+
// Helper to recursively check if there are any statics in the tree
|
|
373
|
+
const hasStaticsInTree = (node) => {
|
|
374
|
+
if (!node || typeof node !== "object")
|
|
375
|
+
return false;
|
|
376
|
+
if (node.s && Array.isArray(node.s))
|
|
377
|
+
return true;
|
|
378
|
+
return Object.values(node).some((v) => hasStaticsInTree(v));
|
|
379
|
+
};
|
|
380
|
+
if (!result.changed && !hasStaticsInTree(update)) {
|
|
381
|
+
// No changes detected and no statics in update, skip morphdom
|
|
382
|
+
return;
|
|
383
|
+
}
|
|
384
|
+
// Create a temporary wrapper to hold the new content
|
|
385
|
+
// We need to create a DOM element of the same type as 'element' to avoid browser HTML corrections
|
|
386
|
+
// For example, if we put <tr> elements in a <div>, the browser strips them out
|
|
387
|
+
const tempWrapper = document.createElement(element.tagName);
|
|
388
|
+
if (this.logger.isDebugEnabled()) {
|
|
389
|
+
this.logger.debug("[updateDOM] element.tagName:", element.tagName);
|
|
390
|
+
this.logger.debug("[updateDOM] result.html (first 500 chars):", result.html.substring(0, 500));
|
|
391
|
+
this.logger.debug("[updateDOM] Has <table> tag:", result.html.includes("<table>"));
|
|
392
|
+
this.logger.debug("[updateDOM] Has <tbody> tag:", result.html.includes("<tbody>"));
|
|
393
|
+
this.logger.debug("[updateDOM] Has <tr> tag:", result.html.includes("<tr"));
|
|
394
|
+
}
|
|
395
|
+
tempWrapper.innerHTML = result.html;
|
|
396
|
+
if (this.logger.isDebugEnabled()) {
|
|
397
|
+
this.logger.debug("[updateDOM] tempWrapper.innerHTML (first 500 chars):", tempWrapper.innerHTML.substring(0, 500));
|
|
398
|
+
this.logger.debug("[updateDOM] tempWrapper has <table>:", tempWrapper.innerHTML.includes("<table>"));
|
|
399
|
+
this.logger.debug("[updateDOM] tempWrapper has <tbody>:", tempWrapper.innerHTML.includes("<tbody>"));
|
|
400
|
+
this.logger.debug("[updateDOM] tempWrapper has <tr>:", tempWrapper.innerHTML.includes("<tr"));
|
|
401
|
+
}
|
|
402
|
+
// Use morphdom to efficiently update the element
|
|
403
|
+
(0, morphdom_1.default)(element, tempWrapper, {
|
|
404
|
+
childrenOnly: true, // Only update children, preserve the wrapper element itself
|
|
405
|
+
getNodeKey: (node) => {
|
|
406
|
+
// Use data-key or data-lvt-key for efficient reconciliation
|
|
407
|
+
if (node.nodeType === 1) {
|
|
408
|
+
return (node.getAttribute("data-key") ||
|
|
409
|
+
node.getAttribute("data-lvt-key") ||
|
|
410
|
+
undefined);
|
|
411
|
+
}
|
|
412
|
+
},
|
|
413
|
+
onBeforeElUpdated: (fromEl, toEl) => {
|
|
414
|
+
// Preserve value for the last focused textual input
|
|
415
|
+
const lastFocused = this.focusManager.getLastFocusedElement();
|
|
416
|
+
if (lastFocused && this.focusManager.isTextualInput(fromEl)) {
|
|
417
|
+
if (fromEl === lastFocused) {
|
|
418
|
+
// Preserve the current value being typed
|
|
419
|
+
toEl.value = fromEl.value;
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
// Only update if content actually changed
|
|
423
|
+
if (fromEl.isEqualNode(toEl)) {
|
|
424
|
+
return false;
|
|
425
|
+
}
|
|
426
|
+
// Execute lvt-updated lifecycle hook
|
|
427
|
+
this.executeLifecycleHook(fromEl, "lvt-updated");
|
|
428
|
+
return true;
|
|
429
|
+
},
|
|
430
|
+
onNodeAdded: (node) => {
|
|
431
|
+
// Execute lvt-mounted lifecycle hook
|
|
432
|
+
if (node.nodeType === Node.ELEMENT_NODE) {
|
|
433
|
+
this.executeLifecycleHook(node, "lvt-mounted");
|
|
434
|
+
}
|
|
435
|
+
},
|
|
436
|
+
onBeforeNodeDiscarded: (node) => {
|
|
437
|
+
// Execute lvt-destroyed lifecycle hook
|
|
438
|
+
if (node.nodeType === Node.ELEMENT_NODE) {
|
|
439
|
+
this.executeLifecycleHook(node, "lvt-destroyed");
|
|
440
|
+
}
|
|
441
|
+
return true;
|
|
442
|
+
},
|
|
443
|
+
});
|
|
444
|
+
// Restore focus to previously focused element
|
|
445
|
+
this.focusManager.restoreFocusedElement();
|
|
446
|
+
// Handle scroll directives
|
|
447
|
+
(0, directives_1.handleScrollDirectives)(element);
|
|
448
|
+
// Handle highlight directives
|
|
449
|
+
(0, directives_1.handleHighlightDirectives)(element);
|
|
450
|
+
// Handle animate directives
|
|
451
|
+
(0, directives_1.handleAnimateDirectives)(element);
|
|
452
|
+
// Handle form lifecycle if metadata is present
|
|
453
|
+
if (meta) {
|
|
454
|
+
this.formLifecycleManager.handleResponse(meta);
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
/**
|
|
458
|
+
* Execute lifecycle hook on an element
|
|
459
|
+
* @param element - Element with lifecycle hook attribute
|
|
460
|
+
* @param hookName - Name of the lifecycle hook attribute (e.g., 'lvt-mounted')
|
|
461
|
+
*/
|
|
462
|
+
executeLifecycleHook(element, hookName) {
|
|
463
|
+
const hookValue = element.getAttribute(hookName);
|
|
464
|
+
if (!hookValue) {
|
|
465
|
+
return;
|
|
466
|
+
}
|
|
467
|
+
try {
|
|
468
|
+
// Create a function from the hook value and execute it
|
|
469
|
+
// The function has access to 'this' (the element) and 'event'
|
|
470
|
+
const hookFunction = new Function("element", hookValue);
|
|
471
|
+
hookFunction.call(element, element);
|
|
472
|
+
}
|
|
473
|
+
catch (error) {
|
|
474
|
+
this.logger.error(`Error executing ${hookName} hook:`, error);
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
/**
|
|
478
|
+
* Reset client state (useful for testing)
|
|
479
|
+
*/
|
|
480
|
+
reset() {
|
|
481
|
+
this.treeRenderer.reset();
|
|
482
|
+
this.focusManager.reset();
|
|
483
|
+
this.observerManager.teardown();
|
|
484
|
+
this.formLifecycleManager.reset();
|
|
485
|
+
this.loadingIndicator.hide();
|
|
486
|
+
this.formDisabler.enable(this.wrapperElement);
|
|
487
|
+
this.lvtId = null;
|
|
488
|
+
}
|
|
489
|
+
/**
|
|
490
|
+
* Get current tree state (for debugging)
|
|
491
|
+
*/
|
|
492
|
+
getTreeState() {
|
|
493
|
+
return this.treeRenderer.getTreeState();
|
|
494
|
+
}
|
|
495
|
+
/**
|
|
496
|
+
* Get the static structure if available
|
|
497
|
+
*/
|
|
498
|
+
getStaticStructure() {
|
|
499
|
+
return this.treeRenderer.getStaticStructure();
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
exports.LiveTemplateClient = LiveTemplateClient;
|
|
503
|
+
// Auto-initialize when script loads (for browser use)
|
|
504
|
+
if (typeof window !== "undefined") {
|
|
505
|
+
LiveTemplateClient.autoInit();
|
|
506
|
+
}
|
|
507
|
+
//# sourceMappingURL=livetemplate-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"livetemplate-client.js","sourceRoot":"","sources":["../livetemplate-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { ResponseMetadata } from "../types";
|
|
2
|
+
import { ModalManager } from "../dom/modal-manager";
|
|
3
|
+
/**
|
|
4
|
+
* Tracks form submission lifecycle for LiveTemplate actions.
|
|
5
|
+
*/
|
|
6
|
+
export declare class FormLifecycleManager {
|
|
7
|
+
private readonly modalManager;
|
|
8
|
+
private activeForm;
|
|
9
|
+
private activeButton;
|
|
10
|
+
private originalButtonText;
|
|
11
|
+
constructor(modalManager: ModalManager);
|
|
12
|
+
setActiveSubmission(form: HTMLFormElement | null, button: HTMLButtonElement | null, originalButtonText: string | null): void;
|
|
13
|
+
handleResponse(meta: ResponseMetadata): void;
|
|
14
|
+
reset(): void;
|
|
15
|
+
private handleSuccess;
|
|
16
|
+
private handleError;
|
|
17
|
+
private restoreFormState;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=form-lifecycle-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"form-lifecycle-manager.d.ts","sourceRoot":"","sources":["../../state/form-lifecycle-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD;;GAEG;AACH,qBAAa,oBAAoB;IAKnB,OAAO,CAAC,QAAQ,CAAC,YAAY;IAJzC,OAAO,CAAC,UAAU,CAAgC;IAClD,OAAO,CAAC,YAAY,CAAkC;IACtD,OAAO,CAAC,kBAAkB,CAAuB;gBAEpB,YAAY,EAAE,YAAY;IAEvD,mBAAmB,CACjB,IAAI,EAAE,eAAe,GAAG,IAAI,EAC5B,MAAM,EAAE,iBAAiB,GAAG,IAAI,EAChC,kBAAkB,EAAE,MAAM,GAAG,IAAI,GAChC,IAAI;IAMP,cAAc,CAAC,IAAI,EAAE,gBAAgB,GAAG,IAAI;IAgB5C,KAAK,IAAI,IAAI;IAIb,OAAO,CAAC,aAAa;IAmBrB,OAAO,CAAC,WAAW;IAUnB,OAAO,CAAC,gBAAgB;CAUzB"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FormLifecycleManager = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Tracks form submission lifecycle for LiveTemplate actions.
|
|
6
|
+
*/
|
|
7
|
+
class FormLifecycleManager {
|
|
8
|
+
constructor(modalManager) {
|
|
9
|
+
this.modalManager = modalManager;
|
|
10
|
+
this.activeForm = null;
|
|
11
|
+
this.activeButton = null;
|
|
12
|
+
this.originalButtonText = null;
|
|
13
|
+
}
|
|
14
|
+
setActiveSubmission(form, button, originalButtonText) {
|
|
15
|
+
this.activeForm = form;
|
|
16
|
+
this.activeButton = button;
|
|
17
|
+
this.originalButtonText = originalButtonText;
|
|
18
|
+
}
|
|
19
|
+
handleResponse(meta) {
|
|
20
|
+
if (this.activeForm) {
|
|
21
|
+
this.activeForm.dispatchEvent(new CustomEvent("lvt:done", { detail: meta }));
|
|
22
|
+
}
|
|
23
|
+
if (meta.success) {
|
|
24
|
+
this.handleSuccess(meta);
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
this.handleError(meta);
|
|
28
|
+
}
|
|
29
|
+
this.restoreFormState();
|
|
30
|
+
}
|
|
31
|
+
reset() {
|
|
32
|
+
this.restoreFormState();
|
|
33
|
+
}
|
|
34
|
+
handleSuccess(meta) {
|
|
35
|
+
if (!this.activeForm) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
this.activeForm.dispatchEvent(new CustomEvent("lvt:success", { detail: meta }));
|
|
39
|
+
const modalParent = this.activeForm.closest('[role="dialog"]');
|
|
40
|
+
if (modalParent && modalParent.id) {
|
|
41
|
+
this.modalManager.close(modalParent.id);
|
|
42
|
+
}
|
|
43
|
+
if (!this.activeForm.hasAttribute("lvt-preserve")) {
|
|
44
|
+
this.activeForm.reset();
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
handleError(meta) {
|
|
48
|
+
if (!this.activeForm) {
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
this.activeForm.dispatchEvent(new CustomEvent("lvt:error", { detail: meta }));
|
|
52
|
+
}
|
|
53
|
+
restoreFormState() {
|
|
54
|
+
if (this.activeButton && this.originalButtonText !== null) {
|
|
55
|
+
this.activeButton.disabled = false;
|
|
56
|
+
this.activeButton.textContent = this.originalButtonText;
|
|
57
|
+
}
|
|
58
|
+
this.activeForm = null;
|
|
59
|
+
this.activeButton = null;
|
|
60
|
+
this.originalButtonText = null;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
exports.FormLifecycleManager = FormLifecycleManager;
|
|
64
|
+
//# sourceMappingURL=form-lifecycle-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"form-lifecycle-manager.js","sourceRoot":"","sources":["../../state/form-lifecycle-manager.ts"],"names":[],"mappings":";;;AAGA;;GAEG;AACH,MAAa,oBAAoB;IAK/B,YAA6B,YAA0B;QAA1B,iBAAY,GAAZ,YAAY,CAAc;QAJ/C,eAAU,GAA2B,IAAI,CAAC;QAC1C,iBAAY,GAA6B,IAAI,CAAC;QAC9C,uBAAkB,GAAkB,IAAI,CAAC;IAES,CAAC;IAE3D,mBAAmB,CACjB,IAA4B,EAC5B,MAAgC,EAChC,kBAAiC;QAEjC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC;QAC3B,IAAI,CAAC,kBAAkB,GAAG,kBAAkB,CAAC;IAC/C,CAAC;IAED,cAAc,CAAC,IAAsB;QACnC,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,IAAI,CAAC,UAAU,CAAC,aAAa,CAC3B,IAAI,WAAW,CAAC,UAAU,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAC9C,CAAC;QACJ,CAAC;QAED,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACzB,CAAC;QAED,IAAI,CAAC,gBAAgB,EAAE,CAAC;IAC1B,CAAC;IAED,KAAK;QACH,IAAI,CAAC,gBAAgB,EAAE,CAAC;IAC1B,CAAC;IAEO,aAAa,CAAC,IAAsB;QAC1C,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,OAAO;QACT,CAAC;QAED,IAAI,CAAC,UAAU,CAAC,aAAa,CAC3B,IAAI,WAAW,CAAC,aAAa,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CACjD,CAAC;QAEF,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;QAC/D,IAAI,WAAW,IAAI,WAAW,CAAC,EAAE,EAAE,CAAC;YAClC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QAC1C,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,cAAc,CAAC,EAAE,CAAC;YAClD,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QAC1B,CAAC;IACH,CAAC;IAEO,WAAW,CAAC,IAAsB;QACxC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,OAAO;QACT,CAAC;QAED,IAAI,CAAC,UAAU,CAAC,aAAa,CAC3B,IAAI,WAAW,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAC/C,CAAC;IACJ,CAAC;IAEO,gBAAgB;QACtB,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,kBAAkB,KAAK,IAAI,EAAE,CAAC;YAC1D,IAAI,CAAC,YAAY,CAAC,QAAQ,GAAG,KAAK,CAAC;YACnC,IAAI,CAAC,YAAY,CAAC,WAAW,GAAG,IAAI,CAAC,kBAAkB,CAAC;QAC1D,CAAC;QAED,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;IACjC,CAAC;CACF;AA5ED,oDA4EC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { TreeNode, UpdateResult } from "../types";
|
|
2
|
+
import type { Logger } from "../utils/logger";
|
|
3
|
+
/**
|
|
4
|
+
* Handles tree state management and HTML reconstruction logic for LiveTemplate.
|
|
5
|
+
*/
|
|
6
|
+
export declare class TreeRenderer {
|
|
7
|
+
private readonly logger;
|
|
8
|
+
private treeState;
|
|
9
|
+
private rangeState;
|
|
10
|
+
private rangeIdKeys;
|
|
11
|
+
constructor(logger: Logger);
|
|
12
|
+
applyUpdate(update: TreeNode): UpdateResult;
|
|
13
|
+
reset(): void;
|
|
14
|
+
getTreeState(): TreeNode;
|
|
15
|
+
getStaticStructure(): string[] | null;
|
|
16
|
+
private deepMergeTreeNodes;
|
|
17
|
+
private reconstructFromTree;
|
|
18
|
+
private renderValue;
|
|
19
|
+
private renderRangeStructure;
|
|
20
|
+
private applyDifferentialOperations;
|
|
21
|
+
private getCurrentRangeStructure;
|
|
22
|
+
private renderItemsWithStatics;
|
|
23
|
+
private addItemsToRange;
|
|
24
|
+
private getItemKey;
|
|
25
|
+
private findItemIndexByKey;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=tree-renderer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tree-renderer.d.ts","sourceRoot":"","sources":["../../state/tree-renderer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACvD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAO9C;;GAEG;AACH,qBAAa,YAAY;IAKX,OAAO,CAAC,QAAQ,CAAC,MAAM;IAJnC,OAAO,CAAC,SAAS,CAAgB;IACjC,OAAO,CAAC,UAAU,CAAuC;IACzD,OAAO,CAAC,WAAW,CAA8B;gBAEpB,MAAM,EAAE,MAAM;IAE3C,WAAW,CAAC,MAAM,EAAE,QAAQ,GAAG,YAAY;IA+B3C,KAAK,IAAI,IAAI;IAMb,YAAY,IAAI,QAAQ;IAIxB,kBAAkB,IAAI,MAAM,EAAE,GAAG,IAAI;IAIrC,OAAO,CAAC,kBAAkB;IAqC1B,OAAO,CAAC,mBAAmB;IA8B3B,OAAO,CAAC,WAAW;IAuFnB,OAAO,CAAC,oBAAoB;IAyD5B,OAAO,CAAC,2BAA2B;IAwInC,OAAO,CAAC,wBAAwB;IAoBhC,OAAO,CAAC,sBAAsB;IAgC9B,OAAO,CAAC,eAAe;IAqBvB,OAAO,CAAC,UAAU;IAalB,OAAO,CAAC,kBAAkB;CAU3B"}
|