@jumoo/usync 17.5.1 → 17.5.2-prerelease.15

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.
Files changed (39) hide show
  1. package/dist/api/index.d.ts +1 -1
  2. package/dist/api/index.js +1 -1
  3. package/dist/api/sdk.gen.d.ts +2 -1
  4. package/dist/api/sdk.gen.js +7 -0
  5. package/dist/api/types.gen.d.ts +361 -0
  6. package/dist/api/types.gen.js +13 -0
  7. package/dist/components/index.d.ts +3 -0
  8. package/dist/components/index.js +3 -0
  9. package/dist/components/usync-content-preview.d.ts +27 -0
  10. package/dist/components/usync-content-preview.js +540 -0
  11. package/dist/components/usync-content-type-preview.d.ts +25 -0
  12. package/dist/components/usync-content-type-preview.js +548 -0
  13. package/dist/components/usync-data-type-preview.d.ts +21 -0
  14. package/dist/components/usync-data-type-preview.js +293 -0
  15. package/dist/components/usync-results-view.js +13 -5
  16. package/dist/dialogs/details-modal-element.d.ts +12 -1
  17. package/dist/dialogs/details-modal-element.js +139 -9
  18. package/dist/dialogs/details-modal-token.d.ts +10 -1
  19. package/dist/lang/files/da-dk.d.ts +37 -0
  20. package/dist/lang/files/da-dk.js +37 -0
  21. package/dist/lang/files/de-de.d.ts +37 -0
  22. package/dist/lang/files/de-de.js +37 -0
  23. package/dist/lang/files/en-us.d.ts +37 -0
  24. package/dist/lang/files/en-us.js +37 -0
  25. package/dist/lang/files/es-es.d.ts +37 -0
  26. package/dist/lang/files/es-es.js +37 -0
  27. package/dist/lang/files/fr-fr.d.ts +37 -0
  28. package/dist/lang/files/fr-fr.js +37 -0
  29. package/dist/lang/files/nl-nl.d.ts +37 -0
  30. package/dist/lang/files/nl-nl.js +37 -0
  31. package/dist/repository/SyncAction.respositoy.d.ts +8 -0
  32. package/dist/repository/SyncAction.respositoy.js +6 -0
  33. package/dist/repository/sources/SyncAction.source.d.ts +5 -0
  34. package/dist/repository/sources/SyncAction.source.js +5 -0
  35. package/dist/utils/preview/content-type-diff.d.ts +18 -0
  36. package/dist/utils/preview/content-type-diff.js +72 -0
  37. package/dist/utils/preview/content-type-layout.d.ts +39 -0
  38. package/dist/utils/preview/content-type-layout.js +100 -0
  39. package/package.json +1 -1
