@rolatech/angular-community 20.3.2-beta.3 → 20.3.3-beta.0

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.
Files changed (16) hide show
  1. package/fesm2022/{rolatech-angular-community-community-details.component-B4kDYAna.mjs → rolatech-angular-community-community-details.component-q5BBjuKJ.mjs} +8 -8
  2. package/fesm2022/{rolatech-angular-community-community-details.component-B4kDYAna.mjs.map → rolatech-angular-community-community-details.component-q5BBjuKJ.mjs.map} +1 -1
  3. package/fesm2022/{rolatech-angular-community-community-index.component-CJ_ddZSo.mjs → rolatech-angular-community-community-index.component-BNGz0UYa.mjs} +12 -12
  4. package/fesm2022/{rolatech-angular-community-community-index.component-CJ_ddZSo.mjs.map → rolatech-angular-community-community-index.component-BNGz0UYa.mjs.map} +1 -1
  5. package/fesm2022/{rolatech-angular-community-community-manage-index.component-CQYy_iI7.mjs → rolatech-angular-community-community-manage-index.component-BPBXoVAh.mjs} +12 -12
  6. package/fesm2022/{rolatech-angular-community-community-manage-index.component-CQYy_iI7.mjs.map → rolatech-angular-community-community-manage-index.component-BPBXoVAh.mjs.map} +1 -1
  7. package/fesm2022/{rolatech-angular-community-community-manage-post-details.component-B70ewcPc.mjs → rolatech-angular-community-community-manage-post-details.component-BAo4VObj.mjs} +8 -8
  8. package/fesm2022/{rolatech-angular-community-community-manage-post-details.component-B70ewcPc.mjs.map → rolatech-angular-community-community-manage-post-details.component-BAo4VObj.mjs.map} +1 -1
  9. package/fesm2022/{rolatech-angular-community-community-manage-post.component-DVRDQzXA.mjs → rolatech-angular-community-community-manage-post.component-CtS6PHFY.mjs} +12 -12
  10. package/fesm2022/{rolatech-angular-community-community-manage-post.component-DVRDQzXA.mjs.map → rolatech-angular-community-community-manage-post.component-CtS6PHFY.mjs.map} +1 -1
  11. package/fesm2022/{rolatech-angular-community-rolatech-angular-community-40yr8v0S.mjs → rolatech-angular-community-rolatech-angular-community-CJ1wpGp3.mjs} +28 -28
  12. package/fesm2022/rolatech-angular-community-rolatech-angular-community-CJ1wpGp3.mjs.map +1 -0
  13. package/fesm2022/rolatech-angular-community.mjs +1 -1
  14. package/package.json +4 -4
  15. package/types/rolatech-angular-community.d.ts +1 -1
  16. package/fesm2022/rolatech-angular-community-rolatech-angular-community-40yr8v0S.mjs.map +0 -1
@@ -11,7 +11,7 @@ import { MatIconModule } from '@angular/material/icon';
11
11
  import { ActivatedRoute, Router } from '@angular/router';
12
12
  import { TabsComponent, TabComponent } from '@rolatech/angular-components';
13
13
  import { SnackBarService, TitleService } from '@rolatech/angular-services';
14
- import { C as CommunityPostStoreService, c as createPostPreview, t as toTagInput } from './rolatech-angular-community-rolatech-angular-community-40yr8v0S.mjs';
14
+ import { C as CommunityPostStoreService, c as createPostPreview, t as toTagInput } from './rolatech-angular-community-rolatech-angular-community-CJ1wpGp3.mjs';
15
15
  import { startWith } from 'rxjs';
16
16
 
