@micacms/editor-ui 0.6.0-rc.2 → 0.7.0
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/THIRD_PARTY_NOTICES.txt +39 -39
- package/dist/assets/ChangeComparison.vue_vue_type_script_setup_true_lang-CN7QLLgS.js +2 -0
- package/dist/assets/ChangeComparison.vue_vue_type_script_setup_true_lang-CN7QLLgS.js.map +1 -0
- package/dist/assets/ChangesView-Dp79M2fs.js +7 -0
- package/dist/assets/ChangesView-Dp79M2fs.js.map +1 -0
- package/dist/assets/CollectionView-D9VSxjMl.js +2 -0
- package/dist/assets/CollectionView-D9VSxjMl.js.map +1 -0
- package/dist/assets/ConfirmDialog.vue_vue_type_script_setup_true_lang-CWanooQO.js +2 -0
- package/dist/assets/{ConfirmDialog.vue_vue_type_script_setup_true_lang-DaYRluZs.js.map → ConfirmDialog.vue_vue_type_script_setup_true_lang-CWanooQO.js.map} +1 -1
- package/dist/assets/DashboardView-BPyKR5J3.js +2 -0
- package/dist/assets/DashboardView-BPyKR5J3.js.map +1 -0
- package/dist/assets/DeveloperDetails.vue_vue_type_script_setup_true_lang-Bp-D1Kf1.js +2 -0
- package/dist/assets/DeveloperDetails.vue_vue_type_script_setup_true_lang-Bp-D1Kf1.js.map +1 -0
- package/dist/assets/EntryView-qKGxmd49.js +2 -0
- package/dist/assets/EntryView-qKGxmd49.js.map +1 -0
- package/dist/assets/{LoginView-BMcE8J5l.js → LoginView-C4FlLD5n.js} +2 -2
- package/dist/assets/{LoginView-BMcE8J5l.js.map → LoginView-C4FlLD5n.js.map} +1 -1
- package/dist/assets/MediaView-C0FP8j4J.js +2 -0
- package/dist/assets/MediaView-C0FP8j4J.js.map +1 -0
- package/dist/assets/NotFoundView-BXXcZp2U.js +2 -0
- package/dist/assets/{NotFoundView-BT-zH9Ky.js.map → NotFoundView-BXXcZp2U.js.map} +1 -1
- package/dist/assets/ObjectField-BFAmw-Bf.js +2 -0
- package/dist/assets/{ObjectField-BHoHeIbi.js.map → ObjectField-BFAmw-Bf.js.map} +1 -1
- package/dist/assets/PageHeader.vue_vue_type_script_setup_true_lang-YO9Lox87.js +7 -0
- package/dist/assets/PageHeader.vue_vue_type_script_setup_true_lang-YO9Lox87.js.map +1 -0
- package/dist/assets/ReadOnlyNotice.vue_vue_type_script_setup_true_lang-83XB7mFB.js +7 -0
- package/dist/assets/ReadOnlyNotice.vue_vue_type_script_setup_true_lang-83XB7mFB.js.map +1 -0
- package/dist/assets/RepeaterField-BA5zPM54.js +12 -0
- package/dist/assets/RepeaterField-BA5zPM54.js.map +1 -0
- package/dist/assets/SingletonView-rtsXuJ8F.js +2 -0
- package/dist/assets/SingletonView-rtsXuJ8F.js.map +1 -0
- package/dist/assets/{SystemView-AMhNiUgh.css → SystemView-BBJFvsrr.css} +1 -1
- package/dist/assets/SystemView-CBTTQvCI.js +3 -0
- package/dist/assets/SystemView-CBTTQvCI.js.map +1 -0
- package/dist/assets/arrow-right-CVMfMI8t.js +7 -0
- package/dist/assets/arrow-right-CVMfMI8t.js.map +1 -0
- package/dist/assets/arrow-up-D5CzEqmi.js +12 -0
- package/dist/assets/arrow-up-D5CzEqmi.js.map +1 -0
- package/dist/assets/chevron-down-Cn8dXqbz.js +7 -0
- package/dist/assets/chevron-down-Cn8dXqbz.js.map +1 -0
- package/dist/assets/format-CAimH9FV.js +2 -0
- package/dist/assets/format-CAimH9FV.js.map +1 -0
- package/dist/assets/index-C-WfCDd6.js +118 -0
- package/dist/assets/index-C-WfCDd6.js.map +1 -0
- package/dist/assets/index-CBGzi5Bh.css +1 -0
- package/dist/assets/useUnsavedChanges-CErjJu5S.js +201 -0
- package/dist/assets/useUnsavedChanges-CErjJu5S.js.map +1 -0
- package/dist/index.html +2 -2
- package/package.json +2 -2
- package/dist/assets/ChangesView-B37VddpZ.js +0 -7
- package/dist/assets/ChangesView-B37VddpZ.js.map +0 -1
- package/dist/assets/CollectionView-DMmV03BG.js +0 -2
- package/dist/assets/CollectionView-DMmV03BG.js.map +0 -1
- package/dist/assets/ConfirmDialog.vue_vue_type_script_setup_true_lang-DaYRluZs.js +0 -2
- package/dist/assets/DashboardView-CslqN0A1.js +0 -2
- package/dist/assets/DashboardView-CslqN0A1.js.map +0 -1
- package/dist/assets/EntryView-CpappvZe.js +0 -2
- package/dist/assets/EntryView-CpappvZe.js.map +0 -1
- package/dist/assets/MediaView-CN7asOkJ.js +0 -2
- package/dist/assets/MediaView-CN7asOkJ.js.map +0 -1
- package/dist/assets/NotFoundView-BT-zH9Ky.js +0 -2
- package/dist/assets/ObjectField-BHoHeIbi.js +0 -2
- package/dist/assets/PageHeader.vue_vue_type_script_setup_true_lang-C3ip7WDx.js +0 -7
- package/dist/assets/PageHeader.vue_vue_type_script_setup_true_lang-C3ip7WDx.js.map +0 -1
- package/dist/assets/ReadOnlyNotice.vue_vue_type_script_setup_true_lang-B276O7Z8.js +0 -7
- package/dist/assets/ReadOnlyNotice.vue_vue_type_script_setup_true_lang-B276O7Z8.js.map +0 -1
- package/dist/assets/RepeaterField-CgFHog9l.js +0 -12
- package/dist/assets/RepeaterField-CgFHog9l.js.map +0 -1
- package/dist/assets/SingletonView-BHtlstaz.js +0 -2
- package/dist/assets/SingletonView-BHtlstaz.js.map +0 -1
- package/dist/assets/SystemView-S-i2v0ly.js +0 -3
- package/dist/assets/SystemView-S-i2v0ly.js.map +0 -1
- package/dist/assets/arrow-right-DMhFU3-4.js +0 -7
- package/dist/assets/arrow-right-DMhFU3-4.js.map +0 -1
- package/dist/assets/arrow-up-DeNDcETx.js +0 -12
- package/dist/assets/arrow-up-DeNDcETx.js.map +0 -1
- package/dist/assets/chevron-down-D4nmRhPt.js +0 -7
- package/dist/assets/chevron-down-D4nmRhPt.js.map +0 -1
- package/dist/assets/format-CW--BYT5.js +0 -2
- package/dist/assets/format-CW--BYT5.js.map +0 -1
- package/dist/assets/index-BBFDilFH.js +0 -118
- package/dist/assets/index-BBFDilFH.js.map +0 -1
- package/dist/assets/index-BSYHt4Oa.css +0 -1
- package/dist/assets/useField-DcIPoU4r.js +0 -2
- package/dist/assets/useField-DcIPoU4r.js.map +0 -1
- package/dist/assets/useUnsavedChanges-C4vyxObi.js +0 -145
- package/dist/assets/useUnsavedChanges-C4vyxObi.js.map +0 -1
|
@@ -3,7 +3,7 @@ The Inter font is under the SIL Open Font License: fonts/InterVariable-LICENSE.t
|
|
|
3
3
|
This product includes the following third-party software.
|
|
4
4
|
|
|
5
5
|
------------------------------------------------------------------------------
|
|
6
|
-
@lucide/vue@1.
|
|
6
|
+
@lucide/vue@1.55.0 (ISC)
|
|
7
7
|
------------------------------------------------------------------------------
|
|
8
8
|
|
|
9
9
|
ISC License
|
|
@@ -51,7 +51,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
|
51
51
|
SOFTWARE.
|
|
52
52
|
|
|
53
53
|
------------------------------------------------------------------------------
|
|
54
|
-
@markdoc/markdoc@0.5.
|
|
54
|
+
@markdoc/markdoc@0.5.10 (MIT)
|
|
55
55
|
------------------------------------------------------------------------------
|
|
56
56
|
|
|
57
57
|
The MIT License
|
|
@@ -102,7 +102,7 @@ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
|
102
102
|
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
103
103
|
|
|
104
104
|
------------------------------------------------------------------------------
|
|
105
|
-
@tiptap/core@2.27.
|
|
105
|
+
@tiptap/core@2.27.3 (MIT)
|
|
106
106
|
------------------------------------------------------------------------------
|
|
107
107
|
|
|
108
108
|
(No license file in the package; the MIT text, with the author from its package.json.)
|
|
@@ -130,7 +130,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
|
130
130
|
SOFTWARE.
|
|
131
131
|
|
|
132
132
|
------------------------------------------------------------------------------
|
|
133
|
-
@tiptap/extension-blockquote@2.27.
|
|
133
|
+
@tiptap/extension-blockquote@2.27.3 (MIT)
|
|
134
134
|
------------------------------------------------------------------------------
|
|
135
135
|
|
|
136
136
|
(No license file in the package; the MIT text, with the author from its package.json.)
|
|
@@ -158,7 +158,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
|
158
158
|
SOFTWARE.
|
|
159
159
|
|
|
160
160
|
------------------------------------------------------------------------------
|
|
161
|
-
@tiptap/extension-bold@2.27.
|
|
161
|
+
@tiptap/extension-bold@2.27.3 (MIT)
|
|
162
162
|
------------------------------------------------------------------------------
|
|
163
163
|
|
|
164
164
|
(No license file in the package; the MIT text, with the author from its package.json.)
|
|
@@ -186,7 +186,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
|
186
186
|
SOFTWARE.
|
|
187
187
|
|
|
188
188
|
------------------------------------------------------------------------------
|
|
189
|
-
@tiptap/extension-bubble-menu@2.27.
|
|
189
|
+
@tiptap/extension-bubble-menu@2.27.3 (MIT)
|
|
190
190
|
------------------------------------------------------------------------------
|
|
191
191
|
|
|
192
192
|
(No license file in the package; the MIT text, with the author from its package.json.)
|
|
@@ -214,7 +214,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
|
214
214
|
SOFTWARE.
|
|
215
215
|
|
|
216
216
|
------------------------------------------------------------------------------
|
|
217
|
-
@tiptap/extension-bullet-list@2.27.
|
|
217
|
+
@tiptap/extension-bullet-list@2.27.3 (MIT)
|
|
218
218
|
------------------------------------------------------------------------------
|
|
219
219
|
|
|
220
220
|
(No license file in the package; the MIT text, with the author from its package.json.)
|
|
@@ -242,7 +242,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
|
242
242
|
SOFTWARE.
|
|
243
243
|
|
|
244
244
|
------------------------------------------------------------------------------
|
|
245
|
-
@tiptap/extension-code@2.27.
|
|
245
|
+
@tiptap/extension-code@2.27.3 (MIT)
|
|
246
246
|
------------------------------------------------------------------------------
|
|
247
247
|
|
|
248
248
|
(No license file in the package; the MIT text, with the author from its package.json.)
|
|
@@ -270,7 +270,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
|
270
270
|
SOFTWARE.
|
|
271
271
|
|
|
272
272
|
------------------------------------------------------------------------------
|
|
273
|
-
@tiptap/extension-code-block@2.27.
|
|
273
|
+
@tiptap/extension-code-block@2.27.3 (MIT)
|
|
274
274
|
------------------------------------------------------------------------------
|
|
275
275
|
|
|
276
276
|
(No license file in the package; the MIT text, with the author from its package.json.)
|
|
@@ -298,7 +298,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
|
298
298
|
SOFTWARE.
|
|
299
299
|
|
|
300
300
|
------------------------------------------------------------------------------
|
|
301
|
-
@tiptap/extension-document@2.27.
|
|
301
|
+
@tiptap/extension-document@2.27.3 (MIT)
|
|
302
302
|
------------------------------------------------------------------------------
|
|
303
303
|
|
|
304
304
|
(No license file in the package; the MIT text, with the author from its package.json.)
|
|
@@ -326,7 +326,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
|
326
326
|
SOFTWARE.
|
|
327
327
|
|
|
328
328
|
------------------------------------------------------------------------------
|
|
329
|
-
@tiptap/extension-dropcursor@2.27.
|
|
329
|
+
@tiptap/extension-dropcursor@2.27.3 (MIT)
|
|
330
330
|
------------------------------------------------------------------------------
|
|
331
331
|
|
|
332
332
|
(No license file in the package; the MIT text, with the author from its package.json.)
|
|
@@ -354,7 +354,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
|
354
354
|
SOFTWARE.
|
|
355
355
|
|
|
356
356
|
------------------------------------------------------------------------------
|
|
357
|
-
@tiptap/extension-floating-menu@2.27.
|
|
357
|
+
@tiptap/extension-floating-menu@2.27.3 (MIT)
|
|
358
358
|
------------------------------------------------------------------------------
|
|
359
359
|
|
|
360
360
|
(No license file in the package; the MIT text, with the author from its package.json.)
|
|
@@ -382,7 +382,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
|
382
382
|
SOFTWARE.
|
|
383
383
|
|
|
384
384
|
------------------------------------------------------------------------------
|
|
385
|
-
@tiptap/extension-gapcursor@2.27.
|
|
385
|
+
@tiptap/extension-gapcursor@2.27.3 (MIT)
|
|
386
386
|
------------------------------------------------------------------------------
|
|
387
387
|
|
|
388
388
|
(No license file in the package; the MIT text, with the author from its package.json.)
|
|
@@ -410,7 +410,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
|
410
410
|
SOFTWARE.
|
|
411
411
|
|
|
412
412
|
------------------------------------------------------------------------------
|
|
413
|
-
@tiptap/extension-hard-break@2.27.
|
|
413
|
+
@tiptap/extension-hard-break@2.27.3 (MIT)
|
|
414
414
|
------------------------------------------------------------------------------
|
|
415
415
|
|
|
416
416
|
(No license file in the package; the MIT text, with the author from its package.json.)
|
|
@@ -438,7 +438,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
|
438
438
|
SOFTWARE.
|
|
439
439
|
|
|
440
440
|
------------------------------------------------------------------------------
|
|
441
|
-
@tiptap/extension-heading@2.27.
|
|
441
|
+
@tiptap/extension-heading@2.27.3 (MIT)
|
|
442
442
|
------------------------------------------------------------------------------
|
|
443
443
|
|
|
444
444
|
(No license file in the package; the MIT text, with the author from its package.json.)
|
|
@@ -466,7 +466,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
|
466
466
|
SOFTWARE.
|
|
467
467
|
|
|
468
468
|
------------------------------------------------------------------------------
|
|
469
|
-
@tiptap/extension-history@2.27.
|
|
469
|
+
@tiptap/extension-history@2.27.3 (MIT)
|
|
470
470
|
------------------------------------------------------------------------------
|
|
471
471
|
|
|
472
472
|
(No license file in the package; the MIT text, with the author from its package.json.)
|
|
@@ -494,7 +494,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
|
494
494
|
SOFTWARE.
|
|
495
495
|
|
|
496
496
|
------------------------------------------------------------------------------
|
|
497
|
-
@tiptap/extension-horizontal-rule@2.27.
|
|
497
|
+
@tiptap/extension-horizontal-rule@2.27.3 (MIT)
|
|
498
498
|
------------------------------------------------------------------------------
|
|
499
499
|
|
|
500
500
|
(No license file in the package; the MIT text, with the author from its package.json.)
|
|
@@ -522,7 +522,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
|
522
522
|
SOFTWARE.
|
|
523
523
|
|
|
524
524
|
------------------------------------------------------------------------------
|
|
525
|
-
@tiptap/extension-italic@2.27.
|
|
525
|
+
@tiptap/extension-italic@2.27.3 (MIT)
|
|
526
526
|
------------------------------------------------------------------------------
|
|
527
527
|
|
|
528
528
|
(No license file in the package; the MIT text, with the author from its package.json.)
|
|
@@ -550,7 +550,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
|
550
550
|
SOFTWARE.
|
|
551
551
|
|
|
552
552
|
------------------------------------------------------------------------------
|
|
553
|
-
@tiptap/extension-link@2.27.
|
|
553
|
+
@tiptap/extension-link@2.27.3 (MIT)
|
|
554
554
|
------------------------------------------------------------------------------
|
|
555
555
|
|
|
556
556
|
(No license file in the package; the MIT text, with the author from its package.json.)
|
|
@@ -578,7 +578,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
|
578
578
|
SOFTWARE.
|
|
579
579
|
|
|
580
580
|
------------------------------------------------------------------------------
|
|
581
|
-
@tiptap/extension-list-item@2.27.
|
|
581
|
+
@tiptap/extension-list-item@2.27.3 (MIT)
|
|
582
582
|
------------------------------------------------------------------------------
|
|
583
583
|
|
|
584
584
|
(No license file in the package; the MIT text, with the author from its package.json.)
|
|
@@ -606,7 +606,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
|
606
606
|
SOFTWARE.
|
|
607
607
|
|
|
608
608
|
------------------------------------------------------------------------------
|
|
609
|
-
@tiptap/extension-ordered-list@2.27.
|
|
609
|
+
@tiptap/extension-ordered-list@2.27.3 (MIT)
|
|
610
610
|
------------------------------------------------------------------------------
|
|
611
611
|
|
|
612
612
|
(No license file in the package; the MIT text, with the author from its package.json.)
|
|
@@ -634,7 +634,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
|
634
634
|
SOFTWARE.
|
|
635
635
|
|
|
636
636
|
------------------------------------------------------------------------------
|
|
637
|
-
@tiptap/extension-paragraph@2.27.
|
|
637
|
+
@tiptap/extension-paragraph@2.27.3 (MIT)
|
|
638
638
|
------------------------------------------------------------------------------
|
|
639
639
|
|
|
640
640
|
(No license file in the package; the MIT text, with the author from its package.json.)
|
|
@@ -662,7 +662,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
|
662
662
|
SOFTWARE.
|
|
663
663
|
|
|
664
664
|
------------------------------------------------------------------------------
|
|
665
|
-
@tiptap/extension-strike@2.27.
|
|
665
|
+
@tiptap/extension-strike@2.27.3 (MIT)
|
|
666
666
|
------------------------------------------------------------------------------
|
|
667
667
|
|
|
668
668
|
(No license file in the package; the MIT text, with the author from its package.json.)
|
|
@@ -690,7 +690,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
|
690
690
|
SOFTWARE.
|
|
691
691
|
|
|
692
692
|
------------------------------------------------------------------------------
|
|
693
|
-
@tiptap/extension-text@2.27.
|
|
693
|
+
@tiptap/extension-text@2.27.3 (MIT)
|
|
694
694
|
------------------------------------------------------------------------------
|
|
695
695
|
|
|
696
696
|
(No license file in the package; the MIT text, with the author from its package.json.)
|
|
@@ -718,7 +718,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
|
718
718
|
SOFTWARE.
|
|
719
719
|
|
|
720
720
|
------------------------------------------------------------------------------
|
|
721
|
-
@tiptap/pm@2.27.
|
|
721
|
+
@tiptap/pm@2.27.3 (MIT)
|
|
722
722
|
------------------------------------------------------------------------------
|
|
723
723
|
|
|
724
724
|
(No license file in the package; the MIT text, with the author from its package.json.)
|
|
@@ -746,7 +746,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
|
746
746
|
SOFTWARE.
|
|
747
747
|
|
|
748
748
|
------------------------------------------------------------------------------
|
|
749
|
-
@tiptap/starter-kit@2.27.
|
|
749
|
+
@tiptap/starter-kit@2.27.3 (MIT)
|
|
750
750
|
------------------------------------------------------------------------------
|
|
751
751
|
|
|
752
752
|
(No license file in the package; the MIT text, with the author from its package.json.)
|
|
@@ -774,7 +774,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
|
774
774
|
SOFTWARE.
|
|
775
775
|
|
|
776
776
|
------------------------------------------------------------------------------
|
|
777
|
-
@tiptap/vue-3@2.27.
|
|
777
|
+
@tiptap/vue-3@2.27.3 (MIT)
|
|
778
778
|
------------------------------------------------------------------------------
|
|
779
779
|
|
|
780
780
|
(No license file in the package; the MIT text, with the author from its package.json.)
|
|
@@ -856,7 +856,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
|
856
856
|
SOFTWARE.
|
|
857
857
|
|
|
858
858
|
------------------------------------------------------------------------------
|
|
859
|
-
@vue/reactivity@3.5.
|
|
859
|
+
@vue/reactivity@3.5.43 (MIT)
|
|
860
860
|
------------------------------------------------------------------------------
|
|
861
861
|
|
|
862
862
|
The MIT License (MIT)
|
|
@@ -882,7 +882,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
|
882
882
|
THE SOFTWARE.
|
|
883
883
|
|
|
884
884
|
------------------------------------------------------------------------------
|
|
885
|
-
@vue/runtime-core@3.5.
|
|
885
|
+
@vue/runtime-core@3.5.43 (MIT)
|
|
886
886
|
------------------------------------------------------------------------------
|
|
887
887
|
|
|
888
888
|
The MIT License (MIT)
|
|
@@ -908,7 +908,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
|
908
908
|
THE SOFTWARE.
|
|
909
909
|
|
|
910
910
|
------------------------------------------------------------------------------
|
|
911
|
-
@vue/runtime-dom@3.5.
|
|
911
|
+
@vue/runtime-dom@3.5.43 (MIT)
|
|
912
912
|
------------------------------------------------------------------------------
|
|
913
913
|
|
|
914
914
|
The MIT License (MIT)
|
|
@@ -934,7 +934,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
|
934
934
|
THE SOFTWARE.
|
|
935
935
|
|
|
936
936
|
------------------------------------------------------------------------------
|
|
937
|
-
@vue/shared@3.5.
|
|
937
|
+
@vue/shared@3.5.43 (MIT)
|
|
938
938
|
------------------------------------------------------------------------------
|
|
939
939
|
|
|
940
940
|
The MIT License (MIT)
|
|
@@ -1032,7 +1032,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
|
1032
1032
|
THE SOFTWARE.
|
|
1033
1033
|
|
|
1034
1034
|
------------------------------------------------------------------------------
|
|
1035
|
-
prosemirror-dropcursor@1.8.
|
|
1035
|
+
prosemirror-dropcursor@1.8.4 (MIT)
|
|
1036
1036
|
------------------------------------------------------------------------------
|
|
1037
1037
|
|
|
1038
1038
|
Copyright (C) 2015-2017 by Marijn Haverbeke <marijn@haverbeke.berlin> and others
|
|
@@ -1080,7 +1080,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
|
1080
1080
|
THE SOFTWARE.
|
|
1081
1081
|
|
|
1082
1082
|
------------------------------------------------------------------------------
|
|
1083
|
-
prosemirror-history@1.5.
|
|
1083
|
+
prosemirror-history@1.5.1 (MIT)
|
|
1084
1084
|
------------------------------------------------------------------------------
|
|
1085
1085
|
|
|
1086
1086
|
Copyright (C) 2015-2017 by Marijn Haverbeke <marijn@haverbeke.berlin> and others
|
|
@@ -1128,7 +1128,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
|
1128
1128
|
THE SOFTWARE.
|
|
1129
1129
|
|
|
1130
1130
|
------------------------------------------------------------------------------
|
|
1131
|
-
prosemirror-model@1.25.
|
|
1131
|
+
prosemirror-model@1.25.12 (MIT)
|
|
1132
1132
|
------------------------------------------------------------------------------
|
|
1133
1133
|
|
|
1134
1134
|
Copyright (C) 2015-2017 by Marijn Haverbeke <marijn@haverbeke.berlin> and others
|
|
@@ -1200,7 +1200,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
|
1200
1200
|
THE SOFTWARE.
|
|
1201
1201
|
|
|
1202
1202
|
------------------------------------------------------------------------------
|
|
1203
|
-
prosemirror-transform@1.12.
|
|
1203
|
+
prosemirror-transform@1.12.2 (MIT)
|
|
1204
1204
|
------------------------------------------------------------------------------
|
|
1205
1205
|
|
|
1206
1206
|
Copyright (C) 2015-2017 by Marijn Haverbeke <marijn@haverbeke.berlin> and others
|
|
@@ -1224,7 +1224,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
|
1224
1224
|
THE SOFTWARE.
|
|
1225
1225
|
|
|
1226
1226
|
------------------------------------------------------------------------------
|
|
1227
|
-
prosemirror-view@1.42.
|
|
1227
|
+
prosemirror-view@1.42.6 (MIT)
|
|
1228
1228
|
------------------------------------------------------------------------------
|
|
1229
1229
|
|
|
1230
1230
|
Copyright (C) 2015-2017 by Marijn Haverbeke <marijn@haverbeke.berlin> and others
|
|
@@ -1324,7 +1324,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
|
1324
1324
|
SOFTWARE.
|
|
1325
1325
|
|
|
1326
1326
|
------------------------------------------------------------------------------
|
|
1327
|
-
vite@6.4.
|
|
1327
|
+
vite@6.4.4 (MIT)
|
|
1328
1328
|
------------------------------------------------------------------------------
|
|
1329
1329
|
|
|
1330
1330
|
# Vite core license
|
|
@@ -3735,7 +3735,7 @@ Repository: git+https://github.com/websockets/ws.git
|
|
|
3735
3735
|
> CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
3736
3736
|
|
|
3737
3737
|
------------------------------------------------------------------------------
|
|
3738
|
-
vue@3.5.
|
|
3738
|
+
vue@3.5.43 (MIT)
|
|
3739
3739
|
------------------------------------------------------------------------------
|
|
3740
3740
|
|
|
3741
3741
|
The MIT License (MIT)
|
|
@@ -3811,7 +3811,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
|
3811
3811
|
THE SOFTWARE.
|
|
3812
3812
|
|
|
3813
3813
|
------------------------------------------------------------------------------
|
|
3814
|
-
zod@4.
|
|
3814
|
+
zod@4.6.6 (MIT)
|
|
3815
3815
|
------------------------------------------------------------------------------
|
|
3816
3816
|
|
|
3817
3817
|
MIT License
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{f as m,d as E,c as u,b,a as p,F as h,j as k,g as c,E as x,t as y,e as S}from"./index-C-WfCDd6.js";let I=0;function G(s){const e=`field-${++I}`,n=`${e}-hint`,o=`${e}-error`,l=m(()=>s.field.label??N(V(s.path))),i=m(()=>{var r;const t=(r=s.issues)==null?void 0:r.find(d=>d.path===s.path);return(t==null?void 0:t.message)??null}),a=m(()=>{const t=[s.field.description?n:null,i.value?o:null].filter(Boolean);return t.length>0?t.join(" "):void 0});return{inputId:e,label:l,error:i,describedBy:a,hintId:n,errorId:o}}function V(s){return s.split(".").at(-1)??s}function N(s){const e=s.replace(/([a-z0-9])([A-Z])/g,"$1 $2").replace(/[_-]+/g," ");return e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()}const $={full:"col-span-12",half:"col-span-12 sm:col-span-6",third:"col-span-12 sm:col-span-4"};function K(s){return $[s.width??"full"]??$.full}function L(s,e,n){return j(s,e,n,[],[])}function j(s,e,n,o,l){const i=[];for(const[a,t]of Object.entries(s)){if(t.hidden)continue;const r=e===null?void 0:e[a],d=n===null?void 0:n[a],f=[...o,a],g=[...l,t.label??N(a)];if(t.kind==="object"){i.push(...j(t.fields,e===null?null:_(r)??{},n===null?null:_(d)??{},f,g));continue}if(t.kind==="repeater"){i.push(...O(t.fields,t.itemLabel,B(r),B(d),f,g,{before:e!==null,after:n!==null}));continue}A(r)!==A(d)&&i.push({path:f.join("."),label:g,kind:t.kind,before:e===null?null:C(t,r),after:n===null?null:C(t,d)})}return i}function O(s,e,n,o,l,i,a){const t=[],r=Math.max((n==null?void 0:n.length)??0,(o==null?void 0:o.length)??0);for(let d=0;d<r;d++){const f=(n==null?void 0:n[d])??(a.before?{}:null),g=(o==null?void 0:o[d])??(a.after?{}:null),F=v=>{const w=e?v==null?void 0:v[e]:void 0;return typeof w=="string"&&w!==""?w:`${d+1}`};t.push(...j(s,f,g,[...l,String(d)],[...i,F(g??f)]))}return t}function C(s,e){if(e==null||e==="")return"Empty";if(s.kind==="boolean")return e===!0?"Yes":"No";if(s.kind==="select")return(Array.isArray(e)?e:[e]).map(o=>{var l;return((l=s.options.find(i=>i.value===o))==null?void 0:l.label)??String(o)}).join(", ");if(s.kind==="media"){const n=Array.isArray(e)?e:[e];return n.length===0?"Empty":n.map(o=>{const{path:l,alt:i}=typeof o=="string"?{path:o,alt:null}:_(o)??{},a=String(l).split("/").at(-1)??String(l);return typeof i=="string"&&i?`${a} ("${i}")`:a}).join(", ")}if(s.kind==="coordinates"){const n=_(e);if(n&&typeof n.lat=="number"&&typeof n.lng=="number")return`${n.lat.toFixed(5)}, ${n.lng.toFixed(5)}`}return Array.isArray(e)?e.map(String).join(", "):typeof e=="object"?A(e):String(e)}function _(s){return s!==null&&typeof s=="object"&&!Array.isArray(s)?s:null}function B(s){return Array.isArray(s)?s:null}function A(s){return JSON.stringify(s??null,(e,n)=>{if(n===null||typeof n!="object"||Array.isArray(n))return n;const o=n,l={};for(const i of Object.keys(o).sort())l[i]=o[i];return l})}const R={class:"mt-3 rounded-md border border-line bg-canvas/60 p-3 text-xs"},z={key:0,class:"mb-2 font-medium text-success"},D={key:1,class:"mb-2 font-medium text-danger"},M={key:2,class:"grid grid-cols-2 gap-3"},T={class:"list-decimal space-y-0.5 pl-5"},q={class:"list-decimal space-y-0.5 pl-5"},H={key:0,class:"text-muted"},J={key:1,class:"space-y-3"},P={class:"mb-1 font-medium"},U={key:0,class:"text-muted","aria-hidden":"true"},W={key:0,class:"max-h-48 overflow-y-auto whitespace-pre-wrap break-words rounded-sm border border-danger/15 bg-danger-soft/60 p-2"},Y={key:1,class:"max-h-48 overflow-y-auto whitespace-pre-wrap break-words rounded-sm border border-success/15 bg-success-soft/60 p-2"},Q=E({__name:"ChangeComparison",props:{comparison:{},fields:{}},setup(s){const e=s,n=m(()=>e.comparison.before===null?"created":e.comparison.after===null?"deleted":"changed"),o=m(()=>e.fields?L(e.fields,e.comparison.before,e.comparison.after):[]),l=m(()=>{if(e.fields)return null;const a=t=>Array.isArray(t==null?void 0:t.order)?t.order:[];return{before:a(e.comparison.before),after:a(e.comparison.after)}}),i=m(()=>{if(!l.value)return new Set;const a=new Map(l.value.before.map((t,r)=>[t.slug,r]));return new Set(l.value.after.filter((t,r)=>a.get(t.slug)!==r).map(t=>t.slug))});return(a,t)=>(c(),u("div",R,[n.value==="created"?(c(),u("p",z," New — publishing puts this on the site for the first time. ")):n.value==="deleted"?(c(),u("p",D," Publishing removes this from the site. ")):b("",!0),l.value?(c(),u("div",M,[p("div",null,[t[0]||(t[0]=p("p",{class:"mb-1.5 font-medium text-muted"},"Before",-1)),p("ol",T,[(c(!0),u(h,null,k(l.value.before,r=>(c(),u("li",{key:r.slug,class:x(i.value.has(r.slug)&&"font-medium text-ink")},y(r.title),3))),128))])]),p("div",null,[t[1]||(t[1]=p("p",{class:"mb-1.5 font-medium text-muted"},"After",-1)),p("ol",q,[(c(!0),u(h,null,k(l.value.after,r=>(c(),u("li",{key:r.slug,class:x(i.value.has(r.slug)&&"font-medium text-success")},y(r.title),3))),128))])])])):(c(),u(h,{key:3},[o.value.length===0?(c(),u("p",H," Nothing visible changed — files moved or were rewritten without a field changing its value. ")):(c(),u("dl",J,[(c(!0),u(h,null,k(o.value,r=>(c(),u("div",{key:r.path},[p("dt",P,[(c(!0),u(h,null,k(r.label,(d,f)=>(c(),u(h,{key:f},[f>0?(c(),u("span",U," › ")):b("",!0),p("span",null,y(d),1)],64))),128))]),p("dd",{class:x(["grid gap-2",n.value==="changed"?"grid-cols-2":"grid-cols-1"])},[n.value!=="created"?(c(),u("div",W,[t[2]||(t[2]=p("span",{class:"sr-only"},"Before: ",-1)),S(y(r.before),1)])):b("",!0),n.value!=="deleted"?(c(),u("div",Y,[t[3]||(t[3]=p("span",{class:"sr-only"},"After: ",-1)),S(y(r.after),1)])):b("",!0)],2)]))),128))]))],64))]))}});export{Q as _,N as h,G as u,K as w};
|
|
2
|
+
//# sourceMappingURL=ChangeComparison.vue_vue_type_script_setup_true_lang-CN7QLLgS.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChangeComparison.vue_vue_type_script_setup_true_lang-CN7QLLgS.js","sources":["../../src/composables/useField.ts","../../src/lib/compare.ts","../../src/components/ChangeComparison.vue"],"sourcesContent":["/**\n * Shared plumbing for every field component: a stable input id, the label to\n * show, and the server-side issue that belongs to this exact path.\n */\n\nimport { computed, type ComputedRef } from \"vue\";\n\nimport type { AnyField, FieldIssue } from \"@micacms/core\";\n\nlet sequence = 0;\n\nexport interface FieldProps {\n field: AnyField;\n /** Dotted path, e.g. `seo.metaTitle` or `facts.2.label`. */\n path: string;\n /** Flat issue list for the whole form; each field picks out its own. */\n issues?: FieldIssue[];\n disabled?: boolean;\n}\n\nexport interface UseField {\n inputId: string;\n label: ComputedRef<string>;\n error: ComputedRef<string | null>;\n describedBy: ComputedRef<string | undefined>;\n hintId: string;\n errorId: string;\n}\n\nexport function useField(props: FieldProps): UseField {\n const inputId = `field-${++sequence}`;\n const hintId = `${inputId}-hint`;\n const errorId = `${inputId}-error`;\n\n const label = computed(() => props.field.label ?? humanise(lastSegment(props.path)));\n\n const error = computed(() => {\n const match = props.issues?.find((issue) => issue.path === props.path);\n return match?.message ?? null;\n });\n\n const describedBy = computed(() => {\n const parts = [props.field.description ? hintId : null, error.value ? errorId : null].filter(\n Boolean,\n );\n return parts.length > 0 ? parts.join(\" \") : undefined;\n });\n\n return { inputId, label, error, describedBy, hintId, errorId };\n}\n\nfunction lastSegment(path: string): string {\n return path.split(\".\").at(-1) ?? path;\n}\n\n/** `metaTitle` → `Meta title`, used when a field declares no label. */\nexport function humanise(key: string): string {\n const spaced = key.replace(/([a-z0-9])([A-Z])/g, \"$1 $2\").replace(/[_-]+/g, \" \");\n return spaced.charAt(0).toUpperCase() + spaced.slice(1).toLowerCase();\n}\n\nconst WIDTHS: Record<string, string> = {\n full: \"col-span-12\",\n half: \"col-span-12 sm:col-span-6\",\n third: \"col-span-12 sm:col-span-4\",\n};\n\nexport function widthClass(field: AnyField): string {\n return WIDTHS[field.width ?? \"full\"] ?? WIDTHS.full!;\n}\n","/**\n * Turns a raw before/after pair into rows an editor reads.\n *\n * The server's comparison is two documents of field data; everything friendly\n * about it happens here, where the model is at hand: fields get their labels,\n * nesting becomes a breadcrumb, unchanged values disappear, and each value is\n * written the way its field type would show it — never as JSON with quotes.\n */\n\nimport type { AnyField, FieldMap } from \"@micacms/core\";\n\nimport { humanise } from \"@/composables/useField\";\n\n/** One changed value, named and rendered for both sides. */\nexport interface CompareRow {\n /** Unique among the rows — the dotted path of the leaf. */\n path: string;\n /** Breadcrumb of labels, e.g. `[\"Extra sections\", \"2\", \"Heading\"]`. */\n label: string[];\n /** The field's kind, as a rendering hint (`richText` wants more room). */\n kind: string;\n /** Display strings; null on the side where the document does not exist. */\n before: string | null;\n after: string | null;\n}\n\n/**\n * The changed fields between two documents, in model order.\n *\n * A side that is null means the document itself is absent there (a creation\n * or a deletion); every present value on the other side becomes a row, so the\n * comparison doubles as a summary of the new or removed document.\n */\nexport function compareRows(\n fields: FieldMap,\n before: Record<string, unknown> | null,\n after: Record<string, unknown> | null,\n): CompareRow[] {\n return walk(fields, before, after, [], []);\n}\n\nfunction walk(\n fields: FieldMap,\n before: Record<string, unknown> | null,\n after: Record<string, unknown> | null,\n path: string[],\n label: string[],\n): CompareRow[] {\n const rows: CompareRow[] = [];\n\n for (const [name, field] of Object.entries(fields)) {\n if (field.hidden) continue;\n\n const a = before === null ? undefined : before[name];\n const b = after === null ? undefined : after[name];\n const at = [...path, name];\n const named = [...label, field.label ?? humanise(name)];\n\n // Null means \"this side's document does not exist\" all the way down. A\n // *value* that is merely missing inside an existing document becomes an\n // empty record instead, so its leaves read as Empty rather than vanish.\n if (field.kind === \"object\") {\n rows.push(\n ...walk(\n field.fields,\n before === null ? null : (asRecord(a) ?? {}),\n after === null ? null : (asRecord(b) ?? {}),\n at,\n named,\n ),\n );\n continue;\n }\n\n if (field.kind === \"repeater\") {\n rows.push(\n ...repeaterRows(field.fields, field.itemLabel, asList(a), asList(b), at, named, {\n before: before !== null,\n after: after !== null,\n }),\n );\n continue;\n }\n\n if (canonical(a) === canonical(b)) continue;\n\n rows.push({\n path: at.join(\".\"),\n label: named,\n kind: field.kind,\n before: before === null ? null : displayValue(field, a),\n after: after === null ? null : displayValue(field, b),\n });\n }\n\n return rows;\n}\n\n/**\n * Repeater items compared by position. Position is what the editor sees and\n * what the file stores; chasing moved items across indexes would guess.\n */\nfunction repeaterRows(\n fields: FieldMap,\n itemLabel: string | undefined,\n before: Array<Record<string, unknown>> | null,\n after: Array<Record<string, unknown>> | null,\n path: string[],\n label: string[],\n present: { before: boolean; after: boolean },\n): CompareRow[] {\n const rows: CompareRow[] = [];\n const count = Math.max(before?.length ?? 0, after?.length ?? 0);\n\n for (let index = 0; index < count; index++) {\n const a = before?.[index] ?? (present.before ? {} : null);\n const b = after?.[index] ?? (present.after ? {} : null);\n\n // Name the item by its summary field where one is set, else its number.\n const caption = (item: Record<string, unknown> | null) => {\n const value = itemLabel ? item?.[itemLabel] : undefined;\n return typeof value === \"string\" && value !== \"\" ? value : `${index + 1}`;\n };\n\n rows.push(...walk(fields, a, b, [...path, String(index)], [...label, caption(b ?? a)]));\n }\n\n return rows;\n}\n\n/**\n * A field value as the editor would say it — `displayValue` never shows JSON.\n * Null on both ends of a row is prevented by the change filter, so \"Empty\"\n * only ever appears opposite a real value.\n */\nexport function displayValue(field: AnyField, value: unknown): string {\n if (value === null || value === undefined || value === \"\") return \"Empty\";\n\n if (field.kind === \"boolean\") return value === true ? \"Yes\" : \"No\";\n\n if (field.kind === \"select\") {\n const values = Array.isArray(value) ? value : [value];\n return values\n .map((entry) => field.options.find((option) => option.value === entry)?.label ?? String(entry))\n .join(\", \");\n }\n\n if (field.kind === \"media\") {\n const values = Array.isArray(value) ? value : [value];\n if (values.length === 0) return \"Empty\";\n return values\n .map((entry) => {\n // `media({ alt })` stores `{ path, alt }`.\n const { path, alt } = typeof entry === \"string\" ? { path: entry, alt: null } : (asRecord(entry) ?? {});\n const name = String(path).split(\"/\").at(-1) ?? String(path);\n return typeof alt === \"string\" && alt ? `${name} (\"${alt}\")` : name;\n })\n .join(\", \");\n }\n\n if (field.kind === \"coordinates\") {\n const point = asRecord(value);\n if (point && typeof point[\"lat\"] === \"number\" && typeof point[\"lng\"] === \"number\") {\n return `${point[\"lat\"].toFixed(5)}, ${point[\"lng\"].toFixed(5)}`;\n }\n }\n\n if (Array.isArray(value)) return value.map(String).join(\", \");\n if (typeof value === \"object\") return canonical(value);\n\n return String(value);\n}\n\n/* ------------------------------------------------------------------ */\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n return value !== null && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : null;\n}\n\nfunction asList(value: unknown): Array<Record<string, unknown>> | null {\n return Array.isArray(value) ? (value as Array<Record<string, unknown>>) : null;\n}\n\n/** Canonical JSON — keys sorted, so a rebuilt object compares equal. */\nfunction canonical(value: unknown): string {\n return JSON.stringify(value ?? null, (_key, entry: unknown) => {\n if (entry === null || typeof entry !== \"object\" || Array.isArray(entry)) return entry;\n const record = entry as Record<string, unknown>;\n const sorted: Record<string, unknown> = {};\n for (const key of Object.keys(record).sort()) sorted[key] = record[key];\n return sorted;\n });\n}\n","<script setup lang=\"ts\">\n/**\n * What a pending change does, said as before and after.\n *\n * Not a diff: no line numbers, no `+`/`-`, no file contents. Each changed\n * field is one row with the stored value on the left and the staged one on\n * the right, worded by the field type — an editor who has never read a patch\n * can see exactly what publishing applies.\n */\n\nimport { computed } from \"vue\";\n\nimport type { FieldMap } from \"@micacms/core\";\n\nimport type { Comparison } from \"@/api\";\nimport { compareRows } from \"@/lib/compare\";\n\nconst props = defineProps<{\n comparison: Comparison;\n /** The owning document's fields; null for an order comparison. */\n fields: FieldMap | null;\n}>();\n\nconst mode = computed<\"created\" | \"deleted\" | \"changed\">(() => {\n if (props.comparison.before === null) return \"created\";\n if (props.comparison.after === null) return \"deleted\";\n return \"changed\";\n});\n\nconst rows = computed(() =>\n props.fields\n ? compareRows(props.fields, props.comparison.before, props.comparison.after)\n : [],\n);\n\n/** An order comparison — the collection's sequence on both sides. */\ninterface OrderItem {\n slug: string;\n title: string;\n}\n\nconst order = computed(() => {\n if (props.fields) return null;\n const side = (data: Record<string, unknown> | null): OrderItem[] =>\n Array.isArray(data?.[\"order\"]) ? (data[\"order\"] as OrderItem[]) : [];\n return { before: side(props.comparison.before), after: side(props.comparison.after) };\n});\n\n/** Slugs whose position changed, which is what an order change *is*. */\nconst moved = computed(() => {\n if (!order.value) return new Set<string>();\n const positions = new Map(order.value.before.map((item, index) => [item.slug, index]));\n return new Set(\n order.value.after\n .filter((item, index) => positions.get(item.slug) !== index)\n .map((item) => item.slug),\n );\n});\n</script>\n\n<template>\n <div class=\"mt-3 rounded-md border border-line bg-canvas/60 p-3 text-xs\">\n <p v-if=\"mode === 'created'\" class=\"mb-2 font-medium text-success\">\n New — publishing puts this on the site for the first time.\n </p>\n <p v-else-if=\"mode === 'deleted'\" class=\"mb-2 font-medium text-danger\">\n Publishing removes this from the site.\n </p>\n\n <!-- An order change: the sequence, before and after. -->\n <div v-if=\"order\" class=\"grid grid-cols-2 gap-3\">\n <div>\n <p class=\"mb-1.5 font-medium text-muted\">Before</p>\n <ol class=\"list-decimal space-y-0.5 pl-5\">\n <li\n v-for=\"item in order.before\"\n :key=\"item.slug\"\n :class=\"moved.has(item.slug) && 'font-medium text-ink'\"\n >\n {{ item.title }}\n </li>\n </ol>\n </div>\n <div>\n <p class=\"mb-1.5 font-medium text-muted\">After</p>\n <ol class=\"list-decimal space-y-0.5 pl-5\">\n <li\n v-for=\"item in order.after\"\n :key=\"item.slug\"\n :class=\"moved.has(item.slug) && 'font-medium text-success'\"\n >\n {{ item.title }}\n </li>\n </ol>\n </div>\n </div>\n\n <!-- Field changes. -->\n <template v-else>\n <p v-if=\"rows.length === 0\" class=\"text-muted\">\n Nothing visible changed — files moved or were rewritten without a field changing its value.\n </p>\n\n <dl v-else class=\"space-y-3\">\n <div v-for=\"row in rows\" :key=\"row.path\">\n <dt class=\"mb-1 font-medium\">\n <template v-for=\"(part, index) in row.label\" :key=\"index\">\n <span v-if=\"index > 0\" class=\"text-muted\" aria-hidden=\"true\"> › </span\n ><span>{{ part }}</span>\n </template>\n </dt>\n <dd :class=\"['grid gap-2', mode === 'changed' ? 'grid-cols-2' : 'grid-cols-1']\">\n <div\n v-if=\"mode !== 'created'\"\n class=\"max-h-48 overflow-y-auto whitespace-pre-wrap break-words rounded-sm border border-danger/15 bg-danger-soft/60 p-2\"\n >\n <span class=\"sr-only\">Before: </span>{{ row.before }}\n </div>\n <div\n v-if=\"mode !== 'deleted'\"\n class=\"max-h-48 overflow-y-auto whitespace-pre-wrap break-words rounded-sm border border-success/15 bg-success-soft/60 p-2\"\n >\n <span class=\"sr-only\">After: </span>{{ row.after }}\n </div>\n </dd>\n </div>\n </dl>\n </template>\n </div>\n</template>\n"],"names":["sequence","useField","props","inputId","hintId","errorId","label","computed","humanise","lastSegment","error","match","_a","issue","describedBy","parts","path","key","spaced","WIDTHS","widthClass","field","compareRows","fields","before","after","walk","rows","name","a","b","at","named","asRecord","repeaterRows","asList","canonical","displayValue","itemLabel","present","count","index","caption","item","value","entry","option","values","alt","point","_key","record","sorted","__props","mode","order","side","data","moved","positions","_openBlock","_createElementBlock","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_createElementVNode","_cache","_hoisted_5","_Fragment","_renderList","_toDisplayString","_hoisted_6","_hoisted_7","_hoisted_8","row","_hoisted_9","part","_hoisted_10","_hoisted_11","_createTextVNode","_hoisted_12"],"mappings":"yGASA,IAAIA,EAAW,EAoBR,SAASC,EAASC,EAA6B,CACpD,MAAMC,EAAU,SAAS,EAAEH,CAAQ,GAC7BI,EAAS,GAAGD,CAAO,QACnBE,EAAU,GAAGF,CAAO,SAEpBG,EAAQC,EAAS,IAAML,EAAM,MAAM,OAASM,EAASC,EAAYP,EAAM,IAAI,CAAC,CAAC,EAE7EQ,EAAQH,EAAS,IAAM,OAC3B,MAAMI,GAAQC,EAAAV,EAAM,SAAN,YAAAU,EAAc,KAAMC,GAAUA,EAAM,OAASX,EAAM,MACjE,OAAOS,GAAA,YAAAA,EAAO,UAAW,IAC3B,CAAC,EAEKG,EAAcP,EAAS,IAAM,CACjC,MAAMQ,EAAQ,CAACb,EAAM,MAAM,YAAcE,EAAS,KAAMM,EAAM,MAAQL,EAAU,IAAI,EAAE,OACpF,OAAA,EAEF,OAAOU,EAAM,OAAS,EAAIA,EAAM,KAAK,GAAG,EAAI,MAC9C,CAAC,EAED,MAAO,CAAE,QAAAZ,EAAS,MAAAG,EAAO,MAAAI,EAAO,YAAAI,EAAa,OAAAV,EAAQ,QAAAC,CAAA,CACvD,CAEA,SAASI,EAAYO,EAAsB,CACzC,OAAOA,EAAK,MAAM,GAAG,EAAE,GAAG,EAAE,GAAKA,CACnC,CAGO,SAASR,EAASS,EAAqB,CAC5C,MAAMC,EAASD,EAAI,QAAQ,qBAAsB,OAAO,EAAE,QAAQ,SAAU,GAAG,EAC/E,OAAOC,EAAO,OAAO,CAAC,EAAE,cAAgBA,EAAO,MAAM,CAAC,EAAE,YAAA,CAC1D,CAEA,MAAMC,EAAiC,CACrC,KAAM,cACN,KAAM,4BACN,MAAO,2BACT,EAEO,SAASC,EAAWC,EAAyB,CAClD,OAAOF,EAAOE,EAAM,OAAS,MAAM,GAAKF,EAAO,IACjD,CCpCO,SAASG,EACdC,EACAC,EACAC,EACc,CACd,OAAOC,EAAKH,EAAQC,EAAQC,EAAO,CAAA,EAAI,CAAA,CAAE,CAC3C,CAEA,SAASC,EACPH,EACAC,EACAC,EACAT,EACAV,EACc,CACd,MAAMqB,EAAqB,CAAA,EAE3B,SAAW,CAACC,EAAMP,CAAK,IAAK,OAAO,QAAQE,CAAM,EAAG,CAClD,GAAIF,EAAM,OAAQ,SAElB,MAAMQ,EAAIL,IAAW,KAAO,OAAYA,EAAOI,CAAI,EAC7CE,EAAIL,IAAU,KAAO,OAAYA,EAAMG,CAAI,EAC3CG,EAAK,CAAC,GAAGf,EAAMY,CAAI,EACnBI,EAAQ,CAAC,GAAG1B,EAAOe,EAAM,OAASb,EAASoB,CAAI,CAAC,EAKtD,GAAIP,EAAM,OAAS,SAAU,CAC3BM,EAAK,KACH,GAAGD,EACDL,EAAM,OACNG,IAAW,KAAO,KAAQS,EAASJ,CAAC,GAAK,CAAA,EACzCJ,IAAU,KAAO,KAAQQ,EAASH,CAAC,GAAK,CAAA,EACxCC,EACAC,CAAA,CACF,EAEF,QACF,CAEA,GAAIX,EAAM,OAAS,WAAY,CAC7BM,EAAK,KACH,GAAGO,EAAab,EAAM,OAAQA,EAAM,UAAWc,EAAON,CAAC,EAAGM,EAAOL,CAAC,EAAGC,EAAIC,EAAO,CAC9E,OAAQR,IAAW,KACnB,MAAOC,IAAU,IAAA,CAClB,CAAA,EAEH,QACF,CAEIW,EAAUP,CAAC,IAAMO,EAAUN,CAAC,GAEhCH,EAAK,KAAK,CACR,KAAMI,EAAG,KAAK,GAAG,EACjB,MAAOC,EACP,KAAMX,EAAM,KACZ,OAAQG,IAAW,KAAO,KAAOa,EAAahB,EAAOQ,CAAC,EACtD,MAAOJ,IAAU,KAAO,KAAOY,EAAahB,EAAOS,CAAC,CAAA,CACrD,CACH,CAEA,OAAOH,CACT,CAMA,SAASO,EACPX,EACAe,EACAd,EACAC,EACAT,EACAV,EACAiC,EACc,CACd,MAAMZ,EAAqB,CAAA,EACrBa,EAAQ,KAAK,KAAIhB,GAAA,YAAAA,EAAQ,SAAU,GAAGC,GAAA,YAAAA,EAAO,SAAU,CAAC,EAE9D,QAASgB,EAAQ,EAAGA,EAAQD,EAAOC,IAAS,CAC1C,MAAMZ,GAAIL,GAAA,YAAAA,EAASiB,MAAWF,EAAQ,OAAS,CAAA,EAAK,MAC9CT,GAAIL,GAAA,YAAAA,EAAQgB,MAAWF,EAAQ,MAAQ,CAAA,EAAK,MAG5CG,EAAWC,GAAyC,CACxD,MAAMC,EAAQN,EAAYK,GAAA,YAAAA,EAAOL,GAAa,OAC9C,OAAO,OAAOM,GAAU,UAAYA,IAAU,GAAKA,EAAQ,GAAGH,EAAQ,CAAC,EACzE,EAEAd,EAAK,KAAK,GAAGD,EAAKH,EAAQM,EAAGC,EAAG,CAAC,GAAGd,EAAM,OAAOyB,CAAK,CAAC,EAAG,CAAC,GAAGnC,EAAOoC,EAAQZ,GAAKD,CAAC,CAAC,CAAC,CAAC,CACxF,CAEA,OAAOF,CACT,CAOO,SAASU,EAAahB,EAAiBuB,EAAwB,CACpE,GAAIA,GAAU,MAA+BA,IAAU,GAAI,MAAO,QAElE,GAAIvB,EAAM,OAAS,UAAW,OAAOuB,IAAU,GAAO,MAAQ,KAE9D,GAAIvB,EAAM,OAAS,SAEjB,OADe,MAAM,QAAQuB,CAAK,EAAIA,EAAQ,CAACA,CAAK,GAEjD,IAAKC,UAAU,QAAAjC,EAAAS,EAAM,QAAQ,KAAMyB,GAAWA,EAAO,QAAUD,CAAK,IAArD,YAAAjC,EAAwD,QAAS,OAAOiC,CAAK,EAAC,EAC7F,KAAK,IAAI,EAGd,GAAIxB,EAAM,OAAS,QAAS,CAC1B,MAAM0B,EAAS,MAAM,QAAQH,CAAK,EAAIA,EAAQ,CAACA,CAAK,EACpD,OAAIG,EAAO,SAAW,EAAU,QACzBA,EACJ,IAAKF,GAAU,CAEd,KAAM,CAAE,KAAA7B,EAAM,IAAAgC,CAAA,EAAQ,OAAOH,GAAU,SAAW,CAAE,KAAMA,EAAO,IAAK,IAAA,EAAUZ,EAASY,CAAK,GAAK,CAAA,EAC7FjB,EAAO,OAAOZ,CAAI,EAAE,MAAM,GAAG,EAAE,GAAG,EAAE,GAAK,OAAOA,CAAI,EAC1D,OAAO,OAAOgC,GAAQ,UAAYA,EAAM,GAAGpB,CAAI,MAAMoB,CAAG,KAAOpB,CACjE,CAAC,EACA,KAAK,IAAI,CACd,CAEA,GAAIP,EAAM,OAAS,cAAe,CAChC,MAAM4B,EAAQhB,EAASW,CAAK,EAC5B,GAAIK,GAAS,OAAOA,EAAM,KAAW,UAAY,OAAOA,EAAM,KAAW,SACvE,MAAO,GAAGA,EAAM,IAAO,QAAQ,CAAC,CAAC,KAAKA,EAAM,IAAO,QAAQ,CAAC,CAAC,EAEjE,CAEA,OAAI,MAAM,QAAQL,CAAK,EAAUA,EAAM,IAAI,MAAM,EAAE,KAAK,IAAI,EACxD,OAAOA,GAAU,SAAiBR,EAAUQ,CAAK,EAE9C,OAAOA,CAAK,CACrB,CAIA,SAASX,EAASW,EAAgD,CAChE,OAAOA,IAAU,MAAQ,OAAOA,GAAU,UAAY,CAAC,MAAM,QAAQA,CAAK,EACrEA,EACD,IACN,CAEA,SAAST,EAAOS,EAAuD,CACrE,OAAO,MAAM,QAAQA,CAAK,EAAKA,EAA2C,IAC5E,CAGA,SAASR,EAAUQ,EAAwB,CACzC,OAAO,KAAK,UAAUA,GAAS,KAAM,CAACM,EAAML,IAAmB,CAC7D,GAAIA,IAAU,MAAQ,OAAOA,GAAU,UAAY,MAAM,QAAQA,CAAK,EAAG,OAAOA,EAChF,MAAMM,EAASN,EACTO,EAAkC,CAAA,EACxC,UAAWnC,KAAO,OAAO,KAAKkC,CAAM,EAAE,KAAA,EAAQC,EAAOnC,CAAG,EAAIkC,EAAOlC,CAAG,EACtE,OAAOmC,CACT,CAAC,CACH,qwBCjLA,MAAMlD,EAAQmD,EAMRC,EAAO/C,EAA4C,IACnDL,EAAM,WAAW,SAAW,KAAa,UACzCA,EAAM,WAAW,QAAU,KAAa,UACrC,SACR,EAEKyB,EAAOpB,EAAS,IACpBL,EAAM,OACFoB,EAAYpB,EAAM,OAAQA,EAAM,WAAW,OAAQA,EAAM,WAAW,KAAK,EACzE,CAAA,CAAC,EASDqD,EAAQhD,EAAS,IAAM,CAC3B,GAAIL,EAAM,OAAQ,OAAO,KACzB,MAAMsD,EAAQC,GACZ,MAAM,QAAQA,GAAA,YAAAA,EAAO,KAAQ,EAAKA,EAAK,MAA2B,CAAA,EACpE,MAAO,CAAE,OAAQD,EAAKtD,EAAM,WAAW,MAAM,EAAG,MAAOsD,EAAKtD,EAAM,WAAW,KAAK,CAAA,CACpF,CAAC,EAGKwD,EAAQnD,EAAS,IAAM,CAC3B,GAAI,CAACgD,EAAM,MAAO,WAAW,IAC7B,MAAMI,EAAY,IAAI,IAAIJ,EAAM,MAAM,OAAO,IAAI,CAACZ,EAAMF,IAAU,CAACE,EAAK,KAAMF,CAAK,CAAC,CAAC,EACrF,OAAO,IAAI,IACTc,EAAM,MAAM,MACT,OAAO,CAACZ,EAAMF,IAAUkB,EAAU,IAAIhB,EAAK,IAAI,IAAMF,CAAK,EAC1D,IAAKE,GAASA,EAAK,IAAI,CAAA,CAE9B,CAAC,gBAICiB,EAAA,EAAAC,EAmEM,MAnENC,EAmEM,CAlEKR,EAAA,QAAI,eAAbO,EAEI,IAFJE,EAAmE,8DAEnE,GACcT,EAAA,QAAI,eAAlBO,EAEI,IAFJG,EAAuE,0CAEvE,YAGWT,EAAA,OAAXK,EAAA,EAAAC,EAyBM,MAzBNI,EAyBM,CAxBJC,EAWM,MAAA,KAAA,CAVJC,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAD,EAAmD,IAAA,CAAhD,MAAM,+BAAA,EAAgC,SAAM,EAAA,GAC/CA,EAQK,KARLE,EAQK,EAPHR,EAAA,EAAA,EAAAC,EAMKQ,EAAA,KAAAC,EALYf,EAAA,MAAM,OAAdZ,QADTkB,EAMK,KAAA,CAJF,IAAKlB,EAAK,KACV,QAAOe,EAAA,MAAM,IAAIf,EAAK,IAAI,GAAA,sBAAA,CAAA,EAExB4B,EAAA5B,EAAK,KAAK,EAAA,CAAA,cAInBuB,EAWM,MAAA,KAAA,CAVJC,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAD,EAAkD,IAAA,CAA/C,MAAM,+BAAA,EAAgC,QAAK,EAAA,GAC9CA,EAQK,KARLM,EAQK,EAPHZ,EAAA,EAAA,EAAAC,EAMKQ,EAAA,KAAAC,EALYf,EAAA,MAAM,MAAdZ,QADTkB,EAMK,KAAA,CAJF,IAAKlB,EAAK,KACV,QAAOe,EAAA,MAAM,IAAIf,EAAK,IAAI,GAAA,0BAAA,CAAA,EAExB4B,EAAA5B,EAAK,KAAK,EAAA,CAAA,sBAOrBkB,EA6BWQ,EAAA,CAAA,IAAA,GAAA,CA5BA1C,EAAA,MAAK,SAAM,OAApBkC,EAEI,IAFJY,EAA+C,+FAE/C,IAEAb,EAAA,EAAAC,EAuBK,KAvBLa,EAuBK,QAtBHb,EAqBMQ,EAAA,KAAAC,EArBa3C,EAAA,MAAPgD,QAAZd,EAqBM,MAAA,CArBoB,IAAKc,EAAI,IAAA,GACjCT,EAKK,KALLU,EAKK,EAJHhB,EAAA,EAAA,EAAAC,EAGWQ,SAHuBM,EAAI,MAAK,CAAzBE,EAAMpC,kBAA2BA,GAAK,CAC1CA,EAAK,OAAjBoB,EACC,OADDiB,EAA6D,KAAG,YAC/DZ,EAAuB,cAAdW,CAAI,EAAA,CAAA,CAAA,gBAGlBX,EAaK,KAAA,CAbA,sBAAsBZ,EAAA,QAAI,UAAA,cAAA,aAAA,CAAA,CAAA,GAErBA,EAAA,QAAI,WADZM,IAAAC,EAKM,MALNkB,EAKM,CADJZ,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAD,EAAqC,OAAA,CAA/B,MAAM,SAAA,EAAU,WAAQ,EAAA,GAAUc,EAAAT,EAAAI,EAAI,MAAM,EAAA,CAAA,CAAA,aAG5CrB,EAAA,QAAI,WADZM,IAAAC,EAKM,MALNoB,EAKM,CADJd,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAD,EAAoC,OAAA,CAA9B,MAAM,SAAA,EAAU,UAAO,EAAA,GAAUc,EAAAT,EAAAI,EAAI,KAAK,EAAA,CAAA,CAAA"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import{H as Ne,d as Re,q as he,o as We,c as o,i as S,w as P,a as s,k as c,F as m,s as J,b as i,t as l,j as B,B as Ee,v as Ie,x as Ae,l as Ve,r as v,f as y,n as $,A as D,p as Be,g as n,e as g,V as Fe,W as Ye,E as me,a2 as je,a3 as pe,a4 as qe,m as ze,y as Ke,Y as Oe,a5 as Ue,a6 as He}from"./index-C-WfCDd6.js";import{_ as ve}from"./ChangeComparison.vue_vue_type_script_setup_true_lang-CN7QLLgS.js";import{_ as Ge}from"./ConfirmDialog.vue_vue_type_script_setup_true_lang-CWanooQO.js";import{_ as Q}from"./DeveloperDetails.vue_vue_type_script_setup_true_lang-Bp-D1Kf1.js";import{_ as Je}from"./PageHeader.vue_vue_type_script_setup_true_lang-YO9Lox87.js";import{r as Qe}from"./format-CAimH9FV.js";/**
|
|
2
|
+
* @license @lucide/vue v1.55.0 - ISC
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the ISC license.
|
|
5
|
+
* See the LICENSE file in the root directory of this source tree.
|
|
6
|
+
*/const Xe={name:"refresh-cw",size:24,node:[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8",key:"v9h5vc"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16",key:"3uifl3"}],["path",{d:"M8 16H3v5",key:"1cv678"}]]},Ze=Ne(Xe),et=["disabled"],tt={class:"mx-auto max-w-3xl space-y-5 px-4 py-6 sm:px-6"},st={key:0,class:"text-sm text-muted"},at={key:0,role:"status",class:"rounded-md border border-success/15 bg-success-soft p-4"},nt={class:"font-mono"},ot={key:1,role:"alert",class:"rounded-md border border-warning/15 bg-warning-soft p-4"},lt={class:"mt-1 text-xs text-muted"},it={key:2,class:"rounded-md border border-line bg-subtle p-4 text-sm text-muted"},rt={class:"mt-1"},ut={key:0,role:"alert",class:"rounded-md border border-warning/15 bg-warning-soft p-4"},dt={key:1,role:"alert",class:"rounded-md border border-warning/15 bg-warning-soft p-4"},ct={class:"text-sm font-medium text-warning"},ht={class:"mt-1 text-xs text-muted"},mt=["disabled"],pt={key:2,role:"status",class:"rounded-md border border-line bg-subtle p-4"},vt={class:"mt-1 text-xs text-muted"},gt={key:3,role:"alert",class:"rounded-md border border-danger/15 bg-danger-soft p-4"},bt={class:"mt-1 text-xs text-muted"},yt={key:4,"aria-labelledby":"conflicts-heading",class:"space-y-3"},ft={class:"card divide-y divide-line"},xt={class:"text-sm font-medium"},wt={class:"mt-0.5 text-xs text-muted"},kt={key:0,class:"mt-2 text-xs text-muted"},_t={key:1,class:"mt-2 text-xs text-danger"},Ct={key:1,role:"alert",class:"mt-2 text-xs text-danger"},Tt={class:"mt-2.5 flex flex-wrap gap-2"},Pt=["disabled","onClick"],Mt=["disabled","onClick"],St={key:4,role:"alert",class:"rounded-md border border-warning/15 bg-warning-soft p-4"},$t={class:"mt-1 text-xs text-muted"},Dt=["disabled"],Lt={key:5,role:"alert",class:"rounded-md border border-warning/15 bg-warning-soft p-4"},Nt={class:"mt-1 text-xs text-muted"},Rt={key:6,role:"alert",class:"rounded-md border border-danger/15 bg-danger-soft p-4"},Wt={class:"mt-1.5 space-y-1 text-xs text-danger"},Et={class:"font-medium"},It={key:7,class:"card p-8 text-center"},At={key:8,"aria-labelledby":"changes-heading",class:"space-y-2"},Vt={class:"flex flex-wrap items-baseline justify-between gap-2"},Bt={id:"changes-heading",class:"text-sm font-semibold"},Ft={key:0,class:"flex gap-1"},Yt={class:"card divide-y divide-line"},jt=["id","checked","disabled","aria-label","onChange"],qt={class:"min-w-0 flex-1"},zt={class:"flex flex-wrap items-baseline gap-x-2"},Kt={key:0,class:"text-xs text-muted"},Ot={key:1,class:"text-xs text-warning"},Ut={key:0,class:"mt-1 text-xs text-danger"},Ht={key:1,class:"mt-1 text-xs text-danger"},Gt={key:2,class:"mt-1 text-xs text-muted"},Jt={key:0,class:"mt-2 text-xs text-muted"},Qt={key:1,class:"mt-2 text-xs text-danger"},Xt={key:4,class:"mt-1 space-y-0.5"},Zt={class:"break-all font-mono"},es=["onClick"],ts={key:9,class:"card p-4","aria-labelledby":"publish-heading"},ss={id:"publish-heading",class:"text-sm font-semibold"},as={class:"flex flex-wrap items-center gap-2"},ns=["disabled"],os=["disabled"],ls={key:0},is={class:"font-mono"},rs={class:"font-mono"},us={key:1},ds={key:2,class:"text-sm text-muted"},ys=Re({__name:"ChangesView",setup(cs){const te=Ke(),M=Ve(),f=Be(),X=v(!0),L=v(!1),F=v(!1),N=v(null),Z=v(!1),R=v(null),W=v(null),r=M.status,h=M.edits,Y=y(()=>{var t;return Oe(h.value,((t=r.value)==null?void 0:t.validation.problems)??[])}),E=y(()=>Ue(h.value,Y.value)),ge=y(()=>new Map(h.value.map(t=>[t.key,t.label]))),be=y(()=>new Set(h.value.flatMap(t=>t.needs)));function se(t,e){const u=h.value.find(d=>(Y.value.get(d.key)??[]).some(G=>G.path===t));return u!=null&&u.link?{...u.link,...e?{query:{field:e}}:{}}:null}const _=v(new Set),ae=new Set;function ye(t){const e=new Set(t.map(d=>d.key)),u=new Set([..._.value].filter(d=>e.has(d)&&!E.value.has(d)));for(const d of t)ae.has(d.key)||E.value.has(d.key)||(ae.add(d.key),u.add(d.key));_.value=pe(u,t)}function fe(t){_.value=_.value.has(t)?je(_.value,t,h.value):pe([..._.value,t],h.value)}function ne(t){_.value=new Set(t?oe.value.map(e=>e.key):[])}const I=y(()=>h.value.filter(t=>_.value.has(t.key))),oe=y(()=>h.value.filter(t=>!E.value.has(t.key))),ee=v(null),j=y({get:()=>ee.value??He(I.value),set:t=>{ee.value=t}}),x=v({});function le(t){var e,u;return t.kind==="entry"?((e=te.collection(t.collection))==null?void 0:e.fields)??null:t.kind==="singleton"?((u=te.singleton(t.name))==null?void 0:u.fields)??null:null}async function ie(t){if(t.target){x.value[t.key]={loading:!0,error:null,comparison:null};try{const e=await $.staging.compare(t.target);x.value[t.key]={loading:!1,error:null,comparison:e}}catch(e){x.value[t.key]={loading:!1,error:e instanceof D?e.message:"Could not load the comparison.",comparison:null}}}}he(h,t=>{ye(t);for(const e of t)e.target&&!x.value[e.key]&&ie(e)},{immediate:!0});const q=y(()=>{var t;return((t=r.value)==null?void 0:t.owner)==="developer"}),b=y(()=>{var t;return((t=r.value)==null?void 0:t.sync)??null}),xe=y(()=>{var t,e;return q.value&&(W.value!==null||(((e=(t=r.value)==null?void 0:t.unpushed)==null?void 0:e.mica)??0)>0)}),w=y(()=>{var t,e;return q.value?((e=(t=r.value)==null?void 0:t.unpushed)==null?void 0:e.other)??0:0}),re=y(()=>{var t;return(((t=r.value)==null?void 0:t.publish.enabled)??!1)&&I.value.length>0&&j.value.trim()!==""&&w.value===0&&!L.value}),we={new:"New",changed:"Changed",removed:"Will be removed"},ke={create:"Added",update:"Changed",delete:"Removed"};async function z(){x.value={},await M.refresh();for(const t of h.value)t.target&&!x.value[t.key]&&ie(t);X.value=!1}We(z);async function _e(){var t;L.value=!0,R.value=null;try{const e=await $.staging.publish(j.value.trim(),qe(I.value));ee.value=null,e.state==="published"?(W.value=null,R.value={revision:e.revision}):q.value?(W.value=e,f.error("Published here, but not sent to the website.",e.pushError)):f.error("Published in Mica, not on the website yet.","Mica tries again every minute."),await M.refresh()}catch(e){e instanceof D?(f.error(e.message,(t=e.issues[0])==null?void 0:t.message),await M.refresh()):f.error("Could not publish.")}finally{L.value=!1}}async function Ce(){F.value=!0;try{const t=await $.staging.push();t.state==="published"?(W.value=null,R.value={revision:t.revision}):(W.value=t,f.error("It could not be sent again.",t.pushError)),await M.refresh()}catch(t){f.error(t instanceof D?t.message:"Could not send it to the website.")}finally{F.value=!1}}async function Te(){const t=N.value;if(t){Z.value=!0;try{await $.staging.discard(t.fileChanges.map(e=>e.path)),f.success(`Discarded the changes to ${t.label}.`),N.value=null,await M.refresh()}catch(e){f.error(e instanceof D?e.message:"Could not discard.")}finally{Z.value=!1}}}const K=v(!1),O=v(null),U=v(null);async function Pe(){K.value=!0;try{await $.staging.sync(),await z()}catch(t){f.error(t instanceof D?t.message:"Could not reach the website's files.")}finally{K.value=!1}}function Me(t){var u;const e=new Set((((u=r.value)==null?void 0:u.changes)??[]).filter(d=>d.kind==="create").map(d=>d.path));return t.paths.some(d=>e.has(d))}async function ue(t,e){if(e==="website"&&Me(t)&&U.value!==t){U.value=t;return}U.value=null,O.value=t.group;try{await $.staging.resolve(t.group,e),f.success(e==="mine"?`Kept your version of ${t.label}.`:`Took the website's version of ${t.label}.`),await z()}catch(u){f.error(u instanceof D?u.message:"Could not resolve the conflict.")}finally{O.value=null}}const Se={changed:"was changed on the website while you edited it",deleted:"was deleted on the website while you edited it",added:"was also created on the website"},C=v({});async function $e(t){if(t.target){C.value[t.group]={loading:!0,error:null,comparison:null};try{const e=await $.staging.compare(t.target,"origin");C.value[t.group]={loading:!1,error:null,comparison:e}}catch(e){C.value[t.group]={loading:!1,error:e instanceof D?e.message:"Could not load the comparison.",comparison:null}}}}he(()=>{var t;return((t=b.value)==null?void 0:t.conflicts)??[]},t=>{for(const e of t)C.value[e.group]||$e(e)});function De(t){return new Date(t).toLocaleString()}function de(t){return/^[0-9a-f]{20,}$/i.test(t)?t.slice(0,7):t}function H(t,e,u){return`${t} ${t===1?e:u}`}return(t,e)=>{var d,G,ce;const u=ze("RouterLink");return n(),o(m,null,[S(Je,{title:"Publish",subtitle:"Saved changes that are not on the website yet"},{default:P(()=>[s("button",{type:"button",class:"btn-ghost px-2",disabled:X.value,onClick:z},[S(c(Ze),{size:16,"aria-hidden":"true"}),e[5]||(e[5]=s("span",{class:"sr-only"},"Refresh the list of changes",-1))],8,et)]),_:1}),s("div",tt,[X.value?(n(),o("p",st,"Loading…")):c(r)?(n(),o(m,{key:1},[R.value?(n(),o("div",at,[e[8]||(e[8]=s("p",{class:"text-sm font-medium text-success"},"Published",-1)),e[9]||(e[9]=s("p",{class:"mt-1 text-xs text-muted"}," Your website is being rebuilt now. This usually takes a few minutes. ",-1)),R.value.revision?(n(),J(Q,{key:0},{default:P(()=>[s("p",null,[e[6]||(e[6]=g("Commit ",-1)),s("span",nt,l(de(R.value.revision)),1),e[7]||(e[7]=g(".",-1))])]),_:1})):i("",!0)])):i("",!0),(d=c(r).model)!=null&&d.warning?(n(),o("div",ot,[e[10]||(e[10]=s("p",{class:"text-sm font-medium text-warning"},"Publishing waits for the developer",-1)),s("p",lt," The website's new content model cannot be read. You can go on saving. Tell the developer: "+l(c(r).model.warning),1)])):i("",!0),c(r).publish.enabled?i("",!0):(n(),o("div",it,[e[11]||(e[11]=s("p",{class:"font-medium text-ink"},"Publishing is not available here",-1)),s("p",rt,l(c(r).publish.reason),1)])),b.value?(n(),o(m,{key:3},[b.value.restartRequired?(n(),o("div",ut,[...e[12]||(e[12]=[s("p",{class:"text-sm font-medium text-warning"},"The way the website stores its files changed",-1),s("p",{class:"mt-1 text-xs text-muted"}," You can go on saving. To publish, ask the person who runs Mica to restart it. ",-1)])])):i("",!0),b.value.error?(n(),o("div",dt,[s("p",ct,"Mica cannot reach the website's files since "+l(De(b.value.error.since)),1),s("p",ht," You can go on saving. Mica tries again every minute. If this stays, tell the person who runs Mica: "+l(b.value.error.message),1),s("button",{type:"button",class:"btn-secondary mt-2.5",disabled:K.value,onClick:Pe},l(K.value?"Trying…":"Try again"),9,mt)])):i("",!0),b.value.pendingPush?(n(),o("div",pt,[e[13]||(e[13]=s("p",{class:"text-sm font-medium"},"Published in Mica, not on the website yet",-1)),s("p",vt," Mica tries again every minute. If this stays, tell the person who runs Mica: "+l(b.value.pendingPush.reason),1)])):i("",!0),b.value.refused?(n(),o("div",gt,[e[14]||(e[14]=s("p",{class:"text-sm font-medium text-danger"},"The last publication was refused",-1)),s("p",bt," Its changes are listed below again. Tell the person who runs Mica: "+l(b.value.refused.reason),1)])):i("",!0),b.value.conflicts.length>0?(n(),o("section",yt,[e[16]||(e[16]=s("h2",{id:"conflicts-heading",class:"text-sm font-semibold"}," Changed on the website while you edited ",-1)),e[17]||(e[17]=s("p",{class:"text-xs text-muted"}," Choose a version for each. Until you do, nothing can be published and the website's newer changes stay out of Mica. ",-1)),s("ul",ft,[(n(!0),o(m,null,B(b.value.conflicts,a=>{var k,T,A,V;return n(),o("li",{key:a.group,class:"p-4"},[s("p",xt,l(a.label),1),s("p",wt,"It "+l(Se[a.upstream])+".",1),a.target?(n(),o(m,{key:0},[(k=C.value[a.group])!=null&&k.loading?(n(),o("p",kt,"Comparing…")):(T=C.value[a.group])!=null&&T.error?(n(),o("p",_t,l((A=C.value[a.group])==null?void 0:A.error),1)):(V=C.value[a.group])!=null&&V.comparison?(n(),o(m,{key:2},[e[15]||(e[15]=s("p",{class:"mt-2 text-xs text-muted"},"The website's version, then yours:",-1)),S(ve,{comparison:C.value[a.group].comparison,fields:le(a.target)},null,8,["comparison","fields"])],64)):i("",!0)],64)):i("",!0),U.value===a?(n(),o("p",Ct," This deletes the entry you created. Press the button again to confirm. ")):i("",!0),s("div",Tt,[s("button",{type:"button",class:"btn-secondary",disabled:O.value!==null,onClick:p=>ue(a,"mine")},l(a.upstream==="deleted"?"Restore it":"Keep my version"),9,Pt),s("button",{type:"button",class:"btn-ghost",disabled:O.value!==null,onClick:p=>ue(a,"website")},l(a.upstream==="deleted"?"Accept the deletion":"Use the website's version"),9,Mt)])])}),128))])])):i("",!0)],64)):i("",!0),xe.value?(n(),o("div",St,[e[19]||(e[19]=s("p",{class:"text-sm font-medium text-warning"},"Published here, but not sent to the website yet",-1)),s("p",$t,l(((G=W.value)==null?void 0:G.pushError)??"Try again to send it. Nothing is published twice."),1),s("button",{type:"button",class:"btn-secondary mt-2.5",disabled:F.value,onClick:Ce},l(F.value?"Sending…":"Try again"),9,Dt),S(Q,null,{default:P(()=>[...e[18]||(e[18]=[s("p",null,[g('The commit is in your checkout. "Try again" runs '),s("code",null,"git push"),g(" and never commits again.")],-1)])]),_:1})])):i("",!0),w.value>0?(n(),o("div",Lt,[e[21]||(e[21]=s("p",{class:"text-sm font-medium text-warning"},"Publishing waits for other work",-1)),s("p",Nt," This copy of the website has "+l(H(w.value,"change","changes"))+" that "+l(w.value===1?"was":"were")+" not made in Mica and "+l(w.value===1?"is":"are")+" not on the website yet. Publishing would send "+l(w.value===1?"it":"them")+" too. ",1),S(Q,null,{default:P(()=>[s("p",null,[g(l(H(w.value,"commit","commits"))+" on this branch "+l(w.value===1?"is":"are")+" on no remote. Push "+l(w.value===1?"it":"them")+" with ",1),e[20]||(e[20]=s("code",null,"git push",-1)),g(", or move "+l(w.value===1?"it":"them")+" to another branch. Then publish. ",1)])]),_:1})])):i("",!0),c(r).validation.ok?i("",!0):(n(),o("div",Rt,[e[22]||(e[22]=s("p",{class:"text-sm font-medium text-danger"},"Some changes cannot be published yet",-1)),e[23]||(e[23]=s("p",{class:"mt-1 text-xs text-muted"},"Fix them, or publish the other changes without them.",-1)),s("ul",Wt,[(n(!0),o(m,null,B(c(r).validation.problems,a=>(n(),o("li",{key:a.path},[s("span",Et,l(a.label),1),(n(!0),o(m,null,B(a.issues,(k,T)=>(n(),o(m,{key:T},[g(l(T===0?"—":";")+" ",1),se(a.path,k.path)?(n(),J(u,{key:0,to:se(a.path,k.path),class:"underline underline-offset-2 hover:no-underline"},{default:P(()=>[g(l(k.message),1)]),_:2},1032,["to"])):(n(),o(m,{key:1},[g(l(k.message),1)],64))],64))),128))]))),128))])])),c(h).length===0?(n(),o("div",It,[...e[24]||(e[24]=[s("p",{class:"text-sm font-medium"},"Nothing waiting to be published",-1),s("p",{class:"mt-1 text-sm text-muted"}," Saved changes collect here until somebody publishes them. Right now the website has everything. ",-1)])])):(n(),o("section",At,[s("div",Vt,[s("h2",Bt,l(H(c(h).length,"saved change","saved changes")),1),c(r).publish.enabled&&oe.value.length>1?(n(),o("div",Ft,[s("button",{type:"button",class:"btn-ghost text-xs",onClick:e[0]||(e[0]=a=>ne(!0))},"Select all"),s("button",{type:"button",class:"btn-ghost text-xs",onClick:e[1]||(e[1]=a=>ne(!1))},"Select none")])):i("",!0)]),s("ul",Yt,[(n(!0),o(m,null,B(c(h),a=>{var k,T,A,V;return n(),o("li",{key:a.key,class:"flex items-start gap-3 p-4"},[c(r).publish.enabled?(n(),o("input",{key:0,id:`publish-${a.key}`,type:"checkbox",class:"mt-1 h-4 w-4 shrink-0",checked:_.value.has(a.key),disabled:E.value.has(a.key)||L.value,"aria-label":`Publish ${a.label}`,onChange:p=>fe(a.key)},null,40,jt)):i("",!0),s("div",qt,[s("div",zt,[(n(),J(Ye(a.link?"RouterLink":"p"),Fe({ref_for:!0},a.link?{to:a.link}:{},{class:["text-sm font-medium",a.link&&"hover:underline"]}),{default:P(()=>[g(l(a.label),1)]),_:2},1040,["class"])),s("span",{class:me(["text-xs",a.state==="removed"?"text-danger":a.state==="new"?"text-success":"text-muted"])},l(we[a.state]),3),a.savedAt?(n(),o("span",Kt," · saved "+l(c(Qe)(a.savedAt)),1)):i("",!0),a.key.startsWith("media:")&&a.state==="new"&&!be.value.has(a.key)?(n(),o("span",Ot," · not in any field yet ")):i("",!0)]),Y.value.has(a.key)?(n(),o("p",Ut," Fix this first: "+l(Y.value.get(a.key).flatMap(p=>p.issues.map(Le=>Le.message)).join("; ")),1)):E.value.has(a.key)?(n(),o("p",Ht," It uses something that must be fixed first. ")):i("",!0),a.needs.length>0?(n(),o("p",Gt," Published together with "+l(a.needs.map(p=>ge.value.get(p)??p).join(", "))+", which it uses. ",1)):i("",!0),a.target?(n(),o(m,{key:3},[(k=x.value[a.key])!=null&&k.loading?(n(),o("p",Jt," Comparing… ")):(T=x.value[a.key])!=null&&T.error?(n(),o("p",Qt,l((A=x.value[a.key])==null?void 0:A.error),1)):(V=x.value[a.key])!=null&&V.comparison?(n(),J(ve,{key:2,comparison:x.value[a.key].comparison,fields:le(a.target)},null,8,["comparison","fields"])):i("",!0)],64)):(n(),o("ul",Xt,[(n(!0),o(m,null,B(a.fileChanges,p=>(n(),o("li",{key:p.path,class:"flex items-baseline gap-2 text-xs text-muted"},[s("span",{class:me(["w-16 shrink-0 font-mono text-[11px]",p.kind==="delete"?"text-danger":p.kind==="create"?"text-success":""])},l(ke[p.kind]),3),s("span",Zt,l(p.path),1)]))),128))]))]),s("button",{type:"button",class:"btn-ghost shrink-0 text-xs",onClick:p=>N.value=a}," Discard ",8,es)])}),128))])])),c(h).length>0&&c(r).publish.enabled?(n(),o("section",ts,[s("h2",ss,l(I.value.length===0?"Choose the changes to publish":`Publish ${H(I.value.length,"change","changes")}`),1),e[30]||(e[30]=s("p",{class:"mt-1 text-xs text-muted"}," The website is rebuilt after you publish. Changes that you do not choose stay saved here. ",-1)),s("form",{class:"mt-3 space-y-2",onSubmit:e[3]||(e[3]=Ee(a=>re.value&&_e(),["prevent"]))},[e[25]||(e[25]=s("label",{for:"publish-summary",class:"field-label"},"Say what changed",-1)),s("div",as,[Ie(s("input",{id:"publish-summary","onUpdate:modelValue":e[2]||(e[2]=a=>j.value=a),type:"text",class:"input min-w-0 flex-1",maxlength:"500",disabled:L.value},null,8,ns),[[Ae,j.value]]),s("button",{type:"submit",class:"btn-primary",disabled:!re.value},l(L.value?"Publishing…":"Publish"),9,os)])],32),S(Q,null,{default:P(()=>[q.value?(n(),o("p",ls,[e[28]||(e[28]=g(" One commit of the chosen files",-1)),c(r).branch?(n(),o(m,{key:0},[e[26]||(e[26]=g(" on branch ",-1)),s("span",is,l(c(r).branch),1)],64)):i("",!0),c(r).head?(n(),o(m,{key:1},[e[27]||(e[27]=g(", after ",-1)),s("span",rs,l(de(c(r).head)),1)],64)):i("",!0),e[29]||(e[29]=g(", pushed with your own Git configuration. The summary is the commit message. ",-1))])):(n(),o("p",us," One commit of the chosen files to the content repository, which starts your website's build. The summary is the commit message. "))]),_:1})])):i("",!0)],64)):(n(),o("p",ds,"The list of changes could not be loaded. Reload to try again."))]),S(Ge,{open:N.value!==null,title:`Discard the changes to “${(ce=N.value)==null?void 0:ce.label}”?`,"confirm-label":"Discard",destructive:"",busy:Z.value,onCancel:e[4]||(e[4]=a=>N.value=null),onConfirm:Te},{default:P(()=>[...e[31]||(e[31]=[s("p",null," This puts it back as it was at the last publication: something new is deleted, and something changed or removed comes back. It cannot be undone. ",-1)])]),_:1},8,["open","title","busy"])],64)}}});export{ys as default};
|
|
7
|
+
//# sourceMappingURL=ChangesView-Dp79M2fs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChangesView-Dp79M2fs.js","sources":["../../../../common/temp/node_modules/.pnpm/@lucide+vue@1.55.0_vue@3.5.43_typescript@5.9.3_/node_modules/@lucide/vue/dist/esm/icons/refresh-cw.mjs","../../src/views/ChangesView.vue"],"sourcesContent":["/**\n * @license @lucide/vue v1.55.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconData = {\n name: \"refresh-cw\",\n size: 24,\n node: [\n [\"path\", { d: \"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8\", key: \"v9h5vc\" }],\n [\"path\", { d: \"M21 3v5h-5\", key: \"1q7to0\" }],\n [\"path\", { d: \"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16\", key: \"3uifl3\" }],\n [\"path\", { d: \"M8 16H3v5\", key: \"1cv678\" }]\n ]\n};\nconst RefreshCw = createLucideIcon(__iconData);\n\nexport { __iconData, RefreshCw as default };\n//# sourceMappingURL=refresh-cw.mjs.map\n","<script setup lang=\"ts\">\n/**\n * The saved changes that are not on the website yet, and Publish. The whole\n * site shares them; the editor chooses which of them to publish now, and the\n * rest stays saved. `owner` changes only the developer details, not the words.\n */\n\nimport { computed, onMounted, ref, watch } from \"vue\";\nimport { RefreshCw } from \"@lucide/vue\";\n\nimport type { FieldMap } from \"@micacms/core\";\n\nimport {\n api,\n ApiError,\n type Comparison,\n type CompareTarget,\n type FileChange,\n type PublishOutcome,\n type SyncConflict,\n} from \"@/api\";\nimport ChangeComparison from \"@/components/ChangeComparison.vue\";\nimport ConfirmDialog from \"@/components/ConfirmDialog.vue\";\nimport DeveloperDetails from \"@/components/DeveloperDetails.vue\";\nimport PageHeader from \"@/components/PageHeader.vue\";\nimport {\n blockedEdits,\n problemsByEdit,\n publishSummary,\n reviewedPaths,\n withNeeds,\n withoutDependents,\n type Edit,\n} from \"@/lib/edits\";\nimport { relativeTime } from \"@/lib/format\";\nimport { useSchema } from \"@/stores/schema\";\nimport { useStaging } from \"@/stores/staging\";\nimport { useToast } from \"@/stores/toast\";\n\nconst schema = useSchema();\nconst staging = useStaging();\nconst toast = useToast();\n\nconst loading = ref(true);\nconst publishing = ref(false);\nconst pushing = ref(false);\nconst discardTarget = ref<Edit | null>(null);\nconst discarding = ref(false);\n\n/** The last publication on this page, for the success panel. */\nconst published = ref<{ revision: string | null } | null>(null);\n\n/** A publication in the developer's checkout that did not reach the website. */\nconst pendingPush = ref<PublishOutcome | null>(null);\n\nconst status = staging.status;\n\n/** One row per edit, never per file — see `lib/edits.ts`. */\nconst edits = staging.edits;\n\nconst problems = computed(() => problemsByEdit(edits.value, status.value?.validation.problems ?? []));\n/** Edits that cannot be published now: a problem in them, or in what they need. */\nconst blocked = computed(() => blockedEdits(edits.value, problems.value));\nconst labelOf = computed(() => new Map(edits.value.map((edit) => [edit.key, edit.label])));\n/** Edits that another pending edit uses: a new shared upload outside this set is not in any field yet. */\nconst neededKeys = computed(() => new Set(edits.value.flatMap((edit) => edit.needs)));\n\n/** Where a problem can be fixed: its entry or settings page, at the field. */\nfunction fixLink(problemPath: string, field: string) {\n const edit = edits.value.find((candidate) =>\n (problems.value.get(candidate.key) ?? []).some((problem) => problem.path === problemPath),\n );\n return edit?.link ? { ...edit.link, ...(field ? { query: { field } } : {}) } : null;\n}\n\n/* ------------------------------------------------- the selection */\n\n/**\n * The edits to publish now. A new edit starts selected unless it is blocked;\n * the editor's own choices stay when the list refreshes. An edit always comes\n * with the new edits it needs, and goes with the edits that need it.\n */\nconst selected = ref(new Set<string>());\nconst offered = new Set<string>();\n\nfunction updateSelection(next: Edit[]): void {\n const keys = new Set(next.map((edit) => edit.key));\n const kept = new Set([...selected.value].filter((key) => keys.has(key) && !blocked.value.has(key)));\n for (const edit of next) {\n // An edit that is blocked when it first appears is offered once it is fixed.\n if (offered.has(edit.key) || blocked.value.has(edit.key)) continue;\n offered.add(edit.key);\n kept.add(edit.key);\n }\n selected.value = withNeeds(kept, next);\n}\n\nfunction toggle(key: string): void {\n selected.value = selected.value.has(key)\n ? withoutDependents(selected.value, key, edits.value)\n : withNeeds([...selected.value, key], edits.value);\n}\n\nfunction selectAll(on: boolean): void {\n selected.value = new Set(on ? selectable.value.map((edit) => edit.key) : []);\n}\n\nconst chosen = computed(() => edits.value.filter((edit) => selected.value.has(edit.key)));\nconst selectable = computed(() => edits.value.filter((edit) => !blocked.value.has(edit.key)));\n\n/** The summary: Mica's suggestion until the editor types their own. */\nconst typed = ref<string | null>(null);\nconst summary = computed({\n get: () => typed.value ?? publishSummary(chosen.value),\n set: (value: string) => {\n typed.value = value;\n },\n});\n\n/* ------------------------------------------------- before/after */\n\ninterface LoadedComparison {\n loading: boolean;\n error: string | null;\n comparison: Comparison | null;\n}\n\nconst comparisons = ref<Record<string, LoadedComparison>>({});\n\n/** The compared document's fields — null for an order comparison. */\nfunction fieldsFor(target: CompareTarget): FieldMap | null {\n if (target.kind === \"entry\") return schema.collection(target.collection)?.fields ?? null;\n if (target.kind === \"singleton\") return schema.singleton(target.name)?.fields ?? null;\n return null;\n}\n\nasync function loadComparison(edit: Edit): Promise<void> {\n if (!edit.target) return;\n comparisons.value[edit.key] = { loading: true, error: null, comparison: null };\n try {\n const comparison = await api.staging.compare(edit.target);\n comparisons.value[edit.key] = { loading: false, error: null, comparison };\n } catch (error) {\n comparisons.value[edit.key] = {\n loading: false,\n error: error instanceof ApiError ? error.message : \"Could not load the comparison.\",\n comparison: null,\n };\n }\n}\n\n// Comparisons load with the change list, with nothing to click.\nwatch(\n edits,\n (next) => {\n updateSelection(next);\n for (const edit of next) {\n if (edit.target && !comparisons.value[edit.key]) void loadComparison(edit);\n }\n },\n { immediate: true },\n);\n\n/* ------------------------------------------------- state */\n\n/** The developer's checkout: the details for developers name Git. */\nconst isTree = computed(() => status.value?.owner === \"developer\");\nconst sync = computed(() => status.value?.sync ?? null);\n\n/** Publications made here that did not reach the website — also after a restart. */\nconst waitingToSend = computed(\n () => isTree.value && (pendingPush.value !== null || (status.value?.unpushed?.mica ?? 0) > 0),\n);\n/** Work in the developer's checkout that Publish would send too, so it waits. */\nconst otherWork = computed(() => (isTree.value ? (status.value?.unpushed?.other ?? 0) : 0));\n\nconst canPublish = computed(\n () =>\n (status.value?.publish.enabled ?? false) &&\n chosen.value.length > 0 &&\n summary.value.trim() !== \"\" &&\n otherWork.value === 0 &&\n !publishing.value,\n);\n\nconst stateWord: Record<Edit[\"state\"], string> = {\n new: \"New\",\n changed: \"Changed\",\n removed: \"Will be removed\",\n};\n\nconst kindWord: Record<FileChange[\"kind\"], string> = {\n create: \"Added\",\n update: \"Changed\",\n delete: \"Removed\",\n};\n\nasync function refresh(): Promise<void> {\n // Forget the comparisons first, so the edits watcher reloads every one of\n // them against the refreshed change set instead of showing a stale panel.\n comparisons.value = {};\n await staging.refresh();\n for (const edit of edits.value) {\n if (edit.target && !comparisons.value[edit.key]) void loadComparison(edit);\n }\n loading.value = false;\n}\n\nonMounted(refresh);\n\nasync function publish(): Promise<void> {\n publishing.value = true;\n published.value = null;\n try {\n // Exactly what the editor sees here, at the revision they see it: a file\n // saved again since makes the server refuse rather than publish it unseen.\n const outcome = await api.staging.publish(summary.value.trim(), reviewedPaths(chosen.value));\n typed.value = null;\n\n if (outcome.state === \"published\") {\n pendingPush.value = null;\n published.value = { revision: outcome.revision };\n } else if (isTree.value) {\n // Only the sending failed. Keep \"Try again\" visible: Publish again would\n // publish nothing new.\n pendingPush.value = outcome;\n toast.error(\"Published here, but not sent to the website.\", outcome.pushError);\n } else {\n toast.error(\"Published in Mica, not on the website yet.\", \"Mica tries again every minute.\");\n }\n\n await staging.refresh();\n } catch (error) {\n if (error instanceof ApiError) {\n toast.error(error.message, error.issues[0]?.message);\n // A conflict or a validation refusal means the list moved: show the truth.\n await staging.refresh();\n } else {\n toast.error(\"Could not publish.\");\n }\n } finally {\n publishing.value = false;\n }\n}\n\nasync function retryPush(): Promise<void> {\n pushing.value = true;\n try {\n const outcome = await api.staging.push();\n if (outcome.state === \"published\") {\n pendingPush.value = null;\n published.value = { revision: outcome.revision };\n } else {\n pendingPush.value = outcome;\n toast.error(\"It could not be sent again.\", outcome.pushError);\n }\n await staging.refresh();\n } catch (error) {\n toast.error(error instanceof ApiError ? error.message : \"Could not send it to the website.\");\n } finally {\n pushing.value = false;\n }\n}\n\nasync function discard(): Promise<void> {\n const edit = discardTarget.value;\n if (!edit) return;\n\n discarding.value = true;\n try {\n await api.staging.discard(edit.fileChanges.map((change) => change.path));\n toast.success(`Discarded the changes to ${edit.label}.`);\n discardTarget.value = null;\n await staging.refresh();\n } catch (error) {\n toast.error(error instanceof ApiError ? error.message : \"Could not discard.\");\n } finally {\n discarding.value = false;\n }\n}\n\n/* --------------------------------------------- Mica's own clone */\n\nconst syncing = ref(false);\nconst resolving = ref<string | null>(null);\n/** \"Use the website's version\" on a new entry deletes it, so it asks first. */\nconst confirmWebsite = ref<SyncConflict | null>(null);\n\nasync function syncNow(): Promise<void> {\n syncing.value = true;\n try {\n await api.staging.sync();\n await refresh();\n } catch (error) {\n toast.error(error instanceof ApiError ? error.message : \"Could not reach the website's files.\");\n } finally {\n syncing.value = false;\n }\n}\n\n/** Whether taking the website's version would delete an entry the editor created. */\nfunction discardsNewWork(conflict: SyncConflict): boolean {\n const created = new Set(\n (status.value?.changes ?? []).filter((change) => change.kind === \"create\").map((change) => change.path),\n );\n return conflict.paths.some((path) => created.has(path));\n}\n\nasync function resolve(conflict: SyncConflict, choice: \"mine\" | \"website\"): Promise<void> {\n if (choice === \"website\" && discardsNewWork(conflict) && confirmWebsite.value !== conflict) {\n confirmWebsite.value = conflict;\n return;\n }\n confirmWebsite.value = null;\n resolving.value = conflict.group;\n try {\n await api.staging.resolve(conflict.group, choice);\n toast.success(choice === \"mine\" ? `Kept your version of ${conflict.label}.` : `Took the website's version of ${conflict.label}.`);\n await refresh();\n } catch (error) {\n toast.error(error instanceof ApiError ? error.message : \"Could not resolve the conflict.\");\n } finally {\n resolving.value = null;\n }\n}\n\nconst upstreamWords: Record<SyncConflict[\"upstream\"], string> = {\n changed: \"was changed on the website while you edited it\",\n deleted: \"was deleted on the website while you edited it\",\n added: \"was also created on the website\",\n};\n\nconst conflictComparisons = ref<Record<string, LoadedComparison>>({});\n\nasync function loadConflictComparison(conflict: SyncConflict): Promise<void> {\n if (!conflict.target) return;\n conflictComparisons.value[conflict.group] = { loading: true, error: null, comparison: null };\n try {\n const comparison = await api.staging.compare(conflict.target, \"origin\");\n conflictComparisons.value[conflict.group] = { loading: false, error: null, comparison };\n } catch (error) {\n conflictComparisons.value[conflict.group] = {\n loading: false,\n error: error instanceof ApiError ? error.message : \"Could not load the comparison.\",\n comparison: null,\n };\n }\n}\n\nwatch(\n () => sync.value?.conflicts ?? [],\n (conflicts) => {\n for (const conflict of conflicts) {\n if (!conflictComparisons.value[conflict.group]) void loadConflictComparison(conflict);\n }\n },\n);\n\nfunction since(iso: string): string {\n return new Date(iso).toLocaleString();\n}\n\nfunction short(revision: string): string {\n return /^[0-9a-f]{20,}$/i.test(revision) ? revision.slice(0, 7) : revision;\n}\n\nfunction plural(count: number, one: string, many: string): string {\n return `${count} ${count === 1 ? one : many}`;\n}\n</script>\n\n<template>\n <PageHeader title=\"Publish\" subtitle=\"Saved changes that are not on the website yet\">\n <button type=\"button\" class=\"btn-ghost px-2\" :disabled=\"loading\" @click=\"refresh\">\n <RefreshCw :size=\"16\" aria-hidden=\"true\" />\n <span class=\"sr-only\">Refresh the list of changes</span>\n </button>\n </PageHeader>\n\n <div class=\"mx-auto max-w-3xl space-y-5 px-4 py-6 sm:px-6\">\n <p v-if=\"loading\" class=\"text-sm text-muted\">Loading…</p>\n\n <template v-else-if=\"status\">\n <div v-if=\"published\" role=\"status\" class=\"rounded-md border border-success/15 bg-success-soft p-4\">\n <p class=\"text-sm font-medium text-success\">Published</p>\n <p class=\"mt-1 text-xs text-muted\">\n Your website is being rebuilt now. This usually takes a few minutes.\n </p>\n <DeveloperDetails v-if=\"published.revision\">\n <p>Commit <span class=\"font-mono\">{{ short(published.revision) }}</span>.</p>\n </DeveloperDetails>\n </div>\n\n <div v-if=\"status.model?.warning\" role=\"alert\" class=\"rounded-md border border-warning/15 bg-warning-soft p-4\">\n <p class=\"text-sm font-medium text-warning\">Publishing waits for the developer</p>\n <p class=\"mt-1 text-xs text-muted\">\n The website's new content model cannot be read. You can go on saving. Tell the developer:\n {{ status.model.warning }}\n </p>\n </div>\n\n <!-- Publishing unavailable: still an honest, read-only list. -->\n <div\n v-if=\"!status.publish.enabled\"\n class=\"rounded-md border border-line bg-subtle p-4 text-sm text-muted\"\n >\n <p class=\"font-medium text-ink\">Publishing is not available here</p>\n <p class=\"mt-1\">{{ status.publish.reason }}</p>\n </div>\n\n <!-- Mica's own clone: shown only when something needs attention. -->\n <template v-if=\"sync\">\n <div v-if=\"sync.restartRequired\" role=\"alert\" class=\"rounded-md border border-warning/15 bg-warning-soft p-4\">\n <p class=\"text-sm font-medium text-warning\">The way the website stores its files changed</p>\n <p class=\"mt-1 text-xs text-muted\">\n You can go on saving. To publish, ask the person who runs Mica to restart it.\n </p>\n </div>\n\n <div v-if=\"sync.error\" role=\"alert\" class=\"rounded-md border border-warning/15 bg-warning-soft p-4\">\n <p class=\"text-sm font-medium text-warning\">Mica cannot reach the website's files since {{ since(sync.error.since) }}</p>\n <p class=\"mt-1 text-xs text-muted\">\n You can go on saving. Mica tries again every minute. If this stays, tell the person who runs Mica:\n {{ sync.error.message }}\n </p>\n <button type=\"button\" class=\"btn-secondary mt-2.5\" :disabled=\"syncing\" @click=\"syncNow\">\n {{ syncing ? \"Trying…\" : \"Try again\" }}\n </button>\n </div>\n\n <div v-if=\"sync.pendingPush\" role=\"status\" class=\"rounded-md border border-line bg-subtle p-4\">\n <p class=\"text-sm font-medium\">Published in Mica, not on the website yet</p>\n <p class=\"mt-1 text-xs text-muted\">\n Mica tries again every minute. If this stays, tell the person who runs Mica:\n {{ sync.pendingPush.reason }}\n </p>\n </div>\n\n <div v-if=\"sync.refused\" role=\"alert\" class=\"rounded-md border border-danger/15 bg-danger-soft p-4\">\n <p class=\"text-sm font-medium text-danger\">The last publication was refused</p>\n <p class=\"mt-1 text-xs text-muted\">\n Its changes are listed below again. Tell the person who runs Mica: {{ sync.refused.reason }}\n </p>\n </div>\n\n <section v-if=\"sync.conflicts.length > 0\" aria-labelledby=\"conflicts-heading\" class=\"space-y-3\">\n <h2 id=\"conflicts-heading\" class=\"text-sm font-semibold\">\n Changed on the website while you edited\n </h2>\n <p class=\"text-xs text-muted\">\n Choose a version for each. Until you do, nothing can be published and the website's newer\n changes stay out of Mica.\n </p>\n <ul class=\"card divide-y divide-line\">\n <li v-for=\"conflict in sync.conflicts\" :key=\"conflict.group\" class=\"p-4\">\n <p class=\"text-sm font-medium\">{{ conflict.label }}</p>\n <p class=\"mt-0.5 text-xs text-muted\">It {{ upstreamWords[conflict.upstream] }}.</p>\n\n <template v-if=\"conflict.target\">\n <p v-if=\"conflictComparisons[conflict.group]?.loading\" class=\"mt-2 text-xs text-muted\">Comparing…</p>\n <p v-else-if=\"conflictComparisons[conflict.group]?.error\" class=\"mt-2 text-xs text-danger\">\n {{ conflictComparisons[conflict.group]?.error }}\n </p>\n <template v-else-if=\"conflictComparisons[conflict.group]?.comparison\">\n <p class=\"mt-2 text-xs text-muted\">The website's version, then yours:</p>\n <ChangeComparison\n :comparison=\"conflictComparisons[conflict.group]!.comparison!\"\n :fields=\"fieldsFor(conflict.target)\"\n />\n </template>\n </template>\n\n <p v-if=\"confirmWebsite === conflict\" role=\"alert\" class=\"mt-2 text-xs text-danger\">\n This deletes the entry you created. Press the button again to confirm.\n </p>\n <div class=\"mt-2.5 flex flex-wrap gap-2\">\n <button\n type=\"button\"\n class=\"btn-secondary\"\n :disabled=\"resolving !== null\"\n @click=\"resolve(conflict, 'mine')\"\n >\n {{ conflict.upstream === \"deleted\" ? \"Restore it\" : \"Keep my version\" }}\n </button>\n <button\n type=\"button\"\n class=\"btn-ghost\"\n :disabled=\"resolving !== null\"\n @click=\"resolve(conflict, 'website')\"\n >\n {{ conflict.upstream === \"deleted\" ? \"Accept the deletion\" : \"Use the website's version\" }}\n </button>\n </div>\n </li>\n </ul>\n </section>\n </template>\n\n <!-- The developer's checkout: a publication that did not reach the website. -->\n <div v-if=\"waitingToSend\" role=\"alert\" class=\"rounded-md border border-warning/15 bg-warning-soft p-4\">\n <p class=\"text-sm font-medium text-warning\">Published here, but not sent to the website yet</p>\n <p class=\"mt-1 text-xs text-muted\">\n {{ pendingPush?.pushError ?? \"Try again to send it. Nothing is published twice.\" }}\n </p>\n <button type=\"button\" class=\"btn-secondary mt-2.5\" :disabled=\"pushing\" @click=\"retryPush\">\n {{ pushing ? \"Sending…\" : \"Try again\" }}\n </button>\n <DeveloperDetails>\n <p>The commit is in your checkout. \"Try again\" runs <code>git push</code> and never commits again.</p>\n </DeveloperDetails>\n </div>\n\n <div v-if=\"otherWork > 0\" role=\"alert\" class=\"rounded-md border border-warning/15 bg-warning-soft p-4\">\n <p class=\"text-sm font-medium text-warning\">Publishing waits for other work</p>\n <p class=\"mt-1 text-xs text-muted\">\n This copy of the website has {{ plural(otherWork, \"change\", \"changes\") }} that\n {{ otherWork === 1 ? \"was\" : \"were\" }} not made in Mica and {{ otherWork === 1 ? \"is\" : \"are\" }} not on the\n website yet. Publishing would send {{ otherWork === 1 ? \"it\" : \"them\" }} too.\n </p>\n <DeveloperDetails>\n <p>\n {{ plural(otherWork, \"commit\", \"commits\") }} on this branch {{ otherWork === 1 ? \"is\" : \"are\" }} on no\n remote. Push {{ otherWork === 1 ? \"it\" : \"them\" }} with <code>git push</code>, or move\n {{ otherWork === 1 ? \"it\" : \"them\" }} to another branch. Then publish.\n </p>\n </DeveloperDetails>\n </div>\n\n <div\n v-if=\"!status.validation.ok\"\n role=\"alert\"\n class=\"rounded-md border border-danger/15 bg-danger-soft p-4\"\n >\n <p class=\"text-sm font-medium text-danger\">Some changes cannot be published yet</p>\n <p class=\"mt-1 text-xs text-muted\">Fix them, or publish the other changes without them.</p>\n <ul class=\"mt-1.5 space-y-1 text-xs text-danger\">\n <li v-for=\"problem in status.validation.problems\" :key=\"problem.path\">\n <span class=\"font-medium\">{{ problem.label }}</span>\n <template v-for=\"(issue, index) in problem.issues\" :key=\"index\">\n {{ index === 0 ? \"—\" : \";\" }}\n <RouterLink\n v-if=\"fixLink(problem.path, issue.path)\"\n :to=\"fixLink(problem.path, issue.path)!\"\n class=\"underline underline-offset-2 hover:no-underline\"\n >\n {{ issue.message }}\n </RouterLink>\n <template v-else>{{ issue.message }}</template>\n </template>\n </li>\n </ul>\n </div>\n\n <div v-if=\"edits.length === 0\" class=\"card p-8 text-center\">\n <p class=\"text-sm font-medium\">Nothing waiting to be published</p>\n <p class=\"mt-1 text-sm text-muted\">\n Saved changes collect here until somebody publishes them. Right now the website has\n everything.\n </p>\n </div>\n\n <section v-else aria-labelledby=\"changes-heading\" class=\"space-y-2\">\n <div class=\"flex flex-wrap items-baseline justify-between gap-2\">\n <h2 id=\"changes-heading\" class=\"text-sm font-semibold\">\n {{ plural(edits.length, \"saved change\", \"saved changes\") }}\n </h2>\n <div v-if=\"status.publish.enabled && selectable.length > 1\" class=\"flex gap-1\">\n <button type=\"button\" class=\"btn-ghost text-xs\" @click=\"selectAll(true)\">Select all</button>\n <button type=\"button\" class=\"btn-ghost text-xs\" @click=\"selectAll(false)\">Select none</button>\n </div>\n </div>\n\n <ul class=\"card divide-y divide-line\">\n <li v-for=\"edit in edits\" :key=\"edit.key\" class=\"flex items-start gap-3 p-4\">\n <input\n v-if=\"status.publish.enabled\"\n :id=\"`publish-${edit.key}`\"\n type=\"checkbox\"\n class=\"mt-1 h-4 w-4 shrink-0\"\n :checked=\"selected.has(edit.key)\"\n :disabled=\"blocked.has(edit.key) || publishing\"\n :aria-label=\"`Publish ${edit.label}`\"\n @change=\"toggle(edit.key)\"\n />\n\n <div class=\"min-w-0 flex-1\">\n <div class=\"flex flex-wrap items-baseline gap-x-2\">\n <component\n :is=\"edit.link ? 'RouterLink' : 'p'\"\n v-bind=\"edit.link ? { to: edit.link } : {}\"\n :class=\"['text-sm font-medium', edit.link && 'hover:underline']\"\n >\n {{ edit.label }}\n </component>\n <span\n :class=\"[\n 'text-xs',\n edit.state === 'removed' ? 'text-danger' : edit.state === 'new' ? 'text-success' : 'text-muted',\n ]\"\n >\n {{ stateWord[edit.state] }}\n </span>\n <span v-if=\"edit.savedAt\" class=\"text-xs text-muted\">\n · saved {{ relativeTime(edit.savedAt) }}\n </span>\n <span\n v-if=\"edit.key.startsWith('media:') && edit.state === 'new' && !neededKeys.has(edit.key)\"\n class=\"text-xs text-warning\"\n >\n · not in any field yet\n </span>\n </div>\n\n <p v-if=\"problems.has(edit.key)\" class=\"mt-1 text-xs text-danger\">\n Fix this first: {{ problems.get(edit.key)!.flatMap((problem) => problem.issues.map((issue) => issue.message)).join(\"; \") }}\n </p>\n <p v-else-if=\"blocked.has(edit.key)\" class=\"mt-1 text-xs text-danger\">\n It uses something that must be fixed first.\n </p>\n <p v-if=\"edit.needs.length > 0\" class=\"mt-1 text-xs text-muted\">\n Published together with {{ edit.needs.map((key) => labelOf.get(key) ?? key).join(\", \") }}, which it uses.\n </p>\n\n <!-- What the change does. Edits with a document get the\n before/after view and no file paths; media and everything\n else have only their files to show. -->\n <template v-if=\"edit.target\">\n <p v-if=\"comparisons[edit.key]?.loading\" class=\"mt-2 text-xs text-muted\">\n Comparing…\n </p>\n <p v-else-if=\"comparisons[edit.key]?.error\" class=\"mt-2 text-xs text-danger\">\n {{ comparisons[edit.key]?.error }}\n </p>\n <ChangeComparison\n v-else-if=\"comparisons[edit.key]?.comparison\"\n :comparison=\"comparisons[edit.key]!.comparison!\"\n :fields=\"fieldsFor(edit.target)\"\n />\n </template>\n\n <ul v-else class=\"mt-1 space-y-0.5\">\n <li\n v-for=\"change in edit.fileChanges\"\n :key=\"change.path\"\n class=\"flex items-baseline gap-2 text-xs text-muted\"\n >\n <span\n :class=\"[\n 'w-16 shrink-0 font-mono text-[11px]',\n change.kind === 'delete' ? 'text-danger' : change.kind === 'create' ? 'text-success' : '',\n ]\"\n >\n {{ kindWord[change.kind] }}\n </span>\n <span class=\"break-all font-mono\">{{ change.path }}</span>\n </li>\n </ul>\n </div>\n\n <button type=\"button\" class=\"btn-ghost shrink-0 text-xs\" @click=\"discardTarget = edit\">\n Discard\n </button>\n </li>\n </ul>\n </section>\n\n <section v-if=\"edits.length > 0 && status.publish.enabled\" class=\"card p-4\" aria-labelledby=\"publish-heading\">\n <h2 id=\"publish-heading\" class=\"text-sm font-semibold\">\n {{ chosen.length === 0 ? \"Choose the changes to publish\" : `Publish ${plural(chosen.length, \"change\", \"changes\")}` }}\n </h2>\n <p class=\"mt-1 text-xs text-muted\">\n The website is rebuilt after you publish. Changes that you do not choose stay saved here.\n </p>\n\n <form class=\"mt-3 space-y-2\" @submit.prevent=\"canPublish && publish()\">\n <label for=\"publish-summary\" class=\"field-label\">Say what changed</label>\n <div class=\"flex flex-wrap items-center gap-2\">\n <input\n id=\"publish-summary\"\n v-model=\"summary\"\n type=\"text\"\n class=\"input min-w-0 flex-1\"\n maxlength=\"500\"\n :disabled=\"publishing\"\n />\n <button type=\"submit\" class=\"btn-primary\" :disabled=\"!canPublish\">\n {{ publishing ? \"Publishing…\" : \"Publish\" }}\n </button>\n </div>\n </form>\n\n <DeveloperDetails>\n <p v-if=\"isTree\">\n One commit of the chosen files<template v-if=\"status.branch\"> on branch <span class=\"font-mono\">{{ status.branch }}</span></template><template v-if=\"status.head\">, after <span class=\"font-mono\">{{ short(status.head) }}</span></template>,\n pushed with your own Git configuration. The summary is the commit message.\n </p>\n <p v-else>\n One commit of the chosen files to the content repository, which starts your website's build. The summary\n is the commit message.\n </p>\n </DeveloperDetails>\n </section>\n </template>\n\n <p v-else class=\"text-sm text-muted\">The list of changes could not be loaded. Reload to try again.</p>\n </div>\n\n <ConfirmDialog\n :open=\"discardTarget !== null\"\n :title=\"`Discard the changes to “${discardTarget?.label}”?`\"\n confirm-label=\"Discard\"\n destructive\n :busy=\"discarding\"\n @cancel=\"discardTarget = null\"\n @confirm=\"discard\"\n >\n <p>\n This puts it back as it was at the last publication: something new is deleted, and something changed or\n removed comes back. It cannot be undone.\n </p>\n </ConfirmDialog>\n</template>\n"],"names":["__iconData","RefreshCw","createLucideIcon","schema","useSchema","staging","useStaging","toast","useToast","loading","ref","publishing","pushing","discardTarget","discarding","published","pendingPush","status","edits","problems","computed","problemsByEdit","_a","blocked","blockedEdits","labelOf","edit","neededKeys","fixLink","problemPath","field","candidate","problem","selected","offered","updateSelection","next","keys","kept","key","withNeeds","toggle","withoutDependents","selectAll","on","selectable","chosen","typed","summary","publishSummary","value","comparisons","fieldsFor","target","_b","loadComparison","comparison","api","error","ApiError","watch","isTree","sync","waitingToSend","otherWork","canPublish","stateWord","kindWord","refresh","onMounted","publish","outcome","reviewedPaths","retryPush","discard","change","syncing","resolving","confirmWebsite","syncNow","discardsNewWork","conflict","created","path","resolve","choice","upstreamWords","conflictComparisons","loadConflictComparison","conflicts","since","iso","short","revision","plural","count","one","many","_createVNode","PageHeader","_createElementVNode","_unref","_cache","_hoisted_2","_createElementBlock","_hoisted_3","_Fragment","_openBlock","_hoisted_4","_createBlock","DeveloperDetails","_hoisted_5","_toDisplayString","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19","_hoisted_20","_renderList","_hoisted_21","_hoisted_22","_hoisted_23","_hoisted_24","_c","_d","ChangeComparison","_hoisted_25","_hoisted_26","$event","_hoisted_27","_hoisted_28","_hoisted_29","_hoisted_30","_hoisted_31","_hoisted_32","_hoisted_33","_hoisted_34","_hoisted_35","_hoisted_36","issue","index","_createTextVNode","_component_RouterLink","_hoisted_37","_hoisted_38","_hoisted_39","_hoisted_40","_hoisted_41","_hoisted_42","_hoisted_44","_hoisted_45","_resolveDynamicComponent","_mergeProps","_normalizeClass","_hoisted_46","relativeTime","_hoisted_47","_hoisted_48","_hoisted_49","_hoisted_50","_hoisted_51","_hoisted_52","_hoisted_53","_hoisted_54","_hoisted_55","_hoisted_56","_hoisted_57","_withModifiers","_hoisted_58","_hoisted_60","_hoisted_61","_hoisted_62","_hoisted_63","_hoisted_65","ConfirmDialog"],"mappings":"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","x_google_ignoreList":[0]}
|