@ngstarter-ui/components 21.0.13 → 21.0.14

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.
@@ -4461,8 +4461,8 @@
4461
4461
  {
4462
4462
  "name": "close-on-backdrop-click-example",
4463
4463
  "title": "Close on backdrop click",
4464
- "file": "projects/docs/src/app/components/guided-tour/_examples/close-on-backdrop-click-example/close-on-backdrop-click-example.ts",
4465
- "source": "import { Component, inject } from '@angular/core';\nimport { TourService } from '@ngstarter-ui/components/guided-tour';\nimport { Button } from '@ngstarter-ui/components/button';\n@Component({\n selector: 'app-close-on-backdrop-click-example',\n imports: [Button],\n template: `\n <div class=\"flex flex-col gap-4\">\n <div class=\"flex gap-4\">\n <button ngsButton=\"filled\" (click)=\"startTour()\">Start Tour (Close on Backdrop Click)</button>\n </div>\n <div class=\"flex gap-10 mt-10\">\n <div id=\"close-step1\" class=\"p-4 border rounded\">Step 1</div>\n <div id=\"close-step2\" class=\"p-4 border rounded\">Step 2</div>\n </div>\n </div>\n `,\n})\nexport class CloseOnBackdropClickExample {\n private readonly tourService = inject(TourService);\n startTour(): void {\n this.tourService.start([\n {\n anchorId: '#close-step1',\n title: 'Step 1',\n content: 'Click on the backdrop to close the tour.',\n withBackdrop: true,\n closeOnBackdropClick: true\n },\n {\n anchorId: '#close-step2',\n title: 'Step 2',\n content: 'This step also can be closed by clicking on the backdrop.',\n withBackdrop: true,\n closeOnBackdropClick: true\n }\n ]);\n }\n}"
4464
+ "file": "projects/docs/src/app/components/guided-tour/_examples/close-on-backdrop-click-example/close-on-backdrop-click-example.html",
4465
+ "source": "<div class=\"flex flex-col gap-4\">\n <div class=\"flex gap-4\">\n <button ngsButton=\"filled\" (click)=\"startTour()\">Start Tour (Close on Backdrop Click)</button>\n </div>\n <div class=\"flex gap-10 mt-10\">\n <div id=\"close-step1\" class=\"p-4 border rounded\">Step 1</div>\n <div id=\"close-step2\" class=\"p-4 border rounded\">Step 2</div>\n </div>\n</div>"
4466
4466
  }
4467
4467
  ],
4468
4468
  "previewAsset": "projects/components/guided-tour/preview.svg",
@@ -4568,9 +4568,8 @@
4568
4568
  "Symbols Icons (Default)",
4569
4569
  "Phosphor Icons",
4570
4570
  "Circle Flags Icons",
4571
- "Symbols icons",
4572
- "Circle flags",
4573
- "Material symbols icons"
4571
+ "Material symbols icons",
4572
+ "Circle flags"
4574
4573
  ],
4575
4574
  "minimalExample": "<div class=\"flex gap-4\">\n <ngs-icon name=\"circle-flags:us\"/>\n <ngs-icon name=\"circle-flags:ge\"/>\n <ngs-icon name=\"circle-flags:de\"/>\n</div>\n<div class=\"mt-8 flex gap-4 items-center\">\n <ngs-icon name=\"circle-flags:us\" class=\"size-4\"/>\n <ngs-icon name=\"circle-flags:ge\" class=\"size-10\"/>\n <ngs-icon name=\"circle-flags:de\" class=\"size-16\"/>\n</div>",