@@ -0,0 +1,548 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
8
+ if (kind === "m") throw new TypeError("Private method is not writable");
9
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
10
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
11
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
12
+ };
13
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
14
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
15
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
16
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
17
+ };
18
+ var _uSyncContentTypePreviewElement_instances, _uSyncContentTypePreviewElement_sides, _uSyncContentTypePreviewElement_compositions, _uSyncContentTypePreviewElement_dataTypes, _uSyncContentTypePreviewElement_newDataTypes, _uSyncContentTypePreviewElement_newCompositions, _uSyncContentTypePreviewElement_diff, _uSyncContentTypePreviewElement_renderSide, _uSyncContentTypePreviewElement_missingMessage, _uSyncContentTypePreviewElement_renderInfo, _uSyncContentTypePreviewElement_renderTabButton, _uSyncContentTypePreviewElement_tabStatus, _uSyncContentTypePreviewElement_renderTab, _uSyncContentTypePreviewElement_ownStatus, _uSyncContentTypePreviewElement_renderProperties, _uSyncContentTypePreviewElement_renderBadge;
19
+ import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element';
20
+ import { classMap, css, customElement, html, nothing, property, repeat, state, } from '@umbraco-cms/backoffice/external/lit';
21
+ import '@umbraco-cms/backoffice/components';
22
+ import { buildContentTypeLayout, compositionIds, } from '../utils/preview/content-type-layout.js';
23
+ import { diffContentTypes, } from '../utils/preview/content-type-diff.js';
24
+ const KIND_LABELS = {
25
+ 'document-type': ['uSync_previewDocumentType', 'Document type'],
26
+ 'media-type': ['uSync_previewMediaType', 'Media type'],
27
+ 'member-type': ['uSync_previewMemberType', 'Member type'],
28
+ };
29
+ /**
30
+ * Shows the current and incoming versions of a document, media or member
31
+ * type side by side, laid out the way the backoffice editor shows them, with
32
+ * every property rendered by its real property editor. Added, removed and
33
+ * changed tabs, groups and properties are highlighted.
34
+ */
35
+ let uSyncContentTypePreviewElement = class uSyncContentTypePreviewElement extends UmbLitElement {
36
+ constructor() {
37
+ super(...arguments);
38
+ _uSyncContentTypePreviewElement_instances.add(this);
39
+ _uSyncContentTypePreviewElement_sides.set(this, { compositions: [] });
40
+ _uSyncContentTypePreviewElement_compositions.set(this, new Map());
41
+ _uSyncContentTypePreviewElement_dataTypes.set(this, new Map());
42
+ _uSyncContentTypePreviewElement_newDataTypes.set(this, new Set());
43
+ _uSyncContentTypePreviewElement_newCompositions.set(this, new Set());
44
+ _uSyncContentTypePreviewElement_diff.set(this, void 0);
45
+ }
46
+ willUpdate(changed) {
47
+ if (!changed.has('preview') || !this.preview)
48
+ return;
49
+ __classPrivateFieldSet(this, _uSyncContentTypePreviewElement_sides, getSides(this.preview), "f");
50
+ __classPrivateFieldSet(this, _uSyncContentTypePreviewElement_compositions, new Map(__classPrivateFieldGet(this, _uSyncContentTypePreviewElement_sides, "f").compositions.map((c) => [c.id, c])), "f");
51
+ __classPrivateFieldSet(this, _uSyncContentTypePreviewElement_dataTypes, new Map(this.preview.dataTypes.map((d) => [d.id, d])), "f");
52
+ __classPrivateFieldSet(this, _uSyncContentTypePreviewElement_newDataTypes, new Set(this.preview.newDataTypes), "f");
53
+ __classPrivateFieldSet(this, _uSyncContentTypePreviewElement_newCompositions, new Set(this.preview.newCompositions), "f");
54
+ __classPrivateFieldSet(this, _uSyncContentTypePreviewElement_diff, diffContentTypes(__classPrivateFieldGet(this, _uSyncContentTypePreviewElement_sides, "f").current, __classPrivateFieldGet(this, _uSyncContentTypePreviewElement_sides, "f").incoming), "f");
55
+ this._activeTab = undefined;
56
+ }
57
+ render() {
58
+ if (!this.preview)
59
+ return nothing;
60
+ return html `
61
+ <div class="sides">
62
+ ${__classPrivateFieldGet(this, _uSyncContentTypePreviewElement_instances, "m", _uSyncContentTypePreviewElement_renderSide).call(this, 'current', __classPrivateFieldGet(this, _uSyncContentTypePreviewElement_sides, "f").current)}
63
+ ${__classPrivateFieldGet(this, _uSyncContentTypePreviewElement_instances, "m", _uSyncContentTypePreviewElement_renderSide).call(this, 'incoming', __classPrivateFieldGet(this, _uSyncContentTypePreviewElement_sides, "f").incoming)}
64
+ </div>
65
+ `;
66
+ }
67
+ };
68
+ _uSyncContentTypePreviewElement_sides = new WeakMap();
69
+ _uSyncContentTypePreviewElement_compositions = new WeakMap();
70
+ _uSyncContentTypePreviewElement_dataTypes = new WeakMap();
71
+ _uSyncContentTypePreviewElement_newDataTypes = new WeakMap();
72
+ _uSyncContentTypePreviewElement_newCompositions = new WeakMap();
73
+ _uSyncContentTypePreviewElement_diff = new WeakMap();
74
+ _uSyncContentTypePreviewElement_instances = new WeakSet();
75
+ _uSyncContentTypePreviewElement_renderSide = function _uSyncContentTypePreviewElement_renderSide(side, type) {
76
+ const headline = side === 'current'
77
+ ? this.localize.termOrDefault('uSync_previewCurrent', 'Current (this site)')
78
+ : this.localize.termOrDefault('uSync_previewIncoming', 'Incoming (uSync files)');
79
+ if (!type) {
80
+ return html `<div class="side">
81
+ <h4 class="side-headline">${headline}</h4>
82
+ <uui-box class="info"><p class="empty">${__classPrivateFieldGet(this, _uSyncContentTypePreviewElement_instances, "m", _uSyncContentTypePreviewElement_missingMessage).call(this, side)}</p></uui-box>
83
+ </div>`;
84
+ }
85
+ const tabs = buildContentTypeLayout(type, __classPrivateFieldGet(this, _uSyncContentTypePreviewElement_compositions, "f"));
86
+ const active = tabs.find((t) => t.name === this._activeTab) ?? tabs[0];
87
+ return html `
88
+ <div class="side">
89
+ <h4 class="side-headline">${headline}</h4>
90
+ ${__classPrivateFieldGet(this, _uSyncContentTypePreviewElement_instances, "m", _uSyncContentTypePreviewElement_renderInfo).call(this, type)}
91
+ ${tabs.length > 1 || (tabs.length === 1 && tabs[0].name)
92
+ ? html `<uui-tab-group>
93
+ ${tabs.map((tab) => __classPrivateFieldGet(this, _uSyncContentTypePreviewElement_instances, "m", _uSyncContentTypePreviewElement_renderTabButton).call(this, tab, tab === active))}
94
+ </uui-tab-group>`
95
+ : html `<div></div>`}
96
+ ${active
97
+ ? __classPrivateFieldGet(this, _uSyncContentTypePreviewElement_instances, "m", _uSyncContentTypePreviewElement_renderTab).call(this, active)
98
+ : html `<uui-box>
99
+ <p class="empty">
100
+ ${this.localize.termOrDefault('uSync_previewNoProperties', 'This type has no properties')}
101
+ </p>
102
+ </uui-box>`}
103
+ </div>
104
+ `;
105
+ };
106
+ _uSyncContentTypePreviewElement_missingMessage = function _uSyncContentTypePreviewElement_missingMessage(side) {
107
+ if (side === 'current') {
108
+ return this.localize.termOrDefault('uSync_previewNotInSite', 'This item does not exist in the site yet');
109
+ }
110
+ return this.preview?.isDelete
111
+ ? this.localize.termOrDefault('uSync_previewDeleted', 'This item will be deleted or renamed by the import')
112
+ : this.localize.termOrDefault('uSync_previewFailed', 'The incoming item could not be built for the preview');
113
+ };
114
+ _uSyncContentTypePreviewElement_renderInfo = function _uSyncContentTypePreviewElement_renderInfo(type) {
115
+ const changed = (field) => ({
116
+ changed: __classPrivateFieldGet(this, _uSyncContentTypePreviewElement_diff, "f")?.fields.has(field) ?? false,
117
+ });
118
+ const [kindKey, kindDefault] = KIND_LABELS[this.preview?.entityType ?? ''] ?? [
119
+ '',
120
+ '',
121
+ ];
122
+ const compositions = compositionIds(type).map((id) => ({
123
+ name: __classPrivateFieldGet(this, _uSyncContentTypePreviewElement_compositions, "f").get(id)?.name ?? id,
124
+ isNew: __classPrivateFieldGet(this, _uSyncContentTypePreviewElement_newCompositions, "f").has(id),
125
+ }));
126
+ return html `
127
+ <uui-box class="info">
128
+ <div slot="headline" class="headline">
129
+ <umb-icon
130
+ name=${type.icon.split(' ')[0]}
131
+ class=${classMap(changed('icon'))}></umb-icon>
132
+ <span class=${classMap(changed('name'))}>${type.name}</span>
133
+ <code class=${classMap(changed('alias'))}>${type.alias}</code>
134
+ </div>
135
+ <div class="info-body">
136
+ <div class="tags">
137
+ <uui-tag look="secondary" class=${classMap(changed('isElement'))}>
138
+ ${type.isElement
139
+ ? this.localize.termOrDefault('uSync_previewElementType', 'Element type')
140
+ : this.localize.termOrDefault(kindKey, kindDefault)}
141
+ </uui-tag>
142
+ ${type.allowedAsRoot
143
+ ? html `<uui-tag
144
+ look="secondary"
145
+ class=${classMap(changed('allowedAsRoot'))}>
146
+ ${this.localize.termOrDefault('uSync_previewAllowedAtRoot', 'Allowed at root')}
147
+ </uui-tag>`
148
+ : nothing}
149
+ ${type.variesByCulture
150
+ ? html `<uui-tag
151
+ look="secondary"
152
+ class=${classMap(changed('variesByCulture'))}>
153
+ ${this.localize.termOrDefault('uSync_previewVariesByCulture', 'Varies by culture')}
154
+ </uui-tag>`
155
+ : nothing}
156
+ ${type.variesBySegment
157
+ ? html `<uui-tag
158
+ look="secondary"
159
+ class=${classMap(changed('variesBySegment'))}>
160
+ ${this.localize.termOrDefault('uSync_previewVariesBySegment', 'Varies by segment')}
161
+ </uui-tag>`
162
+ : nothing}
163
+ </div>
164
+ ${type.description
165
+ ? html `<p
166
+ class=${classMap({ description: true, ...changed('description') })}>
167
+ ${type.description}
168
+ </p>`
169
+ : nothing}
170
+ ${compositions.length
171
+ ? html `<dl class="meta">
172
+ <dt>
173
+ ${this.localize.termOrDefault('uSync_previewCompositions', 'Compositions')}
174
+ </dt>
175
+ <dd class=${classMap(changed('compositions'))}>
176
+ ${compositions.map((c) => html `<uui-tag
177
+ look="outline"
178
+ color=${c.isNew ? 'positive' : 'default'}
179
+ >${c.name}${c.isNew
180
+ ? ` (${this.localize.termOrDefault('uSync_previewNew', 'new')})`
181
+ : ''}</uui-tag
182
+ > `)}
183
+ </dd>
184
+ </dl>`
185
+ : nothing}
186
+ </div>
187
+ </uui-box>
188
+ `;
189
+ };
190
+ _uSyncContentTypePreviewElement_renderTabButton = function _uSyncContentTypePreviewElement_renderTabButton(tab, active) {
191
+ const status = __classPrivateFieldGet(this, _uSyncContentTypePreviewElement_instances, "m", _uSyncContentTypePreviewElement_tabStatus).call(this, tab);
192
+ const label = tab.name || this.localize.termOrDefault('uSync_previewGenericTab', 'Generic');
193
+ return html `<uui-tab
194
+ label=${label}
195
+ ?active=${active}
196
+ @click=${() => (this._activeTab = tab.name)}>
197
+ <span class="tab-label">
198
+ ${label}
199
+ ${status ? html `<span class="dot ${status}" title=${status}></span>` : nothing}
200
+ </span>
201
+ </uui-tab>`;
202
+ };
203
+ _uSyncContentTypePreviewElement_tabStatus = function _uSyncContentTypePreviewElement_tabStatus(tab) {
204
+ const own = tab.ids.map((id) => __classPrivateFieldGet(this, _uSyncContentTypePreviewElement_diff, "f")?.containers.get(id)).find(Boolean);
205
+ if (own)
206
+ return own.status;
207
+ const children = [
208
+ ...tab.groups.flatMap((g) => g.ids.map((id) => __classPrivateFieldGet(this, _uSyncContentTypePreviewElement_diff, "f")?.containers.get(id))),
209
+ ...tab.properties.map((p) => __classPrivateFieldGet(this, _uSyncContentTypePreviewElement_diff, "f")?.properties.get(p.property.id)),
210
+ ...tab.groups.flatMap((g) => g.properties.map((p) => __classPrivateFieldGet(this, _uSyncContentTypePreviewElement_diff, "f")?.properties.get(p.property.id))),
211
+ ];
212
+ return children.some(Boolean) ? 'changed' : undefined;
213
+ };
214
+ _uSyncContentTypePreviewElement_renderTab = function _uSyncContentTypePreviewElement_renderTab(tab) {
215
+ // inert rather than readonly: most editors render only their value when
216
+ // readonly, which is empty here, so you wouldn't see the editor at all.
217
+ return html `
218
+ <umb-property-dataset .value=${[]} inert>
219
+ ${tab.properties.length
220
+ ? html `<uui-box
221
+ >${__classPrivateFieldGet(this, _uSyncContentTypePreviewElement_instances, "m", _uSyncContentTypePreviewElement_renderProperties).call(this, tab.properties, __classPrivateFieldGet(this, _uSyncContentTypePreviewElement_instances, "m", _uSyncContentTypePreviewElement_ownStatus).call(this, tab.ids))}</uui-box
222
+ >`
223
+ : nothing}
224
+ ${repeat(tab.groups, (group) => group.name, (group) => {
225
+ const change = group.ids
226
+ .map((id) => __classPrivateFieldGet(this, _uSyncContentTypePreviewElement_diff, "f")?.containers.get(id))
227
+ .find(Boolean);
228
+ return html `<uui-box class=${change?.status ?? ''}>
229
+ <div slot="headline" class="headline">
230
+ ${group.name}
231
+ ${group.inherited ? html `<small class="inherited">inherited</small>` : nothing}
232
+ ${__classPrivateFieldGet(this, _uSyncContentTypePreviewElement_instances, "m", _uSyncContentTypePreviewElement_renderBadge).call(this, change)}
233
+ </div>
234
+ ${group.properties.length
235
+ ? __classPrivateFieldGet(this, _uSyncContentTypePreviewElement_instances, "m", _uSyncContentTypePreviewElement_renderProperties).call(this, group.properties, change?.status ?? __classPrivateFieldGet(this, _uSyncContentTypePreviewElement_instances, "m", _uSyncContentTypePreviewElement_ownStatus).call(this, tab.ids))
236
+ : html `<p class="empty">
237
+ ${this.localize.termOrDefault('uSync_previewNoProperties', 'No properties')}
238
+ </p>`}
239
+ </uui-box>`;
240
+ })}
241
+ </umb-property-dataset>
242
+ `;
243
+ };
244
+ _uSyncContentTypePreviewElement_ownStatus = function _uSyncContentTypePreviewElement_ownStatus(ids) {
245
+ return ids.map((id) => __classPrivateFieldGet(this, _uSyncContentTypePreviewElement_diff, "f")?.containers.get(id)).find(Boolean)?.status;
246
+ };
247
+ _uSyncContentTypePreviewElement_renderProperties = function _uSyncContentTypePreviewElement_renderProperties(properties, parentStatus) {
248
+ const markItems = parentStatus !== 'added' && parentStatus !== 'removed';
249
+ return repeat(properties, (entry) => entry.property.id, ({ property: p, inheritedFrom }) => {
250
+ const change = markItems ? __classPrivateFieldGet(this, _uSyncContentTypePreviewElement_diff, "f")?.properties.get(p.id) : undefined;
251
+ const dataType = __classPrivateFieldGet(this, _uSyncContentTypePreviewElement_dataTypes, "f").get(p.dataType.id);
252
+ return html `<div class="property ${change?.status ?? ''}">
253
+ <div class="property-meta">
254
+ <code>${p.alias}</code>
255
+ <span>${dataType?.name ?? p.dataType.id}</span>
256
+ ${__classPrivateFieldGet(this, _uSyncContentTypePreviewElement_newDataTypes, "f").has(p.dataType.id)
257
+ ? html `<uui-tag size="s" look="outline" color="positive"
258
+ >${this.localize.termOrDefault('uSync_previewNewDataType', 'new data type')}</uui-tag
259
+ >`
260
+ : nothing}
261
+ ${inheritedFrom ? html `<small class="inherited">from ${inheritedFrom}</small>` : nothing}
262
+ ${p.variesByCulture ? html `<small>varies by culture</small>` : nothing}
263
+ ${p.variesBySegment ? html `<small>varies by segment</small>` : nothing}
264
+ ${__classPrivateFieldGet(this, _uSyncContentTypePreviewElement_instances, "m", _uSyncContentTypePreviewElement_renderBadge).call(this, change)}
265
+ </div>
266
+ ${dataType
267
+ ? html `<umb-property
268
+ .alias=${p.alias}
269
+ .label=${p.name}
270
+ .description=${p.description ?? ''}
271
+ .propertyEditorUiAlias=${dataType.editorUiAlias}
272
+ .config=${dataType.values}
273
+ .appearance=${p.appearance}
274
+ .validation=${p.validation}></umb-property>`
275
+ : html `<p class="empty">
276
+ ${p.name} -
277
+ ${this.localize.termOrDefault('uSync_previewMissingDataType', 'the data type for this property is not in the site yet')}
278
+ </p>`}
279
+ </div>`;
280
+ });
281
+ };
282
+ _uSyncContentTypePreviewElement_renderBadge = function _uSyncContentTypePreviewElement_renderBadge(change) {
283
+ if (!change)
284
+ return nothing;
285
+ const color = change.status === 'added'
286
+ ? 'positive'
287
+ : change.status === 'removed'
288
+ ? 'danger'
289
+ : 'warning';
290
+ return html `<uui-tag size="s" color=${color} title=${change.fields.join(', ')}
291
+ >${change.status}</uui-tag
292
+ >`;
293
+ };
294
+ uSyncContentTypePreviewElement.styles = css `
295
+ :host {
296
+ display: block;
297
+ container-type: inline-size;
298
+ }
299
+
300
+ /* the two sides share rows (headline, info, tabs, content), so the
301
+ tab bars and groups line up even when the info boxes differ. */
302
+ .sides {
303
+ display: grid;
304
+ grid-template-columns: 1fr 1fr;
305
+ grid-template-rows: auto auto auto 1fr;
306
+ gap: var(--uui-size-space-4) var(--uui-size-space-5);
307
+ }
308
+
309
+ .side {
310
+ display: grid;
311
+ grid-row: span 4;
312
+ grid-template-rows: subgrid;
313
+ align-items: start;
314
+ min-width: 0;
315
+ }
316
+
317
+ /* info boxes match heights across the sides (but a lone "not here" box doesn't stretch). */
318
+ .side > .info:not(:last-child) {
319
+ align-self: stretch;
320
+ }
321
+
322
+ @container (max-width: 760px) {
323
+ .sides {
324
+ grid-template-columns: 1fr;
325
+ grid-template-rows: none;
326
+ row-gap: var(--uui-size-layout-1);
327
+ }
328
+
329
+ .side {
330
+ display: flex;
331
+ flex-direction: column;
332
+ align-items: stretch;
333
+ gap: var(--uui-size-space-4);
334
+ grid-row: auto;
335
+ }
336
+ }
337
+
338
+ umb-property-dataset {
339
+ display: flex;
340
+ flex-direction: column;
341
+ gap: var(--uui-size-space-4);
342
+ min-width: 0;
343
+ }
344
+
345
+ .side-headline {
346
+ margin: 0;
347
+ font-size: var(--uui-type-small-size);
348
+ text-transform: uppercase;
349
+ letter-spacing: 0.04em;
350
+ color: var(--uui-color-text-alt);
351
+ }
352
+
353
+ .headline {
354
+ display: flex;
355
+ align-items: center;
356
+ flex-wrap: wrap;
357
+ gap: var(--uui-size-space-2) var(--uui-size-space-3);
358
+ }
359
+
360
+ .headline code {
361
+ font-size: var(--uui-type-small-size);
362
+ color: var(--uui-color-text-alt);
363
+ }
364
+
365
+ .info-body {
366
+ display: flex;
367
+ flex-direction: column;
368
+ gap: var(--uui-size-space-4);
369
+ }
370
+
371
+ .tags {
372
+ display: flex;
373
+ flex-wrap: wrap;
374
+ gap: var(--uui-size-space-2);
375
+ }
376
+
377
+ .description {
378
+ margin: 0;
379
+ }
380
+
381
+ .meta {
382
+ display: grid;
383
+ grid-template-columns: max-content 1fr;
384
+ align-items: center;
385
+ gap: var(--uui-size-space-2) var(--uui-size-space-5);
386
+ margin: 0;
387
+ }
388
+
389
+ .meta dt {
390
+ font-weight: 700;
391
+ }
392
+
393
+ .meta dd {
394
+ display: flex;
395
+ flex-wrap: wrap;
396
+ gap: var(--uui-size-space-2);
397
+ margin: 0;
398
+ }
399
+
400
+ /* a changed field gets a soft highlight, spread with a shadow so the text doesn't move. */
401
+ .changed:not(.property):not(uui-box) {
402
+ background: color-mix(in srgb, var(--uui-color-warning) 35%, transparent);
403
+ border-radius: var(--uui-border-radius);
404
+ box-shadow: 0 0 0 var(--uui-size-space-1)
405
+ color-mix(in srgb, var(--uui-color-warning) 35%, transparent);
406
+ }
407
+
408
+ uui-tab-group {
409
+ --uui-tab-divider: var(--uui-color-border);
410
+ border-bottom: 1px solid var(--uui-color-border);
411
+ }
412
+
413
+ .tab-label {
414
+ display: inline-flex;
415
+ align-items: center;
416
+ gap: var(--uui-size-space-2);
417
+ white-space: nowrap;
418
+ }
419
+
420
+ .dot {
421
+ display: inline-block;
422
+ width: 8px;
423
+ height: 8px;
424
+ border-radius: 50%;
425
+ }
426
+
427
+ .dot.added {
428
+ background: var(--uui-color-positive);
429
+ }
430
+
431
+ .dot.removed {
432
+ background: var(--uui-color-danger);
433
+ }
434
+
435
+ .dot.changed {
436
+ background: var(--uui-color-warning);
437
+ }
438
+
439
+ uui-box.added {
440
+ border-left: 3px solid var(--uui-color-positive);
441
+ }
442
+
443
+ uui-box.removed {
444
+ border-left: 3px solid var(--uui-color-danger);
445
+ }
446
+
447
+ uui-box.changed {
448
+ border-left: 3px solid var(--uui-color-warning);
449
+ }
450
+
451
+ /* marked with an inset bar rather than a border, so the content doesn't shift. */
452
+ .property.added {
453
+ box-shadow: inset 3px 0 0 var(--uui-color-positive);
454
+ background: color-mix(in srgb, var(--uui-color-positive) 6%, transparent);
455
+ }
456
+
457
+ .property.removed {
458
+ box-shadow: inset 3px 0 0 var(--uui-color-danger);
459
+ background: color-mix(in srgb, var(--uui-color-danger) 6%, transparent);
460
+ }
461
+
462
+ .property.changed {
463
+ box-shadow: inset 3px 0 0 var(--uui-color-warning);
464
+ background: color-mix(in srgb, var(--uui-color-warning) 10%, transparent);
465
+ }
466
+
467
+ /* properties run edge to edge in their box, like the backoffice editor. */
468
+ .property {
469
+ padding: var(--uui-size-space-4) var(--uui-size-space-5) 0;
470
+ margin: 0 calc(-1 * var(--uui-size-space-5));
471
+ }
472
+
473
+ .property:first-child,
474
+ .headline + .property {
475
+ margin-top: calc(-1 * var(--uui-size-space-5));
476
+ }
477
+
478
+ .property:last-child {
479
+ margin-bottom: calc(-1 * var(--uui-size-space-5));
480
+ }
481
+
482
+ .property + .property {
483
+ border-top: 1px solid var(--uui-color-divider);
484
+ }
485
+
486
+ /* umb-property pads itself for a full workspace, tighten it up here. */
487
+ umb-property {
488
+ --uui-size-layout-1: var(--uui-size-space-4);
489
+ }
490
+
491
+ .property-meta {
492
+ display: flex;
493
+ flex-wrap: wrap;
494
+ align-items: center;
495
+ gap: var(--uui-size-space-2) var(--uui-size-space-3);
496
+ font-size: var(--uui-type-small-size);
497
+ color: var(--uui-color-text-alt);
498
+ }
499
+
500
+ .property-meta code {
501
+ color: var(--uui-color-text);
502
+ }
503
+
504
+ .inherited {
505
+ font-style: italic;
506
+ color: var(--uui-color-text-alt);
507
+ }
508
+
509
+ .empty {
510
+ margin: 0;
511
+ color: var(--uui-color-text-alt);
512
+ }
513
+ `;
514
+ __decorate([
515
+ property({ type: Object })
516
+ ], uSyncContentTypePreviewElement.prototype, "preview", void 0);
517
+ __decorate([
518
+ state()
519
+ ], uSyncContentTypePreviewElement.prototype, "_activeTab", void 0);
520
+ uSyncContentTypePreviewElement = __decorate([
521
+ customElement('usync-content-type-preview')
522
+ ], uSyncContentTypePreviewElement);
523
+ export { uSyncContentTypePreviewElement };
524
+ function getSides(preview) {
525
+ switch (preview.entityType) {
526
+ case 'document-type':
527
+ return {
528
+ current: preview.currentDocumentType ?? undefined,
529
+ incoming: preview.incomingDocumentType ?? undefined,
530
+ compositions: preview.compositionDocumentTypes,
531
+ };
532
+ case 'media-type':
533
+ return {
534
+ current: preview.currentMediaType ?? undefined,
535
+ incoming: preview.incomingMediaType ?? undefined,
536
+ compositions: preview.compositionMediaTypes,
537
+ };
538
+ case 'member-type':
539
+ return {
540
+ current: preview.currentMemberType ?? undefined,
541
+ incoming: preview.incomingMemberType ?? undefined,
542
+ compositions: preview.compositionMemberTypes,
543
+ };
544
+ default:
545
+ return { compositions: [] };
546
+ }
547
+ }
548
+ export default uSyncContentTypePreviewElement;
@@ -0,0 +1,21 @@
1
+ import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element';
2
+ import { nothing } from '@umbraco-cms/backoffice/external/lit';
3
+ import '@umbraco-cms/backoffice/components';
4
+ import type { SyncItemPreviewResponse } from '../api';
5
+ /**
6
+ * Shows the current and incoming versions of a data type side by side,
7
+ * rendered with the real property editor, so you can see what an import
8
+ * will do before running it.
9
+ */
10
+ export declare class uSyncDataTypePreviewElement extends UmbLitElement {
11
+ #private;
12
+ preview?: SyncItemPreviewResponse;
13
+ render(): typeof nothing | import("lit-html").TemplateResult<1>;
14
+ static styles: import("lit").CSSResult;
15
+ }
16
+ export default uSyncDataTypePreviewElement;
17
+ declare global {
18
+ interface HTMLElementTagNameMap {
19
+ 'usync-data-type-preview': uSyncDataTypePreviewElement;
20
+ }
21
+ }