@redvars/peacock 3.8.2 → 3.8.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/dist/assets/components.css.map +1 -1
  2. package/dist/assets/styles.css.map +1 -1
  3. package/dist/babel-DBsfpl3B.js +18 -0
  4. package/dist/babel-DBsfpl3B.js.map +1 -0
  5. package/dist/button-group.js +4 -4
  6. package/dist/button-group.js.map +1 -1
  7. package/dist/button.js +5 -5
  8. package/dist/card.js +22 -7
  9. package/dist/card.js.map +1 -1
  10. package/dist/code-highlighter.js +74 -11212
  11. package/dist/code-highlighter.js.map +1 -1
  12. package/dist/color-picker.js +701 -0
  13. package/dist/color-picker.js.map +1 -0
  14. package/dist/custom-elements-jsdocs.json +96 -3
  15. package/dist/custom-elements.json +1202 -576
  16. package/dist/estree-C2LDzX4U.js +47 -0
  17. package/dist/estree-C2LDzX4U.js.map +1 -0
  18. package/dist/fab.js +1 -3
  19. package/dist/fab.js.map +1 -1
  20. package/dist/html-D22sQuVy.js +27 -0
  21. package/dist/html-D22sQuVy.js.map +1 -0
  22. package/dist/icon-button.js +5 -5
  23. package/dist/index-_g_oLekF.js +14095 -0
  24. package/dist/index-_g_oLekF.js.map +1 -0
  25. package/dist/index.js +3 -2
  26. package/dist/index.js.map +1 -1
  27. package/dist/item.js +3 -2
  28. package/dist/item.js.map +1 -1
  29. package/dist/{list-D6JLh1uh.js → list-H0itjRte.js} +194 -20
  30. package/dist/list-H0itjRte.js.map +1 -0
  31. package/dist/list.js +2 -2
  32. package/dist/loader.js +6 -2
  33. package/dist/loader.js.map +1 -1
  34. package/dist/menu-item.js +103 -33
  35. package/dist/menu-item.js.map +1 -1
  36. package/dist/menu.js +4 -18
  37. package/dist/menu.js.map +1 -1
  38. package/dist/navigation-rail-item.js +21 -6
  39. package/dist/navigation-rail-item.js.map +1 -1
  40. package/dist/navigation-rail.js +22 -20
  41. package/dist/navigation-rail.js.map +1 -1
  42. package/dist/pierre-dark-DFWl0m-C.js +4 -0
  43. package/dist/pierre-dark-DFWl0m-C.js.map +1 -0
  44. package/dist/pierre-light-BEkAPImt.js +4 -0
  45. package/dist/pierre-light-BEkAPImt.js.map +1 -0
  46. package/dist/postcss-BhbitHaI.js +64 -0
  47. package/dist/postcss-BhbitHaI.js.map +1 -0
  48. package/dist/{select-Dwtk0RIU.js → select-CspawZ18.js} +13 -6
  49. package/dist/{select-Dwtk0RIU.js.map → select-CspawZ18.js.map} +1 -1
  50. package/dist/side-sheet.js +1 -1
  51. package/dist/side-sheet.js.map +1 -1
  52. package/dist/src/button/button-group/button-group.d.ts +4 -4
  53. package/dist/src/code-highlighter/code-highlighter.d.ts +2 -2
  54. package/dist/src/color-picker/color-picker.d.ts +85 -0
  55. package/dist/src/color-picker/index.d.ts +1 -0
  56. package/dist/src/index.d.ts +1 -0
  57. package/dist/src/item/item.d.ts +0 -1
  58. package/dist/src/list/list-item.d.ts +3 -1
  59. package/dist/src/list/list.d.ts +24 -0
  60. package/dist/src/menu/menu-item/menu-item.d.ts +1 -2
  61. package/dist/standalone-Ccq0tWwA.js +32 -0
  62. package/dist/standalone-Ccq0tWwA.js.map +1 -0
  63. package/dist/sub-menu.js +6 -1
  64. package/dist/sub-menu.js.map +1 -1
  65. package/dist/tsconfig.tsbuildinfo +1 -1
  66. package/package.json +1 -1
  67. package/readme.md +3 -3
  68. package/scss/mixin.scss +1 -0
  69. package/src/button/button/button-base.scss +2 -1
  70. package/src/button/button/button-layers.scss +2 -6
  71. package/src/button/button-group/button-group.ts +4 -4
  72. package/src/button/fab/fab.ts +0 -4
  73. package/src/card/card.scss +18 -5
  74. package/src/code-highlighter/code-highlighter.ts +94 -39
  75. package/src/color-picker/color-picker.scss +217 -0
  76. package/src/color-picker/color-picker.ts +478 -0
  77. package/src/color-picker/index.ts +1 -0
  78. package/src/index.ts +1 -0
  79. package/src/item/item.scss +3 -1
  80. package/src/item/item.ts +0 -1
  81. package/src/list/list-item.scss +5 -1
  82. package/src/list/list-item.ts +40 -14
  83. package/src/list/list.ts +164 -2
  84. package/src/loader.ts +4 -0
  85. package/src/menu/menu/menu.scss +4 -18
  86. package/src/menu/menu/menu.ts +0 -1
  87. package/src/menu/menu-item/menu-item.scss +73 -43
  88. package/src/menu/menu-item/menu-item.ts +60 -27
  89. package/src/menu/sub-menu/sub-menu.scss +5 -1
  90. package/src/navigation-rail/navigation-rail-item.scss +25 -8
  91. package/src/navigation-rail/navigation-rail.scss +25 -22
  92. package/src/side-sheet/side-sheet.ts +1 -1
  93. package/src/sidebar-menu/sidebar-menu-item.scss +12 -6
  94. package/dist/list-D6JLh1uh.js.map +0 -1
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@redvars/peacock",
3
3
  "description": "The foundation for beautiful user interfaces",