4576
4575
  "exampleFiles": [
@@ -7365,14 +7364,19 @@
7365
7364
  "exampleFiles": [],
7366
7365
  "previewAsset": "projects/components/scrollbar-area/preview.svg",
7367
7366
  "selectors": [
7367
+ "[ngsScrollContainerFixed]",
7368
7368
  "ngs-scrollbar-area"
7369
7369
  ],
7370
7370
  "exportedSymbols": [
7371
- "ScrollbarArea"
7371
+ "ScrollbarArea",
7372
+ "ScrollContainerFixed"
7372
7373
  ],
7373
7374
  "inputs": [
7374
7375
  "absolute",
7375
7376
  "autoHide",
7377
+ "ngsScrollContainerFixed",
7378
+ "ngsScrollContainerFixedBottomOffset",
7379
+ "ngsScrollContainerFixedMinHeight",
7376
7380
  "scrollbarWidth"
7377
7381
  ],
7378
7382
  "outputs": [
@@ -8258,8 +8262,8 @@
8258
8262
  "Basic Snackbar",
8259
8263
  "Snackbar With Custom Component",
8260
8264
  "Configurable Snackbar",
8261
- "Snackbar",
8262
- "Snackbar with custom"
8265
+ "Snackbar with custom",
8266
+ "Snackbar"
8263
8267
  ],
8264
8268
  "minimalExample": "<div class=\"flex items-center gap-5\">\n <ngs-form-field subscriptHiddenIfEmpty>\n <ngs-label>Message</ngs-label>\n <input ngsInput value=\"Disco party!\" #message>\n </ngs-form-field>\n <ngs-form-field subscriptHiddenIfEmpty>\n <ngs-label>Action</ngs-label>\n <input ngsInput value=\"Dance\" #action>\n </ngs-form-field>\n <button ngsButton=\"outlined\"\n (click)=\"openSnackBar(message.value, action.value)\">Show snack-bar</button>\n</div>",
8265
8269
  "exampleFiles": [
@@ -284,13 +284,15 @@ class CodeHighlighter {
284
284
  };
285
285
  }
286
286
  async ngOnChanges(changes) {
287
- if (!this.code()) {
288
- this.content.set(null);
287
+ const code = this.code() ?? '';
288
+ if (code.length === 0) {
289
+ this.isLoading.set(false);
290
+ this.content.set(this.sanitizer.bypassSecurityTrustHtml('<pre class="shiki"><code></code></pre>'));
289
291
  return;
290
292
  }
291
293
  this.isLoading.set(true);
292
294
  try {
293
- const highlighted = await codeToHtml(this.code(), {
295
+ const highlighted = await codeToHtml(code, {
294
296
  lang: this.language(),
295
297
  theme: this.theme(),
296
298
  transformers: [diffTransformer, this.getHighlightTransformer()],
@@ -300,7 +302,7 @@ class CodeHighlighter {
300
302
  }
301
303
  catch (e) {
302
304
  // Fallback: raw code escaped inside pre
303
- const escaped = this.code()
305
+ const escaped = code
304
306
  .replace(/&/g, '&amp;')
305
307
  .replace(/</g, '&lt;')
306
308
  .replace(/>/g, '&gt;');
@@ -328,7 +330,7 @@ class CodeHighlighter {
328
330
  }
329
331
  }
330
332
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: CodeHighlighter, deps: [], target: i0.ɵɵFactoryTarget.Component });
331
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.4", type: CodeHighlighter, isStandalone: true, selector: "ngs-code-highlighter", inputs: { code: { classPropertyName: "code", publicName: "code", isSignal: true, isRequired: true, transformFunction: null }, language: { classPropertyName: "language", publicName: "language", isSignal: true, isRequired: false, transformFunction: null }, theme: { classPropertyName: "theme", publicName: "theme", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, appearance: { classPropertyName: "appearance", publicName: "appearance", isSignal: true, isRequired: false, transformFunction: null }, diff: { classPropertyName: "diff", publicName: "diff", isSignal: true, isRequired: false, transformFunction: null }, highlightLines: { classPropertyName: "highlightLines", publicName: "highlightLines", isSignal: true, isRequired: false, transformFunction: null }, showLanguage: { classPropertyName: "showLanguage", publicName: "showLanguage", isSignal: true, isRequired: false, transformFunction: null }, showCopyButton: { classPropertyName: "showCopyButton", publicName: "showCopyButton", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class.appearance-bordered": "appearance() === \"bordered\"", "class.appearance-none": "appearance() === \"none\"" }, classAttribute: "ngs-code-highlighter not-prose" }, exportAs: ["ngsCodeHighlighter"], usesOnChanges: true, ngImport: i0, template: "<figure>\n @if (title()) {\n <figcaption>\n @if (title()) {\n <span class=\"title\">{{ title() }}</span>\n }\n </figcaption>\n }\n\n <div class=\"content relative\">\n @if (showLanguage()) {\n <div class=\"languageName\">{{ displayedLanguage() }}</div>\n }\n\n @if (showCopyButton()) {\n <span class=\"absolute top-2 right-2\">\n <button\n ngsIconButton\n (click)=\"copyCode()\"\n >\n <ngs-icon\n [name]=\"copied() ? 'fluent:checkmark-24-regular' : 'fluent:copy-24-regular'\"\n [class.text-green-500]=\"copied()\"\n />\n </button>\n </span>\n }\n\n <div>\n @if (content()) {\n <div [innerHTML]=\"content()\"></div>\n } @else {\n <div class=\"loading\">Loading\u2026</div>\n }\n </div>\n </div>\n</figure>\n", styles: [":host{--ngs-code-highlighter-bg: var(--ngs-color-background);--ngs-code-highlighter-radius: var(--ngs-radius-xl);--ngs-code-highlighter-padding: calc(var(--spacing, .25rem) * 5);--ngs-code-highlighter-margin: calc(var(--spacing, .25rem) * 5);--ngs-code-highlighter-border: 1px solid var(--ngs-color-border);--ngs-code-highlighter-title-padding: calc(var(--spacing, .25rem) * 2) calc(var(--spacing, .25rem) * 3) calc(var(--spacing, .25rem) * 1) calc(var(--spacing, .25rem) * 3);--ngs-code-highlighter-title-color: var(--ngs-color-neutral-500);display:block;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}:host figcaption{font-size:var(--ngs-font-size-xs);font-weight:500;padding:var(--ngs-code-highlighter-title-padding);background:var(--ngs-code-highlighter-bg);color:var(--ngs-code-highlighter-title-color);position:relative;z-index:1}:host figcaption:after{content:\"\";position:absolute;left:0;right:0;bottom:-1px;height:1px;background:var(--ngs-code-highlighter-bg)}:host .languageName{font-size:var(--ngs-font-size-sm);font-weight:600;padding:0 calc(var(--spacing, .25rem) * 6);width:max-content;margin-bottom:calc(var(--spacing, .25rem) * 4);margin-top:calc(calc(var(--spacing, .25rem) * 1) * -1);position:relative}:host ::ng-deep pre{padding:var(--ngs-code-highlighter-padding) 0;line-height:1.75;font-size:var(--ngs-font-size-sm);position:relative}:host ::ng-deep pre code{display:grid}:host ::ng-deep pre .line{padding-left:calc(var(--spacing, .25rem) * 6);padding-right:var(--ngs-code-highlighter-padding);min-height:1.75em}:host ::ng-deep pre .line.diff.remove{background-color:var(--ngs-color-danger);display:inline-block;width:100%}@supports (color: color-mix(in lab,red,red)){:host ::ng-deep pre .line.diff.remove{background-color:color-mix(in srgb,var(--ngs-color-danger),transparent 85%)}}:host ::ng-deep pre .line.diff.remove:before{content:\"-\";color:var(--ngs-color-danger);position:absolute;left:calc(var(--spacing, .25rem) * 2)}:host ::ng-deep pre .line.diff.add{background-color:var(--ngs-color-success);display:inline-block;width:100%}@supports (color: color-mix(in lab,red,red)){:host ::ng-deep pre .line.diff.add{background-color:color-mix(in srgb,var(--ngs-color-success),transparent 85%)}}:host ::ng-deep pre .line.diff.add:before{content:\"+\";color:var(--ngs-color-success);position:absolute;left:calc(var(--spacing, .25rem) * 2)}:host ::ng-deep pre .line.highlighted{background-color:var(--ngs-color-primary);display:inline-block;width:100%}@supports (color: color-mix(in lab,red,red)){:host ::ng-deep pre .line.highlighted{background-color:color-mix(in srgb,var(--ngs-color-primary),transparent 92%)}}:host ::ng-deep code{white-space:pre}:host .content{overflow:auto;background:var(--ngs-code-highlighter-bg)}:host .content button{color:inherit}:host .content button ngs-icon.text-green-500{color:var(--ngs-color-success)!important}:host.appearance-bordered figcaption{border:var(--ngs-code-highlighter-border);border-bottom:none;border-top-left-radius:var(--ngs-radius-xl);border-top-right-radius:var(--ngs-radius-xl);width:max-content}:host.appearance-bordered .content{border:var(--ngs-code-highlighter-border);border-radius:var(--ngs-code-highlighter-radius);z-index:0}:host.appearance-bordered:has(figcaption) .content{border-top-left-radius:0}:host.appearance-none .content{border:none;background-color:transparent!important;border-radius:0}:host.appearance-none ::ng-deep pre{padding-left:0;padding-right:0}:host.loading{opacity:.6}\n/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "component", type: Button, selector: " button[ngsButton], button[ngsIconButton], a[ngsButton], a[ngsIconButton] ", inputs: ["ngsButton", "ngsIconButton", "loading", "disabled", "disabledInteractive", "disableRipple", "reverse", "fullWidth", "hideTextOnMobile"], exportAs: ["ngsButton"] }, { kind: "component", type: Icon, selector: "ngs-icon", inputs: ["name"], exportAs: ["ngsIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
333
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.4", type: CodeHighlighter, isStandalone: true, selector: "ngs-code-highlighter", inputs: { code: { classPropertyName: "code", publicName: "code", isSignal: true, isRequired: true, transformFunction: null }, language: { classPropertyName: "language", publicName: "language", isSignal: true, isRequired: false, transformFunction: null }, theme: { classPropertyName: "theme", publicName: "theme", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, appearance: { classPropertyName: "appearance", publicName: "appearance", isSignal: true, isRequired: false, transformFunction: null }, diff: { classPropertyName: "diff", publicName: "diff", isSignal: true, isRequired: false, transformFunction: null }, highlightLines: { classPropertyName: "highlightLines", publicName: "highlightLines", isSignal: true, isRequired: false, transformFunction: null }, showLanguage: { classPropertyName: "showLanguage", publicName: "showLanguage", isSignal: true, isRequired: false, transformFunction: null }, showCopyButton: { classPropertyName: "showCopyButton", publicName: "showCopyButton", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class.appearance-bordered": "appearance() === \"bordered\"", "class.appearance-none": "appearance() === \"none\"" }, classAttribute: "ngs-code-highlighter not-prose" }, exportAs: ["ngsCodeHighlighter"], usesOnChanges: true, ngImport: i0, template: "<figure class=\"h-full\">\n @if (title()) {\n <figcaption>\n @if (title()) {\n <span class=\"title\">{{ title() }}</span>\n }\n </figcaption>\n }\n\n <div class=\"content relative h-full\">\n @if (showLanguage()) {\n <div class=\"languageName\">{{ displayedLanguage() }}</div>\n }\n\n @if (showCopyButton()) {\n <span class=\"absolute top-2 right-2\">\n <button\n ngsIconButton\n (click)=\"copyCode()\"\n >\n <ngs-icon\n [name]=\"copied() ? 'fluent:checkmark-24-regular' : 'fluent:copy-24-regular'\"\n [class.text-green-500]=\"copied()\"\n />\n </button>\n </span>\n }\n\n <div>\n @if (content()) {\n <div [innerHTML]=\"content()\"></div>\n } @else if (isLoading()) {\n <div class=\"loading\">Loading\u2026</div>\n }\n </div>\n </div>\n</figure>\n", styles: [":host{--ngs-code-highlighter-bg: var(--ngs-color-background);--ngs-code-highlighter-radius: var(--ngs-radius-xl);--ngs-code-highlighter-padding: calc(var(--spacing, .25rem) * 5);--ngs-code-highlighter-margin: calc(var(--spacing, .25rem) * 5);--ngs-code-highlighter-border: 1px solid var(--ngs-color-border);--ngs-code-highlighter-title-padding: calc(var(--spacing, .25rem) * 2) calc(var(--spacing, .25rem) * 3) calc(var(--spacing, .25rem) * 1) calc(var(--spacing, .25rem) * 3);--ngs-code-highlighter-title-color: var(--ngs-color-neutral-500);display:block;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}:host figcaption{font-size:var(--ngs-font-size-xs);font-weight:500;padding:var(--ngs-code-highlighter-title-padding);background:var(--ngs-code-highlighter-bg);color:var(--ngs-code-highlighter-title-color);position:relative;z-index:1}:host figcaption:after{content:\"\";position:absolute;left:0;right:0;bottom:-1px;height:1px;background:var(--ngs-code-highlighter-bg)}:host .languageName{font-size:var(--ngs-font-size-sm);font-weight:600;padding:0 calc(var(--spacing, .25rem) * 6);width:max-content;margin-bottom:calc(var(--spacing, .25rem) * 4);margin-top:calc(calc(var(--spacing, .25rem) * 1) * -1);position:relative}:host ::ng-deep pre{padding:var(--ngs-code-highlighter-padding) 0;line-height:1.75;font-size:var(--ngs-font-size-sm);position:relative}:host ::ng-deep pre code{display:grid}:host ::ng-deep pre .line{padding-left:calc(var(--spacing, .25rem) * 6);padding-right:var(--ngs-code-highlighter-padding);min-height:1.75em}:host ::ng-deep pre .line.diff.remove{background-color:var(--ngs-color-danger);display:inline-block;width:100%}@supports (color: color-mix(in lab,red,red)){:host ::ng-deep pre .line.diff.remove{background-color:color-mix(in srgb,var(--ngs-color-danger),transparent 85%)}}:host ::ng-deep pre .line.diff.remove:before{content:\"-\";color:var(--ngs-color-danger);position:absolute;left:calc(var(--spacing, .25rem) * 2)}:host ::ng-deep pre .line.diff.add{background-color:var(--ngs-color-success);display:inline-block;width:100%}@supports (color: color-mix(in lab,red,red)){:host ::ng-deep pre .line.diff.add{background-color:color-mix(in srgb,var(--ngs-color-success),transparent 85%)}}:host ::ng-deep pre .line.diff.add:before{content:\"+\";color:var(--ngs-color-success);position:absolute;left:calc(var(--spacing, .25rem) * 2)}:host ::ng-deep pre .line.highlighted{background-color:var(--ngs-color-primary);display:inline-block;width:100%}@supports (color: color-mix(in lab,red,red)){:host ::ng-deep pre .line.highlighted{background-color:color-mix(in srgb,var(--ngs-color-primary),transparent 92%)}}:host ::ng-deep code{white-space:pre}:host .content{overflow:auto;background:var(--ngs-code-highlighter-bg)}:host .content button{color:inherit}:host .content button ngs-icon.text-green-500{color:var(--ngs-color-success)!important}:host.appearance-bordered figcaption{border:var(--ngs-code-highlighter-border);border-bottom:none;border-top-left-radius:var(--ngs-radius-xl);border-top-right-radius:var(--ngs-radius-xl);width:max-content}:host.appearance-bordered .content{border:var(--ngs-code-highlighter-border);border-radius:var(--ngs-code-highlighter-radius);z-index:0}:host.appearance-bordered:has(figcaption) .content{border-top-left-radius:0}:host.appearance-none .content{border:none;background-color:transparent!important;border-radius:0}:host.appearance-none ::ng-deep pre{padding-left:0;padding-right:0}:host.loading{opacity:.6}\n/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "component", type: Button, selector: " button[ngsButton], button[ngsIconButton], a[ngsButton], a[ngsIconButton] ", inputs: ["ngsButton", "ngsIconButton", "loading", "disabled", "disabledInteractive", "disableRipple", "reverse", "fullWidth", "hideTextOnMobile"], exportAs: ["ngsButton"] }, { kind: "component", type: Icon, selector: "ngs-icon", inputs: ["name"], exportAs: ["ngsIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
332
334
  }
333
335
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: CodeHighlighter, decorators: [{
334
336
  type: Component,
@@ -336,7 +338,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImpor
336
338
  'class': 'ngs-code-highlighter not-prose',
337
339
  '[class.appearance-bordered]': 'appearance() === "bordered"',
338
340
  '[class.appearance-none]': 'appearance() === "none"',
339
- }, template: "<figure>\n @if (title()) {\n <figcaption>\n @if (title()) {\n <span class=\"title\">{{ title() }}</span>\n }\n </figcaption>\n }\n\n <div class=\"content relative\">\n @if (showLanguage()) {\n <div class=\"languageName\">{{ displayedLanguage() }}</div>\n }\n\n @if (showCopyButton()) {\n <span class=\"absolute top-2 right-2\">\n <button\n ngsIconButton\n (click)=\"copyCode()\"\n >\n <ngs-icon\n [name]=\"copied() ? 'fluent:checkmark-24-regular' : 'fluent:copy-24-regular'\"\n [class.text-green-500]=\"copied()\"\n />\n </button>\n </span>\n }\n\n <div>\n @if (content()) {\n <div [innerHTML]=\"content()\"></div>\n } @else {\n <div class=\"loading\">Loading\u2026</div>\n }\n </div>\n </div>\n</figure>\n", styles: [":host{--ngs-code-highlighter-bg: var(--ngs-color-background);--ngs-code-highlighter-radius: var(--ngs-radius-xl);--ngs-code-highlighter-padding: calc(var(--spacing, .25rem) * 5);--ngs-code-highlighter-margin: calc(var(--spacing, .25rem) * 5);--ngs-code-highlighter-border: 1px solid var(--ngs-color-border);--ngs-code-highlighter-title-padding: calc(var(--spacing, .25rem) * 2) calc(var(--spacing, .25rem) * 3) calc(var(--spacing, .25rem) * 1) calc(var(--spacing, .25rem) * 3);--ngs-code-highlighter-title-color: var(--ngs-color-neutral-500);display:block;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}:host figcaption{font-size:var(--ngs-font-size-xs);font-weight:500;padding:var(--ngs-code-highlighter-title-padding);background:var(--ngs-code-highlighter-bg);color:var(--ngs-code-highlighter-title-color);position:relative;z-index:1}:host figcaption:after{content:\"\";position:absolute;left:0;right:0;bottom:-1px;height:1px;background:var(--ngs-code-highlighter-bg)}:host .languageName{font-size:var(--ngs-font-size-sm);font-weight:600;padding:0 calc(var(--spacing, .25rem) * 6);width:max-content;margin-bottom:calc(var(--spacing, .25rem) * 4);margin-top:calc(calc(var(--spacing, .25rem) * 1) * -1);position:relative}:host ::ng-deep pre{padding:var(--ngs-code-highlighter-padding) 0;line-height:1.75;font-size:var(--ngs-font-size-sm);position:relative}:host ::ng-deep pre code{display:grid}:host ::ng-deep pre .line{padding-left:calc(var(--spacing, .25rem) * 6);padding-right:var(--ngs-code-highlighter-padding);min-height:1.75em}:host ::ng-deep pre .line.diff.remove{background-color:var(--ngs-color-danger);display:inline-block;width:100%}@supports (color: color-mix(in lab,red,red)){:host ::ng-deep pre .line.diff.remove{background-color:color-mix(in srgb,var(--ngs-color-danger),transparent 85%)}}:host ::ng-deep pre .line.diff.remove:before{content:\"-\";color:var(--ngs-color-danger);position:absolute;left:calc(var(--spacing, .25rem) * 2)}:host ::ng-deep pre .line.diff.add{background-color:var(--ngs-color-success);display:inline-block;width:100%}@supports (color: color-mix(in lab,red,red)){:host ::ng-deep pre .line.diff.add{background-color:color-mix(in srgb,var(--ngs-color-success),transparent 85%)}}:host ::ng-deep pre .line.diff.add:before{content:\"+\";color:var(--ngs-color-success);position:absolute;left:calc(var(--spacing, .25rem) * 2)}:host ::ng-deep pre .line.highlighted{background-color:var(--ngs-color-primary);display:inline-block;width:100%}@supports (color: color-mix(in lab,red,red)){:host ::ng-deep pre .line.highlighted{background-color:color-mix(in srgb,var(--ngs-color-primary),transparent 92%)}}:host ::ng-deep code{white-space:pre}:host .content{overflow:auto;background:var(--ngs-code-highlighter-bg)}:host .content button{color:inherit}:host .content button ngs-icon.text-green-500{color:var(--ngs-color-success)!important}:host.appearance-bordered figcaption{border:var(--ngs-code-highlighter-border);border-bottom:none;border-top-left-radius:var(--ngs-radius-xl);border-top-right-radius:var(--ngs-radius-xl);width:max-content}:host.appearance-bordered .content{border:var(--ngs-code-highlighter-border);border-radius:var(--ngs-code-highlighter-radius);z-index:0}:host.appearance-bordered:has(figcaption) .content{border-top-left-radius:0}:host.appearance-none .content{border:none;background-color:transparent!important;border-radius:0}:host.appearance-none ::ng-deep pre{padding-left:0;padding-right:0}:host.loading{opacity:.6}\n/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */\n"] }]
341
+ }, template: "<figure class=\"h-full\">\n @if (title()) {\n <figcaption>\n @if (title()) {\n <span class=\"title\">{{ title() }}</span>\n }\n </figcaption>\n }\n\n <div class=\"content relative h-full\">\n @if (showLanguage()) {\n <div class=\"languageName\">{{ displayedLanguage() }}</div>\n }\n\n @if (showCopyButton()) {\n <span class=\"absolute top-2 right-2\">\n <button\n ngsIconButton\n (click)=\"copyCode()\"\n >\n <ngs-icon\n [name]=\"copied() ? 'fluent:checkmark-24-regular' : 'fluent:copy-24-regular'\"\n [class.text-green-500]=\"copied()\"\n />\n </button>\n </span>\n }\n\n <div>\n @if (content()) {\n <div [innerHTML]=\"content()\"></div>\n } @else if (isLoading()) {\n <div class=\"loading\">Loading\u2026</div>\n }\n </div>\n </div>\n</figure>\n", styles: [":host{--ngs-code-highlighter-bg: var(--ngs-color-background);--ngs-code-highlighter-radius: var(--ngs-radius-xl);--ngs-code-highlighter-padding: calc(var(--spacing, .25rem) * 5);--ngs-code-highlighter-margin: calc(var(--spacing, .25rem) * 5);--ngs-code-highlighter-border: 1px solid var(--ngs-color-border);--ngs-code-highlighter-title-padding: calc(var(--spacing, .25rem) * 2) calc(var(--spacing, .25rem) * 3) calc(var(--spacing, .25rem) * 1) calc(var(--spacing, .25rem) * 3);--ngs-code-highlighter-title-color: var(--ngs-color-neutral-500);display:block;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}:host figcaption{font-size:var(--ngs-font-size-xs);font-weight:500;padding:var(--ngs-code-highlighter-title-padding);background:var(--ngs-code-highlighter-bg);color:var(--ngs-code-highlighter-title-color);position:relative;z-index:1}:host figcaption:after{content:\"\";position:absolute;left:0;right:0;bottom:-1px;height:1px;background:var(--ngs-code-highlighter-bg)}:host .languageName{font-size:var(--ngs-font-size-sm);font-weight:600;padding:0 calc(var(--spacing, .25rem) * 6);width:max-content;margin-bottom:calc(var(--spacing, .25rem) * 4);margin-top:calc(calc(var(--spacing, .25rem) * 1) * -1);position:relative}:host ::ng-deep pre{padding:var(--ngs-code-highlighter-padding) 0;line-height:1.75;font-size:var(--ngs-font-size-sm);position:relative}:host ::ng-deep pre code{display:grid}:host ::ng-deep pre .line{padding-left:calc(var(--spacing, .25rem) * 6);padding-right:var(--ngs-code-highlighter-padding);min-height:1.75em}:host ::ng-deep pre .line.diff.remove{background-color:var(--ngs-color-danger);display:inline-block;width:100%}@supports (color: color-mix(in lab,red,red)){:host ::ng-deep pre .line.diff.remove{background-color:color-mix(in srgb,var(--ngs-color-danger),transparent 85%)}}:host ::ng-deep pre .line.diff.remove:before{content:\"-\";color:var(--ngs-color-danger);position:absolute;left:calc(var(--spacing, .25rem) * 2)}:host ::ng-deep pre .line.diff.add{background-color:var(--ngs-color-success);display:inline-block;width:100%}@supports (color: color-mix(in lab,red,red)){:host ::ng-deep pre .line.diff.add{background-color:color-mix(in srgb,var(--ngs-color-success),transparent 85%)}}:host ::ng-deep pre .line.diff.add:before{content:\"+\";color:var(--ngs-color-success);position:absolute;left:calc(var(--spacing, .25rem) * 2)}:host ::ng-deep pre .line.highlighted{background-color:var(--ngs-color-primary);display:inline-block;width:100%}@supports (color: color-mix(in lab,red,red)){:host ::ng-deep pre .line.highlighted{background-color:color-mix(in srgb,var(--ngs-color-primary),transparent 92%)}}:host ::ng-deep code{white-space:pre}:host .content{overflow:auto;background:var(--ngs-code-highlighter-bg)}:host .content button{color:inherit}:host .content button ngs-icon.text-green-500{color:var(--ngs-color-success)!important}:host.appearance-bordered figcaption{border:var(--ngs-code-highlighter-border);border-bottom:none;border-top-left-radius:var(--ngs-radius-xl);border-top-right-radius:var(--ngs-radius-xl);width:max-content}:host.appearance-bordered .content{border:var(--ngs-code-highlighter-border);border-radius:var(--ngs-code-highlighter-radius);z-index:0}:host.appearance-bordered:has(figcaption) .content{border-top-left-radius:0}:host.appearance-none .content{border:none;background-color:transparent!important;border-radius:0}:host.appearance-none ::ng-deep pre{padding-left:0;padding-right:0}:host.loading{opacity:.6}\n/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */\n"] }]
340
342
  }], propDecorators: { code: [{ type: i0.Input, args: [{ isSignal: true, alias: "code", required: true }] }], language: [{ type: i0.Input, args: [{ isSignal: true, alias: "language", required: false }] }], theme: [{ type: i0.Input, args: [{ isSignal: true, alias: "theme", required: false }] }], title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: false }] }], appearance: [{ type: i0.Input, args: [{ isSignal: true, alias: "appearance", required: false }] }], diff: [{ type: i0.Input, args: [{ isSignal: true, alias: "diff", required: false }] }], highlightLines: [{ type: i0.Input, args: [{ isSignal: true, alias: "highlightLines", required: false }] }], showLanguage: [{ type: i0.Input, args: [{ isSignal: true, alias: "showLanguage", required: false }] }], showCopyButton: [{ type: i0.Input, args: [{ isSignal: true, alias: "showCopyButton", required: false }] }] } });
341
343
 
