@konomi-app/ui 5.8.0 → 5.10.3
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/index.cjs +214 -48
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +216 -50
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -703,6 +703,7 @@ updateItemStatus_fn = function(key, itemKey, status) {
|
|
|
703
703
|
var import_lit2 = require("lit");
|
|
704
704
|
var import_decorators = require("lit/decorators.js");
|
|
705
705
|
var import_keyed = require("lit/directives/keyed.js");
|
|
706
|
+
var import_repeat = require("lit/directives/repeat.js");
|
|
706
707
|
var import_unsafe_html = require("lit/directives/unsafe-html.js");
|
|
707
708
|
|
|
708
709
|
// src/styles.ts
|
|
@@ -714,8 +715,8 @@ var overlayStyles = import_lit.css`
|
|
|
714
715
|
'Yu Gothic Medium', '游ゴシック', YuGothic, 'メイリオ', 'Hiragino Kaku Gothic ProN', Meiryo,
|
|
715
716
|
sans-serif;
|
|
716
717
|
--dialog-text-color: #356;
|
|
717
|
-
--dialog-font-size:
|
|
718
|
-
--dialog-font-size-desktop:
|
|
718
|
+
--dialog-font-size: 15px;
|
|
719
|
+
--dialog-font-size-desktop: 17px;
|
|
719
720
|
--dialog-z-index: 1000;
|
|
720
721
|
--dialog-backdrop-color: rgb(255 255 255 / 0.73);
|
|
721
722
|
--dialog-backdrop-blur: 4px;
|
|
@@ -727,6 +728,7 @@ var overlayStyles = import_lit.css`
|
|
|
727
728
|
--dialog-card-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);
|
|
728
729
|
--dialog-card-radius: 4px;
|
|
729
730
|
--dialog-card-width: 400px;
|
|
731
|
+
--dialog-alert-width: 480px;
|
|
730
732
|
--dialog-card-min-height: 200px;
|
|
731
733
|
--dialog-card-padding: 24px;
|
|
732
734
|
--dialog-card-padding-desktop: 32px;
|
|
@@ -747,7 +749,7 @@ var overlayStyles = import_lit.css`
|
|
|
747
749
|
/* Button */
|
|
748
750
|
--dialog-btn-radius: 6px;
|
|
749
751
|
--dialog-btn-padding: 8px 24px;
|
|
750
|
-
--dialog-btn-font-size:
|
|
752
|
+
--dialog-btn-font-size: 15px;
|
|
751
753
|
|
|
752
754
|
/* Spinner */
|
|
753
755
|
--dialog-spinner-size: 60px;
|
|
@@ -760,14 +762,14 @@ var overlayStyles = import_lit.css`
|
|
|
760
762
|
--dialog-form-gap: 16px;
|
|
761
763
|
--dialog-form-columns: 1;
|
|
762
764
|
--dialog-form-label-color: #374151;
|
|
763
|
-
--dialog-form-label-size:
|
|
765
|
+
--dialog-form-label-size: 14px;
|
|
764
766
|
--dialog-form-label-weight: 500;
|
|
765
767
|
--dialog-form-input-bg: #fff;
|
|
766
768
|
--dialog-form-input-border: #d1d5db;
|
|
767
769
|
--dialog-form-input-border-focus: var(--dialog-primary);
|
|
768
770
|
--dialog-form-input-radius: 6px;
|
|
769
771
|
--dialog-form-input-padding: 8px 12px;
|
|
770
|
-
--dialog-form-input-font-size:
|
|
772
|
+
--dialog-form-input-font-size: 15px;
|
|
771
773
|
--dialog-form-error-color: var(--dialog-error);
|
|
772
774
|
--dialog-form-hint-color: #9ca3af;
|
|
773
775
|
--dialog-form-required-color: var(--dialog-error);
|
|
@@ -835,9 +837,27 @@ var overlayStyles = import_lit.css`
|
|
|
835
837
|
max-width: 90vw;
|
|
836
838
|
border-radius: var(--dialog-card-radius);
|
|
837
839
|
padding: var(--dialog-card-padding-desktop);
|
|
840
|
+
transition: width 360ms cubic-bezier(0.16, 1, 0.3, 1);
|
|
841
|
+
}
|
|
842
|
+
}
|
|
843
|
+
|
|
844
|
+
/* ─── Alert / Confirm specific sizing ─── */
|
|
845
|
+
|
|
846
|
+
@media (min-width: 640px) {
|
|
847
|
+
.card[data-type='alert'],
|
|
848
|
+
.card[data-type='confirm'] {
|
|
849
|
+
width: var(--dialog-alert-width);
|
|
838
850
|
}
|
|
839
851
|
}
|
|
840
852
|
|
|
853
|
+
.card[data-type='alert'] .label,
|
|
854
|
+
.card[data-type='confirm'] .label {
|
|
855
|
+
font-size: 22px;
|
|
856
|
+
font-weight: 700;
|
|
857
|
+
color: #0f172a;
|
|
858
|
+
letter-spacing: -0.01em;
|
|
859
|
+
}
|
|
860
|
+
|
|
841
861
|
/* ─── Card Open / Close Animations ─── */
|
|
842
862
|
|
|
843
863
|
@keyframes card-enter {
|
|
@@ -1060,9 +1080,9 @@ var overlayStyles = import_lit.css`
|
|
|
1060
1080
|
/* ─── Text ─── */
|
|
1061
1081
|
|
|
1062
1082
|
.dialog-title {
|
|
1063
|
-
font-size:
|
|
1083
|
+
font-size: 20px;
|
|
1064
1084
|
font-weight: 600;
|
|
1065
|
-
color: #
|
|
1085
|
+
color: #1f2937;
|
|
1066
1086
|
text-align: center;
|
|
1067
1087
|
margin: 0 0 16px;
|
|
1068
1088
|
word-break: break-word;
|
|
@@ -1072,29 +1092,29 @@ var overlayStyles = import_lit.css`
|
|
|
1072
1092
|
}
|
|
1073
1093
|
|
|
1074
1094
|
.label {
|
|
1075
|
-
font-size:
|
|
1076
|
-
font-weight:
|
|
1077
|
-
color: #
|
|
1095
|
+
font-size: 17px;
|
|
1096
|
+
font-weight: 500;
|
|
1097
|
+
color: #111827;
|
|
1078
1098
|
text-align: center;
|
|
1079
1099
|
margin: 0;
|
|
1080
1100
|
word-break: break-word;
|
|
1081
1101
|
}
|
|
1082
1102
|
|
|
1083
1103
|
.description {
|
|
1084
|
-
font-size:
|
|
1085
|
-
color: #
|
|
1104
|
+
font-size: 15px;
|
|
1105
|
+
color: #4b5563;
|
|
1086
1106
|
text-align: center;
|
|
1087
1107
|
margin: 0;
|
|
1088
1108
|
word-break: break-word;
|
|
1089
|
-
line-height: 1.
|
|
1109
|
+
line-height: 1.65;
|
|
1090
1110
|
}
|
|
1091
1111
|
|
|
1092
1112
|
.html-content {
|
|
1093
|
-
font-size:
|
|
1094
|
-
color: #
|
|
1113
|
+
font-size: 15px;
|
|
1114
|
+
color: #4b5563;
|
|
1095
1115
|
text-align: center;
|
|
1096
1116
|
word-break: break-word;
|
|
1097
|
-
line-height: 1.
|
|
1117
|
+
line-height: 1.65;
|
|
1098
1118
|
width: 100%;
|
|
1099
1119
|
}
|
|
1100
1120
|
|
|
@@ -1194,10 +1214,31 @@ var overlayStyles = import_lit.css`
|
|
|
1194
1214
|
display: flex;
|
|
1195
1215
|
align-items: center;
|
|
1196
1216
|
gap: 12px;
|
|
1197
|
-
font-size:
|
|
1217
|
+
font-size: 15px;
|
|
1218
|
+
border-radius: 6px;
|
|
1219
|
+
transition: background 200ms ease;
|
|
1198
1220
|
animation: task-item-enter 300ms cubic-bezier(0.16, 1, 0.3, 1) both;
|
|
1199
1221
|
}
|
|
1200
1222
|
|
|
1223
|
+
.task-item[data-status='active'] {
|
|
1224
|
+
}
|
|
1225
|
+
|
|
1226
|
+
@keyframes task-item-enter-below {
|
|
1227
|
+
from {
|
|
1228
|
+
opacity: 0;
|
|
1229
|
+
transform: translateY(8px);
|
|
1230
|
+
}
|
|
1231
|
+
to {
|
|
1232
|
+
opacity: 1;
|
|
1233
|
+
transform: translateY(0);
|
|
1234
|
+
}
|
|
1235
|
+
}
|
|
1236
|
+
|
|
1237
|
+
/* Queue items slide in from below (steps keep the left-slide default) */
|
|
1238
|
+
.task-item[data-status] {
|
|
1239
|
+
animation-name: task-item-enter-below;
|
|
1240
|
+
}
|
|
1241
|
+
|
|
1201
1242
|
.task-item:nth-child(1) {
|
|
1202
1243
|
animation-delay: 40ms;
|
|
1203
1244
|
}
|
|
@@ -1247,6 +1288,26 @@ var overlayStyles = import_lit.css`
|
|
|
1247
1288
|
animation: spin 1.2s infinite linear;
|
|
1248
1289
|
}
|
|
1249
1290
|
|
|
1291
|
+
.task-item[data-status='active'] .task-icon .mini-spinner {
|
|
1292
|
+
animation:
|
|
1293
|
+
spin 1.2s infinite linear,
|
|
1294
|
+
queue-spinner-pulse 2s infinite ease-in-out;
|
|
1295
|
+
}
|
|
1296
|
+
|
|
1297
|
+
@keyframes queue-spinner-pulse {
|
|
1298
|
+
0%,
|
|
1299
|
+
100% {
|
|
1300
|
+
box-shadow:
|
|
1301
|
+
inset 0 0 0 1px var(--dialog-spinner-track),
|
|
1302
|
+
0 0 0 0 color-mix(in srgb, var(--dialog-accent, #3b82f6) 40%, transparent);
|
|
1303
|
+
}
|
|
1304
|
+
50% {
|
|
1305
|
+
box-shadow:
|
|
1306
|
+
inset 0 0 0 1px var(--dialog-spinner-track),
|
|
1307
|
+
0 0 0 4px color-mix(in srgb, var(--dialog-accent, #3b82f6) 0%, transparent);
|
|
1308
|
+
}
|
|
1309
|
+
}
|
|
1310
|
+
|
|
1250
1311
|
.task-icon .mini-spinner-half {
|
|
1251
1312
|
position: absolute;
|
|
1252
1313
|
left: 50%;
|
|
@@ -1268,6 +1329,23 @@ var overlayStyles = import_lit.css`
|
|
|
1268
1329
|
box-shadow: inset 0 0 0 1px var(--dialog-spinner-arc);
|
|
1269
1330
|
}
|
|
1270
1331
|
|
|
1332
|
+
@keyframes task-icon-pop {
|
|
1333
|
+
from {
|
|
1334
|
+
transform: scale(0.4);
|
|
1335
|
+
opacity: 0;
|
|
1336
|
+
}
|
|
1337
|
+
to {
|
|
1338
|
+
transform: scale(1);
|
|
1339
|
+
opacity: 1;
|
|
1340
|
+
}
|
|
1341
|
+
}
|
|
1342
|
+
|
|
1343
|
+
.task-item[data-status='done'] .task-icon svg,
|
|
1344
|
+
.task-item[data-status='error'] .task-icon svg,
|
|
1345
|
+
.task-item[data-status='skipped'] .task-icon svg {
|
|
1346
|
+
animation: task-icon-pop 400ms cubic-bezier(0.34, 1.56, 0.64, 1) both;
|
|
1347
|
+
}
|
|
1348
|
+
|
|
1271
1349
|
.task-label {
|
|
1272
1350
|
color: #6b7280;
|
|
1273
1351
|
transition: color 250ms ease;
|
|
@@ -1303,21 +1381,80 @@ var overlayStyles = import_lit.css`
|
|
|
1303
1381
|
color: #9ca3af;
|
|
1304
1382
|
}
|
|
1305
1383
|
|
|
1384
|
+
/* ─── Queue layout & progress ─── */
|
|
1385
|
+
|
|
1386
|
+
.queue-layout {
|
|
1387
|
+
display: flex;
|
|
1388
|
+
align-items: stretch;
|
|
1389
|
+
gap: 10px;
|
|
1390
|
+
width: 100%;
|
|
1391
|
+
}
|
|
1392
|
+
|
|
1393
|
+
.queue-layout .task-list {
|
|
1394
|
+
flex: 1;
|
|
1395
|
+
}
|
|
1396
|
+
|
|
1397
|
+
.queue-progress-v {
|
|
1398
|
+
display: flex;
|
|
1399
|
+
flex-direction: column;
|
|
1400
|
+
align-items: center;
|
|
1401
|
+
flex-shrink: 0;
|
|
1402
|
+
width: 14px;
|
|
1403
|
+
animation: task-item-enter 300ms cubic-bezier(0.16, 1, 0.3, 1) both;
|
|
1404
|
+
}
|
|
1405
|
+
|
|
1406
|
+
.queue-progress-track-v {
|
|
1407
|
+
flex: 1;
|
|
1408
|
+
width: 2px;
|
|
1409
|
+
background: rgba(156, 163, 175, 0.2);
|
|
1410
|
+
border-radius: 1px;
|
|
1411
|
+
position: relative;
|
|
1412
|
+
overflow: hidden;
|
|
1413
|
+
}
|
|
1414
|
+
|
|
1415
|
+
.queue-progress-fill-v {
|
|
1416
|
+
position: absolute;
|
|
1417
|
+
top: 0;
|
|
1418
|
+
left: 0;
|
|
1419
|
+
right: 0;
|
|
1420
|
+
background: var(--dialog-accent, #3b82f6);
|
|
1421
|
+
border-radius: 1px;
|
|
1422
|
+
transition: height 600ms cubic-bezier(0.4, 0, 0.2, 1);
|
|
1423
|
+
}
|
|
1424
|
+
|
|
1425
|
+
.queue-progress-count-v {
|
|
1426
|
+
font-size: 10px;
|
|
1427
|
+
font-weight: 500;
|
|
1428
|
+
color: #9ca3af;
|
|
1429
|
+
margin-top: 5px;
|
|
1430
|
+
writing-mode: vertical-rl;
|
|
1431
|
+
letter-spacing: 0.04em;
|
|
1432
|
+
font-variant-numeric: tabular-nums;
|
|
1433
|
+
line-height: 1;
|
|
1434
|
+
}
|
|
1435
|
+
|
|
1306
1436
|
/* ─── Queue ellipsis ─── */
|
|
1307
1437
|
|
|
1308
1438
|
.queue-ellipsis {
|
|
1439
|
+
display: flex;
|
|
1440
|
+
flex-direction: row;
|
|
1441
|
+
align-items: center;
|
|
1442
|
+
gap: 8px;
|
|
1443
|
+
list-style: none;
|
|
1444
|
+
}
|
|
1445
|
+
|
|
1446
|
+
.queue-ellipsis-dots {
|
|
1309
1447
|
display: flex;
|
|
1310
1448
|
flex-direction: column;
|
|
1311
1449
|
align-items: center;
|
|
1450
|
+
justify-content: center;
|
|
1312
1451
|
gap: 3px;
|
|
1452
|
+
width: 24px;
|
|
1313
1453
|
padding: 4px 0;
|
|
1314
|
-
|
|
1315
|
-
padding-left: 10px;
|
|
1316
|
-
align-self: flex-start;
|
|
1317
|
-
list-style: none;
|
|
1454
|
+
flex-shrink: 0;
|
|
1318
1455
|
}
|
|
1319
1456
|
|
|
1320
|
-
.queue-ellipsis span {
|
|
1457
|
+
.queue-ellipsis-dots span {
|
|
1321
1458
|
display: block;
|
|
1322
1459
|
width: 4px;
|
|
1323
1460
|
height: 4px;
|
|
@@ -1325,6 +1462,16 @@ var overlayStyles = import_lit.css`
|
|
|
1325
1462
|
background-color: #d1d5db;
|
|
1326
1463
|
}
|
|
1327
1464
|
|
|
1465
|
+
.queue-ellipsis-badge {
|
|
1466
|
+
font-size: 11px;
|
|
1467
|
+
font-weight: 500;
|
|
1468
|
+
color: #9ca3af;
|
|
1469
|
+
background: rgba(156, 163, 175, 0.12);
|
|
1470
|
+
border-radius: 10px;
|
|
1471
|
+
padding: 2px 7px;
|
|
1472
|
+
letter-spacing: 0.01em;
|
|
1473
|
+
}
|
|
1474
|
+
|
|
1328
1475
|
/* ─── Steps indicator ─── */
|
|
1329
1476
|
|
|
1330
1477
|
.steps-header {
|
|
@@ -1490,13 +1637,13 @@ var overlayStyles = import_lit.css`
|
|
|
1490
1637
|
}
|
|
1491
1638
|
|
|
1492
1639
|
.form-error {
|
|
1493
|
-
font-size:
|
|
1640
|
+
font-size: 13px;
|
|
1494
1641
|
color: var(--dialog-form-error-color);
|
|
1495
1642
|
min-height: 1em;
|
|
1496
1643
|
}
|
|
1497
1644
|
|
|
1498
1645
|
.form-hint {
|
|
1499
|
-
font-size:
|
|
1646
|
+
font-size: 13px;
|
|
1500
1647
|
color: var(--dialog-form-hint-color);
|
|
1501
1648
|
}
|
|
1502
1649
|
|
|
@@ -1548,7 +1695,7 @@ var overlayStyles = import_lit.css`
|
|
|
1548
1695
|
}
|
|
1549
1696
|
|
|
1550
1697
|
.step-form-counter {
|
|
1551
|
-
font-size:
|
|
1698
|
+
font-size: 13px;
|
|
1552
1699
|
color: var(--dialog-form-hint-color);
|
|
1553
1700
|
text-align: center;
|
|
1554
1701
|
margin: 0 0 4px;
|
|
@@ -1581,7 +1728,9 @@ var overlayStyles = import_lit.css`
|
|
|
1581
1728
|
border: 1px solid var(--dialog-form-input-border);
|
|
1582
1729
|
background: transparent;
|
|
1583
1730
|
color: var(--dialog-text-color);
|
|
1584
|
-
transition:
|
|
1731
|
+
transition:
|
|
1732
|
+
background-color 120ms ease,
|
|
1733
|
+
border-color 120ms ease;
|
|
1585
1734
|
}
|
|
1586
1735
|
|
|
1587
1736
|
.btn-prev:hover {
|
|
@@ -1828,23 +1977,40 @@ var OverlayDialog = class extends import_lit2.LitElement {
|
|
|
1828
1977
|
const total = items.length;
|
|
1829
1978
|
const { start, end } = this._getQueueWindow(items);
|
|
1830
1979
|
const visible = items.slice(start, end + 1);
|
|
1980
|
+
const finishedStatuses = /* @__PURE__ */ new Set(["done", "skipped", "error"]);
|
|
1981
|
+
const doneCount = items.filter((i) => finishedStatuses.has(i.status)).length;
|
|
1982
|
+
const pct = total > 0 ? Math.round(doneCount / total * 100) : 0;
|
|
1983
|
+
const topHidden = start;
|
|
1984
|
+
const bottomHidden = total - 1 - end;
|
|
1831
1985
|
return import_lit2.html`
|
|
1832
|
-
<
|
|
1833
|
-
|
|
1834
|
-
|
|
1835
|
-
|
|
1836
|
-
|
|
1986
|
+
<div class="queue-layout">
|
|
1987
|
+
<div class="queue-progress-v">
|
|
1988
|
+
<div class="queue-progress-track-v">
|
|
1989
|
+
<div class="queue-progress-fill-v" style="height: ${pct}%"></div>
|
|
1990
|
+
</div>
|
|
1991
|
+
<span class="queue-progress-count-v">${doneCount}/${total}</span>
|
|
1992
|
+
</div>
|
|
1993
|
+
<ul class="task-list">
|
|
1994
|
+
${topHidden > 0 ? import_lit2.html`<li class="queue-ellipsis" aria-hidden="true">
|
|
1995
|
+
<div class="queue-ellipsis-dots"><span></span><span></span><span></span></div>
|
|
1996
|
+
<span class="queue-ellipsis-badge">+${topHidden}</span>
|
|
1997
|
+
</li>` : import_lit2.nothing}
|
|
1998
|
+
${(0, import_repeat.repeat)(
|
|
1999
|
+
visible,
|
|
2000
|
+
(item) => item.key,
|
|
1837
2001
|
(item) => import_lit2.html`
|
|
1838
|
-
|
|
1839
|
-
|
|
1840
|
-
|
|
1841
|
-
|
|
1842
|
-
|
|
2002
|
+
<li class="task-item" data-status=${item.status}>
|
|
2003
|
+
<span class="task-icon">${this._renderTaskIcon(item.status)}</span>
|
|
2004
|
+
<span class="task-label" data-status=${item.status}>${item.label}</span>
|
|
2005
|
+
</li>
|
|
2006
|
+
`
|
|
1843
2007
|
)}
|
|
1844
|
-
|
|
1845
|
-
|
|
1846
|
-
|
|
1847
|
-
|
|
2008
|
+
${bottomHidden > 0 ? import_lit2.html`<li class="queue-ellipsis" aria-hidden="true">
|
|
2009
|
+
<div class="queue-ellipsis-dots"><span></span><span></span><span></span></div>
|
|
2010
|
+
<span class="queue-ellipsis-badge">+${bottomHidden}</span>
|
|
2011
|
+
</li>` : import_lit2.nothing}
|
|
2012
|
+
</ul>
|
|
2013
|
+
</div>
|
|
1848
2014
|
`;
|
|
1849
2015
|
}
|
|
1850
2016
|
_renderStepsHeader(items) {
|
|
@@ -2194,9 +2360,9 @@ __decorateClass([
|
|
|
2194
2360
|
__decorateClass([
|
|
2195
2361
|
(0, import_decorators.state)()
|
|
2196
2362
|
], OverlayDialog.prototype, "_isClosing", 2);
|
|
2197
|
-
|
|
2198
|
-
|
|
2199
|
-
|
|
2363
|
+
if (!customElements.get("overlay-dialog")) {
|
|
2364
|
+
customElements.define("overlay-dialog", OverlayDialog);
|
|
2365
|
+
}
|
|
2200
2366
|
|
|
2201
2367
|
// src/dialog.ts
|
|
2202
2368
|
var _controller, _element, _DialogSingleton_instances, ensureElement_fn;
|
|
@@ -2546,7 +2712,7 @@ enforceMaxVisible_fn = function() {
|
|
|
2546
2712
|
// src/toast/toast-container.ts
|
|
2547
2713
|
var import_lit4 = require("lit");
|
|
2548
2714
|
var import_decorators2 = require("lit/decorators.js");
|
|
2549
|
-
var
|
|
2715
|
+
var import_repeat2 = require("lit/directives/repeat.js");
|
|
2550
2716
|
|
|
2551
2717
|
// src/toast/styles.ts
|
|
2552
2718
|
var import_lit3 = require("lit");
|
|
@@ -3184,7 +3350,7 @@ var ToastContainer = class extends import_lit4.LitElement {
|
|
|
3184
3350
|
const s = this._state;
|
|
3185
3351
|
return import_lit4.html`
|
|
3186
3352
|
<div class="container" data-position=${s.position} role="region" aria-label="通知">
|
|
3187
|
-
${(0,
|
|
3353
|
+
${(0, import_repeat2.repeat)(
|
|
3188
3354
|
s.items,
|
|
3189
3355
|
(item) => item.id,
|
|
3190
3356
|
(item) => this._renderToast(item)
|
|
@@ -3200,9 +3366,9 @@ __decorateClass([
|
|
|
3200
3366
|
__decorateClass([
|
|
3201
3367
|
(0, import_decorators2.state)()
|
|
3202
3368
|
], ToastContainer.prototype, "_state", 2);
|
|
3203
|
-
|
|
3204
|
-
|
|
3205
|
-
|
|
3369
|
+
if (!customElements.get("toast-container")) {
|
|
3370
|
+
customElements.define("toast-container", ToastContainer);
|
|
3371
|
+
}
|
|
3206
3372
|
|
|
3207
3373
|
// src/toast/toast.ts
|
|
3208
3374
|
var _controller2, _element2, _ToastSingleton_instances, ensureElement_fn2;
|