@scalar/api-reference 1.58.0 → 1.59.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 (332) hide show
  1. package/CHANGELOG.md +75 -0
  2. package/dist/blocks/index.d.ts +1 -0
  3. package/dist/blocks/index.d.ts.map +1 -1
  4. package/dist/blocks/index.js +2 -1
  5. package/dist/blocks/scalar-asyncapi-server-selector-block/components/AsyncApiServerSelector.vue.d.ts +24 -0
  6. package/dist/blocks/scalar-asyncapi-server-selector-block/components/AsyncApiServerSelector.vue.d.ts.map +1 -0
  7. package/dist/blocks/scalar-asyncapi-server-selector-block/components/AsyncApiServerSelector.vue.js +7 -0
  8. package/dist/blocks/scalar-asyncapi-server-selector-block/components/AsyncApiServerSelector.vue.js.map +1 -0
  9. package/dist/blocks/scalar-asyncapi-server-selector-block/components/AsyncApiServerSelector.vue.script.js +80 -0
  10. package/dist/blocks/scalar-asyncapi-server-selector-block/components/AsyncApiServerSelector.vue.script.js.map +1 -0
  11. package/dist/blocks/scalar-asyncapi-server-selector-block/components/Selector.vue.d.ts +25 -0
  12. package/dist/blocks/scalar-asyncapi-server-selector-block/components/Selector.vue.d.ts.map +1 -0
  13. package/dist/blocks/scalar-asyncapi-server-selector-block/components/Selector.vue.js +7 -0
  14. package/dist/blocks/scalar-asyncapi-server-selector-block/components/Selector.vue.js.map +1 -0
  15. package/dist/blocks/scalar-asyncapi-server-selector-block/components/Selector.vue.script.js +76 -0
  16. package/dist/blocks/scalar-asyncapi-server-selector-block/components/Selector.vue.script.js.map +1 -0
  17. package/dist/blocks/scalar-asyncapi-server-selector-block/index.d.ts +2 -0
  18. package/dist/blocks/scalar-asyncapi-server-selector-block/index.d.ts.map +1 -0
  19. package/dist/blocks/scalar-client-selector-block/components/ClientDropdown.vue.d.ts +2 -3
  20. package/dist/blocks/scalar-client-selector-block/components/ClientDropdown.vue.d.ts.map +1 -1
  21. package/dist/blocks/scalar-client-selector-block/components/ClientDropdown.vue.js +1 -1
  22. package/dist/blocks/scalar-client-selector-block/components/ClientDropdown.vue.js.map +1 -1
  23. package/dist/blocks/scalar-client-selector-block/components/ClientDropdown.vue.script.js.map +1 -1
  24. package/dist/blocks/scalar-client-selector-block/components/ClientSelector.vue.d.ts +2 -6
  25. package/dist/blocks/scalar-client-selector-block/components/ClientSelector.vue.d.ts.map +1 -1
  26. package/dist/blocks/scalar-client-selector-block/components/ClientSelector.vue.js +1 -1
  27. package/dist/blocks/scalar-client-selector-block/components/ClientSelector.vue.js.map +1 -1
  28. package/dist/blocks/scalar-client-selector-block/components/ClientSelector.vue.script.js +26 -36
  29. package/dist/blocks/scalar-client-selector-block/components/ClientSelector.vue.script.js.map +1 -1
  30. package/dist/blocks/scalar-client-selector-block/helpers/featured-clients.d.ts +1 -1
  31. package/dist/blocks/scalar-client-selector-block/helpers/featured-clients.d.ts.map +1 -1
  32. package/dist/blocks/scalar-client-selector-block/helpers/featured-clients.js.map +1 -1
  33. package/dist/blocks/scalar-sdk-installation-instructions/components/SdkInstallationInstructions.vue.d.ts +9 -0
  34. package/dist/blocks/scalar-sdk-installation-instructions/components/SdkInstallationInstructions.vue.d.ts.map +1 -0
  35. package/dist/blocks/scalar-sdk-installation-instructions/components/SdkInstallationInstructions.vue.js +9 -0
  36. package/dist/blocks/scalar-sdk-installation-instructions/components/SdkInstallationInstructions.vue.js.map +1 -0
  37. package/dist/blocks/scalar-sdk-installation-instructions/components/SdkInstallationInstructions.vue.script.js +225 -0
  38. package/dist/blocks/scalar-sdk-installation-instructions/components/SdkInstallationInstructions.vue.script.js.map +1 -0
  39. package/dist/blocks/scalar-sdk-installation-instructions/helpers/language-icon.d.ts +4 -0
  40. package/dist/blocks/scalar-sdk-installation-instructions/helpers/language-icon.d.ts.map +1 -0
  41. package/dist/blocks/scalar-sdk-installation-instructions/helpers/language-icon.js +59 -0
  42. package/dist/blocks/scalar-sdk-installation-instructions/helpers/language-icon.js.map +1 -0
  43. package/dist/blocks/scalar-sdk-installation-instructions/helpers/renderable-sdks.d.ts +19 -0
  44. package/dist/blocks/scalar-sdk-installation-instructions/helpers/renderable-sdks.d.ts.map +1 -0
  45. package/dist/blocks/scalar-sdk-installation-instructions/helpers/renderable-sdks.js +19 -0
  46. package/dist/blocks/scalar-sdk-installation-instructions/helpers/renderable-sdks.js.map +1 -0
  47. package/dist/blocks/scalar-sdk-installation-instructions/helpers/visible-tab-count.d.ts +16 -0
  48. package/dist/blocks/scalar-sdk-installation-instructions/helpers/visible-tab-count.d.ts.map +1 -0
  49. package/dist/blocks/scalar-sdk-installation-instructions/helpers/visible-tab-count.js +29 -0
  50. package/dist/blocks/scalar-sdk-installation-instructions/helpers/visible-tab-count.js.map +1 -0
  51. package/dist/blocks/scalar-sdk-installation-instructions/index.d.ts +3 -0
  52. package/dist/blocks/scalar-sdk-installation-instructions/index.d.ts.map +1 -0
  53. package/dist/blocks/scalar-server-selector-block/components/ServerSelector.vue.script.js +1 -1
  54. package/dist/browser/chunks/{AgentScalarChatInterface-DIIVMX31.js → AgentScalarChatInterface-BXB1nZKJ.js} +4 -4
  55. package/dist/browser/chunks/ScalarTextInput.vue-XkIzhvc0.js +27 -0
  56. package/dist/browser/chunks/basic-shape-diamond.svg-BTEOT1FL.js +1 -1
  57. package/dist/browser/chunks/basic-shape-hexagon.svg-BSPzaCgF.js +1 -1
  58. package/dist/browser/chunks/basic-shape-primary-circle-ellipse-round.svg-DKmZ8UUU.js +1 -1
  59. package/dist/browser/chunks/basic-shape-primary-square-rectangle.svg-n2YRykHD.js +1 -1
  60. package/dist/browser/chunks/basic-shape-shield.svg-Bec9cJDA.js +1 -1
  61. package/dist/browser/chunks/browser-67K6wmG9.js +1 -1
  62. package/dist/browser/chunks/computer-device-desktop-monitor.svg-m6j893Hb.js +1 -1
  63. package/dist/browser/chunks/computer-device-desktop.svg-Dk1VVO7k.js +1 -1
  64. package/dist/browser/chunks/computer-device-laptop.svg-BNGVUCYS.js +1 -1
  65. package/dist/browser/chunks/computer-device-mobile-phone-android-samsung-back.svg-CC4UUTFw.js +1 -1
  66. package/dist/browser/chunks/computer-device-mobile-phone-android-samsung.svg-D8ExpMpL.js +1 -1
  67. package/dist/browser/chunks/computer-device-mobile-phone-iphone-x-back.svg-CLm7sgMM.js +1 -1
  68. package/dist/browser/chunks/computer-device-mobile-phone-iphone-x.svg-Xrttg6_7.js +1 -1
  69. package/dist/browser/chunks/computer-device-mobile-tablet-touch.svg-DQ2oTvOG.js +1 -1
  70. package/dist/browser/chunks/computer-device-mobile-tablet.svg-DCr0XlRc.js +1 -1
  71. package/dist/browser/chunks/computer-device-network-ethernet-cat6.svg-AK9l0iOl.js +1 -1
  72. package/dist/browser/chunks/computer-device-network-lan-www.svg-gUIdFBlE.js +1 -1
  73. package/dist/browser/chunks/computer-device-network-wifi-connection.svg-Be-EMm4e.js +1 -1
  74. package/dist/browser/chunks/computer-device-network-wifi-router.svg-Dc2VzyqK.js +1 -1
  75. package/dist/browser/chunks/ecology-science-erlenmeyer-flask.svg-DHgy7Jfd.js +1 -1
  76. package/dist/browser/chunks/image-flash-lightning.svg-EETR_y1q.js +1 -1
  77. package/dist/browser/chunks/image-picture-flower.svg-DN1AYzJU.js +1 -1
  78. package/dist/browser/chunks/interface-alert-exclamation-diamond.svg-C5NozMV_.js +1 -1
  79. package/dist/browser/chunks/interface-alert-exclamation-triangle-warning.svg-DaAg2fF5.js +1 -1
  80. package/dist/browser/chunks/interface-alert-information-circle.svg-ckkkt9Mv.js +1 -1
  81. package/dist/browser/chunks/interface-award-crown.svg-pjvn9hY-.js +1 -1
  82. package/dist/browser/chunks/interface-bookmark-tag.svg-r2r-lQq4.js +1 -1
  83. package/dist/browser/chunks/interface-bookmark.svg-BK9HKQBT.js +1 -1
  84. package/dist/browser/chunks/interface-calendar-date-one.svg-DNnF0M1I.js +1 -1
  85. package/dist/browser/chunks/interface-content-book-open-pages.svg-CQj_w9Vp.js +1 -1
  86. package/dist/browser/chunks/interface-content-book-page.svg-DppoeJRe.js +1 -1
  87. package/dist/browser/chunks/interface-content-file.svg-CvcD7OiY.js +1 -1
  88. package/dist/browser/chunks/interface-content-folder.svg-BmtS5I9A.js +1 -1
  89. package/dist/browser/chunks/interface-copy-clipboard.svg-Be6EI50X.js +1 -1
  90. package/dist/browser/chunks/interface-edit-attachment.svg-G5TKzpWX.js +1 -1
  91. package/dist/browser/chunks/interface-edit-binocular.svg-jzL-DvGB.js +1 -1
  92. package/dist/browser/chunks/interface-edit-magic-wand.svg-BOTlymvp.js +1 -1
  93. package/dist/browser/chunks/interface-edit-tool-paint-roller.svg-s9dwryx7.js +1 -1
  94. package/dist/browser/chunks/interface-edit-tool-pencil.svg-C7v0dbB3.js +1 -1
  95. package/dist/browser/chunks/interface-favorite-award.svg-CYHUgUG0.js +1 -1
  96. package/dist/browser/chunks/interface-favorite-flag.svg-C10zlKOb.js +1 -1
  97. package/dist/browser/chunks/interface-favorite-heart.svg-eoduXxlz.js +1 -1
  98. package/dist/browser/chunks/interface-favorite-star.svg-BSmxJetr.js +1 -1
  99. package/dist/browser/chunks/interface-favorite-stars-sparkles.svg-JTFLj3Ls.js +1 -1
  100. package/dist/browser/chunks/interface-hierarchy-flowchart.svg-Cg_Wy0kN.js +1 -1
  101. package/dist/browser/chunks/interface-home-house.svg-DytoGRnv.js +1 -1
  102. package/dist/browser/chunks/interface-hyperlink.svg-CuEfmmQI.js +1 -1
  103. package/dist/browser/chunks/interface-lighting-brightness.svg-DSK0h_Pa.js +1 -1
  104. package/dist/browser/chunks/interface-lock-closed.svg-Cn6TaLYv.js +1 -1
  105. package/dist/browser/chunks/interface-lock-open-unlock.svg-CVkG5-9W.js +1 -1
  106. package/dist/browser/chunks/interface-login-key.svg-y-cwwXjN.js +1 -1
  107. package/dist/browser/chunks/interface-search.svg-S-puVFJB.js +1 -1
  108. package/dist/browser/chunks/interface-setting-cog.svg-CTH4_lLg.js +1 -1
  109. package/dist/browser/chunks/interface-share-megaphone-bullhorn.svg-Pbp39MyC.js +1 -1
  110. package/dist/browser/chunks/interface-share-rocket.svg-BgCsIRZO.js +1 -1
  111. package/dist/browser/chunks/interface-share-satellite.svg-DAMN9d5G.js +1 -1
  112. package/dist/browser/chunks/interface-share-space-ship.svg-Dt-Mejxk.js +1 -1
  113. package/dist/browser/chunks/interface-share.svg-vFYTXSti.js +1 -1
  114. package/dist/browser/chunks/interface-signal-square.svg-DNG4LpAe.js +1 -1
  115. package/dist/browser/chunks/interface-time-clock-circle.svg-Bpz-nLxo.js +1 -1
  116. package/dist/browser/chunks/interface-time-hour-glass.svg-D7agfKsH.js +1 -1
  117. package/dist/browser/chunks/interface-users-multiple.svg-CkPJBBnG.js +1 -1
  118. package/dist/browser/chunks/interface-weather-moon.svg-CaTZFMPO.js +1 -1
  119. package/dist/browser/chunks/mail-chat-bubble-square.svg-DC8RIihp.js +1 -1
  120. package/dist/browser/chunks/mail-send-email-paper-airplane.svg-D8OLs9jz.js +1 -1
  121. package/dist/browser/chunks/mail-send-envelope.svg-CV33h5Sx.js +1 -1
  122. package/dist/browser/chunks/modal-Bp9V4D2s.js +66 -0
  123. package/dist/browser/chunks/{modal-BA6EnLMO.js → modal-CtAiwzwH.js} +2 -2
  124. package/dist/browser/chunks/money-cashier-receipt.svg-CJL8C2gs.js +1 -1
  125. package/dist/browser/chunks/money-currency-dollar-pay.svg-VdBplCTx.js +1 -1
  126. package/dist/browser/chunks/money-graph-arrow-increase.svg-DcRov3zk.js +1 -1
  127. package/dist/browser/chunks/money-graph-bar-chart-increase.svg-Cc7KxjX-.js +1 -1
  128. package/dist/browser/chunks/nature-ecology-leaf.svg-DR3cTZxt.js +1 -1
  129. package/dist/browser/chunks/phone-telephone.svg-DyY0gUlk.js +1 -1
  130. package/dist/browser/chunks/programming-bug.svg-BHLT-Qhp.js +1 -1
  131. package/dist/browser/chunks/programming-cloud.svg-B6YW33ba.js +1 -1
  132. package/dist/browser/chunks/programming-computer-database-server.svg-B6o5Sdn-.js +1 -1
  133. package/dist/browser/chunks/programming-computer-database.svg-Cl7OVtpJ.js +1 -1
  134. package/dist/browser/chunks/programming-module-four-layout.svg-BQrerL1x.js +1 -1
  135. package/dist/browser/chunks/programming-module-three.svg-B2KTQzBM.js +1 -1
  136. package/dist/browser/chunks/programming-module.svg-CiID7kPm.js +1 -1
  137. package/dist/browser/chunks/programming-script-code.svg-D1M5rtkN.js +1 -1
  138. package/dist/browser/chunks/runtime-core.esm-bundler-Byrbbu5Q.js +1 -1
  139. package/dist/browser/chunks/shopping-cart.svg-BEegiIR9.js +1 -1
  140. package/dist/browser/chunks/shopping-gift-present.svg-BUHwuLix.js +1 -1
  141. package/dist/browser/chunks/shopping-shipping-box-parcel-package.svg-D6fxWdYx.js +1 -1
  142. package/dist/browser/chunks/tag-new-circle.svg-jsg1bGs0.js +1 -1
  143. package/dist/browser/chunks/travel-map-earth-globe.svg-ClbMiU-f.js +1 -1
  144. package/dist/browser/chunks/vendor-nugWm4eq.js +337 -0
  145. package/dist/browser/standalone.esm.js +19 -18
  146. package/dist/browser/standalone.js +245 -240
  147. package/dist/components/ApiReference.vue.d.ts.map +1 -1
  148. package/dist/components/ApiReference.vue.js +1 -1
  149. package/dist/components/ApiReference.vue.js.map +1 -1
  150. package/dist/components/ApiReference.vue.script.js +19 -3
  151. package/dist/components/ApiReference.vue.script.js.map +1 -1
  152. package/dist/components/Content/AsyncApi/AsyncApiTraversedEntry.vue.d.ts +1 -1
  153. package/dist/components/Content/AsyncApi/AsyncApiTraversedEntry.vue.d.ts.map +1 -1
  154. package/dist/components/Content/AsyncApi/AsyncApiTraversedEntry.vue.js.map +1 -1
  155. package/dist/components/Content/AsyncApi/AsyncApiTraversedEntry.vue.script.js +4 -2
  156. package/dist/components/Content/AsyncApi/AsyncApiTraversedEntry.vue.script.js.map +1 -1
  157. package/dist/components/Content/AsyncApi/Channel.vue.d.ts +4 -0
  158. package/dist/components/Content/AsyncApi/Channel.vue.d.ts.map +1 -1
  159. package/dist/components/Content/AsyncApi/Channel.vue.js +1 -1
  160. package/dist/components/Content/AsyncApi/Channel.vue.js.map +1 -1
  161. package/dist/components/Content/AsyncApi/Channel.vue.script.js +43 -3
  162. package/dist/components/Content/AsyncApi/Channel.vue.script.js.map +1 -1
  163. package/dist/components/Content/AsyncApi/helpers/adapt-async-api-parameters.d.ts +14 -0
  164. package/dist/components/Content/AsyncApi/helpers/adapt-async-api-parameters.d.ts.map +1 -0
  165. package/dist/components/Content/AsyncApi/helpers/adapt-async-api-parameters.js +34 -0
  166. package/dist/components/Content/AsyncApi/helpers/adapt-async-api-parameters.js.map +1 -0
  167. package/dist/components/Content/Auth/Auth.vue.d.ts +1 -1
  168. package/dist/components/Content/Auth/Auth.vue.d.ts.map +1 -1
  169. package/dist/components/Content/Auth/Auth.vue.js.map +1 -1
  170. package/dist/components/Content/Auth/Auth.vue.script.js +2 -0
  171. package/dist/components/Content/Auth/Auth.vue.script.js.map +1 -1
  172. package/dist/components/Content/Content.vue.d.ts +3 -3
  173. package/dist/components/Content/Content.vue.d.ts.map +1 -1
  174. package/dist/components/Content/Content.vue.js.map +1 -1
  175. package/dist/components/Content/Content.vue.script.js +50 -6
  176. package/dist/components/Content/Content.vue.script.js.map +1 -1
  177. package/dist/components/Content/Models/Model.vue.d.ts +4 -2
  178. package/dist/components/Content/Models/Model.vue.d.ts.map +1 -1
  179. package/dist/components/Content/Models/Model.vue.js.map +1 -1
  180. package/dist/components/Content/Models/Model.vue.script.js +6 -1
  181. package/dist/components/Content/Models/Model.vue.script.js.map +1 -1
  182. package/dist/components/Content/Models/components/ClassicLayout.vue.d.ts +4 -2
  183. package/dist/components/Content/Models/components/ClassicLayout.vue.d.ts.map +1 -1
  184. package/dist/components/Content/Models/components/ClassicLayout.vue.js +1 -1
  185. package/dist/components/Content/Models/components/ClassicLayout.vue.js.map +1 -1
  186. package/dist/components/Content/Models/components/ClassicLayout.vue.script.js +9 -2
  187. package/dist/components/Content/Models/components/ClassicLayout.vue.script.js.map +1 -1
  188. package/dist/components/Content/Models/components/ModernLayout.vue.d.ts +4 -1
  189. package/dist/components/Content/Models/components/ModernLayout.vue.d.ts.map +1 -1
  190. package/dist/components/Content/Models/components/ModernLayout.vue.js.map +1 -1
  191. package/dist/components/Content/Models/components/ModernLayout.vue.script.js +5 -1
  192. package/dist/components/Content/Models/components/ModernLayout.vue.script.js.map +1 -1
  193. package/dist/components/Content/Operations/TraversedEntry.vue.d.ts +1 -1
  194. package/dist/components/Content/Operations/TraversedEntry.vue.d.ts.map +1 -1
  195. package/dist/components/Content/Operations/TraversedEntry.vue.js.map +1 -1
  196. package/dist/components/Content/Operations/TraversedEntry.vue.script.js +7 -2
  197. package/dist/components/Content/Operations/TraversedEntry.vue.script.js.map +1 -1
  198. package/dist/components/Content/Schema/Schema.vue.d.ts +6 -0
  199. package/dist/components/Content/Schema/Schema.vue.d.ts.map +1 -1
  200. package/dist/components/Content/Schema/Schema.vue.js +1 -1
  201. package/dist/components/Content/Schema/Schema.vue.js.map +1 -1
  202. package/dist/components/Content/Schema/Schema.vue.script.js +32 -7
  203. package/dist/components/Content/Schema/Schema.vue.script.js.map +1 -1
  204. package/dist/components/Content/Schema/SchemaComposition.vue.d.ts.map +1 -1
  205. package/dist/components/Content/Schema/SchemaComposition.vue.js.map +1 -1
  206. package/dist/components/Content/Schema/SchemaComposition.vue.script.js +16 -3
  207. package/dist/components/Content/Schema/SchemaComposition.vue.script.js.map +1 -1
  208. package/dist/components/Content/Schema/SchemaObjectExampleCodeBlock.vue.script.js +1 -1
  209. package/dist/components/Content/Schema/SchemaObjectProperties.vue.d.ts.map +1 -1
  210. package/dist/components/Content/Schema/SchemaObjectProperties.vue.js.map +1 -1
  211. package/dist/components/Content/Schema/SchemaObjectProperties.vue.script.js +7 -0
  212. package/dist/components/Content/Schema/SchemaObjectProperties.vue.script.js.map +1 -1
  213. package/dist/components/Content/Schema/SchemaProperty.vue.d.ts +2 -0
  214. package/dist/components/Content/Schema/SchemaProperty.vue.d.ts.map +1 -1
  215. package/dist/components/Content/Schema/SchemaProperty.vue.js +1 -1
  216. package/dist/components/Content/Schema/SchemaProperty.vue.js.map +1 -1
  217. package/dist/components/Content/Schema/SchemaProperty.vue.script.js +17 -2
  218. package/dist/components/Content/Schema/SchemaProperty.vue.script.js.map +1 -1
  219. package/dist/components/Content/Schema/helpers/get-compositions-to-render.d.ts +3 -2
  220. package/dist/components/Content/Schema/helpers/get-compositions-to-render.d.ts.map +1 -1
  221. package/dist/components/Content/Schema/helpers/get-compositions-to-render.js +26 -1
  222. package/dist/components/Content/Schema/helpers/get-compositions-to-render.js.map +1 -1
  223. package/dist/components/Content/Schema/helpers/schema-cycle.d.ts +31 -0
  224. package/dist/components/Content/Schema/helpers/schema-cycle.d.ts.map +1 -0
  225. package/dist/components/Content/Schema/helpers/schema-cycle.js +39 -0
  226. package/dist/components/Content/Schema/helpers/schema-cycle.js.map +1 -0
  227. package/dist/components/Content/Schema/types.d.ts +10 -0
  228. package/dist/components/Content/Schema/types.d.ts.map +1 -1
  229. package/dist/features/Operation/Operation.vue.d.ts +1 -1
  230. package/dist/features/Operation/Operation.vue.d.ts.map +1 -1
  231. package/dist/features/Operation/Operation.vue.js.map +1 -1
  232. package/dist/features/Operation/Operation.vue.script.js +4 -0
  233. package/dist/features/Operation/Operation.vue.script.js.map +1 -1
  234. package/dist/features/Operation/components/ContentTypeSelect.vue.script.js +1 -1
  235. package/dist/features/Operation/components/Header.vue.d.ts +4 -1
  236. package/dist/features/Operation/components/Header.vue.d.ts.map +1 -1
  237. package/dist/features/Operation/components/Header.vue.js.map +1 -1
  238. package/dist/features/Operation/components/Header.vue.script.js +6 -2
  239. package/dist/features/Operation/components/Header.vue.script.js.map +1 -1
  240. package/dist/features/Operation/components/Headers.vue.d.ts +4 -1
  241. package/dist/features/Operation/components/Headers.vue.d.ts.map +1 -1
  242. package/dist/features/Operation/components/Headers.vue.js +1 -1
  243. package/dist/features/Operation/components/Headers.vue.js.map +1 -1
  244. package/dist/features/Operation/components/Headers.vue.script.js +10 -4
  245. package/dist/features/Operation/components/Headers.vue.script.js.map +1 -1
  246. package/dist/features/Operation/components/OperationParameters.vue.d.ts +4 -2
  247. package/dist/features/Operation/components/OperationParameters.vue.d.ts.map +1 -1
  248. package/dist/features/Operation/components/OperationParameters.vue.js.map +1 -1
  249. package/dist/features/Operation/components/OperationParameters.vue.script.js +12 -1
  250. package/dist/features/Operation/components/OperationParameters.vue.script.js.map +1 -1
  251. package/dist/features/Operation/components/OperationResponses.vue.d.ts +4 -2
  252. package/dist/features/Operation/components/OperationResponses.vue.d.ts.map +1 -1
  253. package/dist/features/Operation/components/OperationResponses.vue.js.map +1 -1
  254. package/dist/features/Operation/components/OperationResponses.vue.script.js +3 -0
  255. package/dist/features/Operation/components/OperationResponses.vue.script.js.map +1 -1
  256. package/dist/features/Operation/components/ParameterList.vue.d.ts +4 -2
  257. package/dist/features/Operation/components/ParameterList.vue.d.ts.map +1 -1
  258. package/dist/features/Operation/components/ParameterList.vue.js.map +1 -1
  259. package/dist/features/Operation/components/ParameterList.vue.script.js +3 -0
  260. package/dist/features/Operation/components/ParameterList.vue.script.js.map +1 -1
  261. package/dist/features/Operation/components/ParameterListItem.vue.d.ts +4 -2
  262. package/dist/features/Operation/components/ParameterListItem.vue.d.ts.map +1 -1
  263. package/dist/features/Operation/components/ParameterListItem.vue.js +1 -1
  264. package/dist/features/Operation/components/ParameterListItem.vue.js.map +1 -1
  265. package/dist/features/Operation/components/ParameterListItem.vue.script.js +8 -1
  266. package/dist/features/Operation/components/ParameterListItem.vue.script.js.map +1 -1
  267. package/dist/features/Operation/components/RequestBody.vue.d.ts +4 -1
  268. package/dist/features/Operation/components/RequestBody.vue.d.ts.map +1 -1
  269. package/dist/features/Operation/components/RequestBody.vue.js +1 -1
  270. package/dist/features/Operation/components/RequestBody.vue.js.map +1 -1
  271. package/dist/features/Operation/components/RequestBody.vue.script.js +10 -3
  272. package/dist/features/Operation/components/RequestBody.vue.script.js.map +1 -1
  273. package/dist/features/Operation/components/callbacks/Callback.vue.d.ts +4 -2
  274. package/dist/features/Operation/components/callbacks/Callback.vue.d.ts.map +1 -1
  275. package/dist/features/Operation/components/callbacks/Callback.vue.js +1 -1
  276. package/dist/features/Operation/components/callbacks/Callback.vue.js.map +1 -1
  277. package/dist/features/Operation/components/callbacks/Callback.vue.script.js +5 -0
  278. package/dist/features/Operation/components/callbacks/Callback.vue.script.js.map +1 -1
  279. package/dist/features/Operation/components/callbacks/Callbacks.vue.d.ts +4 -2
  280. package/dist/features/Operation/components/callbacks/Callbacks.vue.d.ts.map +1 -1
  281. package/dist/features/Operation/components/callbacks/Callbacks.vue.js.map +1 -1
  282. package/dist/features/Operation/components/callbacks/Callbacks.vue.script.js +3 -0
  283. package/dist/features/Operation/components/callbacks/Callbacks.vue.script.js.map +1 -1
  284. package/dist/features/Operation/layouts/ClassicLayout.vue.d.ts +3 -1
  285. package/dist/features/Operation/layouts/ClassicLayout.vue.d.ts.map +1 -1
  286. package/dist/features/Operation/layouts/ClassicLayout.vue.js +1 -1
  287. package/dist/features/Operation/layouts/ClassicLayout.vue.js.map +1 -1
  288. package/dist/features/Operation/layouts/ClassicLayout.vue.script.js +8 -1
  289. package/dist/features/Operation/layouts/ClassicLayout.vue.script.js.map +1 -1
  290. package/dist/features/Operation/layouts/ModernLayout.vue.d.ts +3 -1
  291. package/dist/features/Operation/layouts/ModernLayout.vue.d.ts.map +1 -1
  292. package/dist/features/Operation/layouts/ModernLayout.vue.js +1 -1
  293. package/dist/features/Operation/layouts/ModernLayout.vue.js.map +1 -1
  294. package/dist/features/Operation/layouts/ModernLayout.vue.script.js +170 -176
  295. package/dist/features/Operation/layouts/ModernLayout.vue.script.js.map +1 -1
  296. package/dist/features/Search/components/SearchButton.vue.d.ts.map +1 -1
  297. package/dist/features/Search/components/SearchButton.vue.js.map +1 -1
  298. package/dist/features/Search/components/SearchButton.vue.script.js +13 -1
  299. package/dist/features/Search/components/SearchButton.vue.script.js.map +1 -1
  300. package/dist/features/Search/components/SearchModal.vue.d.ts.map +1 -1
  301. package/dist/features/Search/components/SearchModal.vue.js +1 -1
  302. package/dist/features/Search/components/SearchModal.vue.js.map +1 -1
  303. package/dist/features/Search/components/SearchModal.vue.script.js +2 -3
  304. package/dist/features/Search/components/SearchModal.vue.script.js.map +1 -1
  305. package/dist/features/developer-tools/components/ApiReferenceToolbarConfigTheme.vue.script.js +1 -1
  306. package/dist/features/example-responses/ExampleResponse.vue.d.ts.map +1 -1
  307. package/dist/features/example-responses/ExampleResponse.vue.js +1 -1
  308. package/dist/features/example-responses/ExampleResponse.vue.js.map +1 -1
  309. package/dist/features/example-responses/ExampleResponse.vue.script.js +6 -7
  310. package/dist/features/example-responses/ExampleResponse.vue.script.js.map +1 -1
  311. package/dist/features/example-responses/ExampleResponses.vue.script.js +1 -1
  312. package/dist/features/example-responses/ExampleSchema.vue.d.ts.map +1 -1
  313. package/dist/features/example-responses/ExampleSchema.vue.js.map +1 -1
  314. package/dist/features/example-responses/ExampleSchema.vue.script.js +6 -7
  315. package/dist/features/example-responses/ExampleSchema.vue.script.js.map +1 -1
  316. package/dist/features/info-object/Contact.vue.d.ts.map +1 -1
  317. package/dist/features/info-object/Contact.vue.js.map +1 -1
  318. package/dist/features/info-object/Contact.vue.script.js +15 -4
  319. package/dist/features/info-object/Contact.vue.script.js.map +1 -1
  320. package/dist/helpers/load-from-perssistance.d.ts +2 -1
  321. package/dist/helpers/load-from-perssistance.d.ts.map +1 -1
  322. package/dist/helpers/load-from-perssistance.js +4 -3
  323. package/dist/helpers/load-from-perssistance.js.map +1 -1
  324. package/dist/standalone/lib/html-api.d.ts.map +1 -1
  325. package/dist/standalone/lib/html-api.js +60 -2
  326. package/dist/standalone/lib/html-api.js.map +1 -1
  327. package/dist/style.css +557 -374
  328. package/dist/vue-styles.css +547 -357
  329. package/package.json +16 -16
  330. package/dist/browser/chunks/ScalarTextInput.vue-DDsQgpOo.js +0 -27
  331. package/dist/browser/chunks/modal-DW-P3H1k.js +0 -66
  332. package/dist/browser/chunks/vendor-Ad2vN5Ro.js +0 -333
