@micacms/editor-ui 0.2.1 → 0.3.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/assets/ChangesView-D7n3k873.js +7 -0
- package/dist/assets/ChangesView-D7n3k873.js.map +1 -0
- package/dist/assets/{CollectionView-D9WLbqSZ.js → CollectionView-Cu_ytsrZ.js} +2 -2
- package/dist/assets/{CollectionView-D9WLbqSZ.js.map → CollectionView-Cu_ytsrZ.js.map} +1 -1
- package/dist/assets/ConfirmDialog.vue_vue_type_script_setup_true_lang-C4yhYMWf.js +2 -0
- package/dist/assets/ConfirmDialog.vue_vue_type_script_setup_true_lang-C4yhYMWf.js.map +1 -0
- package/dist/assets/DashboardView-7y5LY2BH.js +2 -0
- package/dist/assets/DashboardView-7y5LY2BH.js.map +1 -0
- package/dist/assets/{EntryView-CJe3KppU.js → EntryView-IyBqYorV.js} +2 -2
- package/dist/assets/EntryView-IyBqYorV.js.map +1 -0
- package/dist/assets/LoginView-C8sJvqmb.js +2 -0
- package/dist/assets/LoginView-C8sJvqmb.js.map +1 -0
- package/dist/assets/{MediaView-Cqqm7JtP.js → MediaView-BVODAshv.js} +2 -2
- package/dist/assets/MediaView-BVODAshv.js.map +1 -0
- package/dist/assets/{NotFoundView-B5GK2_TR.js → NotFoundView-K-fMCruW.js} +2 -2
- package/dist/assets/{NotFoundView-B5GK2_TR.js.map → NotFoundView-K-fMCruW.js.map} +1 -1
- package/dist/assets/{ObjectField-Bk9_hysq.js → ObjectField-CAJPaAKa.js} +2 -2
- package/dist/assets/{ObjectField-Bk9_hysq.js.map → ObjectField-CAJPaAKa.js.map} +1 -1
- package/dist/assets/PageHeader.vue_vue_type_script_setup_true_lang-IPw0xrLa.js +7 -0
- package/dist/assets/{PageHeader.vue_vue_type_script_setup_true_lang-B10dWbKQ.js.map → PageHeader.vue_vue_type_script_setup_true_lang-IPw0xrLa.js.map} +1 -1
- package/dist/assets/{RepeaterField-B0caC5tW.js → RepeaterField-BAnvha76.js} +2 -2
- package/dist/assets/{RepeaterField-B0caC5tW.js.map → RepeaterField-BAnvha76.js.map} +1 -1
- package/dist/assets/SingletonView-C3AqQe6a.js +2 -0
- package/dist/assets/SingletonView-C3AqQe6a.js.map +1 -0
- package/dist/assets/{SystemView-BQLC-ZJl.css → SystemView-CBvzzAoO.css} +1 -1
- package/dist/assets/SystemView-DKA_QdVz.js +3 -0
- package/dist/assets/SystemView-DKA_QdVz.js.map +1 -0
- package/dist/assets/{arrow-right-CRc1EdYX.js → arrow-right-s8aI3aOk.js} +2 -2
- package/dist/assets/{arrow-right-CRc1EdYX.js.map → arrow-right-s8aI3aOk.js.map} +1 -1
- package/dist/assets/{arrow-up-Bvv-t4E4.js → arrow-up-BeQh5rSe.js} +2 -2
- package/dist/assets/{arrow-up-Bvv-t4E4.js.map → arrow-up-BeQh5rSe.js.map} +1 -1
- package/dist/assets/{chevron-down-D6etqIvD.js → chevron-down-BgnDSY3E.js} +2 -2
- package/dist/assets/{chevron-down-D6etqIvD.js.map → chevron-down-BgnDSY3E.js.map} +1 -1
- package/dist/assets/{index-ByBMMOql.js → index-9WVbsgdk.js} +25 -25
- package/dist/assets/index-9WVbsgdk.js.map +1 -0
- package/dist/assets/index-DDeMbcSl.css +1 -0
- package/dist/assets/{plus-BqgcP5r8.js → plus-D6xxK_qW.js} +2 -2
- package/dist/assets/{plus-BqgcP5r8.js.map → plus-D6xxK_qW.js.map} +1 -1
- package/dist/assets/{useField-Dc-2hvX0.js → useField-CQv2TS4g.js} +2 -2
- package/dist/assets/{useField-Dc-2hvX0.js.map → useField-CQv2TS4g.js.map} +1 -1
- package/dist/assets/{useUnsavedChanges-5Jic8gaT.js → useUnsavedChanges-bO5Ha9y6.js} +5 -5
- package/dist/assets/useUnsavedChanges-bO5Ha9y6.js.map +1 -0
- package/dist/brand/apple-touch-icon.png +0 -0
- package/dist/brand/favicon.ico +0 -0
- package/dist/brand/micacms-favicon.svg +1 -0
- package/dist/brand/micacms-wordmark-light.svg +1 -0
- package/dist/brand/micacms-wordmark.svg +1 -0
- package/dist/index.html +6 -4
- package/package.json +2 -2
- package/dist/assets/ChangesView-vaAxTqsV.js +0 -7
- package/dist/assets/ChangesView-vaAxTqsV.js.map +0 -1
- package/dist/assets/ConfirmDialog.vue_vue_type_script_setup_true_lang-XwTu9vH_.js +0 -2
- package/dist/assets/ConfirmDialog.vue_vue_type_script_setup_true_lang-XwTu9vH_.js.map +0 -1
- package/dist/assets/DashboardView-BltT4kYe.js +0 -2
- package/dist/assets/DashboardView-BltT4kYe.js.map +0 -1
- package/dist/assets/EntryView-CJe3KppU.js.map +0 -1
- package/dist/assets/LoginView-Cif8mF1w.js +0 -2
- package/dist/assets/LoginView-Cif8mF1w.js.map +0 -1
- package/dist/assets/MediaView-Cqqm7JtP.js.map +0 -1
- package/dist/assets/PageHeader.vue_vue_type_script_setup_true_lang-B10dWbKQ.js +0 -7
- package/dist/assets/SingletonView-BQnE2LGb.js +0 -2
- package/dist/assets/SingletonView-BQnE2LGb.js.map +0 -1
- package/dist/assets/SystemView-Ca_luUZE.js +0 -3
- package/dist/assets/SystemView-Ca_luUZE.js.map +0 -1
- package/dist/assets/index-ByBMMOql.js.map +0 -1
- package/dist/assets/index-j6Jxa-0x.css +0 -1
- package/dist/assets/useUnsavedChanges-5Jic8gaT.js.map +0 -1
- package/dist/brand/mica-favicon.svg +0 -14
- package/dist/brand/mica-logo-glimmer-light.svg +0 -15
- package/dist/brand/mica-logo-glimmer.svg +0 -15
- package/dist/brand/mica-mark-glimmer.svg +0 -14
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1000 1000" xmlns:c2pa="http://c2pa.org/manifest"><metadata><c2pa:manifest>AAAWgmp1bWIAAAAeanVtZGMycGEAEQAQgAAAqgA4m3EDYzJwYQAAABZcanVtYgAAAEdqdW1kYzJtYQARABCAAACqADibcQN1cm46YzJwYTo0MDg1NGZkMy02NTdiLTRkYjQtYjQ2My1lYmM4ZjAzZjY0MzQAAAADl2p1bWIAAAApanVtZGMyYXMAEQAQgAAAqgA4m3EDYzJwYS5hc3NlcnRpb25zAAAAALxqdW1iAAAARGp1bWRjYm9yABEAEIAAAKoAOJtxE2MycGEuaW5ncmVkaWVudC52MwAAAAAYYzJzaK70xUHz8+rMbJ7x417Bb4cAAABwY2JvcqNpZGM6Zm9ybWF0bWltYWdlL3N2Zyt4bWxqaW5zdGFuY2VJRHgseG1wOmlpZDphZTUzNjZmYi0zZjk5LTQ0MDAtYmFkOC0yOGI5NDZiZWIxZGNscmVsYXRpb25zaGlwaHBhcmVudE9mAAAB4mp1bWIAAABBanVtZGNib3IAEQAQgAAAqgA4m3ETYzJwYS5hY3Rpb25zLnYyAAAAABhjMnNoJ+RB3AtrWX6kCefj29FNAQAAAZljYm9yomdhY3Rpb25zgqJmYWN0aW9ua2MycGEub3BlbmVkanBhcmFtZXRlcnOha2luZ3JlZGllbnRzgaJjdXJseC1zZWxmI2p1bWJmPWMycGEuYXNzZXJ0aW9ucy9jMnBhLmluZ3JlZGllbnQudjNkaGFzaFggEYla8IVXNwd/R82C+QwpBJVsCzhICEVtXmIOacqYJf6kZmFjdGlvbngdY29tLmFudGhyb3BpYy5jbGF1ZGUucHJvdmlkZWRqcGFyYW1ldGVyc6F4H2NvbS5hbnRocm9waWMub3JpZ2luLWNvbmZpZGVuY2VndW5rbm93bmtkZXNjcmlwdGlvbnhmQ2xhdWRlIHByb3ZpZGVkIHRoaXMgZmlsZSBhdCB0aGUgcmVxdWVzdCBvZiBhIHVzZXIgYW5kIG1heSBoYXZlIGNyZWF0ZWQgb3IgbW9kaWZpZWQgdGhlIGZpbGUgY29udGVudHMubXNvZnR3YXJlQWdlbnShZG5hbWVmQ2xhdWRlcmFsbEFjdGlvbnNJbmNsdWRlZPUAAADIanVtYgAAAEBqdW1kY2JvcgARABCAAACqADibcRNjMnBhLmhhc2guZGF0YQAAAAAYYzJzaNFLnEr6exGkpBgPXgeUtmkAAACAY2JvcqVjYWxnZnNoYTI1NmNwYWRNAAAAAAAAAAAAAAAAAGRoYXNoWCAiyEk8P8incWPChhVaZCjm7/F2OcMKqAZHK7ILGCRD2GRuYW1lbmp1bWJmIG1hbmlmZXN0amV4Y2x1c2lvbnOBomVzdGFydBh/Zmxlbmd0aBkeBAAAAj5qdW1iAAAAJ2p1bWRjMmNsABEAEIAAAKoAOJtxA2MycGEuY2xhaW0udjIAAAACD2Nib3KlY2FsZ2ZzaGEyNTZpc2lnbmF0dXJleE1zZWxmI2p1bWJmPS9jMnBhL3VybjpjMnBhOjQwODU0ZmQzLTY1N2ItNGRiNC1iNDYzLWViYzhmMDNmNjQzNC9jMnBhLnNpZ25hdHVyZWppbnN0YW5jZUlEeCx4bXA6aWlkOmJhNTUyMjYyLWU3NTQtNGQ1Mi05ZDhhLWVkMjZkY2FjNTExZXJjcmVhdGVkX2Fzc2VydGlvbnODomN1cmx4LXNlbGYjanVtYmY9YzJwYS5hc3NlcnRpb25zL2MycGEuaW5ncmVkaWVudC52M2RoYXNoWCARiVrwhVc3B39HzYL5DCkElWwLOEgIRW1eYg5pypgl/qJjdXJseCpzZWxmI2p1bWJmPWMycGEuYXNzZXJ0aW9ucy9jMnBhLmFjdGlvbnMudjJkaGFzaFggpBmB4t8Ku4EHMr04Ii4/d+SNizYE2d7H91eEzyM9QEeiY3VybHgpc2VsZiNqdW1iZj1jMnBhLmFzc2VydGlvbnMvYzJwYS5oYXNoLmRhdGFkaGFzaFggunxhaj54b8vg4rBuJV8z31VcoG8GsueqofAVLgeqF050Y2xhaW1fZ2VuZXJhdG9yX2luZm+jZG5hbWVvQW50aHJvcGljIEZpbGVzZ3ZlcnNpb25lMS4wLjBrc3BlY1ZlcnNpb25lMi40LjAAABA4anVtYgAAAChqdW1kYzJjcwARABCAAACqADibcQNjMnBhLnNpZ25hdHVyZQAAABAIY2JvctKEWQISogEmGCFZAgowggIGMIIBjaADAgECAhRA5aAK7sI50L64g/oGQgU9Z1UTADAKBggqhkjOPQQDAzBJMRcwFQYDVQQKEw5BbnRocm9waWMsIFBCQzEuMCwGA1UEAxMlQW50aHJvcGljIENvbnRlbnQgQ3JlZGVudGlhbHMgUm9vdCBDQTAeFw0yNjA4MDcxODQzNTZaFw0yODA4MDYxOTQzNTZaMEQxFzAVBgNVBAoTDkFudGhyb3BpYywgUEJDMSkwJwYDVQQDEyBBbnRocm9waWMgQ2xhdWRlIENvbnRlbnQgU2lnbmluZzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABJh6CmvLUBgFFNU0vUKlOVtE6djd17L5SuwX0LemFisBM3dkd/3cyjxFA3Qo5S46fX0/ihY0VZ7mfb9KF703t5OjWDBWMA4GA1UdDwEB/wQEAwIHgDAVBgNVHSUEDjAMBgorBgEEAYPoXgIBMAwGA1UdEwEB/wQCMAAwHwYDVR0jBBgwFoAUzlHiBIFOZFsj+OPEz5o+nMHXXMIwCgYIKoZIzj0EAwMDZwAwZAIwMXMdFJ4BetLLVY7ORuE9noqbbAZOZn/aArXyTwFAZfKrPzxF2vPoJNf1+UCdg1XGAjBwX1zd9WGqYkqmL5SFqw1QySjr1zJfpJM9+1rdDwSPLMOPOjKuiXjoU/pUUeG9RwmhY3BhZFkNngAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPZYQP374s1TgNel4YhumlEzM+KL8IOHt8Y4eABWeeqfHeu7wxx/EcG5JmZH5d5/L6c8iPukX3jvG4zwEg5hq5j9W0g=</c2pa:manifest></metadata><rect width="1000" height="1000" rx="220" fill="#3F1F2B"/><path fill="#FBF5EC" transform="translate(140.8 718.1) scale(0.38438)" d="M128.0 0V-1118H406.0L418.0 -901Q463.0 -1023 550.0 -1079.0Q637.0 -1135 737.0 -1135Q949.0 -1135 1025.0 -884Q1072.0 -1013 1170.5 -1074.0Q1269.0 -1135 1384.0 -1135Q1538.0 -1135 1639.5 -1035.5Q1741.0 -936 1741.0 -754V0H1441.0V-697Q1441.0 -791 1389.5 -837.5Q1338.0 -884 1263.0 -884Q1178.0 -884 1128.5 -830.0Q1079.0 -776 1079.0 -688V0H789.0V-705Q789.0 -787 740.5 -835.5Q692.0 -884 615.0 -884Q536.0 -884 482.0 -830.5Q428.0 -777 428.0 -676V0Z"/></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="104 -1503 7733 1527" role="img" aria-label="micacms" xmlns:c2pa="http://c2pa.org/manifest"><metadata><c2pa:manifest>AAAWgmp1bWIAAAAeanVtZGMycGEAEQAQgAAAqgA4m3EDYzJwYQAAABZcanVtYgAAAEdqdW1kYzJtYQARABCAAACqADibcQN1cm46YzJwYTpjNDY2YWZjZi0zNjg5LTQ5NzUtOWY1YS03Y2I5Y2MwMGIzNDcAAAADl2p1bWIAAAApanVtZGMyYXMAEQAQgAAAqgA4m3EDYzJwYS5hc3NlcnRpb25zAAAAALxqdW1iAAAARGp1bWRjYm9yABEAEIAAAKoAOJtxE2MycGEuaW5ncmVkaWVudC52MwAAAAAYYzJzaMkEM51jDYs5eqNLhQVg1ioAAABwY2JvcqNpZGM6Zm9ybWF0bWltYWdlL3N2Zyt4bWxqaW5zdGFuY2VJRHgseG1wOmlpZDoxZGEyNmRjMC0zZTQ5LTQ2YWItOGQ4ZC1hYTE1ZDcwYzBjOTFscmVsYXRpb25zaGlwaHBhcmVudE9mAAAB4mp1bWIAAABBanVtZGNib3IAEQAQgAAAqgA4m3ETYzJwYS5hY3Rpb25zLnYyAAAAABhjMnNooG8Wqwd65bd0Vy1Va6javwAAAZljYm9yomdhY3Rpb25zgqJmYWN0aW9ua2MycGEub3BlbmVkanBhcmFtZXRlcnOha2luZ3JlZGllbnRzgaJjdXJseC1zZWxmI2p1bWJmPWMycGEuYXNzZXJ0aW9ucy9jMnBhLmluZ3JlZGllbnQudjNkaGFzaFggYvGbGnwTdpRwb89CNhkBS0b6p3pRf7qcUnP6a8w7h2GkZmFjdGlvbngdY29tLmFudGhyb3BpYy5jbGF1ZGUucHJvdmlkZWRqcGFyYW1ldGVyc6F4H2NvbS5hbnRocm9waWMub3JpZ2luLWNvbmZpZGVuY2VndW5rbm93bmtkZXNjcmlwdGlvbnhmQ2xhdWRlIHByb3ZpZGVkIHRoaXMgZmlsZSBhdCB0aGUgcmVxdWVzdCBvZiBhIHVzZXIgYW5kIG1heSBoYXZlIGNyZWF0ZWQgb3IgbW9kaWZpZWQgdGhlIGZpbGUgY29udGVudHMubXNvZnR3YXJlQWdlbnShZG5hbWVmQ2xhdWRlcmFsbEFjdGlvbnNJbmNsdWRlZPUAAADIanVtYgAAAEBqdW1kY2JvcgARABCAAACqADibcRNjMnBhLmhhc2guZGF0YQAAAAAYYzJzaO16vr3LKTSm37dDqxlzXvEAAACAY2JvcqVjYWxnZnNoYTI1NmNwYWRNAAAAAAAAAAAAAAAAAGRoYXNoWCDdE1Y/DVnPQU9+9R4Nsfbizhzdp+MSt8cyfk4Q4BWz9mRuYW1lbmp1bWJmIG1hbmlmZXN0amV4Y2x1c2lvbnOBomVzdGFydBilZmxlbmd0aBkeBAAAAj5qdW1iAAAAJ2p1bWRjMmNsABEAEIAAAKoAOJtxA2MycGEuY2xhaW0udjIAAAACD2Nib3KlY2FsZ2ZzaGEyNTZpc2lnbmF0dXJleE1zZWxmI2p1bWJmPS9jMnBhL3VybjpjMnBhOmM0NjZhZmNmLTM2ODktNDk3NS05ZjVhLTdjYjljYzAwYjM0Ny9jMnBhLnNpZ25hdHVyZWppbnN0YW5jZUlEeCx4bXA6aWlkOmYzZWEzMjcyLTg4N2YtNDg0Yy1hMWYyLTdkY2YyN2I2NzZmOHJjcmVhdGVkX2Fzc2VydGlvbnODomN1cmx4LXNlbGYjanVtYmY9YzJwYS5hc3NlcnRpb25zL2MycGEuaW5ncmVkaWVudC52M2RoYXNoWCBi8ZsafBN2lHBvz0I2GQFLRvqnelF/upxSc/przDuHYaJjdXJseCpzZWxmI2p1bWJmPWMycGEuYXNzZXJ0aW9ucy9jMnBhLmFjdGlvbnMudjJkaGFzaFgg2rwKhD9g0MRUzqhheTGCMhomlDIKm89sU9MF4NyuSqeiY3VybHgpc2VsZiNqdW1iZj1jMnBhLmFzc2VydGlvbnMvYzJwYS5oYXNoLmRhdGFkaGFzaFggfYFyEfPk9lBrGoNX1Jc0YG7g7qB85oJhnHN8thHmQ5V0Y2xhaW1fZ2VuZXJhdG9yX2luZm+jZG5hbWVvQW50aHJvcGljIEZpbGVzZ3ZlcnNpb25lMS4wLjBrc3BlY1ZlcnNpb25lMi40LjAAABA4anVtYgAAAChqdW1kYzJjcwARABCAAACqADibcQNjMnBhLnNpZ25hdHVyZQAAABAIY2JvctKEWQISogEmGCFZAgowggIGMIIBjaADAgECAhRA5aAK7sI50L64g/oGQgU9Z1UTADAKBggqhkjOPQQDAzBJMRcwFQYDVQQKEw5BbnRocm9waWMsIFBCQzEuMCwGA1UEAxMlQW50aHJvcGljIENvbnRlbnQgQ3JlZGVudGlhbHMgUm9vdCBDQTAeFw0yNjA4MDcxODQzNTZaFw0yODA4MDYxOTQzNTZaMEQxFzAVBgNVBAoTDkFudGhyb3BpYywgUEJDMSkwJwYDVQQDEyBBbnRocm9waWMgQ2xhdWRlIENvbnRlbnQgU2lnbmluZzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABJh6CmvLUBgFFNU0vUKlOVtE6djd17L5SuwX0LemFisBM3dkd/3cyjxFA3Qo5S46fX0/ihY0VZ7mfb9KF703t5OjWDBWMA4GA1UdDwEB/wQEAwIHgDAVBgNVHSUEDjAMBgorBgEEAYPoXgIBMAwGA1UdEwEB/wQCMAAwHwYDVR0jBBgwFoAUzlHiBIFOZFsj+OPEz5o+nMHXXMIwCgYIKoZIzj0EAwMDZwAwZAIwMXMdFJ4BetLLVY7ORuE9noqbbAZOZn/aArXyTwFAZfKrPzxF2vPoJNf1+UCdg1XGAjBwX1zd9WGqYkqmL5SFqw1QySjr1zJfpJM9+1rdDwSPLMOPOjKuiXjoU/pUUeG9RwmhY3BhZFkNngAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPZYQOPh/dMOrYlRnHBlcy+0UBh3Li9AgViHbCfWPcLQCr58Sx7s8oI7ssrlMKULe3l688418V5VOhdxTn0Dd2lXD5I=</c2pa:manifest></metadata><title>micacms</title><path fill="#FBF5EC" d="M104.0 0V-1056H388.0V-866Q435.0 -973 521.0 -1025.5Q607.0 -1078 708.0 -1078Q815.0 -1078 897.5 -1023.5Q980.0 -969 1013.0 -872Q1055.0 -969 1145.5 -1023.5Q1236.0 -1078 1351.0 -1078Q1503.0 -1078 1604.0 -979.5Q1705.0 -881 1705.0 -700V0H1411.0V-646Q1411.0 -741 1359.5 -788.0Q1308.0 -835 1232.0 -835Q1147.0 -835 1097.0 -780.0Q1047.0 -725 1047.0 -636V0H763.0V-654Q763.0 -736 714.0 -785.5Q665.0 -835 588.0 -835Q509.0 -835 454.0 -780.0Q399.0 -725 399.0 -623V0Z M1852.56 0V-1056H2147.56V0ZM1999.56 -1189Q1926.56 -1189 1878.56 -1233.5Q1830.56 -1278 1830.56 -1346Q1830.56 -1414 1878.56 -1458.5Q1926.56 -1503 1999.56 -1503Q2071.56 -1503 2119.56 -1458.5Q2167.56 -1414 2167.56 -1346Q2167.56 -1278 2119.56 -1233.5Q2071.56 -1189 1999.56 -1189Z M2778.12 24Q2619.12 24 2500.12 -45.5Q2381.12 -115 2314.62 -239.5Q2248.12 -364 2248.12 -527Q2248.12 -691 2314.62 -815.5Q2381.12 -940 2500.12 -1010.0Q2619.12 -1080 2778.12 -1080Q2917.12 -1080 3025.62 -1026.5Q3134.12 -973 3199.62 -878.5Q3265.12 -784 3274.12 -661H2989.12Q2977.12 -742 2923.62 -792.0Q2870.12 -842 2782.12 -842Q2671.12 -842 2608.12 -757.0Q2545.12 -672 2545.12 -527Q2545.12 -383 2608.12 -298.5Q2671.12 -214 2782.12 -214Q2871.12 -214 2922.12 -264.0Q2973.12 -314 2987.12 -397H3274.12Q3268.12 -275 3203.12 -180.0Q3138.12 -85 3028.62 -30.5Q2919.12 24 2778.12 24Z M3692.68 18Q3534.68 18 3432.18 -61.0Q3329.68 -140 3329.68 -298Q3329.68 -417 3386.68 -484.5Q3443.68 -552 3537.68 -583.0Q3631.68 -614 3741.68 -624Q3886.68 -639 3944.68 -654.0Q4002.68 -669 4002.68 -720V-727Q4002.68 -785 3956.68 -822.0Q3910.68 -859 3829.68 -859Q3747.68 -859 3696.68 -821.0Q3645.68 -783 3640.68 -722H3363.68Q3373.68 -885 3497.68 -981.5Q3621.68 -1078 3838.68 -1078Q4055.68 -1078 4174.68 -981.5Q4293.68 -885 4293.68 -716V0H4005.68V-149H4001.68Q3959.68 -72 3886.68 -27.0Q3813.68 18 3692.68 18ZM3774.68 -187Q3880.68 -187 3942.68 -243.5Q4004.68 -300 4004.68 -386V-492Q3979.68 -478 3921.68 -466.5Q3863.68 -455 3792.68 -444Q3716.68 -432 3664.18 -400.5Q3611.68 -369 3611.68 -306Q3611.68 -250 3656.18 -218.5Q3700.68 -187 3774.68 -187Z M4887.24 21Q4744.24 21 4635.74 -49.0Q4527.24 -119 4466.74 -243.0Q4406.24 -367 4406.24 -527Q4406.24 -687 4466.74 -811.5Q4527.24 -936 4635.74 -1006.5Q4744.24 -1077 4887.24 -1077Q5003.24 -1077 5096.24 -1030.5Q5189.24 -984 5248.74 -901.5Q5308.24 -819 5325.24 -712H5194.24Q5172.24 -822 5092.74 -890.5Q5013.24 -959 4887.24 -959Q4727.24 -959 4631.74 -840.0Q4536.24 -721 4536.24 -527Q4536.24 -334 4631.24 -215.5Q4726.24 -97 4887.24 -97Q5014.24 -97 5090.24 -164.5Q5166.24 -232 5192.24 -344H5325.24Q5308.24 -239 5248.24 -156.5Q5188.24 -74 5095.74 -26.5Q5003.24 21 4887.24 21Z M5456.799999999999 0V-1056H5582.799999999999V-878Q5629.799999999999 -975 5716.799999999999 -1025.0Q5803.799999999999 -1075 5901.799999999999 -1075Q6011.799999999999 -1075 6093.799999999999 -1017.0Q6175.799999999999 -959 6208.799999999999 -871Q6249.799999999999 -960 6338.299999999999 -1017.5Q6426.799999999999 -1075 6545.799999999999 -1075Q6694.799999999999 -1075 6793.799999999999 -977.5Q6892.799999999999 -880 6892.799999999999 -691V0H6764.799999999999V-691Q6764.799999999999 -827 6691.799999999999 -891.0Q6618.799999999999 -955 6513.799999999999 -955Q6390.799999999999 -955 6314.799999999999 -879.0Q6238.799999999999 -803 6238.799999999999 -677V0H6110.799999999999V-703Q6110.799999999999 -820 6042.299999999999 -887.5Q5973.799999999999 -955 5865.799999999999 -955Q5789.799999999999 -955 5726.299999999999 -920.0Q5662.799999999999 -885 5623.799999999999 -818.5Q5584.799999999999 -752 5584.799999999999 -659V0Z M7443.359999999999 21Q7272.359999999999 21 7159.359999999999 -65.0Q7046.359999999999 -151 7037.359999999999 -316H7165.359999999999Q7173.359999999999 -210 7243.859999999999 -151.0Q7314.359999999999 -92 7440.359999999999 -92Q7564.359999999999 -92 7636.359999999999 -146.5Q7708.359999999999 -201 7708.359999999999 -287Q7708.359999999999 -356 7659.359999999999 -393.0Q7610.359999999999 -430 7525.359999999999 -449L7351.359999999999 -490Q7208.359999999999 -524 7134.359999999999 -593.0Q7060.359999999999 -662 7060.359999999999 -774Q7060.359999999999 -908 7164.859999999999 -992.5Q7269.359999999999 -1077 7436.359999999999 -1077Q7599.359999999999 -1077 7704.359999999999 -987.0Q7809.359999999999 -897 7816.359999999999 -740H7690.359999999999Q7685.359999999999 -843 7618.359999999999 -903.5Q7551.359999999999 -964 7436.359999999999 -964Q7323.359999999999 -964 7256.359999999999 -910.0Q7189.359999999999 -856 7189.359999999999 -774Q7189.359999999999 -705 7238.859999999999 -665.5Q7288.359999999999 -626 7378.359999999999 -605L7553.359999999999 -564Q7696.359999999999 -530 7766.859999999999 -465.0Q7837.359999999999 -400 7837.359999999999 -289Q7837.359999999999 -146 7726.359999999999 -62.5Q7615.359999999999 21 7443.359999999999 21Z"/></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="104 -1503 7733 1527" role="img" aria-label="micacms" xmlns:c2pa="http://c2pa.org/manifest"><metadata><c2pa:manifest>AAAWgmp1bWIAAAAeanVtZGMycGEAEQAQgAAAqgA4m3EDYzJwYQAAABZcanVtYgAAAEdqdW1kYzJtYQARABCAAACqADibcQN1cm46YzJwYTo4Y2JmYzY2ZS1hMjZjLTQwMjgtYjc5NS0wYmFiNGEwMTNiOWIAAAADl2p1bWIAAAApanVtZGMyYXMAEQAQgAAAqgA4m3EDYzJwYS5hc3NlcnRpb25zAAAAALxqdW1iAAAARGp1bWRjYm9yABEAEIAAAKoAOJtxE2MycGEuaW5ncmVkaWVudC52MwAAAAAYYzJzaMxwxehkrWUMSX69e+If5PgAAABwY2JvcqNpZGM6Zm9ybWF0bWltYWdlL3N2Zyt4bWxqaW5zdGFuY2VJRHgseG1wOmlpZDpmYWQzNGFiYi1hMmVkLTQxN2MtOWI1Mi0wNzU4YzQ2MDA1ZTRscmVsYXRpb25zaGlwaHBhcmVudE9mAAAB4mp1bWIAAABBanVtZGNib3IAEQAQgAAAqgA4m3ETYzJwYS5hY3Rpb25zLnYyAAAAABhjMnNoj6ypQpjlv7O5cuBaaffMBgAAAZljYm9yomdhY3Rpb25zgqJmYWN0aW9ua2MycGEub3BlbmVkanBhcmFtZXRlcnOha2luZ3JlZGllbnRzgaJjdXJseC1zZWxmI2p1bWJmPWMycGEuYXNzZXJ0aW9ucy9jMnBhLmluZ3JlZGllbnQudjNkaGFzaFggIUtfEbW7IWEueP5JGiVbaBv7G/Zj7riHYfyb1j+IzUukZmFjdGlvbngdY29tLmFudGhyb3BpYy5jbGF1ZGUucHJvdmlkZWRqcGFyYW1ldGVyc6F4H2NvbS5hbnRocm9waWMub3JpZ2luLWNvbmZpZGVuY2VndW5rbm93bmtkZXNjcmlwdGlvbnhmQ2xhdWRlIHByb3ZpZGVkIHRoaXMgZmlsZSBhdCB0aGUgcmVxdWVzdCBvZiBhIHVzZXIgYW5kIG1heSBoYXZlIGNyZWF0ZWQgb3IgbW9kaWZpZWQgdGhlIGZpbGUgY29udGVudHMubXNvZnR3YXJlQWdlbnShZG5hbWVmQ2xhdWRlcmFsbEFjdGlvbnNJbmNsdWRlZPUAAADIanVtYgAAAEBqdW1kY2JvcgARABCAAACqADibcRNjMnBhLmhhc2guZGF0YQAAAAAYYzJzaLcYORx2AweyA7dy+MbBhH8AAACAY2JvcqVjYWxnZnNoYTI1NmNwYWRNAAAAAAAAAAAAAAAAAGRoYXNoWCAniIpm7Auwvaf80a2vuc0jz89UBkQQxOVn+vSPiPdgwGRuYW1lbmp1bWJmIG1hbmlmZXN0amV4Y2x1c2lvbnOBomVzdGFydBilZmxlbmd0aBkeBAAAAj5qdW1iAAAAJ2p1bWRjMmNsABEAEIAAAKoAOJtxA2MycGEuY2xhaW0udjIAAAACD2Nib3KlY2FsZ2ZzaGEyNTZpc2lnbmF0dXJleE1zZWxmI2p1bWJmPS9jMnBhL3VybjpjMnBhOjhjYmZjNjZlLWEyNmMtNDAyOC1iNzk1LTBiYWI0YTAxM2I5Yi9jMnBhLnNpZ25hdHVyZWppbnN0YW5jZUlEeCx4bXA6aWlkOjgwODQyOTkzLTcyN2YtNDUzNC1iNmM4LWIzMTY3MjEyYzcwYXJjcmVhdGVkX2Fzc2VydGlvbnODomN1cmx4LXNlbGYjanVtYmY9YzJwYS5hc3NlcnRpb25zL2MycGEuaW5ncmVkaWVudC52M2RoYXNoWCAhS18RtbshYS54/kkaJVtoG/sb9mPuuIdh/JvWP4jNS6JjdXJseCpzZWxmI2p1bWJmPWMycGEuYXNzZXJ0aW9ucy9jMnBhLmFjdGlvbnMudjJkaGFzaFggQuGRz/TC3LoK6hIaqQ5MCcpDI2FKIwVUDJF/Bw9M1hSiY3VybHgpc2VsZiNqdW1iZj1jMnBhLmFzc2VydGlvbnMvYzJwYS5oYXNoLmRhdGFkaGFzaFggZnAGQMFYO/zRH0NP1IzNmdEy1zO0fkkH5UL53vivff50Y2xhaW1fZ2VuZXJhdG9yX2luZm+jZG5hbWVvQW50aHJvcGljIEZpbGVzZ3ZlcnNpb25lMS4wLjBrc3BlY1ZlcnNpb25lMi40LjAAABA4anVtYgAAAChqdW1kYzJjcwARABCAAACqADibcQNjMnBhLnNpZ25hdHVyZQAAABAIY2JvctKEWQISogEmGCFZAgowggIGMIIBjaADAgECAhRA5aAK7sI50L64g/oGQgU9Z1UTADAKBggqhkjOPQQDAzBJMRcwFQYDVQQKEw5BbnRocm9waWMsIFBCQzEuMCwGA1UEAxMlQW50aHJvcGljIENvbnRlbnQgQ3JlZGVudGlhbHMgUm9vdCBDQTAeFw0yNjA4MDcxODQzNTZaFw0yODA4MDYxOTQzNTZaMEQxFzAVBgNVBAoTDkFudGhyb3BpYywgUEJDMSkwJwYDVQQDEyBBbnRocm9waWMgQ2xhdWRlIENvbnRlbnQgU2lnbmluZzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABJh6CmvLUBgFFNU0vUKlOVtE6djd17L5SuwX0LemFisBM3dkd/3cyjxFA3Qo5S46fX0/ihY0VZ7mfb9KF703t5OjWDBWMA4GA1UdDwEB/wQEAwIHgDAVBgNVHSUEDjAMBgorBgEEAYPoXgIBMAwGA1UdEwEB/wQCMAAwHwYDVR0jBBgwFoAUzlHiBIFOZFsj+OPEz5o+nMHXXMIwCgYIKoZIzj0EAwMDZwAwZAIwMXMdFJ4BetLLVY7ORuE9noqbbAZOZn/aArXyTwFAZfKrPzxF2vPoJNf1+UCdg1XGAjBwX1zd9WGqYkqmL5SFqw1QySjr1zJfpJM9+1rdDwSPLMOPOjKuiXjoU/pUUeG9RwmhY3BhZFkNngAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPZYQM2Xi7rqGKIX2zVBmyvTvW9iEiZz8vJWFZrYs+QYXkDVf3WPhvG2Z1vzDnLu0J/nPi5mTn2IR3eLV7Cey6QHefQ=</c2pa:manifest></metadata><title>micacms</title><path fill="#3F1F2B" d="M104.0 0V-1056H388.0V-866Q435.0 -973 521.0 -1025.5Q607.0 -1078 708.0 -1078Q815.0 -1078 897.5 -1023.5Q980.0 -969 1013.0 -872Q1055.0 -969 1145.5 -1023.5Q1236.0 -1078 1351.0 -1078Q1503.0 -1078 1604.0 -979.5Q1705.0 -881 1705.0 -700V0H1411.0V-646Q1411.0 -741 1359.5 -788.0Q1308.0 -835 1232.0 -835Q1147.0 -835 1097.0 -780.0Q1047.0 -725 1047.0 -636V0H763.0V-654Q763.0 -736 714.0 -785.5Q665.0 -835 588.0 -835Q509.0 -835 454.0 -780.0Q399.0 -725 399.0 -623V0Z M1852.56 0V-1056H2147.56V0ZM1999.56 -1189Q1926.56 -1189 1878.56 -1233.5Q1830.56 -1278 1830.56 -1346Q1830.56 -1414 1878.56 -1458.5Q1926.56 -1503 1999.56 -1503Q2071.56 -1503 2119.56 -1458.5Q2167.56 -1414 2167.56 -1346Q2167.56 -1278 2119.56 -1233.5Q2071.56 -1189 1999.56 -1189Z M2778.12 24Q2619.12 24 2500.12 -45.5Q2381.12 -115 2314.62 -239.5Q2248.12 -364 2248.12 -527Q2248.12 -691 2314.62 -815.5Q2381.12 -940 2500.12 -1010.0Q2619.12 -1080 2778.12 -1080Q2917.12 -1080 3025.62 -1026.5Q3134.12 -973 3199.62 -878.5Q3265.12 -784 3274.12 -661H2989.12Q2977.12 -742 2923.62 -792.0Q2870.12 -842 2782.12 -842Q2671.12 -842 2608.12 -757.0Q2545.12 -672 2545.12 -527Q2545.12 -383 2608.12 -298.5Q2671.12 -214 2782.12 -214Q2871.12 -214 2922.12 -264.0Q2973.12 -314 2987.12 -397H3274.12Q3268.12 -275 3203.12 -180.0Q3138.12 -85 3028.62 -30.5Q2919.12 24 2778.12 24Z M3692.68 18Q3534.68 18 3432.18 -61.0Q3329.68 -140 3329.68 -298Q3329.68 -417 3386.68 -484.5Q3443.68 -552 3537.68 -583.0Q3631.68 -614 3741.68 -624Q3886.68 -639 3944.68 -654.0Q4002.68 -669 4002.68 -720V-727Q4002.68 -785 3956.68 -822.0Q3910.68 -859 3829.68 -859Q3747.68 -859 3696.68 -821.0Q3645.68 -783 3640.68 -722H3363.68Q3373.68 -885 3497.68 -981.5Q3621.68 -1078 3838.68 -1078Q4055.68 -1078 4174.68 -981.5Q4293.68 -885 4293.68 -716V0H4005.68V-149H4001.68Q3959.68 -72 3886.68 -27.0Q3813.68 18 3692.68 18ZM3774.68 -187Q3880.68 -187 3942.68 -243.5Q4004.68 -300 4004.68 -386V-492Q3979.68 -478 3921.68 -466.5Q3863.68 -455 3792.68 -444Q3716.68 -432 3664.18 -400.5Q3611.68 -369 3611.68 -306Q3611.68 -250 3656.18 -218.5Q3700.68 -187 3774.68 -187Z M4887.24 21Q4744.24 21 4635.74 -49.0Q4527.24 -119 4466.74 -243.0Q4406.24 -367 4406.24 -527Q4406.24 -687 4466.74 -811.5Q4527.24 -936 4635.74 -1006.5Q4744.24 -1077 4887.24 -1077Q5003.24 -1077 5096.24 -1030.5Q5189.24 -984 5248.74 -901.5Q5308.24 -819 5325.24 -712H5194.24Q5172.24 -822 5092.74 -890.5Q5013.24 -959 4887.24 -959Q4727.24 -959 4631.74 -840.0Q4536.24 -721 4536.24 -527Q4536.24 -334 4631.24 -215.5Q4726.24 -97 4887.24 -97Q5014.24 -97 5090.24 -164.5Q5166.24 -232 5192.24 -344H5325.24Q5308.24 -239 5248.24 -156.5Q5188.24 -74 5095.74 -26.5Q5003.24 21 4887.24 21Z M5456.799999999999 0V-1056H5582.799999999999V-878Q5629.799999999999 -975 5716.799999999999 -1025.0Q5803.799999999999 -1075 5901.799999999999 -1075Q6011.799999999999 -1075 6093.799999999999 -1017.0Q6175.799999999999 -959 6208.799999999999 -871Q6249.799999999999 -960 6338.299999999999 -1017.5Q6426.799999999999 -1075 6545.799999999999 -1075Q6694.799999999999 -1075 6793.799999999999 -977.5Q6892.799999999999 -880 6892.799999999999 -691V0H6764.799999999999V-691Q6764.799999999999 -827 6691.799999999999 -891.0Q6618.799999999999 -955 6513.799999999999 -955Q6390.799999999999 -955 6314.799999999999 -879.0Q6238.799999999999 -803 6238.799999999999 -677V0H6110.799999999999V-703Q6110.799999999999 -820 6042.299999999999 -887.5Q5973.799999999999 -955 5865.799999999999 -955Q5789.799999999999 -955 5726.299999999999 -920.0Q5662.799999999999 -885 5623.799999999999 -818.5Q5584.799999999999 -752 5584.799999999999 -659V0Z M7443.359999999999 21Q7272.359999999999 21 7159.359999999999 -65.0Q7046.359999999999 -151 7037.359999999999 -316H7165.359999999999Q7173.359999999999 -210 7243.859999999999 -151.0Q7314.359999999999 -92 7440.359999999999 -92Q7564.359999999999 -92 7636.359999999999 -146.5Q7708.359999999999 -201 7708.359999999999 -287Q7708.359999999999 -356 7659.359999999999 -393.0Q7610.359999999999 -430 7525.359999999999 -449L7351.359999999999 -490Q7208.359999999999 -524 7134.359999999999 -593.0Q7060.359999999999 -662 7060.359999999999 -774Q7060.359999999999 -908 7164.859999999999 -992.5Q7269.359999999999 -1077 7436.359999999999 -1077Q7599.359999999999 -1077 7704.359999999999 -987.0Q7809.359999999999 -897 7816.359999999999 -740H7690.359999999999Q7685.359999999999 -843 7618.359999999999 -903.5Q7551.359999999999 -964 7436.359999999999 -964Q7323.359999999999 -964 7256.359999999999 -910.0Q7189.359999999999 -856 7189.359999999999 -774Q7189.359999999999 -705 7238.859999999999 -665.5Q7288.359999999999 -626 7378.359999999999 -605L7553.359999999999 -564Q7696.359999999999 -530 7766.859999999999 -465.0Q7837.359999999999 -400 7837.359999999999 -289Q7837.359999999999 -146 7726.359999999999 -62.5Q7615.359999999999 21 7443.359999999999 21Z"/></svg>
|
package/dist/index.html
CHANGED
|
@@ -5,11 +5,13 @@
|
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
|
|
6
6
|
<meta name="robots" content="noindex, nofollow" />
|
|
7
7
|
<meta name="color-scheme" content="light" />
|
|
8
|
-
<meta name="theme-color" content="#
|
|
8
|
+
<meta name="theme-color" content="#fbf5ec" />
|
|
9
9
|
<title>Mica</title>
|
|
10
|
-
<link rel="icon" href="/admin/brand/
|
|
11
|
-
<
|
|
12
|
-
<link rel="
|
|
10
|
+
<link rel="icon" href="/admin/brand/favicon.ico" sizes="48x48" />
|
|
11
|
+
<link rel="icon" href="/admin/brand/micacms-favicon.svg" type="image/svg+xml" />
|
|
12
|
+
<link rel="apple-touch-icon" href="/admin/brand/apple-touch-icon.png" />
|
|
13
|
+
<script type="module" crossorigin src="/admin/assets/index-9WVbsgdk.js"></script>
|
|
14
|
+
<link rel="stylesheet" crossorigin href="/admin/assets/index-DDeMbcSl.css">
|
|
13
15
|
</head>
|
|
14
16
|
<body class="h-full">
|
|
15
17
|
<div id="app" class="h-full"></div>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@micacms/editor-ui",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "The Mica editor SPA — identity-neutral Vue administration UI, shipped as built assets and mounted by a composing app.",
|
|
6
6
|
"license": "MIT",
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
"vue": "^3.5.13",
|
|
38
38
|
"vue-router": "^4.5.0",
|
|
39
39
|
"vue-tsc": "^2.2.0",
|
|
40
|
-
"@micacms/core": "0.
|
|
40
|
+
"@micacms/core": "0.3.0"
|
|
41
41
|
},
|
|
42
42
|
"engines": {
|
|
43
43
|
"node": ">=22.12.0"
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import{D as ie,d as X,h as s,c as o,b as w,a as l,F as x,k as R,C as B,t as y,e as T,g as $,q as le,o as re,j as L,w as V,l as S,z as ue,s as de,v as ce,m as me,r as P,i as D,A as F,n as he,x as U,R as pe,S as fe,y as ge}from"./index-ByBMMOql.js";import{h as ye}from"./useField-Dc-2hvX0.js";import{_ as ve}from"./ConfirmDialog.vue_vue_type_script_setup_true_lang-XwTu9vH_.js";import{_ as be}from"./PageHeader.vue_vue_type_script_setup_true_lang-B10dWbKQ.js";/**
|
|
2
|
-
* @license @lucide/vue v1.37.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 ke=[["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"}]],_e=ie("refresh-cw",ke);function xe(h,a,n){return I(h,a,n,[],[])}function I(h,a,n,r,f){const g=[];for(const[v,i]of Object.entries(h)){if(i.hidden)continue;const u=a===null?void 0:a[v],b=n===null?void 0:n[v],k=[...r,v],m=[...f,i.label??ye(v)];if(i.kind==="object"){g.push(...I(i.fields,a===null?null:O(u)??{},n===null?null:O(b)??{},k,m));continue}if(i.kind==="repeater"){g.push(...we(i.fields,i.itemLabel,Q(u),Q(b),k,m,{before:a!==null,after:n!==null}));continue}z(u)!==z(b)&&g.push({path:k.join("."),label:m,kind:i.kind,before:a===null?null:W(i,u),after:n===null?null:W(i,b)})}return g}function we(h,a,n,r,f,g,v){const i=[],u=Math.max((n==null?void 0:n.length)??0,(r==null?void 0:r.length)??0);for(let b=0;b<u;b++){const k=(n==null?void 0:n[b])??(v.before?{}:null),m=(r==null?void 0:r[b])??(v.after?{}:null),C=_=>{const M=a?_==null?void 0:_[a]:void 0;return typeof M=="string"&&M!==""?M:`${b+1}`};i.push(...I(h,k,m,[...f,String(b)],[...g,C(m??k)]))}return i}function W(h,a){if(a==null||a==="")return"Empty";if(h.kind==="boolean")return a===!0?"Yes":"No";if(h.kind==="select")return(Array.isArray(a)?a:[a]).map(r=>{var f;return((f=h.options.find(g=>g.value===r))==null?void 0:f.label)??String(r)}).join(", ");if(h.kind==="media"){const n=Array.isArray(a)?a:[a];return n.length===0?"Empty":n.map(r=>String(r).split("/").at(-1)??String(r)).join(", ")}if(h.kind==="coordinates"){const n=O(a);if(n&&typeof n.lat=="number"&&typeof n.lng=="number")return`${n.lat.toFixed(5)}, ${n.lng.toFixed(5)}`}return Array.isArray(a)?a.map(String).join(", "):typeof a=="object"?z(a):String(a)}function O(h){return h!==null&&typeof h=="object"&&!Array.isArray(h)?h:null}function Q(h){return Array.isArray(h)?h:null}function z(h){return JSON.stringify(h??null,(a,n)=>{if(n===null||typeof n!="object"||Array.isArray(n))return n;const r=n,f={};for(const g of Object.keys(r).sort())f[g]=r[g];return f})}const $e={class:"mt-3 rounded-md border border-line bg-canvas/60 p-3 text-xs"},Ce={key:0,class:"mb-2 font-medium text-success"},Ae={key:1,class:"mb-2 font-medium text-danger"},Se={key:2,class:"grid grid-cols-2 gap-3"},Pe={class:"list-decimal space-y-0.5 pl-5"},Re={class:"list-decimal space-y-0.5 pl-5"},je={key:0,class:"text-muted"},Te={key:1,class:"space-y-3"},Me={class:"mb-1 font-medium"},Ne={key:0,class:"text-muted","aria-hidden":"true"},De={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"},Fe={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"},Be=X({__name:"ChangeComparison",props:{comparison:{},fields:{}},setup(h){const a=h,n=$(()=>a.comparison.before===null?"created":a.comparison.after===null?"deleted":"changed"),r=$(()=>a.fields?xe(a.fields,a.comparison.before,a.comparison.after):[]),f=$(()=>{if(a.fields)return null;const v=i=>Array.isArray(i==null?void 0:i.order)?i.order:[];return{before:v(a.comparison.before),after:v(a.comparison.after)}}),g=$(()=>{if(!f.value)return new Set;const v=new Map(f.value.before.map((i,u)=>[i.slug,u]));return new Set(f.value.after.filter((i,u)=>v.get(i.slug)!==u).map(i=>i.slug))});return(v,i)=>(s(),o("div",$e,[n.value==="created"?(s(),o("p",Ce," New — publishing puts this on the site for the first time. ")):n.value==="deleted"?(s(),o("p",Ae," Publishing removes this from the site. ")):w("",!0),f.value?(s(),o("div",Se,[l("div",null,[i[0]||(i[0]=l("p",{class:"mb-1.5 font-medium text-muted"},"Before",-1)),l("ol",Pe,[(s(!0),o(x,null,R(f.value.before,u=>(s(),o("li",{key:u.slug,class:B(g.value.has(u.slug)&&"font-medium text-ink")},y(u.title),3))),128))])]),l("div",null,[i[1]||(i[1]=l("p",{class:"mb-1.5 font-medium text-muted"},"After",-1)),l("ol",Re,[(s(!0),o(x,null,R(f.value.after,u=>(s(),o("li",{key:u.slug,class:B(g.value.has(u.slug)&&"font-medium text-success")},y(u.title),3))),128))])])])):(s(),o(x,{key:3},[r.value.length===0?(s(),o("p",je," Nothing visible changed — files moved or were rewritten without a field changing its value. ")):(s(),o("dl",Te,[(s(!0),o(x,null,R(r.value,u=>(s(),o("div",{key:u.path},[l("dt",Me,[(s(!0),o(x,null,R(u.label,(b,k)=>(s(),o(x,{key:k},[k>0?(s(),o("span",Ne," › ")):w("",!0),l("span",null,y(b),1)],64))),128))]),l("dd",{class:B(["grid gap-2",n.value==="changed"?"grid-cols-2":"grid-cols-1"])},[n.value!=="created"?(s(),o("div",De,[i[2]||(i[2]=l("span",{class:"sr-only"},"Before: ",-1)),T(y(u.before),1)])):w("",!0),n.value!=="deleted"?(s(),o("div",Fe,[i[3]||(i[3]=l("span",{class:"sr-only"},"After: ",-1)),T(y(u.after),1)])):w("",!0)],2)]))),128))]))],64))]))}}),Ee=["disabled"],Le={class:"mx-auto max-w-3xl space-y-5 px-4 py-6 sm:px-6"},Ve={key:0,class:"text-sm text-muted"},Oe={key:0,class:"rounded-md border border-line bg-stone p-4 text-sm text-muted"},ze={class:"mt-1"},Ie={key:1,role:"alert",class:"rounded-md border border-warning/15 bg-warning-soft p-4"},Ye={class:"mt-1 text-xs text-muted"},qe=["disabled"],Ge={key:2,role:"alert",class:"rounded-md border border-danger/15 bg-danger-soft p-4"},He={class:"mt-1.5 space-y-1 text-xs text-danger"},Je={class:"font-medium"},Ke={key:3,class:"card p-8 text-center"},Ue={class:"mt-1 text-sm text-muted"},We={key:4,"aria-labelledby":"changes-heading"},Qe={class:"card divide-y divide-line"},Xe={class:"min-w-0 flex-1"},Ze={key:0,class:"mt-2 text-xs text-muted"},et={key:1,class:"mt-2 text-xs text-danger"},tt={key:1,class:"mt-1 space-y-0.5"},st={class:"break-all font-mono"},nt=["onClick"],ot={key:5,class:"card p-4","aria-labelledby":"publish-heading"},at={id:"publish-heading",class:"text-sm font-semibold"},it={class:"mt-1 text-xs text-muted"},lt=["disabled"],rt=["disabled"],ut={key:2,class:"text-sm text-muted"},dt={key:0},ct={key:1},gt=X({__name:"ChangesView",setup(h){const a=ge(),n=me(),r=he(),f=P(!0),g=P(!1),v=P(!1),i=P(""),u=P(null),b=P(!1),k=P(null),m=n.status,C=$(()=>{var t;const e=new Map;for(const p of((t=m.value)==null?void 0:t.changes)??[]){const d=p.owner,c=d.kind==="entry"?`entry:${d.collection}/${d.slug}`:d.kind==="singleton"?`singleton:${d.name}`:d.kind==="order"?`order:${d.collection}`:d.kind==="media"?"media":`other:${p.path}`;let A=e.get(c);A||(A={key:c,label:d.label,link:d.kind==="entry"&&(p.kind!=="delete"||d.renamedFrom)?{name:"entry",params:{collection:d.collection,slug:d.slug}}:d.kind==="singleton"?{name:"singleton",params:{name:d.name}}:d.kind==="media"?{name:"media"}:null,changes:[],target:d.kind==="entry"?{kind:"entry",collection:d.collection,slug:d.slug,...d.renamedFrom?{from:d.renamedFrom}:{}}:d.kind==="singleton"?{kind:"singleton",name:d.name}:d.kind==="order"?{kind:"order",collection:d.collection}:null},e.set(c,A)),A.changes.push(p)}return[...e.values()]}),_=P({});function M(e){var t,p;return e.kind==="entry"?((t=a.collection(e.collection))==null?void 0:t.fields)??null:e.kind==="singleton"?((p=a.singleton(e.name))==null?void 0:p.fields)??null:null}async function Y(e){if(e.target){_.value[e.key]={loading:!0,error:null,comparison:null};try{const t=await D.staging.compare(e.target);_.value[e.key]={loading:!1,error:null,comparison:t}}catch(t){_.value[e.key]={loading:!1,error:t instanceof F?t.message:"Could not load the comparison.",comparison:null}}}}le(C,e=>{for(const t of e)t.target&&!_.value[t.key]&&Y(t)});const Z=$(()=>{var e;return((e=m.value)==null?void 0:e.workspace)??"draft-store"}),N=$(()=>Z.value==="working-tree"),ee=$(()=>m.value?N.value?m.value.branch?`Your working tree, on branch ${m.value.branch}`:"Your working tree":"Saved in Mica, waiting to be published":null),te=$(()=>{var e;return k.value!==null||N.value&&(((e=m.value)==null?void 0:e.ahead)??0)>0}),q=$(()=>{var e,t,p;return(((e=m.value)==null?void 0:e.publish.enabled)??!1)&&(((t=m.value)==null?void 0:t.validation.ok)??!1)&&(((p=m.value)==null?void 0:p.changes.length)??0)>0&&!g.value}),se={create:"Added",update:"Changed",delete:"Removed"};async function G(){_.value={},await n.refresh();for(const e of C.value)e.target&&!_.value[e.key]&&Y(e);f.value=!1}re(G);async function ne(){var e,t;g.value=!0;try{const p=await D.staging.publish(i.value,((e=m.value)==null?void 0:e.baseRevision)??null);p.state==="published"?(k.value=null,i.value="",r.success("Published.",p.revision?`Commit ${E(p.revision)}.`:void 0)):(k.value=p,i.value="",r.error("Committed, but the push failed.",p.pushError)),await n.refresh()}catch(p){p instanceof F?(r.error(p.message,(t=p.issues[0])==null?void 0:t.message),await n.refresh()):r.error("Could not publish.")}finally{g.value=!1}}async function oe(){v.value=!0;try{const e=await D.staging.push();e.state==="published"?(k.value=null,r.success("Pushed.",e.revision?`Commit ${E(e.revision)}.`:void 0)):(k.value=e,r.error("The push failed again.",e.pushError)),await n.refresh()}catch(e){r.error(e instanceof F?e.message:"Could not push.")}finally{v.value=!1}}async function ae(){const e=u.value;if(e){b.value=!0;try{await D.staging.discard(e.changes.map(t=>t.path)),r.success(`Discarded the changes to ${e.label}.`),u.value=null,await n.refresh()}catch(t){r.error(t instanceof F?t.message:"Could not discard.")}finally{b.value=!1}}}function E(e){return/^[0-9a-f]{20,}$/i.test(e)?e.slice(0,7):e}return(e,t)=>{var p,d;return s(),o(x,null,[L(be,{title:"Publish",subtitle:ee.value},{default:V(()=>[l("button",{type:"button",class:"btn-ghost px-2",disabled:f.value,onClick:G},[L(S(_e),{size:16,"aria-hidden":"true"}),t[3]||(t[3]=l("span",{class:"sr-only"},"Refresh the change list",-1))],8,Ee)]),_:1},8,["subtitle"]),l("div",Le,[f.value?(s(),o("p",Ve,"Loading…")):S(m)?(s(),o(x,{key:1},[S(m).publish.enabled?w("",!0):(s(),o("div",Oe,[t[4]||(t[4]=l("p",{class:"font-medium text-ink"},"Publishing is not available here",-1)),l("p",ze,y(S(m).publish.reason),1)])),te.value?(s(),o("div",Ie,[t[5]||(t[5]=l("p",{class:"text-sm font-medium text-warning"},"Committed, waiting to be pushed",-1)),l("p",Ye,y(((p=k.value)==null?void 0:p.pushError)??"This branch has commits the remote has not seen. Retrying pushes the existing commits — it never creates new ones."),1),l("button",{type:"button",class:"btn-secondary mt-2.5",disabled:v.value,onClick:oe},y(v.value?"Pushing…":"Retry push"),9,qe)])):w("",!0),S(m).validation.ok?w("",!0):(s(),o("div",Ge,[t[6]||(t[6]=l("p",{class:"text-sm font-medium text-danger"}," These changes cannot be published until they are fixed ",-1)),l("ul",He,[(s(!0),o(x,null,R(S(m).validation.problems,c=>(s(),o("li",{key:c.path},[l("span",Je,y(c.label),1),c.issues.length?(s(),o(x,{key:0},[T(" — "+y(c.issues.map(A=>A.message).join("; ")),1)],64)):w("",!0)]))),128))])])),C.value.length===0?(s(),o("div",Ke,[t[7]||(t[7]=l("p",{class:"text-sm font-medium"},"Nothing waiting to be published",-1)),l("p",Ue," Saved changes collect here until somebody publishes them. Right now the "+y(N.value?"working tree":"draft workspace")+" matches the repository. ",1)])):(s(),o("section",We,[t[8]||(t[8]=l("h2",{id:"changes-heading",class:"sr-only"},"Pending changes",-1)),l("ul",Qe,[(s(!0),o(x,null,R(C.value,c=>{var A,H,J,K;return s(),o("li",{key:c.key,class:"flex items-start gap-3 p-4"},[l("div",Xe,[(s(),U(fe(c.link?"RouterLink":"p"),pe({ref_for:!0},c.link?{to:c.link}:{},{class:["text-sm font-medium",c.link&&"hover:underline"]}),{default:V(()=>[T(y(c.label),1)]),_:2},1040,["class"])),c.target?(s(),o(x,{key:0},[(A=_.value[c.key])!=null&&A.loading?(s(),o("p",Ze," Comparing… ")):(H=_.value[c.key])!=null&&H.error?(s(),o("p",et,y((J=_.value[c.key])==null?void 0:J.error),1)):(K=_.value[c.key])!=null&&K.comparison?(s(),U(Be,{key:2,comparison:_.value[c.key].comparison,fields:M(c.target)},null,8,["comparison","fields"])):w("",!0)],64)):(s(),o("ul",tt,[(s(!0),o(x,null,R(c.changes,j=>(s(),o("li",{key:j.path,class:"flex items-baseline gap-2 text-xs text-muted"},[l("span",{class:B(["w-16 shrink-0 font-mono text-[11px]",j.kind==="delete"?"text-danger":j.kind==="create"?"text-success":""])},y(se[j.kind]),3),l("span",st,y(j.path),1)]))),128))]))]),l("button",{type:"button",class:"btn-ghost shrink-0 text-xs",onClick:j=>u.value=c}," Discard ",8,nt)])}),128))])])),C.value.length>0&&S(m).publish.enabled?(s(),o("section",ot,[l("h2",at," Publish "+y(C.value.length===1?"this change":`these ${C.value.length} changes`),1),l("p",it,[T(y(N.value?"One commit of exactly the files listed above, pushed with your own Git configuration.":"One commit to the content repository, which is what triggers your site's build.")+" ",1),S(m).baseRevision?(s(),o(x,{key:0},[T(" Based on "+y(E(S(m).baseRevision))+".",1)],64)):w("",!0)]),l("form",{class:"mt-3 flex flex-wrap items-center gap-2",onSubmit:t[1]||(t[1]=ue(c=>q.value&&i.value.trim()&&ne(),["prevent"]))},[de(l("input",{"onUpdate:modelValue":t[0]||(t[0]=c=>i.value=c),type:"text",class:"input min-w-0 flex-1",maxlength:"500",placeholder:"Describe this publication — it becomes the commit message","aria-label":"Commit message",disabled:g.value},null,8,lt),[[ce,i.value]]),l("button",{type:"submit",class:"btn-primary",disabled:!q.value||!i.value.trim()},y(g.value?"Publishing…":"Publish"),9,rt)],32)])):w("",!0)],64)):(s(),o("p",ut,"The change list could not be loaded. Reload to retry."))]),L(ve,{open:u.value!==null,title:`Discard the changes to “${(d=u.value)==null?void 0:d.label}”?`,"confirm-label":"Discard",destructive:"",busy:b.value,onCancel:t[2]||(t[2]=c=>u.value=null),onConfirm:ae},{default:V(()=>[N.value?(s(),o("p",dt," This restores the files in your working tree to the last commit — new files are deleted, edited ones go back. It cannot be undone from here. ")):(s(),o("p",ct," This forgets the saved changes; the repository stays exactly as it is. It cannot be undone from here. "))]),_:1},8,["open","title","busy"])],64)}}});export{gt as default};
|
|
7
|
-
//# sourceMappingURL=ChangesView-vaAxTqsV.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ChangesView-vaAxTqsV.js","sources":["../../../../common/temp/node_modules/.pnpm/@lucide+vue@1.37.0_vue@3.5.42_typescript@5.9.3_/node_modules/@lucide/vue/dist/esm/icons/refresh-cw.mjs","../../src/lib/compare.ts","../../src/components/ChangeComparison.vue","../../src/views/ChangesView.vue"],"sourcesContent":["/**\n * @license @lucide/vue v1.37.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 __iconNode = [\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];\nconst RefreshCw = createLucideIcon(\"refresh-cw\", __iconNode);\n\nexport { __iconNode, RefreshCw as default };\n//# sourceMappingURL=refresh-cw.mjs.map\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.map((entry) => String(entry).split(\"/\").at(-1) ?? String(entry)).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","<script setup lang=\"ts\">\n/**\n * The pending change set, and Publish.\n *\n * This view is where Saved and Published stop being abstract words: everything\n * listed here is durable in the draft workspace and absent from the\n * repository's history until the button at the bottom is pressed. The list is\n * shared by the whole site — one pending set, not one per editor — so\n * everything on it is published together, whoever presses the button.\n *\n * The two workspaces speak through one API and differ only in what the words\n * mean physically: a working tree lists `git status` and publishes through the\n * developer's own Git; a draft store lists staged rows and publishes one\n * provider-side commit. The `workspace` field decides the phrasing, never the\n * behaviour.\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 PendingChange,\n type PublishOutcome,\n} from \"@/api\";\nimport ChangeComparison from \"@/components/ChangeComparison.vue\";\nimport ConfirmDialog from \"@/components/ConfirmDialog.vue\";\nimport PageHeader from \"@/components/PageHeader.vue\";\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 message = ref(\"\");\nconst discardTarget = ref<Group | null>(null);\nconst discarding = ref(false);\n\n/** The half-finished publication, when a local push failed. */\nconst pendingPush = ref<PublishOutcome | null>(null);\n\nconst status = staging.status;\n\ninterface Group {\n key: string;\n label: string;\n link: { name: string; params?: Record<string, string> } | null;\n changes: PendingChange[];\n /** What a before/after comparison would compare — null where none applies. */\n target: CompareTarget | null;\n}\n\n/**\n * One row per thing an editor recognises — an entry, a singleton, the shared\n * media folder — rather than one per file. An entry is several files, and\n * \"index.json, body.mdoc, media/photo.jpg\" is the repository's view of what\n * the editor knows as one article.\n */\nconst groups = computed<Group[]>(() => {\n const byKey = new Map<string, Group>();\n\n for (const change of status.value?.changes ?? []) {\n const owner = change.owner;\n const key =\n owner.kind === \"entry\"\n ? `entry:${owner.collection}/${owner.slug}`\n : owner.kind === \"singleton\"\n ? `singleton:${owner.name}`\n : owner.kind === \"order\"\n ? `order:${owner.collection}`\n : owner.kind === \"media\"\n ? \"media\"\n : `other:${change.path}`;\n\n let group = byKey.get(key);\n if (!group) {\n group = {\n key,\n label: owner.label,\n // A rename's group can start with a deleted file of the old slug.\n link:\n owner.kind === \"entry\" && (change.kind !== \"delete\" || owner.renamedFrom)\n ? { name: \"entry\", params: { collection: owner.collection, slug: owner.slug } }\n : owner.kind === \"singleton\"\n ? { name: \"singleton\", params: { name: owner.name } }\n : owner.kind === \"media\"\n ? { name: \"media\" }\n : null,\n changes: [],\n target:\n owner.kind === \"entry\"\n ? {\n kind: \"entry\",\n collection: owner.collection,\n slug: owner.slug,\n ...(owner.renamedFrom ? { from: owner.renamedFrom } : {}),\n }\n : owner.kind === \"singleton\"\n ? { kind: \"singleton\", name: owner.name }\n : owner.kind === \"order\"\n ? { kind: \"order\", collection: owner.collection }\n : null,\n };\n byKey.set(key, group);\n }\n group.changes.push(change);\n }\n\n return [...byKey.values()];\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(group: Group): Promise<void> {\n if (!group.target) return;\n comparisons.value[group.key] = { loading: true, error: null, comparison: null };\n try {\n const comparison = await api.staging.compare(group.target);\n comparisons.value[group.key] = { loading: false, error: null, comparison };\n } catch (error) {\n comparisons.value[group.key] = {\n loading: false,\n error: error instanceof ApiError ? error.message : \"Could not load the comparison.\",\n comparison: null,\n };\n }\n}\n\n// The comparison is the change list, so it loads with it — every group, as\n// soon as it appears, without anything to click.\nwatch(groups, (next) => {\n for (const group of next) {\n if (group.target && !comparisons.value[group.key]) void loadComparison(group);\n }\n});\n\nconst workspace = computed(() => status.value?.workspace ?? \"draft-store\");\nconst isTree = computed(() => workspace.value === \"working-tree\");\n\nconst subtitle = computed(() => {\n if (!status.value) return null;\n if (isTree.value) {\n return status.value.branch\n ? `Your working tree, on branch ${status.value.branch}`\n : \"Your working tree\";\n }\n return \"Saved in Mica, waiting to be published\";\n});\n\n/** Commits already made and not yet pushed — visible even across a restart. */\nconst waitingToPush = computed(\n () => pendingPush.value !== null || (isTree.value && (status.value?.ahead ?? 0) > 0),\n);\n\nconst canPublish = computed(\n () =>\n (status.value?.publish.enabled ?? false) &&\n (status.value?.validation.ok ?? false) &&\n (status.value?.changes.length ?? 0) > 0 &&\n !publishing.value,\n);\n\nconst kindWord: Record<PendingChange[\"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 groups 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 group of groups.value) {\n if (group.target && !comparisons.value[group.key]) void loadComparison(group);\n }\n loading.value = false;\n}\n\nonMounted(refresh);\n\nasync function publish(): Promise<void> {\n publishing.value = true;\n try {\n const outcome = await api.staging.publish(message.value, status.value?.baseRevision ?? null);\n\n if (outcome.state === \"published\") {\n pendingPush.value = null;\n message.value = \"\";\n toast.success(\"Published.\", outcome.revision ? `Commit ${short(outcome.revision)}.` : undefined);\n } else {\n // The commit is real; only the push failed. Say so, and keep the retry\n // visible — pressing Publish again must not create a second commit.\n pendingPush.value = outcome;\n message.value = \"\";\n toast.error(\"Committed, but the push failed.\", outcome.pushError);\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 toast.success(\"Pushed.\", outcome.revision ? `Commit ${short(outcome.revision)}.` : undefined);\n } else {\n pendingPush.value = outcome;\n toast.error(\"The push failed again.\", outcome.pushError);\n }\n await staging.refresh();\n } catch (error) {\n toast.error(error instanceof ApiError ? error.message : \"Could not push.\");\n } finally {\n pushing.value = false;\n }\n}\n\nasync function discard(): Promise<void> {\n const group = discardTarget.value;\n if (!group) return;\n\n discarding.value = true;\n try {\n await api.staging.discard(group.changes.map((change) => change.path));\n toast.success(`Discarded the changes to ${group.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\nfunction short(revision: string): string {\n return /^[0-9a-f]{20,}$/i.test(revision) ? revision.slice(0, 7) : revision;\n}\n</script>\n\n<template>\n <PageHeader title=\"Publish\" :subtitle=\"subtitle\">\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 change list</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 <!-- Publishing unavailable: still an honest, read-only change list. -->\n <div\n v-if=\"!status.publish.enabled\"\n class=\"rounded-md border border-line bg-stone 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 <!-- A commit exists that the repository's remote has not seen. -->\n <div\n v-if=\"waitingToPush\"\n role=\"alert\"\n class=\"rounded-md border border-warning/15 bg-warning-soft p-4\"\n >\n <p class=\"text-sm font-medium text-warning\">Committed, waiting to be pushed</p>\n <p class=\"mt-1 text-xs text-muted\">\n {{\n pendingPush?.pushError ??\n \"This branch has commits the remote has not seen. Retrying pushes the existing \" +\n \"commits — it never creates new ones.\"\n }}\n </p>\n <button\n type=\"button\"\n class=\"btn-secondary mt-2.5\"\n :disabled=\"pushing\"\n @click=\"retryPush\"\n >\n {{ pushing ? \"Pushing…\" : \"Retry push\" }}\n </button>\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\">\n These changes cannot be published until they are fixed\n </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-if=\"problem.issues.length\">\n — {{ problem.issues.map((issue) => issue.message).join(\"; \") }}\n </template>\n </li>\n </ul>\n </div>\n\n <!-- Nothing pending -->\n <div v-if=\"groups.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\n {{ isTree ? \"working tree\" : \"draft workspace\" }} matches the repository.\n </p>\n </div>\n\n <!-- The pending set -->\n <section v-else aria-labelledby=\"changes-heading\">\n <h2 id=\"changes-heading\" class=\"sr-only\">Pending changes</h2>\n\n <ul class=\"card divide-y divide-line\">\n <li v-for=\"group in groups\" :key=\"group.key\" class=\"flex items-start gap-3 p-4\">\n <div class=\"min-w-0 flex-1\">\n <component\n :is=\"group.link ? 'RouterLink' : 'p'\"\n v-bind=\"group.link ? { to: group.link } : {}\"\n :class=\"['text-sm font-medium', group.link && 'hover:underline']\"\n >\n {{ group.label }}\n </component>\n\n <!-- What the change does. Groups 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=\"group.target\">\n <p v-if=\"comparisons[group.key]?.loading\" class=\"mt-2 text-xs text-muted\">\n Comparing…\n </p>\n <p v-else-if=\"comparisons[group.key]?.error\" class=\"mt-2 text-xs text-danger\">\n {{ comparisons[group.key]?.error }}\n </p>\n <ChangeComparison\n v-else-if=\"comparisons[group.key]?.comparison\"\n :comparison=\"comparisons[group.key]!.comparison!\"\n :fields=\"fieldsFor(group.target)\"\n />\n </template>\n\n <ul v-else class=\"mt-1 space-y-0.5\">\n <li\n v-for=\"change in group.changes\"\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 = group\">\n Discard\n </button>\n </li>\n </ul>\n </section>\n\n <!-- Publish -->\n <section v-if=\"groups.length > 0 && status.publish.enabled\" class=\"card p-4\" aria-labelledby=\"publish-heading\">\n <h2 id=\"publish-heading\" class=\"text-sm font-semibold\">\n Publish {{ groups.length === 1 ? \"this change\" : `these ${groups.length} changes` }}\n </h2>\n\n <p class=\"mt-1 text-xs text-muted\">\n {{\n isTree\n ? \"One commit of exactly the files listed above, pushed with your own Git configuration.\"\n : \"One commit to the content repository, which is what triggers your site's build.\"\n }}\n <template v-if=\"status.baseRevision\"> Based on {{ short(status.baseRevision) }}.</template>\n </p>\n\n <form class=\"mt-3 flex flex-wrap items-center gap-2\" @submit.prevent=\"canPublish && message.trim() && publish()\">\n <input\n v-model=\"message\"\n type=\"text\"\n class=\"input min-w-0 flex-1\"\n maxlength=\"500\"\n placeholder=\"Describe this publication — it becomes the commit message\"\n aria-label=\"Commit message\"\n :disabled=\"publishing\"\n />\n <button type=\"submit\" class=\"btn-primary\" :disabled=\"!canPublish || !message.trim()\">\n {{ publishing ? \"Publishing…\" : \"Publish\" }}\n </button>\n </form>\n </section>\n </template>\n\n <p v-else class=\"text-sm text-muted\">The change list could not be loaded. Reload to retry.</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 v-if=\"isTree\">\n This restores the files in your working tree to the last commit — new files are deleted,\n edited ones go back. It cannot be undone from here.\n </p>\n <p v-else>\n This forgets the saved changes; the repository stays exactly as it is. It cannot be undone\n from here.\n </p>\n </ConfirmDialog>\n</template>\n"],"names":["__iconNode","RefreshCw","createLucideIcon","compareRows","fields","before","after","walk","path","label","rows","name","field","a","at","named","humanise","asRecord","repeaterRows","asList","canonical","displayValue","itemLabel","present","count","index","b","caption","item","value","entry","_a","option","values","point","_key","record","sorted","key","props","__props","mode","computed","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","schema","useSchema","staging","useStaging","toast","useToast","loading","ref","publishing","pushing","message","discardTarget","discarding","pendingPush","status","groups","byKey","change","owner","group","comparisons","fieldsFor","target","_b","loadComparison","comparison","api","error","ApiError","watch","next","workspace","isTree","subtitle","waitingToPush","canPublish","_c","kindWord","refresh","onMounted","publish","outcome","short","retryPush","discard","revision","_createVNode","PageHeader","_unref","problem","issue","_hoisted_13","_hoisted_14","_hoisted_15","_hoisted_16","_createBlock","_resolveDynamicComponent","_mergeProps","_hoisted_17","_hoisted_18","_d","ChangeComparison","_hoisted_19","_normalizeClass","_hoisted_20","$event","_hoisted_21","_hoisted_22","_hoisted_23","_hoisted_24","_hoisted_26","_hoisted_27","ConfirmDialog"],"mappings":"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","x_google_ignoreList":[0]}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{d as k,q as v,x,c as g,z as p,a as l,t as d,E as C,C as B,b as h,T as w,r as u,h as b,H as E}from"./index-ByBMMOql.js";const D={id:"confirm-title",class:"text-base font-semibold"},L={id:"confirm-body",class:"mt-2 text-sm text-muted"},T={class:"mt-5 flex justify-end gap-2"},$=["disabled"],z=["disabled"],S=k({__name:"ConfirmDialog",props:{open:{type:Boolean},title:{},confirmLabel:{default:"Confirm"},cancelLabel:{default:"Cancel"},destructive:{type:Boolean,default:!1},busy:{type:Boolean,default:!1}},emits:["confirm","cancel"],setup(t,{emit:m}){const r=t,s=m,i=u(null),f=u(null);let o=null;v(()=>r.open,async a=>{var e;if(!a){o==null||o.focus();return}o=document.activeElement,await E(),(e=f.value)==null||e.focus()});function y(a){if(a.key==="Escape"&&!r.busy&&s("cancel"),a.key!=="Tab"||!i.value)return;const e=i.value.querySelectorAll("button:not([disabled])"),n=e[0],c=e[e.length-1];!n||!c||(a.shiftKey&&document.activeElement===n?(a.preventDefault(),c.focus()):!a.shiftKey&&document.activeElement===c&&(a.preventDefault(),n.focus()))}return(a,e)=>(b(),x(w,{to:"body"},[t.open?(b(),g("div",{key:0,class:"fixed inset-0 z-50 grid place-items-center bg-black/40 p-4",onClick:e[2]||(e[2]=p(n=>!t.busy&&s("cancel"),["self"])),onKeydown:y},[l("div",{ref_key:"panel",ref:i,role:"alertdialog","aria-modal":"true","aria-labelledby":"confirm-title","aria-describedby":"confirm-body",class:"w-full max-w-md rounded-xl border border-line bg-raised p-5 shadow-2xl"},[l("h2",D,d(t.title),1),l("div",L,[C(a.$slots,"default")]),l("div",T,[l("button",{ref_key:"cancelButton",ref:f,type:"button",class:"btn-secondary",disabled:t.busy,onClick:e[0]||(e[0]=n=>s("cancel"))},d(t.cancelLabel),9,$),l("button",{type:"button",class:B(t.destructive?"btn-danger":"btn-primary"),disabled:t.busy,onClick:e[1]||(e[1]=n=>s("confirm"))},d(t.busy?"Working…":t.confirmLabel),11,z)])],512)],32)):h("",!0)]))}});export{S as _};
|
|
2
|
-
//# sourceMappingURL=ConfirmDialog.vue_vue_type_script_setup_true_lang-XwTu9vH_.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ConfirmDialog.vue_vue_type_script_setup_true_lang-XwTu9vH_.js","sources":["../../src/components/ConfirmDialog.vue"],"sourcesContent":["<script setup lang=\"ts\">\n/** Confirmation dialog with focus handling and Escape-to-cancel. */\n\nimport { nextTick, ref, watch } from \"vue\";\n\nconst props = withDefaults(\n defineProps<{\n open: boolean;\n title: string;\n confirmLabel?: string;\n cancelLabel?: string;\n destructive?: boolean;\n busy?: boolean;\n }>(),\n { confirmLabel: \"Confirm\", cancelLabel: \"Cancel\", destructive: false, busy: false },\n);\n\nconst emit = defineEmits<{ confirm: []; cancel: [] }>();\n\nconst panel = ref<HTMLElement | null>(null);\nconst cancelButton = ref<HTMLButtonElement | null>(null);\nlet previouslyFocused: HTMLElement | null = null;\n\nwatch(\n () => props.open,\n async (open) => {\n if (!open) {\n previouslyFocused?.focus();\n return;\n }\n previouslyFocused = document.activeElement as HTMLElement | null;\n await nextTick();\n // Focus the safe option, not the destructive one.\n cancelButton.value?.focus();\n },\n);\n\nfunction onKeydown(event: KeyboardEvent): void {\n if (event.key === \"Escape\" && !props.busy) emit(\"cancel\");\n if (event.key !== \"Tab\" || !panel.value) return;\n\n const focusable = panel.value.querySelectorAll<HTMLElement>(\"button:not([disabled])\");\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n if (!first || !last) return;\n\n if (event.shiftKey && document.activeElement === first) {\n event.preventDefault();\n last.focus();\n } else if (!event.shiftKey && document.activeElement === last) {\n event.preventDefault();\n first.focus();\n }\n}\n</script>\n\n<template>\n <Teleport to=\"body\">\n <div\n v-if=\"open\"\n class=\"fixed inset-0 z-50 grid place-items-center bg-black/40 p-4\"\n @click.self=\"!busy && emit('cancel')\"\n @keydown=\"onKeydown\"\n >\n <div\n ref=\"panel\"\n role=\"alertdialog\"\n aria-modal=\"true\"\n aria-labelledby=\"confirm-title\"\n aria-describedby=\"confirm-body\"\n class=\"w-full max-w-md rounded-xl border border-line bg-raised p-5 shadow-2xl\"\n >\n <h2 id=\"confirm-title\" class=\"text-base font-semibold\">{{ title }}</h2>\n\n <div id=\"confirm-body\" class=\"mt-2 text-sm text-muted\">\n <slot />\n </div>\n\n <div class=\"mt-5 flex justify-end gap-2\">\n <button\n ref=\"cancelButton\"\n type=\"button\"\n class=\"btn-secondary\"\n :disabled=\"busy\"\n @click=\"emit('cancel')\"\n >\n {{ cancelLabel }}\n </button>\n <button\n type=\"button\"\n :class=\"destructive ? 'btn-danger' : 'btn-primary'\"\n :disabled=\"busy\"\n @click=\"emit('confirm')\"\n >\n {{ busy ? \"Working…\" : confirmLabel }}\n </button>\n </div>\n </div>\n </div>\n </Teleport>\n</template>\n"],"names":["props","__props","emit","__emit","panel","ref","cancelButton","previouslyFocused","watch","open","nextTick","_a","onKeydown","event","focusable","first","last","_createBlock","_Teleport","_createElementBlock","_cache","_withModifiers","$event","_createElementVNode","_hoisted_1","_toDisplayString","_hoisted_2","_renderSlot","_ctx","_hoisted_3","_hoisted_4","_hoisted_5"],"mappings":"0iBAKA,MAAMA,EAAQC,EAYRC,EAAOC,EAEPC,EAAQC,EAAwB,IAAI,EACpCC,EAAeD,EAA8B,IAAI,EACvD,IAAIE,EAAwC,KAE5CC,EACE,IAAMR,EAAM,KACZ,MAAOS,GAAS,OACd,GAAI,CAACA,EAAM,CACTF,GAAA,MAAAA,EAAmB,QACnB,MACF,CACAA,EAAoB,SAAS,cAC7B,MAAMG,EAAA,GAENC,EAAAL,EAAa,QAAb,MAAAK,EAAoB,OACtB,CAAA,EAGF,SAASC,EAAUC,EAA4B,CAE7C,GADIA,EAAM,MAAQ,UAAY,CAACb,EAAM,QAAW,QAAQ,EACpDa,EAAM,MAAQ,OAAS,CAACT,EAAM,MAAO,OAEzC,MAAMU,EAAYV,EAAM,MAAM,iBAA8B,wBAAwB,EAC9EW,EAAQD,EAAU,CAAC,EACnBE,EAAOF,EAAUA,EAAU,OAAS,CAAC,EACvC,CAACC,GAAS,CAACC,IAEXH,EAAM,UAAY,SAAS,gBAAkBE,GAC/CF,EAAM,eAAA,EACNG,EAAK,MAAA,GACI,CAACH,EAAM,UAAY,SAAS,gBAAkBG,IACvDH,EAAM,eAAA,EACNE,EAAM,MAAA,GAEV,mBAIEE,EA0CWC,EAAA,CA1CD,GAAG,QAAM,CAETjB,EAAA,UADRkB,EAwCM,MAAA,OAtCJ,MAAM,6DACL,QAAKC,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAC,EAAAC,GAAA,CAAQrB,EAAA,MAAQC,EAAI,QAAA,EAAA,CAAA,MAAA,CAAA,GACzB,UAAAU,CAAA,GAEDW,EAiCM,MAAA,SAhCA,QAAJ,IAAInB,EACJ,KAAK,cACL,aAAW,OACX,kBAAgB,gBAChB,mBAAiB,eACjB,MAAM,wEAAA,GAENmB,EAAuE,KAAvEC,EAAuEC,EAAbxB,EAAA,KAAK,EAAA,CAAA,EAE/DsB,EAEM,MAFNG,EAEM,CADJC,EAAQC,EAAA,OAAA,SAAA,CAAA,GAGVL,EAkBM,MAlBNM,EAkBM,CAjBJN,EAQS,SAAA,SAPH,eAAJ,IAAIjB,EACJ,KAAK,SACL,MAAM,gBACL,SAAUL,EAAA,KACV,uBAAOC,EAAI,QAAA,EAAA,IAETD,EAAA,WAAW,EAAA,EAAA6B,CAAA,EAEhBP,EAOS,SAAA,CANP,KAAK,SACJ,QAAOtB,EAAA,YAAW,aAAA,aAAA,EAClB,SAAUA,EAAA,KACV,uBAAOC,EAAI,SAAA,EAAA,EAETuB,EAAAxB,EAAA,gBAAoBA,EAAA,YAAY,EAAA,GAAA8B,CAAA,CAAA"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{d as k,o as C,i as V,A as $,c as l,j as d,a as e,F as c,k as L,w as m,l as p,t as n,b as x,m as N,n as S,r as b,g as _,p as B,h as r,e as D,u as E}from"./index-ByBMMOql.js";import{_ as G}from"./PageHeader.vue_vue_type_script_setup_true_lang-B10dWbKQ.js";const R={class:"mx-auto max-w-5xl space-y-6 px-4 py-6 sm:px-6"},T={key:0,class:"text-sm text-muted"},j={"aria-labelledby":"content-heading"},A={class:"grid grid-cols-2 gap-3 lg:grid-cols-4"},F={class:"text-sm text-muted"},M={class:"mt-1 text-[30px] font-light leading-9 tabular-nums"},H={class:"mt-1 text-xs text-muted"},O={class:"mt-1 text-[30px] font-light leading-9 tabular-nums"},q={class:"mt-1 text-xs text-muted"},z={key:0,class:"card p-4","aria-labelledby":"pending-heading"},I={class:"flex flex-wrap items-center justify-between gap-3"},J={id:"pending-heading",class:"text-sm font-semibold"},K={class:"card p-4","aria-labelledby":"repository-heading"},P={class:"mt-2 break-all font-mono text-xs text-muted"},X=k({__name:"DashboardView",setup(Q){const y=E(),u=N(),f=S(),a=b(null),g=b(!0),w=_(()=>{var o,v;const s=(v=(o=y.identity.value)==null?void 0:o.name)==null?void 0:v.split(" ")[0];if(!s)return"Overview";const t=new Date().getHours();return`${t<12?"Good morning":t<18?"Good afternoon":"Good evening"}, ${s}`}),h=_(()=>{var s;return(((s=a.value)==null?void 0:s.collections)??[]).reduce((t,i)=>t+i.total,0)});return C(async()=>{try{a.value=await V.overview()}catch(s){f.error(s instanceof $?s.message:"Could not load the overview.")}finally{g.value=!1}}),(s,t)=>{const i=B("RouterLink");return r(),l(c,null,[d(G,{title:w.value,subtitle:`${h.value} entr${h.value===1?"y":"ies"} in the content repository`},null,8,["title","subtitle"]),e("div",R,[g.value?(r(),l("p",T,"Loading…")):a.value?(r(),l(c,{key:1},[e("section",j,[t[1]||(t[1]=e("h2",{id:"content-heading",class:"sr-only"},"Content",-1)),e("ul",A,[(r(!0),l(c,null,L(a.value.collections,o=>(r(),l("li",{key:o.name},[d(i,{to:{name:"collection",params:{collection:o.name}},class:"card block p-4 transition hover:border-line-strong hover:bg-raised"},{default:m(()=>[e("p",F,n(o.label),1),e("p",M,n(o.total),1),e("p",H,n(o.total===1?"entry":"entries"),1)]),_:2},1032,["to"])]))),128)),e("li",null,[d(i,{to:{name:"media"},class:"card block p-4 transition hover:border-line-strong hover:bg-raised"},{default:m(()=>[t[0]||(t[0]=e("p",{class:"text-sm text-muted"},"Media",-1)),e("p",O,n(a.value.media.files),1),e("p",q,n(a.value.media.readable),1)]),_:1})])])]),p(u).pendingCount.value>0?(r(),l("section",z,[e("div",I,[e("div",null,[e("h2",J,n(p(u).pendingCount.value)+" change"+n(p(u).pendingCount.value===1?"":"s")+" waiting to be published ",1),t[2]||(t[2]=e("p",{class:"mt-1 text-sm text-muted"}," Saved, and not yet in the repository. The whole set is published together. ",-1))]),d(i,{to:{name:"changes"},class:"btn-secondary"},{default:m(()=>[...t[3]||(t[3]=[D("Review and publish",-1)])]),_:1})])])):x("",!0),e("section",K,[t[4]||(t[4]=e("h2",{id:"repository-heading",class:"text-sm font-semibold"},"Content repository",-1)),e("p",P,n(a.value.repository),1),t[5]||(t[5]=e("p",{class:"mt-3 text-sm text-muted"}," Every entry and every uploaded file becomes a file in this repository when it is published, so the website can be rebuilt from the repository alone — with or without this server. ",-1))])],64)):x("",!0)])],64)}}});export{X as default};
|
|
2
|
-
//# sourceMappingURL=DashboardView-BltT4kYe.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"DashboardView-BltT4kYe.js","sources":["../../src/views/DashboardView.vue"],"sourcesContent":["<script setup lang=\"ts\">\n/**\n * Dashboard.\n *\n * Counts and where the content lives, and deliberately little else.\n *\n * One pending-changes card, because Saved and Published are different words\n * now and the difference should be visible from the front door. Still no\n * \"Rebuild website\" button: the published commit is the trigger, and what\n * follows belongs to the repository's own pipeline. No \"recently edited\" list\n * either — the honest source for that is the repository's history, which a\n * connector in front of a plain working tree cannot read, and a half-true\n * version would be worse than none.\n */\n\nimport { computed, onMounted, ref } from \"vue\";\n\nimport { api, ApiError, type Overview } from \"@/api\";\nimport PageHeader from \"@/components/PageHeader.vue\";\nimport { useSession } from \"@/stores/session\";\nimport { useStaging } from \"@/stores/staging\";\nimport { useToast } from \"@/stores/toast\";\n\nconst session = useSession();\nconst staging = useStaging();\nconst toast = useToast();\n\nconst overview = ref<Overview | null>(null);\nconst loading = ref(true);\n\n/**\n * Greeted by name only where somebody said what the name is.\n *\n * Local mode has no user, so there is nobody to greet — and \"Good morning,\n * there\" would be a greeting to an imaginary person, which is exactly the\n * synthetic local user this design does without.\n */\nconst greeting = computed(() => {\n const name = session.identity.value?.name?.split(\" \")[0];\n if (!name) return \"Overview\";\n\n const hour = new Date().getHours();\n const part = hour < 12 ? \"Good morning\" : hour < 18 ? \"Good afternoon\" : \"Good evening\";\n return `${part}, ${name}`;\n});\n\nconst entries = computed(() =>\n (overview.value?.collections ?? []).reduce((total, item) => total + item.total, 0),\n);\n\nonMounted(async () => {\n try {\n overview.value = await api.overview();\n } catch (error) {\n toast.error(error instanceof ApiError ? error.message : \"Could not load the overview.\");\n } finally {\n loading.value = false;\n }\n});\n</script>\n\n<template>\n <PageHeader\n :title=\"greeting\"\n :subtitle=\"`${entries} entr${entries === 1 ? 'y' : 'ies'} in the content repository`\"\n />\n\n <div class=\"mx-auto max-w-5xl space-y-6 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=\"overview\">\n <section aria-labelledby=\"content-heading\">\n <h2 id=\"content-heading\" class=\"sr-only\">Content</h2>\n\n <ul class=\"grid grid-cols-2 gap-3 lg:grid-cols-4\">\n <li v-for=\"collection in overview.collections\" :key=\"collection.name\">\n <RouterLink\n :to=\"{ name: 'collection', params: { collection: collection.name } }\"\n class=\"card block p-4 transition hover:border-line-strong hover:bg-raised\"\n >\n <p class=\"text-sm text-muted\">{{ collection.label }}</p>\n <p class=\"mt-1 text-[30px] font-light leading-9 tabular-nums\">{{ collection.total }}</p>\n <p class=\"mt-1 text-xs text-muted\">\n {{ collection.total === 1 ? \"entry\" : \"entries\" }}\n </p>\n </RouterLink>\n </li>\n\n <li>\n <RouterLink :to=\"{ name: 'media' }\" class=\"card block p-4 transition hover:border-line-strong hover:bg-raised\">\n <p class=\"text-sm text-muted\">Media</p>\n <p class=\"mt-1 text-[30px] font-light leading-9 tabular-nums\">{{ overview.media.files }}</p>\n <p class=\"mt-1 text-xs text-muted\">{{ overview.media.readable }}</p>\n </RouterLink>\n </li>\n </ul>\n </section>\n\n <section\n v-if=\"staging.pendingCount.value > 0\"\n class=\"card p-4\"\n aria-labelledby=\"pending-heading\"\n >\n <div class=\"flex flex-wrap items-center justify-between gap-3\">\n <div>\n <h2 id=\"pending-heading\" class=\"text-sm font-semibold\">\n {{ staging.pendingCount.value }} change{{ staging.pendingCount.value === 1 ? \"\" : \"s\" }}\n waiting to be published\n </h2>\n <p class=\"mt-1 text-sm text-muted\">\n Saved, and not yet in the repository. The whole set is published together.\n </p>\n </div>\n <RouterLink :to=\"{ name: 'changes' }\" class=\"btn-secondary\">Review and publish</RouterLink>\n </div>\n </section>\n\n <section class=\"card p-4\" aria-labelledby=\"repository-heading\">\n <h2 id=\"repository-heading\" class=\"text-sm font-semibold\">Content repository</h2>\n\n <p class=\"mt-2 break-all font-mono text-xs text-muted\">{{ overview.repository }}</p>\n\n <p class=\"mt-3 text-sm text-muted\">\n Every entry and every uploaded file becomes a file in this repository when it is\n published, so the website can be rebuilt from the repository alone — with or without\n this server.\n </p>\n </section>\n </template>\n </div>\n</template>\n"],"names":["session","useSession","staging","useStaging","toast","useToast","overview","ref","loading","greeting","computed","name","_b","_a","hour","entries","total","item","onMounted","api","error","ApiError","_createVNode","PageHeader","_createElementVNode","_hoisted_1","_createElementBlock","_hoisted_2","_Fragment","_hoisted_3","_hoisted_4","_openBlock","_renderList","collection","_component_RouterLink","_hoisted_5","_toDisplayString","_hoisted_6","_hoisted_7","_cache","_hoisted_8","_hoisted_9","_unref","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"EntryView-CJe3KppU.js","sources":["../../src/views/EntryView.vue"],"sourcesContent":["<script setup lang=\"ts\">\n/**\n * Entry editor.\n *\n * One Save button, and Saved is not Published: a save lands in the site's\n * draft workspace and collects on the Publish page until somebody publishes\n * it. Unfinished work stays in this form and never reaches the server, which\n * is what the unsaved-changes guard is for.\n *\n * `revision` is how two editors stay out of each other's way. The form\n * remembers which version of the entry it opened and sends that token back with\n * the save. If someone else saved in the meantime the server answers 409, and\n * this view says so plainly rather than overwriting their work.\n *\n * An entry is addressed by its slug, so changing the slug field moves the entry\n * — files and all — and the route follows it.\n */\n\nimport { computed, onMounted, ref } from \"vue\";\nimport { useRouter } from \"vue-router\";\n\nimport { defaultValues, type FieldIssue } from \"@micacms/core\";\n\nimport { api, ApiError, type EntryDetail } from \"@/api\";\nimport ConfirmDialog from \"@/components/ConfirmDialog.vue\";\nimport FieldList from \"@/components/fields/FieldList.vue\";\nimport PageHeader from \"@/components/PageHeader.vue\";\nimport { useUnsavedChanges } from \"@/composables/useUnsavedChanges\";\nimport { useSchema } from \"@/stores/schema\";\nimport { useStaging } from \"@/stores/staging\";\nimport { useToast } from \"@/stores/toast\";\n\nconst props = defineProps<{ collection: string; slug?: string }>();\n\nconst router = useRouter();\nconst schema = useSchema();\nconst staging = useStaging();\nconst toast = useToast();\n\nconst definition = computed(() => schema.collection(props.collection));\n\nconst entry = ref<EntryDetail | null>(null);\nconst values = ref<Record<string, unknown>>({});\nconst issues = ref<FieldIssue[]>([]);\nconst loading = ref(true);\nconst saving = ref(false);\nconst conflict = ref(false);\nconst confirmDelete = ref(false);\nconst references = ref<Array<{ collection: string; title: string }>>([]);\n\n/**\n * The version this form was opened against.\n *\n * `null` on a new entry, which asserts to the server that nothing is there —\n * so two people creating the same slug is a conflict, not a silent overwrite.\n */\nconst revision = ref<string | null>(null);\n\nconst unsaved = useUnsavedChanges(values);\nconst dirty = unsaved.dirty;\n\nconst isNew = computed(() => !props.slug);\n\nconst title = computed(() => {\n const def = definition.value;\n if (!def) return \"Entry\";\n const value = values.value[def.titleField];\n if (typeof value === \"string\" && value.trim()) return value.trim();\n return isNew.value ? `New ${def.labelSingular.toLowerCase()}` : \"Untitled\";\n});\n\n/**\n * Where this entry lives in the repository — the path a reviewer will see.\n *\n * From the server, not assembled here: an entry with rich text or media is a\n * directory, and one without is a single `.json` file.\n */\nconst location = computed(() => entry.value?.path ?? \"Not saved yet\");\n\nfunction setBaseline(detail: EntryDetail): void {\n entry.value = detail;\n values.value = structuredClone(detail.data);\n revision.value = detail.revision;\n issues.value = [];\n conflict.value = false;\n unsaved.markClean();\n}\n\nasync function open(slug: string): Promise<void> {\n setBaseline(await api.entries.get(props.collection, slug));\n}\n\nonMounted(async () => {\n const def = definition.value;\n if (!def) {\n loading.value = false;\n return;\n }\n\n try {\n if (props.slug) {\n await open(props.slug);\n } else {\n // A fresh entry starts as a full skeleton so every input is bound. The\n // skeleton itself is not an edit, so it becomes the baseline.\n values.value = defaultValues(def.fields);\n revision.value = null;\n unsaved.markClean();\n }\n } catch (error) {\n toast.error(error instanceof ApiError ? error.message : \"Could not open this entry.\");\n await router.replace({ name: \"collection\", params: { collection: props.collection } });\n } finally {\n loading.value = false;\n }\n});\n\nasync function save(): Promise<void> {\n saving.value = true;\n issues.value = [];\n\n const payload = { data: values.value, revision: revision.value };\n\n try {\n const saved = props.slug\n ? await api.entries.update(props.collection, props.slug, payload)\n : await api.entries.create(props.collection, payload);\n\n // The server owns the slug — it derives it, de-duplicates it, and may have\n // moved the entry. Re-open at whatever it decided rather than assuming.\n unsaved.markClean();\n toast.success(saved.renamed ? `Saved as “${saved.slug}”.` : \"Saved.\");\n void staging.refresh();\n\n if (saved.slug !== props.slug) {\n await router.replace({\n name: \"entry\",\n params: { collection: props.collection, slug: saved.slug },\n });\n return;\n }\n\n await open(saved.slug);\n } catch (error) {\n if (error instanceof ApiError && error.status === 409) {\n // Nothing is lost: the form still holds the editor's work, and reloading\n // is a deliberate act rather than something that happens under them.\n conflict.value = true;\n toast.error(\"Someone else saved this entry while you were editing it.\");\n } else if (error instanceof ApiError && error.issues.length > 0) {\n issues.value = error.issues;\n toast.error(error.message, `${error.issues.length} field(s) need attention.`);\n // Take the editor to the first problem rather than leaving them hunting.\n requestAnimationFrame(() => {\n document\n .querySelector('[aria-invalid=\"true\"], .field-error')\n ?.scrollIntoView({ behavior: \"smooth\", block: \"center\" });\n });\n } else {\n toast.error(error instanceof ApiError ? error.message : \"Could not save this entry.\");\n }\n } finally {\n saving.value = false;\n }\n}\n\n/** Takes the version now in the repository, discarding this form's edits. */\nasync function reload(): Promise<void> {\n if (!props.slug) return;\n try {\n await open(props.slug);\n toast.success(\"Reloaded from the repository.\");\n } catch (error) {\n toast.error(error instanceof ApiError ? error.message : \"Could not reload this entry.\");\n }\n}\n\nasync function askDelete(): Promise<void> {\n references.value = [];\n if (props.slug) {\n try {\n const { references: found } = await api.entries.references(props.collection, props.slug);\n references.value = found.map((item) => ({\n collection: schema.collection(item.collection)?.label ?? item.collection,\n title: item.title,\n }));\n } catch {\n // The warning is a courtesy; a failure to fetch it must not block deletion.\n }\n }\n confirmDelete.value = true;\n}\n\nasync function remove(): Promise<void> {\n if (!props.slug) return;\n try {\n await api.entries.remove(props.collection, props.slug);\n unsaved.release();\n toast.success(\"Deleted.\");\n void staging.refresh();\n await router.replace({ name: \"collection\", params: { collection: props.collection } });\n } catch (error) {\n toast.error(error instanceof ApiError ? error.message : \"Could not delete this entry.\");\n } finally {\n confirmDelete.value = false;\n }\n}\n</script>\n\n<template>\n <template v-if=\"definition\">\n <PageHeader\n :title=\"title\"\n :subtitle=\"location\"\n :back=\"{ name: 'collection', params: { collection } }\"\n :back-label=\"definition.label\"\n >\n <span :class=\"['badge', dirty ? 'border-brand bg-brand-soft text-brand' : 'text-success']\">\n <span class=\"h-1.5 w-1.5 rounded-full bg-current\" aria-hidden=\"true\" />\n {{ dirty ? \"Unsaved\" : \"Saved\" }}\n </span>\n <button type=\"button\" class=\"btn-primary\" :disabled=\"saving || !dirty\" @click=\"save\">\n {{ saving ? \"Saving…\" : \"Save changes\" }}\n </button>\n </PageHeader>\n\n <div class=\"mx-auto max-w-3xl px-4 py-6 sm:px-6\">\n <p v-if=\"loading\" class=\"text-sm text-muted\">Loading…</p>\n\n <template v-else>\n <div\n v-if=\"conflict\"\n role=\"alert\"\n class=\"mb-5 rounded-md border border-warning/15 bg-warning-soft p-4\"\n >\n <p class=\"text-sm font-medium text-warning\">This entry changed while you were editing</p>\n <p class=\"mt-1 text-xs text-muted\">\n Your changes are still here and have not been saved. Copy anything you need, then load\n the current version — or open the repository to see what changed.\n </p>\n <button type=\"button\" class=\"btn-secondary mt-2.5\" @click=\"reload\">\n Discard mine and reload\n </button>\n </div>\n\n <div\n v-if=\"issues.length\"\n role=\"alert\"\n class=\"mb-5 rounded-md border border-danger/15 bg-danger-soft p-4\"\n >\n <p class=\"text-sm font-medium text-danger\">\n {{ issues.length }} field{{ issues.length === 1 ? \"\" : \"s\" }} need attention\n </p>\n <ul class=\"mt-1.5 space-y-0.5 text-xs text-danger\">\n <li v-for=\"issue in issues\" :key=\"issue.path\">{{ issue.message }}</li>\n </ul>\n </div>\n\n <form novalidate @submit.prevent=\"save\">\n <FieldList\n v-model=\"values\"\n :fields=\"definition.fields\"\n :issues=\"issues\"\n :disabled=\"saving\"\n :collection=\"collection\"\n :entry-slug=\"slug\"\n />\n\n <!-- Enter in a text input should save, not do nothing. -->\n <button type=\"submit\" class=\"sr-only\">Save</button>\n </form>\n\n <div v-if=\"!isNew\" class=\"mt-10 border-t border-line pt-5\">\n <button type=\"button\" class=\"btn-danger\" @click=\"askDelete\">\n Delete this {{ definition.labelSingular.toLowerCase() }}\n </button>\n </div>\n </template>\n </div>\n\n <ConfirmDialog\n :open=\"confirmDelete\"\n :title=\"`Delete “${title}”?`\"\n confirm-label=\"Delete\"\n destructive\n @cancel=\"confirmDelete = false\"\n @confirm=\"remove\"\n >\n <!-- Honest about what a delete is now: a pending change. It reaches the\n repository's history when the pending set is published, and the\n history keeps it from then on. -->\n <p>\n This removes <code>{{ location }}</code>. Like any edit, the removal joins the pending\n changes and reaches the repository when they are published.\n </p>\n\n <div v-if=\"references.length\" class=\"mt-3 rounded-md border border-warning/15 bg-warning-soft p-4\">\n <p class=\"text-sm font-medium text-warning\">\n {{ references.length }} other entr{{ references.length === 1 ? \"y\" : \"ies\" }} link to this\n one:\n </p>\n <ul class=\"mt-1 list-inside list-disc text-xs\">\n <li v-for=\"(item, index) in references\" :key=\"index\">\n {{ item.title }} ({{ item.collection }})\n </li>\n </ul>\n </div>\n </ConfirmDialog>\n </template>\n\n <div v-else class=\"p-8 text-center text-sm text-muted\">\n There is no collection called \"{{ collection }}\".\n </div>\n</template>\n"],"names":["props","__props","router","useRouter","schema","useSchema","staging","useStaging","toast","useToast","definition","computed","entry","ref","values","issues","loading","saving","conflict","confirmDelete","references","revision","unsaved","useUnsavedChanges","dirty","isNew","title","def","value","location","_a","setBaseline","detail","open","slug","api","onMounted","defaultValues","error","ApiError","save","payload","saved","reload","askDelete","found","item","remove","_createElementBlock","_Fragment","_createVNode","PageHeader","_createElementVNode","_unref","_createTextVNode","_hoisted_1","_hoisted_2","_hoisted_3","_openBlock","_hoisted_4","_cache","_hoisted_5","_hoisted_6","_toDisplayString","_hoisted_7","_renderList","issue","FieldList","$event","_hoisted_8","ConfirmDialog","_hoisted_9","_hoisted_10","_hoisted_11","index","_hoisted_12"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{d as _,o as y,c as a,a as t,_ as b,t as u,b as d,e as v,u as h,f as k,r as f,g as c,h as i}from"./index-ByBMMOql.js";const w={key:0,class:"grid min-h-full place-items-center p-6"},q={key:1,class:"grid min-h-full place-items-center p-6"},M={class:"w-full max-w-sm"},C={class:"card space-y-4 p-5"},S={key:0,role:"alert",class:"rounded-md border border-danger/15 bg-danger-soft px-4 py-3 text-sm text-danger"},V=["disabled"],B={key:1,class:"text-center text-xs text-muted"},N={class:"font-medium"},R={key:0,class:"mt-4 text-center text-xs text-muted"},I=_({__name:"LoginView",setup(T){const r=h(),m=k(),l=f(!1),o=f(null),p=c(()=>{var e;return(e=r.config.value)==null?void 0:e.provider}),n=c(()=>{var e;return((e=r.config.value)==null?void 0:e.authRequired)===!1}),x=c(()=>{const e=m.query.redirect;return typeof e=="string"&&e.startsWith("/admin")?e:"/admin/"});y(()=>{const e=m.query.error;typeof e=="string"&&(o.value=e),n.value&&!o.value&&g()});function g(){l.value=!0,r.signIn(x.value)}return(e,s)=>n.value&&!o.value?(i(),a("div",w,[...s[0]||(s[0]=[t("p",{class:"text-sm text-muted"},"Opening the editor…",-1)])])):(i(),a("div",q,[t("div",M,[s[3]||(s[3]=t("div",{class:"mb-7 flex flex-col items-center gap-4 text-center"},[t("img",{src:b,alt:"Mica",class:"h-10 w-auto"}),t("div",null,[t("h1",{class:"text-lg font-semibold tracking-tight"},"Sign in to Mica"),t("p",{class:"mt-0.5 text-sm text-muted"},"Manage your website content.")])],-1)),t("div",C,[o.value?(i(),a("p",S,u(o.value),1)):d("",!0),t("button",{type:"button",class:"btn-primary w-full",disabled:l.value,onClick:g},u(l.value?"Redirecting…":n.value?"Continue":"Sign in"),9,V),p.value&&!n.value?(i(),a("p",B,[s[1]||(s[1]=v(" You will be taken to ",-1)),t("span",N,u(p.value),1),s[2]||(s[2]=v(" to sign in. ",-1))])):d("",!0)]),n.value?d("",!0):(i(),a("p",R," Mica does not hold your password. Trouble signing in is a question for whoever runs your identity provider; no access once you are in is a question for a site administrator. "))])]))}});export{I as default};
|
|
2
|
-
//# sourceMappingURL=LoginView-Cif8mF1w.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"LoginView-Cif8mF1w.js","sources":["../../src/views/LoginView.vue"],"sourcesContent":["<script setup lang=\"ts\">\n/**\n * Sign in.\n *\n * There is no form. Mica does not hold passwords, so there is nothing for an\n * editor to type here — the button hands the browser to the identity provider,\n * which does the actual authenticating and sends it back.\n *\n * The error banner exists because the round trip can fail after the provider\n * is satisfied: someone can authenticate perfectly well and still not be\n * admitted to this site, and that has to read as \"ask for access\", not as\n * \"your password was wrong\".\n *\n * In local mode this screen is not reached at all: there is no provider, no\n * account and nobody to be, and the session starts as the page is served. The\n * redirect below is the fallback for the one way in that skips that — a\n * browser still holding `/admin/login` from an earlier session.\n */\n\nimport { computed, onMounted, ref } from \"vue\";\nimport { useRoute } from \"vue-router\";\n\nimport { useSession } from \"@/stores/session\";\n\nconst session = useSession();\nconst route = useRoute();\n\nconst busy = ref(false);\n\n/** Set by the callback when it bounces the browser back here with a reason. */\nconst error = ref<string | null>(null);\n\nconst provider = computed(() => session.config.value?.provider);\n/** Local mode: no provider to send anybody to, so there is nothing to show. */\nconst authDisabled = computed(() => session.config.value?.authRequired === false);\n\n/** Where to land afterwards. Always a path on this server. */\nconst returnTo = computed(() => {\n const redirect = route.query[\"redirect\"];\n return typeof redirect === \"string\" && redirect.startsWith(\"/admin\")\n ? redirect\n : \"/admin/\";\n});\n\nonMounted(() => {\n const reason = route.query[\"error\"];\n if (typeof reason === \"string\") error.value = reason;\n\n // No provider, no question to ask. Straight to the editor.\n if (authDisabled.value && !error.value) signIn();\n});\n\nfunction signIn(): void {\n busy.value = true;\n session.signIn(returnTo.value);\n}\n</script>\n\n<template>\n <!-- Local mode: a held breath, not a screen. -->\n <div v-if=\"authDisabled && !error\" class=\"grid min-h-full place-items-center p-6\">\n <p class=\"text-sm text-muted\">Opening the editor…</p>\n </div>\n\n <div v-else class=\"grid min-h-full place-items-center p-6\">\n <div class=\"w-full max-w-sm\">\n <div class=\"mb-7 flex flex-col items-center gap-4 text-center\">\n <img src=\"/brand/mica-logo-glimmer.svg\" alt=\"Mica\" class=\"h-10 w-auto\" />\n <div>\n <h1 class=\"text-lg font-semibold tracking-tight\">Sign in to Mica</h1>\n <p class=\"mt-0.5 text-sm text-muted\">Manage your website content.</p>\n </div>\n </div>\n\n <div class=\"card space-y-4 p-5\">\n <p v-if=\"error\" role=\"alert\" class=\"rounded-md border border-danger/15 bg-danger-soft px-4 py-3 text-sm text-danger\">\n {{ error }}\n </p>\n\n <button type=\"button\" class=\"btn-primary w-full\" :disabled=\"busy\" @click=\"signIn\">\n {{ busy ? \"Redirecting…\" : authDisabled ? \"Continue\" : \"Sign in\" }}\n </button>\n\n <p v-if=\"provider && !authDisabled\" class=\"text-center text-xs text-muted\">\n You will be taken to <span class=\"font-medium\">{{ provider }}</span> to sign in.\n </p>\n </div>\n\n <p v-if=\"!authDisabled\" class=\"mt-4 text-center text-xs text-muted\">\n Mica does not hold your password. Trouble signing in is a question for\n whoever runs your identity provider; no access once you are in is a\n question for a site administrator.\n </p>\n </div>\n </div>\n</template>\n"],"names":["session","useSession","route","useRoute","busy","ref","error","provider","computed","_a","authDisabled","returnTo","redirect","onMounted","reason","signIn","_openBlock","_createElementBlock","_hoisted_1","_cache","_createElementVNode","_hoisted_2","_hoisted_3","_imports_0","_hoisted_4","_hoisted_5","_toDisplayString","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9"],"mappings":"6kBAwBA,MAAMA,EAAUC,EAAA,EACVC,EAAQC,EAAA,EAERC,EAAOC,EAAI,EAAK,EAGhBC,EAAQD,EAAmB,IAAI,EAE/BE,EAAWC,EAAS,IAAA,OAAM,OAAAC,EAAAT,EAAQ,OAAO,QAAf,YAAAS,EAAsB,SAAQ,EAExDC,EAAeF,EAAS,IAAA,OAAM,QAAAC,EAAAT,EAAQ,OAAO,QAAf,YAAAS,EAAsB,gBAAiB,GAAK,EAG1EE,EAAWH,EAAS,IAAM,CAC9B,MAAMI,EAAWV,EAAM,MAAM,SAC7B,OAAO,OAAOU,GAAa,UAAYA,EAAS,WAAW,QAAQ,EAC/DA,EACA,SACN,CAAC,EAEDC,EAAU,IAAM,CACd,MAAMC,EAASZ,EAAM,MAAM,MACvB,OAAOY,GAAW,WAAUR,EAAM,MAAQQ,GAG1CJ,EAAa,OAAS,CAACJ,EAAM,OAAOS,EAAA,CAC1C,CAAC,EAED,SAASA,GAAe,CACtBX,EAAK,MAAQ,GACbJ,EAAQ,OAAOW,EAAS,KAAK,CAC/B,cAKaD,EAAA,QAAiBJ,EAAA,OAA5BU,IAAAC,EAEM,MAFNC,EAEM,CAAA,GAAAC,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAA,CADJC,EAAqD,IAAA,CAAlD,MAAM,oBAAA,EAAqB,sBAAmB,EAAA,CAAA,OAGnDJ,IAAAC,EA8BM,MA9BNI,EA8BM,CA7BJD,EA4BM,MA5BNE,EA4BM,aA3BJF,EAMM,MAAA,CAND,MAAM,qDAAmD,CAC5DA,EAAyE,MAAA,CAApE,IAAAG,EAAmC,IAAI,OAAO,MAAM,aAAA,GACzDH,EAGM,MAAA,KAAA,CAFJA,EAAqE,KAAA,CAAjE,MAAM,sCAAA,EAAuC,iBAAe,EAChEA,EAAqE,IAAA,CAAlE,MAAM,2BAAA,EAA4B,8BAA4B,CAAA,SAIrEA,EAYM,MAZNI,EAYM,CAXKlB,EAAA,WAATW,EAEI,IAFJQ,EAEIC,EADCpB,EAAA,KAAK,EAAA,CAAA,YAGVc,EAES,SAAA,CAFD,KAAK,SAAS,MAAM,qBAAsB,SAAUhB,EAAA,MAAO,QAAOW,CAAA,EACrEW,EAAAtB,EAAA,qBAAwBM,EAAA,MAAY,WAAA,SAAA,EAAA,EAAAiB,CAAA,EAGhCpB,EAAA,QAAaG,EAAA,OAAtBM,IAAAC,EAEI,IAFJW,EAEI,eAFuE,yBACpD,EAAA,GAAAR,EAA+C,OAA/CS,EAA+CH,EAAlBnB,EAAA,KAAQ,EAAA,CAAA,gBAAU,gBACtE,EAAA,EAAA,eAGQG,EAAA,oBAAVO,EAII,IAJJa,EAAoE,iLAIpE"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"MediaView-Cqqm7JtP.js","sources":["../../src/views/MediaView.vue"],"sourcesContent":["<script setup lang=\"ts\">\n/**\n * Media library — a view of the files in the content repository.\n *\n * See what is there, and add to it. Two things it deliberately does not offer:\n *\n * - **Alt text.** Not a property of a file: the same photograph means\n * different things in different places, so it belongs to the field that\n * uses the image, next to the content it describes.\n * - **Rename and delete.** A media file is referenced by its path, so moving\n * or removing one is a change to every entry that points at it — a job for\n * a commit and a review, not for a button that quietly leaves gaps on the\n * website.\n *\n * Files are grouped by directory, which is meaningful here: an entry's images\n * sit beside the entry.\n */\n\nimport { computed, onMounted, ref } from \"vue\";\n\nimport { api, ApiError, type MediaItem } from \"@/api\";\nimport PageHeader from \"@/components/PageHeader.vue\";\nimport { formatBytes } from \"@/lib/format\";\nimport { useStaging } from \"@/stores/staging\";\nimport { useToast } from \"@/stores/toast\";\n\nconst toast = useToast();\n\nconst items = ref<MediaItem[]>([]);\nconst loading = ref(true);\nconst uploading = ref(false);\nconst search = ref(\"\");\nconst dragging = ref(false);\nconst selected = ref<MediaItem | null>(null);\nconst fileInput = ref<HTMLInputElement | null>(null);\n\nconst isImage = (item: MediaItem): boolean => item.mimeType.startsWith(\"image/\");\n\n/** The directory a file sits in; `media` is the shared one. */\nconst folderOf = (path: string): string => {\n const parts = path.split(\"/\");\n parts.pop();\n return parts.join(\"/\") || \"/\";\n};\n\nconst matching = computed(() => {\n const term = search.value.trim().toLowerCase();\n return term ? items.value.filter((item) => item.path.toLowerCase().includes(term)) : items.value;\n});\n\n/** Grouped by directory, in path order — the order the repository has them. */\nconst folders = computed(() => {\n const groups = new Map<string, MediaItem[]>();\n for (const item of matching.value) {\n const folder = folderOf(item.path);\n const group = groups.get(folder);\n if (group) group.push(item);\n else groups.set(folder, [item]);\n }\n return [...groups].sort(([a], [b]) => a.localeCompare(b));\n});\n\nconst totalBytes = computed(() => items.value.reduce((sum, item) => sum + item.size, 0));\n\nasync function load(): Promise<void> {\n loading.value = true;\n try {\n items.value = (await api.media.list()).items;\n // The chosen file may have gone from the repository between loads.\n const stillThere = items.value.find((item) => item.path === selected.value?.path);\n selected.value = stillThere ?? null;\n } catch (error) {\n toast.error(error instanceof ApiError ? error.message : \"Could not load the media library.\");\n } finally {\n loading.value = false;\n }\n}\n\nonMounted(load);\n\nasync function upload(files: FileList | File[] | null): Promise<void> {\n const list = Array.from(files ?? []);\n if (list.length === 0) return;\n\n uploading.value = true;\n try {\n const { items: uploaded } = await api.media.upload(list);\n toast.success(`Uploaded ${uploaded.length} file${uploaded.length === 1 ? \"\" : \"s\"}.`);\n void useStaging().refresh();\n await load();\n selected.value = items.value.find((item) => item.path === uploaded[0]?.path) ?? null;\n } catch (error) {\n toast.error(error instanceof ApiError ? error.message : \"The upload failed.\");\n } finally {\n uploading.value = false;\n if (fileInput.value) fileInput.value.value = \"\";\n }\n}\n\nasync function copyPath(path: string): Promise<void> {\n try {\n await navigator.clipboard.writeText(path);\n toast.success(\"Path copied.\");\n } catch {\n // Clipboard access is denied in some browsers unless the page is focused.\n toast.error(\"Could not copy. Select the path and copy it by hand.\");\n }\n}\n</script>\n\n<template>\n <PageHeader\n title=\"Media\"\n :subtitle=\"`${items.length} file${items.length === 1 ? '' : 's'} · ${formatBytes(totalBytes)}`\"\n >\n <label class=\"btn-primary cursor-pointer\">\n <input\n ref=\"fileInput\"\n type=\"file\"\n multiple\n class=\"sr-only\"\n :disabled=\"uploading\"\n @change=\"upload(($event.target as HTMLInputElement).files)\"\n />\n {{ uploading ? \"Uploading…\" : \"Upload files\" }}\n </label>\n </PageHeader>\n\n <div\n class=\"mx-auto max-w-5xl px-4 py-5 sm:px-6\"\n :class=\"dragging && 'rounded-md outline-2 outline-dashed outline-ink'\"\n @dragover.prevent=\"dragging = true\"\n @dragleave.prevent=\"dragging = false\"\n @drop.prevent=\"\n dragging = false;\n upload($event.dataTransfer?.files ?? null);\n \"\n >\n <div class=\"mb-3 flex flex-wrap items-center gap-2\">\n <input\n v-model=\"search\"\n type=\"search\"\n placeholder=\"Search by name or folder…\"\n class=\"input max-w-64\"\n aria-label=\"Search media\"\n />\n </div>\n\n <p v-if=\"loading\" class=\"py-12 text-center text-sm text-muted\">Loading…</p>\n\n <div v-else-if=\"matching.length === 0\" class=\"card px-4 py-12 text-center\">\n <p class=\"text-sm font-medium\">\n {{ search ? `Nothing matches \"${search}\".` : \"No files yet.\" }}\n </p>\n <p class=\"mt-1 text-sm text-muted\">\n Drag files anywhere on this page to upload them.\n </p>\n </div>\n\n <div v-else class=\"grid gap-5 lg:grid-cols-[1fr_20rem]\">\n <div class=\"space-y-6\">\n <section v-for=\"[folder, files] in folders\" :key=\"folder\">\n <h2 class=\"mb-2 font-mono text-xs text-muted\">{{ folder }}</h2>\n\n <ul class=\"grid grid-cols-2 gap-3 sm:grid-cols-3 lg:grid-cols-4\">\n <li v-for=\"item in files\" :key=\"item.path\">\n <button\n type=\"button\"\n :aria-pressed=\"selected?.path === item.path\"\n :class=\"[\n 'block w-full overflow-hidden rounded-lg border text-left transition',\n selected?.path === item.path\n ? 'border-brand ring-2 ring-brand/25'\n : 'border-line hover:border-brand/40',\n ]\"\n @click=\"selected = selected?.path === item.path ? null : item\"\n >\n <span class=\"block aspect-4/3 bg-canvas\">\n <img\n v-if=\"isImage(item)\"\n :src=\"api.media.url(item.path)\"\n alt=\"\"\n loading=\"lazy\"\n class=\"h-full w-full object-cover\"\n />\n <span\n v-else\n class=\"flex h-full w-full items-center justify-center text-xs font-semibold uppercase text-muted\"\n >\n {{ item.mimeType.split(\"/\")[1] }}\n </span>\n </span>\n\n <span class=\"block px-2 py-1.5\">\n <span class=\"block truncate text-xs font-medium\">{{ item.filename }}</span>\n <span class=\"block text-[11px] text-muted\">{{ formatBytes(item.size) }}</span>\n </span>\n </button>\n </li>\n </ul>\n </section>\n </div>\n\n <aside v-if=\"selected\" class=\"card h-fit p-4 lg:sticky lg:top-5\">\n <h2 class=\"text-sm font-semibold\">File details</h2>\n\n <div class=\"mt-3 overflow-hidden rounded-lg border border-line bg-canvas\">\n <img\n v-if=\"isImage(selected)\"\n :src=\"api.media.url(selected.path)\"\n alt=\"\"\n class=\"max-h-48 w-full object-contain\"\n />\n <p v-else class=\"p-6 text-center text-xs text-muted\">\n {{ selected.mimeType }}\n </p>\n </div>\n\n <dl class=\"mt-4 space-y-1 text-xs text-muted\">\n <div class=\"flex justify-between gap-3\">\n <dt>Type</dt>\n <dd>{{ selected.mimeType }}</dd>\n </div>\n <div v-if=\"selected.width\" class=\"flex justify-between gap-3\">\n <dt>Dimensions</dt>\n <dd>{{ selected.width }} × {{ selected.height }}</dd>\n </div>\n <div class=\"flex justify-between gap-3\">\n <dt>Size</dt>\n <dd>{{ formatBytes(selected.size) }}</dd>\n </div>\n </dl>\n\n <!-- The path is the file's identity: it is what a field stores and what\n appears in the diff, so it is worth being able to copy. -->\n <div class=\"mt-3 border-t border-line pt-3\">\n <p class=\"field-label\">Path in the repository</p>\n <p class=\"mt-1 break-all font-mono text-[11px]\">{{ selected.path }}</p>\n </div>\n\n <div class=\"mt-3 flex gap-2\">\n <button type=\"button\" class=\"btn-secondary flex-1\" @click=\"copyPath(selected.path)\">\n Copy path\n </button>\n <a\n :href=\"api.media.url(selected.path)\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n class=\"btn-secondary flex-1\"\n >\n Open\n </a>\n </div>\n </aside>\n </div>\n </div>\n</template>\n"],"names":["toast","useToast","items","ref","loading","uploading","search","dragging","selected","fileInput","isImage","item","folderOf","path","parts","matching","computed","term","folders","groups","folder","group","a","b","totalBytes","sum","load","api","stillThere","_a","error","ApiError","onMounted","upload","files","list","uploaded","useStaging","copyPath","_createVNode","PageHeader","_unref","formatBytes","_createElementVNode","_hoisted_1","$event","_createTextVNode","_normalizeClass","_cache","_withModifiers","_hoisted_3","_createElementBlock","_hoisted_4","_openBlock","_hoisted_5","_hoisted_6","_toDisplayString","_hoisted_7","_hoisted_8","_Fragment","_renderList","_hoisted_9","_hoisted_10","_b","_hoisted_12","_hoisted_14","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19","_hoisted_21","_hoisted_22","_hoisted_23","_hoisted_24","_hoisted_25","_hoisted_26","_hoisted_27","_hoisted_28","_hoisted_29"],"mappings":"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"}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import{D as r,d as l,c as n,a as t,x as d,w as m,b as o,t as a,E as x,p as u,h as s,j as f,l as h,e as k}from"./index-ByBMMOql.js";/**
|
|
2
|
-
* @license @lucide/vue v1.37.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 b=[["path",{d:"m15 18-6-6 6-6",key:"1wnfg3"}]],_=r("chevron-left",b),p={class:"border-b border-line bg-raised"},g={class:"mx-auto flex max-w-5xl flex-wrap items-center gap-4 px-4 py-4 sm:px-6"},v={class:"min-w-0 flex-1"},w={class:"truncate font-display text-2xl font-normal leading-8 tracking-[.02em]"},y={key:1,class:"mt-1 truncate text-xs text-muted"},L={class:"flex shrink-0 items-center gap-2"},N=l({__name:"PageHeader",props:{title:{},subtitle:{},back:{},backLabel:{}},setup(e){return(c,B)=>{const i=u("RouterLink");return s(),n("header",p,[t("div",g,[t("div",v,[e.back?(s(),d(i,{key:0,to:e.back,class:"mb-0.5 inline-flex items-center gap-1 text-xs font-medium text-muted hover:text-ink"},{default:m(()=>[f(h(_),{size:14,"aria-hidden":"true"}),k(" "+a(e.backLabel??"Back"),1)]),_:1},8,["to"])):o("",!0),t("h1",w,a(e.title),1),e.subtitle?(s(),n("p",y,a(e.subtitle),1)):o("",!0)]),t("div",L,[x(c.$slots,"default")])])])}}});export{N as _};
|
|
7
|
-
//# sourceMappingURL=PageHeader.vue_vue_type_script_setup_true_lang-B10dWbKQ.js.map
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{d as D,o as U,q as $,c as a,j as N,w as z,a as t,F as _,t as l,b as w,k as A,z as E,g as F,r as i,i as T,A as p,n as L,h as n,e as M,l as h,C as j,m as q,y as G}from"./index-ByBMMOql.js";import{u as H,_ as I,w as J}from"./useUnsavedChanges-5Jic8gaT.js";import{_ as K}from"./PageHeader.vue_vue_type_script_setup_true_lang-B10dWbKQ.js";import"./useField-Dc-2hvX0.js";import"./arrow-right-CRc1EdYX.js";import"./plus-BqgcP5r8.js";const O=["disabled"],P={class:"mx-auto max-w-3xl px-4 py-6 sm:px-6"},Q={key:0,class:"text-sm text-muted"},R={key:0,class:"mb-5 text-sm text-muted"},W={key:1,role:"alert",class:"mb-5 rounded-md border border-warning/15 bg-warning-soft p-4"},X={key:2,role:"alert",class:"mb-5 rounded-md border border-danger/15 bg-danger-soft p-4"},Y={class:"text-sm font-medium text-danger"},Z={class:"mt-1.5 space-y-0.5 text-xs text-danger"},ee={key:1,class:"p-8 text-center text-sm text-muted"},ie=D({__name:"SingletonView",props:{name:{}},setup(k){const m=k,B=G(),d=L(),r=F(()=>B.singleton(m.name)),u=i({}),o=i([]),b=i(null),y=i(!0),c=i(!1),v=i(!1),C=i(""),{dirty:g,markClean:S}=H(u);async function x(){var s;y.value=!0;try{const e=await T.singletons.get(m.name);u.value=structuredClone(J(((s=r.value)==null?void 0:s.fields)??{},e.data)),b.value=e.revision,C.value=e.path,o.value=[],v.value=!1,S()}catch(e){d.error(e instanceof p?e.message:"Could not load these settings.")}finally{y.value=!1}}U(x),$(()=>m.name,x);async function V(){c.value=!0,o.value=[];try{const s=await T.singletons.save(m.name,u.value,b.value);b.value=s.revision,v.value=!1,S(),d.success("Settings saved."),q().refresh()}catch(s){s instanceof p&&s.status===409?(v.value=!0,d.error("Someone else saved these settings while you were editing them.")):s instanceof p&&s.issues.length>0?(o.value=s.issues,d.error(s.message,`${s.issues.length} field(s) need attention.`)):d.error(s instanceof p?s.message:"Could not save these settings.")}finally{c.value=!1}}return(s,e)=>r.value?(n(),a(_,{key:0},[N(K,{title:r.value.label,subtitle:C.value},{default:z(()=>[t("span",{class:j(["badge",h(g)?"border-brand bg-brand-soft text-brand":"text-success"])},[e[1]||(e[1]=t("span",{class:"h-1.5 w-1.5 rounded-full bg-current","aria-hidden":"true"},null,-1)),M(" "+l(h(g)?"Unsaved":"Saved"),1)],2),t("button",{type:"button",class:"btn-primary",disabled:c.value||!h(g),onClick:V},l(c.value?"Saving…":h(g)?"Save changes":"Saved"),9,O)]),_:1},8,["title","subtitle"]),t("div",P,[y.value?(n(),a("p",Q,"Loading…")):(n(),a(_,{key:1},[r.value.description?(n(),a("p",R,l(r.value.description),1)):w("",!0),v.value?(n(),a("div",W,[e[2]||(e[2]=t("p",{class:"text-sm font-medium text-warning"},"These settings changed while you were editing",-1)),e[3]||(e[3]=t("p",{class:"mt-1 text-xs text-muted"}," Nothing has been saved. Copy anything you need, then load the current version. ",-1)),t("button",{type:"button",class:"btn-secondary mt-2.5",onClick:x}," Discard mine and reload ")])):w("",!0),o.value.length?(n(),a("div",X,[t("p",Y,l(o.value.length)+" field"+l(o.value.length===1?"":"s")+" need attention ",1),t("ul",Z,[(n(!0),a(_,null,A(o.value,f=>(n(),a("li",{key:f.path},l(f.message),1))),128))])])):w("",!0),t("form",{novalidate:"",onSubmit:E(V,["prevent"])},[N(I,{modelValue:u.value,"onUpdate:modelValue":e[0]||(e[0]=f=>u.value=f),fields:r.value.fields,issues:o.value,disabled:c.value},null,8,["modelValue","fields","issues","disabled"]),e[4]||(e[4]=t("button",{type:"submit",class:"sr-only"},"Save",-1))],32)],64))])],64)):(n(),a("div",ee,' There are no settings called "'+l(k.name)+'". ',1))}});export{ie as default};
|
|
2
|
-
//# sourceMappingURL=SingletonView-BQnE2LGb.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SingletonView-BQnE2LGb.js","sources":["../../src/views/SingletonView.vue"],"sourcesContent":["<script setup lang=\"ts\">\n/**\n * Singleton editor — site configuration, navigation, theme.\n *\n * A singleton is one file in the repository, so this view is the entry editor\n * without the parts that need a slug: no rename, no delete, no list to go back\n * to. What it shares is `revision` — the version the form was opened against,\n * sent back with the save so a second editor cannot be overwritten in silence.\n */\n\nimport { computed, onMounted, ref, watch } from \"vue\";\n\nimport { withDefaults as fillDefaults, type FieldIssue } from \"@micacms/core\";\n\nimport { api, ApiError } from \"@/api\";\nimport FieldList from \"@/components/fields/FieldList.vue\";\nimport PageHeader from \"@/components/PageHeader.vue\";\nimport { useUnsavedChanges } from \"@/composables/useUnsavedChanges\";\nimport { useSchema } from \"@/stores/schema\";\nimport { useStaging } from \"@/stores/staging\";\nimport { useToast } from \"@/stores/toast\";\n\nconst props = defineProps<{ name: string }>();\n\nconst schema = useSchema();\nconst toast = useToast();\n\nconst definition = computed(() => schema.singleton(props.name));\n\nconst values = ref<Record<string, unknown>>({});\nconst issues = ref<FieldIssue[]>([]);\nconst revision = ref<string | null>(null);\nconst loading = ref(true);\nconst saving = ref(false);\nconst conflict = ref(false);\n\n/** Where these settings live, as the server reports it. */\nconst location = ref(\"\");\n\nconst { dirty, markClean } = useUnsavedChanges(values);\n\nasync function load(): Promise<void> {\n loading.value = true;\n try {\n const detail = await api.singletons.get(props.name);\n // Defaults fill in fields added to the model since the file was written.\n values.value = structuredClone(fillDefaults(definition.value?.fields ?? {}, detail.data));\n revision.value = detail.revision;\n location.value = detail.path;\n issues.value = [];\n conflict.value = false;\n markClean();\n } catch (error) {\n toast.error(error instanceof ApiError ? error.message : \"Could not load these settings.\");\n } finally {\n loading.value = false;\n }\n}\n\nonMounted(load);\nwatch(() => props.name, load);\n\nasync function save(): Promise<void> {\n saving.value = true;\n issues.value = [];\n\n try {\n const saved = await api.singletons.save(props.name, values.value, revision.value);\n revision.value = saved.revision;\n conflict.value = false;\n markClean();\n toast.success(\"Settings saved.\");\n void useStaging().refresh();\n } catch (error) {\n if (error instanceof ApiError && error.status === 409) {\n conflict.value = true;\n toast.error(\"Someone else saved these settings while you were editing them.\");\n } else if (error instanceof ApiError && error.issues.length > 0) {\n issues.value = error.issues;\n toast.error(error.message, `${error.issues.length} field(s) need attention.`);\n } else {\n toast.error(error instanceof ApiError ? error.message : \"Could not save these settings.\");\n }\n } finally {\n saving.value = false;\n }\n}\n</script>\n\n<template>\n <template v-if=\"definition\">\n <PageHeader :title=\"definition.label\" :subtitle=\"location\">\n <span :class=\"['badge', dirty ? 'border-brand bg-brand-soft text-brand' : 'text-success']\">\n <span class=\"h-1.5 w-1.5 rounded-full bg-current\" aria-hidden=\"true\" />\n {{ dirty ? \"Unsaved\" : \"Saved\" }}\n </span>\n <button type=\"button\" class=\"btn-primary\" :disabled=\"saving || !dirty\" @click=\"save\">\n {{ saving ? \"Saving…\" : dirty ? \"Save changes\" : \"Saved\" }}\n </button>\n </PageHeader>\n\n <div class=\"mx-auto max-w-3xl px-4 py-6 sm:px-6\">\n <p v-if=\"loading\" class=\"text-sm text-muted\">Loading…</p>\n\n <template v-else>\n <p v-if=\"definition.description\" class=\"mb-5 text-sm text-muted\">\n {{ definition.description }}\n </p>\n\n <div\n v-if=\"conflict\"\n role=\"alert\"\n class=\"mb-5 rounded-md border border-warning/15 bg-warning-soft p-4\"\n >\n <p class=\"text-sm font-medium text-warning\">These settings changed while you were editing</p>\n <p class=\"mt-1 text-xs text-muted\">\n Nothing has been saved. Copy anything you need, then load the current version.\n </p>\n <button type=\"button\" class=\"btn-secondary mt-2.5\" @click=\"load\">\n Discard mine and reload\n </button>\n </div>\n\n <div\n v-if=\"issues.length\"\n role=\"alert\"\n class=\"mb-5 rounded-md border border-danger/15 bg-danger-soft p-4\"\n >\n <p class=\"text-sm font-medium text-danger\">\n {{ issues.length }} field{{ issues.length === 1 ? \"\" : \"s\" }} need attention\n </p>\n <ul class=\"mt-1.5 space-y-0.5 text-xs text-danger\">\n <li v-for=\"issue in issues\" :key=\"issue.path\">{{ issue.message }}</li>\n </ul>\n </div>\n\n <form novalidate @submit.prevent=\"save\">\n <FieldList\n v-model=\"values\"\n :fields=\"definition.fields\"\n :issues=\"issues\"\n :disabled=\"saving\"\n />\n <button type=\"submit\" class=\"sr-only\">Save</button>\n </form>\n </template>\n </div>\n </template>\n\n <div v-else class=\"p-8 text-center text-sm text-muted\">\n There are no settings called \"{{ name }}\".\n </div>\n</template>\n"],"names":["props","__props","schema","useSchema","toast","useToast","definition","computed","values","ref","issues","revision","loading","saving","conflict","location","dirty","markClean","useUnsavedChanges","load","detail","api","fillDefaults","_a","error","ApiError","onMounted","watch","save","saved","useStaging","_createElementBlock","_Fragment","_createVNode","PageHeader","_createElementVNode","_unref","_createTextVNode","_toDisplayString","_hoisted_1","_hoisted_2","_hoisted_3","_openBlock","_hoisted_4","_hoisted_5","_cache","_hoisted_6","_hoisted_7","_hoisted_8","_renderList","issue","FieldList","$event","_hoisted_9"],"mappings":"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"}
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import{d as L,o as M,c as a,j as p,w as h,a as t,F as r,t as o,l as m,k as b,b as i,r as w,i as U,A as B,n as E,h as d,G as I,e as v,g as k,p as N,Y as O}from"./index-ByBMMOql.js";import{_ as V}from"./PageHeader.vue_vue_type_script_setup_true_lang-B10dWbKQ.js";import{a as $,b as D,f as x}from"./format-Cpnr2As6.js";import{A as F}from"./arrow-right-CRc1EdYX.js";const j=["disabled"],z=["disabled"],H={class:"mx-auto max-w-5xl space-y-6 px-4 py-5 pb-12 sm:px-6"},q={key:0,class:"text-sm text-muted"},P={"aria-labelledby":"glance-heading"},Y={class:"grid grid-cols-2 gap-3 lg:grid-cols-4"},G={class:"card p-4"},K={class:"mt-1 text-2xl font-semibold tabular-nums"},W={class:"mt-1 text-xs text-muted"},Z={class:"card p-4"},J={class:"mt-1 text-2xl font-semibold tabular-nums"},Q={class:"mt-1 text-xs text-muted"},X=["datetime"],tt={class:"card p-4"},et={class:"mt-1 text-2xl font-semibold tabular-nums"},st={class:"mt-1 text-xs text-muted"},ot={class:"card p-4"},lt={class:"mt-1 text-2xl font-semibold tabular-nums"},nt={class:"mt-1 text-xs text-muted"},at={class:"card p-4","aria-labelledby":"model-heading"},dt={class:"spec mt-3"},it={class:"tabular-nums"},rt={class:"mt-2 space-y-1.5"},ut={class:"w-28 shrink-0 truncate"},mt={class:"h-1.5 min-w-0 flex-1 rounded-full bg-canvas","aria-hidden":"true"},ct={class:"w-8 shrink-0 text-right text-xs tabular-nums text-muted"},pt={class:"card overflow-hidden","aria-labelledby":"collections-heading"},bt={class:"overflow-x-auto"},yt={class:"w-full text-sm"},ht={class:"divide-y divide-line"},vt={class:"px-4 py-2.5"},xt={class:"mono block text-muted"},ft={class:"px-4 py-2.5 text-right tabular-nums"},gt={class:"px-4 py-2.5 text-right tabular-nums"},_t={key:0,class:"block text-xs text-muted"},wt={class:"mono hidden px-4 py-2.5 text-muted sm:table-cell"},kt={class:"hidden px-4 py-2.5 text-xs text-muted sm:table-cell"},$t={key:0,class:"card p-4","aria-labelledby":"singletons-heading"},Ct={class:"spec mt-3"},St={class:"tabular-nums"},Rt={key:1,class:"card p-4","aria-labelledby":"relations-heading"},At={class:"mt-3 space-y-1.5 text-sm"},Tt={class:"font-medium"},Lt={class:"mono text-muted"},Mt={key:0,class:"badge bg-brand-soft text-brand"},Ut={class:"card p-4","aria-labelledby":"repository-heading"},Bt={class:"spec mt-3"},Et={class:"mono"},It={class:"tabular-nums"},Nt={class:"tabular-nums"},Ot={key:2,class:"card p-4","aria-labelledby":"database-heading"},Vt={class:"spec mt-3"},Dt={class:"tabular-nums"},Ft={class:"mono"},jt={class:"tabular-nums"},zt={class:"card p-4","aria-labelledby":"deployment-heading"},Ht={key:0,class:"mt-3 rounded-md border border-warning/15 bg-warning-soft px-4 py-3 text-xs text-warning"},qt={class:"spec mt-3"},Pt={class:"mono"},Yt={class:"mono"},Gt={class:"mono"},Kt={key:0},Wt={class:"mono"},Zt={class:"tabular-nums"},Jt={class:"tabular-nums"},Qt={class:"mono"},Xt={key:1},te={class:"mono"},ee={key:2},se={class:"tabular-nums"},oe={key:3},le={class:"mono"},ne=L({__name:"SystemView",setup(ae){const y=E(),s=w(null),c=w(!0);async function f(){c.value=!0;try{s.value=await U.system()}catch(l){y.error(l instanceof B?l.message:"Could not load the system information.")}finally{c.value=!1}}M(f);const g={url:"URL"};function C(l){if(g[l])return g[l];const e=l.replace(/([A-Z])/g," $1").toLowerCase();return e.charAt(0).toUpperCase()+e.slice(1)}const S=k(()=>{var l;return Math.max(1,...(((l=s.value)==null?void 0:l.schema.kinds)??[]).map(e=>e.count))}),_=k(()=>{var e,u;const l=new Map;for(const n of((e=s.value)==null?void 0:e.schema.collections)??[])l.set(`collection:${n.name}`,n.label);for(const n of((u=s.value)==null?void 0:u.schema.singletons)??[])l.set(`singleton:${n.name}`,n.label);return l});function R(l){return _.value.get(`collection:${l}`)??l}function A(){const l=s.value;return l?[`Mica ${l.cms.version} (${l.cms.environment})`,`Node ${l.cms.node} on ${l.cms.platform}, up ${$(l.cms.uptimeSeconds)}`,`Schema — ${l.schema.totals.collections} collections, ${l.schema.totals.singletons} singletons, ${l.schema.totals.total} fields`,`Repository ${l.repository.origin}`,`Repository holds ${l.repository.entries} entries and ${l.repository.media.files} media files (${l.repository.media.readable})`,l.database?`Database: ${l.database.sessions} sessions, migration ${l.database.version}, ${l.database.bytes===null?"size unknown":x(l.database.bytes)}`:"Database: none — the local editor keeps no state",`Site ${l.deployment.site}`,`Base URL ${l.deployment.baseUrl}`,`Content model ${l.deployment.schemaOrigin}`,`Content root ${l.deployment.contentRoot}`,`Authentication ${l.deployment.auth}`,`Admission ${l.deployment.admission??"none"}`].join(`
|
|
2
|
-
`):""}async function T(){try{await navigator.clipboard.writeText(A()),y.success("Report copied to the clipboard.")}catch{y.error("Could not copy. Select the values you need instead.")}}return(l,e)=>{const u=N("RouterLink");return d(),a(r,null,[p(V,{title:"System",subtitle:s.value?`Mica ${s.value.cms.version} · ${s.value.cms.environment}`:null},{default:h(()=>[t("button",{type:"button",class:"btn-ghost",disabled:c.value,onClick:f},"Refresh",8,j),t("button",{type:"button",class:"btn-secondary",disabled:!s.value,onClick:T}," Copy report ",8,z)]),_:1},8,["subtitle"]),t("div",H,[c.value?(d(),a("p",q,"Loading…")):s.value?(d(),a(r,{key:1},[t("section",P,[e[4]||(e[4]=t("h2",{id:"glance-heading",class:"sr-only"},"At a glance",-1)),t("dl",Y,[t("div",G,[e[0]||(e[0]=t("dt",{class:"text-sm text-muted"},"Version",-1)),t("dd",K,o(s.value.cms.version),1),t("dd",W,o(s.value.cms.environment),1)]),t("div",Z,[e[1]||(e[1]=t("dt",{class:"text-sm text-muted"},"Uptime",-1)),t("dd",J,o(m($)(s.value.cms.uptimeSeconds)),1),t("dd",Q,[t("time",{datetime:s.value.cms.startedAt},o(m(D)(s.value.cms.startedAt)),9,X)])]),t("div",tt,[e[2]||(e[2]=t("dt",{class:"text-sm text-muted"},"Content model",-1)),t("dd",et,o(s.value.schema.totals.total),1),t("dd",st," fields in "+o(s.value.schema.totals.collections)+" collections, "+o(s.value.schema.totals.singletons)+" singletons ",1)]),t("div",ot,[e[3]||(e[3]=t("dt",{class:"text-sm text-muted"},"In the repository",-1)),t("dd",lt,o(s.value.repository.entries),1),t("dd",nt," entries · "+o(s.value.repository.media.files)+" media files ",1)])])]),t("section",at,[e[6]||(e[6]=t("h2",{id:"model-heading",class:"text-sm font-semibold"},"Content model",-1)),e[7]||(e[7]=t("p",{class:"mt-1 text-xs text-muted"}," The schema this server was handed at startup. The same file describes the model to the Astro build, so the editor and the website cannot disagree about it. ",-1)),t("dl",dt,[t("div",null,[e[5]||(e[5]=t("dt",null,"Required fields",-1)),t("dd",it,o(s.value.schema.totals.required)+" of "+o(s.value.schema.totals.total),1)])]),e[8]||(e[8]=t("h3",{class:"mt-5 text-xs font-semibold uppercase tracking-wider text-muted"},"Field types",-1)),t("ul",rt,[(d(!0),a(r,null,b(s.value.schema.kinds,n=>(d(),a("li",{key:n.kind,class:"flex items-center gap-3 text-sm"},[t("span",ut,o(C(n.kind)),1),t("span",mt,[t("span",{class:"block h-full rounded-full bg-brand/60",style:I({width:`${n.count/S.value*100}%`})},null,4)]),t("span",ct,o(n.count),1)]))),128))])]),t("section",pt,[e[11]||(e[11]=t("h2",{id:"collections-heading",class:"border-b border-line px-4 py-3 text-sm font-semibold"}," Collections ",-1)),t("div",bt,[t("table",yt,[e[9]||(e[9]=t("caption",{class:"sr-only"},"Collections in the content model, with their entry counts",-1)),e[10]||(e[10]=t("thead",null,[t("tr",{class:"border-b border-line text-left text-xs text-muted"},[t("th",{scope:"col",class:"px-4 py-2 font-medium"},"Collection"),t("th",{scope:"col",class:"px-4 py-2 text-right font-medium"},"Entries"),t("th",{scope:"col",class:"px-4 py-2 text-right font-medium"},"Fields"),t("th",{scope:"col",class:"hidden px-4 py-2 font-medium sm:table-cell"},"Title / slug"),t("th",{scope:"col",class:"hidden px-4 py-2 font-medium sm:table-cell"},"Ordering")])],-1)),t("tbody",ht,[(d(!0),a(r,null,b(s.value.schema.collections,n=>(d(),a("tr",{key:n.name},[t("td",vt,[p(u,{to:{name:"collection",params:{collection:n.name}},class:"font-medium hover:text-brand"},{default:h(()=>[v(o(n.label),1)]),_:2},1032,["to"]),t("span",xt,o(n.name),1)]),t("td",ft,o(n.entries),1),t("td",gt,[v(o(n.fields.top)+" ",1),n.fields.total>n.fields.top?(d(),a("span",_t,o(n.fields.total)+" with nested ",1)):i("",!0)]),t("td",wt,o(n.titleField??"—")+" / "+o(n.slugField??"—"),1),t("td",kt,o(n.sortable?"Manual":"Automatic"),1)]))),128))])])])]),s.value.schema.singletons.length?(d(),a("section",$t,[e[12]||(e[12]=t("h2",{id:"singletons-heading",class:"text-sm font-semibold"},"Singletons",-1)),t("dl",Ct,[(d(!0),a(r,null,b(s.value.schema.singletons,n=>(d(),a("div",{key:n.name},[t("dt",null,[p(u,{to:{name:"singleton",params:{name:n.name}},class:"hover:text-brand"},{default:h(()=>[v(o(n.label),1)]),_:2},1032,["to"])]),t("dd",St,o(n.fields.top)+" field"+o(n.fields.top===1?"":"s"),1)]))),128))])])):i("",!0),s.value.schema.relations.length?(d(),a("section",Rt,[e[13]||(e[13]=t("h2",{id:"relations-heading",class:"text-sm font-semibold"},"Relations",-1)),e[14]||(e[14]=t("p",{class:"mt-1 text-xs text-muted"}," Deleting an entry that is referenced here is warned about before it happens. ",-1)),t("ul",At,[(d(!0),a(r,null,b(s.value.schema.relations,n=>(d(),a("li",{key:`${n.fromType}:${n.from}.${n.path}`,class:"flex flex-wrap items-baseline gap-x-2"},[t("span",Tt,o(_.value.get(`${n.fromType}:${n.from}`)??n.from),1),t("span",Lt,o(n.path),1),p(m(F),{size:14,class:"text-muted","aria-hidden":"true"}),t("span",null,o(R(n.to)),1),n.multiple?(d(),a("span",Mt,"many")):i("",!0)]))),128))])])):i("",!0),t("section",Ut,[e[18]||(e[18]=t("h2",{id:"repository-heading",class:"text-sm font-semibold"},"Content repository",-1)),e[19]||(e[19]=t("p",{class:"mt-1 text-xs text-muted"}," The source of truth for the website. Everything here is a file under version control, so the site can be rebuilt from it without this server. ",-1)),t("dl",Bt,[t("div",null,[e[15]||(e[15]=t("dt",null,"Origin",-1)),t("dd",Et,o(s.value.repository.origin),1)]),t("div",null,[e[16]||(e[16]=t("dt",null,"Entries",-1)),t("dd",It,o(s.value.repository.entries),1)]),t("div",null,[e[17]||(e[17]=t("dt",null,"Media",-1)),t("dd",Nt,o(s.value.repository.media.files)+" files · "+o(s.value.repository.media.readable),1)])])]),s.value.database?(d(),a("section",Ot,[e[23]||(e[23]=t("h2",{id:"database-heading",class:"text-sm font-semibold"},"Operational database",-1)),e[24]||(e[24]=t("p",{class:"mt-1 text-xs text-muted"}," Sessions, and the pending draft where saves are staged — there are no accounts, and nothing published is only in here. ",-1)),t("dl",Vt,[t("div",null,[e[20]||(e[20]=t("dt",null,"Sessions",-1)),t("dd",Dt,o(s.value.database.sessions),1)]),t("div",null,[e[21]||(e[21]=t("dt",null,"Path",-1)),t("dd",Ft,o(s.value.database.path),1)]),t("div",null,[e[22]||(e[22]=t("dt",null,"Size",-1)),t("dd",jt,o(s.value.database.bytes===null?"in memory":m(x)(s.value.database.bytes))+" · migration "+o(s.value.database.version),1)])])])):i("",!0),t("section",zt,[e[39]||(e[39]=t("h2",{id:"deployment-heading",class:"text-sm font-semibold"},"Deployment",-1)),e[40]||(e[40]=t("p",{class:"mt-1 text-xs text-muted"}," How this Mica is configured. Secrets are never shown — only whether they are set. ",-1)),s.value.deployment.generatedSecrets.length?(d(),a("p",Ht," Running with generated development secrets ("+o(s.value.deployment.generatedSecrets.join(", "))+"). Everyone is signed out on restart — set these before this deployment is used for real. ",1)):i("",!0),t("dl",qt,[t("div",null,[e[25]||(e[25]=t("dt",null,"Site",-1)),t("dd",Pt,o(s.value.deployment.site),1)]),t("div",null,[e[26]||(e[26]=t("dt",null,"Base URL",-1)),t("dd",Yt,o(s.value.deployment.baseUrl),1)]),t("div",null,[e[27]||(e[27]=t("dt",null,"Content model",-1)),t("dd",Gt,o(s.value.deployment.schemaOrigin),1)]),t("div",null,[e[28]||(e[28]=t("dt",null,"Repository access",-1)),t("dd",null,o(s.value.deployment.repositoryMode),1)]),s.value.deployment.contentRoot?(d(),a("div",Kt,[e[29]||(e[29]=t("dt",null,"Content root",-1)),t("dd",Wt,o(s.value.deployment.contentRoot),1)])):i("",!0),t("div",null,[e[30]||(e[30]=t("dt",null,"Runtime",-1)),t("dd",null,o(s.value.cms.node)+" on "+o(s.value.cms.platform),1)]),t("div",null,[e[31]||(e[31]=t("dt",null,"Memory in use",-1)),t("dd",Zt,o(m(x)(s.value.deployment.memoryBytes)),1)]),t("div",null,[e[32]||(e[32]=t("dt",null,"Upload limit",-1)),t("dd",Jt,o(s.value.deployment.maxUploadReadable),1)]),t("div",null,[e[33]||(e[33]=t("dt",null,"Authentication",-1)),t("dd",Qt,o(s.value.deployment.auth),1)]),s.value.deployment.admission?(d(),a("div",Xt,[e[34]||(e[34]=t("dt",null,"Who may edit",-1)),t("dd",te,o(s.value.deployment.admission),1)])):i("",!0),s.value.deployment.sessionTtlHours!==null?(d(),a("div",ee,[e[35]||(e[35]=t("dt",null,"Session lifetime",-1)),t("dd",se,o(s.value.deployment.sessionTtlHours)+" h, idle out after "+o(s.value.deployment.sessionIdleHours)+" h ",1)])):i("",!0),t("div",null,[e[36]||(e[36]=t("dt",null,"Trust proxy headers",-1)),t("dd",null,o(s.value.deployment.trustProxy?"Yes":"No"),1)]),s.value.deployment.adminOrigins.length?(d(),a("div",oe,[e[37]||(e[37]=t("dt",null,"Extra admin origins",-1)),t("dd",le,o(s.value.deployment.adminOrigins.join(", ")),1)])):i("",!0),t("div",null,[e[38]||(e[38]=t("dt",null,"Log level",-1)),t("dd",null,o(s.value.deployment.logLevel),1)])])])],64)):i("",!0)])],64)}}}),me=O(ne,[["__scopeId","data-v-a191e72d"]]);export{me as default};
|
|
3
|
-
//# sourceMappingURL=SystemView-Ca_luUZE.js.map
|