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