@scalar/api-client 3.21.1 → 3.21.3

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 (143) hide show
  1. package/CHANGELOG.md +55 -0
  2. package/dist/components/SectionFilter.vue.d.ts +0 -2
  3. package/dist/components/SectionFilter.vue.d.ts.map +1 -1
  4. package/dist/components/SectionFilter.vue.js +1 -1
  5. package/dist/components/SectionFilter.vue.js.map +1 -1
  6. package/dist/components/SectionFilter.vue.script.js +2 -8
  7. package/dist/components/SectionFilter.vue.script.js.map +1 -1
  8. package/dist/components/SectionFilterButton.vue.d.ts +0 -1
  9. package/dist/components/SectionFilterButton.vue.d.ts.map +1 -1
  10. package/dist/components/SectionFilterButton.vue.js.map +1 -1
  11. package/dist/components/SectionFilterButton.vue.script.js +2 -10
  12. package/dist/components/SectionFilterButton.vue.script.js.map +1 -1
  13. package/dist/style.css +153 -82
  14. package/dist/v2/blocks/operation-block/OperationBlock.vue.d.ts.map +1 -1
  15. package/dist/v2/blocks/operation-block/OperationBlock.vue.js.map +1 -1
  16. package/dist/v2/blocks/operation-block/OperationBlock.vue.script.js +11 -0
  17. package/dist/v2/blocks/operation-block/OperationBlock.vue.script.js.map +1 -1
  18. package/dist/v2/blocks/operation-block/components/Header.vue.d.ts.map +1 -1
  19. package/dist/v2/blocks/operation-block/components/Header.vue.js +1 -1
  20. package/dist/v2/blocks/operation-block/components/Header.vue.js.map +1 -1
  21. package/dist/v2/blocks/operation-block/components/Header.vue.script.js +2 -0
  22. package/dist/v2/blocks/operation-block/components/Header.vue.script.js.map +1 -1
  23. package/dist/v2/blocks/request-block/RequestBlock.vue.d.ts.map +1 -1
  24. package/dist/v2/blocks/request-block/RequestBlock.vue.js +1 -1
  25. package/dist/v2/blocks/request-block/RequestBlock.vue.js.map +1 -1
  26. package/dist/v2/blocks/request-block/RequestBlock.vue.script.js +17 -6
  27. package/dist/v2/blocks/request-block/RequestBlock.vue.script.js.map +1 -1
  28. package/dist/v2/blocks/request-block/components/RequestCodeSnippet.vue.script.js +2 -0
  29. package/dist/v2/blocks/request-block/components/RequestCodeSnippet.vue.script.js.map +1 -1
  30. package/dist/v2/blocks/request-block/components/RequestTableRow.vue.d.ts +2 -0
  31. package/dist/v2/blocks/request-block/components/RequestTableRow.vue.d.ts.map +1 -1
  32. package/dist/v2/blocks/request-block/components/RequestTableRow.vue.js.map +1 -1
  33. package/dist/v2/blocks/request-block/components/RequestTableRow.vue.script.js +3 -1
  34. package/dist/v2/blocks/request-block/components/RequestTableRow.vue.script.js.map +1 -1
  35. package/dist/v2/blocks/request-block/helpers/get-structured-body-rows.js +2 -1
  36. package/dist/v2/blocks/request-block/helpers/get-structured-body-rows.js.map +1 -1
  37. package/dist/v2/blocks/response-block/ResponseBlock.vue.d.ts +2 -0
  38. package/dist/v2/blocks/response-block/ResponseBlock.vue.d.ts.map +1 -1
  39. package/dist/v2/blocks/response-block/ResponseBlock.vue.js +1 -1
  40. package/dist/v2/blocks/response-block/ResponseBlock.vue.js.map +1 -1
  41. package/dist/v2/blocks/response-block/ResponseBlock.vue.script.js +26 -5
  42. package/dist/v2/blocks/response-block/ResponseBlock.vue.script.js.map +1 -1
  43. package/dist/v2/blocks/scalar-address-bar-block/components/AddressBar.vue.d.ts.map +1 -1
  44. package/dist/v2/blocks/scalar-address-bar-block/components/AddressBar.vue.js +1 -1
  45. package/dist/v2/blocks/scalar-address-bar-block/components/AddressBar.vue.js.map +1 -1
  46. package/dist/v2/blocks/scalar-address-bar-block/components/AddressBar.vue.script.js +23 -43
  47. package/dist/v2/blocks/scalar-address-bar-block/components/AddressBar.vue.script.js.map +1 -1
  48. package/dist/v2/blocks/scalar-auth-selector-block/components/AuthSelector.vue.d.ts +9 -0
  49. package/dist/v2/blocks/scalar-auth-selector-block/components/AuthSelector.vue.d.ts.map +1 -1
  50. package/dist/v2/blocks/scalar-auth-selector-block/components/AuthSelector.vue.js.map +1 -1
  51. package/dist/v2/blocks/scalar-auth-selector-block/components/AuthSelector.vue.script.js +65 -42
  52. package/dist/v2/blocks/scalar-auth-selector-block/components/AuthSelector.vue.script.js.map +1 -1
  53. package/dist/v2/blocks/scalar-auth-selector-block/components/OAuth2.vue.d.ts.map +1 -1
  54. package/dist/v2/blocks/scalar-auth-selector-block/components/OAuth2.vue.js.map +1 -1
  55. package/dist/v2/blocks/scalar-auth-selector-block/components/OAuth2.vue.script.js +5 -5
  56. package/dist/v2/blocks/scalar-auth-selector-block/components/OAuth2.vue.script.js.map +1 -1
  57. package/dist/v2/blocks/scalar-auth-selector-block/components/RequestAuthDataTableInput.vue.d.ts.map +1 -1
  58. package/dist/v2/blocks/scalar-auth-selector-block/components/RequestAuthDataTableInput.vue.js.map +1 -1
  59. package/dist/v2/blocks/scalar-auth-selector-block/components/RequestAuthDataTableInput.vue.script.js +11 -1
  60. package/dist/v2/blocks/scalar-auth-selector-block/components/RequestAuthDataTableInput.vue.script.js.map +1 -1
  61. package/dist/v2/blocks/scalar-auth-selector-block/helpers/security-scheme.d.ts.map +1 -1
  62. package/dist/v2/blocks/scalar-auth-selector-block/helpers/security-scheme.js +1 -1
  63. package/dist/v2/blocks/scalar-auth-selector-block/helpers/security-scheme.js.map +1 -1
  64. package/dist/v2/components/code-input/CodeInputLite.vue.d.ts +6 -2
  65. package/dist/v2/components/code-input/CodeInputLite.vue.d.ts.map +1 -1
  66. package/dist/v2/components/code-input/CodeInputLite.vue.js +1 -1
  67. package/dist/v2/components/code-input/CodeInputLite.vue.js.map +1 -1
  68. package/dist/v2/components/code-input/CodeInputLite.vue.script.js +16 -1
  69. package/dist/v2/components/code-input/CodeInputLite.vue.script.js.map +1 -1
  70. package/dist/v2/components/data-table/DataTableInput.vue.d.ts.map +1 -1
  71. package/dist/v2/components/data-table/DataTableInput.vue.js +1 -1
  72. package/dist/v2/components/data-table/DataTableInput.vue.js.map +1 -1
  73. package/dist/v2/components/data-table/DataTableInput.vue.script.js +7 -2
  74. package/dist/v2/components/data-table/DataTableInput.vue.script.js.map +1 -1
  75. package/dist/v2/components/data-table/DataTableInputSelect.vue.d.ts +4 -4
  76. package/dist/v2/components/data-table/DataTableInputSelect.vue.d.ts.map +1 -1
  77. package/dist/v2/components/data-table/DataTableInputSelect.vue.js.map +1 -1
  78. package/dist/v2/components/data-table/DataTableInputSelect.vue.script.js +22 -16
  79. package/dist/v2/components/data-table/DataTableInputSelect.vue.script.js.map +1 -1
  80. package/dist/v2/components/layout/CollapsibleSection.vue.d.ts +20 -0
  81. package/dist/v2/components/layout/CollapsibleSection.vue.d.ts.map +1 -1
  82. package/dist/v2/components/layout/CollapsibleSection.vue.js.map +1 -1
  83. package/dist/v2/components/layout/CollapsibleSection.vue.script.js +36 -16
  84. package/dist/v2/components/layout/CollapsibleSection.vue.script.js.map +1 -1
  85. package/dist/v2/components/layout/collapsible-section-heading-level.d.ts +13 -0
  86. package/dist/v2/components/layout/collapsible-section-heading-level.d.ts.map +1 -0
  87. package/dist/v2/components/layout/collapsible-section-heading-level.js +14 -0
  88. package/dist/v2/components/layout/collapsible-section-heading-level.js.map +1 -0
  89. package/dist/v2/components/layout/index.d.ts +1 -0
  90. package/dist/v2/components/layout/index.d.ts.map +1 -1
  91. package/dist/v2/components/layout/index.js +2 -1
  92. package/dist/v2/components/modals/ModalClientContainer.vue.d.ts.map +1 -1
  93. package/dist/v2/components/modals/ModalClientContainer.vue.js +1 -1
  94. package/dist/v2/components/modals/ModalClientContainer.vue.js.map +1 -1
  95. package/dist/v2/components/modals/ModalClientContainer.vue.script.js +10 -1
  96. package/dist/v2/components/modals/ModalClientContainer.vue.script.js.map +1 -1
  97. package/dist/v2/components/sidebar/SidebarToggle.vue.d.ts +15 -2
  98. package/dist/v2/components/sidebar/SidebarToggle.vue.d.ts.map +1 -1
  99. package/dist/v2/components/sidebar/SidebarToggle.vue.js +3 -1
  100. package/dist/v2/components/sidebar/SidebarToggle.vue.js.map +1 -1
  101. package/dist/v2/components/sidebar/SidebarToggle.vue.script.js +5 -5
  102. package/dist/v2/components/sidebar/SidebarToggle.vue.script.js.map +1 -1
  103. package/dist/v2/constants.js +1 -1
  104. package/dist/v2/features/localization/locales/ar.d.ts +2 -0
  105. package/dist/v2/features/localization/locales/ar.d.ts.map +1 -1
  106. package/dist/v2/features/localization/locales/ar.js +2 -0
  107. package/dist/v2/features/localization/locales/ar.js.map +1 -1
  108. package/dist/v2/features/localization/locales/de.d.ts +2 -0
  109. package/dist/v2/features/localization/locales/de.d.ts.map +1 -1
  110. package/dist/v2/features/localization/locales/de.js +2 -0
  111. package/dist/v2/features/localization/locales/de.js.map +1 -1
  112. package/dist/v2/features/localization/locales/es.d.ts +2 -0
  113. package/dist/v2/features/localization/locales/es.d.ts.map +1 -1
  114. package/dist/v2/features/localization/locales/es.js +2 -0
  115. package/dist/v2/features/localization/locales/es.js.map +1 -1
  116. package/dist/v2/features/localization/locales/fr.d.ts +2 -0
  117. package/dist/v2/features/localization/locales/fr.d.ts.map +1 -1
  118. package/dist/v2/features/localization/locales/fr.js +2 -0
  119. package/dist/v2/features/localization/locales/fr.js.map +1 -1
  120. package/dist/v2/features/localization/locales/pt.d.ts +2 -0
  121. package/dist/v2/features/localization/locales/pt.d.ts.map +1 -1
  122. package/dist/v2/features/localization/locales/pt.js +2 -0
  123. package/dist/v2/features/localization/locales/pt.js.map +1 -1
  124. package/dist/v2/features/localization/locales/ru.d.ts +2 -0
  125. package/dist/v2/features/localization/locales/ru.d.ts.map +1 -1
  126. package/dist/v2/features/localization/locales/ru.js +2 -0
  127. package/dist/v2/features/localization/locales/ru.js.map +1 -1
  128. package/dist/v2/features/localization/locales/zh-cn.d.ts +2 -0
  129. package/dist/v2/features/localization/locales/zh-cn.d.ts.map +1 -1
  130. package/dist/v2/features/localization/locales/zh-cn.js +2 -0
  131. package/dist/v2/features/localization/locales/zh-cn.js.map +1 -1
  132. package/dist/v2/features/localization/translations.d.ts +2 -0
  133. package/dist/v2/features/localization/translations.d.ts.map +1 -1
  134. package/dist/v2/features/localization/translations.js +2 -0
  135. package/dist/v2/features/localization/translations.js.map +1 -1
  136. package/dist/v2/features/modal/Modal.vue.d.ts.map +1 -1
  137. package/dist/v2/features/modal/Modal.vue.js.map +1 -1
  138. package/dist/v2/features/modal/Modal.vue.script.js +2 -1
  139. package/dist/v2/features/modal/Modal.vue.script.js.map +1 -1
  140. package/dist/v2/features/search/helpers/create-fuse-instance.js +1 -1
  141. package/dist/v2/features/search/helpers/create-fuse-instance.js.map +1 -1
  142. package/dist/vue-styles.css +114 -73
  143. package/package.json +12 -12
