@livetemplate/client 0.8.10 → 0.8.13
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/dom/directives.d.ts +17 -5
- package/dist/dom/directives.d.ts.map +1 -1
- package/dist/dom/directives.js +161 -17
- package/dist/dom/directives.js.map +1 -1
- package/dist/dom/event-delegation.d.ts +5 -3
- package/dist/dom/event-delegation.d.ts.map +1 -1
- package/dist/dom/event-delegation.js +62 -177
- package/dist/dom/event-delegation.js.map +1 -1
- package/dist/dom/link-interceptor.js +1 -1
- package/dist/dom/link-interceptor.js.map +1 -1
- package/dist/dom/reactive-attributes.d.ts +15 -20
- package/dist/dom/reactive-attributes.d.ts.map +1 -1
- package/dist/dom/reactive-attributes.js +78 -81
- package/dist/dom/reactive-attributes.js.map +1 -1
- package/dist/livetemplate-client.browser.js +4 -4
- package/dist/livetemplate-client.browser.js.map +4 -4
- package/dist/livetemplate-client.d.ts +0 -2
- package/dist/livetemplate-client.d.ts.map +1 -1
- package/dist/livetemplate-client.js +7 -12
- package/dist/livetemplate-client.js.map +1 -1
- package/dist/state/form-lifecycle-manager.d.ts +1 -3
- package/dist/state/form-lifecycle-manager.d.ts.map +1 -1
- package/dist/state/form-lifecycle-manager.js +6 -6
- package/dist/state/form-lifecycle-manager.js.map +1 -1
- package/dist/tests/directives.test.js +33 -33
- package/dist/tests/directives.test.js.map +1 -1
- package/dist/tests/event-delegation.test.js +7 -9
- package/dist/tests/event-delegation.test.js.map +1 -1
- package/dist/tests/form-lifecycle-manager.test.js +27 -28
- package/dist/tests/form-lifecycle-manager.test.js.map +1 -1
- package/dist/tests/reactive-attributes.test.js +60 -84
- package/dist/tests/reactive-attributes.test.js.map +1 -1
- package/dist/utils/lvt-selector.d.ts +3 -0
- package/dist/utils/lvt-selector.d.ts.map +1 -0
- package/dist/utils/lvt-selector.js +13 -0
- package/dist/utils/lvt-selector.js.map +1 -0
- package/package.json +1 -1
- package/dist/dom/modal-manager.d.ts +0 -11
- package/dist/dom/modal-manager.d.ts.map +0 -1
- package/dist/dom/modal-manager.js +0 -62
- package/dist/dom/modal-manager.js.map +0 -1
- package/dist/tests/modal-manager.test.d.ts +0 -2
- package/dist/tests/modal-manager.test.d.ts.map +0 -1
- package/dist/tests/modal-manager.test.js +0 -80
- package/dist/tests/modal-manager.test.js.map +0 -1
- package/dist/utils/confirm.d.ts +0 -12
- package/dist/utils/confirm.d.ts.map +0 -1
- package/dist/utils/confirm.js +0 -35
- package/dist/utils/confirm.js.map +0 -1
|
@@ -2,22 +2,23 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Reactive Attributes - Declarative DOM actions triggered by LiveTemplate lifecycle events.
|
|
4
4
|
*
|
|
5
|
-
* Attribute Pattern: lvt-{
|
|
5
|
+
* Attribute Pattern: lvt-el:{method}:on:[{action}:]{state|interaction}="param"
|
|
6
6
|
*
|
|
7
|
-
*
|
|
7
|
+
* States (lifecycle):
|
|
8
8
|
* - pending: Action started, waiting for server response
|
|
9
9
|
* - success: Action completed successfully
|
|
10
10
|
* - error: Action completed with validation errors
|
|
11
11
|
* - done: Action completed (regardless of success/error)
|
|
12
12
|
*
|
|
13
|
-
*
|
|
14
|
-
* -
|
|
15
|
-
* - Action-specific: lvt-reset-on:create-todo:success (specific action only)
|
|
13
|
+
* Interactions:
|
|
14
|
+
* - click-away: Click outside the element (handled by setupClickAwayDelegation)
|
|
16
15
|
*
|
|
17
|
-
*
|
|
16
|
+
* Trigger Scope:
|
|
17
|
+
* - Unscoped: lvt-el:reset:on:success (any action)
|
|
18
|
+
* - Action-scoped: lvt-el:reset:on:create-todo:success (specific action only)
|
|
19
|
+
*
|
|
20
|
+
* Methods:
|
|
18
21
|
* - reset: Calls form.reset()
|
|
19
|
-
* - disable: Sets element.disabled = true
|
|
20
|
-
* - enable: Sets element.disabled = false
|
|
21
22
|
* - addClass: Adds CSS class(es)
|
|
22
23
|
* - removeClass: Removes CSS class(es)
|
|
23
24
|
* - toggleClass: Toggles CSS class(es)
|
|
@@ -31,21 +32,10 @@ exports.matchesEvent = matchesEvent;
|
|
|
31
32
|
exports.processReactiveAttributes = processReactiveAttributes;
|
|
32
33
|
exports.setupReactiveAttributeListeners = setupReactiveAttributeListeners;
|
|
33
34
|
const LIFECYCLE_EVENTS = ["pending", "success", "error", "done"];
|
|
34
|
-
const
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
"enable",
|
|
38
|
-
"addClass",
|
|
39
|
-
"removeClass",
|
|
40
|
-
"toggleClass",
|
|
41
|
-
"setAttr",
|
|
42
|
-
"toggleAttr",
|
|
43
|
-
];
|
|
44
|
-
// Lowercase versions for case-insensitive matching (HTML attributes are lowercased)
|
|
45
|
-
const ACTION_MAP = {
|
|
35
|
+
const LIFECYCLE_SET = new Set(LIFECYCLE_EVENTS);
|
|
36
|
+
// Lowercase method names → canonical ReactiveAction
|
|
37
|
+
const METHOD_MAP = {
|
|
46
38
|
reset: "reset",
|
|
47
|
-
disable: "disable",
|
|
48
|
-
enable: "enable",
|
|
49
39
|
addclass: "addClass",
|
|
50
40
|
removeclass: "removeClass",
|
|
51
41
|
toggleclass: "toggleClass",
|
|
@@ -55,37 +45,40 @@ const ACTION_MAP = {
|
|
|
55
45
|
/**
|
|
56
46
|
* Parse a reactive attribute name and value into a binding.
|
|
57
47
|
*
|
|
48
|
+
* Supported pattern: lvt-el:{method}:on:[{action}:]{state}
|
|
49
|
+
*
|
|
58
50
|
* Examples:
|
|
59
|
-
* parseReactiveAttribute("lvt-reset
|
|
60
|
-
* parseReactiveAttribute("lvt-
|
|
61
|
-
* parseReactiveAttribute("lvt-reset
|
|
51
|
+
* parseReactiveAttribute("lvt-el:reset:on:success", "") => { action: "reset", lifecycle: "success" }
|
|
52
|
+
* parseReactiveAttribute("lvt-el:addclass:on:pending", "loading") => { action: "addClass", lifecycle: "pending", param: "loading" }
|
|
53
|
+
* parseReactiveAttribute("lvt-el:reset:on:create-todo:success", "") => { action: "reset", lifecycle: "success", actionName: "create-todo" }
|
|
62
54
|
*/
|
|
63
55
|
function parseReactiveAttribute(attrName, attrValue) {
|
|
64
|
-
|
|
65
|
-
//
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
}
|
|
56
|
+
const lower = attrName.toLowerCase();
|
|
57
|
+
// New pattern: lvt-el:{method}:on:[{action}:]{state}
|
|
58
|
+
const newMatch = lower.match(/^lvt-el:(\w+):on:(.+)$/);
|
|
59
|
+
if (newMatch) {
|
|
60
|
+
const methodKey = newMatch[1];
|
|
61
|
+
const action = METHOD_MAP[methodKey];
|
|
62
|
+
if (!action)
|
|
63
|
+
return null;
|
|
64
|
+
const eventPart = newMatch[2];
|
|
65
|
+
// Skip interaction triggers (click-away) — handled by click-away delegation
|
|
66
|
+
if (eventPart === "click-away")
|
|
67
|
+
return null;
|
|
68
|
+
const segments = eventPart.split(":");
|
|
69
|
+
const lastSegment = segments[segments.length - 1];
|
|
70
|
+
if (!LIFECYCLE_SET.has(lastSegment))
|
|
71
|
+
return null;
|
|
72
|
+
const lifecycle = lastSegment;
|
|
73
|
+
const actionName = segments.length > 1 ? segments.slice(0, -1).join(":") : undefined;
|
|
74
|
+
return {
|
|
75
|
+
action,
|
|
76
|
+
lifecycle,
|
|
77
|
+
actionName: actionName || undefined,
|
|
78
|
+
param: attrValue || undefined,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
return null;
|
|
89
82
|
}
|
|
90
83
|
/**
|
|
91
84
|
* Execute a reactive action on an element.
|
|
@@ -97,16 +90,6 @@ function executeAction(element, action, param) {
|
|
|
97
90
|
element.reset();
|
|
98
91
|
}
|
|
99
92
|
break;
|
|
100
|
-
case "disable":
|
|
101
|
-
if ("disabled" in element) {
|
|
102
|
-
element.disabled = true;
|
|
103
|
-
}
|
|
104
|
-
break;
|
|
105
|
-
case "enable":
|
|
106
|
-
if ("disabled" in element) {
|
|
107
|
-
element.disabled = false;
|
|
108
|
-
}
|
|
109
|
-
break;
|
|
110
93
|
case "addClass":
|
|
111
94
|
if (param) {
|
|
112
95
|
const classes = param.split(/\s+/).filter(Boolean);
|
|
@@ -144,36 +127,53 @@ function executeAction(element, action, param) {
|
|
|
144
127
|
}
|
|
145
128
|
/**
|
|
146
129
|
* Check if an event matches a binding.
|
|
147
|
-
*
|
|
148
|
-
* @param binding The reactive binding to check
|
|
149
|
-
* @param lifecycle The lifecycle event that fired
|
|
150
|
-
* @param actionName The action name that triggered the event (optional)
|
|
151
130
|
*/
|
|
152
131
|
function matchesEvent(binding, lifecycle, actionName) {
|
|
153
|
-
// Lifecycle must match
|
|
154
132
|
if (binding.lifecycle !== lifecycle)
|
|
155
133
|
return false;
|
|
156
|
-
// If binding has no actionName, it's global (matches any action)
|
|
157
134
|
if (!binding.actionName)
|
|
158
135
|
return true;
|
|
159
|
-
// If binding has actionName, it must match the fired action
|
|
160
136
|
return binding.actionName === actionName;
|
|
161
137
|
}
|
|
162
138
|
/**
|
|
163
139
|
* Process all reactive attributes for a lifecycle event.
|
|
164
|
-
*
|
|
165
|
-
* Instead of building complex selectors, we iterate all elements with any lvt-*-on:* attribute
|
|
166
|
-
* and check each one against the fired event.
|
|
167
140
|
*/
|
|
168
141
|
function processReactiveAttributes(lifecycle, actionName) {
|
|
169
|
-
//
|
|
170
|
-
//
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
142
|
+
// Target only elements with lvt-el: attributes instead of scanning all DOM elements.
|
|
143
|
+
// CSS doesn't support attribute-name-starts-with, so we build selectors from known
|
|
144
|
+
// method prefixes. This covers both unscoped (lvt-el:reset:on:success) and
|
|
145
|
+
// action-scoped (lvt-el:reset:on:create-todo:success) patterns.
|
|
146
|
+
const methodKeys = Object.keys(METHOD_MAP);
|
|
147
|
+
const selectorParts = [];
|
|
148
|
+
// Escape CSS-special characters in actionName for use in attribute selectors
|
|
149
|
+
const escapedAction = actionName
|
|
150
|
+
? actionName.replace(/([^\w-])/g, "\\$1")
|
|
151
|
+
: undefined;
|
|
152
|
+
for (const m of methodKeys) {
|
|
153
|
+
selectorParts.push(`[lvt-el\\:${m}\\:on\\:${lifecycle}]`);
|
|
154
|
+
if (escapedAction) {
|
|
155
|
+
selectorParts.push(`[lvt-el\\:${m}\\:on\\:${escapedAction}\\:${lifecycle}]`);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
const selector = selectorParts.join(", ");
|
|
159
|
+
let candidates;
|
|
160
|
+
try {
|
|
161
|
+
candidates = document.querySelectorAll(selector);
|
|
162
|
+
}
|
|
163
|
+
catch {
|
|
164
|
+
// If selector is still invalid despite escaping, scan targeted elements only
|
|
165
|
+
// by matching unscoped patterns (without actionName)
|
|
166
|
+
const fallbackParts = methodKeys.map(m => `[lvt-el\\:${m}\\:on\\:${lifecycle}]`);
|
|
167
|
+
try {
|
|
168
|
+
candidates = document.querySelectorAll(fallbackParts.join(", "));
|
|
169
|
+
}
|
|
170
|
+
catch {
|
|
171
|
+
return; // Cannot construct any valid selector
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
candidates.forEach((element) => {
|
|
174
175
|
Array.from(element.attributes).forEach((attr) => {
|
|
175
|
-
|
|
176
|
-
if (!attr.name.startsWith("lvt-") || !attr.name.includes("-on:")) {
|
|
176
|
+
if (!attr.name.startsWith("lvt-el:") || !attr.name.includes(":on:")) {
|
|
177
177
|
return;
|
|
178
178
|
}
|
|
179
179
|
const binding = parseReactiveAttribute(attr.name, attr.value);
|
|
@@ -185,17 +185,14 @@ function processReactiveAttributes(lifecycle, actionName) {
|
|
|
185
185
|
}
|
|
186
186
|
/**
|
|
187
187
|
* Set up document-level event listeners for reactive attributes.
|
|
188
|
-
* This should be called once during client initialization.
|
|
189
188
|
*/
|
|
190
189
|
function setupReactiveAttributeListeners() {
|
|
191
190
|
LIFECYCLE_EVENTS.forEach((lifecycle) => {
|
|
192
|
-
// Listen in capture phase to process before event bubbles
|
|
193
191
|
document.addEventListener(`lvt:${lifecycle}`, (e) => {
|
|
194
192
|
const customEvent = e;
|
|
195
193
|
const actionName = customEvent.detail?.action;
|
|
196
194
|
processReactiveAttributes(lifecycle, actionName);
|
|
197
|
-
}, true
|
|
198
|
-
);
|
|
195
|
+
}, true);
|
|
199
196
|
});
|
|
200
197
|
}
|
|
201
198
|
//# sourceMappingURL=reactive-attributes.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reactive-attributes.js","sourceRoot":"","sources":["../../dom/reactive-attributes.ts"],"names":[],"mappings":";AAAA
|
|
1
|
+
{"version":3,"file":"reactive-attributes.js","sourceRoot":"","sources":["../../dom/reactive-attributes.ts"],"names":[],"mappings":"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"}
|