@redocly/theme 0.58.0-next.9 → 0.59.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.
Files changed (84) hide show
  1. package/lib/components/Catalog/CatalogEntity/CatalogEntity.d.ts +5 -1
  2. package/lib/components/Catalog/CatalogEntity/CatalogEntity.js +4 -4
  3. package/lib/components/Catalog/CatalogEntity/CatalogEntityMetadata.js +3 -3
  4. package/lib/components/Catalog/CatalogEntity/CatalogEntityRelations/CatalogEntityApiDescriptionRelations.js +1 -1
  5. package/lib/components/Catalog/CatalogEntity/CatalogEntityRelations/CatalogEntityTeamRelations.js +1 -1
  6. package/lib/components/Catalog/CatalogEntity/CatalogEntitySchema.d.ts +5 -1
  7. package/lib/components/Catalog/CatalogEntity/CatalogEntitySchema.js +9 -7
  8. package/lib/components/CodeBlock/CodeBlock.d.ts +5 -12
  9. package/lib/components/CodeBlock/CodeBlockControls.d.ts +3 -3
  10. package/lib/components/CodeBlock/CodeBlockControls.js +1 -1
  11. package/lib/components/CodeBlock/CodeBlockDropdown.d.ts +2 -2
  12. package/lib/components/CodeBlock/CodeBlockDropdown.js +4 -13
  13. package/lib/components/CodeBlock/CodeBlockTabs.d.ts +2 -2
  14. package/lib/components/CodeBlock/CodeBlockTabs.js +4 -3
  15. package/lib/components/JsonViewer/JsonViewer.d.ts +1 -1
  16. package/lib/components/JsonViewer/JsonViewer.js +9 -10
  17. package/lib/components/PageActions/PageActions.d.ts +4 -1
  18. package/lib/components/PageActions/PageActions.js +2 -2
  19. package/lib/components/Panel/variables.js +1 -0
  20. package/lib/components/Tag/Tag.d.ts +3 -2
  21. package/lib/components/Tag/Tag.js +21 -5
  22. package/lib/components/Tag/variables.dark.js +135 -0
  23. package/lib/components/Tag/variables.js +120 -58
  24. package/lib/core/constants/catalog.js +4 -0
  25. package/lib/core/contexts/CodeSnippetContext.d.ts +14 -6
  26. package/lib/core/contexts/CodeSnippetContext.js +57 -14
  27. package/lib/core/hooks/use-codeblock-tabs-controls.d.ts +2 -2
  28. package/lib/core/hooks/use-local-state.js +22 -18
  29. package/lib/core/hooks/use-page-actions.d.ts +2 -1
  30. package/lib/core/hooks/use-page-actions.js +48 -6
  31. package/lib/core/hooks/use-tabs.d.ts +11 -6
  32. package/lib/core/hooks/use-tabs.js +117 -207
  33. package/lib/core/openapi/index.d.ts +1 -0
  34. package/lib/core/openapi/index.js +3 -1
  35. package/lib/core/types/l10n.d.ts +1 -1
  36. package/lib/core/types/open-api-server.d.ts +1 -0
  37. package/lib/core/utils/index.d.ts +1 -0
  38. package/lib/core/utils/index.js +1 -0
  39. package/lib/core/utils/tabs.d.ts +1 -0
  40. package/lib/core/utils/tabs.js +8 -0
  41. package/lib/icons/CursorIcon/CursorIcon.d.ts +9 -0
  42. package/lib/icons/CursorIcon/CursorIcon.js +22 -0
  43. package/lib/layouts/DocumentationLayout.js +1 -3
  44. package/lib/markdoc/components/CodeGroup/CodeGroup.js +49 -27
  45. package/lib/markdoc/components/Tabs/Tab.js +1 -1
  46. package/lib/markdoc/components/Tabs/TabList.d.ts +2 -14
  47. package/lib/markdoc/components/Tabs/TabList.js +65 -16
  48. package/lib/markdoc/components/Tabs/Tabs.d.ts +2 -2
  49. package/lib/markdoc/components/Tabs/Tabs.js +11 -87
  50. package/lib/markdoc/tags/tabs.js +5 -0
  51. package/package.json +4 -4
  52. package/src/components/Catalog/CatalogEntity/CatalogEntity.tsx +15 -2
  53. package/src/components/Catalog/CatalogEntity/CatalogEntityMetadata.tsx +3 -3
  54. package/src/components/Catalog/CatalogEntity/CatalogEntityRelations/CatalogEntityApiDescriptionRelations.tsx +1 -1
  55. package/src/components/Catalog/CatalogEntity/CatalogEntityRelations/CatalogEntityTeamRelations.tsx +1 -1
  56. package/src/components/Catalog/CatalogEntity/CatalogEntitySchema.tsx +27 -18
  57. package/src/components/CodeBlock/CodeBlock.tsx +5 -11
  58. package/src/components/CodeBlock/CodeBlockControls.tsx +4 -7
  59. package/src/components/CodeBlock/CodeBlockDropdown.tsx +11 -20
  60. package/src/components/CodeBlock/CodeBlockTabs.tsx +8 -8
  61. package/src/components/JsonViewer/JsonViewer.tsx +16 -9
  62. package/src/components/PageActions/PageActions.tsx +6 -4
  63. package/src/components/Panel/variables.ts +1 -0
  64. package/src/components/Tag/Tag.tsx +33 -8
  65. package/src/components/Tag/variables.dark.ts +135 -0
  66. package/src/components/Tag/variables.ts +120 -58
  67. package/src/core/constants/catalog.ts +4 -0
  68. package/src/core/contexts/CodeSnippetContext.tsx +54 -18
  69. package/src/core/hooks/use-codeblock-tabs-controls.ts +2 -2
  70. package/src/core/hooks/use-local-state.ts +28 -19
  71. package/src/core/hooks/use-page-actions.ts +63 -6
  72. package/src/core/hooks/use-tabs.ts +160 -238
  73. package/src/core/openapi/index.ts +1 -0
  74. package/src/core/types/l10n.ts +13 -0
  75. package/src/core/types/open-api-server.ts +1 -0
  76. package/src/core/utils/index.ts +1 -0
  77. package/src/core/utils/tabs.ts +4 -0
  78. package/src/icons/CursorIcon/CursorIcon.tsx +35 -0
  79. package/src/layouts/DocumentationLayout.tsx +3 -10
  80. package/src/markdoc/components/CodeGroup/CodeGroup.tsx +81 -52
  81. package/src/markdoc/components/Tabs/Tab.tsx +1 -0
  82. package/src/markdoc/components/Tabs/TabList.tsx +85 -30
  83. package/src/markdoc/components/Tabs/Tabs.tsx +12 -125
  84. package/src/markdoc/tags/tabs.ts +5 -0