342
344
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"ngstarter-ui-components-code-highlighter.mjs","sources":["../../../projects/components/code-highlighter/src/code-highlighter/code-highlighter.ts","../../../projects/components/code-highlighter/src/code-highlighter/code-highlighter.html","../../../projects/components/code-highlighter/ngstarter-ui-components-code-highlighter.ts"],"sourcesContent":["import { Component, ChangeDetectionStrategy, input, OnChanges, SimpleChanges, signal, computed, inject, booleanAttribute } from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { codeToHtml, ShikiTransformer } from 'shiki';\nimport { Button } from '@ngstarter-ui/components/button';\nimport { Icon } from '@ngstarter-ui/components/icon';\n\nconst removeDiffPrefix = (node: any) => {\n if (!node.children || node.children.length === 0) return;\n\n const firstChild = node.children[0];\n if (firstChild.type === 'element' && firstChild.children && firstChild.children.length > 0) {\n const textNode = firstChild.children[0];\n if (textNode.type === 'text' && (textNode.value.startsWith('+') || textNode.value.startsWith('-'))) {\n textNode.value = textNode.value.slice(1);\n if (textNode.value === '' && firstChild.children.length === 1) {\n node.children.shift();\n }\n }\n } else if (firstChild.type === 'text' && (firstChild.value.startsWith('+') || firstChild.value.startsWith('-'))) {\n firstChild.value = firstChild.value.slice(1);\n if (firstChild.value === '') {\n node.children.shift();\n }\n }\n};\n\nconst diffTransformer: ShikiTransformer = {\n line(node, line) {\n if (this.options.lang === 'diff' || (this.options as any).diff) {\n const lineTokens = this.tokens[line - 1];\n const text = lineTokens.map(token => token.content).join('');\n if (text.startsWith('+')) {\n this.addClassToHast(node, 'diff add');\n removeDiffPrefix(node);\n } else if (text.startsWith('-')) {\n this.addClassToHast(node, 'diff remove');\n removeDiffPrefix(node);\n }\n }\n }\n};\n\n@Component({\n selector: 'ngs-code-highlighter',\n standalone: true,\n imports: [Button, Icon],\n exportAs: 'ngsCodeHighlighter',\n templateUrl: './code-highlighter.html',\n styleUrl: './code-highlighter.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n 'class': 'ngs-code-highlighter not-prose',\n '[class.appearance-bordered]': 'appearance() === \"bordered\"',\n '[class.appearance-none]': 'appearance() === \"none\"',\n }\n})\nexport class CodeHighlighter implements OnChanges {\n private sanitizer = inject(DomSanitizer);\n\n code = input.required<string>();\n language = input<string>('none');\n theme = input<string>('github-light');\n title = input<string | null>(null);\n appearance = input<'none' | 'bordered'>('bordered');\n diff = input<boolean>(false);\n highlightLines = input<number[] | number[][]>([]);\n showLanguage = input(false, { transform: booleanAttribute });\n showCopyButton = input(false, { transform: booleanAttribute });\n\n readonly content = signal<SafeHtml | null>(null);\n readonly isLoading = signal<boolean>(false);\n\n readonly displayedLanguage = computed(() => {\n const lang = this.language();\n if (!lang || lang === 'none') return '';\n\n const langMap: Record<string, string> = {\n '1c': '1C',\n 'abap': 'ABAP',\n 'actionscript-3': 'ActionScript 3',\n 'ada': 'Ada',\n 'apache': 'Apache',\n 'apex': 'Apex',\n 'apl': 'APL',\n 'applescript': 'AppleScript',\n 'ara': 'Ara',\n 'asm': 'Assembly',\n 'astro': 'Astro',\n 'awk': 'AWK',\n 'ballerina': 'Ballerina',\n 'bash': 'Bash',\n 'sh': 'Bash',\n 'batch': 'Batch',\n 'berry': 'Berry',\n 'bibtex': 'BibTeX',\n 'bicep': 'Bicep',\n 'blade': 'Blade',\n 'c': 'C',\n 'cadence': 'Cadence',\n 'clarity': 'Clarity',\n 'clojure': 'Clojure',\n 'clj': 'Clojure',\n 'cmake': 'CMake',\n 'cobol': 'COBOL',\n 'codeql': 'CodeQL',\n 'coffee': 'CoffeeScript',\n 'cpp': 'C++',\n 'csharp': 'C#',\n 'cs': 'C#',\n 'css': 'CSS',\n 'cue': 'CUE',\n 'cypher': 'Cypher',\n 'd': 'D',\n 'dart': 'Dart',\n 'dax': 'DAX',\n 'diff': 'Diff',\n 'docker': 'Docker',\n 'dockerfile': 'Dockerfile',\n 'dream-maker': 'Dream Maker',\n 'elixir': 'Elixir',\n 'elm': 'Elm',\n 'erb': 'ERB',\n 'erlang': 'Erlang',\n 'fish': 'Fish',\n 'fsharp': 'F#',\n 'fs': 'F#',\n 'gdresource': 'GDResource',\n 'gdscript': 'GDScript',\n 'gdshader': 'GDShader',\n 'gherkin': 'Gherkin',\n 'git-commit': 'Git Commit',\n 'git-rebase': 'Git Rebase',\n 'glimmer-js': 'Glimmer JS',\n 'gljs': 'Glimmer JS',\n 'glsl': 'GLSL',\n 'gnuplot': 'Gnuplot',\n 'go': 'Go',\n 'graphql': 'GraphQL',\n 'groovy': 'Groovy',\n 'hack': 'Hack',\n 'haml': 'Haml',\n 'handlebars': 'Handlebars',\n 'hbs': 'Handlebars',\n 'haskell': 'Haskell',\n 'hs': 'Haskell',\n 'hcl': 'HCL',\n 'hjson': 'Hjson',\n 'hlsl': 'HLSL',\n 'html': 'HTML',\n 'http': 'HTTP',\n 'imba': 'Imba',\n 'ini': 'INI',\n 'java': 'Java',\n 'javascript': 'JavaScript',\n 'js': 'JavaScript',\n 'jinja-html': 'Jinja HTML',\n 'jjson': 'JJSON',\n 'json': 'JSON',\n 'json5': 'JSON5',\n 'jsonc': 'JSONC',\n 'jsonnet': 'Jsonnet',\n 'jssm': 'JSSM',\n 'jsx': 'JSX',\n 'julia': 'Julia',\n 'kotlin': 'Kotlin',\n 'kt': 'Kotlin',\n 'kts': 'Kotlin',\n 'kusto': 'Kusto',\n 'latex': 'LaTeX',\n 'lat': 'LaTeX',\n 'tex': 'LaTeX',\n 'lean': 'Lean',\n 'less': 'Less',\n 'liquid': 'Liquid',\n 'lisp': 'Lisp',\n 'logo': 'Logo',\n 'lua': 'Lua',\n 'make': 'Make',\n 'makefile': 'Makefile',\n 'markdown': 'Markdown',\n 'md': 'Markdown',\n 'marko': 'Marko',\n 'matlab': 'MATLAB',\n 'mdx': 'MDX',\n 'mermaid': 'Mermaid',\n 'mipsasm': 'MIPS Assembly',\n 'mips': 'MIPS Assembly',\n 'mojolicious': 'Mojolicious',\n 'move': 'Move',\n 'narrat': 'Narrat',\n 'nextflow': 'Nextflow',\n 'nginx': 'Nginx',\n 'nim': 'Nim',\n 'nix': 'Nix',\n 'objective-c': 'Objective-C',\n 'objc': 'Objective-C',\n 'objective-cpp': 'Objective-C++',\n 'ocaml': 'OCaml',\n 'pascal': 'Pascal',\n 'perl': 'Perl',\n 'pl': 'Perl',\n 'php': 'PHP',\n 'plsql': 'PL/SQL',\n 'postcss': 'PostCSS',\n 'powerquery': 'PowerQuery',\n 'powershell': 'PowerShell',\n 'ps1': 'PowerShell',\n 'prisma': 'Prisma',\n 'prolog': 'Prolog',\n 'proto': 'Protocol Buffers',\n 'pug': 'Pug',\n 'jade': 'Pug',\n 'puppet': 'Puppet',\n 'purescript': 'PureScript',\n 'python': 'Python',\n 'py': 'Python',\n 'r': 'R',\n 'raku': 'Raku',\n 'razor': 'Razor',\n 'reg': 'Registry',\n 'rel': 'Rel',\n 'riscv': 'RISC-V',\n 'rst': 'reStructuredText',\n 'ruby': 'Ruby',\n 'rb': 'Ruby',\n 'rust': 'Rust',\n 'rs': 'Rust',\n 'sas': 'SAS',\n 'sass': 'Sass',\n 'scala': 'Scala',\n 'scheme': 'Scheme',\n 'scss': 'SCSS',\n 'shaderlab': 'ShaderLab',\n 'shader': 'ShaderLab',\n 'shell': 'Shell',\n 'shellscript': 'Shell',\n 'smalltalk': 'Smalltalk',\n 'solidity': 'Solidity',\n 'sparql': 'SPARQL',\n 'sql': 'SQL',\n 'ssh-config': 'SSH Config',\n 'stata': 'Stata',\n 'stylus': 'Stylus',\n 'styl': 'Stylus',\n 'svelte': 'Svelte',\n 'swift': 'Swift',\n 'system-verilog': 'SystemVerilog',\n 'tasl': 'Tasl',\n 'tcl': 'Tcl',\n 'terraform': 'Terraform',\n 'tf': 'Terraform',\n 'toml': 'TOML',\n 'tsx': 'TSX',\n 'turtle': 'Turtle',\n 'twig': 'Twig',\n 'typescript': 'TypeScript',\n 'ts': 'TypeScript',\n 'v': 'V',\n 'vb': 'Visual Basic',\n 'verilog': 'Verilog',\n 'vhdl': 'VHDL',\n 'viml': 'VimL',\n 'vim': 'VimL',\n 'vue': 'Vue',\n 'vyper': 'Vyper',\n 'wasm': 'WebAssembly',\n 'wenyan': 'Wenyan',\n 'wgsl': 'WGSL',\n 'wolfram': 'Wolfram',\n 'xml': 'XML',\n 'xsl': 'XSL',\n 'yaml': 'YAML',\n 'yml': 'YAML',\n 'zenscript': 'ZenScript',\n 'zig': 'Zig',\n 'zsh': 'Zsh',\n };\n\n return langMap[lang.toLowerCase()] || lang;\n });\n\n private getHighlightTransformer(): ShikiTransformer {\n const highlights = this.highlightLines();\n if (!highlights || (Array.isArray(highlights) && highlights.length === 0)) {\n return {};\n }\n\n const isHighlighted = (line: number): boolean => {\n if (Array.isArray(highlights[0])) {\n return (highlights as number[][]).some(([start, end]) => line >= start && line <= end);\n } else {\n const [start, end] = highlights as number[];\n return line >= start && line <= end;\n }\n };\n\n return {\n line(node, line) {\n if (isHighlighted(line)) {\n this.addClassToHast(node, 'highlighted');\n }\n }\n };\n }\n\n async ngOnChanges(changes: SimpleChanges) {\n if (!this.code()) {\n this.content.set(null);\n return;\n }\n this.isLoading.set(true);\n try {\n const highlighted = await codeToHtml(\n this.code(),\n {\n lang: this.language(),\n theme: this.theme(),\n transformers: [diffTransformer, this.getHighlightTransformer()],\n diff: this.diff()\n } as any\n );\n this.content.set(this.sanitizer.bypassSecurityTrustHtml(highlighted));\n } catch (e) {\n // Fallback: raw code escaped inside pre\n const escaped = this.code()\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;');\n const fallback = `<pre class=\"shiki\"><code>${escaped}</code></pre>`;\n this.content.set(this.sanitizer.bypassSecurityTrustHtml(fallback));\n console.error('CodeHighlighter error:', e);\n } finally {\n this.isLoading.set(false);\n }\n }\n\n copied = signal(false);\n private copyTimeout?: any;\n\n copyCode() {\n if (this.code()) {\n navigator.clipboard.writeText(this.code());\n this.copied.set(true);\n\n if (this.copyTimeout) {\n clearTimeout(this.copyTimeout);\n }\n\n this.copyTimeout = setTimeout(() => {\n this.copied.set(false);\n this.copyTimeout = undefined;\n }, 2000);\n }\n }\n}\n","<figure>\n @if (title()) {\n <figcaption>\n @if (title()) {\n <span class=\"title\">{{ title() }}</span>\n }\n </figcaption>\n }\n\n <div class=\"content relative\">\n @if (showLanguage()) {\n <div class=\"languageName\">{{ displayedLanguage() }}</div>\n }\n\n @if (showCopyButton()) {\n <span class=\"absolute top-2 right-2\">\n <button\n ngsIconButton\n (click)=\"copyCode()\"\n >\n <ngs-icon\n [name]=\"copied() ? 'fluent:checkmark-24-regular' : 'fluent:copy-24-regular'\"\n [class.text-green-500]=\"copied()\"\n />\n </button>\n </span>\n }\n\n <div>\n @if (content()) {\n <div [innerHTML]=\"content()\"></div>\n } @else {\n <div class=\"loading\">Loading…</div>\n }\n </div>\n </div>\n</figure>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ngstarter-ui-components-code-highlighter.mjs","sources":["../../../projects/components/code-highlighter/src/code-highlighter/code-highlighter.ts","../../../projects/components/code-highlighter/src/code-highlighter/code-highlighter.html","../../../projects/components/code-highlighter/ngstarter-ui-components-code-highlighter.ts"],"sourcesContent":["import { Component, ChangeDetectionStrategy, input, OnChanges, SimpleChanges, signal, computed, inject, booleanAttribute } from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { codeToHtml, ShikiTransformer } from 'shiki';\nimport { Button } from '@ngstarter-ui/components/button';\nimport { Icon } from '@ngstarter-ui/components/icon';\n\nconst removeDiffPrefix = (node: any) => {\n if (!node.children || node.children.length === 0) return;\n\n const firstChild = node.children[0];\n if (firstChild.type === 'element' && firstChild.children && firstChild.children.length > 0) {\n const textNode = firstChild.children[0];\n if (textNode.type === 'text' && (textNode.value.startsWith('+') || textNode.value.startsWith('-'))) {\n textNode.value = textNode.value.slice(1);\n if (textNode.value === '' && firstChild.children.length === 1) {\n node.children.shift();\n }\n }\n } else if (firstChild.type === 'text' && (firstChild.value.startsWith('+') || firstChild.value.startsWith('-'))) {\n firstChild.value = firstChild.value.slice(1);\n if (firstChild.value === '') {\n node.children.shift();\n }\n }\n};\n\nconst diffTransformer: ShikiTransformer = {\n line(node, line) {\n if (this.options.lang === 'diff' || (this.options as any).diff) {\n const lineTokens = this.tokens[line - 1];\n const text = lineTokens.map(token => token.content).join('');\n if (text.startsWith('+')) {\n this.addClassToHast(node, 'diff add');\n removeDiffPrefix(node);\n } else if (text.startsWith('-')) {\n this.addClassToHast(node, 'diff remove');\n removeDiffPrefix(node);\n }\n }\n }\n};\n\n@Component({\n selector: 'ngs-code-highlighter',\n standalone: true,\n imports: [Button, Icon],\n exportAs: 'ngsCodeHighlighter',\n templateUrl: './code-highlighter.html',\n styleUrl: './code-highlighter.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n 'class': 'ngs-code-highlighter not-prose',\n '[class.appearance-bordered]': 'appearance() === \"bordered\"',\n '[class.appearance-none]': 'appearance() === \"none\"',\n }\n})\nexport class CodeHighlighter implements OnChanges {\n private sanitizer = inject(DomSanitizer);\n\n code = input.required<string>();\n language = input<string>('none');\n theme = input<string>('github-light');\n title = input<string | null>(null);\n appearance = input<'none' | 'bordered'>('bordered');\n diff = input<boolean>(false);\n highlightLines = input<number[] | number[][]>([]);\n showLanguage = input(false, { transform: booleanAttribute });\n showCopyButton = input(false, { transform: booleanAttribute });\n\n readonly content = signal<SafeHtml | null>(null);\n readonly isLoading = signal<boolean>(false);\n\n readonly displayedLanguage = computed(() => {\n const lang = this.language();\n if (!lang || lang === 'none') return '';\n\n const langMap: Record<string, string> = {\n '1c': '1C',\n 'abap': 'ABAP',\n 'actionscript-3': 'ActionScript 3',\n 'ada': 'Ada',\n 'apache': 'Apache',\n 'apex': 'Apex',\n 'apl': 'APL',\n 'applescript': 'AppleScript',\n 'ara': 'Ara',\n 'asm': 'Assembly',\n 'astro': 'Astro',\n 'awk': 'AWK',\n 'ballerina': 'Ballerina',\n 'bash': 'Bash',\n 'sh': 'Bash',\n 'batch': 'Batch',\n 'berry': 'Berry',\n 'bibtex': 'BibTeX',\n 'bicep': 'Bicep',\n 'blade': 'Blade',\n 'c': 'C',\n 'cadence': 'Cadence',\n 'clarity': 'Clarity',\n 'clojure': 'Clojure',\n 'clj': 'Clojure',\n 'cmake': 'CMake',\n 'cobol': 'COBOL',\n 'codeql': 'CodeQL',\n 'coffee': 'CoffeeScript',\n 'cpp': 'C++',\n 'csharp': 'C#',\n 'cs': 'C#',\n 'css': 'CSS',\n 'cue': 'CUE',\n 'cypher': 'Cypher',\n 'd': 'D',\n 'dart': 'Dart',\n 'dax': 'DAX',\n 'diff': 'Diff',\n 'docker': 'Docker',\n 'dockerfile': 'Dockerfile',\n 'dream-maker': 'Dream Maker',\n 'elixir': 'Elixir',\n 'elm': 'Elm',\n 'erb': 'ERB',\n 'erlang': 'Erlang',\n 'fish': 'Fish',\n 'fsharp': 'F#',\n 'fs': 'F#',\n 'gdresource': 'GDResource',\n 'gdscript': 'GDScript',\n 'gdshader': 'GDShader',\n 'gherkin': 'Gherkin',\n 'git-commit': 'Git Commit',\n 'git-rebase': 'Git Rebase',\n 'glimmer-js': 'Glimmer JS',\n 'gljs': 'Glimmer JS',\n 'glsl': 'GLSL',\n 'gnuplot': 'Gnuplot',\n 'go': 'Go',\n 'graphql': 'GraphQL',\n 'groovy': 'Groovy',\n 'hack': 'Hack',\n 'haml': 'Haml',\n 'handlebars': 'Handlebars',\n 'hbs': 'Handlebars',\n 'haskell': 'Haskell',\n 'hs': 'Haskell',\n 'hcl': 'HCL',\n 'hjson': 'Hjson',\n 'hlsl': 'HLSL',\n 'html': 'HTML',\n 'http': 'HTTP',\n 'imba': 'Imba',\n 'ini': 'INI',\n 'java': 'Java',\n 'javascript': 'JavaScript',\n 'js': 'JavaScript',\n 'jinja-html': 'Jinja HTML',\n 'jjson': 'JJSON',\n 'json': 'JSON',\n 'json5': 'JSON5',\n 'jsonc': 'JSONC',\n 'jsonnet': 'Jsonnet',\n 'jssm': 'JSSM',\n 'jsx': 'JSX',\n 'julia': 'Julia',\n 'kotlin': 'Kotlin',\n 'kt': 'Kotlin',\n 'kts': 'Kotlin',\n 'kusto': 'Kusto',\n 'latex': 'LaTeX',\n 'lat': 'LaTeX',\n 'tex': 'LaTeX',\n 'lean': 'Lean',\n 'less': 'Less',\n 'liquid': 'Liquid',\n 'lisp': 'Lisp',\n 'logo': 'Logo',\n 'lua': 'Lua',\n 'make': 'Make',\n 'makefile': 'Makefile',\n 'markdown': 'Markdown',\n 'md': 'Markdown',\n 'marko': 'Marko',\n 'matlab': 'MATLAB',\n 'mdx': 'MDX',\n 'mermaid': 'Mermaid',\n 'mipsasm': 'MIPS Assembly',\n 'mips': 'MIPS Assembly',\n 'mojolicious': 'Mojolicious',\n 'move': 'Move',\n 'narrat': 'Narrat',\n 'nextflow': 'Nextflow',\n 'nginx': 'Nginx',\n 'nim': 'Nim',\n 'nix': 'Nix',\n 'objective-c': 'Objective-C',\n 'objc': 'Objective-C',\n 'objective-cpp': 'Objective-C++',\n 'ocaml': 'OCaml',\n 'pascal': 'Pascal',\n 'perl': 'Perl',\n 'pl': 'Perl',\n 'php': 'PHP',\n 'plsql': 'PL/SQL',\n 'postcss': 'PostCSS',\n 'powerquery': 'PowerQuery',\n 'powershell': 'PowerShell',\n 'ps1': 'PowerShell',\n 'prisma': 'Prisma',\n 'prolog': 'Prolog',\n 'proto': 'Protocol Buffers',\n 'pug': 'Pug',\n 'jade': 'Pug',\n 'puppet': 'Puppet',\n 'purescript': 'PureScript',\n 'python': 'Python',\n 'py': 'Python',\n 'r': 'R',\n 'raku': 'Raku',\n 'razor': 'Razor',\n 'reg': 'Registry',\n 'rel': 'Rel',\n 'riscv': 'RISC-V',\n 'rst': 'reStructuredText',\n 'ruby': 'Ruby',\n 'rb': 'Ruby',\n 'rust': 'Rust',\n 'rs': 'Rust',\n 'sas': 'SAS',\n 'sass': 'Sass',\n 'scala': 'Scala',\n 'scheme': 'Scheme',\n 'scss': 'SCSS',\n 'shaderlab': 'ShaderLab',\n 'shader': 'ShaderLab',\n 'shell': 'Shell',\n 'shellscript': 'Shell',\n 'smalltalk': 'Smalltalk',\n 'solidity': 'Solidity',\n 'sparql': 'SPARQL',\n 'sql': 'SQL',\n 'ssh-config': 'SSH Config',\n 'stata': 'Stata',\n 'stylus': 'Stylus',\n 'styl': 'Stylus',\n 'svelte': 'Svelte',\n 'swift': 'Swift',\n 'system-verilog': 'SystemVerilog',\n 'tasl': 'Tasl',\n 'tcl': 'Tcl',\n 'terraform': 'Terraform',\n 'tf': 'Terraform',\n 'toml': 'TOML',\n 'tsx': 'TSX',\n 'turtle': 'Turtle',\n 'twig': 'Twig',\n 'typescript': 'TypeScript',\n 'ts': 'TypeScript',\n 'v': 'V',\n 'vb': 'Visual Basic',\n 'verilog': 'Verilog',\n 'vhdl': 'VHDL',\n 'viml': 'VimL',\n 'vim': 'VimL',\n 'vue': 'Vue',\n 'vyper': 'Vyper',\n 'wasm': 'WebAssembly',\n 'wenyan': 'Wenyan',\n 'wgsl': 'WGSL',\n 'wolfram': 'Wolfram',\n 'xml': 'XML',\n 'xsl': 'XSL',\n 'yaml': 'YAML',\n 'yml': 'YAML',\n 'zenscript': 'ZenScript',\n 'zig': 'Zig',\n 'zsh': 'Zsh',\n };\n\n return langMap[lang.toLowerCase()] || lang;\n });\n\n private getHighlightTransformer(): ShikiTransformer {\n const highlights = this.highlightLines();\n if (!highlights || (Array.isArray(highlights) && highlights.length === 0)) {\n return {};\n }\n\n const isHighlighted = (line: number): boolean => {\n if (Array.isArray(highlights[0])) {\n return (highlights as number[][]).some(([start, end]) => line >= start && line <= end);\n } else {\n const [start, end] = highlights as number[];\n return line >= start && line <= end;\n }\n };\n\n return {\n line(node, line) {\n if (isHighlighted(line)) {\n this.addClassToHast(node, 'highlighted');\n }\n }\n };\n }\n\n async ngOnChanges(changes: SimpleChanges) {\n const code = this.code() ?? '';\n\n if (code.length === 0) {\n this.isLoading.set(false);\n this.content.set(this.sanitizer.bypassSecurityTrustHtml('<pre class=\"shiki\"><code></code></pre>'));\n return;\n }\n\n this.isLoading.set(true);\n try {\n const highlighted = await codeToHtml(\n code,\n {\n lang: this.language(),\n theme: this.theme(),\n transformers: [diffTransformer, this.getHighlightTransformer()],\n diff: this.diff()\n } as any\n );\n this.content.set(this.sanitizer.bypassSecurityTrustHtml(highlighted));\n } catch (e) {\n // Fallback: raw code escaped inside pre\n const escaped = code\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;');\n const fallback = `<pre class=\"shiki\"><code>${escaped}</code></pre>`;\n this.content.set(this.sanitizer.bypassSecurityTrustHtml(fallback));\n console.error('CodeHighlighter error:', e);\n } finally {\n this.isLoading.set(false);\n }\n }\n\n copied = signal(false);\n private copyTimeout?: any;\n\n copyCode() {\n if (this.code()) {\n navigator.clipboard.writeText(this.code());\n this.copied.set(true);\n\n if (this.copyTimeout) {\n clearTimeout(this.copyTimeout);\n }\n\n this.copyTimeout = setTimeout(() => {\n this.copied.set(false);\n this.copyTimeout = undefined;\n }, 2000);\n }\n }\n}\n","<figure class=\"h-full\">\n @if (title()) {\n <figcaption>\n @if (title()) {\n <span class=\"title\">{{ title() }}</span>\n }\n </figcaption>\n }\n\n <div class=\"content relative h-full\">\n @if (showLanguage()) {\n <div class=\"languageName\">{{ displayedLanguage() }}</div>\n }\n\n @if (showCopyButton()) {\n <span class=\"absolute top-2 right-2\">\n <button\n ngsIconButton\n (click)=\"copyCode()\"\n >\n <ngs-icon\n [name]=\"copied() ? 'fluent:checkmark-24-regular' : 'fluent:copy-24-regular'\"\n [class.text-green-500]=\"copied()\"\n />\n </button>\n </span>\n }\n\n <div>\n @if (content()) {\n <div [innerHTML]=\"content()\"></div>\n } @else if (isLoading()) {\n <div class=\"loading\">Loading…</div>\n }\n </div>\n </div>\n</figure>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -98,7 +98,7 @@ class Drawer {
98
98
  provide: DRAWER,
99
99
  useExisting: forwardRef(() => Drawer),
100
100
  }
101
- ], viewQueries: [{ propertyName: "portal", first: true, predicate: ["portal"], descendants: true, isSignal: true }], exportAs: ["ngsDrawer"], ngImport: i0, template: "<ng-template #portal>\n <div\n class=\"ngs-drawer-container\"\n [class.open]=\"_isOpen()\">\n <div class=\"ngs-drawer-content\">\n <ng-content/>\n </div>\n </div>\n</ng-template>\n", styles: [".ngs-drawer-container{--ngs-drawer-transition-duration: .15s;--ngs-drawer-transition: cubic-bezier(.4,0,.2,1);position:fixed;z-index:1040;top:0;right:0;max-width:90vw;bottom:0;transform:translate(100%);visibility:hidden;display:flex;flex-direction:column;pointer-events:auto}.ngs-drawer-container.open{transform:translate(0);visibility:visible;transition:transform .3s var(--ngs-drawer-transition),visibility 0s linear 0s}.ngs-drawer-container:not(.open){transition:transform .2s var(--ngs-drawer-transition),visibility 0s linear .2s}.ngs-drawer-content{background:var(--ngs-color-surface-container-lowest);box-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a;outline:var(--ngs-dropdown-border);margin:1.75rem;flex-grow:1;overflow:hidden;border-radius:1rem;border:1px solid transparent}.drawer-backdrop{background:var(--ngs-overlay-backdrop-bg);opacity:0;transition:opacity .15s cubic-bezier(.4,0,.2,1)}.drawer-backdrop.cdk-overlay-backdrop-showing{opacity:1}.cdk-overlay-pane.pointer-events-none{pointer-events:none!important}\n/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
101
+ ], viewQueries: [{ propertyName: "portal", first: true, predicate: ["portal"], descendants: true, isSignal: true }], exportAs: ["ngsDrawer"], ngImport: i0, template: "<ng-template #portal>\n <div\n class=\"ngs-drawer-container\"\n [class.open]=\"_isOpen()\">\n <div class=\"ngs-drawer-content\">\n <ng-content/>\n </div>\n </div>\n</ng-template>\n", styles: [".ngs-drawer-container{--ngs-drawer-transition-duration: .15s;--ngs-drawer-transition: cubic-bezier(.4,0,.2,1);position:fixed;z-index:1040;top:0;right:0;max-width:90vw;bottom:0;transform:translate(100%);visibility:hidden;display:flex;flex-direction:column;min-height:0;pointer-events:auto}.ngs-drawer-container.open{transform:translate(0);visibility:visible;transition:transform .3s var(--ngs-drawer-transition),visibility 0s linear 0s}.ngs-drawer-container:not(.open){transition:transform .2s var(--ngs-drawer-transition),visibility 0s linear .2s}.ngs-drawer-content{background:var(--ngs-color-surface-container-lowest);box-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a;outline:var(--ngs-dropdown-border);margin:1.75rem;display:flex;flex:1 1 auto;flex-direction:column;min-height:0;overflow:hidden;border-radius:1rem;border:1px solid transparent}.drawer-backdrop{background:var(--ngs-overlay-backdrop-bg);opacity:0;transition:opacity .15s cubic-bezier(.4,0,.2,1)}.drawer-backdrop.cdk-overlay-backdrop-showing{opacity:1}.cdk-overlay-pane.pointer-events-none{pointer-events:none!important}\n/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
102
102
  }
