Skip to content

Commit 2becd96

Browse files
committed
feat: add formatting side menu example
1 parent 1b698ab commit 2becd96

File tree

13 files changed

+251
-5
lines changed

13 files changed

+251
-5
lines changed

docs/src/app/app.routes.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import { AlertBlockPage } from '../pages/examples/custom/alert-block/alert-block
1111
import { ApiContentBlockPage } from '../pages/examples/custom/api-content-block/api-content-block.page';
1212
import { ExamplesPage } from '../pages/examples/examples.page';
1313
import { ConvertToHtmlPage } from '../pages/examples/interoperability/convert-to-html/convert-to-html.page';
14+
import { FormattingSideMenuButtonsPage } from '../pages/examples/ui-components/formatting-side-menu-buttons/formatting-side-menu-buttons.page';
1415
import { FormattingToolbarButtonsPage } from '../pages/examples/ui-components/formatting-toolbar-buttons/formatting-toolbar-buttons.page';
1516
import { OverviewPage } from '../pages/overview.page';
1617

@@ -58,6 +59,10 @@ export const appRoutes: Route[] = [
5859
path: 'ui-components/formatting-toolbar-buttons',
5960
component: FormattingToolbarButtonsPage,
6061
},
62+
{
63+
path: 'ui-components/formatting-side-menu-buttons',
64+
component: FormattingSideMenuButtonsPage,
65+
},
6166
{ path: '**', redirectTo: 'overview' },
6267
],
6368
},