4
4
  "license": "Apache-2.0",
5
- "version": "3.8.2",
5
+ "version": "3.8.3",
6
6
  "type": "module",
7
7
  "main": "dist/index.js",
8
8
  "module": "dist/index.js",
package/readme.md CHANGED
@@ -44,9 +44,9 @@ Visit [https://peacock.redvars.com](https://peacock.redvars.com) to view the doc
44
44
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
45
45
  <link href="https://fonts.googleapis.com/css2?family=Noto+Sans+Mono:wght@100..900&family=Noto+Sans:ital,wght@0,100..900;1,100..900&display=swap" rel="stylesheet">
46
46
 
47
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@redvars/peacock@3.8.2/dist/assets/styles.css"></link>
47
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@redvars/peacock@3.8.3/dist/assets/styles.css"></link>
48
48
  <script type='module'
49
- src='https://cdn.jsdelivr.net/npm/@redvars/peacock@3.8.2/dist/loader.js'></script>
49
+ src='https://cdn.jsdelivr.net/npm/@redvars/peacock@3.8.3/dist/loader.js'></script>
50
50
  </head>
51
51
 
52
52
  <wc-button>Button</wc-button>
@@ -69,7 +69,7 @@ menus, checkboxes, and radio buttons.
69
69
  |---------------------------------------------------------------------|-----------------|-------|
70
70
  | [Checkbox](https://peacock.redvars.com/components/checkbox) | wc-checkbox | 🟢 |
71
71
  | [Code editor](https://peacock.redvars.com/components/code-editor) | wc-code-editor | 🟢 |
72
- | Color picker | color-picker | 🔴 |
72
+ | [Color picker](https://peacock.redvars.com/components/color-picker) | wc-color-picker | 🟡 |
73
73
  | [Date picker](https://peacock.redvars.com/components/date-picker) | wc-date-picker | 🟡 |
74
74
  | Date time picker | datetime-picker | 🔴 |
75
75
  | [Field / Form control](https://peacock.redvars.com/components/field) | wc-field | 🟡 |
package/scss/mixin.scss CHANGED
@@ -25,6 +25,7 @@
25
25
  text-decoration: none;
26
26
  color: inherit;
27
27
  cursor: pointer;
28
+ outline: none;
28
29
 
29
30
  &:link,
30
31
  &:visited,
@@ -51,7 +51,6 @@
51
51
  padding: 0
52
52
  var(--button-container-padding, var(--private-button-container-padding));
53
53
  width: 100%;
54
- z-index: 0;
55
54
 
56
55
  .label {
57
56
  font-family: var(--font-family-sans) !important;
@@ -63,6 +62,8 @@
63
62
 
64
63
  --icon-size: var(--button-icon-size, var(--private-button-icon-size));
65
64
  --icon-color: var(--private-button-label-text-color);
65
+ opacity: var(--private-button-label-text-opacity, 1);
66
+ display: inline-flex;
66
67
 
67
68
  pointer-events: none;
68
69
  }
@@ -71,7 +71,7 @@
71
71
  }
72
72
 
73
73
  .focus-ring {
74
- z-index: 2;
74
+ z-index: 1;
75
75
  pointer-events: none;
76
76
 
77
77
  --focus-ring-container-shape-start-start: var(
@@ -125,8 +125,6 @@
125
125
  inset: 0;
126
126
  pointer-events: none;
127
127
 
128
- z-index: 2;
129
-
130
128
  --skeleton-container-shape-start-start: var(
131
129
  --private-button-container-shape-start-start,
132
130
  var(--private-button-container-shape)
@@ -180,8 +178,6 @@
180
178
  inset: 0;
181
179
  pointer-events: none;
182
180
 
183
- z-index: 0;
184
-
185
181
  border: var(--private-button-outline-width) solid
186
182
  var(--private-button-outline-color);
187
183
  opacity: var(--private-button-outline-opacity, 1);
@@ -207,5 +203,5 @@
207
203
  }
208
204
 
209
205
  .tooltip {
210
- z-index: 3;
206
+ z-index: 1;
211
207
  }
@@ -14,14 +14,14 @@ import { IconButton } from '../icon-button/icon-button.js';
14
14
 
15
15
  * @example
16
16
  * ```html
17
- * <wc-button-group connected="true">
18
- * <wc-icon-button toggle="true" shaped="wide">
17
+ * <wc-button-group connected>
18
+ * <wc-icon-button toggle="true" shape="wide" selected>
19
19
  * <wc-icon name="format_bold"></wc-icon>
20
20
  * </wc-icon-button>
21
- * <wc-icon-button toggle="true" shaped="wide">
21
+ * <wc-icon-button toggle="true" shape="wide">
22
22
  * <wc-icon name="format_italic"></wc-icon>
23
23
  * </wc-icon-button>
24
- * <wc-icon-button toggle="true" shaped="wide">
24
+ * <wc-icon-button toggle="true" shape="wide">
25
25
  * <wc-icon name="format_underlined"></wc-icon>
26
26
  * </wc-icon-button>
27
27
  * </wc-button-group>
@@ -134,10 +134,6 @@ export class Fab extends mixinBaseButton(
134
134
  return;
135
135
  }
136
136
 
137
- if (this.toggle) {
138
- this.selected = !this.selected;
139
- }
140
-
141
137
  this.focus();
142
138
  dispatchActivationClick(this.buttonElement);
143
139
  };
@@ -13,10 +13,22 @@
13
13
  --card-container-shape-end-start: unset;
14
14
  --card-container-shape-end-end: unset;
15
15
 
16
- --_container-shape-start-start: var(--card-container-shape-start-start, var(--card-container-shape));
17
- --_container-shape-start-end: var(--card-container-shape-start-end, var(--card-container-shape));
18
- --_container-shape-end-start: var(--card-container-shape-end-start, var(--card-container-shape));
19
- --_container-shape-end-end: var(--card-container-shape-end-end, var(--card-container-shape));
16
+ --_container-shape-start-start: var(
17
+ --card-container-shape-start-start,
18
+ var(--card-container-shape)
19
+ );
20
+ --_container-shape-start-end: var(
21
+ --card-container-shape-start-end,
22
+ var(--card-container-shape)
23
+ );
24
+ --_container-shape-end-start: var(
25
+ --card-container-shape-end-start,
26
+ var(--card-container-shape)
27
+ );
28
+ --_container-shape-end-end: var(
29
+ --card-container-shape-end-end,
30
+ var(--card-container-shape)
31
+ );
20
32
  }
21
33
 
22
34
  /*
@@ -136,7 +148,8 @@
136
148
  corner-shape: var(--_container-corner-shape-variant);
137
149
  }
138
150
 
139
- :host([actionable]) {
151
+ :host([actionable]:not([disabled])),
152
+ :host([href]) {
140
153
  .focus-ring,
141
154
  .ripple {
142
155
  display: block;
@@ -2,22 +2,46 @@ import { html, LitElement } from 'lit';
2
2
  import { property, state } from 'lit/decorators.js';
3
3
  import { unsafeHTML } from 'lit/directives/unsafe-html.js';
4
4
  import { classMap } from 'lit/directives/class-map.js';
5
- import pierreDark from '@pierre/theme/pierre-dark';
6
- import pierreLight from '@pierre/theme/pierre-light';
7
-
8
- import prettier from 'prettier/standalone';
9
-
10
- import prettierPluginBabel from 'prettier/plugins/babel';
11
- import prettierPluginHtml from 'prettier/plugins/html';
12
- import prettierPluginPostcss from 'prettier/plugins/postcss';
13
- import * as prettierPluginEstree from 'prettier/plugins/estree';
14
-
15
- import { BundledLanguage, codeToHtml, ShikiTransformer } from 'shiki';
16
-
5
+ import type { BundledLanguage, ShikiTransformer } from 'shiki';
17
6
  import IndividualComponent from '@/IndividualComponent.js';
18
7
  import { copyToClipboard } from '@/__internal/utils/copy-to-clipboard.js';
19
8
  import styles from './code-highlighter.scss';
20
9
 
10
+ // Module-level promises – Rollup splits each import() specifier into a separate chunk.
11
+ // Caching here prevents parallel loads when multiple instances initialise at the same time.
12
+ let _shiki: Promise<typeof import('shiki')> | null = null;
13
+ let _themes: Promise<
14
+ [
15
+ typeof import('@pierre/theme/pierre-dark'),
16
+ typeof import('@pierre/theme/pierre-light'),
17
+ ]
18
+ > | null = null;
19
+ let _prettier: Promise<typeof import('prettier/standalone')> | null = null;
20
+ let _pluginBabel: Promise<typeof import('prettier/plugins/babel')> | null =
21
+ null;
22
+ let _pluginHtml: Promise<typeof import('prettier/plugins/html')> | null = null;
23
+ let _pluginPostcss: Promise<typeof import('prettier/plugins/postcss')> | null =
24
+ null;
25
+ let _pluginEstree: Promise<typeof import('prettier/plugins/estree')> | null =
26
+ null;
27
+
28
+ const loadShiki = () => (_shiki ??= import('shiki'));
29
+
30
+ const loadThemes = () =>
31
+ (_themes ??= Promise.all([
32
+ import('@pierre/theme/pierre-dark'),
33
+ import('@pierre/theme/pierre-light'),
34
+ ]));
35
+
36
+ const loadPrettier = () => (_prettier ??= import('prettier/standalone'));
37
+ const loadPluginBabel = () =>
38
+ (_pluginBabel ??= import('prettier/plugins/babel'));
39
+ const loadPluginHtml = () => (_pluginHtml ??= import('prettier/plugins/html'));
40
+ const loadPluginPostcss = () =>
41
+ (_pluginPostcss ??= import('prettier/plugins/postcss'));
42
+ const loadPluginEstree = () =>
43
+ (_pluginEstree ??= import('prettier/plugins/estree'));
44
+
21
45
  const locale = {
22
46
  loading: 'Loading code...',
23
47
  copyToClipboard: 'Copy to clipboard',
@@ -109,31 +133,48 @@ export class CodeHighlighter extends LitElement {
109
133
 
110
134
  codeString = this.decode(codeString);
111
135
 
112
- // eslint-disable-next-line default-case
113
- switch (this.language) {
114
- case 'javascript':
115
- codeString = await prettier.format(codeString, {
116
- parser: 'babel',
117
- plugins: [prettierPluginBabel, prettierPluginEstree],
118
- bracketSameLine: true,
119
- // Helps if you are writing HTML inside template literals
120
- htmlWhitespaceSensitivity: 'ignore',
121
- });
122
- break;
123
- case 'html':
124
- codeString = await prettier.format(codeString, {
125
- parser: 'html',
126
- plugins: [prettierPluginHtml],
127
- bracketSameLine: true,
128
- htmlWhitespaceSensitivity: 'ignore',
129
- });
130
- break;
131
- case 'css':
132
- codeString = await prettier.format(codeString, {
133
- parser: 'css',
134
- plugins: [prettierPluginPostcss],
135
- });
136
- break;
136
+ if (this.format !== false) {
137
+ // eslint-disable-next-line default-case
138
+ switch (this.language) {
139
+ case 'javascript': {
140
+ const [prettier, pluginBabel, pluginEstree] = await Promise.all([
141
+ loadPrettier(),
142
+ loadPluginBabel(),
143
+ loadPluginEstree(),
144
+ ]);
145
+ codeString = await prettier.format(codeString, {
146
+ parser: 'babel',
147
+ plugins: [pluginBabel, pluginEstree],
148
+ bracketSameLine: true,
149
+ htmlWhitespaceSensitivity: 'ignore',
150
+ });
151
+ break;
152
+ }
153
+ case 'html': {
154
+ const [prettier, pluginHtml] = await Promise.all([
155
+ loadPrettier(),
156
+ loadPluginHtml(),
157
+ ]);
158
+ codeString = await prettier.format(codeString, {
159
+ parser: 'html',
160
+ plugins: [pluginHtml],
161
+ bracketSameLine: true,
162
+ htmlWhitespaceSensitivity: 'ignore',
163
+ });
164
+ break;
165
+ }
166
+ case 'css': {
167
+ const [prettier, pluginPostcss] = await Promise.all([
168
+ loadPrettier(),
169
+ loadPluginPostcss(),
170
+ ]);
171
+ codeString = await prettier.format(codeString, {
172
+ parser: 'css',
173
+ plugins: [pluginPostcss],
174
+ });
175
+ break;
176
+ }
177
+ }
137
178
  }
138
179
 
139
180
  this.parsedCode = codeString;
@@ -152,6 +193,11 @@ export class CodeHighlighter extends LitElement {
152
193
  });
153
194
  }
154
195
 
196
+ const [
197
+ { codeToHtml },
198
+ [{ default: pierreDark }, { default: pierreLight }],
199
+ ] = await Promise.all([loadShiki(), loadThemes()]);
200
+
155
201
  this.compiledCode = await codeToHtml(codeString, {
156
202
  lang: this.language,
157
203
  themes: {
@@ -164,8 +210,17 @@ export class CodeHighlighter extends LitElement {
164
210
  });
165
211
  }
166
212
 
167
- protected updated() {
168
- this.__highlightCode();
213
+ protected updated(changed: Map<PropertyKey, unknown>) {
214
+ // Only re-highlight when the source content or rendering options change,
215
+ // not on unrelated state updates like the copy-button feedback toggle.
216
+ if (
217
+ changed.has('value') ||
218
+ changed.has('language') ||
219
+ changed.has('lineNumbers') ||
220
+ changed.has('format')
221
+ ) {
222
+ this.__highlightCode();
223
+ }
169
224
  }
170
225
 
171
226
  private async __handleCopyClick() {
@@ -0,0 +1,217 @@
1
+ :host {
2
+ --_sv-height: var(--color-picker-sv-height, 160px);
3
+ --_thumb-size: 16px;
4
+ --_track-height: 12px;
5
+ --_preview-size: 40px;
6
+ --_radius: 6px;
7
+
8
+ display: inline-block;
9
+ width: var(--color-picker-width, 240px);
10
+ touch-action: none;
11
+ }
12
+
13
+ .color-picker {
14
+ display: flex;
15
+ flex-direction: column;
16
+ gap: var(--spacing-100, 0.5rem);
17
+
18
+ &.disabled {
19
+ opacity: 0.38;
20
+ pointer-events: none;
21
+ }
22
+ }
23
+
24
+ // ── SV panel ──────────────────────────────────────────────────────────────────
25
+
26
+ .sv-panel {
27
+ position: relative;
28
+ width: 100%;
29
+ height: var(--_sv-height);
30
+ border-radius: var(--_radius);
31
+ // White-to-hue horizontal gradient, black overlay going downward
32
+ background:
33
+ linear-gradient(to bottom, transparent 0%, #000 100%),
34
+ linear-gradient(to right, #fff 0%, var(--hue-color) 100%);
35
+ cursor: crosshair;
36
+ user-select: none;
37
+ overflow: hidden;
38
+ }
39
+
40
+ .sv-cursor {
41
+ position: absolute;
42
+ width: var(--_thumb-size);
43
+ height: var(--_thumb-size);
44
+ border-radius: 50%;
45
+ border: 2px solid #fff;
46
+ box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.3), 0 2px 4px rgba(0, 0, 0, 0.3);
47
+ transform: translate(-50%, -50%);
48
+ outline: none;
49
+ cursor: crosshair;
50
+
51
+ &:focus-visible {
52
+ box-shadow: 0 0 0 2px #fff, 0 0 0 4px var(--color-primary);
53
+ }
54
+ }
55
+
56
+ // ── Controls row (preview + sliders) ─────────────────────────────────────────
57
+
58
+ .controls-row {
59
+ display: flex;
60
+ align-items: center;
61
+ gap: var(--spacing-200, 1rem);
62
+ }
63
+
64
+ .color-preview {
65
+ width: var(--_preview-size);
66
+ height: var(--_preview-size);
67
+ border-radius: 50%;
68
+ flex-shrink: 0;
69
+ overflow: hidden;
70
+ // Checkerboard backdrop (visible through transparent colors)
71
+ background: repeating-conic-gradient(#bbb 0% 25%, #fff 0% 50%) 0 0 / 8px 8px;
72
+ box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.12);
73
+ }
74
+
75
+ .preview-inner {
76
+ width: 100%;
77
+ height: 100%;
78
+ }
79
+
80
+ .sliders {
81
+ flex: 1;
82
+ display: flex;
83
+ flex-direction: column;
84
+ gap: var(--spacing-100, 0.5rem);
85
+ }
86
+
87
+ // ── Slider tracks ─────────────────────────────────────────────────────────────
88
+
89
+ .slider-track {
90
+ position: relative;
91
+ width: 100%;
92
+ height: var(--_track-height);
93
+ border-radius: calc(var(--_track-height) / 2);
94
+ cursor: pointer;
95
+ user-select: none;
96
+ }
97
+
98
+ .hue-track {
99
+ background: linear-gradient(
100
+ to right,
101
+ hsl(0, 100%, 50%),
102
+ hsl(60, 100%, 50%),
103
+ hsl(120, 100%, 50%),
104
+ hsl(180, 100%, 50%),
105
+ hsl(240, 100%, 50%),
106
+ hsl(300, 100%, 50%),
107
+ hsl(360, 100%, 50%)
108
+ );
109
+ }
110
+
111
+ .alpha-track {
112
+ // Color gradient over checkerboard
113
+ background:
114
+ linear-gradient(to right, transparent, var(--current-color, currentColor)),
115
+ repeating-conic-gradient(#bbb 0% 25%, #fff 0% 50%) 0 0 / 8px 8px;
116
+ }
117
+
118
+ // ── Slider thumb ──────────────────────────────────────────────────────────────
119
+
120
+ .slider-thumb {
121
+ position: absolute;
122
+ top: 50%;
123
+ width: var(--_thumb-size);
124
+ height: var(--_thumb-size);
125
+ border-radius: 50%;
126
+ background: #fff;
127
+ border: 2px solid rgba(0, 0, 0, 0.15);
128
+ box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);
129
+ transform: translate(-50%, -50%);
130
+ cursor: grab;
131
+ outline: none;
132
+ transition: box-shadow 0.15s ease;
133
+
134
+ &:focus-visible {
135
+ box-shadow: 0 0 0 2px #fff, 0 0 0 4px var(--color-primary);
136
+ }
137
+
138
+ &:active {
139
+ cursor: grabbing;
140
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.4);
141
+ }
142
+ }
143
+
144
+ // ── Inputs row ────────────────────────────────────────────────────────────────
145
+
146
+ .inputs-row {
147
+ display: flex;
148
+ align-items: center;
149
+ gap: var(--spacing-100, 0.5rem);
150
+ }
151
+
152
+ .hex-input-wrapper {
153
+ display: flex;
154
+ align-items: center;
155
+ flex: 1;
156
+ gap: var(--spacing-050, 0.25rem);
157
+ height: 32px;
158
+ padding: 0 8px;
159
+ border: 1px solid var(--color-outline-variant, #ccc);
160
+ border-radius: var(--_radius);
161
+ background: var(--color-surface-container-high, #ece6f0);
162
+ }
163
+
164
+ .hex-prefix {
165
+ color: var(--color-on-surface-variant, #666);
166
+ font-size: 13px;
167
+ flex-shrink: 0;
168
+ }
169
+
170
+ .input-label {
171
+ font-size: 11px;
172
+ font-weight: 500;
173
+ color: var(--color-on-surface-variant, #666);
174
+ flex-shrink: 0;
175
+ }
176
+
177
+ .hex-input {
178
+ flex: 1;
179
+ min-width: 0;
180
+ border: none;
181
+ background: transparent;
182
+ outline: none;
183
+ font-size: 13px;
184
+ font-family: var(--typography-mono-font-family, monospace);
185
+ color: var(--color-on-surface, #333);
186
+ }
187
+
188
+ .alpha-input-wrapper {
189
+ display: flex;
190
+ align-items: center;
191
+ gap: var(--spacing-050, 0.25rem);
192
+ height: 32px;
193
+ padding: 0 8px;
194
+ width: 64px;
195
+ flex-shrink: 0;
196
+ border: 1px solid var(--color-outline-variant, #ccc);
197
+ border-radius: var(--_radius);
198
+ background: var(--color-surface-container-high, #ece6f0);
199
+ }
200
+
201
+ .alpha-input {
202
+ flex: 1;
203
+ min-width: 0;
204
+ border: none;
205
+ background: transparent;
206
+ outline: none;
207
+ font-size: 13px;
208
+ color: var(--color-on-surface, #333);
209
+
210
+ // Hide browser spin buttons
211
+ &::-webkit-inner-spin-button,
212
+ &::-webkit-outer-spin-button {
213
+ appearance: none;
214
+ }
215
+
216
+ appearance: textfield;
217
+ }