103
103
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: Drawer, decorators: [{
104
104
  type: Component,
@@ -107,7 +107,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImpor
107
107
  provide: DRAWER,
108
108
  useExisting: forwardRef(() => Drawer),
109
109
  }
110
- ], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-template #portal>\n <div\n class=\"ngs-drawer-container\"\n [class.open]=\"_isOpen()\">\n <div class=\"ngs-drawer-content\">\n <ng-content/>\n </div>\n </div>\n</ng-template>\n", styles: [".ngs-drawer-container{--ngs-drawer-transition-duration: .15s;--ngs-drawer-transition: cubic-bezier(.4,0,.2,1);position:fixed;z-index:1040;top:0;right:0;max-width:90vw;bottom:0;transform:translate(100%);visibility:hidden;display:flex;flex-direction:column;pointer-events:auto}.ngs-drawer-container.open{transform:translate(0);visibility:visible;transition:transform .3s var(--ngs-drawer-transition),visibility 0s linear 0s}.ngs-drawer-container:not(.open){transition:transform .2s var(--ngs-drawer-transition),visibility 0s linear .2s}.ngs-drawer-content{background:var(--ngs-color-surface-container-lowest);box-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a;outline:var(--ngs-dropdown-border);margin:1.75rem;flex-grow:1;overflow:hidden;border-radius:1rem;border:1px solid transparent}.drawer-backdrop{background:var(--ngs-overlay-backdrop-bg);opacity:0;transition:opacity .15s cubic-bezier(.4,0,.2,1)}.drawer-backdrop.cdk-overlay-backdrop-showing{opacity:1}.cdk-overlay-pane.pointer-events-none{pointer-events:none!important}\n/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */\n"] }]
110
+ ], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-template #portal>\n <div\n class=\"ngs-drawer-container\"\n [class.open]=\"_isOpen()\">\n <div class=\"ngs-drawer-content\">\n <ng-content/>\n </div>\n </div>\n</ng-template>\n", styles: [".ngs-drawer-container{--ngs-drawer-transition-duration: .15s;--ngs-drawer-transition: cubic-bezier(.4,0,.2,1);position:fixed;z-index:1040;top:0;right:0;max-width:90vw;bottom:0;transform:translate(100%);visibility:hidden;display:flex;flex-direction:column;min-height:0;pointer-events:auto}.ngs-drawer-container.open{transform:translate(0);visibility:visible;transition:transform .3s var(--ngs-drawer-transition),visibility 0s linear 0s}.ngs-drawer-container:not(.open){transition:transform .2s var(--ngs-drawer-transition),visibility 0s linear .2s}.ngs-drawer-content{background:var(--ngs-color-surface-container-lowest);box-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a;outline:var(--ngs-dropdown-border);margin:1.75rem;display:flex;flex:1 1 auto;flex-direction:column;min-height:0;overflow:hidden;border-radius:1rem;border:1px solid transparent}.drawer-backdrop{background:var(--ngs-overlay-backdrop-bg);opacity:0;transition:opacity .15s cubic-bezier(.4,0,.2,1)}.drawer-backdrop.cdk-overlay-backdrop-showing{opacity:1}.cdk-overlay-pane.pointer-events-none{pointer-events:none!important}\n/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */\n"] }]
111
111
  }], ctorParameters: () => [], propDecorators: { initialIsOpen: [{ type: i0.Input, args: [{ isSignal: true, alias: "isOpen", required: false }] }], showBackdrop: [{ type: i0.Input, args: [{ isSignal: true, alias: "showBackdrop", required: false }] }], closed: [{ type: i0.Output, args: ["closed"] }], opened: [{ type: i0.Output, args: ["opened"] }], portal: [{ type: i0.ViewChild, args: ['portal', { isSignal: true }] }] } });
112
112
 
