@scalar/api-client 3.2.2 → 3.3.1

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 (116) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/dist/style.css +122 -146
  3. package/dist/v2/blocks/operation-block/OperationBlock.vue.d.ts.map +1 -1
  4. package/dist/v2/blocks/operation-block/OperationBlock.vue.js.map +1 -1
  5. package/dist/v2/blocks/operation-block/OperationBlock.vue.script.js +9 -0
  6. package/dist/v2/blocks/operation-block/OperationBlock.vue.script.js.map +1 -1
  7. package/dist/v2/blocks/operation-block/components/Header.vue.d.ts +2 -0
  8. package/dist/v2/blocks/operation-block/components/Header.vue.d.ts.map +1 -1
  9. package/dist/v2/blocks/operation-block/components/Header.vue.js +1 -1
  10. package/dist/v2/blocks/operation-block/components/Header.vue.js.map +1 -1
  11. package/dist/v2/blocks/operation-block/components/Header.vue.script.js +20 -10
  12. package/dist/v2/blocks/operation-block/components/Header.vue.script.js.map +1 -1
  13. package/dist/v2/blocks/request-block/components/RequestTable.vue.d.ts +2 -2
  14. package/dist/v2/blocks/request-block/components/RequestTableRow.vue.d.ts +2 -2
  15. package/dist/v2/blocks/response-block/components/ResponseEmpty.vue.d.ts +2 -2
  16. package/dist/v2/components/modals/ModalClientContainer.vue.d.ts +2 -2
  17. package/dist/v2/components/modals/ModalClientContainer.vue.d.ts.map +1 -1
  18. package/dist/v2/components/modals/ModalClientContainer.vue.js +1 -1
  19. package/dist/v2/components/modals/ModalClientContainer.vue.js.map +1 -1
  20. package/dist/v2/components/modals/ModalClientContainer.vue.script.js +17 -24
  21. package/dist/v2/components/modals/ModalClientContainer.vue.script.js.map +1 -1
  22. package/dist/v2/components/server/ServerDropdown.vue.d.ts +2 -2
  23. package/dist/v2/components/sidebar/Sidebar.vue.script.js +2 -2
  24. package/dist/v2/components/sidebar/Sidebar.vue.script.js.map +1 -1
  25. package/dist/v2/constants.js +1 -1
  26. package/dist/v2/features/app/App.vue.d.ts +22 -4
  27. package/dist/v2/features/app/App.vue.d.ts.map +1 -1
  28. package/dist/v2/features/app/App.vue.js.map +1 -1
  29. package/dist/v2/features/app/App.vue.script.js +57 -54
  30. package/dist/v2/features/app/App.vue.script.js.map +1 -1
  31. package/dist/v2/features/app/app-events.d.ts.map +1 -1
  32. package/dist/v2/features/app/app-events.js +4 -0
  33. package/dist/v2/features/app/app-events.js.map +1 -1
  34. package/dist/v2/features/app/app-state.d.ts +6 -0
  35. package/dist/v2/features/app/app-state.d.ts.map +1 -1
  36. package/dist/v2/features/app/app-state.js +15 -1
  37. package/dist/v2/features/app/app-state.js.map +1 -1
  38. package/dist/v2/features/app/components/AppHeader.vue.d.ts +20 -0
  39. package/dist/v2/features/app/components/AppHeader.vue.d.ts.map +1 -0
  40. package/dist/v2/features/app/components/AppHeader.vue.js +7 -0
  41. package/dist/v2/features/app/components/AppHeader.vue.js.map +1 -0
  42. package/dist/v2/features/app/components/AppHeader.vue.script.js +43 -0
  43. package/dist/v2/features/app/components/AppHeader.vue.script.js.map +1 -0
  44. package/dist/v2/features/app/components/AppSidebar.vue.d.ts +17 -56
  45. package/dist/v2/features/app/components/AppSidebar.vue.d.ts.map +1 -1
  46. package/dist/v2/features/app/components/AppSidebar.vue.js +1 -1
  47. package/dist/v2/features/app/components/AppSidebar.vue.js.map +1 -1
  48. package/dist/v2/features/app/components/AppSidebar.vue.script.js +437 -271
  49. package/dist/v2/features/app/components/AppSidebar.vue.script.js.map +1 -1
  50. package/dist/v2/features/app/helpers/load-registry-document.d.ts +18 -0
  51. package/dist/v2/features/app/helpers/load-registry-document.d.ts.map +1 -0
  52. package/dist/v2/features/app/helpers/load-registry-document.js +45 -0
  53. package/dist/v2/features/app/helpers/load-registry-document.js.map +1 -0
  54. package/dist/v2/features/app/helpers/routes.d.ts +6 -1
  55. package/dist/v2/features/app/helpers/routes.d.ts.map +1 -1
  56. package/dist/v2/features/app/helpers/routes.js +84 -75
  57. package/dist/v2/features/app/helpers/routes.js.map +1 -1
  58. package/dist/v2/features/app/hooks/use-document-filter.d.ts +38 -0
  59. package/dist/v2/features/app/hooks/use-document-filter.d.ts.map +1 -0
  60. package/dist/v2/features/app/hooks/use-document-filter.js +63 -0
  61. package/dist/v2/features/app/hooks/use-document-filter.js.map +1 -0
  62. package/dist/v2/features/app/hooks/use-sidebar-context-menu.d.ts +17258 -0
  63. package/dist/v2/features/app/hooks/use-sidebar-context-menu.d.ts.map +1 -0
  64. package/dist/v2/features/app/hooks/use-sidebar-context-menu.js +107 -0
  65. package/dist/v2/features/app/hooks/use-sidebar-context-menu.js.map +1 -0
  66. package/dist/v2/features/app/hooks/use-sidebar-documents.d.ts +95 -0
  67. package/dist/v2/features/app/hooks/use-sidebar-documents.d.ts.map +1 -0
  68. package/dist/v2/features/app/hooks/use-sidebar-documents.js +97 -0
  69. package/dist/v2/features/app/hooks/use-sidebar-documents.js.map +1 -0
  70. package/dist/v2/features/app/index.d.ts +1 -0
  71. package/dist/v2/features/app/index.d.ts.map +1 -1
  72. package/dist/v2/features/collection/components/GetStarted.vue.d.ts +13 -0
  73. package/dist/v2/features/collection/components/GetStarted.vue.d.ts.map +1 -0
  74. package/dist/v2/features/collection/components/GetStarted.vue.js +7 -0
  75. package/dist/v2/features/collection/components/GetStarted.vue.js.map +1 -0
  76. package/dist/v2/features/collection/components/GetStarted.vue.script.js +101 -0
  77. package/dist/v2/features/collection/components/GetStarted.vue.script.js.map +1 -0
  78. package/dist/v2/features/command-palette/helpers/generate-unique-slug.d.ts +4 -0
  79. package/dist/v2/features/command-palette/helpers/generate-unique-slug.d.ts.map +1 -1
  80. package/dist/v2/features/command-palette/helpers/generate-unique-slug.js +5 -1
  81. package/dist/v2/features/command-palette/helpers/generate-unique-slug.js.map +1 -1
  82. package/dist/v2/features/search/components/DocumentSearchModal.vue.d.ts +16 -0
  83. package/dist/v2/features/search/components/DocumentSearchModal.vue.d.ts.map +1 -0
  84. package/dist/v2/features/search/components/DocumentSearchModal.vue.js +9 -0
  85. package/dist/v2/features/search/components/DocumentSearchModal.vue.js.map +1 -0
  86. package/dist/v2/features/search/components/DocumentSearchModal.vue.script.js +123 -0
  87. package/dist/v2/features/search/components/DocumentSearchModal.vue.script.js.map +1 -0
  88. package/dist/v2/features/search/components/SearchResult.vue.d.ts +11 -0
  89. package/dist/v2/features/search/components/SearchResult.vue.d.ts.map +1 -0
  90. package/dist/v2/features/search/components/SearchResult.vue.js +7 -0
  91. package/dist/v2/features/search/components/SearchResult.vue.js.map +1 -0
  92. package/dist/v2/features/search/components/SearchResult.vue.script.js +71 -0
  93. package/dist/v2/features/search/components/SearchResult.vue.script.js.map +1 -0
  94. package/dist/v2/features/search/hooks/use-document-search.d.ts +19 -0
  95. package/dist/v2/features/search/hooks/use-document-search.d.ts.map +1 -0
  96. package/dist/v2/features/search/hooks/use-document-search.js +42 -0
  97. package/dist/v2/features/search/hooks/use-document-search.js.map +1 -0
  98. package/dist/v2/features/search/index.d.ts +2 -0
  99. package/dist/v2/features/search/index.d.ts.map +1 -1
  100. package/dist/v2/features/search/index.js +3 -1
  101. package/dist/v2/helpers/handle-hotkeys.d.ts.map +1 -1
  102. package/dist/v2/helpers/handle-hotkeys.js +8 -4
  103. package/dist/v2/helpers/handle-hotkeys.js.map +1 -1
  104. package/dist/v2/types/configuration.d.ts +1 -0
  105. package/dist/v2/types/configuration.d.ts.map +1 -1
  106. package/package.json +14 -13
  107. package/dist/assets/rabbit.ascii.virtual.js +0 -6
  108. package/dist/assets/rabbit.ascii.virtual.js.map +0 -1
  109. package/dist/assets/rabbitjump.ascii.virtual.js +0 -6
  110. package/dist/assets/rabbitjump.ascii.virtual.js.map +0 -1
  111. package/dist/v2/features/app/components/DownloadAppButton.vue.d.ts +0 -4
  112. package/dist/v2/features/app/components/DownloadAppButton.vue.d.ts.map +0 -1
  113. package/dist/v2/features/app/components/DownloadAppButton.vue.js +0 -9
  114. package/dist/v2/features/app/components/DownloadAppButton.vue.js.map +0 -1
  115. package/dist/v2/features/app/components/DownloadAppButton.vue.script.js +0 -21
  116. package/dist/v2/features/app/components/DownloadAppButton.vue.script.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-sidebar-context-menu.d.ts","sourceRoot":"","sources":["../../../../../src/v2/features/app/hooks/use-sidebar-context-menu.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AACnD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAA;AAEvE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4CAA4C,CAAA;AAGhF;;;;;GAKG;AACH,KAAK,UAAU,GAAG;IAChB,+CAA+C;IAC/C,IAAI,EAAE,cAAc,CAAA;IACpB,mDAAmD;IACnD,EAAE,EAAE,WAAW,CAAA;IACf,8CAA8C;IAC9C,QAAQ,EAAE,OAAO,CAAA;CAClB,CAAA;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,qBAAqB,GAAI,6BAGnC;IACD,QAAQ,EAAE,iBAAiB,CAAA;IAC3B,YAAY,EAAE,YAAY,CAAC,cAAc,CAAC,CAAA;CAC3C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;YA7BK,WAAW;kBAEL,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;YAFb,WAAW;kBAEL,OAAO;;;;;;;;sBA+Cc,UAAU,GAAG,aAAa,QAAQ,cAAc;;;CAsFhF,CAAA"}
