@redocly/redoc 0.131.0-next.9 → 0.132.0-next.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 +185 -1
- package/dist/bin.js +1 -1
- package/dist/cli/stats/collectors/{openapi.d.ts → openapi/index.d.ts} +2 -2
- package/dist/cli/stats/collectors/openapi/index.js +1 -0
- package/dist/cli/stats/collectors/openapi/oas32.d.ts +15 -0
- package/dist/cli/stats/collectors/openapi/oas32.js +1 -0
- package/dist/cli/stats/index.js +1 -1
- package/dist/client/app/hooks/catalog/useCatalogSort.d.ts +1 -1
- package/dist/client/app/hooks/catalog/useCatalogSort.js +1 -1
- package/dist/client/app/hooks/catalog/useFetchCatalogEntities.js +1 -1
- package/dist/client/app/hooks/useAnchorPositioning.js +1 -1
- package/dist/client/app/l10n/index.js +1 -1
- package/dist/client/app/search/useAiSearch.js +1 -1
- package/dist/client/app/seo/SeoTags.js +1 -1
- package/dist/client/templates/asyncapi-docs/template.js +1 -3
- package/dist/client/templates/openapi-docs/template.js +2 -6
- package/dist/client/types/ai-search.d.ts +1 -0
- package/dist/constants/l10n/langs/ar.js +1 -1
- package/dist/constants/l10n/langs/de.js +1 -1
- package/dist/constants/l10n/langs/en.js +1 -1
- package/dist/constants/l10n/langs/es.js +1 -1
- package/dist/constants/l10n/langs/fr.js +1 -1
- package/dist/constants/l10n/langs/hi.js +1 -1
- package/dist/constants/l10n/langs/it.js +1 -1
- package/dist/constants/l10n/langs/ja.js +1 -1
- package/dist/constants/l10n/langs/ko.js +1 -1
- package/dist/constants/l10n/langs/pl.js +1 -1
- package/dist/constants/l10n/langs/pt-BR.js +1 -1
- package/dist/constants/l10n/langs/pt.js +1 -1
- package/dist/constants/l10n/langs/ru.js +1 -1
- package/dist/constants/l10n/langs/uk.js +1 -1
- package/dist/constants/l10n/langs/zh.js +1 -1
- package/dist/markdoc/helpers/extract-rbac-from-condition-node.d.ts +6 -15
- package/dist/markdoc/helpers/extract-rbac-from-condition-node.js +1 -1
- package/dist/markdoc/helpers/guards/is-function.d.ts +1 -0
- package/dist/markdoc/helpers/guards/is-variable.d.ts +3 -3
- package/dist/server/api-routes/execute-api-route.js +1 -1
- package/dist/server/config/env-config.d.ts +1 -0
- package/dist/server/config/env-config.js +1 -1
- package/dist/server/config/env-schema.d.ts +3 -3
- package/dist/server/config/env-schemas/server-config.d.ts +3 -3
- package/dist/server/config/env-schemas/server-config.js +1 -1
- package/dist/server/esbuild/esbuild-logger.js +3 -3
- package/dist/server/node-bundle-entry.js +1 -1
- package/dist/server/plugins/asyncapi-docs/search/get-ai-search-documents.js +37 -37
- package/dist/server/plugins/catalog-entities/database/catalog-entities-service.d.ts +7 -0
- package/dist/server/plugins/catalog-entities/database/catalog-entities-service.js +1 -1
- package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-read-repository.d.ts +22 -0
- package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-read-repository.js +29 -15
- package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-repository.d.ts +6 -0
- package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-repository.js +1 -1
- package/dist/server/plugins/catalog-entities/get-server-props.js +1 -1
- package/dist/server/plugins/entitlements/index.js +1 -1
- package/dist/server/plugins/entitlements/utils/get-billed-catalog-build-pages-count.d.ts +6 -0
- package/dist/server/plugins/entitlements/utils/get-billed-catalog-build-pages-count.js +1 -0
- package/dist/server/plugins/graphql-docs/index.js +1 -1
- package/dist/server/plugins/markdown/search/get-search-documents.d.ts +1 -1
- package/dist/server/plugins/markdown/search/get-search-documents.js +2 -2
- package/dist/server/plugins/markdown/search/nodes/heading-node.js +1 -1
- package/dist/server/plugins/markdown/search/nodes/section-node.d.ts +2 -2
- package/dist/server/plugins/markdown/search/nodes/section-node.js +1 -1
- package/dist/server/plugins/markdown/search/walk-sections.js +1 -1
- package/dist/server/plugins/openapi-docs/search/get-ai-search-documents.js +25 -25
- package/dist/server/plugins/openapi-docs/search-indexer.js +1 -1
- package/dist/server/plugins/pages/validators/validate-react-pages.js +1 -1
- package/dist/server/plugins/scorecard-classic/compute-scorecard.js +4 -4
- package/dist/server/plugins/sidebars/index.d.ts +1 -2
- package/dist/server/plugins/sidebars/index.js +2 -2
- package/dist/server/providers/database/pagination/after-and-before.js +1 -1
- package/dist/server/providers/database/pagination/utils/create-cursor.d.ts +7 -1
- package/dist/server/providers/database/pagination/utils/create-cursor.js +1 -1
- package/dist/server/ssr/template.js +3 -3
- package/dist/server/tools/notifiers/formatter.js +3 -3
- package/dist/server/tools/notifiers/helpers/colors.js +1 -1
- package/dist/server/tools/notifiers/logger.d.ts +2 -2
- package/dist/server/tools/notifiers/logger.js +2 -2
- package/dist/server/tools/notifiers/terminal-manager.d.ts +1 -1
- package/dist/server/tools/notifiers/terminal-manager.js +4 -4
- package/dist/server/web-server/routes/catalog/catalog.js +1 -1
- package/dist/server/web-server/routes/catalog/helpers/upsert-pages-stats.d.ts +12 -0
- package/dist/server/web-server/routes/catalog/helpers/upsert-pages-stats.js +1 -0
- package/dist/server/web-server/routes/cors-proxy.js +2 -2
- package/dist/server/web-server/utils/prepare-list-response.js +1 -1
- package/package.json +13 -13
- package/dist/cli/stats/collectors/openapi.js +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,189 @@
|
|
|
1
1
|
# @redocly/redoc
|
|
2
2
|
|
|
3
|
+
## 0.132.0-next.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- ce5a165177d: Added support for `or` functions in RBAC conditions within Markdoc content.
|
|
8
|
+
|
|
9
|
+
### Patch Changes
|
|
10
|
+
|
|
11
|
+
- ce5a165177d: Fixed a bug where Markdoc content wrapped in an RBAC condition did not appear in search results for users with access.
|
|
12
|
+
- b3e65a364b6: Fixed out-of-memory error in the search indexer that occurred when indexing deeply nested schemas.
|
|
13
|
+
- f90fa0dd771: Enter prerelease mode.
|
|
14
|
+
- Updated dependencies [f90fa0dd771]
|
|
15
|
+
- @redocly/portal-plugin-mock-server@0.17.0-next.0
|
|
16
|
+
- @redocly/realm-asyncapi-sdk@0.10.0-next.0
|
|
17
|
+
- @redocly/portal-legacy-ui@0.15.0-next.0
|
|
18
|
+
- @redocly/asyncapi-docs@1.9.0-next.0
|
|
19
|
+
- @redocly/graphql-docs@1.9.0-next.0
|
|
20
|
+
- @redocly/openapi-docs@3.20.0-next.0
|
|
21
|
+
- @redocly/theme@0.64.0-next.0
|
|
22
|
+
|
|
23
|
+
## 0.131.0
|
|
24
|
+
|
|
25
|
+
### Minor Changes
|
|
26
|
+
|
|
27
|
+
- d87ca0f750: Replaced the separate right-side development mode controls in Realm docs UI with a single bottom floating status bar to improve user experience.
|
|
28
|
+
- 447b0dc32a: Added support for the product filter on **Project Analytics** page.
|
|
29
|
+
- 1d7c82d350: Added support for `badges` option in `sidebars.yaml` to display visual indicators next to sidebar item labels.
|
|
30
|
+
- e7cc4036fc: Added support for OpenAPI 3.2 `tags` object.
|
|
31
|
+
- 4aa015b6ea: Added support for OpenAPI 3.2 `querystring` parameters to handle structured query parameters with nested objects and arrays.
|
|
32
|
+
- 8a6153095f: Added an internal `/_api/cors` proxy endpoint in Realm and configured embedded Replay to use it by default.
|
|
33
|
+
- 10585dd0d0: Added support for the `nodeType` field in the OpenAPI 3.2 XML Object.
|
|
34
|
+
- 703634d21f: Enabled semantic search for Docs MCP.
|
|
35
|
+
- c2b1717b2b: Added stricter validation to feedback forms.
|
|
36
|
+
- 34ef22b17c: Added `code-snippet` Markdoc tag support for `llms.txt`.
|
|
37
|
+
- e6944434c8: Added support for OpenAPI `allowReserved` query parameters in Replay.
|
|
38
|
+
|
|
39
|
+
### Patch Changes
|
|
40
|
+
|
|
41
|
+
- 7f8301f1ed: Fixed an issue where the **Connect to MCP** button ignored the configured prefix path.
|
|
42
|
+
- bfdf798d61: Fixed **View as Markdown** and **Copy for LLM** page actions incorrectly omitting schema properties that share a name with a property at a different nesting level.
|
|
43
|
+
- dc4442ab07: Fixed canonical URLs on versioned pages to use the default version.
|
|
44
|
+
- 43955ab32f: Improved the accessibility of OpenAPI and GraphQL docs.
|
|
45
|
+
- 5ef75a3b5d: Fixed an issue where the **Copy for LLM** and **View as Markdown** page actions ignored the respective path prefix for the root page.
|
|
46
|
+
- 8b42559201: Fixed an issue where sidebar groups were displayed even though they contained no valid items in the active version.
|
|
47
|
+
- eb7a37ae27: Fixed tooltip visibility in browsers without anchor positioning support.
|
|
48
|
+
- 466f4ca3ba: Fixed an issue where custom Markdoc heading IDs were not used in search results.
|
|
49
|
+
- 17aafeac4a: Fixed an issue in OpenAPI docs where example keys were used instead of summary text in example drop-downs.
|
|
50
|
+
- f7b6c52055: Improved appearance and deep linking for the `tabs` Markdoc tag.
|
|
51
|
+
- d0b99c0768: Fixed URL fragment duplication when opening docs for endpoints with path parameters (e.g. `/foo/{id}/bar`).
|
|
52
|
+
- 2d305eec36: Fixed the built-in CORS proxy failing with "fetch failed" for certain URLs.
|
|
53
|
+
Now the browser's `accept-encoding` header isn't forwarded and the error message surfaces the underlying cause.
|
|
54
|
+
- 1eb287db9f: Fixed code sample generation when path parameter examples contain integer values.
|
|
55
|
+
- 807547ecbd: Improved build memory usage for large projects.
|
|
56
|
+
- 7276b4e5d6: Fixed an issue in AI Search where clearing the product tag would still include the product in the search request.
|
|
57
|
+
- a9a1ee0fe1: Fixed an issue where page actions remained visible even though `search` was disabled.
|
|
58
|
+
- 9b9b43a1b4: Improved the accessibility of AsyncAPI docs.
|
|
59
|
+
- 1cc1909566: Fixed an issue where optional properties of API operations were inconsistently displayed between API docs and Replay.
|
|
60
|
+
The optional properties are now respect the configuration in `redocly.yaml`.
|
|
61
|
+
- 130c111688: Fixed security vulnerability `CVE-2026-26996` by upgrading `minimatch` to version `10.2.1`.
|
|
62
|
+
- 7e3400d4a8: Fixed page actions overlapping the navbar.
|
|
63
|
+
- d264713872: Fixed an issue where `rbac` configuration ignored versioned content folder paths with leading slashes.
|
|
64
|
+
- 721799cba5: Fixed padding in schema definition and MCP tool views.
|
|
65
|
+
- 721799cba5: Fixed an issue in OpenAPI docs where the schema description in the **Schema definition** section was duplicated.
|
|
66
|
+
- 32c0b1683b: Fixed an issue where schemas using `allOf` with a `$ref` had their own `title` overridden by the referenced schema's title.
|
|
67
|
+
- 9b35001fdd: Fixed an issue in OpenAPI docs where nested Markdoc partial tags prevented partial content from rendering.
|
|
68
|
+
- 652e464285: Fixed an issue where the root `.md` pages for OpenAPI and AsyncAPI files failed to generate when `requiresLogin` was set to `true` in `redocly.yaml`.
|
|
69
|
+
- 263c8021c3: Fixed an issue where the terminal output retained artifacts from previous commands.
|
|
70
|
+
- ce4a06bc15: Fixed a bug where Segment analytics ignored `trackPage=false` in configuration when a custom script was used to send page view events.
|
|
71
|
+
- 7abfb7ff61: Updated `@redocly/openapi-core` to version `2.20.5`.
|
|
72
|
+
- 2641586046: Fixed an issue in GraphQL docs where navigating to a referenced field resulted in a `404` error.
|
|
73
|
+
- adf0e98992: Fixed an issue where the expand dropdown buttons were displayed over open dropdown menus.
|
|
74
|
+
- b2504fea98: Fixed an issue where `sidebars.yaml` files in ignored folders weren't excluded from link checking.
|
|
75
|
+
- 2bb21c43ec: Fixed security vulnerability `CVE-2026-26278` by upgrading `fast-xml-parser` to version `5.3.6`.
|
|
76
|
+
- Updated dependencies [7f8301f1ed]
|
|
77
|
+
- Updated dependencies [3554f6b8da]
|
|
78
|
+
- Updated dependencies [43955ab32f]
|
|
79
|
+
- Updated dependencies [5ef75a3b5d]
|
|
80
|
+
- Updated dependencies [447b0dc32a]
|
|
81
|
+
- Updated dependencies [c2b1717b2b]
|
|
82
|
+
- Updated dependencies [eb7a37ae27]
|
|
83
|
+
- Updated dependencies [17aafeac4a]
|
|
84
|
+
- Updated dependencies [f7b6c52055]
|
|
85
|
+
- Updated dependencies [1eb287db9f]
|
|
86
|
+
- Updated dependencies [8a5957c080]
|
|
87
|
+
- Updated dependencies [e7cc4036fc]
|
|
88
|
+
- Updated dependencies [7276b4e5d6]
|
|
89
|
+
- Updated dependencies [cf845446a0]
|
|
90
|
+
- Updated dependencies [a9a1ee0fe1]
|
|
91
|
+
- Updated dependencies [2bb21c43ec]
|
|
92
|
+
- Updated dependencies [377e39138a]
|
|
93
|
+
- Updated dependencies [4aa015b6ea]
|
|
94
|
+
- Updated dependencies [9b9b43a1b4]
|
|
95
|
+
- Updated dependencies [1cc1909566]
|
|
96
|
+
- Updated dependencies [10585dd0d0]
|
|
97
|
+
- Updated dependencies [7e3400d4a8]
|
|
98
|
+
- Updated dependencies [aca4d30c49]
|
|
99
|
+
- Updated dependencies [34ef22b17c]
|
|
100
|
+
- Updated dependencies [e6944434c8]
|
|
101
|
+
- Updated dependencies [721799cba5]
|
|
102
|
+
- Updated dependencies [721799cba5]
|
|
103
|
+
- Updated dependencies [32c0b1683b]
|
|
104
|
+
- Updated dependencies [7abfb7ff61]
|
|
105
|
+
- Updated dependencies [2641586046]
|
|
106
|
+
- Updated dependencies [adf0e98992]
|
|
107
|
+
- Updated dependencies [1b2efd5ab7]
|
|
108
|
+
- Updated dependencies [2bb21c43ec]
|
|
109
|
+
- @redocly/theme@0.63.0
|
|
110
|
+
- @redocly/realm-asyncapi-sdk@0.9.0
|
|
111
|
+
- @redocly/asyncapi-docs@1.8.0
|
|
112
|
+
- @redocly/graphql-docs@1.8.0
|
|
113
|
+
- @redocly/openapi-docs@3.19.0
|
|
114
|
+
- @redocly/portal-plugin-mock-server@0.16.0
|
|
115
|
+
- @redocly/portal-legacy-ui@0.14.0
|
|
116
|
+
|
|
117
|
+
## 0.131.0-next.14
|
|
118
|
+
|
|
119
|
+
### Patch Changes
|
|
120
|
+
|
|
121
|
+
- 2d305eec36a: Fixed the built-in CORS proxy failing with "fetch failed" for certain URLs.
|
|
122
|
+
Now the browser's `accept-encoding` header isn't forwarded and the error message surfaces the underlying cause.
|
|
123
|
+
|
|
124
|
+
## 0.131.0-next.13
|
|
125
|
+
|
|
126
|
+
### Patch Changes
|
|
127
|
+
|
|
128
|
+
- 466f4ca3ba3: Fixed an issue where custom Markdoc heading IDs were not used in search results.
|
|
129
|
+
- f7b6c520559: Improved appearance and deep linking for the `tabs` Markdoc tag.
|
|
130
|
+
- 0140f0ba709: Fixed an issue where React page validation failed silently, causing error reporting to be skipped during builds.
|
|
131
|
+
- 7abfb7ff617: Updated `@redocly/openapi-core` to version `2.20.5`.
|
|
132
|
+
- 8983e235fd1: Updated `openapi-sampler` from version 1.7.0 to 1.7.2.
|
|
133
|
+
- Updated dependencies [3554f6b8da8]
|
|
134
|
+
- Updated dependencies [f7b6c520559]
|
|
135
|
+
- Updated dependencies [cf845446a06]
|
|
136
|
+
- Updated dependencies [7abfb7ff617]
|
|
137
|
+
- Updated dependencies [8983e235fd1]
|
|
138
|
+
- @redocly/realm-asyncapi-sdk@0.9.0-next.5
|
|
139
|
+
- @redocly/theme@0.63.0-next.6
|
|
140
|
+
- @redocly/openapi-docs@3.19.0-next.9
|
|
141
|
+
- @redocly/asyncapi-docs@1.8.0-next.9
|
|
142
|
+
- @redocly/graphql-docs@1.8.0-next.7
|
|
143
|
+
- @redocly/portal-plugin-mock-server@0.16.0-next.9
|
|
144
|
+
|
|
145
|
+
## 0.131.0-next.12
|
|
146
|
+
|
|
147
|
+
### Patch Changes
|
|
148
|
+
|
|
149
|
+
- 43955ab32fd: Improved the accessibility of OpenAPI and GraphQL docs.
|
|
150
|
+
- 7276b4e5d63: Fixed an issue in AI Search where clearing the product tag would still include the product in the search request.
|
|
151
|
+
- 1cc1909566f: Fixed an issue where optional properties of API operations were inconsistently displayed between API docs and Replay.
|
|
152
|
+
The optional properties are now displayed or hidden according to configuration in `redocly.yaml`.
|
|
153
|
+
- d59b5669cea: Updated `@redocly/openapi-core` to version `2.20.4`.
|
|
154
|
+
- Updated dependencies [43955ab32fd]
|
|
155
|
+
- Updated dependencies [7276b4e5d63]
|
|
156
|
+
- Updated dependencies [1cc1909566f]
|
|
157
|
+
- Updated dependencies [d59b5669cea]
|
|
158
|
+
- @redocly/asyncapi-docs@1.8.0-next.8
|
|
159
|
+
- @redocly/graphql-docs@1.8.0-next.6
|
|
160
|
+
- @redocly/openapi-docs@3.19.0-next.8
|
|
161
|
+
- @redocly/theme@0.63.0-next.5
|
|
162
|
+
- @redocly/portal-plugin-mock-server@0.16.0-next.8
|
|
163
|
+
|
|
164
|
+
## 0.131.0-next.11
|
|
165
|
+
|
|
166
|
+
### Patch Changes
|
|
167
|
+
|
|
168
|
+
- dc4442ab07: Fixed canonical URLs on versioned pages to use the default version.
|
|
169
|
+
- b2504fea98: Fixed an issue where `sidebars.yaml` files in folders added to `ignore` configuration weren't excluded from link checking.
|
|
170
|
+
- Updated dependencies [8a5957c080]
|
|
171
|
+
- @redocly/realm-asyncapi-sdk@0.9.0-next.4
|
|
172
|
+
- @redocly/theme@0.63.0-next.4
|
|
173
|
+
|
|
174
|
+
## 0.131.0-next.10
|
|
175
|
+
|
|
176
|
+
### Patch Changes
|
|
177
|
+
|
|
178
|
+
- d59d3fce3d: Updated `@redocly/openapi-core` to version `2.20.3`.
|
|
179
|
+
- 1eb287db9f: Fixed code sample generation when path parameter examples contain integer values.
|
|
180
|
+
- 652e464285: Fixed an issue where the root `.md` pages for OpenAPI/AsyncAPI files failed to generate when `requiresLogin` was set to `true` in `redocly.yaml`.
|
|
181
|
+
- Updated dependencies [d59d3fce3d]
|
|
182
|
+
- Updated dependencies [1eb287db9f]
|
|
183
|
+
- @redocly/openapi-docs@3.19.0-next.7
|
|
184
|
+
- @redocly/asyncapi-docs@1.8.0-next.7
|
|
185
|
+
- @redocly/portal-plugin-mock-server@0.16.0-next.7
|
|
186
|
+
|
|
3
187
|
## 0.131.0-next.9
|
|
4
188
|
|
|
5
189
|
### Minor Changes
|
|
@@ -115,7 +299,7 @@
|
|
|
115
299
|
|
|
116
300
|
### Minor Changes
|
|
117
301
|
|
|
118
|
-
- d87ca0f750:
|
|
302
|
+
- d87ca0f750: Replaced the separate right-side development mode controls in Realm docs UI with a single bottom floating status bar to improve user experience.
|
|
119
303
|
- e7cc4036fc: Added support for OpenAPI 3.2 `tags` object.
|
|
120
304
|
- 4aa015b6ea: Added support for OpenAPI 3.2 `querystring` parameters to handle structured query parameters with nested objects and arrays.
|
|
121
305
|
- 10585dd0d0: Added support for the `nodeType` field in the OpenAPI 3.2 XML Object.
|
package/dist/bin.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import"./server/utils/set-execution-mode.js";import"./cli/utils/node-version-check.js";import o from"mri";import*as r from"node:path";import{tmpdir as
|
|
2
|
+
import"./server/utils/set-execution-mode.js";import"./cli/utils/node-version-check.js";import o from"mri";import*as r from"node:path";import{tmpdir as T}from"node:os";import*as u from"node:fs";import"./server/node-fetch-polyfill.js";import{cliCommandNames as C}from"./constants/common.js";import{initPlugins as S}from"./server/plugins/lifecycle.js";import{loadEnvVariables as k}from"./server/utils/envs/load-env-variables.js";import{PORTAL_VERSION as I}from"./server/version.js";import{logger as i}from"./server/tools/notifiers/logger.js";import{reporter as t}from"./server/tools/notifiers/reporter.js";import{sha as V}from"./server/utils/crypto/sha.js";import{envConfig as L}from"./server/config/env-config.js";import{PACKAGE_NAME as w}from"./config/product-gates.js";import{develop as R}from"./cli/develop.js";import{eject as _}from"./cli/eject/index.js";import{beforeCommand as E}from"./server/utils/lifecycle-hooks.js";import{Store as j}from"./server/store.js";import{build as M}from"./cli/build/index.js";import{fromCurrentDir as N}from"./server/utils/paths.js";import{translationsCliOpts as F}from"./cli/translations/options.js";import{generateTranslations as U}from"./cli/translations/index.js";import{EntitlementsProvider as $}from"./server/entitlements/entitlements-provider.js";import{isValidPlan as B}from"./server/entitlements/is-valid-plan.js";import{stopAllCompilers as G}from"./server/esbuild/esbuild.js";import{copyLibsqlPrebuiltBinary as q}from"./cli/build/libsql/copy-prebuilt-binary.js";import{telemetry as f}from"./cli/telemetry/index.js";import{stats as K}from"./cli/stats/index.js";import{statsCliOpts as Y}from"./cli/stats/options.js";const c=process.argv[2];let a;const v={alias:{d:"project-dir",p:"port"},default:{"project-dir":L.REDOCLY_CONTENT_DIR||process.cwd(),outdir:"public"}},z={alias:v.alias,default:{...v.default,plan:"enterprise"}},H={alias:{d:"buildDir"},default:{buildDir:"public"}},J={boolean:["force"],alias:{f:"force",d:"project-dir"},default:{"project-dir":process.cwd()}};process.on("uncaughtException",async function(e){e?.code==="ERR_INVALID_STATE"?console.log("Ignore premature close error"):(i.error("Uncaught exception occurred. Stopping compilers."),await G(),i.error("Exiting due to uncaught exception"),await t.panic(e))});try{c||await t.panicOnContentError("Command not specified.");const e=$.instance();switch(["build","prepare","serve","stats"].includes(c)&&await e.init(),["eject","translate"].includes(c)&&await e.init({developModePlan:"enterprise"}),c){case"develop":case"preview":const s=o(process.argv.slice(3),z),O=r.resolve(s["project-dir"]),h=encodeURIComponent(V(O)),p=r.join(T(),"redocly-public-"+h);u.existsSync(p)&&(i.verbose("Cleaning temporary output directory..."),u.rmSync(p,{recursive:!0,force:!0}),i.verbose("Temporary output directory cleaned."));const m=s.plan.toLowerCase();B(m)||await t.panicOnContentError(`Invalid --plan argument value '${m}'.`),await e.init({developModePlan:m}),a=new j({contentDir:r.resolve(s["project-dir"]),outdir:p,serverOutDir:N(import.meta.url,"./server/esbuild/cache/server")}),await E(C.DEVELOP,s,a),await R(s,a);break;case"build":case"prepare":const n=o(process.argv.slice(3),v),g=r.resolve(r.join(n.outdir,"server"));a=new j({contentDir:r.resolve(n["project-dir"]),outdir:r.resolve(n.outdir,"client"),serverOutDir:g}),await E(C.BUILD,n,a),q(g),await M(n,a);break;case"serve":await k();const A=o(process.argv.slice(3),H),D=r.resolve(A.buildDir);f.sendServeCliCommandExecutedMessage();const b=r.join(D,"server","index.mjs");u.existsSync(b)||await t.panic(`Server not found. Please run \`${w} build\` first (or \`${w} prepare\` for the deprecated command)`),import(b).catch(async l=>{await t.panic("Failed to load server",l)});break;case"eject":e.canAccessFeature("themeEjecting")||await t.panicOnContentError('The "eject" command is not available for this project');const d=o(process.argv.slice(3),J),{lifecycleContext:{getConfig:y,fs:P}}=await S({outdir:"",contentDir:r.resolve(d["project-dir"]),setGlobalConfig:()=>null});P.dispose(),f.sendCliCommandEjectExecutedMessage([{object:"cli_command",arguments:d}]),await _({...d,config:await y()}),i.clearAllTimeouts();break;case"translate":if(e.canAccessFeature("l10n")){const l=o(process.argv.slice(3),F);f.sendCliCommandTranslateExecutedMessage({arguments:l}),await U(l)}else await t.panicOnContentError('The "translate" command is not available for this project');break;case"stats":const x=o(process.argv.slice(3),Y);await K(x);break;case"--version":console.log(I);break;default:await t.panicOnContentError(`Unknown command "${c}"`)}}catch(e){i.error("Exiting due to uncaught exception"),await t.panic(e)}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import type { LifecycleContext } from '
|
|
1
|
+
import type { LifecycleContext } from '../../../../server/types';
|
|
2
2
|
export declare function collectOpenapiDocumentsStatistics(lifecycleContext: LifecycleContext, telemetryEnabled: boolean): Promise<void>;
|
|
3
|
-
//# sourceMappingURL=
|
|
3
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{detectSpec as u,getTypes as d,normalizeTypes as w,normalizeVisitors as h,resolveDocument as S,BaseResolver as g,StatsOAS as y,walkDocument as D}from"@redocly/openapi-core";import{logger as m}from"../../../../server/tools/notifiers/logger.js";import{envConfig as I}from"../../../../server/config/env-config.js";import{telemetryTraceStep as O}from"../../../telemetry/helpers/trace-step.js";import{telemetry as v}from"../../../telemetry/index.js";import{computeOas32Stats as b}from"./oas32.js";const t={refs:{metric:"References",total:0,color:"red",items:new Set},externalDocs:{metric:"External Documents",total:0,color:"magenta"},schemas:{metric:"Schemas",total:0,color:"white"},parameters:{metric:"Parameters",total:0,color:"yellow",items:new Set},links:{metric:"Links",total:0,color:"cyan",items:new Set},pathItems:{metric:"Path Items",total:0,color:"green"},webhooks:{metric:"Webhooks",total:0,color:"green"},operations:{metric:"Operations",total:0,color:"yellow"},tags:{metric:"Tags",total:0,color:"white",items:new Set}};async function _(a,o){await O("stats.openapi",async()=>{m.info("OpenAPI collector: start processing documents...");const e=(await a.cache.load(".","load-oas-docs")).data,s=[];for(const r of e)if(!r.isVirtual){const n=await k(r);s.push(n),v.sendStatsOpenapiCollectedMessage([{...n,projectBuildId:I.PROJECT_BUILD_ID||""}])}o||console.table(s),m.info("OpenAPI collector: openapi documents processing completed.")})}async function k(a){const o=a.definition,e=u(o),s=w(d(e)),r=h([{severity:"warn",ruleId:"openapi_stats",visitor:y(t)}],s),n={problems:[],specVersion:e,visitorsData:{}},c={source:{absoluteRef:""},parsed:o},i=s.Root;if(!i)throw new Error("Root type not found in OpenAPI spec types");const f=await S({rootDocument:c,rootType:i,externalRefResolver:new g});D({rootType:i,normalizedVisitors:r,resolvedRefMap:f,document:c,ctx:n});const l={path:a.relativePath,refs:t.refs.total,externalDocs:t.externalDocs.total,schemas:t.schemas.total,parameters:t.parameters.total,links:t.links.total,pathItems:t.pathItems.total,webhooks:t.webhooks.total,operations:t.operations.total,tags:t.tags.total,version:e};if(e==="oas3_2"){const p=b(o);p&&Object.assign(l,p)}return l}export{_ as collectOpenapiDocumentsStatistics};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export type OpenapiStatsOas32 = {
|
|
2
|
+
streamingOperations: number;
|
|
3
|
+
itemSchemaMediaTypes: number;
|
|
4
|
+
additionalOperations: number;
|
|
5
|
+
serversWithName: number;
|
|
6
|
+
discriminatorSchemas: number;
|
|
7
|
+
queryMethodOperations: number;
|
|
8
|
+
parametersWithQueryString: number;
|
|
9
|
+
oauth2WithMetadataUrl: number;
|
|
10
|
+
oauth2DeviceAuthorization: number;
|
|
11
|
+
componentMediaTypes: number;
|
|
12
|
+
xmlNodeTypeUsage: number;
|
|
13
|
+
};
|
|
14
|
+
export declare function computeOas32Stats(doc: unknown): OpenapiStatsOas32 | null;
|
|
15
|
+
//# sourceMappingURL=oas32.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const q=new Set(["text/event-stream","application/jsonl","application/json-seq","multipart/mixed"]);function i(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function c(e,t){const s=e[t];return i(s)?s:void 0}function l(e,t){const s=e[t];return Array.isArray(s)?s:[]}function b(e,t){let s=0;for(const a of Object.keys(e))t.has(a)&&s++;return s}function O(e){let t=0;for(const s of Object.values(e))i(s)&&s.itemSchema!=null&&t++;return t}function S(e){return b(e,q)}function d(e){return e.filter(t=>i(t)?t.in==="querystring":!1).length}function g(e,t){const s=e.responses;if(i(s))for(const o of Object.values(s))i(o)&&i(o.content)&&(t.streaming+=S(o.content),t.itemSchema+=O(o.content));const a=c(e,"requestBody");if(a){const o=c(a,"content");o&&(t.streaming+=S(o),t.itemSchema+=O(o))}const m=l(e,"parameters");t.queryStringParams+=d(m)}function v(e,t){const s=l(e,"parameters");t.queryStringParams+=d(s);const a=["get","put","post","delete","patch","head","options","trace","query"];for(const o of a){const n=e[o];i(n)&&(o==="query"&&t.queryMethod++,g(n,t))}const m=c(e,"additionalOperations");if(m){t.additionalOps+=Object.keys(m).length;for(const o of Object.values(m))i(o)&&g(o,t)}}function f(e,t){e.discriminator!=null&&t.discriminator++,c(e,"xml")?.nodeType!=null&&t.xmlNodeType++;const a=e.items;i(a)&&f(a,t);for(const o of["properties","patternProperties"]){const n=e[o];if(i(n))for(const r of Object.values(n))i(r)&&f(r,t)}const m=e.additionalProperties;i(m)&&f(m,t);for(const o of["oneOf","anyOf","allOf","prefixItems"]){const n=e[o];if(Array.isArray(n))for(const r of n)i(r)&&f(r,t)}}function T(e){if(!i(e))return null;const t={streamingOperations:0,itemSchemaMediaTypes:0,additionalOperations:0,serversWithName:0,discriminatorSchemas:0,queryMethodOperations:0,parametersWithQueryString:0,oauth2WithMetadataUrl:0,oauth2DeviceAuthorization:0,componentMediaTypes:0,xmlNodeTypeUsage:0},s=l(e,"servers");for(const n of s)i(n)&&n.name!=null&&t.serversWithName++;const a=c(e,"paths");if(a){const n={streaming:0,additionalOps:0,queryMethod:0,queryStringParams:0,itemSchema:0};for(const r of Object.values(a))i(r)&&v(r,n);t.streamingOperations=n.streaming,t.additionalOperations=n.additionalOps,t.queryMethodOperations=n.queryMethod,t.parametersWithQueryString=n.queryStringParams,t.itemSchemaMediaTypes=n.itemSchema}const m=c(e,"webhooks");if(m){const n={streaming:0,additionalOps:0,queryMethod:0,queryStringParams:0,itemSchema:0};for(const r of Object.values(m))i(r)&&v(r,n);t.streamingOperations+=n.streaming,t.additionalOperations+=n.additionalOps,t.queryMethodOperations+=n.queryMethod,t.parametersWithQueryString+=n.queryStringParams,t.itemSchemaMediaTypes+=n.itemSchema}const o=c(e,"components");if(o){const n=c(o,"mediaTypes");if(n){t.componentMediaTypes=Object.keys(n).length;for(const u of Object.values(n))i(u)&&u.itemSchema!=null&&t.itemSchemaMediaTypes++}const r=c(o,"schemas");if(r){const u={discriminator:0,xmlNodeType:0};for(const p of Object.values(r))i(p)&&f(p,u);t.discriminatorSchemas=u.discriminator,t.xmlNodeTypeUsage=u.xmlNodeType}const h=c(o,"securitySchemes");if(h)for(const u of Object.values(h))i(u)&&u.type==="oauth2"&&(u.oauth2MetadataUrl!=null&&t.oauth2WithMetadataUrl++,c(u,"flows")?.deviceAuthorization!=null&&t.oauth2DeviceAuthorization++);const y=c(o,"parameters");y&&(t.parametersWithQueryString+=d(Object.values(y)))}return t}export{T as computeOas32Stats};
|
package/dist/cli/stats/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{initPlugins as n}from"../../server/plugins/lifecycle.js";import{configParserPlugin as a}from"../../server/plugins/config-parser/index.js";import{openAPIDocsPlugin as c}from"../../server/plugins/openapi-docs/index.js";import{shutdowner as s}from"../../server/tools/shutdowner.js";import{PORTAL_VERSION as p}from"../../server/version.js";import{collectOpenapiDocumentsStatistics as l}from"./collectors/openapi.js";import{telemetry as f}from"../telemetry/index.js";import{telemetryTraceStep as y}from"../telemetry/helpers/trace-step.js";async function I(e){const{"project-dir":o,telemetry:t,verbose:i}=e;f.initialize(p,t,i),await y("stats",async()=>{const r=[a,c],{lifecycleContext:m}=await n({contentDir:o},r);await l(m,t)}),await s.exitWithCode(0)}export{I as stats};
|
|
1
|
+
import{initPlugins as n}from"../../server/plugins/lifecycle.js";import{configParserPlugin as a}from"../../server/plugins/config-parser/index.js";import{openAPIDocsPlugin as c}from"../../server/plugins/openapi-docs/index.js";import{shutdowner as s}from"../../server/tools/shutdowner.js";import{PORTAL_VERSION as p}from"../../server/version.js";import{collectOpenapiDocumentsStatistics as l}from"./collectors/openapi/index.js";import{telemetry as f}from"../telemetry/index.js";import{telemetryTraceStep as y}from"../telemetry/helpers/trace-step.js";async function I(e){const{"project-dir":o,telemetry:t,verbose:i}=e;f.initialize(p,t,i),await y("stats",async()=>{const r=[a,c],{lifecycleContext:m}=await n({contentDir:o},r);await l(m,t)}),await s.exitWithCode(0)}export{I as stats};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { SortOption } from '@redocly/theme/core/types';
|
|
2
|
-
export declare function useCatalogSort(): {
|
|
2
|
+
export declare function useCatalogSort(defaultSortOption?: SortOption | null): {
|
|
3
3
|
sortOption: SortOption | null;
|
|
4
4
|
setSortOption: import("react").Dispatch<import("react").SetStateAction<SortOption | null>>;
|
|
5
5
|
handleSortClick: (sortKey: string, direction: "asc" | "desc") => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{useCallback as c,useEffect as
|
|
1
|
+
import{useCallback as c,useEffect as m,useState as p}from"react";import{useSearchParams as f}from"react-router-dom";function O(l){const[s,a]=f(),u=s.get("sort")||null,[e,r]=p(u??l??null);m(()=>{const t=new URLSearchParams(s);e?t.set("sort",e):t.delete("sort"),a(t,{replace:!0})},[e,s,a]);const i=c((t,n)=>{const o=n==="desc"?t:`-${t}`;r(e===o?null:o)},[e,r]),S=c((t,n)=>{if(!t||!e)return!1;const o=n==="desc"?t:`-${t}`;return e===o},[e]);return{sortOption:e,setSortOption:r,handleSortClick:i,isColumnSorted:S}}export{O as useCatalogSort};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{useInfiniteQuery as y}from"@tanstack/react-query";import{useMemo as m,useRef as w}from"react";import{withPathPrefix as R}from"@redocly/theme/core/utils";import{getNextPageParam as S}from"../../../utils/catalog/get-next-page-param";import{useSearchTracker as F}from"./useSearchTracker";function x({limit:o=20,filter:i,sort:s="type",search:n}={},r){const
|
|
1
|
+
import{useInfiniteQuery as y}from"@tanstack/react-query";import{useMemo as m,useRef as w}from"react";import{withPathPrefix as R}from"@redocly/theme/core/utils";import{getNextPageParam as S}from"../../../utils/catalog/get-next-page-param";import{useSearchTracker as F}from"./useSearchTracker";function x({limit:o=20,filter:i,sort:s="type,title",search:n}={},r){const l=r?r.items.map(e=>e.key).join("-"):[],c=w(!0),d=c.current&&r;c.current&&(c.current=!1);const a=y({queryFn:async e=>{const t=new URLSearchParams;i&&t.append("filter",i),s&&t.append("sort",s),o&&t.append("limit",o.toString()),n&&t.append("search",n),e.pageParam&&Object.entries(e.pageParam).forEach(([P,f])=>{f!=null&&t.append(P,f.toString())});const p=new URL(R("/bff/catalog-entities"),window.location.origin);p.search=t.toString();const u=await fetch(p.toString());if(!u.ok)throw new Error(`Failed to fetch catalog entities from ${p.pathname}`);return u.json()},queryKey:["bff/catalog-entities",{limit:o,filter:i,sort:s,search:n,initialDataKeys:l}],initialData:d?{pages:[r],pageParams:[null]}:void 0,initialPageParam:null,getNextPageParam:S,refetchOnMount:!0,placeholderData:e=>e}),h=m(()=>{const e=a.data?.pages||[];return e[e.length-1]?.page.total},[a.data?.pages]),g=m(()=>(a.data?.pages||[]).flatMap(e=>e.items||[]),[a.data?.pages]);return F({isLoading:a.isLoading||a.isFetching,items:g,apiResource:"entities",searchQuery:n??""}),{query:a,items:g,total:h}}export{x as useFetchCatalogEntities};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{useState as n,useEffect as s}from"react";const e=()=>{const[o,t]=n(!1);return s(()=>{t(p())},[]),{isSupported:o}};function p(){return typeof CSS>"u"||typeof CSS.supports!="function"?!1:CSS.supports("anchor-name: --a")&&CSS.supports("position-anchor: --a")&&CSS.supports("top: anchor(top)")}export{e as useAnchorPositioning};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import
|
|
1
|
+
import e from"i18next";import{useEffect as a}from"react";import{DEFAULT_LOCALE_PLACEHOLDER as s}from"../../../constants/common";import{defaultTranslationImports as l}from"../../../constants/l10n/default-translations";import{useL10nConfig as i}from"../hooks";const p=()=>{const{currentLocale:t}=i();a(()=>{const o=!t||t===s?"en":t;document.documentElement.setAttribute("lang",o)},[t])},g=async t=>{if(!t)return;const o=new Set(e.languages);for(const n of Object.keys(t.translations)){const r=await l[n]?.()||{};e.addResourceBundle(n,"translation",{...r,...t.translations[n]?.translation??{}},!0,!0),o.delete(n)}for(const n of o)e.removeResourceBundle(n,"translation")};export{g as updateTranslations,p as useL10n};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{useCallback as E,useEffect as
|
|
1
|
+
import{useCallback as E,useEffect as Q,useMemo as J,useRef as m,useState as b}from"react";import{AiSearchError as d}from"@redocly/theme/core/constants";import{withPathPrefix as N,splitContentByToolCalls as V}from"@redocly/theme/core/utils";import{ServerRoutes as j}from"../../../constants/common";import{useSearchSession as B}from"@redocly/theme/core/contexts";import{AI_SEARCH_REQUEST_HEADERS as D,HTTP_ERROR_MAP as G}from"../../constants";import{useI18nConfig as K,usePageVersions as L}from"../hooks";import{telemetry as U}from"../telemetry/index.js";import{streamSSEMessages as z}from"./sse-parser";import{handleSSEMessage as W}from"./message-handlers";function or(n){const{searchSessionId:p}=B(),[r,s]=b({status:"idle"}),[_,g]=b([]),[S,y]=b([]),t=m(null),c=m(""),o=m(""),a=m([]),{currentLocale:C}=K(),{versions:w=[]}=L()||{},l=w.find(e=>e?.active),f=E(()=>{s({status:"idle",response:""}),y([]),c.current="",o.current="",a.current=[]},[]),M=E(()=>{t.current?.abort(),t.current=null,f(),g([])},[f]);Q(()=>()=>{t.current?.abort()},[]);const O=E(async(e,q)=>{if(!e)return;t.current?.abort();const h=new AbortController;t.current=h,f(),s({status:"loading",question:e,response:"",resources:[]});try{const u=await fetch(N(j.ASK_AI),{method:"POST",headers:D,body:JSON.stringify({text:e,history:q||[],locale:C,product:n?.product,filter:n?.filter,version:l&&{folder:l.folderId,label:l.label},searchSessionId:p}),signal:h.signal});if(!u.ok){s({status:"error",question:e,error:G[u.status]??d.HttpRequestFailed});return}const A=u.body;if(!A){s({status:"error",question:e,error:d.HttpRequestFailed});return}let I=!1;for await(const i of z(A,h.signal)){const F={messageId:c.current,resources:a.current,accumulatedResponse:o.current,setConversation:g,setState:s,setToolCalls:y},{messageId:v,resources:H,accumulatedResponse:P}=W(i,F);v&&(c.current=v),H&&(a.current=H),P&&(o.current=P),i.type==="error"&&(I=!0)}t.current=null,s(i=>i.status==="error"?i:o.current?{status:"success",question:e,response:o.current,resources:a.current}:{status:"error",question:e,error:d.EmptyResponse}),!I&&o.current&&e.trim()&&c.current&&U.sendSearchAIQueryMessage([{object:"search",question:e,answer:o.current,resources:JSON.stringify(a.current),searchSessionId:p,messageId:c.current,...n?.product&&{product:n.product}}])}catch(u){if(u instanceof Error&&u.name==="AbortError")return;t.current=null,s({status:"error",question:e,error:d.HttpRequestFailed})}},[f,n?.product,C,n?.filter,l,p]),R=r.status==="loading"||r.status==="success"||r.status==="idle"?r.response:void 0,k=J(()=>V(R,S),[R,S]);return{askQuestion:O,isGeneratingResponse:r.status==="loading",response:R,resources:r.status==="loading"||r.status==="success"?r.resources:[],question:r.status!=="idle"?r.question:"",error:r.status==="error"?r.error:null,clearConversation:M,conversation:_,setConversation:g,toolCalls:S,contentSegments:k}}export{or as useAiSearch};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import e from"react";import{Helmet as
|
|
1
|
+
import e from"react";import{Helmet as c}from"@dr.pogodin/react-helmet";import{combineUrls as u}from"@redocly/theme/core/utils";import{isTruthy as f}from"../../../utils/guards/is-truthy";import{usePageVersions as p}from"../../providers/page-data/hooks";import{getMetaTagsAttributes as g}from"../utils/get-meta-tags-attributes";function b(r){const{seo:t,slug:i}=r,{versions:l}=p();if(!t)return null;const o=g(t),s=[t.title,t.projectTitle].filter(f).join(" | "),a=l.find(n=>n.default)?.link||i;return e.createElement(c,null,e.createElement("title",null,s),t.siteUrl?e.createElement("link",{rel:"canonical",href:u(t.siteUrl,a)}):null,t.jsonLd?e.createElement("script",{type:"application/ld+json"},JSON.stringify(t.jsonLd)):null,o.map((n,m)=>e.createElement("meta",{key:m,...n})))}export{b as SeoTags};
|
|
@@ -2,9 +2,7 @@ import l from"styled-components";import*as o from"react";import{RedoclyAsyncAPID
|
|
|
2
2
|
a[id],
|
|
3
3
|
a[data-section-id],
|
|
4
4
|
div[data-section-id] {
|
|
5
|
-
scroll-margin-top: calc(
|
|
6
|
-
var(--navbar-height) + var(--banner-height) + var(--panel-gap-vertical)
|
|
7
|
-
);
|
|
5
|
+
scroll-margin-top: calc(var(--navbar-height) + var(--banner-height) + var(--panel-gap-vertical));
|
|
8
6
|
}
|
|
9
7
|
|
|
10
8
|
--sidebar-width: 0px;
|
|
@@ -4,14 +4,10 @@ import*as a from"react";import i from"styled-components";import{RedoclyOpenAPIDo
|
|
|
4
4
|
}
|
|
5
5
|
`,g=i.div`
|
|
6
6
|
div[id] {
|
|
7
|
-
scroll-margin-top: calc(
|
|
8
|
-
var(--navbar-height) + var(--banner-height) - var(--panel-gap-vertical)
|
|
9
|
-
);
|
|
7
|
+
scroll-margin-top: calc(var(--navbar-height) + var(--banner-height) - var(--panel-gap-vertical));
|
|
10
8
|
}
|
|
11
9
|
a[id] {
|
|
12
|
-
scroll-margin-top: calc(
|
|
13
|
-
var(--navbar-height) + var(--banner-height) + var(--panel-gap-vertical)
|
|
14
|
-
);
|
|
10
|
+
scroll-margin-top: calc(var(--navbar-height) + var(--banner-height) + var(--panel-gap-vertical));
|
|
15
11
|
}
|
|
16
12
|
|
|
17
13
|
--sidebar-width: 0px;
|