@@ -11,12 +11,13 @@ exports.tag = (0, styled_components_1.css) `
11
11
  --tag-border-style: solid; //@presenter Border
12
12
  --tag-border-radius: var(--border-radius); // @presenter BorderRadius
13
13
  --tag-box-shadow: none; // @presenter Shadow
14
+ --tag-border-radius-focused: var(--border-radius); // @presenter BorderRadius
14
15
 
15
16
  --tag-status-dot-color-default: var(--color-persian-green-7);
16
17
  --tag-badge-size: var(--spacing-xs);
17
- --tag-badge-border-width: 1.5px;
18
- --tag-badge-border-color: #ffffff;
19
-
18
+ --tag-badge-border-width: 2px;
19
+ --tag-badge-border-color: var(--border-color-secondary); // @presenter Color
20
+ --tag-border-color-focused: var(--color-blue-4); // @presenter Color
20
21
 
21
22
  /**
22
23
  * @tokens Tag spacing
@@ -34,7 +35,7 @@ exports.tag = (0, styled_components_1.css) `
34
35
  --tag-large-content-padding: var(--tag-large-padding-vertical); //@presenter Spacing
35
36
 
36
37
  --tag-margin: 0 5px 0 0; //@presenter Spacing
37
- --tag-gap: 5px; //@presenter Spacing
38
+ --tag-gap: 4px; //@presenter Spacing
38
39
 
39
40
  /**
40
41
  * @tokens Tag size
@@ -60,8 +61,8 @@ exports.tag = (0, styled_components_1.css) `
60
61
  * @tokens Tag icon
61
62
  */
62
63
 
63
- --tag-icon-width: 1em; // @presenter Spacing
64
- --tag-icon-height: 1em; // @presenter Spacing
64
+ --tag-icon-width: 14px; // @presenter Spacing
65
+ --tag-icon-height: 14px; // @presenter Spacing
65
66
 