113
113
  class DrawerIgnoreOutsideClickDirective {
@@ -1 +1 @@
1
- {"version":3,"file":"ngstarter-ui-components-drawer.mjs","sources":["../../../projects/components/drawer/src/types.ts","../../../projects/components/drawer/src/drawer/drawer.ts","../../../projects/components/drawer/src/drawer/drawer.html","../../../projects/components/drawer/src/drawer-ignore-outside-click.directive.ts","../../../projects/components/drawer/ngstarter-ui-components-drawer.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n\nexport const DRAWER = new InjectionToken('DRAWER');\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n effect,\n forwardRef,\n inject,\n input,\n OnDestroy,\n output,\n signal,\n Signal,\n TemplateRef,\n viewChild,\n ViewContainerRef,\n ViewEncapsulation,\n WritableSignal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { DRAWER } from '../types';\nimport { Overlay, OverlayRef } from '@angular/cdk/overlay';\nimport { TemplatePortal } from '@angular/cdk/portal';\nimport { timer } from 'rxjs';\n\n@Component({\n selector: 'ngs-drawer',\n exportAs: 'ngsDrawer',\n templateUrl: './drawer.html',\n styleUrl: './drawer.scss',\n standalone: true,\n providers: [\n {\n provide: DRAWER,\n useExisting: forwardRef(() => Drawer),\n }\n ],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class Drawer implements OnDestroy {\n private overlay = inject(Overlay);\n private viewContainerRef = inject(ViewContainerRef);\n private destroyRef = inject(DestroyRef);\n\n readonly initialIsOpen = input<boolean | undefined>(undefined, { alias: 'isOpen' });\n readonly showBackdrop = input(true);\n\n readonly closed = output<void>();\n readonly opened = output<void>();\n\n private internalIsOpen: WritableSignal<boolean> = signal(false);\n private overlayRef: OverlayRef | null = null;\n protected portal = viewChild.required<TemplateRef<any>>('portal');\n\n protected _isOpen: Signal<boolean> = computed(() => this.internalIsOpen());\n\n constructor() {\n effect(() => {\n const externalIsOpen = this.initialIsOpen();\n if (externalIsOpen !== undefined) {\n if (externalIsOpen) {\n this.open();\n } else {\n this.close();\n }\n }\n });\n }\n\n ngOnDestroy() {\n this.close();\n }\n\n open(): void {\n if (this.internalIsOpen()) {\n return;\n }\n\n if (!this.overlayRef) {\n this.overlayRef = this.overlay.create({\n hasBackdrop: this.showBackdrop(),\n backdropClass: 'drawer-backdrop',\n positionStrategy: this.overlay.position().global().right('0').top('0').bottom('0'),\n scrollStrategy: this.overlay.scrollStrategies.block()\n });\n\n this.overlayRef.backdropClick().subscribe(() => {\n this.close();\n });\n\n this.overlayRef.outsidePointerEvents().subscribe((event: MouseEvent) => {\n const target = event.target as HTMLElement;\n\n if (target.closest('.ngs-drawer-ignore-outside-click')) {\n return;\n }\n\n this.close();\n });\n\n this.overlayRef.keydownEvents().subscribe(event => {\n if (event.key === 'Escape') {\n this.close();\n }\n });\n }\n\n const portal = new TemplatePortal(this.portal(), this.viewContainerRef);\n this.overlayRef.attach(portal);\n\n if (!this.showBackdrop()) {\n this.overlayRef.hostElement.classList.add('pointer-events-none');\n }\n\n // Delay setting internalIsOpen to true to ensure the entry animation triggers\n setTimeout(() => {\n this.internalIsOpen.set(true);\n });\n\n this.opened.emit();\n }\n\n close(): void {\n if (!this.internalIsOpen()) {\n return;\n }\n\n this.internalIsOpen.set(false);\n\n timer(150)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n if (this.overlayRef) {\n this.overlayRef.detach();\n this.overlayRef.dispose();\n this.overlayRef = null;\n }\n this.closed.emit();\n });\n }\n\n get isOpened(): boolean {\n return this._isOpen();\n }\n}\n","<ng-template #portal>\n <div\n class=\"ngs-drawer-container\"\n [class.open]=\"_isOpen()\">\n <div class=\"ngs-drawer-content\">\n <ng-content/>\n </div>\n </div>\n</ng-template>\n","import { Directive } from '@angular/core';\n\n@Directive({\n selector: '[ngsDrawerIgnoreOutsideClick]',\n host: {\n 'class': 'ngs-drawer-ignore-outside-click'\n }\n})\nexport class DrawerIgnoreOutsideClickDirective {\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ngstarter-ui-components-drawer.mjs","sources":["../../../projects/components/drawer/src/types.ts","../../../projects/components/drawer/src/drawer/drawer.ts","../../../projects/components/drawer/src/drawer/drawer.html","../../../projects/components/drawer/src/drawer-ignore-outside-click.directive.ts","../../../projects/components/drawer/ngstarter-ui-components-drawer.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n\nexport const DRAWER = new InjectionToken('DRAWER');\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n effect,\n forwardRef,\n inject,\n input,\n OnDestroy,\n output,\n signal,\n Signal,\n TemplateRef,\n viewChild,\n ViewContainerRef,\n ViewEncapsulation,\n WritableSignal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { DRAWER } from '../types';\nimport { Overlay, OverlayRef } from '@angular/cdk/overlay';\nimport { TemplatePortal } from '@angular/cdk/portal';\nimport { timer } from 'rxjs';\n\n@Component({\n selector: 'ngs-drawer',\n exportAs: 'ngsDrawer',\n templateUrl: './drawer.html',\n styleUrl: './drawer.scss',\n standalone: true,\n providers: [\n {\n provide: DRAWER,\n useExisting: forwardRef(() => Drawer),\n }\n ],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class Drawer implements OnDestroy {\n private overlay = inject(Overlay);\n private viewContainerRef = inject(ViewContainerRef);\n private destroyRef = inject(DestroyRef);\n\n readonly initialIsOpen = input<boolean | undefined>(undefined, { alias: 'isOpen' });\n readonly showBackdrop = input(true);\n\n readonly closed = output<void>();\n readonly opened = output<void>();\n\n private internalIsOpen: WritableSignal<boolean> = signal(false);\n private overlayRef: OverlayRef | null = null;\n protected portal = viewChild.required<TemplateRef<any>>('portal');\n\n protected _isOpen: Signal<boolean> = computed(() => this.internalIsOpen());\n\n constructor() {\n effect(() => {\n const externalIsOpen = this.initialIsOpen();\n if (externalIsOpen !== undefined) {\n if (externalIsOpen) {\n this.open();\n } else {\n this.close();\n }\n }\n });\n }\n\n ngOnDestroy() {\n this.close();\n }\n\n open(): void {\n if (this.internalIsOpen()) {\n return;\n }\n\n if (!this.overlayRef) {\n this.overlayRef = this.overlay.create({\n hasBackdrop: this.showBackdrop(),\n backdropClass: 'drawer-backdrop',\n positionStrategy: this.overlay.position().global().right('0').top('0').bottom('0'),\n scrollStrategy: this.overlay.scrollStrategies.block()\n });\n\n this.overlayRef.backdropClick().subscribe(() => {\n this.close();\n });\n\n this.overlayRef.outsidePointerEvents().subscribe((event: MouseEvent) => {\n const target = event.target as HTMLElement;\n\n if (target.closest('.ngs-drawer-ignore-outside-click')) {\n return;\n }\n\n this.close();\n });\n\n this.overlayRef.keydownEvents().subscribe(event => {\n if (event.key === 'Escape') {\n this.close();\n }\n });\n }\n\n const portal = new TemplatePortal(this.portal(), this.viewContainerRef);\n this.overlayRef.attach(portal);\n\n if (!this.showBackdrop()) {\n this.overlayRef.hostElement.classList.add('pointer-events-none');\n }\n\n // Delay setting internalIsOpen to true to ensure the entry animation triggers\n setTimeout(() => {\n this.internalIsOpen.set(true);\n });\n\n this.opened.emit();\n }\n\n close(): void {\n if (!this.internalIsOpen()) {\n return;\n }\n\n this.internalIsOpen.set(false);\n\n timer(150)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => {\n if (this.overlayRef) {\n this.overlayRef.detach();\n this.overlayRef.dispose();\n this.overlayRef = null;\n }\n this.closed.emit();\n });\n }\n\n get isOpened(): boolean {\n return this._isOpen();\n }\n}\n","<ng-template #portal>\n <div\n class=\"ngs-drawer-container\"\n [class.open]=\"_isOpen()\">\n <div class=\"ngs-drawer-content\">\n <ng-content/>\n </div>\n </div>\n</ng-template>\n","import { Directive } from '@angular/core';\n\n@Directive({\n selector: '[ngsDrawerIgnoreOutsideClick]',\n host: {\n 'class': 'ngs-drawer-ignore-outside-click'\n }\n})\nexport class DrawerIgnoreOutsideClickDirective {\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import * as i0 from '@angular/core';
2
- import { inject, PLATFORM_ID, ElementRef, NgZone, Renderer2, DestroyRef, viewChild, input, EventEmitter, signal, computed, effect, untracked, Output, ChangeDetectionStrategy, Component } from '@angular/core';
2
+ import { inject, PLATFORM_ID, ElementRef, NgZone, Renderer2, DestroyRef, viewChild, input, booleanAttribute, output, signal, computed, effect, untracked, ChangeDetectionStrategy, Component, numberAttribute, Directive } from '@angular/core';
3
3
  import { isPlatformBrowser } from '@angular/common';
4
- import { Observable, debounceTime, tap, merge, fromEvent, filter, switchMap, map, distinctUntilChanged, takeUntil, finalize } from 'rxjs';
4
+ import { Observable, debounceTime, tap, merge, fromEvent, filter, switchMap, map, distinctUntilChanged, takeUntil, finalize, Subject, startWith, auditTime } from 'rxjs';
5
5
  import { Router, NavigationEnd } from '@angular/router';
6
6
  import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
7
7
 
@@ -18,9 +18,9 @@ class ScrollbarArea {
18
18
  scrollTrackXRef = viewChild.required('scrollTrackX');
19
19
  scrollThumbXRef = viewChild.required('scrollThumbX');
20
20
  scrollbarWidth = input('8px', ...(ngDevMode ? [{ debugName: "scrollbarWidth" }] : /* istanbul ignore next */ []));
21
- autoHide = input(true, ...(ngDevMode ? [{ debugName: "autoHide" }] : /* istanbul ignore next */ []));
22
- absolute = input(true, ...(ngDevMode ? [{ debugName: "absolute" }] : /* istanbul ignore next */ []));
23
- scrolled = new EventEmitter();
21
+ autoHide = input(true, { ...(ngDevMode ? { debugName: "autoHide" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
22
+ absolute = input(true, { ...(ngDevMode ? { debugName: "absolute" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
23
+ scrolled = output();
24
24
  isDragging = signal(false, ...(ngDevMode ? [{ debugName: "isDragging" }] : /* istanbul ignore next */ []));
25
25
  isHovering = signal(false, ...(ngDevMode ? [{ debugName: "isHovering" }] : /* istanbul ignore next */ []));
26
26
  scrollTop = signal(0, ...(ngDevMode ? [{ debugName: "scrollTop" }] : /* istanbul ignore next */ []));
@@ -447,13 +447,101 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImpor
447
447
  '[class.scrollbar-interactive]': 'isInteractive()',
448
448
  '[class.is-absolute]': 'absolute()',
449
449
  }, template: "<div #scrollableContent class=\"scrollable-content\">\n <ng-content/>\n</div>\n<div #scrollTrack class=\"scroll-track\">\n <div #scrollThumb class=\"scroll-thumb\"></div>\n</div>\n<div #scrollTrackX class=\"scroll-track-x\">\n <div #scrollThumbX class=\"scroll-thumb-x\"></div>\n</div>\n", styles: [":host{--ngs-scrollbar-area-thumb-bg: var(--ngs-color-neutral-200);--ngs-scrollbar-area-thumb-hover-bg: var(--ngs-color-neutral-300);--ngs-scrollbar-area-thumb-active-bg: var(--ngs-color-neutral-300);--ngs-scrollbar-area-width: 10px;--ngs-scrollbar-area-scroll-track-bg: transparent;display:block;overflow:hidden;position:absolute;inset:0}:host .scrollable-content{height:100%;overflow-y:scroll;overflow-x:scroll;width:100%;padding-right:0;box-sizing:border-box}:host .scrollable-content::-webkit-scrollbar{width:0;height:0;background:transparent}:host .scrollable-content{scrollbar-width:none;-ms-overflow-style:none}:host .scroll-track{position:absolute;top:0;right:0;bottom:0;width:var(--ngs-scrollbar-area-width);background:var(--ngs-scrollbar-area-scroll-track-bg);border-radius:var(--ngs-radius-sm);opacity:0;transition:opacity .2s ease-in-out;z-index:100;pointer-events:none}:host .scroll-thumb{position:absolute;top:0;left:0;width:var(--ngs-scrollbar-area-width);background:var(--ngs-scrollbar-area-thumb-bg);border-radius:var(--ngs-radius-sm);transition:background-color .2s ease-in-out;pointer-events:auto}:host .scroll-track-x{position:absolute;left:0;right:0;bottom:0;height:var(--ngs-scrollbar-area-width);background:var(--ngs-scrollbar-area-scroll-track-bg);border-radius:var(--ngs-radius-sm);opacity:0;transition:opacity .2s ease-in-out;z-index:100;pointer-events:none}:host .scroll-thumb-x{position:absolute;bottom:0;left:0;height:var(--ngs-scrollbar-area-width);background:var(--ngs-scrollbar-area-thumb-bg);border-radius:var(--ngs-radius-sm);transition:background-color .2s ease-in-out;pointer-events:auto}:host .scroll-thumb:hover,:host .scroll-thumb-x:hover{background:var(--ngs-scrollbar-area-thumb-hover-bg)}:host .scroll-thumb:active,:host .scroll-thumb-x:active{background:var(--ngs-scrollbar-area-thumb-active-bg)}:host.scrollbar-visible .scroll-track,:host.scrollbar-visible .scroll-track-x{opacity:1}\n/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */\n"] }]
450
- }], ctorParameters: () => [], propDecorators: { scrollableContentRef: [{ type: i0.ViewChild, args: ['scrollableContent', { isSignal: true }] }], scrollTrackRef: [{ type: i0.ViewChild, args: ['scrollTrack', { isSignal: true }] }], scrollThumbRef: [{ type: i0.ViewChild, args: ['scrollThumb', { isSignal: true }] }], scrollTrackXRef: [{ type: i0.ViewChild, args: ['scrollTrackX', { isSignal: true }] }], scrollThumbXRef: [{ type: i0.ViewChild, args: ['scrollThumbX', { isSignal: true }] }], scrollbarWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "scrollbarWidth", required: false }] }], autoHide: [{ type: i0.Input, args: [{ isSignal: true, alias: "autoHide", required: false }] }], absolute: [{ type: i0.Input, args: [{ isSignal: true, alias: "absolute", required: false }] }], scrolled: [{
451
- type: Output
452
- }] } });
450
+ }], ctorParameters: () => [], propDecorators: { scrollableContentRef: [{ type: i0.ViewChild, args: ['scrollableContent', { isSignal: true }] }], scrollTrackRef: [{ type: i0.ViewChild, args: ['scrollTrack', { isSignal: true }] }], scrollThumbRef: [{ type: i0.ViewChild, args: ['scrollThumb', { isSignal: true }] }], scrollTrackXRef: [{ type: i0.ViewChild, args: ['scrollTrackX', { isSignal: true }] }], scrollThumbXRef: [{ type: i0.ViewChild, args: ['scrollThumbX', { isSignal: true }] }], scrollbarWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "scrollbarWidth", required: false }] }], autoHide: [{ type: i0.Input, args: [{ isSignal: true, alias: "autoHide", required: false }] }], absolute: [{ type: i0.Input, args: [{ isSignal: true, alias: "absolute", required: false }] }], scrolled: [{ type: i0.Output, args: ["scrolled"] }] } });
451
+
452
+ class ScrollContainerFixed {
453
+ elementRef = inject(ElementRef);
454
+ ngZone = inject(NgZone);
455
+ platformId = inject(PLATFORM_ID);
456
+ destroyRef = inject(DestroyRef);
457
+ refreshChanges = new Subject();
458
+ enabled = input(true, { ...(ngDevMode ? { debugName: "enabled" } : /* istanbul ignore next */ {}), alias: 'ngsScrollContainerFixed',
459
+ transform: booleanAttribute });
460
+ bottomOffset = input(0, { ...(ngDevMode ? { debugName: "bottomOffset" } : /* istanbul ignore next */ {}), alias: 'ngsScrollContainerFixedBottomOffset',
461
+ transform: numberAttribute });
462
+ minHeight = input(0, { ...(ngDevMode ? { debugName: "minHeight" } : /* istanbul ignore next */ {}), alias: 'ngsScrollContainerFixedMinHeight',
463
+ transform: numberAttribute });
464
+ height = signal(null, ...(ngDevMode ? [{ debugName: "height" }] : /* istanbul ignore next */ []));
465
+ constructor() {
466
+ effect(() => {
467
+ this.enabled();
468
+ this.bottomOffset();
469
+ this.minHeight();
470
+ this.refresh();
471
+ });
472
+ }
473
+ ngAfterViewInit() {
474
+ if (!isPlatformBrowser(this.platformId)) {
475
+ return;
476
+ }
477
+ this.ngZone.runOutsideAngular(() => {
478
+ merge(...this.getResizeStreams())
479
+ .pipe(startWith(null), auditTime(0), takeUntilDestroyed(this.destroyRef))
480
+ .subscribe(() => this.updateHeight());
481
+ });
482
+ }
483
+ refresh() {
484
+ if (!isPlatformBrowser(this.platformId)) {
485
+ return;
486
+ }
487
+ this.refreshChanges.next();
488
+ }
489
+ updateHeight() {
490
+ if (!this.enabled()) {
491
+ this.height.set(null);
492
+ return;
493
+ }
494
+ const elementTop = this.elementRef.nativeElement.getBoundingClientRect().top;
495
+ const viewportHeight = window.visualViewport?.height ?? window.innerHeight;
496
+ const nextHeight = Math.max(this.minHeight(), Math.floor(viewportHeight - elementTop - this.bottomOffset()));
497
+ this.height.set(nextHeight);
498
+ }
499
+ getResizeStreams() {
500
+ const streams = [
501
+ this.refreshChanges.asObservable(),
502
+ fromEvent(window, 'resize'),
503
+ fromEvent(window, 'orientationchange'),
504
+ this.observeElement(this.elementRef.nativeElement),
505
+ ];
506
+ if (this.elementRef.nativeElement.parentElement) {
507
+ streams.push(this.observeElement(this.elementRef.nativeElement.parentElement));
508
+ }
509
+ if (window.visualViewport) {
510
+ streams.push(fromEvent(window.visualViewport, 'resize'), fromEvent(window.visualViewport, 'scroll'));
511
+ }
512
+ return streams;
513
+ }
514
+ observeElement(element) {
515
+ return new Observable(observer => {
516
+ if (typeof ResizeObserver === 'undefined') {
517
+ observer.complete();
518
+ return undefined;
519
+ }
520
+ const resizeObserver = new ResizeObserver(entries => observer.next(entries));
521
+ resizeObserver.observe(element);
522
+ return () => resizeObserver.disconnect();
523
+ });
524
+ }
525
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: ScrollContainerFixed, deps: [], target: i0.ɵɵFactoryTarget.Directive });
526
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.4", type: ScrollContainerFixed, isStandalone: true, selector: "[ngsScrollContainerFixed]", inputs: { enabled: { classPropertyName: "enabled", publicName: "ngsScrollContainerFixed", isSignal: true, isRequired: false, transformFunction: null }, bottomOffset: { classPropertyName: "bottomOffset", publicName: "ngsScrollContainerFixedBottomOffset", isSignal: true, isRequired: false, transformFunction: null }, minHeight: { classPropertyName: "minHeight", publicName: "ngsScrollContainerFixedMinHeight", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "style.box-sizing": "\"border-box\"", "style.height.px": "height()", "style.min-height.px": "enabled() ? minHeight() : null" } }, exportAs: ["ngsScrollContainerFixed"], ngImport: i0 });
527
+ }
528
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: ScrollContainerFixed, decorators: [{
529
+ type: Directive,
530
+ args: [{
531
+ selector: '[ngsScrollContainerFixed]',
532
+ exportAs: 'ngsScrollContainerFixed',
533
+ standalone: true,
534
+ host: {
535
+ '[style.box-sizing]': '"border-box"',
536
+ '[style.height.px]': 'height()',
537
+ '[style.min-height.px]': 'enabled() ? minHeight() : null',
538
+ },
539
+ }]
540
+ }], ctorParameters: () => [], propDecorators: { enabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngsScrollContainerFixed", required: false }] }], bottomOffset: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngsScrollContainerFixedBottomOffset", required: false }] }], minHeight: [{ type: i0.Input, args: [{ isSignal: true, alias: "ngsScrollContainerFixedMinHeight", required: false }] }] } });
453
541
 
