Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Jlicon migration #7700

Merged
merged 102 commits into from Jan 7, 2020
Merged
Show file tree
Hide file tree
Changes from 91 commits
Commits
Show all changes
102 commits
Select commit Hold shift + click to select a range
0f809bb
starting work on JLIcon, to be used as an icon class wrapper
telamonian Oct 7, 2019
efa1d43
dynamically create JLIcon class within a function
telamonian Oct 7, 2019
4f1638c
added static JLIcon.element, returns an HTMLElement
telamonian Oct 7, 2019
8624db8
set up ref forwarding in JLIcon
telamonian Oct 7, 2019
c326626
simplified typing of createIcon return type
telamonian Oct 7, 2019
f762440
all of the wrapped icons now get autogenerated by `integrity`
telamonian Oct 7, 2019
4539af9
added explicitly declared return type to `createIcon`
telamonian Oct 9, 2019
268905d
simplified createIcon function by refactoring it into JLIcon class
telamonian Oct 11, 2019
d5b42f9
refactored JLIcon.react from accessor => property
telamonian Oct 12, 2019
b6c3b38
fixed up docstrings in JLIcon namespace
telamonian Oct 12, 2019
e75530c
experimenting with blending phosphor/react vdom
telamonian Oct 12, 2019
6c23a2d
all tabbar icons now rendered by blended react/phosphor vdom elements
telamonian Oct 13, 2019
536d45e
fixed sidebar tab icons; styling still isn't right
telamonian Oct 13, 2019
0277f04
integrity
telamonian Oct 13, 2019
4e2df2f
fixing up the text editor icon
telamonian Oct 14, 2019
768125b
fixed text editor icon name
telamonian Oct 14, 2019
cbd6730
progress fixing text editor icon
telamonian Oct 14, 2019
b845879
finished fixing text editor icon
telamonian Oct 14, 2019
79469c6
human readability formatting pass of filetype icon svg
telamonian Oct 14, 2019
a366024
switch filebrowser to newest JLIcon icon handling
telamonian Oct 14, 2019
06c5173
finally got react to parse/render bare svg element without outer div
telamonian Oct 14, 2019
dd721e9
bugfix for camelCase function
telamonian Oct 14, 2019
36ac7f1
fixed container handling by JLIcon methods
telamonian Oct 14, 2019
9297f0c
fixed styling of tab manager tab icons
telamonian Oct 14, 2019
1704c4e
fixed memory leak in browser icons; updates for latest version of hpass
telamonian Oct 14, 2019
68a43f1
fixed memory leak; JLIcon nows cleans up after itself when passed to …
telamonian Oct 14, 2019
1771420
post phosphor => lumino rebase cleanup
telamonian Dec 19, 2019
036c9fd
progress
telamonian Dec 24, 2019
34ca1ce
progress
telamonian Dec 24, 2019
c7e5b82
JLIcon prototype is now feature complete and lumino vdom friendly
telamonian Dec 25, 2019
22b0bf8
type/signature fixes
telamonian Dec 25, 2019
6a048c3
fixed bug in static Map init
telamonian Dec 25, 2019
b6786ba
fixed tabmanager icon styling
telamonian Dec 25, 2019
db35c74
fixed style for dockpanel tab icons
telamonian Dec 25, 2019
6796d22
signature cleanup
telamonian Dec 25, 2019
eb5bea3
simplified JLIcon styling for lumino; moved all tab icons to JLIcon
telamonian Dec 25, 2019
a882925
docs and integrity
telamonian Dec 25, 2019
9bbc82f
post-rebase cleanup and bugfixes
telamonian Dec 25, 2019
ed68067
integrity
telamonian Dec 25, 2019
e46395c
picked lint
telamonian Dec 25, 2019
6203578
configure all linters to ignore generated iconimports.ts
telamonian Dec 25, 2019
57364cc
began migrating batch of 17 icons from theme-x-extension to ui-compon…
telamonian Dec 26, 2019
2e21f9a
continuing migration of batch of 17 icons
telamonian Dec 26, 2019
981806c
canonicalized names of migrated icons
telamonian Dec 26, 2019
f535037
cleaned up/annotated migrated icon svgs
telamonian Dec 26, 2019
6369282
improved/robustified the JLIcon.get() icon lookup method
telamonian Dec 26, 2019
8d8bb4f
migrated icons in `settingeditor` pkg to JLIcon
telamonian Dec 26, 2019
81d9d81
migreated icons in `filebrowser` pkg to JLIcon
telamonian Dec 26, 2019
836aac3
prevent redundant rerenders of icons created by JLIcon.element()
telamonian Dec 26, 2019
86a1053
refactor of JLIcon.get into JLIcon.getElement and JLIcon.getReact
telamonian Dec 27, 2019
982a621
removed all refs to defaultIconRegistry outside of ui-components pkgs
telamonian Dec 30, 2019
0630035
picked lint
telamonian Dec 30, 2019
fc82b8d
fix filebrowser unittests
telamonian Dec 31, 2019
a7566c2
removed refs to defaultIconReact and IIconregistry from non ui-x pkgs
telamonian Dec 31, 2019
68a8c33
fixed icon label rendering bug
telamonian Dec 31, 2019
322c3e5
fixed icon titles
telamonian Dec 31, 2019
880713e
improve svg loader in storybook's webpack
telamonian Dec 31, 2019
1816b1d
finished moving all icons from theme-x-extension => ui-components
telamonian Dec 31, 2019
5504391
finished cleaning all icons out of theme-x-extension packages
telamonian Dec 31, 2019
14b1201
fixed the names of the arrow icons
telamonian Dec 31, 2019
fd73ffe
fixed raw svg for arrow icons
telamonian Jan 1, 2020
a22539d
migrated Collapse to JLIcon
telamonian Jan 1, 2020
599304e
fix unittests
telamonian Jan 1, 2020
f80ab28
fix usage CI
telamonian Jan 1, 2020
73abf86
migrated all jupyter icon and most arrow icon usages to JLIcon
telamonian Jan 1, 2020
a634697
icon renaming
telamonian Jan 2, 2020
c2779fd
more icon renaming
telamonian Jan 2, 2020
36362ca
finished annotating all svg icons for themeability
telamonian Jan 2, 2020
5ae1436
improved JLIcon._get to allow for dynamic lookup on multiple classNames
telamonian Jan 2, 2020
4dfb7e3
ellipsis and circle icon migrated to JLIcon
telamonian Jan 2, 2020
40d8438
integrity
telamonian Jan 2, 2020
52a078d
migrated undo and finished migrating ellipsis icons to JLIcon
telamonian Jan 2, 2020
c388056
integrity
telamonian Jan 2, 2020
ba65ce8
fixes #7575: centered v alignment of breadcrumbs home icon
telamonian Jan 2, 2020
b515336
removed deprecated IconItem
telamonian Jan 2, 2020
385ef45
migrated search icons
telamonian Jan 3, 2020
b96a7fd
fixed search and caret icon visual regressions
telamonian Jan 3, 2020
f7bd783
removed deprecated "selected" versions of svg icons
telamonian Jan 3, 2020
f749ef0
migrated running item icons to JLIcon
telamonian Jan 3, 2020
7b6baee
more icon cleanup and migration
telamonian Jan 3, 2020
88fcf31
first pass at icon cleanup/migration finished
telamonian Jan 3, 2020
d46084e
migrated select element icon to JLIcon
telamonian Jan 3, 2020
47b0434
added CSS for inverting icon colors, and for changing them on hover
telamonian Jan 3, 2020
08173c5
finished fixing/migrating the close icons
telamonian Jan 3, 2020
656d7f5
set up all in one busy/close/close-circle icon
telamonian Jan 3, 2020
0718260
removed final vestiges of deprecated IconRegistry from codebase
telamonian Jan 3, 2020
eb8c71d
upgraded lumino deps to pull latest advances in virtualdom icon handling
telamonian Jan 3, 2020
b30f505
finished cleaning/migrating the caret icons
telamonian Jan 4, 2020
d3ca2b8
consolidated icon css in ui-components package
telamonian Jan 4, 2020
e98d72e
finished cleaning up icons.css
telamonian Jan 4, 2020
acd909b
added jest-raw-loader to fix some issues with svg icon tests
telamonian Jan 6, 2020
1ac461e
add data-icon attribute
Jan 6, 2020
fe9b305
Add a className to the breadcrump ellipsis
Jan 6, 2020
a2accb9
Update tests
Jan 6, 2020
73b8970
integrity
Jan 6, 2020
532e8eb
fixed all tests in test-apputils
telamonian Jan 6, 2020
e57d80b
Merge branch 'jlicon_migration' of github.com:telamonian/jupyterlab i…
telamonian Jan 6, 2020
5aac0f3
post-merge fixes
telamonian Jan 6, 2020
160d4de
Pin nbformat for now
Jan 6, 2020
240733b
also pin nbformat in the windows CI
telamonian Jan 6, 2020
2e7be84
remove pins
Jan 6, 2020
6431b9b
fix pipeline config
Jan 6, 2020
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
29 changes: 15 additions & 14 deletions .eslintignore
@@ -1,24 +1,25 @@
node_modules
**/node_modules
**/lib
**/build
**/lib
**/node_modules
**/static
jupyterlab/schemas
jupyterlab/themes
jupyterlab/geckodriver
jupyterlab/staging/yarn.js
jupyterlab/chrome-test.js
jupyterlab/staging/index.js
tests/**/coverage