66
67
  /**
67
68
  * @tokens Tag colors
@@ -74,85 +75,127 @@ exports.tag = (0, styled_components_1.css) `
74
75
  .tag-draft,
75
76
  .tag-schema,
76
77
  .tag-default {
77
- --tag-color: var(--text-color-primary); // @presenter Color
78
+ --tag-color: var(--text-color-secondary); // @presenter Color
78
79
  --tag-bg-color: var(--color-warm-grey-2); // @presenter Color
79
80
  --tag-border-color: var(--border-color-primary); // @presenter Color
81
+ --tag-bg-color-hover: var(--color-warm-grey-3); // @presenter Color
80
82
  --tag-close-button-bg-color-hover: var(--color-warm-grey-3); // @presenter Color
83
+ --tag-border-color-hover: var(--color-warm-grey-5); // @presenter Color
84
+ }
85
+
86
+ .tag-green {
87
+ --tag-color: var(--color-green-8); // @presenter Color
88
+ --tag-bg-color: var(--color-green-1); // @presenter Color
89
+ --tag-border-color: var(--color-green-5); // @presenter Color
90
+ --tag-bg-color-hover: var(--color-green-2); // @presenter Color
91
+ --tag-close-button-bg-color-hover: var(--color-green-2); // @presenter Color
92
+ --tag-border-color-hover: var(--color-green-6); // @presenter Color
81
93
  }
82
94
 
83
- .tag-green,
84
95
  .tag-success,
85
96
  .tag-approved {
86
97
  --tag-color: var(--color-success-active); // @presenter Color
87
98
  --tag-bg-color: var(--color-success-bg); // @presenter Color
88
- --tag-border-color: var(--color-success-active); // @presenter Color
99
+ --tag-border-color: var(--color-success-border); // @presenter Color
89
100
  --tag-close-button-bg-color-hover: var(--color-success-bg-hover); // @presenter Color
101
+ --tag-bg-color-hover: var(--color-success-bg-hover); // @presenter Color
102
+ --tag-border-color-hover: var(--color-success-border-hover); // @presenter Color
103
+ }
104
+
105
+ .tag-red {
106
+ --tag-color: var(--color-red-7); // @presenter Color
107
+ --tag-bg-color: var(--color-red-1); // @presenter Color
108
+ --tag-border-color: var(--color-red-3); // @presenter Color
109
+ --tag-close-button-bg-color-hover: var(--color-red-2); // @presenter Color
110
+ --tag-bg-color-hover: var(--color-red-2); // @presenter Color
111
+ --tag-border-color-hover: var(--color-red-5); // @presenter Color
90
112
  }
91
113
 
92
- .tag-red,
93
114
  .tag-error,
94
115
  .tag-declined {
95
116
  --tag-color: var(--color-error-active); // @presenter Color
96
117
  --tag-bg-color: var(--color-error-bg); // @presenter Color
97
- --tag-border-color: var(--color-error-active); // @presenter Color
118
+ --tag-border-color: var(--color-error-border); // @presenter Color
98
119
  --tag-close-button-bg-color-hover: var(--color-error-hover); // @presenter Color
120
+ --tag-bg-color-hover: var(--color-error-bg-hover); // @presenter Color
121
+ --tag-border-color-hover: var(--color-error-border-hover); // @presenter Color
99
122
  }
100
123
 
101
- .tag-gold,
102
124
  .tag-warning,
103
125
  .tag-deprecated {
104
126
  --tag-color: var(--color-warning-active); // @presenter Color
105
127
  --tag-bg-color: var(--color-warning-bg); // @presenter Color
106
- --tag-border-color: var(--color-warning-active); // @presenter Color
128
+ --tag-border-color: var(--color-warning-border); // @presenter Color
107
129
  --tag-close-button-bg-color-hover: var(--color-warning-hover); // @presenter Color
130
+ --tag-bg-color-hover: var(--color-warning-bg-hover); // @presenter Color
131
+ --tag-border-color-hover: var(--color-warning-border-hover); // @presenter Color
108
132
  }
109
133
 
110
- .tag-blue,
111
- .tag-processing {
134
+ .tag-blue {
135
+ --tag-color: var(--color-blue-7); // @presenter Color
136
+ --tag-bg-color: var(--color-blue-1); // @presenter Color
137
+ --tag-border-color: var(--color-blue-4); // @presenter Color
138
+ --tag-bg-color-hover: var(--color-blue-2); // @presenter Color
139
+ --tag-close-button-bg-color-hover: var(--color-blue-2); // @presenter Color
140
+ --tag-border-color-hover: var(--color-blue-6); // @presenter Color
141
+ }
142
+
143
+ .tag-processing,
144
+ .tag-info {
112
145
  --tag-color: var(--color-info-active); // @presenter Color
113
146
  --tag-bg-color: var(--color-info-bg); // @presenter Color
114
- --tag-border-color: var(--color-info-active); // @presenter Color
147
+ --tag-border-color: var(--color-info-border); // @presenter Color
115
148
  --tag-close-button-bg-color-hover: var(--color-info-hover); // @presenter Color
149
+ --tag-bg-color-hover: var(--color-info-bg-hover); // @presenter Color
150
+ --tag-border-color-hover: var(--color-info-border-hover); // @presenter Color
151
+ }
152
+
153
+ .tag-link {
154
+ --tag-color: var(--color-info-active); // @presenter Color
155
+ --tag-bg-color: var(--color-info-bg); // @presenter Color
156
+ --tag-border-color: var(--color-info-border); // @presenter Color
157
+ --tag-close-button-bg-color-hover: var(--color-info-hover); // @presenter Color
158
+ --tag-bg-color-hover: var(--color-info-bg-hover); // @presenter Color
159
+ --tag-border-color-hover: var(--color-info-border-hover); // @presenter Color
116
160
  }
117
161
 
118
162
  .tag-purple,
119
163
  .tag-head {
120
164
  --tag-color: var(--color-purple-7); // @presenter Color
121
165
  --tag-bg-color: var(--color-purple-1); // @presenter Color
122
- --tag-border-color: var(--color-purple-7); // @presenter Color
123
- --tag-close-button-bg-color-hover: var(--color-purple-3); // @presenter Color
166
+ --tag-border-color: var(--color-purple-4); // @presenter Color
167
+ --tag-bg-color-hover: var(--color-purple-2); // @presenter Color
168
+ --tag-close-button-bg-color-hover: var(--color-purple-2); // @presenter Color
169
+ --tag-border-color-hover: var(--color-purple-6); // @presenter Color
124
170
  }
125
171
 
126
- .tag-cyan,
127
- .tag-option,
128
- .tag-geekblue,
129
- .tag-link {
130
- --tag-color: var(--color-turquoise-7); // @presenter Color
172
+ .tag-turquoise,
173
+ .tag-option {
174
+ --tag-color: var(--color-turquoise-8); // @presenter Color
131
175
  --tag-bg-color: var(--color-turquoise-1); // @presenter Color
132
- --tag-border-color: var(--color-turquoise-7); // @presenter Color
133
- --tag-close-button-bg-color-hover: var(--color-turquoise-3); // @presenter Color
176
+ --tag-border-color: var(--color-turquoise-5); // @presenter Color
177
+ --tag-bg-color-hover: var(--color-turquoise-2); // @presenter Color
178
+ --tag-close-button-bg-color-hover: var(--color-turquoise-2); // @presenter Color
179
+ --tag-border-color-hover: var(--color-turquoise-7); // @presenter Color
134
180
  }
135
181
 
136
- .tag-yellow {
137
- --tag-color: var(--color-carrot-7); // @presenter Color
182
+ .tag-carrot {
183
+ --tag-color: var(--color-carrot-8); // @presenter Color
138
184
  --tag-bg-color: var(--color-carrot-1); // @presenter Color
139
- --tag-border-color: var(--color-carrot-7); // @presenter Color
140
- --tag-close-button-bg-color-hover: var(--color-carrot-3); // @presenter Color
185
+ --tag-border-color: var(--color-carrot-6); // @presenter Color
186
+ --tag-bg-color-hover: var(--color-carrot-2); // @presenter Color
187
+ --tag-close-button-bg-color-hover: var(--color-carrot-2); // @presenter Color
188
+ --tag-border-color-hover: var(--color-carrot-7); // @presenter Color
141
189
  }
142
190
 
143
191
  .tag-magenta,
144
192
  .tag-hook {
145
193
  --tag-color: var(--color-magenta-7); // @presenter Color
146
194
  --tag-bg-color: var(--color-magenta-1); // @presenter Color
147
- --tag-border-color: var(--color-magenta-7); // @presenter Color
148
- --tag-close-button-bg-color-hover: var(--color-magenta-3); // @presenter Color
149
- }
150
-
151
- .tag-lime {
152
- --tag-color: var(--color-green-7); // @presenter Color
153
- --tag-bg-color: none; // @presenter Color
154
- --tag-border-color: var(--color-green-7); // @presenter Color
155
- --tag-close-button-bg-color-hover: var(--color-green-3); // @presenter Color
195
+ --tag-border-color: var(--color-magenta-3); // @presenter Color
196
+ --tag-bg-color-hover: var(--color-magenta-2); // @presenter Color
197
+ --tag-close-button-bg-color-hover: var(--color-magenta-2); // @presenter Color
198
+ --tag-border-color-hover: var(--color-magenta-5); // @presenter Color
156
199
  }
157
200
 
158
201
  .tag-product {
@@ -164,37 +207,56 @@ exports.tag = (0, styled_components_1.css) `
164
207
 
165
208
  .tag-grass {
166
209
  --tag-color: var(--color-grass-8); // @presenter Color
167
- --tag-bg-color: transparent; // @presenter Color
210
+ --tag-bg-color: var(--color-grass-1); // @presenter Color
168
211
  --tag-border-color: var(--color-grass-4); // @presenter Color
169
- --tag-close-button-bg-color-hover: var(--color-grass-1); // @presenter Color
170
- }
171
-
172
- .tag-purple {
173
- --tag-color: var(--color-purple-7); // @presenter Color
174
- --tag-bg-color: transparent; // @presenter Color
175
- --tag-border-color: var(--color-purple-4); // @presenter Color
176
- --tag-close-button-bg-color-hover: var(--color-purple-1); // @presenter Color
212
+ --tag-bg-color-hover: var(--color-grass-2); // @presenter Color
213
+ --tag-close-button-bg-color-hover: var(--color-grass-2); // @presenter Color
214
+ --tag-border-color-hover: var(--color-grass-6); // @presenter Color
177
215
  }
178
216
 
179
217
  .tag-sky {
180
- --tag-color: var(--color-sky-9); // @presenter Color
181
- --tag-bg-color: transparent; // @presenter Color
218
+ --tag-color: var(--color-sky-8); // @presenter Color
219
+ --tag-bg-color: var(--color-sky-1); // @presenter Color
182
220
  --tag-border-color: var(--color-sky-5); // @presenter Color
221
+ --tag-bg-color-hover: var(--color-sky-2); // @presenter Color
183
222
  --tag-close-button-bg-color-hover: var(--color-sky-2); // @presenter Color
223
+ --tag-border-color-hover: var(--color-sky-7); // @presenter Color
184
224
  }
185
225
 
186
226
  .tag-raspberry {
187
227
  --tag-color: var(--color-raspberry-7); // @presenter Color
188
- --tag-bg-color: transparent; // @presenter Color
228
+ --tag-bg-color: var(--color-raspberry-1); // @presenter Color
189
229
  --tag-border-color: var(--color-raspberry-3); // @presenter Color
190
- --tag-close-button-bg-color-hover: var(--color-raspberry-1); // @presenter Color
191
- }
192
-
193
- .tag-carrot {
194
- --tag-color: var(--color-carrot-8); // @presenter Color
195
- --tag-bg-color: transparent; // @presenter Color
196
- --tag-border-color: var(--color-carrot-6); // @presenter Color
197
- --tag-close-button-bg-color-hover: var(--color-carrot-3); // @presenter Color
230
+ --tag-bg-color-hover: var(--color-raspberry-2); // @presenter Color
231
+ --tag-close-button-bg-color-hover: var(--color-raspberry-2); // @presenter Color
232
+ --tag-border-color-hover: var(--color-raspberry-5); // @presenter Color
233
+ }
234
+
235
+ .tag-orange {
236
+ --tag-color: var(--color-orange-7); // @presenter Color
237
+ --tag-bg-color: var(--color-orange-1); // @presenter Color
238
+ --tag-border-color: var(--color-orange-4); // @presenter Color
239
+ --tag-bg-color-hover: var(--color-orange-2); // @presenter Color
240
+ --tag-close-button-bg-color-hover: var(--color-orange-2); // @presenter Color
241
+ --tag-border-color-hover: var(--color-orange-5); // @presenter Color
242
+ }
243
+
244
+ .tag-persian-green {
245
+ --tag-color: var(--color-persian-green-8); // @presenter Color
246
+ --tag-bg-color: var(--color-persian-green-1); // @presenter Color
247
+ --tag-border-color: var(--color-persian-green-5); // @presenter Color
248
+ --tag-bg-color-hover: var(--color-persian-green-2); // @presenter Color
249
+ --tag-close-button-bg-color-hover: var(--color-persian-green-2); // @presenter Color
250
+ --tag-border-color-hover: var(--color-persian-green-6); // @presenter Color
251
+ }
252
+
253
+ .tag-blueberry {
254
+ --tag-color: var(--color-blueberry-7); // @presenter Color
255
+ --tag-bg-color: var(--color-blueberry-1); // @presenter Color
256
+ --tag-border-color: var(--color-blueberry-4); // @presenter Color
257
+ --tag-bg-color-hover: var(--color-blueberry-2); // @presenter Color
258
+ --tag-close-button-bg-color-hover: var(--color-blueberry-2); // @presenter Color
259
+ --tag-border-color-hover: var(--color-blueberry-6); // @presenter Color
198
260
  }
199
261
 
200
262
  /**
@@ -37,6 +37,8 @@ exports.reverseRelationMap = {
37
37
  memberOf: 'hasMember',
38
38
  triggers: 'triggeredBy',
39
39
  triggeredBy: 'triggers',
40
+ returns: 'returnedBy',
41
+ returnedBy: 'returns',
40
42
  };
41
43
  exports.relationTypeMap = {
42
44
  partOf: 'Part of',
@@ -64,6 +66,8 @@ exports.relationTypeMap = {
64
66
  memberOf: 'Member of',
65
67
  triggers: 'Triggers',
66
68
  triggeredBy: 'Triggered by',
69
+ returns: 'Returns',
70
+ returnedBy: 'Returned by',
67
71
  };
68
72
  var GraphHandleType;
69
73
  (function (GraphHandleType) {
@@ -1,7 +1,15 @@
1
- export type CodeSnippetContextType = {
2
- activeSnippetName: string;
3
- setActiveSnippetName: (name: string) => void;
4
- };
1
+ import React from 'react';
5
2
  export declare const CODE_GROUP_SNIPPET_NAME_KEY = "redocly:codeGroupSnippetName";
6
- export declare const CodeSnippetContext: import("react").Context<CodeSnippetContextType | null>;
7
- export declare function useActiveCodeSnippetName(mode: 'tabs' | 'dropdown'): [string, (name: string) => void];
3
+ type CodeSnippetContextType = {
4
+ activeSnippets: Record<string, string>;
5
+ setActiveSnippet: (groupId: string, snippetId: string) => void;
6
+ };
7
+ export declare const CodeSnippetContext: React.Context<CodeSnippetContextType | null>;
8
+ export declare function CodeSnippetProvider({ children }: {
9
+ children: React.ReactNode;
10
+ }): React.JSX.Element;
11
+ export declare const useCodeSnippetContext: () => CodeSnippetContextType;
12
+ export declare const useActiveCodeSnippetId: (groupId?: string, availableSnippets?: {
13
+ id: string;
14
+ }[]) => [string, (id: string) => void];
15
+ export {};
@@ -1,23 +1,66 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
2
25
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.CodeSnippetContext = exports.CODE_GROUP_SNIPPET_NAME_KEY = void 0;
4
- exports.useActiveCodeSnippetName = useActiveCodeSnippetName;
5
- const react_1 = require("react");
26
+ exports.useActiveCodeSnippetId = exports.useCodeSnippetContext = exports.CodeSnippetContext = exports.CODE_GROUP_SNIPPET_NAME_KEY = void 0;
27
+ exports.CodeSnippetProvider = CodeSnippetProvider;
28
+ const react_1 = __importStar(require("react"));
29
+ const use_local_state_1 = require("../hooks/use-local-state");
6
30
  exports.CODE_GROUP_SNIPPET_NAME_KEY = 'redocly:codeGroupSnippetName';
7
31
  exports.CodeSnippetContext = (0, react_1.createContext)(null);
8
- function useActiveCodeSnippetName(mode) {
32
+ function CodeSnippetProvider({ children }) {
33
+ const [activeSnippets, setActiveSnippets] = (0, use_local_state_1.useLocalState)(exports.CODE_GROUP_SNIPPET_NAME_KEY, {});
34
+ const setActiveSnippet = (0, react_1.useCallback)((groupId, snippetId) => {
35
+ setActiveSnippets(Object.assign(Object.assign({}, activeSnippets), { [groupId]: snippetId }));
36
+ }, [activeSnippets, setActiveSnippets]);
37
+ const contextValue = { activeSnippets, setActiveSnippet };
38
+ return react_1.default.createElement(exports.CodeSnippetContext.Provider, { value: contextValue }, children);
39
+ }
40
+ const useCodeSnippetContext = () => {
9
41
  const context = (0, react_1.useContext)(exports.CodeSnippetContext);
10
42
  if (!context) {
11
43
  throw new Error('useCodeSnippetContext must be used within a CodeSnippetContext');
12
44
  }
13
- const [activeSnippetName, setActiveSnippetName] = (0, react_1.useState)(mode === 'tabs' ? '' : context.activeSnippetName);
14
- if (mode === 'tabs') {
15
- // use non-synced state for tabs mode
16
- return [activeSnippetName, setActiveSnippetName];
17
- }
18
- else {
19
- // use global synced state for dropdown mode
20
- return [context.activeSnippetName, context.setActiveSnippetName];
21
- }
22
- }
45
+ return context;
46
+ };
47
+ exports.useCodeSnippetContext = useCodeSnippetContext;
48
+ const useActiveCodeSnippetId = (groupId, availableSnippets) => {
49
+ const { activeSnippets, setActiveSnippet } = (0, exports.useCodeSnippetContext)();
50
+ const storedSnippetId = groupId ? activeSnippets[groupId] || '' : '';
51
+ const activeId = (0, react_1.useMemo)(() => {
52
+ var _a;
53
+ if (!(availableSnippets === null || availableSnippets === void 0 ? void 0 : availableSnippets.length))
54
+ return storedSnippetId;
55
+ const found = storedSnippetId && availableSnippets.find((s) => s.id === storedSnippetId);
56
+ return found ? storedSnippetId : ((_a = availableSnippets[0]) === null || _a === void 0 ? void 0 : _a.id) || '';
57
+ }, [storedSnippetId, availableSnippets]);
58
+ const setActiveSnippetId = (0, react_1.useCallback)((id) => {
59
+ if (groupId) {
60
+ setActiveSnippet(groupId, id);
61
+ }
62
+ }, [groupId, setActiveSnippet]);
63
+ return [activeId, setActiveSnippetId];
64
+ };
65
+ exports.useActiveCodeSnippetId = useActiveCodeSnippetId;
23
66
  //# sourceMappingURL=CodeSnippetContext.js.map
@@ -1,6 +1,6 @@
1
- import type { CodeBlockTabItems } from '../../components/CodeBlock/CodeBlock';
1
+ import type { CodeBlockItems } from '../../components/CodeBlock/CodeBlock';
2
2
  type CodeBlockTabsProps = {
3
- tabs: CodeBlockTabItems;
3
+ tabs: CodeBlockItems;
4
4
  containerRef: React.RefObject<HTMLDivElement | null>;
5
5
  tabRefs: React.RefObject<HTMLButtonElement[]>;
6
6
  };
@@ -2,31 +2,35 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.useLocalState = useLocalState;
4
4
  const react_1 = require("react");
5
- function getInitialValue(key, initialValue) {
6
- if (typeof window === 'undefined') {
7
- return initialValue;
8
- }
5
+ const js_utils_1 = require("../utils/js-utils");
6
+ function getStoredValue(key, fallback) {
7
+ if (!(0, js_utils_1.isBrowser)())
8
+ return fallback;
9
9
  try {
10
10
  const savedValue = localStorage.getItem(key);
11
- if (savedValue) {
12
- return JSON.parse(savedValue);
13
- }
11
+ return savedValue ? JSON.parse(savedValue) : fallback;
14
12
  }
15
- catch (error) {
16
- console.error(`Error reading from localStorage for key "${key}":`, error);
13
+ catch (_a) {
14
+ return fallback;
17
15
  }
18
- return initialValue;
19
16
  }
20
17
  function useLocalState(key, initialValue) {
21
- const [value, setValue] = (0, react_1.useState)(() => getInitialValue(key, initialValue));
18
+ const [value, setValue] = (0, react_1.useState)(initialValue);
19
+ // Load stored value from localStorage after component mounts
20
+ // This ensures SSR compatibility: server and client both start with initialValue,
21
+ // then client loads the actual stored value without hydration mismatch
22
22
  (0, react_1.useEffect)(() => {
23
- try {
24
- localStorage.setItem(key, JSON.stringify(value));
25
- }
26
- catch (error) {
27
- console.error(`Error writing to localStorage for key "${key}":`, error);
23
+ if (!(0, js_utils_1.isBrowser)())
24
+ return;
25
+ setValue(getStoredValue(key, initialValue));
26
+ // eslint-disable-next-line react-hooks/exhaustive-deps
27
+ }, [key]);
28
+ const handleSetValue = (0, react_1.useCallback)((newValue) => {
29
+ setValue(newValue);
30
+ if ((0, js_utils_1.isBrowser)()) {
31
+ localStorage.setItem(key, JSON.stringify(newValue));
28
32
  }
29
- }, [key, value]);
30
- return [value, setValue];
33
+ }, [key]);
34
+ return [value, handleSetValue];
31
35
  }
32
36
  //# sourceMappingURL=use-local-state.js.map
@@ -1,2 +1,3 @@
1
1
  import type { PageAction } from '../types';
2
- export declare function usePageActions(pageSlug: string): PageAction[];
2
+ export type PageActionType = 'copy' | 'view' | 'chatgpt' | 'claude' | 'mcp-cursor';
3
+ export declare function usePageActions(pageSlug: string, mcpUrl?: string, actions?: PageActionType[]): PageAction[];
@@ -19,9 +19,11 @@ const use_theme_hooks_1 = require("./use-theme-hooks");
19
19
  const use_theme_config_1 = require("./use-theme-config");
20
20
  const clipboard_service_1 = require("../utils/clipboard-service");
21
21
  const dom_1 = require("../utils/dom");
22
+ const CursorIcon_1 = require("../../icons/CursorIcon/CursorIcon");
22
23
  const DEFAULT_ENABLED_ACTIONS = ['copy', 'view', 'chatgpt', 'claude'];
23
- function usePageActions(pageSlug) {
24
- var _a;
24
+ const CURSOR_URL = 'cursor://anysphere.cursor-deeplink/mcp/install?name=$NAME&config=$BASE64_ENCODED_CONFIG';
25
+ function usePageActions(pageSlug, mcpUrl, actions) {
26
+ var _a, _b, _c;
25
27
  const { useTranslate, usePageData, usePageProps, usePageSharedData } = (0, use_theme_hooks_1.useThemeHooks)();
26
28
  const { translate } = useTranslate();
27
29
  const themeConfig = (0, use_theme_config_1.useThemeConfig)();
@@ -29,7 +31,7 @@ function usePageActions(pageSlug) {
29
31
  const openApiSharedData = usePageSharedData('openAPIDocsStore');
30
32
  const shouldHideAllActions = shouldHidePageActions(pageProps, themeConfig, (_a = openApiSharedData === null || openApiSharedData === void 0 ? void 0 : openApiSharedData.options) === null || _a === void 0 ? void 0 : _a.excludeFromSearch);
31
33
  const { isPublic } = usePageData() || {};
32
- const actions = (0, react_1.useMemo)(() => {
34
+ const result = (0, react_1.useMemo)(() => {
33
35
  var _a, _b;
34
36
  if (shouldHideAllActions) {
35
37
  return [];
@@ -43,9 +45,41 @@ function usePageActions(pageSlug) {
43
45
  url.searchParams.set('q', externalAiPrompt);
44
46
  return url.toString();
45
47
  }
46
- return (((_b = (_a = themeConfig.navigation) === null || _a === void 0 ? void 0 : _a.actions) === null || _b === void 0 ? void 0 : _b.items) || DEFAULT_ENABLED_ACTIONS)
48
+ return (((_b = (_a = themeConfig.navigation) === null || _a === void 0 ? void 0 : _a.actions) === null || _b === void 0 ? void 0 : _b.items) || actions || DEFAULT_ENABLED_ACTIONS)
47
49
  .map((action) => {
50
+ function generateMCPConfig(isCursor) {
51
+ const jsonConfig = {
52
+ 'mcp-server': {
53
+ url: mcpUrl,
54
+ description: 'MCP Server',
55
+ },
56
+ };
57
+ if (isCursor) {
58
+ const url = CURSOR_URL.replace('$NAME', 'mcp-server').replace('$BASE64_ENCODED_CONFIG', btoa(JSON.stringify(jsonConfig['mcp-server'])));
59
+ return url;
60
+ }
61
+ return JSON.stringify(jsonConfig, null, 2);
62
+ }
48
63
  switch (action) {
64
+ case 'mcp-cursor':
65
+ if (!mcpUrl) {
66
+ return null;
67
+ }
68
+ return {
69
+ buttonText: translate('page.actions.cursorMcpButtonText', 'Connect to Cursor'),
70
+ title: translate('page.actions.cursorMcpTitle', 'Connect to Cursor'),
71
+ description: translate('page.actions.cursorMcpDescription', 'Install MCP server on Cursor'),
72
+ iconComponent: CursorIcon_1.CursorIcon,
73
+ onClick: () => {
74
+ try {
75
+ const url = generateMCPConfig(true);
76
+ window.open(url, '_blank');
77
+ }
78
+ catch (error) {
79
+ console.error(error);
80
+ }
81
+ },
82
+ };
49
83
  case 'copy':
50
84
  return {
51
85
  buttonText: translate('page.actions.copyButtonText', 'Copy'),
@@ -99,8 +133,16 @@ function usePageActions(pageSlug) {
99
133
  }
100
134
  })
101
135
  .filter((action) => action !== null);
102
- }, [themeConfig, translate, pageSlug, isPublic, shouldHideAllActions]);
103
- return actions;
136
+ }, [
137
+ shouldHideAllActions,
138
+ pageSlug,
139
+ (_c = (_b = themeConfig.navigation) === null || _b === void 0 ? void 0 : _b.actions) === null || _c === void 0 ? void 0 : _c.items,
140
+ actions,
141
+ mcpUrl,
142
+ translate,
143
+ isPublic,
144
+ ]);
145
+ return result;
104
146
  }
105
147
  function shouldHidePageActions(pageProps, themeConfig, openapiExcludeFromSearch) {
106
148
  var _a, _b, _c, _d, _e, _f;
@@ -1,18 +1,23 @@
1
1
  type UseTabsProps = {
2
- initialTab: string;
2
+ activeTab: string;
3
+ onTabChange: (tab: string) => void;
3
4
  totalTabs: number;
4
5
  containerRef?: React.RefObject<HTMLElement | null>;
5
6
  };
6
- export declare function useTabs({ initialTab, totalTabs, containerRef }: UseTabsProps): {
7
- activeTab: string;
8
- setActiveTab: import("react").Dispatch<import("react").SetStateAction<string>>;
7
+ export declare function useTabs({ activeTab, onTabChange, totalTabs, containerRef }: UseTabsProps): {
9
8
  setTabRef: (element: HTMLButtonElement | null, index: number) => void;
10
9
  onTabClick: (labelOrIndex: string | number) => void;
11
10
  handleKeyboard: (event: React.KeyboardEvent, index: number) => void;
12
- getTabId: (label: string, index: number) => string;
13
11
  visibleTabs: number[];
14
12
  overflowTabs: number[];
15
- ready: boolean;
16
13
  allTabsHidden: boolean;
17
14
  };
15
+ type UseActiveTabProps = {
16
+ initialTab: string;
17
+ tabsId?: string;
18
+ };
19
+ export declare const useActiveTab: ({ initialTab, tabsId }: UseActiveTabProps) => {
20
+ activeTab: string;
21
+ setActiveTab: import("react").Dispatch<import("react").SetStateAction<string>>;
22
+ };
18
23
  export {};