@koobiq/components 20.3.0 → 20.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. package/accordion/accordion.scss +4 -1
  2. package/accordion/index.d.ts +36 -12
  3. package/alert/index.d.ts +8 -0
  4. package/breadcrumbs/index.d.ts +2 -0
  5. package/button-toggle/button-toggle-tokens.scss +14 -0
  6. package/button-toggle/button-toggle.scss +75 -3
  7. package/core/index.d.ts +33 -1
  8. package/core/styles/common/_select.scss +98 -3
  9. package/core/styles/typography/_typography.scss +8 -0
  10. package/ellipsis-center/index.d.ts +35 -2
  11. package/fesm2022/koobiq-components-accordion.mjs +143 -44
  12. package/fesm2022/koobiq-components-accordion.mjs.map +1 -1
  13. package/fesm2022/koobiq-components-alert.mjs +17 -1
  14. package/fesm2022/koobiq-components-alert.mjs.map +1 -1
  15. package/fesm2022/koobiq-components-autocomplete.mjs +2 -2
  16. package/fesm2022/koobiq-components-autocomplete.mjs.map +1 -1
  17. package/fesm2022/koobiq-components-breadcrumbs.mjs +8 -3
  18. package/fesm2022/koobiq-components-breadcrumbs.mjs.map +1 -1
  19. package/fesm2022/koobiq-components-button-toggle.mjs +2 -2
  20. package/fesm2022/koobiq-components-button-toggle.mjs.map +1 -1
  21. package/fesm2022/koobiq-components-code-block.mjs +10 -5
  22. package/fesm2022/koobiq-components-code-block.mjs.map +1 -1
  23. package/fesm2022/koobiq-components-core.mjs +52 -11
  24. package/fesm2022/koobiq-components-core.mjs.map +1 -1
  25. package/fesm2022/koobiq-components-dropdown.mjs +2 -2
  26. package/fesm2022/koobiq-components-dropdown.mjs.map +1 -1
  27. package/fesm2022/koobiq-components-ellipsis-center.mjs +77 -22
  28. package/fesm2022/koobiq-components-ellipsis-center.mjs.map +1 -1
  29. package/fesm2022/koobiq-components-file-upload.mjs +7 -7
  30. package/fesm2022/koobiq-components-file-upload.mjs.map +1 -1
  31. package/fesm2022/koobiq-components-filter-bar.mjs +76 -41
  32. package/fesm2022/koobiq-components-filter-bar.mjs.map +1 -1
  33. package/fesm2022/koobiq-components-form-field.mjs +13 -7
  34. package/fesm2022/koobiq-components-form-field.mjs.map +1 -1
  35. package/fesm2022/koobiq-components-list.mjs +3 -3
  36. package/fesm2022/koobiq-components-list.mjs.map +1 -1
  37. package/fesm2022/koobiq-components-markdown.mjs +6 -2
  38. package/fesm2022/koobiq-components-markdown.mjs.map +1 -1
  39. package/fesm2022/koobiq-components-modal.mjs +60 -11
  40. package/fesm2022/koobiq-components-modal.mjs.map +1 -1
  41. package/fesm2022/koobiq-components-select.mjs +99 -12
  42. package/fesm2022/koobiq-components-select.mjs.map +1 -1
  43. package/fesm2022/koobiq-components-sidebar.mjs +5 -1
  44. package/fesm2022/koobiq-components-sidebar.mjs.map +1 -1
  45. package/fesm2022/koobiq-components-sidepanel.mjs +25 -6
  46. package/fesm2022/koobiq-components-sidepanel.mjs.map +1 -1
  47. package/fesm2022/koobiq-components-tabs.mjs +10 -6
  48. package/fesm2022/koobiq-components-tabs.mjs.map +1 -1
  49. package/fesm2022/koobiq-components-time-range.mjs +388 -74
  50. package/fesm2022/koobiq-components-time-range.mjs.map +1 -1
  51. package/fesm2022/koobiq-components-timezone.mjs +2 -2
  52. package/fesm2022/koobiq-components-timezone.mjs.map +1 -1
  53. package/fesm2022/koobiq-components-title.mjs +15 -3
  54. package/fesm2022/koobiq-components-title.mjs.map +1 -1
  55. package/fesm2022/koobiq-components-tree-select.mjs +3 -3
  56. package/fesm2022/koobiq-components-tree-select.mjs.map +1 -1
  57. package/fesm2022/koobiq-components-tree.mjs +14 -4
  58. package/fesm2022/koobiq-components-tree.mjs.map +1 -1
  59. package/file-upload/file-upload.scss +11 -0
  60. package/file-upload/index.d.ts +1 -1
  61. package/file-upload/multiple-file-upload.component.scss +15 -3
  62. package/file-upload/single-file-upload.component.scss +10 -2
  63. package/filter-bar/filter-bar-tokens.scss +2 -1
  64. package/filter-bar/index.d.ts +25 -4
  65. package/filter-bar/pipes/base-pipe.scss +13 -6
  66. package/filter-bar/pipes/pipe-input.scss +3 -1
  67. package/form-field/index.d.ts +1 -3
  68. package/link/_link-theme.scss +50 -15
  69. package/markdown/index.d.ts +2 -0
  70. package/modal/index.d.ts +17 -8
  71. package/navbar/_navbar-item_horizontal.scss +5 -0
  72. package/package.json +3 -3
  73. package/prebuilt-themes/dark-theme.css +1 -1
  74. package/prebuilt-themes/light-theme.css +1 -1
  75. package/prebuilt-themes/theme.css +1 -1
  76. package/schematics/migrations/alert-signals/index.js +4 -1
  77. package/schematics/migrations/autocomplete-panel-width-auto/index.js +3 -34
  78. package/schematics/migrations/empty-state-size-attr/index.js +3 -34
  79. package/schematics/migrations/filter-bar-signals/index.js +4 -1
  80. package/schematics/migrations/loader-overlay-size-attr/index.js +3 -34
  81. package/schematics/migrations/v20-upgrade/index.js +4 -1
  82. package/schematics/ng-add/index.js +1 -1
  83. package/schematics/utils/angular-parsing.js +11 -12
  84. package/schematics/utils/package-config.js +5 -4
  85. package/schematics/utils/typescript.js +24 -0
  86. package/select/_select-theme.scss +9 -1
  87. package/select/index.d.ts +12 -2
  88. package/select/select.scss +13 -0
  89. package/sidebar/index.d.ts +1 -0
  90. package/sidepanel/index.d.ts +9 -0
  91. package/tabs/index.d.ts +1 -1
  92. package/time-range/index.d.ts +140 -5
  93. package/time-range/time-range.scss +16 -1
  94. package/title/index.d.ts +10 -2
  95. package/tree/index.d.ts +1 -0
@@ -41,6 +41,8 @@ const CLASS_PREFIX = 'kbq-markdown';
41
41
 
42
42
  /**
43
43
  * Service for converting Markdown into HTML.
44
+ *
45
+ * @docs-private
44
46
  */
