@codecademy/brand 3.36.1 → 3.36.2-alpha.4249fc7d9c.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/dist/AppHeader/AppHeaderElements/AppHeaderCatalogSection/elements.d.ts +6 -6
- package/dist/AppHeader/AppHeaderElements/AppHeaderLink/index.d.ts +2 -2
- package/dist/AppHeader/AppHeaderElements/AppHeaderLinkSections/elements.d.ts +2 -2
- package/dist/AppHeader/AppHeaderElements/AppHeaderLinkSections/index.js +0 -0
- package/dist/AppHeader/AppHeaderElements/AppHeaderSection/elements.d.ts +2 -2
- package/dist/AppHeader/Search/SearchButton.js +29 -0
- package/dist/AppHeader/Search/SearchPane.js +42 -9
- package/dist/AppHeader/Search/SearchWorker/index.js +55 -7
- package/dist/AppHeader/Search/SearchWorker/src.js +98 -45
- package/dist/AppHeader/Search/SearchWorker/worker.js +70 -23
- package/dist/AppHeader/Search/safelyRedirect.js +50 -11
- package/dist/AppHeader/shared/elements.d.ts +2 -2
- package/dist/Carousel/elements.d.ts +2 -2
- package/dist/DropdownButton/index.d.ts +2 -2
- package/dist/Logos/shared.d.ts +2 -2
- package/package.json +1 -1
|
@@ -3,22 +3,70 @@ let workerPromise;
|
|
|
3
3
|
const initErr = 'Search worker not initialized';
|
|
4
4
|
export const searchWorker = {
|
|
5
5
|
init() {
|
|
6
|
+
// eslint-disable-next-line no-console
|
|
7
|
+
console.log('[searchWorker.init] Initializing search worker');
|
|
6
8
|
if (!workerPromise) {
|
|
9
|
+
// eslint-disable-next-line no-console
|
|
10
|
+
console.log('[searchWorker.init] Creating new worker promise');
|
|
7
11
|
workerPromise = (async () => {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
12
|
+
try {
|
|
13
|
+
// eslint-disable-next-line no-console
|
|
14
|
+
console.log('[searchWorker.init] Importing worker module');
|
|
15
|
+
// lazy load worker
|
|
16
|
+
const {
|
|
17
|
+
createSearchWorker
|
|
18
|
+
} = await import('./worker');
|
|
19
|
+
// eslint-disable-next-line no-console
|
|
20
|
+
console.log('[searchWorker.init] Worker module imported, creating worker');
|
|
21
|
+
const worker = createSearchWorker();
|
|
22
|
+
// eslint-disable-next-line no-console
|
|
23
|
+
console.log('[searchWorker.init] Worker created successfully');
|
|
24
|
+
return worker;
|
|
25
|
+
} catch (error) {
|
|
26
|
+
// eslint-disable-next-line no-console
|
|
27
|
+
console.error('[searchWorker.init] Error creating worker:', error);
|
|
28
|
+
throw error;
|
|
29
|
+
}
|
|
13
30
|
})();
|
|
31
|
+
} else {
|
|
32
|
+
// eslint-disable-next-line no-console
|
|
33
|
+
console.log('[searchWorker.init] Worker already initialized');
|
|
14
34
|
}
|
|
15
35
|
},
|
|
16
36
|
async autocomplete(query) {
|
|
37
|
+
// eslint-disable-next-line no-console
|
|
38
|
+
console.log('[searchWorker.autocomplete] Query:', query);
|
|
17
39
|
if (!workerPromise) throw new Error(initErr);
|
|
18
|
-
|
|
40
|
+
try {
|
|
41
|
+
const worker = await workerPromise;
|
|
42
|
+
// eslint-disable-next-line no-console
|
|
43
|
+
console.log('[searchWorker.autocomplete] Worker ready, calling with query:', query);
|
|
44
|
+
const result = await worker(SearchAction.Autocomplete, query);
|
|
45
|
+
// eslint-disable-next-line no-console
|
|
46
|
+
console.log('[searchWorker.autocomplete] Result received:', result);
|
|
47
|
+
return result;
|
|
48
|
+
} catch (error) {
|
|
49
|
+
// eslint-disable-next-line no-console
|
|
50
|
+
console.error('[searchWorker.autocomplete] Error:', error);
|
|
51
|
+
throw error;
|
|
52
|
+
}
|
|
19
53
|
},
|
|
20
54
|
async searchAsYouType(query) {
|
|
55
|
+
// eslint-disable-next-line no-console
|
|
56
|
+
console.log('[searchWorker.searchAsYouType] Query:', query);
|
|
21
57
|
if (!workerPromise) throw new Error(initErr);
|
|
22
|
-
|
|
58
|
+
try {
|
|
59
|
+
const worker = await workerPromise;
|
|
60
|
+
// eslint-disable-next-line no-console
|
|
61
|
+
console.log('[searchWorker.searchAsYouType] Worker ready, calling with query:', query);
|
|
62
|
+
const result = await worker(SearchAction.SearchAsYouType, query);
|
|
63
|
+
// eslint-disable-next-line no-console
|
|
64
|
+
console.log('[searchWorker.searchAsYouType] Result received:', result);
|
|
65
|
+
return result;
|
|
66
|
+
} catch (error) {
|
|
67
|
+
// eslint-disable-next-line no-console
|
|
68
|
+
console.error('[searchWorker.searchAsYouType] Error:', error);
|
|
69
|
+
throw error;
|
|
70
|
+
}
|
|
23
71
|
}
|
|
24
72
|
};
|
|
@@ -28,6 +28,9 @@ function getPortalOrigin() {
|
|
|
28
28
|
// for standard envs, use portal app in the same env
|
|
29
29
|
if (envs.some(s => `https://${s}.codecademy.com` === origin)) return origin;
|
|
30
30
|
|
|
31
|
+
// for PR envs (e.g. pr-40229-monolith.dev-eks.codecademy.com)
|
|
32
|
+
if (origin.includes('.dev-eks.codecademy.com')) return origin;
|
|
33
|
+
|
|
31
34
|
// for local, use local portal-app, replace if origin port is monolith or le
|
|
32
35
|
if (origin.includes('localhost')) return origin.replace(/:\d{4}/, ':3100');
|
|
33
36
|
|
|
@@ -35,15 +38,65 @@ function getPortalOrigin() {
|
|
|
35
38
|
return 'https://staging.codecademy.com';
|
|
36
39
|
}
|
|
37
40
|
export function serializeSearchWorkerSrc() {
|
|
38
|
-
|
|
39
|
-
|
|
41
|
+
// eslint-disable-next-line no-console
|
|
42
|
+
console.log('[serializeSearchWorkerSrc] Starting serialization');
|
|
43
|
+
try {
|
|
44
|
+
// eslint-disable-next-line no-console
|
|
45
|
+
console.log('[serializeSearchWorkerSrc] Getting portal origin');
|
|
46
|
+
const BASE_URL = `${getPortalOrigin()}/api/portal/search`;
|
|
47
|
+
// eslint-disable-next-line no-console
|
|
48
|
+
console.log('[serializeSearchWorkerSrc] BASE_URL:', BASE_URL);
|
|
49
|
+
|
|
50
|
+
// eslint-disable-next-line no-console
|
|
51
|
+
console.log('[serializeSearchWorkerSrc] Converting worker function to string');
|
|
52
|
+
const fnAsStr = worker.toString().trim();
|
|
53
|
+
// eslint-disable-next-line no-console
|
|
54
|
+
console.log('[serializeSearchWorkerSrc] Worker function string length:', fnAsStr.length);
|
|
55
|
+
// eslint-disable-next-line no-console
|
|
56
|
+
console.log('[serializeSearchWorkerSrc] Full worker function:', fnAsStr);
|
|
57
|
+
|
|
58
|
+
// in a prod build, webpack will handle removing comments
|
|
40
59
|
|
|
41
|
-
|
|
60
|
+
const startIndex = fnAsStr.indexOf('{');
|
|
61
|
+
// eslint-disable-next-line no-console
|
|
62
|
+
console.log('[serializeSearchWorkerSrc] Start index of first {:', startIndex);
|
|
63
|
+
const result = fnAsStr.slice(fnAsStr.indexOf('{') + 1, -1) // remove wrapping function, which may have been renamed by minification
|
|
64
|
+
.replaceAll(' ', '') // remove indentation
|
|
65
|
+
.replaceAll('{BASE_URL}', BASE_URL) // interpolate base url
|
|
66
|
+
.replaceAll('{SEARCH}', window.location.search); // interpolate search query
|
|
42
67
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
68
|
+
// Check for external dependencies that would break the worker
|
|
69
|
+
const externalDeps = [];
|
|
70
|
+
if (result.includes('Object(h.a)') || result.includes('h.a')) {
|
|
71
|
+
externalDeps.push('h (Babel async helper)');
|
|
72
|
+
}
|
|
73
|
+
if (result.includes('p.a.mark') || result.includes('p.a.wrap')) {
|
|
74
|
+
externalDeps.push('p (Regenerator runtime)');
|
|
75
|
+
}
|
|
76
|
+
if (result.includes('_createForOfIteratorHelper')) {
|
|
77
|
+
externalDeps.push('_createForOfIteratorHelper (Babel helper)');
|
|
78
|
+
}
|
|
79
|
+
if (externalDeps.length > 0) {
|
|
80
|
+
// eslint-disable-next-line no-console
|
|
81
|
+
console.error('[serializeSearchWorkerSrc] ERROR: Worker code contains external dependencies that will not be available in worker context:', externalDeps);
|
|
82
|
+
// eslint-disable-next-line no-console
|
|
83
|
+
console.error('[serializeSearchWorkerSrc] This is likely because the worker function uses async/await or modern JS features that Babel transpiles with external helpers.');
|
|
84
|
+
// eslint-disable-next-line no-console
|
|
85
|
+
console.error('[serializeSearchWorkerSrc] The worker function needs to be self-contained or the build configuration needs to be adjusted to inline helpers.');
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// eslint-disable-next-line no-console
|
|
89
|
+
console.log('[serializeSearchWorkerSrc] Serialization complete, result length:', result.length);
|
|
90
|
+
// eslint-disable-next-line no-console
|
|
91
|
+
console.log('[serializeSearchWorkerSrc] First 500 chars of result:', result.substring(0, 500));
|
|
92
|
+
// eslint-disable-next-line no-console
|
|
93
|
+
console.log('[serializeSearchWorkerSrc] Full result:', result);
|
|
94
|
+
return result;
|
|
95
|
+
} catch (error) {
|
|
96
|
+
// eslint-disable-next-line no-console
|
|
97
|
+
console.error('[serializeSearchWorkerSrc] Error during serialization:', error);
|
|
98
|
+
throw error;
|
|
99
|
+
}
|
|
47
100
|
}
|
|
48
101
|
|
|
49
102
|
/*
|
|
@@ -52,11 +105,7 @@ export function serializeSearchWorkerSrc() {
|
|
|
52
105
|
* the worker via onmessage and passed back to the main thread via postMessage.
|
|
53
106
|
*/
|
|
54
107
|
function worker() {
|
|
55
|
-
const preloadTitlesPromise = (
|
|
56
|
-
const f = await fetch('{BASE_URL}/autocomplete-preload{SEARCH}');
|
|
57
|
-
const rawTitles = await f.json();
|
|
58
|
-
return rawTitles.map(preparseTitle);
|
|
59
|
-
})();
|
|
108
|
+
const preloadTitlesPromise = fetch('{BASE_URL}/autocomplete-preload{SEARCH}').then(f => f.json()).then(rawTitles => rawTitles.map(preparseTitle));
|
|
60
109
|
function preparseTitle({
|
|
61
110
|
value,
|
|
62
111
|
popularity
|
|
@@ -108,41 +157,43 @@ function worker() {
|
|
|
108
157
|
};
|
|
109
158
|
}
|
|
110
159
|
const maxResults = 5;
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
160
|
+
function autocompleteHandler(q) {
|
|
161
|
+
preloadTitlesPromise.then(titles => {
|
|
162
|
+
const scoredTitles = titles.map(t => getScoredTitle(q, t));
|
|
163
|
+
const topAutocompleteTitles = scoredTitles.filter(x => x.score > 0).sort((a, b) => a.score > b.score ? -1 : 1).slice(0, maxResults).map(t => ({
|
|
164
|
+
title: t.title,
|
|
165
|
+
segments: getHighlightSegments(t.title, t.charScores)
|
|
166
|
+
}));
|
|
167
|
+
postMessage({
|
|
168
|
+
query: q.query,
|
|
169
|
+
result: topAutocompleteTitles,
|
|
170
|
+
action: 'autocomplete'
|
|
171
|
+
});
|
|
122
172
|
});
|
|
123
173
|
}
|
|
124
|
-
|
|
125
|
-
|
|
174
|
+
function searchAsYouTypeHandler(q) {
|
|
175
|
+
fetch('{BASE_URL}/search-as-you-type{SEARCH}', {
|
|
126
176
|
body: JSON.stringify({
|
|
127
177
|
query: q.query,
|
|
128
178
|
max: maxResults
|
|
129
179
|
}),
|
|
130
180
|
method: 'POST'
|
|
131
|
-
})
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
181
|
+
}).then(f => f.json()).then(searchAsYouTypeResults => {
|
|
182
|
+
for (let i = 0; i < searchAsYouTypeResults.top.length; i++) {
|
|
183
|
+
const entry = searchAsYouTypeResults.top[i];
|
|
184
|
+
const t = preparseTitle({
|
|
185
|
+
value: entry.title,
|
|
186
|
+
popularity: 0
|
|
187
|
+
});
|
|
188
|
+
const charScores = getCharScores(q, t);
|
|
189
|
+
entry.segments = getHighlightSegments(entry.title, charScores);
|
|
190
|
+
entry.key = q.query + ':' + entry.title;
|
|
191
|
+
}
|
|
192
|
+
postMessage({
|
|
193
|
+
query: q.query,
|
|
194
|
+
result: searchAsYouTypeResults,
|
|
195
|
+
action: 'search-as-you-type'
|
|
137
196
|
});
|
|
138
|
-
const charScores = getCharScores(q, t);
|
|
139
|
-
entry.segments = getHighlightSegments(entry.title, charScores);
|
|
140
|
-
entry.key = q.query + ':' + entry.title;
|
|
141
|
-
}
|
|
142
|
-
postMessage({
|
|
143
|
-
query: q.query,
|
|
144
|
-
result: searchAsYouTypeResults,
|
|
145
|
-
action: 'search-as-you-type'
|
|
146
197
|
});
|
|
147
198
|
}
|
|
148
199
|
|
|
@@ -157,17 +208,17 @@ function worker() {
|
|
|
157
208
|
// Bonus scores are includes in certain cases
|
|
158
209
|
function getTotalScore(q, t, charScores) {
|
|
159
210
|
let fromChars = 0;
|
|
160
|
-
for (
|
|
161
|
-
fromChars +=
|
|
211
|
+
for (let i = 0; i < charScores.length; i++) {
|
|
212
|
+
fromChars += charScores[i];
|
|
162
213
|
}
|
|
163
214
|
const fromPopularity = (t.popularity || 0) * popularityStrength;
|
|
164
215
|
let bonus = 0;
|
|
165
216
|
// for each complete word present in both the title and query
|
|
166
|
-
|
|
217
|
+
q.words.forEach(qw => {
|
|
167
218
|
if (t.words.has(qw)) {
|
|
168
219
|
bonus += 100;
|
|
169
220
|
}
|
|
170
|
-
}
|
|
221
|
+
});
|
|
171
222
|
|
|
172
223
|
// if the title starts with the query
|
|
173
224
|
if (t.lower.startsWith(q.query)) {
|
|
@@ -291,9 +342,11 @@ function worker() {
|
|
|
291
342
|
// "authentication" or other words ending in "ion"
|
|
292
343
|
const minMatchLength = Math.ceil(avgQueryWordLength ** 0.65);
|
|
293
344
|
const charScores = [];
|
|
294
|
-
for (
|
|
345
|
+
for (let i = 0; i < cmcsForTitleChars.length; i++) {
|
|
346
|
+
const cmcs = cmcsForTitleChars[i];
|
|
295
347
|
let score = 0;
|
|
296
|
-
for (
|
|
348
|
+
for (let j = 0; j < cmcs.length; j++) {
|
|
349
|
+
const cmc = cmcs[j];
|
|
297
350
|
// if the string of consecutive matching chars meets the minMatchLength
|
|
298
351
|
// or if it's a standalone word in the query (e.g "C")
|
|
299
352
|
if (cmc.value.length >= minMatchLength || q.words.has(cmc.value)) {
|
|
@@ -5,27 +5,74 @@ const mockWorker = () => ({
|
|
|
5
5
|
postMessage: () => null
|
|
6
6
|
});
|
|
7
7
|
export function createSearchWorker() {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
8
|
+
// eslint-disable-next-line no-console
|
|
9
|
+
console.log('[createSearchWorker] Starting worker creation');
|
|
10
|
+
try {
|
|
11
|
+
// eslint-disable-next-line no-console
|
|
12
|
+
console.log('[createSearchWorker] Serializing worker source');
|
|
13
|
+
const src = serializeSearchWorkerSrc();
|
|
14
|
+
// eslint-disable-next-line no-console
|
|
15
|
+
console.log('[createSearchWorker] Worker source serialized, length:', src.length);
|
|
16
|
+
|
|
17
|
+
// eslint-disable-next-line no-console
|
|
18
|
+
console.log('[createSearchWorker] Creating blob');
|
|
19
|
+
const blob = new Blob([src], {
|
|
20
|
+
type: 'text/javascript'
|
|
21
|
+
});
|
|
22
|
+
// eslint-disable-next-line no-console
|
|
23
|
+
console.log('[createSearchWorker] Blob created');
|
|
24
|
+
|
|
25
|
+
// eslint-disable-next-line no-console
|
|
26
|
+
console.log('[createSearchWorker] Creating object URL');
|
|
27
|
+
const dataUrl = URL.createObjectURL?.(blob);
|
|
28
|
+
// eslint-disable-next-line no-console
|
|
29
|
+
console.log('[createSearchWorker] Object URL created:', dataUrl);
|
|
30
|
+
|
|
31
|
+
// eslint-disable-next-line no-console
|
|
32
|
+
console.log('[createSearchWorker] Checking Worker availability');
|
|
33
|
+
const w = typeof Worker === 'undefined' ? mockWorker() : new Worker(dataUrl);
|
|
34
|
+
// eslint-disable-next-line no-console
|
|
35
|
+
console.log('[createSearchWorker] Worker instance created');
|
|
36
|
+
const results = new PromiseLookup({
|
|
37
|
+
onKeyInit: (action, query) => {
|
|
38
|
+
// eslint-disable-next-line no-console
|
|
39
|
+
console.log('[createSearchWorker.onKeyInit] Posting message to worker:', {
|
|
40
|
+
action,
|
|
41
|
+
query
|
|
42
|
+
});
|
|
43
|
+
w.postMessage({
|
|
44
|
+
action,
|
|
45
|
+
query
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
w.onmessage = ({
|
|
50
|
+
data
|
|
51
|
+
}) => {
|
|
52
|
+
// eslint-disable-next-line no-console
|
|
53
|
+
console.log('[createSearchWorker.onmessage] Received message from worker:', data);
|
|
54
|
+
const {
|
|
55
|
+
query,
|
|
56
|
+
result,
|
|
57
|
+
action
|
|
58
|
+
} = data;
|
|
59
|
+
results.resolve(action, query, result);
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
// Add error handler for the worker
|
|
63
|
+
if ('onerror' in w) {
|
|
64
|
+
w.onerror = error => {
|
|
65
|
+
// eslint-disable-next-line no-console
|
|
66
|
+
console.error('[createSearchWorker] Worker error:', error);
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// eslint-disable-next-line no-console
|
|
71
|
+
console.log('[createSearchWorker] Worker fully configured');
|
|
72
|
+
return (action, query) => results.get(action, query);
|
|
73
|
+
} catch (error) {
|
|
74
|
+
// eslint-disable-next-line no-console
|
|
75
|
+
console.error('[createSearchWorker] Error creating worker:', error);
|
|
76
|
+
throw error;
|
|
77
|
+
}
|
|
31
78
|
}
|
|
@@ -5,14 +5,31 @@
|
|
|
5
5
|
|
|
6
6
|
import { ALLOWED_HOSTS } from './consts';
|
|
7
7
|
export function safelyRedirect(url) {
|
|
8
|
+
// eslint-disable-next-line no-console
|
|
9
|
+
console.log('[safelyRedirect] Attempting to redirect to:', url);
|
|
8
10
|
try {
|
|
11
|
+
// eslint-disable-next-line no-console
|
|
12
|
+
console.log('[safelyRedirect] Sanitizing URL');
|
|
9
13
|
const sanitizedURL = sanitizeURL(url);
|
|
10
|
-
|
|
14
|
+
// eslint-disable-next-line no-console
|
|
15
|
+
console.log('[safelyRedirect] Sanitized URL:', sanitizedURL);
|
|
16
|
+
const isRelative = isRelativeUrl(sanitizedURL);
|
|
17
|
+
// eslint-disable-next-line no-console
|
|
18
|
+
console.log('[safelyRedirect] Is relative URL:', isRelative);
|
|
19
|
+
const hasAllowed = hasAllowedHost(sanitizedURL);
|
|
20
|
+
// eslint-disable-next-line no-console
|
|
21
|
+
console.log('[safelyRedirect] Has allowed host:', hasAllowed);
|
|
22
|
+
if (isRelative || hasAllowed) {
|
|
23
|
+
// eslint-disable-next-line no-console
|
|
24
|
+
console.log('[safelyRedirect] Redirecting to:', sanitizedURL);
|
|
11
25
|
window.location.assign(sanitizedURL);
|
|
12
26
|
} else {
|
|
13
27
|
throw new Error(`Invalid redirect url: ${sanitizedURL}`);
|
|
14
28
|
}
|
|
15
|
-
} catch (error) {
|
|
29
|
+
} catch (error) {
|
|
30
|
+
// eslint-disable-next-line no-console
|
|
31
|
+
console.error('[safelyRedirect] Error during redirect:', error);
|
|
32
|
+
}
|
|
16
33
|
}
|
|
17
34
|
function hasAllowedHost(url) {
|
|
18
35
|
const parsedUrl = new URL(url);
|
|
@@ -37,13 +54,35 @@ function isRelativeUrl(url) {
|
|
|
37
54
|
// supports already encoded urls by decoding and re-encoding.
|
|
38
55
|
// params are handled separately to allow for the encoding of / characters
|
|
39
56
|
function sanitizeURL(url) {
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
57
|
+
// eslint-disable-next-line no-console
|
|
58
|
+
console.log('[sanitizeURL] Input URL:', url);
|
|
59
|
+
try {
|
|
60
|
+
const [path, params] = url.split('?', 2);
|
|
61
|
+
// eslint-disable-next-line no-console
|
|
62
|
+
console.log('[sanitizeURL] Path:', path, 'Params:', params);
|
|
63
|
+
const sanitizedPath = encodeURI(decodeURI(path));
|
|
64
|
+
// eslint-disable-next-line no-console
|
|
65
|
+
console.log('[sanitizeURL] Sanitized path:', sanitizedPath);
|
|
66
|
+
if (!params) return sanitizedPath;
|
|
67
|
+
|
|
68
|
+
// eslint-disable-next-line no-console
|
|
69
|
+
console.log('[sanitizeURL] Creating URLSearchParams with:', params);
|
|
70
|
+
const urlParams = new URLSearchParams(params);
|
|
71
|
+
// eslint-disable-next-line no-console
|
|
72
|
+
console.log('[sanitizeURL] URLSearchParams created');
|
|
73
|
+
urlParams.forEach((value, key) => {
|
|
74
|
+
// eslint-disable-next-line no-console
|
|
75
|
+
console.log('[sanitizeURL] Processing param:', key, '=', value);
|
|
76
|
+
const decoded = decodeURIComponent(value);
|
|
77
|
+
urlParams.set(key, decoded);
|
|
78
|
+
});
|
|
79
|
+
const result = `${sanitizedPath}?${urlParams.toString()}`;
|
|
80
|
+
// eslint-disable-next-line no-console
|
|
81
|
+
console.log('[sanitizeURL] Final result:', result);
|
|
82
|
+
return result;
|
|
83
|
+
} catch (error) {
|
|
84
|
+
// eslint-disable-next-line no-console
|
|
85
|
+
console.error('[sanitizeURL] Error sanitizing URL:', error);
|
|
86
|
+
throw error;
|
|
87
|
+
}
|
|
49
88
|
}
|
|
@@ -22,7 +22,7 @@ export declare const DropdownAnchor: import("@emotion/styled").StyledComponent<(
|
|
|
22
22
|
as?: import("react").ElementType<any, keyof import("react").JSX.IntrinsicElements> | undefined;
|
|
23
23
|
} & {
|
|
24
24
|
theme?: import("@emotion/react").Theme | undefined;
|
|
25
|
-
} & Pick<React.DetailedHTMLProps<React.ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, "disabled" | "content" | "translate" | "property" | "hidden" | "form" | "slot" | "style" | "title" | "suppressHydrationWarning" | "className" | "id" | "lang" | "
|
|
25
|
+
} & Pick<React.DetailedHTMLProps<React.ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, "disabled" | "name" | "content" | "translate" | "property" | "hidden" | "form" | "slot" | "style" | "title" | "suppressHydrationWarning" | "className" | "id" | "lang" | "type" | "role" | "tabIndex" | "aria-activedescendant" | "aria-atomic" | "aria-autocomplete" | "aria-braillelabel" | "aria-brailleroledescription" | "aria-busy" | "aria-checked" | "aria-colcount" | "aria-colindex" | "aria-colindextext" | "aria-colspan" | "aria-controls" | "aria-current" | "aria-describedby" | "aria-description" | "aria-details" | "aria-disabled" | "aria-dropeffect" | "aria-errormessage" | "aria-expanded" | "aria-flowto" | "aria-grabbed" | "aria-haspopup" | "aria-hidden" | "aria-invalid" | "aria-keyshortcuts" | "aria-label" | "aria-labelledby" | "aria-level" | "aria-live" | "aria-modal" | "aria-multiline" | "aria-multiselectable" | "aria-orientation" | "aria-owns" | "aria-placeholder" | "aria-posinset" | "aria-pressed" | "aria-readonly" | "aria-relevant" | "aria-required" | "aria-roledescription" | "aria-rowcount" | "aria-rowindex" | "aria-rowindextext" | "aria-rowspan" | "aria-selected" | "aria-setsize" | "aria-sort" | "aria-valuemax" | "aria-valuemin" | "aria-valuenow" | "aria-valuetext" | "children" | "dangerouslySetInnerHTML" | "onCopy" | "onCopyCapture" | "onCut" | "onCutCapture" | "onPaste" | "onPasteCapture" | "onCompositionEnd" | "onCompositionEndCapture" | "onCompositionStart" | "onCompositionStartCapture" | "onCompositionUpdate" | "onCompositionUpdateCapture" | "onFocus" | "onFocusCapture" | "onBlur" | "onBlurCapture" | "onChange" | "onChangeCapture" | "onBeforeInput" | "onBeforeInputCapture" | "onInput" | "onInputCapture" | "onReset" | "onResetCapture" | "onSubmit" | "onSubmitCapture" | "onInvalid" | "onInvalidCapture" | "onLoad" | "onLoadCapture" | "onError" | "onErrorCapture" | "onKeyDown" | "onKeyDownCapture" | "onKeyPress" | "onKeyPressCapture" | "onKeyUp" | "onKeyUpCapture" | "onAbort" | "onAbortCapture" | "onCanPlay" | "onCanPlayCapture" | "onCanPlayThrough" | "onCanPlayThroughCapture" | "onDurationChange" | "onDurationChangeCapture" | "onEmptied" | "onEmptiedCapture" | "onEncrypted" | "onEncryptedCapture" | "onEnded" | "onEndedCapture" | "onLoadedData" | "onLoadedDataCapture" | "onLoadedMetadata" | "onLoadedMetadataCapture" | "onLoadStart" | "onLoadStartCapture" | "onPause" | "onPauseCapture" | "onPlay" | "onPlayCapture" | "onPlaying" | "onPlayingCapture" | "onProgress" | "onProgressCapture" | "onRateChange" | "onRateChangeCapture" | "onResize" | "onResizeCapture" | "onSeeked" | "onSeekedCapture" | "onSeeking" | "onSeekingCapture" | "onStalled" | "onStalledCapture" | "onSuspend" | "onSuspendCapture" | "onTimeUpdate" | "onTimeUpdateCapture" | "onVolumeChange" | "onVolumeChangeCapture" | "onWaiting" | "onWaitingCapture" | "onAuxClick" | "onAuxClickCapture" | "onClick" | "onClickCapture" | "onContextMenu" | "onContextMenuCapture" | "onDoubleClick" | "onDoubleClickCapture" | "onDrag" | "onDragCapture" | "onDragEnd" | "onDragEndCapture" | "onDragEnter" | "onDragEnterCapture" | "onDragExit" | "onDragExitCapture" | "onDragLeave" | "onDragLeaveCapture" | "onDragOver" | "onDragOverCapture" | "onDragStart" | "onDragStartCapture" | "onDrop" | "onDropCapture" | "onMouseDown" | "onMouseDownCapture" | "onMouseEnter" | "onMouseLeave" | "onMouseMove" | "onMouseMoveCapture" | "onMouseOut" | "onMouseOutCapture" | "onMouseOver" | "onMouseOverCapture" | "onMouseUp" | "onMouseUpCapture" | "onSelect" | "onSelectCapture" | "onTouchCancel" | "onTouchCancelCapture" | "onTouchEnd" | "onTouchEndCapture" | "onTouchMove" | "onTouchMoveCapture" | "onTouchStart" | "onTouchStartCapture" | "onPointerDown" | "onPointerDownCapture" | "onPointerMove" | "onPointerMoveCapture" | "onPointerUp" | "onPointerUpCapture" | "onPointerCancel" | "onPointerCancelCapture" | "onPointerEnter" | "onPointerLeave" | "onPointerOver" | "onPointerOverCapture" | "onPointerOut" | "onPointerOutCapture" | "onGotPointerCapture" | "onGotPointerCaptureCapture" | "onLostPointerCapture" | "onLostPointerCaptureCapture" | "onScroll" | "onScrollCapture" | "onWheel" | "onWheelCapture" | "onAnimationStart" | "onAnimationStartCapture" | "onAnimationEnd" | "onAnimationEndCapture" | "onAnimationIteration" | "onAnimationIterationCapture" | "onTransitionEnd" | "onTransitionEndCapture" | "defaultChecked" | "defaultValue" | "suppressContentEditableWarning" | "accessKey" | "autoFocus" | "contentEditable" | "contextMenu" | "dir" | "draggable" | "nonce" | "spellCheck" | "radioGroup" | "about" | "datatype" | "inlist" | "prefix" | "rel" | "resource" | "rev" | "typeof" | "vocab" | "autoCapitalize" | "autoCorrect" | "autoSave" | "itemProp" | "itemScope" | "itemType" | "itemID" | "itemRef" | "results" | "security" | "unselectable" | "inputMode" | "is" | keyof React.ClassAttributes<HTMLButtonElement> | "formAction" | "formEncType" | "formMethod" | "formNoValidate" | "formTarget" | "value">, "ref"> & React.RefAttributes<HTMLAnchorElement | HTMLButtonElement>, "ref"> | Omit<Partial<import("@codecademy/gamut/dist/helpers").AppendedIconProps> & {
|
|
26
26
|
theme?: import("@emotion/react").Theme | undefined;
|
|
27
27
|
as?: import("react").ElementType<any, keyof import("react").JSX.IntrinsicElements> | undefined;
|
|
28
28
|
} & import("@codecademy/gamut").AnchorProps & Pick<React.DetailedHTMLProps<React.AnchorHTMLAttributes<HTMLAnchorElement>, HTMLAnchorElement>, "content" | "translate" | "property" | "hidden" | "slot" | "style" | "title" | "suppressHydrationWarning" | "className" | "id" | "lang" | "media" | "target" | "type" | "role" | "tabIndex" | "href" | "aria-activedescendant" | "aria-atomic" | "aria-autocomplete" | "aria-braillelabel" | "aria-brailleroledescription" | "aria-busy" | "aria-checked" | "aria-colcount" | "aria-colindex" | "aria-colindextext" | "aria-colspan" | "aria-controls" | "aria-current" | "aria-describedby" | "aria-description" | "aria-details" | "aria-disabled" | "aria-dropeffect" | "aria-errormessage" | "aria-expanded" | "aria-flowto" | "aria-grabbed" | "aria-haspopup" | "aria-hidden" | "aria-invalid" | "aria-keyshortcuts" | "aria-label" | "aria-labelledby" | "aria-level" | "aria-live" | "aria-modal" | "aria-multiline" | "aria-multiselectable" | "aria-orientation" | "aria-owns" | "aria-placeholder" | "aria-posinset" | "aria-pressed" | "aria-readonly" | "aria-relevant" | "aria-required" | "aria-roledescription" | "aria-rowcount" | "aria-rowindex" | "aria-rowindextext" | "aria-rowspan" | "aria-selected" | "aria-setsize" | "aria-sort" | "aria-valuemax" | "aria-valuemin" | "aria-valuenow" | "aria-valuetext" | "children" | "dangerouslySetInnerHTML" | "onCopy" | "onCopyCapture" | "onCut" | "onCutCapture" | "onPaste" | "onPasteCapture" | "onCompositionEnd" | "onCompositionEndCapture" | "onCompositionStart" | "onCompositionStartCapture" | "onCompositionUpdate" | "onCompositionUpdateCapture" | "onFocus" | "onFocusCapture" | "onBlur" | "onBlurCapture" | "onChange" | "onChangeCapture" | "onBeforeInput" | "onBeforeInputCapture" | "onInput" | "onInputCapture" | "onReset" | "onResetCapture" | "onSubmit" | "onSubmitCapture" | "onInvalid" | "onInvalidCapture" | "onLoad" | "onLoadCapture" | "onError" | "onErrorCapture" | "onKeyDown" | "onKeyDownCapture" | "onKeyPress" | "onKeyPressCapture" | "onKeyUp" | "onKeyUpCapture" | "onAbort" | "onAbortCapture" | "onCanPlay" | "onCanPlayCapture" | "onCanPlayThrough" | "onCanPlayThroughCapture" | "onDurationChange" | "onDurationChangeCapture" | "onEmptied" | "onEmptiedCapture" | "onEncrypted" | "onEncryptedCapture" | "onEnded" | "onEndedCapture" | "onLoadedData" | "onLoadedDataCapture" | "onLoadedMetadata" | "onLoadedMetadataCapture" | "onLoadStart" | "onLoadStartCapture" | "onPause" | "onPauseCapture" | "onPlay" | "onPlayCapture" | "onPlaying" | "onPlayingCapture" | "onProgress" | "onProgressCapture" | "onRateChange" | "onRateChangeCapture" | "onResize" | "onResizeCapture" | "onSeeked" | "onSeekedCapture" | "onSeeking" | "onSeekingCapture" | "onStalled" | "onStalledCapture" | "onSuspend" | "onSuspendCapture" | "onTimeUpdate" | "onTimeUpdateCapture" | "onVolumeChange" | "onVolumeChangeCapture" | "onWaiting" | "onWaitingCapture" | "onAuxClick" | "onAuxClickCapture" | "onClick" | "onClickCapture" | "onContextMenu" | "onContextMenuCapture" | "onDoubleClick" | "onDoubleClickCapture" | "onDrag" | "onDragCapture" | "onDragEnd" | "onDragEndCapture" | "onDragEnter" | "onDragEnterCapture" | "onDragExit" | "onDragExitCapture" | "onDragLeave" | "onDragLeaveCapture" | "onDragOver" | "onDragOverCapture" | "onDragStart" | "onDragStartCapture" | "onDrop" | "onDropCapture" | "onMouseDown" | "onMouseDownCapture" | "onMouseEnter" | "onMouseLeave" | "onMouseMove" | "onMouseMoveCapture" | "onMouseOut" | "onMouseOutCapture" | "onMouseOver" | "onMouseOverCapture" | "onMouseUp" | "onMouseUpCapture" | "onSelect" | "onSelectCapture" | "onTouchCancel" | "onTouchCancelCapture" | "onTouchEnd" | "onTouchEndCapture" | "onTouchMove" | "onTouchMoveCapture" | "onTouchStart" | "onTouchStartCapture" | "onPointerDown" | "onPointerDownCapture" | "onPointerMove" | "onPointerMoveCapture" | "onPointerUp" | "onPointerUpCapture" | "onPointerCancel" | "onPointerCancelCapture" | "onPointerEnter" | "onPointerLeave" | "onPointerOver" | "onPointerOverCapture" | "onPointerOut" | "onPointerOutCapture" | "onGotPointerCapture" | "onGotPointerCaptureCapture" | "onLostPointerCapture" | "onLostPointerCaptureCapture" | "onScroll" | "onScrollCapture" | "onWheel" | "onWheelCapture" | "onAnimationStart" | "onAnimationStartCapture" | "onAnimationEnd" | "onAnimationEndCapture" | "onAnimationIteration" | "onAnimationIterationCapture" | "onTransitionEnd" | "onTransitionEndCapture" | "defaultChecked" | "defaultValue" | "suppressContentEditableWarning" | "accessKey" | "autoFocus" | "contentEditable" | "contextMenu" | "dir" | "draggable" | "nonce" | "spellCheck" | "radioGroup" | "about" | "datatype" | "inlist" | "prefix" | "rel" | "resource" | "rev" | "typeof" | "vocab" | "autoCapitalize" | "autoCorrect" | "autoSave" | "itemProp" | "itemScope" | "itemType" | "itemID" | "itemRef" | "results" | "security" | "unselectable" | "inputMode" | "is" | keyof React.ClassAttributes<HTMLAnchorElement> | "download" | "hrefLang" | "ping" | "referrerPolicy"> & Omit<{
|
|
@@ -30,7 +30,7 @@ export declare const DropdownAnchor: import("@emotion/styled").StyledComponent<(
|
|
|
30
30
|
as?: import("react").ElementType<any, keyof import("react").JSX.IntrinsicElements> | undefined;
|
|
31
31
|
} & {
|
|
32
32
|
theme?: import("@emotion/react").Theme | undefined;
|
|
33
|
-
} & Pick<React.DetailedHTMLProps<React.ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, "disabled" | "content" | "translate" | "property" | "hidden" | "form" | "slot" | "style" | "title" | "suppressHydrationWarning" | "className" | "id" | "lang" | "name" | "type" | "role" | "tabIndex" | "aria-activedescendant" | "aria-atomic" | "aria-autocomplete" | "aria-braillelabel" | "aria-brailleroledescription" | "aria-busy" | "aria-checked" | "aria-colcount" | "aria-colindex" | "aria-colindextext" | "aria-colspan" | "aria-controls" | "aria-current" | "aria-describedby" | "aria-description" | "aria-details" | "aria-disabled" | "aria-dropeffect" | "aria-errormessage" | "aria-expanded" | "aria-flowto" | "aria-grabbed" | "aria-haspopup" | "aria-hidden" | "aria-invalid" | "aria-keyshortcuts" | "aria-label" | "aria-labelledby" | "aria-level" | "aria-live" | "aria-modal" | "aria-multiline" | "aria-multiselectable" | "aria-orientation" | "aria-owns" | "aria-placeholder" | "aria-posinset" | "aria-pressed" | "aria-readonly" | "aria-relevant" | "aria-required" | "aria-roledescription" | "aria-rowcount" | "aria-rowindex" | "aria-rowindextext" | "aria-rowspan" | "aria-selected" | "aria-setsize" | "aria-sort" | "aria-valuemax" | "aria-valuemin" | "aria-valuenow" | "aria-valuetext" | "children" | "dangerouslySetInnerHTML" | "onCopy" | "onCopyCapture" | "onCut" | "onCutCapture" | "onPaste" | "onPasteCapture" | "onCompositionEnd" | "onCompositionEndCapture" | "onCompositionStart" | "onCompositionStartCapture" | "onCompositionUpdate" | "onCompositionUpdateCapture" | "onFocus" | "onFocusCapture" | "onBlur" | "onBlurCapture" | "onChange" | "onChangeCapture" | "onBeforeInput" | "onBeforeInputCapture" | "onInput" | "onInputCapture" | "onReset" | "onResetCapture" | "onSubmit" | "onSubmitCapture" | "onInvalid" | "onInvalidCapture" | "onLoad" | "onLoadCapture" | "onError" | "onErrorCapture" | "onKeyDown" | "onKeyDownCapture" | "onKeyPress" | "onKeyPressCapture" | "onKeyUp" | "onKeyUpCapture" | "onAbort" | "onAbortCapture" | "onCanPlay" | "onCanPlayCapture" | "onCanPlayThrough" | "onCanPlayThroughCapture" | "onDurationChange" | "onDurationChangeCapture" | "onEmptied" | "onEmptiedCapture" | "onEncrypted" | "onEncryptedCapture" | "onEnded" | "onEndedCapture" | "onLoadedData" | "onLoadedDataCapture" | "onLoadedMetadata" | "onLoadedMetadataCapture" | "onLoadStart" | "onLoadStartCapture" | "onPause" | "onPauseCapture" | "onPlay" | "onPlayCapture" | "onPlaying" | "onPlayingCapture" | "onProgress" | "onProgressCapture" | "onRateChange" | "onRateChangeCapture" | "onResize" | "onResizeCapture" | "onSeeked" | "onSeekedCapture" | "onSeeking" | "onSeekingCapture" | "onStalled" | "onStalledCapture" | "onSuspend" | "onSuspendCapture" | "onTimeUpdate" | "onTimeUpdateCapture" | "onVolumeChange" | "onVolumeChangeCapture" | "onWaiting" | "onWaitingCapture" | "onAuxClick" | "onAuxClickCapture" | "onClick" | "onClickCapture" | "onContextMenu" | "onContextMenuCapture" | "onDoubleClick" | "onDoubleClickCapture" | "onDrag" | "onDragCapture" | "onDragEnd" | "onDragEndCapture" | "onDragEnter" | "onDragEnterCapture" | "onDragExit" | "onDragExitCapture" | "onDragLeave" | "onDragLeaveCapture" | "onDragOver" | "onDragOverCapture" | "onDragStart" | "onDragStartCapture" | "onDrop" | "onDropCapture" | "onMouseDown" | "onMouseDownCapture" | "onMouseEnter" | "onMouseLeave" | "onMouseMove" | "onMouseMoveCapture" | "onMouseOut" | "onMouseOutCapture" | "onMouseOver" | "onMouseOverCapture" | "onMouseUp" | "onMouseUpCapture" | "onSelect" | "onSelectCapture" | "onTouchCancel" | "onTouchCancelCapture" | "onTouchEnd" | "onTouchEndCapture" | "onTouchMove" | "onTouchMoveCapture" | "onTouchStart" | "onTouchStartCapture" | "onPointerDown" | "onPointerDownCapture" | "onPointerMove" | "onPointerMoveCapture" | "onPointerUp" | "onPointerUpCapture" | "onPointerCancel" | "onPointerCancelCapture" | "onPointerEnter" | "onPointerLeave" | "onPointerOver" | "onPointerOverCapture" | "onPointerOut" | "onPointerOutCapture" | "onGotPointerCapture" | "onGotPointerCaptureCapture" | "onLostPointerCapture" | "onLostPointerCaptureCapture" | "onScroll" | "onScrollCapture" | "onWheel" | "onWheelCapture" | "onAnimationStart" | "onAnimationStartCapture" | "onAnimationEnd" | "onAnimationEndCapture" | "onAnimationIteration" | "onAnimationIterationCapture" | "onTransitionEnd" | "onTransitionEndCapture" | "defaultChecked" | "defaultValue" | "suppressContentEditableWarning" | "accessKey" | "autoFocus" | "contentEditable" | "contextMenu" | "dir" | "draggable" | "nonce" | "spellCheck" | "radioGroup" | "about" | "datatype" | "inlist" | "prefix" | "rel" | "resource" | "rev" | "typeof" | "vocab" | "autoCapitalize" | "autoCorrect" | "autoSave" | "itemProp" | "itemScope" | "itemType" | "itemID" | "itemRef" | "results" | "security" | "unselectable" | "inputMode" | "is" | keyof React.ClassAttributes<HTMLButtonElement> | "formAction" | "formEncType" | "formMethod" | "formNoValidate" | "formTarget" | "value"> & Pick<React.DetailedHTMLProps<React.AnchorHTMLAttributes<HTMLAnchorElement>, HTMLAnchorElement>, "content" | "translate" | "property" | "hidden" | "slot" | "style" | "title" | "suppressHydrationWarning" | "className" | "id" | "lang" | "media" | "target" | "type" | "role" | "tabIndex" | "href" | "aria-activedescendant" | "aria-atomic" | "aria-autocomplete" | "aria-braillelabel" | "aria-brailleroledescription" | "aria-busy" | "aria-checked" | "aria-colcount" | "aria-colindex" | "aria-colindextext" | "aria-colspan" | "aria-controls" | "aria-current" | "aria-describedby" | "aria-description" | "aria-details" | "aria-disabled" | "aria-dropeffect" | "aria-errormessage" | "aria-expanded" | "aria-flowto" | "aria-grabbed" | "aria-haspopup" | "aria-hidden" | "aria-invalid" | "aria-keyshortcuts" | "aria-label" | "aria-labelledby" | "aria-level" | "aria-live" | "aria-modal" | "aria-multiline" | "aria-multiselectable" | "aria-orientation" | "aria-owns" | "aria-placeholder" | "aria-posinset" | "aria-pressed" | "aria-readonly" | "aria-relevant" | "aria-required" | "aria-roledescription" | "aria-rowcount" | "aria-rowindex" | "aria-rowindextext" | "aria-rowspan" | "aria-selected" | "aria-setsize" | "aria-sort" | "aria-valuemax" | "aria-valuemin" | "aria-valuenow" | "aria-valuetext" | "children" | "dangerouslySetInnerHTML" | "onCopy" | "onCopyCapture" | "onCut" | "onCutCapture" | "onPaste" | "onPasteCapture" | "onCompositionEnd" | "onCompositionEndCapture" | "onCompositionStart" | "onCompositionStartCapture" | "onCompositionUpdate" | "onCompositionUpdateCapture" | "onFocus" | "onFocusCapture" | "onBlur" | "onBlurCapture" | "onChange" | "onChangeCapture" | "onBeforeInput" | "onBeforeInputCapture" | "onInput" | "onInputCapture" | "onReset" | "onResetCapture" | "onSubmit" | "onSubmitCapture" | "onInvalid" | "onInvalidCapture" | "onLoad" | "onLoadCapture" | "onError" | "onErrorCapture" | "onKeyDown" | "onKeyDownCapture" | "onKeyPress" | "onKeyPressCapture" | "onKeyUp" | "onKeyUpCapture" | "onAbort" | "onAbortCapture" | "onCanPlay" | "onCanPlayCapture" | "onCanPlayThrough" | "onCanPlayThroughCapture" | "onDurationChange" | "onDurationChangeCapture" | "onEmptied" | "onEmptiedCapture" | "onEncrypted" | "onEncryptedCapture" | "onEnded" | "onEndedCapture" | "onLoadedData" | "onLoadedDataCapture" | "onLoadedMetadata" | "onLoadedMetadataCapture" | "onLoadStart" | "onLoadStartCapture" | "onPause" | "onPauseCapture" | "onPlay" | "onPlayCapture" | "onPlaying" | "onPlayingCapture" | "onProgress" | "onProgressCapture" | "onRateChange" | "onRateChangeCapture" | "onResize" | "onResizeCapture" | "onSeeked" | "onSeekedCapture" | "onSeeking" | "onSeekingCapture" | "onStalled" | "onStalledCapture" | "onSuspend" | "onSuspendCapture" | "onTimeUpdate" | "onTimeUpdateCapture" | "onVolumeChange" | "onVolumeChangeCapture" | "onWaiting" | "onWaitingCapture" | "onAuxClick" | "onAuxClickCapture" | "onClick" | "onClickCapture" | "onContextMenu" | "onContextMenuCapture" | "onDoubleClick" | "onDoubleClickCapture" | "onDrag" | "onDragCapture" | "onDragEnd" | "onDragEndCapture" | "onDragEnter" | "onDragEnterCapture" | "onDragExit" | "onDragExitCapture" | "onDragLeave" | "onDragLeaveCapture" | "onDragOver" | "onDragOverCapture" | "onDragStart" | "onDragStartCapture" | "onDrop" | "onDropCapture" | "onMouseDown" | "onMouseDownCapture" | "onMouseEnter" | "onMouseLeave" | "onMouseMove" | "onMouseMoveCapture" | "onMouseOut" | "onMouseOutCapture" | "onMouseOver" | "onMouseOverCapture" | "onMouseUp" | "onMouseUpCapture" | "onSelect" | "onSelectCapture" | "onTouchCancel" | "onTouchCancelCapture" | "onTouchEnd" | "onTouchEndCapture" | "onTouchMove" | "onTouchMoveCapture" | "onTouchStart" | "onTouchStartCapture" | "onPointerDown" | "onPointerDownCapture" | "onPointerMove" | "onPointerMoveCapture" | "onPointerUp" | "onPointerUpCapture" | "onPointerCancel" | "onPointerCancelCapture" | "onPointerEnter" | "onPointerLeave" | "onPointerOver" | "onPointerOverCapture" | "onPointerOut" | "onPointerOutCapture" | "onGotPointerCapture" | "onGotPointerCaptureCapture" | "onLostPointerCapture" | "onLostPointerCaptureCapture" | "onScroll" | "onScrollCapture" | "onWheel" | "onWheelCapture" | "onAnimationStart" | "onAnimationStartCapture" | "onAnimationEnd" | "onAnimationEndCapture" | "onAnimationIteration" | "onAnimationIterationCapture" | "onTransitionEnd" | "onTransitionEndCapture" | "defaultChecked" | "defaultValue" | "suppressContentEditableWarning" | "accessKey" | "autoFocus" | "contentEditable" | "contextMenu" | "dir" | "draggable" | "nonce" | "spellCheck" | "radioGroup" | "about" | "datatype" | "inlist" | "prefix" | "rel" | "resource" | "rev" | "typeof" | "vocab" | "autoCapitalize" | "autoCorrect" | "autoSave" | "itemProp" | "itemScope" | "itemType" | "itemID" | "itemRef" | "results" | "security" | "unselectable" | "inputMode" | "is" | keyof React.ClassAttributes<HTMLAnchorElement> | "download" | "hrefLang" | "ping" | "referrerPolicy">, "ref"> & React.RefAttributes<HTMLAnchorElement | HTMLButtonElement>, "ref">) & React.RefAttributes<HTMLAnchorElement | HTMLButtonElement>) & {
|
|
33
|
+
} & Pick<React.DetailedHTMLProps<React.ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, "disabled" | "name" | "content" | "translate" | "property" | "hidden" | "form" | "slot" | "style" | "title" | "suppressHydrationWarning" | "className" | "id" | "lang" | "type" | "role" | "tabIndex" | "aria-activedescendant" | "aria-atomic" | "aria-autocomplete" | "aria-braillelabel" | "aria-brailleroledescription" | "aria-busy" | "aria-checked" | "aria-colcount" | "aria-colindex" | "aria-colindextext" | "aria-colspan" | "aria-controls" | "aria-current" | "aria-describedby" | "aria-description" | "aria-details" | "aria-disabled" | "aria-dropeffect" | "aria-errormessage" | "aria-expanded" | "aria-flowto" | "aria-grabbed" | "aria-haspopup" | "aria-hidden" | "aria-invalid" | "aria-keyshortcuts" | "aria-label" | "aria-labelledby" | "aria-level" | "aria-live" | "aria-modal" | "aria-multiline" | "aria-multiselectable" | "aria-orientation" | "aria-owns" | "aria-placeholder" | "aria-posinset" | "aria-pressed" | "aria-readonly" | "aria-relevant" | "aria-required" | "aria-roledescription" | "aria-rowcount" | "aria-rowindex" | "aria-rowindextext" | "aria-rowspan" | "aria-selected" | "aria-setsize" | "aria-sort" | "aria-valuemax" | "aria-valuemin" | "aria-valuenow" | "aria-valuetext" | "children" | "dangerouslySetInnerHTML" | "onCopy" | "onCopyCapture" | "onCut" | "onCutCapture" | "onPaste" | "onPasteCapture" | "onCompositionEnd" | "onCompositionEndCapture" | "onCompositionStart" | "onCompositionStartCapture" | "onCompositionUpdate" | "onCompositionUpdateCapture" | "onFocus" | "onFocusCapture" | "onBlur" | "onBlurCapture" | "onChange" | "onChangeCapture" | "onBeforeInput" | "onBeforeInputCapture" | "onInput" | "onInputCapture" | "onReset" | "onResetCapture" | "onSubmit" | "onSubmitCapture" | "onInvalid" | "onInvalidCapture" | "onLoad" | "onLoadCapture" | "onError" | "onErrorCapture" | "onKeyDown" | "onKeyDownCapture" | "onKeyPress" | "onKeyPressCapture" | "onKeyUp" | "onKeyUpCapture" | "onAbort" | "onAbortCapture" | "onCanPlay" | "onCanPlayCapture" | "onCanPlayThrough" | "onCanPlayThroughCapture" | "onDurationChange" | "onDurationChangeCapture" | "onEmptied" | "onEmptiedCapture" | "onEncrypted" | "onEncryptedCapture" | "onEnded" | "onEndedCapture" | "onLoadedData" | "onLoadedDataCapture" | "onLoadedMetadata" | "onLoadedMetadataCapture" | "onLoadStart" | "onLoadStartCapture" | "onPause" | "onPauseCapture" | "onPlay" | "onPlayCapture" | "onPlaying" | "onPlayingCapture" | "onProgress" | "onProgressCapture" | "onRateChange" | "onRateChangeCapture" | "onResize" | "onResizeCapture" | "onSeeked" | "onSeekedCapture" | "onSeeking" | "onSeekingCapture" | "onStalled" | "onStalledCapture" | "onSuspend" | "onSuspendCapture" | "onTimeUpdate" | "onTimeUpdateCapture" | "onVolumeChange" | "onVolumeChangeCapture" | "onWaiting" | "onWaitingCapture" | "onAuxClick" | "onAuxClickCapture" | "onClick" | "onClickCapture" | "onContextMenu" | "onContextMenuCapture" | "onDoubleClick" | "onDoubleClickCapture" | "onDrag" | "onDragCapture" | "onDragEnd" | "onDragEndCapture" | "onDragEnter" | "onDragEnterCapture" | "onDragExit" | "onDragExitCapture" | "onDragLeave" | "onDragLeaveCapture" | "onDragOver" | "onDragOverCapture" | "onDragStart" | "onDragStartCapture" | "onDrop" | "onDropCapture" | "onMouseDown" | "onMouseDownCapture" | "onMouseEnter" | "onMouseLeave" | "onMouseMove" | "onMouseMoveCapture" | "onMouseOut" | "onMouseOutCapture" | "onMouseOver" | "onMouseOverCapture" | "onMouseUp" | "onMouseUpCapture" | "onSelect" | "onSelectCapture" | "onTouchCancel" | "onTouchCancelCapture" | "onTouchEnd" | "onTouchEndCapture" | "onTouchMove" | "onTouchMoveCapture" | "onTouchStart" | "onTouchStartCapture" | "onPointerDown" | "onPointerDownCapture" | "onPointerMove" | "onPointerMoveCapture" | "onPointerUp" | "onPointerUpCapture" | "onPointerCancel" | "onPointerCancelCapture" | "onPointerEnter" | "onPointerLeave" | "onPointerOver" | "onPointerOverCapture" | "onPointerOut" | "onPointerOutCapture" | "onGotPointerCapture" | "onGotPointerCaptureCapture" | "onLostPointerCapture" | "onLostPointerCaptureCapture" | "onScroll" | "onScrollCapture" | "onWheel" | "onWheelCapture" | "onAnimationStart" | "onAnimationStartCapture" | "onAnimationEnd" | "onAnimationEndCapture" | "onAnimationIteration" | "onAnimationIterationCapture" | "onTransitionEnd" | "onTransitionEndCapture" | "defaultChecked" | "defaultValue" | "suppressContentEditableWarning" | "accessKey" | "autoFocus" | "contentEditable" | "contextMenu" | "dir" | "draggable" | "nonce" | "spellCheck" | "radioGroup" | "about" | "datatype" | "inlist" | "prefix" | "rel" | "resource" | "rev" | "typeof" | "vocab" | "autoCapitalize" | "autoCorrect" | "autoSave" | "itemProp" | "itemScope" | "itemType" | "itemID" | "itemRef" | "results" | "security" | "unselectable" | "inputMode" | "is" | keyof React.ClassAttributes<HTMLButtonElement> | "formAction" | "formEncType" | "formMethod" | "formNoValidate" | "formTarget" | "value"> & Pick<React.DetailedHTMLProps<React.AnchorHTMLAttributes<HTMLAnchorElement>, HTMLAnchorElement>, "content" | "translate" | "property" | "hidden" | "slot" | "style" | "title" | "suppressHydrationWarning" | "className" | "id" | "lang" | "media" | "target" | "type" | "role" | "tabIndex" | "href" | "aria-activedescendant" | "aria-atomic" | "aria-autocomplete" | "aria-braillelabel" | "aria-brailleroledescription" | "aria-busy" | "aria-checked" | "aria-colcount" | "aria-colindex" | "aria-colindextext" | "aria-colspan" | "aria-controls" | "aria-current" | "aria-describedby" | "aria-description" | "aria-details" | "aria-disabled" | "aria-dropeffect" | "aria-errormessage" | "aria-expanded" | "aria-flowto" | "aria-grabbed" | "aria-haspopup" | "aria-hidden" | "aria-invalid" | "aria-keyshortcuts" | "aria-label" | "aria-labelledby" | "aria-level" | "aria-live" | "aria-modal" | "aria-multiline" | "aria-multiselectable" | "aria-orientation" | "aria-owns" | "aria-placeholder" | "aria-posinset" | "aria-pressed" | "aria-readonly" | "aria-relevant" | "aria-required" | "aria-roledescription" | "aria-rowcount" | "aria-rowindex" | "aria-rowindextext" | "aria-rowspan" | "aria-selected" | "aria-setsize" | "aria-sort" | "aria-valuemax" | "aria-valuemin" | "aria-valuenow" | "aria-valuetext" | "children" | "dangerouslySetInnerHTML" | "onCopy" | "onCopyCapture" | "onCut" | "onCutCapture" | "onPaste" | "onPasteCapture" | "onCompositionEnd" | "onCompositionEndCapture" | "onCompositionStart" | "onCompositionStartCapture" | "onCompositionUpdate" | "onCompositionUpdateCapture" | "onFocus" | "onFocusCapture" | "onBlur" | "onBlurCapture" | "onChange" | "onChangeCapture" | "onBeforeInput" | "onBeforeInputCapture" | "onInput" | "onInputCapture" | "onReset" | "onResetCapture" | "onSubmit" | "onSubmitCapture" | "onInvalid" | "onInvalidCapture" | "onLoad" | "onLoadCapture" | "onError" | "onErrorCapture" | "onKeyDown" | "onKeyDownCapture" | "onKeyPress" | "onKeyPressCapture" | "onKeyUp" | "onKeyUpCapture" | "onAbort" | "onAbortCapture" | "onCanPlay" | "onCanPlayCapture" | "onCanPlayThrough" | "onCanPlayThroughCapture" | "onDurationChange" | "onDurationChangeCapture" | "onEmptied" | "onEmptiedCapture" | "onEncrypted" | "onEncryptedCapture" | "onEnded" | "onEndedCapture" | "onLoadedData" | "onLoadedDataCapture" | "onLoadedMetadata" | "onLoadedMetadataCapture" | "onLoadStart" | "onLoadStartCapture" | "onPause" | "onPauseCapture" | "onPlay" | "onPlayCapture" | "onPlaying" | "onPlayingCapture" | "onProgress" | "onProgressCapture" | "onRateChange" | "onRateChangeCapture" | "onResize" | "onResizeCapture" | "onSeeked" | "onSeekedCapture" | "onSeeking" | "onSeekingCapture" | "onStalled" | "onStalledCapture" | "onSuspend" | "onSuspendCapture" | "onTimeUpdate" | "onTimeUpdateCapture" | "onVolumeChange" | "onVolumeChangeCapture" | "onWaiting" | "onWaitingCapture" | "onAuxClick" | "onAuxClickCapture" | "onClick" | "onClickCapture" | "onContextMenu" | "onContextMenuCapture" | "onDoubleClick" | "onDoubleClickCapture" | "onDrag" | "onDragCapture" | "onDragEnd" | "onDragEndCapture" | "onDragEnter" | "onDragEnterCapture" | "onDragExit" | "onDragExitCapture" | "onDragLeave" | "onDragLeaveCapture" | "onDragOver" | "onDragOverCapture" | "onDragStart" | "onDragStartCapture" | "onDrop" | "onDropCapture" | "onMouseDown" | "onMouseDownCapture" | "onMouseEnter" | "onMouseLeave" | "onMouseMove" | "onMouseMoveCapture" | "onMouseOut" | "onMouseOutCapture" | "onMouseOver" | "onMouseOverCapture" | "onMouseUp" | "onMouseUpCapture" | "onSelect" | "onSelectCapture" | "onTouchCancel" | "onTouchCancelCapture" | "onTouchEnd" | "onTouchEndCapture" | "onTouchMove" | "onTouchMoveCapture" | "onTouchStart" | "onTouchStartCapture" | "onPointerDown" | "onPointerDownCapture" | "onPointerMove" | "onPointerMoveCapture" | "onPointerUp" | "onPointerUpCapture" | "onPointerCancel" | "onPointerCancelCapture" | "onPointerEnter" | "onPointerLeave" | "onPointerOver" | "onPointerOverCapture" | "onPointerOut" | "onPointerOutCapture" | "onGotPointerCapture" | "onGotPointerCaptureCapture" | "onLostPointerCapture" | "onLostPointerCaptureCapture" | "onScroll" | "onScrollCapture" | "onWheel" | "onWheelCapture" | "onAnimationStart" | "onAnimationStartCapture" | "onAnimationEnd" | "onAnimationEndCapture" | "onAnimationIteration" | "onAnimationIterationCapture" | "onTransitionEnd" | "onTransitionEndCapture" | "defaultChecked" | "defaultValue" | "suppressContentEditableWarning" | "accessKey" | "autoFocus" | "contentEditable" | "contextMenu" | "dir" | "draggable" | "nonce" | "spellCheck" | "radioGroup" | "about" | "datatype" | "inlist" | "prefix" | "rel" | "resource" | "rev" | "typeof" | "vocab" | "autoCapitalize" | "autoCorrect" | "autoSave" | "itemProp" | "itemScope" | "itemType" | "itemID" | "itemRef" | "results" | "security" | "unselectable" | "inputMode" | "is" | keyof React.ClassAttributes<HTMLAnchorElement> | "download" | "hrefLang" | "ping" | "referrerPolicy">, "ref"> & React.RefAttributes<HTMLAnchorElement | HTMLButtonElement>, "ref">) & React.RefAttributes<HTMLAnchorElement | HTMLButtonElement>) & {
|
|
34
34
|
theme?: import("@emotion/react").Theme;
|
|
35
35
|
}) & {
|
|
36
36
|
theme?: import("@emotion/react").Theme;
|