@@ -1,27 +1,18 @@
1
1
  import { getFeaturedClients, isFeaturedClient } from "../helpers/featured-clients.js";
2
2
  import ClientDropdown_default from "./ClientDropdown.vue.js";
3
- import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, normalizeClass, openBlock, renderList, toDisplayString, unref, useId, useTemplateRef, withCtx } from "vue";
3
+ import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, openBlock, ref, renderList, toDisplayString, unref, useId, useTemplateRef, watch, withCtx } from "vue";
4
4
  import { TabGroup, TabList, TabPanel, TabPanels } from "@headlessui/vue";
5
5
  import { DEFAULT_CLIENT } from "@scalar/api-client/blocks/operation-code-sample";
6
- import { ScalarCodeBlock } from "@scalar/components/code-block";
7
- import { ScalarMarkdown } from "@scalar/components/markdown";
8
6
  //#region src/blocks/scalar-client-selector-block/components/ClientSelector.vue?vue&type=script&setup=true&lang.ts
9
7
  var _hoisted_1 = {
10
8
  key: 0,
11
9
  ref: "wrapper-ref"
12
10
  };
13
11
  var _hoisted_2 = ["id"];
14
- var _hoisted_3 = {
15
- key: 1,
16
- class: "selected-client card-footer border-t-0 p-0",
17
- role: "tabpanel",
18
- tabindex: "1"
19
- };
20
- var _hoisted_4 = ["id"];
12
+ var _hoisted_3 = ["id"];
21
13
  var ClientSelector_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
