@micacms/editor-ui 0.2.2 → 0.4.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.
Files changed (71) hide show
  1. package/dist/assets/ChangesView-DoLhwPxu.js +7 -0
  2. package/dist/assets/ChangesView-DoLhwPxu.js.map +1 -0
  3. package/dist/assets/{CollectionView-BL9-uTTb.js → CollectionView-D3W4tRXa.js} +2 -2
  4. package/dist/assets/{CollectionView-BL9-uTTb.js.map → CollectionView-D3W4tRXa.js.map} +1 -1
  5. package/dist/assets/ConfirmDialog.vue_vue_type_script_setup_true_lang-BhOQwoeA.js +2 -0
  6. package/dist/assets/ConfirmDialog.vue_vue_type_script_setup_true_lang-BhOQwoeA.js.map +1 -0
  7. package/dist/assets/{DashboardView-Dn6J5mjy.js → DashboardView-JZ2Eaw1_.js} +2 -2
  8. package/dist/assets/{DashboardView-Dn6J5mjy.js.map → DashboardView-JZ2Eaw1_.js.map} +1 -1
  9. package/dist/assets/{EntryView-EdKf-RGT.js → EntryView-BwERaZkJ.js} +2 -2
  10. package/dist/assets/EntryView-BwERaZkJ.js.map +1 -0
  11. package/dist/assets/InterVariable-DiVDrmQJ.woff2 +0 -0
  12. package/dist/assets/LoginView-BCrrdqnf.js +2 -0
  13. package/dist/assets/LoginView-BCrrdqnf.js.map +1 -0
  14. package/dist/assets/{MediaView-DZ8c7Ftz.js → MediaView-KlQHfWAi.js} +2 -2
  15. package/dist/assets/MediaView-KlQHfWAi.js.map +1 -0
  16. package/dist/assets/{NotFoundView-DAJd7RdP.js → NotFoundView-C9bEHUGC.js} +2 -2
  17. package/dist/assets/{NotFoundView-DAJd7RdP.js.map → NotFoundView-C9bEHUGC.js.map} +1 -1
  18. package/dist/assets/{ObjectField-BWAzmqNb.js → ObjectField-gxr2a2pp.js} +2 -2
  19. package/dist/assets/{ObjectField-BWAzmqNb.js.map → ObjectField-gxr2a2pp.js.map} +1 -1
  20. package/dist/assets/PageHeader.vue_vue_type_script_setup_true_lang-B-fBJAjn.js +7 -0
  21. package/dist/assets/{PageHeader.vue_vue_type_script_setup_true_lang-BHQH-Q7U.js.map → PageHeader.vue_vue_type_script_setup_true_lang-B-fBJAjn.js.map} +1 -1
  22. package/dist/assets/{RepeaterField-Dk1Wne4m.js → RepeaterField-obOWml_P.js} +2 -2
  23. package/dist/assets/{RepeaterField-Dk1Wne4m.js.map → RepeaterField-obOWml_P.js.map} +1 -1
  24. package/dist/assets/SingletonView-BNJCcl7V.js +2 -0
  25. package/dist/assets/SingletonView-BNJCcl7V.js.map +1 -0
  26. package/dist/assets/SystemView-CB8CT0Pa.js +3 -0
  27. package/dist/assets/SystemView-CB8CT0Pa.js.map +1 -0
  28. package/dist/assets/{SystemView-BQLC-ZJl.css → SystemView-CBvzzAoO.css} +1 -1
  29. package/dist/assets/{arrow-right-DY4A7pBS.js → arrow-right-DJTAYrz5.js} +2 -2
  30. package/dist/assets/{arrow-right-DY4A7pBS.js.map → arrow-right-DJTAYrz5.js.map} +1 -1
  31. package/dist/assets/{arrow-up-jX6XH6AV.js → arrow-up-CibOjHj-.js} +2 -2
  32. package/dist/assets/{arrow-up-jX6XH6AV.js.map → arrow-up-CibOjHj-.js.map} +1 -1
  33. package/dist/assets/{chevron-down-DOqSqKRs.js → chevron-down-Bmt8sf-v.js} +2 -2
  34. package/dist/assets/{chevron-down-DOqSqKRs.js.map → chevron-down-Bmt8sf-v.js.map} +1 -1
  35. package/dist/assets/{index-BsCcwhm6.js → index-Colfqb-9.js} +26 -26
  36. package/dist/assets/index-Colfqb-9.js.map +1 -0
  37. package/dist/assets/index-bRiiEobC.css +1 -0
  38. package/dist/assets/{plus-CFEffUqP.js → plus-D_aoCFbi.js} +2 -2
  39. package/dist/assets/{plus-CFEffUqP.js.map → plus-D_aoCFbi.js.map} +1 -1
  40. package/dist/assets/{useField-Czeyhihg.js → useField-BDSV5ZPo.js} +2 -2
  41. package/dist/assets/{useField-Czeyhihg.js.map → useField-BDSV5ZPo.js.map} +1 -1
  42. package/dist/assets/{useUnsavedChanges-CCE0XMQT.js → useUnsavedChanges-B0WVqgI4.js} +5 -5
  43. package/dist/assets/useUnsavedChanges-B0WVqgI4.js.map +1 -0
  44. package/dist/brand/apple-touch-icon.png +0 -0
  45. package/dist/brand/favicon.ico +0 -0
  46. package/dist/brand/micacms-favicon.svg +1 -0
  47. package/dist/brand/micacms-wordmark-light.svg +1 -0
  48. package/dist/brand/micacms-wordmark.svg +1 -0
  49. package/dist/fonts/InterVariable-LICENSE.txt +92 -0
  50. package/dist/index.html +6 -4
  51. package/package.json +2 -2
  52. package/dist/assets/ChangesView-aU_TiQsk.js +0 -7
  53. package/dist/assets/ChangesView-aU_TiQsk.js.map +0 -1
  54. package/dist/assets/ConfirmDialog.vue_vue_type_script_setup_true_lang-A3xi1Pww.js +0 -2
  55. package/dist/assets/ConfirmDialog.vue_vue_type_script_setup_true_lang-A3xi1Pww.js.map +0 -1
  56. package/dist/assets/EntryView-EdKf-RGT.js.map +0 -1
  57. package/dist/assets/LoginView-CNEoMKDH.js +0 -2
  58. package/dist/assets/LoginView-CNEoMKDH.js.map +0 -1
  59. package/dist/assets/MediaView-DZ8c7Ftz.js.map +0 -1
  60. package/dist/assets/PageHeader.vue_vue_type_script_setup_true_lang-BHQH-Q7U.js +0 -7
  61. package/dist/assets/SingletonView-Cq9s9GNX.js +0 -2
  62. package/dist/assets/SingletonView-Cq9s9GNX.js.map +0 -1
  63. package/dist/assets/SystemView-D6jgVaUD.js +0 -3
  64. package/dist/assets/SystemView-D6jgVaUD.js.map +0 -1
  65. package/dist/assets/index-BsCcwhm6.js.map +0 -1
  66. package/dist/assets/index-D9ZqpwC5.css +0 -1
  67. package/dist/assets/useUnsavedChanges-CCE0XMQT.js.map +0 -1
  68. package/dist/brand/mica-favicon.svg +0 -14
  69. package/dist/brand/mica-logo-glimmer-light.svg +0 -15
  70. package/dist/brand/mica-logo-glimmer.svg +0 -15
  71. 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>
