From 9ade38b0c4be01073945b4b166af2db982147047 Mon Sep 17 00:00:00 2001 From: mathuo <6710312+mathuo@users.noreply.github.com> Date: Mon, 30 May 2022 22:00:44 +0100 Subject: [PATCH] chore: docs --- packages/docs/docs/components/dockview.mdx | 106 +++++----- packages/docs/docs/components/gridview.mdx | 24 +-- packages/docs/docs/components/paneview.mdx | 68 +++---- packages/docs/docs/components/splitview.mdx | 64 +++--- packages/docs/docusaurus.config.js | 9 +- packages/docs/package.json | 4 +- .../src/components/HomepageFeatures/index.tsx | 156 +++++++++------ .../HomepageFeatures/styles.module.css | 4 +- packages/docs/src/components/dockview/api.ts | 72 +++++++ .../docs/src/components/dockview/demo.scss | 15 ++ .../docs/src/components/dockview/demo.tsx | 186 ++++++++++++++++++ packages/docs/src/css/custom.css | 19 +- packages/docs/src/pages/index.scss | 27 +++ packages/docs/src/pages/index.tsx | 39 +++- packages/docs/static/img/dockview_grid.svg | 45 +++++ packages/docs/static/img/dockview_grid_2.svg | 51 +++++ packages/docs/static/img/dockview_logo.ico | Bin 0 -> 285478 bytes packages/docs/static/img/dockview_logo.svg | 60 ++++++ .../docs/static/img/dockview_splash_2.svg | 45 +++++ .../version-1.4.3/components/dockview.mdx | 106 +++++----- .../version-1.4.3/components/gridview.mdx | 24 +-- .../version-1.4.3/components/paneview.mdx | 68 +++---- .../version-1.4.3/components/splitview.mdx | 64 +++--- 23 files changed, 920 insertions(+), 336 deletions(-) create mode 100644 packages/docs/src/components/dockview/api.ts create mode 100644 packages/docs/src/components/dockview/demo.scss create mode 100644 packages/docs/src/components/dockview/demo.tsx create mode 100644 packages/docs/src/pages/index.scss create mode 100644 packages/docs/static/img/dockview_grid.svg create mode 100644 packages/docs/static/img/dockview_grid_2.svg create mode 100644 packages/docs/static/img/dockview_logo.ico create mode 100644 packages/docs/static/img/dockview_logo.svg create mode 100644 packages/docs/static/img/dockview_splash_2.svg diff --git a/packages/docs/docs/components/dockview.mdx b/packages/docs/docs/components/dockview.mdx index d48eb4cd8..b2e7e5d47 100644 --- a/packages/docs/docs/components/dockview.mdx +++ b/packages/docs/docs/components/dockview.mdx @@ -12,7 +12,7 @@ import Link from '@docusaurus/Link'; ## Introduction -Dockview is an abstraction built on top of [Gridviews](/docs/api/gridview) where each view is a container of many tabbed panels. +Dockview is an abstraction built on top of [Gridviews](./gridview) where each view is a container of many tabbed panels.
void | No | | | -| components | object | No | | | -| tabComponents | object | Yes | | | -| watermarkComponent | object | Yes | | | -| hideBorders | boolean | Yes | false | | -| className | string | Yes | '' | | -| disableAutoResizing | boolean | Yes | false | See Auto Resizing | -| onTabContextMenu | Event | Yes | false | | -| onDidDrop | Event | Yes | false | | -| showDndOverlay | Event | Yes | false | | +| Property | Type | Optional | Default | Description | +| ------------------- | ------------------------------------ | -------- | ------- | ------------------------------------------------------------ | +| onReady | (event: SplitviewReadyEvent) => void | No | | | +| components | object | No | | | +| tabComponents | object | Yes | | | +| watermarkComponent | object | Yes | | | +| hideBorders | boolean | Yes | false | | +| className | string | Yes | '' | | +| disableAutoResizing | boolean | Yes | false | See Auto Resizing | +| onTabContextMenu | Event | Yes | false | | +| onDidDrop | Event | Yes | false | | +| showDndOverlay | Event | Yes | false | | ## Dockview API @@ -68,46 +68,46 @@ const onReady = (event: DockviewReadyEvent) => { }; ``` -| Property | Type | Description | -| ---------------------- | ---------------------------------------------------- | ----------------------------------------------------------- | -| height | `number` | Component pixel height | -| width | `number` | Component pixel width | -| minimumHeight | `number` | | -| maximumHeight | `number` | | -| maximumWidth | `number` | | -| maximumWidth | `number` | | -| length | `number` | Number of panels | -| size | `number` | Number of Groups | -| panels | `IDockviewPanel[]` | | -| groups | `GroupPanel[]` | | -| activePanel | `IDockviewPanel \| undefined` | | -| activeGroup | `IDockviewPanel \| undefined` | | -| | | | -| onDidLayoutChange | `Event` | | -| onDidLayoutFromJSON | `Event` | | -| onDidAddGroup | `Event` | | -| onDidRemoveGroup | `Event` | | -| onDidActiveGroupChange | `Event` | | -| onDidAddPanel | `Event` | | -| onDidRemovePanel | `Event` | | -| onDidActivePanelChange | `Event` | | -| onDidDrop | `EventAuto Resizing | -| fromJSON | `(data: SerializedDockview): void` | Serialization | -| toJSON | `(): SerializedDockview` | Serialization | -| clear | `(): void` | Clears the current layout | +| Property | Type | Description | +| ---------------------- | ---------------------------------------------------- | -------------------------------------------------------- | +| height | `number` | Component pixel height | +| width | `number` | Component pixel width | +| minimumHeight | `number` | | +| maximumHeight | `number` | | +| maximumWidth | `number` | | +| maximumWidth | `number` | | +| length | `number` | Number of panels | +| size | `number` | Number of Groups | +| panels | `IDockviewPanel[]` | | +| groups | `GroupPanel[]` | | +| activePanel | `IDockviewPanel \| undefined` | | +| activeGroup | `IDockviewPanel \| undefined` | | +| | | | +| onDidLayoutChange | `Event` | | +| onDidLayoutFromJSON | `Event` | | +| onDidAddGroup | `Event` | | +| onDidRemoveGroup | `Event` | | +| onDidActiveGroupChange | `Event` | | +| onDidAddPanel | `Event` | | +| onDidRemovePanel | `Event` | | +| onDidActivePanelChange | `Event` | | +| onDidDrop | `EventAuto Resizing | +| fromJSON | `(data: SerializedDockview): void` | Serialization | +| toJSON | `(): SerializedDockview` | Serialization | +| clear | `(): void` | Clears the current layout | ## Dockview Panel API diff --git a/packages/docs/docs/components/gridview.mdx b/packages/docs/docs/components/gridview.mdx index b4913a712..5816d5fae 100644 --- a/packages/docs/docs/components/gridview.mdx +++ b/packages/docs/docs/components/gridview.mdx @@ -23,15 +23,15 @@ import Link from '@docusaurus/Link'; import { ReactGridview } from 'dockview'; ``` -| Property | Type | Optional | Default | Description | -| ------------------- | ------------------------------------ | -------- | ---------------------- | --------------------------------------------------------------------------- | -| onReady | (event: SplitviewReadyEvent) => void | No | | | -| components | object | No | | | -| orientation | Orientation | Yes | Orientation.HORIZONTAL | | -| proportionalLayout | boolean | Yes | true | See Proportional layout | -| hideBorders | boolean | Yes | false | | -| className | string | Yes | '' | | -| disableAutoResizing | boolean | Yes | false | See Auto Resizing | +| Property | Type | Optional | Default | Description | +| ------------------- | ------------------------------------ | -------- | ---------------------- | ------------------------------------------------------------------------ | +| onReady | (event: SplitviewReadyEvent) => void | No | | | +| components | object | No | | | +| orientation | Orientation | Yes | Orientation.HORIZONTAL | | +| proportionalLayout | boolean | Yes | true | See Proportional layout | +| hideBorders | boolean | Yes | false | | +| className | string | Yes | '' | | +| disableAutoResizing | boolean | Yes | false | See Auto Resizing | ## Gridview API @@ -74,9 +74,9 @@ const onReady = (event: GridviewReadyEvent) => { | | | | | updateOptions | `(options:SplitviewComponentUpdateOptions): void` | | | focus | `(): void` | Focus the active panel, if exists | -| layout | `(width: number, height:number): void` | Auto Resizing | -| fromJSON | `(data: SerializedGridview): void` | Serialization | -| toJSON | `(): SerializedGridview` | Serialization | +| layout | `(width: number, height:number): void` | Auto Resizing | +| fromJSON | `(data: SerializedGridview): void` | Serialization | +| toJSON | `(): SerializedGridview` | Serialization | | clear | `(): void` | Clears the current layout | ## Gridview Panel API diff --git a/packages/docs/docs/components/paneview.mdx b/packages/docs/docs/components/paneview.mdx index b1906ddd8..82ede4f23 100644 --- a/packages/docs/docs/components/paneview.mdx +++ b/packages/docs/docs/components/paneview.mdx @@ -101,15 +101,15 @@ You can create a Paneview through the use of the `ReactPaneview` component. import { ReactPaneview } from 'dockview'; ``` -| Property | Type | Optional | Default | Description | -| ------------------- | ------------------------------------ | -------- | ------- | ----------------------------------------------------------- | -| onReady | (event: SplitviewReadyEvent) => void | No | | | -| components | object | No | | | -| headerComponents | object | Yes | | | -| className | string | Yes | '' | | -| disableAutoResizing | boolean | Yes | false | Auto Resizing | -| disableDnd | boolean | Yes | false | | -| onDidDrop | Event | Yes | | | +| Property | Type | Optional | Default | Description | +| ------------------- | ------------------------------------ | -------- | ------- | -------------------------------------------------------- | +| onReady | (event: SplitviewReadyEvent) => void | No | | | +| components | object | No | | | +| headerComponents | object | Yes | | | +| className | string | Yes | '' | | +| disableAutoResizing | boolean | Yes | false | Auto Resizing | +| disableDnd | boolean | Yes | false | | +| onDidDrop | Event | Yes | | | ## Paneview API @@ -130,31 +130,31 @@ const onReady = (event: GridviewReadyEvent) => { }; ``` -| Property | Type | Description | -| ------------------- | ---------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- | -| height | `number` | Component pixel height | -| width | `number` | Component pixel width | -| minimumSize | `number` | The sum of the `minimumSize` property for each panel | -| maximumSize | `number` | The sum of the `maximumSize` property for each panel | -| length | `number` | Number of panels | -| panels | `IPaneviewPanel[]` | All panels | -| | | | -| onDidLayoutChange | `Event` | Fires on layout change | -| onDidLayoutFromJSON | `Event` | Fires of layout change caused by a fromJSON deserialization call | -| onDidAddView | `Event` | Fires when a view is added | -| onDidRemoveView | `Event` | Fires when a view is removed | -| onDidDrop | `EventDrag and Drop) | -| | | | -| addPanel | `addPanel(options: AddPaneviewComponentOptions): IPaneviewPanel` | | -| removePanel | `(panel: IPaneviewPanel): void` | | -| movePanel | `(from: number, to: number): void` | | -| getPanel | `(id:string): IPaneviewPanel \| undefined` | | -| | | | -| focus | `(): void` | Focus the active panel, if exists | -| layout | `(width: number, height:number): void` | See Auto Resizing | -| fromJSON | `(data: SerializedPaneview): void` | Serialization | -| toJSON | `(): SerializedPaneview` | Serialization | -| clear | `(): void` | Clears the current layout | +| Property | Type | Description | +| ------------------- | ---------------------------------------------------------------- | ----------------------------------------------------------------------------------------------- | +| height | `number` | Component pixel height | +| width | `number` | Component pixel width | +| minimumSize | `number` | The sum of the `minimumSize` property for each panel | +| maximumSize | `number` | The sum of the `maximumSize` property for each panel | +| length | `number` | Number of panels | +| panels | `IPaneviewPanel[]` | All panels | +| | | | +| onDidLayoutChange | `Event` | Fires on layout change | +| onDidLayoutFromJSON | `Event` | Fires of layout change caused by a fromJSON deserialization call | +| onDidAddView | `Event` | Fires when a view is added | +| onDidRemoveView | `Event` | Fires when a view is removed | +| onDidDrop | `EventDrag and Drop) | +| | | | +| addPanel | `addPanel(options: AddPaneviewComponentOptions): IPaneviewPanel` | | +| removePanel | `(panel: IPaneviewPanel): void` | | +| movePanel | `(from: number, to: number): void` | | +| getPanel | `(id:string): IPaneviewPanel \| undefined` | | +| | | | +| focus | `(): void` | Focus the active panel, if exists | +| layout | `(width: number, height:number): void` | See Auto Resizing | +| fromJSON | `(data: SerializedPaneview): void` | Serialization | +| toJSON | `(): SerializedPaneview` | Serialization | +| clear | `(): void` | Clears the current layout | ## Paneview Panel API diff --git a/packages/docs/docs/components/splitview.mdx b/packages/docs/docs/components/splitview.mdx index d932b9950..5c6f0ad8a 100644 --- a/packages/docs/docs/components/splitview.mdx +++ b/packages/docs/docs/components/splitview.mdx @@ -81,15 +81,15 @@ import { ReactSplitview } from 'dockview'; Using the `onReady` prop you can access to the component `api` and add panels either through deserialization or the individual addition of panels. -| Property | Type | Optional | Default | Description | -| ------------------- | -------------------------------------- | -------- | ------------------------ | --------------------------------------------------------------------------- | -| onReady | `(event: SplitviewReadyEvent) => void` | No | | Function | -| components | `Record` | No | | Panel renderers | -| orientation | `Orientation` | Yes | `Orientation.HORIZONTAL` | Orientation of the Splitview | -| proportionalLayout | `boolean` | Yes | `true` | See Proportional layout | -| hideBorders | `boolean` | Yes | `false` | Hide the borders between panels | -| className | `string` | Yes | `''` | Attaches a classname | -| disableAutoResizing | `boolean` | Yes | `false` | See Auto Resizing | +| Property | Type | Optional | Default | Description | +| ------------------- | -------------------------------------- | -------- | ------------------------ | ------------------------------------------------------------------------ | +| onReady | `(event: SplitviewReadyEvent) => void` | No | | Function | +| components | `Record` | No | | Panel renderers | +| orientation | `Orientation` | Yes | `Orientation.HORIZONTAL` | Orientation of the Splitview | +| proportionalLayout | `boolean` | Yes | `true` | See Proportional layout | +| hideBorders | `boolean` | Yes | `false` | Hide the borders between panels | +| className | `string` | Yes | `''` | Attaches a classname | +| disableAutoResizing | `boolean` | Yes | `false` | See Auto Resizing | ## Splitview API @@ -131,9 +131,9 @@ const onReady = (event: SplitviewReadyEvent) => { | | | | updateOptions | `(options: SplitviewComponentUpdateOptions): void` | | | focus | `(): void` | Focus the active panel, if exists | -| layout | `(width: number, height:number): void` | See Auto Resizing | -| fromJSON | `(data: SerializedSplitview): void` | Serialization | -| toJSON | `(): SerializedSplitview` | Serialization | +| layout | `(width: number, height:number): void` | See Auto Resizing | +| fromJSON | `(data: SerializedSplitview): void` | Serialization | +| toJSON | `(): SerializedSplitview` | Serialization | | clear | `(): void` | Clears the current layout | ## Splitview Panel API @@ -148,26 +148,26 @@ const MyComponent = (props: ISplitviewPanelProps<{ title: string }>) => { }; ``` -| Property | Type | Description | -| ---------------------- | ----------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- | -| id | `string` | Panel id | -| isFocused | `boolean` | Is panel focsed | -| isActive | `boolean` | Is panel active | -| isVisible | `boolean` | Is panel visible | -| width | `number` | Panel width | -| height | `number` | Panel height | -| | | | -| onDidDimensionsChange | `Event` | Fires when panel dimensions change | -| onDidFocusChange | `Event` | Fire when panel is focused and blurred | -| onDidVisibilityChange | `Event` | Fires when the panels visiblity property is changed (see Panel Visibility) | -| onDidActiveChange | `Event` | Fires when the panels active property is changed (see Active Panel) | -| onDidConstraintsChange | `onDidConstraintsChange: Event` | Fires when the panels size contrainsts change (see Panel Constraints) | -| | | | -| setVisible | `(isVisible: boolean): void` | | -| setActive | `(): void` | | -| | | | -| setConstraints | `(value: PanelConstraintChangeEvent2): void;` | | -| setSize | `(event: PanelSizeEvent): void` | | +| Property | Type | Description | +| ---------------------- | ----------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | +| id | `string` | Panel id | +| isFocused | `boolean` | Is panel focsed | +| isActive | `boolean` | Is panel active | +| isVisible | `boolean` | Is panel visible | +| width | `number` | Panel width | +| height | `number` | Panel height | +| | | | +| onDidDimensionsChange | `Event` | Fires when panel dimensions change | +| onDidFocusChange | `Event` | Fire when panel is focused and blurred | +| onDidVisibilityChange | `Event` | Fires when the panels visiblity property is changed (see Panel Visibility) | +| onDidActiveChange | `Event` | Fires when the panels active property is changed (see Active Panel) | +| onDidConstraintsChange | `onDidConstraintsChange: Event` | Fires when the panels size contrainsts change (see Panel Constraints) | +| | | | +| setVisible | `(isVisible: boolean): void` | | +| setActive | `(): void` | | +| | | | +| setConstraints | `(value: PanelConstraintChangeEvent2): void;` | | +| setSize | `(event: PanelSizeEvent): void` | | ## Advanced Features diff --git a/packages/docs/docusaurus.config.js b/packages/docs/docusaurus.config.js index 2edefa793..6998b891a 100644 --- a/packages/docs/docusaurus.config.js +++ b/packages/docs/docusaurus.config.js @@ -11,12 +11,12 @@ console.log(`isCI: ${process.env.CI}`); /** @type {import('@docusaurus/types').Config} */ const config = { title: 'Dockview', - tagline: 'Zero dependency layout manager for React', + tagline: 'A zero dependency layout manager built for React', url: 'https://dockview.dev', baseUrl: process.env.CI ? `/` : '/', onBrokenLinks: 'throw', onBrokenMarkdownLinks: 'warn', - favicon: 'img/favicon.ico', + favicon: 'img/dockview_logo.ico', // GitHub pages deployment config. // If you aren't using GitHub pages, you don't need these. @@ -52,6 +52,9 @@ const config = { 'react-dom' ), }, + fallback: { + timers: false, + }, }, }; }, @@ -123,7 +126,7 @@ const config = { title: 'Dockview', logo: { alt: 'My Site Logo', - src: 'img/logo.svg', + src: 'img/dockview_logo.svg', }, items: [ { diff --git a/packages/docs/package.json b/packages/docs/package.json index c9a9d9be5..4868f7ed7 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -19,12 +19,14 @@ "@docusaurus/core": "2.0.0-beta.20", "@docusaurus/preset-classic": "2.0.0-beta.20", "@mdx-js/react": "^1.6.22", + "axios": "^0.27.2", "clsx": "^1.1.1", "dockview": "^1.4.3", "prism-react-renderer": "^1.3.1", "react": "^17.0.2", "react-dom": "^17.0.2", - "recoil": "^0.7.3-alpha.2" + "recoil": "^0.7.3-alpha.2", + "xml2js": "^0.4.23" }, "devDependencies": { "@docusaurus/module-type-aliases": "2.0.0-beta.20", diff --git a/packages/docs/src/components/HomepageFeatures/index.tsx b/packages/docs/src/components/HomepageFeatures/index.tsx index 91ef4601d..05b0bb854 100644 --- a/packages/docs/src/components/HomepageFeatures/index.tsx +++ b/packages/docs/src/components/HomepageFeatures/index.tsx @@ -3,68 +3,112 @@ import clsx from 'clsx'; import styles from './styles.module.css'; type FeatureItem = { - title: string; - Svg: React.ComponentType>; - description: JSX.Element; + title: string; + Svg: React.ComponentType>; + description: JSX.Element; }; const FeatureList: FeatureItem[] = [ - { - title: 'Easy to Use', - Svg: require('@site/static/img/undraw_docusaurus_mountain.svg').default, - description: ( - <> - Docusaurus was designed from the ground up to be easily installed and - used to get your website up and running quickly. - - ), - }, - { - title: 'Focus on What Matters', - Svg: require('@site/static/img/undraw_docusaurus_tree.svg').default, - description: ( - <> - Docusaurus lets you focus on your docs, and we'll do the chores. Go - ahead and move your docs into the docs directory. - - ), - }, - { - title: 'Powered by React', - Svg: require('@site/static/img/undraw_docusaurus_react.svg').default, - description: ( - <> - Extend or customize your website layout by reusing React. Docusaurus can - be extended while reusing the same header and footer. - - ), - }, + { + title: '', + Svg: require('@site/static/img/dockview_grid_2.svg').default, + description: ( + <> +
+

