@weeehaoooz/talos-ui 0.1.1 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/fesm2022/{weeehaoooz-talos-ui-button-button-group.mjs → weeehaoooz-talos-ui-button.mjs} +91 -15
- package/fesm2022/weeehaoooz-talos-ui-button.mjs.map +1 -0
- package/fesm2022/weeehaoooz-talos-ui-data-display.mjs +3110 -0
- package/fesm2022/weeehaoooz-talos-ui-data-display.mjs.map +1 -0
- package/fesm2022/weeehaoooz-talos-ui-data-viz.mjs +2414 -0
- package/fesm2022/weeehaoooz-talos-ui-data-viz.mjs.map +1 -0
- package/fesm2022/weeehaoooz-talos-ui-dropdown.mjs +1039 -0
- package/fesm2022/weeehaoooz-talos-ui-dropdown.mjs.map +1 -0
- package/fesm2022/weeehaoooz-talos-ui-feedback.mjs +2885 -0
- package/fesm2022/weeehaoooz-talos-ui-feedback.mjs.map +1 -0
- package/fesm2022/weeehaoooz-talos-ui-form.mjs +10799 -0
- package/fesm2022/weeehaoooz-talos-ui-form.mjs.map +1 -0
- package/fesm2022/weeehaoooz-talos-ui-layout.mjs +1316 -7
- package/fesm2022/weeehaoooz-talos-ui-layout.mjs.map +1 -1
- package/fesm2022/weeehaoooz-talos-ui-nav.mjs +3 -3
- package/fesm2022/weeehaoooz-talos-ui-nav.mjs.map +1 -1
- package/fesm2022/weeehaoooz-talos-ui.mjs +21592 -16293
- package/fesm2022/weeehaoooz-talos-ui.mjs.map +1 -1
- package/package.json +20 -139
- package/styles/_breadcrumb.scss +16 -0
- package/styles/_button-group.scss +2 -1
- package/styles/_buttons.scss +51 -0
- package/styles/_dropdown.scss +438 -0
- package/styles/_form-controls.scss +13 -0
- package/styles/_progress-bar.scss +43 -0
- package/styles/_skeleton.scss +176 -0
- package/styles/_spinner.scss +58 -0
- package/styles/_variables.scss +33 -0
- package/styles/index.scss +6 -1
- package/types/weeehaoooz-talos-ui-button.d.ts +92 -0
- package/types/weeehaoooz-talos-ui-button.d.ts.map +1 -0
- package/types/weeehaoooz-talos-ui-data-display.d.ts +1018 -0
- package/types/weeehaoooz-talos-ui-data-display.d.ts.map +1 -0
- package/types/weeehaoooz-talos-ui-data-viz.d.ts +839 -0
- package/types/weeehaoooz-talos-ui-data-viz.d.ts.map +1 -0
- package/types/weeehaoooz-talos-ui-dropdown.d.ts +187 -0
- package/types/weeehaoooz-talos-ui-dropdown.d.ts.map +1 -0
- package/types/weeehaoooz-talos-ui-feedback.d.ts +1495 -0
- package/types/weeehaoooz-talos-ui-feedback.d.ts.map +1 -0
- package/types/weeehaoooz-talos-ui-form.d.ts +2639 -0
- package/types/weeehaoooz-talos-ui-form.d.ts.map +1 -0
- package/types/weeehaoooz-talos-ui-layout.d.ts +851 -3
- package/types/weeehaoooz-talos-ui-layout.d.ts.map +1 -1
- package/types/weeehaoooz-talos-ui-nav.d.ts +1 -1
- package/types/weeehaoooz-talos-ui.d.ts +7148 -4629
- package/types/weeehaoooz-talos-ui.d.ts.map +1 -1
- package/fesm2022/weeehaoooz-talos-ui-button-button-group.mjs.map +0 -1
- package/fesm2022/weeehaoooz-talos-ui-button-button.mjs +0 -94
- package/fesm2022/weeehaoooz-talos-ui-button-button.mjs.map +0 -1
- package/fesm2022/weeehaoooz-talos-ui-data-display-badge.mjs +0 -233
- package/fesm2022/weeehaoooz-talos-ui-data-display-badge.mjs.map +0 -1
- package/fesm2022/weeehaoooz-talos-ui-data-display-data-grid.mjs +0 -1627
- package/fesm2022/weeehaoooz-talos-ui-data-display-data-grid.mjs.map +0 -1
- package/fesm2022/weeehaoooz-talos-ui-data-display-status-tag.mjs +0 -361
- package/fesm2022/weeehaoooz-talos-ui-data-display-status-tag.mjs.map +0 -1
- package/fesm2022/weeehaoooz-talos-ui-data-display-timeline.mjs +0 -312
- package/fesm2022/weeehaoooz-talos-ui-data-display-timeline.mjs.map +0 -1
- package/fesm2022/weeehaoooz-talos-ui-data-display-trend-indicator.mjs +0 -235
- package/fesm2022/weeehaoooz-talos-ui-data-display-trend-indicator.mjs.map +0 -1
- package/fesm2022/weeehaoooz-talos-ui-data-viz-category-bar.mjs +0 -462
- package/fesm2022/weeehaoooz-talos-ui-data-viz-category-bar.mjs.map +0 -1
- package/fesm2022/weeehaoooz-talos-ui-data-viz-heatmap.mjs +0 -805
- package/fesm2022/weeehaoooz-talos-ui-data-viz-heatmap.mjs.map +0 -1
- package/fesm2022/weeehaoooz-talos-ui-data-viz-mini-donut.mjs +0 -267
- package/fesm2022/weeehaoooz-talos-ui-data-viz-mini-donut.mjs.map +0 -1
- package/fesm2022/weeehaoooz-talos-ui-data-viz-mini-gauge.mjs +0 -351
- package/fesm2022/weeehaoooz-talos-ui-data-viz-mini-gauge.mjs.map +0 -1
- package/fesm2022/weeehaoooz-talos-ui-data-viz-sparkline.mjs +0 -566
- package/fesm2022/weeehaoooz-talos-ui-data-viz-sparkline.mjs.map +0 -1
- package/fesm2022/weeehaoooz-talos-ui-feedback-alert.mjs +0 -534
- package/fesm2022/weeehaoooz-talos-ui-feedback-alert.mjs.map +0 -1
- package/fesm2022/weeehaoooz-talos-ui-feedback-dialog.mjs +0 -446
- package/fesm2022/weeehaoooz-talos-ui-feedback-dialog.mjs.map +0 -1
- package/fesm2022/weeehaoooz-talos-ui-feedback-snackbar.mjs +0 -376
- package/fesm2022/weeehaoooz-talos-ui-feedback-snackbar.mjs.map +0 -1
- package/fesm2022/weeehaoooz-talos-ui-feedback-tooltip.mjs +0 -147
- package/fesm2022/weeehaoooz-talos-ui-feedback-tooltip.mjs.map +0 -1
- package/fesm2022/weeehaoooz-talos-ui-form-affix.mjs +0 -242
- package/fesm2022/weeehaoooz-talos-ui-form-affix.mjs.map +0 -1
- package/fesm2022/weeehaoooz-talos-ui-form-autocomplete.mjs +0 -514
- package/fesm2022/weeehaoooz-talos-ui-form-autocomplete.mjs.map +0 -1
- package/fesm2022/weeehaoooz-talos-ui-form-checkbox.mjs +0 -548
- package/fesm2022/weeehaoooz-talos-ui-form-checkbox.mjs.map +0 -1
- package/fesm2022/weeehaoooz-talos-ui-form-chips.mjs +0 -692
- package/fesm2022/weeehaoooz-talos-ui-form-chips.mjs.map +0 -1
- package/fesm2022/weeehaoooz-talos-ui-form-color-picker.mjs +0 -761
- package/fesm2022/weeehaoooz-talos-ui-form-color-picker.mjs.map +0 -1
- package/fesm2022/weeehaoooz-talos-ui-form-date-picker.mjs +0 -896
- package/fesm2022/weeehaoooz-talos-ui-form-date-picker.mjs.map +0 -1
- package/fesm2022/weeehaoooz-talos-ui-form-date-range-picker.mjs +0 -872
- package/fesm2022/weeehaoooz-talos-ui-form-date-range-picker.mjs.map +0 -1
- package/fesm2022/weeehaoooz-talos-ui-form-date-time-picker.mjs +0 -119
- package/fesm2022/weeehaoooz-talos-ui-form-date-time-picker.mjs.map +0 -1
- package/fesm2022/weeehaoooz-talos-ui-form-date-time-range-picker.mjs +0 -135
- package/fesm2022/weeehaoooz-talos-ui-form-date-time-range-picker.mjs.map +0 -1
- package/fesm2022/weeehaoooz-talos-ui-form-drop-zone.mjs +0 -666
- package/fesm2022/weeehaoooz-talos-ui-form-drop-zone.mjs.map +0 -1
- package/fesm2022/weeehaoooz-talos-ui-form-form-field.mjs +0 -147
- package/fesm2022/weeehaoooz-talos-ui-form-form-field.mjs.map +0 -1
- package/fesm2022/weeehaoooz-talos-ui-form-input.mjs +0 -33
- package/fesm2022/weeehaoooz-talos-ui-form-input.mjs.map +0 -1
- package/fesm2022/weeehaoooz-talos-ui-form-otp.mjs +0 -455
- package/fesm2022/weeehaoooz-talos-ui-form-otp.mjs.map +0 -1
- package/fesm2022/weeehaoooz-talos-ui-form-password-input.mjs +0 -379
- package/fesm2022/weeehaoooz-talos-ui-form-password-input.mjs.map +0 -1
- package/fesm2022/weeehaoooz-talos-ui-form-radio.mjs +0 -297
- package/fesm2022/weeehaoooz-talos-ui-form-radio.mjs.map +0 -1
- package/fesm2022/weeehaoooz-talos-ui-form-range-input.mjs +0 -661
- package/fesm2022/weeehaoooz-talos-ui-form-range-input.mjs.map +0 -1
- package/fesm2022/weeehaoooz-talos-ui-form-rating.mjs +0 -346
- package/fesm2022/weeehaoooz-talos-ui-form-rating.mjs.map +0 -1
- package/fesm2022/weeehaoooz-talos-ui-form-select-input.mjs +0 -896
- package/fesm2022/weeehaoooz-talos-ui-form-select-input.mjs.map +0 -1
- package/fesm2022/weeehaoooz-talos-ui-form-slide-toggle.mjs +0 -252
- package/fesm2022/weeehaoooz-talos-ui-form-slide-toggle.mjs.map +0 -1
- package/fesm2022/weeehaoooz-talos-ui-form-transfer-list.mjs +0 -916
- package/fesm2022/weeehaoooz-talos-ui-form-transfer-list.mjs.map +0 -1
- package/types/weeehaoooz-talos-ui-button-button-group.d.ts +0 -62
- package/types/weeehaoooz-talos-ui-button-button-group.d.ts.map +0 -1
- package/types/weeehaoooz-talos-ui-button-button.d.ts +0 -38
- package/types/weeehaoooz-talos-ui-button-button.d.ts.map +0 -1
- package/types/weeehaoooz-talos-ui-data-display-badge.d.ts +0 -119
- package/types/weeehaoooz-talos-ui-data-display-badge.d.ts.map +0 -1
- package/types/weeehaoooz-talos-ui-data-display-data-grid.d.ts +0 -272
- package/types/weeehaoooz-talos-ui-data-display-data-grid.d.ts.map +0 -1
- package/types/weeehaoooz-talos-ui-data-display-status-tag.d.ts +0 -135
- package/types/weeehaoooz-talos-ui-data-display-status-tag.d.ts.map +0 -1
- package/types/weeehaoooz-talos-ui-data-display-timeline.d.ts +0 -144
- package/types/weeehaoooz-talos-ui-data-display-timeline.d.ts.map +0 -1
- package/types/weeehaoooz-talos-ui-data-display-trend-indicator.d.ts +0 -83
- package/types/weeehaoooz-talos-ui-data-display-trend-indicator.d.ts.map +0 -1
- package/types/weeehaoooz-talos-ui-data-viz-category-bar.d.ts +0 -255
- package/types/weeehaoooz-talos-ui-data-viz-category-bar.d.ts.map +0 -1
- package/types/weeehaoooz-talos-ui-data-viz-heatmap.d.ts +0 -204
- package/types/weeehaoooz-talos-ui-data-viz-heatmap.d.ts.map +0 -1
- package/types/weeehaoooz-talos-ui-data-viz-mini-donut.d.ts +0 -101
- package/types/weeehaoooz-talos-ui-data-viz-mini-donut.d.ts.map +0 -1
- package/types/weeehaoooz-talos-ui-data-viz-mini-gauge.d.ts +0 -138
- package/types/weeehaoooz-talos-ui-data-viz-mini-gauge.d.ts.map +0 -1
- package/types/weeehaoooz-talos-ui-data-viz-sparkline.d.ts +0 -161
- package/types/weeehaoooz-talos-ui-data-viz-sparkline.d.ts.map +0 -1
- package/types/weeehaoooz-talos-ui-feedback-alert.d.ts +0 -212
- package/types/weeehaoooz-talos-ui-feedback-alert.d.ts.map +0 -1
- package/types/weeehaoooz-talos-ui-feedback-dialog.d.ts +0 -259
- package/types/weeehaoooz-talos-ui-feedback-dialog.d.ts.map +0 -1
- package/types/weeehaoooz-talos-ui-feedback-snackbar.d.ts +0 -147
- package/types/weeehaoooz-talos-ui-feedback-snackbar.d.ts.map +0 -1
- package/types/weeehaoooz-talos-ui-feedback-tooltip.d.ts +0 -32
- package/types/weeehaoooz-talos-ui-feedback-tooltip.d.ts.map +0 -1
- package/types/weeehaoooz-talos-ui-form-affix.d.ts +0 -88
- package/types/weeehaoooz-talos-ui-form-affix.d.ts.map +0 -1
- package/types/weeehaoooz-talos-ui-form-autocomplete.d.ts +0 -113
- package/types/weeehaoooz-talos-ui-form-autocomplete.d.ts.map +0 -1
- package/types/weeehaoooz-talos-ui-form-checkbox.d.ts +0 -165
- package/types/weeehaoooz-talos-ui-form-checkbox.d.ts.map +0 -1
- package/types/weeehaoooz-talos-ui-form-chips.d.ts +0 -152
- package/types/weeehaoooz-talos-ui-form-chips.d.ts.map +0 -1
- package/types/weeehaoooz-talos-ui-form-color-picker.d.ts +0 -144
- package/types/weeehaoooz-talos-ui-form-color-picker.d.ts.map +0 -1
- package/types/weeehaoooz-talos-ui-form-date-picker.d.ts +0 -138
- package/types/weeehaoooz-talos-ui-form-date-picker.d.ts.map +0 -1
- package/types/weeehaoooz-talos-ui-form-date-range-picker.d.ts +0 -148
- package/types/weeehaoooz-talos-ui-form-date-range-picker.d.ts.map +0 -1
- package/types/weeehaoooz-talos-ui-form-date-time-picker.d.ts +0 -44
- package/types/weeehaoooz-talos-ui-form-date-time-picker.d.ts.map +0 -1
- package/types/weeehaoooz-talos-ui-form-date-time-range-picker.d.ts +0 -48
- package/types/weeehaoooz-talos-ui-form-date-time-range-picker.d.ts.map +0 -1
- package/types/weeehaoooz-talos-ui-form-drop-zone.d.ts +0 -227
- package/types/weeehaoooz-talos-ui-form-drop-zone.d.ts.map +0 -1
- package/types/weeehaoooz-talos-ui-form-form-field.d.ts +0 -42
- package/types/weeehaoooz-talos-ui-form-form-field.d.ts.map +0 -1
- package/types/weeehaoooz-talos-ui-form-input.d.ts +0 -15
- package/types/weeehaoooz-talos-ui-form-input.d.ts.map +0 -1
- package/types/weeehaoooz-talos-ui-form-otp.d.ts +0 -111
- package/types/weeehaoooz-talos-ui-form-otp.d.ts.map +0 -1
- package/types/weeehaoooz-talos-ui-form-password-input.d.ts +0 -145
- package/types/weeehaoooz-talos-ui-form-password-input.d.ts.map +0 -1
- package/types/weeehaoooz-talos-ui-form-radio.d.ts +0 -84
- package/types/weeehaoooz-talos-ui-form-radio.d.ts.map +0 -1
- package/types/weeehaoooz-talos-ui-form-range-input.d.ts +0 -181
- package/types/weeehaoooz-talos-ui-form-range-input.d.ts.map +0 -1
- package/types/weeehaoooz-talos-ui-form-rating.d.ts +0 -110
- package/types/weeehaoooz-talos-ui-form-rating.d.ts.map +0 -1
- package/types/weeehaoooz-talos-ui-form-select-input.d.ts +0 -195
- package/types/weeehaoooz-talos-ui-form-select-input.d.ts.map +0 -1
- package/types/weeehaoooz-talos-ui-form-slide-toggle.d.ts +0 -79
- package/types/weeehaoooz-talos-ui-form-slide-toggle.d.ts.map +0 -1
- package/types/weeehaoooz-talos-ui-form-transfer-list.d.ts +0 -192
- package/types/weeehaoooz-talos-ui-form-transfer-list.d.ts.map +0 -1
|
@@ -1,761 +0,0 @@
|
|
|
1
|
-
import * as i0 from '@angular/core';
|
|
2
|
-
import { inject, ElementRef, input, output, computed, signal, effect, forwardRef, ViewChild, Component, NgModule } from '@angular/core';
|
|
3
|
-
import * as i2 from '@angular/forms';
|
|
4
|
-
import { FormsModule, NG_VALUE_ACCESSOR } from '@angular/forms';
|
|
5
|
-
import { NgTemplateOutlet } from '@angular/common';
|
|
6
|
-
import * as i1 from '@angular/cdk/overlay';
|
|
7
|
-
import { OverlayModule, CdkConnectedOverlay, CdkOverlayOrigin } from '@angular/cdk/overlay';
|
|
8
|
-
import { hsvToRgb, rgbToHsl, rgbToHex, isLightColor, formatColor, parseColor, rgbToHsv, clamp, round, hexToRgb, hslToRgb } from '@weeehaoooz/talos-ui/core';
|
|
9
|
-
|
|
10
|
-
const DEFAULT_COLOR_PRESETS = [
|
|
11
|
-
{
|
|
12
|
-
label: 'Talos Brand',
|
|
13
|
-
colors: [
|
|
14
|
-
'#3b82f6', // Blue
|
|
15
|
-
'#6366f1', // Indigo
|
|
16
|
-
'#8b5cf6', // Violet
|
|
17
|
-
'#ec4899', // Pink
|
|
18
|
-
'#f43f5e', // Rose
|
|
19
|
-
'#ef4444', // Red
|
|
20
|
-
'#f97316', // Orange
|
|
21
|
-
'#eab308', // Yellow
|
|
22
|
-
'#10b981', // Emerald
|
|
23
|
-
'#06b6d4', // Cyan
|
|
24
|
-
'#64748b', // Slate
|
|
25
|
-
'#0f172a' // Dark
|
|
26
|
-
]
|
|
27
|
-
},
|
|
28
|
-
{
|
|
29
|
-
label: 'Pastel & Muted',
|
|
30
|
-
colors: [
|
|
31
|
-
'#93c5fd', // Light Blue
|
|
32
|
-
'#a5b4fc', // Light Indigo
|
|
33
|
-
'#c4b5fd', // Light Violet
|
|
34
|
-
'#f9a8d4', // Light Pink
|
|
35
|
-
'#fda4af', // Light Rose
|
|
36
|
-
'#fca5a5', // Light Red
|
|
37
|
-
'#fdba74', // Light Orange
|
|
38
|
-
'#fde047', // Light Yellow
|
|
39
|
-
'#6ee7b7', // Light Emerald
|
|
40
|
-
'#67e8f9', // Light Cyan
|
|
41
|
-
'#cbd5e1', // Light Slate
|
|
42
|
-
'#ffffff' // Pure White
|
|
43
|
-
]
|
|
44
|
-
}
|
|
45
|
-
];
|
|
46
|
-
|
|
47
|
-
let uniqueColorPickerIdCounter = 0;
|
|
48
|
-
class TalosColorPickerComponent {
|
|
49
|
-
elementRef = inject((ElementRef));
|
|
50
|
-
// Signal Inputs
|
|
51
|
-
value = input('#3b82f6', /* @ts-ignore */
|
|
52
|
-
...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
|
|
53
|
-
format = input('hex', /* @ts-ignore */
|
|
54
|
-
...(ngDevMode ? [{ debugName: "format" }] : /* istanbul ignore next */ []));
|
|
55
|
-
showAlpha = input(true, /* @ts-ignore */
|
|
56
|
-
...(ngDevMode ? [{ debugName: "showAlpha" }] : /* istanbul ignore next */ []));
|
|
57
|
-
presets = input(DEFAULT_COLOR_PRESETS, /* @ts-ignore */
|
|
58
|
-
...(ngDevMode ? [{ debugName: "presets" }] : /* istanbul ignore next */ []));
|
|
59
|
-
showPresets = input(true, /* @ts-ignore */
|
|
60
|
-
...(ngDevMode ? [{ debugName: "showPresets" }] : /* istanbul ignore next */ []));
|
|
61
|
-
showRecent = input(true, /* @ts-ignore */
|
|
62
|
-
...(ngDevMode ? [{ debugName: "showRecent" }] : /* istanbul ignore next */ []));
|
|
63
|
-
showEyeDropper = input(true, /* @ts-ignore */
|
|
64
|
-
...(ngDevMode ? [{ debugName: "showEyeDropper" }] : /* istanbul ignore next */ []));
|
|
65
|
-
showInputs = input(true, /* @ts-ignore */
|
|
66
|
-
...(ngDevMode ? [{ debugName: "showInputs" }] : /* istanbul ignore next */ []));
|
|
67
|
-
showFormatSwitcher = input(true, /* @ts-ignore */
|
|
68
|
-
...(ngDevMode ? [{ debugName: "showFormatSwitcher" }] : /* istanbul ignore next */ []));
|
|
69
|
-
inline = input(false, /* @ts-ignore */
|
|
70
|
-
...(ngDevMode ? [{ debugName: "inline" }] : /* istanbul ignore next */ []));
|
|
71
|
-
disabled = input(false, /* @ts-ignore */
|
|
72
|
-
...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
|
|
73
|
-
readonly = input(false, /* @ts-ignore */
|
|
74
|
-
...(ngDevMode ? [{ debugName: "readonly" }] : /* istanbul ignore next */ []));
|
|
75
|
-
label = input('', /* @ts-ignore */
|
|
76
|
-
...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
|
|
77
|
-
placeholder = input('Select color', /* @ts-ignore */
|
|
78
|
-
...(ngDevMode ? [{ debugName: "placeholder" }] : /* istanbul ignore next */ []));
|
|
79
|
-
size = input('md', /* @ts-ignore */
|
|
80
|
-
...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
|
|
81
|
-
clearable = input(false, /* @ts-ignore */
|
|
82
|
-
...(ngDevMode ? [{ debugName: "clearable" }] : /* istanbul ignore next */ []));
|
|
83
|
-
floatingLabel = input(false, /* @ts-ignore */
|
|
84
|
-
...(ngDevMode ? [{ debugName: "floatingLabel" }] : /* istanbul ignore next */ []));
|
|
85
|
-
id = input('', /* @ts-ignore */
|
|
86
|
-
...(ngDevMode ? [{ debugName: "id" }] : /* istanbul ignore next */ []));
|
|
87
|
-
// Signal Outputs
|
|
88
|
-
colorChange = output();
|
|
89
|
-
colorDetailsChange = output();
|
|
90
|
-
formatChange = output();
|
|
91
|
-
opened = output();
|
|
92
|
-
closed = output();
|
|
93
|
-
cleared = output();
|
|
94
|
-
// View Children
|
|
95
|
-
satValCanvas;
|
|
96
|
-
hueTrack;
|
|
97
|
-
alphaTrack;
|
|
98
|
-
triggerBtn;
|
|
99
|
-
triggerInput;
|
|
100
|
-
// Component IDs
|
|
101
|
-
autoId = `talos-color-picker-${uniqueColorPickerIdCounter++}`;
|
|
102
|
-
componentId = computed(() => this.id() || this.autoId, /* @ts-ignore */
|
|
103
|
-
...(ngDevMode ? [{ debugName: "componentId" }] : /* istanbul ignore next */ []));
|
|
104
|
-
inputId = computed(() => `${this.componentId()}-input`, /* @ts-ignore */
|
|
105
|
-
...(ngDevMode ? [{ debugName: "inputId" }] : /* istanbul ignore next */ []));
|
|
106
|
-
// ControlValueAccessor internal state
|
|
107
|
-
formControlDisabled = signal(false, /* @ts-ignore */
|
|
108
|
-
...(ngDevMode ? [{ debugName: "formControlDisabled" }] : /* istanbul ignore next */ []));
|
|
109
|
-
effectiveDisabled = computed(() => this.disabled() || this.formControlDisabled(), /* @ts-ignore */
|
|
110
|
-
...(ngDevMode ? [{ debugName: "effectiveDisabled" }] : /* istanbul ignore next */ []));
|
|
111
|
-
// Reactive State
|
|
112
|
-
isOpen = signal(false, /* @ts-ignore */
|
|
113
|
-
...(ngDevMode ? [{ debugName: "isOpen" }] : /* istanbul ignore next */ []));
|
|
114
|
-
isInputFocused = signal(false, /* @ts-ignore */
|
|
115
|
-
...(ngDevMode ? [{ debugName: "isInputFocused" }] : /* istanbul ignore next */ []));
|
|
116
|
-
manualInputValue = signal('', /* @ts-ignore */
|
|
117
|
-
...(ngDevMode ? [{ debugName: "manualInputValue" }] : /* istanbul ignore next */ []));
|
|
118
|
-
currentHsva = signal({ h: 217, s: 76, v: 96, a: 1 }, /* @ts-ignore */
|
|
119
|
-
...(ngDevMode ? [{ debugName: "currentHsva" }] : /* istanbul ignore next */ []));
|
|
120
|
-
currentFormat = signal('hex', /* @ts-ignore */
|
|
121
|
-
...(ngDevMode ? [{ debugName: "currentFormat" }] : /* istanbul ignore next */ []));
|
|
122
|
-
recentColors = signal([], /* @ts-ignore */
|
|
123
|
-
...(ngDevMode ? [{ debugName: "recentColors" }] : /* istanbul ignore next */ []));
|
|
124
|
-
copied = signal(false, /* @ts-ignore */
|
|
125
|
-
...(ngDevMode ? [{ debugName: "copied" }] : /* istanbul ignore next */ []));
|
|
126
|
-
// Input editing temporary state
|
|
127
|
-
inputHex = signal('#3b82f6', /* @ts-ignore */
|
|
128
|
-
...(ngDevMode ? [{ debugName: "inputHex" }] : /* istanbul ignore next */ []));
|
|
129
|
-
inputR = signal(59, /* @ts-ignore */
|
|
130
|
-
...(ngDevMode ? [{ debugName: "inputR" }] : /* istanbul ignore next */ []));
|
|
131
|
-
inputG = signal(130, /* @ts-ignore */
|
|
132
|
-
...(ngDevMode ? [{ debugName: "inputG" }] : /* istanbul ignore next */ []));
|
|
133
|
-
inputB = signal(246, /* @ts-ignore */
|
|
134
|
-
...(ngDevMode ? [{ debugName: "inputB" }] : /* istanbul ignore next */ []));
|
|
135
|
-
inputA = signal(100, /* @ts-ignore */
|
|
136
|
-
...(ngDevMode ? [{ debugName: "inputA" }] : /* istanbul ignore next */ []));
|
|
137
|
-
inputH = signal(217, /* @ts-ignore */
|
|
138
|
-
...(ngDevMode ? [{ debugName: "inputH" }] : /* istanbul ignore next */ []));
|
|
139
|
-
inputS = signal(91, /* @ts-ignore */
|
|
140
|
-
...(ngDevMode ? [{ debugName: "inputS" }] : /* istanbul ignore next */ []));
|
|
141
|
-
inputL = signal(60, /* @ts-ignore */
|
|
142
|
-
...(ngDevMode ? [{ debugName: "inputL" }] : /* istanbul ignore next */ []));
|
|
143
|
-
// Dragging interaction state
|
|
144
|
-
isDraggingSatVal = false;
|
|
145
|
-
isDraggingHue = false;
|
|
146
|
-
isDraggingAlpha = false;
|
|
147
|
-
// Overlay positions
|
|
148
|
-
overlayPositions = [
|
|
149
|
-
{
|
|
150
|
-
originX: 'start',
|
|
151
|
-
originY: 'bottom',
|
|
152
|
-
overlayX: 'start',
|
|
153
|
-
overlayY: 'top',
|
|
154
|
-
offsetY: 6
|
|
155
|
-
},
|
|
156
|
-
{
|
|
157
|
-
originX: 'start',
|
|
158
|
-
originY: 'top',
|
|
159
|
-
overlayX: 'start',
|
|
160
|
-
overlayY: 'bottom',
|
|
161
|
-
offsetY: -6
|
|
162
|
-
},
|
|
163
|
-
{
|
|
164
|
-
originX: 'end',
|
|
165
|
-
originY: 'bottom',
|
|
166
|
-
overlayX: 'end',
|
|
167
|
-
overlayY: 'top',
|
|
168
|
-
offsetY: 6
|
|
169
|
-
},
|
|
170
|
-
{
|
|
171
|
-
originX: 'end',
|
|
172
|
-
originY: 'top',
|
|
173
|
-
overlayX: 'end',
|
|
174
|
-
overlayY: 'bottom',
|
|
175
|
-
offsetY: -6
|
|
176
|
-
}
|
|
177
|
-
];
|
|
178
|
-
// Derived Color representations
|
|
179
|
-
currentRgba = computed(() => hsvToRgb(this.currentHsva()), /* @ts-ignore */
|
|
180
|
-
...(ngDevMode ? [{ debugName: "currentRgba" }] : /* istanbul ignore next */ []));
|
|
181
|
-
currentHsla = computed(() => rgbToHsl(this.currentRgba()), /* @ts-ignore */
|
|
182
|
-
...(ngDevMode ? [{ debugName: "currentHsla" }] : /* istanbul ignore next */ []));
|
|
183
|
-
currentHex = computed(() => rgbToHex(this.currentRgba(), this.showAlpha()), /* @ts-ignore */
|
|
184
|
-
...(ngDevMode ? [{ debugName: "currentHex" }] : /* istanbul ignore next */ []));
|
|
185
|
-
pureHueHex = computed(() => rgbToHex(hsvToRgb({ h: this.currentHsva().h, s: 100, v: 100, a: 1 }), false), /* @ts-ignore */
|
|
186
|
-
...(ngDevMode ? [{ debugName: "pureHueHex" }] : /* istanbul ignore next */ []));
|
|
187
|
-
isLight = computed(() => isLightColor(this.currentRgba()), /* @ts-ignore */
|
|
188
|
-
...(ngDevMode ? [{ debugName: "isLight" }] : /* istanbul ignore next */ []));
|
|
189
|
-
isFloated = computed(() => !!this.formattedColor() || this.isOpen() || this.isInputFocused(), /* @ts-ignore */
|
|
190
|
-
...(ngDevMode ? [{ debugName: "isFloated" }] : /* istanbul ignore next */ []));
|
|
191
|
-
formattedColor = computed(() => {
|
|
192
|
-
return formatColor(this.currentRgba(), this.currentFormat(), this.showAlpha());
|
|
193
|
-
}, /* @ts-ignore */
|
|
194
|
-
...(ngDevMode ? [{ debugName: "formattedColor" }] : /* istanbul ignore next */ []));
|
|
195
|
-
rgbaString = computed(() => {
|
|
196
|
-
const rgba = this.currentRgba();
|
|
197
|
-
return `rgba(${rgba.r}, ${rgba.g}, ${rgba.b}, ${rgba.a})`;
|
|
198
|
-
}, /* @ts-ignore */
|
|
199
|
-
...(ngDevMode ? [{ debugName: "rgbaString" }] : /* istanbul ignore next */ []));
|
|
200
|
-
hasEyeDropper = computed(() => {
|
|
201
|
-
return typeof window !== 'undefined' && 'EyeDropper' in window;
|
|
202
|
-
}, /* @ts-ignore */
|
|
203
|
-
...(ngDevMode ? [{ debugName: "hasEyeDropper" }] : /* istanbul ignore next */ []));
|
|
204
|
-
// Normalized preset palettes
|
|
205
|
-
normalizedPresets = computed(() => {
|
|
206
|
-
const raw = this.presets();
|
|
207
|
-
if (!raw || raw.length === 0)
|
|
208
|
-
return [];
|
|
209
|
-
const groups = [];
|
|
210
|
-
let standardGroup = [];
|
|
211
|
-
for (const item of raw) {
|
|
212
|
-
if (typeof item === 'string') {
|
|
213
|
-
standardGroup.push(item);
|
|
214
|
-
}
|
|
215
|
-
else if (item && typeof item === 'object' && Array.isArray(item.colors)) {
|
|
216
|
-
if (standardGroup.length > 0) {
|
|
217
|
-
groups.push({ label: 'Palette', colors: standardGroup });
|
|
218
|
-
standardGroup = [];
|
|
219
|
-
}
|
|
220
|
-
groups.push(item);
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
if (standardGroup.length > 0) {
|
|
224
|
-
groups.push({ label: 'Palette', colors: standardGroup });
|
|
225
|
-
}
|
|
226
|
-
return groups;
|
|
227
|
-
}, /* @ts-ignore */
|
|
228
|
-
...(ngDevMode ? [{ debugName: "normalizedPresets" }] : /* istanbul ignore next */ []));
|
|
229
|
-
// ControlValueAccessor Callbacks
|
|
230
|
-
onChange = () => { };
|
|
231
|
-
onTouched = () => { };
|
|
232
|
-
constructor() {
|
|
233
|
-
// Sync initial format
|
|
234
|
-
effect(() => {
|
|
235
|
-
this.currentFormat.set(this.format());
|
|
236
|
-
});
|
|
237
|
-
// Sync input value if provided
|
|
238
|
-
effect(() => {
|
|
239
|
-
const val = this.value();
|
|
240
|
-
if (val) {
|
|
241
|
-
this.setColorFromExternal(val, false);
|
|
242
|
-
}
|
|
243
|
-
});
|
|
244
|
-
// Keep editing input fields in sync with current color
|
|
245
|
-
effect(() => {
|
|
246
|
-
const rgba = this.currentRgba();
|
|
247
|
-
const hsla = this.currentHsla();
|
|
248
|
-
const hex = this.currentHex();
|
|
249
|
-
this.inputHex.set(hex);
|
|
250
|
-
this.inputR.set(rgba.r);
|
|
251
|
-
this.inputG.set(rgba.g);
|
|
252
|
-
this.inputB.set(rgba.b);
|
|
253
|
-
this.inputA.set(Math.round(rgba.a * 100));
|
|
254
|
-
this.inputH.set(Math.round(hsla.h));
|
|
255
|
-
this.inputS.set(Math.round(hsla.s));
|
|
256
|
-
this.inputL.set(Math.round(hsla.l));
|
|
257
|
-
});
|
|
258
|
-
}
|
|
259
|
-
// --- ControlValueAccessor Methods ---
|
|
260
|
-
writeValue(value) {
|
|
261
|
-
if (value) {
|
|
262
|
-
this.setColorFromExternal(value, false);
|
|
263
|
-
}
|
|
264
|
-
}
|
|
265
|
-
registerOnChange(fn) {
|
|
266
|
-
this.onChange = fn;
|
|
267
|
-
}
|
|
268
|
-
registerOnTouched(fn) {
|
|
269
|
-
this.onTouched = fn;
|
|
270
|
-
}
|
|
271
|
-
setDisabledState(isDisabled) {
|
|
272
|
-
this.formControlDisabled.set(isDisabled);
|
|
273
|
-
}
|
|
274
|
-
// --- External and Internal Color Updates ---
|
|
275
|
-
setColorFromExternal(colorStr, emit = true) {
|
|
276
|
-
const parsed = parseColor(colorStr);
|
|
277
|
-
if (!parsed)
|
|
278
|
-
return;
|
|
279
|
-
const hsva = rgbToHsv(parsed);
|
|
280
|
-
this.currentHsva.set(hsva);
|
|
281
|
-
if (emit) {
|
|
282
|
-
this.notifyColorChange();
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
updateHsva(newHsva, emit = true) {
|
|
286
|
-
this.currentHsva.update(current => {
|
|
287
|
-
const updated = {
|
|
288
|
-
h: newHsva.h !== undefined ? (newHsva.h % 360 + 360) % 360 : current.h,
|
|
289
|
-
s: newHsva.s !== undefined ? clamp(newHsva.s, 0, 100) : current.s,
|
|
290
|
-
v: newHsva.v !== undefined ? clamp(newHsva.v, 0, 100) : current.v,
|
|
291
|
-
a: newHsva.a !== undefined ? clamp(newHsva.a, 0, 1) : current.a
|
|
292
|
-
};
|
|
293
|
-
return updated;
|
|
294
|
-
});
|
|
295
|
-
if (emit) {
|
|
296
|
-
this.notifyColorChange();
|
|
297
|
-
}
|
|
298
|
-
}
|
|
299
|
-
notifyColorChange() {
|
|
300
|
-
const formatted = this.formattedColor();
|
|
301
|
-
const hex = this.currentHex();
|
|
302
|
-
const rgba = this.currentRgba();
|
|
303
|
-
const hsla = this.currentHsla();
|
|
304
|
-
const hsva = this.currentHsva();
|
|
305
|
-
this.onChange(formatted);
|
|
306
|
-
this.colorChange.emit(formatted);
|
|
307
|
-
this.colorDetailsChange.emit({
|
|
308
|
-
value: formatted,
|
|
309
|
-
hex,
|
|
310
|
-
rgba,
|
|
311
|
-
hsla,
|
|
312
|
-
hsva
|
|
313
|
-
});
|
|
314
|
-
}
|
|
315
|
-
// --- Dropdown Management ---
|
|
316
|
-
toggleDropdown(event) {
|
|
317
|
-
if (event)
|
|
318
|
-
event.stopPropagation();
|
|
319
|
-
if (this.effectiveDisabled() || this.readonly() || this.inline())
|
|
320
|
-
return;
|
|
321
|
-
if (this.isOpen()) {
|
|
322
|
-
this.close();
|
|
323
|
-
}
|
|
324
|
-
else {
|
|
325
|
-
this.open();
|
|
326
|
-
}
|
|
327
|
-
}
|
|
328
|
-
open() {
|
|
329
|
-
if (this.effectiveDisabled() || this.readonly() || this.isOpen() || this.inline())
|
|
330
|
-
return;
|
|
331
|
-
this.isOpen.set(true);
|
|
332
|
-
this.opened.emit();
|
|
333
|
-
}
|
|
334
|
-
close() {
|
|
335
|
-
if (!this.isOpen() || this.inline())
|
|
336
|
-
return;
|
|
337
|
-
this.isOpen.set(false);
|
|
338
|
-
this.onTouched();
|
|
339
|
-
this.recordRecentColor(this.formattedColor());
|
|
340
|
-
this.closed.emit();
|
|
341
|
-
}
|
|
342
|
-
onDocumentClick(event) {
|
|
343
|
-
if (this.inline() || !this.isOpen())
|
|
344
|
-
return;
|
|
345
|
-
const target = event.target;
|
|
346
|
-
if (!this.elementRef.nativeElement.contains(target)) {
|
|
347
|
-
this.close();
|
|
348
|
-
}
|
|
349
|
-
}
|
|
350
|
-
clear(event) {
|
|
351
|
-
if (event)
|
|
352
|
-
event.stopPropagation();
|
|
353
|
-
if (this.effectiveDisabled() || this.readonly())
|
|
354
|
-
return;
|
|
355
|
-
this.manualInputValue.set('');
|
|
356
|
-
this.currentHsva.set({ h: 217, s: 76, v: 96, a: 1 });
|
|
357
|
-
this.onChange('');
|
|
358
|
-
this.cleared.emit();
|
|
359
|
-
this.colorChange.emit('');
|
|
360
|
-
}
|
|
361
|
-
// --- Trigger Input Handlers ---
|
|
362
|
-
onTriggerFocus() {
|
|
363
|
-
if (this.effectiveDisabled() || this.readonly())
|
|
364
|
-
return;
|
|
365
|
-
this.isInputFocused.set(true);
|
|
366
|
-
this.manualInputValue.set(this.formattedColor());
|
|
367
|
-
}
|
|
368
|
-
onTriggerBlur(event) {
|
|
369
|
-
this.isInputFocused.set(false);
|
|
370
|
-
const target = event.target;
|
|
371
|
-
const val = target.value.trim();
|
|
372
|
-
if (val) {
|
|
373
|
-
const parsed = parseColor(val);
|
|
374
|
-
if (parsed) {
|
|
375
|
-
const hsva = rgbToHsv(parsed);
|
|
376
|
-
this.currentHsva.set(hsva);
|
|
377
|
-
this.notifyColorChange();
|
|
378
|
-
}
|
|
379
|
-
else {
|
|
380
|
-
target.value = this.formattedColor();
|
|
381
|
-
}
|
|
382
|
-
}
|
|
383
|
-
else if (this.clearable()) {
|
|
384
|
-
this.clear();
|
|
385
|
-
}
|
|
386
|
-
else {
|
|
387
|
-
target.value = this.formattedColor();
|
|
388
|
-
}
|
|
389
|
-
this.onTouched();
|
|
390
|
-
}
|
|
391
|
-
onTriggerInput(event) {
|
|
392
|
-
const target = event.target;
|
|
393
|
-
const val = target.value;
|
|
394
|
-
this.manualInputValue.set(val);
|
|
395
|
-
const trimmed = val.trim();
|
|
396
|
-
if (trimmed) {
|
|
397
|
-
const parsed = parseColor(trimmed);
|
|
398
|
-
if (parsed) {
|
|
399
|
-
const hsva = rgbToHsv(parsed);
|
|
400
|
-
this.currentHsva.set(hsva);
|
|
401
|
-
this.notifyColorChange();
|
|
402
|
-
}
|
|
403
|
-
}
|
|
404
|
-
}
|
|
405
|
-
onTriggerEnter(event) {
|
|
406
|
-
const target = event.target;
|
|
407
|
-
target.blur();
|
|
408
|
-
}
|
|
409
|
-
// --- Saturation & Value 2D Canvas Handlers ---
|
|
410
|
-
onSatValMouseDown(event) {
|
|
411
|
-
if (this.effectiveDisabled() || this.readonly())
|
|
412
|
-
return;
|
|
413
|
-
event.preventDefault();
|
|
414
|
-
this.isDraggingSatVal = true;
|
|
415
|
-
this.updateSatValFromCoord(event.clientX, event.clientY);
|
|
416
|
-
const onMouseMove = (moveEvent) => {
|
|
417
|
-
if (this.isDraggingSatVal) {
|
|
418
|
-
this.updateSatValFromCoord(moveEvent.clientX, moveEvent.clientY);
|
|
419
|
-
}
|
|
420
|
-
};
|
|
421
|
-
const onMouseUp = () => {
|
|
422
|
-
this.isDraggingSatVal = false;
|
|
423
|
-
window.removeEventListener('mousemove', onMouseMove);
|
|
424
|
-
window.removeEventListener('mouseup', onMouseUp);
|
|
425
|
-
};
|
|
426
|
-
window.addEventListener('mousemove', onMouseMove);
|
|
427
|
-
window.addEventListener('mouseup', onMouseUp);
|
|
428
|
-
}
|
|
429
|
-
onSatValTouchStart(event) {
|
|
430
|
-
if (this.effectiveDisabled() || this.readonly() || !event.touches[0])
|
|
431
|
-
return;
|
|
432
|
-
this.isDraggingSatVal = true;
|
|
433
|
-
this.updateSatValFromCoord(event.touches[0].clientX, event.touches[0].clientY);
|
|
434
|
-
const onTouchMove = (moveEvent) => {
|
|
435
|
-
if (this.isDraggingSatVal && moveEvent.touches[0]) {
|
|
436
|
-
this.updateSatValFromCoord(moveEvent.touches[0].clientX, moveEvent.touches[0].clientY);
|
|
437
|
-
}
|
|
438
|
-
};
|
|
439
|
-
const onTouchEnd = () => {
|
|
440
|
-
this.isDraggingSatVal = false;
|
|
441
|
-
window.removeEventListener('touchmove', onTouchMove);
|
|
442
|
-
window.removeEventListener('touchend', onTouchEnd);
|
|
443
|
-
};
|
|
444
|
-
window.addEventListener('touchmove', onTouchMove, { passive: true });
|
|
445
|
-
window.addEventListener('touchend', onTouchEnd);
|
|
446
|
-
}
|
|
447
|
-
updateSatValFromCoord(clientX, clientY) {
|
|
448
|
-
const el = this.satValCanvas?.nativeElement;
|
|
449
|
-
if (!el)
|
|
450
|
-
return;
|
|
451
|
-
const rect = el.getBoundingClientRect();
|
|
452
|
-
const x = clamp(clientX - rect.left, 0, rect.width);
|
|
453
|
-
const y = clamp(clientY - rect.top, 0, rect.height);
|
|
454
|
-
const s = round((x / rect.width) * 100, 1);
|
|
455
|
-
const v = round((1 - y / rect.height) * 100, 1);
|
|
456
|
-
this.updateHsva({ s, v });
|
|
457
|
-
}
|
|
458
|
-
onSatValKeyDown(event) {
|
|
459
|
-
if (this.effectiveDisabled() || this.readonly())
|
|
460
|
-
return;
|
|
461
|
-
const step = event.shiftKey ? 10 : 1;
|
|
462
|
-
let s = this.currentHsva().s;
|
|
463
|
-
let v = this.currentHsva().v;
|
|
464
|
-
let handled = false;
|
|
465
|
-
switch (event.key) {
|
|
466
|
-
case 'ArrowLeft':
|
|
467
|
-
s = clamp(s - step, 0, 100);
|
|
468
|
-
handled = true;
|
|
469
|
-
break;
|
|
470
|
-
case 'ArrowRight':
|
|
471
|
-
s = clamp(s + step, 0, 100);
|
|
472
|
-
handled = true;
|
|
473
|
-
break;
|
|
474
|
-
case 'ArrowUp':
|
|
475
|
-
v = clamp(v + step, 0, 100);
|
|
476
|
-
handled = true;
|
|
477
|
-
break;
|
|
478
|
-
case 'ArrowDown':
|
|
479
|
-
v = clamp(v - step, 0, 100);
|
|
480
|
-
handled = true;
|
|
481
|
-
break;
|
|
482
|
-
}
|
|
483
|
-
if (handled) {
|
|
484
|
-
event.preventDefault();
|
|
485
|
-
this.updateHsva({ s, v });
|
|
486
|
-
}
|
|
487
|
-
}
|
|
488
|
-
// --- Hue Slider Handlers ---
|
|
489
|
-
onHueMouseDown(event) {
|
|
490
|
-
if (this.effectiveDisabled() || this.readonly())
|
|
491
|
-
return;
|
|
492
|
-
event.preventDefault();
|
|
493
|
-
this.isDraggingHue = true;
|
|
494
|
-
this.updateHueFromCoord(event.clientX);
|
|
495
|
-
const onMouseMove = (moveEvent) => {
|
|
496
|
-
if (this.isDraggingHue) {
|
|
497
|
-
this.updateHueFromCoord(moveEvent.clientX);
|
|
498
|
-
}
|
|
499
|
-
};
|
|
500
|
-
const onMouseUp = () => {
|
|
501
|
-
this.isDraggingHue = false;
|
|
502
|
-
window.removeEventListener('mousemove', onMouseMove);
|
|
503
|
-
window.removeEventListener('mouseup', onMouseUp);
|
|
504
|
-
};
|
|
505
|
-
window.addEventListener('mousemove', onMouseMove);
|
|
506
|
-
window.addEventListener('mouseup', onMouseUp);
|
|
507
|
-
}
|
|
508
|
-
onHueTouchStart(event) {
|
|
509
|
-
if (this.effectiveDisabled() || this.readonly() || !event.touches[0])
|
|
510
|
-
return;
|
|
511
|
-
this.isDraggingHue = true;
|
|
512
|
-
this.updateHueFromCoord(event.touches[0].clientX);
|
|
513
|
-
const onTouchMove = (moveEvent) => {
|
|
514
|
-
if (this.isDraggingHue && moveEvent.touches[0]) {
|
|
515
|
-
this.updateHueFromCoord(moveEvent.touches[0].clientX);
|
|
516
|
-
}
|
|
517
|
-
};
|
|
518
|
-
const onTouchEnd = () => {
|
|
519
|
-
this.isDraggingHue = false;
|
|
520
|
-
window.removeEventListener('touchmove', onTouchMove);
|
|
521
|
-
window.removeEventListener('touchend', onTouchEnd);
|
|
522
|
-
};
|
|
523
|
-
window.addEventListener('touchmove', onTouchMove, { passive: true });
|
|
524
|
-
window.addEventListener('touchend', onTouchEnd);
|
|
525
|
-
}
|
|
526
|
-
updateHueFromCoord(clientX) {
|
|
527
|
-
const el = this.hueTrack?.nativeElement;
|
|
528
|
-
if (!el)
|
|
529
|
-
return;
|
|
530
|
-
const rect = el.getBoundingClientRect();
|
|
531
|
-
const x = clamp(clientX - rect.left, 0, rect.width);
|
|
532
|
-
const h = round((x / rect.width) * 360, 1);
|
|
533
|
-
this.updateHsva({ h });
|
|
534
|
-
}
|
|
535
|
-
onHueKeyDown(event) {
|
|
536
|
-
if (this.effectiveDisabled() || this.readonly())
|
|
537
|
-
return;
|
|
538
|
-
const step = event.shiftKey ? 10 : 1;
|
|
539
|
-
let h = this.currentHsva().h;
|
|
540
|
-
let handled = false;
|
|
541
|
-
if (event.key === 'ArrowLeft' || event.key === 'ArrowDown') {
|
|
542
|
-
h = (h - step % 360 + 360) % 360;
|
|
543
|
-
handled = true;
|
|
544
|
-
}
|
|
545
|
-
else if (event.key === 'ArrowRight' || event.key === 'ArrowUp') {
|
|
546
|
-
h = (h + step) % 360;
|
|
547
|
-
handled = true;
|
|
548
|
-
}
|
|
549
|
-
if (handled) {
|
|
550
|
-
event.preventDefault();
|
|
551
|
-
this.updateHsva({ h });
|
|
552
|
-
}
|
|
553
|
-
}
|
|
554
|
-
// --- Alpha Slider Handlers ---
|
|
555
|
-
onAlphaMouseDown(event) {
|
|
556
|
-
if (this.effectiveDisabled() || this.readonly())
|
|
557
|
-
return;
|
|
558
|
-
event.preventDefault();
|
|
559
|
-
this.isDraggingAlpha = true;
|
|
560
|
-
this.updateAlphaFromCoord(event.clientX);
|
|
561
|
-
const onMouseMove = (moveEvent) => {
|
|
562
|
-
if (this.isDraggingAlpha) {
|
|
563
|
-
this.updateAlphaFromCoord(moveEvent.clientX);
|
|
564
|
-
}
|
|
565
|
-
};
|
|
566
|
-
const onMouseUp = () => {
|
|
567
|
-
this.isDraggingAlpha = false;
|
|
568
|
-
window.removeEventListener('mousemove', onMouseMove);
|
|
569
|
-
window.removeEventListener('mouseup', onMouseUp);
|
|
570
|
-
};
|
|
571
|
-
window.addEventListener('mousemove', onMouseMove);
|
|
572
|
-
window.addEventListener('mouseup', onMouseUp);
|
|
573
|
-
}
|
|
574
|
-
onAlphaTouchStart(event) {
|
|
575
|
-
if (this.effectiveDisabled() || this.readonly() || !event.touches[0])
|
|
576
|
-
return;
|
|
577
|
-
this.isDraggingAlpha = true;
|
|
578
|
-
this.updateAlphaFromCoord(event.touches[0].clientX);
|
|
579
|
-
const onTouchMove = (moveEvent) => {
|
|
580
|
-
if (this.isDraggingAlpha && moveEvent.touches[0]) {
|
|
581
|
-
this.updateAlphaFromCoord(moveEvent.touches[0].clientX);
|
|
582
|
-
}
|
|
583
|
-
};
|
|
584
|
-
const onTouchEnd = () => {
|
|
585
|
-
this.isDraggingAlpha = false;
|
|
586
|
-
window.removeEventListener('touchmove', onTouchMove);
|
|
587
|
-
window.removeEventListener('touchend', onTouchEnd);
|
|
588
|
-
};
|
|
589
|
-
window.addEventListener('touchmove', onTouchMove, { passive: true });
|
|
590
|
-
window.addEventListener('touchend', onTouchEnd);
|
|
591
|
-
}
|
|
592
|
-
updateAlphaFromCoord(clientX) {
|
|
593
|
-
const el = this.alphaTrack?.nativeElement;
|
|
594
|
-
if (!el)
|
|
595
|
-
return;
|
|
596
|
-
const rect = el.getBoundingClientRect();
|
|
597
|
-
const x = clamp(clientX - rect.left, 0, rect.width);
|
|
598
|
-
const a = round(x / rect.width, 2);
|
|
599
|
-
this.updateHsva({ a });
|
|
600
|
-
}
|
|
601
|
-
onAlphaKeyDown(event) {
|
|
602
|
-
if (this.effectiveDisabled() || this.readonly())
|
|
603
|
-
return;
|
|
604
|
-
const step = event.shiftKey ? 0.1 : 0.01;
|
|
605
|
-
let a = this.currentHsva().a;
|
|
606
|
-
let handled = false;
|
|
607
|
-
if (event.key === 'ArrowLeft' || event.key === 'ArrowDown') {
|
|
608
|
-
a = clamp(a - step, 0, 1);
|
|
609
|
-
handled = true;
|
|
610
|
-
}
|
|
611
|
-
else if (event.key === 'ArrowRight' || event.key === 'ArrowUp') {
|
|
612
|
-
a = clamp(a + step, 0, 1);
|
|
613
|
-
handled = true;
|
|
614
|
-
}
|
|
615
|
-
if (handled) {
|
|
616
|
-
event.preventDefault();
|
|
617
|
-
this.updateHsva({ a });
|
|
618
|
-
}
|
|
619
|
-
}
|
|
620
|
-
// --- EyeDropper Integration ---
|
|
621
|
-
async pickWithEyeDropper() {
|
|
622
|
-
if (this.effectiveDisabled() || this.readonly() || !this.hasEyeDropper())
|
|
623
|
-
return;
|
|
624
|
-
try {
|
|
625
|
-
// @ts-expect-error EyeDropper is a modern browser API
|
|
626
|
-
const eyeDropper = new window.EyeDropper();
|
|
627
|
-
const result = await eyeDropper.open();
|
|
628
|
-
if (result && result.sRGBHex) {
|
|
629
|
-
this.setColorFromExternal(result.sRGBHex);
|
|
630
|
-
}
|
|
631
|
-
}
|
|
632
|
-
catch {
|
|
633
|
-
// EyeDropper cancelled or dismissed
|
|
634
|
-
}
|
|
635
|
-
}
|
|
636
|
-
// --- Copy to Clipboard ---
|
|
637
|
-
async copyColor() {
|
|
638
|
-
if (typeof navigator === 'undefined' || !navigator.clipboard)
|
|
639
|
-
return;
|
|
640
|
-
try {
|
|
641
|
-
await navigator.clipboard.writeText(this.formattedColor());
|
|
642
|
-
this.copied.set(true);
|
|
643
|
-
setTimeout(() => {
|
|
644
|
-
this.copied.set(false);
|
|
645
|
-
}, 1800);
|
|
646
|
-
}
|
|
647
|
-
catch {
|
|
648
|
-
// Copy failed
|
|
649
|
-
}
|
|
650
|
-
}
|
|
651
|
-
// --- Format Switcher ---
|
|
652
|
-
switchFormat(format) {
|
|
653
|
-
this.currentFormat.set(format);
|
|
654
|
-
this.formatChange.emit(format);
|
|
655
|
-
this.notifyColorChange();
|
|
656
|
-
}
|
|
657
|
-
// --- Direct Inputs ---
|
|
658
|
-
onHexInputChange(val) {
|
|
659
|
-
const trimmed = val.trim();
|
|
660
|
-
if (hexToRgb(trimmed)) {
|
|
661
|
-
this.setColorFromExternal(trimmed);
|
|
662
|
-
}
|
|
663
|
-
}
|
|
664
|
-
onRgbaInputChange() {
|
|
665
|
-
const r = clamp(this.inputR() || 0, 0, 255);
|
|
666
|
-
const g = clamp(this.inputG() || 0, 0, 255);
|
|
667
|
-
const b = clamp(this.inputB() || 0, 0, 255);
|
|
668
|
-
const a = clamp((this.inputA() ?? 100) / 100, 0, 1);
|
|
669
|
-
const hsva = rgbToHsv({ r, g, b, a });
|
|
670
|
-
this.currentHsva.set(hsva);
|
|
671
|
-
this.notifyColorChange();
|
|
672
|
-
}
|
|
673
|
-
onHslaInputChange() {
|
|
674
|
-
const h = (this.inputH() || 0) % 360;
|
|
675
|
-
const s = clamp(this.inputS() || 0, 0, 100);
|
|
676
|
-
const l = clamp(this.inputL() || 0, 0, 100);
|
|
677
|
-
const a = clamp((this.inputA() ?? 100) / 100, 0, 1);
|
|
678
|
-
const rgba = hslToRgb({ h, s, l, a });
|
|
679
|
-
const hsva = rgbToHsv(rgba);
|
|
680
|
-
this.currentHsva.set(hsva);
|
|
681
|
-
this.notifyColorChange();
|
|
682
|
-
}
|
|
683
|
-
// --- Swatch Preset Click & Recent Storage ---
|
|
684
|
-
selectPreset(color) {
|
|
685
|
-
if (this.effectiveDisabled() || this.readonly())
|
|
686
|
-
return;
|
|
687
|
-
this.setColorFromExternal(color);
|
|
688
|
-
}
|
|
689
|
-
recordRecentColor(color) {
|
|
690
|
-
if (!this.showRecent() || !color)
|
|
691
|
-
return;
|
|
692
|
-
const currentList = this.recentColors();
|
|
693
|
-
const filtered = currentList.filter(c => c.toLowerCase() !== color.toLowerCase());
|
|
694
|
-
this.recentColors.set([color, ...filtered].slice(0, 8));
|
|
695
|
-
}
|
|
696
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.1", ngImport: i0, type: TalosColorPickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
697
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.1", type: TalosColorPickerComponent, isStandalone: true, selector: "talos-color-picker", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, format: { classPropertyName: "format", publicName: "format", isSignal: true, isRequired: false, transformFunction: null }, showAlpha: { classPropertyName: "showAlpha", publicName: "showAlpha", isSignal: true, isRequired: false, transformFunction: null }, presets: { classPropertyName: "presets", publicName: "presets", isSignal: true, isRequired: false, transformFunction: null }, showPresets: { classPropertyName: "showPresets", publicName: "showPresets", isSignal: true, isRequired: false, transformFunction: null }, showRecent: { classPropertyName: "showRecent", publicName: "showRecent", isSignal: true, isRequired: false, transformFunction: null }, showEyeDropper: { classPropertyName: "showEyeDropper", publicName: "showEyeDropper", isSignal: true, isRequired: false, transformFunction: null }, showInputs: { classPropertyName: "showInputs", publicName: "showInputs", isSignal: true, isRequired: false, transformFunction: null }, showFormatSwitcher: { classPropertyName: "showFormatSwitcher", publicName: "showFormatSwitcher", isSignal: true, isRequired: false, transformFunction: null }, inline: { classPropertyName: "inline", publicName: "inline", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, clearable: { classPropertyName: "clearable", publicName: "clearable", isSignal: true, isRequired: false, transformFunction: null }, floatingLabel: { classPropertyName: "floatingLabel", publicName: "floatingLabel", isSignal: true, isRequired: false, transformFunction: null }, id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { colorChange: "colorChange", colorDetailsChange: "colorDetailsChange", formatChange: "formatChange", opened: "opened", closed: "closed", cleared: "cleared" }, host: { properties: { "class.is-open": "isOpen()", "class.is-inline": "inline()", "class.is-disabled": "effectiveDisabled()", "class.is-readonly": "readonly()", "class.has-label": "!!label()", "class.is-floating": "floatingLabel()", "class.is-floated": "isFloated()", "class.color-picker-sm": "size() === \"sm\"", "class.color-picker-md": "size() === \"md\"", "class.color-picker-lg": "size() === \"lg\"" }, classAttribute: "talos-color-picker-host" }, providers: [
|
|
698
|
-
{
|
|
699
|
-
provide: NG_VALUE_ACCESSOR,
|
|
700
|
-
useExisting: forwardRef(() => TalosColorPickerComponent),
|
|
701
|
-
multi: true
|
|
702
|
-
}
|
|
703
|
-
], viewQueries: [{ propertyName: "satValCanvas", first: true, predicate: ["satValCanvas"], descendants: true }, { propertyName: "hueTrack", first: true, predicate: ["hueTrack"], descendants: true }, { propertyName: "alphaTrack", first: true, predicate: ["alphaTrack"], descendants: true }, { propertyName: "triggerBtn", first: true, predicate: ["triggerBtn"], descendants: true }, { propertyName: "triggerInput", first: true, predicate: ["triggerInput"], descendants: true }], ngImport: i0, template: "@if (!inline()) {\n<!-- Standard Trigger Button / Popover Mode -->\n<div class=\"talos-color-picker-wrapper\" [class.is-floating]=\"floatingLabel()\">\n @if (label() && !floatingLabel()) {\n <label [for]=\"inputId()\" class=\"talos-field-label\">{{ label() }}</label>\n }\n\n <div #triggerBtn cdkOverlayOrigin #origin=\"cdkOverlayOrigin\" class=\"talos-color-picker-trigger\"\n [class.is-focused]=\"isOpen()\" [class.is-disabled]=\"effectiveDisabled()\"\n [attr.tabindex]=\"effectiveDisabled() ? -1 : 0\" [attr.role]=\"'button'\" [attr.aria-haspopup]=\"'dialog'\"\n [attr.aria-expanded]=\"isOpen()\" [attr.aria-label]=\"label() || placeholder()\" (click)=\"toggleDropdown()\"\n (keydown.enter)=\"toggleDropdown()\" (keydown.space)=\"toggleDropdown()\">\n\n <!-- Swatch Pill Preview -->\n <div class=\"swatch-preview-box\" role=\"button\" tabindex=\"-1\" aria-label=\"Open color palette\" (click)=\"toggleDropdown($event)\">\n <div class=\"swatch-checkerboard\"></div>\n <div class=\"swatch-fill\" [style.background-color]=\"rgbaString()\"></div>\n </div>\n\n <!-- Color Value Input Field -->\n <input\n #triggerInput\n [id]=\"inputId()\"\n type=\"text\"\n class=\"color-picker-input\"\n [value]=\"isInputFocused() ? manualInputValue() : formattedColor()\"\n [placeholder]=\"floatingLabel() && !isFloated() ? '' : placeholder()\"\n [disabled]=\"effectiveDisabled()\"\n [readonly]=\"readonly()\"\n (input)=\"onTriggerInput($event)\"\n (focus)=\"onTriggerFocus()\"\n (blur)=\"onTriggerBlur($event)\"\n (keydown.enter)=\"onTriggerEnter($event)\"\n [attr.aria-label]=\"label() || placeholder()\"\n />\n\n <!-- Clear Button -->\n @if (clearable() && formattedColor() && !effectiveDisabled() && !readonly()) {\n <button type=\"button\" class=\"clear-button\" aria-label=\"Clear color\" (click)=\"clear($event)\">\n <svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" stroke=\"currentColor\" stroke-width=\"2\" fill=\"none\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\n </svg>\n </button>\n }\n\n <!-- Dropdown Chevron Indicator -->\n <button type=\"button\" class=\"dropdown-chevron-icon\" [class.is-rotated]=\"isOpen()\"\n aria-label=\"Toggle color palette\" tabindex=\"-1\" (click)=\"toggleDropdown($event)\">\n <svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" stroke=\"currentColor\" stroke-width=\"2\" fill=\"none\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <polyline points=\"6 9 12 15 18 9\"></polyline>\n </svg>\n </button>\n\n @if (label() && floatingLabel()) {\n <label [for]=\"inputId()\" class=\"talos-floating-label\" [class.is-floated]=\"isFloated()\">{{ label() }}</label>\n }\n </div>\n\n <!-- CDK Connected Popover Overlay -->\n <ng-template cdkConnectedOverlay [cdkConnectedOverlayOrigin]=\"origin\" [cdkConnectedOverlayOpen]=\"isOpen()\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\" (overlayOutsideClick)=\"close()\" (detach)=\"close()\">\n <div class=\"talos-color-picker-panel talos-popover-panel\" (click)=\"$event.stopPropagation()\">\n <ng-container *ngTemplateOutlet=\"pickerContentTpl\"></ng-container>\n </div>\n </ng-template>\n</div>\n} @else {\n<!-- Inline / Embedded Mode -->\n<div class=\"talos-color-picker-panel talos-inline-panel\">\n @if (label()) {\n <div class=\"panel-header-title\">{{ label() }}</div>\n }\n <ng-container *ngTemplateOutlet=\"pickerContentTpl\"></ng-container>\n</div>\n}\n\n<!-- Main Color Picker Content Template -->\n<ng-template #pickerContentTpl>\n <div class=\"picker-inner-container\">\n\n <!-- 1. Saturation & Value 2D Canvas -->\n <div #satValCanvas class=\"sat-val-canvas\" [style.background-color]=\"pureHueHex()\" tabindex=\"0\" role=\"slider\"\n aria-label=\"Color saturation and brightness\"\n [attr.aria-valuetext]=\"'Saturation ' + currentHsva().s + '%, Brightness ' + currentHsva().v + '%'\"\n (mousedown)=\"onSatValMouseDown($event)\" (touchstart)=\"onSatValTouchStart($event)\"\n (keydown)=\"onSatValKeyDown($event)\">\n <div class=\"sat-gradient-white\"></div>\n <div class=\"val-gradient-black\"></div>\n\n <!-- Handle Pin -->\n <div class=\"sat-val-handle\" [class.is-light-handle]=\"!isLight()\" [style.left.%]=\"currentHsva().s\"\n [style.top.%]=\"100 - currentHsva().v\" [style.background-color]=\"rgbaString()\">\n </div>\n </div>\n\n <!-- 2. Sliders & Action Bar -->\n <div class=\"sliders-action-bar\">\n <!-- Sliders Column -->\n <div class=\"sliders-column\">\n <!-- Hue Rainbow Slider Track -->\n <div #hueTrack class=\"hue-slider-track\" tabindex=\"0\" role=\"slider\" aria-label=\"Hue spectrum\" aria-valuemin=\"0\"\n aria-valuemax=\"360\" [attr.aria-valuenow]=\"currentHsva().h\" (mousedown)=\"onHueMouseDown($event)\"\n (touchstart)=\"onHueTouchStart($event)\" (keydown)=\"onHueKeyDown($event)\">\n <div class=\"slider-thumb\" [style.left.%]=\"(currentHsva().h / 360) * 100\"\n [style.background-color]=\"pureHueHex()\">\n </div>\n </div>\n\n <!-- Alpha Opacity Slider Track -->\n @if (showAlpha()) {\n <div #alphaTrack class=\"alpha-slider-track\" tabindex=\"0\" role=\"slider\" aria-label=\"Color opacity\"\n aria-valuemin=\"0\" aria-valuemax=\"1\" [attr.aria-valuenow]=\"currentHsva().a\"\n (mousedown)=\"onAlphaMouseDown($event)\" (touchstart)=\"onAlphaTouchStart($event)\"\n (keydown)=\"onAlphaKeyDown($event)\">\n <div class=\"alpha-checkerboard-bg\"></div>\n <div class=\"alpha-gradient-overlay\"\n [style.background]=\"'linear-gradient(to right, transparent, ' + pureHueHex() + ')'\">\n </div>\n <div class=\"slider-thumb\" [style.left.%]=\"currentHsva().a * 100\" [style.background-color]=\"rgbaString()\">\n </div>\n </div>\n }\n </div>\n\n <!-- Action & Preview Column -->\n <div class=\"action-preview-column\">\n <!-- Color Preview Circle -->\n <div class=\"swatch-circle-preview\" [title]=\"formattedColor()\">\n <div class=\"swatch-checkerboard\"></div>\n <div class=\"swatch-fill\" [style.background-color]=\"rgbaString()\"></div>\n </div>\n\n <!-- Quick Action Buttons -->\n <div class=\"quick-actions-row\">\n @if (showEyeDropper() && hasEyeDropper()) {\n <button type=\"button\" class=\"icon-action-button\" title=\"Pick color from screen\"\n aria-label=\"Pick color from screen\" (click)=\"pickWithEyeDropper()\">\n <svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path\n d=\"m12 9-8.414 8.414A2 2 0 0 0 3 18.828v1.344a2 2 0 0 1-.586 1.414A2 2 0 0 1 3.828 21h1.344a2 2 0 0 0 1.414-.586L15 12\" />\n <path d=\"m18 9 .4.4a1 1 0 1 1-3 3l-3.8-3.8a1 1 0 1 1 3-3l.4.4 3.4-3.4a1 1 0 1 1 3 3z\" />\n <path d=\"m2 22 .414-.414\" />\n </svg>\n </button>\n }\n\n <button type=\"button\" class=\"icon-action-button\" [class.is-copied]=\"copied()\"\n [title]=\"copied() ? 'Copied to clipboard!' : 'Copy color string'\" aria-label=\"Copy color string\"\n (click)=\"copyColor()\">\n @if (copied()) {\n <svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" stroke=\"currentColor\" stroke-width=\"2\" fill=\"none\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"copy-success-icon\">\n <polyline points=\"20 6 9 17 4 12\"></polyline>\n </svg>\n } @else {\n <svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" stroke=\"currentColor\" stroke-width=\"2\" fill=\"none\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"></rect>\n <path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"></path>\n </svg>\n }\n </button>\n </div>\n </div>\n </div>\n\n <!-- 3. Format Switcher & Channel Inputs -->\n @if (showInputs()) {\n <div class=\"inputs-section\">\n @if (showFormatSwitcher()) {\n <div class=\"format-tabs-bar\">\n <button type=\"button\" class=\"format-tab-btn\" [class.is-active]=\"currentFormat() === 'hex'\"\n (click)=\"switchFormat('hex')\">\n HEX\n </button>\n <button type=\"button\" class=\"format-tab-btn\" [class.is-active]=\"currentFormat() === 'rgb'\"\n (click)=\"switchFormat('rgb')\">\n RGB\n </button>\n <button type=\"button\" class=\"format-tab-btn\" [class.is-active]=\"currentFormat() === 'hsl'\"\n (click)=\"switchFormat('hsl')\">\n HSL\n </button>\n </div>\n }\n\n <!-- Channel Inputs Grid -->\n <div class=\"channel-inputs-grid\">\n @if (currentFormat() === 'hex') {\n <!-- HEX Input -->\n <div class=\"input-field-group hex-field\">\n <input type=\"text\" class=\"channel-input hex-input\" [ngModel]=\"inputHex()\"\n (ngModelChange)=\"onHexInputChange($event)\" placeholder=\"#3B82F6\" aria-label=\"Hex color value\" />\n <span class=\"field-caption\">HEX</span>\n </div>\n } @else if (currentFormat() === 'rgb') {\n <!-- RGB Inputs -->\n <div class=\"input-field-group\">\n <input type=\"number\" min=\"0\" max=\"255\" class=\"channel-input\" [(ngModel)]=\"inputR\"\n (ngModelChange)=\"onRgbaInputChange()\" aria-label=\"Red\" />\n <span class=\"field-caption\">R</span>\n </div>\n <div class=\"input-field-group\">\n <input type=\"number\" min=\"0\" max=\"255\" class=\"channel-input\" [(ngModel)]=\"inputG\"\n (ngModelChange)=\"onRgbaInputChange()\" aria-label=\"Green\" />\n <span class=\"field-caption\">G</span>\n </div>\n <div class=\"input-field-group\">\n <input type=\"number\" min=\"0\" max=\"255\" class=\"channel-input\" [(ngModel)]=\"inputB\"\n (ngModelChange)=\"onRgbaInputChange()\" aria-label=\"Blue\" />\n <span class=\"field-caption\">B</span>\n </div>\n } @else if (currentFormat() === 'hsl') {\n <!-- HSL Inputs -->\n <div class=\"input-field-group\">\n <input type=\"number\" min=\"0\" max=\"360\" class=\"channel-input\" [(ngModel)]=\"inputH\"\n (ngModelChange)=\"onHslaInputChange()\" aria-label=\"Hue\" />\n <span class=\"field-caption\">H</span>\n </div>\n <div class=\"input-field-group\">\n <input type=\"number\" min=\"0\" max=\"100\" class=\"channel-input\" [(ngModel)]=\"inputS\"\n (ngModelChange)=\"onHslaInputChange()\" aria-label=\"Saturation\" />\n <span class=\"field-caption\">S%</span>\n </div>\n <div class=\"input-field-group\">\n <input type=\"number\" min=\"0\" max=\"100\" class=\"channel-input\" [(ngModel)]=\"inputL\"\n (ngModelChange)=\"onHslaInputChange()\" aria-label=\"Lightness\" />\n <span class=\"field-caption\">L%</span>\n </div>\n }\n\n <!-- Alpha Input (Common for all non-hex or with alpha) -->\n @if (showAlpha()) {\n <div class=\"input-field-group alpha-field\">\n <input type=\"number\" min=\"0\" max=\"100\" class=\"channel-input\" [(ngModel)]=\"inputA\"\n (ngModelChange)=\"currentFormat() === 'hsl' ? onHslaInputChange() : onRgbaInputChange()\"\n aria-label=\"Opacity Percentage\" />\n <span class=\"field-caption\">A%</span>\n </div>\n }\n </div>\n </div>\n }\n\n <!-- 4. Preset Color Swatches -->\n @if (showPresets() && normalizedPresets().length > 0) {\n <div class=\"presets-section\">\n @for (group of normalizedPresets(); track group.label) {\n @if (normalizedPresets().length > 1) {\n <div class=\"preset-group-title\">{{ group.label }}</div>\n }\n <div class=\"swatches-grid\">\n @for (color of group.colors; track color) {\n <button type=\"button\" class=\"swatch-btn\"\n [class.is-selected]=\"currentHex().toLowerCase() === color.toLowerCase()\" [style.background-color]=\"color\"\n [title]=\"color\" [attr.aria-label]=\"'Select preset color ' + color\" (click)=\"selectPreset(color)\">\n @if (currentHex().toLowerCase() === color.toLowerCase()) {\n <svg viewBox=\"0 0 24 24\" width=\"12\" height=\"12\" stroke=\"currentColor\" stroke-width=\"3\" fill=\"none\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"swatch-check-icon\">\n <polyline points=\"20 6 9 17 4 12\"></polyline>\n </svg>\n }\n </button>\n }\n </div>\n }\n </div>\n }\n\n <!-- 5. Recent Colors -->\n @if (showRecent() && recentColors().length > 0) {\n <div class=\"recent-section\">\n <div class=\"recent-group-title\">Recent Colors</div>\n <div class=\"swatches-grid recent-grid\">\n @for (color of recentColors(); track color) {\n <button type=\"button\" class=\"swatch-btn\"\n [class.is-selected]=\"currentHex().toLowerCase() === color.toLowerCase()\" [style.background-color]=\"color\"\n [title]=\"color\" [attr.aria-label]=\"'Select recent color ' + color\" (click)=\"selectPreset(color)\">\n </button>\n }\n </div>\n </div>\n }\n\n </div>\n</ng-template>", styles: [":host{display:inline-block;position:relative;width:100%;max-width:100%;font-family:inherit;box-sizing:border-box}:host *,:host *:before,:host *:after{box-sizing:border-box}:host.color-picker-sm{--talos-control-height: var(--talos-height-sm, 2rem);--tcp-width: 250px;--tcp-canvas-height: 130px;--tcp-font-size: var(--talos-font-size-xs, .75rem)}:host.color-picker-md{--talos-control-height: var(--talos-height-md, 2.25rem);--tcp-width: 280px;--tcp-canvas-height: 150px;--tcp-font-size: var(--talos-font-size-sm, .8125rem)}:host.color-picker-lg{--talos-control-height: var(--talos-height-lg, 2.625rem);--tcp-width: 310px;--tcp-canvas-height: 170px;--tcp-font-size: var(--talos-font-size-md, .875rem)}.talos-field-label{display:inline-flex;align-items:center;font-size:var(--talos-control-font-size, .8125rem);font-weight:var(--talos-font-weight-semibold, 600);color:var(--talos-text-primary, #0f172a);margin-bottom:.375rem;cursor:pointer;-webkit-user-select:none;user-select:none;transition:color var(--talos-transition, .18s ease)}.talos-field-label .required-star{color:var(--talos-error-color, #ef4444);margin-left:.25rem}.talos-color-picker-wrapper{position:relative;width:100%;display:flex;flex-direction:column}.talos-color-picker-trigger{position:relative;display:flex;align-items:center;gap:.625rem;width:100%;height:var(--talos-control-height, 2.25rem);min-height:var(--talos-control-height, 2.25rem);padding:0 var(--talos-control-padding-x, .625rem);background-color:var(--talos-input-bg, var(--talos-bg-surface, #ffffff));border:1px solid var(--talos-input-border, var(--talos-border-default, #cbd5e1));border-radius:var(--talos-border-radius, var(--talos-radius-md, .375rem));color:var(--talos-input-color, var(--talos-text-primary, #0f172a));font-size:var(--talos-control-font-size, .8125rem);cursor:text;outline:none;-webkit-user-select:none;user-select:none;transition:border-color var(--talos-transition, .18s ease),box-shadow var(--talos-transition, .18s ease),background-color var(--talos-transition, .18s ease)}.talos-color-picker-trigger:hover:not(.is-disabled){border-color:var(--talos-input-border-hover, var(--talos-border-hover, #94a3b8))}.talos-color-picker-trigger:focus-within,.talos-color-picker-trigger.is-focused,.talos-color-picker-trigger:focus-visible{border-color:var(--talos-input-border-focus, var(--talos-primary, #2563eb));box-shadow:var(--talos-focus-ring, 0 0 0 3px rgba(37, 99, 235, .18))}.talos-color-picker-trigger.is-disabled{background-color:var(--talos-input-disabled-bg, var(--talos-bg-subtle, #f1f5f9));border-color:var(--talos-input-disabled-border, var(--talos-border-subtle, #e2e8f0));color:var(--talos-input-disabled-color, var(--talos-text-muted, #94a3b8));cursor:not-allowed;opacity:.65}.swatch-preview-box{position:relative;width:1.1rem;height:1.1rem;min-width:1.1rem;border-radius:var(--talos-radius-xs, .25rem);overflow:hidden;border:1px solid var(--talos-border-default, rgba(0, 0, 0, .15));box-shadow:inset 0 0 2px #0000001a;cursor:pointer;flex-shrink:0;transition:transform .12s ease}.swatch-preview-box:hover{transform:scale(1.08)}.swatch-checkerboard,.alpha-checkerboard-bg{position:absolute;inset:0;background-image:linear-gradient(45deg,var(--talos-border-default, #cbd5e1) 25%,transparent 25%),linear-gradient(-45deg,var(--talos-border-default, #cbd5e1) 25%,transparent 25%),linear-gradient(45deg,transparent 75%,var(--talos-border-default, #cbd5e1) 75%),linear-gradient(-45deg,transparent 75%,var(--talos-border-default, #cbd5e1) 75%);background-size:8px 8px;background-position:0 0,0 4px,4px -4px,-4px 0px;background-color:var(--talos-bg-surface, #ffffff)}.swatch-fill{position:absolute;inset:0;transition:background-color .1s ease}.color-picker-input{flex:1;min-width:0;width:100%;height:100%;background:transparent;border:none;outline:none;padding:0;margin:0;font-family:inherit;font-size:var(--talos-control-font-size, .8125rem);font-weight:var(--talos-font-weight-medium, 500);font-variant-numeric:tabular-nums;letter-spacing:.02em;color:var(--talos-input-color, var(--talos-text-primary, #0f172a));line-height:normal}.color-picker-input::placeholder{color:var(--talos-input-placeholder-color, var(--talos-text-muted, #94a3b8));opacity:1;font-weight:var(--talos-font-weight-normal, 400)}.color-picker-input:disabled{cursor:not-allowed}.clear-button{display:inline-flex;align-items:center;justify-content:center;background:transparent;border:none;padding:.25rem;color:var(--talos-text-muted, #94a3b8);border-radius:var(--talos-radius-full, 9999px);cursor:pointer;transition:color var(--talos-transition, .18s ease),background-color var(--talos-transition, .18s ease)}.clear-button:hover{color:var(--talos-error-color, #ef4444);background-color:#ef444426}.dropdown-chevron-icon{display:inline-flex;align-items:center;justify-content:center;background:transparent;border:none;padding:0;color:var(--talos-text-muted, #94a3b8);cursor:pointer;transition:transform var(--talos-transition, .18s cubic-bezier(.4, 0, .2, 1)),color var(--talos-transition, .18s ease)}.dropdown-chevron-icon.is-rotated{transform:rotate(180deg);color:var(--talos-primary, #2563eb)}.dropdown-chevron-icon:hover{color:var(--talos-text-primary, #0f172a)}.talos-floating-label{position:absolute;left:calc(var(--talos-control-padding-x, .625rem) + 1.375rem + .625rem);top:50%;transform:translateY(-50%);font-size:var(--talos-control-font-size, .8125rem);font-weight:var(--talos-font-weight-medium, 500);color:var(--talos-input-placeholder-color, var(--talos-text-muted, #94a3b8));pointer-events:none;-webkit-user-select:none;user-select:none;background-color:var(--talos-input-bg, var(--talos-bg-surface, #ffffff));padding:0 .25rem;border-radius:var(--talos-radius-xs, .25rem);line-height:1;z-index:2;transition:transform var(--talos-transition, .18s cubic-bezier(.4, 0, .2, 1)),font-size var(--talos-transition, .18s cubic-bezier(.4, 0, .2, 1)),color var(--talos-transition, .18s cubic-bezier(.4, 0, .2, 1)),top var(--talos-transition, .18s cubic-bezier(.4, 0, .2, 1)),left var(--talos-transition, .18s cubic-bezier(.4, 0, .2, 1))}.talos-floating-label.is-floated{top:0;left:var(--talos-control-padding-x, .625rem);transform:translateY(-50%) scale(.85);font-size:.75rem;font-weight:var(--talos-font-weight-semibold, 600);color:var(--talos-text-muted, #64748b)}:host(.is-open) .talos-floating-label.is-floated,:host(.is-floated) .talos-floating-label.is-floated,.talos-color-picker-trigger:focus-within .talos-floating-label.is-floated,.talos-color-picker-trigger.is-focused .talos-floating-label.is-floated{color:var(--talos-primary, #2563eb)}.talos-color-picker-panel{width:var(--tcp-width, 280px);max-width:calc(100vw - 2rem);background-color:var(--talos-dropdown-bg, var(--talos-bg-surface, #ffffff));border:1px solid var(--talos-dropdown-border, var(--talos-border-default, #cbd5e1));border-radius:var(--talos-border-radius, var(--talos-radius-lg, .5rem));overflow:hidden;box-sizing:border-box}.talos-color-picker-panel.talos-popover-panel{box-shadow:var(--talos-dropdown-shadow, var(--talos-shadow-dropdown, 0 16px 32px -4px rgba(0, 0, 0, .25)));-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);animation:tcp-slide-in var(--talos-transition, .18s cubic-bezier(.16, 1, .3, 1));z-index:1050}.talos-color-picker-panel.talos-inline-panel{box-shadow:var(--talos-shadow-xs, 0 1px 2px rgba(0, 0, 0, .05))}.talos-color-picker-panel .panel-header-title{padding:.75rem .875rem 0;font-size:var(--talos-control-font-size, .8125rem);font-weight:var(--talos-font-weight-semibold, 600);color:var(--talos-text-primary, #0f172a)}.picker-inner-container{display:flex;flex-direction:column;padding:.75rem;gap:.75rem}.sat-val-canvas{position:relative;width:100%;height:var(--tcp-canvas-height, 150px);border-radius:calc(var(--talos-border-radius, var(--talos-radius-md, .375rem)) - 1px);overflow:hidden;cursor:crosshair;outline:none;-webkit-user-select:none;user-select:none;touch-action:none;box-shadow:inset 0 0 1px #0000004d}.sat-val-canvas:focus-visible{box-shadow:0 0 0 2px var(--talos-primary, #2563eb),inset 0 0 1px #0000004d}.sat-gradient-white{position:absolute;inset:0;background:linear-gradient(to right,#ffffff,transparent)}.val-gradient-black{position:absolute;inset:0;background:linear-gradient(to top,#000000,transparent)}.sat-val-handle{position:absolute;width:14px;height:14px;border-radius:var(--talos-radius-full, 9999px);border:2px solid #ffffff;box-shadow:0 0 2px #0009,inset 0 0 1px #0006;transform:translate(-50%,-50%);pointer-events:none;transition:transform .05s ease}.sat-val-handle.is-light-handle{border-color:#0f172a}.sliders-action-bar{display:flex;align-items:center;gap:.625rem}.sliders-column{flex:1;display:flex;flex-direction:column;gap:.5rem}.hue-slider-track,.alpha-slider-track{position:relative;width:100%;height:.75rem;border-radius:var(--talos-radius-full, 9999px);cursor:pointer;outline:none;-webkit-user-select:none;user-select:none;touch-action:none}.hue-slider-track:focus-visible,.alpha-slider-track:focus-visible{box-shadow:0 0 0 2px var(--talos-primary, #2563eb)}.hue-slider-track{background:linear-gradient(to right,red,#ff0 17%,#0f0 33%,#0ff,#00f 67%,#f0f 83%,red)}.alpha-slider-track{overflow:hidden}.alpha-slider-track .alpha-gradient-overlay{position:absolute;inset:0;border-radius:var(--talos-radius-full, 9999px)}.slider-thumb{position:absolute;top:50%;width:14px;height:14px;border-radius:var(--talos-radius-full, 9999px);border:2px solid #ffffff;box-shadow:0 1px 3px #0006;transform:translate(-50%,-50%);pointer-events:none}.action-preview-column{display:flex;flex-direction:column;align-items:center;gap:.375rem}.swatch-circle-preview{position:relative;width:1.75rem;height:1.75rem;border-radius:var(--talos-radius-full, 9999px);overflow:hidden;border:1px solid var(--talos-border-default, rgba(0, 0, 0, .15));box-shadow:var(--talos-shadow-xs, 0 1px 2px rgba(0, 0, 0, .05))}.quick-actions-row{display:flex;align-items:center;gap:.25rem}.icon-action-button{display:inline-flex;align-items:center;justify-content:center;width:1.625rem;height:1.625rem;padding:0;background-color:transparent;border:1px solid transparent;border-radius:var(--talos-radius-sm, .25rem);color:var(--talos-text-muted, #94a3b8);cursor:pointer;transition:all var(--talos-transition, .18s ease)}.icon-action-button:hover{color:var(--talos-text-primary, #0f172a);background-color:var(--talos-bg-subtle, #f1f5f9);border-color:var(--talos-border-subtle, #e2e8f0)}.icon-action-button.is-copied{color:var(--talos-success, #16a34a)}.icon-action-button .copy-success-icon{animation:tcp-scale-up .2s ease}.inputs-section{display:flex;flex-direction:column;gap:.5rem}.format-tabs-bar{display:flex;align-items:center;background-color:var(--talos-bg-subtle, #f1f5f9);padding:2px;border-radius:var(--talos-radius-md, .375rem);gap:2px;border:1px solid var(--talos-border-subtle, rgba(0, 0, 0, .04))}.format-tab-btn{flex:1;padding:.25rem 0;font-size:var(--talos-font-size-2xs, .6875rem);font-weight:var(--talos-font-weight-semibold, 600);letter-spacing:.03em;background:transparent;border:none;border-radius:var(--talos-radius-xs, .25rem);color:var(--talos-text-muted, #94a3b8);cursor:pointer;transition:all var(--talos-transition, .18s ease)}.format-tab-btn.is-active{background-color:var(--talos-bg-surface, #ffffff);color:var(--talos-text-primary, #0f172a);box-shadow:0 1px 2px #0000001a}.format-tab-btn:hover:not(.is-active){color:var(--talos-text-primary, #0f172a)}.channel-inputs-grid{display:flex;align-items:center;gap:.375rem}.input-field-group{flex:1;display:flex;flex-direction:column;align-items:center;gap:.125rem}.input-field-group.hex-field{flex:2.5}.input-field-group .channel-input{width:100%;height:1.75rem;padding:0 .25rem;font-size:var(--talos-font-size-xs, .75rem);font-weight:var(--talos-font-weight-medium, 500);font-family:inherit;text-align:center;color:var(--talos-text-primary, #0f172a);background-color:var(--talos-bg-subtle, #f1f5f9);border:1px solid var(--talos-border-default, #cbd5e1);border-radius:var(--talos-radius-xs, .25rem);outline:none;transition:border-color var(--talos-transition, .18s ease),box-shadow var(--talos-transition, .18s ease),background-color var(--talos-transition, .18s ease)}.input-field-group .channel-input::-webkit-inner-spin-button,.input-field-group .channel-input::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.input-field-group .channel-input{-moz-appearance:textfield}.input-field-group .channel-input:focus{border-color:var(--talos-primary, #2563eb);box-shadow:var(--talos-focus-ring, 0 0 0 3px rgba(37, 99, 235, .18));background-color:var(--talos-bg-surface, #ffffff)}.input-field-group .field-caption{font-size:.625rem;font-weight:var(--talos-font-weight-bold, 700);color:var(--talos-text-muted, #94a3b8);text-transform:uppercase}.presets-section,.recent-section{display:flex;flex-direction:column;gap:.375rem;border-top:1px solid var(--talos-border-subtle, #e2e8f0);padding-top:.5rem}.preset-group-title,.recent-group-title{font-size:var(--talos-font-size-2xs, .6875rem);font-weight:var(--talos-font-weight-semibold, 600);color:var(--talos-text-muted, #64748b)}.swatches-grid{display:grid;grid-template-columns:repeat(6,1fr);gap:.375rem}.swatch-btn{position:relative;aspect-ratio:1;border:1px solid var(--talos-border-default, rgba(0, 0, 0, .12));border-radius:var(--talos-radius-xs, .25rem);cursor:pointer;outline:none;padding:0;display:flex;align-items:center;justify-content:center;transition:transform .12s ease,box-shadow .12s ease}.swatch-btn:hover{transform:scale(1.12);z-index:2;box-shadow:0 2px 6px #00000040}.swatch-btn:focus-visible{box-shadow:0 0 0 2px var(--talos-primary, #2563eb)}.swatch-btn.is-selected{box-shadow:0 0 0 2px var(--talos-bg-surface, #ffffff),0 0 0 4px var(--talos-primary, #3b82f6);z-index:1}.swatch-btn .swatch-check-icon{color:#fff;filter:drop-shadow(0 0 1.5px rgba(0,0,0,.8))}@keyframes tcp-slide-in{0%{opacity:0;transform:translateY(-4px) scale(.98)}to{opacity:1;transform:translateY(0) scale(1)}}@keyframes tcp-scale-up{0%{transform:scale(.7)}50%{transform:scale(1.2)}to{transform:scale(1)}}\n"], dependencies: [{ kind: "ngmodule", type: OverlayModule }, { kind: "directive", type: i1.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation", "cdkConnectedOverlayUsePopover", "cdkConnectedOverlayMatchWidth", "cdkConnectedOverlay"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i1.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NumberValueAccessor, selector: "input[type=number]:not([ngNoCva])[formControlName],input[type=number]:not([ngNoCva])[formControl],input[type=number]:not([ngNoCva])[ngModel]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i2.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] });
|
|
704
|
-
}
|
|
705
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.1", ngImport: i0, type: TalosColorPickerComponent, decorators: [{
|
|
706
|
-
type: Component,
|
|
707
|
-
args: [{ selector: 'talos-color-picker', imports: [OverlayModule, CdkConnectedOverlay, CdkOverlayOrigin, FormsModule, NgTemplateOutlet], providers: [
|
|
708
|
-
{
|
|
709
|
-
provide: NG_VALUE_ACCESSOR,
|
|
710
|
-
useExisting: forwardRef(() => TalosColorPickerComponent),
|
|
711
|
-
multi: true
|
|
712
|
-
}
|
|
713
|
-
], host: {
|
|
714
|
-
'class': 'talos-color-picker-host',
|
|
715
|
-
'[class.is-open]': 'isOpen()',
|
|
716
|
-
'[class.is-inline]': 'inline()',
|
|
717
|
-
'[class.is-disabled]': 'effectiveDisabled()',
|
|
718
|
-
'[class.is-readonly]': 'readonly()',
|
|
719
|
-
'[class.has-label]': '!!label()',
|
|
720
|
-
'[class.is-floating]': 'floatingLabel()',
|
|
721
|
-
'[class.is-floated]': 'isFloated()',
|
|
722
|
-
'[class.color-picker-sm]': 'size() === "sm"',
|
|
723
|
-
'[class.color-picker-md]': 'size() === "md"',
|
|
724
|
-
'[class.color-picker-lg]': 'size() === "lg"'
|
|
725
|
-
}, template: "@if (!inline()) {\n<!-- Standard Trigger Button / Popover Mode -->\n<div class=\"talos-color-picker-wrapper\" [class.is-floating]=\"floatingLabel()\">\n @if (label() && !floatingLabel()) {\n <label [for]=\"inputId()\" class=\"talos-field-label\">{{ label() }}</label>\n }\n\n <div #triggerBtn cdkOverlayOrigin #origin=\"cdkOverlayOrigin\" class=\"talos-color-picker-trigger\"\n [class.is-focused]=\"isOpen()\" [class.is-disabled]=\"effectiveDisabled()\"\n [attr.tabindex]=\"effectiveDisabled() ? -1 : 0\" [attr.role]=\"'button'\" [attr.aria-haspopup]=\"'dialog'\"\n [attr.aria-expanded]=\"isOpen()\" [attr.aria-label]=\"label() || placeholder()\" (click)=\"toggleDropdown()\"\n (keydown.enter)=\"toggleDropdown()\" (keydown.space)=\"toggleDropdown()\">\n\n <!-- Swatch Pill Preview -->\n <div class=\"swatch-preview-box\" role=\"button\" tabindex=\"-1\" aria-label=\"Open color palette\" (click)=\"toggleDropdown($event)\">\n <div class=\"swatch-checkerboard\"></div>\n <div class=\"swatch-fill\" [style.background-color]=\"rgbaString()\"></div>\n </div>\n\n <!-- Color Value Input Field -->\n <input\n #triggerInput\n [id]=\"inputId()\"\n type=\"text\"\n class=\"color-picker-input\"\n [value]=\"isInputFocused() ? manualInputValue() : formattedColor()\"\n [placeholder]=\"floatingLabel() && !isFloated() ? '' : placeholder()\"\n [disabled]=\"effectiveDisabled()\"\n [readonly]=\"readonly()\"\n (input)=\"onTriggerInput($event)\"\n (focus)=\"onTriggerFocus()\"\n (blur)=\"onTriggerBlur($event)\"\n (keydown.enter)=\"onTriggerEnter($event)\"\n [attr.aria-label]=\"label() || placeholder()\"\n />\n\n <!-- Clear Button -->\n @if (clearable() && formattedColor() && !effectiveDisabled() && !readonly()) {\n <button type=\"button\" class=\"clear-button\" aria-label=\"Clear color\" (click)=\"clear($event)\">\n <svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" stroke=\"currentColor\" stroke-width=\"2\" fill=\"none\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\n </svg>\n </button>\n }\n\n <!-- Dropdown Chevron Indicator -->\n <button type=\"button\" class=\"dropdown-chevron-icon\" [class.is-rotated]=\"isOpen()\"\n aria-label=\"Toggle color palette\" tabindex=\"-1\" (click)=\"toggleDropdown($event)\">\n <svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" stroke=\"currentColor\" stroke-width=\"2\" fill=\"none\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <polyline points=\"6 9 12 15 18 9\"></polyline>\n </svg>\n </button>\n\n @if (label() && floatingLabel()) {\n <label [for]=\"inputId()\" class=\"talos-floating-label\" [class.is-floated]=\"isFloated()\">{{ label() }}</label>\n }\n </div>\n\n <!-- CDK Connected Popover Overlay -->\n <ng-template cdkConnectedOverlay [cdkConnectedOverlayOrigin]=\"origin\" [cdkConnectedOverlayOpen]=\"isOpen()\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\" (overlayOutsideClick)=\"close()\" (detach)=\"close()\">\n <div class=\"talos-color-picker-panel talos-popover-panel\" (click)=\"$event.stopPropagation()\">\n <ng-container *ngTemplateOutlet=\"pickerContentTpl\"></ng-container>\n </div>\n </ng-template>\n</div>\n} @else {\n<!-- Inline / Embedded Mode -->\n<div class=\"talos-color-picker-panel talos-inline-panel\">\n @if (label()) {\n <div class=\"panel-header-title\">{{ label() }}</div>\n }\n <ng-container *ngTemplateOutlet=\"pickerContentTpl\"></ng-container>\n</div>\n}\n\n<!-- Main Color Picker Content Template -->\n<ng-template #pickerContentTpl>\n <div class=\"picker-inner-container\">\n\n <!-- 1. Saturation & Value 2D Canvas -->\n <div #satValCanvas class=\"sat-val-canvas\" [style.background-color]=\"pureHueHex()\" tabindex=\"0\" role=\"slider\"\n aria-label=\"Color saturation and brightness\"\n [attr.aria-valuetext]=\"'Saturation ' + currentHsva().s + '%, Brightness ' + currentHsva().v + '%'\"\n (mousedown)=\"onSatValMouseDown($event)\" (touchstart)=\"onSatValTouchStart($event)\"\n (keydown)=\"onSatValKeyDown($event)\">\n <div class=\"sat-gradient-white\"></div>\n <div class=\"val-gradient-black\"></div>\n\n <!-- Handle Pin -->\n <div class=\"sat-val-handle\" [class.is-light-handle]=\"!isLight()\" [style.left.%]=\"currentHsva().s\"\n [style.top.%]=\"100 - currentHsva().v\" [style.background-color]=\"rgbaString()\">\n </div>\n </div>\n\n <!-- 2. Sliders & Action Bar -->\n <div class=\"sliders-action-bar\">\n <!-- Sliders Column -->\n <div class=\"sliders-column\">\n <!-- Hue Rainbow Slider Track -->\n <div #hueTrack class=\"hue-slider-track\" tabindex=\"0\" role=\"slider\" aria-label=\"Hue spectrum\" aria-valuemin=\"0\"\n aria-valuemax=\"360\" [attr.aria-valuenow]=\"currentHsva().h\" (mousedown)=\"onHueMouseDown($event)\"\n (touchstart)=\"onHueTouchStart($event)\" (keydown)=\"onHueKeyDown($event)\">\n <div class=\"slider-thumb\" [style.left.%]=\"(currentHsva().h / 360) * 100\"\n [style.background-color]=\"pureHueHex()\">\n </div>\n </div>\n\n <!-- Alpha Opacity Slider Track -->\n @if (showAlpha()) {\n <div #alphaTrack class=\"alpha-slider-track\" tabindex=\"0\" role=\"slider\" aria-label=\"Color opacity\"\n aria-valuemin=\"0\" aria-valuemax=\"1\" [attr.aria-valuenow]=\"currentHsva().a\"\n (mousedown)=\"onAlphaMouseDown($event)\" (touchstart)=\"onAlphaTouchStart($event)\"\n (keydown)=\"onAlphaKeyDown($event)\">\n <div class=\"alpha-checkerboard-bg\"></div>\n <div class=\"alpha-gradient-overlay\"\n [style.background]=\"'linear-gradient(to right, transparent, ' + pureHueHex() + ')'\">\n </div>\n <div class=\"slider-thumb\" [style.left.%]=\"currentHsva().a * 100\" [style.background-color]=\"rgbaString()\">\n </div>\n </div>\n }\n </div>\n\n <!-- Action & Preview Column -->\n <div class=\"action-preview-column\">\n <!-- Color Preview Circle -->\n <div class=\"swatch-circle-preview\" [title]=\"formattedColor()\">\n <div class=\"swatch-checkerboard\"></div>\n <div class=\"swatch-fill\" [style.background-color]=\"rgbaString()\"></div>\n </div>\n\n <!-- Quick Action Buttons -->\n <div class=\"quick-actions-row\">\n @if (showEyeDropper() && hasEyeDropper()) {\n <button type=\"button\" class=\"icon-action-button\" title=\"Pick color from screen\"\n aria-label=\"Pick color from screen\" (click)=\"pickWithEyeDropper()\">\n <svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path\n d=\"m12 9-8.414 8.414A2 2 0 0 0 3 18.828v1.344a2 2 0 0 1-.586 1.414A2 2 0 0 1 3.828 21h1.344a2 2 0 0 0 1.414-.586L15 12\" />\n <path d=\"m18 9 .4.4a1 1 0 1 1-3 3l-3.8-3.8a1 1 0 1 1 3-3l.4.4 3.4-3.4a1 1 0 1 1 3 3z\" />\n <path d=\"m2 22 .414-.414\" />\n </svg>\n </button>\n }\n\n <button type=\"button\" class=\"icon-action-button\" [class.is-copied]=\"copied()\"\n [title]=\"copied() ? 'Copied to clipboard!' : 'Copy color string'\" aria-label=\"Copy color string\"\n (click)=\"copyColor()\">\n @if (copied()) {\n <svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" stroke=\"currentColor\" stroke-width=\"2\" fill=\"none\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"copy-success-icon\">\n <polyline points=\"20 6 9 17 4 12\"></polyline>\n </svg>\n } @else {\n <svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" stroke=\"currentColor\" stroke-width=\"2\" fill=\"none\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"></rect>\n <path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"></path>\n </svg>\n }\n </button>\n </div>\n </div>\n </div>\n\n <!-- 3. Format Switcher & Channel Inputs -->\n @if (showInputs()) {\n <div class=\"inputs-section\">\n @if (showFormatSwitcher()) {\n <div class=\"format-tabs-bar\">\n <button type=\"button\" class=\"format-tab-btn\" [class.is-active]=\"currentFormat() === 'hex'\"\n (click)=\"switchFormat('hex')\">\n HEX\n </button>\n <button type=\"button\" class=\"format-tab-btn\" [class.is-active]=\"currentFormat() === 'rgb'\"\n (click)=\"switchFormat('rgb')\">\n RGB\n </button>\n <button type=\"button\" class=\"format-tab-btn\" [class.is-active]=\"currentFormat() === 'hsl'\"\n (click)=\"switchFormat('hsl')\">\n HSL\n </button>\n </div>\n }\n\n <!-- Channel Inputs Grid -->\n <div class=\"channel-inputs-grid\">\n @if (currentFormat() === 'hex') {\n <!-- HEX Input -->\n <div class=\"input-field-group hex-field\">\n <input type=\"text\" class=\"channel-input hex-input\" [ngModel]=\"inputHex()\"\n (ngModelChange)=\"onHexInputChange($event)\" placeholder=\"#3B82F6\" aria-label=\"Hex color value\" />\n <span class=\"field-caption\">HEX</span>\n </div>\n } @else if (currentFormat() === 'rgb') {\n <!-- RGB Inputs -->\n <div class=\"input-field-group\">\n <input type=\"number\" min=\"0\" max=\"255\" class=\"channel-input\" [(ngModel)]=\"inputR\"\n (ngModelChange)=\"onRgbaInputChange()\" aria-label=\"Red\" />\n <span class=\"field-caption\">R</span>\n </div>\n <div class=\"input-field-group\">\n <input type=\"number\" min=\"0\" max=\"255\" class=\"channel-input\" [(ngModel)]=\"inputG\"\n (ngModelChange)=\"onRgbaInputChange()\" aria-label=\"Green\" />\n <span class=\"field-caption\">G</span>\n </div>\n <div class=\"input-field-group\">\n <input type=\"number\" min=\"0\" max=\"255\" class=\"channel-input\" [(ngModel)]=\"inputB\"\n (ngModelChange)=\"onRgbaInputChange()\" aria-label=\"Blue\" />\n <span class=\"field-caption\">B</span>\n </div>\n } @else if (currentFormat() === 'hsl') {\n <!-- HSL Inputs -->\n <div class=\"input-field-group\">\n <input type=\"number\" min=\"0\" max=\"360\" class=\"channel-input\" [(ngModel)]=\"inputH\"\n (ngModelChange)=\"onHslaInputChange()\" aria-label=\"Hue\" />\n <span class=\"field-caption\">H</span>\n </div>\n <div class=\"input-field-group\">\n <input type=\"number\" min=\"0\" max=\"100\" class=\"channel-input\" [(ngModel)]=\"inputS\"\n (ngModelChange)=\"onHslaInputChange()\" aria-label=\"Saturation\" />\n <span class=\"field-caption\">S%</span>\n </div>\n <div class=\"input-field-group\">\n <input type=\"number\" min=\"0\" max=\"100\" class=\"channel-input\" [(ngModel)]=\"inputL\"\n (ngModelChange)=\"onHslaInputChange()\" aria-label=\"Lightness\" />\n <span class=\"field-caption\">L%</span>\n </div>\n }\n\n <!-- Alpha Input (Common for all non-hex or with alpha) -->\n @if (showAlpha()) {\n <div class=\"input-field-group alpha-field\">\n <input type=\"number\" min=\"0\" max=\"100\" class=\"channel-input\" [(ngModel)]=\"inputA\"\n (ngModelChange)=\"currentFormat() === 'hsl' ? onHslaInputChange() : onRgbaInputChange()\"\n aria-label=\"Opacity Percentage\" />\n <span class=\"field-caption\">A%</span>\n </div>\n }\n </div>\n </div>\n }\n\n <!-- 4. Preset Color Swatches -->\n @if (showPresets() && normalizedPresets().length > 0) {\n <div class=\"presets-section\">\n @for (group of normalizedPresets(); track group.label) {\n @if (normalizedPresets().length > 1) {\n <div class=\"preset-group-title\">{{ group.label }}</div>\n }\n <div class=\"swatches-grid\">\n @for (color of group.colors; track color) {\n <button type=\"button\" class=\"swatch-btn\"\n [class.is-selected]=\"currentHex().toLowerCase() === color.toLowerCase()\" [style.background-color]=\"color\"\n [title]=\"color\" [attr.aria-label]=\"'Select preset color ' + color\" (click)=\"selectPreset(color)\">\n @if (currentHex().toLowerCase() === color.toLowerCase()) {\n <svg viewBox=\"0 0 24 24\" width=\"12\" height=\"12\" stroke=\"currentColor\" stroke-width=\"3\" fill=\"none\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"swatch-check-icon\">\n <polyline points=\"20 6 9 17 4 12\"></polyline>\n </svg>\n }\n </button>\n }\n </div>\n }\n </div>\n }\n\n <!-- 5. Recent Colors -->\n @if (showRecent() && recentColors().length > 0) {\n <div class=\"recent-section\">\n <div class=\"recent-group-title\">Recent Colors</div>\n <div class=\"swatches-grid recent-grid\">\n @for (color of recentColors(); track color) {\n <button type=\"button\" class=\"swatch-btn\"\n [class.is-selected]=\"currentHex().toLowerCase() === color.toLowerCase()\" [style.background-color]=\"color\"\n [title]=\"color\" [attr.aria-label]=\"'Select recent color ' + color\" (click)=\"selectPreset(color)\">\n </button>\n }\n </div>\n </div>\n }\n\n </div>\n</ng-template>", styles: [":host{display:inline-block;position:relative;width:100%;max-width:100%;font-family:inherit;box-sizing:border-box}:host *,:host *:before,:host *:after{box-sizing:border-box}:host.color-picker-sm{--talos-control-height: var(--talos-height-sm, 2rem);--tcp-width: 250px;--tcp-canvas-height: 130px;--tcp-font-size: var(--talos-font-size-xs, .75rem)}:host.color-picker-md{--talos-control-height: var(--talos-height-md, 2.25rem);--tcp-width: 280px;--tcp-canvas-height: 150px;--tcp-font-size: var(--talos-font-size-sm, .8125rem)}:host.color-picker-lg{--talos-control-height: var(--talos-height-lg, 2.625rem);--tcp-width: 310px;--tcp-canvas-height: 170px;--tcp-font-size: var(--talos-font-size-md, .875rem)}.talos-field-label{display:inline-flex;align-items:center;font-size:var(--talos-control-font-size, .8125rem);font-weight:var(--talos-font-weight-semibold, 600);color:var(--talos-text-primary, #0f172a);margin-bottom:.375rem;cursor:pointer;-webkit-user-select:none;user-select:none;transition:color var(--talos-transition, .18s ease)}.talos-field-label .required-star{color:var(--talos-error-color, #ef4444);margin-left:.25rem}.talos-color-picker-wrapper{position:relative;width:100%;display:flex;flex-direction:column}.talos-color-picker-trigger{position:relative;display:flex;align-items:center;gap:.625rem;width:100%;height:var(--talos-control-height, 2.25rem);min-height:var(--talos-control-height, 2.25rem);padding:0 var(--talos-control-padding-x, .625rem);background-color:var(--talos-input-bg, var(--talos-bg-surface, #ffffff));border:1px solid var(--talos-input-border, var(--talos-border-default, #cbd5e1));border-radius:var(--talos-border-radius, var(--talos-radius-md, .375rem));color:var(--talos-input-color, var(--talos-text-primary, #0f172a));font-size:var(--talos-control-font-size, .8125rem);cursor:text;outline:none;-webkit-user-select:none;user-select:none;transition:border-color var(--talos-transition, .18s ease),box-shadow var(--talos-transition, .18s ease),background-color var(--talos-transition, .18s ease)}.talos-color-picker-trigger:hover:not(.is-disabled){border-color:var(--talos-input-border-hover, var(--talos-border-hover, #94a3b8))}.talos-color-picker-trigger:focus-within,.talos-color-picker-trigger.is-focused,.talos-color-picker-trigger:focus-visible{border-color:var(--talos-input-border-focus, var(--talos-primary, #2563eb));box-shadow:var(--talos-focus-ring, 0 0 0 3px rgba(37, 99, 235, .18))}.talos-color-picker-trigger.is-disabled{background-color:var(--talos-input-disabled-bg, var(--talos-bg-subtle, #f1f5f9));border-color:var(--talos-input-disabled-border, var(--talos-border-subtle, #e2e8f0));color:var(--talos-input-disabled-color, var(--talos-text-muted, #94a3b8));cursor:not-allowed;opacity:.65}.swatch-preview-box{position:relative;width:1.1rem;height:1.1rem;min-width:1.1rem;border-radius:var(--talos-radius-xs, .25rem);overflow:hidden;border:1px solid var(--talos-border-default, rgba(0, 0, 0, .15));box-shadow:inset 0 0 2px #0000001a;cursor:pointer;flex-shrink:0;transition:transform .12s ease}.swatch-preview-box:hover{transform:scale(1.08)}.swatch-checkerboard,.alpha-checkerboard-bg{position:absolute;inset:0;background-image:linear-gradient(45deg,var(--talos-border-default, #cbd5e1) 25%,transparent 25%),linear-gradient(-45deg,var(--talos-border-default, #cbd5e1) 25%,transparent 25%),linear-gradient(45deg,transparent 75%,var(--talos-border-default, #cbd5e1) 75%),linear-gradient(-45deg,transparent 75%,var(--talos-border-default, #cbd5e1) 75%);background-size:8px 8px;background-position:0 0,0 4px,4px -4px,-4px 0px;background-color:var(--talos-bg-surface, #ffffff)}.swatch-fill{position:absolute;inset:0;transition:background-color .1s ease}.color-picker-input{flex:1;min-width:0;width:100%;height:100%;background:transparent;border:none;outline:none;padding:0;margin:0;font-family:inherit;font-size:var(--talos-control-font-size, .8125rem);font-weight:var(--talos-font-weight-medium, 500);font-variant-numeric:tabular-nums;letter-spacing:.02em;color:var(--talos-input-color, var(--talos-text-primary, #0f172a));line-height:normal}.color-picker-input::placeholder{color:var(--talos-input-placeholder-color, var(--talos-text-muted, #94a3b8));opacity:1;font-weight:var(--talos-font-weight-normal, 400)}.color-picker-input:disabled{cursor:not-allowed}.clear-button{display:inline-flex;align-items:center;justify-content:center;background:transparent;border:none;padding:.25rem;color:var(--talos-text-muted, #94a3b8);border-radius:var(--talos-radius-full, 9999px);cursor:pointer;transition:color var(--talos-transition, .18s ease),background-color var(--talos-transition, .18s ease)}.clear-button:hover{color:var(--talos-error-color, #ef4444);background-color:#ef444426}.dropdown-chevron-icon{display:inline-flex;align-items:center;justify-content:center;background:transparent;border:none;padding:0;color:var(--talos-text-muted, #94a3b8);cursor:pointer;transition:transform var(--talos-transition, .18s cubic-bezier(.4, 0, .2, 1)),color var(--talos-transition, .18s ease)}.dropdown-chevron-icon.is-rotated{transform:rotate(180deg);color:var(--talos-primary, #2563eb)}.dropdown-chevron-icon:hover{color:var(--talos-text-primary, #0f172a)}.talos-floating-label{position:absolute;left:calc(var(--talos-control-padding-x, .625rem) + 1.375rem + .625rem);top:50%;transform:translateY(-50%);font-size:var(--talos-control-font-size, .8125rem);font-weight:var(--talos-font-weight-medium, 500);color:var(--talos-input-placeholder-color, var(--talos-text-muted, #94a3b8));pointer-events:none;-webkit-user-select:none;user-select:none;background-color:var(--talos-input-bg, var(--talos-bg-surface, #ffffff));padding:0 .25rem;border-radius:var(--talos-radius-xs, .25rem);line-height:1;z-index:2;transition:transform var(--talos-transition, .18s cubic-bezier(.4, 0, .2, 1)),font-size var(--talos-transition, .18s cubic-bezier(.4, 0, .2, 1)),color var(--talos-transition, .18s cubic-bezier(.4, 0, .2, 1)),top var(--talos-transition, .18s cubic-bezier(.4, 0, .2, 1)),left var(--talos-transition, .18s cubic-bezier(.4, 0, .2, 1))}.talos-floating-label.is-floated{top:0;left:var(--talos-control-padding-x, .625rem);transform:translateY(-50%) scale(.85);font-size:.75rem;font-weight:var(--talos-font-weight-semibold, 600);color:var(--talos-text-muted, #64748b)}:host(.is-open) .talos-floating-label.is-floated,:host(.is-floated) .talos-floating-label.is-floated,.talos-color-picker-trigger:focus-within .talos-floating-label.is-floated,.talos-color-picker-trigger.is-focused .talos-floating-label.is-floated{color:var(--talos-primary, #2563eb)}.talos-color-picker-panel{width:var(--tcp-width, 280px);max-width:calc(100vw - 2rem);background-color:var(--talos-dropdown-bg, var(--talos-bg-surface, #ffffff));border:1px solid var(--talos-dropdown-border, var(--talos-border-default, #cbd5e1));border-radius:var(--talos-border-radius, var(--talos-radius-lg, .5rem));overflow:hidden;box-sizing:border-box}.talos-color-picker-panel.talos-popover-panel{box-shadow:var(--talos-dropdown-shadow, var(--talos-shadow-dropdown, 0 16px 32px -4px rgba(0, 0, 0, .25)));-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);animation:tcp-slide-in var(--talos-transition, .18s cubic-bezier(.16, 1, .3, 1));z-index:1050}.talos-color-picker-panel.talos-inline-panel{box-shadow:var(--talos-shadow-xs, 0 1px 2px rgba(0, 0, 0, .05))}.talos-color-picker-panel .panel-header-title{padding:.75rem .875rem 0;font-size:var(--talos-control-font-size, .8125rem);font-weight:var(--talos-font-weight-semibold, 600);color:var(--talos-text-primary, #0f172a)}.picker-inner-container{display:flex;flex-direction:column;padding:.75rem;gap:.75rem}.sat-val-canvas{position:relative;width:100%;height:var(--tcp-canvas-height, 150px);border-radius:calc(var(--talos-border-radius, var(--talos-radius-md, .375rem)) - 1px);overflow:hidden;cursor:crosshair;outline:none;-webkit-user-select:none;user-select:none;touch-action:none;box-shadow:inset 0 0 1px #0000004d}.sat-val-canvas:focus-visible{box-shadow:0 0 0 2px var(--talos-primary, #2563eb),inset 0 0 1px #0000004d}.sat-gradient-white{position:absolute;inset:0;background:linear-gradient(to right,#ffffff,transparent)}.val-gradient-black{position:absolute;inset:0;background:linear-gradient(to top,#000000,transparent)}.sat-val-handle{position:absolute;width:14px;height:14px;border-radius:var(--talos-radius-full, 9999px);border:2px solid #ffffff;box-shadow:0 0 2px #0009,inset 0 0 1px #0006;transform:translate(-50%,-50%);pointer-events:none;transition:transform .05s ease}.sat-val-handle.is-light-handle{border-color:#0f172a}.sliders-action-bar{display:flex;align-items:center;gap:.625rem}.sliders-column{flex:1;display:flex;flex-direction:column;gap:.5rem}.hue-slider-track,.alpha-slider-track{position:relative;width:100%;height:.75rem;border-radius:var(--talos-radius-full, 9999px);cursor:pointer;outline:none;-webkit-user-select:none;user-select:none;touch-action:none}.hue-slider-track:focus-visible,.alpha-slider-track:focus-visible{box-shadow:0 0 0 2px var(--talos-primary, #2563eb)}.hue-slider-track{background:linear-gradient(to right,red,#ff0 17%,#0f0 33%,#0ff,#00f 67%,#f0f 83%,red)}.alpha-slider-track{overflow:hidden}.alpha-slider-track .alpha-gradient-overlay{position:absolute;inset:0;border-radius:var(--talos-radius-full, 9999px)}.slider-thumb{position:absolute;top:50%;width:14px;height:14px;border-radius:var(--talos-radius-full, 9999px);border:2px solid #ffffff;box-shadow:0 1px 3px #0006;transform:translate(-50%,-50%);pointer-events:none}.action-preview-column{display:flex;flex-direction:column;align-items:center;gap:.375rem}.swatch-circle-preview{position:relative;width:1.75rem;height:1.75rem;border-radius:var(--talos-radius-full, 9999px);overflow:hidden;border:1px solid var(--talos-border-default, rgba(0, 0, 0, .15));box-shadow:var(--talos-shadow-xs, 0 1px 2px rgba(0, 0, 0, .05))}.quick-actions-row{display:flex;align-items:center;gap:.25rem}.icon-action-button{display:inline-flex;align-items:center;justify-content:center;width:1.625rem;height:1.625rem;padding:0;background-color:transparent;border:1px solid transparent;border-radius:var(--talos-radius-sm, .25rem);color:var(--talos-text-muted, #94a3b8);cursor:pointer;transition:all var(--talos-transition, .18s ease)}.icon-action-button:hover{color:var(--talos-text-primary, #0f172a);background-color:var(--talos-bg-subtle, #f1f5f9);border-color:var(--talos-border-subtle, #e2e8f0)}.icon-action-button.is-copied{color:var(--talos-success, #16a34a)}.icon-action-button .copy-success-icon{animation:tcp-scale-up .2s ease}.inputs-section{display:flex;flex-direction:column;gap:.5rem}.format-tabs-bar{display:flex;align-items:center;background-color:var(--talos-bg-subtle, #f1f5f9);padding:2px;border-radius:var(--talos-radius-md, .375rem);gap:2px;border:1px solid var(--talos-border-subtle, rgba(0, 0, 0, .04))}.format-tab-btn{flex:1;padding:.25rem 0;font-size:var(--talos-font-size-2xs, .6875rem);font-weight:var(--talos-font-weight-semibold, 600);letter-spacing:.03em;background:transparent;border:none;border-radius:var(--talos-radius-xs, .25rem);color:var(--talos-text-muted, #94a3b8);cursor:pointer;transition:all var(--talos-transition, .18s ease)}.format-tab-btn.is-active{background-color:var(--talos-bg-surface, #ffffff);color:var(--talos-text-primary, #0f172a);box-shadow:0 1px 2px #0000001a}.format-tab-btn:hover:not(.is-active){color:var(--talos-text-primary, #0f172a)}.channel-inputs-grid{display:flex;align-items:center;gap:.375rem}.input-field-group{flex:1;display:flex;flex-direction:column;align-items:center;gap:.125rem}.input-field-group.hex-field{flex:2.5}.input-field-group .channel-input{width:100%;height:1.75rem;padding:0 .25rem;font-size:var(--talos-font-size-xs, .75rem);font-weight:var(--talos-font-weight-medium, 500);font-family:inherit;text-align:center;color:var(--talos-text-primary, #0f172a);background-color:var(--talos-bg-subtle, #f1f5f9);border:1px solid var(--talos-border-default, #cbd5e1);border-radius:var(--talos-radius-xs, .25rem);outline:none;transition:border-color var(--talos-transition, .18s ease),box-shadow var(--talos-transition, .18s ease),background-color var(--talos-transition, .18s ease)}.input-field-group .channel-input::-webkit-inner-spin-button,.input-field-group .channel-input::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.input-field-group .channel-input{-moz-appearance:textfield}.input-field-group .channel-input:focus{border-color:var(--talos-primary, #2563eb);box-shadow:var(--talos-focus-ring, 0 0 0 3px rgba(37, 99, 235, .18));background-color:var(--talos-bg-surface, #ffffff)}.input-field-group .field-caption{font-size:.625rem;font-weight:var(--talos-font-weight-bold, 700);color:var(--talos-text-muted, #94a3b8);text-transform:uppercase}.presets-section,.recent-section{display:flex;flex-direction:column;gap:.375rem;border-top:1px solid var(--talos-border-subtle, #e2e8f0);padding-top:.5rem}.preset-group-title,.recent-group-title{font-size:var(--talos-font-size-2xs, .6875rem);font-weight:var(--talos-font-weight-semibold, 600);color:var(--talos-text-muted, #64748b)}.swatches-grid{display:grid;grid-template-columns:repeat(6,1fr);gap:.375rem}.swatch-btn{position:relative;aspect-ratio:1;border:1px solid var(--talos-border-default, rgba(0, 0, 0, .12));border-radius:var(--talos-radius-xs, .25rem);cursor:pointer;outline:none;padding:0;display:flex;align-items:center;justify-content:center;transition:transform .12s ease,box-shadow .12s ease}.swatch-btn:hover{transform:scale(1.12);z-index:2;box-shadow:0 2px 6px #00000040}.swatch-btn:focus-visible{box-shadow:0 0 0 2px var(--talos-primary, #2563eb)}.swatch-btn.is-selected{box-shadow:0 0 0 2px var(--talos-bg-surface, #ffffff),0 0 0 4px var(--talos-primary, #3b82f6);z-index:1}.swatch-btn .swatch-check-icon{color:#fff;filter:drop-shadow(0 0 1.5px rgba(0,0,0,.8))}@keyframes tcp-slide-in{0%{opacity:0;transform:translateY(-4px) scale(.98)}to{opacity:1;transform:translateY(0) scale(1)}}@keyframes tcp-scale-up{0%{transform:scale(.7)}50%{transform:scale(1.2)}to{transform:scale(1)}}\n"] }]
|
|
726
|
-
}], ctorParameters: () => [], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }], format: [{ type: i0.Input, args: [{ isSignal: true, alias: "format", required: false }] }], showAlpha: [{ type: i0.Input, args: [{ isSignal: true, alias: "showAlpha", required: false }] }], presets: [{ type: i0.Input, args: [{ isSignal: true, alias: "presets", required: false }] }], showPresets: [{ type: i0.Input, args: [{ isSignal: true, alias: "showPresets", required: false }] }], showRecent: [{ type: i0.Input, args: [{ isSignal: true, alias: "showRecent", required: false }] }], showEyeDropper: [{ type: i0.Input, args: [{ isSignal: true, alias: "showEyeDropper", required: false }] }], showInputs: [{ type: i0.Input, args: [{ isSignal: true, alias: "showInputs", required: false }] }], showFormatSwitcher: [{ type: i0.Input, args: [{ isSignal: true, alias: "showFormatSwitcher", required: false }] }], inline: [{ type: i0.Input, args: [{ isSignal: true, alias: "inline", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], readonly: [{ type: i0.Input, args: [{ isSignal: true, alias: "readonly", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], clearable: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearable", required: false }] }], floatingLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "floatingLabel", required: false }] }], id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: false }] }], colorChange: [{ type: i0.Output, args: ["colorChange"] }], colorDetailsChange: [{ type: i0.Output, args: ["colorDetailsChange"] }], formatChange: [{ type: i0.Output, args: ["formatChange"] }], opened: [{ type: i0.Output, args: ["opened"] }], closed: [{ type: i0.Output, args: ["closed"] }], cleared: [{ type: i0.Output, args: ["cleared"] }], satValCanvas: [{
|
|
727
|
-
type: ViewChild,
|
|
728
|
-
args: ['satValCanvas']
|
|
729
|
-
}], hueTrack: [{
|
|
730
|
-
type: ViewChild,
|
|
731
|
-
args: ['hueTrack']
|
|
732
|
-
}], alphaTrack: [{
|
|
733
|
-
type: ViewChild,
|
|
734
|
-
args: ['alphaTrack']
|
|
735
|
-
}], triggerBtn: [{
|
|
736
|
-
type: ViewChild,
|
|
737
|
-
args: ['triggerBtn']
|
|
738
|
-
}], triggerInput: [{
|
|
739
|
-
type: ViewChild,
|
|
740
|
-
args: ['triggerInput']
|
|
741
|
-
}] } });
|
|
742
|
-
|
|
743
|
-
class TalosColorPickerModule {
|
|
744
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.1", ngImport: i0, type: TalosColorPickerModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
745
|
-
static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "22.1.1", ngImport: i0, type: TalosColorPickerModule, imports: [TalosColorPickerComponent], exports: [TalosColorPickerComponent] });
|
|
746
|
-
static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "22.1.1", ngImport: i0, type: TalosColorPickerModule, imports: [TalosColorPickerComponent] });
|
|
747
|
-
}
|
|
748
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.1", ngImport: i0, type: TalosColorPickerModule, decorators: [{
|
|
749
|
-
type: NgModule,
|
|
750
|
-
args: [{
|
|
751
|
-
imports: [TalosColorPickerComponent],
|
|
752
|
-
exports: [TalosColorPickerComponent]
|
|
753
|
-
}]
|
|
754
|
-
}] });
|
|
755
|
-
|
|
756
|
-
/**
|
|
757
|
-
* Generated bundle index. Do not edit.
|
|
758
|
-
*/
|
|
759
|
-
|
|
760
|
-
export { DEFAULT_COLOR_PRESETS, TalosColorPickerComponent, TalosColorPickerModule };
|
|
761
|
-
//# sourceMappingURL=weeehaoooz-talos-ui-form-color-picker.mjs.map
|