package/CHANGELOG.md CHANGED
@@ -1,5 +1,60 @@
1
1
  # @scalar/api-client
2
2
 
3
+ ## 3.21.3
4
+
5
+ ### Patch Changes
6
+
7
+ - [#10422](https://github.com/scalar/scalar/pull/10422): Avoid allocating unused character match ranges during document search.
8
+ - [#10402](https://github.com/scalar/scalar/pull/10402): Keep failed requests visible in the response panel and explain possible CORS or network causes for browser fetch failures.
9
+ - [#10400](https://github.com/scalar/scalar/pull/10400): Hide the authentication dropdown in the API Reference when only one required option is active, while retaining authentication and deletion controls in the API Client.
10
+ - [#10382](https://github.com/scalar/scalar/pull/10382): Preserve enum array selections with their original enum value types as JSON arrays in the structured request body form editor and contain long selection labels.
11
+
12
+ ## 3.21.2
13
+
14
+ ### Patch Changes
15
+
16
+ - [#10369](https://github.com/scalar/scalar/pull/10369): fix: correct the semantics of the authentication card and of nested schema lists
17
+
18
+ Two findings from an accessibility audit, both programmatic only with no change
19
+ to how anything renders:
20
+ - The reference's Authentication card announced its title as a level two
21
+ heading, which put a card of controls in the document outline next to the
22
+ real tag and operation headings. The title is now plain text and the card is
23
+ exposed as a named group instead, so it stays findable without claiming to
24
+ open a passage of the page. Collapsible sections in the API client are
25
+ unaffected and keep their headings.
26
+ - A schema panel whose root is a composition, a primitive or an array wraps a
27
+ single nameless row that carries the real property list, so assistive tech
28
+ announced "list with 1 item" before the list the reader wanted. That wrapper
29
+ is now presentational and only the real property list is announced.
30
+
31
+ - [#10371](https://github.com/scalar/scalar/pull/10371): fix: tidy the client modal header at narrow widths
32
+
33
+ The method label and copy button now stay inside the address bar at every width instead of moving to a floating row of their own, and the send button spans the full width once it wraps. Below the `lg` breakpoint, where the address bar fills the header row and its method chip reaches the panel edge, the sidebar toggle moves onto the backdrop as a circle that mirrors the close button in the opposite corner. At wider widths it keeps its original place inside the panel.
34
+
35
+ - [#10374](https://github.com/scalar/scalar/pull/10374): fix: resolve accessibility audit findings in the client modal
36
+ - Auth fields (Bearer Token, Username, API key and OAuth inputs) now expose their visible label as the accessible name in both the masked and unmasked state
37
+ - Request and response filter tabs no longer carry `aria-controls`, so screen readers announce each tab once when arrowing through them
38
+ - Opening the modal from a "Test Request" button now moves focus to the close button first
39
+
40
+ - [#10369](https://github.com/scalar/scalar/pull/10369): fix: address a batch of screen reader and keyboard accessibility findings
41
+
42
+ Corrects programmatic semantics only, with no change to how anything renders:
43
+ the current sidebar item now reports `aria-current`, the single content type
44
+ readout leaves the tab order, collapsible sections no longer announce their
45
+ title twice, the password toggle reports its state through `aria-pressed`, the
46
+ two document download buttons get distinct accessible names, response status
47
+ tabs announce what each code means, and the client picker and its search field
48
+ get accessible names.
49
+
50
+ - [#10361](https://github.com/scalar/scalar/pull/10361): Preserve configured OAuth redirect URLs when changing credentials or clearing tokens, and hide refresh controls when no refresh token is available.
51
+
52
+ Previously saved redirect overrides, including empty strings and prefilled page origins, remain unchanged because they cannot be distinguished from intentional user choices. Users affected by the earlier bug must enter the intended redirect URL again.
53
+
54
+ The public `@scalar/workspace-store` OAuth secrets types now expose `x-scalar-secret-redirect-uri` as optional (`string | undefined`). Consumers must handle an absent override separately from an explicit empty string.
55
+
56
+ - [#10363](https://github.com/scalar/scalar/pull/10363): Avoid duplicate available OAuth2 entries when scopes are selected, and apply configured default scopes when selecting an available scheme.
57
+
3
58
  ## 3.21.1
4
59
 
5
60
  ### Patch Changes
@@ -3,8 +3,6 @@ declare const __VLS_export: <T extends string>(__VLS_props: NonNullable<Awaited<
3
3
  filters?: T[];
4
4
  /** Localized labels keyed by stable filter IDs. */
5
5
  labels?: Partial<Record<T, string>>;
6
- /** IDs for the currently available sections. */
7
- filterIds?: Partial<Record<T, string>>;
8
6
  } & {
9
7
  modelValue?: T;
10
8
  }) & {
@@ -1 +1 @@
1
- {"version":3,"file":"SectionFilter.vue.d.ts","sourceRoot":"","sources":["../../src/components/SectionFilter.vue"],"names":[],"mappings":"AA4LA,QAAA,MAAM,YAAY,GAAK,CAAC,SAAS,MAAM,EACtC,aAAa,WAAW,CAAC,OAAO,CAAC,OAAO,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,EAC9D,YAAY,mBAAmB,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,WAAW,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC,EAC3G,gBAAgB,WAAW,CAAC,OAAO,CAAC,OAAO,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,EAClE;WA8NO,OAAO,KAAK,EAAE,WAAW,GAAG,mBAAmB,CAAC;kBA5N5C,CAAC,EAAE;QACb,mDAAmD;iBAC1C,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QACnC,gDAAgD;oBACpC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;;qBAyC3B,CAAC;;;KA+K6E,CAAC,GAAG,CAAC,OAAO,UAAU,SAAS;QAAE,oBAAoB,EAAE,MAAM,CAAC,CAAA;KAAE,GAAG,CAAC,GAAG,EAAE,CAAC;YAC5J,CAAC,OAAO,EAAE,EAAE,KAAK,IAAI;WACtB,GAAG;WACH,EAAE;;EAGN,KACQ,OAAO,KAAK,EAAE,KAAK,GAAG;IAAE,KAAK,CAAC,EAAE,WAAW,CAAC,OAAO,CAAC,OAAO,WAAW,CAAC,CAAC,CAAA;CAAI,CAAC;wBACpE,OAAO,YAAY;AAAxC,wBAAyC;AACzC,KAAK,mBAAmB,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,GAAG,GAAG;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAAG,GAAG;KAAG,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAAG,CAAC,GAAG,EAAE,CAAC"}
1
+ {"version":3,"file":"SectionFilter.vue.d.ts","sourceRoot":"","sources":["../../src/components/SectionFilter.vue"],"names":[],"mappings":"AAqLA,QAAA,MAAM,YAAY,GAAK,CAAC,SAAS,MAAM,EACtC,aAAa,WAAW,CAAC,OAAO,CAAC,OAAO,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,EAC9D,YAAY,mBAAmB,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,WAAW,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC,EAC3G,gBAAgB,WAAW,CAAC,OAAO,CAAC,OAAO,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,EAClE;WAsNO,OAAO,KAAK,EAAE,WAAW,GAAG,mBAAmB,CAAC;kBApN5C,CAAC,EAAE;QACb,mDAAmD;iBAC1C,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;;qBAqCxB,CAAC;;;KA6K6E,CAAC,GAAG,CAAC,OAAO,UAAU,SAAS;QAAE,oBAAoB,EAAE,MAAM,CAAC,CAAA;KAAE,GAAG,CAAC,GAAG,EAAE,CAAC;YAC5J,CAAC,OAAO,EAAE,EAAE,KAAK,IAAI;WACtB,GAAG;WACH,EAAE;;EAGN,KACQ,OAAO,KAAK,EAAE,KAAK,GAAG;IAAE,KAAK,CAAC,EAAE,WAAW,CAAC,OAAO,CAAC,OAAO,WAAW,CAAC,CAAC,CAAA;CAAI,CAAC;wBACpE,OAAO,YAAY;AAAxC,wBAAyC;AACzC,KAAK,mBAAmB,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,GAAG,GAAG;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAAG,GAAG;KAAG,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAAG,CAAC,GAAG,EAAE,CAAC"}
@@ -2,7 +2,7 @@ import _plugin_vue_export_helper_default from "../_virtual/_plugin-vue_export-he
2
2
  import SectionFilter_vue_vue_type_script_setup_true_lang_default from "./SectionFilter.vue.script.js";
3
3
  /* empty css */
4
4
  //#region src/components/SectionFilter.vue
5
- var SectionFilter_default = /*#__PURE__*/ _plugin_vue_export_helper_default(SectionFilter_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-48147b15"]]);
5
+ var SectionFilter_default = /*#__PURE__*/ _plugin_vue_export_helper_default(SectionFilter_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-50fd0a3c"]]);
6
6
  //#endregion
7
7
  export { SectionFilter_default as default };
8
8
 
@@ -1 +1 @@
1
- {"version":3,"file":"SectionFilter.vue.js","names":[],"sources":["../../src/components/SectionFilter.vue"],"sourcesContent":["<script setup lang=\"ts\" generic=\"T extends string\">\nimport { ScalarIcon } from '@scalar/components/icon'\nimport { nextTick, ref } from 'vue'\n\nimport SectionFilterButton from '@/components/SectionFilterButton.vue'\nimport { useLocalization } from '@/v2/features/localization'\n\nconst {\n filters = [],\n filterIds,\n labels,\n} = defineProps<{\n filters?: T[]\n /** Localized labels keyed by stable filter IDs. */\n labels?: Partial<Record<T, string>>\n /** IDs for the currently available sections. */\n filterIds?: Partial<Record<T, string>>\n}>()\n\nconst model = defineModel<T>()\n\nconst tablist = ref<HTMLDivElement>()\nconst { direction } = useLocalization()\n\n/** Keyboard navigation */\nconst navigateSection = (arrow: 'left' | 'right'): void => {\n // Flex rows reverse in RTL, so the visual arrow direction reverses the index step.\n const offset =\n (arrow === 'left' ? -1 : 1) * (direction.value === 'rtl' ? -1 : 1)\n const index = model.value ? filters.indexOf(model.value) : 0\n const length = filters.length\n\n // Ensures we loop around the array by using the remainder\n const newIndex = (index + offset + length) % length\n model.value = filters[newIndex]\n\n // Focus the selected button\n nextTick(() => {\n if (tablist.value) {\n const selectedButton = tablist.value.querySelector(\n `button[aria-selected=\"true\"]`,\n ) satisfies HTMLButtonElement | null\n if (selectedButton) {\n selectedButton.focus()\n }\n }\n })\n}\n</script>\n<template>\n <div\n ref=\"tablist\"\n class=\"filter-hover context-bar-group ms-auto hidden lg:flex\"\n role=\"tablist\"\n @keydown.left=\"navigateSection('left')\"\n @keydown.right=\"navigateSection('right')\">\n <div\n class=\"request-section-content request-section-content-filter fade-request-section-content text-c-3 pointer-events-auto relative hidden w-full justify-end gap-[1.5px] rounded py-1.75 text-xs xl:flex\">\n <SectionFilterButton\n v-for=\"filter in filters\"\n :key=\"filter\"\n class=\"filter-hover-item\"\n :controls=\"filterIds?.[filter]\"\n role=\"tab\"\n :selected=\"model === filter\"\n @click=\"model = filter\">\n {{ labels?.[filter] ?? filter }}\n </SectionFilterButton>\n <div\n class=\"filter-button context-bar-group-hover:text-c-1 absolute -end-[30px] flex items-center\">\n <span class=\"context-bar-group-hover:hidden me-1.5\">{{\n model ? (labels?.[model] ?? model) : model\n }}</span>\n <ScalarIcon\n icon=\"FilterList\"\n size=\"md\"\n thickness=\"2\" />\n </div>\n </div>\n </div>\n</template>\n<style scoped>\n.fade-request-section-content {\n background: linear-gradient(\n to left,\n var(--scalar-background-1) 64%,\n transparent\n );\n}\n.fade-request-section-content:dir(rtl) {\n background: linear-gradient(\n to right,\n var(--scalar-background-1) 64%,\n transparent\n );\n}\n.filter-hover {\n height: 100%;\n padding-inline-end: 39px;\n padding-inline-start: 24px;\n position: absolute;\n inset-inline-end: 0;\n transition: width 0s ease-in-out 0.2s;\n overflow: hidden;\n}\n.filter-hover:hover,\n.filter-hover:has(:focus-visible) {\n width: 100%;\n z-index: 10;\n}\n.filter-hover:before {\n content: '';\n position: absolute;\n top: 0;\n inset-inline-start: 0;\n width: 100%;\n height: fit-content;\n background-color: var(--scalar-background-1);\n opacity: 0;\n transition: all 0.3s ease-in-out;\n pointer-events: none;\n}\n.filter-hover-item {\n opacity: 0;\n}\n.filter-hover-item:not(:last-of-type) {\n transform: translate3d(0, 3px, 0);\n}\n.filter-hover:hover .filter-hover-item {\n transition:\n opacity 0.2s ease-in-out,\n transform 0.2s ease-in-out;\n}\n.filter-hover:hover .filter-hover-item:nth-last-of-type(1) {\n transition-delay: 0.05s;\n}\n.filter-hover:hover .filter-hover-item:nth-last-of-type(2) {\n transition-delay: 0.1s;\n}\n.filter-hover:hover .filter-hover-item:nth-last-of-type(3) {\n transition-delay: 0.15s;\n}\n.filter-hover:hover .filter-hover-item:nth-last-of-type(4) {\n transition-delay: 0.2s;\n}\n.filter-hover:hover .filter-hover-item:nth-last-of-type(5) {\n transition-delay: 0.25s;\n}\n.filter-hover:hover .filter-hover-item:nth-last-of-type(6) {\n transition-delay: 0.3s;\n}\n.filter-hover:hover .filter-hover-item:nth-last-of-type(7) {\n transition-delay: 0.35s;\n}\n.filter-hover:hover .filter-hover-item,\n.filter-hover:has(:focus-visible) .filter-hover-item {\n opacity: 1;\n transform: translate3d(0, 0, 0);\n}\n.filter-hover:hover:before,\n.filter-hover:has(:focus-visible):before {\n opacity: 0.9;\n backdrop-filter: blur(10px);\n}\n.filter-button {\n top: 50%;\n transform: translateY(-50%);\n}\n.context-bar-group:hover .context-bar-group-hover\\:text-c-1,\n.context-bar-group:has(:focus-visible) .context-bar-group-hover\\:text-c-1 {\n --tw-text-opacity: 1;\n color: rgb(var(--scalar-color-1) / var(--tw-text-opacity));\n}\n\n.context-bar-group:hover .context-bar-group-hover\\:hidden,\n.context-bar-group:has(:focus-visible) .context-bar-group-hover\\:hidden {\n display: none;\n}\n</style>\n"],"mappings":""}
1
+ {"version":3,"file":"SectionFilter.vue.js","names":[],"sources":["../../src/components/SectionFilter.vue"],"sourcesContent":["<script setup lang=\"ts\" generic=\"T extends string\">\nimport { ScalarIcon } from '@scalar/components/icon'\nimport { nextTick, ref } from 'vue'\n\nimport SectionFilterButton from '@/components/SectionFilterButton.vue'\nimport { useLocalization } from '@/v2/features/localization'\n\nconst { filters = [], labels } = defineProps<{\n filters?: T[]\n /** Localized labels keyed by stable filter IDs. */\n labels?: Partial<Record<T, string>>\n}>()\n\nconst model = defineModel<T>()\n\nconst tablist = ref<HTMLDivElement>()\nconst { direction } = useLocalization()\n\n/** Keyboard navigation */\nconst navigateSection = (arrow: 'left' | 'right'): void => {\n // Flex rows reverse in RTL, so the visual arrow direction reverses the index step.\n const offset =\n (arrow === 'left' ? -1 : 1) * (direction.value === 'rtl' ? -1 : 1)\n const index = model.value ? filters.indexOf(model.value) : 0\n const length = filters.length\n\n // Ensures we loop around the array by using the remainder\n const newIndex = (index + offset + length) % length\n model.value = filters[newIndex]\n\n // Focus the selected button\n nextTick(() => {\n if (tablist.value) {\n const selectedButton = tablist.value.querySelector(\n `button[aria-selected=\"true\"]`,\n ) satisfies HTMLButtonElement | null\n if (selectedButton) {\n selectedButton.focus()\n }\n }\n })\n}\n</script>\n<template>\n <div\n ref=\"tablist\"\n class=\"filter-hover context-bar-group ms-auto hidden lg:flex\"\n role=\"tablist\"\n @keydown.left=\"navigateSection('left')\"\n @keydown.right=\"navigateSection('right')\">\n <div\n class=\"request-section-content request-section-content-filter fade-request-section-content text-c-3 pointer-events-auto relative hidden w-full justify-end gap-[1.5px] rounded py-1.75 text-xs xl:flex\">\n <SectionFilterButton\n v-for=\"filter in filters\"\n :key=\"filter\"\n class=\"filter-hover-item\"\n role=\"tab\"\n :selected=\"model === filter\"\n @click=\"model = filter\">\n {{ labels?.[filter] ?? filter }}\n </SectionFilterButton>\n <div\n class=\"filter-button context-bar-group-hover:text-c-1 absolute -end-[30px] flex items-center\">\n <span class=\"context-bar-group-hover:hidden me-1.5\">{{\n model ? (labels?.[model] ?? model) : model\n }}</span>\n <ScalarIcon\n icon=\"FilterList\"\n size=\"md\"\n thickness=\"2\" />\n </div>\n </div>\n </div>\n</template>\n<style scoped>\n.fade-request-section-content {\n background: linear-gradient(\n to left,\n var(--scalar-background-1) 64%,\n transparent\n );\n}\n.fade-request-section-content:dir(rtl) {\n background: linear-gradient(\n to right,\n var(--scalar-background-1) 64%,\n transparent\n );\n}\n.filter-hover {\n height: 100%;\n padding-inline-end: 39px;\n padding-inline-start: 24px;\n position: absolute;\n inset-inline-end: 0;\n transition: width 0s ease-in-out 0.2s;\n overflow: hidden;\n}\n.filter-hover:hover,\n.filter-hover:has(:focus-visible) {\n width: 100%;\n z-index: 10;\n}\n.filter-hover:before {\n content: '';\n position: absolute;\n top: 0;\n inset-inline-start: 0;\n width: 100%;\n height: fit-content;\n background-color: var(--scalar-background-1);\n opacity: 0;\n transition: all 0.3s ease-in-out;\n pointer-events: none;\n}\n.filter-hover-item {\n opacity: 0;\n}\n.filter-hover-item:not(:last-of-type) {\n transform: translate3d(0, 3px, 0);\n}\n.filter-hover:hover .filter-hover-item {\n transition:\n opacity 0.2s ease-in-out,\n transform 0.2s ease-in-out;\n}\n.filter-hover:hover .filter-hover-item:nth-last-of-type(1) {\n transition-delay: 0.05s;\n}\n.filter-hover:hover .filter-hover-item:nth-last-of-type(2) {\n transition-delay: 0.1s;\n}\n.filter-hover:hover .filter-hover-item:nth-last-of-type(3) {\n transition-delay: 0.15s;\n}\n.filter-hover:hover .filter-hover-item:nth-last-of-type(4) {\n transition-delay: 0.2s;\n}\n.filter-hover:hover .filter-hover-item:nth-last-of-type(5) {\n transition-delay: 0.25s;\n}\n.filter-hover:hover .filter-hover-item:nth-last-of-type(6) {\n transition-delay: 0.3s;\n}\n.filter-hover:hover .filter-hover-item:nth-last-of-type(7) {\n transition-delay: 0.35s;\n}\n.filter-hover:hover .filter-hover-item,\n.filter-hover:has(:focus-visible) .filter-hover-item {\n opacity: 1;\n transform: translate3d(0, 0, 0);\n}\n.filter-hover:hover:before,\n.filter-hover:has(:focus-visible):before {\n opacity: 0.9;\n backdrop-filter: blur(10px);\n}\n.filter-button {\n top: 50%;\n transform: translateY(-50%);\n}\n.context-bar-group:hover .context-bar-group-hover\\:text-c-1,\n.context-bar-group:has(:focus-visible) .context-bar-group-hover\\:text-c-1 {\n --tw-text-opacity: 1;\n color: rgb(var(--scalar-color-1) / var(--tw-text-opacity));\n}\n\n.context-bar-group:hover .context-bar-group-hover\\:hidden,\n.context-bar-group:has(:focus-visible) .context-bar-group-hover\\:hidden {\n display: none;\n}\n</style>\n"],"mappings":""}
@@ -10,8 +10,7 @@ var SectionFilter_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ de
10
10
  __name: "SectionFilter",
11
11
  props: /*@__PURE__*/ mergeModels({
12
12
  filters: { default: () => [] },
13
- labels: {},
14
- filterIds: {}
13
+ labels: {}
15
14
  }, {
16
15
  "modelValue": {},
17
16
  "modelModifiers": {}
@@ -46,18 +45,13 @@ var SectionFilter_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ de
46
45
  return openBlock(), createBlock(SectionFilterButton_default, {
47
46
  key: filter,
48
47
  class: "filter-hover-item",
49
- controls: __props.filterIds?.[filter],
50
48
  role: "tab",
51
49
  selected: model.value === filter,
52
50
  onClick: ($event) => model.value = filter
53
51
  }, {
54
52
  default: withCtx(() => [createTextVNode(toDisplayString(__props.labels?.[filter] ?? filter), 1)]),
55
53
  _: 2
56
- }, 1032, [
57
- "controls",
58
- "selected",
59
- "onClick"
60
- ]);
54
+ }, 1032, ["selected", "onClick"]);
61
55
  }), 128)), createElementVNode("div", _hoisted_2, [createElementVNode("span", _hoisted_3, toDisplayString(model.value ? __props.labels?.[model.value] ?? model.value : model.value), 1), createVNode(unref(ScalarIcon), {
62
56
  icon: "FilterList",
63
57
  size: "md",
@@ -1 +1 @@
1
- {"version":3,"file":"SectionFilter.vue.script.js","names":[],"sources":["../../src/components/SectionFilter.vue"],"sourcesContent":["<script setup lang=\"ts\" generic=\"T extends string\">\nimport { ScalarIcon } from '@scalar/components/icon'\nimport { nextTick, ref } from 'vue'\n\nimport SectionFilterButton from '@/components/SectionFilterButton.vue'\nimport { useLocalization } from '@/v2/features/localization'\n\nconst {\n filters = [],\n filterIds,\n labels,\n} = defineProps<{\n filters?: T[]\n /** Localized labels keyed by stable filter IDs. */\n labels?: Partial<Record<T, string>>\n /** IDs for the currently available sections. */\n filterIds?: Partial<Record<T, string>>\n}>()\n\nconst model = defineModel<T>()\n\nconst tablist = ref<HTMLDivElement>()\nconst { direction } = useLocalization()\n\n/** Keyboard navigation */\nconst navigateSection = (arrow: 'left' | 'right'): void => {\n // Flex rows reverse in RTL, so the visual arrow direction reverses the index step.\n const offset =\n (arrow === 'left' ? -1 : 1) * (direction.value === 'rtl' ? -1 : 1)\n const index = model.value ? filters.indexOf(model.value) : 0\n const length = filters.length\n\n // Ensures we loop around the array by using the remainder\n const newIndex = (index + offset + length) % length\n model.value = filters[newIndex]\n\n // Focus the selected button\n nextTick(() => {\n if (tablist.value) {\n const selectedButton = tablist.value.querySelector(\n `button[aria-selected=\"true\"]`,\n ) satisfies HTMLButtonElement | null\n if (selectedButton) {\n selectedButton.focus()\n }\n }\n })\n}\n</script>\n<template>\n <div\n ref=\"tablist\"\n class=\"filter-hover context-bar-group ms-auto hidden lg:flex\"\n role=\"tablist\"\n @keydown.left=\"navigateSection('left')\"\n @keydown.right=\"navigateSection('right')\">\n <div\n class=\"request-section-content request-section-content-filter fade-request-section-content text-c-3 pointer-events-auto relative hidden w-full justify-end gap-[1.5px] rounded py-1.75 text-xs xl:flex\">\n <SectionFilterButton\n v-for=\"filter in filters\"\n :key=\"filter\"\n class=\"filter-hover-item\"\n :controls=\"filterIds?.[filter]\"\n role=\"tab\"\n :selected=\"model === filter\"\n @click=\"model = filter\">\n {{ labels?.[filter] ?? filter }}\n </SectionFilterButton>\n <div\n class=\"filter-button context-bar-group-hover:text-c-1 absolute -end-[30px] flex items-center\">\n <span class=\"context-bar-group-hover:hidden me-1.5\">{{\n model ? (labels?.[model] ?? model) : model\n }}</span>\n <ScalarIcon\n icon=\"FilterList\"\n size=\"md\"\n thickness=\"2\" />\n </div>\n </div>\n </div>\n</template>\n<style scoped>\n.fade-request-section-content {\n background: linear-gradient(\n to left,\n var(--scalar-background-1) 64%,\n transparent\n );\n}\n.fade-request-section-content:dir(rtl) {\n background: linear-gradient(\n to right,\n var(--scalar-background-1) 64%,\n transparent\n );\n}\n.filter-hover {\n height: 100%;\n padding-inline-end: 39px;\n padding-inline-start: 24px;\n position: absolute;\n inset-inline-end: 0;\n transition: width 0s ease-in-out 0.2s;\n overflow: hidden;\n}\n.filter-hover:hover,\n.filter-hover:has(:focus-visible) {\n width: 100%;\n z-index: 10;\n}\n.filter-hover:before {\n content: '';\n position: absolute;\n top: 0;\n inset-inline-start: 0;\n width: 100%;\n height: fit-content;\n background-color: var(--scalar-background-1);\n opacity: 0;\n transition: all 0.3s ease-in-out;\n pointer-events: none;\n}\n.filter-hover-item {\n opacity: 0;\n}\n.filter-hover-item:not(:last-of-type) {\n transform: translate3d(0, 3px, 0);\n}\n.filter-hover:hover .filter-hover-item {\n transition:\n opacity 0.2s ease-in-out,\n transform 0.2s ease-in-out;\n}\n.filter-hover:hover .filter-hover-item:nth-last-of-type(1) {\n transition-delay: 0.05s;\n}\n.filter-hover:hover .filter-hover-item:nth-last-of-type(2) {\n transition-delay: 0.1s;\n}\n.filter-hover:hover .filter-hover-item:nth-last-of-type(3) {\n transition-delay: 0.15s;\n}\n.filter-hover:hover .filter-hover-item:nth-last-of-type(4) {\n transition-delay: 0.2s;\n}\n.filter-hover:hover .filter-hover-item:nth-last-of-type(5) {\n transition-delay: 0.25s;\n}\n.filter-hover:hover .filter-hover-item:nth-last-of-type(6) {\n transition-delay: 0.3s;\n}\n.filter-hover:hover .filter-hover-item:nth-last-of-type(7) {\n transition-delay: 0.35s;\n}\n.filter-hover:hover .filter-hover-item,\n.filter-hover:has(:focus-visible) .filter-hover-item {\n opacity: 1;\n transform: translate3d(0, 0, 0);\n}\n.filter-hover:hover:before,\n.filter-hover:has(:focus-visible):before {\n opacity: 0.9;\n backdrop-filter: blur(10px);\n}\n.filter-button {\n top: 50%;\n transform: translateY(-50%);\n}\n.context-bar-group:hover .context-bar-group-hover\\:text-c-1,\n.context-bar-group:has(:focus-visible) .context-bar-group-hover\\:text-c-1 {\n --tw-text-opacity: 1;\n color: rgb(var(--scalar-color-1) / var(--tw-text-opacity));\n}\n\n.context-bar-group:hover .context-bar-group-hover\\:hidden,\n.context-bar-group:has(:focus-visible) .context-bar-group-hover\\:hidden {\n display: none;\n}\n</style>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;EAmBA,MAAM,QAAQ,SAAc,SAAA,YAAC;EAE7B,MAAM,UAAU,IAAoB;EACpC,MAAM,EAAE,cAAc,gBAAgB;;EAGtC,MAAM,mBAAmB,UAAkC;GAEzD,MAAM,UACH,UAAU,SAAS,KAAK,MAAM,UAAU,UAAU,QAAQ,KAAK;GAClE,MAAM,QAAQ,MAAM,QAAQ,QAAA,QAAQ,QAAQ,MAAM,KAAK,IAAI;GAC3D,MAAM,SAAS,QAAA,QAAQ;GAGvB,MAAM,YAAY,QAAQ,SAAS,UAAU;GAC7C,MAAM,QAAQ,QAAA,QAAQ;GAGtB,eAAe;IACb,IAAI,QAAQ,OAAO;KACjB,MAAM,iBAAiB,QAAQ,MAAM,cACnC,8BACF;KACA,IAAI,gBACF,eAAe,MAAM;IAEzB;GACF,CAAC;EACH;;uBAGE,mBA6BM,OAAA;aA5BA;IAAJ,KAAI;IACJ,OAAM;IACN,MAAK;IACJ,WAAO,CAAA,OAAA,OAAA,OAAA,KAAA,UAAA,WAAO,gBAAe,MAAA,GAAA,CAAA,MAAA,CAAA,IAAA,OAAA,OAAA,OAAA,KAAA,UAAA,WACd,gBAAe,OAAA,GAAA,CAAA,OAAA,CAAA,EAAA;OAC/B,mBAsBM,OAtBN,YAsBM,EAAA,UAAA,IAAA,GApBJ,mBASsB,UAAA,MAAA,WARH,QAAA,UAAV,WAAM;wBADf,YASsB,6BAAA;KAPnB,KAAK;KACN,OAAM;KACL,UAAU,QAAA,YAAY;KACvB,MAAK;KACJ,UAAU,MAAA,UAAU;KACpB,UAAK,WAAE,MAAA,QAAQ;;4BACgB,CAAA,gBAAA,gBAA7B,QAAA,SAAS,WAAW,MAAM,GAAA,CAAA,CAAA,CAAA;;;;;;;cAE/B,mBASM,OATN,YASM,CAPJ,mBAES,QAFT,YAES,gBADP,MAAA,QAAS,QAAA,SAAS,MAAA,UAAU,MAAA,QAAS,MAAA,KAAK,GAAA,CAAA,GAE5C,YAGkB,MAAA,UAAA,GAAA;IAFhB,MAAK;IACL,MAAK;IACL,WAAU"}
1
+ {"version":3,"file":"SectionFilter.vue.script.js","names":[],"sources":["../../src/components/SectionFilter.vue"],"sourcesContent":["<script setup lang=\"ts\" generic=\"T extends string\">\nimport { ScalarIcon } from '@scalar/components/icon'\nimport { nextTick, ref } from 'vue'\n\nimport SectionFilterButton from '@/components/SectionFilterButton.vue'\nimport { useLocalization } from '@/v2/features/localization'\n\nconst { filters = [], labels } = defineProps<{\n filters?: T[]\n /** Localized labels keyed by stable filter IDs. */\n labels?: Partial<Record<T, string>>\n}>()\n\nconst model = defineModel<T>()\n\nconst tablist = ref<HTMLDivElement>()\nconst { direction } = useLocalization()\n\n/** Keyboard navigation */\nconst navigateSection = (arrow: 'left' | 'right'): void => {\n // Flex rows reverse in RTL, so the visual arrow direction reverses the index step.\n const offset =\n (arrow === 'left' ? -1 : 1) * (direction.value === 'rtl' ? -1 : 1)\n const index = model.value ? filters.indexOf(model.value) : 0\n const length = filters.length\n\n // Ensures we loop around the array by using the remainder\n const newIndex = (index + offset + length) % length\n model.value = filters[newIndex]\n\n // Focus the selected button\n nextTick(() => {\n if (tablist.value) {\n const selectedButton = tablist.value.querySelector(\n `button[aria-selected=\"true\"]`,\n ) satisfies HTMLButtonElement | null\n if (selectedButton) {\n selectedButton.focus()\n }\n }\n })\n}\n</script>\n<template>\n <div\n ref=\"tablist\"\n class=\"filter-hover context-bar-group ms-auto hidden lg:flex\"\n role=\"tablist\"\n @keydown.left=\"navigateSection('left')\"\n @keydown.right=\"navigateSection('right')\">\n <div\n class=\"request-section-content request-section-content-filter fade-request-section-content text-c-3 pointer-events-auto relative hidden w-full justify-end gap-[1.5px] rounded py-1.75 text-xs xl:flex\">\n <SectionFilterButton\n v-for=\"filter in filters\"\n :key=\"filter\"\n class=\"filter-hover-item\"\n role=\"tab\"\n :selected=\"model === filter\"\n @click=\"model = filter\">\n {{ labels?.[filter] ?? filter }}\n </SectionFilterButton>\n <div\n class=\"filter-button context-bar-group-hover:text-c-1 absolute -end-[30px] flex items-center\">\n <span class=\"context-bar-group-hover:hidden me-1.5\">{{\n model ? (labels?.[model] ?? model) : model\n }}</span>\n <ScalarIcon\n icon=\"FilterList\"\n size=\"md\"\n thickness=\"2\" />\n </div>\n </div>\n </div>\n</template>\n<style scoped>\n.fade-request-section-content {\n background: linear-gradient(\n to left,\n var(--scalar-background-1) 64%,\n transparent\n );\n}\n.fade-request-section-content:dir(rtl) {\n background: linear-gradient(\n to right,\n var(--scalar-background-1) 64%,\n transparent\n );\n}\n.filter-hover {\n height: 100%;\n padding-inline-end: 39px;\n padding-inline-start: 24px;\n position: absolute;\n inset-inline-end: 0;\n transition: width 0s ease-in-out 0.2s;\n overflow: hidden;\n}\n.filter-hover:hover,\n.filter-hover:has(:focus-visible) {\n width: 100%;\n z-index: 10;\n}\n.filter-hover:before {\n content: '';\n position: absolute;\n top: 0;\n inset-inline-start: 0;\n width: 100%;\n height: fit-content;\n background-color: var(--scalar-background-1);\n opacity: 0;\n transition: all 0.3s ease-in-out;\n pointer-events: none;\n}\n.filter-hover-item {\n opacity: 0;\n}\n.filter-hover-item:not(:last-of-type) {\n transform: translate3d(0, 3px, 0);\n}\n.filter-hover:hover .filter-hover-item {\n transition:\n opacity 0.2s ease-in-out,\n transform 0.2s ease-in-out;\n}\n.filter-hover:hover .filter-hover-item:nth-last-of-type(1) {\n transition-delay: 0.05s;\n}\n.filter-hover:hover .filter-hover-item:nth-last-of-type(2) {\n transition-delay: 0.1s;\n}\n.filter-hover:hover .filter-hover-item:nth-last-of-type(3) {\n transition-delay: 0.15s;\n}\n.filter-hover:hover .filter-hover-item:nth-last-of-type(4) {\n transition-delay: 0.2s;\n}\n.filter-hover:hover .filter-hover-item:nth-last-of-type(5) {\n transition-delay: 0.25s;\n}\n.filter-hover:hover .filter-hover-item:nth-last-of-type(6) {\n transition-delay: 0.3s;\n}\n.filter-hover:hover .filter-hover-item:nth-last-of-type(7) {\n transition-delay: 0.35s;\n}\n.filter-hover:hover .filter-hover-item,\n.filter-hover:has(:focus-visible) .filter-hover-item {\n opacity: 1;\n transform: translate3d(0, 0, 0);\n}\n.filter-hover:hover:before,\n.filter-hover:has(:focus-visible):before {\n opacity: 0.9;\n backdrop-filter: blur(10px);\n}\n.filter-button {\n top: 50%;\n transform: translateY(-50%);\n}\n.context-bar-group:hover .context-bar-group-hover\\:text-c-1,\n.context-bar-group:has(:focus-visible) .context-bar-group-hover\\:text-c-1 {\n --tw-text-opacity: 1;\n color: rgb(var(--scalar-color-1) / var(--tw-text-opacity));\n}\n\n.context-bar-group:hover .context-bar-group-hover\\:hidden,\n.context-bar-group:has(:focus-visible) .context-bar-group-hover\\:hidden {\n display: none;\n}\n</style>\n"],"mappings":";;;;;;;;;;;;;;;;;;;EAaA,MAAM,QAAQ,SAAc,SAAA,YAAC;EAE7B,MAAM,UAAU,IAAoB;EACpC,MAAM,EAAE,cAAc,gBAAgB;;EAGtC,MAAM,mBAAmB,UAAkC;GAEzD,MAAM,UACH,UAAU,SAAS,KAAK,MAAM,UAAU,UAAU,QAAQ,KAAK;GAClE,MAAM,QAAQ,MAAM,QAAQ,QAAA,QAAQ,QAAQ,MAAM,KAAK,IAAI;GAC3D,MAAM,SAAS,QAAA,QAAQ;GAGvB,MAAM,YAAY,QAAQ,SAAS,UAAU;GAC7C,MAAM,QAAQ,QAAA,QAAQ;GAGtB,eAAe;IACb,IAAI,QAAQ,OAAO;KACjB,MAAM,iBAAiB,QAAQ,MAAM,cACnC,8BACF;KACA,IAAI,gBACF,eAAe,MAAM;IAEzB;GACF,CAAC;EACH;;uBAGE,mBA4BM,OAAA;aA3BA;IAAJ,KAAI;IACJ,OAAM;IACN,MAAK;IACJ,WAAO,CAAA,OAAA,OAAA,OAAA,KAAA,UAAA,WAAO,gBAAe,MAAA,GAAA,CAAA,MAAA,CAAA,IAAA,OAAA,OAAA,OAAA,KAAA,UAAA,WACd,gBAAe,OAAA,GAAA,CAAA,OAAA,CAAA,EAAA;OAC/B,mBAqBM,OArBN,YAqBM,EAAA,UAAA,IAAA,GAnBJ,mBAQsB,UAAA,MAAA,WAPH,QAAA,UAAV,WAAM;wBADf,YAQsB,6BAAA;KANnB,KAAK;KACN,OAAM;KACN,MAAK;KACJ,UAAU,MAAA,UAAU;KACpB,UAAK,WAAE,MAAA,QAAQ;;4BACgB,CAAA,gBAAA,gBAA7B,QAAA,SAAS,WAAW,MAAM,GAAA,CAAA,CAAA,CAAA;;;cAE/B,mBASM,OATN,YASM,CAPJ,mBAES,QAFT,YAES,gBADP,MAAA,QAAS,QAAA,SAAS,MAAA,UAAU,MAAA,QAAS,MAAA,KAAK,GAAA,CAAA,GAE5C,YAGkB,MAAA,UAAA,GAAA;IAFhB,MAAK;IACL,MAAK;IACL,WAAU"}
@@ -1,6 +1,5 @@
1
1
  type __VLS_Props = {
2
2
  selected?: boolean;
3
- controls?: string | undefined;
4
3
  };
5
4
  declare var __VLS_1: {};
6
5
  type __VLS_Slots = {} & {
@@ -1 +1 @@
1
- {"version":3,"file":"SectionFilterButton.vue.d.ts","sourceRoot":"","sources":["../../src/components/SectionFilterButton.vue"],"names":[],"mappings":"AAqBA,KAAK,WAAW,GAAG;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAC9B,CAAC;AA2CF,QAAA,IAAI,OAAO,IAAW,CAAE;AACxB,KAAK,WAAW,GAAG,EAAE,GACnB;IAAE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,OAAO,KAAK,GAAG,CAAA;CAAE,CAAC;AAG/C,QAAA,MAAM,UAAU,kSAEd,CAAC;AACH,QAAA,MAAM,YAAY,EAAS,eAAe,CAAC,OAAO,UAAU,EAAE,WAAW,CAAC,CAAC;wBACtD,OAAO,YAAY;AAAxC,wBAAyC;AACzC,KAAK,eAAe,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IAChC,QAAO;QACN,MAAM,EAAE,CAAC,CAAC;KACV,CAAA;CACD,CAAC"}
1
+ {"version":3,"file":"SectionFilterButton.vue.d.ts","sourceRoot":"","sources":["../../src/components/SectionFilterButton.vue"],"names":[],"mappings":"AA0BA,KAAK,WAAW,GAAG;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB,CAAC;AA0CF,QAAA,IAAI,OAAO,IAAW,CAAE;AACxB,KAAK,WAAW,GAAG,EAAE,GACnB;IAAE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,OAAO,KAAK,GAAG,CAAA;CAAE,CAAC;AAG/C,QAAA,MAAM,UAAU,kSAEd,CAAC;AACH,QAAA,MAAM,YAAY,EAAS,eAAe,CAAC,OAAO,UAAU,EAAE,WAAW,CAAC,CAAC;wBACtD,OAAO,YAAY;AAAxC,wBAAyC;AACzC,KAAK,eAAe,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IAChC,QAAO;QACN,MAAM,EAAE,CAAC,CAAC;KACV,CAAA;CACD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"SectionFilterButton.vue.js","names":[],"sources":["../../src/components/SectionFilterButton.vue"],"sourcesContent":["<script setup lang=\"ts\">\nconst { selected, controls } = defineProps<{\n selected?: boolean\n controls?: string | undefined\n}>()\n</script>\n<template>\n <button\n :aria-controls=\"controls ?? ''\"\n :aria-selected=\"!!selected\"\n class=\"hover:bg-b-2 flex w-fit cursor-pointer items-center rounded p-1 px-2 text-center font-medium whitespace-nowrap has-[:focus-visible]:outline\"\n :class=\"{ 'text-c-1 pointer-events-none': selected }\"\n role=\"tab\"\n :tabindex=\"selected ? 0 : -1\"\n type=\"button\">\n <slot />\n </button>\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"SectionFilterButton.vue.js","names":[],"sources":["../../src/components/SectionFilterButton.vue"],"sourcesContent":["<script setup lang=\"ts\">\nconst { selected } = defineProps<{\n selected?: boolean\n}>()\n</script>\n<template>\n <!--\n Deliberately no aria-controls. While the focused tab controls a visible\n panel, NVDA re-announces every tab whose aria-selected changes (Chromium\n fires a selection event, see nvaccess/nvda#18794), so arrow keys read\n \"Auth tab selected 2 of 6\" twice. Screen readers do not need the relation\n to convey the tabs' name, role and state.\n -->\n <button\n :aria-selected=\"!!selected\"\n class=\"hover:bg-b-2 flex w-fit cursor-pointer items-center rounded p-1 px-2 text-center font-medium whitespace-nowrap has-[:focus-visible]:outline\"\n :class=\"{ 'text-c-1 pointer-events-none': selected }\"\n role=\"tab\"\n :tabindex=\"selected ? 0 : -1\"\n type=\"button\">\n <slot />\n </button>\n</template>\n"],"mappings":""}
@@ -1,20 +1,12 @@
1
1
  import { createElementBlock, defineComponent, normalizeClass, openBlock, renderSlot } from "vue";
2
2
  //#region src/components/SectionFilterButton.vue?vue&type=script&setup=true&lang.ts
3
- var _hoisted_1 = [
4
- "aria-controls",
5
- "aria-selected",
6
- "tabindex"
7
- ];
3
+ var _hoisted_1 = ["aria-selected", "tabindex"];
8
4
  var SectionFilterButton_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
9
5
  __name: "SectionFilterButton",
10
- props: {
11
- selected: { type: Boolean },
12
- controls: {}
13
- },
6
+ props: { selected: { type: Boolean } },
14
7
  setup(__props) {
15
8
  return (_ctx, _cache) => {
16
9
  return openBlock(), createElementBlock("button", {
17
- "aria-controls": __props.controls ?? "",
18
10
  "aria-selected": !!__props.selected,
19
11
  class: normalizeClass(["hover:bg-b-2 flex w-fit cursor-pointer items-center rounded p-1 px-2 text-center font-medium whitespace-nowrap has-[:focus-visible]:outline", { "text-c-1 pointer-events-none": __props.selected }]),
20
12
  role: "tab",
@@ -1 +1 @@
1
- {"version":3,"file":"SectionFilterButton.vue.script.js","names":[],"sources":["../../src/components/SectionFilterButton.vue"],"sourcesContent":["<script setup lang=\"ts\">\nconst { selected, controls } = defineProps<{\n selected?: boolean\n controls?: string | undefined\n}>()\n</script>\n<template>\n <button\n :aria-controls=\"controls ?? ''\"\n :aria-selected=\"!!selected\"\n class=\"hover:bg-b-2 flex w-fit cursor-pointer items-center rounded p-1 px-2 text-center font-medium whitespace-nowrap has-[:focus-visible]:outline\"\n :class=\"{ 'text-c-1 pointer-events-none': selected }\"\n role=\"tab\"\n :tabindex=\"selected ? 0 : -1\"\n type=\"button\">\n <slot />\n </button>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;uBAOE,mBASS,UAAA;IARN,iBAAe,QAAA,YAAQ;IACvB,iBAAa,CAAA,CAAI,QAAA;IAClB,OAAK,eAAA,CAAC,+IAA6I,EAAA,gCACzG,QAAA,SAAQ,CAAA,CAAA;IAClD,MAAK;IACJ,UAAU,QAAA,WAAQ,IAAA;IACnB,MAAK;OACL,WAAQ,KAAA,QAAA,SAAA,CAAA,GAAA,IAAA,UAAA"}
1
+ {"version":3,"file":"SectionFilterButton.vue.script.js","names":[],"sources":["../../src/components/SectionFilterButton.vue"],"sourcesContent":["<script setup lang=\"ts\">\nconst { selected } = defineProps<{\n selected?: boolean\n}>()\n</script>\n<template>\n <!--\n Deliberately no aria-controls. While the focused tab controls a visible\n panel, NVDA re-announces every tab whose aria-selected changes (Chromium\n fires a selection event, see nvaccess/nvda#18794), so arrow keys read\n \"Auth tab selected 2 of 6\" twice. Screen readers do not need the relation\n to convey the tabs' name, role and state.\n -->\n <button\n :aria-selected=\"!!selected\"\n class=\"hover:bg-b-2 flex w-fit cursor-pointer items-center rounded p-1 px-2 text-center font-medium whitespace-nowrap has-[:focus-visible]:outline\"\n :class=\"{ 'text-c-1 pointer-events-none': selected }\"\n role=\"tab\"\n :tabindex=\"selected ? 0 : -1\"\n type=\"button\">\n <slot />\n </button>\n</template>\n"],"mappings":";;;;;;;;uBAaE,mBAQS,UAAA;IAPN,iBAAa,CAAA,CAAI,QAAA;IAClB,OAAK,eAAA,CAAC,+IAA6I,EAAA,gCACzG,QAAA,SAAQ,CAAA,CAAA;IAClD,MAAK;IACJ,UAAU,QAAA,WAAQ,IAAA;IACnB,MAAK;OACL,WAAQ,KAAA,QAAA,SAAA,CAAA,GAAA,IAAA,UAAA"}