+ Serialziable Layouts +

+

+ Add and remove panels using the provided api or use the + serialization method to persist layouts. +

+
+
+

+ Customizable Theme +

+

+ Adjust a numbero of provided CSS Properties for a simple + change or target specific classes for a more customized + approach. +

+
+
+

+ Choose Your Control +

+

+ Choose from a simple splitview, a gridview, collapsable + panes or a full docking solution. Combine multiple for + more complex layouts. +

+
+ + ), + }, + { + title: '', + Svg: require('@site/static/img/dockview_splash_2.svg').default, + description: ( + <> +
+

Drag And Drop

+

+ Drag and Drop to position your layout and interact with + external drag events too. +

+
+
+

Zero Dependencies

+

+ Zero dependencies, that's all. +

+
+
+

+ Code Quality and Transparency +

+

+ All of the code is run through Sonarcloud Code Analyis + which along with the source code and high test coverage + can be viewed from the Github page. +

+
+ + ), + }, ]; -function Feature({title, Svg, description}: FeatureItem) { - return ( -
-
- -
-
-

{title}

-

{description}

-
-
- ); +function Feature({ title, Svg, description }: FeatureItem) { + return ( +
+ +
+

{title}

+

{description}

+
+
+ ); } export default function HomepageFeatures(): JSX.Element { - return ( -
-
-
- {FeatureList.map((props, idx) => ( - - ))} -
-
-
- ); + return ( +
+
+
+ {FeatureList.map((props, idx) => ( + + ))} +
+
+
+ ); } diff --git a/packages/docs/src/components/HomepageFeatures/styles.module.css b/packages/docs/src/components/HomepageFeatures/styles.module.css index b248eb2e5..edcd49b21 100644 --- a/packages/docs/src/components/HomepageFeatures/styles.module.css +++ b/packages/docs/src/components/HomepageFeatures/styles.module.css @@ -6,6 +6,6 @@ } .featureSvg { - height: 200px; - width: 200px; + height: 400px; + width: 400px; } diff --git a/packages/docs/src/components/dockview/api.ts b/packages/docs/src/components/dockview/api.ts new file mode 100644 index 000000000..713a4dda2 --- /dev/null +++ b/packages/docs/src/components/dockview/api.ts @@ -0,0 +1,72 @@ +import axios from 'axios'; + +const EXCHANGE_URL = 'https://api.exchange.coinbase.com'; + +const URL = 'https://api.coinbase.com/v2'; + +export interface Currency { + id: string; + name: string; + min_size: string; + max_precision: string; + status: string; + details: { + type: string; + symbol: string; + sort_order: number; + push_payment_methods: string[]; + display_name: string; + group_types: string[]; + }; +} + +export interface Price { + data: { base: string; currency: string; amount: string }; +} + +export async function allCurrencies(): Promise { + try { + const response = await axios.get( + `${EXCHANGE_URL}/currencies`, + { + headers: { Accept: 'application/json' }, + } + ); + + return response.data; + } catch (err) { + return []; + } +} + +export async function getCurrencies(id: string): Promise { + try { + const response = await axios.get( + `${EXCHANGE_URL}/currencies/${id}`, + { + headers: { Accept: 'application/json' }, + } + ); + + return response.data; + } catch (err) { + return null; + } +} + +export async function getPrice(base: string, quote: string) { + try { + const response = await axios.get( + `${URL}/prices/${base}-${quote}/buy`, + { + headers: { Accept: 'application/json' }, + } + ); + + return response.data; + } catch (err) { + return null; + } +} + +export const CURRENCIES = ['BTC', 'ETH', 'LTC']; diff --git a/packages/docs/src/components/dockview/demo.scss b/packages/docs/src/components/dockview/demo.scss new file mode 100644 index 000000000..9508b208e --- /dev/null +++ b/packages/docs/src/components/dockview/demo.scss @@ -0,0 +1,15 @@ +.news-panel { + height: 100%; + overflow: auto; + + .story { + display: flex; + flex-direction: column; + justify-content: start; + + .link { + color: white !important; + font-size: 11px; + } + } +} diff --git a/packages/docs/src/components/dockview/demo.tsx b/packages/docs/src/components/dockview/demo.tsx new file mode 100644 index 000000000..4683de1cc --- /dev/null +++ b/packages/docs/src/components/dockview/demo.tsx @@ -0,0 +1,186 @@ +import { + DockviewReact, + DockviewReadyEvent, + IDockviewPanelProps, +} from 'dockview'; +import * as React from 'react'; +import { CURRENCIES, Currency, getCurrencies, getPrice } from './api'; +import './demo.scss'; + +const CurrencyRow = (props: { currency: Currency }) => { + const [price, setPrice] = React.useState(); + + React.useEffect(() => { + getPrice(props.currency.id, 'USD').then((result) => { + setPrice(Number(result.data.amount)); + }); + }, [props.currency]); + + return ( + <> +
{props.currency.id}
+
{`${typeof price === 'number' ? `$${price}` : '-'}`}
+ + ); +}; + +const Currencies = () => { + const [currencies, setCurrencies] = React.useState([]); + + React.useEffect(() => { + Promise.all(CURRENCIES.map(getCurrencies)).then((results) => { + setCurrencies(results.filter(Boolean)); + }); + }, []); + + return ( +
+
+ {currencies.map((currency) => ( + + ))} +
+
+ ); +}; + +import axios from 'axios'; + +type Article = { + id: 15255; + title: string; + url: string; + imageUrl: string; + newsSite: string; + summary: string; + publishedAt: string; + updatedAt: string; + featured: boolean; + launches: any[]; + events: any[]; +}; + +async function getStories(): Promise { + const response = await axios.get( + 'https://api.spaceflightnewsapi.net/v3/articles' + ); + + return response.data; +} + +const News = () => { + const [stories, setStories] = React.useState([]); + + React.useEffect(() => { + getStories().then(setStories); + }, []); + + return ( +
+ {stories.map((story) => { + return ( +
+
+ {story.title} +
+ +
+ ); + })} +
+ ); +}; + +const components = { + default: (props: IDockviewPanelProps<{ title: string }>) => { + return
{props.params.title}
; + }, + currencies: Currencies, + news: News, +}; + +export const DockviewDemo = () => { + const onReady = (event: DockviewReadyEvent) => { + // event.api.addPanel({ + // id: 'currencies', + // component: 'currencies', + // title: 'Prices', + // }); + + // event.api.addPanel({ + // id: 'news', + // component: 'news', + // title: 'News', + // }); + + event.api.addPanel({ + id: 'panel_1', + component: 'default', + title: 'Panel 1', + }); + event.api.addPanel({ + id: 'panel_2', + component: 'default', + title: 'Panel 2', + }); + event.api.addPanel({ + id: 'panel_3', + component: 'default', + title: 'Panel 3', + }); + event.api.addPanel({ + id: 'panel_4', + component: 'default', + title: 'Panel 4', + position: { referencePanel: 'panel_3', direction: 'right' }, + }); + event.api.addPanel({ + id: 'panel_5', + component: 'default', + title: 'Panel 5', + position: { referencePanel: 'panel_4', direction: 'within' }, + }); + const panel6 = event.api.addPanel({ + id: 'panel_6', + component: 'default', + title: 'Panel 6', + position: { referencePanel: 'panel_4', direction: 'below' }, + }); + panel6.group.locked = true; + panel6.group.header.hidden = true; + event.api.addPanel({ + id: 'panel_7', + component: 'default', + title: 'Panel 7', + position: { referencePanel: 'panel_6', direction: 'right' }, + }); + event.api.addPanel({ + id: 'panel_8', + component: 'default', + title: 'Panel 8', + position: { referencePanel: 'panel_7', direction: 'within' }, + }); + }; + + return ( + + ); +}; diff --git a/packages/docs/src/css/custom.css b/packages/docs/src/css/custom.css index 9a917885e..b9359e759 100644 --- a/packages/docs/src/css/custom.css +++ b/packages/docs/src/css/custom.css @@ -6,13 +6,13 @@ /* You can override the default Infima variables here. */ :root { - --ifm-color-primary: #2e8555; - --ifm-color-primary-dark: #29784c; - --ifm-color-primary-darker: #277148; - --ifm-color-primary-darkest: #205d3b; - --ifm-color-primary-light: #33925d; - --ifm-color-primary-lighter: #359962; - --ifm-color-primary-lightest: #3cad6e; + --ifm-color-primary: #21222c; + --ifm-color-primary-dark: #1e1f28; + --ifm-color-primary-darker: #1c1d25; + --ifm-color-primary-darkest: #17181f; + --ifm-color-primary-light: #242530; + --ifm-color-primary-lighter: #262733; + --ifm-color-primary-lightest: #2b2c39; --ifm-code-font-size: 95%; --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.1); } @@ -29,4 +29,9 @@ --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.3); } +body { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Ubuntu, Cantarell, Helvetica, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Android Emoji", EmojiSymbols, "EmojiOne Mozilla", "Twemoji Mozilla", "Segoe UI Symbol", "Noto Color Emoji" +html +} + @import "~dockview/dist/styles/dockview.css" diff --git a/packages/docs/src/pages/index.scss b/packages/docs/src/pages/index.scss new file mode 100644 index 000000000..b85b289b7 --- /dev/null +++ b/packages/docs/src/pages/index.scss @@ -0,0 +1,27 @@ +.badge-container { + img:not(:first-child) { + padding-left: 10px; + } +} + +.dockview-feature-panel { + max-width: 1000px; + display: flex; + padding: 20px; + justify-content: space-around; + + .feature-banner { + .feature-banner-header { + // font-size: 1.25em; + } + + .feature-banner-content { + } + } +} + +.dockview-feature { + &:nth-child(2n) { + flex-direction: row-reverse; + } +} diff --git a/packages/docs/src/pages/index.tsx b/packages/docs/src/pages/index.tsx index 431d507a1..2aa59dde5 100644 --- a/packages/docs/src/pages/index.tsx +++ b/packages/docs/src/pages/index.tsx @@ -5,7 +5,9 @@ import Link from '@docusaurus/Link'; import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; import styles from './index.module.css'; import HomepageFeatures from '@site/src/components/HomepageFeatures'; -import { SimpleDockview } from '../components/simpleDockview'; +import { DockviewDemo } from '../components/dockview/demo'; +import useBaseUrl from '@docusaurus/useBaseUrl'; +import './index.scss'; function HomepageHeader() { const { siteConfig } = useDocusaurusContext(); @@ -27,6 +29,33 @@ function HomepageHeader() { ); } +function HomepageHeader2() { + const { siteConfig } = useDocusaurusContext(); + return ( +
+
+ +

{siteConfig.title}

+ {/*
+ + + + +
*/} +

{siteConfig.tagline}

+
+ + Get Started + +
+
+
+ ); +} + export default function Home(): JSX.Element { const { siteConfig } = useDocusaurusContext(); return ( @@ -34,12 +63,12 @@ export default function Home(): JSX.Element { title={`${siteConfig.title}`} description="A zero dependency layout mananger for React." > - +
-
- + +
+
- {/* */}
); diff --git a/packages/docs/static/img/dockview_grid.svg b/packages/docs/static/img/dockview_grid.svg new file mode 100644 index 000000000..791252c6a --- /dev/null +++ b/packages/docs/static/img/dockview_grid.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/docs/static/img/dockview_grid_2.svg b/packages/docs/static/img/dockview_grid_2.svg new file mode 100644 index 000000000..c11c8f403 --- /dev/null +++ b/packages/docs/static/img/dockview_grid_2.svg @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/docs/static/img/dockview_logo.ico b/packages/docs/static/img/dockview_logo.ico new file mode 100644 index 0000000000000000000000000000000000000000..0d5b208311b256a9065aaa582650b5817a1d9fb0 GIT binary patch literal 285478 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 z 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�BIBaN!i5t`x_`&o9 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⪻S;9X#fjAc* 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 literal 0 HcmV?d00001 diff --git a/packages/docs/static/img/dockview_logo.svg b/packages/docs/static/img/dockview_logo.svg new file mode 100644 index 000000000..6d9865310 --- /dev/null +++ b/packages/docs/static/img/dockview_logo.svg @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/docs/static/img/dockview_splash_2.svg b/packages/docs/static/img/dockview_splash_2.svg new file mode 100644 index 000000000..1158f6c8d --- /dev/null +++ b/packages/docs/static/img/dockview_splash_2.svg @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/docs/versioned_docs/version-1.4.3/components/dockview.mdx b/packages/docs/versioned_docs/version-1.4.3/components/dockview.mdx index d48eb4cd8..b2e7e5d47 100644 --- a/packages/docs/versioned_docs/version-1.4.3/components/dockview.mdx +++ b/packages/docs/versioned_docs/version-1.4.3/components/dockview.mdx @@ -12,7 +12,7 @@ import Link from '@docusaurus/Link'; ## Introduction -Dockview is an abstraction built on top of [Gridviews](/docs/api/gridview) where each view is a container of many tabbed panels. +Dockview is an abstraction built on top of [Gridviews](./gridview) where each view is a container of many tabbed panels.
void | No | | | -| components | object | No | | | -| tabComponents | object | Yes | | | -| watermarkComponent | object | Yes | | | -| hideBorders | boolean | Yes | false | | -| className | string | Yes | '' | | -| disableAutoResizing | boolean | Yes | false | See Auto Resizing | -| onTabContextMenu | Event | Yes | false | | -| onDidDrop | Event | Yes | false | | -| showDndOverlay | Event | Yes | false | | +| Property | Type | Optional | Default | Description | +| ------------------- | ------------------------------------ | -------- | ------- | ------------------------------------------------------------ | +| onReady | (event: SplitviewReadyEvent) => void | No | | | +| components | object | No | | | +| tabComponents | object | Yes | | | +| watermarkComponent | object | Yes | | | +| hideBorders | boolean | Yes | false | | +| className | string | Yes | '' | | +| disableAutoResizing | boolean | Yes | false | See Auto Resizing | +| onTabContextMenu | Event | Yes | false | | +| onDidDrop | Event | Yes | false | | +| showDndOverlay | Event | Yes | false | | ## Dockview API @@ -68,46 +68,46 @@ const onReady = (event: DockviewReadyEvent) => { }; ``` -| Property | Type | Description | -| ---------------------- | ---------------------------------------------------- | ----------------------------------------------------------- | -| height | `number` | Component pixel height | -| width | `number` | Component pixel width | -| minimumHeight | `number` | | -| maximumHeight | `number` | | -| maximumWidth | `number` | | -| maximumWidth | `number` | | -| length | `number` | Number of panels | -| size | `number` | Number of Groups | -| panels | `IDockviewPanel[]` | | -| groups | `GroupPanel[]` | | -| activePanel | `IDockviewPanel \| undefined` | | -| activeGroup | `IDockviewPanel \| undefined` | | -| | | | -| onDidLayoutChange | `Event` | | -| onDidLayoutFromJSON | `Event` | | -| onDidAddGroup | `Event` | | -| onDidRemoveGroup | `Event` | | -| onDidActiveGroupChange | `Event` | | -| onDidAddPanel | `Event` | | -| onDidRemovePanel | `Event` | | -| onDidActivePanelChange | `Event` | | -| onDidDrop | `EventAuto Resizing | -| fromJSON | `(data: SerializedDockview): void` | Serialization | -| toJSON | `(): SerializedDockview` | Serialization | -| clear | `(): void` | Clears the current layout | +| Property | Type | Description | +| ---------------------- | ---------------------------------------------------- | -------------------------------------------------------- | +| height | `number` | Component pixel height | +| width | `number` | Component pixel width | +| minimumHeight | `number` | | +| maximumHeight | `number` | | +| maximumWidth | `number` | | +| maximumWidth | `number` | | +| length | `number` | Number of panels | +| size | `number` | Number of Groups | +| panels | `IDockviewPanel[]` | | +| groups | `GroupPanel[]` | | +| activePanel | `IDockviewPanel \| undefined` | | +| activeGroup | `IDockviewPanel \| undefined` | | +| | | | +| onDidLayoutChange | `Event` | | +| onDidLayoutFromJSON | `Event` | | +| onDidAddGroup | `Event` | | +| onDidRemoveGroup | `Event` | | +| onDidActiveGroupChange | `Event` | | +| onDidAddPanel | `Event` | | +| onDidRemovePanel | `Event` | | +| onDidActivePanelChange | `Event` | | +| onDidDrop | `EventAuto Resizing | +| fromJSON | `(data: SerializedDockview): void` | Serialization | +| toJSON | `(): SerializedDockview` | Serialization | +| clear | `(): void` | Clears the current layout | ## Dockview Panel API diff --git a/packages/docs/versioned_docs/version-1.4.3/components/gridview.mdx b/packages/docs/versioned_docs/version-1.4.3/components/gridview.mdx index b4913a712..5816d5fae 100644 --- a/packages/docs/versioned_docs/version-1.4.3/components/gridview.mdx +++ b/packages/docs/versioned_docs/version-1.4.3/components/gridview.mdx @@ -23,15 +23,15 @@ import Link from '@docusaurus/Link'; import { ReactGridview } from 'dockview'; ``` -| Property | Type | Optional | Default | Description | -| ------------------- | ------------------------------------ | -------- | ---------------------- | --------------------------------------------------------------------------- | -| onReady | (event: SplitviewReadyEvent) => void | No | | | -| components | object | No | | | -| orientation | Orientation | Yes | Orientation.HORIZONTAL | | -| proportionalLayout | boolean | Yes | true | See Proportional layout | -| hideBorders | boolean | Yes | false | | -| className | string | Yes | '' | | -| disableAutoResizing | boolean | Yes | false | See Auto Resizing | +| Property | Type | Optional | Default | Description | +| ------------------- | ------------------------------------ | -------- | ---------------------- | ------------------------------------------------------------------------ | +| onReady | (event: SplitviewReadyEvent) => void | No | | | +| components | object | No | | | +| orientation | Orientation | Yes | Orientation.HORIZONTAL | | +| proportionalLayout | boolean | Yes | true | See Proportional layout | +| hideBorders | boolean | Yes | false | | +| className | string | Yes | '' | | +| disableAutoResizing | boolean | Yes | false | See Auto Resizing | ## Gridview API @@ -74,9 +74,9 @@ const onReady = (event: GridviewReadyEvent) => { | | | | | updateOptions | `(options:SplitviewComponentUpdateOptions): void` | | | focus | `(): void` | Focus the active panel, if exists | -| layout | `(width: number, height:number): void` | Auto Resizing | -| fromJSON | `(data: SerializedGridview): void` | Serialization | -| toJSON | `(): SerializedGridview` | Serialization | +| layout | `(width: number, height:number): void` | Auto Resizing | +| fromJSON | `(data: SerializedGridview): void` | Serialization | +| toJSON | `(): SerializedGridview` | Serialization | | clear | `(): void` | Clears the current layout | ## Gridview Panel API diff --git a/packages/docs/versioned_docs/version-1.4.3/components/paneview.mdx b/packages/docs/versioned_docs/version-1.4.3/components/paneview.mdx index b1906ddd8..82ede4f23 100644 --- a/packages/docs/versioned_docs/version-1.4.3/components/paneview.mdx +++ b/packages/docs/versioned_docs/version-1.4.3/components/paneview.mdx @@ -101,15 +101,15 @@ You can create a Paneview through the use of the `ReactPaneview` component. import { ReactPaneview } from 'dockview'; ``` -| Property | Type | Optional | Default | Description | -| ------------------- | ------------------------------------ | -------- | ------- | ----------------------------------------------------------- | -| onReady | (event: SplitviewReadyEvent) => void | No | | | -| components | object | No | | | -| headerComponents | object | Yes | | | -| className | string | Yes | '' | | -| disableAutoResizing | boolean | Yes | false | Auto Resizing | -| disableDnd | boolean | Yes | false | | -| onDidDrop | Event | Yes | | | +| Property | Type | Optional | Default | Description | +| ------------------- | ------------------------------------ | -------- | ------- | -------------------------------------------------------- | +| onReady | (event: SplitviewReadyEvent) => void | No | | | +| components | object | No | | | +| headerComponents | object | Yes | | | +| className | string | Yes | '' | | +| disableAutoResizing | boolean | Yes | false | Auto Resizing | +| disableDnd | boolean | Yes | false | | +| onDidDrop | Event | Yes | | | ## Paneview API @@ -130,31 +130,31 @@ const onReady = (event: GridviewReadyEvent) => { }; ``` -| Property | Type | Description | -| ------------------- | ---------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- | -| height | `number` | Component pixel height | -| width | `number` | Component pixel width | -| minimumSize | `number` | The sum of the `minimumSize` property for each panel | -| maximumSize | `number` | The sum of the `maximumSize` property for each panel | -| length | `number` | Number of panels | -| panels | `IPaneviewPanel[]` | All panels | -| | | | -| onDidLayoutChange | `Event` | Fires on layout change | -| onDidLayoutFromJSON | `Event` | Fires of layout change caused by a fromJSON deserialization call | -| onDidAddView | `Event` | Fires when a view is added | -| onDidRemoveView | `Event` | Fires when a view is removed | -| onDidDrop | `EventDrag and Drop) | -| | | | -| addPanel | `addPanel(options: AddPaneviewComponentOptions): IPaneviewPanel` | | -| removePanel | `(panel: IPaneviewPanel): void` | | -| movePanel | `(from: number, to: number): void` | | -| getPanel | `(id:string): IPaneviewPanel \| undefined` | | -| | | | -| focus | `(): void` | Focus the active panel, if exists | -| layout | `(width: number, height:number): void` | See Auto Resizing | -| fromJSON | `(data: SerializedPaneview): void` | Serialization | -| toJSON | `(): SerializedPaneview` | Serialization | -| clear | `(): void` | Clears the current layout | +| Property | Type | Description | +| ------------------- | ---------------------------------------------------------------- | ----------------------------------------------------------------------------------------------- | +| height | `number` | Component pixel height | +| width | `number` | Component pixel width | +| minimumSize | `number` | The sum of the `minimumSize` property for each panel | +| maximumSize | `number` | The sum of the `maximumSize` property for each panel | +| length | `number` | Number of panels | +| panels | `IPaneviewPanel[]` | All panels | +| | | | +| onDidLayoutChange | `Event` | Fires on layout change | +| onDidLayoutFromJSON | `Event` | Fires of layout change caused by a fromJSON deserialization call | +| onDidAddView | `Event` | Fires when a view is added | +| onDidRemoveView | `Event` | Fires when a view is removed | +| onDidDrop | `EventDrag and Drop) | +| | | | +| addPanel | `addPanel(options: AddPaneviewComponentOptions): IPaneviewPanel` | | +| removePanel | `(panel: IPaneviewPanel): void` | | +| movePanel | `(from: number, to: number): void` | | +| getPanel | `(id:string): IPaneviewPanel \| undefined` | | +| | | | +| focus | `(): void` | Focus the active panel, if exists | +| layout | `(width: number, height:number): void` | See Auto Resizing | +| fromJSON | `(data: SerializedPaneview): void` | Serialization | +| toJSON | `(): SerializedPaneview` | Serialization | +| clear | `(): void` | Clears the current layout | ## Paneview Panel API diff --git a/packages/docs/versioned_docs/version-1.4.3/components/splitview.mdx b/packages/docs/versioned_docs/version-1.4.3/components/splitview.mdx index d932b9950..5c6f0ad8a 100644 --- a/packages/docs/versioned_docs/version-1.4.3/components/splitview.mdx +++ b/packages/docs/versioned_docs/version-1.4.3/components/splitview.mdx @@ -81,15 +81,15 @@ import { ReactSplitview } from 'dockview'; Using the `onReady` prop you can access to the component `api` and add panels either through deserialization or the individual addition of panels. -| Property | Type | Optional | Default | Description | -| ------------------- | -------------------------------------- | -------- | ------------------------ | --------------------------------------------------------------------------- | -| onReady | `(event: SplitviewReadyEvent) => void` | No | | Function | -| components | `Record` | No | | Panel renderers | -| orientation | `Orientation` | Yes | `Orientation.HORIZONTAL` | Orientation of the Splitview | -| proportionalLayout | `boolean` | Yes | `true` | See Proportional layout | -| hideBorders | `boolean` | Yes | `false` | Hide the borders between panels | -| className | `string` | Yes | `''` | Attaches a classname | -| disableAutoResizing | `boolean` | Yes | `false` | See Auto Resizing | +| Property | Type | Optional | Default | Description | +| ------------------- | -------------------------------------- | -------- | ------------------------ | ------------------------------------------------------------------------ | +| onReady | `(event: SplitviewReadyEvent) => void` | No | | Function | +| components | `Record` | No | | Panel renderers | +| orientation | `Orientation` | Yes | `Orientation.HORIZONTAL` | Orientation of the Splitview | +| proportionalLayout | `boolean` | Yes | `true` | See Proportional layout | +| hideBorders | `boolean` | Yes | `false` | Hide the borders between panels | +| className | `string` | Yes | `''` | Attaches a classname | +| disableAutoResizing | `boolean` | Yes | `false` | See Auto Resizing | ## Splitview API @@ -131,9 +131,9 @@ const onReady = (event: SplitviewReadyEvent) => { | | | | updateOptions | `(options: SplitviewComponentUpdateOptions): void` | | | focus | `(): void` | Focus the active panel, if exists | -| layout | `(width: number, height:number): void` | See Auto Resizing | -| fromJSON | `(data: SerializedSplitview): void` | Serialization | -| toJSON | `(): SerializedSplitview` | Serialization | +| layout | `(width: number, height:number): void` | See Auto Resizing | +| fromJSON | `(data: SerializedSplitview): void` | Serialization | +| toJSON | `(): SerializedSplitview` | Serialization | | clear | `(): void` | Clears the current layout | ## Splitview Panel API @@ -148,26 +148,26 @@ const MyComponent = (props: ISplitviewPanelProps<{ title: string }>) => { }; ``` -| Property | Type | Description | -| ---------------------- | ----------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- | -| id | `string` | Panel id | -| isFocused | `boolean` | Is panel focsed | -| isActive | `boolean` | Is panel active | -| isVisible | `boolean` | Is panel visible | -| width | `number` | Panel width | -| height | `number` | Panel height | -| | | | -| onDidDimensionsChange | `Event` | Fires when panel dimensions change | -| onDidFocusChange | `Event` | Fire when panel is focused and blurred | -| onDidVisibilityChange | `Event` | Fires when the panels visiblity property is changed (see Panel Visibility) | -| onDidActiveChange | `Event` | Fires when the panels active property is changed (see Active Panel) | -| onDidConstraintsChange | `onDidConstraintsChange: Event` | Fires when the panels size contrainsts change (see Panel Constraints) | -| | | | -| setVisible | `(isVisible: boolean): void` | | -| setActive | `(): void` | | -| | | | -| setConstraints | `(value: PanelConstraintChangeEvent2): void;` | | -| setSize | `(event: PanelSizeEvent): void` | | +| Property | Type | Description | +| ---------------------- | ----------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | +| id | `string` | Panel id | +| isFocused | `boolean` | Is panel focsed | +| isActive | `boolean` | Is panel active | +| isVisible | `boolean` | Is panel visible | +| width | `number` | Panel width | +| height | `number` | Panel height | +| | | | +| onDidDimensionsChange | `Event` | Fires when panel dimensions change | +| onDidFocusChange | `Event` | Fire when panel is focused and blurred | +| onDidVisibilityChange | `Event` | Fires when the panels visiblity property is changed (see Panel Visibility) | +| onDidActiveChange | `Event` | Fires when the panels active property is changed (see Active Panel) | +| onDidConstraintsChange | `onDidConstraintsChange: Event` | Fires when the panels size contrainsts change (see Panel Constraints) | +| | | | +| setVisible | `(isVisible: boolean): void` | | +| setActive | `(): void` | | +| | | | +| setConstraints | `(value: PanelConstraintChangeEvent2): void;` | | +| setSize | `(event: PanelSizeEvent): void` | | ## Advanced Features