454
542
  /**
455
543
  * Generated bundle index. Do not edit.
456
544
  */
457
545
 
458
- export { ScrollbarArea };
546
+ export { ScrollContainerFixed, ScrollbarArea };
459
547
  //# sourceMappingURL=ngstarter-ui-components-scrollbar-area.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"ngstarter-ui-components-scrollbar-area.mjs","sources":["../../../projects/components/scrollbar-area/src/scrollbar-area/scrollbar-area.ts","../../../projects/components/scrollbar-area/src/scrollbar-area/scrollbar-area.html","../../../projects/components/scrollbar-area/ngstarter-ui-components-scrollbar-area.ts"],"sourcesContent":["import {\n Component,\n ElementRef,\n NgZone,\n Renderer2,\n inject,\n PLATFORM_ID,\n signal,\n computed,\n effect,\n input,\n DestroyRef,\n untracked,\n viewChild,\n ChangeDetectionStrategy,\n Output,\n EventEmitter\n} from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport {\n fromEvent,\n map,\n takeUntil,\n switchMap,\n tap,\n merge,\n debounceTime,\n distinctUntilChanged,\n Observable,\n finalize,\n filter,\n Subscription\n} from 'rxjs';\nimport { NavigationEnd, Router } from '@angular/router';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\n@Component({\n selector: 'ngs-scrollbar-area',\n exportAs: 'ngsScrollbarArea',\n templateUrl: './scrollbar-area.html',\n styleUrl: './scrollbar-area.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n 'class': 'ngs-scrollbar-area',\n '[class.scrollbar-visible]': 'isVisible()',\n '[class.scrollbar-interactive]': 'isInteractive()',\n '[class.is-absolute]': 'absolute()',\n }\n})\nexport class ScrollbarArea {\n private readonly platformId = inject(PLATFORM_ID);\n private readonly elRef = inject(ElementRef<HTMLElement>);\n private readonly zone = inject(NgZone);\n private readonly renderer = inject(Renderer2);\n private readonly destroyRef = inject(DestroyRef);\n private readonly router = inject(Router);\n\n readonly scrollableContentRef = viewChild.required<ElementRef<HTMLElement>>('scrollableContent');\n readonly scrollTrackRef = viewChild.required<ElementRef<HTMLElement>>('scrollTrack');\n readonly scrollThumbRef = viewChild.required<ElementRef<HTMLElement>>('scrollThumb');\n readonly scrollTrackXRef = viewChild.required<ElementRef<HTMLElement>>('scrollTrackX');\n readonly scrollThumbXRef = viewChild.required<ElementRef<HTMLElement>>('scrollThumbX');\n\n readonly scrollbarWidth = input<string>('8px');\n readonly autoHide = input<boolean>(true);\n readonly absolute = input<boolean>(true);\n @Output() readonly scrolled = new EventEmitter<Event>();\n\n readonly isDragging = signal(false);\n readonly isHovering = signal(false);\n private readonly scrollTop = signal(0);\n private readonly scrollLeft = signal(0);\n private readonly contentScrollHeight = signal(0);\n private readonly contentScrollWidth = signal(0);\n private readonly contentClientHeight = signal(0);\n private readonly contentClientWidth = signal(0);\n private readonly trackClientHeight = signal(0);\n private readonly trackClientWidth = signal(0);\n private readonly showDueToActivity = signal(false);\n\n // Vertical axis\n readonly hasScrollY = computed(() => this.contentScrollHeight() > this.contentClientHeight() + 1);\n readonly scrollRatioY = computed(() => this.hasScrollY() ? this.contentClientHeight() / this.contentScrollHeight() : 1);\n\n readonly minThumbHeight = 20;\n readonly thumbHeight = computed(() => {\n if (!this.hasScrollY()) return 0;\n const trackHeight = this.trackClientHeight();\n const ratio = this.scrollRatioY();\n const calculated = trackHeight * ratio;\n return Math.max(calculated, this.minThumbHeight);\n });\n readonly maxScrollTop = computed(() => Math.max(0, this.contentScrollHeight() - this.contentClientHeight()));\n readonly maxThumbTop = computed(() => Math.max(0, this.trackClientHeight() - this.thumbHeight()));\n readonly thumbTop = computed(() => {\n if (!this.hasScrollY()) return 0;\n const maxScroll = this.maxScrollTop();\n const currentScroll = this.scrollTop();\n const maxThumb = this.maxThumbTop();\n return maxScroll > 0 ? (currentScroll / maxScroll) * maxThumb : 0;\n });\n\n // Horizontal axis\n readonly hasScrollX = computed(() => this.contentScrollWidth() > this.contentClientWidth() + 1);\n readonly scrollRatioX = computed(() => this.hasScrollX() ? this.contentClientWidth() / this.contentScrollWidth() : 1);\n\n readonly minThumbWidth = 20;\n readonly thumbWidth = computed(() => {\n if (!this.hasScrollX()) return 0;\n const trackWidth = this.trackClientWidth();\n const ratio = this.scrollRatioX();\n const calculated = trackWidth * ratio;\n return Math.max(calculated, this.minThumbWidth);\n });\n readonly maxScrollLeft = computed(() => Math.max(0, this.contentScrollWidth() - this.contentClientWidth()));\n readonly maxThumbLeft = computed(() => Math.max(0, this.trackClientWidth() - this.thumbWidth()));\n readonly thumbLeft = computed(() => {\n if (!this.hasScrollX()) return 0;\n const maxScroll = this.maxScrollLeft();\n const currentScroll = this.scrollLeft();\n const maxThumb = this.maxThumbLeft();\n return maxScroll > 0 ? (currentScroll / maxScroll) * maxThumb : 0;\n });\n\n readonly hasAnyScroll = computed(() => this.hasScrollX() || this.hasScrollY());\n readonly isVisible = computed(() => {\n if (!this.hasAnyScroll()) return false;\n if (!this.autoHide()) return true;\n return this.isHovering() || this.isDragging() || this.showDueToActivity();\n });\n readonly isInteractive = computed(() => this.isHovering() || this.isDragging());\n\n private isInitialized = signal(false);\n private eventsSubscription: Subscription | null = null;\n private observersSubscription: Subscription | null = null;\n private hideTimeout: any = null;\n\n constructor() {\n effect(() => {\n this.scrollableContentRef();\n this.scrollTrackRef();\n this.scrollThumbRef();\n this.scrollTrackXRef();\n this.scrollThumbXRef();\n\n if (isPlatformBrowser(this.platformId) && !this.isInitialized()) {\n this.initializeComponentLogic();\n this.isInitialized.set(true);\n }\n });\n this.setupStyleEffects();\n this.destroyRef.onDestroy(() => this.cleanup());\n }\n\n private initializeComponentLogic(): void {\n this.updateDimensions();\n this.setupObservers();\n this.setupEventStreams();\n this.setupRouteChanges();\n }\n\n private raf(cb: () => void): void {\n // Use requestAnimationFrame in the browser, fallback to setTimeout on SSR\n if (typeof requestAnimationFrame !== 'undefined') {\n requestAnimationFrame(() => cb());\n } else {\n setTimeout(() => cb(), 0);\n }\n }\n\n private setupStyleEffects(): void {\n // Vertical thickness (width) and horizontal thickness (height)\n effect(() => {\n const thickness = this.scrollbarWidth();\n const trackY = this.scrollTrackRef().nativeElement;\n const thumbY = this.scrollThumbRef().nativeElement;\n const trackX = this.scrollTrackXRef().nativeElement;\n const thumbX = this.scrollThumbXRef().nativeElement;\n untracked(() => {\n // Vertical scrollbar: width is thickness\n this.renderer.setStyle(trackY, 'width', thickness);\n this.renderer.setStyle(thumbY, 'width', thickness);\n // Horizontal scrollbar: height is thickness\n this.renderer.setStyle(trackX, 'height', thickness);\n this.renderer.setStyle(thumbX, 'height', thickness);\n });\n });\n\n // Vertical thumb height\n effect(() => {\n const height = this.thumbHeight();\n const thumbElement = this.scrollThumbRef().nativeElement;\n untracked(() => {\n this.renderer.setStyle(thumbElement, 'height', `${height}px`);\n });\n });\n\n // Vertical thumb position\n effect(() => {\n const top = this.thumbTop();\n const thumbElement = this.scrollThumbRef().nativeElement;\n untracked(() => {\n this.renderer.setStyle(thumbElement, 'transform', `translateY(${top}px)`);\n });\n });\n\n // Horizontal thumb width\n effect(() => {\n const width = this.thumbWidth();\n const thumbElementX = this.scrollThumbXRef().nativeElement;\n untracked(() => {\n this.renderer.setStyle(thumbElementX, 'width', `${width}px`);\n });\n });\n\n // Horizontal thumb position\n effect(() => {\n const left = this.thumbLeft();\n const thumbElementX = this.scrollThumbXRef().nativeElement;\n untracked(() => {\n this.renderer.setStyle(thumbElementX, 'transform', `translateX(${left}px)`);\n });\n });\n\n // Toggle track visibility per axis based on content\n effect(() => {\n const hasY = this.hasScrollY();\n const trackY = this.scrollTrackRef().nativeElement;\n untracked(() => {\n this.renderer.setStyle(trackY, 'display', hasY ? 'block' : 'none');\n });\n });\n effect(() => {\n const hasX = this.hasScrollX();\n const trackX = this.scrollTrackXRef().nativeElement;\n untracked(() => {\n this.renderer.setStyle(trackX, 'display', hasX ? 'block' : 'none');\n });\n });\n\n // When scrollability toggles, recompute dimensions after tracks are laid out\n effect(() => {\n // depend on both so we run when either axis scrollability changes\n const _hasY = this.hasScrollY();\n const _hasX = this.hasScrollX();\n untracked(() => {\n // Wait for style changes (display:block/none) to apply, then measure\n this.raf(() => {\n this.zone.run(() => this.updateDimensions());\n });\n });\n });\n }\n\n private setupObservers(): void {\n const scrollableElement = this.scrollableContentRef().nativeElement;\n const hostElement = this.elRef.nativeElement;\n\n // Helper to observe all element nodes within a subtree with ResizeObserver\n const observeSubtree = (ro: ResizeObserver, root: Element) => {\n ro.observe(root);\n // Observe all current descendants as well to catch size changes that don't bubble to the container\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT);\n let node = walker.currentNode as Element | null;\n while (node) {\n ro.observe(node);\n node = walker.nextNode() as Element | null;\n }\n };\n\n const resize$ = new Observable<ResizeObserverEntry[]>(observer => {\n const resizeObserver = new ResizeObserver(entries => this.zone.run(() => observer.next(entries)));\n // Observe host (tracks may affect layout) and the entire subtree of scrollable content\n observeSubtree(resizeObserver, scrollableElement);\n resizeObserver.observe(hostElement);\n return () => resizeObserver.disconnect();\n }).pipe(debounceTime(50));\n\n const mutation$ = new Observable<MutationRecord[]>(observer => {\n const mutationObserver = new MutationObserver(mutations => this.zone.run(() => observer.next(mutations)));\n // Watch for any DOM changes that can affect layout including attribute/class/style changes\n mutationObserver.observe(scrollableElement, { childList: true, subtree: true, characterData: true, attributes: true });\n return () => mutationObserver.disconnect();\n }).pipe(\n tap(mutations => {\n // If nodes were added to the subtree, start observing them for size changes as well\n // We run outside Angular to avoid triggering change detection per node\n this.zone.runOutsideAngular(() => {\n // Create a temporary RO reference by reusing the one from resize$ is not trivial here,\n // but we can trigger a dimension update directly which is enough for many cases.\n // The resize observer above already observes the whole subtree at setup time.\n // For dynamically added nodes, re-run a subtree observation by creating a one-shot RO.\n const newlyAdded: Element[] = [];\n for (const m of mutations) {\n if (m.type === 'childList') {\n m.addedNodes.forEach(n => { if (n.nodeType === Node.ELEMENT_NODE) newlyAdded.push(n as Element); });\n }\n }\n if (newlyAdded.length) {\n try {\n const ro = new ResizeObserver(() => { /* no-op: purpose is to register */ });\n newlyAdded.forEach(el => observeSubtree(ro, el));\n // Disconnect immediately; observing once is enough for triggering initial measure via update below\n ro.disconnect();\n } catch {}\n }\n });\n }),\n debounceTime(50)\n );\n\n this.observersSubscription = merge(resize$, mutation$)\n .subscribe(() => {\n // Use rAF to ensure layout is settled before measuring\n this.raf(() => this.zone.run(() => this.updateDimensions()));\n });\n }\n\n private setupEventStreams(): void {\n const scrollableElement = this.scrollableContentRef().nativeElement;\n const hostElement = this.elRef.nativeElement;\n const thumbElementY = this.scrollThumbRef().nativeElement;\n const thumbElementX = this.scrollThumbXRef().nativeElement;\n\n const scroll$ = fromEvent(scrollableElement, 'scroll', { passive: true }).pipe(\n tap((event) => {\n this.zone.run(() => {\n this.scrollTop.set(scrollableElement.scrollTop);\n this.scrollLeft.set(scrollableElement.scrollLeft);\n this.scrolled.emit(event);\n });\n // Imperative sync to ensure thumbs move with content during scroll\n this.zone.runOutsideAngular(() => {\n this.raf(() => {\n const top = untracked(this.thumbTop);\n const left = untracked(this.thumbLeft);\n this.renderer.setStyle(thumbElementY, 'transform', `translateY(${top}px)`);\n this.renderer.setStyle(thumbElementX, 'transform', `translateX(${left}px)`);\n });\n });\n }),\n filter(() => this.autoHide()),\n tap(() => this.zone.run(() => this.showDueToActivity.set(true))),\n debounceTime(1500),\n tap(() => {\n untracked(() => {\n if (!this.isHovering() && !this.isDragging()) {\n this.zone.run(() => this.showDueToActivity.set(false));\n }\n })\n })\n );\n\n const hostEnter$ = fromEvent<MouseEvent>(hostElement, 'mouseenter').pipe(\n tap(() => this.zone.run(() => {\n this.isHovering.set(true);\n if (untracked(this.autoHide)) this.showDueToActivity.set(true);\n }))\n );\n const hostLeave$ = fromEvent<MouseEvent>(hostElement, 'mouseleave').pipe(\n tap(() => this.zone.run(() => {\n this.isHovering.set(false);\n if(untracked(this.autoHide) && !untracked(this.isDragging)){\n this.scheduleHide();\n }\n }))\n );\n\n const thumbMouseDownY$ = fromEvent<MouseEvent>(thumbElementY, 'mousedown');\n const thumbMouseDownX$ = fromEvent<MouseEvent>(thumbElementX, 'mousedown');\n const mouseMove$ = fromEvent<MouseEvent>(document, 'mousemove');\n const mouseUp$ = fromEvent<MouseEvent>(document, 'mouseup');\n\n const thumbDragY$ = thumbMouseDownY$.pipe(\n tap(event => {\n event.preventDefault();\n event.stopPropagation();\n }),\n switchMap(startEvent => {\n const startY = startEvent.clientY;\n const startScrollTop = scrollableElement.scrollTop;\n const initialTrackHeight = untracked(() => this.trackClientHeight());\n const initialContentHeight = untracked(() => this.contentScrollHeight());\n\n this.zone.run(() => this.isDragging.set(true));\n\n return mouseMove$.pipe(\n map(moveEvent => {\n moveEvent.preventDefault();\n const deltaY = moveEvent.clientY - startY;\n const scrollDelta = initialTrackHeight > 0\n ? (deltaY / initialTrackHeight) * initialContentHeight\n : 0;\n return startScrollTop + scrollDelta;\n }),\n distinctUntilChanged(),\n tap(newScrollTop => {\n this.renderer.setProperty(scrollableElement, 'scrollTop', newScrollTop);\n }),\n takeUntil(mouseUp$),\n finalize(() => {\n this.zone.run(() => {\n this.isDragging.set(false);\n untracked(() => {\n if (this.autoHide() && !this.isHovering()) {\n this.scheduleHide();\n }\n })\n });\n })\n );\n })\n );\n\n const thumbDragX$ = thumbMouseDownX$.pipe(\n tap(event => {\n event.preventDefault();\n event.stopPropagation();\n }),\n switchMap(startEvent => {\n const startX = startEvent.clientX;\n const startScrollLeft = scrollableElement.scrollLeft;\n const initialTrackWidth = untracked(() => this.trackClientWidth());\n const initialContentWidth = untracked(() => this.contentScrollWidth());\n\n this.zone.run(() => this.isDragging.set(true));\n\n return mouseMove$.pipe(\n map(moveEvent => {\n moveEvent.preventDefault();\n const deltaX = moveEvent.clientX - startX;\n const scrollDelta = initialTrackWidth > 0\n ? (deltaX / initialTrackWidth) * initialContentWidth\n : 0;\n return startScrollLeft + scrollDelta;\n }),\n distinctUntilChanged(),\n tap(newScrollLeft => {\n this.renderer.setProperty(scrollableElement, 'scrollLeft', newScrollLeft);\n }),\n takeUntil(mouseUp$),\n finalize(() => {\n this.zone.run(() => {\n this.isDragging.set(false);\n untracked(() => {\n if (this.autoHide() && !this.isHovering()) {\n this.scheduleHide();\n }\n })\n });\n })\n );\n })\n );\n\n this.zone.runOutsideAngular(() => {\n this.eventsSubscription = merge(\n scroll$,\n hostEnter$,\n hostLeave$,\n thumbDragY$,\n thumbDragX$\n ).subscribe();\n });\n }\n\n private scheduleHide(): void {\n this.clearHideTimeout();\n this.zone.runOutsideAngular(() => {\n this.hideTimeout = setTimeout(() => {\n untracked(() => {\n if(!this.isHovering() && !this.isDragging()) {\n this.zone.run(() => this.showDueToActivity.set(false));\n }\n });\n this.hideTimeout = null;\n }, 100);\n });\n }\n\n private clearHideTimeout(): void {\n if (this.hideTimeout) {\n clearTimeout(this.hideTimeout);\n this.hideTimeout = null;\n }\n }\n\n private updateDimensions(): void {\n const scrollableElement = this.scrollableContentRef().nativeElement;\n const trackElementY = this.scrollTrackRef().nativeElement;\n const trackElementX = this.scrollTrackXRef().nativeElement;\n\n if (scrollableElement && trackElementY && trackElementX) {\n // Vertical metrics\n const newScrollHeight = scrollableElement.scrollHeight;\n const newClientHeight = scrollableElement.clientHeight;\n const newTrackHeight = trackElementY.clientHeight;\n const newScrollTop = scrollableElement.scrollTop;\n\n this.contentScrollHeight.set(newScrollHeight);\n this.contentClientHeight.set(newClientHeight);\n this.trackClientHeight.set(newTrackHeight);\n\n if (this.scrollTop() !== newScrollTop) {\n this.scrollTop.set(newScrollTop);\n }\n\n // Horizontal metrics\n const newScrollWidth = scrollableElement.scrollWidth;\n const newClientWidth = scrollableElement.clientWidth;\n const newTrackWidth = trackElementX.clientWidth;\n const newScrollLeft = scrollableElement.scrollLeft;\n\n this.contentScrollWidth.set(newScrollWidth);\n this.contentClientWidth.set(newClientWidth);\n this.trackClientWidth.set(newTrackWidth);\n\n if (this.scrollLeft() !== newScrollLeft) {\n this.scrollLeft.set(newScrollLeft);\n }\n } else {\n this.contentScrollHeight.set(0);\n this.contentClientHeight.set(0);\n this.trackClientHeight.set(0);\n this.scrollTop.set(0);\n\n this.contentScrollWidth.set(0);\n this.contentClientWidth.set(0);\n this.trackClientWidth.set(0);\n this.scrollLeft.set(0);\n }\n }\n\n private cleanup(): void {\n this.clearHideTimeout();\n if (this.eventsSubscription) {\n this.eventsSubscription.unsubscribe();\n this.eventsSubscription = null;\n }\n if (this.observersSubscription) {\n this.observersSubscription.unsubscribe();\n this.observersSubscription = null;\n }\n }\n\n private setupRouteChanges() {\n this.router.events\n .pipe(\n filter(event=> event instanceof NavigationEnd),\n takeUntilDestroyed(this.destroyRef)\n )\n .subscribe(() => {\n this.raf(() => {\n this.updateDimensions();\n });\n })\n ;\n }\n}\n","<div #scrollableContent class=\"scrollable-content\">\n <ng-content/>\n</div>\n<div #scrollTrack class=\"scroll-track\">\n <div #scrollThumb class=\"scroll-thumb\"></div>\n</div>\n<div #scrollTrackX class=\"scroll-track-x\">\n <div #scrollThumbX class=\"scroll-thumb-x\"></div>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ngstarter-ui-components-scrollbar-area.mjs","sources":["../../../projects/components/scrollbar-area/src/scrollbar-area/scrollbar-area.ts","../../../projects/components/scrollbar-area/src/scrollbar-area/scrollbar-area.html","../../../projects/components/scrollbar-area/src/scroll-container-fixed.directive.ts","../../../projects/components/scrollbar-area/ngstarter-ui-components-scrollbar-area.ts"],"sourcesContent":["import {\n Component,\n ElementRef,\n NgZone,\n Renderer2,\n inject,\n PLATFORM_ID,\n signal,\n computed,\n effect,\n input,\n DestroyRef,\n untracked,\n viewChild,\n ChangeDetectionStrategy,\n booleanAttribute,\n output\n} from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport {\n fromEvent,\n map,\n takeUntil,\n switchMap,\n tap,\n merge,\n debounceTime,\n distinctUntilChanged,\n Observable,\n finalize,\n filter,\n Subscription\n} from 'rxjs';\nimport { NavigationEnd, Router } from '@angular/router';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\n@Component({\n selector: 'ngs-scrollbar-area',\n exportAs: 'ngsScrollbarArea',\n templateUrl: './scrollbar-area.html',\n styleUrl: './scrollbar-area.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n 'class': 'ngs-scrollbar-area',\n '[class.scrollbar-visible]': 'isVisible()',\n '[class.scrollbar-interactive]': 'isInteractive()',\n '[class.is-absolute]': 'absolute()',\n }\n})\nexport class ScrollbarArea {\n private readonly platformId = inject(PLATFORM_ID);\n private readonly elRef = inject(ElementRef<HTMLElement>);\n private readonly zone = inject(NgZone);\n private readonly renderer = inject(Renderer2);\n private readonly destroyRef = inject(DestroyRef);\n private readonly router = inject(Router);\n\n readonly scrollableContentRef = viewChild.required<ElementRef<HTMLElement>>('scrollableContent');\n readonly scrollTrackRef = viewChild.required<ElementRef<HTMLElement>>('scrollTrack');\n readonly scrollThumbRef = viewChild.required<ElementRef<HTMLElement>>('scrollThumb');\n readonly scrollTrackXRef = viewChild.required<ElementRef<HTMLElement>>('scrollTrackX');\n readonly scrollThumbXRef = viewChild.required<ElementRef<HTMLElement>>('scrollThumbX');\n\n readonly scrollbarWidth = input<string>('8px');\n readonly autoHide = input(true, { transform: booleanAttribute });\n readonly absolute = input(true, { transform: booleanAttribute });\n\n readonly scrolled = output<Event>();\n\n readonly isDragging = signal(false);\n readonly isHovering = signal(false);\n private readonly scrollTop = signal(0);\n private readonly scrollLeft = signal(0);\n private readonly contentScrollHeight = signal(0);\n private readonly contentScrollWidth = signal(0);\n private readonly contentClientHeight = signal(0);\n private readonly contentClientWidth = signal(0);\n private readonly trackClientHeight = signal(0);\n private readonly trackClientWidth = signal(0);\n private readonly showDueToActivity = signal(false);\n\n // Vertical axis\n readonly hasScrollY = computed(() => this.contentScrollHeight() > this.contentClientHeight() + 1);\n readonly scrollRatioY = computed(() => this.hasScrollY() ? this.contentClientHeight() / this.contentScrollHeight() : 1);\n\n readonly minThumbHeight = 20;\n readonly thumbHeight = computed(() => {\n if (!this.hasScrollY()) return 0;\n const trackHeight = this.trackClientHeight();\n const ratio = this.scrollRatioY();\n const calculated = trackHeight * ratio;\n return Math.max(calculated, this.minThumbHeight);\n });\n readonly maxScrollTop = computed(() => Math.max(0, this.contentScrollHeight() - this.contentClientHeight()));\n readonly maxThumbTop = computed(() => Math.max(0, this.trackClientHeight() - this.thumbHeight()));\n readonly thumbTop = computed(() => {\n if (!this.hasScrollY()) return 0;\n const maxScroll = this.maxScrollTop();\n const currentScroll = this.scrollTop();\n const maxThumb = this.maxThumbTop();\n return maxScroll > 0 ? (currentScroll / maxScroll) * maxThumb : 0;\n });\n\n // Horizontal axis\n readonly hasScrollX = computed(() => this.contentScrollWidth() > this.contentClientWidth() + 1);\n readonly scrollRatioX = computed(() => this.hasScrollX() ? this.contentClientWidth() / this.contentScrollWidth() : 1);\n\n readonly minThumbWidth = 20;\n readonly thumbWidth = computed(() => {\n if (!this.hasScrollX()) return 0;\n const trackWidth = this.trackClientWidth();\n const ratio = this.scrollRatioX();\n const calculated = trackWidth * ratio;\n return Math.max(calculated, this.minThumbWidth);\n });\n readonly maxScrollLeft = computed(() => Math.max(0, this.contentScrollWidth() - this.contentClientWidth()));\n readonly maxThumbLeft = computed(() => Math.max(0, this.trackClientWidth() - this.thumbWidth()));\n readonly thumbLeft = computed(() => {\n if (!this.hasScrollX()) return 0;\n const maxScroll = this.maxScrollLeft();\n const currentScroll = this.scrollLeft();\n const maxThumb = this.maxThumbLeft();\n return maxScroll > 0 ? (currentScroll / maxScroll) * maxThumb : 0;\n });\n\n readonly hasAnyScroll = computed(() => this.hasScrollX() || this.hasScrollY());\n readonly isVisible = computed(() => {\n if (!this.hasAnyScroll()) return false;\n if (!this.autoHide()) return true;\n return this.isHovering() || this.isDragging() || this.showDueToActivity();\n });\n readonly isInteractive = computed(() => this.isHovering() || this.isDragging());\n\n private isInitialized = signal(false);\n private eventsSubscription: Subscription | null = null;\n private observersSubscription: Subscription | null = null;\n private hideTimeout: any = null;\n\n constructor() {\n effect(() => {\n this.scrollableContentRef();\n this.scrollTrackRef();\n this.scrollThumbRef();\n this.scrollTrackXRef();\n this.scrollThumbXRef();\n\n if (isPlatformBrowser(this.platformId) && !this.isInitialized()) {\n this.initializeComponentLogic();\n this.isInitialized.set(true);\n }\n });\n this.setupStyleEffects();\n this.destroyRef.onDestroy(() => this.cleanup());\n }\n\n private initializeComponentLogic(): void {\n this.updateDimensions();\n this.setupObservers();\n this.setupEventStreams();\n this.setupRouteChanges();\n }\n\n private raf(cb: () => void): void {\n // Use requestAnimationFrame in the browser, fallback to setTimeout on SSR\n if (typeof requestAnimationFrame !== 'undefined') {\n requestAnimationFrame(() => cb());\n } else {\n setTimeout(() => cb(), 0);\n }\n }\n\n private setupStyleEffects(): void {\n // Vertical thickness (width) and horizontal thickness (height)\n effect(() => {\n const thickness = this.scrollbarWidth();\n const trackY = this.scrollTrackRef().nativeElement;\n const thumbY = this.scrollThumbRef().nativeElement;\n const trackX = this.scrollTrackXRef().nativeElement;\n const thumbX = this.scrollThumbXRef().nativeElement;\n untracked(() => {\n // Vertical scrollbar: width is thickness\n this.renderer.setStyle(trackY, 'width', thickness);\n this.renderer.setStyle(thumbY, 'width', thickness);\n // Horizontal scrollbar: height is thickness\n this.renderer.setStyle(trackX, 'height', thickness);\n this.renderer.setStyle(thumbX, 'height', thickness);\n });\n });\n\n // Vertical thumb height\n effect(() => {\n const height = this.thumbHeight();\n const thumbElement = this.scrollThumbRef().nativeElement;\n untracked(() => {\n this.renderer.setStyle(thumbElement, 'height', `${height}px`);\n });\n });\n\n // Vertical thumb position\n effect(() => {\n const top = this.thumbTop();\n const thumbElement = this.scrollThumbRef().nativeElement;\n untracked(() => {\n this.renderer.setStyle(thumbElement, 'transform', `translateY(${top}px)`);\n });\n });\n\n // Horizontal thumb width\n effect(() => {\n const width = this.thumbWidth();\n const thumbElementX = this.scrollThumbXRef().nativeElement;\n untracked(() => {\n this.renderer.setStyle(thumbElementX, 'width', `${width}px`);\n });\n });\n\n // Horizontal thumb position\n effect(() => {\n const left = this.thumbLeft();\n const thumbElementX = this.scrollThumbXRef().nativeElement;\n untracked(() => {\n this.renderer.setStyle(thumbElementX, 'transform', `translateX(${left}px)`);\n });\n });\n\n // Toggle track visibility per axis based on content\n effect(() => {\n const hasY = this.hasScrollY();\n const trackY = this.scrollTrackRef().nativeElement;\n untracked(() => {\n this.renderer.setStyle(trackY, 'display', hasY ? 'block' : 'none');\n });\n });\n effect(() => {\n const hasX = this.hasScrollX();\n const trackX = this.scrollTrackXRef().nativeElement;\n untracked(() => {\n this.renderer.setStyle(trackX, 'display', hasX ? 'block' : 'none');\n });\n });\n\n // When scrollability toggles, recompute dimensions after tracks are laid out\n effect(() => {\n // depend on both so we run when either axis scrollability changes\n const _hasY = this.hasScrollY();\n const _hasX = this.hasScrollX();\n untracked(() => {\n // Wait for style changes (display:block/none) to apply, then measure\n this.raf(() => {\n this.zone.run(() => this.updateDimensions());\n });\n });\n });\n }\n\n private setupObservers(): void {\n const scrollableElement = this.scrollableContentRef().nativeElement;\n const hostElement = this.elRef.nativeElement;\n\n // Helper to observe all element nodes within a subtree with ResizeObserver\n const observeSubtree = (ro: ResizeObserver, root: Element) => {\n ro.observe(root);\n // Observe all current descendants as well to catch size changes that don't bubble to the container\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT);\n let node = walker.currentNode as Element | null;\n while (node) {\n ro.observe(node);\n node = walker.nextNode() as Element | null;\n }\n };\n\n const resize$ = new Observable<ResizeObserverEntry[]>(observer => {\n const resizeObserver = new ResizeObserver(entries => this.zone.run(() => observer.next(entries)));\n // Observe host (tracks may affect layout) and the entire subtree of scrollable content\n observeSubtree(resizeObserver, scrollableElement);\n resizeObserver.observe(hostElement);\n return () => resizeObserver.disconnect();\n }).pipe(debounceTime(50));\n\n const mutation$ = new Observable<MutationRecord[]>(observer => {\n const mutationObserver = new MutationObserver(mutations => this.zone.run(() => observer.next(mutations)));\n // Watch for any DOM changes that can affect layout including attribute/class/style changes\n mutationObserver.observe(scrollableElement, { childList: true, subtree: true, characterData: true, attributes: true });\n return () => mutationObserver.disconnect();\n }).pipe(\n tap(mutations => {\n // If nodes were added to the subtree, start observing them for size changes as well\n // We run outside Angular to avoid triggering change detection per node\n this.zone.runOutsideAngular(() => {\n // Create a temporary RO reference by reusing the one from resize$ is not trivial here,\n // but we can trigger a dimension update directly which is enough for many cases.\n // The resize observer above already observes the whole subtree at setup time.\n // For dynamically added nodes, re-run a subtree observation by creating a one-shot RO.\n const newlyAdded: Element[] = [];\n for (const m of mutations) {\n if (m.type === 'childList') {\n m.addedNodes.forEach(n => { if (n.nodeType === Node.ELEMENT_NODE) newlyAdded.push(n as Element); });\n }\n }\n if (newlyAdded.length) {\n try {\n const ro = new ResizeObserver(() => { /* no-op: purpose is to register */ });\n newlyAdded.forEach(el => observeSubtree(ro, el));\n // Disconnect immediately; observing once is enough for triggering initial measure via update below\n ro.disconnect();\n } catch {}\n }\n });\n }),\n debounceTime(50)\n );\n\n this.observersSubscription = merge(resize$, mutation$)\n .subscribe(() => {\n // Use rAF to ensure layout is settled before measuring\n this.raf(() => this.zone.run(() => this.updateDimensions()));\n });\n }\n\n private setupEventStreams(): void {\n const scrollableElement = this.scrollableContentRef().nativeElement;\n const hostElement = this.elRef.nativeElement;\n const thumbElementY = this.scrollThumbRef().nativeElement;\n const thumbElementX = this.scrollThumbXRef().nativeElement;\n\n const scroll$ = fromEvent(scrollableElement, 'scroll', { passive: true }).pipe(\n tap((event) => {\n this.zone.run(() => {\n this.scrollTop.set(scrollableElement.scrollTop);\n this.scrollLeft.set(scrollableElement.scrollLeft);\n this.scrolled.emit(event);\n });\n // Imperative sync to ensure thumbs move with content during scroll\n this.zone.runOutsideAngular(() => {\n this.raf(() => {\n const top = untracked(this.thumbTop);\n const left = untracked(this.thumbLeft);\n this.renderer.setStyle(thumbElementY, 'transform', `translateY(${top}px)`);\n this.renderer.setStyle(thumbElementX, 'transform', `translateX(${left}px)`);\n });\n });\n }),\n filter(() => this.autoHide()),\n tap(() => this.zone.run(() => this.showDueToActivity.set(true))),\n debounceTime(1500),\n tap(() => {\n untracked(() => {\n if (!this.isHovering() && !this.isDragging()) {\n this.zone.run(() => this.showDueToActivity.set(false));\n }\n })\n })\n );\n\n const hostEnter$ = fromEvent<MouseEvent>(hostElement, 'mouseenter').pipe(\n tap(() => this.zone.run(() => {\n this.isHovering.set(true);\n if (untracked(this.autoHide)) this.showDueToActivity.set(true);\n }))\n );\n const hostLeave$ = fromEvent<MouseEvent>(hostElement, 'mouseleave').pipe(\n tap(() => this.zone.run(() => {\n this.isHovering.set(false);\n if(untracked(this.autoHide) && !untracked(this.isDragging)){\n this.scheduleHide();\n }\n }))\n );\n\n const thumbMouseDownY$ = fromEvent<MouseEvent>(thumbElementY, 'mousedown');\n const thumbMouseDownX$ = fromEvent<MouseEvent>(thumbElementX, 'mousedown');\n const mouseMove$ = fromEvent<MouseEvent>(document, 'mousemove');\n const mouseUp$ = fromEvent<MouseEvent>(document, 'mouseup');\n\n const thumbDragY$ = thumbMouseDownY$.pipe(\n tap(event => {\n event.preventDefault();\n event.stopPropagation();\n }),\n switchMap(startEvent => {\n const startY = startEvent.clientY;\n const startScrollTop = scrollableElement.scrollTop;\n const initialTrackHeight = untracked(() => this.trackClientHeight());\n const initialContentHeight = untracked(() => this.contentScrollHeight());\n\n this.zone.run(() => this.isDragging.set(true));\n\n return mouseMove$.pipe(\n map(moveEvent => {\n moveEvent.preventDefault();\n const deltaY = moveEvent.clientY - startY;\n const scrollDelta = initialTrackHeight > 0\n ? (deltaY / initialTrackHeight) * initialContentHeight\n : 0;\n return startScrollTop + scrollDelta;\n }),\n distinctUntilChanged(),\n tap(newScrollTop => {\n this.renderer.setProperty(scrollableElement, 'scrollTop', newScrollTop);\n }),\n takeUntil(mouseUp$),\n finalize(() => {\n this.zone.run(() => {\n this.isDragging.set(false);\n untracked(() => {\n if (this.autoHide() && !this.isHovering()) {\n this.scheduleHide();\n }\n })\n });\n })\n );\n })\n );\n\n const thumbDragX$ = thumbMouseDownX$.pipe(\n tap(event => {\n event.preventDefault();\n event.stopPropagation();\n }),\n switchMap(startEvent => {\n const startX = startEvent.clientX;\n const startScrollLeft = scrollableElement.scrollLeft;\n const initialTrackWidth = untracked(() => this.trackClientWidth());\n const initialContentWidth = untracked(() => this.contentScrollWidth());\n\n this.zone.run(() => this.isDragging.set(true));\n\n return mouseMove$.pipe(\n map(moveEvent => {\n moveEvent.preventDefault();\n const deltaX = moveEvent.clientX - startX;\n const scrollDelta = initialTrackWidth > 0\n ? (deltaX / initialTrackWidth) * initialContentWidth\n : 0;\n return startScrollLeft + scrollDelta;\n }),\n distinctUntilChanged(),\n tap(newScrollLeft => {\n this.renderer.setProperty(scrollableElement, 'scrollLeft', newScrollLeft);\n }),\n takeUntil(mouseUp$),\n finalize(() => {\n this.zone.run(() => {\n this.isDragging.set(false);\n untracked(() => {\n if (this.autoHide() && !this.isHovering()) {\n this.scheduleHide();\n }\n })\n });\n })\n );\n })\n );\n\n this.zone.runOutsideAngular(() => {\n this.eventsSubscription = merge(\n scroll$,\n hostEnter$,\n hostLeave$,\n thumbDragY$,\n thumbDragX$\n ).subscribe();\n });\n }\n\n private scheduleHide(): void {\n this.clearHideTimeout();\n this.zone.runOutsideAngular(() => {\n this.hideTimeout = setTimeout(() => {\n untracked(() => {\n if(!this.isHovering() && !this.isDragging()) {\n this.zone.run(() => this.showDueToActivity.set(false));\n }\n });\n this.hideTimeout = null;\n }, 100);\n });\n }\n\n private clearHideTimeout(): void {\n if (this.hideTimeout) {\n clearTimeout(this.hideTimeout);\n this.hideTimeout = null;\n }\n }\n\n private updateDimensions(): void {\n const scrollableElement = this.scrollableContentRef().nativeElement;\n const trackElementY = this.scrollTrackRef().nativeElement;\n const trackElementX = this.scrollTrackXRef().nativeElement;\n\n if (scrollableElement && trackElementY && trackElementX) {\n // Vertical metrics\n const newScrollHeight = scrollableElement.scrollHeight;\n const newClientHeight = scrollableElement.clientHeight;\n const newTrackHeight = trackElementY.clientHeight;\n const newScrollTop = scrollableElement.scrollTop;\n\n this.contentScrollHeight.set(newScrollHeight);\n this.contentClientHeight.set(newClientHeight);\n this.trackClientHeight.set(newTrackHeight);\n\n if (this.scrollTop() !== newScrollTop) {\n this.scrollTop.set(newScrollTop);\n }\n\n // Horizontal metrics\n const newScrollWidth = scrollableElement.scrollWidth;\n const newClientWidth = scrollableElement.clientWidth;\n const newTrackWidth = trackElementX.clientWidth;\n const newScrollLeft = scrollableElement.scrollLeft;\n\n this.contentScrollWidth.set(newScrollWidth);\n this.contentClientWidth.set(newClientWidth);\n this.trackClientWidth.set(newTrackWidth);\n\n if (this.scrollLeft() !== newScrollLeft) {\n this.scrollLeft.set(newScrollLeft);\n }\n } else {\n this.contentScrollHeight.set(0);\n this.contentClientHeight.set(0);\n this.trackClientHeight.set(0);\n this.scrollTop.set(0);\n\n this.contentScrollWidth.set(0);\n this.contentClientWidth.set(0);\n this.trackClientWidth.set(0);\n this.scrollLeft.set(0);\n }\n }\n\n private cleanup(): void {\n this.clearHideTimeout();\n if (this.eventsSubscription) {\n this.eventsSubscription.unsubscribe();\n this.eventsSubscription = null;\n }\n if (this.observersSubscription) {\n this.observersSubscription.unsubscribe();\n this.observersSubscription = null;\n }\n }\n\n private setupRouteChanges() {\n this.router.events\n .pipe(\n filter(event=> event instanceof NavigationEnd),\n takeUntilDestroyed(this.destroyRef)\n )\n .subscribe(() => {\n this.raf(() => {\n this.updateDimensions();\n });\n })\n ;\n }\n}\n","<div #scrollableContent class=\"scrollable-content\">\n <ng-content/>\n</div>\n<div #scrollTrack class=\"scroll-track\">\n <div #scrollThumb class=\"scroll-thumb\"></div>\n</div>\n<div #scrollTrackX class=\"scroll-track-x\">\n <div #scrollThumbX class=\"scroll-thumb-x\"></div>\n</div>\n","import {\n AfterViewInit,\n booleanAttribute,\n DestroyRef,\n Directive,\n ElementRef,\n effect,\n inject,\n input,\n NgZone,\n numberAttribute,\n PLATFORM_ID,\n signal,\n} from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { auditTime, fromEvent, merge, Observable, startWith, Subject } from 'rxjs';\n\n@Directive({\n selector: '[ngsScrollContainerFixed]',\n exportAs: 'ngsScrollContainerFixed',\n standalone: true,\n host: {\n '[style.box-sizing]': '\"border-box\"',\n '[style.height.px]': 'height()',\n '[style.min-height.px]': 'enabled() ? minHeight() : null',\n },\n})\nexport class ScrollContainerFixed implements AfterViewInit {\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly ngZone = inject(NgZone);\n private readonly platformId = inject(PLATFORM_ID);\n private readonly destroyRef = inject(DestroyRef);\n private readonly refreshChanges = new Subject<void>();\n\n readonly enabled = input(true, {\n alias: 'ngsScrollContainerFixed',\n transform: booleanAttribute,\n });\n readonly bottomOffset = input(0, {\n alias: 'ngsScrollContainerFixedBottomOffset',\n transform: numberAttribute,\n });\n readonly minHeight = input(0, {\n alias: 'ngsScrollContainerFixedMinHeight',\n transform: numberAttribute,\n });\n\n readonly height = signal<number | null>(null);\n\n constructor() {\n effect(() => {\n this.enabled();\n this.bottomOffset();\n this.minHeight();\n this.refresh();\n });\n }\n\n ngAfterViewInit(): void {\n if (!isPlatformBrowser(this.platformId)) {\n return;\n }\n\n this.ngZone.runOutsideAngular(() => {\n merge(...this.getResizeStreams())\n .pipe(\n startWith(null),\n auditTime(0),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe(() => this.updateHeight());\n });\n }\n\n refresh(): void {\n if (!isPlatformBrowser(this.platformId)) {\n return;\n }\n\n this.refreshChanges.next();\n }\n\n private updateHeight(): void {\n if (!this.enabled()) {\n this.height.set(null);\n return;\n }\n\n const elementTop = this.elementRef.nativeElement.getBoundingClientRect().top;\n const viewportHeight = window.visualViewport?.height ?? window.innerHeight;\n const nextHeight = Math.max(\n this.minHeight(),\n Math.floor(viewportHeight - elementTop - this.bottomOffset()),\n );\n\n this.height.set(nextHeight);\n }\n\n private getResizeStreams(): Observable<unknown>[] {\n const streams: Observable<unknown>[] = [\n this.refreshChanges.asObservable(),\n fromEvent(window, 'resize'),\n fromEvent(window, 'orientationchange'),\n this.observeElement(this.elementRef.nativeElement),\n ];\n\n if (this.elementRef.nativeElement.parentElement) {\n streams.push(this.observeElement(this.elementRef.nativeElement.parentElement));\n }\n\n if (window.visualViewport) {\n streams.push(\n fromEvent(window.visualViewport, 'resize'),\n fromEvent(window.visualViewport, 'scroll'),\n );\n }\n\n return streams;\n }\n\n private observeElement(element: Element): Observable<ResizeObserverEntry[]> {\n return new Observable<ResizeObserverEntry[]>(observer => {\n if (typeof ResizeObserver === 'undefined') {\n observer.complete();\n return undefined;\n }\n\n const resizeObserver = new ResizeObserver(entries => observer.next(entries));\n resizeObserver.observe(element);\n\n return () => resizeObserver.disconnect();\n });\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@ngstarter-ui/components",