docs/src/pages/examples/examples.page.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,13 @@ import { HlmButtonDirective } from '@spartan-ng/ui-button-helm';
106106
routerLink="ui-components/formatting-toolbar-buttons"
107107
>Formatting Toolbar Buttons</a
108108
>
109+
<a
110+
hlmBtn
111+
variant="ghost"
112+
class="justify-start"
113+
routerLink="ui-components/formatting-side-menu-buttons"
114+
>Formatting Side Menu Buttons</a
115+
>
109116
</aside>
110117
<main class="overflow-hidden py-6">
111118
<router-outlet class="hidden"></router-outlet>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
import { CommonModule } from '@angular/common';
2+
import { Component } from '@angular/core';
3+
import { PartialBlock } from '@blocknote/core';
4+
import {
5+
BasicTextStyleButtonComponent,
6+
BnaDragHandleMenuComponent,
7+
BnaEditorComponent,
8+
BnaSideMenuComponent,
9+
BnaSideMenuControllerDirective,
10+
} from '@dytab/block-note-angular';
11+
import { HlmButtonDirective } from '@spartan-ng/ui-button-helm';
12+
import { RemoveBlockButtonComponent } from './remove-block-button.component';
13+
14+
@Component({
15+
selector: 'bna-basic-setup-example',
16+
standalone: true,
17+
imports: [
18+
CommonModule,
19+
BnaEditorComponent,
20+
BasicTextStyleButtonComponent,
21+
HlmButtonDirective,
22+
BnaSideMenuControllerDirective,
23+
BnaSideMenuComponent,
24+
RemoveBlockButtonComponent,
25+
BnaDragHandleMenuComponent,
26+
],
27+
template: `<bna-editor [initialContent]="initialContent">
28+
<bna-side-menu-controller>
29+
<bna-side-menu>
30+
<bna-remove-block-button /> <bna-drag-handle-menu-btn
31+
/></bna-side-menu>
32+
</bna-side-menu-controller>
33+
</bna-editor> `,
34+
})
35+
export class FormattingSideMenuButtonsExample {
36+
initialContent: PartialBlock[] = [
37+
{
38+
type: 'paragraph',
39+
content: 'Welcome to this demo!',
40+
},
41+
{
42+
type: 'paragraph',
43+
content: '<- Notice the new button in the side menu',
44+
},
45+
{
46+
type: 'paragraph',
47+
content: 'Click it to remove the hovered block',
48+
},
49+
{
50+
type: 'paragraph',
51+
},
52+
];
53+
}
54+
55+
export const formattingSideMenuButtonsExampleCode = `import { CommonModule } from '@angular/common';
56+
import { Component } from '@angular/core';
57+
import { BnaEditorComponent } from '@dytab/block-note-angular';
58+
59+
@Component({
60+
standalone: true,
61+
imports: [CommonModule, BnaEditorComponent],
62+
template: \` <bna-editor [initialContent]="initialContent" /> \`,
63+
})
64+
export class BasicSetupExample {
65+
initialContent = undefined;
66+
}`;
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
import { CommonModule } from '@angular/common';
2+
import { Component } from '@angular/core';
3+
import {
4+
HlmTabsComponent,
5+
HlmTabsContentDirective,
6+
HlmTabsListComponent,
7+
HlmTabsTriggerDirective,
8+
} from '@spartan-ng/ui-tabs-helm';
9+
import { hlmP } from '@spartan-ng/ui-typography-helm';
10+
import { Highlight } from 'ngx-highlightjs';
11+
import { CodeComponent } from '../../../../shared/code/code.component';
12+
import { DemoBoxComponent } from '../../../../shared/layout/demo-box.component';
13+
import { TabsComponent } from '../../../../shared/layout/example-tabs.component';
14+
import { SectionIntroComponent } from '../../../../shared/layout/section-intro.component';
15+
import {
16+
FormattingSideMenuButtonsExample,
17+
formattingSideMenuButtonsExampleCode,
18+
} from './formatting-side-menu-buttons.example';
19+
20+
@Component({
21+
standalone: true,
22+
imports: [
23+
CommonModule,
24+
SectionIntroComponent,
25+
DemoBoxComponent,
26+
HlmTabsComponent,
27+
HlmTabsListComponent,
28+
HlmTabsContentDirective,
29+
HlmTabsTriggerDirective,
30+
TabsComponent,
31+
CodeComponent,
32+
FormattingSideMenuButtonsExample,
33+
Highlight,
34+
],
35+
template: `
36+
<bna-section-intro name="Adding Formatting Toolbar Buttons">
37+
<p class="${hlmP} mb-8">
38+
In this example, we add a blue text/background color and code style
39+
button to the Formatting Toolbar.
40+
</p>
41+
<p>
42+
<strong>Try it out</strong>: Select some text to open the Formatting
43+
Toolbar, and click one of the new buttons!
44+
</p>
45+
</bna-section-intro>
46+
<hlm-tabs tab="preview">
47+
<bna-example-tabs firstTab="Preview" secondTab="Code">
48+
<bna-demo-box firstTab>
49+
<bna-basic-setup-example />
50+
</bna-demo-box>
51+
<bna-code [code]="exampleCode" secondTab />
52+
</bna-example-tabs>
53+
</hlm-tabs>
54+
`,
55+
})
56+
export class FormattingSideMenuButtonsPage {
57+
exampleCode = formattingSideMenuButtonsExampleCode;
58+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import { ComponentFixture, TestBed } from '@angular/core/testing';
2+
import { RemoveBlockButtonComponent } from './remove-block-button.component';
3+
4+
describe('RemoveBlockButtonComponent', () => {
5+
let component: RemoveBlockButtonComponent;
6+
let fixture: ComponentFixture<RemoveBlockButtonComponent>;
7+
8+
beforeEach(async () => {
9+
await TestBed.configureTestingModule({
10+
imports: [RemoveBlockButtonComponent],
11+
}).compileComponents();
12+
13+
fixture = TestBed.createComponent(RemoveBlockButtonComponent);
14+
component = fixture.componentInstance;
15+
fixture.detectChanges();
16+
});
17+
18+
it('should create', () => {
19+
expect(component).toBeTruthy();
20+
});
21+
});
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import { CommonModule } from '@angular/common';
2+
import { Component, effect } from '@angular/core';
3+
import { Block } from '@blocknote/core';
4+
import { BlockNoteAngularService } from '@dytab/block-note-angular';
5+
import { provideIcons } from '@ng-icons/core';
6+
import { lucideTrash } from '@ng-icons/lucide';
7+
import { HlmButtonDirective } from '@spartan-ng/ui-button-helm';
8+
import { HlmIconComponent } from '@spartan-ng/ui-icon-helm';
9+
10+
@Component({
11+
selector: 'bna-remove-block-button',
12+
standalone: true,
13+
imports: [CommonModule, HlmButtonDirective, HlmIconComponent],
14+
providers: [provideIcons({ lucideTrash })],
15+
template: ` <button hlmBtn size="xs" variant="ghost" (click)="deleteBlock()">
16+
<hlm-icon size="xs" name="lucideTrash" />
17+
</button>`,
18+
styles: ``,
19+
})
20+
export class RemoveBlockButtonComponent {
21+
block?: Block;
22+
constructor(public blockNoteAngularService: BlockNoteAngularService) {
23+
effect(() => {
24+
const editor = blockNoteAngularService.editor();
25+
if (!editor) {
26+
return;
27+
}
28+
editor.sideMenu.onUpdate((state) => {
29+
this.block = state.block;
30+
});
31+
});
32+
}
33+
34+
deleteBlock() {
35+
const editor = this.blockNoteAngularService.editor();
36+
if (!editor || !this.block) {
37+
return;
38+
}
39+
this.blockNoteAngularService.editor()!.removeBlocks([this.block]);
40+
}
41+
}

libs/block-note-angular/src/index.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,7 @@ export * from './lib/interfaces/block-note-editor-options.type';
44
export * from './lib/components/bna-formatting-toolbar/bna-formatting-toolbar-controller.directive';
55
export * from './lib/components/bna-formatting-toolbar/bna-formatting-toolbar.component';
66
export * from './lib/components/buttons/basic-text-style-button/basic-text-style-button.component';
7+
export * from './lib/components/bna-side-menu/bna-side-menu.component';
8+
export * from './lib/components/bna-side-menu/bna-side-menu-controller.directive';
9+
export * from './lib/components/bna-side-menu/default-buttons/drag-handle-menu/bna-drag-handle-menu.component';
10+
export * from './lib/components/bna-side-menu/default-buttons/add-block-button/bna-add-block-button.component';

libs/block-note-angular/src/lib/block-note-editor/bna-editor.component.html

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,17 @@
1515
</bna-formatting-toolbar>
1616
</bna-formatting-toolbar-controller>
1717
</ng-container>
18-
19-
<bna-side-menu-controller class="text-gray-500">
20-
<bna-add-block-btn />
21-
<bna-drag-handle-menu-btn />
22-
</bna-side-menu-controller>
18+
<div #sideMenuController>
19+
<ng-content select="bna-side-menu-controller"></ng-content>
20+
</div>
21+
<ng-container *ngIf="!sideMenuController.hasChildNodes()">
22+
<bna-side-menu-controller>
23+
<bna-side-menu>
24+
<bna-add-block-btn />
25+
<bna-drag-handle-menu-btn />
26+
</bna-side-menu>
27+
</bna-side-menu-controller>
28+
</ng-container>
2329
<bna-view-controller
2430
class="block ProseMirror bn-editor relative bn-default-styles"
2531
/>

libs/block-note-angular/src/lib/block-note-editor/bna-editor.component.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ import { BnaFilePanelComponent } from '../components/bna-file-panel/bna-file-pan
4040
import { BnaFormattingToolbarControllerDirective } from '../components/bna-formatting-toolbar/bna-formatting-toolbar-controller.directive';
4141
import { BnaFormattingToolbarComponent } from '../components/bna-formatting-toolbar/bna-formatting-toolbar.component';
4242
import { BnaSideMenuControllerDirective } from '../components/bna-side-menu/bna-side-menu-controller.directive';
43+
import { BnaSideMenuComponent } from '../components/bna-side-menu/bna-side-menu.component';
4344
import { BnaAddBlockButtonComponent } from '../components/bna-side-menu/default-buttons/add-block-button/bna-add-block-button.component';
4445
import { BnaDragHandleMenuComponent } from '../components/bna-side-menu/default-buttons/drag-handle-menu/bna-drag-handle-menu.component';
4546
import { BnaSuggestionsMenuControllerDirective } from '../components/bna-suggestions-menu/bna-suggestions-menu-controller.directive';
@@ -73,6 +74,7 @@ import { BlockNoteAngularService } from '../services/block-note-angular.service'
7374
HlmInputDirective,
7475
BnaFilePanelControllerDirective,
7576
BnaFormattingToolbarComponent,
77+
BnaSideMenuComponent,
7678
],
7779
providers: [BlockNoteAngularService],
7880
selector: 'bna-editor',