22
14
  __name: "ClientSelector",
23
15
  props: {
24
- xScalarSdkInstallation: {},
25
16
  clientOptions: {},
26
17
  selectedClient: { default: () => DEFAULT_CLIENT },
27
18
  eventBus: {}
@@ -29,12 +20,30 @@ var ClientSelector_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */
29
20
  setup(__props, { expose: __expose }) {
30
21
  const headingId = useId();
31
22
  const morePanel = useId();
23
+ /**
24
+ * Whether a selection is a custom code sample (e.g. `custom/python`) rather than
25
+ * a built-in client. Custom samples are matched by the `custom/` id prefix, which
26
+ * mirrors the `^custom/` pattern enforced on the stored default client.
27
+ */
28
+ const isCustomSelection = (client) => Boolean(client?.startsWith("custom/"));
29
+ /**
30
+ * The generic client this selector actually displays.
31
+ *
32
+ * The introduction selector only represents the built-in HTTP clients. Custom
33
+ * code samples are operation-specific and "always just have the generic
34
+ * clients", so when one is selected globally we keep showing the last generic
35
+ * client here instead of switching to (and failing to render) a custom sample.
36
+ */
37
+ const activeClient = ref(isCustomSelection(__props.selectedClient) ? DEFAULT_CLIENT : __props.selectedClient);
38
+ watch(() => __props.selectedClient, (newClient) => {
39
+ if (!isCustomSelection(newClient)) activeClient.value = newClient;
40
+ });
32
41
  /** Grab the option for the currently selected Http Client */
33
- const selectedClientOption = computed(() => __props.clientOptions.flatMap((optionGroup) => optionGroup.options.find((option) => option.id === __props.selectedClient) ?? [])[0]);
42
+ const selectedClientOption = computed(() => __props.clientOptions.flatMap((optionGroup) => optionGroup.options.find((option) => option.id === activeClient.value) ?? [])[0]);
34
43
  /** List of featured clients */
35
44
  const featuredClients = computed(() => getFeaturedClients(__props.clientOptions));
36
45
  /** Currently selected tab index */
37
- const tabIndex = computed(() => featuredClients.value.findIndex((featuredClient) => __props.selectedClient === featuredClient.id));
46
+ const tabIndex = computed(() => featuredClients.value.findIndex((featuredClient) => activeClient.value === featuredClient.id));
38
47
  const wrapper = useTemplateRef("wrapper-ref");
39
48
  /** Emit the selected client event on tab */
40
49
  const onTabSelect = (i) => {
@@ -42,15 +51,6 @@ var ClientSelector_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */
42
51
  if (!client || !wrapper.value) return;
43
52
  __props.eventBus.emit("workspace:update:selected-client", client.id);
44
53
  };
45
- const installationInstructions = computed(() => {
46
- if (!Array.isArray(__props.xScalarSdkInstallation) || !__props.xScalarSdkInstallation?.length) return;
47
- const instruction = __props.xScalarSdkInstallation.find((instruction) => {
48
- const targetKey = __props.selectedClient?.split("/")[0]?.toLowerCase();
49
- return instruction.lang.toLowerCase() === targetKey;
50
- });
51
- if (!instruction) return;
52
- return instruction;
53
- });
54
54
  __expose({ selectedClientOption });
55
55
  return (_ctx, _cache) => {
56
56
  return __props.clientOptions.length ? (openBlock(), createElementBlock("div", _hoisted_1, [createVNode(unref(TabGroup), {
@@ -72,7 +72,7 @@ var ClientSelector_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */
72
72
  eventBus: __props.eventBus,
73
73
  featuredClients: featuredClients.value,
74
74
  morePanel: unref(morePanel),
75
- selectedClient: __props.selectedClient
75
+ selectedClient: activeClient.value
76
76
  }, null, 8, [
77
77
  "clientOptions",
78
78
  "eventBus",
@@ -83,17 +83,7 @@ var ClientSelector_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */
83
83
  _: 1
84
84
  }, 8, ["aria-labelledby"]),
85
85
  createVNode(unref(TabPanels), null, {
86
- default: withCtx(() => [installationInstructions.value?.source || installationInstructions.value?.description ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [installationInstructions.value.description ? (openBlock(), createElementBlock("div", {
87
- key: 0,
88
- class: normalizeClass(["selected-client card-footer -outline-offset-2", installationInstructions.value.source && "rounded-b-none"]),
89
- role: "tabpanel",
90
- tabindex: "0"
91
- }, [createVNode(unref(ScalarMarkdown), { value: installationInstructions.value.description }, null, 8, ["value"])], 2)) : createCommentVNode("", true), installationInstructions.value.source ? (openBlock(), createElementBlock("div", _hoisted_3, [createVNode(unref(ScalarCodeBlock), {
92
- class: "rounded-b-lg *:first:p-3",
93
- content: installationInstructions.value.source,
94
- copy: "always",
95
- lang: "shell"
96
- }, null, 8, ["content"])])) : createCommentVNode("", true)], 64)) : unref(isFeaturedClient)(__props.selectedClient) ? (openBlock(true), createElementBlock(Fragment, { key: 1 }, renderList(featuredClients.value, (client) => {
86
+ default: withCtx(() => [unref(isFeaturedClient)(activeClient.value) ? (openBlock(true), createElementBlock(Fragment, { key: 0 }, renderList(featuredClients.value, (client) => {
97
87
  return openBlock(), createBlock(unref(TabPanel), {
98
88
  key: client.id,
99
89
  class: "selected-client card-footer -outline-offset-2"
@@ -102,12 +92,12 @@ var ClientSelector_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */
102
92
  _: 2
103
93
  }, 1024);
104
94
  }), 128)) : (openBlock(), createElementBlock("div", {
105
- key: 2,
95
+ key: 1,
106
96
  id: unref(morePanel),
107
97
  class: "selected-client card-footer -outline-offset-2",
108
98
  role: "tabpanel",
109
99
  tabindex: "0"
110
- }, toDisplayString(selectedClientOption.value?.title), 9, _hoisted_4))]),
100
+ }, toDisplayString(selectedClientOption.value?.title), 9, _hoisted_3))]),
111
101
  _: 1
112
102
  })
113
103
  ]),
@@ -1 +1 @@
1
- {"version":3,"file":"ClientSelector.vue.script.js","names":[],"sources":["../../../../src/blocks/scalar-client-selector-block/components/ClientSelector.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { TabGroup, TabList, TabPanel, TabPanels } from '@headlessui/vue'\nimport {\n DEFAULT_CLIENT,\n type ClientOptionGroup,\n} from '@scalar/api-client/blocks/operation-code-sample'\nimport { ScalarCodeBlock } from '@scalar/components/code-block'\nimport { ScalarMarkdown } from '@scalar/components/markdown'\nimport type { AvailableClient } from '@scalar/snippetz'\nimport { type WorkspaceEventBus } from '@scalar/workspace-store/events'\nimport type { XScalarSdkInstallation } from '@scalar/workspace-store/schemas/extensions/document/x-scalar-sdk-installation'\nimport { computed, useId, useTemplateRef } from 'vue'\n\nimport {\n getFeaturedClients,\n isFeaturedClient,\n} from '@/blocks/scalar-client-selector-block/helpers/featured-clients'\n\nimport ClientDropdown from './ClientDropdown.vue'\n\nconst {\n clientOptions,\n xScalarSdkInstallation,\n eventBus,\n selectedClient = DEFAULT_CLIENT,\n} = defineProps<{\n /** Selected SDK installation instructions */\n xScalarSdkInstallation?: XScalarSdkInstallation['x-scalar-sdk-installation']\n /** Computed list of all available Http Client options */\n clientOptions: ClientOptionGroup[]\n /** The currently selected Http Client */\n selectedClient?: AvailableClient\n /** Event bus */\n eventBus: WorkspaceEventBus\n}>()\n\nconst headingId = useId()\nconst morePanel = useId()\n\n/** Grab the option for the currently selected Http Client */\nconst selectedClientOption = computed(\n () =>\n clientOptions.flatMap(\n (optionGroup) =>\n optionGroup.options.find((option) => option.id === selectedClient) ??\n [],\n )[0],\n)\n\n/** List of featured clients */\nconst featuredClients = computed(() => getFeaturedClients(clientOptions))\n\n/** Currently selected tab index */\nconst tabIndex = computed(() =>\n featuredClients.value.findIndex(\n (featuredClient) => selectedClient === featuredClient.id,\n ),\n)\n\nconst wrapper = useTemplateRef('wrapper-ref')\n\n/** Emit the selected client event on tab */\nconst onTabSelect = (i: number) => {\n const client = featuredClients.value[i]\n\n if (!client || !wrapper.value) {\n return\n }\n\n eventBus.emit('workspace:update:selected-client', client.id)\n}\n\nconst installationInstructions = computed(() => {\n // Check whether we have instructions at all\n if (\n !Array.isArray(xScalarSdkInstallation) ||\n !xScalarSdkInstallation?.length\n ) {\n return undefined\n }\n\n // Find the instructions for the current language\n const instruction = xScalarSdkInstallation.find((instruction) => {\n const targetKey = selectedClient?.split('/')[0]?.toLowerCase()\n return instruction.lang.toLowerCase() === targetKey\n })\n\n // Nothing found?\n if (!instruction) {\n return undefined\n }\n\n // Got it!\n return instruction\n})\n\ndefineExpose({\n selectedClientOption,\n})\n</script>\n<template>\n <div\n v-if=\"clientOptions.length\"\n ref=\"wrapper-ref\">\n <TabGroup\n manual\n :selectedIndex=\"tabIndex\"\n @change=\"onTabSelect\">\n <div\n :id=\"headingId\"\n class=\"client-libraries-heading\">\n Client Libraries\n </div>\n\n <!-- Tabs -->\n <TabList\n :aria-labelledby=\"headingId\"\n class=\"client-libraries-list\">\n <ClientDropdown\n :clientOptions\n :eventBus\n :featuredClients\n :morePanel\n :selectedClient />\n </TabList>\n\n <!-- Content -->\n <TabPanels>\n <template\n v-if=\"\n installationInstructions?.source ||\n installationInstructions?.description\n \">\n <div\n v-if=\"installationInstructions.description\"\n class=\"selected-client card-footer -outline-offset-2\"\n :class=\"installationInstructions.source && 'rounded-b-none'\"\n role=\"tabpanel\"\n tabindex=\"0\">\n <ScalarMarkdown :value=\"installationInstructions.description\" />\n </div>\n <div\n v-if=\"installationInstructions.source\"\n class=\"selected-client card-footer border-t-0 p-0\"\n role=\"tabpanel\"\n tabindex=\"1\">\n <ScalarCodeBlock\n class=\"rounded-b-lg *:first:p-3\"\n :content=\"installationInstructions.source\"\n copy=\"always\"\n lang=\"shell\" />\n </div>\n </template>\n <template v-else-if=\"isFeaturedClient(selectedClient)\">\n <TabPanel\n v-for=\"client in featuredClients\"\n :key=\"client.id\"\n class=\"selected-client card-footer -outline-offset-2\">\n {{ client.title }}\n </TabPanel>\n </template>\n <div\n v-else\n :id=\"morePanel\"\n class=\"selected-client card-footer -outline-offset-2\"\n role=\"tabpanel\"\n tabindex=\"0\">\n {{ selectedClientOption?.title }}\n </div>\n </TabPanels>\n </TabGroup>\n </div>\n</template>\n<style scoped>\n.selected-client {\n color: var(--scalar-color-1);\n font-size: var(--scalar-small);\n font-family: var(--scalar-font-code);\n padding: 9px 12px;\n border-top: none;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n background: var(--scalar-background-1);\n border: var(--scalar-border-width) solid var(--scalar-border-color);\n border-bottom-left-radius: var(--scalar-radius-xl);\n border-bottom-right-radius: var(--scalar-radius-xl);\n min-height: fit-content;\n}\n.client-libraries-heading {\n font-size: var(--scalar-small);\n font-weight: var(--scalar-font-medium);\n color: var(--scalar-color-1);\n padding: 9px 12px;\n background-color: var(--scalar-background-2);\n display: flex;\n align-items: center;\n max-height: 32px;\n border: var(--scalar-border-width) solid var(--scalar-border-color);\n border-top-left-radius: var(--scalar-radius-xl);\n border-top-right-radius: var(--scalar-radius-xl);\n}\n:deep(.scalar-codeblock-pre .hljs) {\n margin-top: 8px;\n}\n</style>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoCA,MAAM,YAAY,OAAM;EACxB,MAAM,YAAY,OAAM;;EAGxB,MAAM,uBAAuB,eAEzB,QAAA,cAAc,SACX,gBACC,YAAY,QAAQ,MAAM,WAAW,OAAO,OAAO,QAAA,eAAe,IAClE,EAAE,CACL,CAAC,GACN;;EAGA,MAAM,kBAAkB,eAAe,mBAAmB,QAAA,cAAc,CAAA;;EAGxE,MAAM,WAAW,eACf,gBAAgB,MAAM,WACnB,mBAAmB,QAAA,mBAAmB,eAAe,GACvD,CACH;EAEA,MAAM,UAAU,eAAe,cAAa;;EAG5C,MAAM,eAAe,MAAc;GACjC,MAAM,SAAS,gBAAgB,MAAM;AAErC,OAAI,CAAC,UAAU,CAAC,QAAQ,MACtB;AAGF,WAAA,SAAS,KAAK,oCAAoC,OAAO,GAAE;;EAG7D,MAAM,2BAA2B,eAAe;AAE9C,OACE,CAAC,MAAM,QAAQ,QAAA,uBAAuB,IACtC,CAAC,QAAA,wBAAwB,OAEzB;GAIF,MAAM,cAAc,QAAA,uBAAuB,MAAM,gBAAgB;IAC/D,MAAM,YAAY,QAAA,gBAAgB,MAAM,IAAI,CAAC,IAAI,aAAY;AAC7D,WAAO,YAAY,KAAK,aAAa,KAAK;KAC3C;AAGD,OAAI,CAAC,YACH;AAIF,UAAO;IACR;AAED,WAAa,EACX,sBACD,CAAA;;UAIS,QAAA,cAAc,UAAA,WAAA,EADtB,mBAsEM,OAtEN,YAsEM,CAnEJ,YAkEW,MAAA,SAAA,EAAA;IAjET,QAAA;IACC,eAAe,SAAA;IACf,UAAQ;;2BAKH;KAJN,mBAIM,OAAA;MAHH,IAAI,MAAA,UAAS;MACd,OAAM;QAA2B,sBAEnC,GAAA,WAAA;KAGA,YASU,MAAA,QAAA,EAAA;MARP,mBAAiB,MAAA,UAAS;MAC3B,OAAM;;6BAMc,CALpB,YAKoB,wBAAA;OAJjB,eAAA,QAAA;OACA,UAAA,QAAA;OACA,iBAAA,gBAAA;OACA,WAAA,MAAA,UAAS;OACT,gBAAA,QAAA;;;;;;;;;;KAIL,YA0CY,MAAA,UAAA,EAAA,MAAA;6BAjBC,CAvBU,yBAAA,OAA0B,UAAsB,yBAAA,OAA0B,eAAA,WAAA,EAD/F,mBAwBW,UAAA,EAAA,KAAA,GAAA,EAAA,CAlBD,yBAAA,MAAyB,eAAA,WAAA,EADjC,mBAOM,OAAA;;OALJ,OAAK,eAAA,CAAC,iDACE,yBAAA,MAAyB,UAAM,iBAAA,CAAA;OACvC,MAAK;OACL,UAAS;UACT,YAAgE,MAAA,eAAA,EAAA,EAA/C,OAAO,yBAAA,MAAyB,aAAA,EAAA,MAAA,GAAA,CAAA,QAAA,CAAA,CAAA,EAAA,EAAA,IAAA,mBAAA,IAAA,KAAA,EAG3C,yBAAA,MAAyB,UAAA,WAAA,EADjC,mBAUM,OAVN,YAUM,CALJ,YAIiB,MAAA,gBAAA,EAAA;OAHf,OAAM;OACL,SAAS,yBAAA,MAAyB;OACnC,MAAK;OACL,MAAK;0EAGU,MAAA,iBAAgB,CAAC,QAAA,eAAc,IAAA,UAAA,KAAA,EAClD,mBAKW,UAAA,EAAA,KAAA,GAAA,EAAA,WAJQ,gBAAA,QAAV,WAAM;2BADf,YAKW,MAAA,SAAA,EAAA;QAHR,KAAK,OAAO;QACb,OAAM;;+BACY,CAAA,gBAAA,gBAAf,OAAO,MAAK,EAAA,EAAA,CAAA,CAAA;;;gCAGnB,mBAOM,OAAA;;OALH,IAAI,MAAA,UAAS;OACd,OAAM;OACN,MAAK;OACL,UAAS;yBACN,qBAAA,OAAsB,MAAK,EAAA,GAAA,WAAA,EAAA,CAAA"}
1
+ {"version":3,"file":"ClientSelector.vue.script.js","names":[],"sources":["../../../../src/blocks/scalar-client-selector-block/components/ClientSelector.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { TabGroup, TabList, TabPanel, TabPanels } from '@headlessui/vue'\nimport {\n DEFAULT_CLIENT,\n type ClientOptionGroup,\n} from '@scalar/api-client/blocks/operation-code-sample'\nimport { type WorkspaceEventBus } from '@scalar/workspace-store/events'\nimport { computed, ref, useId, useTemplateRef, watch } from 'vue'\n\nimport {\n getFeaturedClients,\n isFeaturedClient,\n} from '@/blocks/scalar-client-selector-block/helpers/featured-clients'\n\nimport ClientDropdown from './ClientDropdown.vue'\n\nconst {\n clientOptions,\n eventBus,\n selectedClient = DEFAULT_CLIENT,\n} = defineProps<{\n /** Computed list of all available Http Client options */\n clientOptions: ClientOptionGroup[]\n /** The currently selected Http Client (a built-in client id or a custom sample id) */\n selectedClient?: string\n /** Event bus */\n eventBus: WorkspaceEventBus\n}>()\n\nconst headingId = useId()\nconst morePanel = useId()\n\n/**\n * Whether a selection is a custom code sample (e.g. `custom/python`) rather than\n * a built-in client. Custom samples are matched by the `custom/` id prefix, which\n * mirrors the `^custom/` pattern enforced on the stored default client.\n */\nconst isCustomSelection = (client: string | undefined) =>\n Boolean(client?.startsWith('custom/'))\n\n/**\n * The generic client this selector actually displays.\n *\n * The introduction selector only represents the built-in HTTP clients. Custom\n * code samples are operation-specific and \"always just have the generic\n * clients\", so when one is selected globally we keep showing the last generic\n * client here instead of switching to (and failing to render) a custom sample.\n */\nconst activeClient = ref(\n isCustomSelection(selectedClient) ? DEFAULT_CLIENT : selectedClient,\n)\n\nwatch(\n () => selectedClient,\n (newClient) => {\n if (!isCustomSelection(newClient)) {\n activeClient.value = newClient\n }\n },\n)\n\n/** Grab the option for the currently selected Http Client */\nconst selectedClientOption = computed(\n () =>\n clientOptions.flatMap(\n (optionGroup) =>\n optionGroup.options.find(\n (option) => option.id === activeClient.value,\n ) ?? [],\n )[0],\n)\n\n/** List of featured clients */\nconst featuredClients = computed(() => getFeaturedClients(clientOptions))\n\n/** Currently selected tab index */\nconst tabIndex = computed(() =>\n featuredClients.value.findIndex(\n (featuredClient) => activeClient.value === featuredClient.id,\n ),\n)\n\nconst wrapper = useTemplateRef('wrapper-ref')\n\n/** Emit the selected client event on tab */\nconst onTabSelect = (i: number) => {\n const client = featuredClients.value[i]\n\n if (!client || !wrapper.value) {\n return\n }\n\n eventBus.emit('workspace:update:selected-client', client.id)\n}\n\ndefineExpose({\n selectedClientOption,\n})\n</script>\n<template>\n <div\n v-if=\"clientOptions.length\"\n ref=\"wrapper-ref\">\n <TabGroup\n manual\n :selectedIndex=\"tabIndex\"\n @change=\"onTabSelect\">\n <div\n :id=\"headingId\"\n class=\"client-libraries-heading\">\n Client Libraries\n </div>\n\n <!-- Tabs -->\n <TabList\n :aria-labelledby=\"headingId\"\n class=\"client-libraries-list\">\n <ClientDropdown\n :clientOptions\n :eventBus\n :featuredClients\n :morePanel\n :selectedClient=\"activeClient\" />\n </TabList>\n\n <!-- Content -->\n <TabPanels>\n <template v-if=\"isFeaturedClient(activeClient)\">\n <TabPanel\n v-for=\"client in featuredClients\"\n :key=\"client.id\"\n class=\"selected-client card-footer -outline-offset-2\">\n {{ client.title }}\n </TabPanel>\n </template>\n <div\n v-else\n :id=\"morePanel\"\n class=\"selected-client card-footer -outline-offset-2\"\n role=\"tabpanel\"\n tabindex=\"0\">\n {{ selectedClientOption?.title }}\n </div>\n </TabPanels>\n </TabGroup>\n </div>\n</template>\n<style scoped>\n.selected-client {\n color: var(--scalar-color-1);\n font-size: var(--scalar-small);\n font-family: var(--scalar-font-code);\n padding: 9px 12px;\n border-top: none;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n background: var(--scalar-background-1);\n border: var(--scalar-border-width) solid var(--scalar-border-color);\n border-bottom-left-radius: var(--scalar-radius-xl);\n border-bottom-right-radius: var(--scalar-radius-xl);\n min-height: fit-content;\n}\n.client-libraries-heading {\n font-size: var(--scalar-small);\n font-weight: var(--scalar-font-medium);\n color: var(--scalar-color-1);\n padding: 9px 12px;\n background-color: var(--scalar-background-2);\n display: flex;\n align-items: center;\n max-height: 32px;\n border: var(--scalar-border-width) solid var(--scalar-border-color);\n border-top-left-radius: var(--scalar-radius-xl);\n border-top-right-radius: var(--scalar-radius-xl);\n}\n</style>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;EA6BA,MAAM,YAAY,OAAM;EACxB,MAAM,YAAY,OAAM;;;;;;EAOxB,MAAM,qBAAqB,WACzB,QAAQ,QAAQ,WAAW,UAAU,CAAA;;;;;;;;;EAUvC,MAAM,eAAe,IACnB,kBAAkB,QAAA,eAAe,GAAG,iBAAiB,QAAA,eACvD;AAEA,cACQ,QAAA,iBACL,cAAc;AACb,OAAI,CAAC,kBAAkB,UAAU,CAC/B,cAAa,QAAQ;IAG3B;;EAGA,MAAM,uBAAuB,eAEzB,QAAA,cAAc,SACX,gBACC,YAAY,QAAQ,MACjB,WAAW,OAAO,OAAO,aAAa,MACxC,IAAI,EAAE,CACV,CAAC,GACN;;EAGA,MAAM,kBAAkB,eAAe,mBAAmB,QAAA,cAAc,CAAA;;EAGxE,MAAM,WAAW,eACf,gBAAgB,MAAM,WACnB,mBAAmB,aAAa,UAAU,eAAe,GAC3D,CACH;EAEA,MAAM,UAAU,eAAe,cAAa;;EAG5C,MAAM,eAAe,MAAc;GACjC,MAAM,SAAS,gBAAgB,MAAM;AAErC,OAAI,CAAC,UAAU,CAAC,QAAQ,MACtB;AAGF,WAAA,SAAS,KAAK,oCAAoC,OAAO,GAAE;;AAG7D,WAAa,EACX,sBACD,CAAA;;UAIS,QAAA,cAAc,UAAA,WAAA,EADtB,mBA6CM,OA7CN,YA6CM,CA1CJ,YAyCW,MAAA,SAAA,EAAA;IAxCT,QAAA;IACC,eAAe,SAAA;IACf,UAAQ;;2BAKH;KAJN,mBAIM,OAAA;MAHH,IAAI,MAAA,UAAS;MACd,OAAM;QAA2B,sBAEnC,GAAA,WAAA;KAGA,YASU,MAAA,QAAA,EAAA;MARP,mBAAiB,MAAA,UAAS;MAC3B,OAAM;;6BAM6B,CALnC,YAKmC,wBAAA;OAJhC,eAAA,QAAA;OACA,UAAA,QAAA;OACA,iBAAA,gBAAA;OACA,WAAA,MAAA,UAAS;OACT,gBAAgB,aAAA;;;;;;;;;;KAIrB,YAiBY,MAAA,UAAA,EAAA,MAAA;6BATC,CAPK,MAAA,iBAAgB,CAAC,aAAA,MAAY,IAAA,UAAA,KAAA,EAC3C,mBAKW,UAAA,EAAA,KAAA,GAAA,EAAA,WAJQ,gBAAA,QAAV,WAAM;2BADf,YAKW,MAAA,SAAA,EAAA;QAHR,KAAK,OAAO;QACb,OAAM;;+BACY,CAAA,gBAAA,gBAAf,OAAO,MAAK,EAAA,EAAA,CAAA,CAAA;;;gCAGnB,mBAOM,OAAA;;OALH,IAAI,MAAA,UAAS;OACd,OAAM;OACN,MAAK;OACL,UAAS;yBACN,qBAAA,OAAsB,MAAK,EAAA,GAAA,WAAA,EAAA,CAAA"}
@@ -1,7 +1,7 @@
1
1
  import type { ClientOption, ClientOptionGroup } from '@scalar/api-client/blocks/operation-code-sample';
2
2
  import type { AvailableClients } from '@scalar/snippetz';
3
3
  /** Whether or not a client is in the featured list */
4
- export declare const isFeaturedClient: (clientId: AvailableClients[number] | undefined, featuredClients?: AvailableClients[number][]) => boolean;
4
+ export declare const isFeaturedClient: (clientId: string | undefined, featuredClients?: AvailableClients[number][]) => boolean;
5
5
  /**
6
6
  * Maps featured client IDs to their corresponding ClientOption objects.
7
7
  * Returns an array of ClientOption objects that match the featured clients list,
@@ -1 +1 @@
1
- {"version":3,"file":"featured-clients.d.ts","sourceRoot":"","sources":["../../../../src/blocks/scalar-client-selector-block/helpers/featured-clients.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,iDAAiD,CAAA;AACtG,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAWxD,sDAAsD;AACtD,eAAO,MAAM,gBAAgB,GAC3B,UAAU,gBAAgB,CAAC,MAAM,CAAC,GAAG,SAAS,EAC9C,kBAAiB,gBAAgB,CAAC,MAAM,CAAC,EAAqB,YACgC,CAAA;AAEhG;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,GAC7B,eAAe,iBAAiB,EAAE,EAClC,kBAAiB,gBAAgB,CAAC,MAAM,CAAC,EAAqB,KAC7D,YAAY,EAgBd,CAAA"}
1
+ {"version":3,"file":"featured-clients.d.ts","sourceRoot":"","sources":["../../../../src/blocks/scalar-client-selector-block/helpers/featured-clients.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,iDAAiD,CAAA;AACtG,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAWxD,sDAAsD;AACtD,eAAO,MAAM,gBAAgB,GAC3B,UAAU,MAAM,GAAG,SAAS,EAC5B,kBAAiB,gBAAgB,CAAC,MAAM,CAAC,EAAqB,YACgC,CAAA;AAEhG;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,GAC7B,eAAe,iBAAiB,EAAE,EAClC,kBAAiB,gBAAgB,CAAC,MAAM,CAAC,EAAqB,KAC7D,YAAY,EAgBd,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"featured-clients.js","names":[],"sources":["../../../../src/blocks/scalar-client-selector-block/helpers/featured-clients.ts"],"sourcesContent":["import type { ClientOption, ClientOptionGroup } from '@scalar/api-client/blocks/operation-code-sample'\nimport type { AvailableClients } from '@scalar/snippetz'\n\n/** Hard coded list of default featured clients */\nconst FEATURED_CLIENTS = [\n 'shell/curl',\n 'ruby/native',\n 'node/undici',\n 'php/guzzle',\n 'python/python3',\n] satisfies AvailableClients[number][]\n\n/** Whether or not a client is in the featured list */\nexport const isFeaturedClient = (\n clientId: AvailableClients[number] | undefined,\n featuredClients: AvailableClients[number][] = FEATURED_CLIENTS,\n) => Boolean(clientId && featuredClients.includes(clientId as (typeof featuredClients)[number]))\n\n/**\n * Maps featured client IDs to their corresponding ClientOption objects.\n * Returns an array of ClientOption objects that match the featured clients list,\n * maintaining the order of the featured clients.\n */\nexport const getFeaturedClients = (\n clientOptions: ClientOptionGroup[],\n featuredClients: AvailableClients[number][] = FEATURED_CLIENTS,\n): ClientOption[] => {\n // Create a map of all available client options for quick lookup\n const clientMap = new Map<string, ClientOption>()\n\n // Using the map means we only have to loop through once\n for (const group of clientOptions) {\n for (const option of group.options) {\n clientMap.set(option.id, option)\n }\n }\n\n // Map featured clients to their corresponding options, maintaining order\n return featuredClients.flatMap((clientId) => {\n const client = clientMap.get(clientId)\n return client ?? []\n })\n}\n"],"mappings":";;AAIA,IAAM,mBAAmB;CACvB;CACA;CACA;CACA;CACA;CACD;;AAGD,IAAa,oBACX,UACA,kBAA8C,qBAC3C,QAAQ,YAAY,gBAAgB,SAAS,SAA6C,CAAC;;;;;;AAOhG,IAAa,sBACX,eACA,kBAA8C,qBAC3B;CAEnB,MAAM,4BAAY,IAAI,KAA2B;AAGjD,MAAK,MAAM,SAAS,cAClB,MAAK,MAAM,UAAU,MAAM,QACzB,WAAU,IAAI,OAAO,IAAI,OAAO;AAKpC,QAAO,gBAAgB,SAAS,aAAa;AAE3C,SADe,UAAU,IAAI,SAAS,IACrB,EAAE;GACnB"}
1
+ {"version":3,"file":"featured-clients.js","names":[],"sources":["../../../../src/blocks/scalar-client-selector-block/helpers/featured-clients.ts"],"sourcesContent":["import type { ClientOption, ClientOptionGroup } from '@scalar/api-client/blocks/operation-code-sample'\nimport type { AvailableClients } from '@scalar/snippetz'\n\n/** Hard coded list of default featured clients */\nconst FEATURED_CLIENTS = [\n 'shell/curl',\n 'ruby/native',\n 'node/undici',\n 'php/guzzle',\n 'python/python3',\n] satisfies AvailableClients[number][]\n\n/** Whether or not a client is in the featured list */\nexport const isFeaturedClient = (\n clientId: string | undefined,\n featuredClients: AvailableClients[number][] = FEATURED_CLIENTS,\n) => Boolean(clientId && featuredClients.includes(clientId as (typeof featuredClients)[number]))\n\n/**\n * Maps featured client IDs to their corresponding ClientOption objects.\n * Returns an array of ClientOption objects that match the featured clients list,\n * maintaining the order of the featured clients.\n */\nexport const getFeaturedClients = (\n clientOptions: ClientOptionGroup[],\n featuredClients: AvailableClients[number][] = FEATURED_CLIENTS,\n): ClientOption[] => {\n // Create a map of all available client options for quick lookup\n const clientMap = new Map<string, ClientOption>()\n\n // Using the map means we only have to loop through once\n for (const group of clientOptions) {\n for (const option of group.options) {\n clientMap.set(option.id, option)\n }\n }\n\n // Map featured clients to their corresponding options, maintaining order\n return featuredClients.flatMap((clientId) => {\n const client = clientMap.get(clientId)\n return client ?? []\n })\n}\n"],"mappings":";;AAIA,IAAM,mBAAmB;CACvB;CACA;CACA;CACA;CACA;CACD;;AAGD,IAAa,oBACX,UACA,kBAA8C,qBAC3C,QAAQ,YAAY,gBAAgB,SAAS,SAA6C,CAAC;;;;;;AAOhG,IAAa,sBACX,eACA,kBAA8C,qBAC3B;CAEnB,MAAM,4BAAY,IAAI,KAA2B;AAGjD,MAAK,MAAM,SAAS,cAClB,MAAK,MAAM,UAAU,MAAM,QACzB,WAAU,IAAI,OAAO,IAAI,OAAO;AAKpC,QAAO,gBAAgB,SAAS,aAAa;AAE3C,SADe,UAAU,IAAI,SAAS,IACrB,EAAE;GACnB"}
@@ -0,0 +1,9 @@
1
+ import type { XScalarSdkInstallation } from '@scalar/workspace-store/schemas/extensions/document/x-scalar-sdk-installation';
2
+ type __VLS_Props = {
3
+ /** Custom SDK installation instructions from `x-scalar-sdk-installation` */
4
+ xScalarSdkInstallation?: XScalarSdkInstallation['x-scalar-sdk-installation'];
5
+ };
6
+ declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
7
+ declare const _default: typeof __VLS_export;
8
+ export default _default;
9
+ //# sourceMappingURL=SdkInstallationInstructions.vue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SdkInstallationInstructions.vue.d.ts","sourceRoot":"","sources":["../../../../src/blocks/scalar-sdk-installation-instructions/components/SdkInstallationInstructions.vue"],"names":[],"mappings":"AA0cA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,+EAA+E,CAAA;AAe3H,KAAK,WAAW,GAAG;IACjB,4EAA4E;IAC5E,sBAAsB,CAAC,EAAE,sBAAsB,CAAC,2BAA2B,CAAC,CAAA;CAC7E,CAAC;AA+cF,QAAA,MAAM,YAAY,kSAEhB,CAAC;wBACkB,OAAO,YAAY;AAAxC,wBAAyC"}
@@ -0,0 +1,9 @@
1
+ import _plugin_vue_export_helper_default from "../../../_virtual/_plugin-vue_export-helper.js";
2
+ import SdkInstallationInstructions_vue_vue_type_script_setup_true_lang_default from "./SdkInstallationInstructions.vue.script.js";
3
+ /* empty css */
4
+ //#region src/blocks/scalar-sdk-installation-instructions/components/SdkInstallationInstructions.vue
5
+ var SdkInstallationInstructions_default = /* @__PURE__ */ _plugin_vue_export_helper_default(SdkInstallationInstructions_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-9931144b"]]);
6
+ //#endregion
7
+ export { SdkInstallationInstructions_default as default };
8
+
9
+ //# sourceMappingURL=SdkInstallationInstructions.vue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SdkInstallationInstructions.vue.js","names":[],"sources":["../../../../src/blocks/scalar-sdk-installation-instructions/components/SdkInstallationInstructions.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport {\n ScalarCombobox,\n type ScalarComboboxOption,\n} from '@scalar/components/combobox'\nimport { ScalarIcon } from '@scalar/components/icon'\nimport { ScalarMarkdown } from '@scalar/components/markdown'\nimport type { XScalarSdkInstallation } from '@scalar/workspace-store/schemas/extensions/document/x-scalar-sdk-installation'\nimport {\n computed,\n nextTick,\n onBeforeUnmount,\n onMounted,\n ref,\n useId,\n watch,\n} from 'vue'\n\nimport { getLanguageIcon } from '../helpers/language-icon'\nimport { getRenderableSdks } from '../helpers/renderable-sdks'\nimport { getVisibleTabCount } from '../helpers/visible-tab-count'\n\nconst { xScalarSdkInstallation } = defineProps<{\n /** Custom SDK installation instructions from `x-scalar-sdk-installation` */\n xScalarSdkInstallation?: XScalarSdkInstallation['x-scalar-sdk-installation']\n}>()\n\nconst headingId = useId()\n/** Base id used to associate each tab with the shared panel for assistive tech */\nconst baseId = useId()\nconst panelId = `${baseId}-panel`\n\n/** Only the SDKs that actually have something to show, with their resolved icon */\nconst sdks = computed(() =>\n getRenderableSdks(xScalarSdkInstallation).map((sdk) => ({\n ...sdk,\n icon: getLanguageIcon(sdk.lang),\n })),\n)\n\n/** Index of the currently selected SDK */\nconst selectedIndex = ref(0)\n\n/** The currently selected SDK */\nconst selected = computed(() => sdks.value[selectedIndex.value])\n\n// Keep the selection in range and re-measure whenever the set of SDKs changes.\n// Keying on the languages (not just the count) also catches documents that swap\n// in a different set of the same size, which would otherwise leave the cached\n// tab widths — and the \"More\" overflow logic — stale.\nwatch(\n () => sdks.value.map((sdk) => sdk.lang).join('\\n'),\n () => {\n if (selectedIndex.value > sdks.value.length - 1) {\n selectedIndex.value = 0\n }\n void nextTick(measure)\n },\n)\n\nconst tabsRef = ref<HTMLElement>()\nconst measureRef = ref<HTMLElement>()\n\n/** The width available to render the tabs in */\nconst availableWidth = ref(0)\n/** The natural width of each tab */\nconst tabWidths = ref<number[]>([])\n/** The width of the \"More\" dropdown trigger */\nconst moreWidth = ref(0)\n\n/** Measure the available width and the natural width of each tab */\nconst measure = () => {\n const measureEl = measureRef.value\n const tabsEl = tabsRef.value\n\n if (!measureEl || !tabsEl) {\n return\n }\n\n // The measuring row renders every tab followed by the \"More\" trigger\n const widths = Array.from(measureEl.children).map(\n (child) => (child as HTMLElement).offsetWidth,\n )\n\n tabWidths.value = widths.slice(0, sdks.value.length)\n moreWidth.value = widths[sdks.value.length] ?? 0\n availableWidth.value = tabsEl.clientWidth\n}\n\n/** How many tabs fit inline before we need the \"More\" dropdown */\nconst visibleCount = computed(() => {\n // Until we have measured, render everything (also the server-rendered state)\n if (!tabWidths.value.length || availableWidth.value <= 0) {\n return sdks.value.length\n }\n\n return getVisibleTabCount(\n tabWidths.value,\n availableWidth.value,\n moreWidth.value,\n )\n})\n\n/** The SDKs shown as inline tabs */\nconst visibleSdks = computed(() => sdks.value.slice(0, visibleCount.value))\n\n/** Whether the selected SDK lives in the \"More\" dropdown */\nconst isMoreActive = computed(() => selectedIndex.value >= visibleCount.value)\n\n/** The overflowing SDKs as combobox options, keyed by their original index */\nconst moreOptions = computed<ScalarComboboxOption[]>(() =>\n sdks.value.slice(visibleCount.value).map((sdk, index) => ({\n id: String(visibleCount.value + index),\n label: sdk.lang,\n })),\n)\n\n/** The selected option within the \"More\" dropdown, if any */\nconst selectedMoreOption = computed(() =>\n moreOptions.value.find((option) => option.id === String(selectedIndex.value)),\n)\n\nconst selectMore = (option: ScalarComboboxOption | undefined) => {\n if (option) {\n selectedIndex.value = Number(option.id)\n }\n}\n\n/** The id of the tab that labels the panel (falls back to the heading when the selection lives in \"More\") */\nconst activeTabId = computed(() =>\n isMoreActive.value ? headingId : `${baseId}-tab-${selectedIndex.value}`,\n)\n\n/**\n * The visible tab that holds the roving tabindex. When the selection lives in\n * the \"More\" dropdown, that trigger is the tab stop instead, so no inline tab\n * should be focusable.\n */\nconst tabStopIndex = computed(() =>\n isMoreActive.value ? -1 : selectedIndex.value,\n)\n\n/** Focus a visible tab by index after the DOM has settled */\nconst focusTab = (index: number) => {\n void nextTick(() => {\n tabsRef.value\n ?.querySelectorAll<HTMLButtonElement>('[role=\"tab\"]')\n [index]?.focus()\n })\n}\n\n/** Arrow / Home / End keyboard navigation across the visible tabs (WAI-ARIA tabs pattern) */\nconst onTabKeydown = (event: KeyboardEvent, index: number) => {\n const lastVisible = visibleCount.value - 1\n\n let next = index\n switch (event.key) {\n case 'ArrowRight':\n case 'ArrowDown':\n next = index >= lastVisible ? 0 : index + 1\n break\n case 'ArrowLeft':\n case 'ArrowUp':\n next = index <= 0 ? lastVisible : index - 1\n break\n case 'Home':\n next = 0\n break\n case 'End':\n next = lastVisible\n break\n default:\n return\n }\n\n event.preventDefault()\n selectedIndex.value = next\n focusTab(next)\n}\n\nlet observer: ResizeObserver | undefined\nlet frame = 0\n\n/** Coalesce resize bursts into a single measure before the next paint */\nconst scheduleMeasure = () => {\n if (typeof requestAnimationFrame === 'undefined') {\n measure()\n return\n }\n cancelAnimationFrame(frame)\n frame = requestAnimationFrame(measure)\n}\n\nonMounted(() => {\n if (typeof ResizeObserver !== 'undefined') {\n observer = new ResizeObserver(scheduleMeasure)\n // Observe the visible row for the available width, and the hidden measure\n // row for the natural tab widths. The latter catches changes the container\n // never sees — web fonts loading, or labels changing without the count\n // changing — which would otherwise leave the overflow logic stale.\n if (tabsRef.value) {\n observer.observe(tabsRef.value)\n }\n if (measureRef.value) {\n observer.observe(measureRef.value)\n }\n }\n measure()\n})\n\nonBeforeUnmount(() => {\n observer?.disconnect()\n if (typeof cancelAnimationFrame !== 'undefined') {\n cancelAnimationFrame(frame)\n }\n})\n</script>\n<template>\n <div v-if=\"sdks.length\">\n <div\n :id=\"headingId\"\n class=\"client-libraries-heading\">\n Client Libraries\n </div>\n\n <!-- Tabs -->\n <div class=\"client-libraries-content\">\n <div\n ref=\"tabsRef\"\n :aria-labelledby=\"headingId\"\n class=\"client-libraries-row\"\n role=\"tablist\">\n <button\n v-for=\"(sdk, index) in visibleSdks\"\n :id=\"`${baseId}-tab-${index}`\"\n :key=\"index\"\n :aria-controls=\"panelId\"\n :aria-selected=\"index === selectedIndex\"\n class=\"client-libraries\"\n :class=\"{ 'client-libraries__active': index === selectedIndex }\"\n role=\"tab\"\n :tabindex=\"index === tabStopIndex ? 0 : -1\"\n type=\"button\"\n @click=\"selectedIndex = index\"\n @keydown=\"onTabKeydown($event, index)\">\n <ScalarIcon\n v-if=\"sdk.icon\"\n class=\"client-libraries-icon\"\n :icon=\"sdk.icon\" />\n <span class=\"client-libraries-text\">{{ sdk.lang }}</span>\n </button>\n\n <!-- More dropdown -->\n <ScalarCombobox\n v-if=\"visibleCount < sdks.length\"\n :modelValue=\"selectedMoreOption\"\n :options=\"moreOptions\"\n placement=\"bottom-end\"\n teleport\n @update:modelValue=\"selectMore\">\n <button\n class=\"client-libraries client-libraries-more\"\n :class=\"{ 'client-libraries__active': isMoreActive }\"\n type=\"button\">\n <ScalarIcon\n class=\"client-libraries-icon\"\n :icon=\"\n isMoreActive && selected?.icon ? selected.icon : 'Ellipses'\n \" />\n <span class=\"client-libraries-text\">More</span>\n </button>\n </ScalarCombobox>\n </div>\n\n <!-- Hidden row used to measure the natural width of every tab. It is\n clipped to a zero-size box so it never contributes to the scrollable\n width of the (horizontally scrollable) row above. -->\n <div\n aria-hidden=\"true\"\n class=\"client-libraries-measure-clip\">\n <div\n ref=\"measureRef\"\n class=\"client-libraries-row client-libraries-row--measure\">\n <span\n v-for=\"(sdk, index) in sdks\"\n :key=\"index\"\n class=\"client-libraries\">\n <ScalarIcon\n v-if=\"sdk.icon\"\n class=\"client-libraries-icon\"\n :icon=\"sdk.icon\" />\n <span class=\"client-libraries-text\">{{ sdk.lang }}</span>\n </span>\n <span class=\"client-libraries\">\n <ScalarIcon\n class=\"client-libraries-icon\"\n icon=\"Ellipses\" />\n <span class=\"client-libraries-text\">More</span>\n </span>\n </div>\n </div>\n </div>\n\n <!-- Content: Markdown installation instructions (supports code blocks) -->\n <div\n v-if=\"selected?.description\"\n :id=\"panelId\"\n :aria-labelledby=\"activeTabId\"\n class=\"selected-client\"\n role=\"tabpanel\"\n tabindex=\"0\">\n <ScalarMarkdown :value=\"selected.description\" />\n </div>\n </div>\n</template>\n<style scoped>\n/* One panel holds the Markdown installation instructions */\n.selected-client {\n display: flex;\n flex-direction: column;\n gap: 9px;\n color: var(--scalar-color-1);\n font-size: var(--scalar-small);\n padding: 9px 12px;\n background: var(--scalar-background-1);\n border: var(--scalar-border-width) solid var(--scalar-border-color);\n border-top: none;\n border-bottom-left-radius: var(--scalar-radius-xl);\n border-bottom-right-radius: var(--scalar-radius-xl);\n}\n.client-libraries-heading {\n font-size: var(--scalar-small);\n font-weight: var(--scalar-font-medium);\n color: var(--scalar-color-1);\n padding: 9px 12px;\n background-color: var(--scalar-background-2);\n display: flex;\n align-items: center;\n max-height: 32px;\n border: var(--scalar-border-width) solid var(--scalar-border-color);\n border-top-left-radius: var(--scalar-radius-xl);\n border-top-right-radius: var(--scalar-radius-xl);\n}\n.client-libraries-content {\n position: relative;\n /*\n * Scroll horizontally rather than clip: before JS measures the tab widths\n * (and without JS at all) every tab is rendered, so overflowing tabs must\n * stay reachable. Once measured, the \"More\" dropdown absorbs the overflow and\n * no scrollbar is shown. The bar itself is hidden — keyboard focus and touch\n * still scroll clipped tabs into view.\n */\n overflow-x: auto;\n overflow-y: hidden;\n scrollbar-width: none;\n padding: 0 12px;\n background-color: var(--scalar-background-1);\n border-left: var(--scalar-border-width) solid var(--scalar-border-color);\n border-right: var(--scalar-border-width) solid var(--scalar-border-color);\n border-bottom: var(--scalar-border-width) solid var(--scalar-border-color);\n}\n.client-libraries-content::-webkit-scrollbar {\n display: none;\n}\n.client-libraries-row {\n display: flex;\n justify-content: flex-start;\n}\n/* Zero-size clip so the measure row never adds to the scrollable width */\n.client-libraries-measure-clip {\n position: absolute;\n top: 0;\n left: 0;\n width: 0;\n height: 0;\n overflow: hidden;\n}\n/* Off-screen row used only to measure natural tab widths */\n.client-libraries-row--measure {\n width: max-content;\n visibility: hidden;\n pointer-events: none;\n}\n.client-libraries {\n display: flex;\n align-items: center;\n justify-content: center;\n position: relative;\n cursor: pointer;\n white-space: nowrap;\n /* Keep tabs at their natural (measured) width so they scroll rather than squish */\n flex-shrink: 0;\n padding: 8px 12px;\n gap: 6px;\n color: var(--scalar-color-3);\n border-bottom: 1px solid transparent;\n background: transparent;\n user-select: none;\n}\n.client-libraries:not(.client-libraries__active):hover:before {\n content: '';\n position: absolute;\n width: calc(100% - 4px);\n height: calc(100% - 4px);\n background: var(--scalar-background-2);\n left: 2px;\n top: 2px;\n z-index: 0;\n border-radius: var(--scalar-radius);\n}\n.client-libraries:active {\n color: var(--scalar-color-1);\n}\n.client-libraries:focus-visible {\n outline: none;\n box-shadow: inset 0 0 0 1px var(--scalar-color-accent);\n}\n.client-libraries__active {\n color: var(--scalar-color-1);\n border-bottom: 1px solid var(--scalar-color-1);\n}\n/* Always pin the \"More\" dropdown to the right edge */\n.client-libraries-more {\n margin-left: auto;\n}\n.client-libraries-icon {\n max-width: 14px;\n max-height: 14px;\n min-width: 14px;\n width: 100%;\n aspect-ratio: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n position: relative;\n box-sizing: border-box;\n color: currentColor;\n}\n.client-libraries .client-libraries-text {\n font-size: var(--scalar-small);\n position: relative;\n display: flex;\n align-items: center;\n}\n.client-libraries__active .client-libraries-text {\n color: var(--scalar-color-1);\n font-weight: var(--scalar-semibold);\n}\n</style>\n"],"mappings":""}
@@ -0,0 +1,225 @@
1
+ import { getLanguageIcon } from "../helpers/language-icon.js";
2
+ import { getRenderableSdks } from "../helpers/renderable-sdks.js";
3
+ import { getVisibleTabCount } from "../helpers/visible-tab-count.js";
4
+ import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createVNode, defineComponent, nextTick, normalizeClass, onBeforeUnmount, onMounted, openBlock, ref, renderList, toDisplayString, unref, useId, watch, withCtx } from "vue";
5
+ import { ScalarMarkdown } from "@scalar/components/markdown";
6
+ import { ScalarCombobox } from "@scalar/components/combobox";
7
+ import { ScalarIcon } from "@scalar/components/icon";
8
+ //#region src/blocks/scalar-sdk-installation-instructions/components/SdkInstallationInstructions.vue?vue&type=script&setup=true&lang.ts
9
+ var _hoisted_1 = { key: 0 };
10
+ var _hoisted_2 = ["id"];
11
+ var _hoisted_3 = { class: "client-libraries-content" };
12
+ var _hoisted_4 = ["aria-labelledby"];
13
+ var _hoisted_5 = [
14
+ "id",
15
+ "aria-selected",
16
+ "tabindex",
17
+ "onClick",
18
+ "onKeydown"
19
+ ];
20
+ var _hoisted_6 = { class: "client-libraries-text" };
21
+ var _hoisted_7 = {
22
+ "aria-hidden": "true",
23
+ class: "client-libraries-measure-clip"
24
+ };
25
+ var _hoisted_8 = { class: "client-libraries-text" };
26
+ var _hoisted_9 = { class: "client-libraries" };
27
+ var _hoisted_10 = ["aria-labelledby"];
28
+ var SdkInstallationInstructions_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
29
+ __name: "SdkInstallationInstructions",
30
+ props: { xScalarSdkInstallation: {} },
31
+ setup(__props) {
32
+ const headingId = useId();
33
+ /** Base id used to associate each tab with the shared panel for assistive tech */
34
+ const baseId = useId();
35
+ const panelId = `${baseId}-panel`;
36
+ /** Only the SDKs that actually have something to show, with their resolved icon */
37
+ const sdks = computed(() => getRenderableSdks(__props.xScalarSdkInstallation).map((sdk) => ({
38
+ ...sdk,
39
+ icon: getLanguageIcon(sdk.lang)
40
+ })));
41
+ /** Index of the currently selected SDK */
42
+ const selectedIndex = ref(0);
43
+ /** The currently selected SDK */
44
+ const selected = computed(() => sdks.value[selectedIndex.value]);
45
+ watch(() => sdks.value.map((sdk) => sdk.lang).join("\n"), () => {
46
+ if (selectedIndex.value > sdks.value.length - 1) selectedIndex.value = 0;
47
+ nextTick(measure);
48
+ });
49
+ const tabsRef = ref();
50
+ const measureRef = ref();
51
+ /** The width available to render the tabs in */
52
+ const availableWidth = ref(0);
53
+ /** The natural width of each tab */
54
+ const tabWidths = ref([]);
55
+ /** The width of the "More" dropdown trigger */
56
+ const moreWidth = ref(0);
57
+ /** Measure the available width and the natural width of each tab */
58
+ const measure = () => {
59
+ const measureEl = measureRef.value;
60
+ const tabsEl = tabsRef.value;
61
+ if (!measureEl || !tabsEl) return;
62
+ const widths = Array.from(measureEl.children).map((child) => child.offsetWidth);
63
+ tabWidths.value = widths.slice(0, sdks.value.length);
64
+ moreWidth.value = widths[sdks.value.length] ?? 0;
65
+ availableWidth.value = tabsEl.clientWidth;
66
+ };
67
+ /** How many tabs fit inline before we need the "More" dropdown */
68
+ const visibleCount = computed(() => {
69
+ if (!tabWidths.value.length || availableWidth.value <= 0) return sdks.value.length;
70
+ return getVisibleTabCount(tabWidths.value, availableWidth.value, moreWidth.value);
71
+ });
72
+ /** The SDKs shown as inline tabs */
73
+ const visibleSdks = computed(() => sdks.value.slice(0, visibleCount.value));
74
+ /** Whether the selected SDK lives in the "More" dropdown */
75
+ const isMoreActive = computed(() => selectedIndex.value >= visibleCount.value);
76
+ /** The overflowing SDKs as combobox options, keyed by their original index */
77
+ const moreOptions = computed(() => sdks.value.slice(visibleCount.value).map((sdk, index) => ({
78
+ id: String(visibleCount.value + index),
79
+ label: sdk.lang
80
+ })));
81
+ /** The selected option within the "More" dropdown, if any */
82
+ const selectedMoreOption = computed(() => moreOptions.value.find((option) => option.id === String(selectedIndex.value)));
83
+ const selectMore = (option) => {
84
+ if (option) selectedIndex.value = Number(option.id);
85
+ };
86
+ /** The id of the tab that labels the panel (falls back to the heading when the selection lives in "More") */
87
+ const activeTabId = computed(() => isMoreActive.value ? headingId : `${baseId}-tab-${selectedIndex.value}`);
88
+ /**
89
+ * The visible tab that holds the roving tabindex. When the selection lives in
90
+ * the "More" dropdown, that trigger is the tab stop instead, so no inline tab
91
+ * should be focusable.
92
+ */
93
+ const tabStopIndex = computed(() => isMoreActive.value ? -1 : selectedIndex.value);
94
+ /** Focus a visible tab by index after the DOM has settled */
95
+ const focusTab = (index) => {
96
+ nextTick(() => {
97
+ tabsRef.value?.querySelectorAll("[role=\"tab\"]")[index]?.focus();
98
+ });
99
+ };
100
+ /** Arrow / Home / End keyboard navigation across the visible tabs (WAI-ARIA tabs pattern) */
101
+ const onTabKeydown = (event, index) => {
102
+ const lastVisible = visibleCount.value - 1;
103
+ let next = index;
104
+ switch (event.key) {
105
+ case "ArrowRight":
106
+ case "ArrowDown":
107
+ next = index >= lastVisible ? 0 : index + 1;
108
+ break;
109
+ case "ArrowLeft":
110
+ case "ArrowUp":
111
+ next = index <= 0 ? lastVisible : index - 1;
112
+ break;
113
+ case "Home":
114
+ next = 0;
115
+ break;
116
+ case "End":
117
+ next = lastVisible;
118
+ break;
119
+ default: return;
120
+ }
121
+ event.preventDefault();
122
+ selectedIndex.value = next;
123
+ focusTab(next);
124
+ };
125
+ let observer;
126
+ let frame = 0;
127
+ /** Coalesce resize bursts into a single measure before the next paint */
128
+ const scheduleMeasure = () => {
129
+ if (typeof requestAnimationFrame === "undefined") {
130
+ measure();
131
+ return;
132
+ }
133
+ cancelAnimationFrame(frame);
134
+ frame = requestAnimationFrame(measure);
135
+ };
136
+ onMounted(() => {
137
+ if (typeof ResizeObserver !== "undefined") {
138
+ observer = new ResizeObserver(scheduleMeasure);
139
+ if (tabsRef.value) observer.observe(tabsRef.value);
140
+ if (measureRef.value) observer.observe(measureRef.value);
141
+ }
142
+ measure();
143
+ });
144
+ onBeforeUnmount(() => {
145
+ observer?.disconnect();
146
+ if (typeof cancelAnimationFrame !== "undefined") cancelAnimationFrame(frame);
147
+ });
148
+ return (_ctx, _cache) => {
149
+ return sdks.value.length ? (openBlock(), createElementBlock("div", _hoisted_1, [
150
+ createElementVNode("div", {
151
+ id: unref(headingId),
152
+ class: "client-libraries-heading"
153
+ }, " Client Libraries ", 8, _hoisted_2),
154
+ createElementVNode("div", _hoisted_3, [createElementVNode("div", {
155
+ ref_key: "tabsRef",
156
+ ref: tabsRef,
157
+ "aria-labelledby": unref(headingId),
158
+ class: "client-libraries-row",
159
+ role: "tablist"
160
+ }, [(openBlock(true), createElementBlock(Fragment, null, renderList(visibleSdks.value, (sdk, index) => {
161
+ return openBlock(), createElementBlock("button", {
162
+ id: `${unref(baseId)}-tab-${index}`,
163
+ key: index,
164
+ "aria-controls": panelId,
165
+ "aria-selected": index === selectedIndex.value,
166
+ class: normalizeClass(["client-libraries", { "client-libraries__active": index === selectedIndex.value }]),
167
+ role: "tab",
168
+ tabindex: index === tabStopIndex.value ? 0 : -1,
169
+ type: "button",
170
+ onClick: ($event) => selectedIndex.value = index,
171
+ onKeydown: ($event) => onTabKeydown($event, index)
172
+ }, [sdk.icon ? (openBlock(), createBlock(unref(ScalarIcon), {
173
+ key: 0,
174
+ class: "client-libraries-icon",
175
+ icon: sdk.icon
176
+ }, null, 8, ["icon"])) : createCommentVNode("", true), createElementVNode("span", _hoisted_6, toDisplayString(sdk.lang), 1)], 42, _hoisted_5);
177
+ }), 128)), visibleCount.value < sdks.value.length ? (openBlock(), createBlock(unref(ScalarCombobox), {
178
+ key: 0,
179
+ modelValue: selectedMoreOption.value,
180
+ options: moreOptions.value,
181
+ placement: "bottom-end",
182
+ teleport: "",
183
+ "onUpdate:modelValue": selectMore
184
+ }, {
185
+ default: withCtx(() => [createElementVNode("button", {
186
+ class: normalizeClass(["client-libraries client-libraries-more", { "client-libraries__active": isMoreActive.value }]),
187
+ type: "button"
188
+ }, [createVNode(unref(ScalarIcon), {
189
+ class: "client-libraries-icon",
190
+ icon: isMoreActive.value && selected.value?.icon ? selected.value.icon : "Ellipses"
191
+ }, null, 8, ["icon"]), _cache[0] || (_cache[0] = createElementVNode("span", { class: "client-libraries-text" }, "More", -1))], 2)]),
192
+ _: 1
193
+ }, 8, ["modelValue", "options"])) : createCommentVNode("", true)], 8, _hoisted_4), createElementVNode("div", _hoisted_7, [createElementVNode("div", {
194
+ ref_key: "measureRef",
195
+ ref: measureRef,
196
+ class: "client-libraries-row client-libraries-row--measure"
197
+ }, [(openBlock(true), createElementBlock(Fragment, null, renderList(sdks.value, (sdk, index) => {
198
+ return openBlock(), createElementBlock("span", {
199
+ key: index,
200
+ class: "client-libraries"
201
+ }, [sdk.icon ? (openBlock(), createBlock(unref(ScalarIcon), {
202
+ key: 0,
203
+ class: "client-libraries-icon",
204
+ icon: sdk.icon
205
+ }, null, 8, ["icon"])) : createCommentVNode("", true), createElementVNode("span", _hoisted_8, toDisplayString(sdk.lang), 1)]);
206
+ }), 128)), createElementVNode("span", _hoisted_9, [createVNode(unref(ScalarIcon), {
207
+ class: "client-libraries-icon",
208
+ icon: "Ellipses"
209
+ }), _cache[1] || (_cache[1] = createElementVNode("span", { class: "client-libraries-text" }, "More", -1))])], 512)])]),
210
+ selected.value?.description ? (openBlock(), createElementBlock("div", {
211
+ key: 0,
212
+ id: panelId,
213
+ "aria-labelledby": activeTabId.value,
214
+ class: "selected-client",
215
+ role: "tabpanel",
216
+ tabindex: "0"
217
+ }, [createVNode(unref(ScalarMarkdown), { value: selected.value.description }, null, 8, ["value"])], 8, _hoisted_10)) : createCommentVNode("", true)
218
+ ])) : createCommentVNode("", true);
219
+ };
220
+ }
221
+ });
222
+ //#endregion
223
+ export { SdkInstallationInstructions_vue_vue_type_script_setup_true_lang_default as default };
224
+
225
+ //# sourceMappingURL=SdkInstallationInstructions.vue.script.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SdkInstallationInstructions.vue.script.js","names":[],"sources":["../../../../src/blocks/scalar-sdk-installation-instructions/components/SdkInstallationInstructions.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport {\n ScalarCombobox,\n type ScalarComboboxOption,\n} from '@scalar/components/combobox'\nimport { ScalarIcon } from '@scalar/components/icon'\nimport { ScalarMarkdown } from '@scalar/components/markdown'\nimport type { XScalarSdkInstallation } from '@scalar/workspace-store/schemas/extensions/document/x-scalar-sdk-installation'\nimport {\n computed,\n nextTick,\n onBeforeUnmount,\n onMounted,\n ref,\n useId,\n watch,\n} from 'vue'\n\nimport { getLanguageIcon } from '../helpers/language-icon'\nimport { getRenderableSdks } from '../helpers/renderable-sdks'\nimport { getVisibleTabCount } from '../helpers/visible-tab-count'\n\nconst { xScalarSdkInstallation } = defineProps<{\n /** Custom SDK installation instructions from `x-scalar-sdk-installation` */\n xScalarSdkInstallation?: XScalarSdkInstallation['x-scalar-sdk-installation']\n}>()\n\nconst headingId = useId()\n/** Base id used to associate each tab with the shared panel for assistive tech */\nconst baseId = useId()\nconst panelId = `${baseId}-panel`\n\n/** Only the SDKs that actually have something to show, with their resolved icon */\nconst sdks = computed(() =>\n getRenderableSdks(xScalarSdkInstallation).map((sdk) => ({\n ...sdk,\n icon: getLanguageIcon(sdk.lang),\n })),\n)\n\n/** Index of the currently selected SDK */\nconst selectedIndex = ref(0)\n\n/** The currently selected SDK */\nconst selected = computed(() => sdks.value[selectedIndex.value])\n\n// Keep the selection in range and re-measure whenever the set of SDKs changes.\n// Keying on the languages (not just the count) also catches documents that swap\n// in a different set of the same size, which would otherwise leave the cached\n// tab widths — and the \"More\" overflow logic — stale.\nwatch(\n () => sdks.value.map((sdk) => sdk.lang).join('\\n'),\n () => {\n if (selectedIndex.value > sdks.value.length - 1) {\n selectedIndex.value = 0\n }\n void nextTick(measure)\n },\n)\n\nconst tabsRef = ref<HTMLElement>()\nconst measureRef = ref<HTMLElement>()\n\n/** The width available to render the tabs in */\nconst availableWidth = ref(0)\n/** The natural width of each tab */\nconst tabWidths = ref<number[]>([])\n/** The width of the \"More\" dropdown trigger */\nconst moreWidth = ref(0)\n\n/** Measure the available width and the natural width of each tab */\nconst measure = () => {\n const measureEl = measureRef.value\n const tabsEl = tabsRef.value\n\n if (!measureEl || !tabsEl) {\n return\n }\n\n // The measuring row renders every tab followed by the \"More\" trigger\n const widths = Array.from(measureEl.children).map(\n (child) => (child as HTMLElement).offsetWidth,\n )\n\n tabWidths.value = widths.slice(0, sdks.value.length)\n moreWidth.value = widths[sdks.value.length] ?? 0\n availableWidth.value = tabsEl.clientWidth\n}\n\n/** How many tabs fit inline before we need the \"More\" dropdown */\nconst visibleCount = computed(() => {\n // Until we have measured, render everything (also the server-rendered state)\n if (!tabWidths.value.length || availableWidth.value <= 0) {\n return sdks.value.length\n }\n\n return getVisibleTabCount(\n tabWidths.value,\n availableWidth.value,\n moreWidth.value,\n )\n})\n\n/** The SDKs shown as inline tabs */\nconst visibleSdks = computed(() => sdks.value.slice(0, visibleCount.value))\n\n/** Whether the selected SDK lives in the \"More\" dropdown */\nconst isMoreActive = computed(() => selectedIndex.value >= visibleCount.value)\n\n/** The overflowing SDKs as combobox options, keyed by their original index */\nconst moreOptions = computed<ScalarComboboxOption[]>(() =>\n sdks.value.slice(visibleCount.value).map((sdk, index) => ({\n id: String(visibleCount.value + index),\n label: sdk.lang,\n })),\n)\n\n/** The selected option within the \"More\" dropdown, if any */\nconst selectedMoreOption = computed(() =>\n moreOptions.value.find((option) => option.id === String(selectedIndex.value)),\n)\n\nconst selectMore = (option: ScalarComboboxOption | undefined) => {\n if (option) {\n selectedIndex.value = Number(option.id)\n }\n}\n\n/** The id of the tab that labels the panel (falls back to the heading when the selection lives in \"More\") */\nconst activeTabId = computed(() =>\n isMoreActive.value ? headingId : `${baseId}-tab-${selectedIndex.value}`,\n)\n\n/**\n * The visible tab that holds the roving tabindex. When the selection lives in\n * the \"More\" dropdown, that trigger is the tab stop instead, so no inline tab\n * should be focusable.\n */\nconst tabStopIndex = computed(() =>\n isMoreActive.value ? -1 : selectedIndex.value,\n)\n\n/** Focus a visible tab by index after the DOM has settled */\nconst focusTab = (index: number) => {\n void nextTick(() => {\n tabsRef.value\n ?.querySelectorAll<HTMLButtonElement>('[role=\"tab\"]')\n [index]?.focus()\n })\n}\n\n/** Arrow / Home / End keyboard navigation across the visible tabs (WAI-ARIA tabs pattern) */\nconst onTabKeydown = (event: KeyboardEvent, index: number) => {\n const lastVisible = visibleCount.value - 1\n\n let next = index\n switch (event.key) {\n case 'ArrowRight':\n case 'ArrowDown':\n next = index >= lastVisible ? 0 : index + 1\n break\n case 'ArrowLeft':\n case 'ArrowUp':\n next = index <= 0 ? lastVisible : index - 1\n break\n case 'Home':\n next = 0\n break\n case 'End':\n next = lastVisible\n break\n default:\n return\n }\n\n event.preventDefault()\n selectedIndex.value = next\n focusTab(next)\n}\n\nlet observer: ResizeObserver | undefined\nlet frame = 0\n\n/** Coalesce resize bursts into a single measure before the next paint */\nconst scheduleMeasure = () => {\n if (typeof requestAnimationFrame === 'undefined') {\n measure()\n return\n }\n cancelAnimationFrame(frame)\n frame = requestAnimationFrame(measure)\n}\n\nonMounted(() => {\n if (typeof ResizeObserver !== 'undefined') {\n observer = new ResizeObserver(scheduleMeasure)\n // Observe the visible row for the available width, and the hidden measure\n // row for the natural tab widths. The latter catches changes the container\n // never sees — web fonts loading, or labels changing without the count\n // changing — which would otherwise leave the overflow logic stale.\n if (tabsRef.value) {\n observer.observe(tabsRef.value)\n }\n if (measureRef.value) {\n observer.observe(measureRef.value)\n }\n }\n measure()\n})\n\nonBeforeUnmount(() => {\n observer?.disconnect()\n if (typeof cancelAnimationFrame !== 'undefined') {\n cancelAnimationFrame(frame)\n }\n})\n</script>\n<template>\n <div v-if=\"sdks.length\">\n <div\n :id=\"headingId\"\n class=\"client-libraries-heading\">\n Client Libraries\n </div>\n\n <!-- Tabs -->\n <div class=\"client-libraries-content\">\n <div\n ref=\"tabsRef\"\n :aria-labelledby=\"headingId\"\n class=\"client-libraries-row\"\n role=\"tablist\">\n <button\n v-for=\"(sdk, index) in visibleSdks\"\n :id=\"`${baseId}-tab-${index}`\"\n :key=\"index\"\n :aria-controls=\"panelId\"\n :aria-selected=\"index === selectedIndex\"\n class=\"client-libraries\"\n :class=\"{ 'client-libraries__active': index === selectedIndex }\"\n role=\"tab\"\n :tabindex=\"index === tabStopIndex ? 0 : -1\"\n type=\"button\"\n @click=\"selectedIndex = index\"\n @keydown=\"onTabKeydown($event, index)\">\n <ScalarIcon\n v-if=\"sdk.icon\"\n class=\"client-libraries-icon\"\n :icon=\"sdk.icon\" />\n <span class=\"client-libraries-text\">{{ sdk.lang }}</span>\n </button>\n\n <!-- More dropdown -->\n <ScalarCombobox\n v-if=\"visibleCount < sdks.length\"\n :modelValue=\"selectedMoreOption\"\n :options=\"moreOptions\"\n placement=\"bottom-end\"\n teleport\n @update:modelValue=\"selectMore\">\n <button\n class=\"client-libraries client-libraries-more\"\n :class=\"{ 'client-libraries__active': isMoreActive }\"\n type=\"button\">\n <ScalarIcon\n class=\"client-libraries-icon\"\n :icon=\"\n isMoreActive && selected?.icon ? selected.icon : 'Ellipses'\n \" />\n <span class=\"client-libraries-text\">More</span>\n </button>\n </ScalarCombobox>\n </div>\n\n <!-- Hidden row used to measure the natural width of every tab. It is\n clipped to a zero-size box so it never contributes to the scrollable\n width of the (horizontally scrollable) row above. -->\n <div\n aria-hidden=\"true\"\n class=\"client-libraries-measure-clip\">\n <div\n ref=\"measureRef\"\n class=\"client-libraries-row client-libraries-row--measure\">\n <span\n v-for=\"(sdk, index) in sdks\"\n :key=\"index\"\n class=\"client-libraries\">\n <ScalarIcon\n v-if=\"sdk.icon\"\n class=\"client-libraries-icon\"\n :icon=\"sdk.icon\" />\n <span class=\"client-libraries-text\">{{ sdk.lang }}</span>\n </span>\n <span class=\"client-libraries\">\n <ScalarIcon\n class=\"client-libraries-icon\"\n icon=\"Ellipses\" />\n <span class=\"client-libraries-text\">More</span>\n </span>\n </div>\n </div>\n </div>\n\n <!-- Content: Markdown installation instructions (supports code blocks) -->\n <div\n v-if=\"selected?.description\"\n :id=\"panelId\"\n :aria-labelledby=\"activeTabId\"\n class=\"selected-client\"\n role=\"tabpanel\"\n tabindex=\"0\">\n <ScalarMarkdown :value=\"selected.description\" />\n </div>\n </div>\n</template>\n<style scoped>\n/* One panel holds the Markdown installation instructions */\n.selected-client {\n display: flex;\n flex-direction: column;\n gap: 9px;\n color: var(--scalar-color-1);\n font-size: var(--scalar-small);\n padding: 9px 12px;\n background: var(--scalar-background-1);\n border: var(--scalar-border-width) solid var(--scalar-border-color);\n border-top: none;\n border-bottom-left-radius: var(--scalar-radius-xl);\n border-bottom-right-radius: var(--scalar-radius-xl);\n}\n.client-libraries-heading {\n font-size: var(--scalar-small);\n font-weight: var(--scalar-font-medium);\n color: var(--scalar-color-1);\n padding: 9px 12px;\n background-color: var(--scalar-background-2);\n display: flex;\n align-items: center;\n max-height: 32px;\n border: var(--scalar-border-width) solid var(--scalar-border-color);\n border-top-left-radius: var(--scalar-radius-xl);\n border-top-right-radius: var(--scalar-radius-xl);\n}\n.client-libraries-content {\n position: relative;\n /*\n * Scroll horizontally rather than clip: before JS measures the tab widths\n * (and without JS at all) every tab is rendered, so overflowing tabs must\n * stay reachable. Once measured, the \"More\" dropdown absorbs the overflow and\n * no scrollbar is shown. The bar itself is hidden — keyboard focus and touch\n * still scroll clipped tabs into view.\n */\n overflow-x: auto;\n overflow-y: hidden;\n scrollbar-width: none;\n padding: 0 12px;\n background-color: var(--scalar-background-1);\n border-left: var(--scalar-border-width) solid var(--scalar-border-color);\n border-right: var(--scalar-border-width) solid var(--scalar-border-color);\n border-bottom: var(--scalar-border-width) solid var(--scalar-border-color);\n}\n.client-libraries-content::-webkit-scrollbar {\n display: none;\n}\n.client-libraries-row {\n display: flex;\n justify-content: flex-start;\n}\n/* Zero-size clip so the measure row never adds to the scrollable width */\n.client-libraries-measure-clip {\n position: absolute;\n top: 0;\n left: 0;\n width: 0;\n height: 0;\n overflow: hidden;\n}\n/* Off-screen row used only to measure natural tab widths */\n.client-libraries-row--measure {\n width: max-content;\n visibility: hidden;\n pointer-events: none;\n}\n.client-libraries {\n display: flex;\n align-items: center;\n justify-content: center;\n position: relative;\n cursor: pointer;\n white-space: nowrap;\n /* Keep tabs at their natural (measured) width so they scroll rather than squish */\n flex-shrink: 0;\n padding: 8px 12px;\n gap: 6px;\n color: var(--scalar-color-3);\n border-bottom: 1px solid transparent;\n background: transparent;\n user-select: none;\n}\n.client-libraries:not(.client-libraries__active):hover:before {\n content: '';\n position: absolute;\n width: calc(100% - 4px);\n height: calc(100% - 4px);\n background: var(--scalar-background-2);\n left: 2px;\n top: 2px;\n z-index: 0;\n border-radius: var(--scalar-radius);\n}\n.client-libraries:active {\n color: var(--scalar-color-1);\n}\n.client-libraries:focus-visible {\n outline: none;\n box-shadow: inset 0 0 0 1px var(--scalar-color-accent);\n}\n.client-libraries__active {\n color: var(--scalar-color-1);\n border-bottom: 1px solid var(--scalar-color-1);\n}\n/* Always pin the \"More\" dropdown to the right edge */\n.client-libraries-more {\n margin-left: auto;\n}\n.client-libraries-icon {\n max-width: 14px;\n max-height: 14px;\n min-width: 14px;\n width: 100%;\n aspect-ratio: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n position: relative;\n box-sizing: border-box;\n color: currentColor;\n}\n.client-libraries .client-libraries-text {\n font-size: var(--scalar-small);\n position: relative;\n display: flex;\n align-items: center;\n}\n.client-libraries__active .client-libraries-text {\n color: var(--scalar-color-1);\n font-weight: var(--scalar-semibold);\n}\n</style>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2BA,MAAM,YAAY,OAAM;;EAExB,MAAM,SAAS,OAAM;EACrB,MAAM,UAAU,GAAG,OAAO;;EAG1B,MAAM,OAAO,eACX,kBAAkB,QAAA,uBAAuB,CAAC,KAAK,SAAS;GACtD,GAAG;GACH,MAAM,gBAAgB,IAAI,KAAK;GAChC,EAAE,CACL;;EAGA,MAAM,gBAAgB,IAAI,EAAC;;EAG3B,MAAM,WAAW,eAAe,KAAK,MAAM,cAAc,OAAM;AAM/D,cACQ,KAAK,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,KAAK,KAAK,QAC5C;AACJ,OAAI,cAAc,QAAQ,KAAK,MAAM,SAAS,EAC5C,eAAc,QAAQ;AAEnB,YAAS,QAAO;IAEzB;EAEA,MAAM,UAAU,KAAiB;EACjC,MAAM,aAAa,KAAiB;;EAGpC,MAAM,iBAAiB,IAAI,EAAC;;EAE5B,MAAM,YAAY,IAAc,EAAE,CAAA;;EAElC,MAAM,YAAY,IAAI,EAAC;;EAGvB,MAAM,gBAAgB;GACpB,MAAM,YAAY,WAAW;GAC7B,MAAM,SAAS,QAAQ;AAEvB,OAAI,CAAC,aAAa,CAAC,OACjB;GAIF,MAAM,SAAS,MAAM,KAAK,UAAU,SAAS,CAAC,KAC3C,UAAW,MAAsB,YACpC;AAEA,aAAU,QAAQ,OAAO,MAAM,GAAG,KAAK,MAAM,OAAM;AACnD,aAAU,QAAQ,OAAO,KAAK,MAAM,WAAW;AAC/C,kBAAe,QAAQ,OAAO;;;EAIhC,MAAM,eAAe,eAAe;AAElC,OAAI,CAAC,UAAU,MAAM,UAAU,eAAe,SAAS,EACrD,QAAO,KAAK,MAAM;AAGpB,UAAO,mBACL,UAAU,OACV,eAAe,OACf,UAAU,MACZ;IACD;;EAGD,MAAM,cAAc,eAAe,KAAK,MAAM,MAAM,GAAG,aAAa,MAAM,CAAA;;EAG1E,MAAM,eAAe,eAAe,cAAc,SAAS,aAAa,MAAK;;EAG7E,MAAM,cAAc,eAClB,KAAK,MAAM,MAAM,aAAa,MAAM,CAAC,KAAK,KAAK,WAAW;GACxD,IAAI,OAAO,aAAa,QAAQ,MAAM;GACtC,OAAO,IAAI;GACZ,EAAE,CACL;;EAGA,MAAM,qBAAqB,eACzB,YAAY,MAAM,MAAM,WAAW,OAAO,OAAO,OAAO,cAAc,MAAM,CAAC,CAC/E;EAEA,MAAM,cAAc,WAA6C;AAC/D,OAAI,OACF,eAAc,QAAQ,OAAO,OAAO,GAAE;;;EAK1C,MAAM,cAAc,eAClB,aAAa,QAAQ,YAAY,GAAG,OAAO,OAAO,cAAc,QAClE;;;;;;EAOA,MAAM,eAAe,eACnB,aAAa,QAAQ,KAAK,cAAc,MAC1C;;EAGA,MAAM,YAAY,UAAkB;AAC7B,kBAAe;AAClB,YAAQ,OACJ,iBAAoC,iBAAc,CACnD,QAAQ,OAAM;KAClB;;;EAIH,MAAM,gBAAgB,OAAsB,UAAkB;GAC5D,MAAM,cAAc,aAAa,QAAQ;GAEzC,IAAI,OAAO;AACX,WAAQ,MAAM,KAAd;IACE,KAAK;IACL,KAAK;AACH,YAAO,SAAS,cAAc,IAAI,QAAQ;AAC1C;IACF,KAAK;IACL,KAAK;AACH,YAAO,SAAS,IAAI,cAAc,QAAQ;AAC1C;IACF,KAAK;AACH,YAAO;AACP;IACF,KAAK;AACH,YAAO;AACP;IACF,QACE;;AAGJ,SAAM,gBAAe;AACrB,iBAAc,QAAQ;AACtB,YAAS,KAAI;;EAGf,IAAI;EACJ,IAAI,QAAQ;;EAGZ,MAAM,wBAAwB;AAC5B,OAAI,OAAO,0BAA0B,aAAa;AAChD,aAAQ;AACR;;AAEF,wBAAqB,MAAK;AAC1B,WAAQ,sBAAsB,QAAO;;AAGvC,kBAAgB;AACd,OAAI,OAAO,mBAAmB,aAAa;AACzC,eAAW,IAAI,eAAe,gBAAe;AAK7C,QAAI,QAAQ,MACV,UAAS,QAAQ,QAAQ,MAAK;AAEhC,QAAI,WAAW,MACb,UAAS,QAAQ,WAAW,MAAK;;AAGrC,YAAQ;IACT;AAED,wBAAsB;AACpB,aAAU,YAAW;AACrB,OAAI,OAAO,yBAAyB,YAClC,sBAAqB,MAAK;IAE7B;;UAGY,KAAA,MAAK,UAAA,WAAA,EAAhB,mBA+FM,OAAA,YAAA;IA9FJ,mBAIM,OAAA;KAHH,IAAI,MAAA,UAAS;KACd,OAAM;OAA2B,sBAEnC,GAAA,WAAA;IAGA,mBA2EM,OA3EN,YA2EM,CA1EJ,mBA6CM,OAAA;cA5CA;KAAJ,KAAI;KACH,mBAAiB,MAAA,UAAS;KAC3B,OAAM;KACN,MAAK;0BACL,mBAkBS,UAAA,MAAA,WAjBgB,YAAA,QAAf,KAAK,UAAK;yBADpB,mBAkBS,UAAA;MAhBN,IAAE,GAAK,MAAA,OAAM,CAAA,OAAQ;MACrB,KAAK;MACL,iBAAe;MACf,iBAAe,UAAU,cAAA;MAC1B,OAAK,eAAA,CAAC,oBAAkB,EAAA,4BACc,UAAU,cAAA,OAAa,CAAA,CAAA;MAC7D,MAAK;MACJ,UAAU,UAAU,aAAA,QAAY,IAAA;MACjC,MAAK;MACJ,UAAK,WAAE,cAAA,QAAgB;MACvB,YAAO,WAAE,aAAa,QAAQ,MAAK;SAE5B,IAAI,QAAA,WAAA,EADZ,YAGqB,MAAA,WAAA,EAAA;;MADnB,OAAM;MACL,MAAM,IAAI;4DACb,mBAAyD,QAAzD,YAAyD,gBAAlB,IAAI,KAAI,EAAA,EAAA,CAAA,EAAA,IAAA,WAAA;eAKzC,aAAA,QAAe,KAAA,MAAK,UAAA,WAAA,EAD5B,YAkBiB,MAAA,eAAA,EAAA;;KAhBd,YAAY,mBAAA;KACZ,SAAS,YAAA;KACV,WAAU;KACV,UAAA;KACC,uBAAmB;;4BAWX,CAVT,mBAUS,UAAA;MATP,OAAK,eAAA,CAAC,0CAAwC,EAAA,4BACR,aAAA,OAAY,CAAA,CAAA;MAClD,MAAK;SACL,YAIM,MAAA,WAAA,EAAA;MAHJ,OAAM;MACL,MAAuB,aAAA,SAAgB,SAAA,OAAU,OAAO,SAAA,MAAS,OAAI;sDAGxE,mBAA+C,QAAA,EAAzC,OAAM,yBAAuB,EAAC,QAAI,GAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;uFAQ9C,mBAuBM,OAvBN,YAuBM,CApBJ,mBAmBM,OAAA;cAlBA;KAAJ,KAAI;KACJ,OAAM;0BACN,mBASO,UAAA,MAAA,WARkB,KAAA,QAAf,KAAK,UAAK;yBADpB,mBASO,QAAA;MAPJ,KAAK;MACN,OAAM;SAEE,IAAI,QAAA,WAAA,EADZ,YAGqB,MAAA,WAAA,EAAA;;MADnB,OAAM;MACL,MAAM,IAAI;4DACb,mBAAyD,QAAzD,YAAyD,gBAAlB,IAAI,KAAI,EAAA,EAAA,CAAA,CAAA;eAEjD,mBAKO,QALP,YAKO,CAJL,YAEoB,MAAA,WAAA,EAAA;KADlB,OAAM;KACN,MAAK;kCACP,mBAA+C,QAAA,EAAzC,OAAM,yBAAuB,EAAC,QAAI,GAAA,EAAA,CAAA,CAAA,EAAA,IAAA,CAAA,CAAA,CAAA,CAAA;IAQxC,SAAA,OAAU,eAAA,WAAA,EADlB,mBAQM,OAAA;;KANH,IAAI;KACJ,mBAAiB,YAAA;KAClB,OAAM;KACN,MAAK;KACL,UAAS;QACT,YAAgD,MAAA,eAAA,EAAA,EAA/B,OAAO,SAAA,MAAS,aAAA,EAAA,MAAA,GAAA,CAAA,QAAA,CAAA,CAAA,EAAA,GAAA,YAAA,IAAA,mBAAA,IAAA,KAAA"}
@@ -0,0 +1,4 @@
1
+ import type { Icon } from '@scalar/components/icon';
2
+ /** Find the programming language icon for a given language name, if we have one. */
3
+ export declare const getLanguageIcon: (lang: string) => Icon | undefined;
4
+ //# sourceMappingURL=language-icon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"language-icon.d.ts","sourceRoot":"","sources":["../../../../src/blocks/scalar-sdk-installation-instructions/helpers/language-icon.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAA;AAuDnD,oFAAoF;AACpF,eAAO,MAAM,eAAe,GAAI,MAAM,MAAM,KAAG,IAAI,GAAG,SAAsD,CAAA"}
@@ -0,0 +1,59 @@
1
+ //#region src/blocks/scalar-sdk-installation-instructions/helpers/language-icon.ts
2
+ /**
3
+ * Maps common language names (and a few aliases) to the matching
4
+ * `programming-language-*` icon.
5
+ *
6
+ * The `lang` in `x-scalar-sdk-installation` is a freeform string, so we only
7
+ * resolve the ones we have a logo for and let the caller fall back to text.
8
+ */
9
+ var LANGUAGE_ICONS = {
10
+ c: "programming-language-c",
11
+ clojure: "programming-language-clojure",
12
+ csharp: "programming-language-csharp",
13
+ "c#": "programming-language-csharp",
14
+ cs: "programming-language-csharp",
15
+ css: "programming-language-css3",
16
+ css3: "programming-language-css3",
17
+ dart: "programming-language-dart",
18
+ fsharp: "programming-language-fsharp",
19
+ "f#": "programming-language-fsharp",
20
+ go: "programming-language-go",
21
+ golang: "programming-language-go",
22
+ html: "programming-language-html5",
23
+ html5: "programming-language-html5",
24
+ http: "programming-language-http",
25
+ java: "programming-language-java",
26
+ javascript: "programming-language-javascript",
27
+ js: "programming-language-javascript",
28
+ json: "programming-language-json",
29
+ kotlin: "programming-language-kotlin",
30
+ node: "programming-language-node",
31
+ "node.js": "programming-language-node",
32
+ nodejs: "programming-language-node",
33
+ objc: "programming-language-objc",
34
+ "objective-c": "programming-language-objc",
35
+ ocaml: "programming-language-ocaml",
36
+ php: "programming-language-php",
37
+ powershell: "programming-language-powershell",
38
+ python: "programming-language-python",
39
+ py: "programming-language-python",
40
+ r: "programming-language-r",
41
+ ruby: "programming-language-ruby",
42
+ rb: "programming-language-ruby",
43
+ rust: "programming-language-rust",
44
+ rs: "programming-language-rust",
45
+ scala: "programming-language-scala",
46
+ shell: "programming-language-shell",
47
+ bash: "programming-language-shell",
48
+ sh: "programming-language-shell",
49
+ curl: "programming-language-shell",
50
+ swift: "programming-language-swift",
51
+ typescript: "programming-language-typescript",
52
+ ts: "programming-language-typescript"
53
+ };
54
+ /** Find the programming language icon for a given language name, if we have one. */
55
+ var getLanguageIcon = (lang) => LANGUAGE_ICONS[lang.trim().toLowerCase()];
56
+ //#endregion
57
+ export { getLanguageIcon };
58
+
59
+ //# sourceMappingURL=language-icon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"language-icon.js","names":[],"sources":["../../../../src/blocks/scalar-sdk-installation-instructions/helpers/language-icon.ts"],"sourcesContent":["import type { Icon } from '@scalar/components/icon'\n\n/**\n * Maps common language names (and a few aliases) to the matching\n * `programming-language-*` icon.\n *\n * The `lang` in `x-scalar-sdk-installation` is a freeform string, so we only\n * resolve the ones we have a logo for and let the caller fall back to text.\n */\nconst LANGUAGE_ICONS: Record<string, Icon> = {\n c: 'programming-language-c',\n clojure: 'programming-language-clojure',\n csharp: 'programming-language-csharp',\n 'c#': 'programming-language-csharp',\n cs: 'programming-language-csharp',\n css: 'programming-language-css3',\n css3: 'programming-language-css3',\n dart: 'programming-language-dart',\n fsharp: 'programming-language-fsharp',\n 'f#': 'programming-language-fsharp',\n go: 'programming-language-go',\n golang: 'programming-language-go',\n html: 'programming-language-html5',\n html5: 'programming-language-html5',\n http: 'programming-language-http',\n java: 'programming-language-java',\n javascript: 'programming-language-javascript',\n js: 'programming-language-javascript',\n json: 'programming-language-json',\n kotlin: 'programming-language-kotlin',\n node: 'programming-language-node',\n 'node.js': 'programming-language-node',\n nodejs: 'programming-language-node',\n objc: 'programming-language-objc',\n 'objective-c': 'programming-language-objc',\n ocaml: 'programming-language-ocaml',\n php: 'programming-language-php',\n powershell: 'programming-language-powershell',\n python: 'programming-language-python',\n py: 'programming-language-python',\n r: 'programming-language-r',\n ruby: 'programming-language-ruby',\n rb: 'programming-language-ruby',\n rust: 'programming-language-rust',\n rs: 'programming-language-rust',\n scala: 'programming-language-scala',\n shell: 'programming-language-shell',\n bash: 'programming-language-shell',\n sh: 'programming-language-shell',\n curl: 'programming-language-shell',\n swift: 'programming-language-swift',\n typescript: 'programming-language-typescript',\n ts: 'programming-language-typescript',\n}\n\n/** Find the programming language icon for a given language name, if we have one. */\nexport const getLanguageIcon = (lang: string): Icon | undefined => LANGUAGE_ICONS[lang.trim().toLowerCase()]\n"],"mappings":";;;;;;;;AASA,IAAM,iBAAuC;CAC3C,GAAG;CACH,SAAS;CACT,QAAQ;CACR,MAAM;CACN,IAAI;CACJ,KAAK;CACL,MAAM;CACN,MAAM;CACN,QAAQ;CACR,MAAM;CACN,IAAI;CACJ,QAAQ;CACR,MAAM;CACN,OAAO;CACP,MAAM;CACN,MAAM;CACN,YAAY;CACZ,IAAI;CACJ,MAAM;CACN,QAAQ;CACR,MAAM;CACN,WAAW;CACX,QAAQ;CACR,MAAM;CACN,eAAe;CACf,OAAO;CACP,KAAK;CACL,YAAY;CACZ,QAAQ;CACR,IAAI;CACJ,GAAG;CACH,MAAM;CACN,IAAI;CACJ,MAAM;CACN,IAAI;CACJ,OAAO;CACP,OAAO;CACP,MAAM;CACN,IAAI;CACJ,MAAM;CACN,OAAO;CACP,YAAY;CACZ,IAAI;CACL;;AAGD,IAAa,mBAAmB,SAAmC,eAAe,KAAK,MAAM,CAAC,aAAa"}