3
3
  "description": "NgStarter - AI-friendly Enterprise Angular UI Components and Admin Panel",
4
- "version": "21.0.13",
4
+ "version": "21.0.14",
5
5
  "repository": {
6
6
  "type": "git",
7
7
  "url": "https://github.com/elementarlabsdev/ngstarter.git"
@@ -1,5 +1,5 @@
1
1
  import * as _angular_core from '@angular/core';
2
- import { ElementRef, EventEmitter } from '@angular/core';
2
+ import { ElementRef, AfterViewInit } from '@angular/core';
3
3
 
4
4
  declare class ScrollbarArea {
5
5
  private readonly platformId;
@@ -14,9 +14,9 @@ declare class ScrollbarArea {
14
14
  readonly scrollTrackXRef: _angular_core.Signal<ElementRef<HTMLElement>>;
15
15
  readonly scrollThumbXRef: _angular_core.Signal<ElementRef<HTMLElement>>;
16
16
  readonly scrollbarWidth: _angular_core.InputSignal<string>;
17
- readonly autoHide: _angular_core.InputSignal<boolean>;
18
- readonly absolute: _angular_core.InputSignal<boolean>;
19
- readonly scrolled: EventEmitter<Event>;
17
+ readonly autoHide: _angular_core.InputSignalWithTransform<boolean, unknown>;
18
+ readonly absolute: _angular_core.InputSignalWithTransform<boolean, unknown>;
19
+ readonly scrolled: _angular_core.OutputEmitterRef<Event>;
20
20
  readonly isDragging: _angular_core.WritableSignal<boolean>;
21
21
  readonly isHovering: _angular_core.WritableSignal<boolean>;
22
22
  private readonly scrollTop;
@@ -64,4 +64,24 @@ declare class ScrollbarArea {
64
64
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<ScrollbarArea, "ngs-scrollbar-area", ["ngsScrollbarArea"], { "scrollbarWidth": { "alias": "scrollbarWidth"; "required": false; "isSignal": true; }; "autoHide": { "alias": "autoHide"; "required": false; "isSignal": true; }; "absolute": { "alias": "absolute"; "required": false; "isSignal": true; }; }, { "scrolled": "scrolled"; }, never, ["*"], true, never>;
65
65
  }
66
66
 
67
- export { ScrollbarArea };
67
+ declare class ScrollContainerFixed implements AfterViewInit {
68
+ private readonly elementRef;
69
+ private readonly ngZone;
70
+ private readonly platformId;
71
+ private readonly destroyRef;
72
+ private readonly refreshChanges;
73
+ readonly enabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
74
+ readonly bottomOffset: _angular_core.InputSignalWithTransform<number, unknown>;
75
+ readonly minHeight: _angular_core.InputSignalWithTransform<number, unknown>;
76
+ readonly height: _angular_core.WritableSignal<number | null>;
77
+ constructor();
78
+ ngAfterViewInit(): void;
79
+ refresh(): void;
80
+ private updateHeight;
81
+ private getResizeStreams;
82
+ private observeElement;
83
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ScrollContainerFixed, never>;
84
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ScrollContainerFixed, "[ngsScrollContainerFixed]", ["ngsScrollContainerFixed"], { "enabled": { "alias": "ngsScrollContainerFixed"; "required": false; "isSignal": true; }; "bottomOffset": { "alias": "ngsScrollContainerFixedBottomOffset"; "required": false; "isSignal": true; }; "minHeight": { "alias": "ngsScrollContainerFixedMinHeight"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
85
+ }
86
+
87
+ export { ScrollContainerFixed, ScrollbarArea };