@@ -0,0 +1,92 @@
1
+ Copyright (c) 2016 The Inter Project Authors (https://github.com/rsms/inter)
2
+
3
+ This Font Software is licensed under the SIL Open Font License, Version 1.1.
4
+ This license is copied below, and is also available with a FAQ at:
5
+ http://scripts.sil.org/OFL
6
+
7
+ -----------------------------------------------------------
8
+ SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
9
+ -----------------------------------------------------------
10
+
11
+ PREAMBLE
12
+ The goals of the Open Font License (OFL) are to stimulate worldwide
13
+ development of collaborative font projects, to support the font creation
14
+ efforts of academic and linguistic communities, and to provide a free and
15
+ open framework in which fonts may be shared and improved in partnership
16
+ with others.
17
+
18
+ The OFL allows the licensed fonts to be used, studied, modified and
19
+ redistributed freely as long as they are not sold by themselves. The
20
+ fonts, including any derivative works, can be bundled, embedded,
21
+ redistributed and/or sold with any software provided that any reserved
22
+ names are not used by derivative works. The fonts and derivatives,
23
+ however, cannot be released under any other type of license. The
24
+ requirement for fonts to remain under this license does not apply
25
+ to any document created using the fonts or their derivatives.
26
+
27
+ DEFINITIONS
28
+ "Font Software" refers to the set of files released by the Copyright
29
+ Holder(s) under this license and clearly marked as such. This may
30
+ include source files, build scripts and documentation.
31
+
32
+ "Reserved Font Name" refers to any names specified as such after the
33
+ copyright statement(s).
34
+
35
+ "Original Version" refers to the collection of Font Software components as
36
+ distributed by the Copyright Holder(s).
37
+
38
+ "Modified Version" refers to any derivative made by adding to, deleting,
39
+ or substituting -- in part or in whole -- any of the components of the
40
+ Original Version, by changing formats or by porting the Font Software to a
41
+ new environment.
42
+
43
+ "Author" refers to any designer, engineer, programmer, technical
44
+ writer or other person who contributed to the Font Software.
45
+
46
+ PERMISSION AND CONDITIONS
47
+ Permission is hereby granted, free of charge, to any person obtaining
48
+ a copy of the Font Software, to use, study, copy, merge, embed, modify,
49
+ redistribute, and sell modified and unmodified copies of the Font
50
+ Software, subject to the following conditions:
51
+
52
+ 1) Neither the Font Software nor any of its individual components,
53
+ in Original or Modified Versions, may be sold by itself.
54
+
55
+ 2) Original or Modified Versions of the Font Software may be bundled,
56
+ redistributed and/or sold with any software, provided that each copy
57
+ contains the above copyright notice and this license. These can be
58
+ included either as stand-alone text files, human-readable headers or
59
+ in the appropriate machine-readable metadata fields within text or
60
+ binary files as long as those fields can be easily viewed by the user.
61
+
62
+ 3) No Modified Version of the Font Software may use the Reserved Font
63
+ Name(s) unless explicit written permission is granted by the corresponding
64
+ Copyright Holder. This restriction only applies to the primary font name as
65
+ presented to the users.
66
+
67
+ 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
68
+ Software shall not be used to promote, endorse or advertise any
69
+ Modified Version, except to acknowledge the contribution(s) of the
70
+ Copyright Holder(s) and the Author(s) or with their explicit written
71
+ permission.
72
+
73
+ 5) The Font Software, modified or unmodified, in part or in whole,
74
+ must be distributed entirely under this license, and must not be
75
+ distributed under any other license. The requirement for fonts to
76
+ remain under this license does not apply to any document created
77
+ using the Font Software.
78
+
79
+ TERMINATION
80
+ This license becomes null and void if any of the above conditions are
81
+ not met.
82
+
83
+ DISCLAIMER
84
+ THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
85
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
86
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
87
+ OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
88
+ COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
89
+ INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
90
+ DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
91
+ FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
92
+ OTHER DEALINGS IN THE FONT SOFTWARE.
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="#f5f2ec" />
8
+ <meta name="theme-color" content="#fbf5ec" />
9
9
  <title>Mica</title>