dev_mode/index.js
dev_mode/schemas
!dev_mode/static/index.out.js
dev_mode/static
dev_mode/themes
dev_mode/workspaces
docs/_build
docs/api
examples/app/build
examples/app/themes
examples/app/schemas
examples/app/themes
examples/chrome-example-test.js
tests/**/coverage
docs/_build
docs/api
!dev_mode/static/index.out.js
jupyterlab/chrome-test.js
jupyterlab/geckodriver
jupyterlab/schemas
jupyterlab/staging/index.js
jupyterlab/staging/yarn.js
jupyterlab/themes
packages/ui-components/src/icon/iconimports.ts
25 changes: 13 additions & 12 deletions .prettierignore
@@ -1,23 +1,24 @@
node_modules
**/build
**/node_modules
**/lib
**/build
**/package.json
**/static
jupyterlab/schemas
jupyterlab/themes
jupyterlab/geckodriver
jupyterlab/staging/yarn.js
jupyterlab/staging/index.js
tests/**/coverage

.eggs
dev_mode/index.js
dev_mode/schemas
dev_mode/static
dev_mode/themes
dev_mode/workspaces
docs/_build
docs/api
examples/app/build
examples/app/themes
examples/app/schemas
tests/**/coverage
docs/_build
docs/api
**/package.json
.eggs
jupyterlab/schemas
jupyterlab/themes
jupyterlab/geckodriver
jupyterlab/staging/yarn.js
jupyterlab/staging/index.js
packages/ui-components/src/icon/iconimports.ts
2 changes: 1 addition & 1 deletion buildutils/package.json
Expand Up @@ -38,7 +38,7 @@
"watch": "tsc -w --listEmittedFiles"
},
"dependencies": {
"@lumino/coreutils": "^1.4.0",
"@lumino/coreutils": "^1.4.2",
"@yarnpkg/lockfile": "^1.1.0",
"child_process": "~1.0.2",
"commander": "~4.0.1",
Expand Down
32 changes: 16 additions & 16 deletions buildutils/src/ensure-package.ts
Expand Up @@ -21,17 +21,13 @@ const HEADER_TEMPLATE = `
`;

const ICON_IMPORTS_TEMPLATE = `
import { Icon } from './interfaces';
import { JLIcon } from './jlicon';

// icon svg import statements
{{iconImportStatements}}

// defaultIcons definition
export namespace IconImports {
export const defaultIcons: ReadonlyArray<Icon.IModel> = [
{{iconModelDeclarations}}
];
}
// JLIcon instance construction
{{jliconConstruction}}
`;

const ICON_CSS_CLASSES_TEMPLATE = `
Expand Down Expand Up @@ -368,37 +364,41 @@ export async function ensureUiComponents(

// build the per-icon import code
let _iconImportStatements: string[] = [];
let _iconModelDeclarations: string[] = [];
let _jliconConstruction: string[] = [];
svgs.forEach(svg => {
const name = utils.stem(svg);
const svgpath = path
.relative(iconSrcDir, svg)
.split(path.sep)
.join('/');

const svgname = utils.camelCase(name) + 'Svg';
const iconname = utils.camelCase(name) + 'Icon';

if (dorequire) {
// load the icon svg using `require`
_iconModelDeclarations.push(
`{ name: '${name}', svg: require('${svgpath}').default }`
_jliconConstruction.push(
`export const ${iconname} = new JLIcon({ name: '${name}', svgstr: require('${svgpath}').default });`
);
} else {
// load the icon svg using `import`
const nameCamel = utils.camelCase(name) + 'Svg';
_iconImportStatements.push(`import ${svgname} from '${svgpath}';`);

_iconImportStatements.push(`import ${nameCamel} from '${svgpath}';`);
_iconModelDeclarations.push(`{ name: '${name}', svg: ${nameCamel} }`);
_jliconConstruction.push(
`export const ${iconname} = new JLIcon({ name: '${name}', svgstr: ${svgname} });`
);
}
});
const iconImportStatements = _iconImportStatements.join('\n');
const iconModelDeclarations = _iconModelDeclarations.join(',\n');
const jliconConstruction = _jliconConstruction.join('\n');

// generate the actual contents of the iconImports file
const iconImportsPath = path.join(iconSrcDir, 'iconimports.ts');
const iconImportsContents = utils.fromTemplate(
HEADER_TEMPLATE + ICON_IMPORTS_TEMPLATE,
{ funcName, iconImportStatements, iconModelDeclarations }
{ funcName, iconImportStatements, jliconConstruction }
);
messages.push(...ensureFile(iconImportsPath, iconImportsContents));
messages.push(...ensureFile(iconImportsPath, iconImportsContents, false));

/* support for deprecated icon CSS classes */
const iconCSSDir = path.join(pkgPath, 'style');
Expand Down
24 changes: 12 additions & 12 deletions dev_mode/package.json
Expand Up @@ -170,18 +170,18 @@
"@jupyterlab/vdom": "~2.0.0-alpha.4",
"@jupyterlab/vdom-extension": "~2.0.0-alpha.4",
"@jupyterlab/vega5-extension": "~2.0.0-alpha.4",
"@lumino/algorithm": "^1.2.1",
"@lumino/application": "^1.7.4",
"@lumino/commands": "^1.9.0",
"@lumino/coreutils": "^1.4.0",
"@lumino/disposable": "^1.3.2",
"@lumino/domutils": "^1.1.5",
"@lumino/dragdrop": "^1.4.2",
"@lumino/messaging": "^1.3.1",
"@lumino/properties": "^1.1.4",
"@lumino/signaling": "^1.3.2",
"@lumino/virtualdom": "^1.2.1",
"@lumino/widgets": "^1.9.4",
"@lumino/algorithm": "^1.2.3",
"@lumino/application": "^1.7.7",
"@lumino/commands": "^1.9.1",
"@lumino/coreutils": "^1.4.2",
"@lumino/disposable": "^1.3.4",
"@lumino/domutils": "^1.1.7",
"@lumino/dragdrop": "^1.4.4",
"@lumino/messaging": "^1.3.3",
"@lumino/properties": "^1.1.6",
"@lumino/signaling": "^1.3.4",
"@lumino/virtualdom": "^1.4.0",
"@lumino/widgets": "^1.9.7",
"react": "~16.9.0",
"react-dom": "~16.9.0"
},
Expand Down
4 changes: 2 additions & 2 deletions examples/cell/package.json
Expand Up @@ -15,8 +15,8 @@
"@jupyterlab/rendermime": "^2.0.0-alpha.4",
"@jupyterlab/services": "^5.0.0-alpha.4",
"@jupyterlab/theme-light-extension": "^2.0.0-alpha.4",
"@lumino/commands": "^1.9.0",
"@lumino/widgets": "^1.9.4",
"@lumino/commands": "^1.9.1",
"@lumino/widgets": "^1.9.7",
"es6-promise": "~4.2.8"
},
"devDependencies": {
Expand Down
4 changes: 2 additions & 2 deletions examples/console/package.json
Expand Up @@ -13,8 +13,8 @@
"@jupyterlab/rendermime": "^2.0.0-alpha.4",
"@jupyterlab/services": "^5.0.0-alpha.4",
"@jupyterlab/theme-light-extension": "^2.0.0-alpha.4",
"@lumino/commands": "^1.9.0",
"@lumino/widgets": "^1.9.4",
"@lumino/commands": "^1.9.1",
"@lumino/widgets": "^1.9.7",
"es6-promise": "~4.2.8"
},
"devDependencies": {
Expand Down
7 changes: 3 additions & 4 deletions examples/filebrowser/package.json
Expand Up @@ -16,10 +16,9 @@
"@jupyterlab/fileeditor": "^2.0.0-alpha.4",
"@jupyterlab/services": "^5.0.0-alpha.4",
"@jupyterlab/theme-light-extension": "^2.0.0-alpha.4",
"@jupyterlab/ui-components": "^2.0.0-alpha.4",
"@lumino/algorithm": "^1.2.1",
"@lumino/commands": "^1.9.0",
"@lumino/widgets": "^1.9.4",
"@lumino/algorithm": "^1.2.3",
"@lumino/commands": "^1.9.1",
"@lumino/widgets": "^1.9.7",
"es6-promise": "~4.2.8"
},
"devDependencies": {
Expand Down
7 changes: 2 additions & 5 deletions examples/filebrowser/src/index.ts
Expand Up @@ -34,8 +34,6 @@ import { FileBrowser, FileBrowserModel } from '@jupyterlab/filebrowser';

import { FileEditorFactory } from '@jupyterlab/fileeditor';

import { defaultIconRegistry } from '@jupyterlab/ui-components';

function main(): void {
let manager = new ServiceManager();
void manager.ready.then(() => {
Expand Down Expand Up @@ -88,8 +86,7 @@ function createApp(manager: ServiceManager.IManager): void {
let commands = new CommandRegistry();

let fbModel = new FileBrowserModel({
manager: docManager,
iconRegistry: defaultIconRegistry
manager: docManager
});
let fbWidget = new FileBrowser({
id: 'filebrowser',
Expand All @@ -98,7 +95,7 @@ function createApp(manager: ServiceManager.IManager): void {

// Add a creator toolbar item.
let creator = new ToolbarButton({
iconClassName: 'jp-AddIcon jp-Icon jp-Icon-16',
iconClass: 'jp-AddIcon jp-Icon jp-Icon-16',
onClick: () => {
void docManager
.newUntitled({
Expand Down
4 changes: 2 additions & 2 deletions examples/notebook/package.json
Expand Up @@ -18,8 +18,8 @@
"@jupyterlab/rendermime": "^2.0.0-alpha.4",
"@jupyterlab/services": "^5.0.0-alpha.4",
"@jupyterlab/theme-light-extension": "^2.0.0-alpha.4",
"@lumino/commands": "^1.9.0",
"@lumino/widgets": "^1.9.4",
"@lumino/commands": "^1.9.1",
"@lumino/widgets": "^1.9.7",
"es6-promise": "~4.2.8"
},
"devDependencies": {
Expand Down
2 changes: 1 addition & 1 deletion examples/terminal/package.json
Expand Up @@ -11,7 +11,7 @@
"@jupyterlab/services": "^5.0.0-alpha.4",
"@jupyterlab/terminal": "^2.0.0-alpha.4",
"@jupyterlab/theme-light-extension": "^2.0.0-alpha.4",
"@lumino/widgets": "^1.9.4",
"@lumino/widgets": "^1.9.7",
"es6-promise": "~4.2.8"
},
"devDependencies": {
Expand Down
2 changes: 1 addition & 1 deletion jupyterlab/tests/mock_packages/mimeextension/package.json
Expand Up @@ -3,7 +3,7 @@
"version": "0.3.0",
"private": true,
"dependencies": {
"@lumino/widgets": "^1.9.4"
"@lumino/widgets": "^1.9.7"
},
"jupyterlab": {
"mimeExtension": true
Expand Down
9 changes: 5 additions & 4 deletions packages/application-extension/package.json
Expand Up @@ -42,10 +42,11 @@
"@jupyterlab/property-inspector": "^2.0.0-alpha.4",
"@jupyterlab/settingregistry": "^2.0.0-alpha.4",
"@jupyterlab/statedb": "^2.0.0-alpha.4",
"@lumino/algorithm": "^1.2.1",
"@lumino/coreutils": "^1.4.0",
"@lumino/disposable": "^1.3.2",
"@lumino/widgets": "^1.9.4",
"@jupyterlab/ui-components": "^2.0.0-alpha.4",
"@lumino/algorithm": "^1.2.3",
"@lumino/coreutils": "^1.4.2",
"@lumino/disposable": "^1.3.4",
"@lumino/widgets": "^1.9.7",
"react": "~16.9.0"
},
"devDependencies": {
Expand Down
20 changes: 11 additions & 9 deletions packages/application-extension/src/index.tsx
Expand Up @@ -26,15 +26,17 @@ import {

import { PathExt, URLExt } from '@jupyterlab/coreutils';

import { IStateDB } from '@jupyterlab/statedb';

import { ISettingRegistry } from '@jupyterlab/settingregistry';

import {
IPropertyInspectorProvider,
SideBarPropertyInspectorProvider
} from '@jupyterlab/property-inspector';

import { ISettingRegistry } from '@jupyterlab/settingregistry';

import { IStateDB } from '@jupyterlab/statedb';

import { buildIcon } from '@jupyterlab/ui-components';

import { each, iter, toArray } from '@lumino/algorithm';

import { PromiseDelegate } from '@lumino/coreutils';
Expand Down Expand Up @@ -605,7 +607,7 @@ function addCommands(app: JupyterLab, palette: ICommandPalette): void {
commands.addCommand(CommandIDs.close, {
label: () => 'Close Tab',
isEnabled: () =>
!!shell.currentWidget && !!shell.currentWidget.title.closable,
!!shell.currentWidget && shell.currentWidget.title.closable,
execute: () => {
if (shell.currentWidget) {
shell.currentWidget.close();
Expand Down Expand Up @@ -673,7 +675,7 @@ function addCommands(app: JupyterLab, palette: ICommandPalette): void {
});

app.commands.addCommand(CommandIDs.toggleLeftArea, {
label: args => 'Show Left Sidebar',
label: () => 'Show Left Sidebar',
execute: () => {
if (shell.leftCollapsed) {
shell.expandLeft();
Expand All @@ -690,7 +692,7 @@ function addCommands(app: JupyterLab, palette: ICommandPalette): void {
palette.addItem({ command: CommandIDs.toggleLeftArea, category });

app.commands.addCommand(CommandIDs.toggleRightArea, {
label: args => 'Show Right Sidebar',
label: () => 'Show Right Sidebar',
execute: () => {
if (shell.rightCollapsed) {
shell.expandRight();
Expand All @@ -707,7 +709,7 @@ function addCommands(app: JupyterLab, palette: ICommandPalette): void {
palette.addItem({ command: CommandIDs.toggleRightArea, category });

app.commands.addCommand(CommandIDs.togglePresentationMode, {
label: args => 'Presentation Mode',
label: () => 'Presentation Mode',
execute: () => {
shell.presentationMode = !shell.presentationMode;
},
Expand Down Expand Up @@ -820,7 +822,7 @@ const propertyInspector: JupyterFrontEndPlugin<IPropertyInspectorProvider> = {
provides: IPropertyInspectorProvider,
activate: (app: JupyterFrontEnd, labshell: ILabShell) => {
const widget = new SideBarPropertyInspectorProvider(labshell);
widget.title.iconClass = 'jp-BuildIcon jp-SideBar-tabIcon';
widget.title.iconRenderer = buildIcon;
widget.title.caption = 'Property Inspector';
widget.id = 'jp-property-inspector';
labshell.add(widget, 'left');
Expand Down
1 change: 1 addition & 0 deletions packages/application-extension/style/index.css
Expand Up @@ -5,6 +5,7 @@

/* This file was auto-generated by ensurePackage() in @jupyterlab/buildutils */
@import url('~@lumino/widgets/style/index.css');
@import url('~@jupyterlab/ui-components/style/index.css');
@import url('~@jupyterlab/application/style/index.css');
@import url('~@jupyterlab/property-inspector/style/index.css');

Expand Down
3 changes: 3 additions & 0 deletions packages/application-extension/tsconfig.json
Expand Up @@ -23,6 +23,9 @@
},
{
"path": "../statedb"
},
{
"path": "../ui-components"
}
]
}