diff --git a/packages/docs/scripts/buildTemplates.mjs b/packages/docs/scripts/buildTemplates.mjs
index bdd2b1171..3e5911937 100644
--- a/packages/docs/scripts/buildTemplates.mjs
+++ b/packages/docs/scripts/buildTemplates.mjs
@@ -14,6 +14,7 @@ const { version } = JSON.parse(
const REACT_VERSION = '18.2.0';
const VUE_VERSION = '3.4.21';
+const ANGULAR_VERSION = '17.0.0';
const DOCKVIEW_VERSION = version; //'latest';;
const USE_LOCAL_CDN = argv.slice(2).includes('--local');
@@ -54,7 +55,20 @@ const DOCKVIEW_CDN = {
'dockview-core/': `${local}/dockview-core/`,
},
},
- angular: {},
+ angular: {
+ remote: {
+ 'dockview-core': `https://cdn.jsdelivr.net/npm/dockview-core@${DOCKVIEW_VERSION}/dist/dockview-core.esm.js`,
+ 'dockview-core/': `https://cdn.jsdelivr.net/npm/dockview-core@${DOCKVIEW_VERSION}/`,
+ 'dockview-angular': `https://cdn.jsdelivr.net/npm/dockview-angular@${DOCKVIEW_VERSION}/dist/dockview-angular.esm.js`,
+ 'dockview-angular/': `https://cdn.jsdelivr.net/npm/dockview-angular@${DOCKVIEW_VERSION}/`,
+ },
+ local: {
+ 'dockview-core': `${local}/dockview-core/dist/dockview-core.esm.js`,
+ 'dockview-core/': `${local}/dockview-core/`,
+ 'dockview-angular': `${local}/dockview-angular/dist/dockview-angular.esm.js`,
+ 'dockview-angular/': `${local}/dockview-angular/`,
+ },
+ },
};
const IMPORTS_PATHS = {
@@ -69,7 +83,14 @@ const IMPORTS_PATHS = {
'vue-sfc-loader': `https://cdn.jsdelivr.net/npm/vue3-sfc-loader@0.9.5/dist/vue3-sfc-loader.js`,
},
typescript: {},
- angular: {},
+ angular: {
+ '@angular/core': `https://esm.sh/@angular/core@${ANGULAR_VERSION}`,
+ '@angular/common': `https://esm.sh/@angular/common@${ANGULAR_VERSION}`,
+ '@angular/platform-browser-dynamic': `https://esm.sh/@angular/platform-browser-dynamic@${ANGULAR_VERSION}`,
+ '@angular/platform-browser': `https://esm.sh/@angular/platform-browser@${ANGULAR_VERSION}`,
+ 'rxjs': `https://esm.sh/rxjs@7.8.1`,
+ 'zone.js': `https://esm.sh/zone.js@0.14.3`,
+ },
};
const template = fs
@@ -94,7 +115,7 @@ const input_dir = path.join(__dirname, '../templates');
const output = path.join(__dirname, '../static/templates');
const COMPONENTS = ['dockview'];
-const FRAMEWORKS = ['react', 'vue', 'typescript'];
+const FRAMEWORKS = ['react', 'vue', 'typescript', 'angular'];
const list = [];
@@ -128,6 +149,8 @@ for (const component of COMPONENTS) {
app:
framework === 'react'
? './src/index.tsx'
+ : framework === 'angular'
+ ? './src/index.ts'
: './src/index.ts',
importPaths: {
...IMPORTS_PATHS[framework],
diff --git a/packages/docs/templates/dockview/basic/angular/src/index.ts b/packages/docs/templates/dockview/basic/angular/src/index.ts
new file mode 100644
index 000000000..29d04df14
--- /dev/null
+++ b/packages/docs/templates/dockview/basic/angular/src/index.ts
@@ -0,0 +1,82 @@
+import 'zone.js';
+import { bootstrapApplication } from '@angular/platform-browser';
+import { Component, Type } from '@angular/core';
+import { DockviewAngularComponent } from 'dockview-angular';
+import 'dockview-core/dist/styles/dockview.css';
+
+// Default panel component
+@Component({
+ selector: 'default-panel',
+ template: `
{{ api.title }}
`,
+ standalone: true,
+})
+export class DefaultPanelComponent {
+ api: any;
+
+ constructor() {}
+}
+
+// Main app component
+@Component({
+ selector: 'app-root',
+ template: `
+
+
+
+
+ `,
+ standalone: true,
+ imports: [DockviewAngularComponent]
+})
+export class AppComponent {
+ components: Record>;
+
+ constructor() {
+ this.components = {
+ default: DefaultPanelComponent,
+ };
+ }
+
+ onReady(event: any) {
+ const api = event.api;
+
+ api.addPanel({
+ id: 'panel_1',
+ component: 'default',
+ });
+
+ api.addPanel({
+ id: 'panel_2',
+ component: 'default',
+ position: {
+ direction: 'right',
+ referencePanel: 'panel_1',
+ },
+ });
+
+ api.addPanel({
+ id: 'panel_3',
+ component: 'default',
+ position: {
+ direction: 'below',
+ referencePanel: 'panel_1',
+ },
+ });
+
+ api.addPanel({
+ id: 'panel_4',
+ component: 'default',
+ });
+
+ api.addPanel({
+ id: 'panel_5',
+ component: 'default',
+ });
+ }
+}
+
+// Bootstrap the application
+bootstrapApplication(AppComponent).catch(err => console.error(err));
\ No newline at end of file
diff --git a/packages/docs/templates/dockview/constraints/angular/src/index.ts b/packages/docs/templates/dockview/constraints/angular/src/index.ts
new file mode 100644
index 000000000..536517868
--- /dev/null
+++ b/packages/docs/templates/dockview/constraints/angular/src/index.ts
@@ -0,0 +1,139 @@
+import 'zone.js';
+import { bootstrapApplication } from '@angular/platform-browser';
+import { Component, OnInit, OnDestroy, Type } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import { DockviewAngularComponent } from 'dockview-angular';
+import { Subject } from 'rxjs';
+import { takeUntil } from 'rxjs/operators';
+import 'dockview-core/dist/styles/dockview.css';
+
+// Default panel component with constraints
+@Component({
+ selector: 'default-panel',
+ template: `
+
+
+
+
+ Maximum Height:
+ {{ constraints.maximumHeight }}px
+
+
+ Minimum Height:
+ {{ constraints.minimumHeight }}px
+
+
+ Maximum Width:
+ {{ constraints.maximumWidth }}px
+
+
+ Minimum Width:
+ {{ constraints.minimumWidth }}px
+
+
+
+ `,
+ standalone: true,
+ imports: [CommonModule]
+})
+export class DefaultPanelComponent implements OnInit, OnDestroy {
+ api: any;
+ constraints: any = null;
+ private destroy$ = new Subject();
+
+ constraintItemStyle = {
+ border: '1px solid grey',
+ margin: '2px',
+ padding: '1px'
+ };
+
+ ngOnInit() {
+ if (this.api?.group?.api?.onDidConstraintsChange) {
+ this.api.group.api.onDidConstraintsChange((event: any) => {
+ this.constraints = event;
+ });
+ }
+ }
+
+ ngOnDestroy() {
+ this.destroy$.next();
+ this.destroy$.complete();
+ }
+
+ onClick() {
+ if (this.api?.group?.api?.setConstraints) {
+ this.api.group.api.setConstraints({
+ maximumWidth: 300,
+ maximumHeight: 300,
+ });
+ }
+ }
+}
+
+// Main app component
+@Component({
+ selector: 'app-root',
+ template: `
+
+
+
+
+ `,
+ standalone: true,
+ imports: [DockviewAngularComponent]
+})
+export class AppComponent {
+ components: Record>;
+
+ constructor() {
+ this.components = {
+ default: DefaultPanelComponent,
+ };
+ }
+
+ onReady(event: any) {
+ const api = event.api;
+
+ const panel1 = api.addPanel({
+ id: 'panel_1',
+ component: 'default',
+ });
+
+ const panel2 = api.addPanel({
+ id: 'panel_2',
+ component: 'default',
+ position: {
+ referencePanel: panel1,
+ direction: 'right',
+ },
+ });
+
+ const panel3 = api.addPanel({
+ id: 'panel_3',
+ component: 'default',
+ position: {
+ referencePanel: panel2,
+ direction: 'right',
+ },
+ });
+
+ const panel4 = api.addPanel({
+ id: 'panel_4',
+ component: 'default',
+ position: {
+ direction: 'below',
+ },
+ });
+ }
+}
+
+// Bootstrap the application
+bootstrapApplication(AppComponent).catch(err => console.error(err));
\ No newline at end of file