cmat 0.0.79 → 0.0.81

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 (137) hide show
  1. package/fesm2022/cmat-components-adapter.mjs +9 -9
  2. package/fesm2022/cmat-components-breadcrumb.mjs +9 -9
  3. package/fesm2022/cmat-components-card.mjs +3 -3
  4. package/fesm2022/cmat-components-carousel.mjs +55 -30
  5. package/fesm2022/cmat-components-carousel.mjs.map +1 -1
  6. package/fesm2022/cmat-components-cascade.mjs +14 -14
  7. package/fesm2022/cmat-components-cascade.mjs.map +1 -1
  8. package/fesm2022/cmat-components-chip-input.mjs +3 -3
  9. package/fesm2022/cmat-components-code-editor.mjs +3 -3
  10. package/fesm2022/cmat-components-custom-formly.mjs +119 -116
  11. package/fesm2022/cmat-components-custom-formly.mjs.map +1 -1
  12. package/fesm2022/cmat-components-date-range.mjs +12 -12
  13. package/fesm2022/cmat-components-date-range.mjs.map +1 -1
  14. package/fesm2022/cmat-components-date-time-display.mjs +3 -3
  15. package/fesm2022/cmat-components-drawer.mjs +59 -24
  16. package/fesm2022/cmat-components-drawer.mjs.map +1 -1
  17. package/fesm2022/cmat-components-empty-state.mjs +3 -3
  18. package/fesm2022/cmat-components-file-preview.mjs +3 -3
  19. package/fesm2022/cmat-components-filter-toolbar.mjs +3 -3
  20. package/fesm2022/cmat-components-form-actions.mjs +3 -3
  21. package/fesm2022/cmat-components-fullscreen.mjs +3 -3
  22. package/fesm2022/cmat-components-highlight.mjs +6 -7
  23. package/fesm2022/cmat-components-highlight.mjs.map +1 -1
  24. package/fesm2022/cmat-components-image-viewer.mjs +12 -15
  25. package/fesm2022/cmat-components-image-viewer.mjs.map +1 -1
  26. package/fesm2022/cmat-components-inline-loading.mjs +3 -3
  27. package/fesm2022/cmat-components-json-editor.mjs +4 -6
  28. package/fesm2022/cmat-components-json-editor.mjs.map +1 -1
  29. package/fesm2022/cmat-components-knob-input.mjs +11 -11
  30. package/fesm2022/cmat-components-knob-input.mjs.map +1 -1
  31. package/fesm2022/cmat-components-masonry.mjs +8 -11
  32. package/fesm2022/cmat-components-masonry.mjs.map +1 -1
  33. package/fesm2022/cmat-components-material-color-picker.mjs +13 -14
  34. package/fesm2022/cmat-components-material-color-picker.mjs.map +1 -1
  35. package/fesm2022/cmat-components-material-datetimepicker.mjs +122 -108
  36. package/fesm2022/cmat-components-material-datetimepicker.mjs.map +1 -1
  37. package/fesm2022/cmat-components-navigation.mjs +182 -210
  38. package/fesm2022/cmat-components-navigation.mjs.map +1 -1
  39. package/fesm2022/cmat-components-opt-input.mjs +75 -65
  40. package/fesm2022/cmat-components-opt-input.mjs.map +1 -1
  41. package/fesm2022/cmat-components-org-chart.mjs +9 -9
  42. package/fesm2022/cmat-components-page-header.mjs +3 -3
  43. package/fesm2022/cmat-components-pagination.mjs +34 -32
  44. package/fesm2022/cmat-components-pagination.mjs.map +1 -1
  45. package/fesm2022/cmat-components-password-strength.mjs +13 -15
  46. package/fesm2022/cmat-components-password-strength.mjs.map +1 -1
  47. package/fesm2022/cmat-components-popover.mjs +35 -26
  48. package/fesm2022/cmat-components-popover.mjs.map +1 -1
  49. package/fesm2022/cmat-components-progress-bar.mjs +11 -14
  50. package/fesm2022/cmat-components-progress-bar.mjs.map +1 -1
  51. package/fesm2022/cmat-components-qrcode.mjs +3 -3
  52. package/fesm2022/cmat-components-rating.mjs +14 -14
  53. package/fesm2022/cmat-components-rating.mjs.map +1 -1
  54. package/fesm2022/cmat-components-rich-text-editor.mjs +3 -3
  55. package/fesm2022/cmat-components-select-search.mjs +25 -37
  56. package/fesm2022/cmat-components-select-search.mjs.map +1 -1
  57. package/fesm2022/cmat-components-select-table.mjs +19 -20
  58. package/fesm2022/cmat-components-select-table.mjs.map +1 -1
  59. package/fesm2022/cmat-components-select-tree.mjs +31 -32
  60. package/fesm2022/cmat-components-select-tree.mjs.map +1 -1
  61. package/fesm2022/cmat-components-skeleton.mjs +3 -3
  62. package/fesm2022/cmat-components-speed-dial.mjs +57 -20
  63. package/fesm2022/cmat-components-speed-dial.mjs.map +1 -1
  64. package/fesm2022/cmat-components-status-tag.mjs +3 -3
  65. package/fesm2022/cmat-components-table-toolbar.mjs +3 -3
  66. package/fesm2022/cmat-components-timeline.mjs +12 -12
  67. package/fesm2022/cmat-components-toast.mjs +77 -28
  68. package/fesm2022/cmat-components-toast.mjs.map +1 -1
  69. package/fesm2022/cmat-components-transfer-picker.mjs +103 -90
  70. package/fesm2022/cmat-components-transfer-picker.mjs.map +1 -1
  71. package/fesm2022/cmat-components-treetable.mjs +17 -19
  72. package/fesm2022/cmat-components-treetable.mjs.map +1 -1
  73. package/fesm2022/cmat-components-upload.mjs +24 -31
  74. package/fesm2022/cmat-components-upload.mjs.map +1 -1
  75. package/fesm2022/cmat-components-x6-angular-shape.mjs +0 -3
  76. package/fesm2022/cmat-components-x6-angular-shape.mjs.map +1 -1
  77. package/fesm2022/cmat-directives-animate-on-scroll.mjs +6 -6
  78. package/fesm2022/cmat-directives-arrow-cursor.mjs +69 -46
  79. package/fesm2022/cmat-directives-arrow-cursor.mjs.map +1 -1
  80. package/fesm2022/cmat-directives-autofocus.mjs +3 -3
  81. package/fesm2022/cmat-directives-data-exporter.mjs +21 -21
  82. package/fesm2022/cmat-directives-debounce.mjs +9 -9
  83. package/fesm2022/cmat-directives-digit-only.mjs +6 -6
  84. package/fesm2022/cmat-directives-equal-validator.mjs +3 -3
  85. package/fesm2022/cmat-directives-seamless-auto-scroll.mjs +3 -3
  86. package/fesm2022/cmat-lib-mock-api.mjs +6 -6
  87. package/fesm2022/cmat-pipes-bytes.mjs +3 -3
  88. package/fesm2022/cmat-pipes-date-format.mjs +3 -3
  89. package/fesm2022/cmat-pipes-find-by-key.mjs +3 -3
  90. package/fesm2022/cmat-pipes-group-by.mjs +3 -3
  91. package/fesm2022/cmat-pipes-keys.mjs +3 -3
  92. package/fesm2022/cmat-pipes-secure.mjs +3 -3
  93. package/fesm2022/cmat-pipes-uppercase.mjs +3 -3
  94. package/fesm2022/cmat-services-alert.mjs +3 -3
  95. package/fesm2022/cmat-services-config.mjs +6 -6
  96. package/fesm2022/cmat-services-confirmation.mjs +6 -6
  97. package/fesm2022/cmat-services-data.mjs +3 -3
  98. package/fesm2022/cmat-services-export-as.mjs +3 -3
  99. package/fesm2022/cmat-services-loading.mjs +6 -6
  100. package/fesm2022/cmat-services-local-storage.mjs +3 -3
  101. package/fesm2022/cmat-services-media-watcher.mjs +3 -3
  102. package/fesm2022/cmat-services-platform.mjs +3 -3
  103. package/fesm2022/cmat-services-splash-screen.mjs +3 -3
  104. package/fesm2022/cmat-services-title.mjs +3 -3
  105. package/fesm2022/cmat-services-translation.mjs +3 -3
  106. package/fesm2022/cmat-services-utils.mjs +3 -3
  107. package/fesm2022/cmat.mjs +1395 -1246
  108. package/fesm2022/cmat.mjs.map +1 -1
  109. package/package.json +1 -1
  110. package/types/cmat-components-carousel.d.ts +18 -11
  111. package/types/cmat-components-cascade.d.ts +3 -3
  112. package/types/cmat-components-custom-formly.d.ts +8 -9
  113. package/types/cmat-components-date-range.d.ts +1 -1
  114. package/types/cmat-components-drawer.d.ts +8 -2
  115. package/types/cmat-components-image-viewer.d.ts +5 -6
  116. package/types/cmat-components-json-editor.d.ts +0 -1
  117. package/types/cmat-components-knob-input.d.ts +2 -2
  118. package/types/cmat-components-masonry.d.ts +1 -2
  119. package/types/cmat-components-material-color-picker.d.ts +1 -2
  120. package/types/cmat-components-material-datetimepicker.d.ts +16 -16
  121. package/types/cmat-components-navigation.d.ts +16 -8
  122. package/types/cmat-components-opt-input.d.ts +11 -8
  123. package/types/cmat-components-pagination.d.ts +5 -4
  124. package/types/cmat-components-password-strength.d.ts +1 -2
  125. package/types/cmat-components-popover.d.ts +3 -4
  126. package/types/cmat-components-progress-bar.d.ts +6 -7
  127. package/types/cmat-components-rating.d.ts +6 -7
  128. package/types/cmat-components-select-search.d.ts +2 -2
  129. package/types/cmat-components-select-table.d.ts +7 -8
  130. package/types/cmat-components-select-tree.d.ts +10 -11
  131. package/types/cmat-components-speed-dial.d.ts +6 -3
  132. package/types/cmat-components-toast.d.ts +13 -4
  133. package/types/cmat-components-transfer-picker.d.ts +21 -11
  134. package/types/cmat-components-treetable.d.ts +3 -4
  135. package/types/cmat-components-upload.d.ts +5 -7
  136. package/types/cmat-directives-arrow-cursor.d.ts +9 -4
  137. package/types/cmat.d.ts +160 -122
@@ -1,6 +1,6 @@
1
1
  import { DOCUMENT } from '@angular/common';
2
2
  import * as i0 from '@angular/core';
3
- import { EventEmitter, inject, ChangeDetectorRef, ViewChild, HostBinding, Output, Input, ViewEncapsulation, ChangeDetectionStrategy, Component } from '@angular/core';
3
+ import { EventEmitter, inject, ViewChild, HostBinding, Output, Input, ViewEncapsulation, ChangeDetectionStrategy, Component } from '@angular/core';
4
4
  import { createAjvValidator, parseJSONPath, createMultiSelection, isJSONContent, isKeySelection, stringifyJSONPath, isMultiSelection, createJSONEditor } from 'vanilla-jsoneditor';
5
5
 
6
6
  class CmatJsonEditorComponent {
@@ -14,7 +14,6 @@ class CmatJsonEditorComponent {
14
14
  };
15
15
  this._destroyed = false;
16
16
  this._document = inject(DOCUMENT);
17
- this._changeDetectorRef = inject(ChangeDetectorRef);
18
17
  }
19
18
  get darkTheme() {
20
19
  return this._isDarkTheme;
@@ -38,7 +37,6 @@ class CmatJsonEditorComponent {
38
37
  if (this._editor) {
39
38
  void this._editor.update(this.content);
40
39
  }
41
- this._changeDetectorRef.markForCheck();
42
40
  }
43
41
  if (changes.options) {
44
42
  if (this._editor) {
@@ -170,10 +168,10 @@ class CmatJsonEditorComponent {
170
168
  },
171
169
  });
172
170
  }