@@ -0,0 +1,107 @@
1
+ import { computed, nextTick, ref } from "vue";
2
+ import { useModal } from "@scalar/components";
3
+ import { getParentEntry } from "@scalar/workspace-store/navigation";
4
+ //#region src/v2/features/app/hooks/use-sidebar-context-menu.ts
5
+ /**
6
+ * Owns the "more options" dropdown + delete confirmation modal for the app
7
+ * sidebar.
8
+ *
9
+ * The hook exposes:
10
+ * - `menuTarget`: anchor + open state for the `SidebarItemMenu` component,
11
+ * so the dropdown can re-position itself next to the triggering icon
12
+ * button without each row rendering its own menu
13
+ * - `openMenu` / `closeMenu`: helpers that match the dropdown animation
14
+ * lifecycle (keep the target element around on close so exit animations
15
+ * can play)
16
+ * - `deleteModalState` + `deleteMessage`: the shared confirmation modal
17
+ * that is triggered from the dropdown menu. The message is phrased more
18
+ * strongly for documents because deleting one also removes every tag and
19
+ * operation inside it.
20
+ * - `handleDelete`: routes the confirmation to the right `*:delete:*`
21
+ * event on the workspace event bus depending on the item's type.
22
+ */
23
+ var useSidebarContextMenu = ({ eventBus, sidebarState }) => {
24
+ const menuTarget = ref(null);
25
+ const deleteModalState = useModal();
26
+ const deleteMessage = computed(() => {
27
+ const item = menuTarget.value?.item;
28
+ if (item?.type === "document") return "This cannot be undone. You're about to delete the document and all tags and operations inside it.";
29
+ return `Are you sure you want to delete this ${item?.type ?? "item"}? This action cannot be undone.`;
30
+ });
31
+ /**
32
+ * Open the dropdown for `item` and re-dispatch the originating event on
33
+ * the anchor element after the next tick. Re-dispatching is what lets the
34
+ * menu open on the correct anchor for both mouse and keyboard
35
+ * interactions, matching the behaviour of the old sidebar.
36
+ */
37
+ const openMenu = async (event, item) => {
38
+ if (menuTarget.value?.showMenu) return;
39
+ menuTarget.value = {
40
+ item,
41
+ el: event.currentTarget,
42
+ showMenu: true
43
+ };
44
+ await nextTick();
45
+ const cloned = event instanceof MouseEvent ? new MouseEvent(event.type, event) : new KeyboardEvent(event.type, event);
46
+ menuTarget.value?.el.dispatchEvent(cloned);
47
+ };
48
+ /**
49
+ * Close the dropdown without resetting its target so exit animations can
50
+ * still play out. The target is cleared on the next `handleDelete` or
51
+ * `openMenu` call.
52
+ */
53
+ const closeMenu = () => {
54
+ if (menuTarget.value) menuTarget.value.showMenu = false;
55
+ };
56
+ /**
57
+ * Fire the correct `*:delete:*` event on the workspace event bus for the
58
+ * active menu target, then hide the confirmation modal and clear the
59
+ * menu. Silent no-op if the target cannot be resolved to a parent
60
+ * document (or parent operation, for examples).
61
+ */
62
+ const handleDelete = () => {
63
+ const item = menuTarget.value?.item;
64
+ if (!item) return;
65
+ const result = sidebarState.getEntryById(item.id);
66
+ const document = getParentEntry("document", result);
67
+ const operation = getParentEntry("operation", result);
68
+ if (!document) return;
69
+ if (item.type === "document") eventBus.emit("document:delete:document", { name: document.name });
70
+ else if (item.type === "tag") eventBus.emit("tag:delete:tag", {
71
+ documentName: document.name,
72
+ name: item.name
73
+ });
74
+ else if (item.type === "operation") eventBus.emit("operation:delete:operation", {
75
+ meta: {
76
+ method: item.method,
77
+ path: item.path
78
+ },
79
+ documentName: document.name
80
+ });
81
+ else if (item.type === "example") {
82
+ if (!operation) return;
83
+ eventBus.emit("operation:delete:example", {
84
+ meta: {
85
+ method: operation.method,
86
+ path: operation.path,
87
+ exampleKey: item.name
88
+ },
89
+ documentName: document.name
90
+ });
91
+ }
92
+ deleteModalState.hide();
93
+ menuTarget.value = null;
94
+ };
95
+ return {
96
+ menuTarget,
97
+ deleteModalState,
98
+ deleteMessage,
99
+ openMenu,
100
+ closeMenu,
101
+ handleDelete
102
+ };
103
+ };
104
+ //#endregion
105
+ export { useSidebarContextMenu };
106
+
107
+ //# sourceMappingURL=use-sidebar-context-menu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-sidebar-context-menu.js","names":[],"sources":["../../../../../src/v2/features/app/hooks/use-sidebar-context-menu.ts"],"sourcesContent":["import { useModal } from '@scalar/components'\nimport type { SidebarState } from '@scalar/sidebar'\nimport type { WorkspaceEventBus } from '@scalar/workspace-store/events'\nimport { getParentEntry } from '@scalar/workspace-store/navigation'\nimport type { TraversedEntry } from '@scalar/workspace-store/schemas/navigation'\nimport { computed, nextTick, ref } from 'vue'\n\n/**\n * Anchor information for the currently open contextual dropdown. We hold on\n * to the DOM element that opened the menu so `SidebarItemMenu` can teleport\n * itself next to it, and track `showMenu` independently from `null`-ness so\n * closing the menu can play its exit animation before the target is cleared.\n */\ntype MenuTarget = {\n /** The sidebar entry the menu is acting on. */\n item: TraversedEntry\n /** The DOM element the dropdown is anchored to. */\n el: HTMLElement\n /** Whether the menu is currently rendered. */\n showMenu: boolean\n}\n\n/**\n * Owns the \"more options\" dropdown + delete confirmation modal for the app\n * sidebar.\n *\n * The hook exposes:\n * - `menuTarget`: anchor + open state for the `SidebarItemMenu` component,\n * so the dropdown can re-position itself next to the triggering icon\n * button without each row rendering its own menu\n * - `openMenu` / `closeMenu`: helpers that match the dropdown animation\n * lifecycle (keep the target element around on close so exit animations\n * can play)\n * - `deleteModalState` + `deleteMessage`: the shared confirmation modal\n * that is triggered from the dropdown menu. The message is phrased more\n * strongly for documents because deleting one also removes every tag and\n * operation inside it.\n * - `handleDelete`: routes the confirmation to the right `*:delete:*`\n * event on the workspace event bus depending on the item's type.\n */\nexport const useSidebarContextMenu = ({\n eventBus,\n sidebarState,\n}: {\n eventBus: WorkspaceEventBus\n sidebarState: SidebarState<TraversedEntry>\n}) => {\n const menuTarget = ref<MenuTarget | null>(null)\n const deleteModalState = useModal()\n\n const deleteMessage = computed(() => {\n const item = menuTarget.value?.item\n\n if (item?.type === 'document') {\n return \"This cannot be undone. You're about to delete the document and all tags and operations inside it.\"\n }\n\n return `Are you sure you want to delete this ${item?.type ?? 'item'}? This action cannot be undone.`\n })\n\n /**\n * Open the dropdown for `item` and re-dispatch the originating event on\n * the anchor element after the next tick. Re-dispatching is what lets the\n * menu open on the correct anchor for both mouse and keyboard\n * interactions, matching the behaviour of the old sidebar.\n */\n const openMenu = async (event: MouseEvent | KeyboardEvent, item: TraversedEntry) => {\n if (menuTarget.value?.showMenu) {\n return\n }\n\n const el = event.currentTarget as HTMLElement\n menuTarget.value = { item, el, showMenu: true }\n\n await nextTick()\n\n const cloned =\n event instanceof MouseEvent ? new MouseEvent(event.type, event) : new KeyboardEvent(event.type, event)\n\n menuTarget.value?.el.dispatchEvent(cloned)\n }\n\n /**\n * Close the dropdown without resetting its target so exit animations can\n * still play out. The target is cleared on the next `handleDelete` or\n * `openMenu` call.\n */\n const closeMenu = () => {\n if (menuTarget.value) {\n menuTarget.value.showMenu = false\n }\n }\n\n /**\n * Fire the correct `*:delete:*` event on the workspace event bus for the\n * active menu target, then hide the confirmation modal and clear the\n * menu. Silent no-op if the target cannot be resolved to a parent\n * document (or parent operation, for examples).\n */\n const handleDelete = () => {\n const item = menuTarget.value?.item\n\n if (!item) {\n return\n }\n\n const result = sidebarState.getEntryById(item.id)\n const document = getParentEntry('document', result)\n const operation = getParentEntry('operation', result)\n\n if (!document) {\n return\n }\n\n if (item.type === 'document') {\n eventBus.emit('document:delete:document', { name: document.name })\n } else if (item.type === 'tag') {\n eventBus.emit('tag:delete:tag', {\n documentName: document.name,\n name: item.name,\n })\n } else if (item.type === 'operation') {\n eventBus.emit('operation:delete:operation', {\n meta: { method: item.method, path: item.path },\n documentName: document.name,\n })\n } else if (item.type === 'example') {\n if (!operation) {\n return\n }\n eventBus.emit('operation:delete:example', {\n meta: {\n method: operation.method,\n path: operation.path,\n exampleKey: item.name,\n },\n documentName: document.name,\n })\n }\n\n deleteModalState.hide()\n menuTarget.value = null\n }\n\n return {\n menuTarget,\n deleteModalState,\n deleteMessage,\n openMenu,\n closeMenu,\n handleDelete,\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAwCA,IAAa,yBAAyB,EACpC,UACA,mBAII;CACJ,MAAM,aAAa,IAAuB,KAAK;CAC/C,MAAM,mBAAmB,UAAU;CAEnC,MAAM,gBAAgB,eAAe;EACnC,MAAM,OAAO,WAAW,OAAO;AAE/B,MAAI,MAAM,SAAS,WACjB,QAAO;AAGT,SAAO,wCAAwC,MAAM,QAAQ,OAAO;GACpE;;;;;;;CAQF,MAAM,WAAW,OAAO,OAAmC,SAAyB;AAClF,MAAI,WAAW,OAAO,SACpB;AAIF,aAAW,QAAQ;GAAE;GAAM,IADhB,MAAM;GACc,UAAU;GAAM;AAE/C,QAAM,UAAU;EAEhB,MAAM,SACJ,iBAAiB,aAAa,IAAI,WAAW,MAAM,MAAM,MAAM,GAAG,IAAI,cAAc,MAAM,MAAM,MAAM;AAExG,aAAW,OAAO,GAAG,cAAc,OAAO;;;;;;;CAQ5C,MAAM,kBAAkB;AACtB,MAAI,WAAW,MACb,YAAW,MAAM,WAAW;;;;;;;;CAUhC,MAAM,qBAAqB;EACzB,MAAM,OAAO,WAAW,OAAO;AAE/B,MAAI,CAAC,KACH;EAGF,MAAM,SAAS,aAAa,aAAa,KAAK,GAAG;EACjD,MAAM,WAAW,eAAe,YAAY,OAAO;EACnD,MAAM,YAAY,eAAe,aAAa,OAAO;AAErD,MAAI,CAAC,SACH;AAGF,MAAI,KAAK,SAAS,WAChB,UAAS,KAAK,4BAA4B,EAAE,MAAM,SAAS,MAAM,CAAC;WACzD,KAAK,SAAS,MACvB,UAAS,KAAK,kBAAkB;GAC9B,cAAc,SAAS;GACvB,MAAM,KAAK;GACZ,CAAC;WACO,KAAK,SAAS,YACvB,UAAS,KAAK,8BAA8B;GAC1C,MAAM;IAAE,QAAQ,KAAK;IAAQ,MAAM,KAAK;IAAM;GAC9C,cAAc,SAAS;GACxB,CAAC;WACO,KAAK,SAAS,WAAW;AAClC,OAAI,CAAC,UACH;AAEF,YAAS,KAAK,4BAA4B;IACxC,MAAM;KACJ,QAAQ,UAAU;KAClB,MAAM,UAAU;KAChB,YAAY,KAAK;KAClB;IACD,cAAc,SAAS;IACxB,CAAC;;AAGJ,mBAAiB,MAAM;AACvB,aAAW,QAAQ;;AAGrB,QAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACD"}
@@ -0,0 +1,95 @@
1
+ import type { AppState } from '@scalar/api-client/v2/features/app';
2
+ import type { TraversedDocument } from '@scalar/workspace-store/schemas/navigation';
3
+ import { type MaybeRefOrGetter } from 'vue';
4
+ /**
5
+ * A single "version" of a document grouped under a registry namespace + slug.
6
+ * Only used on team workspaces, where multiple local documents may share the
7
+ * same registry coordinates.
8
+ */
9
+ export type SidebarDocumentVersion = {
10
+ /** Stable key, matches the workspace document name */
11
+ key: string;
12
+ /** User facing label for the version */
13
+ title: string;
14
+ /** Name of the document inside the workspace store */
15
+ documentName: string;
16
+ /** Traversal tree for the document (if it has been loaded) */
17
+ navigation?: TraversedDocument;
18
+ };
19
+ /**
20
+ * A unified item for the top-level of our sidebar.
21
+ *
22
+ * It can represent one of three things:
23
+ * - A workspace document that only exists locally (no registry link)
24
+ * - A workspace document that was imported from the registry
25
+ * - A registry document that has not yet been imported into the store
26
+ */
27
+ export type SidebarDocumentItem = {
28
+ /** Stable key used for sidebar state keyed by `namespace/slug` or document name */
29
+ key: string;
30
+ /** User facing title of the document */
31
+ title: string;
32
+ /** Name of the document inside the workspace store (if loaded) */
33
+ documentName?: string;
34
+ /** Registry metadata if available */
35
+ registry?: {
36
+ namespace: string;
37
+ slug: string;
38
+ };
39
+ /**
40
+ * Traversal tree for the document if it has been loaded in the workspace store.
41
+ * When `undefined` the document still needs to be fetched from the registry
42
+ * before its nested content can be shown.
43
+ */
44
+ navigation?: TraversedDocument;
45
+ /** Whether the document is pinned (todo: derived from `x-scalar-pinned`) */
46
+ isPinned?: boolean;
47
+ /**
48
+ * TODO: implement versioning logic
49
+ * Other loaded documents that share this item's `namespace + slug`. Only
50
+ * populated on team workspaces where we collapse duplicates into a single
51
+ * entry with multiple versions.
52
+ */
53
+ versions?: SidebarDocumentVersion[];
54
+ };
55
+ export type RegistryDocument = {
56
+ namespace: string;
57
+ slug: string;
58
+ title: string;
59
+ };
60
+ /**
61
+ * Loading-aware wrapper for the registry documents prop.
62
+ *
63
+ * The sidebar uses the `status` to decide whether to render skeleton
64
+ * placeholders while the registry is being fetched. `documents` is optional
65
+ * during loading so callers can either render nothing or stream in cached
66
+ * results while a refresh is still in flight.
67
+ */
68
+ export type RegistryDocumentsState = {
69
+ status: 'loading';
70
+ documents?: RegistryDocument[];
71
+ } | {
72
+ status: 'success';
73
+ documents: RegistryDocument[];
74
+ };
75
+ /**
76
+ * Builds a unified list of sidebar documents.
77
+ *
78
+ * Behavior:
79
+ * - Local workspaces (`teamUid === 'local'`) only show workspace documents.
80
+ * Registry documents are not considered at all.
81
+ * - Team workspaces group workspace documents by `namespace + slug` from
82
+ * `x-scalar-registry-meta`. Each unique registry coordinate produces a
83
+ * single sidebar entry whose additional matches are exposed as `versions`.
84
+ * Registry documents that have no loaded match are appended as entries
85
+ * waiting to be fetched.
86
+ */
87
+ export declare function useSidebarDocuments({ app, managedDocs, }: {
88
+ app: AppState;
89
+ managedDocs: MaybeRefOrGetter<RegistryDocument[]>;
90
+ }): {
91
+ documents: import("vue").ComputedRef<SidebarDocumentItem[]>;
92
+ pinned: import("vue").ComputedRef<SidebarDocumentItem[]>;
93
+ rest: import("vue").ComputedRef<SidebarDocumentItem[]>;
94
+ };
95
+ //# sourceMappingURL=use-sidebar-documents.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-sidebar-documents.d.ts","sourceRoot":"","sources":["../../../../../src/v2/features/app/hooks/use-sidebar-documents.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAA;AAClE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,4CAA4C,CAAA;AACnF,OAAO,EAAE,KAAK,gBAAgB,EAAqB,MAAM,KAAK,CAAA;AAE9D;;;;GAIG;AACH,MAAM,MAAM,sBAAsB,GAAG;IACnC,sDAAsD;IACtD,GAAG,EAAE,MAAM,CAAA;IACX,wCAAwC;IACxC,KAAK,EAAE,MAAM,CAAA;IACb,sDAAsD;IACtD,YAAY,EAAE,MAAM,CAAA;IACpB,8DAA8D;IAC9D,UAAU,CAAC,EAAE,iBAAiB,CAAA;CAC/B,CAAA;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,mBAAmB,GAAG;IAChC,mFAAmF;IACnF,GAAG,EAAE,MAAM,CAAA;IACX,wCAAwC;IACxC,KAAK,EAAE,MAAM,CAAA;IACb,kEAAkE;IAClE,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,qCAAqC;IACrC,QAAQ,CAAC,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;IAC9C;;;;OAIG;IACH,UAAU,CAAC,EAAE,iBAAiB,CAAA;IAC9B,4EAA4E;IAC5E,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,sBAAsB,EAAE,CAAA;CACpC,CAAA;AAID,MAAM,MAAM,gBAAgB,GAAG;IAC7B,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,sBAAsB,GAC9B;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,SAAS,CAAC,EAAE,gBAAgB,EAAE,CAAA;CAAE,GACrD;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,SAAS,EAAE,gBAAgB,EAAE,CAAA;CAAE,CAAA;AAIxD;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CAAC,EAClC,GAAG,EACH,WAAW,GACZ,EAAE;IACD,GAAG,EAAE,QAAQ,CAAA;IACb,WAAW,EAAE,gBAAgB,CAAC,gBAAgB,EAAE,CAAC,CAAA;CAClD;;;;EA+GA"}
@@ -0,0 +1,97 @@
1
+ import { computed, toValue } from "vue";
2
+ //#region src/v2/features/app/hooks/use-sidebar-documents.ts
3
+ var registryKey = (namespace, slug) => `@${namespace}/${slug}`;
4
+ /**
5
+ * Builds a unified list of sidebar documents.
6
+ *
7
+ * Behavior:
8
+ * - Local workspaces (`teamUid === 'local'`) only show workspace documents.
9
+ * Registry documents are not considered at all.
10
+ * - Team workspaces group workspace documents by `namespace + slug` from
11
+ * `x-scalar-registry-meta`. Each unique registry coordinate produces a
12
+ * single sidebar entry whose additional matches are exposed as `versions`.
13
+ * Registry documents that have no loaded match are appended as entries
14
+ * waiting to be fetched.
15
+ */
16
+ function useSidebarDocuments({ app, managedDocs }) {
17
+ const isTeamWorkspace = app.workspace.isTeamWorkspace;
18
+ /** Raw workspace documents mapped to sidebar entries (pre-grouping). */
19
+ const workspaceEntries = computed(() => {
20
+ const store = app.store.value;
21
+ if (!store) return [];
22
+ return Object.entries(store.workspace.documents).map(([name, doc]) => {
23
+ const registry = doc?.["x-scalar-registry-meta"];
24
+ const navigation = doc?.["x-scalar-navigation"];
25
+ const title = navigation?.title || doc?.info?.title || "Untitled";
26
+ const isTeam = isTeamWorkspace.value;
27
+ return {
28
+ key: isTeam && registry ? registryKey(registry.namespace, registry.slug) : name,
29
+ title,
30
+ documentName: name,
31
+ registry: isTeam && registry ? {
32
+ namespace: registry.namespace,
33
+ slug: registry.slug
34
+ } : void 0,
35
+ navigation,
36
+ isPinned: false
37
+ };
38
+ });
39
+ });
40
+ const documents = computed(() => {
41
+ if (!isTeamWorkspace.value) return workspaceEntries.value;
42
+ const activeDocumentSlug = app.activeEntities.documentSlug.value;
43
+ const groups = /* @__PURE__ */ new Map();
44
+ const standalone = [];
45
+ for (const entry of workspaceEntries.value) {
46
+ if (!entry.registry) {
47
+ standalone.push(entry);
48
+ continue;
49
+ }
50
+ const key = registryKey(entry.registry.namespace, entry.registry.slug);
51
+ const bucket = groups.get(key);
52
+ if (bucket) bucket.push(entry);
53
+ else groups.set(key, [entry]);
54
+ }
55
+ const grouped = [];
56
+ for (const [, entries] of groups) {
57
+ const activeIndex = entries.findIndex((e) => e.documentName === activeDocumentSlug);
58
+ const primaryIndex = activeIndex === -1 ? 0 : activeIndex;
59
+ const primary = entries[primaryIndex];
60
+ if (!primary) continue;
61
+ const versions = entries.filter((_, i) => i !== primaryIndex).map((e) => ({
62
+ key: e.documentName,
63
+ title: e.title,
64
+ documentName: e.documentName,
65
+ navigation: e.navigation
66
+ }));
67
+ grouped.push({
68
+ ...primary,
69
+ isPinned: entries.some((e) => e.isPinned),
70
+ versions: versions.length ? versions : void 0
71
+ });
72
+ }
73
+ const loadedKeys = new Set(groups.keys());
74
+ const registryOnly = toValue(managedDocs).filter((doc) => !loadedKeys.has(registryKey(doc.namespace, doc.slug))).map((doc) => ({
75
+ key: registryKey(doc.namespace, doc.slug),
76
+ title: doc.title || doc.slug,
77
+ registry: {
78
+ namespace: doc.namespace,
79
+ slug: doc.slug
80
+ }
81
+ }));
82
+ return [
83
+ ...grouped,
84
+ ...registryOnly,
85
+ ...standalone
86
+ ];
87
+ });
88
+ return {
89
+ documents,
90
+ pinned: computed(() => documents.value.filter((d) => d.isPinned)),
91
+ rest: computed(() => documents.value.filter((d) => !d.isPinned))
92
+ };
93
+ }
94
+ //#endregion
95
+ export { useSidebarDocuments };
96
+
97
+ //# sourceMappingURL=use-sidebar-documents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-sidebar-documents.js","names":[],"sources":["../../../../../src/v2/features/app/hooks/use-sidebar-documents.ts"],"sourcesContent":["import type { AppState } from '@scalar/api-client/v2/features/app'\nimport type { TraversedDocument } from '@scalar/workspace-store/schemas/navigation'\nimport { type MaybeRefOrGetter, computed, toValue } from 'vue'\n\n/**\n * A single \"version\" of a document grouped under a registry namespace + slug.\n * Only used on team workspaces, where multiple local documents may share the\n * same registry coordinates.\n */\nexport type SidebarDocumentVersion = {\n /** Stable key, matches the workspace document name */\n key: string\n /** User facing label for the version */\n title: string\n /** Name of the document inside the workspace store */\n documentName: string\n /** Traversal tree for the document (if it has been loaded) */\n navigation?: TraversedDocument\n}\n\n/**\n * A unified item for the top-level of our sidebar.\n *\n * It can represent one of three things:\n * - A workspace document that only exists locally (no registry link)\n * - A workspace document that was imported from the registry\n * - A registry document that has not yet been imported into the store\n */\nexport type SidebarDocumentItem = {\n /** Stable key used for sidebar state keyed by `namespace/slug` or document name */\n key: string\n /** User facing title of the document */\n title: string\n /** Name of the document inside the workspace store (if loaded) */\n documentName?: string\n /** Registry metadata if available */\n registry?: { namespace: string; slug: string }\n /**\n * Traversal tree for the document if it has been loaded in the workspace store.\n * When `undefined` the document still needs to be fetched from the registry\n * before its nested content can be shown.\n */\n navigation?: TraversedDocument\n /** Whether the document is pinned (todo: derived from `x-scalar-pinned`) */\n isPinned?: boolean\n /**\n * TODO: implement versioning logic\n * Other loaded documents that share this item's `namespace + slug`. Only\n * populated on team workspaces where we collapse duplicates into a single\n * entry with multiple versions.\n */\n versions?: SidebarDocumentVersion[]\n}\n\ntype WorkspaceDocumentEntry = SidebarDocumentItem & { documentName: string }\n\nexport type RegistryDocument = {\n namespace: string\n slug: string\n title: string\n}\n\n/**\n * Loading-aware wrapper for the registry documents prop.\n *\n * The sidebar uses the `status` to decide whether to render skeleton\n * placeholders while the registry is being fetched. `documents` is optional\n * during loading so callers can either render nothing or stream in cached\n * results while a refresh is still in flight.\n */\nexport type RegistryDocumentsState =\n | { status: 'loading'; documents?: RegistryDocument[] }\n | { status: 'success'; documents: RegistryDocument[] }\n\nconst registryKey = (namespace: string, slug: string) => `@${namespace}/${slug}`\n\n/**\n * Builds a unified list of sidebar documents.\n *\n * Behavior:\n * - Local workspaces (`teamUid === 'local'`) only show workspace documents.\n * Registry documents are not considered at all.\n * - Team workspaces group workspace documents by `namespace + slug` from\n * `x-scalar-registry-meta`. Each unique registry coordinate produces a\n * single sidebar entry whose additional matches are exposed as `versions`.\n * Registry documents that have no loaded match are appended as entries\n * waiting to be fetched.\n */\nexport function useSidebarDocuments({\n app,\n managedDocs,\n}: {\n app: AppState\n managedDocs: MaybeRefOrGetter<RegistryDocument[]>\n}) {\n const isTeamWorkspace = app.workspace.isTeamWorkspace\n\n /** Raw workspace documents mapped to sidebar entries (pre-grouping). */\n const workspaceEntries = computed<WorkspaceDocumentEntry[]>(() => {\n const store = app.store.value\n if (!store) {\n return []\n }\n\n return Object.entries(store.workspace.documents).map(([name, doc]) => {\n const registry = doc?.['x-scalar-registry-meta']\n const navigation = doc?.['x-scalar-navigation'] as TraversedDocument | undefined\n\n const title = navigation?.title || doc?.info?.title || 'Untitled'\n\n // On team workspaces we key by registry coordinates so entries with the\n // same `namespace/slug` can later be grouped into a single row with\n // versions. On local workspaces we always key by the workspace document\n // name, which is guaranteed to be unique because it is the map key in\n // `store.workspace.documents`. If we derived the key from registry meta\n // on local workspaces too, two documents sharing the same\n // `x-scalar-registry-meta` would produce duplicate Vue `:key`s in the\n // sidebar `v-for` and silently collide on re-render.\n const isTeam = isTeamWorkspace.value\n return {\n key: isTeam && registry ? registryKey(registry.namespace, registry.slug) : name,\n title,\n documentName: name,\n registry: isTeam && registry ? { namespace: registry.namespace, slug: registry.slug } : undefined,\n navigation,\n // TODO: we can implement this later\n isPinned: false,\n }\n })\n })\n const documents = computed<SidebarDocumentItem[]>(() => {\n // Local workspaces: show the workspace document list as-is, no registry\n // grouping and no registry document lookups.\n if (!isTeamWorkspace.value) {\n return workspaceEntries.value\n }\n\n const activeDocumentSlug = app.activeEntities.documentSlug.value\n\n // 1. Bucket workspace documents by their registry `namespace + slug`.\n // Documents without registry meta remain standalone entries.\n const groups = new Map<string, WorkspaceDocumentEntry[]>()\n const standalone: WorkspaceDocumentEntry[] = []\n\n for (const entry of workspaceEntries.value) {\n if (!entry.registry) {\n standalone.push(entry)\n continue\n }\n const key = registryKey(entry.registry.namespace, entry.registry.slug)\n const bucket = groups.get(key)\n if (bucket) {\n bucket.push(entry)\n } else {\n groups.set(key, [entry])\n }\n }\n\n // 2. Collapse each group into a single sidebar entry. The active document\n // is promoted to primary when possible so the visible entry matches\n // what is currently being viewed. The remaining documents in the\n // group become selectable versions.\n const grouped: SidebarDocumentItem[] = []\n for (const [, entries] of groups) {\n const activeIndex = entries.findIndex((e) => e.documentName === activeDocumentSlug)\n const primaryIndex = activeIndex === -1 ? 0 : activeIndex\n const primary = entries[primaryIndex]\n if (!primary) {\n continue\n }\n\n const versions = entries\n .filter((_, i) => i !== primaryIndex)\n .map<SidebarDocumentVersion>((e) => ({\n key: e.documentName,\n title: e.title,\n documentName: e.documentName,\n navigation: e.navigation,\n }))\n\n grouped.push({\n ...primary,\n isPinned: entries.some((e) => e.isPinned),\n versions: versions.length ? versions : undefined,\n })\n }\n\n // 3. Merge in registry documents that have no loaded counterpart yet.\n // They render as placeholders until the user clicks to fetch them.\n const loadedKeys = new Set(groups.keys())\n const registryOnly = toValue(managedDocs)\n .filter((doc) => !loadedKeys.has(registryKey(doc.namespace, doc.slug)))\n .map<SidebarDocumentItem>((doc) => ({\n key: registryKey(doc.namespace, doc.slug),\n title: doc.title || doc.slug,\n registry: { namespace: doc.namespace, slug: doc.slug },\n }))\n\n return [...grouped, ...registryOnly, ...standalone]\n })\n\n const pinned = computed(() => documents.value.filter((d) => d.isPinned))\n const rest = computed(() => documents.value.filter((d) => !d.isPinned))\n\n return { documents, pinned, rest }\n}\n"],"mappings":";;AA0EA,IAAM,eAAe,WAAmB,SAAiB,IAAI,UAAU,GAAG;;;;;;;;;;;;;AAc1E,SAAgB,oBAAoB,EAClC,KACA,eAIC;CACD,MAAM,kBAAkB,IAAI,UAAU;;CAGtC,MAAM,mBAAmB,eAAyC;EAChE,MAAM,QAAQ,IAAI,MAAM;AACxB,MAAI,CAAC,MACH,QAAO,EAAE;AAGX,SAAO,OAAO,QAAQ,MAAM,UAAU,UAAU,CAAC,KAAK,CAAC,MAAM,SAAS;GACpE,MAAM,WAAW,MAAM;GACvB,MAAM,aAAa,MAAM;GAEzB,MAAM,QAAQ,YAAY,SAAS,KAAK,MAAM,SAAS;GAUvD,MAAM,SAAS,gBAAgB;AAC/B,UAAO;IACL,KAAK,UAAU,WAAW,YAAY,SAAS,WAAW,SAAS,KAAK,GAAG;IAC3E;IACA,cAAc;IACd,UAAU,UAAU,WAAW;KAAE,WAAW,SAAS;KAAW,MAAM,SAAS;KAAM,GAAG,KAAA;IACxF;IAEA,UAAU;IACX;IACD;GACF;CACF,MAAM,YAAY,eAAsC;AAGtD,MAAI,CAAC,gBAAgB,MACnB,QAAO,iBAAiB;EAG1B,MAAM,qBAAqB,IAAI,eAAe,aAAa;EAI3D,MAAM,yBAAS,IAAI,KAAuC;EAC1D,MAAM,aAAuC,EAAE;AAE/C,OAAK,MAAM,SAAS,iBAAiB,OAAO;AAC1C,OAAI,CAAC,MAAM,UAAU;AACnB,eAAW,KAAK,MAAM;AACtB;;GAEF,MAAM,MAAM,YAAY,MAAM,SAAS,WAAW,MAAM,SAAS,KAAK;GACtE,MAAM,SAAS,OAAO,IAAI,IAAI;AAC9B,OAAI,OACF,QAAO,KAAK,MAAM;OAElB,QAAO,IAAI,KAAK,CAAC,MAAM,CAAC;;EAQ5B,MAAM,UAAiC,EAAE;AACzC,OAAK,MAAM,GAAG,YAAY,QAAQ;GAChC,MAAM,cAAc,QAAQ,WAAW,MAAM,EAAE,iBAAiB,mBAAmB;GACnF,MAAM,eAAe,gBAAgB,KAAK,IAAI;GAC9C,MAAM,UAAU,QAAQ;AACxB,OAAI,CAAC,QACH;GAGF,MAAM,WAAW,QACd,QAAQ,GAAG,MAAM,MAAM,aAAa,CACpC,KAA6B,OAAO;IACnC,KAAK,EAAE;IACP,OAAO,EAAE;IACT,cAAc,EAAE;IAChB,YAAY,EAAE;IACf,EAAE;AAEL,WAAQ,KAAK;IACX,GAAG;IACH,UAAU,QAAQ,MAAM,MAAM,EAAE,SAAS;IACzC,UAAU,SAAS,SAAS,WAAW,KAAA;IACxC,CAAC;;EAKJ,MAAM,aAAa,IAAI,IAAI,OAAO,MAAM,CAAC;EACzC,MAAM,eAAe,QAAQ,YAAY,CACtC,QAAQ,QAAQ,CAAC,WAAW,IAAI,YAAY,IAAI,WAAW,IAAI,KAAK,CAAC,CAAC,CACtE,KAA0B,SAAS;GAClC,KAAK,YAAY,IAAI,WAAW,IAAI,KAAK;GACzC,OAAO,IAAI,SAAS,IAAI;GACxB,UAAU;IAAE,WAAW,IAAI;IAAW,MAAM,IAAI;IAAM;GACvD,EAAE;AAEL,SAAO;GAAC,GAAG;GAAS,GAAG;GAAc,GAAG;GAAW;GACnD;AAKF,QAAO;EAAE;EAAW,QAHL,eAAe,UAAU,MAAM,QAAQ,MAAM,EAAE,SAAS,CAAC;EAG5C,MAFf,eAAe,UAAU,MAAM,QAAQ,MAAM,CAAC,EAAE,SAAS,CAAC;EAErC"}
@@ -6,4 +6,5 @@ export type { ClientLayout } from '../../../v2/types/layout';
6
6
  export { type CommandPaletteAction, type CommandPaletteRoute, baseClientActions, baseRoutes, useCommandPaletteState, } from '../command-palette/hooks/use-command-palette-state.js';
