@livenetworks/ashlar 2.0.7 → 2.0.8
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/LICENSE +641 -641
- package/components/COMPONENTS.md +1116 -1116
- package/components/index.js +81 -81
- package/components/ln-accordion/ln-accordion-dev.scss +8 -8
- package/components/ln-accordion/ln-accordion.js +1 -1
- package/components/ln-accordion/ln-accordion.schema.json +30 -30
- package/components/ln-ajax/ln-ajax-dev.scss +8 -8
- package/components/ln-ajax/ln-ajax.js +1 -1
- package/components/ln-ajax/ln-ajax.schema.json +30 -30
- package/components/ln-api-connector/ln-api-connector.js +1 -1
- package/components/ln-api-connector/ln-api-connector.schema.json +96 -96
- package/components/ln-api-connector/src/ln-api-connector.js +1 -0
- package/components/ln-api-queue/ln-api-queue.js +1 -1
- package/components/ln-api-queue/ln-api-queue.schema.json +34 -34
- package/components/ln-api-queue/src/ln-api-queue.js +3 -13
- package/components/ln-autoresize/ln-autoresize-dev.scss +8 -8
- package/components/ln-autoresize/ln-autoresize.js +1 -1
- package/components/ln-autoresize/ln-autoresize.schema.json +22 -22
- package/components/ln-autosave/ln-autosave-dev.scss +13 -13
- package/components/ln-autosave/ln-autosave.js +1 -1
- package/components/ln-autosave/ln-autosave.schema.json +48 -48
- package/components/ln-autosave/src/autosave-model.js +34 -34
- package/components/ln-chart/ln-chart.js +1 -1
- package/components/ln-chart/ln-chart.schema.json +146 -146
- package/components/ln-chart/src/chart-model.js +154 -154
- package/components/ln-circular-progress/ln-circular-progress.js +1 -1
- package/components/ln-circular-progress/ln-circular-progress.schema.json +42 -42
- package/components/ln-confirm/ln-confirm-dev.scss +24 -24
- package/components/ln-confirm/ln-confirm.js +1 -1
- package/components/ln-confirm/ln-confirm.schema.json +66 -66
- package/components/ln-confirm/src/ln-confirm.js +178 -178
- package/components/ln-core/crypto.js +286 -265
- package/components/ln-core/dom.js +115 -115
- package/components/ln-core/form.js +136 -136
- package/components/ln-core/helpers.js +33 -33
- package/components/ln-core/http.js +48 -48
- package/components/ln-core/index.js +1 -1
- package/components/ln-core/ln-core.schema.json +109 -109
- package/components/ln-core/locale.js +55 -55
- package/components/ln-core/matching.js +78 -78
- package/components/ln-core/number.js +125 -125
- package/components/ln-core/template.js +206 -206
- package/components/ln-couchdb-connector/ln-couchdb-connector.js +1 -1
- package/components/ln-couchdb-connector/ln-couchdb-connector.schema.json +50 -50
- package/components/ln-couchdb-connector/src/ln-couchdb-connector.js +1 -0
- package/components/ln-data-coordinator/README.md +9 -38
- package/components/ln-data-coordinator/ln-data-coordinator-dev.scss +8 -8
- package/components/ln-data-coordinator/ln-data-coordinator.js +1 -1
- package/components/ln-data-coordinator/ln-data-coordinator.schema.json +16 -16
- package/components/ln-data-coordinator/src/data-read-policy.js +0 -7
- package/components/ln-data-coordinator/src/ln-data-coordinator.js +428 -1308
- package/components/ln-data-store/ln-data-store-dev.scss +13 -13
- package/components/ln-data-store/ln-data-store.js +1 -1
- package/components/ln-data-store/ln-data-store.schema.json +84 -84
- package/components/ln-data-store/src/data-store-model.js +184 -184
- package/components/ln-data-store/src/ln-data-store.js +1 -1
- package/components/ln-date/ln-date.js +1 -1
- package/components/ln-date/ln-date.schema.json +92 -92
- package/components/ln-date/src/date-model.js +186 -186
- package/components/ln-debug/ln-debug.js +1 -1
- package/components/ln-debug/ln-debug.schema.json +28 -28
- package/components/ln-debug/src/console-sink.js +19 -19
- package/components/ln-debug/src/gate.js +95 -95
- package/components/ln-debug/src/generated-attributes.js +2 -2
- package/components/ln-dropdown/ln-dropdown-dev.scss +13 -13
- package/components/ln-dropdown/ln-dropdown.js +1 -1
- package/components/ln-dropdown/ln-dropdown.schema.json +90 -90
- package/components/ln-editor/ln-editor.js +1 -1
- package/components/ln-editor/ln-editor.schema.json +58 -58
- package/components/ln-external-links/ln-external-links.js +1 -1
- package/components/ln-external-links/ln-external-links.schema.json +18 -18
- package/components/ln-fill/ln-fill.js +1 -1
- package/components/ln-fill/ln-fill.schema.json +23 -23
- package/components/ln-filter/ln-filter.js +1 -1
- package/components/ln-filter/ln-filter.schema.json +153 -153
- package/components/ln-filter/src/filter-model.js +185 -185
- package/components/ln-form/ln-form-dev.scss +8 -8
- package/components/ln-form/ln-form.js +1 -1
- package/components/ln-form/ln-form.schema.json +45 -45
- package/components/ln-http/ln-http.js +1 -1
- package/components/ln-http/ln-http.schema.json +6 -6
- package/components/ln-icon/ln-icon.schema.json +6 -6
- package/components/ln-include/ln-include.js +1 -1
- package/components/ln-include/ln-include.schema.json +23 -23
- package/components/ln-key/ln-key-dev.scss +18 -18
- package/components/ln-key/ln-key.js +1 -1
- package/components/ln-key/ln-key.schema.json +56 -56
- package/components/ln-key/src/ln-key.js +10 -10
- package/components/ln-link/ln-link-dev.scss +8 -8
- package/components/ln-link/ln-link.js +1 -1
- package/components/ln-link/ln-link.schema.json +22 -22
- package/components/ln-list/README.md +152 -152
- package/components/ln-list/ln-list-dev.scss +8 -8
- package/components/ln-list/ln-list.js +1 -1
- package/components/ln-list/ln-list.schema.json +166 -166
- package/components/ln-modal/ln-modal.js +1 -1
- package/components/ln-modal/ln-modal.schema.json +65 -65
- package/components/ln-nav/ln-nav.js +1 -1
- package/components/ln-nav/ln-nav.schema.json +25 -25
- package/components/ln-number/ln-number.js +1 -1
- package/components/ln-number/ln-number.schema.json +63 -63
- package/components/ln-number/src/number-model.js +31 -31
- package/components/ln-obfuscator/README.md +60 -60
- package/components/ln-obfuscator/ln-obfuscator.js +1 -1
- package/components/ln-obfuscator/ln-obfuscator.schema.json +49 -49
- package/components/ln-obfuscator/src/ln-obfuscator.js +159 -159
- package/components/ln-obfuscator/src/obfuscator-model.js +250 -250
- package/components/ln-options/ln-options.js +1 -1
- package/components/ln-options/ln-options.schema.json +41 -41
- package/components/ln-persist/README.md +151 -151
- package/components/ln-persist/ln-persist.js +1 -1
- package/components/ln-persist/ln-persist.schema.json +28 -28
- package/components/ln-persist/src/ln-persist.js +83 -83
- package/components/ln-picklist/README.md +230 -230
- package/components/ln-picklist/ln-picklist-dev.scss +22 -22
- package/components/ln-picklist/ln-picklist.js +1 -1
- package/components/ln-picklist/ln-picklist.schema.json +49 -49
- package/components/ln-picklist/src/ln-picklist.js +228 -228
- package/components/ln-popover/ln-popover-dev.scss +13 -13
- package/components/ln-popover/ln-popover.js +1 -1
- package/components/ln-popover/ln-popover.schema.json +82 -82
- package/components/ln-progress/ln-progress-dev.scss +8 -8
- package/components/ln-progress/ln-progress.js +1 -1
- package/components/ln-progress/ln-progress.schema.json +40 -40
- package/components/ln-router/ln-router.js +1 -1
- package/components/ln-router/ln-router.schema.json +76 -76
- package/components/ln-scroll/README.md +45 -45
- package/components/ln-scroll/ln-scroll.js +1 -1
- package/components/ln-scroll/ln-scroll.schema.json +85 -85
- package/components/ln-scroll/src/ln-scroll.js +150 -150
- package/components/ln-search/README.md +188 -188
- package/components/ln-search/ln-search.js +1 -1
- package/components/ln-search/ln-search.schema.json +103 -103
- package/components/ln-slug/ln-slug.js +1 -1
- package/components/ln-slug/ln-slug.schema.json +23 -23
- package/components/ln-sort/ln-sort.js +1 -1
- package/components/ln-sort/ln-sort.schema.json +104 -104
- package/components/ln-sort/src/ln-sort.js +321 -321
- package/components/ln-sort/src/sort-model.js +117 -117
- package/components/ln-sortable/ln-sortable-dev.scss +13 -13
- package/components/ln-sortable/ln-sortable.js +1 -1
- package/components/ln-sortable/ln-sortable.schema.json +36 -36
- package/components/ln-stat/ln-stat-dev.scss +8 -8
- package/components/ln-stat/ln-stat.js +1 -1
- package/components/ln-stat/ln-stat.schema.json +32 -32
- package/components/ln-stat/src/stat-model.js +28 -28
- package/components/ln-table/ln-table.js +1 -1
- package/components/ln-table/ln-table.schema.json +211 -211
- package/components/ln-table/src/table-model.js +98 -98
- package/components/ln-table-coordinator/ln-table-coordinator.js +1 -1
- package/components/ln-table-coordinator/ln-table-coordinator.schema.json +93 -93
- package/components/ln-tabs/ln-tabs.js +1 -1
- package/components/ln-tabs/ln-tabs.schema.json +75 -75
- package/components/ln-tabs/src/ln-tabs.js +208 -208
- package/components/ln-tabs/src/tabs-model.js +82 -82
- package/components/ln-time/ln-time-dev.scss +13 -13
- package/components/ln-time/ln-time.js +1 -1
- package/components/ln-time/ln-time.schema.json +38 -38
- package/components/ln-toast/ln-toast.js +1 -1
- package/components/ln-toast/ln-toast.schema.json +65 -65
- package/components/ln-toggle/ln-toggle.js +1 -1
- package/components/ln-toggle/ln-toggle.schema.json +52 -52
- package/components/ln-tooltip/ln-tooltip.js +1 -1
- package/components/ln-tooltip/ln-tooltip.schema.json +86 -86
- package/components/ln-translations/ln-translations.js +1 -1
- package/components/ln-translations/ln-translations.schema.json +120 -120
- package/components/ln-ui-coordinator/README.md +62 -62
- package/components/ln-ui-coordinator/ln-ui-coordinator.js +1 -1
- package/components/ln-ui-coordinator/ln-ui-coordinator.schema.json +28 -28
- package/components/ln-ui-coordinator/src/ln-ui-coordinator.js +140 -140
- package/components/ln-upload/ln-upload.js +1 -1
- package/components/ln-upload/ln-upload.schema.json +193 -193
- package/components/ln-upload/src/upload-model.js +78 -78
- package/components/ln-validate/ln-validate.js +1 -1
- package/components/ln-validate/ln-validate.schema.json +50 -50
- package/components/ln-validate/src/validate-model.js +64 -64
- package/components/ln-websocket-connector/README.md +166 -166
- package/components/ln-websocket-connector/ln-websocket-connector.js +1 -1
- package/components/ln-websocket-connector/ln-websocket-connector.schema.json +29 -29
- package/components/ln-websocket-connector/src/ln-websocket-connector.js +283 -279
- package/ln-ashlar.html-data.json +7 -8
- package/package.json +84 -84
- package/theme/brand.css +73 -73
- package/theme/components/_confirm.scss +6 -6
- package/theme/components/_picklist.scss +3 -3
- package/theme/config/_palette.scss +274 -274
- package/theme/config/_theme.scss +292 -292
- package/theme/config/_tokens.scss +285 -285
- package/theme/config/mixins/_index.scss +62 -62
- package/theme/config/mixins/_picklist.scss +66 -66
- package/theme/ln-ashlar-dev.scss +66 -66
- package/theme/ln-ashlar-landing.scss +56 -56
- package/theme/ln-ashlar-theme.scss +63 -63
- package/theme/presentation/_bento.scss +151 -151
- package/theme/presentation/_cta.scss +111 -111
- package/theme/presentation/_effects.scss +216 -216
- package/theme/presentation/_features.scss +108 -108
- package/theme/presentation/_footer.scss +129 -129
- package/theme/presentation/_hero.scss +158 -158
- package/theme/presentation/_layout.scss +170 -170
- package/theme/presentation/_navbar.scss +140 -140
- package/theme/presentation/_pricing.scss +262 -262
- package/theme/presentation/_stats.scss +87 -87
- package/theme/presentation/_testimonials.scss +124 -124
- package/theme/presentation/_tokens.scss +39 -39
- package/theme/presentation/_typography.scss +163 -163
- package/web-types.json +12 -12
|
@@ -1,250 +1,250 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* components/ln-obfuscator/src/obfuscator-model.js
|
|
3
|
-
*
|
|
4
|
-
* Pure cipher and encoding algorithms for ln-obfuscator.
|
|
5
|
-
* Supports:
|
|
6
|
-
* - 'rot' (default): Caesar / ROT-N on [a-zA-Z] (mod 26) and [0-9] (mod 10).
|
|
7
|
-
* - 'base64': UTF-8 safe Base64 encoding for arbitrary unicode / scripts (Cyrillic, CJK, etc.).
|
|
8
|
-
* - 'xor': Symmetric multi-byte XOR cipher with Base64 ASCII transport for arbitrary unicode.
|
|
9
|
-
*
|
|
10
|
-
* Zero DOM dependencies.
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* Shifts an ASCII alphabetic character (mod 26) or digit (mod 10) by the given offset (preserving case).
|
|
15
|
-
* Non-alphanumeric characters (symbols, spaces, unicode) are returned untouched.
|
|
16
|
-
*
|
|
17
|
-
* @param {string} char - Single character
|
|
18
|
-
* @param {number} shift - Integer shift offset
|
|
19
|
-
* @returns {string} Shifted character
|
|
20
|
-
*/
|
|
21
|
-
export function rotChar(char, shift) {
|
|
22
|
-
if (char.length !== 1) return char;
|
|
23
|
-
const code = char.charCodeAt(0);
|
|
24
|
-
|
|
25
|
-
// Uppercase A-Z (65-90)
|
|
26
|
-
if (code >= 65 && code <= 90) {
|
|
27
|
-
const offset = ((code - 65 + shift) % 26 + 26) % 26;
|
|
28
|
-
return String.fromCharCode(65 + offset);
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
// Lowercase a-z (97-122)
|
|
32
|
-
if (code >= 97 && code <= 122) {
|
|
33
|
-
const offset = ((code - 97 + shift) % 26 + 26) % 26;
|
|
34
|
-
return String.fromCharCode(97 + offset);
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
// Digits 0-9 (48-57)
|
|
38
|
-
if (code >= 48 && code <= 57) {
|
|
39
|
-
const offset = ((code - 48 + shift) % 10 + 10) % 10;
|
|
40
|
-
return String.fromCharCode(48 + offset);
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
return char;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
/**
|
|
47
|
-
* Encodes any UTF-8 string into Base64 (browser & Node compatible, Unicode-safe).
|
|
48
|
-
*
|
|
49
|
-
* @param {string} str - Input text
|
|
50
|
-
* @returns {string} Base64 encoded string
|
|
51
|
-
*/
|
|
52
|
-
export function utf8ToBase64(str) {
|
|
53
|
-
if (str == null || str === '') return '';
|
|
54
|
-
const input = String(str);
|
|
55
|
-
if (typeof TextEncoder !== 'undefined' && typeof btoa !== 'undefined') {
|
|
56
|
-
const bytes = new TextEncoder().encode(input);
|
|
57
|
-
let binary = '';
|
|
58
|
-
const len = bytes.length;
|
|
59
|
-
for (let i = 0; i < len; i++) {
|
|
60
|
-
binary += String.fromCharCode(bytes[i]);
|
|
61
|
-
}
|
|
62
|
-
return btoa(binary);
|
|
63
|
-
}
|
|
64
|
-
if (typeof Buffer !== 'undefined') {
|
|
65
|
-
return Buffer.from(input, 'utf-8').toString('base64');
|
|
66
|
-
}
|
|
67
|
-
return '';
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
/**
|
|
71
|
-
* Decodes a Base64 string back into a UTF-8 string (browser & Node compatible, Unicode-safe).
|
|
72
|
-
*
|
|
73
|
-
* @param {string} b64 - Base64 string
|
|
74
|
-
* @returns {string} Decoded UTF-8 string
|
|
75
|
-
*/
|
|
76
|
-
export function base64ToUtf8(b64) {
|
|
77
|
-
if (b64 == null || b64 === '') return '';
|
|
78
|
-
try {
|
|
79
|
-
const trimmed = String(b64).trim();
|
|
80
|
-
if (typeof atob !== 'undefined' && typeof TextDecoder !== 'undefined') {
|
|
81
|
-
const binary = atob(trimmed);
|
|
82
|
-
const bytes = new Uint8Array(binary.length);
|
|
83
|
-
for (let i = 0; i < binary.length; i++) {
|
|
84
|
-
bytes[i] = binary.charCodeAt(i);
|
|
85
|
-
}
|
|
86
|
-
return new TextDecoder().decode(bytes);
|
|
87
|
-
}
|
|
88
|
-
if (typeof Buffer !== 'undefined') {
|
|
89
|
-
return Buffer.from(trimmed, 'base64').toString('utf-8');
|
|
90
|
-
}
|
|
91
|
-
} catch {
|
|
92
|
-
return b64;
|
|
93
|
-
}
|
|
94
|
-
return b64;
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
/**
|
|
98
|
-
* Performs byte-level XOR with a repeating key.
|
|
99
|
-
*
|
|
100
|
-
* @param {Uint8Array} bytes - Input bytes
|
|
101
|
-
* @param {string} keyStr - Key string
|
|
102
|
-
* @returns {Uint8Array} XOR transformed bytes
|
|
103
|
-
*/
|
|
104
|
-
export function xorBytes(bytes, keyStr) {
|
|
105
|
-
const key = String(keyStr || 'ln-ashlar');
|
|
106
|
-
let keyBytes;
|
|
107
|
-
if (typeof TextEncoder !== 'undefined') {
|
|
108
|
-
keyBytes = new TextEncoder().encode(key);
|
|
109
|
-
} else if (typeof Buffer !== 'undefined') {
|
|
110
|
-
keyBytes = Buffer.from(key, 'utf-8');
|
|
111
|
-
} else {
|
|
112
|
-
keyBytes = [108, 110];
|
|
113
|
-
}
|
|
114
|
-
const keyLen = keyBytes.length || 1;
|
|
115
|
-
const out = new Uint8Array(bytes.length);
|
|
116
|
-
for (let i = 0; i < bytes.length; i++) {
|
|
117
|
-
out[i] = bytes[i] ^ keyBytes[i % keyLen];
|
|
118
|
-
}
|
|
119
|
-
return out;
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
/**
|
|
123
|
-
* Obfuscates UTF-8 text with an XOR cipher and returns Base64 ASCII text.
|
|
124
|
-
*
|
|
125
|
-
* @param {string} text - Input text (any script / unicode)
|
|
126
|
-
* @param {string} [key='ln-ashlar'] - Secret key
|
|
127
|
-
* @returns {string} Base64 encoded XOR payload
|
|
128
|
-
*/
|
|
129
|
-
export function xorObfuscate(text, key = 'ln-ashlar') {
|
|
130
|
-
if (text == null || text === '') return '';
|
|
131
|
-
const input = String(text);
|
|
132
|
-
let bytes;
|
|
133
|
-
if (typeof TextEncoder !== 'undefined') {
|
|
134
|
-
bytes = new TextEncoder().encode(input);
|
|
135
|
-
} else if (typeof Buffer !== 'undefined') {
|
|
136
|
-
bytes = Buffer.from(input, 'utf-8');
|
|
137
|
-
} else {
|
|
138
|
-
return '';
|
|
139
|
-
}
|
|
140
|
-
const xored = xorBytes(bytes, key);
|
|
141
|
-
let binary = '';
|
|
142
|
-
for (let i = 0; i < xored.length; i++) {
|
|
143
|
-
binary += String.fromCharCode(xored[i]);
|
|
144
|
-
}
|
|
145
|
-
if (typeof btoa !== 'undefined') {
|
|
146
|
-
return btoa(binary);
|
|
147
|
-
}
|
|
148
|
-
if (typeof Buffer !== 'undefined') {
|
|
149
|
-
return Buffer.from(xored).toString('base64');
|
|
150
|
-
}
|
|
151
|
-
return '';
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
/**
|
|
155
|
-
* Deobfuscates Base64 ASCII XOR payload back into UTF-8 text.
|
|
156
|
-
*
|
|
157
|
-
* @param {string} b64 - Base64 encoded XOR payload
|
|
158
|
-
* @param {string} [key='ln-ashlar'] - Secret key used during obfuscation
|
|
159
|
-
* @returns {string} Plain UTF-8 text
|
|
160
|
-
*/
|
|
161
|
-
export function xorDeobfuscate(b64, key = 'ln-ashlar') {
|
|
162
|
-
if (b64 == null || b64 === '') return '';
|
|
163
|
-
try {
|
|
164
|
-
const trimmed = String(b64).trim();
|
|
165
|
-
let binary = '';
|
|
166
|
-
if (typeof atob !== 'undefined') {
|
|
167
|
-
binary = atob(trimmed);
|
|
168
|
-
} else if (typeof Buffer !== 'undefined') {
|
|
169
|
-
binary = Buffer.from(trimmed, 'base64').toString('binary');
|
|
170
|
-
} else {
|
|
171
|
-
return b64;
|
|
172
|
-
}
|
|
173
|
-
const bytes = new Uint8Array(binary.length);
|
|
174
|
-
for (let i = 0; i < binary.length; i++) {
|
|
175
|
-
bytes[i] = binary.charCodeAt(i);
|
|
176
|
-
}
|
|
177
|
-
const xored = xorBytes(bytes, key);
|
|
178
|
-
if (typeof TextDecoder !== 'undefined') {
|
|
179
|
-
return new TextDecoder().decode(xored);
|
|
180
|
-
}
|
|
181
|
-
if (typeof Buffer !== 'undefined') {
|
|
182
|
-
return Buffer.from(xored).toString('utf-8');
|
|
183
|
-
}
|
|
184
|
-
} catch {
|
|
185
|
-
return b64;
|
|
186
|
-
}
|
|
187
|
-
return b64;
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
/**
|
|
191
|
-
* Parses options argument for obfuscate / deobfuscate.
|
|
192
|
-
* @private
|
|
193
|
-
*/
|
|
194
|
-
function _parseOptions(options) {
|
|
195
|
-
if (typeof options === 'number' || (typeof options === 'string' && /^-?\d+$/.test(String(options).trim()))) {
|
|
196
|
-
return { codec: 'rot', shift: Number(options) || 13, key: 'ln-ashlar' };
|
|
197
|
-
}
|
|
198
|
-
if (options && typeof options === 'object') {
|
|
199
|
-
const rawCodec = (options.codec || (options.key ? 'xor' : 'rot')).toLowerCase().trim();
|
|
200
|
-
const codec = (rawCodec === 'xor' || rawCodec === 'base64') ? rawCodec : 'rot';
|
|
201
|
-
const shift = Number(options.shift) || 13;
|
|
202
|
-
const key = options.key || 'ln-ashlar';
|
|
203
|
-
return { codec, shift, key };
|
|
204
|
-
}
|
|
205
|
-
return { codec: 'rot', shift: 13, key: 'ln-ashlar' };
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
/**
|
|
209
|
-
* Obfuscates a string with the configured codec ('rot', 'base64', or 'xor').
|
|
210
|
-
*
|
|
211
|
-
* @param {string} text - Input text
|
|
212
|
-
* @param {number|object} [options=13] - Shift offset (number) or options object `{ codec, shift, key }`
|
|
213
|
-
* @returns {string} Obfuscated string
|
|
214
|
-
*/
|
|
215
|
-
export function obfuscate(text, options = 13) {
|
|
216
|
-
if (text == null) return '';
|
|
217
|
-
if (typeof text !== 'string') text = String(text);
|
|
218
|
-
if (text.length === 0) return '';
|
|
219
|
-
|
|
220
|
-
const opts = _parseOptions(options);
|
|
221
|
-
if (opts.codec === 'base64') {
|
|
222
|
-
return utf8ToBase64(text);
|
|
223
|
-
}
|
|
224
|
-
if (opts.codec === 'xor') {
|
|
225
|
-
return xorObfuscate(text, opts.key);
|
|
226
|
-
}
|
|
227
|
-
return text.replace(/[a-zA-Z0-9]/g, (c) => rotChar(c, opts.shift));
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
/**
|
|
231
|
-
* Deobfuscates a string by reversing the configured codec ('rot', 'base64', or 'xor').
|
|
232
|
-
*
|
|
233
|
-
* @param {string} text - Obfuscated text
|
|
234
|
-
* @param {number|object} [options=13] - Original shift offset (number) or options object `{ codec, shift, key }`
|
|
235
|
-
* @returns {string} Plain text
|
|
236
|
-
*/
|
|
237
|
-
export function deobfuscate(text, options = 13) {
|
|
238
|
-
if (text == null) return '';
|
|
239
|
-
if (typeof text !== 'string') text = String(text);
|
|
240
|
-
if (text.length === 0) return '';
|
|
241
|
-
|
|
242
|
-
const opts = _parseOptions(options);
|
|
243
|
-
if (opts.codec === 'base64') {
|
|
244
|
-
return base64ToUtf8(text);
|
|
245
|
-
}
|
|
246
|
-
if (opts.codec === 'xor') {
|
|
247
|
-
return xorDeobfuscate(text, opts.key);
|
|
248
|
-
}
|
|
249
|
-
return text.replace(/[a-zA-Z0-9]/g, (c) => rotChar(c, -opts.shift));
|
|
250
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* components/ln-obfuscator/src/obfuscator-model.js
|
|
3
|
+
*
|
|
4
|
+
* Pure cipher and encoding algorithms for ln-obfuscator.
|
|
5
|
+
* Supports:
|
|
6
|
+
* - 'rot' (default): Caesar / ROT-N on [a-zA-Z] (mod 26) and [0-9] (mod 10).
|
|
7
|
+
* - 'base64': UTF-8 safe Base64 encoding for arbitrary unicode / scripts (Cyrillic, CJK, etc.).
|
|
8
|
+
* - 'xor': Symmetric multi-byte XOR cipher with Base64 ASCII transport for arbitrary unicode.
|
|
9
|
+
*
|
|
10
|
+
* Zero DOM dependencies.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Shifts an ASCII alphabetic character (mod 26) or digit (mod 10) by the given offset (preserving case).
|
|
15
|
+
* Non-alphanumeric characters (symbols, spaces, unicode) are returned untouched.
|
|
16
|
+
*
|
|
17
|
+
* @param {string} char - Single character
|
|
18
|
+
* @param {number} shift - Integer shift offset
|
|
19
|
+
* @returns {string} Shifted character
|
|
20
|
+
*/
|
|
21
|
+
export function rotChar(char, shift) {
|
|
22
|
+
if (char.length !== 1) return char;
|
|
23
|
+
const code = char.charCodeAt(0);
|
|
24
|
+
|
|
25
|
+
// Uppercase A-Z (65-90)
|
|
26
|
+
if (code >= 65 && code <= 90) {
|
|
27
|
+
const offset = ((code - 65 + shift) % 26 + 26) % 26;
|
|
28
|
+
return String.fromCharCode(65 + offset);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// Lowercase a-z (97-122)
|
|
32
|
+
if (code >= 97 && code <= 122) {
|
|
33
|
+
const offset = ((code - 97 + shift) % 26 + 26) % 26;
|
|
34
|
+
return String.fromCharCode(97 + offset);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// Digits 0-9 (48-57)
|
|
38
|
+
if (code >= 48 && code <= 57) {
|
|
39
|
+
const offset = ((code - 48 + shift) % 10 + 10) % 10;
|
|
40
|
+
return String.fromCharCode(48 + offset);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
return char;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Encodes any UTF-8 string into Base64 (browser & Node compatible, Unicode-safe).
|
|
48
|
+
*
|
|
49
|
+
* @param {string} str - Input text
|
|
50
|
+
* @returns {string} Base64 encoded string
|
|
51
|
+
*/
|
|
52
|
+
export function utf8ToBase64(str) {
|
|
53
|
+
if (str == null || str === '') return '';
|
|
54
|
+
const input = String(str);
|
|
55
|
+
if (typeof TextEncoder !== 'undefined' && typeof btoa !== 'undefined') {
|
|
56
|
+
const bytes = new TextEncoder().encode(input);
|
|
57
|
+
let binary = '';
|
|
58
|
+
const len = bytes.length;
|
|
59
|
+
for (let i = 0; i < len; i++) {
|
|
60
|
+
binary += String.fromCharCode(bytes[i]);
|
|
61
|
+
}
|
|
62
|
+
return btoa(binary);
|
|
63
|
+
}
|
|
64
|
+
if (typeof Buffer !== 'undefined') {
|
|
65
|
+
return Buffer.from(input, 'utf-8').toString('base64');
|
|
66
|
+
}
|
|
67
|
+
return '';
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Decodes a Base64 string back into a UTF-8 string (browser & Node compatible, Unicode-safe).
|
|
72
|
+
*
|
|
73
|
+
* @param {string} b64 - Base64 string
|
|
74
|
+
* @returns {string} Decoded UTF-8 string
|
|
75
|
+
*/
|
|
76
|
+
export function base64ToUtf8(b64) {
|
|
77
|
+
if (b64 == null || b64 === '') return '';
|
|
78
|
+
try {
|
|
79
|
+
const trimmed = String(b64).trim();
|
|
80
|
+
if (typeof atob !== 'undefined' && typeof TextDecoder !== 'undefined') {
|
|
81
|
+
const binary = atob(trimmed);
|
|
82
|
+
const bytes = new Uint8Array(binary.length);
|
|
83
|
+
for (let i = 0; i < binary.length; i++) {
|
|
84
|
+
bytes[i] = binary.charCodeAt(i);
|
|
85
|
+
}
|
|
86
|
+
return new TextDecoder().decode(bytes);
|
|
87
|
+
}
|
|
88
|
+
if (typeof Buffer !== 'undefined') {
|
|
89
|
+
return Buffer.from(trimmed, 'base64').toString('utf-8');
|
|
90
|
+
}
|
|
91
|
+
} catch {
|
|
92
|
+
return b64;
|
|
93
|
+
}
|
|
94
|
+
return b64;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Performs byte-level XOR with a repeating key.
|
|
99
|
+
*
|
|
100
|
+
* @param {Uint8Array} bytes - Input bytes
|
|
101
|
+
* @param {string} keyStr - Key string
|
|
102
|
+
* @returns {Uint8Array} XOR transformed bytes
|
|
103
|
+
*/
|
|
104
|
+
export function xorBytes(bytes, keyStr) {
|
|
105
|
+
const key = String(keyStr || 'ln-ashlar');
|
|
106
|
+
let keyBytes;
|
|
107
|
+
if (typeof TextEncoder !== 'undefined') {
|
|
108
|
+
keyBytes = new TextEncoder().encode(key);
|
|
109
|
+
} else if (typeof Buffer !== 'undefined') {
|
|
110
|
+
keyBytes = Buffer.from(key, 'utf-8');
|
|
111
|
+
} else {
|
|
112
|
+
keyBytes = [108, 110];
|
|
113
|
+
}
|
|
114
|
+
const keyLen = keyBytes.length || 1;
|
|
115
|
+
const out = new Uint8Array(bytes.length);
|
|
116
|
+
for (let i = 0; i < bytes.length; i++) {
|
|
117
|
+
out[i] = bytes[i] ^ keyBytes[i % keyLen];
|
|
118
|
+
}
|
|
119
|
+
return out;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Obfuscates UTF-8 text with an XOR cipher and returns Base64 ASCII text.
|
|
124
|
+
*
|
|
125
|
+
* @param {string} text - Input text (any script / unicode)
|
|
126
|
+
* @param {string} [key='ln-ashlar'] - Secret key
|
|
127
|
+
* @returns {string} Base64 encoded XOR payload
|
|
128
|
+
*/
|
|
129
|
+
export function xorObfuscate(text, key = 'ln-ashlar') {
|
|
130
|
+
if (text == null || text === '') return '';
|
|
131
|
+
const input = String(text);
|
|
132
|
+
let bytes;
|
|
133
|
+
if (typeof TextEncoder !== 'undefined') {
|
|
134
|
+
bytes = new TextEncoder().encode(input);
|
|
135
|
+
} else if (typeof Buffer !== 'undefined') {
|
|
136
|
+
bytes = Buffer.from(input, 'utf-8');
|
|
137
|
+
} else {
|
|
138
|
+
return '';
|
|
139
|
+
}
|
|
140
|
+
const xored = xorBytes(bytes, key);
|
|
141
|
+
let binary = '';
|
|
142
|
+
for (let i = 0; i < xored.length; i++) {
|
|
143
|
+
binary += String.fromCharCode(xored[i]);
|
|
144
|
+
}
|
|
145
|
+
if (typeof btoa !== 'undefined') {
|
|
146
|
+
return btoa(binary);
|
|
147
|
+
}
|
|
148
|
+
if (typeof Buffer !== 'undefined') {
|
|
149
|
+
return Buffer.from(xored).toString('base64');
|
|
150
|
+
}
|
|
151
|
+
return '';
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* Deobfuscates Base64 ASCII XOR payload back into UTF-8 text.
|
|
156
|
+
*
|
|
157
|
+
* @param {string} b64 - Base64 encoded XOR payload
|
|
158
|
+
* @param {string} [key='ln-ashlar'] - Secret key used during obfuscation
|
|
159
|
+
* @returns {string} Plain UTF-8 text
|
|
160
|
+
*/
|
|
161
|
+
export function xorDeobfuscate(b64, key = 'ln-ashlar') {
|
|
162
|
+
if (b64 == null || b64 === '') return '';
|
|
163
|
+
try {
|
|
164
|
+
const trimmed = String(b64).trim();
|
|
165
|
+
let binary = '';
|
|
166
|
+
if (typeof atob !== 'undefined') {
|
|
167
|
+
binary = atob(trimmed);
|
|
168
|
+
} else if (typeof Buffer !== 'undefined') {
|
|
169
|
+
binary = Buffer.from(trimmed, 'base64').toString('binary');
|
|
170
|
+
} else {
|
|
171
|
+
return b64;
|
|
172
|
+
}
|
|
173
|
+
const bytes = new Uint8Array(binary.length);
|
|
174
|
+
for (let i = 0; i < binary.length; i++) {
|
|
175
|
+
bytes[i] = binary.charCodeAt(i);
|
|
176
|
+
}
|
|
177
|
+
const xored = xorBytes(bytes, key);
|
|
178
|
+
if (typeof TextDecoder !== 'undefined') {
|
|
179
|
+
return new TextDecoder().decode(xored);
|
|
180
|
+
}
|
|
181
|
+
if (typeof Buffer !== 'undefined') {
|
|
182
|
+
return Buffer.from(xored).toString('utf-8');
|
|
183
|
+
}
|
|
184
|
+
} catch {
|
|
185
|
+
return b64;
|
|
186
|
+
}
|
|
187
|
+
return b64;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* Parses options argument for obfuscate / deobfuscate.
|
|
192
|
+
* @private
|
|
193
|
+
*/
|
|
194
|
+
function _parseOptions(options) {
|
|
195
|
+
if (typeof options === 'number' || (typeof options === 'string' && /^-?\d+$/.test(String(options).trim()))) {
|
|
196
|
+
return { codec: 'rot', shift: Number(options) || 13, key: 'ln-ashlar' };
|
|
197
|
+
}
|
|
198
|
+
if (options && typeof options === 'object') {
|
|
199
|
+
const rawCodec = (options.codec || (options.key ? 'xor' : 'rot')).toLowerCase().trim();
|
|
200
|
+
const codec = (rawCodec === 'xor' || rawCodec === 'base64') ? rawCodec : 'rot';
|
|
201
|
+
const shift = Number(options.shift) || 13;
|
|
202
|
+
const key = options.key || 'ln-ashlar';
|
|
203
|
+
return { codec, shift, key };
|
|
204
|
+
}
|
|
205
|
+
return { codec: 'rot', shift: 13, key: 'ln-ashlar' };
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* Obfuscates a string with the configured codec ('rot', 'base64', or 'xor').
|
|
210
|
+
*
|
|
211
|
+
* @param {string} text - Input text
|
|
212
|
+
* @param {number|object} [options=13] - Shift offset (number) or options object `{ codec, shift, key }`
|
|
213
|
+
* @returns {string} Obfuscated string
|
|
214
|
+
*/
|
|
215
|
+
export function obfuscate(text, options = 13) {
|
|
216
|
+
if (text == null) return '';
|
|
217
|
+
if (typeof text !== 'string') text = String(text);
|
|
218
|
+
if (text.length === 0) return '';
|
|
219
|
+
|
|
220
|
+
const opts = _parseOptions(options);
|
|
221
|
+
if (opts.codec === 'base64') {
|
|
222
|
+
return utf8ToBase64(text);
|
|
223
|
+
}
|
|
224
|
+
if (opts.codec === 'xor') {
|
|
225
|
+
return xorObfuscate(text, opts.key);
|
|
226
|
+
}
|
|
227
|
+
return text.replace(/[a-zA-Z0-9]/g, (c) => rotChar(c, opts.shift));
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
* Deobfuscates a string by reversing the configured codec ('rot', 'base64', or 'xor').
|
|
232
|
+
*
|
|
233
|
+
* @param {string} text - Obfuscated text
|
|
234
|
+
* @param {number|object} [options=13] - Original shift offset (number) or options object `{ codec, shift, key }`
|
|
235
|
+
* @returns {string} Plain text
|
|
236
|
+
*/
|
|
237
|
+
export function deobfuscate(text, options = 13) {
|
|
238
|
+
if (text == null) return '';
|
|
239
|
+
if (typeof text !== 'string') text = String(text);
|
|
240
|
+
if (text.length === 0) return '';
|
|
241
|
+
|
|
242
|
+
const opts = _parseOptions(options);
|
|
243
|
+
if (opts.codec === 'base64') {
|
|
244
|
+
return base64ToUtf8(text);
|
|
245
|
+
}
|
|
246
|
+
if (opts.codec === 'xor') {
|
|
247
|
+
return xorDeobfuscate(text, opts.key);
|
|
248
|
+
}
|
|
249
|
+
return text.replace(/[a-zA-Z0-9]/g, (c) => rotChar(c, -opts.shift));
|
|
250
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
(function(){"use strict";function D(){return typeof window>"u"?!1:window.lnDebug===!0||window.lnCore&&window.lnCore._debugSink?!0:typeof document<"u"&&document.body?document.body.hasAttribute("data-ln-debug")||document.body.querySelector("[data-ln-debug]")!==null:!1}function m(e){if(typeof window>"u")return!1;if(window.lnDebug===!0)return!0;if(window.lnCore&&window.lnCore._debugIsContained)return e?window.lnCore._debugIsContained(e):window.lnCore._debugSink!==null;if(e&&e.closest){const t=e.closest("[data-ln-debug]");return!(!t||typeof document<"u"&&t===document.documentElement)}return typeof document<"u"&&document.body?document.body.hasAttribute("data-ln-debug"):!1}if(typeof window<"u"&&(window.lnCore=window.lnCore||{},!window.lnCore._warnBound)){window.lnCore._warnBound=!0;const e=console.warn;console.warn=function(...t){if(typeof t[0]=="string"&&(t[0].startsWith("[ln-")||t[0].startsWith("[lnCore"))){let r=null;for(let o=1;o<t.length;o++)if(t[o]&&t[o].nodeType===1){r=t[o];break}if(!m(r))return}e.apply(console,t)}}function $(e,t,n){const r=n||{};window.lnCore._debugSink&&window.lnCore._debugSink("event",t,e,r),e.dispatchEvent(new CustomEvent(t,{bubbles:!0,detail:r}))}function C(e,t){if(!document.body){document.addEventListener("DOMContentLoaded",function(){C(e,t)}),console.warn("["+t+'] Script loaded before <body> — add "defer" to your <script> tag');return}e()}const F={};function V(e,t){F[e]=t}function H(e){return F[e]||{ingress:t=>t,egress:t=>t}}typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore.registerDataMapper=V,window.lnCore.getDataMapper=H);function U(){typeof window>"u"||(window.lnCore=window.lnCore||{},!window.lnCore._localeObserverBound&&(window.lnCore._localeObserverBound=!0,C(function(){new MutationObserver(function(){$(document,"ln-core:locale-change",{})}).observe(document.documentElement,{attributes:!0,attributeFilter:["lang"],subtree:!0})},"ln-core")))}const T={};function Q(e,t){if(!e||typeof t!="object")return;const n=e.toLowerCase().split("-")[0];T[n]=t}function J(e){if(!e)return null;const t=e.toLowerCase().split("-")[0];return T[t]||null}typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore.registerLocaleFallback=Q,window.lnCore.getLocaleFallback=J,window.lnCore.ensureLocaleObserver=U);const A={};function K(e,t){A[e]||(A[e]=document.querySelector('[data-ln-template="'+e+'"]'));const n=A[e];return n?n.content.cloneNode(!0):(console.warn("["+(t||"ln-core")+'] Template "'+e+'" not found'),null)}function I(e,t){if(!e||!t)return e;const n=e.querySelectorAll("[data-ln-field]");for(let l=0;l<n.length;l++){const a=n[l],s=a.getAttribute("data-ln-field");t[s]!=null&&(a.textContent=t[s])}const r=e.querySelectorAll("[data-ln-attr]");for(let l=0;l<r.length;l++){const a=r[l],s=a.getAttribute("data-ln-attr").split(",");for(let c=0;c<s.length;c++){const d=s[c].trim().split(":");if(d.length!==2)continue;const u=d[0].trim(),f=d[1].trim();t[f]!=null&&a.setAttribute(u,t[f])}}const o=e.querySelectorAll("[data-ln-show]");for(let l=0;l<o.length;l++){const a=o[l],s=a.getAttribute("data-ln-show");s in t&&a.classList.toggle("hidden",!t[s])}const i=e.querySelectorAll("[data-ln-class]");for(let l=0;l<i.length;l++){const a=i[l],s=a.getAttribute("data-ln-class").split(",");for(let c=0;c<s.length;c++){const d=s[c].trim().split(":");if(d.length!==2)continue;const u=d[0].trim(),f=d[1].trim();f in t&&a.classList.toggle(u,!!t[f])}}return e}function P(e,t){e.matches&&e.matches("[data-ln-form], [data-ln-fillable]")&&(window.lnCore._debugSink&&window.lnCore._debugSink("event","ln-fill",e,t??null),e.dispatchEvent(new CustomEvent("ln-fill",{detail:t??null,bubbles:!0})));const n=e.querySelectorAll("[data-ln-form], [data-ln-fillable]");for(let r=0;r<n.length;r++)window.lnCore._debugSink&&window.lnCore._debugSink("event","ln-fill",n[r],t??null),n[r].dispatchEvent(new CustomEvent("ln-fill",{detail:t??null,bubbles:!0}));return e}typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore._fillBound||(window.lnCore._fillBound=!0,document.addEventListener("ln-fill",function(e){if(!(!e.target.matches||!e.target.matches("[data-ln-fillable]")))if(e.detail)I(e.target,e.detail);else{const t=e.target.querySelectorAll("[data-ln-field]");for(let n=0;n<t.length;n++)t[n].textContent=""}})));function q(e,t){if(!e||!t)return e;const n=document.createTreeWalker(e,NodeFilter.SHOW_TEXT);for(;n.nextNode();){const i=n.currentNode;i.textContent.indexOf("{{")!==-1&&(i.textContent=i.textContent.replace(/\{\{\s*(\w+)\s*\}\}/g,function(l,a){return t[a]!==void 0?t[a]:""}))}const r=function(i,l){return t[l]!==void 0?t[l]:""},o=Array.from(e.querySelectorAll("*"));e.nodeType===1&&o.push(e);for(let i=0;i<o.length;i++){const l=o[i],a=l.attributes;for(let s=0;s<a.length;s++){const c=a[s];c.value.indexOf("{{")!==-1&&l.setAttribute(c.name,c.value.replace(/\{\{\s*(\w+)\s*\}\}/g,r))}}return e}function G(e,t,n,r,o,i){const l={};for(let s=0;s<e.children.length;s++){const c=e.children[s],d=c.getAttribute("data-ln-render-key");d&&(l[d]=c)}const a=document.createDocumentFragment();for(let s=0;s<t.length;s++){const c=t[s],d=String(r(c));let u=l[d];if(u)o(u,c,s);else{const f=K(n,i);if(!f||(q(f,c),u=f.firstElementChild,!u))continue;u.setAttribute("data-ln-render-key",d),o(u,c,s)}a.appendChild(u)}e.textContent="",e.appendChild(a)}typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore.fillTemplate=q,window.lnCore.fill=I,window.lnCore.lnFill=P,window.lnCore.renderList=G);function b(e,t,n){const r=e.getAttribute(t);return r===null?n:r}function X(e,t,n){const r=parseInt(e.getAttribute(t),10);return isNaN(r)?n:r}function z(e,t,n=!1){const r=e.getAttribute(t);if(r===null)return!!n;const o=r.trim().toLowerCase();return!(o==="false"||o==="0")}function Y(e,t){return(e.getAttribute(t)||"").split(",").map(n=>n.trim()).filter(Boolean)}const _=new Map;function Z(e,t){const n=(e?e.join("|"):"")+"::"+t;if(_.has(n))return _.get(n);const r=new Set(e||[]),o=function(i,l){const a=i.getAttribute(l);return a!==null&&r.has(a)?a:t};return _.set(n,o),o}function ee(e,t,n){const r=parseFloat(e.getAttribute(t));return isNaN(r)?n:r}function te(e,t,n){const r=e.getAttribute(t);if(!r)return n;try{return JSON.parse(r)}catch{return n}}function N(e,t,n,r,o){if(!e||t===null)return!0;const i=r||"ln-component",l=e.type;if(l==="trigger"||l==="marker"||l==="string"||l==="list"||!l||t===""&&e.fallback!==void 0)return!0;const a=s=>{o?console.warn(s,o):console.warn(s)};if(l==="boolean"){const s=t.trim().toLowerCase();return s!==""&&s!=="true"&&s!=="false"&&s!=="1"&&s!=="0"?(a(`[${i}] Invalid value "${t}" for boolean attribute "${n}". Allowed: "true", "false", or presence-only.`),!1):!0}if(l==="enum"){const s=e.values||[];return s.includes(t)?!0:(a(`[${i}] Invalid value "${t}" for attribute "${n}". Allowed: ${s.join(", ")}. Fallback: "${e.fallback}".`),!1)}if(l==="integer"){if(!/^-?\d+$/.test(t))return a(`[${i}] Invalid integer "${t}" for attribute "${n}". Fallback: ${e.fallback}.`),!1;const s=parseInt(t,10);return e.min!==void 0&&s<e.min?(a(`[${i}] Value ${s} for attribute "${n}" is less than min (${e.min}).`),!1):e.max!==void 0&&s>e.max?(a(`[${i}] Value ${s} for attribute "${n}" is greater than max (${e.max}).`),!1):!0}if(l==="float")return isNaN(Number(t))?(a(`[${i}] Invalid float "${t}" for attribute "${n}". Fallback: ${e.fallback}.`),!1):!0;if(l==="json")try{return JSON.parse(t),!0}catch(s){return a(`[${i}] Invalid JSON for attribute "${n}": ${s.message}. Fallback: ${e.fallback}.`),!1}return!0}function ne(e,t,n){for(const r in n){const[o,i,l]=n[r];Object.defineProperty(e,r,{get:function(){return o(t,i,l)},enumerable:!0,configurable:!0})}return e}function re(e){const t={};for(const n in e){const r=e[n];if(!r||!r.prop)continue;let o=r.read;if(!o&&r.type)switch(r.type){case"enum":o=Z(r.values,r.fallback);break;case"integer":o=X;break;case"float":o=ee;break;case"boolean":o=z;break;case"list":o=Y;break;case"json":o=te;break;case"string":default:o=b;break}o||(o=b),t[r.prop]=[o,n,r.fallback]}return t}function oe(e){const t={};for(const n in e){const r=e[n];r&&r.effect&&(t[n]=r.effect)}return Object.keys(t).length?t:null}function ie(e){if(e.onAttrChange&&!e.declared)return null;const t=new Set;if(e.effects)for(const n in e.effects)t.add(n);if(e.onAttrChange&&e.declared)for(const n of e.declared)t.add(n);return t}function v(e,t,n,r){if(e.nodeType!==1)return;const i=t.indexOf("[")!==-1||t.indexOf(".")!==-1||t.indexOf("#")!==-1?t:"["+t+"]",l=Array.from(e.querySelectorAll(i));e.matches&&e.matches(i)&&l.push(e);for(const a of l)if(!a[n]){window.lnCore._persistSink&&a.hasAttribute("data-ln-persist")&&window.lnCore._persistSink(a,t);try{a[n]=new r(a)}catch(s){console.error("["+n+"] init failed",a,s)}}}typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore._bootHolds=window.lnCore._bootHolds||0,window.lnCore._bootQueue=window.lnCore._bootQueue||[]);function le(){return typeof window<"u"&&window.lnCore&&window.lnCore._bootHolds||0}function se(e){typeof window<"u"?(window.lnCore=window.lnCore||{},window.lnCore._bootHolds=window.lnCore._bootHolds||0,window.lnCore._bootQueue=window.lnCore._bootQueue||[],window.lnCore._bootHolds>0?window.lnCore._bootQueue.push(e):setTimeout(e,0)):e()}function R(){window.lnCore=window.lnCore||{};const e=window.lnCore._attrRegistry=window.lnCore._attrRegistry||{byAttr:new Map,reactive:[],persist:[]};return e.byReactive=e.byReactive||new Map,e.reactiveWildcard=e.reactiveWildcard||[],e}function ae(e){const t=R(),n=e.observed||[];for(let r=0;r<n.length;r++){const o=n[r];t.byAttr.has(o)||t.byAttr.set(o,[]),t.byAttr.get(o).push(e)}if(t.byDeclaredAttr=t.byDeclaredAttr||new Map,e.attributes)for(const r in e.attributes){t.byDeclaredAttr.has(r)||t.byDeclaredAttr.set(r,[]);const o=t.byDeclaredAttr.get(r);o.some(i=>i.componentTag===e.componentTag)||o.push({spec:e.attributes[r],componentTag:e.componentTag})}if(e.onAttrChange||e.effects){t.reactive.push(e);const r=ie(e);if(r===null)t.reactiveWildcard.push(e);else for(const o of r)t.byReactive.has(o)||t.byReactive.set(o,[]),t.byReactive.get(o).push(e)}e.persist&&t.persist.push(e)}function M(e,t,n,r){for(let o=0;o<e.length;o++){const i=e[o];if(!t[i.attribute])continue;const l=i.effects&&i.effects[n];l?l(t,n,r):i.onAttrChange&&(!i.declared||i.declared.has(n))&&i.onAttrChange(t,n,r)}}function ce(e){const t=e.target,n=e.attributeName;if(e.oldValue===t.getAttribute(n))return;const r=R(),o=r.byAttr.get(n);if(D()&&r.byDeclaredAttr&&r.byDeclaredAttr.has(n)&&m(t)){const i=r.byDeclaredAttr.get(n),l=t.getAttribute(n);for(let a=0;a<i.length;a++)N(i[a].spec,l,n,i[a].componentTag,t)}if(window.lnCore._debugSink&&(n.indexOf("data-ln-")===0||o)&&window.lnCore._debugSink("attr",n,t,{oldValue:e.oldValue,newValue:t.getAttribute(n)}),n.indexOf("data-ln-")===0){const i=r.byReactive.get(n);i&&M(i,t,n,e.oldValue),r.reactiveWildcard.length&&M(r.reactiveWildcard,t,n,e.oldValue)}if(o)for(let i=0;i<o.length;i++){const l=o[i];if(l.handler){l.handler(t,n,e.oldValue);continue}l.onAttributeChange&&t[l.attribute]?l.onAttributeChange(t,n):(v(t,l.selector,l.attribute,l.ComponentFn),l.onInit&&l.onInit(t))}}function ue(){window.lnCore=window.lnCore||{},!window.lnCore._attrObserverBound&&(window.lnCore._attrObserverBound=!0,C(function(){new MutationObserver(function(t){for(let n=0;n<t.length;n++)try{ce(t[n])}catch(r){console.error("[ln-core] mutation handler failed",t[n].target,r)}}).observe(document.body,{attributes:!0,subtree:!0,attributeOldValue:!0})},"ln-core"))}function B(){return window.lnCore=window.lnCore||{},window.lnCore._lifecycleRegistry=window.lnCore._lifecycleRegistry||[]}function de(e){const t=B();if(t.length){if(e.target)for(let n=0;n<t.length;n++){const r=t[n];if(r.onSubtreeChange){const o=r.query,i=e.target.nodeType===1?e.target.matches(o)?e.target:e.target.closest(o):e.target.parentElement?e.target.parentElement.closest(o):null;i&&r.onSubtreeChange(i,e)}}for(let n=0;n<e.addedNodes.length;n++){const r=e.addedNodes[n];if(r.nodeType===1)for(let o=0;o<t.length;o++){const i=t[o];v(r,i.selector,i.attribute,i.ComponentFn),i.onInit&&i.onInit(r)}}for(let n=0;n<e.removedNodes.length;n++){const r=e.removedNodes[n];if(r.nodeType===1)for(let o=0;o<t.length;o++){const i=t[o],l=i.query,a=Array.from(r.querySelectorAll(l));r.matches&&r.matches(l)&&a.push(r);for(let s=0;s<a.length;s++){const c=a[s];if(!document.contains(c)){const d=c[i.attribute];if(d&&typeof d.destroy=="function")try{d.destroy()}catch(u){console.error("["+i.attribute+"] destroy failed",c,u)}delete c[i.attribute]}}}}}}function fe(){window.lnCore=window.lnCore||{},!window.lnCore._lifecycleObserverBound&&(window.lnCore._lifecycleObserverBound=!0,C(function(){new MutationObserver(function(t){for(let n=0;n<t.length;n++){const r=t[n];if(r.type==="childList")try{de(r)}catch(o){console.error("[ln-core] lifecycle handler failed",r.target,o)}}}).observe(document.body,{childList:!0,subtree:!0})},"ln-core"))}function we(e,t,n,r,o={}){const i=o.extraAttributes||[],l=o.onAttributeChange||null,a=o.onSubtreeChange||null,s=o.onInit||null,c=o.onAttrChange||null,d=o.effects||null,u=o.attributes||null,f=u?oe(u):d,h=u?new Set(Object.keys(u)):null,p=o.persist||null;function y(O){const w=O||document.body;if(v(w,e,t,n),u&&D())for(const g in u){const ve=u[g],x=Array.from(w.querySelectorAll("["+g+"]"));w.matches&&w.matches("["+g+"]")&&x.push(w);for(let E=0;E<x.length;E++){const L=x[E];m(L)&&N(ve,L.getAttribute(g),g,r,L)}}s&&s(w)}const k=[];if(e.indexOf("[")!==-1){const O=/\[([\w-]+)/g;let w;for(;(w=O.exec(e))!==null;)k.push(w[1])}else k.push(e);ae({selector:e,attribute:t,componentTag:r,attributes:u,ComponentFn:n,onInit:s,observed:k.concat(i),onAttributeChange:l,onAttrChange:c,effects:f,declared:h,persist:p}),ue();const _e=e.indexOf("[")!==-1||e.indexOf(".")!==-1||e.indexOf("#")!==-1?e:"["+e+"]";B().push({selector:e,attribute:t,ComponentFn:n,onInit:s,onSubtreeChange:a,query:_e}),fe(),window[t]=y;function W(){le()>0?se(function(){y(document.body)}):y(document.body)}return document.readyState==="loading"?document.addEventListener("DOMContentLoaded",W):W(),y}function j(e){return(e||"").replace(/^#/,"")}function S(e){const t=e===void 0?location.hash:e,n={},r=j(t);if(!r)return n;const o=r.split("&");for(let i=0;i<o.length;i++){const l=o[i];if(!l)continue;const a=l.indexOf(":"),s=a>-1?l.slice(0,a):l,c=a>-1?l.slice(a+1):"";if(s)try{n[s]=decodeURIComponent(c)}catch{n[s]=c}}return n}function be(e){if(!e)return null;const t=S();return e in t?t[e]:null}function he(e,t){if(!e)return;const n=S();t==null?delete n[e]:n[e]=String(t);const o=Object.keys(n).map(function(i){const l=n[i];return l===""?i:i+":"+encodeURIComponent(l)}).join("&");j(location.hash)!==o&&(location.hash=o)}function pe(e){return e.button===1||e.ctrlKey||e.metaKey||e.shiftKey?!1:(e.preventDefault(),!0)}function ge(e,t){if(!e||!e.hasAttribute("data-ln-hash"))return null;const n=e.getAttribute("data-ln-hash");if(n&&n.trim()!=="")return n.trim();const r=e.getAttribute("data-ln-sort")||e.getAttribute("data-ln-search-for")||e.getAttribute("data-ln-search")||e.getAttribute("data-ln-filter")||e.id;return r?t?r+"-"+t:r:t||null}function Ce(e,t){return!t||t==="none"||e===null||e===void 0?null:String(e)+"."+t}function ye(e){return!e||typeof e!="string"?null:e.endsWith(".asc")?{fieldOrColumn:e.slice(0,-4),direction:"asc"}:e.endsWith(".desc")?{fieldOrColumn:e.slice(0,-5),direction:"desc"}:null}function me(e,t){return!e||!Array.isArray(t)||t.length===0?null:e+":"+t.map(encodeURIComponent).join(",")}function Ae(e){if(!e||typeof e!="string")return null;const t=e.indexOf(":");if(t===-1)return null;const n=e.slice(0,t),r=e.slice(t+1),o=r?r.split(",").map(function(i){try{return decodeURIComponent(i)}catch{return i}}).filter(Boolean):[];return{key:n,values:o}}typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore.hashParse=S,window.lnCore.hashGet=be,window.lnCore.hashSet=he,window.lnCore.hashLinkClick=pe,window.lnCore.resolveHashNamespace=ge,window.lnCore.hashSortEncode=Ce,window.lnCore.hashSortDecode=ye,window.lnCore.hashFilterEncode=me,window.lnCore.hashFilterDecode=Ae),(function(){const e="data-ln-options",t="lnOptions";if(window[t]!==void 0)return;const n={"data-ln-options":{prop:"_storeName",type:"string",read:b,fallback:"",description:"Store or coordinator addressing to populate options from"},"data-ln-options-value":{prop:"_valueField",type:"string",read:b,fallback:"id",description:"Field name used for option value attribute"},"data-ln-options-label":{prop:"_labelField",type:"string",read:b,fallback:"name",description:"Field name used for option visible label text"}},r=re(n);function o(i){this.dom=i,ne(this,i,r);const l=this;return this._onSetData=function(a){a.detail&&l._rebuild(a.detail.data||[])},i.addEventListener("ln-options:set-data",this._onSetData),$(i,"ln-options:request-data",{options:this._storeName}),this}o.prototype._rebuild=function(i){const l=this.dom,a=this._valueField,s=this._labelField,c=l.value,d=l.querySelectorAll("option");for(let f=d.length-1;f>=0;f--)d[f].value!==""&&l.removeChild(d[f]);for(let f=0;f<i.length;f++){const h=i[f],p=document.createElement("option");p.value=String(h[a]),p.textContent=h[s]!=null?h[s]:"",l.appendChild(p)}const u=l.options;for(let f=0;f<u.length;f++)if(u[f].value===c){l.value=c;break}},o.prototype.destroy=function(){this.dom[t]&&(this.dom.removeEventListener("ln-options:set-data",this._onSetData),delete this.dom[t])},we(e,t,o,"ln-options",{attributes:n})})()})();
|
|
1
|
+
(function(){"use strict";function L(){return typeof window>"u"?!1:window.lnDebug===!0||window.lnCore&&window.lnCore._debugSink?!0:typeof document<"u"&&document.body?document.body.hasAttribute("data-ln-debug")||document.body.querySelector("[data-ln-debug]")!==null:!1}function m(e){if(typeof window>"u")return!1;if(window.lnDebug===!0)return!0;if(window.lnCore&&window.lnCore._debugIsContained)return e?window.lnCore._debugIsContained(e):window.lnCore._debugSink!==null;if(e&&e.closest){const t=e.closest("[data-ln-debug]");return!(!t||typeof document<"u"&&t===document.documentElement)}return typeof document<"u"&&document.body?document.body.hasAttribute("data-ln-debug"):!1}if(typeof window<"u"&&(window.lnCore=window.lnCore||{},!window.lnCore._warnBound)){window.lnCore._warnBound=!0;const e=console.warn;console.warn=function(...t){if(typeof t[0]=="string"&&(t[0].startsWith("[ln-")||t[0].startsWith("[lnCore"))){let r=null;for(let o=1;o<t.length;o++)if(t[o]&&t[o].nodeType===1){r=t[o];break}if(!m(r))return}e.apply(console,t)}}function $(e,t,n){const r=n||{};window.lnCore._debugSink&&window.lnCore._debugSink("event",t,e,r),e.dispatchEvent(new CustomEvent(t,{bubbles:!0,detail:r}))}function C(e,t){if(!document.body){document.addEventListener("DOMContentLoaded",function(){C(e,t)}),console.warn("["+t+'] Script loaded before <body> — add "defer" to your <script> tag');return}e()}const F={};function V(e,t){F[e]=t}function U(e){return F[e]||{ingress:t=>t,egress:t=>t}}typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore.registerDataMapper=V,window.lnCore.getDataMapper=U);function H(){typeof window>"u"||(window.lnCore=window.lnCore||{},!window.lnCore._localeObserverBound&&(window.lnCore._localeObserverBound=!0,C(function(){new MutationObserver(function(){$(document,"ln-core:locale-change",{})}).observe(document.documentElement,{attributes:!0,attributeFilter:["lang"],subtree:!0})},"ln-core")))}const T={};function Q(e,t){if(!e||typeof t!="object")return;const n=e.toLowerCase().split("-")[0];T[n]=t}function J(e){if(!e)return null;const t=e.toLowerCase().split("-")[0];return T[t]||null}typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore.registerLocaleFallback=Q,window.lnCore.getLocaleFallback=J,window.lnCore.ensureLocaleObserver=H);const A={};function K(e,t){A[e]||(A[e]=document.querySelector('[data-ln-template="'+e+'"]'));const n=A[e];return n?n.content.cloneNode(!0):(console.warn("["+(t||"ln-core")+'] Template "'+e+'" not found'),null)}function I(e,t){if(!e||!t)return e;const n=e.querySelectorAll("[data-ln-field]");for(let l=0;l<n.length;l++){const a=n[l],s=a.getAttribute("data-ln-field");t[s]!=null&&(a.textContent=t[s])}const r=e.querySelectorAll("[data-ln-attr]");for(let l=0;l<r.length;l++){const a=r[l],s=a.getAttribute("data-ln-attr").split(",");for(let c=0;c<s.length;c++){const d=s[c].trim().split(":");if(d.length!==2)continue;const u=d[0].trim(),f=d[1].trim();t[f]!=null&&a.setAttribute(u,t[f])}}const o=e.querySelectorAll("[data-ln-show]");for(let l=0;l<o.length;l++){const a=o[l],s=a.getAttribute("data-ln-show");s in t&&a.classList.toggle("hidden",!t[s])}const i=e.querySelectorAll("[data-ln-class]");for(let l=0;l<i.length;l++){const a=i[l],s=a.getAttribute("data-ln-class").split(",");for(let c=0;c<s.length;c++){const d=s[c].trim().split(":");if(d.length!==2)continue;const u=d[0].trim(),f=d[1].trim();f in t&&a.classList.toggle(u,!!t[f])}}return e}function P(e,t){e.matches&&e.matches("[data-ln-form], [data-ln-fillable]")&&(window.lnCore._debugSink&&window.lnCore._debugSink("event","ln-fill",e,t??null),e.dispatchEvent(new CustomEvent("ln-fill",{detail:t??null,bubbles:!0})));const n=e.querySelectorAll("[data-ln-form], [data-ln-fillable]");for(let r=0;r<n.length;r++)window.lnCore._debugSink&&window.lnCore._debugSink("event","ln-fill",n[r],t??null),n[r].dispatchEvent(new CustomEvent("ln-fill",{detail:t??null,bubbles:!0}));return e}typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore._fillBound||(window.lnCore._fillBound=!0,document.addEventListener("ln-fill",function(e){if(!(!e.target.matches||!e.target.matches("[data-ln-fillable]")))if(e.detail)I(e.target,e.detail);else{const t=e.target.querySelectorAll("[data-ln-field]");for(let n=0;n<t.length;n++)t[n].textContent=""}})));function q(e,t){if(!e||!t)return e;const n=document.createTreeWalker(e,NodeFilter.SHOW_TEXT);for(;n.nextNode();){const i=n.currentNode;i.textContent.indexOf("{{")!==-1&&(i.textContent=i.textContent.replace(/\{\{\s*(\w+)\s*\}\}/g,function(l,a){return t[a]!==void 0?t[a]:""}))}const r=function(i,l){return t[l]!==void 0?t[l]:""},o=Array.from(e.querySelectorAll("*"));e.nodeType===1&&o.push(e);for(let i=0;i<o.length;i++){const l=o[i],a=l.attributes;for(let s=0;s<a.length;s++){const c=a[s];c.value.indexOf("{{")!==-1&&l.setAttribute(c.name,c.value.replace(/\{\{\s*(\w+)\s*\}\}/g,r))}}return e}function G(e,t,n,r,o,i){const l={};for(let s=0;s<e.children.length;s++){const c=e.children[s],d=c.getAttribute("data-ln-render-key");d&&(l[d]=c)}const a=document.createDocumentFragment();for(let s=0;s<t.length;s++){const c=t[s],d=String(r(c));let u=l[d];if(u)o(u,c,s);else{const f=K(n,i);if(!f||(q(f,c),u=f.firstElementChild,!u))continue;u.setAttribute("data-ln-render-key",d),o(u,c,s)}a.appendChild(u)}e.textContent="",e.appendChild(a)}typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore.fillTemplate=q,window.lnCore.fill=I,window.lnCore.lnFill=P,window.lnCore.renderList=G);function b(e,t,n){const r=e.getAttribute(t);return r===null?n:r}function X(e,t,n){const r=parseInt(e.getAttribute(t),10);return isNaN(r)?n:r}function z(e,t,n=!1){const r=e.getAttribute(t);if(r===null)return!!n;const o=r.trim().toLowerCase();return!(o==="false"||o==="0")}function Y(e,t){return(e.getAttribute(t)||"").split(",").map(n=>n.trim()).filter(Boolean)}const _=new Map;function Z(e,t){const n=(e?e.join("|"):"")+"::"+t;if(_.has(n))return _.get(n);const r=new Set(e||[]),o=function(i,l){const a=i.getAttribute(l);return a!==null&&r.has(a)?a:t};return _.set(n,o),o}function ee(e,t,n){const r=parseFloat(e.getAttribute(t));return isNaN(r)?n:r}function te(e,t,n){const r=e.getAttribute(t);if(!r)return n;try{return JSON.parse(r)}catch{return n}}function N(e,t,n,r,o){if(!e||t===null)return!0;const i=r||"ln-component",l=e.type;if(l==="trigger"||l==="marker"||l==="string"||l==="list"||!l||t===""&&e.fallback!==void 0)return!0;const a=s=>{o?console.warn(s,o):console.warn(s)};if(l==="boolean"){const s=t.trim().toLowerCase();return s!==""&&s!=="true"&&s!=="false"&&s!=="1"&&s!=="0"?(a(`[${i}] Invalid value "${t}" for boolean attribute "${n}". Allowed: "true", "false", or presence-only.`),!1):!0}if(l==="enum"){const s=e.values||[];return s.includes(t)?!0:(a(`[${i}] Invalid value "${t}" for attribute "${n}". Allowed: ${s.join(", ")}. Fallback: "${e.fallback}".`),!1)}if(l==="integer"){if(!/^-?\d+$/.test(t))return a(`[${i}] Invalid integer "${t}" for attribute "${n}". Fallback: ${e.fallback}.`),!1;const s=parseInt(t,10);return e.min!==void 0&&s<e.min?(a(`[${i}] Value ${s} for attribute "${n}" is less than min (${e.min}).`),!1):e.max!==void 0&&s>e.max?(a(`[${i}] Value ${s} for attribute "${n}" is greater than max (${e.max}).`),!1):!0}if(l==="float")return isNaN(Number(t))?(a(`[${i}] Invalid float "${t}" for attribute "${n}". Fallback: ${e.fallback}.`),!1):!0;if(l==="json")try{return JSON.parse(t),!0}catch(s){return a(`[${i}] Invalid JSON for attribute "${n}": ${s.message}. Fallback: ${e.fallback}.`),!1}return!0}function ne(e,t,n){for(const r in n){const[o,i,l]=n[r];Object.defineProperty(e,r,{get:function(){return o(t,i,l)},enumerable:!0,configurable:!0})}return e}function re(e){const t={};for(const n in e){const r=e[n];if(!r||!r.prop)continue;let o=r.read;if(!o&&r.type)switch(r.type){case"enum":o=Z(r.values,r.fallback);break;case"integer":o=X;break;case"float":o=ee;break;case"boolean":o=z;break;case"list":o=Y;break;case"json":o=te;break;case"string":default:o=b;break}o||(o=b),t[r.prop]=[o,n,r.fallback]}return t}function oe(e){const t={};for(const n in e){const r=e[n];r&&r.effect&&(t[n]=r.effect)}return Object.keys(t).length?t:null}function ie(e){if(e.onAttrChange&&!e.declared)return null;const t=new Set;if(e.effects)for(const n in e.effects)t.add(n);if(e.onAttrChange&&e.declared)for(const n of e.declared)t.add(n);return t}function v(e,t,n,r){if(e.nodeType!==1)return;const i=t.indexOf("[")!==-1||t.indexOf(".")!==-1||t.indexOf("#")!==-1?t:"["+t+"]",l=Array.from(e.querySelectorAll(i));e.matches&&e.matches(i)&&l.push(e);for(const a of l)if(!a[n]){window.lnCore._persistSink&&a.hasAttribute("data-ln-persist")&&window.lnCore._persistSink(a,t);try{a[n]=new r(a)}catch(s){console.error("["+n+"] init failed",a,s)}}}typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore._bootHolds=window.lnCore._bootHolds||0,window.lnCore._bootQueue=window.lnCore._bootQueue||[]);function le(){return typeof window<"u"&&window.lnCore&&window.lnCore._bootHolds||0}function se(e){typeof window<"u"?(window.lnCore=window.lnCore||{},window.lnCore._bootHolds=window.lnCore._bootHolds||0,window.lnCore._bootQueue=window.lnCore._bootQueue||[],window.lnCore._bootHolds>0?window.lnCore._bootQueue.push(e):setTimeout(e,0)):e()}function R(){window.lnCore=window.lnCore||{};const e=window.lnCore._attrRegistry=window.lnCore._attrRegistry||{byAttr:new Map,reactive:[],persist:[]};return e.byReactive=e.byReactive||new Map,e.reactiveWildcard=e.reactiveWildcard||[],e}function ae(e){const t=R(),n=e.observed||[];for(let r=0;r<n.length;r++){const o=n[r];t.byAttr.has(o)||t.byAttr.set(o,[]),t.byAttr.get(o).push(e)}if(t.byDeclaredAttr=t.byDeclaredAttr||new Map,e.attributes)for(const r in e.attributes){t.byDeclaredAttr.has(r)||t.byDeclaredAttr.set(r,[]);const o=t.byDeclaredAttr.get(r);o.some(i=>i.componentTag===e.componentTag)||o.push({spec:e.attributes[r],componentTag:e.componentTag})}if(e.onAttrChange||e.effects){t.reactive.push(e);const r=ie(e);if(r===null)t.reactiveWildcard.push(e);else for(const o of r)t.byReactive.has(o)||t.byReactive.set(o,[]),t.byReactive.get(o).push(e)}e.persist&&t.persist.push(e)}function M(e,t,n,r){for(let o=0;o<e.length;o++){const i=e[o];if(!t[i.attribute])continue;const l=i.effects&&i.effects[n];l?l(t,n,r):i.onAttrChange&&(!i.declared||i.declared.has(n))&&i.onAttrChange(t,n,r)}}function ce(e){const t=e.target,n=e.attributeName;if(e.oldValue===t.getAttribute(n))return;const r=R(),o=r.byAttr.get(n);if(L()&&r.byDeclaredAttr&&r.byDeclaredAttr.has(n)&&m(t)){const i=r.byDeclaredAttr.get(n),l=t.getAttribute(n);for(let a=0;a<i.length;a++)N(i[a].spec,l,n,i[a].componentTag,t)}if(window.lnCore._debugSink&&(n.indexOf("data-ln-")===0||o)&&window.lnCore._debugSink("attr",n,t,{oldValue:e.oldValue,newValue:t.getAttribute(n)}),n.indexOf("data-ln-")===0){const i=r.byReactive.get(n);i&&M(i,t,n,e.oldValue),r.reactiveWildcard.length&&M(r.reactiveWildcard,t,n,e.oldValue)}if(o)for(let i=0;i<o.length;i++){const l=o[i];if(l.handler){l.handler(t,n,e.oldValue);continue}l.onAttributeChange&&t[l.attribute]?l.onAttributeChange(t,n):(v(t,l.selector,l.attribute,l.ComponentFn),l.onInit&&l.onInit(t))}}function ue(){window.lnCore=window.lnCore||{},!window.lnCore._attrObserverBound&&(window.lnCore._attrObserverBound=!0,C(function(){new MutationObserver(function(t){for(let n=0;n<t.length;n++)try{ce(t[n])}catch(r){console.error("[ln-core] mutation handler failed",t[n].target,r)}}).observe(document.body,{attributes:!0,subtree:!0,attributeOldValue:!0})},"ln-core"))}function B(){return window.lnCore=window.lnCore||{},window.lnCore._lifecycleRegistry=window.lnCore._lifecycleRegistry||[]}function de(e){const t=B();if(t.length){if(e.target)for(let n=0;n<t.length;n++){const r=t[n];if(r.onSubtreeChange){const o=r.query,i=e.target.nodeType===1?e.target.matches(o)?e.target:e.target.closest(o):e.target.parentElement?e.target.parentElement.closest(o):null;i&&r.onSubtreeChange(i,e)}}for(let n=0;n<e.addedNodes.length;n++){const r=e.addedNodes[n];if(r.nodeType===1)for(let o=0;o<t.length;o++){const i=t[o];v(r,i.selector,i.attribute,i.ComponentFn),i.onInit&&i.onInit(r)}}for(let n=0;n<e.removedNodes.length;n++){const r=e.removedNodes[n];if(r.nodeType===1)for(let o=0;o<t.length;o++){const i=t[o],l=i.query,a=Array.from(r.querySelectorAll(l));r.matches&&r.matches(l)&&a.push(r);for(let s=0;s<a.length;s++){const c=a[s];if(!document.contains(c)){const d=c[i.attribute];if(d&&typeof d.destroy=="function")try{d.destroy()}catch(u){console.error("["+i.attribute+"] destroy failed",c,u)}delete c[i.attribute]}}}}}}function fe(){window.lnCore=window.lnCore||{},!window.lnCore._lifecycleObserverBound&&(window.lnCore._lifecycleObserverBound=!0,C(function(){new MutationObserver(function(t){for(let n=0;n<t.length;n++){const r=t[n];if(r.type==="childList")try{de(r)}catch(o){console.error("[ln-core] lifecycle handler failed",r.target,o)}}}).observe(document.body,{childList:!0,subtree:!0})},"ln-core"))}function we(e,t,n,r,o={}){const i=o.extraAttributes||[],l=o.onAttributeChange||null,a=o.onSubtreeChange||null,s=o.onInit||null,c=o.onAttrChange||null,d=o.effects||null,u=o.attributes||null,f=u?oe(u):d,p=u?new Set(Object.keys(u)):null,h=o.persist||null;function y(k){const w=k||document.body;if(v(w,e,t,n),u&&L())for(const g in u){const xe=u[g],O=Array.from(w.querySelectorAll("["+g+"]"));w.matches&&w.matches("["+g+"]")&&O.push(w);for(let E=0;E<O.length;E++){const D=O[E];m(D)&&N(xe,D.getAttribute(g),g,r,D)}}s&&s(w)}const S=[];if(e.indexOf("[")!==-1){const k=/\[([\w-]+)/g;let w;for(;(w=k.exec(e))!==null;)S.push(w[1])}else S.push(e);ae({selector:e,attribute:t,componentTag:r,attributes:u,ComponentFn:n,onInit:s,observed:S.concat(i),onAttributeChange:l,onAttrChange:c,effects:f,declared:p,persist:h}),ue();const ve=e.indexOf("[")!==-1||e.indexOf(".")!==-1||e.indexOf("#")!==-1?e:"["+e+"]";B().push({selector:e,attribute:t,ComponentFn:n,onInit:s,onSubtreeChange:a,query:ve}),fe(),window[t]=y;function W(){le()>0?se(function(){y(document.body)}):y(document.body)}return document.readyState==="loading"?document.addEventListener("DOMContentLoaded",W):W(),y}function j(e){return(e||"").replace(/^#/,"")}function x(e){const t=e===void 0?location.hash:e,n={},r=j(t);if(!r)return n;const o=r.split("&");for(let i=0;i<o.length;i++){const l=o[i];if(!l)continue;const a=l.indexOf(":"),s=a>-1?l.slice(0,a):l,c=a>-1?l.slice(a+1):"";if(s)try{n[s]=decodeURIComponent(c)}catch{n[s]=c}}return n}function be(e){if(!e)return null;const t=x();return e in t?t[e]:null}function pe(e,t){if(!e)return;const n=x();t==null?delete n[e]:n[e]=String(t);const o=Object.keys(n).map(function(i){const l=n[i];return l===""?i:i+":"+encodeURIComponent(l)}).join("&");j(location.hash)!==o&&(location.hash=o)}function he(e){return e.button===1||e.ctrlKey||e.metaKey||e.shiftKey?!1:(e.preventDefault(),!0)}function ge(e,t){if(!e||!e.hasAttribute("data-ln-hash"))return null;const n=e.getAttribute("data-ln-hash");if(n&&n.trim()!=="")return n.trim();const r=e.getAttribute("data-ln-sort")||e.getAttribute("data-ln-search-for")||e.getAttribute("data-ln-search")||e.getAttribute("data-ln-filter")||e.id;return r?t?r+"-"+t:r:t||null}function Ce(e,t){return!t||t==="none"||e===null||e===void 0?null:String(e)+"."+t}function ye(e){return!e||typeof e!="string"?null:e.endsWith(".asc")?{fieldOrColumn:e.slice(0,-4),direction:"asc"}:e.endsWith(".desc")?{fieldOrColumn:e.slice(0,-5),direction:"desc"}:null}function me(e,t){return!e||!Array.isArray(t)||t.length===0?null:e+":"+t.map(encodeURIComponent).join(",")}function Ae(e){if(!e||typeof e!="string")return null;const t=e.indexOf(":");if(t===-1)return null;const n=e.slice(0,t),r=e.slice(t+1),o=r?r.split(",").map(function(i){try{return decodeURIComponent(i)}catch{return i}}).filter(Boolean):[];return{key:n,values:o}}typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore.hashParse=x,window.lnCore.hashGet=be,window.lnCore.hashSet=pe,window.lnCore.hashLinkClick=he,window.lnCore.resolveHashNamespace=ge,window.lnCore.hashSortEncode=Ce,window.lnCore.hashSortDecode=ye,window.lnCore.hashFilterEncode=me,window.lnCore.hashFilterDecode=Ae);function _e(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,e=>{const t=Math.random()*16|0;return(e==="x"?t:t&3|8).toString(16)})}typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore.uuid=_e),(function(){const e="data-ln-options",t="lnOptions";if(window[t]!==void 0)return;const n={"data-ln-options":{prop:"_storeName",type:"string",read:b,fallback:"",description:"Store or coordinator addressing to populate options from"},"data-ln-options-value":{prop:"_valueField",type:"string",read:b,fallback:"id",description:"Field name used for option value attribute"},"data-ln-options-label":{prop:"_labelField",type:"string",read:b,fallback:"name",description:"Field name used for option visible label text"}},r=re(n);function o(i){this.dom=i,ne(this,i,r);const l=this;return this._onSetData=function(a){a.detail&&l._rebuild(a.detail.data||[])},i.addEventListener("ln-options:set-data",this._onSetData),$(i,"ln-options:request-data",{options:this._storeName}),this}o.prototype._rebuild=function(i){const l=this.dom,a=this._valueField,s=this._labelField,c=l.value,d=l.querySelectorAll("option");for(let f=d.length-1;f>=0;f--)d[f].value!==""&&l.removeChild(d[f]);for(let f=0;f<i.length;f++){const p=i[f],h=document.createElement("option");h.value=String(p[a]),h.textContent=p[s]!=null?p[s]:"",l.appendChild(h)}const u=l.options;for(let f=0;f<u.length;f++)if(u[f].value===c){l.value=c;break}},o.prototype.destroy=function(){this.dom[t]&&(this.dom.removeEventListener("ln-options:set-data",this._onSetData),delete this.dom[t])},we(e,t,o,"ln-options",{attributes:n})})()})();
|