libs/block-note-angular/src/lib/components/bna-side-menu/bna-side-menu.component.css

Whitespace-only changes.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
<ng-content></ng-content>
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import { ComponentFixture, TestBed } from '@angular/core/testing';
2+
import { BnaSideMenuComponent } from './bna-side-menu.component';
3+
4+
describe('SideMenuComponent', () => {
5+
let component: BnaSideMenuComponent;
6+
let fixture: ComponentFixture<BnaSideMenuComponent>;
7+
8+
beforeEach(async () => {
9+
await TestBed.configureTestingModule({
10+
imports: [BnaSideMenuComponent],
11+
}).compileComponents();
12+
13+
fixture = TestBed.createComponent(BnaSideMenuComponent);
14+
component = fixture.componentInstance;
15+
fixture.detectChanges();
16+
});
17+
18+
it('should create', () => {
19+
expect(component).toBeTruthy();
20+
});
21+
});
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import { CommonModule } from '@angular/common';
2+
import { Component } from '@angular/core';
3+
4+
@Component({
5+
selector: 'bna-side-menu',
6+
standalone: true,
7+
imports: [CommonModule],
8+
templateUrl: './bna-side-menu.component.html',
9+
styleUrl: './bna-side-menu.component.css',
10+
host: {
11+
class: 'text-gray-500',
12+
},
13+
})
14+
export class BnaSideMenuComponent {}

0 commit comments

Comments
 (0)