7
7
  export { default as ClientApp } from './App.vue.js';
8
8
  export { createApiClientApp, createAppRouter } from './helpers/create-api-client-app.js';
9
+ export type { RegistryDocumentsState } from './hooks/use-sidebar-documents.js';
9
10
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/v2/features/app/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAA;AAC3E,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,uDAAuD,CAAA;AACvG,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,gEAAgE,CAAA;AAC7G,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,iEAAiE,CAAA;AAC/G,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAErD,OAAO,EACL,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACxB,iBAAiB,EACjB,UAAU,EACV,sBAAsB,GACvB,MAAM,oDAAoD,CAAA;AAC3D,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,WAAW,CAAA;AAChD,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/v2/features/app/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAA;AAC3E,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,uDAAuD,CAAA;AACvG,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,gEAAgE,CAAA;AAC7G,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,iEAAiE,CAAA;AAC/G,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAErD,OAAO,EACL,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACxB,iBAAiB,EACjB,UAAU,EACV,sBAAsB,GACvB,MAAM,oDAAoD,CAAA;AAC3D,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,WAAW,CAAA;AAChD,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAA;AACrF,YAAY,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAA"}
@@ -0,0 +1,13 @@
1
+ import type { RouteProps } from '../../../../v2/features/app/helpers/routes.js';
2
+ /**
3
+ * Workspace get started page.
4
+ *
5
+ * Shown as the landing view for a workspace with no request selected. Displays
6
+ * an ASCII art mark and a short list of keyboard shortcuts to help the user
7
+ * bootstrap their workspace (open the command palette, jump to settings, or
8
+ * focus the sidebar filter).
9
+ */
10
+ declare const _default: typeof __VLS_export;
11
+ export default _default;
12
+ declare const __VLS_export: import("vue").DefineComponent<RouteProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<RouteProps> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
13
+ //# sourceMappingURL=GetStarted.vue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GetStarted.vue.d.ts","sourceRoot":"","sources":["../../../../../src/v2/features/collection/components/GetStarted.vue"],"names":[],"mappings":"AA8GA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAA;AAGlE;;;;;;;GAOG;wBACkB,OAAO,YAAY;AAAxC,wBAAyC;AAGzC,QAAA,MAAM,YAAY,gSAwMd,CAAC"}
@@ -0,0 +1,7 @@
1
+ import GetStarted_vue_vue_type_script_setup_true_lang_default from "./GetStarted.vue.script.js";
2
+ //#region src/v2/features/collection/components/GetStarted.vue
3
+ var GetStarted_default = GetStarted_vue_vue_type_script_setup_true_lang_default;
4
+ //#endregion
5
+ export { GetStarted_default as default };
6
+
7
+ //# sourceMappingURL=GetStarted.vue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GetStarted.vue.js","names":[],"sources":["../../../../../src/v2/features/collection/components/GetStarted.vue"],"sourcesContent":["<script lang=\"ts\">\n/**\n * Workspace get started page.\n *\n * Shown as the landing view for a workspace with no request selected. Displays\n * an ASCII art mark and a short list of keyboard shortcuts to help the user\n * bootstrap their workspace (open the command palette, jump to settings, or\n * focus the sidebar filter).\n */\nexport default {}\n</script>\n\n<script setup lang=\"ts\">\nimport { ScalarHotkey } from '@scalar/components'\nimport { ScalarIconDownloadSimple } from '@scalar/icons'\n\nimport Computer from '@/assets/computer.ascii?raw'\nimport ScalarAsciiArt from '@/components/ScalarAsciiArt.vue'\nimport type { RouteProps } from '@/v2/features/app/helpers/routes'\n\nconst { eventBus, layout } = defineProps<RouteProps>()\n\nconst openCommandPalette = () => {\n eventBus.emit('ui:open:command-palette')\n}\n\n/**\n * Open the contextual settings page. Emits the same event as the Cmd/Ctrl+I\n * hotkey so the workspace sidebar handles it uniformly: workspace-level\n * settings from this \"Get started\" screen, document-level settings when the\n * user is viewing a specific document. No `KeyboardEvent` is attached here\n * because the trigger is a click.\n */\nconst openSettings = () => {\n eventBus.emit('ui:open:settings')\n}\n\n/**\n * Open the contextual search affordance. Emits the same event as the Cmd/Ctrl+J\n * hotkey so the workspace sidebar handles it uniformly: the document filter\n * toggles on the workspace page and the search modal opens inside a document.\n * No `KeyboardEvent` is attached here because the trigger is a click.\n */\nconst focusSearch = () => {\n eventBus.emit('ui:focus:search')\n}\n</script>\n\n<template>\n <div class=\"flex h-full w-full flex-col items-center justify-center p-6\">\n <div class=\"flex flex-col items-stretch gap-10\">\n <ScalarAsciiArt\n :art=\"Computer\"\n class=\"text-c-3 self-center\" />\n\n <div class=\"text-c-2 flex flex-col gap-3 text-sm\">\n <button\n class=\"hover:text-c-1 flex w-full items-center justify-between gap-8\"\n type=\"button\"\n @click=\"openCommandPalette\">\n <span>Get Started</span>\n <ScalarHotkey\n hotkey=\"K\"\n :modifier=\"['default']\" />\n </button>\n <button\n class=\"hover:text-c-1 flex w-full items-center justify-between gap-8\"\n type=\"button\"\n @click=\"openSettings\">\n <span>Settings</span>\n <ScalarHotkey\n hotkey=\"I\"\n :modifier=\"['default']\" />\n </button>\n <button\n class=\"hover:text-c-1 flex w-full items-center justify-between gap-8\"\n type=\"button\"\n @click=\"focusSearch\">\n <span>Filter</span>\n <ScalarHotkey\n hotkey=\"J\"\n :modifier=\"['default']\" />\n </button>\n <!--\n Browser-only nudge to install the desktop app. Hidden in the desktop\n and modal layouts because the user is already running the native app\n (or embedded in a host page).\n -->\n <a\n v-if=\"layout === 'web'\"\n class=\"text-c-2 hover:text-c-1 flex w-full items-center justify-between gap-8\"\n href=\"https://scalar.com/download?utm_source=web_client&utm_medium=download_button&utm_campaign=topnav\"\n target=\"_blank\">\n <span>Download App</span>\n <ScalarIconDownloadSimple\n class=\"size-3.5\"\n weight=\"bold\" />\n </a>\n </div>\n </div>\n </div>\n</template>\n"],"mappings":""}
@@ -0,0 +1,101 @@
1
+ import computer_default from "../../../../assets/computer.ascii.virtual.js";
2
+ import ScalarAsciiArt_default from "../../../../components/ScalarAsciiArt.vue.js";
3
+ import { createCommentVNode, createElementBlock, createElementVNode, createVNode, defineComponent, openBlock, unref } from "vue";
4
+ import { ScalarHotkey } from "@scalar/components";
5
+ import { ScalarIconDownloadSimple } from "@scalar/icons";
6
+ //#region src/v2/features/collection/components/GetStarted.vue?vue&type=script&setup=true&lang.ts
7
+ var _hoisted_1 = { class: "flex h-full w-full flex-col items-center justify-center p-6" };
8
+ var _hoisted_2 = { class: "flex flex-col items-stretch gap-10" };
9
+ var _hoisted_3 = { class: "text-c-2 flex flex-col gap-3 text-sm" };
10
+ var _hoisted_4 = {
11
+ key: 0,
12
+ class: "text-c-2 hover:text-c-1 flex w-full items-center justify-between gap-8",
13
+ href: "https://scalar.com/download?utm_source=web_client&utm_medium=download_button&utm_campaign=topnav",
14
+ target: "_blank"
15
+ };
16
+ var GetStarted_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
17
+ __name: "GetStarted",
18
+ props: {
19
+ documentSlug: {},
20
+ document: {},
21
+ eventBus: {},
22
+ layout: {},
23
+ path: {},
24
+ method: {},
25
+ exampleName: {},
26
+ environment: {},
27
+ workspaceStore: {},
28
+ activeWorkspace: {},
29
+ plugins: {},
30
+ customThemes: {},
31
+ currentTheme: {},
32
+ isDarkMode: { type: Boolean },
33
+ fetchRegistryDocument: { type: Function },
34
+ telemetry: { type: Boolean },
35
+ onUpdateTelemetry: { type: Function },
36
+ options: {}
37
+ },
38
+ setup(__props) {
39
+ const openCommandPalette = () => {
40
+ __props.eventBus.emit("ui:open:command-palette");
41
+ };
42
+ /**
43
+ * Open the contextual settings page. Emits the same event as the Cmd/Ctrl+I
44
+ * hotkey so the workspace sidebar handles it uniformly: workspace-level
45
+ * settings from this "Get started" screen, document-level settings when the
46
+ * user is viewing a specific document. No `KeyboardEvent` is attached here
47
+ * because the trigger is a click.
48
+ */
49
+ const openSettings = () => {
50
+ __props.eventBus.emit("ui:open:settings");
51
+ };
52
+ /**
53
+ * Open the contextual search affordance. Emits the same event as the Cmd/Ctrl+J
54
+ * hotkey so the workspace sidebar handles it uniformly: the document filter
55
+ * toggles on the workspace page and the search modal opens inside a document.
56
+ * No `KeyboardEvent` is attached here because the trigger is a click.
57
+ */
58
+ const focusSearch = () => {
59
+ __props.eventBus.emit("ui:focus:search");
60
+ };
61
+ return (_ctx, _cache) => {
62
+ return openBlock(), createElementBlock("div", _hoisted_1, [createElementVNode("div", _hoisted_2, [createVNode(ScalarAsciiArt_default, {
63
+ art: unref(computer_default),
64
+ class: "text-c-3 self-center"
65
+ }, null, 8, ["art"]), createElementVNode("div", _hoisted_3, [
66
+ createElementVNode("button", {
67
+ class: "hover:text-c-1 flex w-full items-center justify-between gap-8",
68
+ type: "button",
69
+ onClick: openCommandPalette
70
+ }, [_cache[0] || (_cache[0] = createElementVNode("span", null, "Get Started", -1)), createVNode(unref(ScalarHotkey), {
71
+ hotkey: "K",
72
+ modifier: ["default"]
73
+ })]),
74
+ createElementVNode("button", {
75
+ class: "hover:text-c-1 flex w-full items-center justify-between gap-8",
76
+ type: "button",
77
+ onClick: openSettings
78
+ }, [_cache[1] || (_cache[1] = createElementVNode("span", null, "Settings", -1)), createVNode(unref(ScalarHotkey), {
79
+ hotkey: "I",
80
+ modifier: ["default"]
81
+ })]),
82
+ createElementVNode("button", {
83
+ class: "hover:text-c-1 flex w-full items-center justify-between gap-8",
84
+ type: "button",
85
+ onClick: focusSearch
86
+ }, [_cache[2] || (_cache[2] = createElementVNode("span", null, "Filter", -1)), createVNode(unref(ScalarHotkey), {
87
+ hotkey: "J",
88
+ modifier: ["default"]
89
+ })]),
90
+ __props.layout === "web" ? (openBlock(), createElementBlock("a", _hoisted_4, [_cache[3] || (_cache[3] = createElementVNode("span", null, "Download App", -1)), createVNode(unref(ScalarIconDownloadSimple), {
91
+ class: "size-3.5",
92
+ weight: "bold"
93
+ })])) : createCommentVNode("", true)
94
+ ])])]);
95
+ };
96
+ }
97
+ });
98
+ //#endregion
99
+ export { GetStarted_vue_vue_type_script_setup_true_lang_default as default };
100
+
101
+ //# sourceMappingURL=GetStarted.vue.script.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GetStarted.vue.script.js","names":[],"sources":["../../../../../src/v2/features/collection/components/GetStarted.vue"],"sourcesContent":["<script lang=\"ts\">\n/**\n * Workspace get started page.\n *\n * Shown as the landing view for a workspace with no request selected. Displays\n * an ASCII art mark and a short list of keyboard shortcuts to help the user\n * bootstrap their workspace (open the command palette, jump to settings, or\n * focus the sidebar filter).\n */\nexport default {}\n</script>\n\n<script setup lang=\"ts\">\nimport { ScalarHotkey } from '@scalar/components'\nimport { ScalarIconDownloadSimple } from '@scalar/icons'\n\nimport Computer from '@/assets/computer.ascii?raw'\nimport ScalarAsciiArt from '@/components/ScalarAsciiArt.vue'\nimport type { RouteProps } from '@/v2/features/app/helpers/routes'\n\nconst { eventBus, layout } = defineProps<RouteProps>()\n\nconst openCommandPalette = () => {\n eventBus.emit('ui:open:command-palette')\n}\n\n/**\n * Open the contextual settings page. Emits the same event as the Cmd/Ctrl+I\n * hotkey so the workspace sidebar handles it uniformly: workspace-level\n * settings from this \"Get started\" screen, document-level settings when the\n * user is viewing a specific document. No `KeyboardEvent` is attached here\n * because the trigger is a click.\n */\nconst openSettings = () => {\n eventBus.emit('ui:open:settings')\n}\n\n/**\n * Open the contextual search affordance. Emits the same event as the Cmd/Ctrl+J\n * hotkey so the workspace sidebar handles it uniformly: the document filter\n * toggles on the workspace page and the search modal opens inside a document.\n * No `KeyboardEvent` is attached here because the trigger is a click.\n */\nconst focusSearch = () => {\n eventBus.emit('ui:focus:search')\n}\n</script>\n\n<template>\n <div class=\"flex h-full w-full flex-col items-center justify-center p-6\">\n <div class=\"flex flex-col items-stretch gap-10\">\n <ScalarAsciiArt\n :art=\"Computer\"\n class=\"text-c-3 self-center\" />\n\n <div class=\"text-c-2 flex flex-col gap-3 text-sm\">\n <button\n class=\"hover:text-c-1 flex w-full items-center justify-between gap-8\"\n type=\"button\"\n @click=\"openCommandPalette\">\n <span>Get Started</span>\n <ScalarHotkey\n hotkey=\"K\"\n :modifier=\"['default']\" />\n </button>\n <button\n class=\"hover:text-c-1 flex w-full items-center justify-between gap-8\"\n type=\"button\"\n @click=\"openSettings\">\n <span>Settings</span>\n <ScalarHotkey\n hotkey=\"I\"\n :modifier=\"['default']\" />\n </button>\n <button\n class=\"hover:text-c-1 flex w-full items-center justify-between gap-8\"\n type=\"button\"\n @click=\"focusSearch\">\n <span>Filter</span>\n <ScalarHotkey\n hotkey=\"J\"\n :modifier=\"['default']\" />\n </button>\n <!--\n Browser-only nudge to install the desktop app. Hidden in the desktop\n and modal layouts because the user is already running the native app\n (or embedded in a host page).\n -->\n <a\n v-if=\"layout === 'web'\"\n class=\"text-c-2 hover:text-c-1 flex w-full items-center justify-between gap-8\"\n href=\"https://scalar.com/download?utm_source=web_client&utm_medium=download_button&utm_campaign=topnav\"\n target=\"_blank\">\n <span>Download App</span>\n <ScalarIconDownloadSimple\n class=\"size-3.5\"\n weight=\"bold\" />\n </a>\n </div>\n </div>\n </div>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAsBA,MAAM,2BAA2B;AAC/B,WAAA,SAAS,KAAK,0BAAyB;;;;;;;;;EAUzC,MAAM,qBAAqB;AACzB,WAAA,SAAS,KAAK,mBAAkB;;;;;;;;EASlC,MAAM,oBAAoB;AACxB,WAAA,SAAS,KAAK,kBAAiB;;;uBAK/B,mBAmDM,OAnDN,YAmDM,CAlDJ,mBAiDM,OAjDN,YAiDM,CAhDJ,YAEiC,wBAAA;IAD9B,KAAK,MAAA,iBAAQ;IACd,OAAM;yBAER,mBA2CM,OA3CN,YA2CM;IA1CJ,mBAQS,UAAA;KAPP,OAAM;KACN,MAAK;KACJ,SAAO;kCACR,mBAAwB,QAAA,MAAlB,eAAW,GAAA,GACjB,YAE4B,MAAA,aAAA,EAAA;KAD1B,QAAO;KACN,UAAU,CAAA,UAAW;;IAE1B,mBAQS,UAAA;KAPP,OAAM;KACN,MAAK;KACJ,SAAO;kCACR,mBAAqB,QAAA,MAAf,YAAQ,GAAA,GACd,YAE4B,MAAA,aAAA,EAAA;KAD1B,QAAO;KACN,UAAU,CAAA,UAAW;;IAE1B,mBAQS,UAAA;KAPP,OAAM;KACN,MAAK;KACJ,SAAO;kCACR,mBAAmB,QAAA,MAAb,UAAM,GAAA,GACZ,YAE4B,MAAA,aAAA,EAAA;KAD1B,QAAO;KACN,UAAU,CAAA,UAAW;;IAQlB,QAAA,WAAM,SAAA,WAAA,EADd,mBASI,KATJ,YASI,CAAA,OAAA,OAAA,OAAA,KAJF,mBAAyB,QAAA,MAAnB,gBAAY,GAAA,GAClB,YAEkB,MAAA,yBAAA,EAAA;KADhB,OAAM;KACN,QAAO"}
@@ -7,6 +7,10 @@
7
7
  * The function will retry up to 100 times to find a unique slug. If all attempts fail,
