umberto 10.7.3 → 10.7.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +16 -22
- package/package.json +1 -1
- package/scripts/filter/after-post-render/process-variables.cjs +0 -1
- package/scripts/helper/mark-empty-categories.cjs +0 -1
- package/scripts/utils/markdown-it-toc-and-anchor.cjs +5 -7
- package/scripts/utils/pug-to-xml-binding/render-xml-pug-components-in-markdown.cjs +1 -1
- package/src/api-builder/utils/findtargetdoclet.js +1 -1
- package/src/data-converter/converters/jsduck2umberto.js +2 -2
- package/src/data-converter/converters/typedoc/typedocconverter.js +99 -31
- package/src/data-converter/data-collection.js +0 -1
- package/src/data-converter/doclet-collection.js +0 -1
- package/src/tasks/get-project-config.js +1 -1
- package/themes/umberto/layout/gloria/_api-docs/_mixin/_method.pug +5 -3
- package/themes/umberto/layout/gloria/_api-docs/_mixin/_params.pug +14 -7
- package/themes/umberto/layout/gloria/_api-docs/_mixin/_property.pug +3 -3
- package/themes/umberto/layout/gloria/_api-docs/_mixin/_type.pug +1 -5
- package/themes/umberto/layout/gloria/_api-docs/_mixin/type-parameter.pug +1 -1
- package/themes/umberto/layout/gloria/_api-docs/_partial/type-parameters.pug +1 -1
- package/themes/umberto/layout/gloria/_modules/kapa/custom_kapa_styles.css +8 -3
- package/themes/umberto/src/gloria/js/components/fake-devtools.js +3 -3
- package/themes/umberto/src/umberto/js/_apitree.js +1 -1
- package/themes/umberto/src/umberto/js/_pagenavigation.js +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,53 +1,47 @@
|
|
|
1
1
|
Changelog
|
|
2
2
|
=========
|
|
3
3
|
|
|
4
|
-
## [10.7.
|
|
4
|
+
## [10.7.5](https://github.com/cksource/umberto/compare/v10.7.4...v10.7.5) (August 13, 2026)
|
|
5
5
|
|
|
6
6
|
### Bug fixes
|
|
7
7
|
|
|
8
|
-
*
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
## [10.7.2](https://github.com/cksource/umberto/compare/v10.7.1...v10.7.2) (July 16, 2026)
|
|
8
|
+
* The hierarchy of a class or an interface rendered in the API docs built from Typedoc output now contains the full inheritance chain instead of the first level only. Derived classes, derived interfaces, and implementing classes are also resolved transitively, so the "Subclasses", "Implemented by", and "Implements" lists match the behavior of the JSDoc-based pipeline.
|
|
12
9
|
|
|
13
10
|
### Other changes
|
|
14
11
|
|
|
15
|
-
*
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
## [10.7.1](https://github.com/cksource/umberto/compare/v10.7.0...v10.7.1) (July 15, 2026)
|
|
12
|
+
* Unified the rendering of optional properties and parameters in the API documentation in the Gloria theme. Optional members are now marked with the TypeScript question mark suffix, and the separator between a member name and its type no longer contains a space before the colon, matching the TypeScript syntax (for example `options?: Object` instead of `[ options ] : Object`). Previously, optional parameters were wrapped in square brackets and optional properties had the `undefined` type appended to their type lists.
|
|
19
13
|
|
|
20
|
-
### Bug fixes
|
|
21
14
|
|
|
22
|
-
|
|
15
|
+
## [10.7.4](https://github.com/cksource/umberto/compare/v10.7.3...v10.7.4) (July 27, 2026)
|
|
23
16
|
|
|
24
17
|
### Other changes
|
|
25
18
|
|
|
26
|
-
*
|
|
19
|
+
* This release does not include any user-facing changes. It was published solely to verify the release process.
|
|
27
20
|
|
|
28
21
|
|
|
29
|
-
## [10.7.
|
|
22
|
+
## [10.7.3](https://github.com/cksource/umberto/compare/v10.7.2...v10.7.3) (July 22, 2026)
|
|
30
23
|
|
|
31
|
-
###
|
|
24
|
+
### Bug fixes
|
|
32
25
|
|
|
33
|
-
*
|
|
26
|
+
* Fixed live snippets failing to load in browsers that require import maps before module scripts.
|
|
34
27
|
|
|
35
|
-
### Bug fixes
|
|
36
28
|
|
|
37
|
-
|
|
38
|
-
* Moved `chokidar` from `devDependencies` to `dependencies`. It is imported at runtime by the file watcher (`src/tasks/watcher.js`), which ships with the package, so it must be installed for consumers. Previously it resolved only by chance through a hoisted copy in the consumer's tree, which fails when the consumer enables pnpm's `enableGlobalVirtualStore` and the package is linked from the global store, outside the consumer's `node_modules`.
|
|
29
|
+
## [10.7.2](https://github.com/cksource/umberto/compare/v10.7.1...v10.7.2) (July 16, 2026)
|
|
39
30
|
|
|
40
31
|
### Other changes
|
|
41
32
|
|
|
42
|
-
* The
|
|
33
|
+
* Replaced webpack with Rolldown for building theme scripts. The theme bundles are now built as ES modules with code splitting and loaded via `<script type="module">`, keeping dynamically imported dependencies (such as the shiki grammars in the Gloria theme) in separate, lazily loaded chunks. The output targets ES2022 instead of the Babel-transpiled ES5, and `webpack`, `babel-loader`, `@babel/core`, and `@babel/preset-env` are no longer dependencies of the package.
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
## [10.7.1](https://github.com/cksource/umberto/compare/v10.7.0...v10.7.1) (July 15, 2026)
|
|
43
37
|
|
|
38
|
+
### Bug fixes
|
|
44
39
|
|
|
45
|
-
|
|
40
|
+
* Fixed source links for CKEditor 5 packages in API documentation so they now point to the public repository. Links for the latest documentation point to the `master` branch, and links for LTS documentation point to the matching `release-v*` branch.
|
|
46
41
|
|
|
47
42
|
### Other changes
|
|
48
43
|
|
|
49
|
-
*
|
|
50
|
-
* Restored the web-based Google Tag Manager snippets in both Gloria and legacy Umberto themes.
|
|
44
|
+
* Improved the performance of the documentation build. Pug templates of XML components used in Markdown are now compiled once and reused across pages, instead of being recompiled for every component occurrence. This shortens the page generation phase by about 20%.
|
|
51
45
|
|
|
52
46
|
---
|
|
53
47
|
|
package/package.json
CHANGED
|
@@ -200,8 +200,6 @@ module.exports = function markdownItTocAndAnchor( md, options ) {
|
|
|
200
200
|
}
|
|
201
201
|
|
|
202
202
|
const tocArray = [];
|
|
203
|
-
let tocMarkdown = '';
|
|
204
|
-
let tocTokens = [];
|
|
205
203
|
|
|
206
204
|
const slugifyFn = typeof options.slugify === 'function' ? options.slugify : defaultSlugify;
|
|
207
205
|
|
|
@@ -242,8 +240,8 @@ module.exports = function markdownItTocAndAnchor( md, options ) {
|
|
|
242
240
|
} );
|
|
243
241
|
}
|
|
244
242
|
|
|
245
|
-
tocMarkdown = generateTocMarkdownFromArray( tocArray, options );
|
|
246
|
-
tocTokens = markdownItSecondInstance.parse( tocMarkdown, {} );
|
|
243
|
+
const tocMarkdown = generateTocMarkdownFromArray( tocArray, options );
|
|
244
|
+
const tocTokens = markdownItSecondInstance.parse( tocMarkdown, {} );
|
|
247
245
|
|
|
248
246
|
if ( typeof tocTokens[ 0 ] === 'object' && tocTokens[ 0 ].type === 'bullet_list_open' ) {
|
|
249
247
|
const attrs = ( tocTokens[ 0 ].attrs = tocTokens[ 0 ].attrs || [] );
|
|
@@ -280,11 +278,11 @@ module.exports = function markdownItTocAndAnchor( md, options ) {
|
|
|
280
278
|
return false;
|
|
281
279
|
}
|
|
282
280
|
|
|
283
|
-
|
|
281
|
+
const token = state.push( 'toc_open', 'toc', 1 );
|
|
284
282
|
|
|
285
283
|
token.markup = TOC;
|
|
286
|
-
|
|
287
|
-
|
|
284
|
+
state.push( 'toc_body', '', 0 );
|
|
285
|
+
state.push( 'toc_close', 'toc', -1 );
|
|
288
286
|
|
|
289
287
|
state.pos += match[ 0 ].length;
|
|
290
288
|
|
|
@@ -65,7 +65,7 @@ export function findTargetDoclet( docletCollection, options ) {
|
|
|
65
65
|
}
|
|
66
66
|
|
|
67
67
|
if ( collection.isEmpty ) {
|
|
68
|
-
const typedefCollection =
|
|
68
|
+
const typedefCollection = docletCollection.get( `ln:${ structure }` );
|
|
69
69
|
|
|
70
70
|
if ( typedefCollection.isEmpty ) {
|
|
71
71
|
return null;
|
|
@@ -71,13 +71,13 @@ const keyNameMap = {
|
|
|
71
71
|
* @returns {Array}
|
|
72
72
|
*/
|
|
73
73
|
export const jsduck2umberto = data => {
|
|
74
|
-
let parsed
|
|
74
|
+
let parsed;
|
|
75
75
|
const doclets = [];
|
|
76
76
|
|
|
77
77
|
try {
|
|
78
78
|
parsed = JSON.parse( data );
|
|
79
79
|
} catch ( err ) {
|
|
80
|
-
throw new Error( `Failed to convert JSDuck docs to Umberto format. ${ err.stack }
|
|
80
|
+
throw new Error( `Failed to convert JSDuck docs to Umberto format. ${ err.stack }`, { cause: err } );
|
|
81
81
|
}
|
|
82
82
|
|
|
83
83
|
const mainDoclet = parsed;
|
|
@@ -89,6 +89,9 @@ export class TypedocConverter {
|
|
|
89
89
|
this._convertChild( child );
|
|
90
90
|
}
|
|
91
91
|
|
|
92
|
+
// Resolve full inheritance chains while all doclets still carry their original signatures.
|
|
93
|
+
this._buildHierarchy();
|
|
94
|
+
|
|
92
95
|
// Then, when all doclets are specified, let's align types.
|
|
93
96
|
for ( const doclet of this._doclets ) {
|
|
94
97
|
// Skip source if the `file` property is not specified.
|
|
@@ -101,28 +104,6 @@ export class TypedocConverter {
|
|
|
101
104
|
continue;
|
|
102
105
|
}
|
|
103
106
|
|
|
104
|
-
// TODO: Could we get a deep list of all inheritance/derived?
|
|
105
|
-
// Map parent references of classes and interfaces...
|
|
106
|
-
if ( 'augmentsNested' in doclet ) {
|
|
107
|
-
const extendedTypes = doclet._signature.extendedTypes || [];
|
|
108
|
-
|
|
109
|
-
doclet.augmentsNested = extendedTypes.flatMap( getHierarchyCallback( this._typeConverter ) );
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
// ...but also, the derived instances...
|
|
113
|
-
if ( 'descendants' in doclet ) {
|
|
114
|
-
const extendedBy = doclet._signature.extendedBy || [];
|
|
115
|
-
|
|
116
|
-
doclet.descendants = extendedBy.flatMap( getHierarchyCallback( this._typeConverter ) );
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
// ...and implemented interfaces.
|
|
120
|
-
if ( 'implementsNested' in doclet ) {
|
|
121
|
-
const implementedTypes = doclet._signature.implementedTypes || [];
|
|
122
|
-
|
|
123
|
-
doclet.implementsNested = implementedTypes.flatMap( getHierarchyCallback( this._typeConverter ) );
|
|
124
|
-
}
|
|
125
|
-
|
|
126
107
|
// Unify the `_signature` tuple, so all doclets use the same algorithm.
|
|
127
108
|
if ( !Array.isArray( doclet._signature ) ) {
|
|
128
109
|
doclet._signature = [ doclet._signature, doclet._signature ];
|
|
@@ -185,6 +166,92 @@ export class TypedocConverter {
|
|
|
185
166
|
} );
|
|
186
167
|
}
|
|
187
168
|
|
|
169
|
+
/**
|
|
170
|
+
* Fills the `augmentsNested`, `implementsNested`, and `descendants` properties of class and interface doclets
|
|
171
|
+
* with full inheritance chains. Typedoc signatures (`extendedTypes`, `implementedTypes`, `extendedBy`) describe
|
|
172
|
+
* only the first level of the hierarchy, so ancestor references are followed transitively through the converted
|
|
173
|
+
* doclets.
|
|
174
|
+
*
|
|
175
|
+
* The `augmentsNested` chain continues only through ancestors of the same kind. Ancestors of an interface mixed
|
|
176
|
+
* into a class hierarchy (an intersection in `extendedTypes`) extend the list of implemented interfaces instead
|
|
177
|
+
* of the inheritance chain rendered on a page. Descendants are calculated by inverting the resolved ancestor
|
|
178
|
+
* relations, so both directions of the hierarchy stay consistent.
|
|
179
|
+
*
|
|
180
|
+
* @protected
|
|
181
|
+
*/
|
|
182
|
+
_buildHierarchy() {
|
|
183
|
+
const docletsByLongname = new Map( this._doclets.map( doclet => [ doclet.longname, doclet ] ) );
|
|
184
|
+
const hierarchyDoclets = this._doclets.filter( doclet => doclet._signature && 'augmentsNested' in doclet );
|
|
185
|
+
const relationsCache = new Map();
|
|
186
|
+
|
|
187
|
+
const resolveRelations = doclet => {
|
|
188
|
+
if ( relationsCache.has( doclet ) ) {
|
|
189
|
+
return relationsCache.get( doclet );
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
const relations = { augmentsNested: [], implementsNested: [] };
|
|
193
|
+
|
|
194
|
+
// Fill the cache upfront to break potential reference cycles.
|
|
195
|
+
relationsCache.set( doclet, relations );
|
|
196
|
+
|
|
197
|
+
const collect = ( references, relationName ) => {
|
|
198
|
+
for ( const reference of references.flatMap( flattenHierarchyReference ) ) {
|
|
199
|
+
const longname = this._typeConverter.convertReference( reference );
|
|
200
|
+
|
|
201
|
+
relations[ relationName ].push( longname );
|
|
202
|
+
|
|
203
|
+
const ancestor = docletsByLongname.get( longname );
|
|
204
|
+
|
|
205
|
+
if ( !ancestor || !ancestor._signature || !( 'augmentsNested' in ancestor ) ) {
|
|
206
|
+
continue;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
const ancestorRelations = resolveRelations( ancestor );
|
|
210
|
+
|
|
211
|
+
if ( relationName === 'augmentsNested' && ancestor.kind === doclet.kind ) {
|
|
212
|
+
relations.augmentsNested.push( ...ancestorRelations.augmentsNested );
|
|
213
|
+
relations.implementsNested.push( ...ancestorRelations.implementsNested );
|
|
214
|
+
} else {
|
|
215
|
+
relations.implementsNested.push( ...ancestorRelations.augmentsNested, ...ancestorRelations.implementsNested );
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
};
|
|
219
|
+
|
|
220
|
+
collect( doclet._signature.extendedTypes || [], 'augmentsNested' );
|
|
221
|
+
collect( doclet._signature.implementedTypes || [], 'implementsNested' );
|
|
222
|
+
|
|
223
|
+
relations.augmentsNested = [ ...new Set( relations.augmentsNested ) ].filter( name => name !== doclet.longname );
|
|
224
|
+
relations.implementsNested = [ ...new Set( relations.implementsNested ) ].filter( name => name !== doclet.longname );
|
|
225
|
+
|
|
226
|
+
return relations;
|
|
227
|
+
};
|
|
228
|
+
|
|
229
|
+
for ( const doclet of hierarchyDoclets ) {
|
|
230
|
+
const relations = resolveRelations( doclet );
|
|
231
|
+
|
|
232
|
+
doclet.augmentsNested = relations.augmentsNested;
|
|
233
|
+
|
|
234
|
+
if ( 'implementsNested' in doclet ) {
|
|
235
|
+
doclet.implementsNested = relations.implementsNested;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
doclet.descendants = [];
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
for ( const doclet of hierarchyDoclets ) {
|
|
242
|
+
const relations = resolveRelations( doclet );
|
|
243
|
+
const ancestors = new Set( [ ...relations.augmentsNested, ...relations.implementsNested ] );
|
|
244
|
+
|
|
245
|
+
for ( const longname of ancestors ) {
|
|
246
|
+
const ancestor = docletsByLongname.get( longname );
|
|
247
|
+
|
|
248
|
+
if ( ancestor && 'descendants' in ancestor && ancestor.descendants ) {
|
|
249
|
+
ancestor.descendants.push( doclet.longname );
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
|
|
188
255
|
/**
|
|
189
256
|
* @protected
|
|
190
257
|
* @param {BaseReflection} reflection
|
|
@@ -964,17 +1031,18 @@ class TypeConverter {
|
|
|
964
1031
|
}
|
|
965
1032
|
|
|
966
1033
|
/**
|
|
967
|
-
*
|
|
968
|
-
*
|
|
1034
|
+
* Flattens an intersection found in a hierarchy relation (for example, `class Foo extends Mixin( Base )` produces
|
|
1035
|
+
* `Base & SomeInterface` in `extendedTypes`) into a list of plain references.
|
|
1036
|
+
*
|
|
1037
|
+
* @param {AvailableTypes} reference
|
|
1038
|
+
* @returns {Array.<ReferenceType>}
|
|
969
1039
|
*/
|
|
970
|
-
function
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
}
|
|
1040
|
+
function flattenHierarchyReference( reference ) {
|
|
1041
|
+
if ( reference.type === 'intersection' ) {
|
|
1042
|
+
return reference.types;
|
|
1043
|
+
}
|
|
975
1044
|
|
|
976
|
-
|
|
977
|
-
};
|
|
1045
|
+
return [ reference ];
|
|
978
1046
|
}
|
|
979
1047
|
|
|
980
1048
|
function mapIndexSignatureObject( subItem, index ) {
|
|
@@ -137,7 +137,7 @@ function getConfigurationFile( configPath ) {
|
|
|
137
137
|
// The configuration file should be a proper JSON object.
|
|
138
138
|
return JSON.parse( fs.readFileSync( configPath, 'utf8' ) );
|
|
139
139
|
} catch ( err ) {
|
|
140
|
-
throw new Error( 'Error when reading umberto.json: ' + err );
|
|
140
|
+
throw new Error( 'Error when reading umberto.json: ' + err, { cause: err } );
|
|
141
141
|
}
|
|
142
142
|
}
|
|
143
143
|
|
|
@@ -26,17 +26,19 @@ mixin method( met )
|
|
|
26
26
|
code.api-item-heading__code
|
|
27
27
|
a.doc.b-link( class="member-name" href="#" + id ) #{ met.name }
|
|
28
28
|
|
|
29
|
-
//- params ( param1,
|
|
29
|
+
//- params ( param1, param2? )
|
|
30
30
|
| (
|
|
31
31
|
if isNonEmptyArray( met.params )
|
|
32
32
|
each param, index in met.params
|
|
33
33
|
if param.optional
|
|
34
|
-
|
|
|
34
|
+
| #{ param.name }?
|
|
35
35
|
else
|
|
36
36
|
| #{ param.name }
|
|
37
37
|
if ( param.subParamsString )
|
|
38
38
|
//- Allow rendering HTML from the `subParamsString` as it may contain links to other pages.
|
|
39
|
-
|
|
39
|
+
//- The string is prebuilt by the shared `api-builder` with the legacy `[name]`
|
|
40
|
+
//- convention for optional members, so convert it to the `name?` syntax here.
|
|
41
|
+
| !{ param.subParamsString.replace( /\[([\w$.]+)\]/g, '$1?' ) }
|
|
40
42
|
if index < met.params.length - 1
|
|
41
43
|
|,
|
|
42
44
|
else
|
|
@@ -14,21 +14,28 @@ mixin paramsMixin ( params, level, title )
|
|
|
14
14
|
|
|
15
15
|
dt
|
|
16
16
|
code
|
|
17
|
+
//- Consecutive piped text lines are joined with a newline, which renders as
|
|
18
|
+
//- a space. To keep the TypeScript-style `name?: Type` notation, the colon
|
|
19
|
+
//- must live in the same text node as the name.
|
|
20
|
+
- const hasTypes = isNonEmptyArray( param.types );
|
|
21
|
+
|
|
17
22
|
if isComputedProperty
|
|
18
23
|
- const [ parentParam, nestedParam ] = param.name.split( '.' );
|
|
19
24
|
|
|
20
25
|
| #{ parentParam }
|
|
21
26
|
i
|
|
22
27
|
| #{ nestedParam }
|
|
23
|
-
|
|
24
|
-
|
|
28
|
+
if hasTypes
|
|
29
|
+
| :!{ ' ' }
|
|
30
|
+
+type( param.types )
|
|
25
31
|
else
|
|
26
|
-
|
|
32
|
+
- const displayName = param.optional ? `${ param.name }?` : param.name;
|
|
27
33
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
34
|
+
if hasTypes
|
|
35
|
+
| #{ displayName }:!{ ' ' }
|
|
36
|
+
+type( param.types )
|
|
37
|
+
else
|
|
38
|
+
| #{ displayName }
|
|
32
39
|
|
|
33
40
|
dd
|
|
34
41
|
if ( param.description )
|
|
@@ -19,11 +19,11 @@ mixin property( prop )
|
|
|
19
19
|
h3
|
|
20
20
|
div.api-item-heading
|
|
21
21
|
code.api-item-heading__code
|
|
22
|
-
a.doc.b-link( class="member-name" href="#" + prop.id ) #{ prop.name }
|
|
22
|
+
a.doc.b-link( class="member-name" href="#" + prop.id ) #{ prop.optional ? prop.name + '?' : prop.name }
|
|
23
23
|
|
|
24
24
|
if isNonEmptyArray( prop.types )
|
|
25
|
-
|
|
|
26
|
-
+type( prop.types
|
|
25
|
+
| :!{' '}
|
|
26
|
+
+type( prop.types )
|
|
27
27
|
if isNonEmptyArray( prop.badges )
|
|
28
28
|
+tagWrapper()
|
|
29
29
|
each badge in prop.badges
|
|
@@ -1,16 +1,12 @@
|
|
|
1
1
|
include ./_link-or-text.pug
|
|
2
2
|
|
|
3
|
-
mixin type( types
|
|
3
|
+
mixin type( types )
|
|
4
4
|
each nameOrObject, index in types
|
|
5
5
|
+renderType( nameOrObject )
|
|
6
6
|
|
|
7
7
|
if index < types.length - 1
|
|
8
8
|
| !{ ' | ' }
|
|
9
9
|
|
|
10
|
-
if ( isOptional && !types.includes( 'undefined' ) )
|
|
11
|
-
| !{ ' | ' }
|
|
12
|
-
+renderType( 'undefined' )
|
|
13
|
-
|
|
14
10
|
//- TODO: Description.
|
|
15
11
|
//-
|
|
16
12
|
//- @param {String|*} inlineObjectOrType
|
|
@@ -8,7 +8,7 @@ mixin typeParameter( type )
|
|
|
8
8
|
//- We mark most TypeScript types as `object`, as their structure is complex.
|
|
9
9
|
//- Hence, it does not really make sense to show that a type extends an unknown `object`.
|
|
10
10
|
if ( type.value && type.value[ 0 ] !== 'object' )
|
|
11
|
-
| !{'
|
|
11
|
+
| !{': '}
|
|
12
12
|
if ( type.isExtending )
|
|
13
13
|
i !{ 'extends ' }
|
|
14
14
|
+type( type.value )
|
|
@@ -18,7 +18,7 @@ if isNonEmptyArray( data.typeParameters )
|
|
|
18
18
|
//- We mark most TypeScript types as `object`, as their structure is complex.
|
|
19
19
|
//- Hence, it does not really make sense to show that a type extends an unknown `object`.
|
|
20
20
|
if ( type.value && type.value[ 0 ] !== 'object' )
|
|
21
|
-
| !{'
|
|
21
|
+
| !{': '}
|
|
22
22
|
if ( type.isExtending )
|
|
23
23
|
i !{ 'extends ' }
|
|
24
24
|
+type( type.value )
|
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license Copyright (c) 2017-2026, CKSource Holding sp. z o.o. All rights reserved.
|
|
3
|
+
* For licensing, see LICENSE.md.
|
|
4
|
+
*/
|
|
5
|
+
|
|
1
6
|
/* Style for the floating button. */
|
|
2
7
|
#kapa-button div > img + p {
|
|
3
8
|
position: relative;
|
|
@@ -11,9 +16,9 @@
|
|
|
11
16
|
|
|
12
17
|
/* Style for hyperlinks inside the AI's answer. */
|
|
13
18
|
#kapa-modal-content
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
19
|
+
.scrollable-container
|
|
20
|
+
.mantine-Title-root + div
|
|
21
|
+
a
|
|
17
22
|
{
|
|
18
23
|
font-weight: normal !important;
|
|
19
24
|
color: #743CCD !important;
|
|
@@ -570,7 +570,7 @@ class ObjectViewer extends HTMLElement {
|
|
|
570
570
|
}
|
|
571
571
|
|
|
572
572
|
createObjectPreview( data, isArray ) {
|
|
573
|
-
let previewContent
|
|
573
|
+
let previewContent;
|
|
574
574
|
|
|
575
575
|
if ( isArray ) {
|
|
576
576
|
previewContent = html.span( { class: 'c-object-viewer__preview' },
|
|
@@ -640,8 +640,8 @@ class ObjectViewer extends HTMLElement {
|
|
|
640
640
|
}
|
|
641
641
|
|
|
642
642
|
formatPrimitiveValue( value ) {
|
|
643
|
-
let className
|
|
644
|
-
let textContent
|
|
643
|
+
let className;
|
|
644
|
+
let textContent;
|
|
645
645
|
|
|
646
646
|
switch ( typeof value ) {
|
|
647
647
|
case 'string':
|
|
@@ -44,7 +44,7 @@ export function scrollApiTree() {
|
|
|
44
44
|
const sideNavScrollTop = Number( window.localStorage.getItem( storageKey ) );
|
|
45
45
|
const activeTreeItemClass = 'tree__item__wrapper--active';
|
|
46
46
|
const activeTreeItem = $( `div.side-navigation .${ activeTreeItemClass }` );
|
|
47
|
-
let activeTreeItemTop
|
|
47
|
+
let activeTreeItemTop;
|
|
48
48
|
const bound = 50; // Offset from top and bottom of side nav.
|
|
49
49
|
|
|
50
50
|
if ( activeTreeItem.length ) {
|