17
17
  class CommunityManagePostComponent {
@@ -22,11 +22,11 @@ class CommunityManagePostComponent {
22
22
  this.postStore = inject(CommunityPostStoreService);
23
23
  this.snackBar = inject(SnackBarService);
24
24
  this.titleService = inject(TitleService);
25
- this.editorTab = model(0, ...(ngDevMode ? [{ debugName: "editorTab" }] : []));
26
- this.loading = signal(false, ...(ngDevMode ? [{ debugName: "loading" }] : []));
27
- this.savingDraft = signal(false, ...(ngDevMode ? [{ debugName: "savingDraft" }] : []));
28
- this.publishing = signal(false, ...(ngDevMode ? [{ debugName: "publishing" }] : []));
29
- this.postId = signal(this.route.snapshot.paramMap.get('id'), ...(ngDevMode ? [{ debugName: "postId" }] : []));
25
+ this.editorTab = model(0, ...(ngDevMode ? [{ debugName: "editorTab" }] : /* istanbul ignore next */ []));
26
+ this.loading = signal(false, ...(ngDevMode ? [{ debugName: "loading" }] : /* istanbul ignore next */ []));
27
+ this.savingDraft = signal(false, ...(ngDevMode ? [{ debugName: "savingDraft" }] : /* istanbul ignore next */ []));
28
+ this.publishing = signal(false, ...(ngDevMode ? [{ debugName: "publishing" }] : /* istanbul ignore next */ []));
29
+ this.postId = signal(this.route.snapshot.paramMap.get('id'), ...(ngDevMode ? [{ debugName: "postId" }] : /* istanbul ignore next */ []));
30
30
  this.form = this.formBuilder.nonNullable.group({
31
31
  title: ['', [Validators.required, Validators.minLength(4)]],
32
32
  slug: [''],
@@ -38,8 +38,8 @@ class CommunityManagePostComponent {
38
38
  this.formValue = toSignal(this.form.valueChanges.pipe(startWith(this.form.getRawValue())), {
39
39
  initialValue: this.form.getRawValue(),
40
40
  });
41
- this.preview = computed(() => createPostPreview(this.formValue().content ?? ''), ...(ngDevMode ? [{ debugName: "preview" }] : []));
42
- this.canSubmit = computed(() => (this.formValue().title?.trim().length ?? 0) >= 4 && (this.formValue().content?.trim().length ?? 0) >= 20, ...(ngDevMode ? [{ debugName: "canSubmit" }] : []));
41
+ this.preview = computed(() => createPostPreview(this.formValue().content ?? ''), ...(ngDevMode ? [{ debugName: "preview" }] : /* istanbul ignore next */ []));
42
+ this.canSubmit = computed(() => (this.formValue().title?.trim().length ?? 0) >= 4 && (this.formValue().content?.trim().length ?? 0) >= 20, ...(ngDevMode ? [{ debugName: "canSubmit" }] : /* istanbul ignore next */ []));
43
43
  this.titleService.setTitle(this.postId() ? 'Edit post | Community' : 'Write post | Community');
44
44
  if (this.postId()) {
45
45
  this.loadPost(this.postId());
@@ -125,13 +125,13 @@ class CommunityManagePostComponent {
125
125
  const parent = this.route.parent ?? this.route;
126
126
  this.router.navigate(['manage', id], { relativeTo: parent });
127
127
  }
128
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: CommunityManagePostComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
129
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.1", type: CommunityManagePostComponent, isStandalone: true, selector: "rolatech-community-manage-post", inputs: { editorTab: { classPropertyName: "editorTab", publicName: "editorTab", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { editorTab: "editorTabChange" }, ngImport: i0, template: "<div class=\"community-manage-post\">\n <section class=\"community-manage-post__header\">\n <div>\n <h2>{{ postId() ? 'Edit post' : 'Create post' }}</h2>\n <p>Write in markdown, check the preview, then save a durable draft or publish immediately.</p>\n </div>\n\n <div class=\"community-manage-post__actions\">\n <button mat-stroked-button type=\"button\" (click)=\"saveDraft()\" [disabled]=\"savingDraft() || publishing()\">\n <mat-icon>save</mat-icon>\n <span>{{ savingDraft() ? 'Saving...' : 'Save draft' }}</span>\n </button>\n\n <button mat-flat-button color=\"primary\" type=\"button\" (click)=\"publish()\" [disabled]=\"savingDraft() || publishing()\">\n <mat-icon>publish</mat-icon>\n <span>{{ publishing() ? 'Publishing...' : 'Publish' }}</span>\n </button>\n </div>\n </section>\n\n @if (loading()) {\n <div class=\"community-manage-post__state\">Loading post...</div>\n } @else {\n <section class=\"community-manage-post__workspace\">\n <form class=\"community-manage-post__form\" [formGroup]=\"form\">\n <label>\n <span>Title</span>\n <input type=\"text\" formControlName=\"title\" placeholder=\"Write a clear, scannable title\" />\n </label>\n\n <label>\n <span>Slug</span>\n <input type=\"text\" formControlName=\"slug\" placeholder=\"url-ready-post-slug\" />\n </label>\n\n <label>\n <span>Summary</span>\n <textarea rows=\"3\" formControlName=\"summary\" placeholder=\"Short summary shown in cards and previews\"></textarea>\n </label>\n\n <label>\n <span>Tags</span>\n <input type=\"text\" formControlName=\"tags\" placeholder=\"angular, community, design\" />\n </label>\n\n <label>\n <span>Cover image URL</span>\n <input type=\"url\" formControlName=\"coverImage\" placeholder=\"https://...\" />\n </label>\n\n <label>\n <span>Content</span>\n <textarea rows=\"18\" formControlName=\"content\" placeholder=\"# Heading&#10;&#10;Write markdown content here...\"></textarea>\n </label>\n </form>\n\n <aside class=\"community-manage-post__preview\">\n <rolatech-tabs mode=\"background\" [(select)]=\"editorTab\">\n <rolatech-tab label=\"Preview\"></rolatech-tab>\n <rolatech-tab label=\"Stats\"></rolatech-tab>\n </rolatech-tabs>\n\n @if (editorTab() === 0) {\n <article class=\"community-manage-post__preview-card\">\n <h3>{{ form.controls.title.value || 'Untitled post' }}</h3>\n <p>{{ form.controls.summary.value || 'Add a summary so cards and detail pages have useful context.' }}</p>\n <div class=\"community-manage-post__preview-content markdown-body\" [innerHTML]=\"preview().html\"></div>\n </article>\n } @else {\n <article class=\"community-manage-post__stats-card\">\n <div>\n <span class=\"community-manage-post__stat-label\">Words</span>\n <strong>{{ preview().wordCount }}</strong>\n </div>\n <div>\n <span class=\"community-manage-post__stat-label\">Reading time</span>\n <strong>{{ preview().readingTimeMinutes }} min</strong>\n </div>\n <div>\n <span class=\"community-manage-post__stat-label\">Slug</span>\n <strong>{{ form.controls.slug.value || 'Generated on save' }}</strong>\n </div>\n </article>\n }\n </aside>\n </section>\n }\n</div>\n", styles: [".community-manage-post{display:grid;gap:1.25rem}.community-manage-post__header,.community-manage-post__workspace,.community-manage-post__state,.community-manage-post__preview-card,.community-manage-post__stats-card{border:1px solid var(--community-border);border-radius:24px;background:var(--community-surface-strong);box-shadow:var(--community-shadow)}.community-manage-post__header{display:flex;justify-content:space-between;gap:1rem;align-items:center;padding:1.1rem 1.2rem}.community-manage-post__header h2{margin:0;font-size:1.55rem}.community-manage-post__header p{margin:.4rem 0 0;color:var(--community-muted)}.community-manage-post__actions{display:flex;gap:.75rem;flex-wrap:wrap}.community-manage-post__workspace{display:grid;grid-template-columns:minmax(0,1.2fr) minmax(20rem,.8fr);gap:1.25rem;padding:1.2rem}.community-manage-post__form{display:grid;gap:.95rem}.community-manage-post__form label{display:grid;gap:.4rem;color:var(--community-muted);font-size:.92rem}.community-manage-post__form input,.community-manage-post__form textarea{width:100%;border:1px solid var(--community-border);border-radius:16px;background:transparent;color:var(--community-text);padding:.85rem 1rem;resize:vertical;outline:none}.community-manage-post__preview{display:grid;gap:.9rem}.community-manage-post__preview-card,.community-manage-post__stats-card{padding:1.1rem 1.2rem}.community-manage-post__preview-card h3{margin:0;font-size:1.45rem}.community-manage-post__preview-card p{margin:.8rem 0 1rem;color:var(--community-muted);line-height:1.7}.community-manage-post__preview-content{max-height:34rem;overflow:auto}.community-manage-post__stats-card{display:grid;gap:1rem}.community-manage-post__stats-card div{display:grid;gap:.25rem}.community-manage-post__stat-label{color:var(--community-muted);font-size:.9rem}.community-manage-post__state{padding:2rem}@media(max-width:980px){.community-manage-post__header{flex-direction:column;align-items:stretch}.community-manage-post__workspace{grid-template-columns:1fr}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: TabsComponent, selector: "rolatech-tabs", inputs: ["select", "loading", "block", "mode"], outputs: ["selectChange"] }, { kind: "component", type: TabComponent, selector: "rolatech-tab", inputs: ["label"], outputs: ["selectRequested"] }] }); }
128
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: CommunityManagePostComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
129
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.5", type: CommunityManagePostComponent, isStandalone: true, selector: "rolatech-community-manage-post", inputs: { editorTab: { classPropertyName: "editorTab", publicName: "editorTab", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { editorTab: "editorTabChange" }, ngImport: i0, template: "<div class=\"community-manage-post\">\n <section class=\"community-manage-post__header\">\n <div>\n <h2>{{ postId() ? 'Edit post' : 'Create post' }}</h2>\n <p>Write in markdown, check the preview, then save a durable draft or publish immediately.</p>\n </div>\n\n <div class=\"community-manage-post__actions\">\n <button mat-stroked-button type=\"button\" (click)=\"saveDraft()\" [disabled]=\"savingDraft() || publishing()\">\n <mat-icon>save</mat-icon>\n <span>{{ savingDraft() ? 'Saving...' : 'Save draft' }}</span>\n </button>\n\n <button mat-flat-button color=\"primary\" type=\"button\" (click)=\"publish()\" [disabled]=\"savingDraft() || publishing()\">\n <mat-icon>publish</mat-icon>\n <span>{{ publishing() ? 'Publishing...' : 'Publish' }}</span>\n </button>\n </div>\n </section>\n\n @if (loading()) {\n <div class=\"community-manage-post__state\">Loading post...</div>\n } @else {\n <section class=\"community-manage-post__workspace\">\n <form class=\"community-manage-post__form\" [formGroup]=\"form\">\n <label>\n <span>Title</span>\n <input type=\"text\" formControlName=\"title\" placeholder=\"Write a clear, scannable title\" />\n </label>\n\n <label>\n <span>Slug</span>\n <input type=\"text\" formControlName=\"slug\" placeholder=\"url-ready-post-slug\" />\n </label>\n\n <label>\n <span>Summary</span>\n <textarea rows=\"3\" formControlName=\"summary\" placeholder=\"Short summary shown in cards and previews\"></textarea>\n </label>\n\n <label>\n <span>Tags</span>\n <input type=\"text\" formControlName=\"tags\" placeholder=\"angular, community, design\" />\n </label>\n\n <label>\n <span>Cover image URL</span>\n <input type=\"url\" formControlName=\"coverImage\" placeholder=\"https://...\" />\n </label>\n\n <label>\n <span>Content</span>\n <textarea rows=\"18\" formControlName=\"content\" placeholder=\"# Heading&#10;&#10;Write markdown content here...\"></textarea>\n </label>\n </form>\n\n <aside class=\"community-manage-post__preview\">\n <rolatech-tabs mode=\"background\" [(select)]=\"editorTab\">\n <rolatech-tab label=\"Preview\"></rolatech-tab>\n <rolatech-tab label=\"Stats\"></rolatech-tab>\n </rolatech-tabs>\n\n @if (editorTab() === 0) {\n <article class=\"community-manage-post__preview-card\">\n <h3>{{ form.controls.title.value || 'Untitled post' }}</h3>\n <p>{{ form.controls.summary.value || 'Add a summary so cards and detail pages have useful context.' }}</p>\n <div class=\"community-manage-post__preview-content markdown-body\" [innerHTML]=\"preview().html\"></div>\n </article>\n } @else {\n <article class=\"community-manage-post__stats-card\">\n <div>\n <span class=\"community-manage-post__stat-label\">Words</span>\n <strong>{{ preview().wordCount }}</strong>\n </div>\n <div>\n <span class=\"community-manage-post__stat-label\">Reading time</span>\n <strong>{{ preview().readingTimeMinutes }} min</strong>\n </div>\n <div>\n <span class=\"community-manage-post__stat-label\">Slug</span>\n <strong>{{ form.controls.slug.value || 'Generated on save' }}</strong>\n </div>\n </article>\n }\n </aside>\n </section>\n }\n</div>\n", styles: [".community-manage-post{display:grid;gap:1.25rem}.community-manage-post__header,.community-manage-post__workspace,.community-manage-post__state,.community-manage-post__preview-card,.community-manage-post__stats-card{border:1px solid var(--community-border);border-radius:24px;background:var(--community-surface-strong);box-shadow:var(--community-shadow)}.community-manage-post__header{display:flex;justify-content:space-between;gap:1rem;align-items:center;padding:1.1rem 1.2rem}.community-manage-post__header h2{margin:0;font-size:1.55rem}.community-manage-post__header p{margin:.4rem 0 0;color:var(--community-muted)}.community-manage-post__actions{display:flex;gap:.75rem;flex-wrap:wrap}.community-manage-post__workspace{display:grid;grid-template-columns:minmax(0,1.2fr) minmax(20rem,.8fr);gap:1.25rem;padding:1.2rem}.community-manage-post__form{display:grid;gap:.95rem}.community-manage-post__form label{display:grid;gap:.4rem;color:var(--community-muted);font-size:.92rem}.community-manage-post__form input,.community-manage-post__form textarea{width:100%;border:1px solid var(--community-border);border-radius:16px;background:transparent;color:var(--community-text);padding:.85rem 1rem;resize:vertical;outline:none}.community-manage-post__preview{display:grid;gap:.9rem}.community-manage-post__preview-card,.community-manage-post__stats-card{padding:1.1rem 1.2rem}.community-manage-post__preview-card h3{margin:0;font-size:1.45rem}.community-manage-post__preview-card p{margin:.8rem 0 1rem;color:var(--community-muted);line-height:1.7}.community-manage-post__preview-content{max-height:34rem;overflow:auto}.community-manage-post__stats-card{display:grid;gap:1rem}.community-manage-post__stats-card div{display:grid;gap:.25rem}.community-manage-post__stat-label{color:var(--community-muted);font-size:.9rem}.community-manage-post__state{padding:2rem}@media(max-width:980px){.community-manage-post__header{flex-direction:column;align-items:stretch}.community-manage-post__workspace{grid-template-columns:1fr}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: TabsComponent, selector: "rolatech-tabs", inputs: ["select", "loading", "block", "mode"], outputs: ["selectChange"] }, { kind: "component", type: TabComponent, selector: "rolatech-tab", inputs: ["label"], outputs: ["selectRequested"] }] }); }
130
130
  }
131
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: CommunityManagePostComponent, decorators: [{
131
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: CommunityManagePostComponent, decorators: [{
132
132
  type: Component,
133
133
  args: [{ selector: 'rolatech-community-manage-post', imports: [CommonModule, ReactiveFormsModule, MatButtonModule, MatIconModule, TabsComponent, TabComponent], template: "<div class=\"community-manage-post\">\n <section class=\"community-manage-post__header\">\n <div>\n <h2>{{ postId() ? 'Edit post' : 'Create post' }}</h2>\n <p>Write in markdown, check the preview, then save a durable draft or publish immediately.</p>\n </div>\n\n <div class=\"community-manage-post__actions\">\n <button mat-stroked-button type=\"button\" (click)=\"saveDraft()\" [disabled]=\"savingDraft() || publishing()\">\n <mat-icon>save</mat-icon>\n <span>{{ savingDraft() ? 'Saving...' : 'Save draft' }}</span>\n </button>\n\n <button mat-flat-button color=\"primary\" type=\"button\" (click)=\"publish()\" [disabled]=\"savingDraft() || publishing()\">\n <mat-icon>publish</mat-icon>\n <span>{{ publishing() ? 'Publishing...' : 'Publish' }}</span>\n </button>\n </div>\n </section>\n\n @if (loading()) {\n <div class=\"community-manage-post__state\">Loading post...</div>\n } @else {\n <section class=\"community-manage-post__workspace\">\n <form class=\"community-manage-post__form\" [formGroup]=\"form\">\n <label>\n <span>Title</span>\n <input type=\"text\" formControlName=\"title\" placeholder=\"Write a clear, scannable title\" />\n </label>\n\n <label>\n <span>Slug</span>\n <input type=\"text\" formControlName=\"slug\" placeholder=\"url-ready-post-slug\" />\n </label>\n\n <label>\n <span>Summary</span>\n <textarea rows=\"3\" formControlName=\"summary\" placeholder=\"Short summary shown in cards and previews\"></textarea>\n </label>\n\n <label>\n <span>Tags</span>\n <input type=\"text\" formControlName=\"tags\" placeholder=\"angular, community, design\" />\n </label>\n\n <label>\n <span>Cover image URL</span>\n <input type=\"url\" formControlName=\"coverImage\" placeholder=\"https://...\" />\n </label>\n\n <label>\n <span>Content</span>\n <textarea rows=\"18\" formControlName=\"content\" placeholder=\"# Heading&#10;&#10;Write markdown content here...\"></textarea>\n </label>\n </form>\n\n <aside class=\"community-manage-post__preview\">\n <rolatech-tabs mode=\"background\" [(select)]=\"editorTab\">\n <rolatech-tab label=\"Preview\"></rolatech-tab>\n <rolatech-tab label=\"Stats\"></rolatech-tab>\n </rolatech-tabs>\n\n @if (editorTab() === 0) {\n <article class=\"community-manage-post__preview-card\">\n <h3>{{ form.controls.title.value || 'Untitled post' }}</h3>\n <p>{{ form.controls.summary.value || 'Add a summary so cards and detail pages have useful context.' }}</p>\n <div class=\"community-manage-post__preview-content markdown-body\" [innerHTML]=\"preview().html\"></div>\n </article>\n } @else {\n <article class=\"community-manage-post__stats-card\">\n <div>\n <span class=\"community-manage-post__stat-label\">Words</span>\n <strong>{{ preview().wordCount }}</strong>\n </div>\n <div>\n <span class=\"community-manage-post__stat-label\">Reading time</span>\n <strong>{{ preview().readingTimeMinutes }} min</strong>\n </div>\n <div>\n <span class=\"community-manage-post__stat-label\">Slug</span>\n <strong>{{ form.controls.slug.value || 'Generated on save' }}</strong>\n </div>\n </article>\n }\n </aside>\n </section>\n }\n</div>\n", styles: [".community-manage-post{display:grid;gap:1.25rem}.community-manage-post__header,.community-manage-post__workspace,.community-manage-post__state,.community-manage-post__preview-card,.community-manage-post__stats-card{border:1px solid var(--community-border);border-radius:24px;background:var(--community-surface-strong);box-shadow:var(--community-shadow)}.community-manage-post__header{display:flex;justify-content:space-between;gap:1rem;align-items:center;padding:1.1rem 1.2rem}.community-manage-post__header h2{margin:0;font-size:1.55rem}.community-manage-post__header p{margin:.4rem 0 0;color:var(--community-muted)}.community-manage-post__actions{display:flex;gap:.75rem;flex-wrap:wrap}.community-manage-post__workspace{display:grid;grid-template-columns:minmax(0,1.2fr) minmax(20rem,.8fr);gap:1.25rem;padding:1.2rem}.community-manage-post__form{display:grid;gap:.95rem}.community-manage-post__form label{display:grid;gap:.4rem;color:var(--community-muted);font-size:.92rem}.community-manage-post__form input,.community-manage-post__form textarea{width:100%;border:1px solid var(--community-border);border-radius:16px;background:transparent;color:var(--community-text);padding:.85rem 1rem;resize:vertical;outline:none}.community-manage-post__preview{display:grid;gap:.9rem}.community-manage-post__preview-card,.community-manage-post__stats-card{padding:1.1rem 1.2rem}.community-manage-post__preview-card h3{margin:0;font-size:1.45rem}.community-manage-post__preview-card p{margin:.8rem 0 1rem;color:var(--community-muted);line-height:1.7}.community-manage-post__preview-content{max-height:34rem;overflow:auto}.community-manage-post__stats-card{display:grid;gap:1rem}.community-manage-post__stats-card div{display:grid;gap:.25rem}.community-manage-post__stat-label{color:var(--community-muted);font-size:.9rem}.community-manage-post__state{padding:2rem}@media(max-width:980px){.community-manage-post__header{flex-direction:column;align-items:stretch}.community-manage-post__workspace{grid-template-columns:1fr}}\n"] }]
134
134
  }], ctorParameters: () => [], propDecorators: { editorTab: [{ type: i0.Input, args: [{ isSignal: true, alias: "editorTab", required: false }] }, { type: i0.Output, args: ["editorTabChange"] }] } });
135
135
 
136
136
  export { CommunityManagePostComponent };
137
- //# sourceMappingURL=rolatech-angular-community-community-manage-post.component-DVRDQzXA.mjs.map
137
+ //# sourceMappingURL=rolatech-angular-community-community-manage-post.component-CtS6PHFY.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"rolatech-angular-community-community-manage-post.component-DVRDQzXA.mjs","sources":["../../../../packages/angular-community/src/lib/pages/community-manage/community-manage-post/community-manage-post.component.ts","../../../../packages/angular-community/src/lib/pages/community-manage/community-manage-post/community-manage-post.component.html"],"sourcesContent":["import { CommonModule } from '@angular/common';\nimport { Component, computed, inject, model, signal } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { FormBuilder, ReactiveFormsModule, Validators } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { TabComponent, TabsComponent } from '@rolatech/angular-components';\nimport { SavePostRequest, SnackBarService, TitleService } from '@rolatech/angular-services';\nimport { CommunityPostStoreService } from '../../../services/community-post-store.service';\nimport { createPostPreview, toTagInput } from '../../../utils/post-view.util';\nimport { startWith } from 'rxjs';\n\n@Component({\n selector: 'rolatech-community-manage-post',\n imports: [CommonModule, ReactiveFormsModule, MatButtonModule, MatIconModule, TabsComponent, TabComponent],\n templateUrl: './community-manage-post.component.html',\n styleUrl: './community-manage-post.component.scss',\n})\nexport class CommunityManagePostComponent {\n private readonly formBuilder = inject(FormBuilder);\n private readonly route = inject(ActivatedRoute);\n private readonly router = inject(Router);\n private readonly postStore = inject(CommunityPostStoreService);\n private readonly snackBar = inject(SnackBarService);\n private readonly titleService = inject(TitleService);\n\n readonly editorTab = model(0);\n readonly loading = signal(false);\n readonly savingDraft = signal(false);\n readonly publishing = signal(false);\n readonly postId = signal<string | null>(this.route.snapshot.paramMap.get('id'));\n\n readonly form = this.formBuilder.nonNullable.group({\n title: ['', [Validators.required, Validators.minLength(4)]],\n slug: [''],\n summary: [''],\n tags: [''],\n coverImage: [''],\n content: ['', [Validators.required, Validators.minLength(20)]],\n });\n\n private readonly formValue = toSignal(this.form.valueChanges.pipe(startWith(this.form.getRawValue())), {\n initialValue: this.form.getRawValue(),\n });\n\n readonly preview = computed(() => createPostPreview(this.formValue().content ?? ''));\n readonly canSubmit = computed(\n () => (this.formValue().title?.trim().length ?? 0) >= 4 && (this.formValue().content?.trim().length ?? 0) >= 20,\n );\n\n constructor() {\n this.titleService.setTitle(this.postId() ? 'Edit post | Community' : 'Write post | Community');\n if (this.postId()) {\n this.loadPost(this.postId() as string);\n }\n }\n\n saveDraft() {\n if (!this.canSubmit()) {\n this.form.markAllAsTouched();\n return;\n }\n\n this.savingDraft.set(true);\n this.postStore.saveDraft({ id: this.postId() ?? undefined, ...this.payload() }).subscribe({\n next: (post) => {\n this.postId.set(post.id);\n this.form.patchValue({ slug: post.slug ?? '', tags: toTagInput(post.tags) }, { emitEvent: false });\n this.savingDraft.set(false);\n this.snackBar.open('Draft saved');\n this.navigateToEditor(post.id);\n },\n error: () => {\n this.savingDraft.set(false);\n },\n });\n }\n\n publish() {\n if (!this.canSubmit()) {\n this.form.markAllAsTouched();\n return;\n }\n\n this.publishing.set(true);\n this.postStore.publish({ id: this.postId() ?? undefined, ...this.payload() }).subscribe({\n next: (post) => {\n this.postId.set(post.id);\n this.publishing.set(false);\n this.snackBar.open('Post published');\n this.navigateToPreview(post.id);\n },\n error: () => {\n this.publishing.set(false);\n },\n });\n }\n\n private loadPost(id: string) {\n this.loading.set(true);\n this.postStore.getManagePost(id).subscribe({\n next: (post) => {\n if (post) {\n this.form.patchValue({\n title: post.title,\n slug: post.slug ?? '',\n summary: post.summary ?? post.excerpt ?? '',\n tags: toTagInput(post.tags),\n coverImage: post.coverImage ?? post.cover ?? '',\n content: post.content,\n });\n }\n\n this.loading.set(false);\n },\n error: () => {\n this.loading.set(false);\n },\n });\n }\n\n private payload(): SavePostRequest {\n const value = this.form.getRawValue();\n return {\n title: value.title,\n slug: value.slug,\n summary: value.summary,\n coverImage: value.coverImage,\n tags: value.tags\n .split(',')\n .map((tag) => tag.trim())\n .filter(Boolean),\n content: value.content,\n };\n }\n\n private navigateToEditor(id: string) {\n const parent = this.route.parent ?? this.route;\n this.router.navigate(['manage', id, 'edit'], { relativeTo: parent });\n }\n\n private navigateToPreview(id: string) {\n const parent = this.route.parent ?? this.route;\n this.router.navigate(['manage', id], { relativeTo: parent });\n }\n}\n","<div class=\"community-manage-post\">\n <section class=\"community-manage-post__header\">\n <div>\n <h2>{{ postId() ? 'Edit post' : 'Create post' }}</h2>\n <p>Write in markdown, check the preview, then save a durable draft or publish immediately.</p>\n </div>\n\n <div class=\"community-manage-post__actions\">\n <button mat-stroked-button type=\"button\" (click)=\"saveDraft()\" [disabled]=\"savingDraft() || publishing()\">\n <mat-icon>save</mat-icon>\n <span>{{ savingDraft() ? 'Saving...' : 'Save draft' }}</span>\n </button>\n\n <button mat-flat-button color=\"primary\" type=\"button\" (click)=\"publish()\" [disabled]=\"savingDraft() || publishing()\">\n <mat-icon>publish</mat-icon>\n <span>{{ publishing() ? 'Publishing...' : 'Publish' }}</span>\n </button>\n </div>\n </section>\n\n @if (loading()) {\n <div class=\"community-manage-post__state\">Loading post...</div>\n } @else {\n <section class=\"community-manage-post__workspace\">\n <form class=\"community-manage-post__form\" [formGroup]=\"form\">\n <label>\n <span>Title</span>\n <input type=\"text\" formControlName=\"title\" placeholder=\"Write a clear, scannable title\" />\n </label>\n\n <label>\n <span>Slug</span>\n <input type=\"text\" formControlName=\"slug\" placeholder=\"url-ready-post-slug\" />\n </label>\n\n <label>\n <span>Summary</span>\n <textarea rows=\"3\" formControlName=\"summary\" placeholder=\"Short summary shown in cards and previews\"></textarea>\n </label>\n\n <label>\n <span>Tags</span>\n <input type=\"text\" formControlName=\"tags\" placeholder=\"angular, community, design\" />\n </label>\n\n <label>\n <span>Cover image URL</span>\n <input type=\"url\" formControlName=\"coverImage\" placeholder=\"https://...\" />\n </label>\n\n <label>\n <span>Content</span>\n <textarea rows=\"18\" formControlName=\"content\" placeholder=\"# Heading&#10;&#10;Write markdown content here...\"></textarea>\n </label>\n </form>\n\n <aside class=\"community-manage-post__preview\">\n <rolatech-tabs mode=\"background\" [(select)]=\"editorTab\">\n <rolatech-tab label=\"Preview\"></rolatech-tab>\n <rolatech-tab label=\"Stats\"></rolatech-tab>\n </rolatech-tabs>\n\n @if (editorTab() === 0) {\n <article class=\"community-manage-post__preview-card\">\n <h3>{{ form.controls.title.value || 'Untitled post' }}</h3>\n <p>{{ form.controls.summary.value || 'Add a summary so cards and detail pages have useful context.' }}</p>\n <div class=\"community-manage-post__preview-content markdown-body\" [innerHTML]=\"preview().html\"></div>\n </article>\n } @else {\n <article class=\"community-manage-post__stats-card\">\n <div>\n <span class=\"community-manage-post__stat-label\">Words</span>\n <strong>{{ preview().wordCount }}</strong>\n </div>\n <div>\n <span class=\"community-manage-post__stat-label\">Reading time</span>\n <strong>{{ preview().readingTimeMinutes }} min</strong>\n </div>\n <div>\n <span class=\"community-manage-post__stat-label\">Slug</span>\n <strong>{{ form.controls.slug.value || 'Generated on save' }}</strong>\n </div>\n </article>\n }\n </aside>\n </section>\n }\n</div>\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rolatech-angular-community-community-manage-post.component-CtS6PHFY.mjs","sources":["../../../../packages/angular-community/src/lib/pages/community-manage/community-manage-post/community-manage-post.component.ts","../../../../packages/angular-community/src/lib/pages/community-manage/community-manage-post/community-manage-post.component.html"],"sourcesContent":["import { CommonModule } from '@angular/common';\nimport { Component, computed, inject, model, signal } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { FormBuilder, ReactiveFormsModule, Validators } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { TabComponent, TabsComponent } from '@rolatech/angular-components';\nimport { SavePostRequest, SnackBarService, TitleService } from '@rolatech/angular-services';\nimport { CommunityPostStoreService } from '../../../services/community-post-store.service';\nimport { createPostPreview, toTagInput } from '../../../utils/post-view.util';\nimport { startWith } from 'rxjs';\n\n@Component({\n selector: 'rolatech-community-manage-post',\n imports: [CommonModule, ReactiveFormsModule, MatButtonModule, MatIconModule, TabsComponent, TabComponent],\n templateUrl: './community-manage-post.component.html',\n styleUrl: './community-manage-post.component.scss',\n})\nexport class CommunityManagePostComponent {\n private readonly formBuilder = inject(FormBuilder);\n private readonly route = inject(ActivatedRoute);\n private readonly router = inject(Router);\n private readonly postStore = inject(CommunityPostStoreService);\n private readonly snackBar = inject(SnackBarService);\n private readonly titleService = inject(TitleService);\n\n readonly editorTab = model(0);\n readonly loading = signal(false);\n readonly savingDraft = signal(false);\n readonly publishing = signal(false);\n readonly postId = signal<string | null>(this.route.snapshot.paramMap.get('id'));\n\n readonly form = this.formBuilder.nonNullable.group({\n title: ['', [Validators.required, Validators.minLength(4)]],\n slug: [''],\n summary: [''],\n tags: [''],\n coverImage: [''],\n content: ['', [Validators.required, Validators.minLength(20)]],\n });\n\n private readonly formValue = toSignal(this.form.valueChanges.pipe(startWith(this.form.getRawValue())), {\n initialValue: this.form.getRawValue(),\n });\n\n readonly preview = computed(() => createPostPreview(this.formValue().content ?? ''));\n readonly canSubmit = computed(\n () => (this.formValue().title?.trim().length ?? 0) >= 4 && (this.formValue().content?.trim().length ?? 0) >= 20,\n );\n\n constructor() {\n this.titleService.setTitle(this.postId() ? 'Edit post | Community' : 'Write post | Community');\n if (this.postId()) {\n this.loadPost(this.postId() as string);\n }\n }\n\n saveDraft() {\n if (!this.canSubmit()) {\n this.form.markAllAsTouched();\n return;\n }\n\n this.savingDraft.set(true);\n this.postStore.saveDraft({ id: this.postId() ?? undefined, ...this.payload() }).subscribe({\n next: (post) => {\n this.postId.set(post.id);\n this.form.patchValue({ slug: post.slug ?? '', tags: toTagInput(post.tags) }, { emitEvent: false });\n this.savingDraft.set(false);\n this.snackBar.open('Draft saved');\n this.navigateToEditor(post.id);\n },\n error: () => {\n this.savingDraft.set(false);\n },\n });\n }\n\n publish() {\n if (!this.canSubmit()) {\n this.form.markAllAsTouched();\n return;\n }\n\n this.publishing.set(true);\n this.postStore.publish({ id: this.postId() ?? undefined, ...this.payload() }).subscribe({\n next: (post) => {\n this.postId.set(post.id);\n this.publishing.set(false);\n this.snackBar.open('Post published');\n this.navigateToPreview(post.id);\n },\n error: () => {\n this.publishing.set(false);\n },\n });\n }\n\n private loadPost(id: string) {\n this.loading.set(true);\n this.postStore.getManagePost(id).subscribe({\n next: (post) => {\n if (post) {\n this.form.patchValue({\n title: post.title,\n slug: post.slug ?? '',\n summary: post.summary ?? post.excerpt ?? '',\n tags: toTagInput(post.tags),\n coverImage: post.coverImage ?? post.cover ?? '',\n content: post.content,\n });\n }\n\n this.loading.set(false);\n },\n error: () => {\n this.loading.set(false);\n },\n });\n }\n\n private payload(): SavePostRequest {\n const value = this.form.getRawValue();\n return {\n title: value.title,\n slug: value.slug,\n summary: value.summary,\n coverImage: value.coverImage,\n tags: value.tags\n .split(',')\n .map((tag) => tag.trim())\n .filter(Boolean),\n content: value.content,\n };\n }\n\n private navigateToEditor(id: string) {\n const parent = this.route.parent ?? this.route;\n this.router.navigate(['manage', id, 'edit'], { relativeTo: parent });\n }\n\n private navigateToPreview(id: string) {\n const parent = this.route.parent ?? this.route;\n this.router.navigate(['manage', id], { relativeTo: parent });\n }\n}\n","<div class=\"community-manage-post\">\n <section class=\"community-manage-post__header\">\n <div>\n <h2>{{ postId() ? 'Edit post' : 'Create post' }}</h2>\n <p>Write in markdown, check the preview, then save a durable draft or publish immediately.</p>\n </div>\n\n <div class=\"community-manage-post__actions\">\n <button mat-stroked-button type=\"button\" (click)=\"saveDraft()\" [disabled]=\"savingDraft() || publishing()\">\n <mat-icon>save</mat-icon>\n <span>{{ savingDraft() ? 'Saving...' : 'Save draft' }}</span>\n </button>\n\n <button mat-flat-button color=\"primary\" type=\"button\" (click)=\"publish()\" [disabled]=\"savingDraft() || publishing()\">\n <mat-icon>publish</mat-icon>\n <span>{{ publishing() ? 'Publishing...' : 'Publish' }}</span>\n </button>\n </div>\n </section>\n\n @if (loading()) {\n <div class=\"community-manage-post__state\">Loading post...</div>\n } @else {\n <section class=\"community-manage-post__workspace\">\n <form class=\"community-manage-post__form\" [formGroup]=\"form\">\n <label>\n <span>Title</span>\n <input type=\"text\" formControlName=\"title\" placeholder=\"Write a clear, scannable title\" />\n </label>\n\n <label>\n <span>Slug</span>\n <input type=\"text\" formControlName=\"slug\" placeholder=\"url-ready-post-slug\" />\n </label>\n\n <label>\n <span>Summary</span>\n <textarea rows=\"3\" formControlName=\"summary\" placeholder=\"Short summary shown in cards and previews\"></textarea>\n </label>\n\n <label>\n <span>Tags</span>\n <input type=\"text\" formControlName=\"tags\" placeholder=\"angular, community, design\" />\n </label>\n\n <label>\n <span>Cover image URL</span>\n <input type=\"url\" formControlName=\"coverImage\" placeholder=\"https://...\" />\n </label>\n\n <label>\n <span>Content</span>\n <textarea rows=\"18\" formControlName=\"content\" placeholder=\"# Heading&#10;&#10;Write markdown content here...\"></textarea>\n </label>\n </form>\n\n <aside class=\"community-manage-post__preview\">\n <rolatech-tabs mode=\"background\" [(select)]=\"editorTab\">\n <rolatech-tab label=\"Preview\"></rolatech-tab>\n <rolatech-tab label=\"Stats\"></rolatech-tab>\n </rolatech-tabs>\n\n @if (editorTab() === 0) {\n <article class=\"community-manage-post__preview-card\">\n <h3>{{ form.controls.title.value || 'Untitled post' }}</h3>\n <p>{{ form.controls.summary.value || 'Add a summary so cards and detail pages have useful context.' }}</p>\n <div class=\"community-manage-post__preview-content markdown-body\" [innerHTML]=\"preview().html\"></div>\n </article>\n } @else {\n <article class=\"community-manage-post__stats-card\">\n <div>\n <span class=\"community-manage-post__stat-label\">Words</span>\n <strong>{{ preview().wordCount }}</strong>\n </div>\n <div>\n <span class=\"community-manage-post__stat-label\">Reading time</span>\n <strong>{{ preview().readingTimeMinutes }} min</strong>\n </div>\n <div>\n <span class=\"community-manage-post__stat-label\">Slug</span>\n <strong>{{ form.controls.slug.value || 'Generated on save' }}</strong>\n </div>\n </article>\n }\n </aside>\n </section>\n }\n</div>\n"],"names":[],"mappings":"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"}
@@ -19,8 +19,8 @@ class CommunityLayoutComponent {
19
19
  this.themeService = inject(ThemeService);
20
20
  this.titleService = inject(TitleService);
21
21
  this.themeStorageKey = 'rolatech-community-theme';
22
- this.navIndex = model(0, ...(ngDevMode ? [{ debugName: "navIndex" }] : []));
23
- this.theme = signal('light', ...(ngDevMode ? [{ debugName: "theme" }] : []));
22
+ this.navIndex = model(0, ...(ngDevMode ? [{ debugName: "navIndex" }] : /* istanbul ignore next */ []));
23
+ this.theme = signal('light', ...(ngDevMode ? [{ debugName: "theme" }] : /* istanbul ignore next */ []));
24
24
  this.titleService.setTitle('Community');
25
25
  this.syncTheme();
26
26
  this.updateNavIndex(this.router.url);
@@ -61,10 +61,10 @@ class CommunityLayoutComponent {
61
61
  }
62
62
  this.navIndex.set(0);
63
63
  }
64
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: CommunityLayoutComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
65
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.1", type: CommunityLayoutComponent, isStandalone: true, selector: "rolatech-community-layout", inputs: { navIndex: { classPropertyName: "navIndex", publicName: "navIndex", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { navIndex: "navIndexChange" }, ngImport: i0, template: "<div class=\"community-shell\" [attr.data-theme]=\"theme()\">\n <div class=\"community-shell__orb community-shell__orb--primary\"></div>\n <div class=\"community-shell__orb community-shell__orb--secondary\"></div>\n\n <header class=\"community-shell__header\">\n <div class=\"community-shell__brand\">\n <div class=\"community-shell__eyebrow\">RolaTech Community</div>\n <h1>Shipping notes, drafts, and previews in one place.</h1>\n <p>\n Explore published posts, keep draft work moving, and switch between editor and preview without leaving the route\n tree.\n </p>\n </div>\n\n <button mat-stroked-button type=\"button\" class=\"community-shell__theme-button\" (click)=\"toggleTheme()\">\n <mat-icon>{{ theme() === 'dark' ? 'light_mode' : 'dark_mode' }}</mat-icon>\n <span>{{ theme() === 'dark' ? 'Light theme' : 'Dark theme' }}</span>\n </button>\n </header>\n\n <section class=\"community-shell__hero\">\n <div class=\"community-shell__hero-copy\">\n <span class=\"community-shell__pill\">Automatic routes</span>\n <span class=\"community-shell__pill\">Draft-safe workflow</span>\n <span class=\"community-shell__pill\">Markdown preview</span>\n </div>\n\n <div class=\"community-shell__hero-card\">\n <div class=\"community-shell__metric\">\n <span class=\"community-shell__metric-value\">3</span>\n <span class=\"community-shell__metric-label\">Primary routes wired in-package</span>\n </div>\n <div class=\"community-shell__metric\">\n <span class=\"community-shell__metric-value\">2</span>\n <span class=\"community-shell__metric-label\">Tab appearances from `angular-components`</span>\n </div>\n </div>\n </section>\n\n <rolatech-tabs mode=\"background\" [(select)]=\"navIndex\">\n <rolatech-tab class=\"cursor-pointer\" label=\"Explore\" [routerLink]=\"['./']\"></rolatech-tab>\n <rolatech-tab class=\"cursor-pointer\" label=\"Manage\" [routerLink]=\"['./manage']\"></rolatech-tab>\n <rolatech-tab class=\"cursor-pointer\" label=\"Write\" [routerLink]=\"['./manage/create']\"></rolatech-tab>\n </rolatech-tabs>\n\n <section class=\"community-shell__content\">\n <router-outlet></router-outlet>\n </section>\n</div>\n", styles: [":host{display:block;min-height:100dvh}.community-shell{--community-background: linear-gradient(180deg, #f8fafc 0%, #eef2ff 42%, #f8fafc 100%);--community-surface: rgba(255, 255, 255, .82);--community-surface-strong: rgba(255, 255, 255, .94);--community-border: rgba(148, 163, 184, .22);--community-text: #0f172a;--community-muted: #475569;--community-shadow: 0 24px 80px rgba(15, 23, 42, .08);min-height:100dvh;padding:clamp(1.25rem,3vw,2.5rem);background:var(--community-background);color:var(--community-text);position:relative;overflow:hidden}.community-shell[data-theme=dark]{--community-background: radial-gradient(circle at top, rgba(59, 130, 246, .16), transparent 34%), linear-gradient(180deg, #020617 0%, #0f172a 46%, #020617 100%);--community-surface: rgba(15, 23, 42, .72);--community-surface-strong: rgba(15, 23, 42, .92);--community-border: rgba(148, 163, 184, .18);--community-text: #e2e8f0;--community-muted: #94a3b8;--community-shadow: 0 24px 80px rgba(2, 6, 23, .42)}.community-shell__orb{position:absolute;border-radius:999px;filter:blur(40px);pointer-events:none}.community-shell__orb--primary{top:-2rem;right:-3rem;width:18rem;height:18rem;background:#0ea5e938}.community-shell__orb--secondary{left:-4rem;bottom:12rem;width:20rem;height:20rem;background:#3b82f62e}.community-shell__header,.community-shell__hero,.community-shell__content,rolatech-tabs{position:relative;z-index:1}.community-shell__header{display:flex;justify-content:space-between;align-items:flex-start;gap:1.5rem;margin-bottom:1.5rem}.community-shell__brand{max-width:42rem}.community-shell__eyebrow{margin-bottom:.6rem;font-size:.8rem;font-weight:700;letter-spacing:.16em;text-transform:uppercase;color:#0284c7}.community-shell__brand h1{margin:0;font-size:clamp(2rem,5vw,3.5rem);line-height:.98;letter-spacing:-.04em}.community-shell__brand p{margin:1rem 0 0;max-width:36rem;color:var(--community-muted);line-height:1.7}.community-shell__theme-button{flex:0 0 auto;border-color:var(--community-border)!important;color:var(--community-text)!important;background:var(--community-surface)!important;-webkit-backdrop-filter:blur(18px);backdrop-filter:blur(18px)}.community-shell__theme-button mat-icon{margin-right:.35rem}.community-shell__hero{display:grid;grid-template-columns:minmax(0,1.7fr) minmax(18rem,1fr);gap:1.25rem;margin-bottom:1.5rem}.community-shell__hero-copy,.community-shell__hero-card,.community-shell__content{border:1px solid var(--community-border);background:var(--community-surface);box-shadow:var(--community-shadow);-webkit-backdrop-filter:blur(18px);backdrop-filter:blur(18px)}.community-shell__hero-copy{display:flex;flex-wrap:wrap;gap:.75rem;align-content:start;padding:1rem;border-radius:24px}.community-shell__pill{display:inline-flex;align-items:center;min-height:2.25rem;padding:0 .9rem;border-radius:999px;background:#0ea5e91f;color:#0369a1;font-size:.92rem;font-weight:600}.community-shell[data-theme=dark] .community-shell__pill{background:#0ea5e92e;color:#bae6fd}.community-shell__hero-card{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:1rem;padding:1.1rem;border-radius:24px}.community-shell__metric{display:grid;gap:.35rem}.community-shell__metric-value{font-size:2rem;font-weight:700;letter-spacing:-.04em}.community-shell__metric-label{color:var(--community-muted);line-height:1.5}.community-shell :is(rolatech-tabs){--rt-tabs-surface: rgba(148, 163, 184, .12);--rt-tab-selected-background: #0284c7;--rt-tab-hover-background-color: rgba(148, 163, 184, .12);margin-bottom:1.5rem}.community-shell__content{border-radius:32px;padding:clamp(1rem,2vw,1.5rem)}@media(max-width:840px){.community-shell__header,.community-shell__hero{grid-template-columns:1fr;display:grid}.community-shell__theme-button{width:fit-content}.community-shell__hero-card{grid-template-columns:1fr}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: RouterOutlet, selector: "router-outlet", inputs: ["name", "routerOutletData"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }, { kind: "component", type: TabsComponent, selector: "rolatech-tabs", inputs: ["select", "loading", "block", "mode"], outputs: ["selectChange"] }, { kind: "component", type: TabComponent, selector: "rolatech-tab", inputs: ["label"], outputs: ["selectRequested"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }] }); }
64
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: CommunityLayoutComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
65
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.5", type: CommunityLayoutComponent, isStandalone: true, selector: "rolatech-community-layout", inputs: { navIndex: { classPropertyName: "navIndex", publicName: "navIndex", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { navIndex: "navIndexChange" }, ngImport: i0, template: "<div class=\"community-shell\" [attr.data-theme]=\"theme()\">\n <div class=\"community-shell__orb community-shell__orb--primary\"></div>\n <div class=\"community-shell__orb community-shell__orb--secondary\"></div>\n\n <header class=\"community-shell__header\">\n <div class=\"community-shell__brand\">\n <div class=\"community-shell__eyebrow\">RolaTech Community</div>\n <h1>Shipping notes, drafts, and previews in one place.</h1>\n <p>\n Explore published posts, keep draft work moving, and switch between editor and preview without leaving the route\n tree.\n </p>\n </div>\n\n <button mat-stroked-button type=\"button\" class=\"community-shell__theme-button\" (click)=\"toggleTheme()\">\n <mat-icon>{{ theme() === 'dark' ? 'light_mode' : 'dark_mode' }}</mat-icon>\n <span>{{ theme() === 'dark' ? 'Light theme' : 'Dark theme' }}</span>\n </button>\n </header>\n\n <section class=\"community-shell__hero\">\n <div class=\"community-shell__hero-copy\">\n <span class=\"community-shell__pill\">Automatic routes</span>\n <span class=\"community-shell__pill\">Draft-safe workflow</span>\n <span class=\"community-shell__pill\">Markdown preview</span>\n </div>\n\n <div class=\"community-shell__hero-card\">\n <div class=\"community-shell__metric\">\n <span class=\"community-shell__metric-value\">3</span>\n <span class=\"community-shell__metric-label\">Primary routes wired in-package</span>\n </div>\n <div class=\"community-shell__metric\">\n <span class=\"community-shell__metric-value\">2</span>\n <span class=\"community-shell__metric-label\">Tab appearances from `angular-components`</span>\n </div>\n </div>\n </section>\n\n <rolatech-tabs mode=\"background\" [(select)]=\"navIndex\">\n <rolatech-tab class=\"cursor-pointer\" label=\"Explore\" [routerLink]=\"['./']\"></rolatech-tab>\n <rolatech-tab class=\"cursor-pointer\" label=\"Manage\" [routerLink]=\"['./manage']\"></rolatech-tab>\n <rolatech-tab class=\"cursor-pointer\" label=\"Write\" [routerLink]=\"['./manage/create']\"></rolatech-tab>\n </rolatech-tabs>\n\n <section class=\"community-shell__content\">\n <router-outlet></router-outlet>\n </section>\n</div>\n", styles: [":host{display:block;min-height:100dvh}.community-shell{--community-background: linear-gradient(180deg, #f8fafc 0%, #eef2ff 42%, #f8fafc 100%);--community-surface: rgba(255, 255, 255, .82);--community-surface-strong: rgba(255, 255, 255, .94);--community-border: rgba(148, 163, 184, .22);--community-text: #0f172a;--community-muted: #475569;--community-shadow: 0 24px 80px rgba(15, 23, 42, .08);min-height:100dvh;padding:clamp(1.25rem,3vw,2.5rem);background:var(--community-background);color:var(--community-text);position:relative;overflow:hidden}.community-shell[data-theme=dark]{--community-background: radial-gradient(circle at top, rgba(59, 130, 246, .16), transparent 34%), linear-gradient(180deg, #020617 0%, #0f172a 46%, #020617 100%);--community-surface: rgba(15, 23, 42, .72);--community-surface-strong: rgba(15, 23, 42, .92);--community-border: rgba(148, 163, 184, .18);--community-text: #e2e8f0;--community-muted: #94a3b8;--community-shadow: 0 24px 80px rgba(2, 6, 23, .42)}.community-shell__orb{position:absolute;border-radius:999px;filter:blur(40px);pointer-events:none}.community-shell__orb--primary{top:-2rem;right:-3rem;width:18rem;height:18rem;background:#0ea5e938}.community-shell__orb--secondary{left:-4rem;bottom:12rem;width:20rem;height:20rem;background:#3b82f62e}.community-shell__header,.community-shell__hero,.community-shell__content,rolatech-tabs{position:relative;z-index:1}.community-shell__header{display:flex;justify-content:space-between;align-items:flex-start;gap:1.5rem;margin-bottom:1.5rem}.community-shell__brand{max-width:42rem}.community-shell__eyebrow{margin-bottom:.6rem;font-size:.8rem;font-weight:700;letter-spacing:.16em;text-transform:uppercase;color:#0284c7}.community-shell__brand h1{margin:0;font-size:clamp(2rem,5vw,3.5rem);line-height:.98;letter-spacing:-.04em}.community-shell__brand p{margin:1rem 0 0;max-width:36rem;color:var(--community-muted);line-height:1.7}.community-shell__theme-button{flex:0 0 auto;border-color:var(--community-border)!important;color:var(--community-text)!important;background:var(--community-surface)!important;-webkit-backdrop-filter:blur(18px);backdrop-filter:blur(18px)}.community-shell__theme-button mat-icon{margin-right:.35rem}.community-shell__hero{display:grid;grid-template-columns:minmax(0,1.7fr) minmax(18rem,1fr);gap:1.25rem;margin-bottom:1.5rem}.community-shell__hero-copy,.community-shell__hero-card,.community-shell__content{border:1px solid var(--community-border);background:var(--community-surface);box-shadow:var(--community-shadow);-webkit-backdrop-filter:blur(18px);backdrop-filter:blur(18px)}.community-shell__hero-copy{display:flex;flex-wrap:wrap;gap:.75rem;align-content:start;padding:1rem;border-radius:24px}.community-shell__pill{display:inline-flex;align-items:center;min-height:2.25rem;padding:0 .9rem;border-radius:999px;background:#0ea5e91f;color:#0369a1;font-size:.92rem;font-weight:600}.community-shell[data-theme=dark] .community-shell__pill{background:#0ea5e92e;color:#bae6fd}.community-shell__hero-card{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:1rem;padding:1.1rem;border-radius:24px}.community-shell__metric{display:grid;gap:.35rem}.community-shell__metric-value{font-size:2rem;font-weight:700;letter-spacing:-.04em}.community-shell__metric-label{color:var(--community-muted);line-height:1.5}.community-shell :is(rolatech-tabs){--rt-tabs-surface: rgba(148, 163, 184, .12);--rt-tab-selected-background: #0284c7;--rt-tab-hover-background-color: rgba(148, 163, 184, .12);margin-bottom:1.5rem}.community-shell__content{border-radius:32px;padding:clamp(1rem,2vw,1.5rem)}@media(max-width:840px){.community-shell__header,.community-shell__hero{grid-template-columns:1fr;display:grid}.community-shell__theme-button{width:fit-content}.community-shell__hero-card{grid-template-columns:1fr}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: RouterOutlet, selector: "router-outlet", inputs: ["name", "routerOutletData"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }, { kind: "component", type: TabsComponent, selector: "rolatech-tabs", inputs: ["select", "loading", "block", "mode"], outputs: ["selectChange"] }, { kind: "component", type: TabComponent, selector: "rolatech-tab", inputs: ["label"], outputs: ["selectRequested"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }] }); }
66
66
  }
67
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: CommunityLayoutComponent, decorators: [{
67
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: CommunityLayoutComponent, decorators: [{
68
68
  type: Component,
69
69
  args: [{ selector: 'rolatech-community-layout', imports: [CommonModule, RouterLink, RouterOutlet, TabsComponent, TabComponent, MatButtonModule, MatIconModule], template: "<div class=\"community-shell\" [attr.data-theme]=\"theme()\">\n <div class=\"community-shell__orb community-shell__orb--primary\"></div>\n <div class=\"community-shell__orb community-shell__orb--secondary\"></div>\n\n <header class=\"community-shell__header\">\n <div class=\"community-shell__brand\">\n <div class=\"community-shell__eyebrow\">RolaTech Community</div>\n <h1>Shipping notes, drafts, and previews in one place.</h1>\n <p>\n Explore published posts, keep draft work moving, and switch between editor and preview without leaving the route\n tree.\n </p>\n </div>\n\n <button mat-stroked-button type=\"button\" class=\"community-shell__theme-button\" (click)=\"toggleTheme()\">\n <mat-icon>{{ theme() === 'dark' ? 'light_mode' : 'dark_mode' }}</mat-icon>\n <span>{{ theme() === 'dark' ? 'Light theme' : 'Dark theme' }}</span>\n </button>\n </header>\n\n <section class=\"community-shell__hero\">\n <div class=\"community-shell__hero-copy\">\n <span class=\"community-shell__pill\">Automatic routes</span>\n <span class=\"community-shell__pill\">Draft-safe workflow</span>\n <span class=\"community-shell__pill\">Markdown preview</span>\n </div>\n\n <div class=\"community-shell__hero-card\">\n <div class=\"community-shell__metric\">\n <span class=\"community-shell__metric-value\">3</span>\n <span class=\"community-shell__metric-label\">Primary routes wired in-package</span>\n </div>\n <div class=\"community-shell__metric\">\n <span class=\"community-shell__metric-value\">2</span>\n <span class=\"community-shell__metric-label\">Tab appearances from `angular-components`</span>\n </div>\n </div>\n </section>\n\n <rolatech-tabs mode=\"background\" [(select)]=\"navIndex\">\n <rolatech-tab class=\"cursor-pointer\" label=\"Explore\" [routerLink]=\"['./']\"></rolatech-tab>\n <rolatech-tab class=\"cursor-pointer\" label=\"Manage\" [routerLink]=\"['./manage']\"></rolatech-tab>\n <rolatech-tab class=\"cursor-pointer\" label=\"Write\" [routerLink]=\"['./manage/create']\"></rolatech-tab>\n </rolatech-tabs>\n\n <section class=\"community-shell__content\">\n <router-outlet></router-outlet>\n </section>\n</div>\n", styles: [":host{display:block;min-height:100dvh}.community-shell{--community-background: linear-gradient(180deg, #f8fafc 0%, #eef2ff 42%, #f8fafc 100%);--community-surface: rgba(255, 255, 255, .82);--community-surface-strong: rgba(255, 255, 255, .94);--community-border: rgba(148, 163, 184, .22);--community-text: #0f172a;--community-muted: #475569;--community-shadow: 0 24px 80px rgba(15, 23, 42, .08);min-height:100dvh;padding:clamp(1.25rem,3vw,2.5rem);background:var(--community-background);color:var(--community-text);position:relative;overflow:hidden}.community-shell[data-theme=dark]{--community-background: radial-gradient(circle at top, rgba(59, 130, 246, .16), transparent 34%), linear-gradient(180deg, #020617 0%, #0f172a 46%, #020617 100%);--community-surface: rgba(15, 23, 42, .72);--community-surface-strong: rgba(15, 23, 42, .92);--community-border: rgba(148, 163, 184, .18);--community-text: #e2e8f0;--community-muted: #94a3b8;--community-shadow: 0 24px 80px rgba(2, 6, 23, .42)}.community-shell__orb{position:absolute;border-radius:999px;filter:blur(40px);pointer-events:none}.community-shell__orb--primary{top:-2rem;right:-3rem;width:18rem;height:18rem;background:#0ea5e938}.community-shell__orb--secondary{left:-4rem;bottom:12rem;width:20rem;height:20rem;background:#3b82f62e}.community-shell__header,.community-shell__hero,.community-shell__content,rolatech-tabs{position:relative;z-index:1}.community-shell__header{display:flex;justify-content:space-between;align-items:flex-start;gap:1.5rem;margin-bottom:1.5rem}.community-shell__brand{max-width:42rem}.community-shell__eyebrow{margin-bottom:.6rem;font-size:.8rem;font-weight:700;letter-spacing:.16em;text-transform:uppercase;color:#0284c7}.community-shell__brand h1{margin:0;font-size:clamp(2rem,5vw,3.5rem);line-height:.98;letter-spacing:-.04em}.community-shell__brand p{margin:1rem 0 0;max-width:36rem;color:var(--community-muted);line-height:1.7}.community-shell__theme-button{flex:0 0 auto;border-color:var(--community-border)!important;color:var(--community-text)!important;background:var(--community-surface)!important;-webkit-backdrop-filter:blur(18px);backdrop-filter:blur(18px)}.community-shell__theme-button mat-icon{margin-right:.35rem}.community-shell__hero{display:grid;grid-template-columns:minmax(0,1.7fr) minmax(18rem,1fr);gap:1.25rem;margin-bottom:1.5rem}.community-shell__hero-copy,.community-shell__hero-card,.community-shell__content{border:1px solid var(--community-border);background:var(--community-surface);box-shadow:var(--community-shadow);-webkit-backdrop-filter:blur(18px);backdrop-filter:blur(18px)}.community-shell__hero-copy{display:flex;flex-wrap:wrap;gap:.75rem;align-content:start;padding:1rem;border-radius:24px}.community-shell__pill{display:inline-flex;align-items:center;min-height:2.25rem;padding:0 .9rem;border-radius:999px;background:#0ea5e91f;color:#0369a1;font-size:.92rem;font-weight:600}.community-shell[data-theme=dark] .community-shell__pill{background:#0ea5e92e;color:#bae6fd}.community-shell__hero-card{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:1rem;padding:1.1rem;border-radius:24px}.community-shell__metric{display:grid;gap:.35rem}.community-shell__metric-value{font-size:2rem;font-weight:700;letter-spacing:-.04em}.community-shell__metric-label{color:var(--community-muted);line-height:1.5}.community-shell :is(rolatech-tabs){--rt-tabs-surface: rgba(148, 163, 184, .12);--rt-tab-selected-background: #0284c7;--rt-tab-hover-background-color: rgba(148, 163, 184, .12);margin-bottom:1.5rem}.community-shell__content{border-radius:32px;padding:clamp(1rem,2vw,1.5rem)}@media(max-width:840px){.community-shell__header,.community-shell__hero{grid-template-columns:1fr;display:grid}.community-shell__theme-button{width:fit-content}.community-shell__hero-card{grid-template-columns:1fr}}\n"] }]
70
70
  }], ctorParameters: () => [], propDecorators: { navIndex: [{ type: i0.Input, args: [{ isSignal: true, alias: "navIndex", required: false }] }, { type: i0.Output, args: ["navIndexChange"] }] } });
@@ -76,32 +76,32 @@ const communityAppRoutes = [
76
76
  children: [
77
77
  {
78
78
  path: '',
79
- loadComponent: () => import('./rolatech-angular-community-community-index.component-CJ_ddZSo.mjs').then((x) => x.CommunityIndexComponent),
79
+ loadComponent: () => import('./rolatech-angular-community-community-index.component-BNGz0UYa.mjs').then((x) => x.CommunityIndexComponent),
80
80
  data: { title: 'Community' },
81
81
  },
82
82
  {
83
83
  path: 'manage',
84
- loadComponent: () => import('./rolatech-angular-community-community-manage-index.component-CQYy_iI7.mjs').then((x) => x.CommunityManageIndexComponent),
84
+ loadComponent: () => import('./rolatech-angular-community-community-manage-index.component-BPBXoVAh.mjs').then((x) => x.CommunityManageIndexComponent),
85
85
  data: { title: 'Manage Posts' },
86
86
  },
87
87
  {
88
88
  path: 'manage/create',
89
- loadComponent: () => import('./rolatech-angular-community-community-manage-post.component-DVRDQzXA.mjs').then((x) => x.CommunityManagePostComponent),
89
+ loadComponent: () => import('./rolatech-angular-community-community-manage-post.component-CtS6PHFY.mjs').then((x) => x.CommunityManagePostComponent),
90
90
  data: { title: 'Write Post' },
91
91
  },
92
92
  {
93
93
  path: 'manage/:id',
94
- loadComponent: () => import('./rolatech-angular-community-community-manage-post-details.component-B70ewcPc.mjs').then((x) => x.CommunityManagePostDetailsComponent),
94
+ loadComponent: () => import('./rolatech-angular-community-community-manage-post-details.component-BAo4VObj.mjs').then((x) => x.CommunityManagePostDetailsComponent),
95
95
  data: { title: 'Post Overview' },
96
96
  },
97
97
  {
98
98
  path: 'manage/:id/edit',
99
- loadComponent: () => import('./rolatech-angular-community-community-manage-post.component-DVRDQzXA.mjs').then((x) => x.CommunityManagePostComponent),
99
+ loadComponent: () => import('./rolatech-angular-community-community-manage-post.component-CtS6PHFY.mjs').then((x) => x.CommunityManagePostComponent),
100
100
  data: { title: 'Edit Post' },
101
101
  },
102
102
  {
103
103
  path: ':id',
104
- loadComponent: () => import('./rolatech-angular-community-community-details.component-B4kDYAna.mjs').then((x) => x.CommunityDetailsComponent),
104
+ loadComponent: () => import('./rolatech-angular-community-community-details.component-q5BBjuKJ.mjs').then((x) => x.CommunityDetailsComponent),
105
105
  data: { title: 'Post' },
106
106
  },
107
107
  ],
@@ -115,11 +115,11 @@ const communityRoutes = [
115
115
  children: [
116
116
  {
117
117
  path: '',
118
- loadComponent: () => import('./rolatech-angular-community-community-index.component-CJ_ddZSo.mjs').then((x) => x.CommunityIndexComponent),
118
+ loadComponent: () => import('./rolatech-angular-community-community-index.component-BNGz0UYa.mjs').then((x) => x.CommunityIndexComponent),
119
119
  },
120
120
  {
121
121
  path: ':id',
122
- loadComponent: () => import('./rolatech-angular-community-community-details.component-B4kDYAna.mjs').then((x) => x.CommunityDetailsComponent),
122
+ loadComponent: () => import('./rolatech-angular-community-community-details.component-q5BBjuKJ.mjs').then((x) => x.CommunityDetailsComponent),
123
123
  },
124
124
  ],
125
125
  },
@@ -128,26 +128,26 @@ const communityRoutes = [
128
128
  const communityManageRoutes = [
129
129
  {
130
130
  path: '',
131
- loadComponent: () => import('./rolatech-angular-community-community-manage-index.component-CQYy_iI7.mjs').then((x) => x.CommunityManageIndexComponent),
131
+ loadComponent: () => import('./rolatech-angular-community-community-manage-index.component-BPBXoVAh.mjs').then((x) => x.CommunityManageIndexComponent),
132
132
  },
133
133
  {
134
134
  path: 'create',
135
- loadComponent: () => import('./rolatech-angular-community-community-manage-post.component-DVRDQzXA.mjs').then((x) => x.CommunityManagePostComponent),
135
+ loadComponent: () => import('./rolatech-angular-community-community-manage-post.component-CtS6PHFY.mjs').then((x) => x.CommunityManagePostComponent),
136
136
  },
137
137
  {
138
138
  path: ':id',
139
- loadComponent: () => import('./rolatech-angular-community-community-manage-post-details.component-B70ewcPc.mjs').then((x) => x.CommunityManagePostDetailsComponent),
139
+ loadComponent: () => import('./rolatech-angular-community-community-manage-post-details.component-BAo4VObj.mjs').then((x) => x.CommunityManagePostDetailsComponent),
140
140
  },
141
141
  {
142
142
  path: ':id/edit',
143
- loadComponent: () => import('./rolatech-angular-community-community-manage-post.component-DVRDQzXA.mjs').then((x) => x.CommunityManagePostComponent),
143
+ loadComponent: () => import('./rolatech-angular-community-community-manage-post.component-CtS6PHFY.mjs').then((x) => x.CommunityManagePostComponent),
144
144
  },
145
145
  ];
146
146
 
147
147
  class CommunityService extends BaseService {
148
- init() {
148
+ constructor() {
149
+ super(...arguments);
149
150
  this.endpoint = 'community';
150
- super.init();
151
151
  }
152
152
  uploadMedia(id, data) {
153
153
  return this.http.post(`${this.actionUrl}/${id}/media`, data, {
@@ -159,10 +159,10 @@ class CommunityService extends BaseService {
159
159
  withCredentials: true,
160
160
  });
161
161
  }
162
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: CommunityService, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
163
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: CommunityService, providedIn: 'root' }); }
162
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: CommunityService, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
163
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: CommunityService, providedIn: 'root' }); }
164
164
  }
165
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: CommunityService, decorators: [{
165
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: CommunityService, decorators: [{
166
166
  type: Injectable,
167
167
  args: [{
168
168
  providedIn: 'root',
@@ -375,7 +375,7 @@ class CommunityPostStoreService {
375
375
  const status = this.toStatus(post?.status);
376
376
  const createdAt = post?.createdAt ?? post?.publishedAt ?? new Date().toISOString();
377
377
  const updatedAt = post?.updatedAt ?? createdAt;
378
- const publishedAt = status === 'PUBLISHED' ? post?.publishedAt ?? updatedAt : null;
378
+ const publishedAt = status === 'PUBLISHED' ? (post?.publishedAt ?? updatedAt) : null;
379
379
  return {
380
380
  id,
381
381
  title: post?.title ?? 'Untitled post',
@@ -431,7 +431,7 @@ class CommunityPostStoreService {
431
431
  authorName: existing?.authorName ?? 'You',
432
432
  createdAt: existing?.createdAt ?? now,
433
433
  updatedAt: now,
434
- publishedAt: status === 'PUBLISHED' ? now : existing?.publishedAt ?? null,
434
+ publishedAt: status === 'PUBLISHED' ? now : (existing?.publishedAt ?? null),
435
435
  };
436
436
  }
437
437
  filterPosts(posts, options) {
@@ -482,10 +482,10 @@ class CommunityPostStoreService {
482
482
  toStatus(status) {
483
483
  return (status ?? 'DRAFT').toString().trim().toUpperCase();
484
484
  }
485
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: CommunityPostStoreService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
486
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: CommunityPostStoreService, providedIn: 'root' }); }
485
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: CommunityPostStoreService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
486
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: CommunityPostStoreService, providedIn: 'root' }); }
487
487
  }
488
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImport: i0, type: CommunityPostStoreService, decorators: [{
488
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.5", ngImport: i0, type: CommunityPostStoreService, decorators: [{
489
489
  type: Injectable,
490
490
  args: [{
491
491
  providedIn: 'root',
@@ -497,4 +497,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.1", ngImpor
497
497
  */
498
498
 
499
499
  export { CommunityPostStoreService as C, communityAppRoutes as a, communityRoutes as b, createPostPreview as c, communityManageRoutes as d, CommunityService as e, toTagInput as t };
500
- //# sourceMappingURL=rolatech-angular-community-rolatech-angular-community-40yr8v0S.mjs.map
500
+ //# sourceMappingURL=rolatech-angular-community-rolatech-angular-community-CJ1wpGp3.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rolatech-angular-community-rolatech-angular-community-CJ1wpGp3.mjs","sources":["../../../../packages/angular-community/src/lib/pages/community/community-layout/community-layout.component.ts","../../../../packages/angular-community/src/lib/pages/community/community-layout/community-layout.component.html","../../../../packages/angular-community/src/lib/community-app.routes.ts","../../../../packages/angular-community/src/lib/pages/community/community.routes.ts","../../../../packages/angular-community/src/lib/pages/community-manage/community-manage.routes.ts","../../../../packages/angular-community/src/lib/services/community.service.ts","../../../../packages/angular-community/src/lib/data/community-posts.seed.ts","../../../../packages/angular-community/src/lib/utils/post-view.util.ts","../../../../packages/angular-community/src/lib/services/community-post-store.service.ts","../../../../packages/angular-community/src/rolatech-angular-community.ts"],"sourcesContent":["import { CommonModule, isPlatformBrowser } from '@angular/common';\nimport { Component, DestroyRef, PLATFORM_ID, inject, model, signal } from '@angular/core';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { NavigationEnd, Router, RouterLink, RouterOutlet } from '@angular/router';\nimport { TabComponent, TabsComponent } from '@rolatech/angular-components';\nimport { ThemeService, TitleService } from '@rolatech/angular-services';\nimport { filter, take } from 'rxjs';\n\n@Component({\n selector: 'rolatech-community-layout',\n imports: [CommonModule, RouterLink, RouterOutlet, TabsComponent, TabComponent, MatButtonModule, MatIconModule],\n templateUrl: './community-layout.component.html',\n styleUrl: './community-layout.component.scss',\n})\nexport class CommunityLayoutComponent {\n private readonly router = inject(Router);\n private readonly destroyRef = inject(DestroyRef);\n private readonly platformId = inject(PLATFORM_ID);\n private readonly themeService = inject(ThemeService);\n private readonly titleService = inject(TitleService);\n private readonly themeStorageKey = 'rolatech-community-theme';\n\n readonly navIndex = model(0);\n readonly theme = signal<'light' | 'dark'>('light');\n\n constructor() {\n this.titleService.setTitle('Community');\n this.syncTheme();\n this.updateNavIndex(this.router.url);\n\n const sub = this.router.events.pipe(filter((event) => event instanceof NavigationEnd)).subscribe((event) => {\n this.updateNavIndex((event as NavigationEnd).urlAfterRedirects);\n });\n\n this.destroyRef.onDestroy(() => sub.unsubscribe());\n }\n\n toggleTheme() {\n const nextTheme = this.theme() === 'dark' ? 'light' : 'dark';\n this.theme.set(nextTheme);\n this.themeService.setDarkTheme(nextTheme === 'dark');\n\n if (isPlatformBrowser(this.platformId)) {\n localStorage.setItem(this.themeStorageKey, nextTheme);\n }\n }\n\n private syncTheme() {\n if (isPlatformBrowser(this.platformId)) {\n const saved = localStorage.getItem(this.themeStorageKey);\n if (saved === 'light' || saved === 'dark') {\n this.theme.set(saved);\n this.themeService.setDarkTheme(saved === 'dark');\n return;\n }\n }\n\n this.themeService.isDarkTheme.pipe(take(1)).subscribe((isDark) => {\n this.theme.set(isDark ? 'dark' : 'light');\n });\n }\n\n private updateNavIndex(url: string) {\n if (url.includes('/manage/create')) {\n this.navIndex.set(2);\n return;\n }\n\n if (url.includes('/manage')) {\n this.navIndex.set(1);\n return;\n }\n\n this.navIndex.set(0);\n }\n}\n","<div class=\"community-shell\" [attr.data-theme]=\"theme()\">\n <div class=\"community-shell__orb community-shell__orb--primary\"></div>\n <div class=\"community-shell__orb community-shell__orb--secondary\"></div>\n\n <header class=\"community-shell__header\">\n <div class=\"community-shell__brand\">\n <div class=\"community-shell__eyebrow\">RolaTech Community</div>\n <h1>Shipping notes, drafts, and previews in one place.</h1>\n <p>\n Explore published posts, keep draft work moving, and switch between editor and preview without leaving the route\n tree.\n </p>\n </div>\n\n <button mat-stroked-button type=\"button\" class=\"community-shell__theme-button\" (click)=\"toggleTheme()\">\n <mat-icon>{{ theme() === 'dark' ? 'light_mode' : 'dark_mode' }}</mat-icon>\n <span>{{ theme() === 'dark' ? 'Light theme' : 'Dark theme' }}</span>\n </button>\n </header>\n\n <section class=\"community-shell__hero\">\n <div class=\"community-shell__hero-copy\">\n <span class=\"community-shell__pill\">Automatic routes</span>\n <span class=\"community-shell__pill\">Draft-safe workflow</span>\n <span class=\"community-shell__pill\">Markdown preview</span>\n </div>\n\n <div class=\"community-shell__hero-card\">\n <div class=\"community-shell__metric\">\n <span class=\"community-shell__metric-value\">3</span>\n <span class=\"community-shell__metric-label\">Primary routes wired in-package</span>\n </div>\n <div class=\"community-shell__metric\">\n <span class=\"community-shell__metric-value\">2</span>\n <span class=\"community-shell__metric-label\">Tab appearances from `angular-components`</span>\n </div>\n </div>\n </section>\n\n <rolatech-tabs mode=\"background\" [(select)]=\"navIndex\">\n <rolatech-tab class=\"cursor-pointer\" label=\"Explore\" [routerLink]=\"['./']\"></rolatech-tab>\n <rolatech-tab class=\"cursor-pointer\" label=\"Manage\" [routerLink]=\"['./manage']\"></rolatech-tab>\n <rolatech-tab class=\"cursor-pointer\" label=\"Write\" [routerLink]=\"['./manage/create']\"></rolatech-tab>\n </rolatech-tabs>\n\n <section class=\"community-shell__content\">\n <router-outlet></router-outlet>\n </section>\n</div>\n","import { Routes } from '@angular/router';\nimport { CommunityLayoutComponent } from './pages/community/community-layout/community-layout.component';\n\nexport const communityAppRoutes: Routes = [\n {\n path: '',\n component: CommunityLayoutComponent,\n children: [\n {\n path: '',\n loadComponent: () => import('./pages/community/community-index/community-index.component').then((x) => x.CommunityIndexComponent),\n data: { title: 'Community' },\n },\n {\n path: 'manage',\n loadComponent: () =>\n import('./pages/community-manage/community-manage-index/community-manage-index.component').then(\n (x) => x.CommunityManageIndexComponent,\n ),\n data: { title: 'Manage Posts' },\n },\n {\n path: 'manage/create',\n loadComponent: () =>\n import('./pages/community-manage/community-manage-post/community-manage-post.component').then(\n (x) => x.CommunityManagePostComponent,\n ),\n data: { title: 'Write Post' },\n },\n {\n path: 'manage/:id',\n loadComponent: () =>\n import('./pages/community-manage/community-manage-post-details/community-manage-post-details.component').then(\n (x) => x.CommunityManagePostDetailsComponent,\n ),\n data: { title: 'Post Overview' },\n },\n {\n path: 'manage/:id/edit',\n loadComponent: () =>\n import('./pages/community-manage/community-manage-post/community-manage-post.component').then(\n (x) => x.CommunityManagePostComponent,\n ),\n data: { title: 'Edit Post' },\n },\n {\n path: ':id',\n loadComponent: () => import('./pages/community/community-details/community-details.component').then((x) => x.CommunityDetailsComponent),\n data: { title: 'Post' },\n },\n ],\n },\n];\n","import { Routes } from '@angular/router';\nimport { CommunityLayoutComponent } from './community-layout/community-layout.component';\nexport const communityRoutes: Routes = [\n {\n path: '',\n component: CommunityLayoutComponent,\n children: [\n {\n path: '',\n loadComponent: () => import('./community-index/community-index.component').then((x) => x.CommunityIndexComponent),\n },\n {\n path: ':id',\n loadComponent: () => import('./community-details/community-details.component').then((x) => x.CommunityDetailsComponent),\n },\n ],\n },\n];\n","import { Routes } from '@angular/router';\n\nexport const communityManageRoutes: Routes = [\n {\n path: '',\n loadComponent: () =>\n import('./community-manage-index/community-manage-index.component').then((x) => x.CommunityManageIndexComponent),\n },\n {\n path: 'create',\n loadComponent: () =>\n import('./community-manage-post/community-manage-post.component').then((x) => x.CommunityManagePostComponent),\n },\n {\n path: ':id',\n loadComponent: () =>\n import('./community-manage-post-details/community-manage-post-details.component').then(\n (x) => x.CommunityManagePostDetailsComponent,\n ),\n },\n {\n path: ':id/edit',\n loadComponent: () =>\n import('./community-manage-post/community-manage-post.component').then((x) => x.CommunityManagePostComponent),\n },\n];\n","import { Injectable } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { BaseService } from '@rolatech/angular-services';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class CommunityService extends BaseService {\n protected override readonly endpoint = 'community';\n\n uploadMedia(id: string, data: FormData): Observable<any> {\n return this.http.post<any>(`${this.actionUrl}/${id}/media`, data, {\n withCredentials: true,\n });\n }\n deleteMedia(id: string, mediaId: string): Observable<any> {\n return this.http.delete<any>(`${this.actionUrl}/${id}/media/${mediaId}`, {\n withCredentials: true,\n });\n }\n}\n","import { PostRecord } from '@rolatech/angular-services';\n\nconst now = new Date('2026-03-11T09:00:00.000Z').toISOString();\n\nexport const COMMUNITY_POST_SEED: PostRecord[] = [\n {\n id: 'seed-angular-signals-at-scale',\n slug: 'angular-signals-at-scale',\n title: 'Angular signals at product scale',\n summary: 'A practical checklist for keeping signal-driven screens predictable as feature count and team size grow.',\n content: `# Angular signals at product scale\n\nShipping signal-heavy Angular apps gets harder once the feature surface expands. The UI stays fast, but the mental model starts to drift unless the team is strict about ownership.\n\n## What breaks first\n\n- derived state gets duplicated in components and services\n- route params become hidden dependencies\n- optimistic updates and server refreshes stop agreeing\n\n## What scales better\n\n1. Keep server state boundaries obvious.\n2. Prefer one write path for each user action.\n3. Render markdown, counters, and labels from computed state instead of mutating component fields.\n\n## Review rule\n\nIf a screen needs more than one place to understand why a button is enabled, the state graph is already too wide.`,\n tags: ['angular', 'signals', 'architecture'],\n status: 'PUBLISHED',\n authorName: 'RolaTech Editorial',\n createdAt: now,\n updatedAt: now,\n publishedAt: now,\n },\n {\n id: 'seed-designing-admin-workflows',\n slug: 'designing-admin-workflows',\n title: 'Designing admin workflows that do not collapse under edge cases',\n summary: 'Treat empty states, retries, and draft saves as first-class flows or the interface will punish operations teams.',\n content: `# Designing admin workflows that do not collapse under edge cases\n\nGood admin software is less about the happy path and more about preserving momentum when data is partial, stale, or late.\n\n## Baseline expectations\n\n- drafts survive refreshes\n- previews reflect the exact payload you are about to send\n- table filters map cleanly to route state\n\n## Implementation notes\n\nUse route-level shells for navigation and theme state. Keep editor state local to the page. Push only durable data into shared services.`,\n tags: ['design-system', 'operations', 'ux'],\n status: 'PUBLISHED',\n authorName: 'RolaTech Editorial',\n createdAt: now,\n updatedAt: now,\n publishedAt: now,\n },\n];\n","import { marked } from 'marked';\n\nexport interface PostPreviewMeta {\n html: string;\n plainText: string;\n wordCount: number;\n readingTimeMinutes: number;\n}\n\nexport function renderMarkdown(content: string | null | undefined): string {\n return String(marked.parse(content ?? ''));\n}\n\nexport function stripMarkdown(content: string | null | undefined): string {\n return (content ?? '')\n .replace(/```[\\s\\S]*?```/g, ' ')\n .replace(/`([^`]+)`/g, '$1')\n .replace(/!\\[([^\\]]*)\\]\\([^)]+\\)/g, '$1')\n .replace(/\\[([^\\]]+)\\]\\([^)]+\\)/g, '$1')\n .replace(/^#+\\s+/gm, '')\n .replace(/[*_>~-]/g, ' ')\n .replace(/\\s+/g, ' ')\n .trim();\n}\n\nexport function countWords(content: string | null | undefined): number {\n const matches = stripMarkdown(content).match(/[A-Za-z0-9'-]+/g);\n return matches?.length ?? 0;\n}\n\nexport function estimateReadingTime(content: string | null | undefined): number {\n return Math.max(1, Math.ceil(countWords(content) / 180));\n}\n\nexport function createPostPreview(content: string | null | undefined): PostPreviewMeta {\n const plainText = stripMarkdown(content);\n return {\n html: renderMarkdown(content),\n plainText,\n wordCount: countWords(content),\n readingTimeMinutes: estimateReadingTime(content),\n };\n}\n\nexport function normalizeTags(tags: string[] | string | null | undefined): string[] {\n if (Array.isArray(tags)) {\n return tags.map((tag) => tag.trim()).filter(Boolean);\n }\n\n if (typeof tags === 'string') {\n return tags\n .split(',')\n .map((tag) => tag.trim())\n .filter(Boolean);\n }\n\n return [];\n}\n\nexport function toTagInput(tags: string[] | string | null | undefined): string {\n return normalizeTags(tags).join(', ');\n}\n\nexport function createSlug(value: string | null | undefined): string {\n return (value ?? '')\n .toLowerCase()\n .trim()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n}\n\nexport function resolveSummary(post: {\n content?: string | null;\n summary?: string | null;\n excerpt?: string | null;\n}): string {\n if (post.summary?.trim()) {\n return post.summary.trim();\n }\n\n if (post.excerpt?.trim()) {\n return post.excerpt.trim();\n }\n\n return stripMarkdown(post.content).slice(0, 180).trim();\n}\n","import { isPlatformBrowser } from '@angular/common';\nimport { Injectable, PLATFORM_ID, inject } from '@angular/core';\nimport { PostQuery, PostRecord, PostService, SavePostRequest } from '@rolatech/angular-services';\nimport { catchError, map, Observable, of } from 'rxjs';\nimport { COMMUNITY_POST_SEED } from '../data/community-posts.seed';\nimport { createSlug, normalizeTags, resolveSummary } from '../utils/post-view.util';\n\ntype EditablePostPayload = {\n id?: string;\n title?: string | null;\n content?: string | null;\n summary?: string | null;\n excerpt?: string | null;\n slug?: string | null;\n coverImage?: string | null;\n cover?: string | null;\n tags?: string[] | string | null;\n};\n\n@Injectable({\n providedIn: 'root',\n})\nexport class CommunityPostStoreService {\n private readonly platformId = inject(PLATFORM_ID);\n private readonly postService = inject(PostService);\n private readonly isBrowser = isPlatformBrowser(this.platformId);\n private readonly storageKey = 'rolatech-community-posts';\n\n listPublished(options?: PostQuery): Observable<PostRecord[]> {\n return this.postService.listPublished({ ...options, sort: options?.sort ?? 'publishedAt desc' }).pipe(\n map((response) => this.mergePublishedPosts(this.normalizeListResponse(response), options)),\n catchError(() => of(this.mergePublishedPosts([], options))),\n );\n }\n\n getPublishedPost(idOrSlug: string): Observable<PostRecord | null> {\n return this.postService.getByIdOrSlug(idOrSlug).pipe(\n map((response) => this.normalizeSingleResponse(response) ?? this.findFallbackPublishedPost(idOrSlug)),\n catchError(() => of(this.findFallbackPublishedPost(idOrSlug))),\n );\n }\n\n listMyPosts(options?: PostQuery): Observable<PostRecord[]> {\n return this.postService.me({ ...options, sort: options?.sort ?? 'updatedAt desc' }).pipe(\n map((response) => this.filterPosts(this.mergePosts(this.normalizeListResponse(response), this.getLocalPosts()), options)),\n catchError(() => of(this.filterPosts(this.getLocalPosts(), options))),\n );\n }\n\n getManagePost(idOrSlug: string): Observable<PostRecord | null> {\n const local = this.findLocalPost(idOrSlug);\n if (local) {\n return of(local);\n }\n\n return this.postService.getByIdOrSlug(idOrSlug, true).pipe(\n map((response) => this.normalizeSingleResponse(response)),\n catchError(() => of(null)),\n );\n }\n\n saveDraft(payload: EditablePostPayload): Observable<PostRecord> {\n const normalizedPayload = this.normalizePayload(payload, 'DRAFT');\n const localFallback = () => of(this.persistLocalPost(this.buildLocalPost(payload, normalizedPayload, 'DRAFT')));\n\n if (!payload.id) {\n return this.postService.createPost({ ...normalizedPayload, status: 'DRAFT' }).pipe(\n map((response) =>\n this.persistLocalPost(\n this.normalizeSingleResponse(response) ?? this.buildLocalPost(payload, normalizedPayload, 'DRAFT'),\n ),\n ),\n catchError(() => localFallback()),\n );\n }\n\n if (payload.id.startsWith('local-')) {\n return localFallback();\n }\n\n return this.postService.saveDraft(payload.id, normalizedPayload).pipe(\n map((response) =>\n this.persistLocalPost(\n this.normalizeSingleResponse(response) ?? this.buildLocalPost(payload, normalizedPayload, 'DRAFT'),\n ),\n ),\n catchError(() => localFallback()),\n );\n }\n\n publish(payload: EditablePostPayload): Observable<PostRecord> {\n const normalizedPayload = this.normalizePayload(payload, 'PUBLISHED');\n const localFallback = () => of(this.persistLocalPost(this.buildLocalPost(payload, normalizedPayload, 'PUBLISHED')));\n\n if (!payload.id) {\n return this.postService.createPost({ ...normalizedPayload, status: 'PUBLISHED' }).pipe(\n map((response) =>\n this.persistLocalPost(\n this.normalizeSingleResponse(response) ?? this.buildLocalPost(payload, normalizedPayload, 'PUBLISHED'),\n ),\n ),\n catchError(() => localFallback()),\n );\n }\n\n if (payload.id.startsWith('local-')) {\n return localFallback();\n }\n\n return this.postService.publish(payload.id, normalizedPayload).pipe(\n map((response) =>\n this.persistLocalPost(\n this.normalizeSingleResponse(response) ?? this.buildLocalPost(payload, normalizedPayload, 'PUBLISHED'),\n ),\n ),\n catchError(() => localFallback()),\n );\n }\n\n private mergePublishedPosts(remotePosts: PostRecord[], options?: PostQuery): PostRecord[] {\n const localPublished = this.getLocalPosts().filter((post) => this.toStatus(post.status) === 'PUBLISHED');\n const combined = this.mergePosts(\n remotePosts,\n localPublished,\n remotePosts.length || localPublished.length ? [] : COMMUNITY_POST_SEED,\n );\n return this.filterPosts(combined, { ...options, status: 'PUBLISHED' });\n }\n\n private mergePosts(...groups: PostRecord[][]): PostRecord[] {\n const registry = new Map<string, PostRecord>();\n\n groups.flat().forEach((post) => {\n const normalized = this.normalizePost(post);\n registry.set(normalized.id, normalized);\n });\n\n return Array.from(registry.values()).sort((a, b) => {\n const aDate = new Date(a.updatedAt ?? a.publishedAt ?? a.createdAt ?? 0).getTime();\n const bDate = new Date(b.updatedAt ?? b.publishedAt ?? b.createdAt ?? 0).getTime();\n return bDate - aDate;\n });\n }\n\n private normalizeListResponse(response: any): PostRecord[] {\n const candidates = response?.data?.items ?? response?.data ?? response?.items ?? response;\n if (Array.isArray(candidates)) {\n return candidates.map((item) => this.normalizePost(item));\n }\n\n if (Array.isArray(candidates?.items)) {\n return candidates.items.map((item: unknown) => this.normalizePost(item));\n }\n\n return [];\n }\n\n private normalizeSingleResponse(response: any): PostRecord | null {\n const candidate = response?.data ?? response;\n if (!candidate || Array.isArray(candidate)) {\n return null;\n }\n\n return this.normalizePost(candidate);\n }\n\n private normalizePost(post: any): PostRecord {\n const id = String(post?.id ?? post?.slug ?? this.generateLocalId());\n const status = this.toStatus(post?.status);\n const createdAt = post?.createdAt ?? post?.publishedAt ?? new Date().toISOString();\n const updatedAt = post?.updatedAt ?? createdAt;\n const publishedAt = status === 'PUBLISHED' ? (post?.publishedAt ?? updatedAt) : null;\n\n return {\n id,\n title: post?.title ?? 'Untitled post',\n content: post?.content ?? post?.body ?? '',\n summary: post?.summary ?? null,\n excerpt: post?.excerpt ?? null,\n slug: post?.slug ?? createSlug(post?.title ?? id),\n coverImage: post?.coverImage ?? post?.cover ?? null,\n cover: post?.cover ?? post?.coverImage ?? null,\n tags: normalizeTags(post?.tags),\n status,\n author: post?.author\n ? {\n id: post.author.id ?? null,\n name: post.author.name ?? null,\n username: post.author.username ?? null,\n avatar: post.author.avatar ?? null,\n }\n : null,\n authorName: post?.authorName ?? post?.author?.name ?? 'RolaTech',\n createdAt,\n updatedAt,\n publishedAt,\n };\n }\n\n private normalizePayload(payload: EditablePostPayload, status: 'DRAFT' | 'PUBLISHED'): SavePostRequest {\n return {\n title: (payload.title ?? 'Untitled post').trim(),\n content: payload.content ?? '',\n summary: resolveSummary(payload),\n excerpt: payload.excerpt ?? resolveSummary(payload),\n slug: createSlug(payload.slug || payload.title || 'untitled-post'),\n coverImage: payload.coverImage ?? payload.cover ?? null,\n cover: payload.cover ?? payload.coverImage ?? null,\n tags: normalizeTags(payload.tags),\n status,\n };\n }\n\n private buildLocalPost(source: EditablePostPayload, payload: SavePostRequest, status: 'DRAFT' | 'PUBLISHED'): PostRecord {\n const existing = source.id ? this.findLocalPost(source.id) : null;\n const now = new Date().toISOString();\n\n return {\n id: source.id ?? existing?.id ?? this.generateLocalId(),\n title: payload.title,\n content: payload.content,\n summary: payload.summary ?? null,\n excerpt: payload.excerpt ?? null,\n slug: payload.slug ?? createSlug(payload.title),\n coverImage: payload.coverImage ?? null,\n cover: payload.cover ?? null,\n tags: payload.tags ?? [],\n status,\n authorName: existing?.authorName ?? 'You',\n createdAt: existing?.createdAt ?? now,\n updatedAt: now,\n publishedAt: status === 'PUBLISHED' ? now : (existing?.publishedAt ?? null),\n };\n }\n\n private filterPosts(posts: PostRecord[], options?: PostQuery): PostRecord[] {\n const search = options?.search?.trim().toLowerCase();\n const status = options?.status?.trim().toUpperCase();\n\n return posts.filter((post) => {\n const matchesStatus = !status || this.toStatus(post.status) === status;\n const haystack = [post.title, post.summary, post.authorName, ...(post.tags ?? [])].join(' ').toLowerCase();\n const matchesSearch = !search || haystack.includes(search);\n\n return matchesStatus && matchesSearch;\n });\n }\n\n private findFallbackPublishedPost(idOrSlug: string): PostRecord | null {\n return this.mergePublishedPosts([]).find((post) => post.id === idOrSlug || post.slug === idOrSlug) ?? null;\n }\n\n private findLocalPost(idOrSlug: string): PostRecord | null {\n return this.getLocalPosts().find((post) => post.id === idOrSlug || post.slug === idOrSlug) ?? null;\n }\n\n private persistLocalPost(post: PostRecord): PostRecord {\n if (!this.isBrowser) {\n return post;\n }\n\n const posts = this.getLocalPosts();\n const next = posts.filter((item) => item.id !== post.id);\n next.unshift(post);\n localStorage.setItem(this.storageKey, JSON.stringify(next));\n return post;\n }\n\n private getLocalPosts(): PostRecord[] {\n if (!this.isBrowser) {\n return [];\n }\n\n const raw = localStorage.getItem(this.storageKey);\n if (!raw) {\n return [];\n }\n\n try {\n const parsed = JSON.parse(raw);\n return Array.isArray(parsed) ? parsed.map((item) => this.normalizePost(item)) : [];\n } catch {\n return [];\n }\n }\n\n private generateLocalId(): string {\n return `local-${Math.random().toString(36).slice(2, 10)}`;\n }\n\n private toStatus(status: string | null | undefined): string {\n return (status ?? 'DRAFT').toString().trim().toUpperCase();\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i2"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- export { C as CommunityPostStoreService, e as CommunityService, a as communityAppRoutes, d as communityManageRoutes, b as communityRoutes } from './rolatech-angular-community-rolatech-angular-community-40yr8v0S.mjs';
1
+ export { C as CommunityPostStoreService, e as CommunityService, a as communityAppRoutes, d as communityManageRoutes, b as communityRoutes } from './rolatech-angular-community-rolatech-angular-community-CJ1wpGp3.mjs';
2
2
  //# sourceMappingURL=rolatech-angular-community.mjs.map
package/package.json CHANGED
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "@rolatech/angular-community",
3
- "version": "20.3.2-beta.3",
3
+ "version": "20.3.3-beta.0",
4
4
  "private": false,
5
5
  "dependencies": {
6
- "@rolatech/angular-common": "20.3.2-beta.3",
7
- "@rolatech/angular-components": "20.3.2-beta.3",
8
- "@rolatech/angular-services": "20.3.2-beta.3",
6
+ "@rolatech/angular-common": "20.3.3-beta.0",
7
+ "@rolatech/angular-components": "20.3.3-beta.0",
8
+ "@rolatech/angular-services": "20.3.3-beta.0",
9
9
  "tslib": "^2.3.0"
10
10
  },
11
11
  "peerDependencies": {
@@ -10,7 +10,7 @@ declare const communityRoutes: Routes;
10
10
  declare const communityManageRoutes: Routes;
11
11
 
12
12
  declare class CommunityService extends BaseService {
13
- init(): void;
13
+ protected readonly endpoint = "community";
14
14
  uploadMedia(id: string, data: FormData): Observable<any>;
15
15
  deleteMedia(id: string, mediaId: string): Observable<any>;
16
16
  static ɵfac: i0.ɵɵFactoryDeclaration<CommunityService, never>;