@doug-williamson/ng-rhombus 2.0.0-beta.2 → 2.0.0-beta.3

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.
@@ -401,6 +401,11 @@ const NG_RHOMBUS_SEO_ADAPTER = new InjectionToken('NG_RHOMBUS_SEO_ADAPTER', {
401
401
  }),
402
402
  });
403
403
 
404
+ const NG_RHOMBUS_SITE_METADATA = new InjectionToken('NG_RHOMBUS_SITE_METADATA', {
405
+ providedIn: 'root',
406
+ factory: () => ({}),
407
+ });
408
+
404
409
  /*
405
410
  * Public API Surface of @doug-williamson/ng-rhombus/shell
406
411
  */
@@ -453,30 +458,39 @@ class NgRhombusBlogListComponent {
453
458
  constructor() {
454
459
  this.goToRoute = new EventEmitter();
455
460
  this.#seo = inject(NG_RHOMBUS_SEO_ADAPTER);
456
- this.#platformId = inject(PLATFORM_ID);
457
461
  this.#document = inject(DOCUMENT);
462
+ this.#site = inject(NG_RHOMBUS_SITE_METADATA);
458
463
  this.dataSource = input([], ...(ngDevMode ? [{ debugName: "dataSource" }] : []));
459
464
  this.timestampToMillis = ngRhombusTimestampToMillis;
460
465
  }
461
466
  #seo;
462
- #platformId;
463
467
  #document;
468
+ #site;
464
469
  ngOnInit() {
465
- const origin = isPlatformBrowser(this.#platformId) ? this.#document.location?.origin : undefined;
466
- const imageUrl = origin ? new URL('/fav.ico', origin).toString() : '/fav.ico';
470
+ const origin = this.#site.origin ?? this.#document.location?.origin;
471
+ const path = this.#document.location?.pathname ?? '/latest';
472
+ const pageUrl = origin ? new URL(path, origin).toString() : path;
473
+ const imagePath = '/favicon.ico';
474
+ const imageUrl = origin ? new URL(imagePath, origin).toString() : imagePath;
475
+ const siteName = this.#site.siteName ?? 'Rhombus Software';
467
476
  // Document title
468
477
  this.#seo.setTitle('Blog - Doug Williamson');
469
478
  // Basic meta
470
479
  this.#seo.updateTag({ name: 'description', content: 'This is my personal collection of blog posts.' });
471
480
  // Open Graph
472
- this.#seo.updateTag({ property: 'og:type', content: 'article' });
481
+ this.#seo.updateTag({ property: 'og:type', content: 'website' });
482
+ this.#seo.updateTag({ property: 'og:site_name', content: siteName });
473
483
  this.#seo.updateTag({ property: 'og:title', content: 'Blog - Doug Williamson' });
474
484
  this.#seo.updateTag({ property: 'og:description', content: 'This is my personal collection of blog posts.' });
485
+ this.#seo.updateTag({ property: 'og:url', content: pageUrl });
475
486
  this.#seo.updateTag({ property: 'og:image', content: imageUrl });
476
487
  // Twitter Card
477
488
  this.#seo.updateTag({ name: 'twitter:card', content: 'summary' });
489
+ if (this.#site.twitterSite)
490
+ this.#seo.updateTag({ name: 'twitter:site', content: this.#site.twitterSite });
478
491
  this.#seo.updateTag({ name: 'twitter:title', content: 'Blog - Doug Williamson' });
479
492
  this.#seo.updateTag({ name: 'twitter:description', content: 'This is my personal collection of blog posts.' });
493
+ this.#seo.updateTag({ name: 'twitter:url', content: pageUrl });
480
494
  this.#seo.updateTag({ name: 'twitter:image', content: imageUrl });
481
495
  }
482
496
  goToBlogPost(id) {
@@ -998,7 +1012,7 @@ class NgRhombusBlogAddEditComponent {
998
1012
  }
999
1013
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.4", ngImport: i0, type: NgRhombusBlogAddEditComponent, decorators: [{
1000
1014
  type: Component,
1001
- args: [{ selector: 'ng-rhombus-blog-form', imports: [NgClass, MatListModule, MatDividerModule, MatButtonModule, MatCardModule, MatFormFieldModule, MatInputModule, MatProgressSpinnerModule, MatSidenavModule, ReactiveFormsModule, ThumbnailControlComponent, MatIconModule, NgRhombusMarkdownComponent, MatSelectModule], template: "<div class=\"h-full flex flex-row overflow-hidden min-h-0\">\r\n\t<div class=\"flex flex-col w-1/2 p-4 overflow-y-auto min-h-0\">\r\n\t\t<form novalidate class=\"flex flex-col gap-4 min-h-0\" [formGroup]=\"blogPostForm\">\r\n\t\t\t<mat-form-field>\r\n\t\t\t\t<mat-label>Title</mat-label>\r\n\t\t\t\t<input matInput placeholder=\"Placeholder\" formControlName=\"title\">\r\n\t\t\t</mat-form-field>\r\n\t\t\t<mat-form-field>\r\n\t\t\t\t<mat-label>Description</mat-label>\r\n\t\t\t\t<input matInput placeholder=\"Placeholder\" formControlName=\"description\">\r\n\t\t\t</mat-form-field>\r\n\t\t\t<ng-rhombus-thumbnail-control [thumbnailSrc]=\"thumbnailSource\" [width]=\"200\" [height]=\"112\"\r\n\t\t\t\t[displayMode]=\"'indicator'\" [disabled]=\"blogPost() !== undefined\"\r\n\t\t\t\t(onFileUploaded)=\"onFileUploaded($event)\"\r\n\t\t\t\t(onFileDeleted)=\"onFileDeleted()\"></ng-rhombus-thumbnail-control>\r\n\t\t\t<mat-form-field class=\"w-full\">\r\n\t\t\t\t<mat-label>Content</mat-label>\r\n\t\t\t\t<textarea matInput required class=\"content-textarea\" rows=\"12\" formControlName=\"content\"\r\n\t\t\t\t\t(input)=\"onContentChange()\"></textarea>\r\n\t\t\t</mat-form-field>\r\n\t\t\t<div class=\"grid grid-cols-1 sm:grid-cols-2 gap-4\">\r\n\t\t\t\t<mat-form-field class=\"w-full\">\r\n\t\t\t\t\t<mat-label>Content Pillar (optional for From The Editor)</mat-label>\r\n\t\t\t\t\t<mat-select formControlName=\"pillar\" required>\r\n\t\t\t\t\t\t@for (p of pillars; track p) {\r\n\t\t\t\t\t\t<mat-option [value]=\"p\">{{ p }}</mat-option>\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t</mat-select>\r\n\t\t\t\t</mat-form-field>\r\n\r\n\t\t\t\t<mat-form-field class=\"w-full\">\r\n\t\t\t\t\t<mat-label>Series</mat-label>\r\n\t\t\t\t\t<mat-select formControlName=\"series\" required>\r\n\t\t\t\t\t\t@for (s of seriesOptions; track s) {\r\n\t\t\t\t\t\t<mat-option [value]=\"s\">{{ s }}</mat-option>\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t</mat-select>\r\n\t\t\t\t</mat-form-field>\r\n\t\t\t</div>\r\n\t\t\t<mat-form-field>\r\n\t\t\t\t<mat-label>Tags</mat-label>\r\n\t\t\t\t<input matInput formControlName=\"tagsCsv\" placeholder=\"3\u20136 tags, comma-separated\">\r\n\t\t\t\t<mat-hint>Example: angular, firestore, testing</mat-hint>\r\n\t\t\t</mat-form-field>\r\n\t\t\t<div class=\"flex\">\r\n\t\t\t\t<button mat-raised-button class=\"\" (click)=\"onCancelClick()\" type=\"button\">Cancel</button>\r\n\t\t\t\t<div class=\"flex-1\"></div>\r\n\t\t\t\t<button mat-flat-button [disabled]=\"blogPostForm.invalid\" type=\"button\"\r\n\t\t\t\t\t(click)=\"onSubmit()\">Submit</button>\r\n\t\t\t</div>\r\n\t\t</form>\r\n\t</div>\r\n\r\n\t<div class=\"flex flex-col w-1/2 p-4 overflow-y-auto\">\r\n\t\t<mat-card>\r\n\t\t\t<mat-card-header>\r\n\t\t\t\t<mat-card-title>{{ blogPostForm.getRawValue().title }}</mat-card-title>\r\n\t\t\t\t<mat-card-subtitle>{{ blogPostForm.getRawValue().description }}</mat-card-subtitle>\r\n\t\t\t</mat-card-header>\r\n\t\t\t<img mat-card-image [src]=\"blogPostForm.getRawValue().thumbnail\" />\r\n\t\t\t<mat-card-content>\r\n\t\t\t\t<ng-rhombus-markdown [classes]=\"{ 'prose': true, 'dark:prose-invert': themeService.isDarkMode() }\"\r\n\t\t\t\t\t[data]=\"contentData()\" />\r\n\t\t\t</mat-card-content>\r\n\t\t\t<mat-card-footer>\r\n\t\t\t\t<span class=\"flex flex-row-reverse\">Doug Williamson</span>\r\n\t\t\t</mat-card-footer>\r\n\t\t</mat-card>\r\n\t</div>\r\n</div>", styles: [".mat-mdc-card-header,.mat-mdc-card-content,.mat-mdc-card-footer{padding:32px 16px}.content-textarea{resize:vertical}\n"] }]
1015
+ args: [{ selector: 'ng-rhombus-blog-form', imports: [MatListModule, MatDividerModule, MatButtonModule, MatCardModule, MatFormFieldModule, MatInputModule, MatProgressSpinnerModule, MatSidenavModule, ReactiveFormsModule, ThumbnailControlComponent, MatIconModule, NgRhombusMarkdownComponent, MatSelectModule], template: "<div class=\"h-full flex flex-row overflow-hidden min-h-0\">\r\n\t<div class=\"flex flex-col w-1/2 p-4 overflow-y-auto min-h-0\">\r\n\t\t<form novalidate class=\"flex flex-col gap-4 min-h-0\" [formGroup]=\"blogPostForm\">\r\n\t\t\t<mat-form-field>\r\n\t\t\t\t<mat-label>Title</mat-label>\r\n\t\t\t\t<input matInput placeholder=\"Placeholder\" formControlName=\"title\">\r\n\t\t\t</mat-form-field>\r\n\t\t\t<mat-form-field>\r\n\t\t\t\t<mat-label>Description</mat-label>\r\n\t\t\t\t<input matInput placeholder=\"Placeholder\" formControlName=\"description\">\r\n\t\t\t</mat-form-field>\r\n\t\t\t<ng-rhombus-thumbnail-control [thumbnailSrc]=\"thumbnailSource\" [width]=\"200\" [height]=\"112\"\r\n\t\t\t\t[displayMode]=\"'indicator'\" [disabled]=\"blogPost() !== undefined\"\r\n\t\t\t\t(onFileUploaded)=\"onFileUploaded($event)\"\r\n\t\t\t\t(onFileDeleted)=\"onFileDeleted()\"></ng-rhombus-thumbnail-control>\r\n\t\t\t<mat-form-field class=\"w-full\">\r\n\t\t\t\t<mat-label>Content</mat-label>\r\n\t\t\t\t<textarea matInput required class=\"content-textarea\" rows=\"12\" formControlName=\"content\"\r\n\t\t\t\t\t(input)=\"onContentChange()\"></textarea>\r\n\t\t\t</mat-form-field>\r\n\t\t\t<div class=\"grid grid-cols-1 sm:grid-cols-2 gap-4\">\r\n\t\t\t\t<mat-form-field class=\"w-full\">\r\n\t\t\t\t\t<mat-label>Content Pillar (optional for From The Editor)</mat-label>\r\n\t\t\t\t\t<mat-select formControlName=\"pillar\" required>\r\n\t\t\t\t\t\t@for (p of pillars; track p) {\r\n\t\t\t\t\t\t<mat-option [value]=\"p\">{{ p }}</mat-option>\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t</mat-select>\r\n\t\t\t\t</mat-form-field>\r\n\r\n\t\t\t\t<mat-form-field class=\"w-full\">\r\n\t\t\t\t\t<mat-label>Series</mat-label>\r\n\t\t\t\t\t<mat-select formControlName=\"series\" required>\r\n\t\t\t\t\t\t@for (s of seriesOptions; track s) {\r\n\t\t\t\t\t\t<mat-option [value]=\"s\">{{ s }}</mat-option>\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t</mat-select>\r\n\t\t\t\t</mat-form-field>\r\n\t\t\t</div>\r\n\t\t\t<mat-form-field>\r\n\t\t\t\t<mat-label>Tags</mat-label>\r\n\t\t\t\t<input matInput formControlName=\"tagsCsv\" placeholder=\"3\u20136 tags, comma-separated\">\r\n\t\t\t\t<mat-hint>Example: angular, firestore, testing</mat-hint>\r\n\t\t\t</mat-form-field>\r\n\t\t\t<div class=\"flex\">\r\n\t\t\t\t<button mat-raised-button class=\"\" (click)=\"onCancelClick()\" type=\"button\">Cancel</button>\r\n\t\t\t\t<div class=\"flex-1\"></div>\r\n\t\t\t\t<button mat-flat-button [disabled]=\"blogPostForm.invalid\" type=\"button\"\r\n\t\t\t\t\t(click)=\"onSubmit()\">Submit</button>\r\n\t\t\t</div>\r\n\t\t</form>\r\n\t</div>\r\n\r\n\t<div class=\"flex flex-col w-1/2 p-4 overflow-y-auto\">\r\n\t\t<mat-card>\r\n\t\t\t<mat-card-header>\r\n\t\t\t\t<mat-card-title>{{ blogPostForm.getRawValue().title }}</mat-card-title>\r\n\t\t\t\t<mat-card-subtitle>{{ blogPostForm.getRawValue().description }}</mat-card-subtitle>\r\n\t\t\t</mat-card-header>\r\n\t\t\t<img mat-card-image [src]=\"blogPostForm.getRawValue().thumbnail\" />\r\n\t\t\t<mat-card-content>\r\n\t\t\t\t<ng-rhombus-markdown [classes]=\"{ 'prose': true, 'dark:prose-invert': themeService.isDarkMode() }\"\r\n\t\t\t\t\t[data]=\"contentData()\" />\r\n\t\t\t</mat-card-content>\r\n\t\t\t<mat-card-footer>\r\n\t\t\t\t<span class=\"flex flex-row-reverse\">Doug Williamson</span>\r\n\t\t\t</mat-card-footer>\r\n\t\t</mat-card>\r\n\t</div>\r\n</div>", styles: [".mat-mdc-card-header,.mat-mdc-card-content,.mat-mdc-card-footer{padding:32px 16px}.content-textarea{resize:vertical}\n"] }]
1002
1016
  }], ctorParameters: () => [], propDecorators: { blogPost: [{ type: i0.Input, args: [{ isSignal: true, alias: "blogPost", required: false }] }], cancelEvent: [{ type: i0.Output, args: ["cancelEvent"] }], submitEvent: [{ type: i0.Output, args: ["submitEvent"] }], blogPostPreview: [{
1003
1017
  type: ViewChild,
1004
1018
  args: ['blogPost']
@@ -1069,7 +1083,7 @@ class NgRhombusBlogPostComponent {
1069
1083
  }
1070
1084
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.4", ngImport: i0, type: NgRhombusBlogPostComponent, decorators: [{
1071
1085
  type: Component,
1072
- args: [{ selector: 'ng-rhombus-blog-post', imports: [DatePipe, NgClass, NgRhombusMarkdownComponent, MatCardModule, MatMenuModule, MatIconModule, MatButtonModule, MatChipsModule, FontAwesomeModule], template: "<mat-card>\r\n\t<mat-card-header>\r\n\t\t<mat-card-title>{{ dataSource()?.title }}</mat-card-title>\r\n\t\t<mat-card-subtitle>\r\n\t\t\t@if (contentPillar || series) {\r\n\t\t\t<mat-chip-set aria-label=\"Post taxonomy\" role=\"list\">\r\n\t\t\t\t@if (contentPillar) {\r\n\t\t\t\t<mat-chip role=\"listitem\" class=\"primary-chips-theme\" [highlighted]=\"true\">Pillar: {{ contentPillar\r\n\t\t\t\t\t}}</mat-chip>\r\n\t\t\t\t}\r\n\t\t\t\t@if (series) {\r\n\t\t\t\t<mat-chip role=\"listitem\" class=\"secondary-chips-theme\" [highlighted]=\"true\">Series: {{ series\r\n\t\t\t\t\t}}</mat-chip>\r\n\t\t\t\t}\r\n\t\t\t</mat-chip-set>\r\n\t\t\t}\r\n\t\t</mat-card-subtitle>\r\n\t</mat-card-header>\r\n\t<mat-card-content>\r\n\t\t<div class=\"flex items-center justify-between\">\r\n\t\t\t<p class=\"timestamp\">\r\n\t\t\t\t{{ dataSource()?.readTimeMinutes }} {{ dataSource()?.readTimeMinutes === 1 ? 'min' : 'mins' }}\r\n\t\t\t\t&middot;\r\n\t\t\t\t{{ timestampToMillis(dataSource()?.timestamp) | date: 'MMM d, y' }}\r\n\t\t\t</p>\r\n\t\t\t<div class=\"flex-1\"></div>\r\n\t\t\t<button matIconButton [matMenuTriggerFor]=\"shareMenu\" aria-label=\"Share post\">\r\n\t\t\t\t<mat-icon>share</mat-icon>\r\n\t\t\t</button>\r\n\t\t</div>\r\n\r\n\t\t<mat-menu #shareMenu=\"matMenu\">\r\n\t\t\t<a mat-menu-item [href]=\"shareLinks.twitter\" target=\"_blank\" rel=\"noopener\">\r\n\t\t\t\t<fa-icon [icon]=\"faXTwitter\" class=\"mr-2\"></fa-icon>\r\n\t\t\t\t<span>Share on X</span>\r\n\t\t\t</a>\r\n\t\t\t<a mat-menu-item [href]=\"shareLinks.facebook\" target=\"_blank\" rel=\"noopener\">\r\n\t\t\t\t<fa-icon [icon]=\"faFacebook\" class=\"mr-2\"></fa-icon>\r\n\t\t\t\t<span>Share on Facebook</span>\r\n\t\t\t</a>\r\n\t\t\t<a mat-menu-item [href]=\"shareLinks.bluesky\" target=\"_blank\" rel=\"noopener\">\r\n\t\t\t\t<fa-icon [icon]=\"faBluesky\" class=\"mr-2\"></fa-icon>\r\n\t\t\t\t<span>Share on Bluesky</span>\r\n\t\t\t</a>\r\n\t\t\t<a mat-menu-item [href]=\"shareLinks.linkedin\" target=\"_blank\" rel=\"noopener\">\r\n\t\t\t\t<fa-icon [icon]=\"faLinkedin\" class=\"mr-2\"></fa-icon>\r\n\t\t\t\t<span>Share on LinkedIn</span>\r\n\t\t\t</a>\r\n\t\t\t<button mat-menu-item (click)=\"copyLink()\">\r\n\t\t\t\t<mat-icon>content_copy</mat-icon>\r\n\t\t\t\t<span>Copy link</span>\r\n\t\t\t</button>\r\n\t\t</mat-menu>\r\n\t</mat-card-content>\r\n\t<img mat-card-image [src]=\"dataSource()?.thumbnail\" />\r\n\t<mat-card-content class=\"content\">\r\n\t\t<ng-rhombus-markdown\r\n\t\t\t[classes]=\"{ 'prose': true, 'dark:prose-invert': themeService.isDarkMode() }\"\r\n\t\t\t[data]=\"dataSource()?.content\"\r\n\t\t/>\r\n\t</mat-card-content>\r\n\t@if (tags.length) {\r\n\t<mat-card-content>\r\n\t\t<mat-chip-set aria-label=\"Post tags\" role=\"list\">\r\n\t\t\t@for (t of tags; track t) {\r\n\t\t\t<mat-chip role=\"listitem\" highlighted=\"true\" class=\"neutral-chips-theme\">#{{ t }}</mat-chip>\r\n\t\t\t}\r\n\t\t</mat-chip-set>\r\n\t</mat-card-content>\r\n\t}\r\n</mat-card>", styles: [".neutral-chips-theme{--mat-chip-outline-color: var(--mat-sys-surface-variant);--mat-chip-elevated-selected-container-color: var(--mat-sys-surface-variant);--mat-chip-selected-label-text-color: var(--mat-sys-on-surface-variant);box-shadow:0 3px 5px -1px #0003,0 6px 10px #00000024,0 1px 18px #0000001f}.primary-chips-theme{--mat-chip-outline-color: var(--mat-sys-primary);--mat-chip-elevated-selected-container-color: var(--mat-sys-primary);--mat-chip-selected-label-text-color: var(--mat-sys-on-primary);box-shadow:0 3px 5px -1px #0003,0 6px 10px #00000024,0 1px 18px #0000001f}.secondary-chips-theme{--mat-chip-outline-color: var(--mat-sys-secondary);--mat-chip-elevated-selected-container-color: var(--mat-sys-secondary);--mat-chip-selected-label-text-color: var(--mat-sys-on-secondary);box-shadow:0 3px 5px -1px #0003,0 6px 10px #00000024,0 1px 18px #0000001f}.card-image{--mat-card-elevated-container-shape: var(--mat-sys-shape-medium)}.mat-mdc-card-header{padding:32px 32px 16px}.mat-mdc-card-footer,.mat-mdc-card-content{padding:0 32px 32px}.content{padding:32px}.mat-mdc-card-title{margin-bottom:12px}.mat-mdc-card{border-radius:0}\n"] }]
1086
+ args: [{ selector: 'ng-rhombus-blog-post', imports: [DatePipe, NgRhombusMarkdownComponent, MatCardModule, MatMenuModule, MatIconModule, MatButtonModule, MatChipsModule, FontAwesomeModule], template: "<mat-card>\r\n\t<mat-card-header>\r\n\t\t<mat-card-title>{{ dataSource()?.title }}</mat-card-title>\r\n\t\t<mat-card-subtitle>\r\n\t\t\t@if (contentPillar || series) {\r\n\t\t\t<mat-chip-set aria-label=\"Post taxonomy\" role=\"list\">\r\n\t\t\t\t@if (contentPillar) {\r\n\t\t\t\t<mat-chip role=\"listitem\" class=\"primary-chips-theme\" [highlighted]=\"true\">Pillar: {{ contentPillar\r\n\t\t\t\t\t}}</mat-chip>\r\n\t\t\t\t}\r\n\t\t\t\t@if (series) {\r\n\t\t\t\t<mat-chip role=\"listitem\" class=\"secondary-chips-theme\" [highlighted]=\"true\">Series: {{ series\r\n\t\t\t\t\t}}</mat-chip>\r\n\t\t\t\t}\r\n\t\t\t</mat-chip-set>\r\n\t\t\t}\r\n\t\t</mat-card-subtitle>\r\n\t</mat-card-header>\r\n\t<mat-card-content>\r\n\t\t<div class=\"flex items-center justify-between\">\r\n\t\t\t<p class=\"timestamp\">\r\n\t\t\t\t{{ dataSource()?.readTimeMinutes }} {{ dataSource()?.readTimeMinutes === 1 ? 'min' : 'mins' }}\r\n\t\t\t\t&middot;\r\n\t\t\t\t{{ timestampToMillis(dataSource()?.timestamp) | date: 'MMM d, y' }}\r\n\t\t\t</p>\r\n\t\t\t<div class=\"flex-1\"></div>\r\n\t\t\t<button matIconButton [matMenuTriggerFor]=\"shareMenu\" aria-label=\"Share post\">\r\n\t\t\t\t<mat-icon>share</mat-icon>\r\n\t\t\t</button>\r\n\t\t</div>\r\n\r\n\t\t<mat-menu #shareMenu=\"matMenu\">\r\n\t\t\t<a mat-menu-item [href]=\"shareLinks.twitter\" target=\"_blank\" rel=\"noopener\">\r\n\t\t\t\t<fa-icon [icon]=\"faXTwitter\" class=\"mr-2\"></fa-icon>\r\n\t\t\t\t<span>Share on X</span>\r\n\t\t\t</a>\r\n\t\t\t<a mat-menu-item [href]=\"shareLinks.facebook\" target=\"_blank\" rel=\"noopener\">\r\n\t\t\t\t<fa-icon [icon]=\"faFacebook\" class=\"mr-2\"></fa-icon>\r\n\t\t\t\t<span>Share on Facebook</span>\r\n\t\t\t</a>\r\n\t\t\t<a mat-menu-item [href]=\"shareLinks.bluesky\" target=\"_blank\" rel=\"noopener\">\r\n\t\t\t\t<fa-icon [icon]=\"faBluesky\" class=\"mr-2\"></fa-icon>\r\n\t\t\t\t<span>Share on Bluesky</span>\r\n\t\t\t</a>\r\n\t\t\t<a mat-menu-item [href]=\"shareLinks.linkedin\" target=\"_blank\" rel=\"noopener\">\r\n\t\t\t\t<fa-icon [icon]=\"faLinkedin\" class=\"mr-2\"></fa-icon>\r\n\t\t\t\t<span>Share on LinkedIn</span>\r\n\t\t\t</a>\r\n\t\t\t<button mat-menu-item (click)=\"copyLink()\">\r\n\t\t\t\t<mat-icon>content_copy</mat-icon>\r\n\t\t\t\t<span>Copy link</span>\r\n\t\t\t</button>\r\n\t\t</mat-menu>\r\n\t</mat-card-content>\r\n\t<img mat-card-image [src]=\"dataSource()?.thumbnail\" />\r\n\t<mat-card-content class=\"content\">\r\n\t\t<ng-rhombus-markdown\r\n\t\t\t[classes]=\"{ 'prose': true, 'dark:prose-invert': themeService.isDarkMode() }\"\r\n\t\t\t[data]=\"dataSource()?.content\"\r\n\t\t/>\r\n\t</mat-card-content>\r\n\t@if (tags.length) {\r\n\t<mat-card-content>\r\n\t\t<mat-chip-set aria-label=\"Post tags\" role=\"list\">\r\n\t\t\t@for (t of tags; track t) {\r\n\t\t\t<mat-chip role=\"listitem\" highlighted=\"true\" class=\"neutral-chips-theme\">#{{ t }}</mat-chip>\r\n\t\t\t}\r\n\t\t</mat-chip-set>\r\n\t</mat-card-content>\r\n\t}\r\n</mat-card>", styles: [".neutral-chips-theme{--mat-chip-outline-color: var(--mat-sys-surface-variant);--mat-chip-elevated-selected-container-color: var(--mat-sys-surface-variant);--mat-chip-selected-label-text-color: var(--mat-sys-on-surface-variant);box-shadow:0 3px 5px -1px #0003,0 6px 10px #00000024,0 1px 18px #0000001f}.primary-chips-theme{--mat-chip-outline-color: var(--mat-sys-primary);--mat-chip-elevated-selected-container-color: var(--mat-sys-primary);--mat-chip-selected-label-text-color: var(--mat-sys-on-primary);box-shadow:0 3px 5px -1px #0003,0 6px 10px #00000024,0 1px 18px #0000001f}.secondary-chips-theme{--mat-chip-outline-color: var(--mat-sys-secondary);--mat-chip-elevated-selected-container-color: var(--mat-sys-secondary);--mat-chip-selected-label-text-color: var(--mat-sys-on-secondary);box-shadow:0 3px 5px -1px #0003,0 6px 10px #00000024,0 1px 18px #0000001f}.card-image{--mat-card-elevated-container-shape: var(--mat-sys-shape-medium)}.mat-mdc-card-header{padding:32px 32px 16px}.mat-mdc-card-footer,.mat-mdc-card-content{padding:0 32px 32px}.content{padding:32px}.mat-mdc-card-title{margin-bottom:12px}.mat-mdc-card{border-radius:0}\n"] }]
1073
1087
  }], propDecorators: { dataSource: [{ type: i0.Input, args: [{ isSignal: true, alias: "dataSource", required: false }] }] } });
1074
1088
 
1075
1089
  class NgRhombusBlogDeletePostComponent {
@@ -1392,5 +1406,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.4", ngImpor
1392
1406
  * Generated bundle index. Do not edit.
1393
1407
  */
1394
1408
 
1395
- export { BlogSeries, ContentPillar, IBlog, IHome, NG_RHOMBUS_AUTH_ADAPTER, NG_RHOMBUS_BLOG_ADAPTER, NG_RHOMBUS_BLOG_THUMBNAIL_ADAPTER, NG_RHOMBUS_HOME_ADAPTER, NG_RHOMBUS_SEO_ADAPTER, NG_RHOMBUS_SOCIALS_ADAPTER, NgRhombusBlogAddEditComponent, NgRhombusBlogDeletePostComponent, NgRhombusBlogListComponent, NgRhombusBlogPostComponent, NgRhombusBlogPostLatestComponent, NgRhombusBlogPostThumbnailService, NgRhombusBlogService, NgRhombusBlogTableComponent, NgRhombusHomeAdminComponent, NgRhombusHomeService, NgRhombusLoginComponent, NgRhombusMarkdownComponent, NgRhombusPageComponent, NgRhombusSocialsListComponent, NgRhombusSocialsService, NgRhombusSocialsTableComponent, NgRhombusSpinnerComponent, NgRhombusWrapperComponent, SocialsSource, ThemeEnum, WrapperService, ngRhombusTimestampToMillis };
1409
+ export { BlogSeries, ContentPillar, IBlog, IHome, NG_RHOMBUS_AUTH_ADAPTER, NG_RHOMBUS_BLOG_ADAPTER, NG_RHOMBUS_BLOG_THUMBNAIL_ADAPTER, NG_RHOMBUS_HOME_ADAPTER, NG_RHOMBUS_SEO_ADAPTER, NG_RHOMBUS_SITE_METADATA, NG_RHOMBUS_SOCIALS_ADAPTER, NgRhombusBlogAddEditComponent, NgRhombusBlogDeletePostComponent, NgRhombusBlogListComponent, NgRhombusBlogPostComponent, NgRhombusBlogPostLatestComponent, NgRhombusBlogPostThumbnailService, NgRhombusBlogService, NgRhombusBlogTableComponent, NgRhombusHomeAdminComponent, NgRhombusHomeService, NgRhombusLoginComponent, NgRhombusMarkdownComponent, NgRhombusPageComponent, NgRhombusSocialsListComponent, NgRhombusSocialsService, NgRhombusSocialsTableComponent, NgRhombusSpinnerComponent, NgRhombusWrapperComponent, SocialsSource, ThemeEnum, WrapperService, ngRhombusTimestampToMillis };
1396
1410
  //# sourceMappingURL=doug-williamson-ng-rhombus.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"doug-williamson-ng-rhombus.mjs","sources":["../../../../projects/ng-rhombus/src/lib/shell/services/wrapper.service.ts","../../../../projects/ng-rhombus/src/lib/shell/tokens/auth-adapter.ts","../../../../projects/ng-rhombus/src/lib/shell/services/authentication.service.ts","../../../../projects/ng-rhombus/src/lib/shell/services/theme.service.ts","../../../../projects/ng-rhombus/src/lib/shell/components/header/header.component.ts","../../../../projects/ng-rhombus/src/lib/shell/components/header/header.component.html","../../../../projects/ng-rhombus/src/lib/shell/components/nav-list/nav-list.component.ts","../../../../projects/ng-rhombus/src/lib/shell/components/nav-list/nav-list.component.html","../../../../projects/ng-rhombus/src/lib/shell/components/wrapper/wrapper.component.ts","../../../../projects/ng-rhombus/src/lib/shell/components/wrapper/wrapper.component.html","../../../../projects/ng-rhombus/src/lib/shell/components/loading-container/loading-container.component.ts","../../../../projects/ng-rhombus/src/lib/shell/components/loading-container/loading-container.component.html","../../../../projects/ng-rhombus/src/lib/shell/components/login/login.component.ts","../../../../projects/ng-rhombus/src/lib/shell/components/login/login.component.html","../../../../projects/ng-rhombus/src/lib/shell/components/spinner/spinner.component.ts","../../../../projects/ng-rhombus/src/lib/shell/components/spinner/spinner.component.html","../../../../projects/ng-rhombus/src/lib/shell/components/page/page.component.ts","../../../../projects/ng-rhombus/src/lib/shell/components/page/page.component.html","../../../../projects/ng-rhombus/src/lib/shell/components/markdown/markdown.component.ts","../../../../projects/ng-rhombus/src/lib/shell/tokens/seo-adapter.ts","../../../../projects/ng-rhombus/src/lib/shell/public-api.ts","../../../../projects/ng-rhombus/src/lib/blog/models/blog.ts","../../../../projects/ng-rhombus/src/lib/blog/components/list/list.component.ts","../../../../projects/ng-rhombus/src/lib/blog/components/list/list.component.html","../../../../projects/ng-rhombus/src/lib/blog/components/latest/latest.component.ts","../../../../projects/ng-rhombus/src/lib/blog/components/latest/latest.component.html","../../../../projects/ng-rhombus/src/lib/blog/helpers/blog-post-helper.ts","../../../../projects/ng-rhombus/src/lib/blog/tokens/blog-adapter.ts","../../../../projects/ng-rhombus/src/lib/blog/services/blog.service.ts","../../../../projects/ng-rhombus/src/lib/blog/components/table/table.component.ts","../../../../projects/ng-rhombus/src/lib/blog/components/table/table.component.html","../../../../projects/ng-rhombus/src/lib/blog/tokens/blog-thumbnail-adapter.ts","../../../../projects/ng-rhombus/src/lib/blog/services/thumbnail.service.ts","../../../../projects/ng-rhombus/src/lib/blog/components/thumbnail/thumbnail.component.ts","../../../../projects/ng-rhombus/src/lib/blog/components/thumbnail/thumbnail.component.html","../../../../projects/ng-rhombus/src/lib/blog/components/dialogs/delete-thumbnail/delete-thumbnail.component.ts","../../../../projects/ng-rhombus/src/lib/blog/components/dialogs/delete-thumbnail/delete-thumbnail.component.html","../../../../projects/ng-rhombus/src/lib/blog/components/thumbnail-control/thumbnail-control.component.ts","../../../../projects/ng-rhombus/src/lib/blog/components/thumbnail-control/thumbnail-control.component.html","../../../../projects/ng-rhombus/src/lib/blog/dialogs/confirmation/confirmation.component.ts","../../../../projects/ng-rhombus/src/lib/blog/dialogs/confirmation/confirmation.component.html","../../../../projects/ng-rhombus/src/lib/blog/components/form/form.component.ts","../../../../projects/ng-rhombus/src/lib/blog/components/form/form.component.html","../../../../projects/ng-rhombus/src/lib/blog/components/post/post.component.ts","../../../../projects/ng-rhombus/src/lib/blog/components/post/post.component.html","../../../../projects/ng-rhombus/src/lib/blog/components/dialogs/delete-post/delete-post.component.ts","../../../../projects/ng-rhombus/src/lib/blog/components/dialogs/delete-post/delete-post.component.html","../../../../projects/ng-rhombus/src/lib/blog/public-api.ts","../../../../projects/ng-rhombus/src/lib/home/models/home.ts","../../../../projects/ng-rhombus/src/lib/home/admin/admin.ts","../../../../projects/ng-rhombus/src/lib/home/admin/admin.html","../../../../projects/ng-rhombus/src/lib/home/tokens/home-adapter.ts","../../../../projects/ng-rhombus/src/lib/home/home.service.ts","../../../../projects/ng-rhombus/src/lib/socials/models/socials.ts","../../../../projects/ng-rhombus/src/lib/socials/list/list.component.ts","../../../../projects/ng-rhombus/src/lib/socials/list/list.component.html","../../../../projects/ng-rhombus/src/lib/socials/tokens/socials-adapter.ts","../../../../projects/ng-rhombus/src/lib/socials/socials.service.ts","../../../../projects/ng-rhombus/src/lib/socials/modals/add-edit/add-edit.component.ts","../../../../projects/ng-rhombus/src/lib/socials/modals/add-edit/add-edit.component.html","../../../../projects/ng-rhombus/src/lib/socials/modals/delete/delete.component.ts","../../../../projects/ng-rhombus/src/lib/socials/modals/delete/delete.component.html","../../../../projects/ng-rhombus/src/lib/socials/table/table.component.ts","../../../../projects/ng-rhombus/src/lib/socials/table/table.component.html","../../../../projects/ng-rhombus/src/public-api.ts","../../../../projects/ng-rhombus/src/doug-williamson-ng-rhombus.ts"],"sourcesContent":["\r\nimport { inject, Injectable } from '@angular/core';\r\nimport { toSignal } from '@angular/core/rxjs-interop';\r\nimport { ActivatedRoute, NavigationEnd, Router } from '@angular/router';\r\nimport { MatSnackBar } from '@angular/material/snack-bar';\r\nimport { BehaviorSubject, filter } from 'rxjs';\r\n\r\nexport interface Breadcrumb {\r\n label: string;\r\n url: string;\r\n}\r\n\r\nexport enum ThemeEnum {\r\n LIGHT = 'light',\r\n DARK = 'dark'\r\n}\r\n\r\nexport type Theme = 'light' | 'dark';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class WrapperService {\r\n\r\n snackbar = inject(MatSnackBar);\r\n\r\n private _darkModeSubject = new BehaviorSubject<boolean>(false);\r\n darkMode = toSignal(this._darkModeSubject.asObservable(), { initialValue: false })\r\n\r\n private _breadcrumbs = new BehaviorSubject<Breadcrumb[]>([]);\r\n breadcrumbs = toSignal(this._breadcrumbs.asObservable(), { initialValue: undefined });\r\n\r\n private _triggerCreateNew = new BehaviorSubject<void>(undefined);\r\n triggerCreateNew = this._triggerCreateNew.asObservable();\r\n // triggerCreateNew = toSignal(this._triggerCreateNew.asObservable());\r\n\r\n constructor(private router: Router, private activatedRoute: ActivatedRoute) {\r\n this.router.events.pipe(filter(event => event instanceof NavigationEnd)).subscribe(event => {\r\n //set breadcrumbs\r\n this._breadcrumbs.next(this.getBreadcrumbs(this.activatedRoute.root));\r\n })\r\n }\r\n\r\n clickedCreateNew() {\r\n this._triggerCreateNew.next(undefined);\r\n }\r\n\r\n private getBreadcrumbs(route: ActivatedRoute, url: string = \"\", breadcrumbs: Breadcrumb[] = []): Breadcrumb[] {\r\n const ROUTE_DATA_BREADCRUMB = 'breadcrumb';\r\n\r\n //get the child routes\r\n let children: ActivatedRoute[] = route.children;\r\n\r\n if (children.length === 0) {\r\n // return breadcrumbs;\r\n }\r\n\r\n //iterate over each children\r\n for (let child of children) {\r\n //verify primary route\r\n // if (child.outlet !== PRIMARY_OUTLET || child.snapshot.url.length==0) {\r\n // continue;\r\n // }\r\n\r\n //verify the custom data property \"breadcrumb\" is specified on the route\r\n // if (!child.snapshot.data.hasOwnProperty(ROUTE_DATA_BREADCRUMB)) {\r\n // return this.getBreadcrumbs(child, url, breadcrumbs);\r\n // }\r\n\r\n //get the route's URL segment\r\n let routeURL: string = child.snapshot.url.map(segment => segment.path).join(\"/\");\r\n\r\n //append route URL to URL\r\n url += `${routeURL}`;\r\n\r\n //add breadcrumb\r\n let breadcrumb: Breadcrumb = {\r\n label: child.snapshot.data[ROUTE_DATA_BREADCRUMB],\r\n url: url\r\n };\r\n breadcrumbs.push(breadcrumb);\r\n\r\n //recursive\r\n return this.getBreadcrumbs(child, url, breadcrumbs);\r\n }\r\n return breadcrumbs;\r\n }\r\n\r\n openSnackbar(message: string) {\r\n this.snackbar.open(message, undefined, { duration: 3000 });\r\n }\r\n}","import { InjectionToken } from '@angular/core';\r\nimport { Observable, of } from 'rxjs';\r\n\r\nexport interface NgRhombusAuthUser {\r\n\tuid: string;\r\n\temail?: string | null;\r\n\tdisplayName?: string | null;\r\n}\r\n\r\nexport interface NgRhombusAuthAdapter {\r\n\tcurrentUser$: Observable<NgRhombusAuthUser | null>;\r\n\tlogin(email: string, password: string): Promise<void>;\r\n\tlogout(): Promise<void>;\r\n}\r\n\r\nexport const NG_RHOMBUS_AUTH_ADAPTER = new InjectionToken<NgRhombusAuthAdapter>(\r\n\t'NG_RHOMBUS_AUTH_ADAPTER',\r\n\t{\r\n\t\tprovidedIn: 'root',\r\n\t\tfactory: () => ({\r\n\t\t\tcurrentUser$: of(null),\r\n\t\t\tlogin: async () => {\r\n\t\t\t\tthrow new Error('NG_RHOMBUS_AUTH_ADAPTER is not provided.');\r\n\t\t\t},\r\n\t\t\tlogout: async () => { }\r\n\t\t})\r\n\t}\r\n);\r\n","import { inject, Injectable } from '@angular/core';\r\nimport { toSignal } from '@angular/core/rxjs-interop';\r\nimport { of } from 'rxjs';\r\nimport { switchMap } from 'rxjs/operators';\r\nimport { NG_RHOMBUS_AUTH_ADAPTER } from '../tokens/auth-adapter';\r\n\r\n@Injectable({\r\n\tprovidedIn: 'root'\r\n})\r\nexport class NgRhombusAuthenticationService {\r\n\tprivate authAdapter = inject(NG_RHOMBUS_AUTH_ADAPTER);\r\n\tcurrentUser$ = this.authAdapter.currentUser$;\r\n\r\n\tlogin(email: string, password: string): Promise<void> {\r\n\t\treturn this.authAdapter.login(email, password);\r\n\t}\r\n\r\n\tlogout(): Promise<void> { return this.authAdapter.logout(); }\r\n\r\n\tprivate currentUserProfile$ = this.currentUser$.pipe(\r\n\t\tswitchMap((user) => of(user?.uid ? user : null))\r\n\t);\r\n\r\n\tcurrentUserProfile = toSignal(this.currentUserProfile$, { initialValue: null });\r\n}","import { isPlatformBrowser } from '@angular/common';\r\nimport { Injectable, PLATFORM_ID, computed, effect, inject, signal } from '@angular/core';\r\n\r\nexport interface AppTheme {\r\n name: string;\r\n icon: string;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ThemeService {\r\n private platformId = inject(PLATFORM_ID);\r\n private appTheme = signal<string>('system');\r\n private readonly PREFERRED_THEME_COOKIE = 'preferred-theme';\r\n\r\n private themes: AppTheme[] = [\r\n { name: 'light', icon: 'light_mode' },\r\n { name: 'dark', icon: 'dark_mode' },\r\n { name: 'system', icon: 'desktop_windows' },\r\n ];\r\n\r\n selectedTheme = computed(() =>\r\n this.themes.find((t) => t.name === this.appTheme())\r\n );\r\n\r\n isDarkMode = computed(() => {\r\n const data = this.appTheme();\r\n if (data === 'system' || data === 'dark') {\r\n return true;\r\n }\r\n\r\n return false;\r\n });\r\n\r\n getThemes() {\r\n return this.themes;\r\n }\r\n\r\n setTheme(theme: string) {\r\n if (isPlatformBrowser(this.platformId)) {\r\n this.appTheme.set(theme);\r\n\r\n const colorScheme = theme === 'system' ? 'light dark' : theme;\r\n document.body.style.setProperty('color-scheme', colorScheme);\r\n\r\n this.setThemeInLocalStorage(theme);\r\n }\r\n }\r\n\r\n setThemeInLocalStorage(theme: string) {\r\n if (isPlatformBrowser(this.platformId)) {\r\n localStorage.setItem(this.PREFERRED_THEME_COOKIE, theme);\r\n }\r\n }\r\n\r\n getThemeFromLocalStorage() {\r\n if (!isPlatformBrowser(this.platformId)) return 'system';\r\n return localStorage.getItem(this.PREFERRED_THEME_COOKIE) ?? 'system';\r\n }\r\n\r\n constructor() {\r\n this.setTheme(this.getThemeFromLocalStorage());\r\n }\r\n}\r\n","import { Component, EventEmitter, inject, input, Input, output, Output } from '@angular/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatMenuModule } from '@angular/material/menu';\r\nimport { MatToolbarModule } from '@angular/material/toolbar';\r\nimport { WrapperService } from '../../services/wrapper.service';\r\nimport { Router, RouterModule } from '@angular/router';\r\nimport { NgRhombusAuthenticationService } from '../../services/authentication.service';\r\nimport { ThemeService } from '../../services/theme.service';\r\nimport { TitleCasePipe } from '@angular/common';\r\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\r\n\r\n@Component({\r\n selector: 'ng-rhombus-header',\r\n imports: [RouterModule, MatButtonModule, MatIconModule, MatMenuModule, MatToolbarModule, TitleCasePipe, MatProgressBarModule],\r\n templateUrl: './header.component.html',\r\n styleUrl: './header.component.scss'\r\n})\r\nexport class NgRhombusHeaderComponent {\r\n isLoading = input<boolean>(false);\r\n\r\n isMobile = input<boolean>(false);\r\n title = input.required<string>();\r\n\r\n wrapperService = inject(WrapperService);\r\n authService = inject(NgRhombusAuthenticationService);\r\n protected themeService = inject(ThemeService);\r\n router = inject(Router);\r\n\r\n logOut = output<void>();\r\n\r\n darkMode = this.wrapperService.darkMode;\r\n user = this.authService.currentUserProfile;\r\n\r\n @Output() menuToggled = new EventEmitter;\r\n\r\n toggleSidebar() {\r\n this.menuToggled.emit();\r\n }\r\n\r\n logout() {\r\n this.logOut.emit();\r\n }\r\n}\r\n","<mat-toolbar class=\"header-theme relative\">\r\n @if (isMobile()) {\r\n <button mat-icon-button (click)=\"toggleSidebar()\" color=\"red\">\r\n <mat-icon>menu</mat-icon>\r\n </button>\r\n }\r\n @if (isMobile()) {\r\n <span class=\"flex-1\"></span>\r\n }\r\n <a mat-button class=\"title\" [routerLink]=\"['/']\">\r\n {{ title() }}\r\n </a>\r\n <span class=\"flex-1\"></span>\r\n <button class=\"mr-2\" mat-icon-button [mat-menu-trigger-for]=\"themeMenu\">\r\n <mat-icon>{{ themeService.selectedTheme()?.icon }}</mat-icon>\r\n </button>\r\n <mat-menu #themeMenu=\"matMenu\">\r\n @for (theme of themeService.getThemes(); track theme.name) {\r\n <button [class.selected-theme]=\"themeService.selectedTheme()?.name === theme.name\" mat-menu-item\r\n (click)=\"themeService.setTheme(theme.name)\">\r\n <mat-icon>{{ theme.icon }}</mat-icon>\r\n <span>{{ theme.name | titlecase }}</span>\r\n </button>\r\n }\r\n </mat-menu>\r\n\r\n @if (user()) {\r\n <button mat-raised-button color=\"primary\" class=\"logout-button\" (click)=\"logout()\">\r\n Logout\r\n </button>\r\n }\r\n</mat-toolbar>\r\n@if (isLoading()) {\r\n<mat-progress-bar class=\"!absolute top-[64px] z-10\" mode=\"indeterminate\" />\r\n}","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\r\nimport { MatListModule } from '@angular/material/list';\r\nimport { RouterModule } from '@angular/router';\r\nimport { TitleCasePipe } from '@angular/common';\r\nimport { NgRhombusNavItem } from './nav-list';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatTabsModule } from '@angular/material/tabs';\r\n\r\n@Component({\r\n selector: 'ng-rhombus-nav-list',\r\n imports: [RouterModule, MatListModule, MatIconModule, MatTabsModule],\r\n templateUrl: './nav-list.component.html',\r\n styleUrl: './nav-list.component.scss'\r\n})\r\nexport class NgRhombusNavListComponent implements OnInit {\r\n activeLink?: string;\r\n\r\n @Input()\r\n routeCollection: NgRhombusNavItem[] | undefined;\r\n\r\n @Output()\r\n navItemSelected = new EventEmitter<void>();\r\n\r\n ngOnInit() {\r\n\r\n }\r\n\r\n onNavItemClick() {\r\n this.navItemSelected.emit();\r\n }\r\n}\r\n","<mat-nav-list class=\"accent-list\">\r\n @for (link of routeCollection; track link) {\r\n <a mat-list-item [routerLink]=\"link.route\" routerLinkActive=\"selected-menu-item\" (click)=\"onNavItemClick()\">\r\n <span>{{ link.label }}</span>\r\n </a>\r\n }\r\n</mat-nav-list>","import { BreakpointObserver, Breakpoints } from '@angular/cdk/layout';\r\nimport { Component, EventEmitter, Input, OnDestroy, OnInit, Output, output, computed, input } from '@angular/core';\r\nimport { MatSidenavModule } from '@angular/material/sidenav';\r\nimport { Subject, takeUntil } from 'rxjs';\r\nimport { NgRhombusHeaderComponent } from '../header/header.component';\r\nimport { NgRhombusNavListComponent } from '../nav-list/nav-list.component';\r\nimport { RouterModule } from '@angular/router';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatListModule } from '@angular/material/list';\r\nimport { NgRhombusNavItem } from '../nav-list/nav-list';\r\n\r\nimport { WrapperService } from '../../services/wrapper.service';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\r\n\r\n@Component({\r\n selector: 'ng-rhombus-wrapper',\r\n imports: [MatSidenavModule, MatButtonModule, MatIconModule, MatListModule, MatProgressBarModule, RouterModule, NgRhombusHeaderComponent, NgRhombusNavListComponent],\r\n providers: [WrapperService],\r\n templateUrl: './wrapper.component.html',\r\n styleUrl: './wrapper.component.scss'\r\n})\r\nexport class NgRhombusWrapperComponent implements OnInit, OnDestroy {\r\n @Output() clickAddNewEvent = new EventEmitter<void>();\r\n destroyed = new Subject<void>();\r\n isMobile: boolean = false;\r\n currentScreenSize?: string;\r\n\r\n isLoading = input<boolean>(false);\r\n logout = output<void>();\r\n\r\n breadcrumbs = computed(() => { return this.wrapperService.breadcrumbs() });\r\n\r\n fillerContent = Array.from(\r\n { length: 50 },\r\n () =>\r\n `Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut\r\n labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco\r\n laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in\r\n voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat\r\n cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.`,\r\n );\r\n\r\n @Input()\r\n title!: string;\r\n\r\n @Input()\r\n routeCollection!: NgRhombusNavItem[] | undefined;\r\n\r\n constructor(private breakpointObserver: BreakpointObserver, private wrapperService: WrapperService) {\r\n this.breakpointObserver\r\n .observe([Breakpoints.XSmall])\r\n .pipe(takeUntil(this.destroyed))\r\n .subscribe(result => {\r\n this.isMobile = result.matches;\r\n console.log('is mobile: ', this.isMobile);\r\n });\r\n }\r\n\r\n ngOnInit() {\r\n\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.destroyed.next();\r\n this.destroyed.complete();\r\n }\r\n\r\n clickedCreateNew() {\r\n this.clickAddNewEvent.emit();\r\n }\r\n logOut() {\r\n this.logout.emit();\r\n }\r\n}\r\n","<div class=\"h-full flex flex-col\">\r\n <ng-rhombus-header class=\"header-wrapper\" [isMobile]=\"isMobile\" [title]=\"title\" (menuToggled)=\"sidenav.toggle()\"\r\n (logOut)=\"logOut()\" [isLoading]=\"isLoading()\"></ng-rhombus-header>\r\n <mat-sidenav-container class=\"grow\">\r\n <mat-sidenav #sidenav [opened]=\"!isMobile\" [mode]=\"isMobile ? 'over' : 'side'\">\r\n <div class=\"nav-list-wrapper\">\r\n <ng-rhombus-nav-list [routeCollection]=\"routeCollection\"\r\n (navItemSelected)=\"isMobile && sidenav.close()\"></ng-rhombus-nav-list>\r\n </div>\r\n </mat-sidenav>\r\n <mat-sidenav-content class=\"main-sidenav-content\">\r\n <router-outlet #o=\"outlet\"></router-outlet>\r\n </mat-sidenav-content>\r\n </mat-sidenav-container>\r\n</div>","import { Component, input } from '@angular/core';\r\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\r\n\r\n@Component({\r\n selector: 'ng-rhombus-loading-container',\r\n imports: [MatProgressSpinnerModule],\r\n templateUrl: './loading-container.component.html',\r\n styleUrl: './loading-container.component.scss'\r\n})\r\nexport class NgRhombusLoadingContainerComponent {\r\n loading = input<boolean>(false);\r\n size = input<number>(40);\r\n}\r\n","@if (loading()) {\r\n<mat-progress-spinner class=\"loading-spinner\" [diameter]=\"size()\" mode=\"indeterminate\" />\r\n} @else {\r\n<ng-content />\r\n}","import { Component, inject, input, OnInit, output, signal } from '@angular/core';\r\nimport { FormGroup, FormBuilder, Validators, ReactiveFormsModule } from '@angular/forms';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatCardModule } from '@angular/material/card';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { Router } from '@angular/router';\r\nimport { NgRhombusAuthenticationService } from '../../services/authentication.service';\r\nimport { NgRhombusLoadingContainerComponent } from '../loading-container/loading-container.component';\r\nimport { MatIconModule } from '@angular/material/icon';\r\n\r\nexport interface ILoginCredentials {\r\n\temail: string;\r\n\tpassword: string;\r\n}\r\n\r\n@Component({\r\n\tselector: 'ng-rhombus-login',\r\n\timports: [ReactiveFormsModule, MatButtonModule, MatCardModule, MatFormFieldModule, MatIconModule, MatInputModule, NgRhombusLoadingContainerComponent],\r\n\ttemplateUrl: './login.component.html',\r\n\tstyleUrl: './login.component.scss'\r\n})\r\nexport class NgRhombusLoginComponent implements OnInit {\r\n\tpublic loginForm!: FormGroup;\r\n\tauthorizing: boolean = false;\r\n\r\n\ttitle = input<string>('');\r\n\tloading = input<boolean>(false);\r\n\tonSubmit = output<ILoginCredentials>();\r\n\r\n\tpublic hidePassword = signal(true);\r\n\r\n\tauthService = inject(NgRhombusAuthenticationService);\r\n\r\n\tconstructor(private fb: FormBuilder, private router: Router) { }\r\n\r\n\tngOnInit(): void {\r\n\t\tthis.loginForm = this.fb.group({\r\n\t\t\temail: ['', [Validators.required, Validators.email]],\r\n\t\t\tpassword: ['', [Validators.required, Validators.minLength(6)]],\r\n\t\t});\r\n\t}\r\n\r\n\tonSubmitForm() {\r\n\t\tconst rawForm: ILoginCredentials = this.loginForm.getRawValue();\r\n\t\tthis.onSubmit.emit(rawForm);\r\n\t}\r\n}\r\n","<div class=\"flex min-h-screen items-center justify-center bg-background\">\r\n <mat-card class=\"w-full max-w-[400px] p-10\">\r\n <mat-card-header>\r\n <mat-card-title-group>\r\n <mat-card-title>{{ title() }}</mat-card-title>\r\n <mat-card-subtitle>Administration</mat-card-subtitle>\r\n </mat-card-title-group>\r\n\r\n </mat-card-header>\r\n <form class=\"flex flex-col\" novalidate [formGroup]=\"loginForm\" (ngSubmit)=\"onSubmitForm()\">\r\n <mat-card-content>\r\n <mat-form-field class=\"w-full flex\">\r\n <mat-label>Email Address</mat-label>\r\n <input matInput placeholder=\"Placeholder\" formControlName=\"email\" aria-label=\"Email Address\" />\r\n <mat-icon matSuffix>email</mat-icon>\r\n <mat-error align=\"start\">Email Address Required</mat-error>\r\n </mat-form-field>\r\n <mat-form-field class=\"w-full flex\">\r\n <mat-label>Password</mat-label>\r\n <input matInput [type]=\"hidePassword() ? 'password' : 'text'\" placeholder=\"Placeholder\"\r\n formControlName=\"password\" aria-label=\"Password\" />\r\n <button mat-icon-button matSuffix (click)=\"hidePassword.set(!hidePassword())\" type=\"button\"\r\n style=\"margin-right: 0.25rem;\">\r\n <mat-icon>{{ hidePassword() ? 'visibility_off' : 'visibility' }}</mat-icon>\r\n </button>\r\n <mat-error align=\"start\">Password Required</mat-error>\r\n </mat-form-field>\r\n </mat-card-content>\r\n <button mat-flat-button class=\"login-button\" type=\"submit\" [disabled]=\"loading() || loginForm.invalid\">\r\n <ng-rhombus-loading-container [loading]=\"loading()\" [size]=\"20\">\r\n Login\r\n </ng-rhombus-loading-container>\r\n </button>\r\n </form>\r\n </mat-card>\r\n</div>","import { Component } from '@angular/core';\r\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\r\n\r\n@Component({\r\n selector: 'ng-rhombus-spinner',\r\n imports: [MatProgressSpinnerModule],\r\n templateUrl: './spinner.component.html',\r\n styleUrl: './spinner.component.scss',\r\n})\r\nexport class NgRhombusSpinnerComponent {\r\n\r\n}\r\n","<div class=\"spinner-backdrop\">\r\n <mat-spinner></mat-spinner>\r\n</div>","import { Component, input } from '@angular/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { RouterModule } from '@angular/router';\r\n\r\n@Component({\r\n selector: 'ng-rhombus-page',\r\n imports: [MatButtonModule, MatIconModule, RouterModule],\r\n templateUrl: './page.component.html',\r\n styleUrl: './page.component.scss',\r\n})\r\nexport class NgRhombusPageComponent {\r\n title = input<string>(''); // toolbar title\r\n backLink = input<string | null>(null); // optional back link (shows arrow_back when set)\r\n currentYear = new Date().getFullYear();\r\n}\r\n","<div class=\"page flex flex-col h-full\">\r\n <div class=\"page-header\">\r\n @if (backLink()) {\r\n <button matIconButton [routerLink]=\"backLink()\" aria-label=\"Back\" class=\"back-button\">\r\n <mat-icon>arrow_back</mat-icon>\r\n </button>\r\n }\r\n <div class=\"page-header__title mat-title-large\">{{ title() }}</div>\r\n </div>\r\n\r\n <div class=\"content\">\r\n <ng-content></ng-content>\r\n </div>\r\n <div class=\"page-footer mt-6\">\r\n <div class=\"page-footer__text\">&copy; {{ currentYear }} - Powered By Rhombus</div>\r\n </div>\r\n</div>","import { Component, ViewEncapsulation, input } from '@angular/core';\r\nimport { MarkdownComponent } from 'ngx-markdown';\r\nimport { NgClass } from '@angular/common';\r\n\r\n@Component({\r\n\tselector: 'ng-rhombus-markdown',\r\n\timports: [MarkdownComponent, NgClass],\r\n\ttemplate: `\r\n\t\t<markdown\r\n\t\t\tclass=\"ng-rhombus-markdown\"\r\n\t\t\t[ngClass]=\"classes()\"\r\n\t\t\t[data]=\"data()\"\r\n\t\t/>\r\n\t`,\r\n\tstyleUrl: './markdown.component.scss',\r\n\tencapsulation: ViewEncapsulation.None,\r\n})\r\nexport class NgRhombusMarkdownComponent {\r\n\tdata = input<string | null | undefined>(undefined);\r\n\tclasses = input<any>(undefined);\r\n}\r\n","import { InjectionToken } from '@angular/core';\r\n\r\nexport type NgRhombusSeoTag = {\r\n\tname?: string;\r\n\tproperty?: string;\r\n\tcontent: string;\r\n};\r\n\r\nexport interface NgRhombusSeoAdapter {\r\n\tsetTitle(title: string): void;\r\n\tupdateTag(tag: NgRhombusSeoTag): void;\r\n}\r\n\r\nexport const NG_RHOMBUS_SEO_ADAPTER = new InjectionToken<NgRhombusSeoAdapter>(\r\n\t'NG_RHOMBUS_SEO_ADAPTER',\r\n\t{\r\n\t\tprovidedIn: 'root',\r\n\t\tfactory: () => ({\r\n\t\t\tsetTitle: () => {},\r\n\t\t\tupdateTag: () => {},\r\n\t\t}),\r\n\t}\r\n);\r\n","/*\r\n * Public API Surface of @doug-williamson/ng-rhombus/shell\r\n */\r\n\r\nexport * from './components/wrapper/wrapper.component';\r\nexport * from './services/wrapper.service';\r\nexport * from './components/login/login.component';\r\nexport * from './components/nav-list/nav-list';\r\nexport * from './components/spinner/spinner.component';\r\nexport * from './components/page/page.component';\r\nexport * from './components/markdown/markdown.component';\r\n\r\nexport * from './tokens/auth-adapter';\r\nexport * from './tokens/seo-adapter';","export type NgRhombusTimestampLike =\r\n | Date\r\n | number\r\n | string\r\n | { toMillis: () => number }\r\n | { seconds: number; nanoseconds?: number };\r\n\r\nexport function ngRhombusTimestampToMillis(\r\n value: NgRhombusTimestampLike | null | undefined\r\n): number | null {\r\n if (value == null) return null;\r\n\r\n if (typeof value === 'number') return value;\r\n if (value instanceof Date) return value.getTime();\r\n\r\n if (typeof value === 'string') {\r\n const asNumber = Number(value);\r\n if (Number.isFinite(asNumber)) return asNumber;\r\n\r\n const asDate = new Date(value);\r\n return Number.isFinite(asDate.getTime()) ? asDate.getTime() : null;\r\n }\r\n\r\n const maybeToMillis = value as { toMillis?: unknown };\r\n if (typeof maybeToMillis.toMillis === 'function') {\r\n return (maybeToMillis.toMillis as () => number)();\r\n }\r\n\r\n const maybeSeconds = value as { seconds?: unknown };\r\n if (typeof maybeSeconds.seconds === 'number') {\r\n return maybeSeconds.seconds * 1000;\r\n }\r\n\r\n return null;\r\n}\r\n\r\nexport enum ContentPillar {\r\n DeveloperLife = 'Developer Life',\r\n AngularWebEngineering = 'Angular & Web Engineering',\r\n GamingAsAnAdult = 'Gaming as an Adult',\r\n FatherhoodFamily = 'Fatherhood & Family',\r\n CareerBalanceIdentity = 'Career, Balance & Identity',\r\n}\r\n\r\nexport enum BlogSeries {\r\n ThisWeekILearned = 'This Week I Learned',\r\n DevDiary = 'Dev Diary',\r\n AdultGamerNotes = 'Adult Gamer Notes',\r\n LessonsFromFatherhood = 'Lessons from Fatherhood',\r\n TradeoffsTruths = 'Tradeoffs & Truths',\r\n\tFromTheEditor = 'From The Editor',\r\n}\r\n\r\nexport class IBlog {\r\n id!: string;\r\n title!: string;\r\n description!: string;\r\n thumbnail!: string;\r\n content!: string;\r\n\r\n /**\r\n * Published timestamp used for ordering.\r\n * Kept flexible so apps can provide Firestore Timestamp, Date, millis, etc.\r\n */\r\n timestamp!: NgRhombusTimestampLike;\r\n\r\n /** Estimated read time in minutes at 200 wpm */\r\n readTimeMinutes!: number;\r\n\r\n /**\r\n * Creator system fields.\r\n * Keep optional for backward compatibility; enforce required in admin UI + writes.\r\n */\r\n pillar?: ContentPillar | null;\r\n series?: BlogSeries | null;\r\n tags?: string[] | null; // enforce 3–6 unique tags on submit\r\n}","import { isPlatformBrowser } from '@angular/common';\r\nimport { Component, EventEmitter, inject, input, OnInit, Output, PLATFORM_ID } from '@angular/core';\r\nimport { MatListModule } from '@angular/material/list';\r\nimport { MatChipsModule } from '@angular/material/chips';\r\nimport { MatDividerModule } from '@angular/material/divider';\r\nimport { IBlog, ngRhombusTimestampToMillis } from '../../models/blog';\r\nimport { DatePipe, DOCUMENT } from '@angular/common';\r\nimport { NG_RHOMBUS_SEO_ADAPTER } from '../../../shell/tokens/seo-adapter';\r\n\r\n@Component({\r\n selector: 'ng-rhombus-blog-list',\r\n imports: [DatePipe, MatListModule, MatDividerModule, MatChipsModule],\r\n templateUrl: './list.component.html',\r\n styleUrl: './list.component.scss'\r\n})\r\nexport class NgRhombusBlogListComponent implements OnInit {\r\n @Output() goToRoute = new EventEmitter<string>();\r\n #seo = inject(NG_RHOMBUS_SEO_ADAPTER);\r\n #platformId = inject(PLATFORM_ID);\r\n #document = inject(DOCUMENT);\r\n dataSource = input<IBlog[]>([]);\r\n\r\n timestampToMillis = ngRhombusTimestampToMillis;\r\n\r\n ngOnInit() {\r\n const origin = isPlatformBrowser(this.#platformId) ? this.#document.location?.origin : undefined;\r\n const imageUrl = origin ? new URL('/fav.ico', origin).toString() : '/fav.ico';\r\n\r\n // Document title\r\n this.#seo.setTitle('Blog - Doug Williamson');\r\n\r\n // Basic meta\r\n this.#seo.updateTag({ name: 'description', content: 'This is my personal collection of blog posts.' });\r\n\r\n // Open Graph\r\n this.#seo.updateTag({ property: 'og:type', content: 'article' });\r\n this.#seo.updateTag({ property: 'og:title', content: 'Blog - Doug Williamson' });\r\n this.#seo.updateTag({ property: 'og:description', content: 'This is my personal collection of blog posts.' });\r\n this.#seo.updateTag({ property: 'og:image', content: imageUrl });\r\n // Twitter Card\r\n this.#seo.updateTag({ name: 'twitter:card', content: 'summary' });\r\n this.#seo.updateTag({ name: 'twitter:title', content: 'Blog - Doug Williamson' });\r\n this.#seo.updateTag({ name: 'twitter:description', content: 'This is my personal collection of blog posts.' });\r\n this.#seo.updateTag({ name: 'twitter:image', content: imageUrl });\r\n }\r\n\r\n goToBlogPost(id: string) {\r\n this.goToRoute.emit(id);\r\n }\r\n}\r\n","@if ((dataSource()).length === 0) {\r\n<p class=\"m-6 justify-self-center\">No blog posts found.</p>\r\n} @else {\r\n<mat-nav-list>\r\n\t@for (blogPost of dataSource(); track blogPost.id; let last = $last) {\r\n\t<mat-list-item (click)=\"goToRoute.emit(blogPost.id)\" lines=\"2\">\r\n\t\t<h3 matListItemTitle>{{ blogPost.title }}</h3>\r\n\t\t<p matListItemMeta>{{ timestampToMillis(blogPost.timestamp) | date: 'MMMM d, y' }}</p>\r\n\r\n\t\t@if (blogPost.pillar || blogPost.series || (blogPost.tags?.length ?? 0) > 0) {\r\n\t\t<div matListItemLine class=\"taxonomy\">\r\n\t\t\t<mat-chip-set aria-label=\"Post taxonomy\">\r\n\t\t\t\t@if (blogPost.pillar) {\r\n\t\t\t\t<mat-chip [highlighted]=\"true\" class=\"primary-chips-theme\">Pillar: {{ blogPost.pillar }}</mat-chip>\r\n\t\t\t\t}\r\n\t\t\t\t@if (blogPost.series) {\r\n\t\t\t\t<mat-chip [highlighted]=\"true\" class=\"secondary-chips-theme\">Series: {{ blogPost.series }}</mat-chip>\r\n\t\t\t\t}\r\n\t\t\t\t<!-- @for (t of blogPost.tags ?? []; track t) {\r\n\t\t\t\t<mat-chip [highlighted]=\"true\" class=\"neutral-chips-theme\">#{{ t }}</mat-chip>\r\n\t\t\t\t} -->\r\n\t\t\t</mat-chip-set>\r\n\t\t</div>\r\n\t\t}\r\n\t</mat-list-item>\r\n\t@if (!last) {\r\n\t<mat-divider></mat-divider>\r\n\t}\r\n\t}\r\n</mat-nav-list>\r\n}","import { Component, input } from '@angular/core';\r\nimport { MatListModule } from '@angular/material/list';\r\nimport { RouterLink } from '@angular/router';\r\nimport { IBlog, ngRhombusTimestampToMillis } from '../../models/blog';\r\nimport { DatePipe } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'ng-rhombus-blog-post-latest',\r\n imports: [DatePipe, MatListModule, RouterLink],\r\n templateUrl: './latest.component.html',\r\n styleUrl: './latest.component.scss'\r\n})\r\nexport class NgRhombusBlogPostLatestComponent {\r\n blogPost = input<IBlog>();\r\n\r\n timestampToMillis = ngRhombusTimestampToMillis;\r\n}\r\n","<mat-nav-list>\r\n <mat-list-item [routerLink]=\"['/blog', blogPost()?.id]\">\r\n <span matListItemTitle>{{ blogPost()?.title }}</span>\r\n <span matListItemLine>{{ blogPost()?.description }}</span>\r\n <span matListItemLine>{{ timestampToMillis(blogPost()?.timestamp) | date: 'MMMM d, y' }}</span>\r\n </mat-list-item>\r\n</mat-nav-list>","export class NgRhombusBlogPostHelper {\r\n static createSlug(title: string): string {\r\n const slug = title\r\n .toLowerCase()\r\n .normalize('NFD') // split accents\r\n .replace(/[\\u0300-\\u036f]/g, '') // strip diacritics\r\n .replace(/[^a-z\\s-]/g, '') // keep only letters, spaces, dashes\r\n .replace(/\\s+/g, '-') // spaces → dashes\r\n .replace(/-+/g, '-') // collapse dashes\r\n .replace(/^-|-$/g, '');\r\n const randomThreeDigitNumber = Math.floor(Math.random() * 1000);\r\n return `${slug}-${randomThreeDigitNumber}`;\r\n }\r\n}","import { InjectionToken } from '@angular/core';\r\nimport { BlogSeries, IBlog } from '../models/blog';\r\n\r\nexport interface NgRhombusBlogAdapter {\r\n\tfetchBlogPosts(): Promise<IBlog[]>;\r\n\tfetchBlogPost(id: string): Promise<IBlog | undefined>;\r\n\tfetchLatestBlogPost(): Promise<IBlog | undefined>;\r\n\tfetchLatestBlogPosts(count: number): Promise<IBlog[]>;\r\n\tfetchLatestBlogPostsBySeries(series: BlogSeries, count: number): Promise<IBlog[]>;\r\n\tfetchAdjacentBlogPostsInSeries(\r\n\t\tid: string\r\n\t): Promise<{ series?: BlogSeries | null; nextNewer?: IBlog; nextOlder?: IBlog }>;\r\n\tfetchAdjacentBlogPosts(id: string): Promise<{ nextNewer?: IBlog; nextOlder?: IBlog }>;\r\n\r\n\tcreateBlogPost(blogPost: IBlog): Promise<void>;\r\n\tupdateBlogPost(blogPost: IBlog): Promise<void>;\r\n\tdeleteBlogPost(id: string): Promise<void>;\r\n}\r\n\r\nexport const NG_RHOMBUS_BLOG_ADAPTER = new InjectionToken<NgRhombusBlogAdapter>(\r\n\t'NG_RHOMBUS_BLOG_ADAPTER',\r\n\t{\r\n\t\tprovidedIn: 'root',\r\n\t\tfactory: () => ({\r\n\t\t\tfetchBlogPosts: async () => {\r\n\t\t\t\tthrow new Error('NG_RHOMBUS_BLOG_ADAPTER is not provided.');\r\n\t\t\t},\r\n\t\t\tfetchBlogPost: async () => {\r\n\t\t\t\tthrow new Error('NG_RHOMBUS_BLOG_ADAPTER is not provided.');\r\n\t\t\t},\r\n\t\t\tfetchLatestBlogPost: async () => {\r\n\t\t\t\tthrow new Error('NG_RHOMBUS_BLOG_ADAPTER is not provided.');\r\n\t\t\t},\r\n\t\t\tfetchLatestBlogPosts: async () => {\r\n\t\t\t\tthrow new Error('NG_RHOMBUS_BLOG_ADAPTER is not provided.');\r\n\t\t\t},\r\n\t\t\tfetchLatestBlogPostsBySeries: async () => {\r\n\t\t\t\tthrow new Error('NG_RHOMBUS_BLOG_ADAPTER is not provided.');\r\n\t\t\t},\r\n\t\t\tfetchAdjacentBlogPostsInSeries: async () => {\r\n\t\t\t\tthrow new Error('NG_RHOMBUS_BLOG_ADAPTER is not provided.');\r\n\t\t\t},\r\n\t\t\tfetchAdjacentBlogPosts: async () => {\r\n\t\t\t\tthrow new Error('NG_RHOMBUS_BLOG_ADAPTER is not provided.');\r\n\t\t\t},\r\n\t\t\tcreateBlogPost: async () => {\r\n\t\t\t\tthrow new Error('NG_RHOMBUS_BLOG_ADAPTER is not provided.');\r\n\t\t\t},\r\n\t\t\tupdateBlogPost: async () => {\r\n\t\t\t\tthrow new Error('NG_RHOMBUS_BLOG_ADAPTER is not provided.');\r\n\t\t\t},\r\n\t\t\tdeleteBlogPost: async () => {\r\n\t\t\t\tthrow new Error('NG_RHOMBUS_BLOG_ADAPTER is not provided.');\r\n\t\t\t},\r\n\t\t}),\r\n\t}\r\n);\r\n","import { Injectable, inject, signal } from '@angular/core';\r\nimport { IBlog, BlogSeries, ngRhombusTimestampToMillis } from '../models/blog';\r\nimport { NgRhombusBlogPostHelper } from '../helpers/blog-post-helper';\r\nimport { NG_RHOMBUS_BLOG_ADAPTER } from '../tokens/blog-adapter';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class NgRhombusBlogService {\r\n private readonly WORDS_PER_MINUTE = 200;\r\n private readonly blogAdapter = inject(NG_RHOMBUS_BLOG_ADAPTER);\r\n\r\n private normalizeBlogPost(post: IBlog): IBlog {\r\n const timestampMillis = ngRhombusTimestampToMillis(post.timestamp as any);\r\n return {\r\n ...post,\r\n timestamp: timestampMillis ?? post.timestamp,\r\n };\r\n }\r\n\r\n blogPosts = signal<IBlog[]>([]);\r\n selectedBlogPost = signal<IBlog | undefined>(undefined);\r\n\r\n async fetchBlogPosts() {\r\n const posts = (await this.blogAdapter.fetchBlogPosts()).map(p => this.normalizeBlogPost(p));\r\n this.blogPosts.set(posts);\r\n return posts;\r\n }\r\n\r\n async fetchBlogPost(id: string) {\r\n const post = await this.blogAdapter.fetchBlogPost(id);\r\n if (!post) return undefined;\r\n\r\n const normalized = this.normalizeBlogPost(post);\r\n this.selectedBlogPost.set(normalized);\r\n return normalized;\r\n }\r\n\r\n async fetchLatestBlogPost() {\r\n const post = await this.blogAdapter.fetchLatestBlogPost();\r\n if (!post) return undefined;\r\n\r\n const normalized = this.normalizeBlogPost(post);\r\n this.selectedBlogPost.set(normalized);\r\n return normalized;\r\n }\r\n\r\n async createBlogPost(blogPost: IBlog) {\r\n const id = NgRhombusBlogPostHelper.createSlug(blogPost.title);\r\n await this.blogAdapter.createBlogPost({\r\n ...blogPost,\r\n id,\r\n timestamp: new Date(),\r\n });\r\n }\r\n\r\n async updateBlogPost(blogPost: IBlog) {\r\n await this.blogAdapter.updateBlogPost(blogPost);\r\n }\r\n\r\n deleteBlogPost(id: string) {\r\n return this.blogAdapter.deleteBlogPost(id);\r\n }\r\n\r\n /** Latest N posts */\r\n async fetchLatestBlogPosts(count: number = 5): Promise<IBlog[]> {\r\n const posts = await this.blogAdapter.fetchLatestBlogPosts(count);\r\n return posts.map(p => this.normalizeBlogPost(p));\r\n }\r\n\r\n /** Latest N posts for a given series */\r\n async fetchLatestBlogPostsBySeries(series: BlogSeries, count: number = 5): Promise<IBlog[]> {\r\n const posts = await this.blogAdapter.fetchLatestBlogPostsBySeries(series, count);\r\n return posts.map(p => this.normalizeBlogPost(p));\r\n }\r\n\r\n /**\r\n * Adjacent posts within the same series as the current post.\r\n * - nextNewer: newer than current within the series (if any)\r\n * - nextOlder: older than current within the series (if any)\r\n */\r\n async fetchAdjacentBlogPostsInSeries(id: string): Promise<{ series?: BlogSeries | null; nextNewer?: IBlog; nextOlder?: IBlog }> {\r\n const result = await this.blogAdapter.fetchAdjacentBlogPostsInSeries(id);\r\n return {\r\n series: result.series,\r\n nextNewer: result.nextNewer ? this.normalizeBlogPost(result.nextNewer) : undefined,\r\n nextOlder: result.nextOlder ? this.normalizeBlogPost(result.nextOlder) : undefined,\r\n };\r\n }\r\n\r\n /**\r\n * Adjacent posts in the global \"latest first\" ordering.\r\n * - nextNewer: newer than current (if any)\r\n * - nextOlder: older than current (if any)\r\n */\r\n async fetchAdjacentBlogPosts(id: string): Promise<{ nextNewer?: IBlog; nextOlder?: IBlog }> {\r\n const result = await this.blogAdapter.fetchAdjacentBlogPosts(id);\r\n return {\r\n nextNewer: result.nextNewer ? this.normalizeBlogPost(result.nextNewer) : undefined,\r\n nextOlder: result.nextOlder ? this.normalizeBlogPost(result.nextOlder) : undefined,\r\n };\r\n }\r\n\r\n calculateReadTimeMinutes(text: string | null | undefined): number {\r\n if (!text) return 1;\r\n const words = text.trim().split(/\\s+/).length;\r\n return Math.max(1, Math.ceil(words / this.WORDS_PER_MINUTE));\r\n }\r\n}","import { Component, EventEmitter, inject, input, Output } from '@angular/core';\r\nimport { MatTableModule } from '@angular/material/table';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatChipsModule } from '@angular/material/chips';\r\nimport { IBlog, ngRhombusTimestampToMillis } from '../../models/blog';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { NgRhombusBlogService } from '../../services/blog.service';\r\n\r\ntype BlogTableRow =\r\n | { kind: 'main'; post: IBlog }\r\n | { kind: 'detail'; post: IBlog };\r\n\r\n@Component({\r\n selector: 'ng-rhombus-blog-table',\r\n imports: [CommonModule, MatButtonModule, MatIconModule, MatTableModule, MatChipsModule],\r\n templateUrl: './table.component.html',\r\n styleUrl: './table.component.scss'\r\n})\r\nexport class NgRhombusBlogTableComponent {\r\n @Output() editEvent = new EventEmitter<string>();\r\n @Output() deleteEvent = new EventEmitter<IBlog>();\r\n\r\n readonly blogService = inject(NgRhombusBlogService);\r\n readonly dialog = inject(MatDialog);\r\n\r\n dataSource = input<IBlog[]>([]);\r\n\r\n timestampToMillis = ngRhombusTimestampToMillis;\r\n\r\n displayedColumns: string[] = ['title', 'pillar', 'series', 'timestamp'];\r\n detailColumns: string[] = ['detail'];\r\n\r\n tableData(): BlogTableRow[] {\r\n const posts = this.dataSource();\r\n if (!posts?.length) return [];\r\n\r\n return posts.flatMap(post => [\r\n { kind: 'main', post },\r\n { kind: 'detail', post },\r\n ]);\r\n }\r\n\r\n isMainRow = (_index: number, row: BlogTableRow) => row.kind === 'main';\r\n isDetailRow = (_index: number, row: BlogTableRow) => row.kind === 'detail';\r\n\r\n goToBlogPost(id: string) {\r\n this.editEvent.emit(id);\r\n }\r\n\r\n onDeleteBlogPost(blogPost: IBlog) {\r\n this.deleteEvent.emit(blogPost);\r\n }\r\n\r\n}\r\n","@if (dataSource().length > 0) {\r\n<table mat-table [dataSource]=\"tableData()\" class=\"mat-elevation-z1\" multiTemplateDataRows>\r\n\r\n\t<!-- Title Column -->\r\n\t<ng-container matColumnDef=\"title\">\r\n\t\t<th mat-header-cell *matHeaderCellDef>Title</th>\r\n\t\t<td mat-cell *matCellDef=\"let row\">{{ row.post.title }}</td>\r\n\t</ng-container>\r\n\r\n\t<!-- Pillar Column -->\r\n\t<ng-container matColumnDef=\"pillar\">\r\n\t\t<th mat-header-cell *matHeaderCellDef>Pillar</th>\r\n\t\t<td mat-cell *matCellDef=\"let row\">\r\n\t\t\t@if (row.post.pillar) {\r\n\t\t\t<mat-chip-set aria-label=\"Pillar\" role=\"list\">\r\n\t\t\t\t<mat-chip role=\"listitem\" [highlighted]=\"true\" class=\"primary-chips-theme\">{{ row.post.pillar\r\n\t\t\t\t\t}}</mat-chip>\r\n\t\t\t</mat-chip-set>\r\n\t\t\t} @else {\r\n\t\t\t—\r\n\t\t\t}\r\n\t\t</td>\r\n\t</ng-container>\r\n\r\n\t<!-- Series Column -->\r\n\t<ng-container matColumnDef=\"series\">\r\n\t\t<th mat-header-cell *matHeaderCellDef>Series</th>\r\n\t\t<td mat-cell *matCellDef=\"let row\">\r\n\t\t\t@if (row.post.series) {\r\n\t\t\t<mat-chip-set aria-label=\"Series\" role=\"list\">\r\n\t\t\t\t<mat-chip role=\"listitem\" [highlighted]=\"true\" class=\"secondary-chips-theme\">{{ row.post.series\r\n\t\t\t\t\t}}</mat-chip>\r\n\t\t\t</mat-chip-set>\r\n\t\t\t} @else {\r\n\t\t\t—\r\n\t\t\t}\r\n\t\t</td>\r\n\t</ng-container>\r\n\r\n\t<!-- Timestamp Column -->\r\n\t<ng-container matColumnDef=\"timestamp\">\r\n\t\t<th mat-header-cell *matHeaderCellDef>Date</th>\r\n\t\t<td mat-cell *matCellDef=\"let row\">{{ timestampToMillis(row.post.timestamp) | date: 'MMMM d, y' }}</td>\r\n\t</ng-container>\r\n\r\n\t<!-- Detail Row (full width) -->\r\n\t<ng-container matColumnDef=\"detail\">\r\n\t\t<td mat-cell *matCellDef=\"let row\" [attr.colspan]=\"displayedColumns.length\">\r\n\t\t\t<div class=\"detail-content\">\r\n\t\t\t\t@if (row.post.description) {\r\n\t\t\t\t<div class=\"detail-description\">{{ row.post.description }}</div>\r\n\t\t\t\t}\r\n\r\n\t\t\t\t<div class=\"detail-actions\">\r\n\t\t\t\t\t<button mat-icon-button (click)=\"goToBlogPost(row.post.id)\" aria-label=\"Edit blog post\">\r\n\t\t\t\t\t\t<mat-icon>edit</mat-icon>\r\n\t\t\t\t\t</button>\r\n\t\t\t\t\t<button mat-icon-button (click)=\"onDeleteBlogPost(row.post)\" aria-label=\"Delete blog post\">\r\n\t\t\t\t\t\t<mat-icon>delete</mat-icon>\r\n\t\t\t\t\t</button>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t</td>\r\n\t</ng-container>\r\n\r\n\t<tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\r\n\t<tr mat-row *matRowDef=\"let row; columns: displayedColumns; when: isMainRow\"></tr>\r\n\t<tr mat-row *matRowDef=\"let row; columns: detailColumns; when: isDetailRow\" class=\"detail-row\"></tr>\r\n</table>\r\n} @else {\r\n<div class=\"empty-set\">\r\n\t<span>No blog posts created yet.</span>\r\n</div>\r\n\r\n}","import { InjectionToken } from '@angular/core';\r\n\r\nexport interface NgRhombusBlogThumbnailAdapter {\r\n\tuploadImageAndGetUrl(imageName: string, image: File): Promise<string>;\r\n\tdeleteImage(filePath?: string): Promise<void>;\r\n}\r\n\r\nexport const NG_RHOMBUS_BLOG_THUMBNAIL_ADAPTER = new InjectionToken<NgRhombusBlogThumbnailAdapter>(\r\n\t'NG_RHOMBUS_BLOG_THUMBNAIL_ADAPTER',\r\n\t{\r\n\t\tprovidedIn: 'root',\r\n\t\tfactory: () => ({\r\n\t\t\tuploadImageAndGetUrl: async () => {\r\n\t\t\t\tthrow new Error('NG_RHOMBUS_BLOG_THUMBNAIL_ADAPTER is not provided.');\r\n\t\t\t},\r\n\t\t\tdeleteImage: async () => {\r\n\t\t\t\tthrow new Error('NG_RHOMBUS_BLOG_THUMBNAIL_ADAPTER is not provided.');\r\n\t\t\t},\r\n\t\t}),\r\n\t}\r\n);\r\n","import { inject, Injectable } from \"@angular/core\";\r\nimport { NG_RHOMBUS_BLOG_THUMBNAIL_ADAPTER } from \"../tokens/blog-thumbnail-adapter\";\r\n\r\n@Injectable({\r\n\tprovidedIn: 'root'\r\n})\r\nexport class NgRhombusBlogPostThumbnailService {\r\n\tprivate readonly adapter = inject(NG_RHOMBUS_BLOG_THUMBNAIL_ADAPTER);\r\n\r\n\tuploadImage(imageName: string, image: File): Promise<string> {\r\n\t\treturn this.adapter.uploadImageAndGetUrl(imageName, image);\r\n\t}\r\n\r\n\tdeleteImage(filePath?: string): Promise<void> {\r\n\t\treturn this.adapter.deleteImage(filePath);\r\n\t}\r\n}","import { Component, computed, input, OnInit } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'ng-rhombus-blog-thumbnail',\r\n imports: [],\r\n templateUrl: './thumbnail.component.html',\r\n styleUrl: './thumbnail.component.scss'\r\n})\r\nexport class NgRhombusBlogThumbnailComponent implements OnInit {\r\n width = input<number>(0);\r\n height = input<number>(0);\r\n imageSource = input<string>();\r\n\r\n placeholder = computed(() => `https://placehold.co/${this.width()}x${this.height()}`);\r\n contentSource = computed(() => { return this.imageSource() !== '' ? this.imageSource() : this.placeholder(); })\r\n\r\n ngOnInit(): void {\r\n if (this.width() === 0 && this.height() === 0) {\r\n\r\n }\r\n }\r\n}\r\n","<div class=\"image-placeholder\" [style.width]=\"width() + 'px'\" [style.height]=\"height() + 'px'\">\r\n <img [src]=\"contentSource()\" [width]=\"width()\" [height]=\"height()\" />\r\n</div>","import { Component } from '@angular/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatDialogModule } from '@angular/material/dialog';\r\n\r\n@Component({\r\n selector: 'ng-rhombus-Blog-delete-thumbnail',\r\n imports: [MatButtonModule, MatDialogModule],\r\n templateUrl: './delete-thumbnail.component.html',\r\n styleUrl: './delete-thumbnail.component.scss'\r\n})\r\nexport class NgRhombusBlogDeleteThumbnailComponent {\r\n\r\n}\r\n","<h2 mat-dialog-title>Blog Post Thumbnail - Delete</h2>\r\n<mat-dialog-content>\r\n <p>Would you like to delete this thumbnail?</p>\r\n</mat-dialog-content>\r\n<mat-dialog-actions>\r\n <button mat-button [mat-dialog-close]=\"false\" cdkFocusInitial>Cancel</button>\r\n <button mat-button [mat-dialog-close]=\"true\">Confirm</button>\r\n</mat-dialog-actions>","\r\nimport { Component, computed, ElementRef, inject, input, output, signal, ViewChild } from '@angular/core';\r\nimport { MatButton, MatButtonModule } from '@angular/material/button';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { NgRhombusBlogPostThumbnailService } from '../../services/thumbnail.service';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { NgRhombusBlogThumbnailComponent } from \"../thumbnail/thumbnail.component\";\r\nimport { NgRhombusBlogDeleteThumbnailComponent } from '../dialogs/delete-thumbnail/delete-thumbnail.component';\r\n\r\n@Component({\r\n selector: 'ng-rhombus-thumbnail-control',\r\n imports: [MatButtonModule, MatIconModule, NgRhombusBlogThumbnailComponent],\r\n templateUrl: './thumbnail-control.component.html',\r\n styleUrl: './thumbnail-control.component.scss'\r\n})\r\nexport class ThumbnailControlComponent {\r\n width = input<number>(0);\r\n height = input<number>(0);\r\n thumbnailSrc = input<string>('');\r\n disabled = input<boolean>(false);\r\n displayMode = input<'preview' | 'indicator'>('preview');\r\n\r\n @ViewChild('thumbnailInput') thumbnailInput!: ElementRef;\r\n\r\n thumbnailService = inject(NgRhombusBlogPostThumbnailService);\r\n dialog = inject(MatDialog);\r\n\r\n onFileUploaded = output<string>();\r\n onFileDeleted = output<void>();\r\n\r\n uploadedFile = signal<string | undefined>(undefined);\r\n placeholder = computed(() => `https://placehold.co/${this.width()}x${this.height()}`);\r\n hasThumbnail = computed(() => {\r\n const fromUpload = this.uploadedFile();\r\n if (fromUpload) return true;\r\n\r\n const fromInput = this.thumbnailSrc();\r\n return !!fromInput;\r\n });\r\n\r\n imageSource = computed(() => {\r\n const fromUpload = this.uploadedFile();\r\n if (fromUpload) return fromUpload;\r\n\r\n const fromInput = this.thumbnailSrc();\r\n if (fromInput) return fromInput;\r\n\r\n return this.placeholder();\r\n });\r\n\r\n onThumbnailSelected(input: HTMLInputElement) {\r\n if (!input.files || input.files.length <= 0) {\r\n return;\r\n }\r\n const file: File = input.files[0];\r\n\r\n this.thumbnailService.uploadImage(file.name, file).then((downloadUrl) => {\r\n this.uploadedFile.set(downloadUrl);\r\n this.onFileUploaded.emit(downloadUrl);\r\n });\r\n }\r\n\r\n onThumbnailDeleted() {\r\n const dialogRef = this.dialog.open(NgRhombusBlogDeleteThumbnailComponent);\r\n\r\n dialogRef.afterClosed().subscribe(result => {\r\n if (result) {\r\n this.thumbnailService.deleteImage(this.uploadedFile()).then(() => {\r\n this.uploadedFile.set(undefined);\r\n this.thumbnailInput.nativeElement.value = '';\r\n this.onFileDeleted.emit();\r\n });\r\n }\r\n });\r\n }\r\n}\r\n","<div class=\"thumbnail-control-wrapper\">\r\n <input #thumbnailInput hidden type=\"file\" (change)=\"onThumbnailSelected(thumbnailInput)\" />\r\n <button mat-icon-button [disabled]=\"uploadedFile() || disabled()\" (click)=\"thumbnailInput.click()\" type=\"button\">\r\n <mat-icon>upload_file</mat-icon>\r\n </button>\r\n <button class=\"delete-button\" mat-icon-button [disabled]=\"!uploadedFile()\" (click)=\"onThumbnailDeleted()\"\r\n type=\"button\">\r\n <mat-icon>delete</mat-icon>\r\n </button>\r\n <div class=\"flex\"></div>\r\n\r\n @if (displayMode() === 'preview') {\r\n <ng-rhombus-blog-thumbnail [imageSource]=\"imageSource()\" [width]=\"width()\" [height]=\"height()\" />\r\n } @else {\r\n <div class=\"thumbnail-indicator\" [class.is-set]=\"hasThumbnail()\" aria-label=\"Thumbnail status\">\r\n <mat-icon>{{ hasThumbnail() ? 'check_circle' : 'radio_button_unchecked' }}</mat-icon>\r\n <span class=\"thumbnail-indicator-text\">Thumbnail</span>\r\n </div>\r\n }\r\n</div>","import { Component, inject } from '@angular/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MAT_DIALOG_DATA, MatDialogModule } from '@angular/material/dialog';\r\n\r\n@Component({\r\n selector: 'ng-rhombus-blog-confirmation',\r\n imports: [MatButtonModule, MatDialogModule],\r\n templateUrl: './confirmation.component.html',\r\n styleUrl: './confirmation.component.scss'\r\n})\r\nexport class NgRhombusBlogConfirmationComponent {\r\n\r\n data = inject(MAT_DIALOG_DATA);\r\n}\r\n","<h2 mat-dialog-title>{{ data.header }}</h2>\r\n<mat-dialog-content>\r\n <p>{{ data.query }}</p>\r\n</mat-dialog-content>\r\n<mat-dialog-actions>\r\n <button mat-button [mat-dialog-close]=\"false\" cdkFocusInitial>Cancel</button>\r\n <button mat-button [mat-dialog-close]=\"true\">Confirm</button>\r\n</mat-dialog-actions>","import { Component, effect, ElementRef, inject, input, output, signal, ViewChild } from '@angular/core';\r\nimport { FormGroup, FormBuilder, Validators, ReactiveFormsModule } from '@angular/forms';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { ThumbnailControlComponent } from \"../thumbnail-control/thumbnail-control.component\";\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner'\r\n\r\nimport { MatSidenavModule } from '@angular/material/sidenav';\r\nimport { MatCardModule } from '@angular/material/card';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatDividerModule } from '@angular/material/divider';\r\nimport { MatListModule } from '@angular/material/list';\r\nimport { IBlog, BlogSeries, ContentPillar } from '../../models/blog';\r\nimport { NgRhombusBlogService } from '../../services/blog.service';\r\nimport { NgRhombusBlogPostThumbnailService } from '../../services/thumbnail.service';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { NgRhombusBlogConfirmationComponent } from '../../dialogs/confirmation/confirmation.component';\r\nimport { ThemeService } from '../../../shell/services/theme.service';\r\nimport { NgClass } from '@angular/common';\r\nimport { NgRhombusMarkdownComponent } from '../../../shell/components/markdown/markdown.component';\r\n\r\n@Component({\r\n\tselector: 'ng-rhombus-blog-form',\r\n\timports: [NgClass, MatListModule, MatDividerModule, MatButtonModule, MatCardModule, MatFormFieldModule, MatInputModule, MatProgressSpinnerModule, MatSidenavModule, ReactiveFormsModule, ThumbnailControlComponent, MatIconModule, NgRhombusMarkdownComponent, MatSelectModule],\r\n\ttemplateUrl: './form.component.html',\r\n\tstyleUrl: './form.component.scss'\r\n})\r\nexport class NgRhombusBlogAddEditComponent {\r\n\tthemeService = inject(ThemeService);\r\n\r\n\tblogPost = input<IBlog | undefined>(undefined);\r\n\tcancelEvent = output<void>();\r\n\tsubmitEvent = output<IBlog>();\r\n\r\n\tcontentData = signal<string>('');\r\n\tblogPostForm!: FormGroup;\r\n\r\n\treadonly pillars = Object.values(ContentPillar);\r\n readonly seriesOptions = Object.values(BlogSeries);\r\n\r\n\tdialog = inject(MatDialog);\r\n\tthumbnailService = inject(NgRhombusBlogPostThumbnailService);\r\n\tformBuilder = inject(FormBuilder);\r\n\tblogService = inject(NgRhombusBlogService);\r\n\r\n\t@ViewChild('blogPost') blogPostPreview!: ElementRef;\r\n\r\n\tmarkdown = `## Markdown __rulez__!\r\n\t---\r\n\r\n\t### Syntax highlight\r\n\t\\`\\`\\`typescript\r\n\tconst language = 'typescript';\r\n\t\\`\\`\\`\r\n\r\n\t### Lists\r\n\t1. Ordered list\r\n\t2. Another bullet point\r\n\t- Unordered list\r\n\t- Another unordered bullet\r\n\r\n\t### Blockquote\r\n\t> Blockquote to the max`;\r\n\r\n\tconstructor() {\r\n\t\teffect(() => {\r\n\t\t\tif (this.blogPost()) {\r\n\t\t\t\tthis.blogPostForm.patchValue({\r\n\t\t\t\t\ttitle: this.blogPost()?.title,\r\n\t\t\t\t\tdescription: this.blogPost()?.description,\r\n\t\t\t\t\tthumbnail: this.blogPost()?.thumbnail,\r\n\t\t\t\t\tcontent: this.blogPost()?.content,\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t\tthis.onContentChange();\r\n\t\t})\r\n\t}\r\n\r\n\tngOnInit(): void {\r\n\t\tthis.blogPostForm = this.formBuilder.group({\r\n\t\t\ttitle: [this.blogPost()?.title, Validators.required],\r\n\t\t\tdescription: [this.blogPost()?.description, Validators.required],\r\n\t\t\tthumbnail: [this.blogPost()?.thumbnail, Validators.required],\r\n\t\t\tcontent: [this.blogPost()?.content, Validators.required],\r\n\r\n\t\t\t// creator system\r\n\t\t\tpillar: [this.blogPost()?.pillar ?? null, Validators.required],\r\n\t\t\tseries: [this.blogPost()?.series ?? null, Validators.required],\r\n\t\t\ttagsCsv: [(this.blogPost()?.tags ?? []).join(', '), Validators.required],\r\n\t\t});\r\n\r\n\t\tthis.applyCreatorSystemRules();\r\n\t\tthis.blogPostForm.get('series')?.valueChanges.subscribe(() => this.applyCreatorSystemRules());\r\n\t}\r\n\r\n\tprivate applyCreatorSystemRules() {\r\n\t\tconst pillarControl = this.blogPostForm.get('pillar');\r\n\t\tconst seriesValue = this.blogPostForm.get('series')?.value as BlogSeries | null;\r\n\t\tif (!pillarControl) return;\r\n\r\n\t\tif (seriesValue === BlogSeries.FromTheEditor) {\r\n\t\t\tpillarControl.clearValidators();\r\n\t\t\tif (pillarControl.value !== null) pillarControl.setValue(null);\r\n\t\t} else {\r\n\t\t\tpillarControl.setValidators([Validators.required]);\r\n\t\t}\r\n\t\tpillarControl.updateValueAndValidity({ emitEvent: false });\r\n\t}\r\n\r\n\tonContentChange() {\r\n\t\tthis.contentData.set(this.blogPostForm.getRawValue().content);\r\n\t}\r\n\r\n\tget thumbnailSource() {\r\n\t\treturn this.blogPostForm.getRawValue().thumbnail;\r\n\t}\r\n\r\n\tonFileUploaded(downloadUrl: string) {\r\n\t\tthis.blogPostForm.patchValue({\r\n\t\t\tthumbnail: downloadUrl\r\n\t\t});\r\n\t\tthis.blogPostForm.markAsDirty();\r\n\t}\r\n\r\n\tonFileDeleted() {\r\n\t\tthis.blogPostForm.patchValue({\r\n\t\t\tthumbnail: ''\r\n\t\t})\r\n\t}\r\n\r\n\tonCancelClick() {\r\n\t\tif (this.blogPost()) {\r\n\t\t\t// EDIT form\r\n\t\t\tif (this.blogPostForm.dirty) {\r\n\t\t\t\tconst dialogRef = this.dialog.open(NgRhombusBlogConfirmationComponent, {\r\n\t\t\t\t\tdata: {\r\n\t\t\t\t\t\theader: 'Cancel Revision',\r\n\t\t\t\t\t\tquery: 'Are you sure? You will lose your revision(s).'\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\r\n\t\t\t\tdialogRef.afterClosed().subscribe(result => {\r\n\t\t\t\t\tif (result) {\r\n\t\t\t\t\t\tthis.cancelEvent.emit();\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t} else {\r\n\t\t\t\tthis.cancelEvent.emit();\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\t// CREATE form\r\n\t\t\tif (this.blogPostForm.dirty) {\r\n\t\t\t\tconst dialogRef = this.dialog.open(NgRhombusBlogConfirmationComponent, {\r\n\t\t\t\t\tdata: {\r\n\t\t\t\t\t\theader: 'Cancel Create',\r\n\t\t\t\t\t\tquery: 'Are you sure? You will lose your progress.'\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\r\n\t\t\t\tdialogRef.afterClosed().subscribe(result => {\r\n\t\t\t\t\tif (result) {\r\n\t\t\t\t\t\tif (this.blogPostForm.getRawValue().thumbnail) {\r\n\t\t\t\t\t\t\tthis.thumbnailService.deleteImage(this.blogPostForm.getRawValue().thumbnail).then(() => {\r\n\t\t\t\t\t\t\t\tthis.onFileDeleted();\r\n\t\t\t\t\t\t\t\tthis.cancelEvent.emit();\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tthis.cancelEvent.emit();\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t} else {\r\n\t\t\t\tthis.cancelEvent.emit();\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tonSubmit() {\r\n\t\tif (this.blogPostForm.invalid) return;\r\n\r\n\t\tconst raw = this.blogPostForm.getRawValue();\r\n\t\tconst tags = this.parseTags(raw.tagsCsv);\r\n\r\n\t\tif (tags.length < 3 || tags.length > 6) {\r\n\t\t\t// keep it simple; if you prefer, set a form error and show mat-error\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst submittedBlogPost = new IBlog();\r\n\t\tif (this.blogPost()) submittedBlogPost.id = this.blogPost()!.id;\r\n\r\n\t\tsubmittedBlogPost.title = raw.title;\r\n\t\tsubmittedBlogPost.description = raw.description;\r\n\t\tsubmittedBlogPost.thumbnail = raw.thumbnail;\r\n\t\tsubmittedBlogPost.content = raw.content;\r\n\r\n\t\tsubmittedBlogPost.pillar = raw.pillar;\r\n\t\tsubmittedBlogPost.series = raw.series;\r\n\t\tsubmittedBlogPost.tags = tags;\r\n\r\n\t\tsubmittedBlogPost.readTimeMinutes = this.blogService.calculateReadTimeMinutes(raw.content);\r\n\r\n\t\tthis.submitEvent.emit(submittedBlogPost);\r\n\t}\r\n\r\n\tprivate parseTags(csv: string): string[] {\r\n\t\tconst tags = (csv ?? '')\r\n\t\t\t.split(',')\r\n\t\t\t.map(t => t.trim())\r\n\t\t\t.filter(Boolean);\r\n\r\n\t\t// unique, preserve order\r\n\t\treturn Array.from(new Set(tags));\r\n\t}\r\n}\r\n","<div class=\"h-full flex flex-row overflow-hidden min-h-0\">\r\n\t<div class=\"flex flex-col w-1/2 p-4 overflow-y-auto min-h-0\">\r\n\t\t<form novalidate class=\"flex flex-col gap-4 min-h-0\" [formGroup]=\"blogPostForm\">\r\n\t\t\t<mat-form-field>\r\n\t\t\t\t<mat-label>Title</mat-label>\r\n\t\t\t\t<input matInput placeholder=\"Placeholder\" formControlName=\"title\">\r\n\t\t\t</mat-form-field>\r\n\t\t\t<mat-form-field>\r\n\t\t\t\t<mat-label>Description</mat-label>\r\n\t\t\t\t<input matInput placeholder=\"Placeholder\" formControlName=\"description\">\r\n\t\t\t</mat-form-field>\r\n\t\t\t<ng-rhombus-thumbnail-control [thumbnailSrc]=\"thumbnailSource\" [width]=\"200\" [height]=\"112\"\r\n\t\t\t\t[displayMode]=\"'indicator'\" [disabled]=\"blogPost() !== undefined\"\r\n\t\t\t\t(onFileUploaded)=\"onFileUploaded($event)\"\r\n\t\t\t\t(onFileDeleted)=\"onFileDeleted()\"></ng-rhombus-thumbnail-control>\r\n\t\t\t<mat-form-field class=\"w-full\">\r\n\t\t\t\t<mat-label>Content</mat-label>\r\n\t\t\t\t<textarea matInput required class=\"content-textarea\" rows=\"12\" formControlName=\"content\"\r\n\t\t\t\t\t(input)=\"onContentChange()\"></textarea>\r\n\t\t\t</mat-form-field>\r\n\t\t\t<div class=\"grid grid-cols-1 sm:grid-cols-2 gap-4\">\r\n\t\t\t\t<mat-form-field class=\"w-full\">\r\n\t\t\t\t\t<mat-label>Content Pillar (optional for From The Editor)</mat-label>\r\n\t\t\t\t\t<mat-select formControlName=\"pillar\" required>\r\n\t\t\t\t\t\t@for (p of pillars; track p) {\r\n\t\t\t\t\t\t<mat-option [value]=\"p\">{{ p }}</mat-option>\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t</mat-select>\r\n\t\t\t\t</mat-form-field>\r\n\r\n\t\t\t\t<mat-form-field class=\"w-full\">\r\n\t\t\t\t\t<mat-label>Series</mat-label>\r\n\t\t\t\t\t<mat-select formControlName=\"series\" required>\r\n\t\t\t\t\t\t@for (s of seriesOptions; track s) {\r\n\t\t\t\t\t\t<mat-option [value]=\"s\">{{ s }}</mat-option>\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t</mat-select>\r\n\t\t\t\t</mat-form-field>\r\n\t\t\t</div>\r\n\t\t\t<mat-form-field>\r\n\t\t\t\t<mat-label>Tags</mat-label>\r\n\t\t\t\t<input matInput formControlName=\"tagsCsv\" placeholder=\"3–6 tags, comma-separated\">\r\n\t\t\t\t<mat-hint>Example: angular, firestore, testing</mat-hint>\r\n\t\t\t</mat-form-field>\r\n\t\t\t<div class=\"flex\">\r\n\t\t\t\t<button mat-raised-button class=\"\" (click)=\"onCancelClick()\" type=\"button\">Cancel</button>\r\n\t\t\t\t<div class=\"flex-1\"></div>\r\n\t\t\t\t<button mat-flat-button [disabled]=\"blogPostForm.invalid\" type=\"button\"\r\n\t\t\t\t\t(click)=\"onSubmit()\">Submit</button>\r\n\t\t\t</div>\r\n\t\t</form>\r\n\t</div>\r\n\r\n\t<div class=\"flex flex-col w-1/2 p-4 overflow-y-auto\">\r\n\t\t<mat-card>\r\n\t\t\t<mat-card-header>\r\n\t\t\t\t<mat-card-title>{{ blogPostForm.getRawValue().title }}</mat-card-title>\r\n\t\t\t\t<mat-card-subtitle>{{ blogPostForm.getRawValue().description }}</mat-card-subtitle>\r\n\t\t\t</mat-card-header>\r\n\t\t\t<img mat-card-image [src]=\"blogPostForm.getRawValue().thumbnail\" />\r\n\t\t\t<mat-card-content>\r\n\t\t\t\t<ng-rhombus-markdown [classes]=\"{ 'prose': true, 'dark:prose-invert': themeService.isDarkMode() }\"\r\n\t\t\t\t\t[data]=\"contentData()\" />\r\n\t\t\t</mat-card-content>\r\n\t\t\t<mat-card-footer>\r\n\t\t\t\t<span class=\"flex flex-row-reverse\">Doug Williamson</span>\r\n\t\t\t</mat-card-footer>\r\n\t\t</mat-card>\r\n\t</div>\r\n</div>","import { Component, inject, input, OnInit } from '@angular/core';\r\nimport { MatCardModule } from '@angular/material/card';\r\nimport { MatMenuModule } from '@angular/material/menu';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatChipsModule } from '@angular/material/chips';\r\nimport { DOCUMENT } from '@angular/common';\r\nimport { IBlog, ngRhombusTimestampToMillis } from '../../models/blog';\r\nimport { DatePipe, NgClass } from '@angular/common';\r\nimport { ThemeService } from '../../../shell/services/theme.service';\r\nimport { NgRhombusMarkdownComponent } from '../../../shell/components/markdown/markdown.component';\r\nimport { FontAwesomeModule } from '@fortawesome/angular-fontawesome';\r\nimport { faXTwitter, faFacebook, faBluesky, faLinkedin } from '@fortawesome/free-brands-svg-icons';\r\n\r\n@Component({\r\n selector: 'ng-rhombus-blog-post',\r\n imports: [DatePipe, NgClass, NgRhombusMarkdownComponent, MatCardModule, MatMenuModule, MatIconModule, MatButtonModule, MatChipsModule, FontAwesomeModule],\r\n templateUrl: './post.component.html',\r\n styleUrl: './post.component.scss'\r\n})\r\nexport class NgRhombusBlogPostComponent implements OnInit {\r\n dataSource = input<IBlog>();\r\n themeService = inject(ThemeService);\r\n #doc = inject(DOCUMENT);\r\n\r\n timestampToMillis = ngRhombusTimestampToMillis;\r\n\r\n ngOnInit() {\r\n\r\n }\r\n\r\n // Build absolute URL for sharing\r\n getShareUrl(): string {\r\n const id = this.dataSource()?.id;\r\n const origin = (this.#doc as any)?.location?.origin ?? '';\r\n const path = id ? `/blog/${id}` : (this.#doc as any)?.location?.pathname ?? '/blog';\r\n return `${origin}${path}`;\r\n }\r\n\r\n get shareLinks() {\r\n const url = encodeURIComponent(this.getShareUrl());\r\n const text = encodeURIComponent(this.dataSource()?.title ?? '');\r\n return {\r\n twitter: `https://twitter.com/intent/tweet?url=${url}&text=${text}`,\r\n facebook: `https://www.facebook.com/sharer/sharer.php?u=${url}`,\r\n linkedin: `https://www.linkedin.com/sharing/share-offsite/?url=${url}`,\r\n bluesky: `https://bsky.app/intent/compose?text=${text}&url=${url}`\r\n };\r\n }\r\n\r\n copyLink(): void {\r\n const u = this.getShareUrl();\r\n if (typeof navigator !== 'undefined' && navigator.clipboard) {\r\n navigator.clipboard.writeText(u).catch(() => { });\r\n }\r\n }\r\n\r\n faXTwitter = faXTwitter;\r\n faFacebook = faFacebook;\r\n faBluesky = faBluesky;\r\n faLinkedin = faLinkedin;\r\n\r\n private normalizeTags(tags: IBlog['tags']): string[] {\r\n if (!tags) return [];\r\n if (Array.isArray(tags)) return tags.map(t => `${t}`.trim()).filter(Boolean);\r\n\r\n // handle \"tag1, tag2\"\r\n return `${tags}`\r\n .split(',')\r\n .map(t => t.trim())\r\n .filter(Boolean);\r\n }\r\n\r\n get contentPillar(): string | null {\r\n return (this.dataSource()?.pillar ?? null) || null;\r\n }\r\n\r\n get series(): string | null {\r\n return (this.dataSource()?.series ?? null) || null;\r\n }\r\n\r\n get tags(): string[] {\r\n return this.normalizeTags(this.dataSource()?.tags ?? null);\r\n }\r\n\r\n get hasTaxonomy(): boolean {\r\n return !!this.contentPillar || !!this.series || this.tags.length > 0;\r\n }\r\n}\r\n","<mat-card>\r\n\t<mat-card-header>\r\n\t\t<mat-card-title>{{ dataSource()?.title }}</mat-card-title>\r\n\t\t<mat-card-subtitle>\r\n\t\t\t@if (contentPillar || series) {\r\n\t\t\t<mat-chip-set aria-label=\"Post taxonomy\" role=\"list\">\r\n\t\t\t\t@if (contentPillar) {\r\n\t\t\t\t<mat-chip role=\"listitem\" class=\"primary-chips-theme\" [highlighted]=\"true\">Pillar: {{ contentPillar\r\n\t\t\t\t\t}}</mat-chip>\r\n\t\t\t\t}\r\n\t\t\t\t@if (series) {\r\n\t\t\t\t<mat-chip role=\"listitem\" class=\"secondary-chips-theme\" [highlighted]=\"true\">Series: {{ series\r\n\t\t\t\t\t}}</mat-chip>\r\n\t\t\t\t}\r\n\t\t\t</mat-chip-set>\r\n\t\t\t}\r\n\t\t</mat-card-subtitle>\r\n\t</mat-card-header>\r\n\t<mat-card-content>\r\n\t\t<div class=\"flex items-center justify-between\">\r\n\t\t\t<p class=\"timestamp\">\r\n\t\t\t\t{{ dataSource()?.readTimeMinutes }} {{ dataSource()?.readTimeMinutes === 1 ? 'min' : 'mins' }}\r\n\t\t\t\t&middot;\r\n\t\t\t\t{{ timestampToMillis(dataSource()?.timestamp) | date: 'MMM d, y' }}\r\n\t\t\t</p>\r\n\t\t\t<div class=\"flex-1\"></div>\r\n\t\t\t<button matIconButton [matMenuTriggerFor]=\"shareMenu\" aria-label=\"Share post\">\r\n\t\t\t\t<mat-icon>share</mat-icon>\r\n\t\t\t</button>\r\n\t\t</div>\r\n\r\n\t\t<mat-menu #shareMenu=\"matMenu\">\r\n\t\t\t<a mat-menu-item [href]=\"shareLinks.twitter\" target=\"_blank\" rel=\"noopener\">\r\n\t\t\t\t<fa-icon [icon]=\"faXTwitter\" class=\"mr-2\"></fa-icon>\r\n\t\t\t\t<span>Share on X</span>\r\n\t\t\t</a>\r\n\t\t\t<a mat-menu-item [href]=\"shareLinks.facebook\" target=\"_blank\" rel=\"noopener\">\r\n\t\t\t\t<fa-icon [icon]=\"faFacebook\" class=\"mr-2\"></fa-icon>\r\n\t\t\t\t<span>Share on Facebook</span>\r\n\t\t\t</a>\r\n\t\t\t<a mat-menu-item [href]=\"shareLinks.bluesky\" target=\"_blank\" rel=\"noopener\">\r\n\t\t\t\t<fa-icon [icon]=\"faBluesky\" class=\"mr-2\"></fa-icon>\r\n\t\t\t\t<span>Share on Bluesky</span>\r\n\t\t\t</a>\r\n\t\t\t<a mat-menu-item [href]=\"shareLinks.linkedin\" target=\"_blank\" rel=\"noopener\">\r\n\t\t\t\t<fa-icon [icon]=\"faLinkedin\" class=\"mr-2\"></fa-icon>\r\n\t\t\t\t<span>Share on LinkedIn</span>\r\n\t\t\t</a>\r\n\t\t\t<button mat-menu-item (click)=\"copyLink()\">\r\n\t\t\t\t<mat-icon>content_copy</mat-icon>\r\n\t\t\t\t<span>Copy link</span>\r\n\t\t\t</button>\r\n\t\t</mat-menu>\r\n\t</mat-card-content>\r\n\t<img mat-card-image [src]=\"dataSource()?.thumbnail\" />\r\n\t<mat-card-content class=\"content\">\r\n\t\t<ng-rhombus-markdown\r\n\t\t\t[classes]=\"{ 'prose': true, 'dark:prose-invert': themeService.isDarkMode() }\"\r\n\t\t\t[data]=\"dataSource()?.content\"\r\n\t\t/>\r\n\t</mat-card-content>\r\n\t@if (tags.length) {\r\n\t<mat-card-content>\r\n\t\t<mat-chip-set aria-label=\"Post tags\" role=\"list\">\r\n\t\t\t@for (t of tags; track t) {\r\n\t\t\t<mat-chip role=\"listitem\" highlighted=\"true\" class=\"neutral-chips-theme\">#{{ t }}</mat-chip>\r\n\t\t\t}\r\n\t\t</mat-chip-set>\r\n\t</mat-card-content>\r\n\t}\r\n</mat-card>","import { Component } from '@angular/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatDialogModule } from '@angular/material/dialog';\r\n\r\n@Component({\r\n selector: 'ng-rhombus-Blog-delete-post',\r\n imports: [MatButtonModule, MatDialogModule],\r\n templateUrl: './delete-post.component.html',\r\n styleUrl: './delete-post.component.scss'\r\n})\r\nexport class NgRhombusBlogDeletePostComponent {\r\n\r\n}\r\n","<h2 mat-dialog-title>Blog Post - Delete</h2>\r\n<mat-dialog-content>\r\n <p>Would you like to delete this blog post?</p>\r\n</mat-dialog-content>\r\n<mat-dialog-actions>\r\n <button mat-button [mat-dialog-close]=\"false\" cdkFocusInitial>Cancel</button>\r\n <button mat-button [mat-dialog-close]=\"true\">Confirm</button>\r\n</mat-dialog-actions>","/*\r\n * Public API Surface of @doug-williamson/ng-rhombus/shell\r\n */\r\n\r\nexport * from './components/list/list.component';\r\nexport * from './components/latest/latest.component';\r\nexport * from './components/table/table.component';\r\nexport * from './components/form/form.component';\r\nexport * from './components/post/post.component';\r\nexport * from './components/dialogs/delete-post/delete-post.component';\r\n\r\nexport * from './services/blog.service';\r\nexport * from './services/thumbnail.service';\r\n\r\nexport * from './models/blog';\r\n\r\nexport * from './tokens/blog-adapter';\r\nexport * from './tokens/blog-thumbnail-adapter';","\r\nexport class IHome {\r\n id!: string;\r\n title!: string;\r\n description!: string;\r\n}","import { Component, OnInit, effect, inject, input, output } from '@angular/core';\r\nimport { FormBuilder, FormGroup, ReactiveFormsModule, Validators } from '@angular/forms';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { IHome } from '../models/home';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatButtonModule } from '@angular/material/button';\r\n\r\n@Component({\r\n selector: 'ng-rhombus-home-admin',\r\n imports: [MatButtonModule, ReactiveFormsModule, MatFormFieldModule, MatInputModule],\r\n templateUrl: './admin.html',\r\n styleUrl: './admin.scss'\r\n})\r\nexport class NgRhombusHomeAdminComponent implements OnInit {\r\n formAdminData = input<IHome | undefined>(undefined);\r\n cancelEvent = output<void>();\r\n submitEvent = output<IHome>();\r\n\r\n homeAdminForm!: FormGroup;\r\n private fb = inject(FormBuilder);\r\n\r\n ngOnInit(): void {\r\n // build once\r\n this.homeAdminForm = this.fb.group({\r\n title: ['', Validators.required],\r\n description: ['', Validators.required],\r\n // add other fields here...\r\n });\r\n\r\n // react to input changes (runs when data arrives)\r\n effect(() => {\r\n const data = this.formAdminData();\r\n if (data) {\r\n this.homeAdminForm.patchValue(data, { emitEvent: false });\r\n }\r\n });\r\n }\r\n\r\n onSubmit() {\r\n if (this.homeAdminForm.invalid) {\r\n return;\r\n }\r\n\r\n const rawData: IHome = this.homeAdminForm.getRawValue();\r\n let submittedHomeAdmin = new IHome();\r\n if (this.formAdminData()) {\r\n submittedHomeAdmin.id = this.formAdminData()!.id;\r\n }\r\n\r\n submittedHomeAdmin.title = rawData.title;\r\n submittedHomeAdmin.description = rawData.description;\r\n\r\n this.submitEvent.emit(submittedHomeAdmin);\r\n }\r\n\r\n onCancelClick() {\r\n console.log('cancel');\r\n }\r\n}\r\n","<div class=\"page-header\">\r\n\t<div class=\"page-header__title mat-headline-small\">Admin Component</div>\r\n</div>\r\n<div class=\"h-full flex flex-row\">\r\n\t<div class=\"flex flex-col w-1/2 p-4\">\r\n\t\t<form novalidate class=\"h-full flex flex-col\" [formGroup]=\"homeAdminForm\">\r\n\t\t\t<mat-form-field>\r\n\t\t\t\t<mat-label>Title</mat-label>\r\n\t\t\t\t<input matInput placeholder=\"Placeholder\" formControlName=\"title\">\r\n\t\t\t</mat-form-field>\r\n\t\t\t<mat-form-field>\r\n\t\t\t\t<mat-label>Description</mat-label>\r\n\t\t\t\t<input matInput placeholder=\"Placeholder\" formControlName=\"description\">\r\n\t\t\t</mat-form-field>\r\n\r\n\t\t\t<div class=\"flex\">\r\n\t\t\t\t<button mat-raised-button class=\"\" (click)=\"onCancelClick()\" type=\"button\">Cancel</button>\r\n\t\t\t\t<div class=\"flex-1\"></div>\r\n\t\t\t\t<button mat-flat-button [disabled]=\"homeAdminForm.invalid\" type=\"button\"\r\n\t\t\t\t\t(click)=\"onSubmit()\">Submit</button>\r\n\t\t\t</div>\r\n\t\t</form>\r\n\t</div>\r\n</div>","import { InjectionToken } from '@angular/core';\r\nimport { IHome } from '../models/home';\r\n\r\nexport type NgRhombusHomeSaveResult =\r\n\t| { created: true; id: string }\r\n\t| { updated: true; id: string };\r\n\r\nexport interface NgRhombusHomeAdapter {\r\n\tfetchTopHomeDocument(): Promise<IHome | undefined>;\r\n\tsaveOrUpdateHomeDocument(homeData: IHome): Promise<NgRhombusHomeSaveResult>;\r\n}\r\n\r\nexport const NG_RHOMBUS_HOME_ADAPTER = new InjectionToken<NgRhombusHomeAdapter>(\r\n\t'NG_RHOMBUS_HOME_ADAPTER',\r\n\t{\r\n\t\tprovidedIn: 'root',\r\n\t\tfactory: () => ({\r\n\t\t\tfetchTopHomeDocument: async () => undefined,\r\n\t\t\tsaveOrUpdateHomeDocument: async () => {\r\n\t\t\t\tthrow new Error('NG_RHOMBUS_HOME_ADAPTER is not provided.');\r\n\t\t\t}\r\n\t\t})\r\n\t}\r\n);\r\n","import { Injectable, inject, signal } from '@angular/core';\r\nimport { IHome } from './models/home';\r\nimport { NG_RHOMBUS_HOME_ADAPTER, NgRhombusHomeSaveResult } from './tokens/home-adapter';\r\n\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class NgRhombusHomeService {\r\n\r\n private adapter = inject(NG_RHOMBUS_HOME_ADAPTER);\r\n\r\n homeAdminData = signal<IHome | undefined>(undefined);\r\n\r\n async fetchTopHomeDocument() {\r\n\t\tconst topHome = await this.adapter.fetchTopHomeDocument();\r\n\t\tthis.homeAdminData.set(topHome);\r\n\t\treturn topHome;\r\n }\r\n\r\n async saveOrUpdateHomeDocument(homeData: IHome) {\r\n\t\tconst result: NgRhombusHomeSaveResult = await this.adapter.saveOrUpdateHomeDocument(homeData);\r\n\t\tthis.homeAdminData.set({ ...homeData, id: result.id });\r\n\t\treturn result;\r\n }\r\n}","export enum SocialsSource {\r\n\tTwitch = 'Twitch',\r\n\tYouTube = 'YouTube',\r\n\tInstagram = 'Instagram',\r\n\tTikTok = 'TikTok',\r\n\tBluesky = 'Bluesky',\r\n\tGitHub = 'GitHub',\r\n\tLinkedIn = 'LinkedIn'\r\n}\r\n\r\nexport interface ISocial {\r\n\tid: string;\r\n\tsource: SocialsSource;\r\n\turl: string;\r\n}\r\n","import { Component, inject, input } from '@angular/core';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { FontAwesomeModule } from '@fortawesome/angular-fontawesome';\r\nimport { IconDefinition } from '@fortawesome/fontawesome-svg-core';\r\nimport { faGithub, faYoutube, faInstagram, faTwitch, faTiktok, faBluesky, faLinkedin } from '@fortawesome/free-brands-svg-icons';\r\nimport { faLink } from '@fortawesome/free-solid-svg-icons';\r\nimport { ISocial, SocialsSource } from '../models/socials';\r\nimport { WrapperService } from '../../shell/public-api';\r\n\r\n@Component({\r\n selector: 'ng-rhombus-socials-list',\r\n standalone: true,\r\n imports: [FontAwesomeModule, MatIconModule, MatButtonModule],\r\n templateUrl: './list.component.html',\r\n styleUrls: ['./list.component.scss']\r\n})\r\nexport class NgRhombusSocialsListComponent {\r\n wrapperService = inject(WrapperService);\r\n socials = input<ISocial[]>([]);\r\n\r\n iconFor(source?: SocialsSource): IconDefinition {\r\n switch (source) {\r\n case SocialsSource.YouTube: return faYoutube;\r\n case SocialsSource.Instagram: return faInstagram;\r\n case SocialsSource.Twitch: return faTwitch;\r\n case SocialsSource.TikTok: return faTiktok;\r\n case SocialsSource.Bluesky: return faBluesky; // no official brand, fallback\r\n case SocialsSource.GitHub: return faGithub;\r\n case SocialsSource.LinkedIn: return faLinkedin;\r\n default: return faLink;\r\n }\r\n }\r\n}","@if ((socials()).length === 0) {\r\n<p class=\"m-6 justify-self-center\">No socials found.</p>\r\n} @else {\r\n<div class=\"toolbar-list\">\r\n @for (s of socials(); track s.id) {\r\n <a [attr.href]=\"s.url || null\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"block\"\r\n [attr.aria-label]=\"'Open ' + s.source + ' link'\">\r\n <div class=\"social-row actionable\">\r\n <fa-icon [icon]=\"iconFor(s.source)\" class=\"fa-icon left\"></fa-icon>\r\n <span class=\"center\">{{ s.source }}</span>\r\n @if (s.url) {\r\n <button mat-icon-button class=\"right\" aria-label=\"Copy link\">\r\n <mat-icon>content_copy</mat-icon>\r\n </button>\r\n }\r\n </div>\r\n </a>\r\n }\r\n</div>\r\n}","import { InjectionToken } from '@angular/core';\r\nimport { ISocial } from '../models/socials';\r\n\r\nexport interface NgRhombusSocialsAdapter {\r\n\tfetchAll(): Promise<ISocial[]>;\r\n\tfetchById(id: string): Promise<ISocial | undefined>;\r\n\tcreate(social: Omit<ISocial, 'id'>): Promise<string>;\r\n\tupdate(id: string, patch: Partial<Omit<ISocial, 'id'>>): Promise<void>;\r\n\tremove(id: string): Promise<void>;\r\n}\r\n\r\nexport const NG_RHOMBUS_SOCIALS_ADAPTER = new InjectionToken<NgRhombusSocialsAdapter>(\r\n\t'NG_RHOMBUS_SOCIALS_ADAPTER',\r\n\t{\r\n\t\tprovidedIn: 'root',\r\n\t\tfactory: () => ({\r\n\t\t\tfetchAll: async () => [],\r\n\t\t\tfetchById: async () => undefined,\r\n\t\t\tcreate: async () => {\r\n\t\t\t\tthrow new Error('NG_RHOMBUS_SOCIALS_ADAPTER is not provided.');\r\n\t\t\t},\r\n\t\t\tupdate: async () => {\r\n\t\t\t\tthrow new Error('NG_RHOMBUS_SOCIALS_ADAPTER is not provided.');\r\n\t\t\t},\r\n\t\t\tremove: async () => {\r\n\t\t\t\tthrow new Error('NG_RHOMBUS_SOCIALS_ADAPTER is not provided.');\r\n\t\t\t}\r\n\t\t})\r\n\t}\r\n);\r\n","import { Injectable, inject, signal } from '@angular/core';\r\nimport { ISocial } from './models/socials';\r\nimport { NG_RHOMBUS_SOCIALS_ADAPTER } from './tokens/socials-adapter';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class NgRhombusSocialsService {\r\n private adapter = inject(NG_RHOMBUS_SOCIALS_ADAPTER);\r\n\r\n socials = signal<ISocial[]>([]);\r\n\r\n private sort(items: ISocial[]): ISocial[] {\r\n return [...items].sort((a, b) => `${a.source}`.localeCompare(`${b.source}`));\r\n }\r\n\r\n // List\r\n async fetchAll(): Promise<ISocial[]> {\r\n const items = await this.adapter.fetchAll();\r\n const sorted = this.sort(items);\r\n this.socials.set(sorted);\r\n return sorted;\r\n }\r\n\r\n // Read by id\r\n async fetchById(id: string): Promise<ISocial | undefined> {\r\n return this.adapter.fetchById(id);\r\n }\r\n\r\n // Create (auto-id)\r\n async create(social: Omit<ISocial, 'id'>): Promise<string> {\r\n const id = await this.adapter.create(social);\r\n this.socials.set(this.sort([...this.socials(), { ...(social as ISocial), id }]));\r\n return id;\r\n }\r\n\r\n // Update (partial)\r\n async update(id: string, patch: Partial<Omit<ISocial, 'id'>>): Promise<void> {\r\n await this.adapter.update(id, patch);\r\n this.socials.set(\r\n this.sort(this.socials().map(s => (s.id === id ? { ...s, ...(patch as ISocial) } : s)))\r\n );\r\n }\r\n\r\n // Delete\r\n async remove(id: string): Promise<void> {\r\n await this.adapter.remove(id);\r\n this.socials.set(this.socials().filter(s => s.id !== id));\r\n }\r\n}\r\n","import { Component, inject } from '@angular/core';\r\nimport { MAT_DIALOG_DATA, MatDialogModule, MatDialogRef } from '@angular/material/dialog';\r\nimport { FormBuilder, ReactiveFormsModule, Validators } from '@angular/forms';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { ISocial, SocialsSource } from '../../models/socials';\r\nimport { MatButtonModule } from '@angular/material/button';\r\n\r\nexport interface SocialEditDialogData {\r\n social?: ISocial | null; // undefined/null => create, object => edit\r\n}\r\n\r\n@Component({\r\n selector: 'ng-rhombus-social-edit-dialog',\r\n standalone: true,\r\n imports: [MatDialogModule, ReactiveFormsModule, MatFormFieldModule, MatInputModule, MatSelectModule, MatButtonModule],\r\n templateUrl: './add-edit.component.html',\r\n})\r\nexport class NgRhombusSocialEditDialogComponent {\r\n private fb = inject(FormBuilder);\r\n private dialogRef = inject<MatDialogRef<NgRhombusSocialEditDialogComponent, { source: SocialsSource; url: string }>>(MatDialogRef);\r\n data = inject<SocialEditDialogData>(MAT_DIALOG_DATA);\r\n\r\n socialTypeOptions = [\r\n { label: 'Twitch', value: SocialsSource.Twitch },\r\n { label: 'YouTube', value: SocialsSource.YouTube },\r\n { label: 'Instagram', value: SocialsSource.Instagram },\r\n { label: 'TikTok', value: SocialsSource.TikTok },\r\n { label: 'Bluesky', value: SocialsSource.Bluesky },\r\n { label: 'GitHub', value: SocialsSource.GitHub },\r\n { label: 'LinkedIn', value: SocialsSource.LinkedIn }\r\n ];\r\n\r\n form = this.fb.group({\r\n source: this.fb.control<SocialsSource | null>(this.data.social?.source ?? null, { validators: [Validators.required] }),\r\n url: this.fb.control<string>(this.data.social?.url ?? '', { nonNullable: true, validators: [Validators.required] })\r\n });\r\n\r\n save() {\r\n const { source, url } = this.form.getRawValue();\r\n if (!source || !url) return;\r\n this.dialogRef.close({ source, url });\r\n }\r\n\r\n cancel() {\r\n this.dialogRef.close();\r\n }\r\n}","<h2 mat-dialog-title>\r\n {{ data.social ? 'Edit Social' : 'Add Social' }}\r\n</h2>\r\n\r\n<form [formGroup]=\"form\" (ngSubmit)=\"save()\">\r\n <mat-dialog-content>\r\n <mat-form-field appearance=\"fill\" style=\"width: 100%\">\r\n <mat-label>Source</mat-label>\r\n <mat-select formControlName=\"source\">\r\n @for (opt of socialTypeOptions; track opt.value) {\r\n <mat-option [value]=\"opt.value\">\r\n {{ opt.label }}\r\n </mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field appearance=\"fill\" style=\"width: 100%\">\r\n <mat-label>URL</mat-label>\r\n <input matInput formControlName=\"url\" />\r\n </mat-form-field>\r\n </mat-dialog-content>\r\n\r\n <mat-dialog-actions align=\"end\">\r\n <button mat-button type=\"button\" (click)=\"cancel()\">Cancel</button>\r\n <button mat-raised-button color=\"primary\" type=\"submit\" [disabled]=\"form.invalid\">\r\n Save\r\n </button>\r\n </mat-dialog-actions>\r\n</form>","import { Component, inject } from '@angular/core';\r\nimport { MAT_DIALOG_DATA, MatDialogModule, MatDialogRef } from '@angular/material/dialog';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { ISocial } from '../../models/socials';\r\n\r\nexport interface SocialDeleteDialogData {\r\n social: ISocial;\r\n}\r\n\r\n@Component({\r\n selector: 'ng-rhombus-social-delete-dialog',\r\n standalone: true,\r\n imports: [MatDialogModule, MatButtonModule],\r\n templateUrl: './delete.component.html',\r\n})\r\nexport class NgRhombusSocialDeleteDialogComponent {\r\n readonly data = inject<SocialDeleteDialogData>(MAT_DIALOG_DATA);\r\n private dialogRef = inject<MatDialogRef<NgRhombusSocialDeleteDialogComponent, boolean>>(MatDialogRef);\r\n\r\n cancel() {\r\n this.dialogRef.close(false);\r\n }\r\n\r\n confirm() {\r\n this.dialogRef.close(true);\r\n }\r\n}\r\n","<h2 mat-dialog-title>Delete Social</h2>\r\n\r\n<mat-dialog-content>\r\n Are you sure you want to delete this social?\r\n <br />\r\n <strong>{{ data.social.source }} - {{ data.social.url }}</strong>\r\n</mat-dialog-content>\r\n\r\n<mat-dialog-actions align=\"end\">\r\n <button mat-button (click)=\"cancel()\">Cancel</button>\r\n <button mat-raised-button color=\"warn\" (click)=\"confirm()\">Delete</button>\r\n</mat-dialog-actions>\r\n","import { Component, input, inject } from '@angular/core';\r\nimport { MatTableModule } from '@angular/material/table';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { ISocial, SocialsSource } from '../models/socials';\r\nimport { NgRhombusSocialsService } from '../socials.service';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { firstValueFrom } from 'rxjs';\r\nimport { NgRhombusSocialEditDialogComponent } from '../modals/add-edit/add-edit.component';\r\nimport { NgRhombusSocialDeleteDialogComponent } from '../modals/delete/delete.component';\r\nimport { NgClass } from '@angular/common';\r\nimport { faGithub, faYoutube, faInstagram, faTwitch, faTiktok, faBluesky, faLinkedin, IconDefinition } from '@fortawesome/free-brands-svg-icons';\r\nimport { faLink } from '@fortawesome/free-solid-svg-icons';\r\nimport { FontAwesomeModule } from '@fortawesome/angular-fontawesome';\r\n\r\n@Component({\r\n selector: 'ng-rhombus-socials-table',\r\n standalone: true,\r\n imports: [FontAwesomeModule, MatTableModule, MatButtonModule, MatSelectModule, MatIconModule, MatFormFieldModule, MatInputModule],\r\n templateUrl: './table.component.html',\r\n styleUrls: ['./table.component.scss']\r\n})\r\nexport class NgRhombusSocialsTableComponent {\r\n socials = input<ISocial[]>([]);\r\n displayedColumns = ['source', 'url', 'actions'];\r\n\r\n iconFor(source?: SocialsSource): IconDefinition {\r\n switch (source) {\r\n case SocialsSource.YouTube: return faYoutube;\r\n case SocialsSource.Instagram: return faInstagram;\r\n case SocialsSource.Twitch: return faTwitch;\r\n case SocialsSource.TikTok: return faTiktok;\r\n case SocialsSource.Bluesky: return faBluesky; // no official brand, fallback\r\n case SocialsSource.GitHub: return faGithub;\r\n case SocialsSource.LinkedIn: return faLinkedin;\r\n default: return faLink;\r\n }\r\n }\r\n\r\n socialTypeOptions = [\r\n { label: 'Twitch', value: SocialsSource.Twitch },\r\n { label: 'YouTube', value: SocialsSource.YouTube },\r\n { label: 'Instagram', value: SocialsSource.Instagram },\r\n { label: 'TikTok', value: SocialsSource.TikTok },\r\n { label: 'Bluesky', value: SocialsSource.Bluesky },\r\n { label: 'GitHub', value: SocialsSource.GitHub },\r\n { label: 'LinkedIn', value: SocialsSource.LinkedIn }\r\n ];\r\n\r\n private svc = inject(NgRhombusSocialsService);\r\n private dialog = inject(MatDialog);\r\n\r\n // called from parent \"Add New\" button or row action\r\n async startCreate() {\r\n const dialogRef = this.dialog.open(NgRhombusSocialEditDialogComponent, {\r\n data: { social: null },\r\n });\r\n\r\n const result = await firstValueFrom(dialogRef.afterClosed());\r\n if (!result) return;\r\n\r\n await this.svc.create({ source: result.source, url: result.url });\r\n }\r\n\r\n async startEdit(row: ISocial) {\r\n const dialogRef = this.dialog.open(NgRhombusSocialEditDialogComponent, {\r\n data: { social: row },\r\n });\r\n\r\n const result = await firstValueFrom(dialogRef.afterClosed());\r\n if (!result) return;\r\n\r\n await this.svc.update(row.id, { source: result.source, url: result.url });\r\n }\r\n\r\n async delete(row: ISocial) {\r\n const dialogRef = this.dialog.open(NgRhombusSocialDeleteDialogComponent, {\r\n data: { social: row },\r\n });\r\n\r\n const confirmed = await firstValueFrom(dialogRef.afterClosed());\r\n if (!confirmed) return;\r\n\r\n await this.svc.remove(row.id);\r\n }\r\n}","<table mat-table [dataSource]=\"socials()\" class=\"mat-elevation-z1\">\r\n\r\n <ng-container matColumnDef=\"source\">\r\n <th mat-header-cell *matHeaderCellDef>Source</th>\r\n <td mat-cell *matCellDef=\"let row\">\r\n <!-- replace text with icon -->\r\n <fa-icon [icon]=\"iconFor(row.source)\" class=\"fa-icon left\"></fa-icon>\r\n </td>\r\n </ng-container>\r\n\r\n <ng-container matColumnDef=\"url\">\r\n <th mat-header-cell *matHeaderCellDef>URL</th>\r\n <td mat-cell *matCellDef=\"let s\">\r\n <a [href]=\"s.url\" target=\"_blank\" rel=\"noopener\">{{ s.url }}</a>\r\n </td>\r\n </ng-container>\r\n\r\n <ng-container matColumnDef=\"actions\">\r\n <th mat-header-cell *matHeaderCellDef></th>\r\n <td mat-cell *matCellDef=\"let s\">\r\n <button mat-icon-button color=\"primary\" (click)=\"startEdit(s)\"><mat-icon>edit</mat-icon></button>\r\n <button mat-icon-button color=\"warn\" (click)=\"delete(s)\"><mat-icon>delete</mat-icon></button>\r\n </td>\r\n </ng-container>\r\n\r\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\r\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\r\n</table>\r\n\r\n\r\n@if (socials() && socials().length === 0) {\r\n<p>No socials found.</p>\r\n}","/*\r\n * Public API Surface of @doug-williamson/ng-rhombus\r\n */\r\n\r\nexport * from './lib/shell/public-api';\r\nexport * from './lib/blog/public-api';\r\nexport * from './lib/home/public-api';\r\nexport * from './lib/socials/public-api';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i2","i3","i1","i2.WrapperService","i4","i5","i6"],"mappings":"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"}
1
+ {"version":3,"file":"doug-williamson-ng-rhombus.mjs","sources":["../../../../projects/ng-rhombus/src/lib/shell/services/wrapper.service.ts","../../../../projects/ng-rhombus/src/lib/shell/tokens/auth-adapter.ts","../../../../projects/ng-rhombus/src/lib/shell/services/authentication.service.ts","../../../../projects/ng-rhombus/src/lib/shell/services/theme.service.ts","../../../../projects/ng-rhombus/src/lib/shell/components/header/header.component.ts","../../../../projects/ng-rhombus/src/lib/shell/components/header/header.component.html","../../../../projects/ng-rhombus/src/lib/shell/components/nav-list/nav-list.component.ts","../../../../projects/ng-rhombus/src/lib/shell/components/nav-list/nav-list.component.html","../../../../projects/ng-rhombus/src/lib/shell/components/wrapper/wrapper.component.ts","../../../../projects/ng-rhombus/src/lib/shell/components/wrapper/wrapper.component.html","../../../../projects/ng-rhombus/src/lib/shell/components/loading-container/loading-container.component.ts","../../../../projects/ng-rhombus/src/lib/shell/components/loading-container/loading-container.component.html","../../../../projects/ng-rhombus/src/lib/shell/components/login/login.component.ts","../../../../projects/ng-rhombus/src/lib/shell/components/login/login.component.html","../../../../projects/ng-rhombus/src/lib/shell/components/spinner/spinner.component.ts","../../../../projects/ng-rhombus/src/lib/shell/components/spinner/spinner.component.html","../../../../projects/ng-rhombus/src/lib/shell/components/page/page.component.ts","../../../../projects/ng-rhombus/src/lib/shell/components/page/page.component.html","../../../../projects/ng-rhombus/src/lib/shell/components/markdown/markdown.component.ts","../../../../projects/ng-rhombus/src/lib/shell/tokens/seo-adapter.ts","../../../../projects/ng-rhombus/src/lib/shell/tokens/site-metadata.ts","../../../../projects/ng-rhombus/src/lib/shell/public-api.ts","../../../../projects/ng-rhombus/src/lib/blog/models/blog.ts","../../../../projects/ng-rhombus/src/lib/blog/components/list/list.component.ts","../../../../projects/ng-rhombus/src/lib/blog/components/list/list.component.html","../../../../projects/ng-rhombus/src/lib/blog/components/latest/latest.component.ts","../../../../projects/ng-rhombus/src/lib/blog/components/latest/latest.component.html","../../../../projects/ng-rhombus/src/lib/blog/helpers/blog-post-helper.ts","../../../../projects/ng-rhombus/src/lib/blog/tokens/blog-adapter.ts","../../../../projects/ng-rhombus/src/lib/blog/services/blog.service.ts","../../../../projects/ng-rhombus/src/lib/blog/components/table/table.component.ts","../../../../projects/ng-rhombus/src/lib/blog/components/table/table.component.html","../../../../projects/ng-rhombus/src/lib/blog/tokens/blog-thumbnail-adapter.ts","../../../../projects/ng-rhombus/src/lib/blog/services/thumbnail.service.ts","../../../../projects/ng-rhombus/src/lib/blog/components/thumbnail/thumbnail.component.ts","../../../../projects/ng-rhombus/src/lib/blog/components/thumbnail/thumbnail.component.html","../../../../projects/ng-rhombus/src/lib/blog/components/dialogs/delete-thumbnail/delete-thumbnail.component.ts","../../../../projects/ng-rhombus/src/lib/blog/components/dialogs/delete-thumbnail/delete-thumbnail.component.html","../../../../projects/ng-rhombus/src/lib/blog/components/thumbnail-control/thumbnail-control.component.ts","../../../../projects/ng-rhombus/src/lib/blog/components/thumbnail-control/thumbnail-control.component.html","../../../../projects/ng-rhombus/src/lib/blog/dialogs/confirmation/confirmation.component.ts","../../../../projects/ng-rhombus/src/lib/blog/dialogs/confirmation/confirmation.component.html","../../../../projects/ng-rhombus/src/lib/blog/components/form/form.component.ts","../../../../projects/ng-rhombus/src/lib/blog/components/form/form.component.html","../../../../projects/ng-rhombus/src/lib/blog/components/post/post.component.ts","../../../../projects/ng-rhombus/src/lib/blog/components/post/post.component.html","../../../../projects/ng-rhombus/src/lib/blog/components/dialogs/delete-post/delete-post.component.ts","../../../../projects/ng-rhombus/src/lib/blog/components/dialogs/delete-post/delete-post.component.html","../../../../projects/ng-rhombus/src/lib/blog/public-api.ts","../../../../projects/ng-rhombus/src/lib/home/models/home.ts","../../../../projects/ng-rhombus/src/lib/home/admin/admin.ts","../../../../projects/ng-rhombus/src/lib/home/admin/admin.html","../../../../projects/ng-rhombus/src/lib/home/tokens/home-adapter.ts","../../../../projects/ng-rhombus/src/lib/home/home.service.ts","../../../../projects/ng-rhombus/src/lib/socials/models/socials.ts","../../../../projects/ng-rhombus/src/lib/socials/list/list.component.ts","../../../../projects/ng-rhombus/src/lib/socials/list/list.component.html","../../../../projects/ng-rhombus/src/lib/socials/tokens/socials-adapter.ts","../../../../projects/ng-rhombus/src/lib/socials/socials.service.ts","../../../../projects/ng-rhombus/src/lib/socials/modals/add-edit/add-edit.component.ts","../../../../projects/ng-rhombus/src/lib/socials/modals/add-edit/add-edit.component.html","../../../../projects/ng-rhombus/src/lib/socials/modals/delete/delete.component.ts","../../../../projects/ng-rhombus/src/lib/socials/modals/delete/delete.component.html","../../../../projects/ng-rhombus/src/lib/socials/table/table.component.ts","../../../../projects/ng-rhombus/src/lib/socials/table/table.component.html","../../../../projects/ng-rhombus/src/public-api.ts","../../../../projects/ng-rhombus/src/doug-williamson-ng-rhombus.ts"],"sourcesContent":["\r\nimport { inject, Injectable } from '@angular/core';\r\nimport { toSignal } from '@angular/core/rxjs-interop';\r\nimport { ActivatedRoute, NavigationEnd, Router } from '@angular/router';\r\nimport { MatSnackBar } from '@angular/material/snack-bar';\r\nimport { BehaviorSubject, filter } from 'rxjs';\r\n\r\nexport interface Breadcrumb {\r\n label: string;\r\n url: string;\r\n}\r\n\r\nexport enum ThemeEnum {\r\n LIGHT = 'light',\r\n DARK = 'dark'\r\n}\r\n\r\nexport type Theme = 'light' | 'dark';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class WrapperService {\r\n\r\n snackbar = inject(MatSnackBar);\r\n\r\n private _darkModeSubject = new BehaviorSubject<boolean>(false);\r\n darkMode = toSignal(this._darkModeSubject.asObservable(), { initialValue: false })\r\n\r\n private _breadcrumbs = new BehaviorSubject<Breadcrumb[]>([]);\r\n breadcrumbs = toSignal(this._breadcrumbs.asObservable(), { initialValue: undefined });\r\n\r\n private _triggerCreateNew = new BehaviorSubject<void>(undefined);\r\n triggerCreateNew = this._triggerCreateNew.asObservable();\r\n // triggerCreateNew = toSignal(this._triggerCreateNew.asObservable());\r\n\r\n constructor(private router: Router, private activatedRoute: ActivatedRoute) {\r\n this.router.events.pipe(filter(event => event instanceof NavigationEnd)).subscribe(event => {\r\n //set breadcrumbs\r\n this._breadcrumbs.next(this.getBreadcrumbs(this.activatedRoute.root));\r\n })\r\n }\r\n\r\n clickedCreateNew() {\r\n this._triggerCreateNew.next(undefined);\r\n }\r\n\r\n private getBreadcrumbs(route: ActivatedRoute, url: string = \"\", breadcrumbs: Breadcrumb[] = []): Breadcrumb[] {\r\n const ROUTE_DATA_BREADCRUMB = 'breadcrumb';\r\n\r\n //get the child routes\r\n let children: ActivatedRoute[] = route.children;\r\n\r\n if (children.length === 0) {\r\n // return breadcrumbs;\r\n }\r\n\r\n //iterate over each children\r\n for (let child of children) {\r\n //verify primary route\r\n // if (child.outlet !== PRIMARY_OUTLET || child.snapshot.url.length==0) {\r\n // continue;\r\n // }\r\n\r\n //verify the custom data property \"breadcrumb\" is specified on the route\r\n // if (!child.snapshot.data.hasOwnProperty(ROUTE_DATA_BREADCRUMB)) {\r\n // return this.getBreadcrumbs(child, url, breadcrumbs);\r\n // }\r\n\r\n //get the route's URL segment\r\n let routeURL: string = child.snapshot.url.map(segment => segment.path).join(\"/\");\r\n\r\n //append route URL to URL\r\n url += `${routeURL}`;\r\n\r\n //add breadcrumb\r\n let breadcrumb: Breadcrumb = {\r\n label: child.snapshot.data[ROUTE_DATA_BREADCRUMB],\r\n url: url\r\n };\r\n breadcrumbs.push(breadcrumb);\r\n\r\n //recursive\r\n return this.getBreadcrumbs(child, url, breadcrumbs);\r\n }\r\n return breadcrumbs;\r\n }\r\n\r\n openSnackbar(message: string) {\r\n this.snackbar.open(message, undefined, { duration: 3000 });\r\n }\r\n}","import { InjectionToken } from '@angular/core';\r\nimport { Observable, of } from 'rxjs';\r\n\r\nexport interface NgRhombusAuthUser {\r\n\tuid: string;\r\n\temail?: string | null;\r\n\tdisplayName?: string | null;\r\n}\r\n\r\nexport interface NgRhombusAuthAdapter {\r\n\tcurrentUser$: Observable<NgRhombusAuthUser | null>;\r\n\tlogin(email: string, password: string): Promise<void>;\r\n\tlogout(): Promise<void>;\r\n}\r\n\r\nexport const NG_RHOMBUS_AUTH_ADAPTER = new InjectionToken<NgRhombusAuthAdapter>(\r\n\t'NG_RHOMBUS_AUTH_ADAPTER',\r\n\t{\r\n\t\tprovidedIn: 'root',\r\n\t\tfactory: () => ({\r\n\t\t\tcurrentUser$: of(null),\r\n\t\t\tlogin: async () => {\r\n\t\t\t\tthrow new Error('NG_RHOMBUS_AUTH_ADAPTER is not provided.');\r\n\t\t\t},\r\n\t\t\tlogout: async () => { }\r\n\t\t})\r\n\t}\r\n);\r\n","import { inject, Injectable } from '@angular/core';\r\nimport { toSignal } from '@angular/core/rxjs-interop';\r\nimport { of } from 'rxjs';\r\nimport { switchMap } from 'rxjs/operators';\r\nimport { NG_RHOMBUS_AUTH_ADAPTER } from '../tokens/auth-adapter';\r\n\r\n@Injectable({\r\n\tprovidedIn: 'root'\r\n})\r\nexport class NgRhombusAuthenticationService {\r\n\tprivate authAdapter = inject(NG_RHOMBUS_AUTH_ADAPTER);\r\n\tcurrentUser$ = this.authAdapter.currentUser$;\r\n\r\n\tlogin(email: string, password: string): Promise<void> {\r\n\t\treturn this.authAdapter.login(email, password);\r\n\t}\r\n\r\n\tlogout(): Promise<void> { return this.authAdapter.logout(); }\r\n\r\n\tprivate currentUserProfile$ = this.currentUser$.pipe(\r\n\t\tswitchMap((user) => of(user?.uid ? user : null))\r\n\t);\r\n\r\n\tcurrentUserProfile = toSignal(this.currentUserProfile$, { initialValue: null });\r\n}","import { isPlatformBrowser } from '@angular/common';\r\nimport { Injectable, PLATFORM_ID, computed, effect, inject, signal } from '@angular/core';\r\n\r\nexport interface AppTheme {\r\n name: string;\r\n icon: string;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ThemeService {\r\n private platformId = inject(PLATFORM_ID);\r\n private appTheme = signal<string>('system');\r\n private readonly PREFERRED_THEME_COOKIE = 'preferred-theme';\r\n\r\n private themes: AppTheme[] = [\r\n { name: 'light', icon: 'light_mode' },\r\n { name: 'dark', icon: 'dark_mode' },\r\n { name: 'system', icon: 'desktop_windows' },\r\n ];\r\n\r\n selectedTheme = computed(() =>\r\n this.themes.find((t) => t.name === this.appTheme())\r\n );\r\n\r\n isDarkMode = computed(() => {\r\n const data = this.appTheme();\r\n if (data === 'system' || data === 'dark') {\r\n return true;\r\n }\r\n\r\n return false;\r\n });\r\n\r\n getThemes() {\r\n return this.themes;\r\n }\r\n\r\n setTheme(theme: string) {\r\n if (isPlatformBrowser(this.platformId)) {\r\n this.appTheme.set(theme);\r\n\r\n const colorScheme = theme === 'system' ? 'light dark' : theme;\r\n document.body.style.setProperty('color-scheme', colorScheme);\r\n\r\n this.setThemeInLocalStorage(theme);\r\n }\r\n }\r\n\r\n setThemeInLocalStorage(theme: string) {\r\n if (isPlatformBrowser(this.platformId)) {\r\n localStorage.setItem(this.PREFERRED_THEME_COOKIE, theme);\r\n }\r\n }\r\n\r\n getThemeFromLocalStorage() {\r\n if (!isPlatformBrowser(this.platformId)) return 'system';\r\n return localStorage.getItem(this.PREFERRED_THEME_COOKIE) ?? 'system';\r\n }\r\n\r\n constructor() {\r\n this.setTheme(this.getThemeFromLocalStorage());\r\n }\r\n}\r\n","import { Component, EventEmitter, inject, input, Input, output, Output } from '@angular/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatMenuModule } from '@angular/material/menu';\r\nimport { MatToolbarModule } from '@angular/material/toolbar';\r\nimport { WrapperService } from '../../services/wrapper.service';\r\nimport { Router, RouterModule } from '@angular/router';\r\nimport { NgRhombusAuthenticationService } from '../../services/authentication.service';\r\nimport { ThemeService } from '../../services/theme.service';\r\nimport { TitleCasePipe } from '@angular/common';\r\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\r\n\r\n@Component({\r\n selector: 'ng-rhombus-header',\r\n imports: [RouterModule, MatButtonModule, MatIconModule, MatMenuModule, MatToolbarModule, TitleCasePipe, MatProgressBarModule],\r\n templateUrl: './header.component.html',\r\n styleUrl: './header.component.scss'\r\n})\r\nexport class NgRhombusHeaderComponent {\r\n isLoading = input<boolean>(false);\r\n\r\n isMobile = input<boolean>(false);\r\n title = input.required<string>();\r\n\r\n wrapperService = inject(WrapperService);\r\n authService = inject(NgRhombusAuthenticationService);\r\n protected themeService = inject(ThemeService);\r\n router = inject(Router);\r\n\r\n logOut = output<void>();\r\n\r\n darkMode = this.wrapperService.darkMode;\r\n user = this.authService.currentUserProfile;\r\n\r\n @Output() menuToggled = new EventEmitter;\r\n\r\n toggleSidebar() {\r\n this.menuToggled.emit();\r\n }\r\n\r\n logout() {\r\n this.logOut.emit();\r\n }\r\n}\r\n","<mat-toolbar class=\"header-theme relative\">\r\n @if (isMobile()) {\r\n <button mat-icon-button (click)=\"toggleSidebar()\" color=\"red\">\r\n <mat-icon>menu</mat-icon>\r\n </button>\r\n }\r\n @if (isMobile()) {\r\n <span class=\"flex-1\"></span>\r\n }\r\n <a mat-button class=\"title\" [routerLink]=\"['/']\">\r\n {{ title() }}\r\n </a>\r\n <span class=\"flex-1\"></span>\r\n <button class=\"mr-2\" mat-icon-button [mat-menu-trigger-for]=\"themeMenu\">\r\n <mat-icon>{{ themeService.selectedTheme()?.icon }}</mat-icon>\r\n </button>\r\n <mat-menu #themeMenu=\"matMenu\">\r\n @for (theme of themeService.getThemes(); track theme.name) {\r\n <button [class.selected-theme]=\"themeService.selectedTheme()?.name === theme.name\" mat-menu-item\r\n (click)=\"themeService.setTheme(theme.name)\">\r\n <mat-icon>{{ theme.icon }}</mat-icon>\r\n <span>{{ theme.name | titlecase }}</span>\r\n </button>\r\n }\r\n </mat-menu>\r\n\r\n @if (user()) {\r\n <button mat-raised-button color=\"primary\" class=\"logout-button\" (click)=\"logout()\">\r\n Logout\r\n </button>\r\n }\r\n</mat-toolbar>\r\n@if (isLoading()) {\r\n<mat-progress-bar class=\"!absolute top-[64px] z-10\" mode=\"indeterminate\" />\r\n}","import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\r\nimport { MatListModule } from '@angular/material/list';\r\nimport { RouterModule } from '@angular/router';\r\nimport { TitleCasePipe } from '@angular/common';\r\nimport { NgRhombusNavItem } from './nav-list';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatTabsModule } from '@angular/material/tabs';\r\n\r\n@Component({\r\n selector: 'ng-rhombus-nav-list',\r\n imports: [RouterModule, MatListModule, MatIconModule, MatTabsModule],\r\n templateUrl: './nav-list.component.html',\r\n styleUrl: './nav-list.component.scss'\r\n})\r\nexport class NgRhombusNavListComponent implements OnInit {\r\n activeLink?: string;\r\n\r\n @Input()\r\n routeCollection: NgRhombusNavItem[] | undefined;\r\n\r\n @Output()\r\n navItemSelected = new EventEmitter<void>();\r\n\r\n ngOnInit() {\r\n\r\n }\r\n\r\n onNavItemClick() {\r\n this.navItemSelected.emit();\r\n }\r\n}\r\n","<mat-nav-list class=\"accent-list\">\r\n @for (link of routeCollection; track link) {\r\n <a mat-list-item [routerLink]=\"link.route\" routerLinkActive=\"selected-menu-item\" (click)=\"onNavItemClick()\">\r\n <span>{{ link.label }}</span>\r\n </a>\r\n }\r\n</mat-nav-list>","import { BreakpointObserver, Breakpoints } from '@angular/cdk/layout';\r\nimport { Component, EventEmitter, Input, OnDestroy, OnInit, Output, output, computed, input } from '@angular/core';\r\nimport { MatSidenavModule } from '@angular/material/sidenav';\r\nimport { Subject, takeUntil } from 'rxjs';\r\nimport { NgRhombusHeaderComponent } from '../header/header.component';\r\nimport { NgRhombusNavListComponent } from '../nav-list/nav-list.component';\r\nimport { RouterModule } from '@angular/router';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatListModule } from '@angular/material/list';\r\nimport { NgRhombusNavItem } from '../nav-list/nav-list';\r\n\r\nimport { WrapperService } from '../../services/wrapper.service';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\r\n\r\n@Component({\r\n selector: 'ng-rhombus-wrapper',\r\n imports: [MatSidenavModule, MatButtonModule, MatIconModule, MatListModule, MatProgressBarModule, RouterModule, NgRhombusHeaderComponent, NgRhombusNavListComponent],\r\n providers: [WrapperService],\r\n templateUrl: './wrapper.component.html',\r\n styleUrl: './wrapper.component.scss'\r\n})\r\nexport class NgRhombusWrapperComponent implements OnInit, OnDestroy {\r\n @Output() clickAddNewEvent = new EventEmitter<void>();\r\n destroyed = new Subject<void>();\r\n isMobile: boolean = false;\r\n currentScreenSize?: string;\r\n\r\n isLoading = input<boolean>(false);\r\n logout = output<void>();\r\n\r\n breadcrumbs = computed(() => { return this.wrapperService.breadcrumbs() });\r\n\r\n fillerContent = Array.from(\r\n { length: 50 },\r\n () =>\r\n `Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut\r\n labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco\r\n laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in\r\n voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat\r\n cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.`,\r\n );\r\n\r\n @Input()\r\n title!: string;\r\n\r\n @Input()\r\n routeCollection!: NgRhombusNavItem[] | undefined;\r\n\r\n constructor(private breakpointObserver: BreakpointObserver, private wrapperService: WrapperService) {\r\n this.breakpointObserver\r\n .observe([Breakpoints.XSmall])\r\n .pipe(takeUntil(this.destroyed))\r\n .subscribe(result => {\r\n this.isMobile = result.matches;\r\n console.log('is mobile: ', this.isMobile);\r\n });\r\n }\r\n\r\n ngOnInit() {\r\n\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.destroyed.next();\r\n this.destroyed.complete();\r\n }\r\n\r\n clickedCreateNew() {\r\n this.clickAddNewEvent.emit();\r\n }\r\n logOut() {\r\n this.logout.emit();\r\n }\r\n}\r\n","<div class=\"h-full flex flex-col\">\r\n <ng-rhombus-header class=\"header-wrapper\" [isMobile]=\"isMobile\" [title]=\"title\" (menuToggled)=\"sidenav.toggle()\"\r\n (logOut)=\"logOut()\" [isLoading]=\"isLoading()\"></ng-rhombus-header>\r\n <mat-sidenav-container class=\"grow\">\r\n <mat-sidenav #sidenav [opened]=\"!isMobile\" [mode]=\"isMobile ? 'over' : 'side'\">\r\n <div class=\"nav-list-wrapper\">\r\n <ng-rhombus-nav-list [routeCollection]=\"routeCollection\"\r\n (navItemSelected)=\"isMobile && sidenav.close()\"></ng-rhombus-nav-list>\r\n </div>\r\n </mat-sidenav>\r\n <mat-sidenav-content class=\"main-sidenav-content\">\r\n <router-outlet #o=\"outlet\"></router-outlet>\r\n </mat-sidenav-content>\r\n </mat-sidenav-container>\r\n</div>","import { Component, input } from '@angular/core';\r\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\r\n\r\n@Component({\r\n selector: 'ng-rhombus-loading-container',\r\n imports: [MatProgressSpinnerModule],\r\n templateUrl: './loading-container.component.html',\r\n styleUrl: './loading-container.component.scss'\r\n})\r\nexport class NgRhombusLoadingContainerComponent {\r\n loading = input<boolean>(false);\r\n size = input<number>(40);\r\n}\r\n","@if (loading()) {\r\n<mat-progress-spinner class=\"loading-spinner\" [diameter]=\"size()\" mode=\"indeterminate\" />\r\n} @else {\r\n<ng-content />\r\n}","import { Component, inject, input, OnInit, output, signal } from '@angular/core';\r\nimport { FormGroup, FormBuilder, Validators, ReactiveFormsModule } from '@angular/forms';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatCardModule } from '@angular/material/card';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { Router } from '@angular/router';\r\nimport { NgRhombusAuthenticationService } from '../../services/authentication.service';\r\nimport { NgRhombusLoadingContainerComponent } from '../loading-container/loading-container.component';\r\nimport { MatIconModule } from '@angular/material/icon';\r\n\r\nexport interface ILoginCredentials {\r\n\temail: string;\r\n\tpassword: string;\r\n}\r\n\r\n@Component({\r\n\tselector: 'ng-rhombus-login',\r\n\timports: [ReactiveFormsModule, MatButtonModule, MatCardModule, MatFormFieldModule, MatIconModule, MatInputModule, NgRhombusLoadingContainerComponent],\r\n\ttemplateUrl: './login.component.html',\r\n\tstyleUrl: './login.component.scss'\r\n})\r\nexport class NgRhombusLoginComponent implements OnInit {\r\n\tpublic loginForm!: FormGroup;\r\n\tauthorizing: boolean = false;\r\n\r\n\ttitle = input<string>('');\r\n\tloading = input<boolean>(false);\r\n\tonSubmit = output<ILoginCredentials>();\r\n\r\n\tpublic hidePassword = signal(true);\r\n\r\n\tauthService = inject(NgRhombusAuthenticationService);\r\n\r\n\tconstructor(private fb: FormBuilder, private router: Router) { }\r\n\r\n\tngOnInit(): void {\r\n\t\tthis.loginForm = this.fb.group({\r\n\t\t\temail: ['', [Validators.required, Validators.email]],\r\n\t\t\tpassword: ['', [Validators.required, Validators.minLength(6)]],\r\n\t\t});\r\n\t}\r\n\r\n\tonSubmitForm() {\r\n\t\tconst rawForm: ILoginCredentials = this.loginForm.getRawValue();\r\n\t\tthis.onSubmit.emit(rawForm);\r\n\t}\r\n}\r\n","<div class=\"flex min-h-screen items-center justify-center bg-background\">\r\n <mat-card class=\"w-full max-w-[400px] p-10\">\r\n <mat-card-header>\r\n <mat-card-title-group>\r\n <mat-card-title>{{ title() }}</mat-card-title>\r\n <mat-card-subtitle>Administration</mat-card-subtitle>\r\n </mat-card-title-group>\r\n\r\n </mat-card-header>\r\n <form class=\"flex flex-col\" novalidate [formGroup]=\"loginForm\" (ngSubmit)=\"onSubmitForm()\">\r\n <mat-card-content>\r\n <mat-form-field class=\"w-full flex\">\r\n <mat-label>Email Address</mat-label>\r\n <input matInput placeholder=\"Placeholder\" formControlName=\"email\" aria-label=\"Email Address\" />\r\n <mat-icon matSuffix>email</mat-icon>\r\n <mat-error align=\"start\">Email Address Required</mat-error>\r\n </mat-form-field>\r\n <mat-form-field class=\"w-full flex\">\r\n <mat-label>Password</mat-label>\r\n <input matInput [type]=\"hidePassword() ? 'password' : 'text'\" placeholder=\"Placeholder\"\r\n formControlName=\"password\" aria-label=\"Password\" />\r\n <button mat-icon-button matSuffix (click)=\"hidePassword.set(!hidePassword())\" type=\"button\"\r\n style=\"margin-right: 0.25rem;\">\r\n <mat-icon>{{ hidePassword() ? 'visibility_off' : 'visibility' }}</mat-icon>\r\n </button>\r\n <mat-error align=\"start\">Password Required</mat-error>\r\n </mat-form-field>\r\n </mat-card-content>\r\n <button mat-flat-button class=\"login-button\" type=\"submit\" [disabled]=\"loading() || loginForm.invalid\">\r\n <ng-rhombus-loading-container [loading]=\"loading()\" [size]=\"20\">\r\n Login\r\n </ng-rhombus-loading-container>\r\n </button>\r\n </form>\r\n </mat-card>\r\n</div>","import { Component } from '@angular/core';\r\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\r\n\r\n@Component({\r\n selector: 'ng-rhombus-spinner',\r\n imports: [MatProgressSpinnerModule],\r\n templateUrl: './spinner.component.html',\r\n styleUrl: './spinner.component.scss',\r\n})\r\nexport class NgRhombusSpinnerComponent {\r\n\r\n}\r\n","<div class=\"spinner-backdrop\">\r\n <mat-spinner></mat-spinner>\r\n</div>","import { Component, input } from '@angular/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { RouterModule } from '@angular/router';\r\n\r\n@Component({\r\n selector: 'ng-rhombus-page',\r\n imports: [MatButtonModule, MatIconModule, RouterModule],\r\n templateUrl: './page.component.html',\r\n styleUrl: './page.component.scss',\r\n})\r\nexport class NgRhombusPageComponent {\r\n title = input<string>(''); // toolbar title\r\n backLink = input<string | null>(null); // optional back link (shows arrow_back when set)\r\n currentYear = new Date().getFullYear();\r\n}\r\n","<div class=\"page flex flex-col h-full\">\r\n <div class=\"page-header\">\r\n @if (backLink()) {\r\n <button matIconButton [routerLink]=\"backLink()\" aria-label=\"Back\" class=\"back-button\">\r\n <mat-icon>arrow_back</mat-icon>\r\n </button>\r\n }\r\n <div class=\"page-header__title mat-title-large\">{{ title() }}</div>\r\n </div>\r\n\r\n <div class=\"content\">\r\n <ng-content></ng-content>\r\n </div>\r\n <div class=\"page-footer mt-6\">\r\n <div class=\"page-footer__text\">&copy; {{ currentYear }} - Powered By Rhombus</div>\r\n </div>\r\n</div>","import { Component, ViewEncapsulation, input } from '@angular/core';\r\nimport { MarkdownComponent } from 'ngx-markdown';\r\nimport { NgClass } from '@angular/common';\r\n\r\n@Component({\r\n\tselector: 'ng-rhombus-markdown',\r\n\timports: [MarkdownComponent, NgClass],\r\n\ttemplate: `\r\n\t\t<markdown\r\n\t\t\tclass=\"ng-rhombus-markdown\"\r\n\t\t\t[ngClass]=\"classes()\"\r\n\t\t\t[data]=\"data()\"\r\n\t\t/>\r\n\t`,\r\n\tstyleUrl: './markdown.component.scss',\r\n\tencapsulation: ViewEncapsulation.None,\r\n})\r\nexport class NgRhombusMarkdownComponent {\r\n\tdata = input<string | null | undefined>(undefined);\r\n\tclasses = input<any>(undefined);\r\n}\r\n","import { InjectionToken } from '@angular/core';\r\n\r\nexport type NgRhombusSeoTag = {\r\n\tname?: string;\r\n\tproperty?: string;\r\n\tcontent: string;\r\n};\r\n\r\nexport interface NgRhombusSeoAdapter {\r\n\tsetTitle(title: string): void;\r\n\tupdateTag(tag: NgRhombusSeoTag): void;\r\n}\r\n\r\nexport const NG_RHOMBUS_SEO_ADAPTER = new InjectionToken<NgRhombusSeoAdapter>(\r\n\t'NG_RHOMBUS_SEO_ADAPTER',\r\n\t{\r\n\t\tprovidedIn: 'root',\r\n\t\tfactory: () => ({\r\n\t\t\tsetTitle: () => {},\r\n\t\t\tupdateTag: () => {},\r\n\t\t}),\r\n\t}\r\n);\r\n","import { InjectionToken } from '@angular/core';\r\n\r\nexport interface NgRhombusSiteMetadata {\r\n\t/** Absolute site origin, e.g. https://example.com */\r\n\torigin?: string;\r\n\t/** Human-friendly site name for link previews */\r\n\tsiteName?: string;\r\n\t/** Twitter/X site handle, usually starts with '@' (optional) */\r\n\ttwitterSite?: string;\r\n}\r\n\r\nexport const NG_RHOMBUS_SITE_METADATA = new InjectionToken<NgRhombusSiteMetadata>(\r\n\t'NG_RHOMBUS_SITE_METADATA',\r\n\t{\r\n\t\tprovidedIn: 'root',\r\n\t\tfactory: () => ({}) satisfies NgRhombusSiteMetadata,\r\n\t}\r\n);\r\n","/*\r\n * Public API Surface of @doug-williamson/ng-rhombus/shell\r\n */\r\n\r\nexport * from './components/wrapper/wrapper.component';\r\nexport * from './services/wrapper.service';\r\nexport * from './components/login/login.component';\r\nexport * from './components/nav-list/nav-list';\r\nexport * from './components/spinner/spinner.component';\r\nexport * from './components/page/page.component';\r\nexport * from './components/markdown/markdown.component';\r\n\r\nexport * from './tokens/auth-adapter';\r\nexport * from './tokens/seo-adapter';\r\nexport * from './tokens/site-metadata';","export type NgRhombusTimestampLike =\r\n | Date\r\n | number\r\n | string\r\n | { toMillis: () => number }\r\n | { seconds: number; nanoseconds?: number };\r\n\r\nexport function ngRhombusTimestampToMillis(\r\n value: NgRhombusTimestampLike | null | undefined\r\n): number | null {\r\n if (value == null) return null;\r\n\r\n if (typeof value === 'number') return value;\r\n if (value instanceof Date) return value.getTime();\r\n\r\n if (typeof value === 'string') {\r\n const asNumber = Number(value);\r\n if (Number.isFinite(asNumber)) return asNumber;\r\n\r\n const asDate = new Date(value);\r\n return Number.isFinite(asDate.getTime()) ? asDate.getTime() : null;\r\n }\r\n\r\n const maybeToMillis = value as { toMillis?: unknown };\r\n if (typeof maybeToMillis.toMillis === 'function') {\r\n return (maybeToMillis.toMillis as () => number)();\r\n }\r\n\r\n const maybeSeconds = value as { seconds?: unknown };\r\n if (typeof maybeSeconds.seconds === 'number') {\r\n return maybeSeconds.seconds * 1000;\r\n }\r\n\r\n return null;\r\n}\r\n\r\nexport enum ContentPillar {\r\n DeveloperLife = 'Developer Life',\r\n AngularWebEngineering = 'Angular & Web Engineering',\r\n GamingAsAnAdult = 'Gaming as an Adult',\r\n FatherhoodFamily = 'Fatherhood & Family',\r\n CareerBalanceIdentity = 'Career, Balance & Identity',\r\n}\r\n\r\nexport enum BlogSeries {\r\n ThisWeekILearned = 'This Week I Learned',\r\n DevDiary = 'Dev Diary',\r\n AdultGamerNotes = 'Adult Gamer Notes',\r\n LessonsFromFatherhood = 'Lessons from Fatherhood',\r\n TradeoffsTruths = 'Tradeoffs & Truths',\r\n\tFromTheEditor = 'From The Editor',\r\n}\r\n\r\nexport class IBlog {\r\n id!: string;\r\n title!: string;\r\n description!: string;\r\n thumbnail!: string;\r\n content!: string;\r\n\r\n /**\r\n * Published timestamp used for ordering.\r\n * Kept flexible so apps can provide Firestore Timestamp, Date, millis, etc.\r\n */\r\n timestamp!: NgRhombusTimestampLike;\r\n\r\n /** Estimated read time in minutes at 200 wpm */\r\n readTimeMinutes!: number;\r\n\r\n /**\r\n * Creator system fields.\r\n * Keep optional for backward compatibility; enforce required in admin UI + writes.\r\n */\r\n pillar?: ContentPillar | null;\r\n series?: BlogSeries | null;\r\n tags?: string[] | null; // enforce 3–6 unique tags on submit\r\n}","import { Component, EventEmitter, inject, input, OnInit, Output } from '@angular/core';\r\nimport { MatListModule } from '@angular/material/list';\r\nimport { MatChipsModule } from '@angular/material/chips';\r\nimport { MatDividerModule } from '@angular/material/divider';\r\nimport { IBlog, ngRhombusTimestampToMillis } from '../../models/blog';\r\nimport { DatePipe, DOCUMENT } from '@angular/common';\r\nimport { NG_RHOMBUS_SEO_ADAPTER } from '../../../shell/tokens/seo-adapter';\r\nimport { NG_RHOMBUS_SITE_METADATA } from '../../../shell/tokens/site-metadata';\r\n\r\n@Component({\r\n selector: 'ng-rhombus-blog-list',\r\n imports: [DatePipe, MatListModule, MatDividerModule, MatChipsModule],\r\n templateUrl: './list.component.html',\r\n styleUrl: './list.component.scss'\r\n})\r\nexport class NgRhombusBlogListComponent implements OnInit {\r\n @Output() goToRoute = new EventEmitter<string>();\r\n #seo = inject(NG_RHOMBUS_SEO_ADAPTER);\r\n #document = inject(DOCUMENT);\r\n #site = inject(NG_RHOMBUS_SITE_METADATA);\r\n dataSource = input<IBlog[]>([]);\r\n\r\n timestampToMillis = ngRhombusTimestampToMillis;\r\n\r\n ngOnInit() {\r\n const origin = this.#site.origin ?? this.#document.location?.origin;\r\n const path = this.#document.location?.pathname ?? '/latest';\r\n const pageUrl = origin ? new URL(path, origin).toString() : path;\r\n const imagePath = '/favicon.ico';\r\n const imageUrl = origin ? new URL(imagePath, origin).toString() : imagePath;\r\n const siteName = this.#site.siteName ?? 'Rhombus Software';\r\n\r\n // Document title\r\n this.#seo.setTitle('Blog - Doug Williamson');\r\n\r\n // Basic meta\r\n this.#seo.updateTag({ name: 'description', content: 'This is my personal collection of blog posts.' });\r\n\r\n // Open Graph\r\n this.#seo.updateTag({ property: 'og:type', content: 'website' });\r\n this.#seo.updateTag({ property: 'og:site_name', content: siteName });\r\n this.#seo.updateTag({ property: 'og:title', content: 'Blog - Doug Williamson' });\r\n this.#seo.updateTag({ property: 'og:description', content: 'This is my personal collection of blog posts.' });\r\n this.#seo.updateTag({ property: 'og:url', content: pageUrl });\r\n this.#seo.updateTag({ property: 'og:image', content: imageUrl });\r\n // Twitter Card\r\n this.#seo.updateTag({ name: 'twitter:card', content: 'summary' });\r\n if (this.#site.twitterSite) this.#seo.updateTag({ name: 'twitter:site', content: this.#site.twitterSite });\r\n this.#seo.updateTag({ name: 'twitter:title', content: 'Blog - Doug Williamson' });\r\n this.#seo.updateTag({ name: 'twitter:description', content: 'This is my personal collection of blog posts.' });\r\n this.#seo.updateTag({ name: 'twitter:url', content: pageUrl });\r\n this.#seo.updateTag({ name: 'twitter:image', content: imageUrl });\r\n }\r\n\r\n goToBlogPost(id: string) {\r\n this.goToRoute.emit(id);\r\n }\r\n}\r\n","@if ((dataSource()).length === 0) {\r\n<p class=\"m-6 justify-self-center\">No blog posts found.</p>\r\n} @else {\r\n<mat-nav-list>\r\n\t@for (blogPost of dataSource(); track blogPost.id; let last = $last) {\r\n\t<mat-list-item (click)=\"goToRoute.emit(blogPost.id)\" lines=\"2\">\r\n\t\t<h3 matListItemTitle>{{ blogPost.title }}</h3>\r\n\t\t<p matListItemMeta>{{ timestampToMillis(blogPost.timestamp) | date: 'MMMM d, y' }}</p>\r\n\r\n\t\t@if (blogPost.pillar || blogPost.series || (blogPost.tags?.length ?? 0) > 0) {\r\n\t\t<div matListItemLine class=\"taxonomy\">\r\n\t\t\t<mat-chip-set aria-label=\"Post taxonomy\">\r\n\t\t\t\t@if (blogPost.pillar) {\r\n\t\t\t\t<mat-chip [highlighted]=\"true\" class=\"primary-chips-theme\">Pillar: {{ blogPost.pillar }}</mat-chip>\r\n\t\t\t\t}\r\n\t\t\t\t@if (blogPost.series) {\r\n\t\t\t\t<mat-chip [highlighted]=\"true\" class=\"secondary-chips-theme\">Series: {{ blogPost.series }}</mat-chip>\r\n\t\t\t\t}\r\n\t\t\t\t<!-- @for (t of blogPost.tags ?? []; track t) {\r\n\t\t\t\t<mat-chip [highlighted]=\"true\" class=\"neutral-chips-theme\">#{{ t }}</mat-chip>\r\n\t\t\t\t} -->\r\n\t\t\t</mat-chip-set>\r\n\t\t</div>\r\n\t\t}\r\n\t</mat-list-item>\r\n\t@if (!last) {\r\n\t<mat-divider></mat-divider>\r\n\t}\r\n\t}\r\n</mat-nav-list>\r\n}","import { Component, input } from '@angular/core';\r\nimport { MatListModule } from '@angular/material/list';\r\nimport { RouterLink } from '@angular/router';\r\nimport { IBlog, ngRhombusTimestampToMillis } from '../../models/blog';\r\nimport { DatePipe } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'ng-rhombus-blog-post-latest',\r\n imports: [DatePipe, MatListModule, RouterLink],\r\n templateUrl: './latest.component.html',\r\n styleUrl: './latest.component.scss'\r\n})\r\nexport class NgRhombusBlogPostLatestComponent {\r\n blogPost = input<IBlog>();\r\n\r\n timestampToMillis = ngRhombusTimestampToMillis;\r\n}\r\n","<mat-nav-list>\r\n <mat-list-item [routerLink]=\"['/blog', blogPost()?.id]\">\r\n <span matListItemTitle>{{ blogPost()?.title }}</span>\r\n <span matListItemLine>{{ blogPost()?.description }}</span>\r\n <span matListItemLine>{{ timestampToMillis(blogPost()?.timestamp) | date: 'MMMM d, y' }}</span>\r\n </mat-list-item>\r\n</mat-nav-list>","export class NgRhombusBlogPostHelper {\r\n static createSlug(title: string): string {\r\n const slug = title\r\n .toLowerCase()\r\n .normalize('NFD') // split accents\r\n .replace(/[\\u0300-\\u036f]/g, '') // strip diacritics\r\n .replace(/[^a-z\\s-]/g, '') // keep only letters, spaces, dashes\r\n .replace(/\\s+/g, '-') // spaces → dashes\r\n .replace(/-+/g, '-') // collapse dashes\r\n .replace(/^-|-$/g, '');\r\n const randomThreeDigitNumber = Math.floor(Math.random() * 1000);\r\n return `${slug}-${randomThreeDigitNumber}`;\r\n }\r\n}","import { InjectionToken } from '@angular/core';\r\nimport { BlogSeries, IBlog } from '../models/blog';\r\n\r\nexport interface NgRhombusBlogAdapter {\r\n\tfetchBlogPosts(): Promise<IBlog[]>;\r\n\tfetchBlogPost(id: string): Promise<IBlog | undefined>;\r\n\tfetchLatestBlogPost(): Promise<IBlog | undefined>;\r\n\tfetchLatestBlogPosts(count: number): Promise<IBlog[]>;\r\n\tfetchLatestBlogPostsBySeries(series: BlogSeries, count: number): Promise<IBlog[]>;\r\n\tfetchAdjacentBlogPostsInSeries(\r\n\t\tid: string\r\n\t): Promise<{ series?: BlogSeries | null; nextNewer?: IBlog; nextOlder?: IBlog }>;\r\n\tfetchAdjacentBlogPosts(id: string): Promise<{ nextNewer?: IBlog; nextOlder?: IBlog }>;\r\n\r\n\tcreateBlogPost(blogPost: IBlog): Promise<void>;\r\n\tupdateBlogPost(blogPost: IBlog): Promise<void>;\r\n\tdeleteBlogPost(id: string): Promise<void>;\r\n}\r\n\r\nexport const NG_RHOMBUS_BLOG_ADAPTER = new InjectionToken<NgRhombusBlogAdapter>(\r\n\t'NG_RHOMBUS_BLOG_ADAPTER',\r\n\t{\r\n\t\tprovidedIn: 'root',\r\n\t\tfactory: () => ({\r\n\t\t\tfetchBlogPosts: async () => {\r\n\t\t\t\tthrow new Error('NG_RHOMBUS_BLOG_ADAPTER is not provided.');\r\n\t\t\t},\r\n\t\t\tfetchBlogPost: async () => {\r\n\t\t\t\tthrow new Error('NG_RHOMBUS_BLOG_ADAPTER is not provided.');\r\n\t\t\t},\r\n\t\t\tfetchLatestBlogPost: async () => {\r\n\t\t\t\tthrow new Error('NG_RHOMBUS_BLOG_ADAPTER is not provided.');\r\n\t\t\t},\r\n\t\t\tfetchLatestBlogPosts: async () => {\r\n\t\t\t\tthrow new Error('NG_RHOMBUS_BLOG_ADAPTER is not provided.');\r\n\t\t\t},\r\n\t\t\tfetchLatestBlogPostsBySeries: async () => {\r\n\t\t\t\tthrow new Error('NG_RHOMBUS_BLOG_ADAPTER is not provided.');\r\n\t\t\t},\r\n\t\t\tfetchAdjacentBlogPostsInSeries: async () => {\r\n\t\t\t\tthrow new Error('NG_RHOMBUS_BLOG_ADAPTER is not provided.');\r\n\t\t\t},\r\n\t\t\tfetchAdjacentBlogPosts: async () => {\r\n\t\t\t\tthrow new Error('NG_RHOMBUS_BLOG_ADAPTER is not provided.');\r\n\t\t\t},\r\n\t\t\tcreateBlogPost: async () => {\r\n\t\t\t\tthrow new Error('NG_RHOMBUS_BLOG_ADAPTER is not provided.');\r\n\t\t\t},\r\n\t\t\tupdateBlogPost: async () => {\r\n\t\t\t\tthrow new Error('NG_RHOMBUS_BLOG_ADAPTER is not provided.');\r\n\t\t\t},\r\n\t\t\tdeleteBlogPost: async () => {\r\n\t\t\t\tthrow new Error('NG_RHOMBUS_BLOG_ADAPTER is not provided.');\r\n\t\t\t},\r\n\t\t}),\r\n\t}\r\n);\r\n","import { Injectable, inject, signal } from '@angular/core';\r\nimport { IBlog, BlogSeries, ngRhombusTimestampToMillis } from '../models/blog';\r\nimport { NgRhombusBlogPostHelper } from '../helpers/blog-post-helper';\r\nimport { NG_RHOMBUS_BLOG_ADAPTER } from '../tokens/blog-adapter';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class NgRhombusBlogService {\r\n private readonly WORDS_PER_MINUTE = 200;\r\n private readonly blogAdapter = inject(NG_RHOMBUS_BLOG_ADAPTER);\r\n\r\n private normalizeBlogPost(post: IBlog): IBlog {\r\n const timestampMillis = ngRhombusTimestampToMillis(post.timestamp as any);\r\n return {\r\n ...post,\r\n timestamp: timestampMillis ?? post.timestamp,\r\n };\r\n }\r\n\r\n blogPosts = signal<IBlog[]>([]);\r\n selectedBlogPost = signal<IBlog | undefined>(undefined);\r\n\r\n async fetchBlogPosts() {\r\n const posts = (await this.blogAdapter.fetchBlogPosts()).map(p => this.normalizeBlogPost(p));\r\n this.blogPosts.set(posts);\r\n return posts;\r\n }\r\n\r\n async fetchBlogPost(id: string) {\r\n const post = await this.blogAdapter.fetchBlogPost(id);\r\n if (!post) return undefined;\r\n\r\n const normalized = this.normalizeBlogPost(post);\r\n this.selectedBlogPost.set(normalized);\r\n return normalized;\r\n }\r\n\r\n async fetchLatestBlogPost() {\r\n const post = await this.blogAdapter.fetchLatestBlogPost();\r\n if (!post) return undefined;\r\n\r\n const normalized = this.normalizeBlogPost(post);\r\n this.selectedBlogPost.set(normalized);\r\n return normalized;\r\n }\r\n\r\n async createBlogPost(blogPost: IBlog) {\r\n const id = NgRhombusBlogPostHelper.createSlug(blogPost.title);\r\n await this.blogAdapter.createBlogPost({\r\n ...blogPost,\r\n id,\r\n timestamp: new Date(),\r\n });\r\n }\r\n\r\n async updateBlogPost(blogPost: IBlog) {\r\n await this.blogAdapter.updateBlogPost(blogPost);\r\n }\r\n\r\n deleteBlogPost(id: string) {\r\n return this.blogAdapter.deleteBlogPost(id);\r\n }\r\n\r\n /** Latest N posts */\r\n async fetchLatestBlogPosts(count: number = 5): Promise<IBlog[]> {\r\n const posts = await this.blogAdapter.fetchLatestBlogPosts(count);\r\n return posts.map(p => this.normalizeBlogPost(p));\r\n }\r\n\r\n /** Latest N posts for a given series */\r\n async fetchLatestBlogPostsBySeries(series: BlogSeries, count: number = 5): Promise<IBlog[]> {\r\n const posts = await this.blogAdapter.fetchLatestBlogPostsBySeries(series, count);\r\n return posts.map(p => this.normalizeBlogPost(p));\r\n }\r\n\r\n /**\r\n * Adjacent posts within the same series as the current post.\r\n * - nextNewer: newer than current within the series (if any)\r\n * - nextOlder: older than current within the series (if any)\r\n */\r\n async fetchAdjacentBlogPostsInSeries(id: string): Promise<{ series?: BlogSeries | null; nextNewer?: IBlog; nextOlder?: IBlog }> {\r\n const result = await this.blogAdapter.fetchAdjacentBlogPostsInSeries(id);\r\n return {\r\n series: result.series,\r\n nextNewer: result.nextNewer ? this.normalizeBlogPost(result.nextNewer) : undefined,\r\n nextOlder: result.nextOlder ? this.normalizeBlogPost(result.nextOlder) : undefined,\r\n };\r\n }\r\n\r\n /**\r\n * Adjacent posts in the global \"latest first\" ordering.\r\n * - nextNewer: newer than current (if any)\r\n * - nextOlder: older than current (if any)\r\n */\r\n async fetchAdjacentBlogPosts(id: string): Promise<{ nextNewer?: IBlog; nextOlder?: IBlog }> {\r\n const result = await this.blogAdapter.fetchAdjacentBlogPosts(id);\r\n return {\r\n nextNewer: result.nextNewer ? this.normalizeBlogPost(result.nextNewer) : undefined,\r\n nextOlder: result.nextOlder ? this.normalizeBlogPost(result.nextOlder) : undefined,\r\n };\r\n }\r\n\r\n calculateReadTimeMinutes(text: string | null | undefined): number {\r\n if (!text) return 1;\r\n const words = text.trim().split(/\\s+/).length;\r\n return Math.max(1, Math.ceil(words / this.WORDS_PER_MINUTE));\r\n }\r\n}","import { Component, EventEmitter, inject, input, Output } from '@angular/core';\r\nimport { MatTableModule } from '@angular/material/table';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatChipsModule } from '@angular/material/chips';\r\nimport { IBlog, ngRhombusTimestampToMillis } from '../../models/blog';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { NgRhombusBlogService } from '../../services/blog.service';\r\n\r\ntype BlogTableRow =\r\n | { kind: 'main'; post: IBlog }\r\n | { kind: 'detail'; post: IBlog };\r\n\r\n@Component({\r\n selector: 'ng-rhombus-blog-table',\r\n imports: [CommonModule, MatButtonModule, MatIconModule, MatTableModule, MatChipsModule],\r\n templateUrl: './table.component.html',\r\n styleUrl: './table.component.scss'\r\n})\r\nexport class NgRhombusBlogTableComponent {\r\n @Output() editEvent = new EventEmitter<string>();\r\n @Output() deleteEvent = new EventEmitter<IBlog>();\r\n\r\n readonly blogService = inject(NgRhombusBlogService);\r\n readonly dialog = inject(MatDialog);\r\n\r\n dataSource = input<IBlog[]>([]);\r\n\r\n timestampToMillis = ngRhombusTimestampToMillis;\r\n\r\n displayedColumns: string[] = ['title', 'pillar', 'series', 'timestamp'];\r\n detailColumns: string[] = ['detail'];\r\n\r\n tableData(): BlogTableRow[] {\r\n const posts = this.dataSource();\r\n if (!posts?.length) return [];\r\n\r\n return posts.flatMap(post => [\r\n { kind: 'main', post },\r\n { kind: 'detail', post },\r\n ]);\r\n }\r\n\r\n isMainRow = (_index: number, row: BlogTableRow) => row.kind === 'main';\r\n isDetailRow = (_index: number, row: BlogTableRow) => row.kind === 'detail';\r\n\r\n goToBlogPost(id: string) {\r\n this.editEvent.emit(id);\r\n }\r\n\r\n onDeleteBlogPost(blogPost: IBlog) {\r\n this.deleteEvent.emit(blogPost);\r\n }\r\n\r\n}\r\n","@if (dataSource().length > 0) {\r\n<table mat-table [dataSource]=\"tableData()\" class=\"mat-elevation-z1\" multiTemplateDataRows>\r\n\r\n\t<!-- Title Column -->\r\n\t<ng-container matColumnDef=\"title\">\r\n\t\t<th mat-header-cell *matHeaderCellDef>Title</th>\r\n\t\t<td mat-cell *matCellDef=\"let row\">{{ row.post.title }}</td>\r\n\t</ng-container>\r\n\r\n\t<!-- Pillar Column -->\r\n\t<ng-container matColumnDef=\"pillar\">\r\n\t\t<th mat-header-cell *matHeaderCellDef>Pillar</th>\r\n\t\t<td mat-cell *matCellDef=\"let row\">\r\n\t\t\t@if (row.post.pillar) {\r\n\t\t\t<mat-chip-set aria-label=\"Pillar\" role=\"list\">\r\n\t\t\t\t<mat-chip role=\"listitem\" [highlighted]=\"true\" class=\"primary-chips-theme\">{{ row.post.pillar\r\n\t\t\t\t\t}}</mat-chip>\r\n\t\t\t</mat-chip-set>\r\n\t\t\t} @else {\r\n\t\t\t—\r\n\t\t\t}\r\n\t\t</td>\r\n\t</ng-container>\r\n\r\n\t<!-- Series Column -->\r\n\t<ng-container matColumnDef=\"series\">\r\n\t\t<th mat-header-cell *matHeaderCellDef>Series</th>\r\n\t\t<td mat-cell *matCellDef=\"let row\">\r\n\t\t\t@if (row.post.series) {\r\n\t\t\t<mat-chip-set aria-label=\"Series\" role=\"list\">\r\n\t\t\t\t<mat-chip role=\"listitem\" [highlighted]=\"true\" class=\"secondary-chips-theme\">{{ row.post.series\r\n\t\t\t\t\t}}</mat-chip>\r\n\t\t\t</mat-chip-set>\r\n\t\t\t} @else {\r\n\t\t\t—\r\n\t\t\t}\r\n\t\t</td>\r\n\t</ng-container>\r\n\r\n\t<!-- Timestamp Column -->\r\n\t<ng-container matColumnDef=\"timestamp\">\r\n\t\t<th mat-header-cell *matHeaderCellDef>Date</th>\r\n\t\t<td mat-cell *matCellDef=\"let row\">{{ timestampToMillis(row.post.timestamp) | date: 'MMMM d, y' }}</td>\r\n\t</ng-container>\r\n\r\n\t<!-- Detail Row (full width) -->\r\n\t<ng-container matColumnDef=\"detail\">\r\n\t\t<td mat-cell *matCellDef=\"let row\" [attr.colspan]=\"displayedColumns.length\">\r\n\t\t\t<div class=\"detail-content\">\r\n\t\t\t\t@if (row.post.description) {\r\n\t\t\t\t<div class=\"detail-description\">{{ row.post.description }}</div>\r\n\t\t\t\t}\r\n\r\n\t\t\t\t<div class=\"detail-actions\">\r\n\t\t\t\t\t<button mat-icon-button (click)=\"goToBlogPost(row.post.id)\" aria-label=\"Edit blog post\">\r\n\t\t\t\t\t\t<mat-icon>edit</mat-icon>\r\n\t\t\t\t\t</button>\r\n\t\t\t\t\t<button mat-icon-button (click)=\"onDeleteBlogPost(row.post)\" aria-label=\"Delete blog post\">\r\n\t\t\t\t\t\t<mat-icon>delete</mat-icon>\r\n\t\t\t\t\t</button>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t</td>\r\n\t</ng-container>\r\n\r\n\t<tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\r\n\t<tr mat-row *matRowDef=\"let row; columns: displayedColumns; when: isMainRow\"></tr>\r\n\t<tr mat-row *matRowDef=\"let row; columns: detailColumns; when: isDetailRow\" class=\"detail-row\"></tr>\r\n</table>\r\n} @else {\r\n<div class=\"empty-set\">\r\n\t<span>No blog posts created yet.</span>\r\n</div>\r\n\r\n}","import { InjectionToken } from '@angular/core';\r\n\r\nexport interface NgRhombusBlogThumbnailAdapter {\r\n\tuploadImageAndGetUrl(imageName: string, image: File): Promise<string>;\r\n\tdeleteImage(filePath?: string): Promise<void>;\r\n}\r\n\r\nexport const NG_RHOMBUS_BLOG_THUMBNAIL_ADAPTER = new InjectionToken<NgRhombusBlogThumbnailAdapter>(\r\n\t'NG_RHOMBUS_BLOG_THUMBNAIL_ADAPTER',\r\n\t{\r\n\t\tprovidedIn: 'root',\r\n\t\tfactory: () => ({\r\n\t\t\tuploadImageAndGetUrl: async () => {\r\n\t\t\t\tthrow new Error('NG_RHOMBUS_BLOG_THUMBNAIL_ADAPTER is not provided.');\r\n\t\t\t},\r\n\t\t\tdeleteImage: async () => {\r\n\t\t\t\tthrow new Error('NG_RHOMBUS_BLOG_THUMBNAIL_ADAPTER is not provided.');\r\n\t\t\t},\r\n\t\t}),\r\n\t}\r\n);\r\n","import { inject, Injectable } from \"@angular/core\";\r\nimport { NG_RHOMBUS_BLOG_THUMBNAIL_ADAPTER } from \"../tokens/blog-thumbnail-adapter\";\r\n\r\n@Injectable({\r\n\tprovidedIn: 'root'\r\n})\r\nexport class NgRhombusBlogPostThumbnailService {\r\n\tprivate readonly adapter = inject(NG_RHOMBUS_BLOG_THUMBNAIL_ADAPTER);\r\n\r\n\tuploadImage(imageName: string, image: File): Promise<string> {\r\n\t\treturn this.adapter.uploadImageAndGetUrl(imageName, image);\r\n\t}\r\n\r\n\tdeleteImage(filePath?: string): Promise<void> {\r\n\t\treturn this.adapter.deleteImage(filePath);\r\n\t}\r\n}","import { Component, computed, input, OnInit } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'ng-rhombus-blog-thumbnail',\r\n imports: [],\r\n templateUrl: './thumbnail.component.html',\r\n styleUrl: './thumbnail.component.scss'\r\n})\r\nexport class NgRhombusBlogThumbnailComponent implements OnInit {\r\n width = input<number>(0);\r\n height = input<number>(0);\r\n imageSource = input<string>();\r\n\r\n placeholder = computed(() => `https://placehold.co/${this.width()}x${this.height()}`);\r\n contentSource = computed(() => { return this.imageSource() !== '' ? this.imageSource() : this.placeholder(); })\r\n\r\n ngOnInit(): void {\r\n if (this.width() === 0 && this.height() === 0) {\r\n\r\n }\r\n }\r\n}\r\n","<div class=\"image-placeholder\" [style.width]=\"width() + 'px'\" [style.height]=\"height() + 'px'\">\r\n <img [src]=\"contentSource()\" [width]=\"width()\" [height]=\"height()\" />\r\n</div>","import { Component } from '@angular/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatDialogModule } from '@angular/material/dialog';\r\n\r\n@Component({\r\n selector: 'ng-rhombus-Blog-delete-thumbnail',\r\n imports: [MatButtonModule, MatDialogModule],\r\n templateUrl: './delete-thumbnail.component.html',\r\n styleUrl: './delete-thumbnail.component.scss'\r\n})\r\nexport class NgRhombusBlogDeleteThumbnailComponent {\r\n\r\n}\r\n","<h2 mat-dialog-title>Blog Post Thumbnail - Delete</h2>\r\n<mat-dialog-content>\r\n <p>Would you like to delete this thumbnail?</p>\r\n</mat-dialog-content>\r\n<mat-dialog-actions>\r\n <button mat-button [mat-dialog-close]=\"false\" cdkFocusInitial>Cancel</button>\r\n <button mat-button [mat-dialog-close]=\"true\">Confirm</button>\r\n</mat-dialog-actions>","\r\nimport { Component, computed, ElementRef, inject, input, output, signal, ViewChild } from '@angular/core';\r\nimport { MatButton, MatButtonModule } from '@angular/material/button';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { NgRhombusBlogPostThumbnailService } from '../../services/thumbnail.service';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { NgRhombusBlogThumbnailComponent } from \"../thumbnail/thumbnail.component\";\r\nimport { NgRhombusBlogDeleteThumbnailComponent } from '../dialogs/delete-thumbnail/delete-thumbnail.component';\r\n\r\n@Component({\r\n selector: 'ng-rhombus-thumbnail-control',\r\n imports: [MatButtonModule, MatIconModule, NgRhombusBlogThumbnailComponent],\r\n templateUrl: './thumbnail-control.component.html',\r\n styleUrl: './thumbnail-control.component.scss'\r\n})\r\nexport class ThumbnailControlComponent {\r\n width = input<number>(0);\r\n height = input<number>(0);\r\n thumbnailSrc = input<string>('');\r\n disabled = input<boolean>(false);\r\n displayMode = input<'preview' | 'indicator'>('preview');\r\n\r\n @ViewChild('thumbnailInput') thumbnailInput!: ElementRef;\r\n\r\n thumbnailService = inject(NgRhombusBlogPostThumbnailService);\r\n dialog = inject(MatDialog);\r\n\r\n onFileUploaded = output<string>();\r\n onFileDeleted = output<void>();\r\n\r\n uploadedFile = signal<string | undefined>(undefined);\r\n placeholder = computed(() => `https://placehold.co/${this.width()}x${this.height()}`);\r\n hasThumbnail = computed(() => {\r\n const fromUpload = this.uploadedFile();\r\n if (fromUpload) return true;\r\n\r\n const fromInput = this.thumbnailSrc();\r\n return !!fromInput;\r\n });\r\n\r\n imageSource = computed(() => {\r\n const fromUpload = this.uploadedFile();\r\n if (fromUpload) return fromUpload;\r\n\r\n const fromInput = this.thumbnailSrc();\r\n if (fromInput) return fromInput;\r\n\r\n return this.placeholder();\r\n });\r\n\r\n onThumbnailSelected(input: HTMLInputElement) {\r\n if (!input.files || input.files.length <= 0) {\r\n return;\r\n }\r\n const file: File = input.files[0];\r\n\r\n this.thumbnailService.uploadImage(file.name, file).then((downloadUrl) => {\r\n this.uploadedFile.set(downloadUrl);\r\n this.onFileUploaded.emit(downloadUrl);\r\n });\r\n }\r\n\r\n onThumbnailDeleted() {\r\n const dialogRef = this.dialog.open(NgRhombusBlogDeleteThumbnailComponent);\r\n\r\n dialogRef.afterClosed().subscribe(result => {\r\n if (result) {\r\n this.thumbnailService.deleteImage(this.uploadedFile()).then(() => {\r\n this.uploadedFile.set(undefined);\r\n this.thumbnailInput.nativeElement.value = '';\r\n this.onFileDeleted.emit();\r\n });\r\n }\r\n });\r\n }\r\n}\r\n","<div class=\"thumbnail-control-wrapper\">\r\n <input #thumbnailInput hidden type=\"file\" (change)=\"onThumbnailSelected(thumbnailInput)\" />\r\n <button mat-icon-button [disabled]=\"uploadedFile() || disabled()\" (click)=\"thumbnailInput.click()\" type=\"button\">\r\n <mat-icon>upload_file</mat-icon>\r\n </button>\r\n <button class=\"delete-button\" mat-icon-button [disabled]=\"!uploadedFile()\" (click)=\"onThumbnailDeleted()\"\r\n type=\"button\">\r\n <mat-icon>delete</mat-icon>\r\n </button>\r\n <div class=\"flex\"></div>\r\n\r\n @if (displayMode() === 'preview') {\r\n <ng-rhombus-blog-thumbnail [imageSource]=\"imageSource()\" [width]=\"width()\" [height]=\"height()\" />\r\n } @else {\r\n <div class=\"thumbnail-indicator\" [class.is-set]=\"hasThumbnail()\" aria-label=\"Thumbnail status\">\r\n <mat-icon>{{ hasThumbnail() ? 'check_circle' : 'radio_button_unchecked' }}</mat-icon>\r\n <span class=\"thumbnail-indicator-text\">Thumbnail</span>\r\n </div>\r\n }\r\n</div>","import { Component, inject } from '@angular/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MAT_DIALOG_DATA, MatDialogModule } from '@angular/material/dialog';\r\n\r\n@Component({\r\n selector: 'ng-rhombus-blog-confirmation',\r\n imports: [MatButtonModule, MatDialogModule],\r\n templateUrl: './confirmation.component.html',\r\n styleUrl: './confirmation.component.scss'\r\n})\r\nexport class NgRhombusBlogConfirmationComponent {\r\n\r\n data = inject(MAT_DIALOG_DATA);\r\n}\r\n","<h2 mat-dialog-title>{{ data.header }}</h2>\r\n<mat-dialog-content>\r\n <p>{{ data.query }}</p>\r\n</mat-dialog-content>\r\n<mat-dialog-actions>\r\n <button mat-button [mat-dialog-close]=\"false\" cdkFocusInitial>Cancel</button>\r\n <button mat-button [mat-dialog-close]=\"true\">Confirm</button>\r\n</mat-dialog-actions>","import { Component, effect, ElementRef, inject, input, output, signal, ViewChild } from '@angular/core';\r\nimport { FormGroup, FormBuilder, Validators, ReactiveFormsModule } from '@angular/forms';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { ThumbnailControlComponent } from \"../thumbnail-control/thumbnail-control.component\";\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner'\r\n\r\nimport { MatSidenavModule } from '@angular/material/sidenav';\r\nimport { MatCardModule } from '@angular/material/card';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatDividerModule } from '@angular/material/divider';\r\nimport { MatListModule } from '@angular/material/list';\r\nimport { IBlog, BlogSeries, ContentPillar } from '../../models/blog';\r\nimport { NgRhombusBlogService } from '../../services/blog.service';\r\nimport { NgRhombusBlogPostThumbnailService } from '../../services/thumbnail.service';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { NgRhombusBlogConfirmationComponent } from '../../dialogs/confirmation/confirmation.component';\r\nimport { ThemeService } from '../../../shell/services/theme.service';\r\nimport { NgRhombusMarkdownComponent } from '../../../shell/components/markdown/markdown.component';\r\n\r\n@Component({\r\n\tselector: 'ng-rhombus-blog-form',\r\n\timports: [MatListModule, MatDividerModule, MatButtonModule, MatCardModule, MatFormFieldModule, MatInputModule, MatProgressSpinnerModule, MatSidenavModule, ReactiveFormsModule, ThumbnailControlComponent, MatIconModule, NgRhombusMarkdownComponent, MatSelectModule],\r\n\ttemplateUrl: './form.component.html',\r\n\tstyleUrl: './form.component.scss'\r\n})\r\nexport class NgRhombusBlogAddEditComponent {\r\n\tthemeService = inject(ThemeService);\r\n\r\n\tblogPost = input<IBlog | undefined>(undefined);\r\n\tcancelEvent = output<void>();\r\n\tsubmitEvent = output<IBlog>();\r\n\r\n\tcontentData = signal<string>('');\r\n\tblogPostForm!: FormGroup;\r\n\r\n\treadonly pillars = Object.values(ContentPillar);\r\n readonly seriesOptions = Object.values(BlogSeries);\r\n\r\n\tdialog = inject(MatDialog);\r\n\tthumbnailService = inject(NgRhombusBlogPostThumbnailService);\r\n\tformBuilder = inject(FormBuilder);\r\n\tblogService = inject(NgRhombusBlogService);\r\n\r\n\t@ViewChild('blogPost') blogPostPreview!: ElementRef;\r\n\r\n\tmarkdown = `## Markdown __rulez__!\r\n\t---\r\n\r\n\t### Syntax highlight\r\n\t\\`\\`\\`typescript\r\n\tconst language = 'typescript';\r\n\t\\`\\`\\`\r\n\r\n\t### Lists\r\n\t1. Ordered list\r\n\t2. Another bullet point\r\n\t- Unordered list\r\n\t- Another unordered bullet\r\n\r\n\t### Blockquote\r\n\t> Blockquote to the max`;\r\n\r\n\tconstructor() {\r\n\t\teffect(() => {\r\n\t\t\tif (this.blogPost()) {\r\n\t\t\t\tthis.blogPostForm.patchValue({\r\n\t\t\t\t\ttitle: this.blogPost()?.title,\r\n\t\t\t\t\tdescription: this.blogPost()?.description,\r\n\t\t\t\t\tthumbnail: this.blogPost()?.thumbnail,\r\n\t\t\t\t\tcontent: this.blogPost()?.content,\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t\tthis.onContentChange();\r\n\t\t})\r\n\t}\r\n\r\n\tngOnInit(): void {\r\n\t\tthis.blogPostForm = this.formBuilder.group({\r\n\t\t\ttitle: [this.blogPost()?.title, Validators.required],\r\n\t\t\tdescription: [this.blogPost()?.description, Validators.required],\r\n\t\t\tthumbnail: [this.blogPost()?.thumbnail, Validators.required],\r\n\t\t\tcontent: [this.blogPost()?.content, Validators.required],\r\n\r\n\t\t\t// creator system\r\n\t\t\tpillar: [this.blogPost()?.pillar ?? null, Validators.required],\r\n\t\t\tseries: [this.blogPost()?.series ?? null, Validators.required],\r\n\t\t\ttagsCsv: [(this.blogPost()?.tags ?? []).join(', '), Validators.required],\r\n\t\t});\r\n\r\n\t\tthis.applyCreatorSystemRules();\r\n\t\tthis.blogPostForm.get('series')?.valueChanges.subscribe(() => this.applyCreatorSystemRules());\r\n\t}\r\n\r\n\tprivate applyCreatorSystemRules() {\r\n\t\tconst pillarControl = this.blogPostForm.get('pillar');\r\n\t\tconst seriesValue = this.blogPostForm.get('series')?.value as BlogSeries | null;\r\n\t\tif (!pillarControl) return;\r\n\r\n\t\tif (seriesValue === BlogSeries.FromTheEditor) {\r\n\t\t\tpillarControl.clearValidators();\r\n\t\t\tif (pillarControl.value !== null) pillarControl.setValue(null);\r\n\t\t} else {\r\n\t\t\tpillarControl.setValidators([Validators.required]);\r\n\t\t}\r\n\t\tpillarControl.updateValueAndValidity({ emitEvent: false });\r\n\t}\r\n\r\n\tonContentChange() {\r\n\t\tthis.contentData.set(this.blogPostForm.getRawValue().content);\r\n\t}\r\n\r\n\tget thumbnailSource() {\r\n\t\treturn this.blogPostForm.getRawValue().thumbnail;\r\n\t}\r\n\r\n\tonFileUploaded(downloadUrl: string) {\r\n\t\tthis.blogPostForm.patchValue({\r\n\t\t\tthumbnail: downloadUrl\r\n\t\t});\r\n\t\tthis.blogPostForm.markAsDirty();\r\n\t}\r\n\r\n\tonFileDeleted() {\r\n\t\tthis.blogPostForm.patchValue({\r\n\t\t\tthumbnail: ''\r\n\t\t})\r\n\t}\r\n\r\n\tonCancelClick() {\r\n\t\tif (this.blogPost()) {\r\n\t\t\t// EDIT form\r\n\t\t\tif (this.blogPostForm.dirty) {\r\n\t\t\t\tconst dialogRef = this.dialog.open(NgRhombusBlogConfirmationComponent, {\r\n\t\t\t\t\tdata: {\r\n\t\t\t\t\t\theader: 'Cancel Revision',\r\n\t\t\t\t\t\tquery: 'Are you sure? You will lose your revision(s).'\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\r\n\t\t\t\tdialogRef.afterClosed().subscribe(result => {\r\n\t\t\t\t\tif (result) {\r\n\t\t\t\t\t\tthis.cancelEvent.emit();\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t} else {\r\n\t\t\t\tthis.cancelEvent.emit();\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\t// CREATE form\r\n\t\t\tif (this.blogPostForm.dirty) {\r\n\t\t\t\tconst dialogRef = this.dialog.open(NgRhombusBlogConfirmationComponent, {\r\n\t\t\t\t\tdata: {\r\n\t\t\t\t\t\theader: 'Cancel Create',\r\n\t\t\t\t\t\tquery: 'Are you sure? You will lose your progress.'\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\r\n\t\t\t\tdialogRef.afterClosed().subscribe(result => {\r\n\t\t\t\t\tif (result) {\r\n\t\t\t\t\t\tif (this.blogPostForm.getRawValue().thumbnail) {\r\n\t\t\t\t\t\t\tthis.thumbnailService.deleteImage(this.blogPostForm.getRawValue().thumbnail).then(() => {\r\n\t\t\t\t\t\t\t\tthis.onFileDeleted();\r\n\t\t\t\t\t\t\t\tthis.cancelEvent.emit();\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tthis.cancelEvent.emit();\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t} else {\r\n\t\t\t\tthis.cancelEvent.emit();\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tonSubmit() {\r\n\t\tif (this.blogPostForm.invalid) return;\r\n\r\n\t\tconst raw = this.blogPostForm.getRawValue();\r\n\t\tconst tags = this.parseTags(raw.tagsCsv);\r\n\r\n\t\tif (tags.length < 3 || tags.length > 6) {\r\n\t\t\t// keep it simple; if you prefer, set a form error and show mat-error\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst submittedBlogPost = new IBlog();\r\n\t\tif (this.blogPost()) submittedBlogPost.id = this.blogPost()!.id;\r\n\r\n\t\tsubmittedBlogPost.title = raw.title;\r\n\t\tsubmittedBlogPost.description = raw.description;\r\n\t\tsubmittedBlogPost.thumbnail = raw.thumbnail;\r\n\t\tsubmittedBlogPost.content = raw.content;\r\n\r\n\t\tsubmittedBlogPost.pillar = raw.pillar;\r\n\t\tsubmittedBlogPost.series = raw.series;\r\n\t\tsubmittedBlogPost.tags = tags;\r\n\r\n\t\tsubmittedBlogPost.readTimeMinutes = this.blogService.calculateReadTimeMinutes(raw.content);\r\n\r\n\t\tthis.submitEvent.emit(submittedBlogPost);\r\n\t}\r\n\r\n\tprivate parseTags(csv: string): string[] {\r\n\t\tconst tags = (csv ?? '')\r\n\t\t\t.split(',')\r\n\t\t\t.map(t => t.trim())\r\n\t\t\t.filter(Boolean);\r\n\r\n\t\t// unique, preserve order\r\n\t\treturn Array.from(new Set(tags));\r\n\t}\r\n}\r\n","<div class=\"h-full flex flex-row overflow-hidden min-h-0\">\r\n\t<div class=\"flex flex-col w-1/2 p-4 overflow-y-auto min-h-0\">\r\n\t\t<form novalidate class=\"flex flex-col gap-4 min-h-0\" [formGroup]=\"blogPostForm\">\r\n\t\t\t<mat-form-field>\r\n\t\t\t\t<mat-label>Title</mat-label>\r\n\t\t\t\t<input matInput placeholder=\"Placeholder\" formControlName=\"title\">\r\n\t\t\t</mat-form-field>\r\n\t\t\t<mat-form-field>\r\n\t\t\t\t<mat-label>Description</mat-label>\r\n\t\t\t\t<input matInput placeholder=\"Placeholder\" formControlName=\"description\">\r\n\t\t\t</mat-form-field>\r\n\t\t\t<ng-rhombus-thumbnail-control [thumbnailSrc]=\"thumbnailSource\" [width]=\"200\" [height]=\"112\"\r\n\t\t\t\t[displayMode]=\"'indicator'\" [disabled]=\"blogPost() !== undefined\"\r\n\t\t\t\t(onFileUploaded)=\"onFileUploaded($event)\"\r\n\t\t\t\t(onFileDeleted)=\"onFileDeleted()\"></ng-rhombus-thumbnail-control>\r\n\t\t\t<mat-form-field class=\"w-full\">\r\n\t\t\t\t<mat-label>Content</mat-label>\r\n\t\t\t\t<textarea matInput required class=\"content-textarea\" rows=\"12\" formControlName=\"content\"\r\n\t\t\t\t\t(input)=\"onContentChange()\"></textarea>\r\n\t\t\t</mat-form-field>\r\n\t\t\t<div class=\"grid grid-cols-1 sm:grid-cols-2 gap-4\">\r\n\t\t\t\t<mat-form-field class=\"w-full\">\r\n\t\t\t\t\t<mat-label>Content Pillar (optional for From The Editor)</mat-label>\r\n\t\t\t\t\t<mat-select formControlName=\"pillar\" required>\r\n\t\t\t\t\t\t@for (p of pillars; track p) {\r\n\t\t\t\t\t\t<mat-option [value]=\"p\">{{ p }}</mat-option>\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t</mat-select>\r\n\t\t\t\t</mat-form-field>\r\n\r\n\t\t\t\t<mat-form-field class=\"w-full\">\r\n\t\t\t\t\t<mat-label>Series</mat-label>\r\n\t\t\t\t\t<mat-select formControlName=\"series\" required>\r\n\t\t\t\t\t\t@for (s of seriesOptions; track s) {\r\n\t\t\t\t\t\t<mat-option [value]=\"s\">{{ s }}</mat-option>\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t</mat-select>\r\n\t\t\t\t</mat-form-field>\r\n\t\t\t</div>\r\n\t\t\t<mat-form-field>\r\n\t\t\t\t<mat-label>Tags</mat-label>\r\n\t\t\t\t<input matInput formControlName=\"tagsCsv\" placeholder=\"3–6 tags, comma-separated\">\r\n\t\t\t\t<mat-hint>Example: angular, firestore, testing</mat-hint>\r\n\t\t\t</mat-form-field>\r\n\t\t\t<div class=\"flex\">\r\n\t\t\t\t<button mat-raised-button class=\"\" (click)=\"onCancelClick()\" type=\"button\">Cancel</button>\r\n\t\t\t\t<div class=\"flex-1\"></div>\r\n\t\t\t\t<button mat-flat-button [disabled]=\"blogPostForm.invalid\" type=\"button\"\r\n\t\t\t\t\t(click)=\"onSubmit()\">Submit</button>\r\n\t\t\t</div>\r\n\t\t</form>\r\n\t</div>\r\n\r\n\t<div class=\"flex flex-col w-1/2 p-4 overflow-y-auto\">\r\n\t\t<mat-card>\r\n\t\t\t<mat-card-header>\r\n\t\t\t\t<mat-card-title>{{ blogPostForm.getRawValue().title }}</mat-card-title>\r\n\t\t\t\t<mat-card-subtitle>{{ blogPostForm.getRawValue().description }}</mat-card-subtitle>\r\n\t\t\t</mat-card-header>\r\n\t\t\t<img mat-card-image [src]=\"blogPostForm.getRawValue().thumbnail\" />\r\n\t\t\t<mat-card-content>\r\n\t\t\t\t<ng-rhombus-markdown [classes]=\"{ 'prose': true, 'dark:prose-invert': themeService.isDarkMode() }\"\r\n\t\t\t\t\t[data]=\"contentData()\" />\r\n\t\t\t</mat-card-content>\r\n\t\t\t<mat-card-footer>\r\n\t\t\t\t<span class=\"flex flex-row-reverse\">Doug Williamson</span>\r\n\t\t\t</mat-card-footer>\r\n\t\t</mat-card>\r\n\t</div>\r\n</div>","import { Component, inject, input, OnInit } from '@angular/core';\r\nimport { MatCardModule } from '@angular/material/card';\r\nimport { MatMenuModule } from '@angular/material/menu';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatChipsModule } from '@angular/material/chips';\r\nimport { DOCUMENT } from '@angular/common';\r\nimport { IBlog, ngRhombusTimestampToMillis } from '../../models/blog';\r\nimport { DatePipe } from '@angular/common';\r\nimport { ThemeService } from '../../../shell/services/theme.service';\r\nimport { NgRhombusMarkdownComponent } from '../../../shell/components/markdown/markdown.component';\r\nimport { FontAwesomeModule } from '@fortawesome/angular-fontawesome';\r\nimport { faXTwitter, faFacebook, faBluesky, faLinkedin } from '@fortawesome/free-brands-svg-icons';\r\n\r\n@Component({\r\n selector: 'ng-rhombus-blog-post',\r\n imports: [DatePipe, NgRhombusMarkdownComponent, MatCardModule, MatMenuModule, MatIconModule, MatButtonModule, MatChipsModule, FontAwesomeModule],\r\n templateUrl: './post.component.html',\r\n styleUrl: './post.component.scss'\r\n})\r\nexport class NgRhombusBlogPostComponent implements OnInit {\r\n dataSource = input<IBlog>();\r\n themeService = inject(ThemeService);\r\n #doc = inject(DOCUMENT);\r\n\r\n timestampToMillis = ngRhombusTimestampToMillis;\r\n\r\n ngOnInit() {\r\n\r\n }\r\n\r\n // Build absolute URL for sharing\r\n getShareUrl(): string {\r\n const id = this.dataSource()?.id;\r\n const origin = (this.#doc as any)?.location?.origin ?? '';\r\n const path = id ? `/blog/${id}` : (this.#doc as any)?.location?.pathname ?? '/blog';\r\n return `${origin}${path}`;\r\n }\r\n\r\n get shareLinks() {\r\n const url = encodeURIComponent(this.getShareUrl());\r\n const text = encodeURIComponent(this.dataSource()?.title ?? '');\r\n return {\r\n twitter: `https://twitter.com/intent/tweet?url=${url}&text=${text}`,\r\n facebook: `https://www.facebook.com/sharer/sharer.php?u=${url}`,\r\n linkedin: `https://www.linkedin.com/sharing/share-offsite/?url=${url}`,\r\n bluesky: `https://bsky.app/intent/compose?text=${text}&url=${url}`\r\n };\r\n }\r\n\r\n copyLink(): void {\r\n const u = this.getShareUrl();\r\n if (typeof navigator !== 'undefined' && navigator.clipboard) {\r\n navigator.clipboard.writeText(u).catch(() => { });\r\n }\r\n }\r\n\r\n faXTwitter = faXTwitter;\r\n faFacebook = faFacebook;\r\n faBluesky = faBluesky;\r\n faLinkedin = faLinkedin;\r\n\r\n private normalizeTags(tags: IBlog['tags']): string[] {\r\n if (!tags) return [];\r\n if (Array.isArray(tags)) return tags.map(t => `${t}`.trim()).filter(Boolean);\r\n\r\n // handle \"tag1, tag2\"\r\n return `${tags}`\r\n .split(',')\r\n .map(t => t.trim())\r\n .filter(Boolean);\r\n }\r\n\r\n get contentPillar(): string | null {\r\n return (this.dataSource()?.pillar ?? null) || null;\r\n }\r\n\r\n get series(): string | null {\r\n return (this.dataSource()?.series ?? null) || null;\r\n }\r\n\r\n get tags(): string[] {\r\n return this.normalizeTags(this.dataSource()?.tags ?? null);\r\n }\r\n\r\n get hasTaxonomy(): boolean {\r\n return !!this.contentPillar || !!this.series || this.tags.length > 0;\r\n }\r\n}\r\n","<mat-card>\r\n\t<mat-card-header>\r\n\t\t<mat-card-title>{{ dataSource()?.title }}</mat-card-title>\r\n\t\t<mat-card-subtitle>\r\n\t\t\t@if (contentPillar || series) {\r\n\t\t\t<mat-chip-set aria-label=\"Post taxonomy\" role=\"list\">\r\n\t\t\t\t@if (contentPillar) {\r\n\t\t\t\t<mat-chip role=\"listitem\" class=\"primary-chips-theme\" [highlighted]=\"true\">Pillar: {{ contentPillar\r\n\t\t\t\t\t}}</mat-chip>\r\n\t\t\t\t}\r\n\t\t\t\t@if (series) {\r\n\t\t\t\t<mat-chip role=\"listitem\" class=\"secondary-chips-theme\" [highlighted]=\"true\">Series: {{ series\r\n\t\t\t\t\t}}</mat-chip>\r\n\t\t\t\t}\r\n\t\t\t</mat-chip-set>\r\n\t\t\t}\r\n\t\t</mat-card-subtitle>\r\n\t</mat-card-header>\r\n\t<mat-card-content>\r\n\t\t<div class=\"flex items-center justify-between\">\r\n\t\t\t<p class=\"timestamp\">\r\n\t\t\t\t{{ dataSource()?.readTimeMinutes }} {{ dataSource()?.readTimeMinutes === 1 ? 'min' : 'mins' }}\r\n\t\t\t\t&middot;\r\n\t\t\t\t{{ timestampToMillis(dataSource()?.timestamp) | date: 'MMM d, y' }}\r\n\t\t\t</p>\r\n\t\t\t<div class=\"flex-1\"></div>\r\n\t\t\t<button matIconButton [matMenuTriggerFor]=\"shareMenu\" aria-label=\"Share post\">\r\n\t\t\t\t<mat-icon>share</mat-icon>\r\n\t\t\t</button>\r\n\t\t</div>\r\n\r\n\t\t<mat-menu #shareMenu=\"matMenu\">\r\n\t\t\t<a mat-menu-item [href]=\"shareLinks.twitter\" target=\"_blank\" rel=\"noopener\">\r\n\t\t\t\t<fa-icon [icon]=\"faXTwitter\" class=\"mr-2\"></fa-icon>\r\n\t\t\t\t<span>Share on X</span>\r\n\t\t\t</a>\r\n\t\t\t<a mat-menu-item [href]=\"shareLinks.facebook\" target=\"_blank\" rel=\"noopener\">\r\n\t\t\t\t<fa-icon [icon]=\"faFacebook\" class=\"mr-2\"></fa-icon>\r\n\t\t\t\t<span>Share on Facebook</span>\r\n\t\t\t</a>\r\n\t\t\t<a mat-menu-item [href]=\"shareLinks.bluesky\" target=\"_blank\" rel=\"noopener\">\r\n\t\t\t\t<fa-icon [icon]=\"faBluesky\" class=\"mr-2\"></fa-icon>\r\n\t\t\t\t<span>Share on Bluesky</span>\r\n\t\t\t</a>\r\n\t\t\t<a mat-menu-item [href]=\"shareLinks.linkedin\" target=\"_blank\" rel=\"noopener\">\r\n\t\t\t\t<fa-icon [icon]=\"faLinkedin\" class=\"mr-2\"></fa-icon>\r\n\t\t\t\t<span>Share on LinkedIn</span>\r\n\t\t\t</a>\r\n\t\t\t<button mat-menu-item (click)=\"copyLink()\">\r\n\t\t\t\t<mat-icon>content_copy</mat-icon>\r\n\t\t\t\t<span>Copy link</span>\r\n\t\t\t</button>\r\n\t\t</mat-menu>\r\n\t</mat-card-content>\r\n\t<img mat-card-image [src]=\"dataSource()?.thumbnail\" />\r\n\t<mat-card-content class=\"content\">\r\n\t\t<ng-rhombus-markdown\r\n\t\t\t[classes]=\"{ 'prose': true, 'dark:prose-invert': themeService.isDarkMode() }\"\r\n\t\t\t[data]=\"dataSource()?.content\"\r\n\t\t/>\r\n\t</mat-card-content>\r\n\t@if (tags.length) {\r\n\t<mat-card-content>\r\n\t\t<mat-chip-set aria-label=\"Post tags\" role=\"list\">\r\n\t\t\t@for (t of tags; track t) {\r\n\t\t\t<mat-chip role=\"listitem\" highlighted=\"true\" class=\"neutral-chips-theme\">#{{ t }}</mat-chip>\r\n\t\t\t}\r\n\t\t</mat-chip-set>\r\n\t</mat-card-content>\r\n\t}\r\n</mat-card>","import { Component } from '@angular/core';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatDialogModule } from '@angular/material/dialog';\r\n\r\n@Component({\r\n selector: 'ng-rhombus-Blog-delete-post',\r\n imports: [MatButtonModule, MatDialogModule],\r\n templateUrl: './delete-post.component.html',\r\n styleUrl: './delete-post.component.scss'\r\n})\r\nexport class NgRhombusBlogDeletePostComponent {\r\n\r\n}\r\n","<h2 mat-dialog-title>Blog Post - Delete</h2>\r\n<mat-dialog-content>\r\n <p>Would you like to delete this blog post?</p>\r\n</mat-dialog-content>\r\n<mat-dialog-actions>\r\n <button mat-button [mat-dialog-close]=\"false\" cdkFocusInitial>Cancel</button>\r\n <button mat-button [mat-dialog-close]=\"true\">Confirm</button>\r\n</mat-dialog-actions>","/*\r\n * Public API Surface of @doug-williamson/ng-rhombus/shell\r\n */\r\n\r\nexport * from './components/list/list.component';\r\nexport * from './components/latest/latest.component';\r\nexport * from './components/table/table.component';\r\nexport * from './components/form/form.component';\r\nexport * from './components/post/post.component';\r\nexport * from './components/dialogs/delete-post/delete-post.component';\r\n\r\nexport * from './services/blog.service';\r\nexport * from './services/thumbnail.service';\r\n\r\nexport * from './models/blog';\r\n\r\nexport * from './tokens/blog-adapter';\r\nexport * from './tokens/blog-thumbnail-adapter';","\r\nexport class IHome {\r\n id!: string;\r\n title!: string;\r\n description!: string;\r\n}","import { Component, OnInit, effect, inject, input, output } from '@angular/core';\r\nimport { FormBuilder, FormGroup, ReactiveFormsModule, Validators } from '@angular/forms';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { IHome } from '../models/home';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatButtonModule } from '@angular/material/button';\r\n\r\n@Component({\r\n selector: 'ng-rhombus-home-admin',\r\n imports: [MatButtonModule, ReactiveFormsModule, MatFormFieldModule, MatInputModule],\r\n templateUrl: './admin.html',\r\n styleUrl: './admin.scss'\r\n})\r\nexport class NgRhombusHomeAdminComponent implements OnInit {\r\n formAdminData = input<IHome | undefined>(undefined);\r\n cancelEvent = output<void>();\r\n submitEvent = output<IHome>();\r\n\r\n homeAdminForm!: FormGroup;\r\n private fb = inject(FormBuilder);\r\n\r\n ngOnInit(): void {\r\n // build once\r\n this.homeAdminForm = this.fb.group({\r\n title: ['', Validators.required],\r\n description: ['', Validators.required],\r\n // add other fields here...\r\n });\r\n\r\n // react to input changes (runs when data arrives)\r\n effect(() => {\r\n const data = this.formAdminData();\r\n if (data) {\r\n this.homeAdminForm.patchValue(data, { emitEvent: false });\r\n }\r\n });\r\n }\r\n\r\n onSubmit() {\r\n if (this.homeAdminForm.invalid) {\r\n return;\r\n }\r\n\r\n const rawData: IHome = this.homeAdminForm.getRawValue();\r\n let submittedHomeAdmin = new IHome();\r\n if (this.formAdminData()) {\r\n submittedHomeAdmin.id = this.formAdminData()!.id;\r\n }\r\n\r\n submittedHomeAdmin.title = rawData.title;\r\n submittedHomeAdmin.description = rawData.description;\r\n\r\n this.submitEvent.emit(submittedHomeAdmin);\r\n }\r\n\r\n onCancelClick() {\r\n console.log('cancel');\r\n }\r\n}\r\n","<div class=\"page-header\">\r\n\t<div class=\"page-header__title mat-headline-small\">Admin Component</div>\r\n</div>\r\n<div class=\"h-full flex flex-row\">\r\n\t<div class=\"flex flex-col w-1/2 p-4\">\r\n\t\t<form novalidate class=\"h-full flex flex-col\" [formGroup]=\"homeAdminForm\">\r\n\t\t\t<mat-form-field>\r\n\t\t\t\t<mat-label>Title</mat-label>\r\n\t\t\t\t<input matInput placeholder=\"Placeholder\" formControlName=\"title\">\r\n\t\t\t</mat-form-field>\r\n\t\t\t<mat-form-field>\r\n\t\t\t\t<mat-label>Description</mat-label>\r\n\t\t\t\t<input matInput placeholder=\"Placeholder\" formControlName=\"description\">\r\n\t\t\t</mat-form-field>\r\n\r\n\t\t\t<div class=\"flex\">\r\n\t\t\t\t<button mat-raised-button class=\"\" (click)=\"onCancelClick()\" type=\"button\">Cancel</button>\r\n\t\t\t\t<div class=\"flex-1\"></div>\r\n\t\t\t\t<button mat-flat-button [disabled]=\"homeAdminForm.invalid\" type=\"button\"\r\n\t\t\t\t\t(click)=\"onSubmit()\">Submit</button>\r\n\t\t\t</div>\r\n\t\t</form>\r\n\t</div>\r\n</div>","import { InjectionToken } from '@angular/core';\r\nimport { IHome } from '../models/home';\r\n\r\nexport type NgRhombusHomeSaveResult =\r\n\t| { created: true; id: string }\r\n\t| { updated: true; id: string };\r\n\r\nexport interface NgRhombusHomeAdapter {\r\n\tfetchTopHomeDocument(): Promise<IHome | undefined>;\r\n\tsaveOrUpdateHomeDocument(homeData: IHome): Promise<NgRhombusHomeSaveResult>;\r\n}\r\n\r\nexport const NG_RHOMBUS_HOME_ADAPTER = new InjectionToken<NgRhombusHomeAdapter>(\r\n\t'NG_RHOMBUS_HOME_ADAPTER',\r\n\t{\r\n\t\tprovidedIn: 'root',\r\n\t\tfactory: () => ({\r\n\t\t\tfetchTopHomeDocument: async () => undefined,\r\n\t\t\tsaveOrUpdateHomeDocument: async () => {\r\n\t\t\t\tthrow new Error('NG_RHOMBUS_HOME_ADAPTER is not provided.');\r\n\t\t\t}\r\n\t\t})\r\n\t}\r\n);\r\n","import { Injectable, inject, signal } from '@angular/core';\r\nimport { IHome } from './models/home';\r\nimport { NG_RHOMBUS_HOME_ADAPTER, NgRhombusHomeSaveResult } from './tokens/home-adapter';\r\n\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class NgRhombusHomeService {\r\n\r\n private adapter = inject(NG_RHOMBUS_HOME_ADAPTER);\r\n\r\n homeAdminData = signal<IHome | undefined>(undefined);\r\n\r\n async fetchTopHomeDocument() {\r\n\t\tconst topHome = await this.adapter.fetchTopHomeDocument();\r\n\t\tthis.homeAdminData.set(topHome);\r\n\t\treturn topHome;\r\n }\r\n\r\n async saveOrUpdateHomeDocument(homeData: IHome) {\r\n\t\tconst result: NgRhombusHomeSaveResult = await this.adapter.saveOrUpdateHomeDocument(homeData);\r\n\t\tthis.homeAdminData.set({ ...homeData, id: result.id });\r\n\t\treturn result;\r\n }\r\n}","export enum SocialsSource {\r\n\tTwitch = 'Twitch',\r\n\tYouTube = 'YouTube',\r\n\tInstagram = 'Instagram',\r\n\tTikTok = 'TikTok',\r\n\tBluesky = 'Bluesky',\r\n\tGitHub = 'GitHub',\r\n\tLinkedIn = 'LinkedIn'\r\n}\r\n\r\nexport interface ISocial {\r\n\tid: string;\r\n\tsource: SocialsSource;\r\n\turl: string;\r\n}\r\n","import { Component, inject, input } from '@angular/core';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { FontAwesomeModule } from '@fortawesome/angular-fontawesome';\r\nimport { IconDefinition } from '@fortawesome/fontawesome-svg-core';\r\nimport { faGithub, faYoutube, faInstagram, faTwitch, faTiktok, faBluesky, faLinkedin } from '@fortawesome/free-brands-svg-icons';\r\nimport { faLink } from '@fortawesome/free-solid-svg-icons';\r\nimport { ISocial, SocialsSource } from '../models/socials';\r\nimport { WrapperService } from '../../shell/public-api';\r\n\r\n@Component({\r\n selector: 'ng-rhombus-socials-list',\r\n standalone: true,\r\n imports: [FontAwesomeModule, MatIconModule, MatButtonModule],\r\n templateUrl: './list.component.html',\r\n styleUrls: ['./list.component.scss']\r\n})\r\nexport class NgRhombusSocialsListComponent {\r\n wrapperService = inject(WrapperService);\r\n socials = input<ISocial[]>([]);\r\n\r\n iconFor(source?: SocialsSource): IconDefinition {\r\n switch (source) {\r\n case SocialsSource.YouTube: return faYoutube;\r\n case SocialsSource.Instagram: return faInstagram;\r\n case SocialsSource.Twitch: return faTwitch;\r\n case SocialsSource.TikTok: return faTiktok;\r\n case SocialsSource.Bluesky: return faBluesky; // no official brand, fallback\r\n case SocialsSource.GitHub: return faGithub;\r\n case SocialsSource.LinkedIn: return faLinkedin;\r\n default: return faLink;\r\n }\r\n }\r\n}","@if ((socials()).length === 0) {\r\n<p class=\"m-6 justify-self-center\">No socials found.</p>\r\n} @else {\r\n<div class=\"toolbar-list\">\r\n @for (s of socials(); track s.id) {\r\n <a [attr.href]=\"s.url || null\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"block\"\r\n [attr.aria-label]=\"'Open ' + s.source + ' link'\">\r\n <div class=\"social-row actionable\">\r\n <fa-icon [icon]=\"iconFor(s.source)\" class=\"fa-icon left\"></fa-icon>\r\n <span class=\"center\">{{ s.source }}</span>\r\n @if (s.url) {\r\n <button mat-icon-button class=\"right\" aria-label=\"Copy link\">\r\n <mat-icon>content_copy</mat-icon>\r\n </button>\r\n }\r\n </div>\r\n </a>\r\n }\r\n</div>\r\n}","import { InjectionToken } from '@angular/core';\r\nimport { ISocial } from '../models/socials';\r\n\r\nexport interface NgRhombusSocialsAdapter {\r\n\tfetchAll(): Promise<ISocial[]>;\r\n\tfetchById(id: string): Promise<ISocial | undefined>;\r\n\tcreate(social: Omit<ISocial, 'id'>): Promise<string>;\r\n\tupdate(id: string, patch: Partial<Omit<ISocial, 'id'>>): Promise<void>;\r\n\tremove(id: string): Promise<void>;\r\n}\r\n\r\nexport const NG_RHOMBUS_SOCIALS_ADAPTER = new InjectionToken<NgRhombusSocialsAdapter>(\r\n\t'NG_RHOMBUS_SOCIALS_ADAPTER',\r\n\t{\r\n\t\tprovidedIn: 'root',\r\n\t\tfactory: () => ({\r\n\t\t\tfetchAll: async () => [],\r\n\t\t\tfetchById: async () => undefined,\r\n\t\t\tcreate: async () => {\r\n\t\t\t\tthrow new Error('NG_RHOMBUS_SOCIALS_ADAPTER is not provided.');\r\n\t\t\t},\r\n\t\t\tupdate: async () => {\r\n\t\t\t\tthrow new Error('NG_RHOMBUS_SOCIALS_ADAPTER is not provided.');\r\n\t\t\t},\r\n\t\t\tremove: async () => {\r\n\t\t\t\tthrow new Error('NG_RHOMBUS_SOCIALS_ADAPTER is not provided.');\r\n\t\t\t}\r\n\t\t})\r\n\t}\r\n);\r\n","import { Injectable, inject, signal } from '@angular/core';\r\nimport { ISocial } from './models/socials';\r\nimport { NG_RHOMBUS_SOCIALS_ADAPTER } from './tokens/socials-adapter';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class NgRhombusSocialsService {\r\n private adapter = inject(NG_RHOMBUS_SOCIALS_ADAPTER);\r\n\r\n socials = signal<ISocial[]>([]);\r\n\r\n private sort(items: ISocial[]): ISocial[] {\r\n return [...items].sort((a, b) => `${a.source}`.localeCompare(`${b.source}`));\r\n }\r\n\r\n // List\r\n async fetchAll(): Promise<ISocial[]> {\r\n const items = await this.adapter.fetchAll();\r\n const sorted = this.sort(items);\r\n this.socials.set(sorted);\r\n return sorted;\r\n }\r\n\r\n // Read by id\r\n async fetchById(id: string): Promise<ISocial | undefined> {\r\n return this.adapter.fetchById(id);\r\n }\r\n\r\n // Create (auto-id)\r\n async create(social: Omit<ISocial, 'id'>): Promise<string> {\r\n const id = await this.adapter.create(social);\r\n this.socials.set(this.sort([...this.socials(), { ...(social as ISocial), id }]));\r\n return id;\r\n }\r\n\r\n // Update (partial)\r\n async update(id: string, patch: Partial<Omit<ISocial, 'id'>>): Promise<void> {\r\n await this.adapter.update(id, patch);\r\n this.socials.set(\r\n this.sort(this.socials().map(s => (s.id === id ? { ...s, ...(patch as ISocial) } : s)))\r\n );\r\n }\r\n\r\n // Delete\r\n async remove(id: string): Promise<void> {\r\n await this.adapter.remove(id);\r\n this.socials.set(this.socials().filter(s => s.id !== id));\r\n }\r\n}\r\n","import { Component, inject } from '@angular/core';\r\nimport { MAT_DIALOG_DATA, MatDialogModule, MatDialogRef } from '@angular/material/dialog';\r\nimport { FormBuilder, ReactiveFormsModule, Validators } from '@angular/forms';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { ISocial, SocialsSource } from '../../models/socials';\r\nimport { MatButtonModule } from '@angular/material/button';\r\n\r\nexport interface SocialEditDialogData {\r\n social?: ISocial | null; // undefined/null => create, object => edit\r\n}\r\n\r\n@Component({\r\n selector: 'ng-rhombus-social-edit-dialog',\r\n standalone: true,\r\n imports: [MatDialogModule, ReactiveFormsModule, MatFormFieldModule, MatInputModule, MatSelectModule, MatButtonModule],\r\n templateUrl: './add-edit.component.html',\r\n})\r\nexport class NgRhombusSocialEditDialogComponent {\r\n private fb = inject(FormBuilder);\r\n private dialogRef = inject<MatDialogRef<NgRhombusSocialEditDialogComponent, { source: SocialsSource; url: string }>>(MatDialogRef);\r\n data = inject<SocialEditDialogData>(MAT_DIALOG_DATA);\r\n\r\n socialTypeOptions = [\r\n { label: 'Twitch', value: SocialsSource.Twitch },\r\n { label: 'YouTube', value: SocialsSource.YouTube },\r\n { label: 'Instagram', value: SocialsSource.Instagram },\r\n { label: 'TikTok', value: SocialsSource.TikTok },\r\n { label: 'Bluesky', value: SocialsSource.Bluesky },\r\n { label: 'GitHub', value: SocialsSource.GitHub },\r\n { label: 'LinkedIn', value: SocialsSource.LinkedIn }\r\n ];\r\n\r\n form = this.fb.group({\r\n source: this.fb.control<SocialsSource | null>(this.data.social?.source ?? null, { validators: [Validators.required] }),\r\n url: this.fb.control<string>(this.data.social?.url ?? '', { nonNullable: true, validators: [Validators.required] })\r\n });\r\n\r\n save() {\r\n const { source, url } = this.form.getRawValue();\r\n if (!source || !url) return;\r\n this.dialogRef.close({ source, url });\r\n }\r\n\r\n cancel() {\r\n this.dialogRef.close();\r\n }\r\n}","<h2 mat-dialog-title>\r\n {{ data.social ? 'Edit Social' : 'Add Social' }}\r\n</h2>\r\n\r\n<form [formGroup]=\"form\" (ngSubmit)=\"save()\">\r\n <mat-dialog-content>\r\n <mat-form-field appearance=\"fill\" style=\"width: 100%\">\r\n <mat-label>Source</mat-label>\r\n <mat-select formControlName=\"source\">\r\n @for (opt of socialTypeOptions; track opt.value) {\r\n <mat-option [value]=\"opt.value\">\r\n {{ opt.label }}\r\n </mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-form-field appearance=\"fill\" style=\"width: 100%\">\r\n <mat-label>URL</mat-label>\r\n <input matInput formControlName=\"url\" />\r\n </mat-form-field>\r\n </mat-dialog-content>\r\n\r\n <mat-dialog-actions align=\"end\">\r\n <button mat-button type=\"button\" (click)=\"cancel()\">Cancel</button>\r\n <button mat-raised-button color=\"primary\" type=\"submit\" [disabled]=\"form.invalid\">\r\n Save\r\n </button>\r\n </mat-dialog-actions>\r\n</form>","import { Component, inject } from '@angular/core';\r\nimport { MAT_DIALOG_DATA, MatDialogModule, MatDialogRef } from '@angular/material/dialog';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { ISocial } from '../../models/socials';\r\n\r\nexport interface SocialDeleteDialogData {\r\n social: ISocial;\r\n}\r\n\r\n@Component({\r\n selector: 'ng-rhombus-social-delete-dialog',\r\n standalone: true,\r\n imports: [MatDialogModule, MatButtonModule],\r\n templateUrl: './delete.component.html',\r\n})\r\nexport class NgRhombusSocialDeleteDialogComponent {\r\n readonly data = inject<SocialDeleteDialogData>(MAT_DIALOG_DATA);\r\n private dialogRef = inject<MatDialogRef<NgRhombusSocialDeleteDialogComponent, boolean>>(MatDialogRef);\r\n\r\n cancel() {\r\n this.dialogRef.close(false);\r\n }\r\n\r\n confirm() {\r\n this.dialogRef.close(true);\r\n }\r\n}\r\n","<h2 mat-dialog-title>Delete Social</h2>\r\n\r\n<mat-dialog-content>\r\n Are you sure you want to delete this social?\r\n <br />\r\n <strong>{{ data.social.source }} - {{ data.social.url }}</strong>\r\n</mat-dialog-content>\r\n\r\n<mat-dialog-actions align=\"end\">\r\n <button mat-button (click)=\"cancel()\">Cancel</button>\r\n <button mat-raised-button color=\"warn\" (click)=\"confirm()\">Delete</button>\r\n</mat-dialog-actions>\r\n","import { Component, input, inject } from '@angular/core';\r\nimport { MatTableModule } from '@angular/material/table';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { ISocial, SocialsSource } from '../models/socials';\r\nimport { NgRhombusSocialsService } from '../socials.service';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { firstValueFrom } from 'rxjs';\r\nimport { NgRhombusSocialEditDialogComponent } from '../modals/add-edit/add-edit.component';\r\nimport { NgRhombusSocialDeleteDialogComponent } from '../modals/delete/delete.component';\r\nimport { NgClass } from '@angular/common';\r\nimport { faGithub, faYoutube, faInstagram, faTwitch, faTiktok, faBluesky, faLinkedin, IconDefinition } from '@fortawesome/free-brands-svg-icons';\r\nimport { faLink } from '@fortawesome/free-solid-svg-icons';\r\nimport { FontAwesomeModule } from '@fortawesome/angular-fontawesome';\r\n\r\n@Component({\r\n selector: 'ng-rhombus-socials-table',\r\n standalone: true,\r\n imports: [FontAwesomeModule, MatTableModule, MatButtonModule, MatSelectModule, MatIconModule, MatFormFieldModule, MatInputModule],\r\n templateUrl: './table.component.html',\r\n styleUrls: ['./table.component.scss']\r\n})\r\nexport class NgRhombusSocialsTableComponent {\r\n socials = input<ISocial[]>([]);\r\n displayedColumns = ['source', 'url', 'actions'];\r\n\r\n iconFor(source?: SocialsSource): IconDefinition {\r\n switch (source) {\r\n case SocialsSource.YouTube: return faYoutube;\r\n case SocialsSource.Instagram: return faInstagram;\r\n case SocialsSource.Twitch: return faTwitch;\r\n case SocialsSource.TikTok: return faTiktok;\r\n case SocialsSource.Bluesky: return faBluesky; // no official brand, fallback\r\n case SocialsSource.GitHub: return faGithub;\r\n case SocialsSource.LinkedIn: return faLinkedin;\r\n default: return faLink;\r\n }\r\n }\r\n\r\n socialTypeOptions = [\r\n { label: 'Twitch', value: SocialsSource.Twitch },\r\n { label: 'YouTube', value: SocialsSource.YouTube },\r\n { label: 'Instagram', value: SocialsSource.Instagram },\r\n { label: 'TikTok', value: SocialsSource.TikTok },\r\n { label: 'Bluesky', value: SocialsSource.Bluesky },\r\n { label: 'GitHub', value: SocialsSource.GitHub },\r\n { label: 'LinkedIn', value: SocialsSource.LinkedIn }\r\n ];\r\n\r\n private svc = inject(NgRhombusSocialsService);\r\n private dialog = inject(MatDialog);\r\n\r\n // called from parent \"Add New\" button or row action\r\n async startCreate() {\r\n const dialogRef = this.dialog.open(NgRhombusSocialEditDialogComponent, {\r\n data: { social: null },\r\n });\r\n\r\n const result = await firstValueFrom(dialogRef.afterClosed());\r\n if (!result) return;\r\n\r\n await this.svc.create({ source: result.source, url: result.url });\r\n }\r\n\r\n async startEdit(row: ISocial) {\r\n const dialogRef = this.dialog.open(NgRhombusSocialEditDialogComponent, {\r\n data: { social: row },\r\n });\r\n\r\n const result = await firstValueFrom(dialogRef.afterClosed());\r\n if (!result) return;\r\n\r\n await this.svc.update(row.id, { source: result.source, url: result.url });\r\n }\r\n\r\n async delete(row: ISocial) {\r\n const dialogRef = this.dialog.open(NgRhombusSocialDeleteDialogComponent, {\r\n data: { social: row },\r\n });\r\n\r\n const confirmed = await firstValueFrom(dialogRef.afterClosed());\r\n if (!confirmed) return;\r\n\r\n await this.svc.remove(row.id);\r\n }\r\n}","<table mat-table [dataSource]=\"socials()\" class=\"mat-elevation-z1\">\r\n\r\n <ng-container matColumnDef=\"source\">\r\n <th mat-header-cell *matHeaderCellDef>Source</th>\r\n <td mat-cell *matCellDef=\"let row\">\r\n <!-- replace text with icon -->\r\n <fa-icon [icon]=\"iconFor(row.source)\" class=\"fa-icon left\"></fa-icon>\r\n </td>\r\n </ng-container>\r\n\r\n <ng-container matColumnDef=\"url\">\r\n <th mat-header-cell *matHeaderCellDef>URL</th>\r\n <td mat-cell *matCellDef=\"let s\">\r\n <a [href]=\"s.url\" target=\"_blank\" rel=\"noopener\">{{ s.url }}</a>\r\n </td>\r\n </ng-container>\r\n\r\n <ng-container matColumnDef=\"actions\">\r\n <th mat-header-cell *matHeaderCellDef></th>\r\n <td mat-cell *matCellDef=\"let s\">\r\n <button mat-icon-button color=\"primary\" (click)=\"startEdit(s)\"><mat-icon>edit</mat-icon></button>\r\n <button mat-icon-button color=\"warn\" (click)=\"delete(s)\"><mat-icon>delete</mat-icon></button>\r\n </td>\r\n </ng-container>\r\n\r\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\r\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\r\n</table>\r\n\r\n\r\n@if (socials() && socials().length === 0) {\r\n<p>No socials found.</p>\r\n}","/*\r\n * Public API Surface of @doug-williamson/ng-rhombus\r\n */\r\n\r\nexport * from './lib/shell/public-api';\r\nexport * from './lib/blog/public-api';\r\nexport * from './lib/home/public-api';\r\nexport * from './lib/socials/public-api';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i2","i3","i1","i2.WrapperService","i4","i5","i6"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@doug-williamson/ng-rhombus",
3
- "version": "2.0.0-beta.2",
3
+ "version": "2.0.0-beta.3",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^21.0.0",
6
6
  "@angular/core": "^21.0.0",
@@ -142,6 +142,16 @@ interface NgRhombusSeoAdapter {
142
142
  }
143
143
  declare const NG_RHOMBUS_SEO_ADAPTER: InjectionToken<NgRhombusSeoAdapter>;
144
144
 
145
+ interface NgRhombusSiteMetadata {
146
+ /** Absolute site origin, e.g. https://example.com */
147
+ origin?: string;
148
+ /** Human-friendly site name for link previews */
149
+ siteName?: string;
150
+ /** Twitter/X site handle, usually starts with '@' (optional) */
151
+ twitterSite?: string;
152
+ }
153
+ declare const NG_RHOMBUS_SITE_METADATA: InjectionToken<NgRhombusSiteMetadata>;
154
+
145
155
  type NgRhombusTimestampLike = Date | number | string | {
146
156
  toMillis: () => number;
147
157
  } | {
@@ -494,5 +504,5 @@ interface NgRhombusSocialsAdapter {
494
504
  }
495
505
  declare const NG_RHOMBUS_SOCIALS_ADAPTER: InjectionToken<NgRhombusSocialsAdapter>;
496
506
 
497
- export { BlogSeries, ContentPillar, IBlog, IHome, NG_RHOMBUS_AUTH_ADAPTER, NG_RHOMBUS_BLOG_ADAPTER, NG_RHOMBUS_BLOG_THUMBNAIL_ADAPTER, NG_RHOMBUS_HOME_ADAPTER, NG_RHOMBUS_SEO_ADAPTER, NG_RHOMBUS_SOCIALS_ADAPTER, NgRhombusBlogAddEditComponent, NgRhombusBlogDeletePostComponent, NgRhombusBlogListComponent, NgRhombusBlogPostComponent, NgRhombusBlogPostLatestComponent, NgRhombusBlogPostThumbnailService, NgRhombusBlogService, NgRhombusBlogTableComponent, NgRhombusHomeAdminComponent, NgRhombusHomeService, NgRhombusLoginComponent, NgRhombusMarkdownComponent, NgRhombusPageComponent, NgRhombusSocialsListComponent, NgRhombusSocialsService, NgRhombusSocialsTableComponent, NgRhombusSpinnerComponent, NgRhombusWrapperComponent, SocialsSource, ThemeEnum, WrapperService, ngRhombusTimestampToMillis };
498
- export type { Breadcrumb, ILoginCredentials, ISocial, NgRhombusAuthAdapter, NgRhombusAuthUser, NgRhombusBlogAdapter, NgRhombusBlogThumbnailAdapter, NgRhombusHomeAdapter, NgRhombusHomeSaveResult, NgRhombusNavItem, NgRhombusSeoAdapter, NgRhombusSeoTag, NgRhombusSocialsAdapter, NgRhombusTimestampLike, Theme };
507
+ export { BlogSeries, ContentPillar, IBlog, IHome, NG_RHOMBUS_AUTH_ADAPTER, NG_RHOMBUS_BLOG_ADAPTER, NG_RHOMBUS_BLOG_THUMBNAIL_ADAPTER, NG_RHOMBUS_HOME_ADAPTER, NG_RHOMBUS_SEO_ADAPTER, NG_RHOMBUS_SITE_METADATA, NG_RHOMBUS_SOCIALS_ADAPTER, NgRhombusBlogAddEditComponent, NgRhombusBlogDeletePostComponent, NgRhombusBlogListComponent, NgRhombusBlogPostComponent, NgRhombusBlogPostLatestComponent, NgRhombusBlogPostThumbnailService, NgRhombusBlogService, NgRhombusBlogTableComponent, NgRhombusHomeAdminComponent, NgRhombusHomeService, NgRhombusLoginComponent, NgRhombusMarkdownComponent, NgRhombusPageComponent, NgRhombusSocialsListComponent, NgRhombusSocialsService, NgRhombusSocialsTableComponent, NgRhombusSpinnerComponent, NgRhombusWrapperComponent, SocialsSource, ThemeEnum, WrapperService, ngRhombusTimestampToMillis };
508
+ export type { Breadcrumb, ILoginCredentials, ISocial, NgRhombusAuthAdapter, NgRhombusAuthUser, NgRhombusBlogAdapter, NgRhombusBlogThumbnailAdapter, NgRhombusHomeAdapter, NgRhombusHomeSaveResult, NgRhombusNavItem, NgRhombusSeoAdapter, NgRhombusSeoTag, NgRhombusSiteMetadata, NgRhombusSocialsAdapter, NgRhombusTimestampLike, Theme };