173
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: CmatJsonEditorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
174
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: CmatJsonEditorComponent, isStandalone: true, selector: "cmat-json-editor", inputs: { options: "options", data: "data" }, outputs: { contentChanged: "contentChanged", pathChanged: "pathChanged" }, host: { properties: { "class.jse-theme-dark": "this.darkTheme" } }, viewQueries: [{ propertyName: "jsonEditorContainer", first: true, predicate: ["jsonEditorContainer"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "@defer (on viewport) {\r\n <div #jsonEditorContainer class=\"cmat-jsoneditor\" [id]=\"id\"></div>\r\n} @placeholder {\r\n <div class=\"flex min-h-64 items-center justify-center rounded-2xl border border-dashed border-default bg-card px-4 py-6 text-sm text-secondary shadow-sm\">\r\n JSON \u7F16\u8F91\u5668\u52A0\u8F7D\u4E2D...\r\n </div>\r\n}\r\n", styles: [".cmat-jsoneditor .jse-main.svelte-sxaskb{min-height:24rem}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
171
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: CmatJsonEditorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
172
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: CmatJsonEditorComponent, isStandalone: true, selector: "cmat-json-editor", inputs: { options: "options", data: "data" }, outputs: { contentChanged: "contentChanged", pathChanged: "pathChanged" }, host: { properties: { "class.jse-theme-dark": "this.darkTheme" } }, viewQueries: [{ propertyName: "jsonEditorContainer", first: true, predicate: ["jsonEditorContainer"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "@defer (on viewport) {\r\n <div #jsonEditorContainer class=\"cmat-jsoneditor\" [id]=\"id\"></div>\r\n} @placeholder {\r\n <div class=\"flex min-h-64 items-center justify-center rounded-2xl border border-dashed border-default bg-card px-4 py-6 text-sm text-secondary shadow-sm\">\r\n JSON \u7F16\u8F91\u5668\u52A0\u8F7D\u4E2D...\r\n </div>\r\n}\r\n", styles: [".cmat-jsoneditor .jse-main.svelte-sxaskb{min-height:24rem}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
175
173
  }
176
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: CmatJsonEditorComponent, decorators: [{
174
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: CmatJsonEditorComponent, decorators: [{
177
175
  type: Component,
178
176
  args: [{ selector: 'cmat-json-editor', preserveWhitespaces: false, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, imports: [], template: "@defer (on viewport) {\r\n <div #jsonEditorContainer class=\"cmat-jsoneditor\" [id]=\"id\"></div>\r\n} @placeholder {\r\n <div class=\"flex min-h-64 items-center justify-center rounded-2xl border border-dashed border-default bg-card px-4 py-6 text-sm text-secondary shadow-sm\">\r\n JSON \u7F16\u8F91\u5668\u52A0\u8F7D\u4E2D...\r\n </div>\r\n}\r\n", styles: [".cmat-jsoneditor .jse-main.svelte-sxaskb{min-height:24rem}\n"] }]
179
177
  }], propDecorators: { options: [{
@@ -1 +1 @@
1
- {"version":3,"file":"cmat-components-json-editor.mjs","sources":["../../../projects/cmat/components/json-editor/json-editor.component.ts","../../../projects/cmat/components/json-editor/json-editor.component.html","../../../projects/cmat/components/json-editor/cmat-components-json-editor.ts"],"sourcesContent":["import { DOCUMENT } from '@angular/common';\r\nimport { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter, HostBinding, Input, OnChanges, OnDestroy, OnInit, Output, SimpleChanges, ViewChild, ViewEncapsulation, inject } from '@angular/core';\r\nimport {\r\n stringifyJSONPath,\r\n Content,\r\n MenuItem,\r\n createAjvValidator,\r\n parseJSONPath,\r\n JSONEditorSelection,\r\n isKeySelection,\r\n isJSONContent,\r\n JSONContent,\r\n isMultiSelection,\r\n createMultiSelection,\r\n MenuButton,\r\n TextContent,\r\n createJSONEditor,\r\n JsonEditor,\r\n} from 'vanilla-jsoneditor';\r\n\r\n@Component({\r\n selector: 'cmat-json-editor',\r\n templateUrl: './json-editor.component.html',\r\n preserveWhitespaces: false,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n styleUrls: ['./json-editor.component.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n imports: []\r\n})\r\nexport class CmatJsonEditorComponent implements OnInit, OnChanges, OnDestroy {\r\n @Input() options: any;\r\n @Input() data: any;\r\n\r\n @Output() contentChanged: EventEmitter<any> = new EventEmitter<any>();\r\n @Output() pathChanged: EventEmitter<string> = new EventEmitter<string>();\r\n\r\n\r\n public id = 'cmatjsoneditor' + Math.floor(Math.random() * 1000000);\r\n content: Content = {\r\n text: undefined,\r\n json: {}\r\n };\r\n\r\n private _editor?: JsonEditor;\r\n private _jsonEditorContainer?: ElementRef;\r\n private _destroyed = false;\r\n private readonly _document = inject(DOCUMENT);\r\n private _changeDetectorRef = inject(ChangeDetectorRef);\r\n\r\n @HostBinding('class.jse-theme-dark')\r\n get darkTheme(): boolean {\r\n return this._isDarkTheme;\r\n }\r\n\r\n private get _isDarkTheme(): boolean {\r\n return this._document.documentElement.classList.contains('dark') || this._document.body.classList.contains('dark');\r\n }\r\n\r\n @ViewChild('jsonEditorContainer')\r\n set jsonEditorContainer(value: ElementRef | undefined) {\r\n this._jsonEditorContainer = value;\r\n this._initializeEditor();\r\n }\r\n\r\n ngOnInit(): void {\r\n this._initializeEditor();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes.data) {\r\n this.content = {\r\n text: undefined,\r\n json: this.data\r\n };\r\n\r\n if (this._editor) {\r\n void this._editor.update(this.content);\r\n }\r\n\r\n this._changeDetectorRef.markForCheck();\r\n }\r\n\r\n if (changes.options) {\r\n if (this._editor) {\r\n void this._editor?.updateProps(this.options);\r\n }\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this._destroyed = true;\r\n void this._editor?.destroy();\r\n }\r\n\r\n setSchema(schema: any): void {\r\n const validator = createAjvValidator({ schema });\r\n void this._editor?.updateProps({ validator: validator });\r\n }\r\n\r\n setSelectionToPath(pathString: string): void {\r\n const path = parseJSONPath(pathString);\r\n const selection = createMultiSelection(path, path);\r\n\r\n try {\r\n void this._editor?.select(selection);\r\n } catch (error) {\r\n console.warn('Set selection to path not possible:', pathString, error);\r\n }\r\n this.pathChanged.emit(pathString);\r\n }\r\n\r\n get(): JSON | undefined {\r\n if (this._editor) {\r\n const content: Content = this._editor.get();\r\n if (isJSONContent(content)) {\r\n const j: any = (this._editor.get() as JSONContent).json;\r\n return j;\r\n } else {\r\n const t: any = (this._editor.get() as TextContent).text;\r\n const j: JSON = JSON.parse(t);\r\n return j;\r\n }\r\n }\r\n return undefined;\r\n }\r\n\r\n set(json: any): void {\r\n const value: JSONContent = {\r\n json: json,\r\n };\r\n\r\n void this._editor?.set(value);\r\n }\r\n\r\n private _onSelect(selection: JSONEditorSelection | undefined): void {\r\n if (isKeySelection(selection)) {\r\n this.pathChanged.emit(stringifyJSONPath((selection as any).path));\r\n } else if (isMultiSelection(selection)) {\r\n this.pathChanged.emit(stringifyJSONPath((selection as any).anchorPath));\r\n }\r\n }\r\n\r\n private _initializeEditor(): void {\r\n if (this._destroyed || this._editor || !this._jsonEditorContainer?.nativeElement) {\r\n return;\r\n }\r\n\r\n this._editor = createJSONEditor({\r\n target: this._jsonEditorContainer.nativeElement,\r\n props: {\r\n ...this.options,\r\n content: this.content,\r\n onChange: (\r\n updatedContent: Content,\r\n previousContent: any,\r\n { contentErrors, patchResult }: any\r\n ): void => {\r\n console.log('onChange', {\r\n updatedContent,\r\n previousContent,\r\n contentErrors,\r\n patchResult,\r\n });\r\n this.content = updatedContent;\r\n this.contentChanged.emit(updatedContent);\r\n },\r\n onSelect: this._onSelect.bind(this),\r\n onRenderMenu(\r\n items: MenuItem[],\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n context: { mode: 'tree' | 'text' | 'table'; modal: boolean }\r\n ): MenuItem[] | undefined {\r\n items.splice(\r\n items.findIndex(i => (i as MenuButton)['text'] === 'table'),\r\n 1\r\n );\r\n items.splice(\r\n items.findIndex(i => (i as MenuButton)['className'] === 'jse-sort'),\r\n 1\r\n );\r\n items.splice(\r\n items.findIndex(i => (i as MenuButton)['className'] === 'jse-transform'),\r\n 1\r\n );\r\n\r\n items.forEach((item) => {\r\n const button = item as MenuButton;\r\n switch (button['title']) {\r\n case 'Switch to text mode (current mode: text)':\r\n button.text = '文本';\r\n button.title = '切换到文本模式(当前模式:文本)';\r\n break;\r\n case 'Switch to tree mode (current mode: text)':\r\n button.text = '树';\r\n button.title = '切换到树模式(当前模式:文本)';\r\n break;\r\n case 'Switch to text mode (current mode: tree)':\r\n button.text = '文本';\r\n button.title = '切换到文本模式(当前模式:树)';\r\n break;\r\n case 'Switch to tree mode (current mode: tree)':\r\n button.text = '树';\r\n button.title = '切换到树模式(当前模式:树)';\r\n break;\r\n case 'Format JSON: add proper indentation and new lines (Ctrl+I)':\r\n button.title = 'JSON格式化:添加适当的缩进和换行 (Ctrl+I)';\r\n break;\r\n case 'Compact JSON: remove all white spacing and new lines (Ctrl+Shift+I)':\r\n button.title = '压缩 JSON:删除所有空白间距和换行 (Ctrl+Shift+I)';\r\n break;\r\n case 'Search (Ctrl+F)':\r\n button.title = '搜索 (Ctrl+F)';\r\n break;\r\n case 'Undo (Ctrl+Z)':\r\n button.title = '撤销 (Ctrl+Z)';\r\n break;\r\n case 'Redo (Ctrl+Shift+Z)':\r\n button.title = '重做 (Ctrl+Shift+Z)';\r\n break;\r\n case 'Expand all':\r\n button.title = '全部展开';\r\n break;\r\n case 'Collapse all':\r\n button.title = '全部折叠';\r\n break;\r\n case 'Open context menu (Click here, right click on the selection, or use the context menu button or Ctrl+Q)':\r\n button.title = '打开上下文菜单(单击此处、右键选择,或使用上下文菜单按钮,或 Ctrl+Q)';\r\n break;\r\n }\r\n });\r\n return items;\r\n },\r\n },\r\n });\r\n }\r\n}\r\n","@defer (on viewport) {\r\n <div #jsonEditorContainer class=\"cmat-jsoneditor\" [id]=\"id\"></div>\r\n} @placeholder {\r\n <div class=\"flex min-h-64 items-center justify-center rounded-2xl border border-dashed border-default bg-card px-4 py-6 text-sm text-secondary shadow-sm\">\r\n JSON 编辑器加载中...\r\n </div>\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cmat-components-json-editor.mjs","sources":["../../../projects/cmat/components/json-editor/json-editor.component.ts","../../../projects/cmat/components/json-editor/json-editor.component.html","../../../projects/cmat/components/json-editor/cmat-components-json-editor.ts"],"sourcesContent":["import { DOCUMENT } from '@angular/common';\r\nimport { ChangeDetectionStrategy, Component, ElementRef, EventEmitter, HostBinding, Input, OnChanges, OnDestroy, OnInit, Output, SimpleChanges, ViewChild, ViewEncapsulation, inject } from '@angular/core';\r\nimport {\r\n stringifyJSONPath,\r\n Content,\r\n MenuItem,\r\n createAjvValidator,\r\n parseJSONPath,\r\n JSONEditorSelection,\r\n isKeySelection,\r\n isJSONContent,\r\n JSONContent,\r\n isMultiSelection,\r\n createMultiSelection,\r\n MenuButton,\r\n TextContent,\r\n createJSONEditor,\r\n JsonEditor,\r\n} from 'vanilla-jsoneditor';\r\n\r\n@Component({\r\n selector: 'cmat-json-editor',\r\n templateUrl: './json-editor.component.html',\r\n preserveWhitespaces: false,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n styleUrls: ['./json-editor.component.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n imports: []\r\n})\r\nexport class CmatJsonEditorComponent implements OnInit, OnChanges, OnDestroy {\r\n @Input() options: any;\r\n @Input() data: any;\r\n\r\n @Output() contentChanged: EventEmitter<any> = new EventEmitter<any>();\r\n @Output() pathChanged: EventEmitter<string> = new EventEmitter<string>();\r\n\r\n\r\n public id = 'cmatjsoneditor' + Math.floor(Math.random() * 1000000);\r\n content: Content = {\r\n text: undefined,\r\n json: {}\r\n };\r\n\r\n private _editor?: JsonEditor;\r\n private _jsonEditorContainer?: ElementRef;\r\n private _destroyed = false;\r\n private readonly _document = inject(DOCUMENT);\r\n\r\n @HostBinding('class.jse-theme-dark')\r\n get darkTheme(): boolean {\r\n return this._isDarkTheme;\r\n }\r\n\r\n private get _isDarkTheme(): boolean {\r\n return this._document.documentElement.classList.contains('dark') || this._document.body.classList.contains('dark');\r\n }\r\n\r\n @ViewChild('jsonEditorContainer')\r\n set jsonEditorContainer(value: ElementRef | undefined) {\r\n this._jsonEditorContainer = value;\r\n this._initializeEditor();\r\n }\r\n\r\n ngOnInit(): void {\r\n this._initializeEditor();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes.data) {\r\n this.content = {\r\n text: undefined,\r\n json: this.data\r\n };\r\n\r\n if (this._editor) {\r\n void this._editor.update(this.content);\r\n }\r\n\r\n }\r\n\r\n if (changes.options) {\r\n if (this._editor) {\r\n void this._editor?.updateProps(this.options);\r\n }\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this._destroyed = true;\r\n void this._editor?.destroy();\r\n }\r\n\r\n setSchema(schema: any): void {\r\n const validator = createAjvValidator({ schema });\r\n void this._editor?.updateProps({ validator: validator });\r\n }\r\n\r\n setSelectionToPath(pathString: string): void {\r\n const path = parseJSONPath(pathString);\r\n const selection = createMultiSelection(path, path);\r\n\r\n try {\r\n void this._editor?.select(selection);\r\n } catch (error) {\r\n console.warn('Set selection to path not possible:', pathString, error);\r\n }\r\n this.pathChanged.emit(pathString);\r\n }\r\n\r\n get(): JSON | undefined {\r\n if (this._editor) {\r\n const content: Content = this._editor.get();\r\n if (isJSONContent(content)) {\r\n const j: any = (this._editor.get() as JSONContent).json;\r\n return j;\r\n } else {\r\n const t: any = (this._editor.get() as TextContent).text;\r\n const j: JSON = JSON.parse(t);\r\n return j;\r\n }\r\n }\r\n return undefined;\r\n }\r\n\r\n set(json: any): void {\r\n const value: JSONContent = {\r\n json: json,\r\n };\r\n\r\n void this._editor?.set(value);\r\n }\r\n\r\n private _onSelect(selection: JSONEditorSelection | undefined): void {\r\n if (isKeySelection(selection)) {\r\n this.pathChanged.emit(stringifyJSONPath((selection as any).path));\r\n } else if (isMultiSelection(selection)) {\r\n this.pathChanged.emit(stringifyJSONPath((selection as any).anchorPath));\r\n }\r\n }\r\n\r\n private _initializeEditor(): void {\r\n if (this._destroyed || this._editor || !this._jsonEditorContainer?.nativeElement) {\r\n return;\r\n }\r\n\r\n this._editor = createJSONEditor({\r\n target: this._jsonEditorContainer.nativeElement,\r\n props: {\r\n ...this.options,\r\n content: this.content,\r\n onChange: (\r\n updatedContent: Content,\r\n previousContent: any,\r\n { contentErrors, patchResult }: any\r\n ): void => {\r\n console.log('onChange', {\r\n updatedContent,\r\n previousContent,\r\n contentErrors,\r\n patchResult,\r\n });\r\n this.content = updatedContent;\r\n this.contentChanged.emit(updatedContent);\r\n },\r\n onSelect: this._onSelect.bind(this),\r\n onRenderMenu(\r\n items: MenuItem[],\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n context: { mode: 'tree' | 'text' | 'table'; modal: boolean }\r\n ): MenuItem[] | undefined {\r\n items.splice(\r\n items.findIndex(i => (i as MenuButton)['text'] === 'table'),\r\n 1\r\n );\r\n items.splice(\r\n items.findIndex(i => (i as MenuButton)['className'] === 'jse-sort'),\r\n 1\r\n );\r\n items.splice(\r\n items.findIndex(i => (i as MenuButton)['className'] === 'jse-transform'),\r\n 1\r\n );\r\n\r\n items.forEach((item) => {\r\n const button = item as MenuButton;\r\n switch (button['title']) {\r\n case 'Switch to text mode (current mode: text)':\r\n button.text = '文本';\r\n button.title = '切换到文本模式(当前模式:文本)';\r\n break;\r\n case 'Switch to tree mode (current mode: text)':\r\n button.text = '树';\r\n button.title = '切换到树模式(当前模式:文本)';\r\n break;\r\n case 'Switch to text mode (current mode: tree)':\r\n button.text = '文本';\r\n button.title = '切换到文本模式(当前模式:树)';\r\n break;\r\n case 'Switch to tree mode (current mode: tree)':\r\n button.text = '树';\r\n button.title = '切换到树模式(当前模式:树)';\r\n break;\r\n case 'Format JSON: add proper indentation and new lines (Ctrl+I)':\r\n button.title = 'JSON格式化:添加适当的缩进和换行 (Ctrl+I)';\r\n break;\r\n case 'Compact JSON: remove all white spacing and new lines (Ctrl+Shift+I)':\r\n button.title = '压缩 JSON:删除所有空白间距和换行 (Ctrl+Shift+I)';\r\n break;\r\n case 'Search (Ctrl+F)':\r\n button.title = '搜索 (Ctrl+F)';\r\n break;\r\n case 'Undo (Ctrl+Z)':\r\n button.title = '撤销 (Ctrl+Z)';\r\n break;\r\n case 'Redo (Ctrl+Shift+Z)':\r\n button.title = '重做 (Ctrl+Shift+Z)';\r\n break;\r\n case 'Expand all':\r\n button.title = '全部展开';\r\n break;\r\n case 'Collapse all':\r\n button.title = '全部折叠';\r\n break;\r\n case 'Open context menu (Click here, right click on the selection, or use the context menu button or Ctrl+Q)':\r\n button.title = '打开上下文菜单(单击此处、右键选择,或使用上下文菜单按钮,或 Ctrl+Q)';\r\n break;\r\n }\r\n });\r\n return items;\r\n },\r\n },\r\n });\r\n }\r\n}\r\n","@defer (on viewport) {\r\n <div #jsonEditorContainer class=\"cmat-jsoneditor\" [id]=\"id\"></div>\r\n} @placeholder {\r\n <div class=\"flex min-h-64 items-center justify-center rounded-2xl border border-dashed border-default bg-card px-4 py-6 text-sm text-secondary shadow-sm\">\r\n JSON 编辑器加载中...\r\n </div>\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { coerceBooleanProperty } from '@angular/cdk/coercion';
2
2
  import { NgStyle } from '@angular/common';
3
3
  import * as i0 from '@angular/core';
4
- import { EventEmitter, inject, DOCUMENT, Renderer2, ChangeDetectorRef, ElementRef, HostListener, Input, Output, HostBinding, ViewChild, ChangeDetectionStrategy, ViewEncapsulation, Component } from '@angular/core';
4
+ import { EventEmitter, signal, inject, DOCUMENT, Renderer2, ElementRef, HostListener, Input, Output, HostBinding, ViewChild, ChangeDetectionStrategy, ViewEncapsulation, Component } from '@angular/core';
5
5
  import { NgControl } from '@angular/forms';
6
6
  import { MatFormFieldControl } from '@angular/material/form-field';
7
7
  import { isNil } from 'lodash-es';
@@ -31,10 +31,10 @@ class CmatKnobInputComponent {
31
31
  this.stateChanges = new Subject();
32
32
  this.focused = false;
33
33
  this.touched = false;
34
+ this.refreshVersion = signal(0, ...(ngDevMode ? [{ debugName: "refreshVersion" }] : /* istanbul ignore next */ []));
34
35
  this.ngControl = inject(NgControl, { optional: true, self: true });
35
36
  this._document = inject(DOCUMENT);
36
37
  this._renderer = inject(Renderer2);
37
- this._changeDetectorRef = inject(ChangeDetectorRef);
38
38
  this._el = inject(ElementRef);
39
39
  this._placeholder = '';
40
40
  this._required = false;
@@ -241,7 +241,7 @@ class CmatKnobInputComponent {
241
241
  if (!this.disabled) {
242
242
  this.updateValue(event.offsetX, event.offsetY);
243
243
  event.preventDefault();
244
- this._changeDetectorRef.markForCheck();
244
+ this.refreshVersion.update(value => value + 1);
245
245
  }
246
246
  }
247
247
  onTouchMove(event) {
@@ -252,7 +252,7 @@ class CmatKnobInputComponent {
252
252
  const offsetX = touch.clientX - rect.left;
253
253
  const offsetY = touch.clientY - rect.top;
254
254
  this.updateValue(offsetX, offsetY);
255
- this._changeDetectorRef.markForCheck();
255
+ this.refreshVersion.update(value => value + 1);
256
256
  }
257
257
  }
258
258
  }
@@ -268,7 +268,7 @@ class CmatKnobInputComponent {
268
268
  }
269
269
  writeValue(value) {
270
270
  this.value = value;
271
- this._changeDetectorRef.markForCheck();
271
+ this.refreshVersion.update(value => value + 1);
272
272
  }
273
273
  registerOnChange(fn) {
274
274
  this._onModelChange = fn;
@@ -278,7 +278,7 @@ class CmatKnobInputComponent {
278
278
  }
279
279
  setDisabledState(val) {
280
280
  this.disabled = val;
281
- this._changeDetectorRef.markForCheck();
281
+ this.refreshVersion.update(value => value + 1);
282
282
  }
283
283
  rangePath() {
284
284
  return `M ${this.minX()} ${this.minY()} A ${this.radius} ${this.radius} 0 1 1 ${this.maxX()} ${this.maxY()}`;
@@ -328,16 +328,16 @@ class CmatKnobInputComponent {
328
328
  valueToDisplay() {
329
329
  return this.valueTemplate.replace('{value}', this.value.toString());
330
330
  }
331
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: CmatKnobInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
332
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: CmatKnobInputComponent, isStandalone: true, selector: "cmat-knob-input", inputs: { id: "id", valueColor: "valueColor", rangeColor: "rangeColor", textColor: "textColor", valueTemplate: "valueTemplate", name: "name", size: "size", step: "step", min: "min", max: "max", strokeWidth: "strokeWidth", showValue: "showValue", placeholder: "placeholder", value: "value", required: "required", disabled: "disabled" }, outputs: { valueChange: "valueChange" }, host: { listeners: { "keydown": "onKeyDown($event)", "mousedown": "onMouseDown($event)", "mouseup": "onMouseUp($event)", "touchstart": "onTouchStart($event)", "touchend": "onTouchEnd($event)" }, properties: { "attr.id": "this.id" } }, providers: [
331
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: CmatKnobInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
332
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: CmatKnobInputComponent, isStandalone: true, selector: "cmat-knob-input", inputs: { id: "id", valueColor: "valueColor", rangeColor: "rangeColor", textColor: "textColor", valueTemplate: "valueTemplate", name: "name", size: "size", step: "step", min: "min", max: "max", strokeWidth: "strokeWidth", showValue: "showValue", placeholder: "placeholder", value: "value", required: "required", disabled: "disabled" }, outputs: { valueChange: "valueChange" }, host: { listeners: { "keydown": "onKeyDown($event)", "mousedown": "onMouseDown($event)", "mouseup": "onMouseUp($event)", "touchstart": "onTouchStart($event)", "touchend": "onTouchEnd($event)" }, properties: { "attr.id": "this.id" } }, providers: [
333
333
  { provide: MatFormFieldControl, useExisting: CmatKnobInputComponent }
334
- ], viewQueries: [{ propertyName: "_knobElementRef", first: true, predicate: ["knob"], descendants: true }], exportAs: ["cmatKnobInput"], ngImport: i0, template: "<!-- eslint-disable @angular-eslint/template/no-inline-styles -->\r\n<div #knob [class.cmat-knob-disabled]=\"disabled\" (focusin)=\"onFocusIn()\" (focusout)=\"onFocusOut($event)\">\r\n <svg viewBox=\"0 0 100 100\" role=\"slider\" [style.width]=\"size + 'px'\" [style.height]=\"size + 'px'\"\r\n [attr.aria-valuemin]=\"min\" [attr.aria-valuemax]=\"max\" [attr.aria-valuenow]=\"value\"\r\n [attr.tabindex]=\"disabled ? -1 : 0\" (click)=\"onClick($event)\" (keydown.enter)=\"onKeyDown($event)\" (keydown.space)=\"onKeyDown($event)\">\r\n <path class=\"knob-range\" [attr.d]=\"rangePath()\" [attr.stroke-width]=\"strokeWidth\" [attr.stroke]=\"rangeColor\">\r\n </path>\r\n <path class=\"knob-value\" [attr.d]=\"valuePath()\" [attr.stroke-width]=\"strokeWidth\" [attr.stroke]=\"valueColor\">\r\n </path>\r\n @if(showValue){\r\n <text text-anchor=\"middle\" class=\"knob-text\" [attr.x]=\"50\" [attr.y]=\"57\" [attr.fill]=\"textColor\"\r\n [attr.name]=\"name\">{{ valueToDisplay() }}</text>\r\n }\r\n </svg>\r\n</div>\r\n<!-- eslint-enable @angular-eslint/template/no-inline-styles -->\r\n", styles: ["cmat-knob-input .knob-range{fill:none;transition:stroke .1s ease-in}cmat-knob-input .knob-value{animation-name:dash-frame;animation-fill-mode:forwards;fill:none}cmat-knob-input .knob-text{font-size:1.3rem;text-align:center}cmat-knob-input .cmat-knob-disabled{opacity:.6}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
334
+ ], viewQueries: [{ propertyName: "_knobElementRef", first: true, predicate: ["knob"], descendants: true }], exportAs: ["cmatKnobInput"], ngImport: i0, template: "<!-- eslint-disable @angular-eslint/template/no-inline-styles -->\r\n<div #knob [attr.data-refresh]=\"refreshVersion()\" [class.cmat-knob-disabled]=\"disabled\" (focusin)=\"onFocusIn()\" (focusout)=\"onFocusOut($event)\">\r\n <svg viewBox=\"0 0 100 100\" role=\"slider\" [style.width]=\"size + 'px'\" [style.height]=\"size + 'px'\"\r\n [attr.aria-valuemin]=\"min\" [attr.aria-valuemax]=\"max\" [attr.aria-valuenow]=\"value\"\r\n [attr.tabindex]=\"disabled ? -1 : 0\" (click)=\"onClick($event)\" (keydown.enter)=\"onKeyDown($event)\" (keydown.space)=\"onKeyDown($event)\">\r\n <path class=\"knob-range\" [attr.d]=\"rangePath()\" [attr.stroke-width]=\"strokeWidth\" [attr.stroke]=\"rangeColor\">\r\n </path>\r\n <path class=\"knob-value\" [attr.d]=\"valuePath()\" [attr.stroke-width]=\"strokeWidth\" [attr.stroke]=\"valueColor\">\r\n </path>\r\n @if(showValue){\r\n <text text-anchor=\"middle\" class=\"knob-text\" [attr.x]=\"50\" [attr.y]=\"57\" [attr.fill]=\"textColor\"\r\n [attr.name]=\"name\">{{ valueToDisplay() }}</text>\r\n }\r\n </svg>\r\n</div>\r\n<!-- eslint-enable @angular-eslint/template/no-inline-styles -->\r\n", styles: ["cmat-knob-input .knob-range{fill:none;transition:stroke .1s ease-in}cmat-knob-input .knob-value{animation-name:dash-frame;animation-fill-mode:forwards;fill:none}cmat-knob-input .knob-text{font-size:1.3rem;text-align:center}cmat-knob-input .cmat-knob-disabled{opacity:.6}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
335
335
  }
336
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: CmatKnobInputComponent, decorators: [{
336
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: CmatKnobInputComponent, decorators: [{
337
337
  type: Component,
338
338
  args: [{ selector: 'cmat-knob-input', providers: [
339
339
  { provide: MatFormFieldControl, useExisting: CmatKnobInputComponent }
340
- ], exportAs: 'cmatKnobInput', imports: [NgStyle], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<!-- eslint-disable @angular-eslint/template/no-inline-styles -->\r\n<div #knob [class.cmat-knob-disabled]=\"disabled\" (focusin)=\"onFocusIn()\" (focusout)=\"onFocusOut($event)\">\r\n <svg viewBox=\"0 0 100 100\" role=\"slider\" [style.width]=\"size + 'px'\" [style.height]=\"size + 'px'\"\r\n [attr.aria-valuemin]=\"min\" [attr.aria-valuemax]=\"max\" [attr.aria-valuenow]=\"value\"\r\n [attr.tabindex]=\"disabled ? -1 : 0\" (click)=\"onClick($event)\" (keydown.enter)=\"onKeyDown($event)\" (keydown.space)=\"onKeyDown($event)\">\r\n <path class=\"knob-range\" [attr.d]=\"rangePath()\" [attr.stroke-width]=\"strokeWidth\" [attr.stroke]=\"rangeColor\">\r\n </path>\r\n <path class=\"knob-value\" [attr.d]=\"valuePath()\" [attr.stroke-width]=\"strokeWidth\" [attr.stroke]=\"valueColor\">\r\n </path>\r\n @if(showValue){\r\n <text text-anchor=\"middle\" class=\"knob-text\" [attr.x]=\"50\" [attr.y]=\"57\" [attr.fill]=\"textColor\"\r\n [attr.name]=\"name\">{{ valueToDisplay() }}</text>\r\n }\r\n </svg>\r\n</div>\r\n<!-- eslint-enable @angular-eslint/template/no-inline-styles -->\r\n", styles: ["cmat-knob-input .knob-range{fill:none;transition:stroke .1s ease-in}cmat-knob-input .knob-value{animation-name:dash-frame;animation-fill-mode:forwards;fill:none}cmat-knob-input .knob-text{font-size:1.3rem;text-align:center}cmat-knob-input .cmat-knob-disabled{opacity:.6}\n"] }]
340
+ ], exportAs: 'cmatKnobInput', imports: [NgStyle], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<!-- eslint-disable @angular-eslint/template/no-inline-styles -->\r\n<div #knob [attr.data-refresh]=\"refreshVersion()\" [class.cmat-knob-disabled]=\"disabled\" (focusin)=\"onFocusIn()\" (focusout)=\"onFocusOut($event)\">\r\n <svg viewBox=\"0 0 100 100\" role=\"slider\" [style.width]=\"size + 'px'\" [style.height]=\"size + 'px'\"\r\n [attr.aria-valuemin]=\"min\" [attr.aria-valuemax]=\"max\" [attr.aria-valuenow]=\"value\"\r\n [attr.tabindex]=\"disabled ? -1 : 0\" (click)=\"onClick($event)\" (keydown.enter)=\"onKeyDown($event)\" (keydown.space)=\"onKeyDown($event)\">\r\n <path class=\"knob-range\" [attr.d]=\"rangePath()\" [attr.stroke-width]=\"strokeWidth\" [attr.stroke]=\"rangeColor\">\r\n </path>\r\n <path class=\"knob-value\" [attr.d]=\"valuePath()\" [attr.stroke-width]=\"strokeWidth\" [attr.stroke]=\"valueColor\">\r\n </path>\r\n @if(showValue){\r\n <text text-anchor=\"middle\" class=\"knob-text\" [attr.x]=\"50\" [attr.y]=\"57\" [attr.fill]=\"textColor\"\r\n [attr.name]=\"name\">{{ valueToDisplay() }}</text>\r\n }\r\n </svg>\r\n</div>\r\n<!-- eslint-enable @angular-eslint/template/no-inline-styles -->\r\n", styles: ["cmat-knob-input .knob-range{fill:none;transition:stroke .1s ease-in}cmat-knob-input .knob-value{animation-name:dash-frame;animation-fill-mode:forwards;fill:none}cmat-knob-input .knob-text{font-size:1.3rem;text-align:center}cmat-knob-input .cmat-knob-disabled{opacity:.6}\n"] }]
341
341
  }], ctorParameters: () => [], propDecorators: { _knobElementRef: [{
342
342
  type: ViewChild,
343
343
  args: ['knob', { static: false }]
@@ -1 +1 @@
1
- {"version":3,"file":"cmat-components-knob-input.mjs","sources":["../../../projects/cmat/components/knob-input/knob-input.component.ts","../../../projects/cmat/components/knob-input/knob-input.component.html","../../../projects/cmat/components/knob-input/cmat-components-knob-input.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/member-ordering */\r\nimport { BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion';\r\nimport { NgStyle } from '@angular/common';\r\nimport { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter, HostBinding, HostListener, Input, OnDestroy, Output, Renderer2, ViewChild, ViewEncapsulation, DOCUMENT, inject } from '@angular/core';\r\nimport { ControlValueAccessor, NgControl } from '@angular/forms';\r\nimport { MatFormFieldControl } from '@angular/material/form-field';\r\nimport { isNil } from 'lodash-es';\r\nimport { Subject } from 'rxjs';\r\n\r\nlet NEXT_ID = 0;\r\n\r\n@Component({\r\n selector: 'cmat-knob-input',\r\n templateUrl: './knob-input.component.html',\r\n styleUrls: ['./knob-input.component.scss'],\r\n providers: [\r\n { provide: MatFormFieldControl, useExisting: CmatKnobInputComponent }\r\n ],\r\n exportAs: 'cmatKnobInput',\r\n imports: [NgStyle],\r\n encapsulation: ViewEncapsulation.None,\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class CmatKnobInputComponent implements MatFormFieldControl<any>, OnDestroy, ControlValueAccessor {\r\n @ViewChild('knob', { static: false }) private _knobElementRef: ElementRef<HTMLDivElement>;\r\n\r\n @HostBinding('attr.id')\r\n @Input()\r\n public id = `cmat-knob-input-${NEXT_ID++}`;\r\n\r\n @Input() valueColor: string = 'var(--cmat-primary)';\r\n\r\n @Input() rangeColor: string = 'var(--cmat-border)';\r\n\r\n @Input() textColor: string = 'var(--cmat-text-default)';\r\n @Input() valueTemplate: string = '{value}';\r\n @Input() name: string | undefined;\r\n\r\n @Input() size: number = 100;\r\n @Input() step: number = 1;\r\n @Input() min: number = 0;\r\n @Input() max: number = 100;\r\n @Input() strokeWidth: number = 14;\r\n @Input() showValue: boolean = true;\r\n\r\n @Output() valueChange: EventEmitter<number | null> = new EventEmitter<number | null>();\r\n\r\n radius: number = 40;\r\n\r\n midX: number = 50;\r\n\r\n midY: number = 50;\r\n\r\n minRadians: number = (4 * Math.PI) / 3;\r\n\r\n maxRadians: number = -Math.PI / 3;\r\n\r\n windowMouseMoveListener: VoidFunction | null;\r\n\r\n windowMouseUpListener: VoidFunction | null;\r\n\r\n windowTouchMoveListener: VoidFunction | null;\r\n\r\n windowTouchEndListener: VoidFunction | null;\r\n\r\n readonly stateChanges: Subject<void> = new Subject<void>();\r\n focused: boolean = false;\r\n touched: boolean = false;\r\n\r\n ngControl = inject(NgControl, { optional: true, self: true })!;\r\n private _document = inject<Document>(DOCUMENT);\r\n private _renderer = inject(Renderer2);\r\n private _changeDetectorRef = inject(ChangeDetectorRef);\r\n private _el = inject(ElementRef);\r\n\r\n constructor() {\r\n if (this.ngControl != null) {\r\n this.ngControl.valueAccessor = this;\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.stateChanges.complete();\r\n }\r\n\r\n @Input()\r\n get placeholder(): string {\r\n return this._placeholder;\r\n }\r\n set placeholder(value: string) {\r\n this._placeholder = value;\r\n this.stateChanges.next();\r\n }\r\n private _placeholder: string = '';\r\n\r\n @Input()\r\n get value(): number {\r\n return this._value ?? this.min;\r\n }\r\n set value(value: number) {\r\n if (value !== this.value) {\r\n this._value = value;\r\n\r\n this.stateChanges.next();\r\n\r\n this._onModelChange(value);\r\n }\r\n }\r\n protected _value: number | null;\r\n\r\n get empty(): boolean {\r\n return !this._value;\r\n }\r\n\r\n get errorState(): boolean {\r\n if (this.ngControl == null)\r\n return false;\r\n\r\n return (this.touched && this.ngControl?.invalid) ?? false;\r\n }\r\n\r\n get shouldLabelFloat(): boolean {\r\n return this.focused || !this.empty;\r\n }\r\n\r\n @Input()\r\n get required(): boolean { return this._required; }\r\n set required(value: boolean) {\r\n this._required = coerceBooleanProperty(value);\r\n this.stateChanges.next();\r\n }\r\n protected _required = false;\r\n\r\n @Input()\r\n get disabled(): boolean {\r\n if (!isNil(this.ngControl?.disabled)) {\r\n return this.ngControl.disabled;\r\n }\r\n return this._disabled;\r\n }\r\n set disabled(value: BooleanInput) {\r\n this._disabled = coerceBooleanProperty(value);\r\n\r\n if (this.focused) {\r\n this.focused = false;\r\n this.stateChanges.next();\r\n }\r\n }\r\n protected _disabled = false;\r\n\r\n @HostListener('keydown', ['$event'])\r\n onKeyDown(event: Event): void {\r\n const keyboardEvent = event as KeyboardEvent;\r\n\r\n if (!this.disabled) {\r\n switch (keyboardEvent.code) {\r\n case 'Enter':\r\n case 'Space': {\r\n keyboardEvent.preventDefault();\r\n break;\r\n }\r\n case 'ArrowRight':\r\n case 'ArrowUp': {\r\n keyboardEvent.preventDefault();\r\n this.updateModelValue(this.value + 1);\r\n break;\r\n }\r\n case 'ArrowLeft':\r\n case 'ArrowDown': {\r\n keyboardEvent.preventDefault();\r\n this.updateModelValue(this.value - 1);\r\n break;\r\n }\r\n case 'Home': {\r\n keyboardEvent.preventDefault();\r\n this.updateModelValue(this.min);\r\n break;\r\n }\r\n case 'End': {\r\n keyboardEvent.preventDefault();\r\n this.updateModelValue(this.max);\r\n break;\r\n }\r\n case 'PageUp': {\r\n keyboardEvent.preventDefault();\r\n this.updateModelValue(this.value + 10);\r\n break;\r\n }\r\n case 'PageDown': {\r\n keyboardEvent.preventDefault();\r\n this.updateModelValue(this.value - 10);\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n @HostListener('mousedown', ['$event'])\r\n onMouseDown(event: MouseEvent): void {\r\n if (!this.disabled) {\r\n const window = this._document.defaultView ?? 'window';\r\n this.windowMouseMoveListener = this._renderer.listen(window, 'mousemove', this.onMouseMove.bind(this));\r\n this.windowMouseUpListener = this._renderer.listen(window, 'mouseup', this.onMouseUp.bind(this));\r\n event.preventDefault();\r\n }\r\n }\r\n\r\n @HostListener('mouseup', ['$event'])\r\n onMouseUp(event: MouseEvent): void {\r\n if (!this.disabled) {\r\n if (this.windowMouseMoveListener) {\r\n this.windowMouseMoveListener();\r\n this.windowMouseUpListener = null;\r\n }\r\n\r\n if (this.windowMouseUpListener) {\r\n this.windowMouseUpListener();\r\n this.windowMouseMoveListener = null;\r\n }\r\n event.preventDefault();\r\n }\r\n }\r\n\r\n @HostListener('touchstart', ['$event'])\r\n onTouchStart(event: TouchEvent): void {\r\n if (!this.disabled) {\r\n const window = this._document.defaultView ?? 'window';\r\n this.windowTouchMoveListener = this._renderer.listen(window, 'touchmove', this.onTouchMove.bind(this));\r\n this.windowTouchEndListener = this._renderer.listen(window, 'touchend', this.onTouchEnd.bind(this));\r\n event.preventDefault();\r\n }\r\n }\r\n\r\n @HostListener('touchend', ['$event'])\r\n onTouchEnd(event: TouchEvent): void {\r\n if (!this.disabled) {\r\n if (this.windowTouchMoveListener) {\r\n this.windowTouchMoveListener();\r\n }\r\n if (this.windowTouchEndListener) {\r\n this.windowTouchEndListener();\r\n }\r\n this.windowTouchMoveListener = null;\r\n this.windowTouchEndListener = null;\r\n event.preventDefault();\r\n }\r\n }\r\n\r\n mapRange(x: number, inMin: number, inMax: number, outMin: number, outMax: number): number {\r\n return ((x - inMin) * (outMax - outMin)) / (inMax - inMin) + outMin;\r\n }\r\n\r\n onClick(event: MouseEvent): void {\r\n if (!this.disabled) {\r\n this.updateValue(event.offsetX, event.offsetY);\r\n }\r\n }\r\n\r\n onFocusIn(): void {\r\n if (!this.focused) {\r\n this.focused = true;\r\n this.stateChanges.next();\r\n }\r\n }\r\n\r\n onFocusOut(event: FocusEvent): void {\r\n if (!this._knobElementRef.nativeElement.contains(event.relatedTarget as Element)) {\r\n this.touched = true;\r\n this.focused = false;\r\n this._onTouchedChange();\r\n this.stateChanges.next();\r\n }\r\n }\r\n\r\n setDescribedByIds(ids: string[]): void {\r\n if (ids.length) {\r\n this._knobElementRef?.nativeElement.setAttribute('aria-describedby', ids.join(' '));\r\n } else {\r\n this._knobElementRef?.nativeElement.removeAttribute('aria-describedby');\r\n }\r\n }\r\n\r\n onContainerClick(): void {\r\n if (!this.focused) {\r\n this._knobElementRef.nativeElement.focus();\r\n }\r\n }\r\n\r\n updateValue(offsetX: number, offsetY: number): void {\r\n let dx = offsetX - this.size / 2;\r\n let dy = this.size / 2 - offsetY;\r\n let angle = Math.atan2(dy, dx);\r\n let start = -Math.PI / 2 - Math.PI / 6;\r\n this.updateModel(angle, start);\r\n }\r\n\r\n updateModel(angle: number, start: number): void {\r\n let mappedValue;\r\n if (angle > this.maxRadians) mappedValue = this.mapRange(angle, this.minRadians, this.maxRadians, this.min, this.max);\r\n else if (angle < start) mappedValue = this.mapRange(angle + 2 * Math.PI, this.minRadians, this.maxRadians, this.min, this.max);\r\n else return;\r\n\r\n let newValue = Math.round((mappedValue - this.min) / this.step) * this.step + this.min;\r\n this.value = newValue;\r\n\r\n this._onModelChange(this.value);\r\n this.valueChange.emit(this.value);\r\n }\r\n\r\n onMouseMove(event: MouseEvent): void {\r\n if (!this.disabled) {\r\n this.updateValue(event.offsetX, event.offsetY);\r\n event.preventDefault();\r\n\r\n this._changeDetectorRef.markForCheck();\r\n }\r\n }\r\n\r\n onTouchMove(event: Event): void {\r\n if (!this.disabled && event instanceof TouchEvent && event.touches.length === 1) {\r\n const rect = this._el.nativeElement.children[0].getBoundingClientRect();\r\n const touch = event.targetTouches.item(0);\r\n if (touch) {\r\n const offsetX = touch.clientX - rect.left;\r\n const offsetY = touch.clientY - rect.top;\r\n this.updateValue(offsetX, offsetY);\r\n\r\n this._changeDetectorRef.markForCheck();\r\n }\r\n }\r\n }\r\n\r\n updateModelValue(newValue: number): void {\r\n if (newValue > this.max) this.value = this.max;\r\n else if (newValue < this.min) this.value = this.min;\r\n else this.value = newValue;\r\n\r\n this._onModelChange(this.value);\r\n this.valueChange.emit(this.value);\r\n }\r\n\r\n\r\n\r\n writeValue(value: any): void {\r\n this.value = value;\r\n this._changeDetectorRef.markForCheck();\r\n }\r\n\r\n registerOnChange(fn: any): void {\r\n this._onModelChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: any): void {\r\n this._onTouchedChange = fn;\r\n }\r\n\r\n setDisabledState(val: boolean): void {\r\n this.disabled = val;\r\n this._changeDetectorRef.markForCheck();\r\n }\r\n\r\n rangePath(): string {\r\n return `M ${this.minX()} ${this.minY()} A ${this.radius} ${this.radius} 0 1 1 ${this.maxX()} ${this.maxY()}`;\r\n }\r\n\r\n valuePath(): string {\r\n return `M ${this.zeroX()} ${this.zeroY()} A ${this.radius} ${this.radius} 0 ${this.largeArc()} ${this.sweep()} ${this.valueX()} ${this.valueY()}`;\r\n }\r\n\r\n zeroRadians(): number {\r\n if (this.min > 0 && this.max > 0) return this.mapRange(this.min, this.min, this.max, this.minRadians, this.maxRadians);\r\n else return this.mapRange(0, this.min, this.max, this.minRadians, this.maxRadians);\r\n }\r\n\r\n valueRadians(): number {\r\n return this.mapRange(this.value, this.min, this.max, this.minRadians, this.maxRadians);\r\n }\r\n\r\n minX(): number {\r\n return this.midX + Math.cos(this.minRadians) * this.radius;\r\n }\r\n\r\n minY(): number {\r\n return this.midY - Math.sin(this.minRadians) * this.radius;\r\n }\r\n\r\n maxX(): number {\r\n return this.midX + Math.cos(this.maxRadians) * this.radius;\r\n }\r\n\r\n maxY(): number {\r\n return this.midY - Math.sin(this.maxRadians) * this.radius;\r\n }\r\n\r\n zeroX(): number {\r\n return this.midX + Math.cos(this.zeroRadians()) * this.radius;\r\n }\r\n\r\n zeroY(): number {\r\n return this.midY - Math.sin(this.zeroRadians()) * this.radius;\r\n }\r\n\r\n valueX(): number {\r\n return this.midX + Math.cos(this.valueRadians()) * this.radius;\r\n }\r\n\r\n valueY(): number {\r\n return this.midY - Math.sin(this.valueRadians()) * this.radius;\r\n }\r\n\r\n largeArc(): number {\r\n return Math.abs(this.zeroRadians() - this.valueRadians()) < Math.PI ? 0 : 1;\r\n }\r\n\r\n sweep(): number {\r\n return this.valueRadians() > this.zeroRadians() ? 0 : 1;\r\n }\r\n\r\n valueToDisplay(): string {\r\n return this.valueTemplate.replace('{value}', this.value.toString());\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-empty-function\r\n private _onModelChange: (value: any) => void = () => { };\r\n // eslint-disable-next-line @typescript-eslint/no-empty-function\r\n private _onTouchedChange: () => any = () => { };\r\n}\r\n","<!-- eslint-disable @angular-eslint/template/no-inline-styles -->\r\n<div #knob [class.cmat-knob-disabled]=\"disabled\" (focusin)=\"onFocusIn()\" (focusout)=\"onFocusOut($event)\">\r\n <svg viewBox=\"0 0 100 100\" role=\"slider\" [style.width]=\"size + 'px'\" [style.height]=\"size + 'px'\"\r\n [attr.aria-valuemin]=\"min\" [attr.aria-valuemax]=\"max\" [attr.aria-valuenow]=\"value\"\r\n [attr.tabindex]=\"disabled ? -1 : 0\" (click)=\"onClick($event)\" (keydown.enter)=\"onKeyDown($event)\" (keydown.space)=\"onKeyDown($event)\">\r\n <path class=\"knob-range\" [attr.d]=\"rangePath()\" [attr.stroke-width]=\"strokeWidth\" [attr.stroke]=\"rangeColor\">\r\n </path>\r\n <path class=\"knob-value\" [attr.d]=\"valuePath()\" [attr.stroke-width]=\"strokeWidth\" [attr.stroke]=\"valueColor\">\r\n </path>\r\n @if(showValue){\r\n <text text-anchor=\"middle\" class=\"knob-text\" [attr.x]=\"50\" [attr.y]=\"57\" [attr.fill]=\"textColor\"\r\n [attr.name]=\"name\">{{ valueToDisplay() }}</text>\r\n }\r\n </svg>\r\n</div>\r\n<!-- eslint-enable @angular-eslint/template/no-inline-styles -->\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cmat-components-knob-input.mjs","sources":["../../../projects/cmat/components/knob-input/knob-input.component.ts","../../../projects/cmat/components/knob-input/knob-input.component.html","../../../projects/cmat/components/knob-input/cmat-components-knob-input.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/member-ordering */\r\nimport { BooleanInput, coerceBooleanProperty } from '@angular/cdk/coercion';\r\nimport { NgStyle } from '@angular/common';\r\nimport { ChangeDetectionStrategy, Component, ElementRef, EventEmitter, HostBinding, HostListener, Input, OnDestroy, Output, Renderer2, ViewChild, ViewEncapsulation, DOCUMENT, inject, signal } from '@angular/core';\r\nimport { ControlValueAccessor, NgControl } from '@angular/forms';\r\nimport { MatFormFieldControl } from '@angular/material/form-field';\r\nimport { isNil } from 'lodash-es';\r\nimport { Subject } from 'rxjs';\r\n\r\nlet NEXT_ID = 0;\r\n\r\n@Component({\r\n selector: 'cmat-knob-input',\r\n templateUrl: './knob-input.component.html',\r\n styleUrls: ['./knob-input.component.scss'],\r\n providers: [\r\n { provide: MatFormFieldControl, useExisting: CmatKnobInputComponent }\r\n ],\r\n exportAs: 'cmatKnobInput',\r\n imports: [NgStyle],\r\n encapsulation: ViewEncapsulation.None,\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class CmatKnobInputComponent implements MatFormFieldControl<any>, OnDestroy, ControlValueAccessor {\r\n @ViewChild('knob', { static: false }) private _knobElementRef: ElementRef<HTMLDivElement>;\r\n\r\n @HostBinding('attr.id')\r\n @Input()\r\n public id = `cmat-knob-input-${NEXT_ID++}`;\r\n\r\n @Input() valueColor: string = 'var(--cmat-primary)';\r\n\r\n @Input() rangeColor: string = 'var(--cmat-border)';\r\n\r\n @Input() textColor: string = 'var(--cmat-text-default)';\r\n @Input() valueTemplate: string = '{value}';\r\n @Input() name: string | undefined;\r\n\r\n @Input() size: number = 100;\r\n @Input() step: number = 1;\r\n @Input() min: number = 0;\r\n @Input() max: number = 100;\r\n @Input() strokeWidth: number = 14;\r\n @Input() showValue: boolean = true;\r\n\r\n @Output() valueChange: EventEmitter<number | null> = new EventEmitter<number | null>();\r\n\r\n radius: number = 40;\r\n\r\n midX: number = 50;\r\n\r\n midY: number = 50;\r\n\r\n minRadians: number = (4 * Math.PI) / 3;\r\n\r\n maxRadians: number = -Math.PI / 3;\r\n\r\n windowMouseMoveListener: VoidFunction | null;\r\n\r\n windowMouseUpListener: VoidFunction | null;\r\n\r\n windowTouchMoveListener: VoidFunction | null;\r\n\r\n windowTouchEndListener: VoidFunction | null;\r\n\r\n readonly stateChanges: Subject<void> = new Subject<void>();\r\n focused: boolean = false;\r\n touched: boolean = false;\r\n readonly refreshVersion = signal(0);\r\n\r\n ngControl = inject(NgControl, { optional: true, self: true })!;\r\n private _document = inject<Document>(DOCUMENT);\r\n private _renderer = inject(Renderer2);\r\n private _el = inject(ElementRef);\r\n\r\n constructor() {\r\n if (this.ngControl != null) {\r\n this.ngControl.valueAccessor = this;\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.stateChanges.complete();\r\n }\r\n\r\n @Input()\r\n get placeholder(): string {\r\n return this._placeholder;\r\n }\r\n set placeholder(value: string) {\r\n this._placeholder = value;\r\n this.stateChanges.next();\r\n }\r\n private _placeholder: string = '';\r\n\r\n @Input()\r\n get value(): number {\r\n return this._value ?? this.min;\r\n }\r\n set value(value: number) {\r\n if (value !== this.value) {\r\n this._value = value;\r\n\r\n this.stateChanges.next();\r\n\r\n this._onModelChange(value);\r\n }\r\n }\r\n protected _value: number | null;\r\n\r\n get empty(): boolean {\r\n return !this._value;\r\n }\r\n\r\n get errorState(): boolean {\r\n if (this.ngControl == null)\r\n return false;\r\n\r\n return (this.touched && this.ngControl?.invalid) ?? false;\r\n }\r\n\r\n get shouldLabelFloat(): boolean {\r\n return this.focused || !this.empty;\r\n }\r\n\r\n @Input()\r\n get required(): boolean { return this._required; }\r\n set required(value: boolean) {\r\n this._required = coerceBooleanProperty(value);\r\n this.stateChanges.next();\r\n }\r\n protected _required = false;\r\n\r\n @Input()\r\n get disabled(): boolean {\r\n if (!isNil(this.ngControl?.disabled)) {\r\n return this.ngControl.disabled;\r\n }\r\n return this._disabled;\r\n }\r\n set disabled(value: BooleanInput) {\r\n this._disabled = coerceBooleanProperty(value);\r\n\r\n if (this.focused) {\r\n this.focused = false;\r\n this.stateChanges.next();\r\n }\r\n }\r\n protected _disabled = false;\r\n\r\n @HostListener('keydown', ['$event'])\r\n onKeyDown(event: Event): void {\r\n const keyboardEvent = event as KeyboardEvent;\r\n\r\n if (!this.disabled) {\r\n switch (keyboardEvent.code) {\r\n case 'Enter':\r\n case 'Space': {\r\n keyboardEvent.preventDefault();\r\n break;\r\n }\r\n case 'ArrowRight':\r\n case 'ArrowUp': {\r\n keyboardEvent.preventDefault();\r\n this.updateModelValue(this.value + 1);\r\n break;\r\n }\r\n case 'ArrowLeft':\r\n case 'ArrowDown': {\r\n keyboardEvent.preventDefault();\r\n this.updateModelValue(this.value - 1);\r\n break;\r\n }\r\n case 'Home': {\r\n keyboardEvent.preventDefault();\r\n this.updateModelValue(this.min);\r\n break;\r\n }\r\n case 'End': {\r\n keyboardEvent.preventDefault();\r\n this.updateModelValue(this.max);\r\n break;\r\n }\r\n case 'PageUp': {\r\n keyboardEvent.preventDefault();\r\n this.updateModelValue(this.value + 10);\r\n break;\r\n }\r\n case 'PageDown': {\r\n keyboardEvent.preventDefault();\r\n this.updateModelValue(this.value - 10);\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n @HostListener('mousedown', ['$event'])\r\n onMouseDown(event: MouseEvent): void {\r\n if (!this.disabled) {\r\n const window = this._document.defaultView ?? 'window';\r\n this.windowMouseMoveListener = this._renderer.listen(window, 'mousemove', this.onMouseMove.bind(this));\r\n this.windowMouseUpListener = this._renderer.listen(window, 'mouseup', this.onMouseUp.bind(this));\r\n event.preventDefault();\r\n }\r\n }\r\n\r\n @HostListener('mouseup', ['$event'])\r\n onMouseUp(event: MouseEvent): void {\r\n if (!this.disabled) {\r\n if (this.windowMouseMoveListener) {\r\n this.windowMouseMoveListener();\r\n this.windowMouseUpListener = null;\r\n }\r\n\r\n if (this.windowMouseUpListener) {\r\n this.windowMouseUpListener();\r\n this.windowMouseMoveListener = null;\r\n }\r\n event.preventDefault();\r\n }\r\n }\r\n\r\n @HostListener('touchstart', ['$event'])\r\n onTouchStart(event: TouchEvent): void {\r\n if (!this.disabled) {\r\n const window = this._document.defaultView ?? 'window';\r\n this.windowTouchMoveListener = this._renderer.listen(window, 'touchmove', this.onTouchMove.bind(this));\r\n this.windowTouchEndListener = this._renderer.listen(window, 'touchend', this.onTouchEnd.bind(this));\r\n event.preventDefault();\r\n }\r\n }\r\n\r\n @HostListener('touchend', ['$event'])\r\n onTouchEnd(event: TouchEvent): void {\r\n if (!this.disabled) {\r\n if (this.windowTouchMoveListener) {\r\n this.windowTouchMoveListener();\r\n }\r\n if (this.windowTouchEndListener) {\r\n this.windowTouchEndListener();\r\n }\r\n this.windowTouchMoveListener = null;\r\n this.windowTouchEndListener = null;\r\n event.preventDefault();\r\n }\r\n }\r\n\r\n mapRange(x: number, inMin: number, inMax: number, outMin: number, outMax: number): number {\r\n return ((x - inMin) * (outMax - outMin)) / (inMax - inMin) + outMin;\r\n }\r\n\r\n onClick(event: MouseEvent): void {\r\n if (!this.disabled) {\r\n this.updateValue(event.offsetX, event.offsetY);\r\n }\r\n }\r\n\r\n onFocusIn(): void {\r\n if (!this.focused) {\r\n this.focused = true;\r\n this.stateChanges.next();\r\n }\r\n }\r\n\r\n onFocusOut(event: FocusEvent): void {\r\n if (!this._knobElementRef.nativeElement.contains(event.relatedTarget as Element)) {\r\n this.touched = true;\r\n this.focused = false;\r\n this._onTouchedChange();\r\n this.stateChanges.next();\r\n }\r\n }\r\n\r\n setDescribedByIds(ids: string[]): void {\r\n if (ids.length) {\r\n this._knobElementRef?.nativeElement.setAttribute('aria-describedby', ids.join(' '));\r\n } else {\r\n this._knobElementRef?.nativeElement.removeAttribute('aria-describedby');\r\n }\r\n }\r\n\r\n onContainerClick(): void {\r\n if (!this.focused) {\r\n this._knobElementRef.nativeElement.focus();\r\n }\r\n }\r\n\r\n updateValue(offsetX: number, offsetY: number): void {\r\n let dx = offsetX - this.size / 2;\r\n let dy = this.size / 2 - offsetY;\r\n let angle = Math.atan2(dy, dx);\r\n let start = -Math.PI / 2 - Math.PI / 6;\r\n this.updateModel(angle, start);\r\n }\r\n\r\n updateModel(angle: number, start: number): void {\r\n let mappedValue;\r\n if (angle > this.maxRadians) mappedValue = this.mapRange(angle, this.minRadians, this.maxRadians, this.min, this.max);\r\n else if (angle < start) mappedValue = this.mapRange(angle + 2 * Math.PI, this.minRadians, this.maxRadians, this.min, this.max);\r\n else return;\r\n\r\n let newValue = Math.round((mappedValue - this.min) / this.step) * this.step + this.min;\r\n this.value = newValue;\r\n\r\n this._onModelChange(this.value);\r\n this.valueChange.emit(this.value);\r\n }\r\n\r\n onMouseMove(event: MouseEvent): void {\r\n if (!this.disabled) {\r\n this.updateValue(event.offsetX, event.offsetY);\r\n event.preventDefault();\r\n\r\n this.refreshVersion.update(value => value + 1);\r\n }\r\n }\r\n\r\n onTouchMove(event: Event): void {\r\n if (!this.disabled && event instanceof TouchEvent && event.touches.length === 1) {\r\n const rect = this._el.nativeElement.children[0].getBoundingClientRect();\r\n const touch = event.targetTouches.item(0);\r\n if (touch) {\r\n const offsetX = touch.clientX - rect.left;\r\n const offsetY = touch.clientY - rect.top;\r\n this.updateValue(offsetX, offsetY);\r\n\r\n this.refreshVersion.update(value => value + 1);\r\n }\r\n }\r\n }\r\n\r\n updateModelValue(newValue: number): void {\r\n if (newValue > this.max) this.value = this.max;\r\n else if (newValue < this.min) this.value = this.min;\r\n else this.value = newValue;\r\n\r\n this._onModelChange(this.value);\r\n this.valueChange.emit(this.value);\r\n }\r\n\r\n\r\n\r\n writeValue(value: any): void {\r\n this.value = value;\r\n this.refreshVersion.update(value => value + 1);\r\n }\r\n\r\n registerOnChange(fn: any): void {\r\n this._onModelChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: any): void {\r\n this._onTouchedChange = fn;\r\n }\r\n\r\n setDisabledState(val: boolean): void {\r\n this.disabled = val;\r\n this.refreshVersion.update(value => value + 1);\r\n }\r\n\r\n rangePath(): string {\r\n return `M ${this.minX()} ${this.minY()} A ${this.radius} ${this.radius} 0 1 1 ${this.maxX()} ${this.maxY()}`;\r\n }\r\n\r\n valuePath(): string {\r\n return `M ${this.zeroX()} ${this.zeroY()} A ${this.radius} ${this.radius} 0 ${this.largeArc()} ${this.sweep()} ${this.valueX()} ${this.valueY()}`;\r\n }\r\n\r\n zeroRadians(): number {\r\n if (this.min > 0 && this.max > 0) return this.mapRange(this.min, this.min, this.max, this.minRadians, this.maxRadians);\r\n else return this.mapRange(0, this.min, this.max, this.minRadians, this.maxRadians);\r\n }\r\n\r\n valueRadians(): number {\r\n return this.mapRange(this.value, this.min, this.max, this.minRadians, this.maxRadians);\r\n }\r\n\r\n minX(): number {\r\n return this.midX + Math.cos(this.minRadians) * this.radius;\r\n }\r\n\r\n minY(): number {\r\n return this.midY - Math.sin(this.minRadians) * this.radius;\r\n }\r\n\r\n maxX(): number {\r\n return this.midX + Math.cos(this.maxRadians) * this.radius;\r\n }\r\n\r\n maxY(): number {\r\n return this.midY - Math.sin(this.maxRadians) * this.radius;\r\n }\r\n\r\n zeroX(): number {\r\n return this.midX + Math.cos(this.zeroRadians()) * this.radius;\r\n }\r\n\r\n zeroY(): number {\r\n return this.midY - Math.sin(this.zeroRadians()) * this.radius;\r\n }\r\n\r\n valueX(): number {\r\n return this.midX + Math.cos(this.valueRadians()) * this.radius;\r\n }\r\n\r\n valueY(): number {\r\n return this.midY - Math.sin(this.valueRadians()) * this.radius;\r\n }\r\n\r\n largeArc(): number {\r\n return Math.abs(this.zeroRadians() - this.valueRadians()) < Math.PI ? 0 : 1;\r\n }\r\n\r\n sweep(): number {\r\n return this.valueRadians() > this.zeroRadians() ? 0 : 1;\r\n }\r\n\r\n valueToDisplay(): string {\r\n return this.valueTemplate.replace('{value}', this.value.toString());\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-empty-function\r\n private _onModelChange: (value: any) => void = () => { };\r\n // eslint-disable-next-line @typescript-eslint/no-empty-function\r\n private _onTouchedChange: () => any = () => { };\r\n}\r\n","<!-- eslint-disable @angular-eslint/template/no-inline-styles -->\r\n<div #knob [attr.data-refresh]=\"refreshVersion()\" [class.cmat-knob-disabled]=\"disabled\" (focusin)=\"onFocusIn()\" (focusout)=\"onFocusOut($event)\">\r\n <svg viewBox=\"0 0 100 100\" role=\"slider\" [style.width]=\"size + 'px'\" [style.height]=\"size + 'px'\"\r\n [attr.aria-valuemin]=\"min\" [attr.aria-valuemax]=\"max\" [attr.aria-valuenow]=\"value\"\r\n [attr.tabindex]=\"disabled ? -1 : 0\" (click)=\"onClick($event)\" (keydown.enter)=\"onKeyDown($event)\" (keydown.space)=\"onKeyDown($event)\">\r\n <path class=\"knob-range\" [attr.d]=\"rangePath()\" [attr.stroke-width]=\"strokeWidth\" [attr.stroke]=\"rangeColor\">\r\n </path>\r\n <path class=\"knob-value\" [attr.d]=\"valuePath()\" [attr.stroke-width]=\"strokeWidth\" [attr.stroke]=\"valueColor\">\r\n </path>\r\n @if(showValue){\r\n <text text-anchor=\"middle\" class=\"knob-text\" [attr.x]=\"50\" [attr.y]=\"57\" [attr.fill]=\"textColor\"\r\n [attr.name]=\"name\">{{ valueToDisplay() }}</text>\r\n }\r\n </svg>\r\n</div>\r\n<!-- eslint-enable @angular-eslint/template/no-inline-styles -->\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -1,12 +1,11 @@
1
1
  import { NgTemplateOutlet } from '@angular/common';
2
2
  import * as i0 from '@angular/core';
3
- import { inject, ChangeDetectorRef, Input, ChangeDetectionStrategy, ViewEncapsulation, Component } from '@angular/core';
3
+ import { signal, Input, ChangeDetectionStrategy, ViewEncapsulation, Component } from '@angular/core';
4
4
 
5
5
  class CmatMasonryComponent {
6
6
  constructor() {
7
7
  this.items = [];
8
- this.distributedColumns = [];
9
- this._changeDetectorRef = inject(ChangeDetectorRef);
8
+ this.distributedColumns = signal([], ...(ngDevMode ? [{ debugName: "distributedColumns" }] : /* istanbul ignore next */ []));
10
9
  }
11
10
  ngOnChanges(changes) {
12
11
  if ('columns' in changes) {
@@ -21,8 +20,7 @@ class CmatMasonryComponent {
21
20
  }
22
21
  _distributeItems() {
23
22
  if (this.items.length === 0) {
24
- this.distributedColumns = [];
25
- this._changeDetectorRef.markForCheck();
23
+ this.distributedColumns.set([]);
26
24
  return;
27
25
  }
28
26
  const newDistributedColumns = Array.from({ length: this.columns }, () => ({ items: [] }));
@@ -32,15 +30,14 @@ class CmatMasonryComponent {
32
30
  items: [...newDistributedColumns[columnIndex].items, this.items[i]]
33
31
  };
34
32
  }
35
- this.distributedColumns = newDistributedColumns;
36
- this._changeDetectorRef.markForCheck();
33
+ this.distributedColumns.set(newDistributedColumns);
37
34
  }
38
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: CmatMasonryComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
39
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.8", type: CmatMasonryComponent, isStandalone: true, selector: "cmat-masonry", inputs: { columnsTemplate: "columnsTemplate", columns: "columns", items: "items" }, exportAs: ["cmatMasonry"], usesOnChanges: true, ngImport: i0, template: "<div class=\"flex p-2\">\r\n <ng-container *ngTemplateOutlet=\"columnsTemplate; context: { $implicit: distributedColumns }\"></ng-container>\r\n</div>", dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
35
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: CmatMasonryComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
36
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.9", type: CmatMasonryComponent, isStandalone: true, selector: "cmat-masonry", inputs: { columnsTemplate: "columnsTemplate", columns: "columns", items: "items" }, exportAs: ["cmatMasonry"], usesOnChanges: true, ngImport: i0, template: "<div class=\"flex p-2\">\r\n <ng-container *ngTemplateOutlet=\"columnsTemplate; context: { $implicit: distributedColumns() }\"></ng-container>\r\n</div>\r\n", dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
40
37
  }
41
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: CmatMasonryComponent, decorators: [{
38
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: CmatMasonryComponent, decorators: [{
42
39
  type: Component,
43
- args: [{ selector: 'cmat-masonry', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, exportAs: 'cmatMasonry', imports: [NgTemplateOutlet], template: "<div class=\"flex p-2\">\r\n <ng-container *ngTemplateOutlet=\"columnsTemplate; context: { $implicit: distributedColumns }\"></ng-container>\r\n</div>" }]
40
+ args: [{ selector: 'cmat-masonry', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, exportAs: 'cmatMasonry', imports: [NgTemplateOutlet], template: "<div class=\"flex p-2\">\r\n <ng-container *ngTemplateOutlet=\"columnsTemplate; context: { $implicit: distributedColumns() }\"></ng-container>\r\n</div>\r\n" }]
44
41
  }], propDecorators: { columnsTemplate: [{
45
42
  type: Input,
46
43
  args: [{ required: true }]
@@ -1 +1 @@
1
- {"version":3,"file":"cmat-components-masonry.mjs","sources":["../../../projects/cmat/components/masonry/masonry.component.ts","../../../projects/cmat/components/masonry/masonry.component.html","../../../projects/cmat/components/masonry/cmat-components-masonry.ts"],"sourcesContent":["import { NgTemplateOutlet } from '@angular/common';\r\nimport { AfterViewInit, ChangeDetectionStrategy, ChangeDetectorRef, Component, inject, Input, OnChanges, SimpleChanges, TemplateRef, ViewEncapsulation } from '@angular/core';\r\n\r\ninterface MasonryColumn {\r\n items: any[];\r\n}\r\n\r\n@Component({\r\n selector: 'cmat-masonry',\r\n templateUrl: './masonry.component.html',\r\n encapsulation: ViewEncapsulation.None,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n exportAs: 'cmatMasonry',\r\n imports: [NgTemplateOutlet]\r\n})\r\nexport class CmatMasonryComponent implements OnChanges, AfterViewInit {\r\n @Input({ required: true }) columnsTemplate: TemplateRef<any>;\r\n @Input({ required: true }) columns: number;\r\n @Input() items: any[] = [];\r\n distributedColumns: MasonryColumn[] = [];\r\n\r\n private _changeDetectorRef = inject(ChangeDetectorRef);\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if ('columns' in changes) {\r\n this._distributeItems();\r\n }\r\n if ('items' in changes) {\r\n this._distributeItems();\r\n }\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n this._distributeItems();\r\n }\r\n\r\n private _distributeItems(): void {\r\n if (this.items.length === 0) {\r\n this.distributedColumns = [];\r\n\r\n this._changeDetectorRef.markForCheck();\r\n return;\r\n }\r\n\r\n const newDistributedColumns: MasonryColumn[] = Array.from({ length: this.columns }, () => ({ items: [] }));\r\n\r\n for (let i = 0; i < this.items.length; i++) {\r\n const columnIndex = i % this.columns;\r\n newDistributedColumns[columnIndex] = {\r\n items: [...newDistributedColumns[columnIndex].items, this.items[i]]\r\n };\r\n }\r\n\r\n this.distributedColumns = newDistributedColumns;\r\n\r\n this._changeDetectorRef.markForCheck();\r\n }\r\n}\r\n","<div class=\"flex p-2\">\r\n <ng-container *ngTemplateOutlet=\"columnsTemplate; context: { $implicit: distributedColumns }\"></ng-container>\r\n</div>","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;MAea,oBAAoB,CAAA;AARjC,IAAA,WAAA,GAAA;QAWa,IAAA,CAAA,KAAK,GAAU,EAAE;QAC1B,IAAA,CAAA,kBAAkB,GAAoB,EAAE;AAEhC,QAAA,IAAA,CAAA,kBAAkB,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAmCzD,IAAA;AAlCG,IAAA,WAAW,CAAC,OAAsB,EAAA;AAC9B,QAAA,IAAI,SAAS,IAAI,OAAO,EAAE;YACtB,IAAI,CAAC,gBAAgB,EAAE;QAC3B;AACA,QAAA,IAAI,OAAO,IAAI,OAAO,EAAE;YACpB,IAAI,CAAC,gBAAgB,EAAE;QAC3B;IACJ;IAEA,eAAe,GAAA;QACX,IAAI,CAAC,gBAAgB,EAAE;IAC3B;IAEQ,gBAAgB,GAAA;QACpB,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;AACzB,YAAA,IAAI,CAAC,kBAAkB,GAAG,EAAE;AAE5B,YAAA,IAAI,CAAC,kBAAkB,CAAC,YAAY,EAAE;YACtC;QACJ;QAEA,MAAM,qBAAqB,GAAoB,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;AAE1G,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACxC,YAAA,MAAM,WAAW,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO;YACpC,qBAAqB,CAAC,WAAW,CAAC,GAAG;AACjC,gBAAA,KAAK,EAAE,CAAC,GAAG,qBAAqB,CAAC,WAAW,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;aACrE;QACL;AAEA,QAAA,IAAI,CAAC,kBAAkB,GAAG,qBAAqB;AAE/C,QAAA,IAAI,CAAC,kBAAkB,CAAC,YAAY,EAAE;IAC1C;8GAxCS,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAApB,oBAAoB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,SAAA,EAAA,KAAA,EAAA,OAAA,EAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECfjC,2JAEM,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDWQ,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA;;2FAEjB,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBARhC,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,cAAc,EAAA,aAAA,EAET,iBAAiB,CAAC,IAAI,EAAA,eAAA,EACpB,uBAAuB,CAAC,MAAM,EAAA,QAAA,EACrC,aAAa,EAAA,OAAA,EACd,CAAC,gBAAgB,CAAC,EAAA,QAAA,EAAA,2JAAA,EAAA;;sBAG1B,KAAK;uBAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;;sBACxB,KAAK;uBAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;;sBACxB;;;AElBL;;AAEG;;;;"}
1
+ {"version":3,"file":"cmat-components-masonry.mjs","sources":["../../../projects/cmat/components/masonry/masonry.component.ts","../../../projects/cmat/components/masonry/masonry.component.html","../../../projects/cmat/components/masonry/cmat-components-masonry.ts"],"sourcesContent":["import { NgTemplateOutlet } from '@angular/common';\r\nimport {\r\n AfterViewInit,\r\n ChangeDetectionStrategy,\r\n Component,\r\n Input,\r\n OnChanges,\r\n SimpleChanges,\r\n TemplateRef,\r\n ViewEncapsulation,\r\n signal,\r\n} from '@angular/core';\r\n\r\ninterface MasonryColumn {\r\n items: any[];\r\n}\r\n\r\n@Component({\r\n selector: 'cmat-masonry',\r\n templateUrl: './masonry.component.html',\r\n encapsulation: ViewEncapsulation.None,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n exportAs: 'cmatMasonry',\r\n imports: [NgTemplateOutlet]\r\n})\r\nexport class CmatMasonryComponent implements OnChanges, AfterViewInit {\r\n @Input({ required: true }) columnsTemplate: TemplateRef<any>;\r\n @Input({ required: true }) columns: number;\r\n @Input() items: any[] = [];\r\n readonly distributedColumns = signal<MasonryColumn[]>([]);\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if ('columns' in changes) {\r\n this._distributeItems();\r\n }\r\n if ('items' in changes) {\r\n this._distributeItems();\r\n }\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n this._distributeItems();\r\n }\r\n\r\n private _distributeItems(): void {\r\n if (this.items.length === 0) {\r\n this.distributedColumns.set([]);\r\n return;\r\n }\r\n\r\n const newDistributedColumns: MasonryColumn[] = Array.from({ length: this.columns }, () => ({ items: [] }));\r\n\r\n for (let i = 0; i < this.items.length; i++) {\r\n const columnIndex = i % this.columns;\r\n newDistributedColumns[columnIndex] = {\r\n items: [...newDistributedColumns[columnIndex].items, this.items[i]]\r\n };\r\n }\r\n\r\n this.distributedColumns.set(newDistributedColumns);\r\n }\r\n}\r\n","<div class=\"flex p-2\">\r\n <ng-container *ngTemplateOutlet=\"columnsTemplate; context: { $implicit: distributedColumns() }\"></ng-container>\r\n</div>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;MAyBa,oBAAoB,CAAA;AARjC,IAAA,WAAA,GAAA;QAWa,IAAA,CAAA,KAAK,GAAU,EAAE;AACjB,QAAA,IAAA,CAAA,kBAAkB,GAAG,MAAM,CAAkB,EAAE,yFAAC;AAgC5D,IAAA;AA9BG,IAAA,WAAW,CAAC,OAAsB,EAAA;AAC9B,QAAA,IAAI,SAAS,IAAI,OAAO,EAAE;YACtB,IAAI,CAAC,gBAAgB,EAAE;QAC3B;AACA,QAAA,IAAI,OAAO,IAAI,OAAO,EAAE;YACpB,IAAI,CAAC,gBAAgB,EAAE;QAC3B;IACJ;IAEA,eAAe,GAAA;QACX,IAAI,CAAC,gBAAgB,EAAE;IAC3B;IAEQ,gBAAgB,GAAA;QACpB,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;AACzB,YAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC;YAC/B;QACJ;QAEA,MAAM,qBAAqB,GAAoB,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;AAE1G,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACxC,YAAA,MAAM,WAAW,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO;YACpC,qBAAqB,CAAC,WAAW,CAAC,GAAG;AACjC,gBAAA,KAAK,EAAE,CAAC,GAAG,qBAAqB,CAAC,WAAW,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;aACrE;QACL;AAEA,QAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,qBAAqB,CAAC;IACtD;8GAnCS,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAApB,oBAAoB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,SAAA,EAAA,KAAA,EAAA,OAAA,EAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECzBjC,iKAGA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDoBc,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA;;2FAEjB,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBARhC,SAAS;AACI,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,cAAc,EAAA,aAAA,EAET,iBAAiB,CAAC,IAAI,EAAA,eAAA,EACpB,uBAAuB,CAAC,MAAM,EAAA,QAAA,EACrC,aAAa,EAAA,OAAA,EACd,CAAC,gBAAgB,CAAC,EAAA,QAAA,EAAA,iKAAA,EAAA;;sBAG1B,KAAK;uBAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;;sBACxB,KAAK;uBAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;;sBACxB;;;AE5BL;;AAEG;;;;"}
@@ -1,6 +1,6 @@
1
1
  import { NgClass } from '@angular/common';
2
2
  import * as i0 from '@angular/core';
3
- import { forwardRef, inject, ChangeDetectorRef, EventEmitter, Input, Output, ChangeDetectionStrategy, ViewEncapsulation, Component } from '@angular/core';
3
+ import { forwardRef, signal, EventEmitter, Input, Output, ChangeDetectionStrategy, ViewEncapsulation, Component } from '@angular/core';
4
4
  import { NG_VALUE_ACCESSOR } from '@angular/forms';
5
5
  import * as i3 from '@angular/material/button';
6
6
  import { MatButtonModule } from '@angular/material/button';
@@ -43,7 +43,7 @@ const CMAT_MATERIAL_COLOR_PICKER_VALUE_ACCESSOR = {
43
43
  };
44
44
  class CmatMaterialColorPickerComponent {
45
45
  constructor() {
46
- this._changeDetectorRef = inject(ChangeDetectorRef);
46
+ this.selectedColor = signal({ palette: 'bg-indigo', hue: '500', color: 'bg-indigo-500' }, ...(ngDevMode ? [{ debugName: "selectedColor" }] : /* istanbul ignore next */ []));
47
47
  this.colorChanged = new EventEmitter();
48
48
  this.palettes = baseColors;
49
49
  this.hues = ['50', '100', '200', '300', '400', '500', '600', '700', '800', '900'];
@@ -111,19 +111,18 @@ class CmatMaterialColorPickerComponent {
111
111
  this.updateSelectedColor();
112
112
  }
113
113
  updateSelectedColor() {
114
- if (this.selectedColor?.palette === this.selectedPalette && this.selectedColor?.hue === this.selectedHue) {
114
+ if (this.selectedColor()?.palette === this.selectedPalette && this.selectedColor()?.hue === this.selectedHue) {
115
115
  return;
116
116
  }
117
- this.selectedColor = {
117
+ this.selectedColor.set({
118
118
  palette: this.selectedPalette,
119
119
  hue: this.selectedHue,
120
120
  color: this.selectedPalette + '-' + this.selectedHue
121
- };
122
- this._color = this.selectedColor.color;
123
- this.colorChanged.emit(this.selectedColor);
124
- this._modelTouched(this.selectedColor.color);
125
- this._modelChange(this.selectedColor.color);
126
- this._changeDetectorRef.markForCheck();
121
+ });
122
+ this._color = this.selectedColor().color;
123
+ this.colorChanged.emit(this.selectedColor());
124
+ this._modelTouched(this.selectedColor().color);
125
+ this._modelChange(this.selectedColor().color);
127
126
  }
128
127
  goToPalettesView() {
129
128
  this.view = 'palettes';
@@ -133,12 +132,12 @@ class CmatMaterialColorPickerComponent {
133
132
  this.view = 'hues';
134
133
  }
135
134
  }
136
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: CmatMaterialColorPickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
137
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.8", type: CmatMaterialColorPickerComponent, isStandalone: true, selector: "cmat-material-color-picker", inputs: { color: "color", title: "title", readonly: "readonly" }, outputs: { colorChanged: "colorChanged" }, providers: [CMAT_MATERIAL_COLOR_PICKER_VALUE_ACCESSOR], exportAs: ["cmatMaterialColorPicker"], ngImport: i0, template: "<div class=\"rounded\" [ngClass]=\"selectedColor.color\">\r\n <mat-select value=\"init\" panelClass=\"min-w-64 overflow-hidden\" [disableOptionCentering]=\"true\" [hideSingleSelectionIndicator]=\"true\"\r\n [disabled]=\"readonly\" (openedChange)=\"onMenuOpen($event)\">\r\n <mat-select-trigger class=\"flex p-1\">\r\n <mat-icon [svgIcon]=\"'heroicons_outline:paint-brush'\"></mat-icon>\r\n </mat-select-trigger>\r\n\r\n <header class=\"border-b-2 flex flex-row content-between justify-between p-2\">\r\n <button type=\"button\" matIconButton class=\"secondary-text\" aria-label=\"\u8C03\u8272\u677F\"\r\n [class.invisible]=\"view === 'palettes'\" (click)=\"goToPalettesView()\">\r\n <mat-icon svgIcon=\"mat_outline:arrow_back\"></mat-icon>\r\n </button>\r\n <span class=\"align-middle leading-loose text-xl font-bold\">{{title}}</span>\r\n <button type=\"button\" matIconButton class=\"remove-color-button secondary-text\" aria-label=\"\u79FB\u9664\u989C\u8272\"\r\n matTooltip=\"\u79FB\u9664\u989C\u8272\" (click)=\"removeColor()\">\r\n <mat-icon color=\"warn\" [svgIcon]=\"'mat_outline:cleaning_services'\"></mat-icon>\r\n </button>\r\n </header>\r\n\r\n <div class=\"flex flex-wrap w-60 m-2\">\r\n <mat-option value=\"init\" class=\"hidden\">\u521D\u59CB\u5316</mat-option>\r\n <div>\r\n @switch (view) {\r\n @case ('palettes') {\r\n <div>\r\n <div class=\"flex flex-row flex-wrap justify-start content-start colors\">\r\n @for (palette of palettes; track $index) {\r\n <div role=\"presentation\" class=\"cursor-pointer hover:opacity-50\" (click)=\"selectPalette(palette)\">\r\n <mat-option class=\"relative flex w-12 h-12 p-0 pointer-events-none rounded-full bg-transparent \"\r\n [value]=\"selectedPalette\">\r\n @if (selectedColor.color===palette + '-' + selectedHue) {\r\n <mat-icon class=\"absolute m-3 text-white\" [svgIcon]=\"'heroicons_outline:check'\"></mat-icon>\r\n }\r\n <span class=\"flex w-10 h-10 m-1 rounded-full\" [ngClass]=\"palette + '-' + selectedHue\"></span>\r\n </mat-option>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n }\r\n @case ('hues') {\r\n <div>\r\n <div class=\"flex flex-row flex-wrap justify-start content-start colors\">\r\n @for (hue of hues; track $index) {\r\n <div role=\"presentation\" class=\"cursor-pointer hover:opacity-50\" (click)=\"selectHue(hue)\">\r\n <mat-option class=\"relative flex w-12 h-12 p-0 pointer-events-none rounded-full bg-transparent \"\r\n [value]=\"selectedHue\">\r\n @if (selectedColor.color===selectedPalette + '-' + hue) {\r\n <mat-icon class=\"absolute m-3 text-white\" [svgIcon]=\"'heroicons_outline:check'\"></mat-icon>\r\n }\r\n <span class=\"flex w-10 h-10 m-1 rounded-full\" [ngClass]=\"selectedPalette + '-' + hue\"></span>\r\n </mat-option>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n }\r\n }\r\n </div>\r\n </div>\r\n </mat-select>\r\n</div>", styles: ["cmat-material-color-picker .mat-mdc-select-arrow-wrapper{display:none!important}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i1.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth", "canSelectNullableOptions"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "directive", type: i1.MatSelectTrigger, selector: "mat-select-trigger" }, { kind: "component", type: i1.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i4.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
135
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: CmatMaterialColorPickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
136
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: CmatMaterialColorPickerComponent, isStandalone: true, selector: "cmat-material-color-picker", inputs: { color: "color", title: "title", readonly: "readonly" }, outputs: { colorChanged: "colorChanged" }, providers: [CMAT_MATERIAL_COLOR_PICKER_VALUE_ACCESSOR], exportAs: ["cmatMaterialColorPicker"], ngImport: i0, template: "<div class=\"rounded\" [ngClass]=\"selectedColor().color\">\r\n <mat-select value=\"init\" panelClass=\"min-w-64 overflow-hidden\" [disableOptionCentering]=\"true\" [hideSingleSelectionIndicator]=\"true\"\r\n [disabled]=\"readonly\" (openedChange)=\"onMenuOpen($event)\">\r\n <mat-select-trigger class=\"flex p-1\">\r\n <mat-icon [svgIcon]=\"'heroicons_outline:paint-brush'\"></mat-icon>\r\n </mat-select-trigger>\r\n\r\n <header class=\"border-b-2 flex flex-row content-between justify-between p-2\">\r\n <button type=\"button\" matIconButton class=\"secondary-text\" aria-label=\"\u8C03\u8272\u677F\"\r\n [class.invisible]=\"view === 'palettes'\" (click)=\"goToPalettesView()\">\r\n <mat-icon svgIcon=\"mat_outline:arrow_back\"></mat-icon>\r\n </button>\r\n <span class=\"align-middle leading-loose text-xl font-bold\">{{title}}</span>\r\n <button type=\"button\" matIconButton class=\"remove-color-button secondary-text\" aria-label=\"\u79FB\u9664\u989C\u8272\"\r\n matTooltip=\"\u79FB\u9664\u989C\u8272\" (click)=\"removeColor()\">\r\n <mat-icon color=\"warn\" [svgIcon]=\"'mat_outline:cleaning_services'\"></mat-icon>\r\n </button>\r\n </header>\r\n\r\n <div class=\"flex flex-wrap w-60 m-2\">\r\n <mat-option value=\"init\" class=\"hidden\">\u521D\u59CB\u5316</mat-option>\r\n <div>\r\n @switch (view) {\r\n @case ('palettes') {\r\n <div>\r\n <div class=\"flex flex-row flex-wrap justify-start content-start colors\">\r\n @for (palette of palettes; track $index) {\r\n <div role=\"presentation\" class=\"cursor-pointer hover:opacity-50\" (click)=\"selectPalette(palette)\">\r\n <mat-option class=\"relative flex w-12 h-12 p-0 pointer-events-none rounded-full bg-transparent \"\r\n [value]=\"selectedPalette\">\r\n @if (selectedColor().color===palette + '-' + selectedHue) {\r\n <mat-icon class=\"absolute m-3 text-white\" [svgIcon]=\"'heroicons_outline:check'\"></mat-icon>\r\n }\r\n <span class=\"flex w-10 h-10 m-1 rounded-full\" [ngClass]=\"palette + '-' + selectedHue\"></span>\r\n </mat-option>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n }\r\n @case ('hues') {\r\n <div>\r\n <div class=\"flex flex-row flex-wrap justify-start content-start colors\">\r\n @for (hue of hues; track $index) {\r\n <div role=\"presentation\" class=\"cursor-pointer hover:opacity-50\" (click)=\"selectHue(hue)\">\r\n <mat-option class=\"relative flex w-12 h-12 p-0 pointer-events-none rounded-full bg-transparent \"\r\n [value]=\"selectedHue\">\r\n @if (selectedColor().color===selectedPalette + '-' + hue) {\r\n <mat-icon class=\"absolute m-3 text-white\" [svgIcon]=\"'heroicons_outline:check'\"></mat-icon>\r\n }\r\n <span class=\"flex w-10 h-10 m-1 rounded-full\" [ngClass]=\"selectedPalette + '-' + hue\"></span>\r\n </mat-option>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n }\r\n }\r\n </div>\r\n </div>\r\n </mat-select>\r\n</div>\r\n", styles: ["cmat-material-color-picker .mat-mdc-select-arrow-wrapper{display:none!important}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i1.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth", "canSelectNullableOptions"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "directive", type: i1.MatSelectTrigger, selector: "mat-select-trigger" }, { kind: "component", type: i1.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i4.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
138
137
  }
139
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImport: i0, type: CmatMaterialColorPickerComponent, decorators: [{
138
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: CmatMaterialColorPickerComponent, decorators: [{
140
139
  type: Component,
141
- args: [{ selector: 'cmat-material-color-picker', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, exportAs: 'cmatMaterialColorPicker', providers: [CMAT_MATERIAL_COLOR_PICKER_VALUE_ACCESSOR], imports: [NgClass, MatSelectModule, MatIconModule, MatButtonModule, MatTooltipModule], template: "<div class=\"rounded\" [ngClass]=\"selectedColor.color\">\r\n <mat-select value=\"init\" panelClass=\"min-w-64 overflow-hidden\" [disableOptionCentering]=\"true\" [hideSingleSelectionIndicator]=\"true\"\r\n [disabled]=\"readonly\" (openedChange)=\"onMenuOpen($event)\">\r\n <mat-select-trigger class=\"flex p-1\">\r\n <mat-icon [svgIcon]=\"'heroicons_outline:paint-brush'\"></mat-icon>\r\n </mat-select-trigger>\r\n\r\n <header class=\"border-b-2 flex flex-row content-between justify-between p-2\">\r\n <button type=\"button\" matIconButton class=\"secondary-text\" aria-label=\"\u8C03\u8272\u677F\"\r\n [class.invisible]=\"view === 'palettes'\" (click)=\"goToPalettesView()\">\r\n <mat-icon svgIcon=\"mat_outline:arrow_back\"></mat-icon>\r\n </button>\r\n <span class=\"align-middle leading-loose text-xl font-bold\">{{title}}</span>\r\n <button type=\"button\" matIconButton class=\"remove-color-button secondary-text\" aria-label=\"\u79FB\u9664\u989C\u8272\"\r\n matTooltip=\"\u79FB\u9664\u989C\u8272\" (click)=\"removeColor()\">\r\n <mat-icon color=\"warn\" [svgIcon]=\"'mat_outline:cleaning_services'\"></mat-icon>\r\n </button>\r\n </header>\r\n\r\n <div class=\"flex flex-wrap w-60 m-2\">\r\n <mat-option value=\"init\" class=\"hidden\">\u521D\u59CB\u5316</mat-option>\r\n <div>\r\n @switch (view) {\r\n @case ('palettes') {\r\n <div>\r\n <div class=\"flex flex-row flex-wrap justify-start content-start colors\">\r\n @for (palette of palettes; track $index) {\r\n <div role=\"presentation\" class=\"cursor-pointer hover:opacity-50\" (click)=\"selectPalette(palette)\">\r\n <mat-option class=\"relative flex w-12 h-12 p-0 pointer-events-none rounded-full bg-transparent \"\r\n [value]=\"selectedPalette\">\r\n @if (selectedColor.color===palette + '-' + selectedHue) {\r\n <mat-icon class=\"absolute m-3 text-white\" [svgIcon]=\"'heroicons_outline:check'\"></mat-icon>\r\n }\r\n <span class=\"flex w-10 h-10 m-1 rounded-full\" [ngClass]=\"palette + '-' + selectedHue\"></span>\r\n </mat-option>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n }\r\n @case ('hues') {\r\n <div>\r\n <div class=\"flex flex-row flex-wrap justify-start content-start colors\">\r\n @for (hue of hues; track $index) {\r\n <div role=\"presentation\" class=\"cursor-pointer hover:opacity-50\" (click)=\"selectHue(hue)\">\r\n <mat-option class=\"relative flex w-12 h-12 p-0 pointer-events-none rounded-full bg-transparent \"\r\n [value]=\"selectedHue\">\r\n @if (selectedColor.color===selectedPalette + '-' + hue) {\r\n <mat-icon class=\"absolute m-3 text-white\" [svgIcon]=\"'heroicons_outline:check'\"></mat-icon>\r\n }\r\n <span class=\"flex w-10 h-10 m-1 rounded-full\" [ngClass]=\"selectedPalette + '-' + hue\"></span>\r\n </mat-option>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n }\r\n }\r\n </div>\r\n </div>\r\n </mat-select>\r\n</div>", styles: ["cmat-material-color-picker .mat-mdc-select-arrow-wrapper{display:none!important}\n"] }]
140
+ args: [{ selector: 'cmat-material-color-picker', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, exportAs: 'cmatMaterialColorPicker', providers: [CMAT_MATERIAL_COLOR_PICKER_VALUE_ACCESSOR], imports: [NgClass, MatSelectModule, MatIconModule, MatButtonModule, MatTooltipModule], template: "<div class=\"rounded\" [ngClass]=\"selectedColor().color\">\r\n <mat-select value=\"init\" panelClass=\"min-w-64 overflow-hidden\" [disableOptionCentering]=\"true\" [hideSingleSelectionIndicator]=\"true\"\r\n [disabled]=\"readonly\" (openedChange)=\"onMenuOpen($event)\">\r\n <mat-select-trigger class=\"flex p-1\">\r\n <mat-icon [svgIcon]=\"'heroicons_outline:paint-brush'\"></mat-icon>\r\n </mat-select-trigger>\r\n\r\n <header class=\"border-b-2 flex flex-row content-between justify-between p-2\">\r\n <button type=\"button\" matIconButton class=\"secondary-text\" aria-label=\"\u8C03\u8272\u677F\"\r\n [class.invisible]=\"view === 'palettes'\" (click)=\"goToPalettesView()\">\r\n <mat-icon svgIcon=\"mat_outline:arrow_back\"></mat-icon>\r\n </button>\r\n <span class=\"align-middle leading-loose text-xl font-bold\">{{title}}</span>\r\n <button type=\"button\" matIconButton class=\"remove-color-button secondary-text\" aria-label=\"\u79FB\u9664\u989C\u8272\"\r\n matTooltip=\"\u79FB\u9664\u989C\u8272\" (click)=\"removeColor()\">\r\n <mat-icon color=\"warn\" [svgIcon]=\"'mat_outline:cleaning_services'\"></mat-icon>\r\n </button>\r\n </header>\r\n\r\n <div class=\"flex flex-wrap w-60 m-2\">\r\n <mat-option value=\"init\" class=\"hidden\">\u521D\u59CB\u5316</mat-option>\r\n <div>\r\n @switch (view) {\r\n @case ('palettes') {\r\n <div>\r\n <div class=\"flex flex-row flex-wrap justify-start content-start colors\">\r\n @for (palette of palettes; track $index) {\r\n <div role=\"presentation\" class=\"cursor-pointer hover:opacity-50\" (click)=\"selectPalette(palette)\">\r\n <mat-option class=\"relative flex w-12 h-12 p-0 pointer-events-none rounded-full bg-transparent \"\r\n [value]=\"selectedPalette\">\r\n @if (selectedColor().color===palette + '-' + selectedHue) {\r\n <mat-icon class=\"absolute m-3 text-white\" [svgIcon]=\"'heroicons_outline:check'\"></mat-icon>\r\n }\r\n <span class=\"flex w-10 h-10 m-1 rounded-full\" [ngClass]=\"palette + '-' + selectedHue\"></span>\r\n </mat-option>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n }\r\n @case ('hues') {\r\n <div>\r\n <div class=\"flex flex-row flex-wrap justify-start content-start colors\">\r\n @for (hue of hues; track $index) {\r\n <div role=\"presentation\" class=\"cursor-pointer hover:opacity-50\" (click)=\"selectHue(hue)\">\r\n <mat-option class=\"relative flex w-12 h-12 p-0 pointer-events-none rounded-full bg-transparent \"\r\n [value]=\"selectedHue\">\r\n @if (selectedColor().color===selectedPalette + '-' + hue) {\r\n <mat-icon class=\"absolute m-3 text-white\" [svgIcon]=\"'heroicons_outline:check'\"></mat-icon>\r\n }\r\n <span class=\"flex w-10 h-10 m-1 rounded-full\" [ngClass]=\"selectedPalette + '-' + hue\"></span>\r\n </mat-option>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n }\r\n }\r\n </div>\r\n </div>\r\n </mat-select>\r\n</div>\r\n", styles: ["cmat-material-color-picker .mat-mdc-select-arrow-wrapper{display:none!important}\n"] }]
142
141
  }], ctorParameters: () => [], propDecorators: { colorChanged: [{
143
142
  type: Output
144
143
  }], color: [{