@elementor/editor-global-classes 4.2.0-921 → 4.2.0-923
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.js +150 -133
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +143 -126
- package/dist/index.mjs.map +1 -1
- package/package.json +20 -20
- package/src/components/class-manager/global-classes-list.tsx +40 -17
- package/src/load-document-classes.ts +12 -5
- package/src/store.ts +1 -1
package/dist/index.js
CHANGED
|
@@ -44,11 +44,11 @@ module.exports = __toCommonJS(index_exports);
|
|
|
44
44
|
var React19 = __toESM(require("react"));
|
|
45
45
|
var import_react10 = require("react");
|
|
46
46
|
var import_editor_current_user2 = require("@elementor/editor-current-user");
|
|
47
|
-
var
|
|
47
|
+
var import_editor_documents4 = require("@elementor/editor-documents");
|
|
48
48
|
var import_editor_panels = require("@elementor/editor-panels");
|
|
49
49
|
var import_editor_ui9 = require("@elementor/editor-ui");
|
|
50
50
|
var import_query2 = require("@elementor/query");
|
|
51
|
-
var
|
|
51
|
+
var import_store22 = require("@elementor/store");
|
|
52
52
|
var import_ui16 = require("@elementor/ui");
|
|
53
53
|
var import_i18n14 = require("@wordpress/i18n");
|
|
54
54
|
|
|
@@ -342,7 +342,7 @@ var selectOrderedClasses = (0, import_store.__createSelector)(
|
|
|
342
342
|
var selectClass = (state, id) => state[SLICE_NAME].data.items[id] ?? null;
|
|
343
343
|
var selectEmptyCssClass = (0, import_store.__createSelector)(
|
|
344
344
|
selectData,
|
|
345
|
-
({ items }) => Object.values(items).filter((cssClass) => cssClass.variants
|
|
345
|
+
({ items }) => Object.values(items).filter((cssClass) => (cssClass.variants?.length ?? 0) === 0)
|
|
346
346
|
);
|
|
347
347
|
var selectIsClassFetched = (state, id) => !!state[SLICE_NAME].initialData.preview.items[id] || !!state[SLICE_NAME].initialData.frontend.items[id] || false;
|
|
348
348
|
|
|
@@ -1184,7 +1184,7 @@ var FlippedColorSwatchIcon = ({ sx, ...props }) => /* @__PURE__ */ React10.creat
|
|
|
1184
1184
|
// src/components/class-manager/global-classes-list.tsx
|
|
1185
1185
|
var React17 = __toESM(require("react"));
|
|
1186
1186
|
var import_react8 = require("react");
|
|
1187
|
-
var
|
|
1187
|
+
var import_store20 = require("@elementor/store");
|
|
1188
1188
|
var import_ui14 = require("@elementor/ui");
|
|
1189
1189
|
var import_react_virtual = require("@tanstack/react-virtual");
|
|
1190
1190
|
var import_i18n12 = require("@wordpress/i18n");
|
|
@@ -1195,6 +1195,115 @@ var useOrderedClasses = () => {
|
|
|
1195
1195
|
return (0, import_store14.__useSelector)(selectOrderedClasses);
|
|
1196
1196
|
};
|
|
1197
1197
|
|
|
1198
|
+
// src/load-existing-classes.ts
|
|
1199
|
+
var import_store18 = require("@elementor/store");
|
|
1200
|
+
|
|
1201
|
+
// src/load-document-classes.ts
|
|
1202
|
+
var import_editor_documents2 = require("@elementor/editor-documents");
|
|
1203
|
+
var import_store16 = require("@elementor/store");
|
|
1204
|
+
|
|
1205
|
+
// src/utils/create-labels-for-classes.ts
|
|
1206
|
+
function createLabelsForClasses(entries) {
|
|
1207
|
+
return Object.fromEntries(entries.map((e) => [e.id, e.label]));
|
|
1208
|
+
}
|
|
1209
|
+
|
|
1210
|
+
// src/load-document-classes.ts
|
|
1211
|
+
function styleDefinitionsMapWithoutNull(map) {
|
|
1212
|
+
return Object.fromEntries(
|
|
1213
|
+
Object.entries(map).filter(
|
|
1214
|
+
(entry) => entry[1] !== null
|
|
1215
|
+
)
|
|
1216
|
+
);
|
|
1217
|
+
}
|
|
1218
|
+
function resetGlobalClassesState(globalOrder, classLabels) {
|
|
1219
|
+
(0, import_store16.__dispatch)(
|
|
1220
|
+
slice.actions.load({
|
|
1221
|
+
preview: { items: {}, order: globalOrder },
|
|
1222
|
+
frontend: { items: {}, order: globalOrder },
|
|
1223
|
+
classLabels
|
|
1224
|
+
})
|
|
1225
|
+
);
|
|
1226
|
+
}
|
|
1227
|
+
async function loadCurrentDocumentClasses() {
|
|
1228
|
+
const [previewIndexRes, frontendIndexRes] = await Promise.all([
|
|
1229
|
+
apiClient.all("preview"),
|
|
1230
|
+
apiClient.all("frontend")
|
|
1231
|
+
]);
|
|
1232
|
+
const previewIndex = previewIndexRes.data.data;
|
|
1233
|
+
const frontendIndex = frontendIndexRes.data.data;
|
|
1234
|
+
const classLabels = createLabelsForClasses(previewIndex);
|
|
1235
|
+
const previewOrder = previewIndex.map((e) => e.id);
|
|
1236
|
+
const frontendOrder = frontendIndex.map((e) => e.id);
|
|
1237
|
+
resetGlobalClassesState(previewOrder, classLabels);
|
|
1238
|
+
const postId = (0, import_editor_documents2.getCurrentDocument)()?.id;
|
|
1239
|
+
if (!postId) {
|
|
1240
|
+
return;
|
|
1241
|
+
}
|
|
1242
|
+
const [previewPostRes, frontendPostRes] = await Promise.all([
|
|
1243
|
+
apiClient.getStylesForPost(postId, "preview"),
|
|
1244
|
+
apiClient.getStylesForPost(postId, "frontend")
|
|
1245
|
+
]);
|
|
1246
|
+
const previewItems = styleDefinitionsMapWithoutNull(previewPostRes.data.data);
|
|
1247
|
+
const frontendItems = styleDefinitionsMapWithoutNull(frontendPostRes.data.data);
|
|
1248
|
+
(0, import_store16.__dispatch)(
|
|
1249
|
+
slice.actions.load({
|
|
1250
|
+
preview: { items: previewItems, order: previewOrder },
|
|
1251
|
+
frontend: { items: frontendItems, order: frontendOrder },
|
|
1252
|
+
classLabels
|
|
1253
|
+
})
|
|
1254
|
+
);
|
|
1255
|
+
}
|
|
1256
|
+
async function addDocumentClasses(documentId) {
|
|
1257
|
+
const [previewPostRes, frontendPostRes] = await Promise.all([
|
|
1258
|
+
apiClient.getStylesForPost(documentId, "preview"),
|
|
1259
|
+
apiClient.getStylesForPost(documentId, "frontend")
|
|
1260
|
+
]);
|
|
1261
|
+
const previewItems = styleDefinitionsMapWithoutNull(previewPostRes.data.data);
|
|
1262
|
+
const frontendItems = styleDefinitionsMapWithoutNull(frontendPostRes.data.data);
|
|
1263
|
+
(0, import_store16.__dispatch)(
|
|
1264
|
+
slice.actions.mergeExistingClasses({
|
|
1265
|
+
preview: previewItems,
|
|
1266
|
+
frontend: frontendItems
|
|
1267
|
+
})
|
|
1268
|
+
);
|
|
1269
|
+
}
|
|
1270
|
+
|
|
1271
|
+
// src/load-existing-classes.ts
|
|
1272
|
+
var pendingLoad = null;
|
|
1273
|
+
var pendingIds = /* @__PURE__ */ new Set();
|
|
1274
|
+
async function loadExistingClasses(classIds) {
|
|
1275
|
+
const existingClasses = selectGlobalClasses((0, import_store18.__getState)());
|
|
1276
|
+
const missingIds = classIds.filter((id) => !(id in existingClasses));
|
|
1277
|
+
if (missingIds.length === 0) {
|
|
1278
|
+
return;
|
|
1279
|
+
}
|
|
1280
|
+
missingIds.forEach((id) => pendingIds.add(id));
|
|
1281
|
+
if (pendingLoad) {
|
|
1282
|
+
await pendingLoad;
|
|
1283
|
+
return loadExistingClasses(classIds);
|
|
1284
|
+
}
|
|
1285
|
+
pendingLoad = fetchAndMergeClasses();
|
|
1286
|
+
try {
|
|
1287
|
+
await pendingLoad;
|
|
1288
|
+
} finally {
|
|
1289
|
+
pendingLoad = null;
|
|
1290
|
+
}
|
|
1291
|
+
}
|
|
1292
|
+
async function fetchAndMergeClasses() {
|
|
1293
|
+
const idsToFetch = Array.from(pendingIds);
|
|
1294
|
+
pendingIds.clear();
|
|
1295
|
+
if (idsToFetch.length === 0) {
|
|
1296
|
+
return;
|
|
1297
|
+
}
|
|
1298
|
+
const [previewResponse, frontendResponse] = await Promise.all([
|
|
1299
|
+
apiClient.getStylesByIds(idsToFetch, "preview"),
|
|
1300
|
+
apiClient.getStylesByIds(idsToFetch, "frontend")
|
|
1301
|
+
]);
|
|
1302
|
+
const previewItems = styleDefinitionsMapWithoutNull(previewResponse.data.data);
|
|
1303
|
+
const frontendItems = styleDefinitionsMapWithoutNull(frontendResponse.data.data);
|
|
1304
|
+
(0, import_store18.__dispatch)(slice.actions.mergeExistingClasses({ preview: previewItems, frontend: frontendItems }));
|
|
1305
|
+
}
|
|
1306
|
+
|
|
1198
1307
|
// src/components/class-manager/class-item.tsx
|
|
1199
1308
|
var React15 = __toESM(require("react"));
|
|
1200
1309
|
var import_react7 = require("react");
|
|
@@ -1206,7 +1315,7 @@ var import_i18n10 = require("@wordpress/i18n");
|
|
|
1206
1315
|
|
|
1207
1316
|
// src/components/css-class-usage/components/css-class-usage-popover.tsx
|
|
1208
1317
|
var React11 = __toESM(require("react"));
|
|
1209
|
-
var
|
|
1318
|
+
var import_editor_documents3 = require("@elementor/editor-documents");
|
|
1210
1319
|
var import_editor_ui5 = require("@elementor/editor-ui");
|
|
1211
1320
|
var import_icons6 = require("@elementor/icons");
|
|
1212
1321
|
var import_ui8 = require("@elementor/ui");
|
|
@@ -1251,7 +1360,7 @@ var CssClassUsagePopover = ({
|
|
|
1251
1360
|
onClose
|
|
1252
1361
|
}) => {
|
|
1253
1362
|
const { data: classUsage } = useCssClassUsageByID(cssClassID);
|
|
1254
|
-
const onNavigate = (0,
|
|
1363
|
+
const onNavigate = (0, import_editor_documents3.__useOpenDocumentInNewTab)();
|
|
1255
1364
|
const cssClassUsageRecords = classUsage?.content.map(
|
|
1256
1365
|
({ title, elements, pageId, type }) => ({
|
|
1257
1366
|
type: "item",
|
|
@@ -1865,9 +1974,15 @@ var GlobalClassesList = ({
|
|
|
1865
1974
|
search: { debouncedValue: searchValue }
|
|
1866
1975
|
} = useSearchAndFilters();
|
|
1867
1976
|
const cssClasses = useOrderedClasses();
|
|
1868
|
-
const dispatch7 = (0,
|
|
1977
|
+
const dispatch7 = (0, import_store20.__useDispatch)();
|
|
1869
1978
|
const filters = useFilters();
|
|
1870
1979
|
const [draggedItemId, setDraggedItemId] = (0, import_react8.useState)(null);
|
|
1980
|
+
const [loading, setLoading] = (0, import_react8.useState)({});
|
|
1981
|
+
const addLoadingClass = (classId) => setLoading((prev) => ({ ...prev, [classId]: true }));
|
|
1982
|
+
const removeLoadingClass = (classId) => setLoading((prev) => {
|
|
1983
|
+
const { [classId]: _, ...rest } = prev;
|
|
1984
|
+
return rest;
|
|
1985
|
+
});
|
|
1871
1986
|
const draggedItemLabel = cssClasses.find((cssClass) => cssClass.id === draggedItemId)?.label ?? "";
|
|
1872
1987
|
const [classesOrder, reorderClasses] = useReorder(draggedItemId, setDraggedItemId, draggedItemLabel ?? "");
|
|
1873
1988
|
const filteredCssClasses = useFilteredCssClasses();
|
|
@@ -1956,25 +2071,31 @@ var GlobalClassesList = ({
|
|
|
1956
2071
|
{
|
|
1957
2072
|
id: cssClass.id,
|
|
1958
2073
|
label: cssClass.label,
|
|
1959
|
-
renameClass: (newLabel) => {
|
|
1960
|
-
|
|
1961
|
-
|
|
1962
|
-
|
|
1963
|
-
|
|
1964
|
-
|
|
1965
|
-
|
|
1966
|
-
|
|
1967
|
-
|
|
1968
|
-
|
|
1969
|
-
|
|
1970
|
-
|
|
1971
|
-
|
|
1972
|
-
|
|
1973
|
-
|
|
1974
|
-
|
|
2074
|
+
renameClass: async (newLabel) => {
|
|
2075
|
+
addLoadingClass(cssClass.id);
|
|
2076
|
+
try {
|
|
2077
|
+
trackGlobalClasses({
|
|
2078
|
+
event: "classRenamed",
|
|
2079
|
+
classId: cssClass.id,
|
|
2080
|
+
oldValue: cssClass.label,
|
|
2081
|
+
newValue: newLabel,
|
|
2082
|
+
source: "class-manager"
|
|
2083
|
+
});
|
|
2084
|
+
void await loadExistingClasses([cssClass.id]);
|
|
2085
|
+
dispatch7(
|
|
2086
|
+
slice.actions.update({
|
|
2087
|
+
style: {
|
|
2088
|
+
id: cssClass.id,
|
|
2089
|
+
label: newLabel
|
|
2090
|
+
}
|
|
2091
|
+
})
|
|
2092
|
+
);
|
|
2093
|
+
} finally {
|
|
2094
|
+
removeLoadingClass(cssClass.id);
|
|
2095
|
+
}
|
|
1975
2096
|
},
|
|
1976
2097
|
selected: isDragged,
|
|
1977
|
-
disabled: disabled || isDragPlaceholder,
|
|
2098
|
+
disabled: disabled || isDragPlaceholder || loading[cssClass.id],
|
|
1978
2099
|
sortableTriggerProps: {
|
|
1979
2100
|
...triggerProps,
|
|
1980
2101
|
style: triggerStyle
|
|
@@ -2014,7 +2135,7 @@ var StyledHeader = (0, import_ui14.styled)(import_ui14.Typography)(({ theme, var
|
|
|
2014
2135
|
}
|
|
2015
2136
|
}));
|
|
2016
2137
|
var useReorder = (draggedItemId, setDraggedItemId, draggedItemLabel) => {
|
|
2017
|
-
const dispatch7 = (0,
|
|
2138
|
+
const dispatch7 = (0, import_store20.__useDispatch)();
|
|
2018
2139
|
const order = useClassesOrder();
|
|
2019
2140
|
const reorder = (newIds) => {
|
|
2020
2141
|
dispatch7(slice.actions.setOrder(newIds));
|
|
@@ -2150,7 +2271,7 @@ function ClassManagerPanelContent({
|
|
|
2150
2271
|
const [scrollElement, setScrollElement] = (0, import_react10.useState)(null);
|
|
2151
2272
|
const { mutateAsync: publish, isPending: isPublishing } = usePublish();
|
|
2152
2273
|
const resetAndClosePanel = () => {
|
|
2153
|
-
(0,
|
|
2274
|
+
(0, import_store22.__dispatch)(slice.actions.resetToInitialState({ context: "frontend" }));
|
|
2154
2275
|
closeSaveChangesDialog();
|
|
2155
2276
|
};
|
|
2156
2277
|
const handleClosePanel = (0, import_react10.useCallback)(() => {
|
|
@@ -2174,7 +2295,7 @@ function ClassManagerPanelContent({
|
|
|
2174
2295
|
};
|
|
2175
2296
|
}, []);
|
|
2176
2297
|
const handleStopSync = (0, import_react10.useCallback)((classId) => {
|
|
2177
|
-
(0,
|
|
2298
|
+
(0, import_store22.__dispatch)(
|
|
2178
2299
|
slice.actions.update({
|
|
2179
2300
|
style: {
|
|
2180
2301
|
id: classId,
|
|
@@ -2186,7 +2307,7 @@ function ClassManagerPanelContent({
|
|
|
2186
2307
|
setStopSyncConfirmation(null);
|
|
2187
2308
|
}, []);
|
|
2188
2309
|
const handleStartSync = (0, import_react10.useCallback)((classId) => {
|
|
2189
|
-
(0,
|
|
2310
|
+
(0, import_store22.__dispatch)(
|
|
2190
2311
|
slice.actions.update({
|
|
2191
2312
|
style: {
|
|
2192
2313
|
id: classId,
|
|
@@ -2324,7 +2445,7 @@ var usePublish = () => {
|
|
|
2324
2445
|
return (0, import_query2.useMutation)({
|
|
2325
2446
|
mutationFn: () => saveGlobalClasses2({ context: "frontend" }),
|
|
2326
2447
|
onSuccess: async () => {
|
|
2327
|
-
(0,
|
|
2448
|
+
(0, import_editor_documents4.setDocumentModifiedStatus)(false);
|
|
2328
2449
|
if (hasDeletedItems()) {
|
|
2329
2450
|
await onDelete();
|
|
2330
2451
|
}
|
|
@@ -2386,110 +2507,6 @@ var getCapabilities = () => {
|
|
|
2386
2507
|
}
|
|
2387
2508
|
};
|
|
2388
2509
|
|
|
2389
|
-
// src/load-existing-classes.ts
|
|
2390
|
-
var import_store22 = require("@elementor/store");
|
|
2391
|
-
|
|
2392
|
-
// src/load-document-classes.ts
|
|
2393
|
-
var import_editor_documents4 = require("@elementor/editor-documents");
|
|
2394
|
-
var import_store20 = require("@elementor/store");
|
|
2395
|
-
|
|
2396
|
-
// src/utils/create-labels-for-classes.ts
|
|
2397
|
-
function createLabelsForClasses(entries) {
|
|
2398
|
-
return Object.fromEntries(entries.map((e) => [e.id, e.label]));
|
|
2399
|
-
}
|
|
2400
|
-
|
|
2401
|
-
// src/load-document-classes.ts
|
|
2402
|
-
function styleDefinitionsMapWithoutNull(map) {
|
|
2403
|
-
return Object.fromEntries(
|
|
2404
|
-
Object.entries(map).filter(
|
|
2405
|
-
(entry) => entry[1] !== null
|
|
2406
|
-
)
|
|
2407
|
-
);
|
|
2408
|
-
}
|
|
2409
|
-
function resetGlobalClassesState(globalOrder, classLabels) {
|
|
2410
|
-
(0, import_store20.__dispatch)(
|
|
2411
|
-
slice.actions.load({
|
|
2412
|
-
preview: { items: {}, order: globalOrder },
|
|
2413
|
-
frontend: { items: {}, order: globalOrder },
|
|
2414
|
-
classLabels
|
|
2415
|
-
})
|
|
2416
|
-
);
|
|
2417
|
-
}
|
|
2418
|
-
async function loadCurrentDocumentClasses() {
|
|
2419
|
-
const previewIndexRes = await apiClient.all("preview");
|
|
2420
|
-
const previewIndex = previewIndexRes.data.data;
|
|
2421
|
-
const classLabels = createLabelsForClasses(previewIndex);
|
|
2422
|
-
const globalOrder = previewIndex.map((e) => e.id);
|
|
2423
|
-
resetGlobalClassesState(globalOrder, classLabels);
|
|
2424
|
-
const postId = (0, import_editor_documents4.getCurrentDocument)()?.id;
|
|
2425
|
-
if (!postId) {
|
|
2426
|
-
return;
|
|
2427
|
-
}
|
|
2428
|
-
const [previewPostRes, frontendPostRes] = await Promise.all([
|
|
2429
|
-
apiClient.getStylesForPost(postId, "preview"),
|
|
2430
|
-
apiClient.getStylesForPost(postId, "frontend")
|
|
2431
|
-
]);
|
|
2432
|
-
const previewItems = styleDefinitionsMapWithoutNull(previewPostRes.data.data);
|
|
2433
|
-
const frontendItems = styleDefinitionsMapWithoutNull(frontendPostRes.data.data);
|
|
2434
|
-
(0, import_store20.__dispatch)(
|
|
2435
|
-
slice.actions.load({
|
|
2436
|
-
preview: { items: previewItems, order: globalOrder },
|
|
2437
|
-
frontend: { items: frontendItems, order: globalOrder },
|
|
2438
|
-
classLabels
|
|
2439
|
-
})
|
|
2440
|
-
);
|
|
2441
|
-
}
|
|
2442
|
-
async function addDocumentClasses(documentId) {
|
|
2443
|
-
const [previewPostRes, frontendPostRes] = await Promise.all([
|
|
2444
|
-
apiClient.getStylesForPost(documentId, "preview"),
|
|
2445
|
-
apiClient.getStylesForPost(documentId, "frontend")
|
|
2446
|
-
]);
|
|
2447
|
-
const previewItems = styleDefinitionsMapWithoutNull(previewPostRes.data.data);
|
|
2448
|
-
const frontendItems = styleDefinitionsMapWithoutNull(frontendPostRes.data.data);
|
|
2449
|
-
(0, import_store20.__dispatch)(
|
|
2450
|
-
slice.actions.mergeExistingClasses({
|
|
2451
|
-
preview: previewItems,
|
|
2452
|
-
frontend: frontendItems
|
|
2453
|
-
})
|
|
2454
|
-
);
|
|
2455
|
-
}
|
|
2456
|
-
|
|
2457
|
-
// src/load-existing-classes.ts
|
|
2458
|
-
var pendingLoad = null;
|
|
2459
|
-
var pendingIds = /* @__PURE__ */ new Set();
|
|
2460
|
-
async function loadExistingClasses(classIds) {
|
|
2461
|
-
const existingClasses = selectGlobalClasses((0, import_store22.__getState)());
|
|
2462
|
-
const missingIds = classIds.filter((id) => !(id in existingClasses));
|
|
2463
|
-
if (missingIds.length === 0) {
|
|
2464
|
-
return;
|
|
2465
|
-
}
|
|
2466
|
-
missingIds.forEach((id) => pendingIds.add(id));
|
|
2467
|
-
if (pendingLoad) {
|
|
2468
|
-
await pendingLoad;
|
|
2469
|
-
return loadExistingClasses(classIds);
|
|
2470
|
-
}
|
|
2471
|
-
pendingLoad = fetchAndMergeClasses();
|
|
2472
|
-
try {
|
|
2473
|
-
await pendingLoad;
|
|
2474
|
-
} finally {
|
|
2475
|
-
pendingLoad = null;
|
|
2476
|
-
}
|
|
2477
|
-
}
|
|
2478
|
-
async function fetchAndMergeClasses() {
|
|
2479
|
-
const idsToFetch = Array.from(pendingIds);
|
|
2480
|
-
pendingIds.clear();
|
|
2481
|
-
if (idsToFetch.length === 0) {
|
|
2482
|
-
return;
|
|
2483
|
-
}
|
|
2484
|
-
const [previewResponse, frontendResponse] = await Promise.all([
|
|
2485
|
-
apiClient.getStylesByIds(idsToFetch, "preview"),
|
|
2486
|
-
apiClient.getStylesByIds(idsToFetch, "frontend")
|
|
2487
|
-
]);
|
|
2488
|
-
const previewItems = styleDefinitionsMapWithoutNull(previewResponse.data.data);
|
|
2489
|
-
const frontendItems = styleDefinitionsMapWithoutNull(frontendResponse.data.data);
|
|
2490
|
-
(0, import_store22.__dispatch)(slice.actions.mergeExistingClasses({ preview: previewItems, frontend: frontendItems }));
|
|
2491
|
-
}
|
|
2492
|
-
|
|
2493
2510
|
// src/global-classes-styles-provider.ts
|
|
2494
2511
|
var MAX_CLASSES = 1e3;
|
|
2495
2512
|
var GLOBAL_CLASSES_PROVIDER_KEY = "global-classes";
|