8
8
  * it returns null, which should be handled as an import error.
9
9
  *
10
+ * When the input is missing or contains only whitespace, it falls back to
11
+ * `'default'` so the workspace store never ends up with a document keyed by an
12
+ * empty string (for example, when a registry document has no `info.title`).
13
+ *
10
14
  * @param defaultValue - The original document title to base the slug on
11
15
  * @param currentDocuments - Set of existing document slugs to check against
12
16
  *
@@ -1 +1 @@
1
- {"version":3,"file":"generate-unique-slug.d.ts","sourceRoot":"","sources":["../../../../../src/v2/features/command-palette/helpers/generate-unique-slug.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,kBAAkB,GAAU,cAAc,MAAM,GAAG,SAAS,EAAE,kBAAkB,GAAG,CAAC,MAAM,CAAC,gCAOvG,CAAA"}
1
+ {"version":3,"file":"generate-unique-slug.d.ts","sourceRoot":"","sources":["../../../../../src/v2/features/command-palette/helpers/generate-unique-slug.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,kBAAkB,GAAU,cAAc,MAAM,GAAG,SAAS,EAAE,kBAAkB,GAAG,CAAC,MAAM,CAAC,gCASvG,CAAA"}
@@ -10,6 +10,10 @@ import { generateUniqueValue } from "@scalar/workspace-store/helpers/generate-un
10
10
  * The function will retry up to 100 times to find a unique slug. If all attempts fail,
11
11
  * it returns null, which should be handled as an import error.
12
12
  *
13
+ * When the input is missing or contains only whitespace, it falls back to
14
+ * `'default'` so the workspace store never ends up with a document keyed by an
15
+ * empty string (for example, when a registry document has no `info.title`).
16
+ *
13
17
  * @param defaultValue - The original document title to base the slug on
14
18
  * @param currentDocuments - Set of existing document slugs to check against
15
19
  *
@@ -17,7 +21,7 @@ import { generateUniqueValue } from "@scalar/workspace-store/helpers/generate-un
17
21
  */
18
22
  var generateUniqueSlug = async (defaultValue, currentDocuments) => {
19
23
  return await generateUniqueValue({
20
- defaultValue: defaultValue ?? "default",
24
+ defaultValue: defaultValue?.trim() || "default",
21
25
  validation: (value) => !currentDocuments.has(value),
22
26
  maxRetries: 100,
23
27
  transformation: slugify
@@ -1 +1 @@
1
- {"version":3,"file":"generate-unique-slug.js","names":[],"sources":["../../../../../src/v2/features/command-palette/helpers/generate-unique-slug.ts"],"sourcesContent":["import { generateUniqueValue } from '@scalar/workspace-store/helpers/generate-unique-value'\n\nimport { slugify } from '@/v2/helpers/slugify'\n\n/**\n * Generates a unique slug for an imported document based on its title.\n *\n * This ensures the imported document does not conflict with existing documents\n * by appending a number suffix if necessary (e.g., \"my-api\", \"my-api-1\", \"my-api-2\").\n *\n * The function will retry up to 100 times to find a unique slug. If all attempts fail,\n * it returns null, which should be handled as an import error.\n *\n * @param defaultValue - The original document title to base the slug on\n * @param currentDocuments - Set of existing document slugs to check against\n *\n * @returns Promise resolving to a unique slug, or null if unable to generate one\n */\nexport const generateUniqueSlug = async (defaultValue: string | undefined, currentDocuments: Set<string>) => {\n return await generateUniqueValue({\n defaultValue: defaultValue ?? 'default',\n validation: (value) => !currentDocuments.has(value),\n maxRetries: 100,\n transformation: slugify,\n })\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAkBA,IAAa,qBAAqB,OAAO,cAAkC,qBAAkC;AAC3G,QAAO,MAAM,oBAAoB;EAC/B,cAAc,gBAAgB;EAC9B,aAAa,UAAU,CAAC,iBAAiB,IAAI,MAAM;EACnD,YAAY;EACZ,gBAAgB;EACjB,CAAC"}
1
+ {"version":3,"file":"generate-unique-slug.js","names":[],"sources":["../../../../../src/v2/features/command-palette/helpers/generate-unique-slug.ts"],"sourcesContent":["import { generateUniqueValue } from '@scalar/workspace-store/helpers/generate-unique-value'\n\nimport { slugify } from '@/v2/helpers/slugify'\n\n/**\n * Generates a unique slug for an imported document based on its title.\n *\n * This ensures the imported document does not conflict with existing documents\n * by appending a number suffix if necessary (e.g., \"my-api\", \"my-api-1\", \"my-api-2\").\n *\n * The function will retry up to 100 times to find a unique slug. If all attempts fail,\n * it returns null, which should be handled as an import error.\n *\n * When the input is missing or contains only whitespace, it falls back to\n * `'default'` so the workspace store never ends up with a document keyed by an\n * empty string (for example, when a registry document has no `info.title`).\n *\n * @param defaultValue - The original document title to base the slug on\n * @param currentDocuments - Set of existing document slugs to check against\n *\n * @returns Promise resolving to a unique slug, or null if unable to generate one\n */\nexport const generateUniqueSlug = async (defaultValue: string | undefined, currentDocuments: Set<string>) => {\n const base = defaultValue?.trim() || 'default'\n\n return await generateUniqueValue({\n defaultValue: base,\n validation: (value) => !currentDocuments.has(value),\n maxRetries: 100,\n transformation: slugify,\n })\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAsBA,IAAa,qBAAqB,OAAO,cAAkC,qBAAkC;AAG3G,QAAO,MAAM,oBAAoB;EAC/B,cAHW,cAAc,MAAM,IAAI;EAInC,aAAa,UAAU,CAAC,iBAAiB,IAAI,MAAM;EACnD,YAAY;EACZ,gBAAgB;EACjB,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { type ModalState } from '@scalar/components';
2
+ import type { OpenApiDocument } from '@scalar/workspace-store/schemas/v3.1/strict/openapi-document';
3
+ type __VLS_Props = {
4
+ /** Controls the visibility of the search modal. */
5
+ modalState: ModalState;
6
+ /** The document whose entries should be searched. */
7
+ document: OpenApiDocument | undefined;
8
+ };
9
+ declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
10
+ select: (id: string) => any;
11
+ }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
12
+ onSelect?: ((id: string) => any) | undefined;
13
+ }>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
14
+ declare const _default: typeof __VLS_export;
15
+ export default _default;
16
+ //# sourceMappingURL=DocumentSearchModal.vue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DocumentSearchModal.vue.d.ts","sourceRoot":"","sources":["../../../../../src/v2/features/search/components/DocumentSearchModal.vue"],"names":[],"mappings":"AA4JA,OAAO,EAIL,KAAK,UAAU,EAChB,MAAM,oBAAoB,CAAA;AAC3B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8DAA8D,CAAA;AAQnG,KAAK,WAAW,GAAG;IACjB,mDAAmD;IACnD,UAAU,EAAE,UAAU,CAAA;IACtB,qDAAqD;IACrD,QAAQ,EAAE,eAAe,GAAG,SAAS,CAAA;CACtC,CAAC;AAgQF,QAAA,MAAM,YAAY;;;;kFAGhB,CAAC;wBACkB,OAAO,YAAY;AAAxC,wBAAyC"}