45
47
  class KbqMarkdownService {
46
48
  /**
@@ -145,7 +147,7 @@ class KbqMarkdown {
145
147
  this.links.length = 0;
146
148
  }
147
149
  /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqMarkdown, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
148
- /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "20.3.30", type: KbqMarkdown, isStandalone: true, selector: "kbq-markdown", inputs: { markdownText: "markdownText" }, host: { classAttribute: "kbq-markdown" }, viewQueries: [{ propertyName: "contentWrapper", first: true, predicate: ["contentWrapper"], descendants: true, isSignal: true }, { propertyName: "outputWrapper", first: true, predicate: ["outputWrapper"], descendants: true, isSignal: true }], ngImport: i0, template: `
150
+ /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "20.3.30", type: KbqMarkdown, isStandalone: true, selector: "kbq-markdown", inputs: { markdownText: "markdownText" }, host: { classAttribute: "kbq-markdown kbq-scrollbar" }, viewQueries: [{ propertyName: "contentWrapper", first: true, predicate: ["contentWrapper"], descendants: true, isSignal: true }, { propertyName: "outputWrapper", first: true, predicate: ["outputWrapper"], descendants: true, isSignal: true }], ngImport: i0, template: `
149
151
  <pre #contentWrapper class="kbq-markdown__input" ngPreserveWhitespaces><ng-content /></pre>
150
152
  <div #outputWrapper class="kbq-markdown__output" [innerHtml]="resultHtml()"></div>
151
153
  `, isInline: true, styles: ["@charset \"UTF-8\";.kbq-markdown{display:block}.kbq-markdown .kbq-markdown__input{display:none}.kbq-markdown .kbq-markdown__output{flex:1}.kbq-markdown .kbq-markdown__output>:first-child{margin-top:0}.kbq-markdown .kbq-markdown__output>:last-child{margin-bottom:0}.kbq-markdown .kbq-markdown__h1{margin-top:var(--kbq-markdown-h1-size-margin-top);margin-bottom:var(--kbq-markdown-h1-size-margin-bottom)}.kbq-markdown .kbq-markdown__h1+.kbq-markdown__h1{margin-top:0}.kbq-markdown .kbq-markdown__h1+.kbq-markdown__h2{margin-top:0}.kbq-markdown .kbq-markdown__h1+.kbq-markdown__h3{margin-top:0}.kbq-markdown .kbq-markdown__h1+.kbq-markdown__h4{margin-top:0}.kbq-markdown .kbq-markdown__h1+.kbq-markdown__h5{margin-top:0}.kbq-markdown .kbq-markdown__h1+.kbq-markdown__h6{margin-top:0}.kbq-markdown .kbq-markdown__h2{margin-top:var(--kbq-markdown-h2-size-margin-top);margin-bottom:var(--kbq-markdown-h2-size-margin-bottom)}.kbq-markdown .kbq-markdown__h2+.kbq-markdown__h1{margin-top:0}.kbq-markdown .kbq-markdown__h2+.kbq-markdown__h2{margin-top:0}.kbq-markdown .kbq-markdown__h2+.kbq-markdown__h3{margin-top:0}.kbq-markdown .kbq-markdown__h2+.kbq-markdown__h4{margin-top:0}.kbq-markdown .kbq-markdown__h2+.kbq-markdown__h5{margin-top:0}.kbq-markdown .kbq-markdown__h2+.kbq-markdown__h6{margin-top:0}.kbq-markdown .kbq-markdown__h3{margin-top:var(--kbq-markdown-h3-size-margin-top);margin-bottom:var(--kbq-markdown-h3-size-margin-bottom)}.kbq-markdown .kbq-markdown__h3+.kbq-markdown__h1{margin-top:0}.kbq-markdown .kbq-markdown__h3+.kbq-markdown__h2{margin-top:0}.kbq-markdown .kbq-markdown__h3+.kbq-markdown__h3{margin-top:0}.kbq-markdown .kbq-markdown__h3+.kbq-markdown__h4{margin-top:0}.kbq-markdown .kbq-markdown__h3+.kbq-markdown__h5{margin-top:0}.kbq-markdown .kbq-markdown__h3+.kbq-markdown__h6{margin-top:0}.kbq-markdown .kbq-markdown__h4{margin-top:var(--kbq-markdown-h4-size-margin-top);margin-bottom:var(--kbq-markdown-h4-size-margin-bottom)}.kbq-markdown .kbq-markdown__h4+.kbq-markdown__h1{margin-top:0}.kbq-markdown .kbq-markdown__h4+.kbq-markdown__h2{margin-top:0}.kbq-markdown .kbq-markdown__h4+.kbq-markdown__h3{margin-top:0}.kbq-markdown .kbq-markdown__h4+.kbq-markdown__h4{margin-top:0}.kbq-markdown .kbq-markdown__h4+.kbq-markdown__h5{margin-top:0}.kbq-markdown .kbq-markdown__h4+.kbq-markdown__h6{margin-top:0}.kbq-markdown .kbq-markdown__h5{margin-top:var(--kbq-markdown-h5-size-margin-top);margin-bottom:var(--kbq-markdown-h5-size-margin-bottom)}.kbq-markdown .kbq-markdown__h5+.kbq-markdown__h1{margin-top:0}.kbq-markdown .kbq-markdown__h5+.kbq-markdown__h2{margin-top:0}.kbq-markdown .kbq-markdown__h5+.kbq-markdown__h3{margin-top:0}.kbq-markdown .kbq-markdown__h5+.kbq-markdown__h4{margin-top:0}.kbq-markdown .kbq-markdown__h5+.kbq-markdown__h5{margin-top:0}.kbq-markdown .kbq-markdown__h5+.kbq-markdown__h6{margin-top:0}.kbq-markdown .kbq-markdown__h6{margin-top:var(--kbq-markdown-h6-size-margin-top);margin-bottom:var(--kbq-markdown-h6-size-margin-bottom)}.kbq-markdown .kbq-markdown__h6+.kbq-markdown__h1{margin-top:0}.kbq-markdown .kbq-markdown__h6+.kbq-markdown__h2{margin-top:0}.kbq-markdown .kbq-markdown__h6+.kbq-markdown__h3{margin-top:0}.kbq-markdown .kbq-markdown__h6+.kbq-markdown__h4{margin-top:0}.kbq-markdown .kbq-markdown__h6+.kbq-markdown__h5{margin-top:0}.kbq-markdown .kbq-markdown__h6+.kbq-markdown__h6{margin-top:0}.kbq-markdown .kbq-markdown__p{margin-top:var(--kbq-markdown-p-size-margin-top);margin-bottom:var(--kbq-markdown-p-size-margin-bottom)}.kbq-markdown .kbq-markdown__ul,.kbq-markdown .kbq-markdown__ol{margin-top:var(--kbq-markdown-list-size-margin-top);margin-bottom:var(--kbq-markdown-list-size-margin-bottom)}.kbq-markdown .kbq-markdown__ul>li,.kbq-markdown .kbq-markdown__ol>li{margin-bottom:var(--kbq-markdown-list-size-item-margin-bottom)}.kbq-markdown .kbq-markdown__ul{position:relative;list-style:none;padding:var(--kbq-markdown-list-size-ul-padding)}.kbq-markdown .kbq-markdown__ul>li:before{content:\"\\2014\";display:block;position:absolute;width:24px;text-align:left;left:0}.kbq-markdown .kbq-markdown__ol{list-style:none;padding:0;counter-reset:li}.kbq-markdown .kbq-markdown__ol>li:before{content:counter(li) \".\";counter-increment:li;padding-right:var(--kbq-markdown-list-size-ol-number-padding-right)}.kbq-markdown .kbq-markdown__ol>li>*{display:inline-block}.kbq-markdown .kbq-markdown__p+.kbq-markdown__ul,.kbq-markdown .kbq-markdown__p+.kbq-markdown__ol{margin-top:var(--kbq-markdown-list-size-margin-top-after-paragraph)}.kbq-markdown .kbq-markdown__blockquote{margin-top:var(--kbq-markdown-blockquote-size-margin-top);margin-left:0;margin-bottom:var(--kbq-markdown-blockquote-size-margin-bottom);margin-right:0;border-left-width:var(--kbq-markdown-blockquote-size-line-width);border-left-style:solid;padding:var(--kbq-markdown-blockquote-size-padding)}.kbq-markdown .kbq-markdown__blockquote>.kbq-markdown__p{margin-top:0;margin-bottom:0}.kbq-markdown .kbq-markdown__pre{position:relative;overflow-x:auto;margin-top:var(--kbq-markdown-code-size-multiline-margin-top);margin-bottom:var(--kbq-markdown-code-size-multiline-margin-bottom);padding:var(--kbq-markdown-code-size-multiline-padding)}.kbq-markdown .kbq-markdown__pre,.kbq-markdown .kbq-markdown__code{border-radius:var(--kbq-markdown-code-size-border-radius)}.kbq-markdown .kbq-markdown__code:not(.kbq-markdown__pre>.kbq-markdown__code){white-space:nowrap;padding:var(--kbq-markdown-code-size-inline-padding)}.kbq-markdown .kbq-markdown__img{max-width:100%;margin-top:var(--kbq-markdown-image-size-margin-top);margin-bottom:var(--kbq-markdown-image-size-margin-bottom)}.kbq-markdown .kbq-markdown__img+em{display:block;margin-top:var(--kbq-markdown-image-size-caption-margin-top);margin-bottom:var(--kbq-markdown-image-size-caption-margin-bottom)}.kbq-markdown .kbq-markdown__hr{border-top:none;border-left:none;border-right:none;border-bottom-style:solid;border-bottom-width:var(--kbq-markdown-hr-size-width);margin:var(--kbq-markdown-hr-size-margin-vertical) 0}.kbq-markdown .kbq-markdown__table{max-width:100%;overflow-x:auto;display:table;border-collapse:collapse;margin-bottom:var(--kbq-markdown-table-size-margin-bottom)}.kbq-markdown .kbq-markdown__table td{vertical-align:top}.kbq-markdown .kbq-markdown__table th,.kbq-markdown .kbq-markdown__table td{padding:var(--kbq-markdown-table-size-padding);font-weight:400}.kbq-markdown .kbq-markdown__table>.kbq-markdown__thead{border-bottom-style:solid;border-bottom-width:var(--kbq-markdown-table-size-border-width);text-align:left}.kbq-markdown .kbq-markdown__table>.kbq-markdown__thead th:first-child{padding-left:0}.kbq-markdown .kbq-markdown__table>.kbq-markdown__thead th:last-child{padding-right:0}.kbq-markdown .kbq-markdown__table>.kbq-markdown__tbody td:first-child{padding-left:0}.kbq-markdown .kbq-markdown__table>.kbq-markdown__tbody td:last-child{padding-right:0}\n", ".kbq-markdown{--kbq-markdown-bg: transparent;--kbq-markdown-h1-size-max-width: var(--kbq-markdown-size-max-width);--kbq-markdown-h1-size-margin-top: 0;--kbq-markdown-h1-size-margin-bottom: var(--kbq-size-l);--kbq-markdown-h2-size-max-width: var(--kbq-markdown-size-max-width);--kbq-markdown-h2-size-margin-top: var(--kbq-size-xxl);--kbq-markdown-h2-size-margin-bottom: var(--kbq-size-m);--kbq-markdown-h3-size-max-width: var(--kbq-markdown-size-max-width);--kbq-markdown-h3-size-margin-top: var(--kbq-size-xxl);--kbq-markdown-h3-size-margin-bottom: var(--kbq-size-m);--kbq-markdown-h4-size-max-width: var(--kbq-markdown-size-max-width);--kbq-markdown-h4-size-margin-top: var(--kbq-size-xxl);--kbq-markdown-h4-size-margin-bottom: var(--kbq-size-m);--kbq-markdown-h5-size-max-width: var(--kbq-markdown-size-max-width);--kbq-markdown-h5-size-margin-top: var(--kbq-size-xxl);--kbq-markdown-h5-size-margin-bottom: var(--kbq-size-s);--kbq-markdown-h6-size-max-width: var(--kbq-markdown-size-max-width);--kbq-markdown-h6-size-margin-top: var(--kbq-size-xxl);--kbq-markdown-h6-size-margin-bottom: var(--kbq-size-s);--kbq-markdown-p-size-max-width: var(--kbq-markdown-size-max-width);--kbq-markdown-p-size-margin-top: var(--kbq-size-m);--kbq-markdown-p-size-margin-bottom: var(--kbq-size-m);--kbq-markdown-list-size-max-width: var(--kbq-markdown-size-max-width);--kbq-markdown-list-size-margin-top: var(--kbq-size-m);--kbq-markdown-list-size-margin-bottom: var(--kbq-size-m);--kbq-markdown-list-size-margin-top-after-paragraph: calc(-1 * var(--kbq-size-s));--kbq-markdown-list-size-ol-number-padding-right: var(--kbq-size-xxs);--kbq-markdown-list-size-ul-padding: 0 0 0 var(--kbq-size-xxl);--kbq-markdown-list-size-item-margin-bottom: var(--kbq-size-xxs);--kbq-markdown-blockquote-size-max-width: var(--kbq-markdown-size-max-width);--kbq-markdown-blockquote-size-margin-top: var(--kbq-size-m);--kbq-markdown-blockquote-size-margin-bottom: var(--kbq-size-m);--kbq-markdown-blockquote-size-padding: var(--kbq-size-3xs) var(--kbq-size-m);--kbq-markdown-blockquote-size-line-width: var(--kbq-size-xxs);--kbq-markdown-blockquote-size-border-radius: 0;--kbq-markdown-blockquote-size-border-width: 0;--kbq-markdown-code-size-multiline-margin-top: var(--kbq-size-m);--kbq-markdown-code-size-multiline-margin-bottom: var(--kbq-size-xxl);--kbq-markdown-code-size-inline-padding: var(--kbq-size-3xs) var(--kbq-size-xs);--kbq-markdown-code-size-multiline-padding: var(--kbq-size-m) var(--kbq-size-l);--kbq-markdown-code-size-border-radius: var(--kbq-size-border-radius);--kbq-markdown-code-size-border-width: var(--kbq-size-border-width);--kbq-markdown-image-size-max-width: var(--kbq-markdown-size-max-width);--kbq-markdown-image-size-margin-top: var(--kbq-size-m);--kbq-markdown-image-size-margin-bottom: var(--kbq-size-m);--kbq-markdown-image-size-caption-margin-top: calc(-1 * var(--kbq-size-s));--kbq-markdown-image-size-caption-margin-bottom: var(--kbq-size-xxl);--kbq-markdown-hr-size-width: 1px;--kbq-markdown-hr-size-margin-vertical: var(--kbq-size-xxl);--kbq-markdown-table-size-border-width: var(--kbq-size-border-width);--kbq-markdown-table-size-padding: var(--kbq-size-s);--kbq-markdown-table-size-margin-bottom: var(--kbq-size-m);--kbq-markdown-size-max-width: 650px;--kbq-markdown-h1-color: var(--kbq-foreground-contrast);--kbq-markdown-h2-color: var(--kbq-foreground-contrast);--kbq-markdown-h3-color: var(--kbq-foreground-contrast);--kbq-markdown-h4-color: var(--kbq-foreground-contrast);--kbq-markdown-h5-color: var(--kbq-foreground-contrast);--kbq-markdown-h6-color: var(--kbq-foreground-contrast);--kbq-markdown-p-color: var(--kbq-foreground-contrast);--kbq-markdown-list-color: var(--kbq-foreground-contrast);--kbq-markdown-blockquote-text: var(--kbq-foreground-contrast);--kbq-markdown-blockquote-line: var(--kbq-line-contrast-less);--kbq-markdown-blockquote-background: var(--kbq-background-contrast-fade);--kbq-markdown-blockquote-border: transparent;--kbq-markdown-code-text: var(--kbq-foreground-contrast);--kbq-markdown-code-background: var(--kbq-background-contrast-fade);--kbq-markdown-code-border: var(--kbq-line-contrast-less);--kbq-markdown-image-caption-text: var(--kbq-foreground-contrast-secondary);--kbq-markdown-hr-color: var(--kbq-line-contrast-less);--kbq-markdown-table-header: var(--kbq-foreground-contrast-secondary);--kbq-markdown-table-body: var(--kbq-foreground-contrast);--kbq-markdown-table-border: var(--kbq-line-contrast-less)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
@@ -156,7 +158,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImpo
156
158
  <pre #contentWrapper class="kbq-markdown__input" ngPreserveWhitespaces><ng-content /></pre>
157
159
  <div #outputWrapper class="kbq-markdown__output" [innerHtml]="resultHtml()"></div>
158
160
  `, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: {
159
- class: 'kbq-markdown'
161
+ // The rendered content comes from `[innerHtml]`, so its scrollbars can only be customized from the host:
162
+ // `kbq-scrollbar` styles the element's own and its descendants' scrollbars.
163
+ class: 'kbq-markdown kbq-scrollbar'
160
164
  }, styles: ["@charset \"UTF-8\";.kbq-markdown{display:block}.kbq-markdown .kbq-markdown__input{display:none}.kbq-markdown .kbq-markdown__output{flex:1}.kbq-markdown .kbq-markdown__output>:first-child{margin-top:0}.kbq-markdown .kbq-markdown__output>:last-child{margin-bottom:0}.kbq-markdown .kbq-markdown__h1{margin-top:var(--kbq-markdown-h1-size-margin-top);margin-bottom:var(--kbq-markdown-h1-size-margin-bottom)}.kbq-markdown .kbq-markdown__h1+.kbq-markdown__h1{margin-top:0}.kbq-markdown .kbq-markdown__h1+.kbq-markdown__h2{margin-top:0}.kbq-markdown .kbq-markdown__h1+.kbq-markdown__h3{margin-top:0}.kbq-markdown .kbq-markdown__h1+.kbq-markdown__h4{margin-top:0}.kbq-markdown .kbq-markdown__h1+.kbq-markdown__h5{margin-top:0}.kbq-markdown .kbq-markdown__h1+.kbq-markdown__h6{margin-top:0}.kbq-markdown .kbq-markdown__h2{margin-top:var(--kbq-markdown-h2-size-margin-top);margin-bottom:var(--kbq-markdown-h2-size-margin-bottom)}.kbq-markdown .kbq-markdown__h2+.kbq-markdown__h1{margin-top:0}.kbq-markdown .kbq-markdown__h2+.kbq-markdown__h2{margin-top:0}.kbq-markdown .kbq-markdown__h2+.kbq-markdown__h3{margin-top:0}.kbq-markdown .kbq-markdown__h2+.kbq-markdown__h4{margin-top:0}.kbq-markdown .kbq-markdown__h2+.kbq-markdown__h5{margin-top:0}.kbq-markdown .kbq-markdown__h2+.kbq-markdown__h6{margin-top:0}.kbq-markdown .kbq-markdown__h3{margin-top:var(--kbq-markdown-h3-size-margin-top);margin-bottom:var(--kbq-markdown-h3-size-margin-bottom)}.kbq-markdown .kbq-markdown__h3+.kbq-markdown__h1{margin-top:0}.kbq-markdown .kbq-markdown__h3+.kbq-markdown__h2{margin-top:0}.kbq-markdown .kbq-markdown__h3+.kbq-markdown__h3{margin-top:0}.kbq-markdown .kbq-markdown__h3+.kbq-markdown__h4{margin-top:0}.kbq-markdown .kbq-markdown__h3+.kbq-markdown__h5{margin-top:0}.kbq-markdown .kbq-markdown__h3+.kbq-markdown__h6{margin-top:0}.kbq-markdown .kbq-markdown__h4{margin-top:var(--kbq-markdown-h4-size-margin-top);margin-bottom:var(--kbq-markdown-h4-size-margin-bottom)}.kbq-markdown .kbq-markdown__h4+.kbq-markdown__h1{margin-top:0}.kbq-markdown .kbq-markdown__h4+.kbq-markdown__h2{margin-top:0}.kbq-markdown .kbq-markdown__h4+.kbq-markdown__h3{margin-top:0}.kbq-markdown .kbq-markdown__h4+.kbq-markdown__h4{margin-top:0}.kbq-markdown .kbq-markdown__h4+.kbq-markdown__h5{margin-top:0}.kbq-markdown .kbq-markdown__h4+.kbq-markdown__h6{margin-top:0}.kbq-markdown .kbq-markdown__h5{margin-top:var(--kbq-markdown-h5-size-margin-top);margin-bottom:var(--kbq-markdown-h5-size-margin-bottom)}.kbq-markdown .kbq-markdown__h5+.kbq-markdown__h1{margin-top:0}.kbq-markdown .kbq-markdown__h5+.kbq-markdown__h2{margin-top:0}.kbq-markdown .kbq-markdown__h5+.kbq-markdown__h3{margin-top:0}.kbq-markdown .kbq-markdown__h5+.kbq-markdown__h4{margin-top:0}.kbq-markdown .kbq-markdown__h5+.kbq-markdown__h5{margin-top:0}.kbq-markdown .kbq-markdown__h5+.kbq-markdown__h6{margin-top:0}.kbq-markdown .kbq-markdown__h6{margin-top:var(--kbq-markdown-h6-size-margin-top);margin-bottom:var(--kbq-markdown-h6-size-margin-bottom)}.kbq-markdown .kbq-markdown__h6+.kbq-markdown__h1{margin-top:0}.kbq-markdown .kbq-markdown__h6+.kbq-markdown__h2{margin-top:0}.kbq-markdown .kbq-markdown__h6+.kbq-markdown__h3{margin-top:0}.kbq-markdown .kbq-markdown__h6+.kbq-markdown__h4{margin-top:0}.kbq-markdown .kbq-markdown__h6+.kbq-markdown__h5{margin-top:0}.kbq-markdown .kbq-markdown__h6+.kbq-markdown__h6{margin-top:0}.kbq-markdown .kbq-markdown__p{margin-top:var(--kbq-markdown-p-size-margin-top);margin-bottom:var(--kbq-markdown-p-size-margin-bottom)}.kbq-markdown .kbq-markdown__ul,.kbq-markdown .kbq-markdown__ol{margin-top:var(--kbq-markdown-list-size-margin-top);margin-bottom:var(--kbq-markdown-list-size-margin-bottom)}.kbq-markdown .kbq-markdown__ul>li,.kbq-markdown .kbq-markdown__ol>li{margin-bottom:var(--kbq-markdown-list-size-item-margin-bottom)}.kbq-markdown .kbq-markdown__ul{position:relative;list-style:none;padding:var(--kbq-markdown-list-size-ul-padding)}.kbq-markdown .kbq-markdown__ul>li:before{content:\"\\2014\";display:block;position:absolute;width:24px;text-align:left;left:0}.kbq-markdown .kbq-markdown__ol{list-style:none;padding:0;counter-reset:li}.kbq-markdown .kbq-markdown__ol>li:before{content:counter(li) \".\";counter-increment:li;padding-right:var(--kbq-markdown-list-size-ol-number-padding-right)}.kbq-markdown .kbq-markdown__ol>li>*{display:inline-block}.kbq-markdown .kbq-markdown__p+.kbq-markdown__ul,.kbq-markdown .kbq-markdown__p+.kbq-markdown__ol{margin-top:var(--kbq-markdown-list-size-margin-top-after-paragraph)}.kbq-markdown .kbq-markdown__blockquote{margin-top:var(--kbq-markdown-blockquote-size-margin-top);margin-left:0;margin-bottom:var(--kbq-markdown-blockquote-size-margin-bottom);margin-right:0;border-left-width:var(--kbq-markdown-blockquote-size-line-width);border-left-style:solid;padding:var(--kbq-markdown-blockquote-size-padding)}.kbq-markdown .kbq-markdown__blockquote>.kbq-markdown__p{margin-top:0;margin-bottom:0}.kbq-markdown .kbq-markdown__pre{position:relative;overflow-x:auto;margin-top:var(--kbq-markdown-code-size-multiline-margin-top);margin-bottom:var(--kbq-markdown-code-size-multiline-margin-bottom);padding:var(--kbq-markdown-code-size-multiline-padding)}.kbq-markdown .kbq-markdown__pre,.kbq-markdown .kbq-markdown__code{border-radius:var(--kbq-markdown-code-size-border-radius)}.kbq-markdown .kbq-markdown__code:not(.kbq-markdown__pre>.kbq-markdown__code){white-space:nowrap;padding:var(--kbq-markdown-code-size-inline-padding)}.kbq-markdown .kbq-markdown__img{max-width:100%;margin-top:var(--kbq-markdown-image-size-margin-top);margin-bottom:var(--kbq-markdown-image-size-margin-bottom)}.kbq-markdown .kbq-markdown__img+em{display:block;margin-top:var(--kbq-markdown-image-size-caption-margin-top);margin-bottom:var(--kbq-markdown-image-size-caption-margin-bottom)}.kbq-markdown .kbq-markdown__hr{border-top:none;border-left:none;border-right:none;border-bottom-style:solid;border-bottom-width:var(--kbq-markdown-hr-size-width);margin:var(--kbq-markdown-hr-size-margin-vertical) 0}.kbq-markdown .kbq-markdown__table{max-width:100%;overflow-x:auto;display:table;border-collapse:collapse;margin-bottom:var(--kbq-markdown-table-size-margin-bottom)}.kbq-markdown .kbq-markdown__table td{vertical-align:top}.kbq-markdown .kbq-markdown__table th,.kbq-markdown .kbq-markdown__table td{padding:var(--kbq-markdown-table-size-padding);font-weight:400}.kbq-markdown .kbq-markdown__table>.kbq-markdown__thead{border-bottom-style:solid;border-bottom-width:var(--kbq-markdown-table-size-border-width);text-align:left}.kbq-markdown .kbq-markdown__table>.kbq-markdown__thead th:first-child{padding-left:0}.kbq-markdown .kbq-markdown__table>.kbq-markdown__thead th:last-child{padding-right:0}.kbq-markdown .kbq-markdown__table>.kbq-markdown__tbody td:first-child{padding-left:0}.kbq-markdown .kbq-markdown__table>.kbq-markdown__tbody td:last-child{padding-right:0}\n", ".kbq-markdown{--kbq-markdown-bg: transparent;--kbq-markdown-h1-size-max-width: var(--kbq-markdown-size-max-width);--kbq-markdown-h1-size-margin-top: 0;--kbq-markdown-h1-size-margin-bottom: var(--kbq-size-l);--kbq-markdown-h2-size-max-width: var(--kbq-markdown-size-max-width);--kbq-markdown-h2-size-margin-top: var(--kbq-size-xxl);--kbq-markdown-h2-size-margin-bottom: var(--kbq-size-m);--kbq-markdown-h3-size-max-width: var(--kbq-markdown-size-max-width);--kbq-markdown-h3-size-margin-top: var(--kbq-size-xxl);--kbq-markdown-h3-size-margin-bottom: var(--kbq-size-m);--kbq-markdown-h4-size-max-width: var(--kbq-markdown-size-max-width);--kbq-markdown-h4-size-margin-top: var(--kbq-size-xxl);--kbq-markdown-h4-size-margin-bottom: var(--kbq-size-m);--kbq-markdown-h5-size-max-width: var(--kbq-markdown-size-max-width);--kbq-markdown-h5-size-margin-top: var(--kbq-size-xxl);--kbq-markdown-h5-size-margin-bottom: var(--kbq-size-s);--kbq-markdown-h6-size-max-width: var(--kbq-markdown-size-max-width);--kbq-markdown-h6-size-margin-top: var(--kbq-size-xxl);--kbq-markdown-h6-size-margin-bottom: var(--kbq-size-s);--kbq-markdown-p-size-max-width: var(--kbq-markdown-size-max-width);--kbq-markdown-p-size-margin-top: var(--kbq-size-m);--kbq-markdown-p-size-margin-bottom: var(--kbq-size-m);--kbq-markdown-list-size-max-width: var(--kbq-markdown-size-max-width);--kbq-markdown-list-size-margin-top: var(--kbq-size-m);--kbq-markdown-list-size-margin-bottom: var(--kbq-size-m);--kbq-markdown-list-size-margin-top-after-paragraph: calc(-1 * var(--kbq-size-s));--kbq-markdown-list-size-ol-number-padding-right: var(--kbq-size-xxs);--kbq-markdown-list-size-ul-padding: 0 0 0 var(--kbq-size-xxl);--kbq-markdown-list-size-item-margin-bottom: var(--kbq-size-xxs);--kbq-markdown-blockquote-size-max-width: var(--kbq-markdown-size-max-width);--kbq-markdown-blockquote-size-margin-top: var(--kbq-size-m);--kbq-markdown-blockquote-size-margin-bottom: var(--kbq-size-m);--kbq-markdown-blockquote-size-padding: var(--kbq-size-3xs) var(--kbq-size-m);--kbq-markdown-blockquote-size-line-width: var(--kbq-size-xxs);--kbq-markdown-blockquote-size-border-radius: 0;--kbq-markdown-blockquote-size-border-width: 0;--kbq-markdown-code-size-multiline-margin-top: var(--kbq-size-m);--kbq-markdown-code-size-multiline-margin-bottom: var(--kbq-size-xxl);--kbq-markdown-code-size-inline-padding: var(--kbq-size-3xs) var(--kbq-size-xs);--kbq-markdown-code-size-multiline-padding: var(--kbq-size-m) var(--kbq-size-l);--kbq-markdown-code-size-border-radius: var(--kbq-size-border-radius);--kbq-markdown-code-size-border-width: var(--kbq-size-border-width);--kbq-markdown-image-size-max-width: var(--kbq-markdown-size-max-width);--kbq-markdown-image-size-margin-top: var(--kbq-size-m);--kbq-markdown-image-size-margin-bottom: var(--kbq-size-m);--kbq-markdown-image-size-caption-margin-top: calc(-1 * var(--kbq-size-s));--kbq-markdown-image-size-caption-margin-bottom: var(--kbq-size-xxl);--kbq-markdown-hr-size-width: 1px;--kbq-markdown-hr-size-margin-vertical: var(--kbq-size-xxl);--kbq-markdown-table-size-border-width: var(--kbq-size-border-width);--kbq-markdown-table-size-padding: var(--kbq-size-s);--kbq-markdown-table-size-margin-bottom: var(--kbq-size-m);--kbq-markdown-size-max-width: 650px;--kbq-markdown-h1-color: var(--kbq-foreground-contrast);--kbq-markdown-h2-color: var(--kbq-foreground-contrast);--kbq-markdown-h3-color: var(--kbq-foreground-contrast);--kbq-markdown-h4-color: var(--kbq-foreground-contrast);--kbq-markdown-h5-color: var(--kbq-foreground-contrast);--kbq-markdown-h6-color: var(--kbq-foreground-contrast);--kbq-markdown-p-color: var(--kbq-foreground-contrast);--kbq-markdown-list-color: var(--kbq-foreground-contrast);--kbq-markdown-blockquote-text: var(--kbq-foreground-contrast);--kbq-markdown-blockquote-line: var(--kbq-line-contrast-less);--kbq-markdown-blockquote-background: var(--kbq-background-contrast-fade);--kbq-markdown-blockquote-border: transparent;--kbq-markdown-code-text: var(--kbq-foreground-contrast);--kbq-markdown-code-background: var(--kbq-background-contrast-fade);--kbq-markdown-code-border: var(--kbq-line-contrast-less);--kbq-markdown-image-caption-text: var(--kbq-foreground-contrast-secondary);--kbq-markdown-hr-color: var(--kbq-line-contrast-less);--kbq-markdown-table-header: var(--kbq-foreground-contrast-secondary);--kbq-markdown-table-body: var(--kbq-foreground-contrast);--kbq-markdown-table-border: var(--kbq-line-contrast-less)}\n"] }]
161
165
  }], ctorParameters: () => [], propDecorators: { contentWrapper: [{ type: i0.ViewChild, args: ['contentWrapper', { isSignal: true }] }], outputWrapper: [{ type: i0.ViewChild, args: ['outputWrapper', { isSignal: true }] }], markdownText: [{
162
166
  type: Input
@@ -1 +1 @@
1
- {"version":3,"file":"koobiq-components-markdown.mjs","sources":["../../../packages/components/markdown/markdown.values.ts","../../../packages/components/markdown/markdown.service.ts","../../../packages/components/markdown/markdown.component.ts","../../../packages/components/markdown/markdown.module.ts","../../../packages/components/markdown/koobiq-components-markdown.ts"],"sourcesContent":["/** @docs-private */\nexport const MARKDOWN_TAGS_TO_CLASS_ALIAS = [\n 'a',\n 'blockquote',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'hr',\n 'li',\n 'ol',\n 'table',\n 'tbody',\n 'thead',\n 'td',\n 'tr',\n 'ul',\n 'pre',\n 'code',\n 'img'\n];\n\n/**\n * separating `th` and `p` to prevent it's conflict with `thead` and `pre`\n *\n * @docs-private\n */\nexport const MARKDOWN_WHOLE_TAGS_TO_CLASS_ALIAS = [\n 'th',\n 'p'\n];\n\n/** @docs-private */\nexport const CLASS_PREFIX: string = 'kbq-markdown';\n","import { Injectable } from '@angular/core';\nimport { marked, MarkedOptions } from 'marked';\nimport { CLASS_PREFIX, MARKDOWN_TAGS_TO_CLASS_ALIAS, MARKDOWN_WHOLE_TAGS_TO_CLASS_ALIAS } from './markdown.values';\n\n/**\n * Service for converting Markdown into HTML.\n */\n@Injectable()\nexport class KbqMarkdownService {\n /**\n * Converts a given Markdown string into HTML.\n * NOTE! Method does not sanitize the output HTML string.\n *\n * @param markdown - The Markdown string to be converted.\n * @param options - Optional MarkedOptions to customize the parsing behavior.\n * @returns The transformed HTML string.\n */\n parseToHtml(markdown: string, options?: MarkedOptions): string {\n return this.transform(<string>marked.parse(markdown, options));\n }\n\n private transform(htmlContent: string): string {\n let transformed = htmlContent;\n\n MARKDOWN_TAGS_TO_CLASS_ALIAS.forEach((tag) => {\n transformed = transformed.replace(new RegExp(`<${tag}`, 'g'), (_match: string) => {\n if (tag === 'a') {\n return `<${tag} class=\"${CLASS_PREFIX}__${tag} kbq-link kbq-text-only kbq-link_use-visited\"`;\n }\n\n return `<${tag} class=\"${CLASS_PREFIX}__${tag}\"`;\n });\n });\n\n MARKDOWN_WHOLE_TAGS_TO_CLASS_ALIAS.forEach((tag) => {\n transformed = transformed.replace(\n // `\\\\s`, because a template literal eats the backslash first: `\\s` would reach the\n // constructor as a bare `s` and match `<pss>` rather than `<p >`.\n new RegExp(`<${tag}\\\\s*>`, 'g'),\n (_match: string) => `<${tag} class=\"${CLASS_PREFIX}__${tag}\">`\n );\n });\n\n return transformed;\n }\n}\n","import { FocusMonitor } from '@angular/cdk/a11y';\nimport {\n afterNextRender,\n ChangeDetectionStrategy,\n Component,\n effect,\n ElementRef,\n inject,\n InjectionToken,\n Input,\n OnDestroy,\n Provider,\n signal,\n viewChild,\n ViewEncapsulation\n} from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { MarkedOptions } from 'marked';\nimport { KbqMarkdownService } from './markdown.service';\n\n/** List of options for `marked` library. */\nexport const KBQ_MARKDOWN_MARKED_OPTIONS = new InjectionToken<MarkedOptions>('KBQ_MARKDOWN_MARKED_OPTIONS');\n\n/** Utility provider for `KBQ_MARKDOWN_MARKED_OPTIONS`. */\nexport const kbqMarkdownMarkedOptionsProvider = (options: MarkedOptions): Provider => ({\n provide: KBQ_MARKDOWN_MARKED_OPTIONS,\n useValue: options\n});\n\n/** Component which allows to convert `Markdown` into `HTML` */\n@Component({\n selector: 'kbq-markdown',\n // no need format line with ng-content it's broke textContent for markdownService.parseToHtml()\n template: `\n <pre #contentWrapper class=\"kbq-markdown__input\" ngPreserveWhitespaces><ng-content /></pre>\n <div #outputWrapper class=\"kbq-markdown__output\" [innerHtml]=\"resultHtml()\"></div>\n `,\n styleUrls: ['./markdown.scss', 'markdown-tokens.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'kbq-markdown'\n }\n})\nexport class KbqMarkdown implements OnDestroy {\n private readonly markdownService = inject(KbqMarkdownService);\n private sanitizer = inject(DomSanitizer);\n private readonly markedOptions =\n inject<MarkedOptions | undefined>(KBQ_MARKDOWN_MARKED_OPTIONS, { optional: true }) ?? undefined;\n\n private readonly contentWrapper = viewChild.required<ElementRef<HTMLPreElement>>('contentWrapper');\n private readonly outputWrapper = viewChild.required<ElementRef<HTMLDivElement>>('outputWrapper');\n\n protected resultHtml = signal<SafeHtml | null>(null);\n\n /** `Markdown` text. */\n // TODO: Skipped for migration because:\n // Accessor inputs cannot be migrated as they are too complex.\n @Input()\n get markdownText(): string | null {\n return this._markdownText;\n }\n\n set markdownText(value: string | null) {\n if (value && this.markdownText !== value) {\n this.resultHtml.set(this.getResultHTML(value));\n }\n\n this._markdownText = value;\n }\n\n private _markdownText: string | null = null;\n private readonly focusMonitor = inject(FocusMonitor);\n private readonly links: HTMLAnchorElement[] = [];\n\n constructor() {\n afterNextRender(() => {\n const contentWrapper = this.contentWrapper();\n\n if (!this.markdownText && contentWrapper?.nativeElement.textContent) {\n this.resultHtml.set(this.getResultHTML(contentWrapper?.nativeElement.textContent));\n }\n });\n\n effect(() => {\n if (this.resultHtml()) {\n Promise.resolve().then(() => this.startMonitoringLinks());\n } else {\n this.stopMonitoringLinks();\n }\n });\n }\n\n ngOnDestroy(): void {\n this.stopMonitoringLinks();\n }\n\n private getResultHTML(markdown: string): SafeHtml {\n return this.sanitizer.bypassSecurityTrustHtml(this.markdownService.parseToHtml(markdown, this.markedOptions));\n }\n\n private startMonitoringLinks(): void {\n this.stopMonitoringLinks();\n this.outputWrapper()\n .nativeElement.querySelectorAll<HTMLAnchorElement>('.kbq-markdown__a')\n .forEach((link) => {\n this.links.push(link);\n this.focusMonitor.monitor(link, true);\n });\n }\n\n private stopMonitoringLinks(): void {\n this.links.forEach((link) => this.focusMonitor.stopMonitoring(link));\n this.links.length = 0;\n }\n}\n","import { NgModule } from '@angular/core';\nimport { KbqMarkdown } from './markdown.component';\nimport { KbqMarkdownService } from './markdown.service';\n\nconst COMPONENTS = [\n KbqMarkdown\n];\n\n@NgModule({\n imports: COMPONENTS,\n providers: [KbqMarkdownService],\n exports: COMPONENTS\n})\nexport class KbqMarkdownModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"koobiq-components-markdown.mjs","sources":["../../../packages/components/markdown/markdown.values.ts","../../../packages/components/markdown/markdown.service.ts","../../../packages/components/markdown/markdown.component.ts","../../../packages/components/markdown/markdown.module.ts","../../../packages/components/markdown/koobiq-components-markdown.ts"],"sourcesContent":["/** @docs-private */\nexport const MARKDOWN_TAGS_TO_CLASS_ALIAS = [\n 'a',\n 'blockquote',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'hr',\n 'li',\n 'ol',\n 'table',\n 'tbody',\n 'thead',\n 'td',\n 'tr',\n 'ul',\n 'pre',\n 'code',\n 'img'\n];\n\n/**\n * separating `th` and `p` to prevent it's conflict with `thead` and `pre`\n *\n * @docs-private\n */\nexport const MARKDOWN_WHOLE_TAGS_TO_CLASS_ALIAS = [\n 'th',\n 'p'\n];\n\n/** @docs-private */\nexport const CLASS_PREFIX: string = 'kbq-markdown';\n","import { Injectable } from '@angular/core';\nimport { marked, MarkedOptions } from 'marked';\nimport { CLASS_PREFIX, MARKDOWN_TAGS_TO_CLASS_ALIAS, MARKDOWN_WHOLE_TAGS_TO_CLASS_ALIAS } from './markdown.values';\n\n/**\n * Service for converting Markdown into HTML.\n *\n * @docs-private\n */\n@Injectable()\nexport class KbqMarkdownService {\n /**\n * Converts a given Markdown string into HTML.\n * NOTE! Method does not sanitize the output HTML string.\n *\n * @param markdown - The Markdown string to be converted.\n * @param options - Optional MarkedOptions to customize the parsing behavior.\n * @returns The transformed HTML string.\n */\n parseToHtml(markdown: string, options?: MarkedOptions): string {\n return this.transform(<string>marked.parse(markdown, options));\n }\n\n private transform(htmlContent: string): string {\n let transformed = htmlContent;\n\n MARKDOWN_TAGS_TO_CLASS_ALIAS.forEach((tag) => {\n transformed = transformed.replace(new RegExp(`<${tag}`, 'g'), (_match: string) => {\n if (tag === 'a') {\n return `<${tag} class=\"${CLASS_PREFIX}__${tag} kbq-link kbq-text-only kbq-link_use-visited\"`;\n }\n\n return `<${tag} class=\"${CLASS_PREFIX}__${tag}\"`;\n });\n });\n\n MARKDOWN_WHOLE_TAGS_TO_CLASS_ALIAS.forEach((tag) => {\n transformed = transformed.replace(\n // `\\\\s`, because a template literal eats the backslash first: `\\s` would reach the\n // constructor as a bare `s` and match `<pss>` rather than `<p >`.\n new RegExp(`<${tag}\\\\s*>`, 'g'),\n (_match: string) => `<${tag} class=\"${CLASS_PREFIX}__${tag}\">`\n );\n });\n\n return transformed;\n }\n}\n","import { FocusMonitor } from '@angular/cdk/a11y';\nimport {\n afterNextRender,\n ChangeDetectionStrategy,\n Component,\n effect,\n ElementRef,\n inject,\n InjectionToken,\n Input,\n OnDestroy,\n Provider,\n signal,\n viewChild,\n ViewEncapsulation\n} from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { MarkedOptions } from 'marked';\nimport { KbqMarkdownService } from './markdown.service';\n\n/** List of options for `marked` library. */\nexport const KBQ_MARKDOWN_MARKED_OPTIONS = new InjectionToken<MarkedOptions>('KBQ_MARKDOWN_MARKED_OPTIONS');\n\n/** Utility provider for `KBQ_MARKDOWN_MARKED_OPTIONS`. */\nexport const kbqMarkdownMarkedOptionsProvider = (options: MarkedOptions): Provider => ({\n provide: KBQ_MARKDOWN_MARKED_OPTIONS,\n useValue: options\n});\n\n/** Component which allows to convert `Markdown` into `HTML` */\n@Component({\n selector: 'kbq-markdown',\n // no need format line with ng-content it's broke textContent for markdownService.parseToHtml()\n template: `\n <pre #contentWrapper class=\"kbq-markdown__input\" ngPreserveWhitespaces><ng-content /></pre>\n <div #outputWrapper class=\"kbq-markdown__output\" [innerHtml]=\"resultHtml()\"></div>\n `,\n styleUrls: ['./markdown.scss', 'markdown-tokens.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n // The rendered content comes from `[innerHtml]`, so its scrollbars can only be customized from the host:\n // `kbq-scrollbar` styles the element's own and its descendants' scrollbars.\n class: 'kbq-markdown kbq-scrollbar'\n }\n})\nexport class KbqMarkdown implements OnDestroy {\n private readonly markdownService = inject(KbqMarkdownService);\n private sanitizer = inject(DomSanitizer);\n private readonly markedOptions =\n inject<MarkedOptions | undefined>(KBQ_MARKDOWN_MARKED_OPTIONS, { optional: true }) ?? undefined;\n\n private readonly contentWrapper = viewChild.required<ElementRef<HTMLPreElement>>('contentWrapper');\n private readonly outputWrapper = viewChild.required<ElementRef<HTMLDivElement>>('outputWrapper');\n\n protected resultHtml = signal<SafeHtml | null>(null);\n\n /** `Markdown` text. */\n // TODO: Skipped for migration because:\n // Accessor inputs cannot be migrated as they are too complex.\n @Input()\n get markdownText(): string | null {\n return this._markdownText;\n }\n\n set markdownText(value: string | null) {\n if (value && this.markdownText !== value) {\n this.resultHtml.set(this.getResultHTML(value));\n }\n\n this._markdownText = value;\n }\n\n private _markdownText: string | null = null;\n private readonly focusMonitor = inject(FocusMonitor);\n private readonly links: HTMLAnchorElement[] = [];\n\n constructor() {\n afterNextRender(() => {\n const contentWrapper = this.contentWrapper();\n\n if (!this.markdownText && contentWrapper?.nativeElement.textContent) {\n this.resultHtml.set(this.getResultHTML(contentWrapper?.nativeElement.textContent));\n }\n });\n\n effect(() => {\n if (this.resultHtml()) {\n Promise.resolve().then(() => this.startMonitoringLinks());\n } else {\n this.stopMonitoringLinks();\n }\n });\n }\n\n ngOnDestroy(): void {\n this.stopMonitoringLinks();\n }\n\n private getResultHTML(markdown: string): SafeHtml {\n return this.sanitizer.bypassSecurityTrustHtml(this.markdownService.parseToHtml(markdown, this.markedOptions));\n }\n\n private startMonitoringLinks(): void {\n this.stopMonitoringLinks();\n this.outputWrapper()\n .nativeElement.querySelectorAll<HTMLAnchorElement>('.kbq-markdown__a')\n .forEach((link) => {\n this.links.push(link);\n this.focusMonitor.monitor(link, true);\n });\n }\n\n private stopMonitoringLinks(): void {\n this.links.forEach((link) => this.focusMonitor.stopMonitoring(link));\n this.links.length = 0;\n }\n}\n","import { NgModule } from '@angular/core';\nimport { KbqMarkdown } from './markdown.component';\nimport { KbqMarkdownService } from './markdown.service';\n\nconst COMPONENTS = [\n KbqMarkdown\n];\n\n@NgModule({\n imports: COMPONENTS,\n providers: [KbqMarkdownService],\n exports: COMPONENTS\n})\nexport class KbqMarkdownModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -3,10 +3,10 @@ import { Overlay, OverlayRef, OverlayModule } from '@angular/cdk/overlay';
3
3
  import { _getFocusedElementPierceShadowDom } from '@angular/cdk/platform';
4
4
  import { DOCUMENT, NgTemplateOutlet } from '@angular/common';
5
5
  import * as i0 from '@angular/core';
6
- import { Pipe, inject, Injectable, Renderer2, ComponentFactoryResolver, ElementRef, ViewContainerRef, ChangeDetectorRef, output, EventEmitter, viewChild, viewChildren, signal, TemplateRef, Type, Injector, Input, Output, ViewEncapsulation, ChangeDetectionStrategy, Component, effect, Directive, InjectionToken, isDevMode, NgModule } from '@angular/core';
6
+ import { Pipe, inject, Injectable, Renderer2, EnvironmentInjector, ElementRef, ViewContainerRef, ChangeDetectorRef, output, EventEmitter, viewChild, viewChildren, signal, TemplateRef, Type, Injector, createComponent, Input, Output, ViewEncapsulation, ChangeDetectionStrategy, Component, effect, Directive, InjectionToken, isDevMode, NgModule } from '@angular/core';
7
7
  import * as i1 from '@koobiq/components/button';
8
8
  import { KbqButtonModule } from '@koobiq/components/button';
9
- import * as i3$1 from '@koobiq/components/core';
9
+ import * as i4 from '@koobiq/components/core';
10
10
  import { KbqComponentColors, ESCAPE, ENTER, KbqOverflowShadowContainer, KbqOverflowShadowTop, KbqOverflowShadowBottom } from '@koobiq/components/core';
11
11
  import * as i2 from '@koobiq/components/icon';
12
12
  import { KbqIconModule } from '@koobiq/components/icon';
@@ -177,7 +177,7 @@ class KbqModalComponent extends KbqModalRef {
177
177
  super(...arguments);
178
178
  this.overlay = inject(Overlay);
179
179
  this.renderer = inject(Renderer2);
180
- this.cfr = inject(ComponentFactoryResolver);
180
+ this.environmentInjector = inject(EnvironmentInjector);
181
181
  this.elementRef = inject(ElementRef);
182
182
  this.viewContainer = inject(ViewContainerRef);
183
183
  this.modalControl = inject(KbqModalControlService);
@@ -358,6 +358,9 @@ class KbqModalComponent extends KbqModalRef {
358
358
  this.getElement().querySelector('button[autofocus]')?.focus();
359
359
  }
360
360
  ngOnDestroy() {
361
+ // Created in `ngOnInit` but owned by `bodyContainer` only from `ngAfterViewInit`, so a modal
362
+ // closed in between would leak it. Destroying an already-destroyed view is a no-op.
363
+ this.contentComponentRef?.destroy();
361
364
  if (this.container instanceof OverlayRef) {
362
365
  this.container.dispose();
363
366
  }
@@ -408,6 +411,10 @@ class KbqModalComponent extends KbqModalRef {
408
411
  return this.getElement().getElementsByClassName('kbq-modal-footer').item(0);
409
412
  }
410
413
  onClickMask($event) {
414
+ // Only the primary button closes the modal: the sidepanel's backdrop is driven by `click`, which
415
+ // never fires for the right or middle button, and `mousedown` here would otherwise diverge from it.
416
+ if ($event.button !== 0)
417
+ return;
411
418
  if (this.kbqMask &&
412
419
  this.kbqMaskClosable &&
413
420
  $event.target.classList.contains('kbq-modal-wrap') &&
@@ -617,12 +624,17 @@ class KbqModalComponent extends KbqModalRef {
617
624
  * @param component Component class
618
625
  */
619
626
  createDynamicComponent(component) {
620
- const factory = this.cfr.resolveComponentFactory(component);
621
627
  const childInjector = Injector.create({
622
628
  providers: [{ provide: KbqModalRef, useValue: this }],
623
629
  parent: this.viewContainer.injector
624
630
  });
625
- this.contentComponentRef = factory.create(childInjector);
631
+ // `ngOnInit` runs this for `kbqContent` and `kbqComponent` in turn, and only the last one is
632
+ // ever inserted into `bodyContainer`, so an overwritten ref would have nothing to destroy it.
633
+ this.contentComponentRef?.destroy();
634
+ this.contentComponentRef = createComponent(component, {
635
+ environmentInjector: this.environmentInjector,
636
+ elementInjector: childInjector
637
+ });
626
638
  // Do the first change detection immediately
627
639
  // (or we do detection at ngAfterViewInit, multi-changes error will be thrown)
628
640
  this.contentComponentRef.changeDetectorRef.detectChanges();
@@ -745,8 +757,12 @@ class KbqModalTitle {
745
757
  }
746
758
  /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqModalTitle, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
747
759
  /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.30", type: KbqModalTitle, isStandalone: true, selector: "[kbq-modal-title], kbq-modal-title, [kbqModalTitle]", host: { properties: { "class.kbq-modal-header_closable": "modal.kbqClosable", "style.box-shadow": "modal.bodyOverflow().top ? \"var(--kbq-shadow-overflow-normal-bottom)\" : null" }, classAttribute: "kbq-modal-header" }, ngImport: i0, template: `
748
- <div class="kbq-modal-title" kbq-title>
749
- <ng-content />
760
+ <div class="kbq-modal-header-content">
761
+ <div class="kbq-modal-title" kbq-title>
762
+ <ng-content />
763
+ </div>
764
+
765
+ <ng-content select="kbq-modal-caption, [kbq-modal-caption], [kbqModalCaption]" />
750
766
  </div>
751
767
 
752
768
  @if (modal.kbqClosable) {
@@ -772,8 +788,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImpo
772
788
  KbqTitleDirective
773
789
  ],
774
790
  template: `
775
- <div class="kbq-modal-title" kbq-title>
776
- <ng-content />
791
+ <div class="kbq-modal-header-content">
792
+ <div class="kbq-modal-title" kbq-title>
793
+ <ng-content />
794
+ </div>
795
+
796
+ <ng-content select="kbq-modal-caption, [kbq-modal-caption], [kbqModalCaption]" />
777
797
  </div>
778
798
 
779
799
  @if (modal.kbqClosable) {
@@ -795,6 +815,31 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImpo
795
815
  }
796
816
  }]
797
817
  }] });
818
+ /**
819
+ * Caption of a manually composed modal (`kbqComponent`). Projected into the header rendered by
820
+ * `KbqModalTitle`, below the title, and clamped to two lines. The resulting markup matches the
821
+ * header of a modal created via `KbqModalService.create`.
822
+ */
823
+ class KbqModalCaption {
824
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqModalCaption, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
825
+ /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.30", type: KbqModalCaption, isStandalone: true, selector: "[kbq-modal-caption], kbq-modal-caption, [kbqModalCaption]", host: { classAttribute: "kbq-modal-caption" }, hostDirectives: [{ directive: i3.KbqTitleDirective }], ngImport: i0, template: `
826
+ <ng-content />
827
+ `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
828
+ }
829
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqModalCaption, decorators: [{
830
+ type: Component,
831
+ args: [{
832
+ selector: `[kbq-modal-caption], kbq-modal-caption, [kbqModalCaption]`,
833
+ template: `
834
+ <ng-content />
835
+ `,
836
+ changeDetection: ChangeDetectionStrategy.OnPush,
837
+ host: {
838
+ class: 'kbq-modal-caption'
839
+ },
840
+ hostDirectives: [KbqTitleDirective]
841
+ }]
842
+ }] });
798
843
  /**
799
844
  * Scrollable body of a manually composed modal (`kbqComponent`). Publishes its scroll-shadow
800
845
  * state onto the modal instance so a sibling `KbqModalTitle`/`KbqModalFooter` can render the
@@ -807,7 +852,7 @@ class KbqModalBody {
807
852
  effect(() => this.modal.bodyOverflow.set(this.overflowContainer.overflow()));
808
853
  }
809
854
  /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqModalBody, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
810
- /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.30", type: KbqModalBody, isStandalone: true, selector: "[kbq-modal-body], kbq-modal-body, [kbqModalBody]", host: { classAttribute: "kbq-modal-body kbq-scrollbar" }, hostDirectives: [{ directive: i3$1.KbqOverflowShadowContainer }], ngImport: i0 }); }
855
+ /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.30", type: KbqModalBody, isStandalone: true, selector: "[kbq-modal-body], kbq-modal-body, [kbqModalBody]", host: { classAttribute: "kbq-modal-body kbq-scrollbar" }, hostDirectives: [{ directive: i4.KbqOverflowShadowContainer }], ngImport: i0 }); }
811
856
  }
812
857
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImport: i0, type: KbqModalBody, decorators: [{
813
858
  type: Directive,
@@ -981,11 +1026,13 @@ class KbqModalModule {
981
1026
  NgTemplateOutlet,
982
1027
  KbqModalComponent,
983
1028
  KbqModalTitle,
1029
+ KbqModalCaption,
984
1030
  KbqModalBody,
985
1031
  KbqModalFooter,
986
1032
  CssUnitPipe,
987
1033
  KbqModalMainAction], exports: [KbqModalComponent,
988
1034
  KbqModalTitle,
1035
+ KbqModalCaption,
989
1036
  KbqModalBody,
990
1037
  KbqModalFooter,
991
1038
  KbqModalMainAction] }); }
@@ -1013,6 +1060,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImpo
1013
1060
  NgTemplateOutlet,
1014
1061
  KbqModalComponent,
1015
1062
  KbqModalTitle,
1063
+ KbqModalCaption,
1016
1064
  KbqModalBody,
1017
1065
  KbqModalFooter,
1018
1066
  CssUnitPipe,
@@ -1026,6 +1074,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImpo
1026
1074
  exports: [
1027
1075
  KbqModalComponent,
1028
1076
  KbqModalTitle,
1077
+ KbqModalCaption,
1029
1078
  KbqModalBody,
1030
1079
  KbqModalFooter,
1031
1080
  KbqModalMainAction
@@ -1037,5 +1086,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.30", ngImpo
1037
1086
  * Generated bundle index. Do not edit.
1038
1087
  */
1039
1088
 
1040
- export { KBQ_MODAL_DATA, KbqModalBody, KbqModalComponent, KbqModalFooter, KbqModalMainAction, KbqModalModule, KbqModalRef, KbqModalService, KbqModalTitle, MODAL_ANIMATE_DURATION, ModalBuilderForService, ModalSize };
1089
+ export { KBQ_MODAL_DATA, KbqModalBody, KbqModalCaption, KbqModalComponent, KbqModalFooter, KbqModalMainAction, KbqModalModule, KbqModalRef, KbqModalService, KbqModalTitle, MODAL_ANIMATE_DURATION, ModalBuilderForService, ModalSize };
1041
1090
  //# sourceMappingURL=koobiq-components-modal.mjs.map