@scalar/api-reference 1.59.2 → 1.60.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +28 -0
- package/dist/blocks/scalar-info-block/components/InfoLinks.vue.d.ts.map +1 -1
- package/dist/blocks/scalar-info-block/components/InfoLinks.vue.js.map +1 -1
- package/dist/blocks/scalar-info-block/components/InfoLinks.vue.script.js +12 -7
- package/dist/blocks/scalar-info-block/components/InfoLinks.vue.script.js.map +1 -1
- package/dist/blocks/scalar-info-block/components/IntroductionLayout.vue.d.ts +4 -4
- package/dist/blocks/scalar-info-block/components/IntroductionLayout.vue.d.ts.map +1 -1
- package/dist/blocks/scalar-info-block/components/IntroductionLayout.vue.js +1 -1
- package/dist/blocks/scalar-info-block/components/IntroductionLayout.vue.js.map +1 -1
- package/dist/blocks/scalar-info-block/components/IntroductionLayout.vue.script.js +14 -17
- package/dist/blocks/scalar-info-block/components/IntroductionLayout.vue.script.js.map +1 -1
- package/dist/blocks/scalar-info-block/components/IntroductionLoading.vue.d.ts +12 -0
- package/dist/blocks/scalar-info-block/components/IntroductionLoading.vue.d.ts.map +1 -0
- package/dist/blocks/scalar-info-block/components/IntroductionLoading.vue.js +9 -0
- package/dist/blocks/scalar-info-block/components/IntroductionLoading.vue.js.map +1 -0
- package/dist/blocks/scalar-info-block/components/IntroductionLoading.vue.script.js +63 -0
- package/dist/blocks/scalar-info-block/components/IntroductionLoading.vue.script.js.map +1 -0
- package/dist/blocks/scalar-sdk-installation-instructions/components/SdkInstallationInstructions.vue.d.ts +13 -0
- package/dist/blocks/scalar-sdk-installation-instructions/components/SdkInstallationInstructions.vue.d.ts.map +1 -1
- package/dist/blocks/scalar-sdk-installation-instructions/components/SdkInstallationInstructions.vue.js +1 -1
- package/dist/blocks/scalar-sdk-installation-instructions/components/SdkInstallationInstructions.vue.js.map +1 -1
- package/dist/blocks/scalar-sdk-installation-instructions/components/SdkInstallationInstructions.vue.script.js +32 -8
- package/dist/blocks/scalar-sdk-installation-instructions/components/SdkInstallationInstructions.vue.script.js.map +1 -1
- package/dist/browser/chunks/AgentScalarChatInterface-CesFQ_Ax.js +27 -0
- package/dist/browser/chunks/ScalarTextInput.vue-C14zmVNI.js +27 -0
- package/dist/browser/chunks/basic-shape-diamond.svg-BTEOT1FL.js +1 -1
- package/dist/browser/chunks/basic-shape-hexagon.svg-BSPzaCgF.js +1 -1
- package/dist/browser/chunks/basic-shape-primary-circle-ellipse-round.svg-DKmZ8UUU.js +1 -1
- package/dist/browser/chunks/basic-shape-primary-square-rectangle.svg-n2YRykHD.js +1 -1
- package/dist/browser/chunks/basic-shape-shield.svg-Bec9cJDA.js +1 -1
- package/dist/browser/chunks/browser-67K6wmG9.js +1 -1
- package/dist/browser/chunks/computer-device-desktop-monitor.svg-m6j893Hb.js +1 -1
- package/dist/browser/chunks/computer-device-desktop.svg-Dk1VVO7k.js +1 -1
- package/dist/browser/chunks/computer-device-laptop.svg-BNGVUCYS.js +1 -1
- package/dist/browser/chunks/computer-device-mobile-phone-android-samsung-back.svg-CC4UUTFw.js +1 -1
- package/dist/browser/chunks/computer-device-mobile-phone-android-samsung.svg-D8ExpMpL.js +1 -1
- package/dist/browser/chunks/computer-device-mobile-phone-iphone-x-back.svg-CLm7sgMM.js +1 -1
- package/dist/browser/chunks/computer-device-mobile-phone-iphone-x.svg-Xrttg6_7.js +1 -1
- package/dist/browser/chunks/computer-device-mobile-tablet-touch.svg-DQ2oTvOG.js +1 -1
- package/dist/browser/chunks/computer-device-mobile-tablet.svg-DCr0XlRc.js +1 -1
- package/dist/browser/chunks/computer-device-network-ethernet-cat6.svg-AK9l0iOl.js +1 -1
- package/dist/browser/chunks/computer-device-network-lan-www.svg-gUIdFBlE.js +1 -1
- package/dist/browser/chunks/computer-device-network-wifi-connection.svg-Be-EMm4e.js +1 -1
- package/dist/browser/chunks/computer-device-network-wifi-router.svg-Dc2VzyqK.js +1 -1
- package/dist/browser/chunks/ecology-science-erlenmeyer-flask.svg-DHgy7Jfd.js +1 -1
- package/dist/browser/chunks/image-flash-lightning.svg-EETR_y1q.js +1 -1
- package/dist/browser/chunks/image-picture-flower.svg-DN1AYzJU.js +1 -1
- package/dist/browser/chunks/interface-alert-exclamation-diamond.svg-C5NozMV_.js +1 -1
- package/dist/browser/chunks/interface-alert-exclamation-triangle-warning.svg-DaAg2fF5.js +1 -1
- package/dist/browser/chunks/interface-alert-information-circle.svg-ckkkt9Mv.js +1 -1
- package/dist/browser/chunks/interface-award-crown.svg-pjvn9hY-.js +1 -1
- package/dist/browser/chunks/interface-bookmark-tag.svg-r2r-lQq4.js +1 -1
- package/dist/browser/chunks/interface-bookmark.svg-BK9HKQBT.js +1 -1
- package/dist/browser/chunks/interface-calendar-date-one.svg-DNnF0M1I.js +1 -1
- package/dist/browser/chunks/interface-content-book-open-pages.svg-CQj_w9Vp.js +1 -1
- package/dist/browser/chunks/interface-content-book-page.svg-DppoeJRe.js +1 -1
- package/dist/browser/chunks/interface-content-file.svg-CvcD7OiY.js +1 -1
- package/dist/browser/chunks/interface-content-folder.svg-BmtS5I9A.js +1 -1
- package/dist/browser/chunks/interface-copy-clipboard.svg-Be6EI50X.js +1 -1
- package/dist/browser/chunks/interface-edit-attachment.svg-G5TKzpWX.js +1 -1
- package/dist/browser/chunks/interface-edit-binocular.svg-jzL-DvGB.js +1 -1
- package/dist/browser/chunks/interface-edit-magic-wand.svg-BOTlymvp.js +1 -1
- package/dist/browser/chunks/interface-edit-tool-paint-roller.svg-s9dwryx7.js +1 -1
- package/dist/browser/chunks/interface-edit-tool-pencil.svg-C7v0dbB3.js +1 -1
- package/dist/browser/chunks/interface-favorite-award.svg-CYHUgUG0.js +1 -1
- package/dist/browser/chunks/interface-favorite-flag.svg-C10zlKOb.js +1 -1
- package/dist/browser/chunks/interface-favorite-heart.svg-eoduXxlz.js +1 -1
- package/dist/browser/chunks/interface-favorite-star.svg-BSmxJetr.js +1 -1
- package/dist/browser/chunks/interface-favorite-stars-sparkles.svg-JTFLj3Ls.js +1 -1
- package/dist/browser/chunks/interface-hierarchy-flowchart.svg-Cg_Wy0kN.js +1 -1
- package/dist/browser/chunks/interface-home-house.svg-DytoGRnv.js +1 -1
- package/dist/browser/chunks/interface-hyperlink.svg-CuEfmmQI.js +1 -1
- package/dist/browser/chunks/interface-lighting-brightness.svg-DSK0h_Pa.js +1 -1
- package/dist/browser/chunks/interface-lock-closed.svg-Cn6TaLYv.js +1 -1
- package/dist/browser/chunks/interface-lock-open-unlock.svg-CVkG5-9W.js +1 -1
- package/dist/browser/chunks/interface-login-key.svg-y-cwwXjN.js +1 -1
- package/dist/browser/chunks/interface-search.svg-S-puVFJB.js +1 -1
- package/dist/browser/chunks/interface-setting-cog.svg-CTH4_lLg.js +1 -1
- package/dist/browser/chunks/interface-share-megaphone-bullhorn.svg-Pbp39MyC.js +1 -1
- package/dist/browser/chunks/interface-share-rocket.svg-BgCsIRZO.js +1 -1
- package/dist/browser/chunks/interface-share-satellite.svg-DAMN9d5G.js +1 -1
- package/dist/browser/chunks/interface-share-space-ship.svg-Dt-Mejxk.js +1 -1
- package/dist/browser/chunks/interface-share.svg-vFYTXSti.js +1 -1
- package/dist/browser/chunks/interface-signal-square.svg-DNG4LpAe.js +1 -1
- package/dist/browser/chunks/interface-time-clock-circle.svg-Bpz-nLxo.js +1 -1
- package/dist/browser/chunks/interface-time-hour-glass.svg-D7agfKsH.js +1 -1
- package/dist/browser/chunks/interface-users-multiple.svg-CkPJBBnG.js +1 -1
- package/dist/browser/chunks/interface-weather-moon.svg-CaTZFMPO.js +1 -1
- package/dist/browser/chunks/mail-chat-bubble-square.svg-DC8RIihp.js +1 -1
- package/dist/browser/chunks/mail-send-email-paper-airplane.svg-D8OLs9jz.js +1 -1
- package/dist/browser/chunks/mail-send-envelope.svg-CV33h5Sx.js +1 -1
- package/dist/browser/chunks/modal-BZzcBkVp.js +99 -0
- package/dist/browser/chunks/{modal-CgDbMGa1.js → modal-LBDjZSmM.js} +2 -2
- package/dist/browser/chunks/money-cashier-receipt.svg-CJL8C2gs.js +1 -1
- package/dist/browser/chunks/money-currency-dollar-pay.svg-VdBplCTx.js +1 -1
- package/dist/browser/chunks/money-graph-arrow-increase.svg-DcRov3zk.js +1 -1
- package/dist/browser/chunks/money-graph-bar-chart-increase.svg-Cc7KxjX-.js +1 -1
- package/dist/browser/chunks/nature-ecology-leaf.svg-DR3cTZxt.js +1 -1
- package/dist/browser/chunks/phone-telephone.svg-DyY0gUlk.js +1 -1
- package/dist/browser/chunks/programming-bug.svg-BHLT-Qhp.js +1 -1
- package/dist/browser/chunks/programming-cloud.svg-B6YW33ba.js +1 -1
- package/dist/browser/chunks/programming-computer-database-server.svg-B6o5Sdn-.js +1 -1
- package/dist/browser/chunks/programming-computer-database.svg-Cl7OVtpJ.js +1 -1
- package/dist/browser/chunks/programming-module-four-layout.svg-BQrerL1x.js +1 -1
- package/dist/browser/chunks/programming-module-three.svg-B2KTQzBM.js +1 -1
- package/dist/browser/chunks/programming-module.svg-CiID7kPm.js +1 -1
- package/dist/browser/chunks/programming-script-code.svg-D1M5rtkN.js +1 -1
- package/dist/browser/chunks/runtime-core.esm-bundler-Byrbbu5Q.js +1 -1
- package/dist/browser/chunks/shopping-cart.svg-BEegiIR9.js +1 -1
- package/dist/browser/chunks/shopping-gift-present.svg-BUHwuLix.js +1 -1
- package/dist/browser/chunks/shopping-shipping-box-parcel-package.svg-D6fxWdYx.js +1 -1
- package/dist/browser/chunks/tag-new-circle.svg-jsg1bGs0.js +1 -1
- package/dist/browser/chunks/travel-map-earth-globe.svg-ClbMiU-f.js +1 -1
- package/dist/browser/chunks/vendor-wW8jg8wN.js +306 -0
- package/dist/browser/standalone.esm.js +20 -20
- package/dist/browser/standalone.js +249 -248
- package/dist/components/ApiReference.vue.d.ts.map +1 -1
- package/dist/components/ApiReference.vue.js +1 -1
- package/dist/components/ApiReference.vue.js.map +1 -1
- package/dist/components/ApiReference.vue.script.js +39 -11
- package/dist/components/ApiReference.vue.script.js.map +1 -1
- package/dist/components/Content/AsyncApi/AsyncApiTraversedEntry.vue.d.ts.map +1 -1
- package/dist/components/Content/AsyncApi/AsyncApiTraversedEntry.vue.js.map +1 -1
- package/dist/components/Content/AsyncApi/AsyncApiTraversedEntry.vue.script.js +0 -1
- package/dist/components/Content/AsyncApi/AsyncApiTraversedEntry.vue.script.js.map +1 -1
- package/dist/components/Content/Content.vue.d.ts +4 -2
- package/dist/components/Content/Content.vue.d.ts.map +1 -1
- package/dist/components/Content/Content.vue.js.map +1 -1
- package/dist/components/Content/Content.vue.script.js +25 -2
- package/dist/components/Content/Content.vue.script.js.map +1 -1
- package/dist/components/Content/Operations/TraversedEntry.vue.d.ts.map +1 -1
- package/dist/components/Content/Operations/TraversedEntry.vue.js.map +1 -1
- package/dist/components/Content/Operations/TraversedEntry.vue.script.js +2 -2
- package/dist/components/Content/Operations/TraversedEntry.vue.script.js.map +1 -1
- package/dist/components/Content/Schema/Schema.vue.d.ts.map +1 -1
- package/dist/components/Content/Schema/Schema.vue.js +1 -1
- package/dist/components/Content/Schema/Schema.vue.js.map +1 -1
- package/dist/components/Content/Schema/Schema.vue.script.js +22 -2
- package/dist/components/Content/Schema/Schema.vue.script.js.map +1 -1
- package/dist/components/Content/Schema/SchemaProperty.vue.d.ts +0 -6
- package/dist/components/Content/Schema/SchemaProperty.vue.d.ts.map +1 -1
- package/dist/components/Content/Schema/SchemaProperty.vue.js +1 -1
- package/dist/components/Content/Schema/SchemaProperty.vue.js.map +1 -1
- package/dist/components/Content/Schema/SchemaProperty.vue.script.js +16 -2
- package/dist/components/Content/Schema/SchemaProperty.vue.script.js.map +1 -1
- package/dist/components/Content/Schema/helpers/should-display-description.d.ts.map +1 -1
- package/dist/components/Content/Schema/helpers/should-display-description.js +1 -1
- package/dist/components/Content/Schema/helpers/should-display-description.js.map +1 -1
- package/dist/components/Content/Tags/Tag.vue.d.ts +0 -1
- package/dist/components/Content/Tags/Tag.vue.d.ts.map +1 -1
- package/dist/components/Content/Tags/Tag.vue.js.map +1 -1
- package/dist/components/Content/Tags/Tag.vue.script.js +0 -3
- package/dist/components/Content/Tags/Tag.vue.script.js.map +1 -1
- package/dist/components/Content/Tags/components/ModernLayout.vue.d.ts +0 -1
- package/dist/components/Content/Tags/components/ModernLayout.vue.d.ts.map +1 -1
- package/dist/components/Content/Tags/components/ModernLayout.vue.js +1 -1
- package/dist/components/Content/Tags/components/ModernLayout.vue.js.map +1 -1
- package/dist/components/Content/Tags/components/ModernLayout.vue.script.js +0 -3
- package/dist/components/Content/Tags/components/ModernLayout.vue.script.js.map +1 -1
- package/dist/components/Content/Tags/components/TagSection.vue.d.ts +0 -1
- package/dist/components/Content/Tags/components/TagSection.vue.d.ts.map +1 -1
- package/dist/components/Content/Tags/components/TagSection.vue.js.map +1 -1
- package/dist/components/Content/Tags/components/TagSection.vue.script.js +5 -6
- package/dist/components/Content/Tags/components/TagSection.vue.script.js.map +1 -1
- package/dist/components/RenderPlugins/RenderPluginView.vue.d.ts +11 -0
- package/dist/components/RenderPlugins/RenderPluginView.vue.d.ts.map +1 -0
- package/dist/components/RenderPlugins/RenderPluginView.vue.js +7 -0
- package/dist/components/RenderPlugins/RenderPluginView.vue.js.map +1 -0
- package/dist/components/RenderPlugins/RenderPluginView.vue.script.js +45 -0
- package/dist/components/RenderPlugins/RenderPluginView.vue.script.js.map +1 -0
- package/dist/components/RenderPlugins/RenderPlugins.vue.d.ts +5 -1
- package/dist/components/RenderPlugins/RenderPlugins.vue.d.ts.map +1 -1
- package/dist/components/RenderPlugins/RenderPlugins.vue.js.map +1 -1
- package/dist/components/RenderPlugins/RenderPlugins.vue.script.js +17 -22
- package/dist/components/RenderPlugins/RenderPlugins.vue.script.js.map +1 -1
- package/dist/components/Section/SectionContent.vue.d.ts +1 -6
- package/dist/components/Section/SectionContent.vue.d.ts.map +1 -1
- package/dist/components/Section/SectionContent.vue.js +7 -2
- package/dist/components/Section/SectionContent.vue.js.map +1 -1
- package/dist/components/Section/SectionHeader.vue.d.ts +3 -4
- package/dist/components/Section/SectionHeader.vue.d.ts.map +1 -1
- package/dist/components/Section/SectionHeader.vue.js +1 -1
- package/dist/components/Section/SectionHeader.vue.js.map +1 -1
- package/dist/components/Section/SectionHeader.vue.script.js +5 -10
- package/dist/components/Section/SectionHeader.vue.script.js.map +1 -1
- package/dist/features/Search/helpers/create-search-index.d.ts.map +1 -1
- package/dist/features/Search/helpers/create-search-index.js +4 -3
- package/dist/features/Search/helpers/create-search-index.js.map +1 -1
- package/dist/helpers/id-routing.d.ts +6 -13
- package/dist/helpers/id-routing.d.ts.map +1 -1
- package/dist/helpers/id-routing.js +104 -34
- package/dist/helpers/id-routing.js.map +1 -1
- package/dist/helpers/lazy-bus.d.ts +10 -0
- package/dist/helpers/lazy-bus.d.ts.map +1 -1
- package/dist/helpers/lazy-bus.js +22 -1
- package/dist/helpers/lazy-bus.js.map +1 -1
- package/dist/plugins/index.d.ts +1 -1
- package/dist/plugins/index.d.ts.map +1 -1
- package/dist/plugins/plugin-manager.d.ts +27 -2
- package/dist/plugins/plugin-manager.d.ts.map +1 -1
- package/dist/plugins/plugin-manager.js +32 -2
- package/dist/plugins/plugin-manager.js.map +1 -1
- package/dist/style.css +440 -265
- package/dist/vue-styles.css +157 -159
- package/package.json +15 -13
- package/dist/browser/chunks/AgentScalarChatInterface-D4DCmV5y.js +0 -27
- package/dist/browser/chunks/ScalarTextInput.vue-C5aaO8tA.js +0 -27
- package/dist/browser/chunks/modal-B4LeCbAi.js +0 -66
- package/dist/browser/chunks/vendor-BNhbieDE.js +0 -338
- package/dist/components/LoadingSkeleton.vue.d.ts +0 -9
- package/dist/components/LoadingSkeleton.vue.d.ts.map +0 -1
- package/dist/components/LoadingSkeleton.vue.js +0 -9
- package/dist/components/LoadingSkeleton.vue.js.map +0 -1
- package/dist/components/LoadingSkeleton.vue.script.js +0 -20
- package/dist/components/LoadingSkeleton.vue.script.js.map +0 -1
- package/dist/components/Section/SectionContent.vue.script.js +0 -23
- package/dist/components/Section/SectionContent.vue.script.js.map +0 -1
|
@@ -2,6 +2,7 @@ import { getLanguageIcon } from "../helpers/language-icon.js";
|
|
|
2
2
|
import { getRenderableSdks } from "../helpers/renderable-sdks.js";
|
|
3
3
|
import { getVisibleTabCount } from "../helpers/visible-tab-count.js";
|
|
4
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 { getCustomClientIds } from "@scalar/api-client/blocks/operation-code-sample";
|
|
5
6
|
import { ScalarMarkdown } from "@scalar/components/markdown";
|
|
6
7
|
import { ScalarCombobox } from "@scalar/components/combobox";
|
|
7
8
|
import { ScalarIcon } from "@scalar/components/icon";
|
|
@@ -27,7 +28,11 @@ var _hoisted_9 = { class: "client-libraries" };
|
|
|
27
28
|
var _hoisted_10 = ["aria-labelledby"];
|
|
28
29
|
var SdkInstallationInstructions_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
|
|
29
30
|
__name: "SdkInstallationInstructions",
|
|
30
|
-
props: {
|
|
31
|
+
props: {
|
|
32
|
+
xScalarSdkInstallation: {},
|
|
33
|
+
selectedClient: {},
|
|
34
|
+
eventBus: {}
|
|
35
|
+
},
|
|
31
36
|
setup(__props) {
|
|
32
37
|
const headingId = useId();
|
|
33
38
|
/** Base id used to associate each tab with the shared panel for assistive tech */
|
|
@@ -42,10 +47,29 @@ var SdkInstallationInstructions_vue_vue_type_script_setup_true_lang_default = /*
|
|
|
42
47
|
const selectedIndex = ref(0);
|
|
43
48
|
/** The currently selected SDK */
|
|
44
49
|
const selected = computed(() => sdks.value[selectedIndex.value]);
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
50
|
+
/**
|
|
51
|
+
* The `custom/<lang>` client id for each SDK, aligned by index with `sdks`.
|
|
52
|
+
*
|
|
53
|
+
* We reuse the exact id scheme the operation code samples use for their custom
|
|
54
|
+
* examples, so selecting a language here resolves to the same id those samples
|
|
55
|
+
* are keyed by — that shared id is what keeps the two surfaces in sync.
|
|
56
|
+
*/
|
|
57
|
+
const sdkClientIds = computed(() => getCustomClientIds(sdks.value.map((sdk) => ({
|
|
58
|
+
lang: sdk.lang,
|
|
59
|
+
source: ""
|
|
60
|
+
}))));
|
|
61
|
+
/** Select an SDK by index and broadcast it so the operation code samples follow */
|
|
62
|
+
const select = (index) => {
|
|
63
|
+
selectedIndex.value = index;
|
|
64
|
+
const id = sdkClientIds.value[index];
|
|
65
|
+
if (id) __props.eventBus?.emit("workspace:update:selected-client", id);
|
|
66
|
+
};
|
|
67
|
+
watch([() => __props.selectedClient, sdkClientIds], ([client, ids]) => {
|
|
68
|
+
const matched = client ? ids.findIndex((id) => id === client) : -1;
|
|
69
|
+
if (matched >= 0) selectedIndex.value = matched;
|
|
70
|
+
else if (selectedIndex.value > ids.length - 1) selectedIndex.value = 0;
|
|
71
|
+
}, { immediate: true });
|
|
72
|
+
watch(() => sdks.value.map((sdk) => sdk.lang).join("\n"), () => void nextTick(measure));
|
|
49
73
|
const tabsRef = ref();
|
|
50
74
|
const measureRef = ref();
|
|
51
75
|
/** The width available to render the tabs in */
|
|
@@ -81,7 +105,7 @@ var SdkInstallationInstructions_vue_vue_type_script_setup_true_lang_default = /*
|
|
|
81
105
|
/** The selected option within the "More" dropdown, if any */
|
|
82
106
|
const selectedMoreOption = computed(() => moreOptions.value.find((option) => option.id === String(selectedIndex.value)));
|
|
83
107
|
const selectMore = (option) => {
|
|
84
|
-
if (option)
|
|
108
|
+
if (option) select(Number(option.id));
|
|
85
109
|
};
|
|
86
110
|
/** The id of the tab that labels the panel (falls back to the heading when the selection lives in "More") */
|
|
87
111
|
const activeTabId = computed(() => isMoreActive.value ? headingId : `${baseId}-tab-${selectedIndex.value}`);
|
|
@@ -119,7 +143,7 @@ var SdkInstallationInstructions_vue_vue_type_script_setup_true_lang_default = /*
|
|
|
119
143
|
default: return;
|
|
120
144
|
}
|
|
121
145
|
event.preventDefault();
|
|
122
|
-
|
|
146
|
+
select(next);
|
|
123
147
|
focusTab(next);
|
|
124
148
|
};
|
|
125
149
|
let observer;
|
|
@@ -167,7 +191,7 @@ var SdkInstallationInstructions_vue_vue_type_script_setup_true_lang_default = /*
|
|
|
167
191
|
role: "tab",
|
|
168
192
|
tabindex: index === tabStopIndex.value ? 0 : -1,
|
|
169
193
|
type: "button",
|
|
170
|
-
onClick: ($event) =>
|
|
194
|
+
onClick: ($event) => select(index),
|
|
171
195
|
onKeydown: ($event) => onTabKeydown($event, index)
|
|
172
196
|
}, [sdk.icon ? (openBlock(), createBlock(unref(ScalarIcon), {
|
|
173
197
|
key: 0,
|
|
@@ -1 +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":"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"}
|
|
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 { getCustomClientIds } from '@scalar/api-client/blocks/operation-code-sample'\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 WorkspaceEventBus } from '@scalar/workspace-store/events'\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, selectedClient, eventBus } = defineProps<{\n /** Custom SDK installation instructions from `x-scalar-sdk-installation` */\n xScalarSdkInstallation?: XScalarSdkInstallation['x-scalar-sdk-installation']\n /**\n * The globally selected client id. When it matches one of the SDK languages\n * (as a `custom/<lang>` id) the matching tab is shown as active, keeping the\n * tabs in sync with the operation code samples.\n */\n selectedClient?: string\n /**\n * Event bus used to broadcast the selected client. Picking a language here\n * switches the operation code samples to that language's custom example, the\n * same channel the generic client selector uses.\n */\n eventBus?: WorkspaceEventBus\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/**\n * The `custom/<lang>` client id for each SDK, aligned by index with `sdks`.\n *\n * We reuse the exact id scheme the operation code samples use for their custom\n * examples, so selecting a language here resolves to the same id those samples\n * are keyed by — that shared id is what keeps the two surfaces in sync.\n */\nconst sdkClientIds = computed(() =>\n getCustomClientIds(sdks.value.map((sdk) => ({ lang: sdk.lang, source: '' }))),\n)\n\n/** Select an SDK by index and broadcast it so the operation code samples follow */\nconst select = (index: number) => {\n selectedIndex.value = index\n\n const id = sdkClientIds.value[index]\n if (id) {\n eventBus?.emit('workspace:update:selected-client', id)\n }\n}\n\n// Keep the active tab aligned with the global selection, re-evaluating whenever\n// either the selection or the available SDKs change. Watching `sdkClientIds`\n// (not just `selectedClient`) is what stops the intro tab and the operation\n// samples from disagreeing after the SDK list is reordered or resized: the tab\n// follows the selected language to its new position. When the selection is a\n// built-in client (or a language this document has no install entry for) we keep\n// the current tab, only clamping it back into range if the list shrank past it.\nwatch(\n [() => selectedClient, sdkClientIds],\n ([client, ids]) => {\n const matched = client ? ids.findIndex((id) => id === client) : -1\n\n if (matched >= 0) {\n selectedIndex.value = matched\n } else if (selectedIndex.value > ids.length - 1) {\n selectedIndex.value = 0\n }\n },\n { immediate: true },\n)\n\n// Re-measure whenever the set of SDKs changes. Keying on the languages (not just\n// the count) also catches documents that swap in a different set of the same\n// size, which would otherwise leave the cached tab widths — and the \"More\"\n// overflow logic — stale.\nwatch(\n () => sdks.value.map((sdk) => sdk.lang).join('\\n'),\n () => void nextTick(measure),\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 select(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 select(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=\"select(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":"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"}
|