10
- <link rel="icon" href="/admin/brand/mica-favicon.svg" type="image/svg+xml" />
11
- <script type="module" crossorigin src="/admin/assets/index-BsCcwhm6.js"></script>
12
- <link rel="stylesheet" crossorigin href="/admin/assets/index-D9ZqpwC5.css">
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-Colfqb-9.js"></script>
14
+ <link rel="stylesheet" crossorigin href="/admin/assets/index-bRiiEobC.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.2.2",
3
+ "version": "0.4.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.2.2"
40
+ "@micacms/core": "0.4.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 t,c as n,b as w,a as l,F as x,k as S,C as B,t as f,e as R,g as $,q as le,o as re,j as L,w as V,l as _,z as ue,s as de,v as ce,m as he,r as A,i as N,A as D,n as me,x as W,R as pe,S as fe,y as ge}from"./index-BsCcwhm6.js";import{h as be}from"./useField-Czeyhihg.js";import{_ as ve}from"./ConfirmDialog.vue_vue_type_script_setup_true_lang-A3xi1Pww.js";import{_ as ye}from"./PageHeader.vue_vue_type_script_setup_true_lang-BHQH-Q7U.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(d,o,s){return z(d,o,s,[],[])}function z(d,o,s,r,m){const p=[];for(const[g,a]of Object.entries(d)){if(a.hidden)continue;const u=o===null?void 0:o[g],v=s===null?void 0:s[g],y=[...r,g],c=[...m,a.label??be(g)];if(a.kind==="object"){p.push(...z(a.fields,o===null?null:F(u)??{},s===null?null:F(v)??{},y,c));continue}if(a.kind==="repeater"){p.push(...we(a.fields,a.itemLabel,Q(u),Q(v),y,c,{before:o!==null,after:s!==null}));continue}O(u)!==O(v)&&p.push({path:y.join("."),label:c,kind:a.kind,before:o===null?null:K(a,u),after:s===null?null:K(a,v)})}return p}function we(d,o,s,r,m,p,g){const a=[],u=Math.max((s==null?void 0:s.length)??0,(r==null?void 0:r.length)??0);for(let v=0;v<u;v++){const y=(s==null?void 0:s[v])??(g.before?{}:null),c=(r==null?void 0:r[v])??(g.after?{}:null),C=k=>{const j=o?k==null?void 0:k[o]:void 0;return typeof j=="string"&&j!==""?j:`${v+1}`};a.push(...z(d,y,c,[...m,String(v)],[...p,C(c??y)]))}return a}function K(d,o){if(o==null||o==="")return"Empty";if(d.kind==="boolean")return o===!0?"Yes":"No";if(d.kind==="select")return(Array.isArray(o)?o:[o]).map(r=>{var m;return((m=d.options.find(p=>p.value===r))==null?void 0:m.label)??String(r)}).join(", ");if(d.kind==="media"){const s=Array.isArray(o)?o:[o];return s.length===0?"Empty":s.map(r=>String(r).split("/").at(-1)??String(r)).join(", ")}if(d.kind==="coordinates"){const s=F(o);if(s&&typeof s.lat=="number"&&typeof s.lng=="number")return`${s.lat.toFixed(5)}, ${s.lng.toFixed(5)}`}return Array.isArray(o)?o.map(String).join(", "):typeof o=="object"?O(o):String(o)}function F(d){return d!==null&&typeof d=="object"&&!Array.isArray(d)?d:null}function Q(d){return Array.isArray(d)?d:null}function O(d){return JSON.stringify(d??null,(o,s)=>{if(s===null||typeof s!="object"||Array.isArray(s))return s;const r=s,m={};for(const p of Object.keys(r).sort())m[p]=r[p];return m})}const Ce={class:"mt-3 rounded-md border border-line bg-canvas/60 p-3 text-xs"},$e={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"},Be={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"},Ee=X({__name:"ChangeComparison",props:{comparison:{},fields:{}},setup(d){const o=d,s=$(()=>o.comparison.before===null?"created":o.comparison.after===null?"deleted":"changed"),r=$(()=>o.fields?xe(o.fields,o.comparison.before,o.comparison.after):[]),m=$(()=>{if(o.fields)return null;const g=a=>Array.isArray(a==null?void 0:a.order)?a.order:[];return{before:g(o.comparison.before),after:g(o.comparison.after)}}),p=$(()=>{if(!m.value)return new Set;const g=new Map(m.value.before.map((a,u)=>[a.slug,u]));return new Set(m.value.after.filter((a,u)=>g.get(a.slug)!==u).map(a=>a.slug))});return(g,a)=>(t(),n("div",Ce,[s.value==="created"?(t(),n("p",$e," New — publishing puts this on the site for the first time. ")):s.value==="deleted"?(t(),n("p",Ae," Publishing removes this from the site. ")):w("",!0),m.value?(t(),n("div",Se,[l("div",null,[a[0]||(a[0]=l("p",{class:"mb-1.5 font-medium text-muted"},"Before",-1)),l("ol",Pe,[(t(!0),n(x,null,S(m.value.before,u=>(t(),n("li",{key:u.slug,class:B(p.value.has(u.slug)&&"font-medium text-ink")},f(u.title),3))),128))])]),l("div",null,[a[1]||(a[1]=l("p",{class:"mb-1.5 font-medium text-muted"},"After",-1)),l("ol",Re,[(t(!0),n(x,null,S(m.value.after,u=>(t(),n("li",{key:u.slug,class:B(p.value.has(u.slug)&&"font-medium text-success")},f(u.title),3))),128))])])])):(t(),n(x,{key:3},[r.value.length===0?(t(),n("p",je," Nothing visible changed — files moved or were rewritten without a field changing its value. ")):(t(),n("dl",Te,[(t(!0),n(x,null,S(r.value,u=>(t(),n("div",{key:u.path},[l("dt",Me,[(t(!0),n(x,null,S(u.label,(v,y)=>(t(),n(x,{key:y},[y>0?(t(),n("span",Ne," › ")):w("",!0),l("span",null,f(v),1)],64))),128))]),l("dd",{class:B(["grid gap-2",s.value==="changed"?"grid-cols-2":"grid-cols-1"])},[s.value!=="created"?(t(),n("div",De,[a[2]||(a[2]=l("span",{class:"sr-only"},"Before: ",-1)),R(f(u.before),1)])):w("",!0),s.value!=="deleted"?(t(),n("div",Be,[a[3]||(a[3]=l("span",{class:"sr-only"},"After: ",-1)),R(f(u.after),1)])):w("",!0)],2)]))),128))]))],64))]))}}),Le=["disabled"],Ve={class:"mx-auto max-w-3xl space-y-5 px-4 py-6 sm:px-6"},Fe={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"},Ue={key:3,class:"card p-8 text-center"},We={class:"mt-1 text-sm text-muted"},Ke={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"},es={key:1,class:"mt-2 text-xs text-danger"},ss={key:1,class:"mt-1 space-y-0.5"},ts={class:"break-all font-mono"},ns=["onClick"],os={key:5,class:"card p-4","aria-labelledby":"publish-heading"},as={id:"publish-heading",class:"text-sm font-semibold"},is={class:"mt-1 text-xs text-muted"},ls=["disabled"],rs=["disabled"],us={key:2,class:"text-sm text-muted"},ds={key:0},cs={key:1},gs=X({__name:"ChangesView",setup(d){const o=ge(),s=he(),r=me(),m=A(!0),p=A(!1),g=A(!1),a=A(""),u=A(null),v=A(!1),y=A(null),c=s.status,C=s.edits,k=A({});function j(e){var i,b;return e.kind==="entry"?((i=o.collection(e.collection))==null?void 0:i.fields)??null:e.kind==="singleton"?((b=o.singleton(e.name))==null?void 0:b.fields)??null:null}async function I(e){if(e.target){k.value[e.key]={loading:!0,error:null,comparison:null};try{const i=await N.staging.compare(e.target);k.value[e.key]={loading:!1,error:null,comparison:i}}catch(i){k.value[e.key]={loading:!1,error:i instanceof D?i.message:"Could not load the comparison.",comparison:null}}}}le(C,e=>{for(const i of e)i.target&&!k.value[i.key]&&I(i)});const Z=$(()=>{var e;return((e=c.value)==null?void 0:e.workspace)??"draft-store"}),T=$(()=>Z.value==="working-tree"),ee=$(()=>c.value?T.value?c.value.branch?`Your working tree, on branch ${c.value.branch}`:"Your working tree":"Saved in Mica, waiting to be published":null),se=$(()=>{var e;return y.value!==null||T.value&&(((e=c.value)==null?void 0:e.ahead)??0)>0}),Y=$(()=>{var e,i,b;return(((e=c.value)==null?void 0:e.publish.enabled)??!1)&&(((i=c.value)==null?void 0:i.validation.ok)??!1)&&(((b=c.value)==null?void 0:b.changes.length)??0)>0&&!p.value}),te={create:"Added",update:"Changed",delete:"Removed"};async function q(){k.value={},await s.refresh();for(const e of C.value)e.target&&!k.value[e.key]&&I(e);m.value=!1}re(q);async function ne(){var e,i;p.value=!0;try{const b=await N.staging.publish(a.value,((e=c.value)==null?void 0:e.baseRevision)??null);b.state==="published"?(y.value=null,a.value="",r.success("Published.",b.revision?`Commit ${E(b.revision)}.`:void 0)):(y.value=b,a.value="",r.error("Committed, but the push failed.",b.pushError)),await s.refresh()}catch(b){b instanceof D?(r.error(b.message,(i=b.issues[0])==null?void 0:i.message),await s.refresh()):r.error("Could not publish.")}finally{p.value=!1}}async function oe(){g.value=!0;try{const e=await N.staging.push();e.state==="published"?(y.value=null,r.success("Pushed.",e.revision?`Commit ${E(e.revision)}.`:void 0)):(y.value=e,r.error("The push failed again.",e.pushError)),await s.refresh()}catch(e){r.error(e instanceof D?e.message:"Could not push.")}finally{g.value=!1}}async function ae(){const e=u.value;if(e){v.value=!0;try{await N.staging.discard(e.fileChanges.map(i=>i.path)),r.success(`Discarded the changes to ${e.label}.`),u.value=null,await s.refresh()}catch(i){r.error(i instanceof D?i.message:"Could not discard.")}finally{v.value=!1}}}function E(e){return/^[0-9a-f]{20,}$/i.test(e)?e.slice(0,7):e}return(e,i)=>{var b,G;return t(),n(x,null,[L(ye,{title:"Publish",subtitle:ee.value},{default:V(()=>[l("button",{type:"button",class:"btn-ghost px-2",disabled:m.value,onClick:q},[L(_(_e),{size:16,"aria-hidden":"true"}),i[3]||(i[3]=l("span",{class:"sr-only"},"Refresh the change list",-1))],8,Le)]),_:1},8,["subtitle"]),l("div",Ve,[m.value?(t(),n("p",Fe,"Loading…")):_(c)?(t(),n(x,{key:1},[_(c).publish.enabled?w("",!0):(t(),n("div",Oe,[i[4]||(i[4]=l("p",{class:"font-medium text-ink"},"Publishing is not available here",-1)),l("p",ze,f(_(c).publish.reason),1)])),se.value?(t(),n("div",Ie,[i[5]||(i[5]=l("p",{class:"text-sm font-medium text-warning"},"Committed, waiting to be pushed",-1)),l("p",Ye,f(((b=y.value)==null?void 0:b.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:g.value,onClick:oe},f(g.value?"Pushing…":"Retry push"),9,qe)])):w("",!0),_(c).validation.ok?w("",!0):(t(),n("div",Ge,[i[6]||(i[6]=l("p",{class:"text-sm font-medium text-danger"}," These changes cannot be published until they are fixed ",-1)),l("ul",He,[(t(!0),n(x,null,S(_(c).validation.problems,h=>(t(),n("li",{key:h.path},[l("span",Je,f(h.label),1),h.issues.length?(t(),n(x,{key:0},[R(" — "+f(h.issues.map(M=>M.message).join("; ")),1)],64)):w("",!0)]))),128))])])),_(C).length===0?(t(),n("div",Ue,[i[7]||(i[7]=l("p",{class:"text-sm font-medium"},"Nothing waiting to be published",-1)),l("p",We," Saved changes collect here until somebody publishes them. Right now the "+f(T.value?"working tree":"draft workspace")+" matches the repository. ",1)])):(t(),n("section",Ke,[i[8]||(i[8]=l("h2",{id:"changes-heading",class:"sr-only"},"Pending changes",-1)),l("ul",Qe,[(t(!0),n(x,null,S(_(C),h=>{var M,H,J,U;return t(),n("li",{key:h.key,class:"flex items-start gap-3 p-4"},[l("div",Xe,[(t(),W(fe(h.link?"RouterLink":"p"),pe({ref_for:!0},h.link?{to:h.link}:{},{class:["text-sm font-medium",h.link&&"hover:underline"]}),{default:V(()=>[R(f(h.label),1)]),_:2},1040,["class"])),h.target?(t(),n(x,{key:0},[(M=k.value[h.key])!=null&&M.loading?(t(),n("p",Ze," Comparing… ")):(H=k.value[h.key])!=null&&H.error?(t(),n("p",es,f((J=k.value[h.key])==null?void 0:J.error),1)):(U=k.value[h.key])!=null&&U.comparison?(t(),W(Ee,{key:2,comparison:k.value[h.key].comparison,fields:j(h.target)},null,8,["comparison","fields"])):w("",!0)],64)):(t(),n("ul",ss,[(t(!0),n(x,null,S(h.fileChanges,P=>(t(),n("li",{key:P.path,class:"flex items-baseline gap-2 text-xs text-muted"},[l("span",{class:B(["w-16 shrink-0 font-mono text-[11px]",P.kind==="delete"?"text-danger":P.kind==="create"?"text-success":""])},f(te[P.kind]),3),l("span",ts,f(P.path),1)]))),128))]))]),l("button",{type:"button",class:"btn-ghost shrink-0 text-xs",onClick:P=>u.value=h}," Discard ",8,ns)])}),128))])])),_(C).length>0&&_(c).publish.enabled?(t(),n("section",os,[l("h2",as," Publish "+f(_(C).length===1?"this edit":`these ${_(C).length} edits`),1),l("p",is,[R(f(T.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),_(c).baseRevision?(t(),n(x,{key:0},[R(" Based on "+f(E(_(c).baseRevision))+".",1)],64)):w("",!0)]),l("form",{class:"mt-3 flex flex-wrap items-center gap-2",onSubmit:i[1]||(i[1]=ue(h=>Y.value&&a.value.trim()&&ne(),["prevent"]))},[de(l("input",{"onUpdate:modelValue":i[0]||(i[0]=h=>a.value=h),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:p.value},null,8,ls),[[ce,a.value]]),l("button",{type:"submit",class:"btn-primary",disabled:!Y.value||!a.value.trim()},f(p.value?"Publishing…":"Publish"),9,rs)],32)])):w("",!0)],64)):(t(),n("p",us,"The change list could not be loaded. Reload to retry."))]),L(ve,{open:u.value!==null,title:`Discard the changes to “${(G=u.value)==null?void 0:G.label}”?`,"confirm-label":"Discard",destructive:"",busy:v.value,onCancel:i[2]||(i[2]=h=>u.value=null),onConfirm:ae},{default:V(()=>[T.value?(t(),n("p",ds," 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. ")):(t(),n("p",cs," 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{gs as default};
7
- //# sourceMappingURL=ChangesView-aU_TiQsk.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ChangesView-aU_TiQsk.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 FileChange,\n type PublishOutcome,\n} from \"@/api\";\nimport ChangeComparison from \"@/components/ChangeComparison.vue\";\nimport type { Edit } from \"@/lib/edits\";\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<Edit | 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\n/** One row per edit, never per file — see `lib/edits.ts`. */\nconst edits = staging.edits;\n\n/* ------------------------------------------------- before/after */\n\ninterface LoadedComparison {\n loading: boolean;\n error: string | null;\n comparison: Comparison | null;\n}\n\nconst comparisons = ref<Record<string, LoadedComparison>>({});\n\n/** The compared document's fields — null for an order comparison. */\nfunction fieldsFor(target: CompareTarget): FieldMap | null {\n if (target.kind === \"entry\") return schema.collection(target.collection)?.fields ?? null;\n if (target.kind === \"singleton\") return schema.singleton(target.name)?.fields ?? null;\n return null;\n}\n\nasync function loadComparison(edit: Edit): Promise<void> {\n if (!edit.target) return;\n comparisons.value[edit.key] = { loading: true, error: null, comparison: null };\n try {\n const comparison = await api.staging.compare(edit.target);\n comparisons.value[edit.key] = { loading: false, error: null, comparison };\n } catch (error) {\n comparisons.value[edit.key] = {\n loading: false,\n error: error instanceof ApiError ? error.message : \"Could not load the comparison.\",\n comparison: null,\n };\n }\n}\n\n// The comparison is the change list, so it loads with it — every edit, as\n// soon as it appears, without anything to click.\nwatch(edits, (next) => {\n for (const edit of next) {\n if (edit.target && !comparisons.value[edit.key]) void loadComparison(edit);\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<FileChange[\"kind\"], string> = {\n create: \"Added\",\n update: \"Changed\",\n delete: \"Removed\",\n};\n\nasync function refresh(): Promise<void> {\n // Forget the comparisons first, so the edits watcher reloads every one of\n // them against the refreshed change set instead of showing a stale panel.\n comparisons.value = {};\n await staging.refresh();\n for (const edit of edits.value) {\n if (edit.target && !comparisons.value[edit.key]) void loadComparison(edit);\n }\n loading.value = false;\n}\n\nonMounted(refresh);\n\nasync function publish(): Promise<void> {\n publishing.value = true;\n 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 edit = discardTarget.value;\n if (!edit) return;\n\n discarding.value = true;\n try {\n await api.staging.discard(edit.fileChanges.map((change) => change.path));\n toast.success(`Discarded the changes to ${edit.label}.`);\n discardTarget.value = null;\n await staging.refresh();\n } catch (error) {\n toast.error(error instanceof ApiError ? error.message : \"Could not discard.\");\n } finally {\n discarding.value = false;\n }\n}\n\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=\"edits.length === 0\" class=\"card p-8 text-center\">\n <p class=\"text-sm font-medium\">Nothing waiting to be published</p>\n <p class=\"mt-1 text-sm text-muted\">\n Saved changes collect here until somebody publishes them. Right now the\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=\"edit in edits\" :key=\"edit.key\" class=\"flex items-start gap-3 p-4\">\n <div class=\"min-w-0 flex-1\">\n <component\n :is=\"edit.link ? 'RouterLink' : 'p'\"\n v-bind=\"edit.link ? { to: edit.link } : {}\"\n :class=\"['text-sm font-medium', edit.link && 'hover:underline']\"\n >\n {{ edit.label }}\n </component>\n\n <!-- What the change does. Edits with a document get the\n before/after view and no file paths; media and everything\n else have only their files to show. -->\n <template v-if=\"edit.target\">\n <p v-if=\"comparisons[edit.key]?.loading\" class=\"mt-2 text-xs text-muted\">\n Comparing…\n </p>\n <p v-else-if=\"comparisons[edit.key]?.error\" class=\"mt-2 text-xs text-danger\">\n {{ comparisons[edit.key]?.error }}\n </p>\n <ChangeComparison\n v-else-if=\"comparisons[edit.key]?.comparison\"\n :comparison=\"comparisons[edit.key]!.comparison!\"\n :fields=\"fieldsFor(edit.target)\"\n />\n </template>\n\n <ul v-else class=\"mt-1 space-y-0.5\">\n <li\n v-for=\"change in edit.fileChanges\"\n :key=\"change.path\"\n class=\"flex items-baseline gap-2 text-xs text-muted\"\n >\n <span\n :class=\"[\n 'w-16 shrink-0 font-mono text-[11px]',\n change.kind === 'delete' ? 'text-danger' : change.kind === 'create' ? 'text-success' : '',\n ]\"\n >\n {{ kindWord[change.kind] }}\n </span>\n <span class=\"break-all font-mono\">{{ change.path }}</span>\n </li>\n </ul>\n </div>\n\n <button type=\"button\" class=\"btn-ghost shrink-0 text-xs\" @click=\"discardTarget = edit\">\n Discard\n </button>\n </li>\n </ul>\n </section>\n\n <!-- Publish -->\n <section v-if=\"edits.length > 0 && status.publish.enabled\" class=\"card p-4\" aria-labelledby=\"publish-heading\">\n <h2 id=\"publish-heading\" class=\"text-sm font-semibold\">\n Publish {{ edits.length === 1 ? \"this edit\" : `these ${edits.length} edits` }}\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","b","at","named","humanise","asRecord","repeaterRows","asList","canonical","displayValue","itemLabel","present","count","index","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","edits","comparisons","fieldsFor","target","_b","loadComparison","edit","comparison","api","error","ApiError","watch","next","workspace","isTree","subtitle","waitingToPush","canPublish","_c","kindWord","refresh","onMounted","publish","outcome","short","retryPush","discard","change","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-BsCcwhm6.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-A3xi1Pww.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ConfirmDialog.vue_vue_type_script_setup_true_lang-A3xi1Pww.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 +0,0 @@
1
- {"version":3,"file":"EntryView-EdKf-RGT.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-BsCcwhm6.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-CNEoMKDH.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"LoginView-CNEoMKDH.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-DZ8c7Ftz.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-BsCcwhm6.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-BHQH-Q7U.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-BsCcwhm6.js";import{u as H,_ as I,w as J}from"./useUnsavedChanges-CCE0XMQT.js";import{_ as K}from"./PageHeader.vue_vue_type_script_setup_true_lang-BHQH-Q7U.js";import"./useField-Czeyhihg.js";import"./arrow-right-DY4A7pBS.js";import"./plus-CFEffUqP.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-Cq9s9GNX.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"SingletonView-Cq9s9GNX.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":"s8BAsBA,MAAMA,EAAQC,EAERC,EAASC,EAAA,EACTC,EAAQC,EAAA,EAERC,EAAaC,EAAS,IAAML,EAAO,UAAUF,EAAM,IAAI,CAAC,EAExDQ,EAASC,EAA6B,EAAE,EACxCC,EAASD,EAAkB,EAAE,EAC7BE,EAAWF,EAAmB,IAAI,EAClCG,EAAUH,EAAI,EAAI,EAClBI,EAASJ,EAAI,EAAK,EAClBK,EAAWL,EAAI,EAAK,EAGpBM,EAAWN,EAAI,EAAE,EAEjB,CAAE,MAAAO,EAAO,UAAAC,GAAcC,EAAkBV,CAAM,EAErD,eAAeW,GAAsB,OACnCP,EAAQ,MAAQ,GAChB,GAAI,CACF,MAAMQ,EAAS,MAAMC,EAAI,WAAW,IAAIrB,EAAM,IAAI,EAElDQ,EAAO,MAAQ,gBAAgBc,IAAaC,EAAAjB,EAAW,QAAX,YAAAiB,EAAkB,SAAU,CAAA,EAAIH,EAAO,IAAI,CAAC,EACxFT,EAAS,MAAQS,EAAO,SACxBL,EAAS,MAAQK,EAAO,KACxBV,EAAO,MAAQ,CAAA,EACfI,EAAS,MAAQ,GACjBG,EAAA,CACF,OAASO,EAAO,CACdpB,EAAM,MAAMoB,aAAiBC,EAAWD,EAAM,QAAU,gCAAgC,CAC1F,QAAA,CACEZ,EAAQ,MAAQ,EAClB,CACF,CAEAc,EAAUP,CAAI,EACdQ,EAAM,IAAM3B,EAAM,KAAMmB,CAAI,EAE5B,eAAeS,GAAsB,CACnCf,EAAO,MAAQ,GACfH,EAAO,MAAQ,CAAA,EAEf,GAAI,CACF,MAAMmB,EAAQ,MAAMR,EAAI,WAAW,KAAKrB,EAAM,KAAMQ,EAAO,MAAOG,EAAS,KAAK,EAChFA,EAAS,MAAQkB,EAAM,SACvBf,EAAS,MAAQ,GACjBG,EAAA,EACAb,EAAM,QAAQ,iBAAiB,EAC1B0B,EAAA,EAAa,QAAA,CACpB,OAASN,EAAO,CACVA,aAAiBC,GAAYD,EAAM,SAAW,KAChDV,EAAS,MAAQ,GACjBV,EAAM,MAAM,gEAAgE,GACnEoB,aAAiBC,GAAYD,EAAM,OAAO,OAAS,GAC5Dd,EAAO,MAAQc,EAAM,OACrBpB,EAAM,MAAMoB,EAAM,QAAS,GAAGA,EAAM,OAAO,MAAM,2BAA2B,GAE5EpB,EAAM,MAAMoB,aAAiBC,EAAWD,EAAM,QAAU,gCAAgC,CAE5F,QAAA,CACEX,EAAO,MAAQ,EACjB,CACF,cAIkBP,EAAA,WAAhByB,EAyDWC,EAAA,CAAA,IAAA,GAAA,CAxDTC,EAQaC,EAAA,CARA,MAAO5B,EAAA,MAAW,MAAQ,SAAUS,EAAA,KAAA,aAC/C,IAGO,CAHPoB,EAGO,OAAA,CAHA,iBAAiBC,EAAApB,CAAA,EAAK,wCAAA,cAAA,CAAA,CAAA,eAC3BmB,EAAuE,OAAA,CAAjE,MAAM,sCAAsC,cAAY,MAAA,YAASE,EAAA,MACpED,EAAApB,CAAA,EAAK,UAAA,OAAA,EAAA,CAAA,CAAA,KAEVmB,EAES,SAAA,CAFD,KAAK,SAAS,MAAM,cAAe,SAAUtB,EAAA,OAAM,CAAKuB,EAAApB,CAAA,EAAQ,QAAOY,CAAA,EAC1EU,EAAAzB,EAAA,gBAAqBuB,EAAApB,CAAA,EAAK,eAAA,OAAA,EAAA,EAAAuB,CAAA,CAAA,gCAIjCJ,EA6CM,MA7CNK,EA6CM,CA5CK5B,EAAA,WAATmB,EAAyD,IAAzDU,EAA6C,UAAQ,QAErDV,EAyCWC,EAAA,CAAA,IAAA,GAAA,CAxCA1B,EAAA,MAAW,aAApBoC,EAAA,EAAAX,EAEI,IAFJY,EAEIL,EADChC,EAAA,MAAW,WAAW,EAAA,CAAA,YAInBQ,EAAA,OADR4B,EAAA,EAAAX,EAYM,MAZNa,EAYM,CAPJC,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAV,EAA6F,IAAA,CAA1F,MAAM,kCAAA,EAAmC,gDAA6C,EAAA,GACzFU,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAAV,EAEI,IAAA,CAFD,MAAM,yBAAA,EAA0B,mFAEnC,EAAA,GACAA,EAES,SAAA,CAFD,KAAK,SAAS,MAAM,uBAAwB,QAAOhB,CAAA,EAAM,2BAEjE,CAAA,aAIMT,EAAA,MAAO,QADfgC,IAAAX,EAWM,MAXNe,EAWM,CANJX,EAEI,IAFJY,EAEIT,EADC5B,EAAA,MAAO,MAAM,EAAG,SAAM4B,EAAG5B,EAAA,MAAO,mBAA0B,mBAC/D,CAAA,EACAyB,EAEK,KAFLa,EAEK,QADHjB,EAAsEC,EAAA,KAAAiB,EAAlDvC,EAAA,MAATwC,QAAXnB,EAAsE,KAAA,CAAzC,IAAKmB,EAAM,IAAA,EAASZ,EAAAY,EAAM,OAAO,EAAA,CAAA,wBAIlEf,EAQO,OAAA,CARD,WAAA,GAAY,WAAgBP,EAAI,CAAA,SAAA,CAAA,CAAA,GACpCK,EAKEkB,EAAA,YAJS3C,EAAA,2CAAAA,EAAM,MAAA4C,GACd,OAAQ9C,EAAA,MAAW,OACnB,OAAQI,EAAA,MACR,SAAUG,EAAA,KAAA,kEAEbsB,EAAmD,SAAA,CAA3C,KAAK,SAAS,MAAM,SAAA,EAAU,OAAI,EAAA,EAAA,qBAMlDO,EAAA,EAAAX,EAEM,MAFNsB,GAAuD,kCACvBf,EAAGrC,EAAA,IAAI,EAAG,MAC1C,CAAA"}