@rovula/ui 0.1.40 → 0.1.42

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 (30) hide show
  1. package/dist/cjs/bundle.css +3 -0
  2. package/dist/cjs/bundle.js +4 -4
  3. package/dist/cjs/bundle.js.map +1 -1
  4. package/dist/cjs/types/components/AutoComplete/AutoComplete.d.ts +74 -0
  5. package/dist/cjs/types/components/AutoComplete/AutoComplete.stories.d.ts +361 -0
  6. package/dist/cjs/types/components/AutoComplete/index.d.ts +2 -0
  7. package/dist/cjs/types/index.d.ts +3 -0
  8. package/dist/components/AutoComplete/AutoComplete.js +103 -0
  9. package/dist/components/AutoComplete/AutoComplete.stories.js +212 -0
  10. package/dist/components/AutoComplete/index.js +1 -0
  11. package/dist/components/Dialog/Dialog.js +5 -1
  12. package/dist/components/TextInput/TextInput.js +2 -1
  13. package/dist/esm/bundle.css +3 -0
  14. package/dist/esm/bundle.js +4 -4
  15. package/dist/esm/bundle.js.map +1 -1
  16. package/dist/esm/types/components/AutoComplete/AutoComplete.d.ts +74 -0
  17. package/dist/esm/types/components/AutoComplete/AutoComplete.stories.d.ts +361 -0
  18. package/dist/esm/types/components/AutoComplete/index.d.ts +2 -0
  19. package/dist/esm/types/index.d.ts +3 -0
  20. package/dist/index.d.ts +75 -2
  21. package/dist/index.js +2 -0
  22. package/dist/src/theme/global.css +35 -31
  23. package/package.json +1 -1
  24. package/src/components/AutoComplete/AutoComplete.stories.tsx +525 -0
  25. package/src/components/AutoComplete/AutoComplete.tsx +374 -0
  26. package/src/components/AutoComplete/index.ts +2 -0
  27. package/src/components/Dialog/Dialog.tsx +4 -0
  28. package/src/components/TextInput/TextInput.tsx +13 -8
  29. package/src/index.ts +3 -0
  30. package/src/theme/themes/variable.css +31 -31
@@ -0,0 +1,374 @@
1
+ "use client";
2
+
3
+ import React, {
4
+ KeyboardEvent,
5
+ ReactNode,
6
+ forwardRef,
7
+ useCallback,
8
+ useRef,
9
+ useState,
10
+ } from "react";
11
+ import * as PopoverPrimitive from "@radix-ui/react-popover";
12
+ import TextInput, { type InputProps } from "../TextInput/TextInput";
13
+ import Loading from "../Loading/Loading";
14
+ import Text from "../Text/Text";
15
+ import Icon from "../Icon/Icon";
16
+ import { cn } from "@/utils/cn";
17
+ import { menuItemBaseStyles } from "../Dropdown/Dropdown";
18
+
19
+ // ---------------------------------------------------------------------------
20
+ // Types
21
+ // ---------------------------------------------------------------------------
22
+
23
+ export type AutoCompleteOption = {
24
+ value: string;
25
+ label: string;
26
+ };
27
+
28
+ /**
29
+ * InputProps that AutoComplete manages internally.
30
+ * These are excluded from the public API so callers cannot accidentally
31
+ * override internal event wiring or ARIA attributes.
32
+ */
33
+ type OmittedInputProps =
34
+ | "value"
35
+ | "onChange"
36
+ // | "onBlur"
37
+ // | "onFocus"
38
+ | "onKeyDown"
39
+ | "onSelect"
40
+ | "role"
41
+ | "aria-expanded"
42
+ | "aria-haspopup"
43
+ | "aria-autocomplete"
44
+ | "aria-activedescendant"
45
+ | "aria-controls"
46
+ | "autoComplete"
47
+ | "hasClearIcon";
48
+
49
+ export type AutoCompleteProps<
50
+ T extends AutoCompleteOption = AutoCompleteOption,
51
+ > = {
52
+ // ── AutoComplete-specific ─────────────────────────────────────────────────
53
+
54
+ /** Options provided by caller (already filtered/fetched externally) */
55
+ options: T[];
56
+
57
+ /** Controlled value — the current input text */
58
+ value?: string;
59
+
60
+ /**
61
+ * Called on every change: typing or clearing.
62
+ * Parent should update `value` from this.
63
+ */
64
+ onChange?: (value: string) => void;
65
+
66
+ /**
67
+ * Called only when user explicitly selects an option from the list.
68
+ * Receives the full option object (including any domain-specific fields).
69
+ */
70
+ onSelect?: (option: T) => void;
71
+
72
+ onBlur?: () => void;
73
+
74
+ /** Called with the current query when the user types */
75
+ onSearch?: (query: string) => void;
76
+
77
+ /** Show a loading spinner inside the dropdown */
78
+ loading?: boolean;
79
+
80
+ /** Text shown when options is empty and not loading */
81
+ noOptionsText?: string;
82
+
83
+ /**
84
+ * When true, show the noOptionsText message when options is empty.
85
+ * Defaults to false (popover stays closed when no options).
86
+ */
87
+ showNoOptions?: boolean;
88
+
89
+ /**
90
+ * Custom render for each option item.
91
+ * Receives the option and whether it is currently selected.
92
+ * The wrapper button (styles + click handler) is provided by AutoComplete.
93
+ */
94
+ renderOption?: (option: T, isSelected: boolean) => ReactNode;
95
+
96
+ /**
97
+ * Override client-side filtering.
98
+ * Pass `(x) => x` to disable filtering entirely (when results come from an API).
99
+ * Defaults to identity (no filtering).
100
+ */
101
+ filterOptions?: (options: T[]) => T[];
102
+
103
+ /**
104
+ * Render the options list via a React portal so it escapes containers
105
+ * with `overflow: hidden/auto`.
106
+ * Set to false when inside a Dialog — portal content is blocked by
107
+ * Radix Dialog's focus trap and aria-modal, making items unclickable.
108
+ * Defaults to true.
109
+ */
110
+ portal?: boolean;
111
+
112
+ /** Extra className applied to the options list container */
113
+ listboxClassName?: string;
114
+
115
+ /** Extra inline styles applied to the options list container */
116
+ listboxStyle?: React.CSSProperties;
117
+
118
+ /** Extra className applied to each option item */
119
+ optionClassName?: string;
120
+
121
+ /** Extra inline styles applied to each option item */
122
+ optionStyle?: React.CSSProperties;
123
+
124
+ "data-testid"?: string;
125
+
126
+ // ── TextInput passthrough ─────────────────────────────────────────────────
127
+ // All InputProps are supported except the ones AutoComplete manages itself.
128
+ // This includes: className, style, label, placeholder, error, errorMessage,
129
+ // helperText, warningMessage, required, disabled, fullwidth, size, rounded,
130
+ // variant, startIcon, endIcon, labelClassName, classes, etc.
131
+ } & Omit<InputProps, OmittedInputProps>;
132
+
133
+ // ---------------------------------------------------------------------------
134
+ // AutoComplete
135
+ // ---------------------------------------------------------------------------
136
+
137
+ function AutoCompleteInner<T extends AutoCompleteOption = AutoCompleteOption>(
138
+ {
139
+ // AutoComplete-specific props
140
+ options,
141
+ value = "",
142
+ onChange,
143
+ onSelect,
144
+ onBlur,
145
+ onSearch,
146
+ loading = false,
147
+ noOptionsText = "No results",
148
+ showNoOptions = false,
149
+ renderOption,
150
+ filterOptions = (x) => x,
151
+ portal = true,
152
+ listboxClassName,
153
+ listboxStyle,
154
+ optionClassName,
155
+ optionStyle,
156
+ "data-testid": testId,
157
+ // InputProps with explicit defaults (rest passes everything else through)
158
+ id,
159
+ label,
160
+ fullwidth = true,
161
+ size = "md",
162
+ rounded = "normal",
163
+ variant = "outline",
164
+ disabled,
165
+ ...rest
166
+ }: AutoCompleteProps<T>,
167
+ ref: React.ForwardedRef<HTMLInputElement>,
168
+ ) {
169
+ const [open, setOpen] = useState(false);
170
+ const [activeIndex, setActiveIndex] = useState(-1);
171
+ const inputRef = useRef<HTMLInputElement>(null);
172
+
173
+ const filteredOptions = filterOptions(options);
174
+ const showPopover =
175
+ open && (loading || filteredOptions.length > 0 || showNoOptions);
176
+
177
+ const commitSelection = useCallback(
178
+ (option: T) => {
179
+ onChange?.(option.value);
180
+ onSelect?.(option);
181
+ setOpen(false);
182
+ setActiveIndex(-1);
183
+ },
184
+ [onChange, onSelect],
185
+ );
186
+
187
+ const handleInputChange = useCallback(
188
+ (e: React.ChangeEvent<HTMLInputElement>) => {
189
+ const query = e.target.value;
190
+ onChange?.(query);
191
+ onSearch?.(query);
192
+ setOpen(true);
193
+ setActiveIndex(-1);
194
+ },
195
+ [onChange, onSearch],
196
+ );
197
+
198
+ const handleFocus = useCallback(
199
+ (e: React.FocusEvent<HTMLInputElement>) => {
200
+ setOpen(true);
201
+ rest?.onFocus?.(e);
202
+ },
203
+ [rest?.onFocus],
204
+ );
205
+
206
+ const handleBlur = useCallback(() => {
207
+ // Delay so option button onClick fires before popover closes
208
+ setTimeout(() => {
209
+ setOpen(false);
210
+ setActiveIndex(-1);
211
+ onBlur?.();
212
+ }, 150);
213
+ }, [onBlur]);
214
+
215
+ const handleKeyDown = useCallback(
216
+ (e: KeyboardEvent<HTMLInputElement>) => {
217
+ if (!open) {
218
+ if (e.key === "ArrowDown" || e.key === "ArrowUp") setOpen(true);
219
+ return;
220
+ }
221
+
222
+ if (e.key === "ArrowDown") {
223
+ e.preventDefault();
224
+ setActiveIndex((i) => Math.min(i + 1, filteredOptions.length - 1));
225
+ } else if (e.key === "ArrowUp") {
226
+ e.preventDefault();
227
+ setActiveIndex((i) => Math.max(i - 1, 0));
228
+ } else if (e.key === "Enter") {
229
+ e.preventDefault();
230
+ if (activeIndex >= 0 && filteredOptions[activeIndex]) {
231
+ commitSelection(filteredOptions[activeIndex]);
232
+ }
233
+ } else if (e.key === "Escape") {
234
+ setOpen(false);
235
+ setActiveIndex(-1);
236
+ }
237
+ },
238
+ [open, activeIndex, filteredOptions, commitSelection],
239
+ );
240
+
241
+ const listContent = (
242
+ <div
243
+ role="listbox"
244
+ style={{ boxShadow: "var(--dropdown-menu-shadow)", ...listboxStyle }}
245
+ className={cn(
246
+ "rounded-md border border-bg-stroke3 overflow-hidden",
247
+ "bg-modal-dropdown-surface text-text-g-contrast-high",
248
+ !portal && "absolute top-full left-0 w-full -mt-3 z-[51]",
249
+ portal && "z-[51]",
250
+ listboxClassName,
251
+ )}
252
+ data-testid={testId ? `${testId}-listbox` : undefined}
253
+ >
254
+ {loading ? (
255
+ <div className="flex items-center justify-center py-6">
256
+ <Loading size={20} />
257
+ </div>
258
+ ) : filteredOptions.length === 0 ? (
259
+ <div className="px-4 py-6 text-center">
260
+ <Text
261
+ variant="small1"
262
+ className="text-[var(--dropdown-menu-default-text)]"
263
+ >
264
+ {noOptionsText}
265
+ </Text>
266
+ </div>
267
+ ) : (
268
+ filteredOptions.map((option, index) => {
269
+ const isSelected = option.value === value;
270
+ const isActive = index === activeIndex;
271
+
272
+ return (
273
+ <button
274
+ key={option.value}
275
+ id={`autocomplete-option-${option.value}`}
276
+ type="button"
277
+ role="option"
278
+ aria-selected={isSelected}
279
+ style={optionStyle}
280
+ className={cn(
281
+ menuItemBaseStyles,
282
+ "w-full",
283
+ isSelected &&
284
+ "bg-[var(--dropdown-menu-selected-bg)] text-[var(--dropdown-menu-selected-text)]",
285
+ isActive &&
286
+ !isSelected &&
287
+ "bg-[var(--dropdown-menu-hover-bg)] text-[var(--dropdown-menu-hover-text)]",
288
+ optionClassName,
289
+ )}
290
+ onMouseDown={(e) => e.preventDefault()}
291
+ onClick={() => commitSelection(option)}
292
+ data-testid={`autocomplete-option-${option.value}`}
293
+ >
294
+ <span className="shrink-0 size-4 flex items-center justify-center">
295
+ {isSelected && (
296
+ <Icon
297
+ type="heroicons"
298
+ name="check"
299
+ className="size-4 text-[var(--dropdown-menu-selected-text)]"
300
+ />
301
+ )}
302
+ </span>
303
+ {renderOption ? renderOption(option, isSelected) : option.label}
304
+ </button>
305
+ );
306
+ })
307
+ )}
308
+ </div>
309
+ );
310
+
311
+ return (
312
+ <PopoverPrimitive.Root open={showPopover}>
313
+ <PopoverPrimitive.Anchor asChild>
314
+ <div className={cn("relative", fullwidth && "w-full")}>
315
+ <TextInput
316
+ {...rest}
317
+ ref={ref ?? inputRef}
318
+ id={id}
319
+ label={label}
320
+ value={value}
321
+ size={size}
322
+ rounded={rounded}
323
+ variant={variant}
324
+ disabled={disabled}
325
+ fullwidth={fullwidth}
326
+ autoComplete="off"
327
+ role="combobox"
328
+ aria-expanded={showPopover}
329
+ aria-autocomplete="list"
330
+ aria-activedescendant={
331
+ activeIndex >= 0
332
+ ? `autocomplete-option-${filteredOptions[activeIndex]?.value}`
333
+ : undefined
334
+ }
335
+ hasClearIcon
336
+ onChange={handleInputChange}
337
+ onFocus={handleFocus}
338
+ onBlur={handleBlur}
339
+ onKeyDown={handleKeyDown}
340
+ data-testid={testId}
341
+ />
342
+ {showPopover && !portal && listContent}
343
+ </div>
344
+ </PopoverPrimitive.Anchor>
345
+
346
+ {portal && (
347
+ <PopoverPrimitive.Portal>
348
+ <PopoverPrimitive.Content
349
+ onOpenAutoFocus={(e) => e.preventDefault()}
350
+ onInteractOutside={(e) => e.preventDefault()}
351
+ onFocusOutside={(e) => e.preventDefault()}
352
+ side="bottom"
353
+ align="start"
354
+ sideOffset={-12}
355
+ style={{ width: "var(--radix-popover-trigger-width)" }}
356
+ >
357
+ {listContent}
358
+ </PopoverPrimitive.Content>
359
+ </PopoverPrimitive.Portal>
360
+ )}
361
+ </PopoverPrimitive.Root>
362
+ );
363
+ }
364
+
365
+ // forwardRef with generics requires a manual cast
366
+ const AutoComplete = forwardRef(AutoCompleteInner) as <
367
+ T extends AutoCompleteOption = AutoCompleteOption,
368
+ >(
369
+ props: AutoCompleteProps<T> & { ref?: React.ForwardedRef<HTMLInputElement> },
370
+ ) => ReturnType<typeof AutoCompleteInner>;
371
+
372
+ (AutoComplete as { displayName?: string }).displayName = "AutoComplete";
373
+
374
+ export default AutoComplete;
@@ -0,0 +1,2 @@
1
+ export { default } from "./AutoComplete";
2
+ export type { AutoCompleteProps, AutoCompleteOption } from "./AutoComplete";
@@ -55,6 +55,10 @@ const DialogContent = React.forwardRef<
55
55
  className,
56
56
  )}
57
57
  {...props}
58
+ onOpenAutoFocus={(event) => {
59
+ event.preventDefault();
60
+ props?.onOpenAutoFocus?.(event);
61
+ }}
58
62
  onCloseAutoFocus={(event) => {
59
63
  event.preventDefault();
60
64
  document.body.style.pointerEvents = "auto";
@@ -7,6 +7,7 @@ import React, {
7
7
  FocusEvent,
8
8
  KeyboardEvent,
9
9
  ChangeEvent,
10
+ MouseEvent,
10
11
  } from "react";
11
12
  import { useStableMergedRef } from "@/utils/mergeRefs";
12
13
  import {
@@ -231,16 +232,20 @@ export const TextInput = forwardRef<HTMLInputElement, InputProps>(
231
232
  ? format(props.value)
232
233
  : props.value;
233
234
 
234
- const handleClearInput = useCallback(() => {
235
- if (inputRef.current) {
236
- inputRef.current.value = "";
235
+ const handleClearInput = useCallback(
236
+ (e: MouseEvent<SVGSVGElement>) => {
237
+ e.preventDefault();
238
+ if (inputRef.current) {
239
+ inputRef.current.value = "";
237
240
 
238
- if (props.onChange) {
239
- const event = new Event("input", { bubbles: true });
240
- props.onChange({ target: { value: "" } } as any);
241
+ if (props.onChange) {
242
+ const event = new Event("input", { bubbles: true });
243
+ props.onChange({ target: { value: "" } } as any);
244
+ }
241
245
  }
242
- }
243
- }, [props.onChange]);
246
+ },
247
+ [props.onChange],
248
+ );
244
249
 
245
250
  const handleOnClickLeftSectionIcon = useCallback(() => {
246
251
  if (disabled) return;
package/src/index.ts CHANGED
@@ -12,6 +12,9 @@ export { default as TextArea } from "./components/TextArea/TextArea";
12
12
  export { default as Text } from "./components/Text/Text";
13
13
  export { default as Tabs } from "./components/Tabs/Tabs";
14
14
  export { default as Dropdown } from "./components/Dropdown/Dropdown";
15
+ export { menuItemBaseStyles } from "./components/Dropdown/Dropdown";
16
+ export { default as AutoComplete } from "./components/AutoComplete/AutoComplete";
17
+ export type { AutoCompleteProps, AutoCompleteOption } from "./components/AutoComplete/AutoComplete";
15
18
  export { Checkbox } from "./components/Checkbox/Checkbox";
16
19
  export { Label } from "./components/Label/Label";
17
20
  export { Input } from "./components/Input/Input";
@@ -50,13 +50,13 @@
50
50
  --state-primary-default-skyller: #2563eb;
51
51
  --state-primary-hover-xspector: #ddcd00;
52
52
  --state-primary-hover-report-xspector-light-mode: #35475b;
53
- --state-primary-hover-skyller: #6692f1;
53
+ --state-primary-hover-skyller: #1e4fbc;
54
54
  --state-primary-stroke-xspector: rgba(177 164 0 / 0.48);
55
55
  --state-primary-stroke-report-xspector-light-mode: rgba(30 50 73 / 0.64);
56
56
  --state-primary-stroke-skyller: rgba(189 189 189 / 0.64);
57
57
  --state-primary-hover-bg-xspector: rgba(221 205 0 / 0.08);
58
58
  --state-primary-hover-bg-report-xspector-light-mode: rgba(30 50 73 / 0.08);
59
- --state-primary-hover-bg-skyller: rgba(102 146 241 / 0.08);
59
+ --state-primary-hover-bg-skyller: rgba(30 79 188 / 0.08);
60
60
  --state-primary-pressed-xspector: #6f6700;
61
61
  --state-primary-pressed-report-xspector-light-mode: #152333;
62
62
  --state-primary-pressed-skyller: #1e40af;
@@ -71,7 +71,7 @@
71
71
  --state-primary-text-outline-skyller: #2563eb;
72
72
  --state-primary-text-hover-xspector: #ddcd00;
73
73
  --state-primary-text-hover-report-xspector-light-mode: #35475b;
74
- --state-primary-text-hover-skyller: #6692f1;
74
+ --state-primary-text-hover-skyller: #1e4fbc;
75
75
  --state-primary-text-pressed-xspector: #6f6700;
76
76
  --state-primary-text-pressed-report-xspector-light-mode: #152333;
77
77
  --state-primary-text-pressed-skyller: #1e40af;
@@ -80,13 +80,13 @@
80
80
  --state-secondary-default-skyller: #171717;
81
81
  --state-secondary-hover-xspector: #fafafa;
82
82
  --state-secondary-hover-report-xspector-light-mode: #b1a400;
83
- --state-secondary-hover-skyller: #424242;
83
+ --state-secondary-hover-skyller: #000000;
84
84
  --state-secondary-stroke-xspector: rgba(236 236 236 / 0.48);
85
85
  --state-secondary-stroke-report-xspector-light-mode: rgba(155 143 0 / 0.64);
86
86
  --state-secondary-stroke-skyller: rgba(189 189 189 / 0.64);
87
87
  --state-secondary-hover-bg-xspector: rgba(250 250 250 / 0.08);
88
88
  --state-secondary-hover-bg-report-xspector-light-mode: rgba(221 205 0 / 0.08);
89
- --state-secondary-hover-bg-skyller: rgba(66 66 66 / 0.08);
89
+ --state-secondary-hover-bg-skyller: rgba(0 0 0 / 0.08);
90
90
  --state-secondary-pressed-xspector: #bbbbbb;
91
91
  --state-secondary-pressed-report-xspector-light-mode: #6f6700;
92
92
  --state-secondary-pressed-skyller: #000000;
@@ -101,7 +101,7 @@
101
101
  --state-secondary-text-outline-skyller: #171717;
102
102
  --state-secondary-text-hover-xspector: #fafafa;
103
103
  --state-secondary-text-hover-report-xspector-light-mode: #b1a400;
104
- --state-secondary-text-hover-skyller: #424242;
104
+ --state-secondary-text-hover-skyller: #000000;
105
105
  --state-secondary-text-pressed-xspector: #c5c5c5;
106
106
  --state-secondary-text-pressed-report-xspector-light-mode: #6f6700;
107
107
  --state-secondary-text-pressed-skyller: #000000;
@@ -110,13 +110,13 @@
110
110
  --state-tertiary-default-skyller: #60a5fa;
111
111
  --state-tertiary-hover-xspector: #adcad6;
112
112
  --state-tertiary-hover-report-xspector-light-mode: #6f6f6f;
113
- --state-tertiary-hover-skyller: #90c0fc;
113
+ --state-tertiary-hover-skyller: #4d84c8;
114
114
  --state-tertiary-stroke-xspector: rgba(138 162 171 / 0.48);
115
115
  --state-tertiary-stroke-report-xspector-light-mode: rgba(79 79 79 / 0.48);
116
116
  --state-tertiary-stroke-skyller: rgba(189 189 189 / 0.48);
117
117
  --state-tertiary-hover-bg-xspector: rgba(173 202 214 / 0.08);
118
118
  --state-tertiary-hover-bg-report-xspector-light-mode: rgba(158 158 158 / 0.08);
119
- --state-tertiary-hover-bg-skyller: rgba(144 192 252 / 0.08);
119
+ --state-tertiary-hover-bg-skyller: rgba(77 132 200 / 0.08);
120
120
  --state-tertiary-pressed-xspector: #57656b;
121
121
  --state-tertiary-pressed-report-xspector-light-mode: #b1b1b1;
122
122
  --state-tertiary-pressed-skyller: #1e40af;
@@ -131,7 +131,7 @@
131
131
  --state-tertiary-text-outline-skyller: #60a5fa;
132
132
  --state-tertiary-text-hover-xspector: #adcad6;
133
133
  --state-tertiary-text-hover-report-xspector-light-mode: #6f6f6f;
134
- --state-tertiary-text-hover-skyller: #90c0fc;
134
+ --state-tertiary-text-hover-skyller: #4d84c8;
135
135
  --state-tertiary-text-pressed-xspector: #57656b;
136
136
  --state-tertiary-text-pressed-report-xspector-light-mode: #b1b1b1;
137
137
  --state-tertiary-text-pressed-skyller: #1e40af;
@@ -140,13 +140,13 @@
140
140
  --state-info-default-skyller: #2563eb;
141
141
  --state-info-hover-xspector: #2998ff;
142
142
  --state-info-hover-report-xspector-light-mode: #2998ff;
143
- --state-info-hover-skyller: #6692f1;
143
+ --state-info-hover-skyller: #1d4ed8;
144
144
  --state-info-stroke-xspector: rgba(27 125 245 / 0.48);
145
145
  --state-info-stroke-report-xspector-light-mode: rgba(41 152 255 / 0.48);
146
146
  --state-info-stroke-skyller: rgba(37 99 235 / 0.48);
147
147
  --state-info-hover-bg-xspector: rgba(41 152 255 / 0.08);
148
148
  --state-info-hover-bg-report-xspector-light-mode: rgba(41 152 255 / 0.08);
149
- --state-info-hover-bg-skyller: rgba(102 146 241 / 0.08);
149
+ --state-info-hover-bg-skyller: rgba(29 78 216 / 0.08);
150
150
  --state-info-pressed-xspector: #1752b6;
151
151
  --state-info-pressed-report-xspector-light-mode: #1752b6;
152
152
  --state-info-pressed-skyller: #1e40af;
@@ -161,7 +161,7 @@
161
161
  --state-info-text-outline-skyller: #2563eb;
162
162
  --state-info-text-hover-xspector: #2998ff;
163
163
  --state-info-text-hover-report-xspector-light-mode: #2998ff;
164
- --state-info-text-hover-skyller: #6692f1;
164
+ --state-info-text-hover-skyller: #1d4ed8;
165
165
  --state-info-text-pressed-xspector: #1752b6;
166
166
  --state-info-text-pressed-report-xspector-light-mode: #1752b6;
167
167
  --state-info-text-pressed-skyller: #1e40af;
@@ -170,13 +170,13 @@
170
170
  --state-success-default-skyller: #16a34a;
171
171
  --state-success-hover-xspector: #54d62c;
172
172
  --state-success-hover-report-xspector-light-mode: #54d62c;
173
- --state-success-hover-skyller: #4ade80;
173
+ --state-success-hover-skyller: #15803d;
174
174
  --state-success-stroke-xspector: rgba(49 153 23 / 0.48);
175
175
  --state-success-stroke-report-xspector-light-mode: rgba(68 192 34 / 0.48);
176
176
  --state-success-stroke-skyller: rgba(22 163 74 / 0.48);
177
177
  --state-success-hover-bg-xspector: rgba(84 214 44 / 0.08);
178
178
  --state-success-hover-bg-report-xspector-light-mode: rgba(84 214 44 / 0.08);
179
- --state-success-hover-bg-skyller: rgba(74 222 128 / 0.08);
179
+ --state-success-hover-bg-skyller: rgba(21 128 61 / 0.08);
180
180
  --state-success-pressed-xspector: #235d17;
181
181
  --state-success-pressed-report-xspector-light-mode: #235d17;
182
182
  --state-success-pressed-skyller: #166534;
@@ -191,7 +191,7 @@
191
191
  --state-success-text-outline-skyller: #16a34a;
192
192
  --state-success-text-hover-xspector: #54d62c;
193
193
  --state-success-text-hover-report-xspector-light-mode: #54d62c;
194
- --state-success-text-hover-skyller: #4ade80;
194
+ --state-success-text-hover-skyller: #15803d;
195
195
  --state-success-text-pressed-xspector: #235d17;
196
196
  --state-success-text-pressed-report-xspector-light-mode: #235d17;
197
197
  --state-success-text-pressed-skyller: #166534;
@@ -200,13 +200,13 @@
200
200
  --state-warning-default-skyller: #f59e0b;
201
201
  --state-warning-hover-xspector: #ffdf1b;
202
202
  --state-warning-hover-report-xspector-light-mode: #ffdf1b;
203
- --state-warning-hover-skyller: #fbbf24;
203
+ --state-warning-hover-skyller: #d97706;
204
204
  --state-warning-stroke-xspector: rgba(255 193 7 / 0.48);
205
205
  --state-warning-stroke-report-xspector-light-mode: rgba(255 223 27 / 0.48);
206
206
  --state-warning-stroke-skyller: rgba(245 158 11 / 0.48);
207
207
  --state-warning-hover-bg-xspector: rgba(255 193 7 / 0.08);
208
208
  --state-warning-hover-bg-report-xspector-light-mode: rgba(255 193 7 / 0.08);
209
- --state-warning-hover-bg-skyller: rgba(251 191 36 / 0.08);
209
+ --state-warning-hover-bg-skyller: rgba(217 119 6 / 0.08);
210
210
  --state-warning-pressed-xspector: #985108;
211
211
  --state-warning-pressed-report-xspector-light-mode: #985108;
212
212
  --state-warning-pressed-skyller: #d97706;
@@ -221,22 +221,22 @@
221
221
  --state-warning-text-outline-skyller: #f59e0b;
222
222
  --state-warning-text-hover-xspector: #ffdf1b;
223
223
  --state-warning-text-hover-report-xspector-light-mode: #ffdf1b;
224
- --state-warning-text-hover-skyller: #fbbf24;
224
+ --state-warning-text-hover-skyller: #d97706;
225
225
  --state-warning-text-pressed-xspector: #985108;
226
226
  --state-warning-text-pressed-report-xspector-light-mode: #985108;
227
- --state-warning-text-pressed-skyller: #d97706;
227
+ --state-warning-text-pressed-skyller: #92400e;
228
228
  --state-error-default-xspector: #ff4d35;
229
229
  --state-error-default-report-xspector-light-mode: #ed2f15;
230
230
  --state-error-default-skyller: #ef4444;
231
231
  --state-error-hover-xspector: #f87171;
232
232
  --state-error-hover-report-xspector-light-mode: #ff4d35;
233
- --state-error-hover-skyller: #f87171;
233
+ --state-error-hover-skyller: #b91c1c;
234
234
  --state-error-stroke-xspector: rgba(255 77 53 / 0.48);
235
235
  --state-error-stroke-report-xspector-light-mode: rgba(237 47 21 / 0.64);
236
236
  --state-error-stroke-skyller: rgba(220 38 38 / 0.64);
237
237
  --state-error-hover-bg-xspector: rgba(248 113 113 / 0.08);
238
238
  --state-error-hover-bg-report-xspector-light-mode: rgba(255 77 53 / 0.08);
239
- --state-error-hover-bg-skyller: rgba(248 113 113 / 0.08);
239
+ --state-error-hover-bg-skyller: rgba(185 28 28 / 0.08);
240
240
  --state-error-pressed-xspector: #a5210f;
241
241
  --state-error-pressed-report-xspector-light-mode: #a5210f;
242
242
  --state-error-pressed-skyller: #991b1b;
@@ -251,7 +251,7 @@
251
251
  --state-error-text-outline-skyller: #dc2626;
252
252
  --state-error-text-hover-xspector: #f87171;
253
253
  --state-error-text-hover-report-xspector-light-mode: #ff4d35;
254
- --state-error-text-hover-skyller: #f87171;
254
+ --state-error-text-hover-skyller: #b91c1c;
255
255
  --state-error-text-pressed-xspector: #a5210f;
256
256
  --state-error-text-pressed-report-xspector-light-mode: #a5210f;
257
257
  --state-error-text-pressed-skyller: #991b1b;
@@ -872,13 +872,13 @@
872
872
  --function-default-solid-skyller: #171717;
873
873
  --function-default-hover-xspector: #fafafa;
874
874
  --function-default-hover-report-xspector-light-mode: #35475b;
875
- --function-default-hover-skyller: #424242;
875
+ --function-default-hover-skyller: #000000;
876
876
  --function-default-hover-bg-xspector: rgba(250 250 250 / 0.08);
877
877
  --function-default-hover-bg-report-xspector-light-mode: rgba(30 50 73 / 0.08);
878
878
  --function-default-hover-bg-skyller: rgba(23 23 23 / 0.08);
879
879
  --function-default-stroke-xspector: rgba(158 158 158 / 0.24);
880
880
  --function-default-stroke-report-xspector-light-mode: rgba(30 50 73 / 0.48);
881
- --function-default-stroke-skyller: rgba(189 189 189 / 0.48);
881
+ --function-default-stroke-skyller: rgba(0 0 0 / 0.48);
882
882
  --function-default-icon-xspector: #212b36;
883
883
  --function-default-icon-report-xspector-light-mode: #ffffff;
884
884
  --function-default-icon-skyller: #ffffff;
@@ -890,13 +890,13 @@
890
890
  --function-active-solid-skyller: #2563eb;
891
891
  --function-active-hover-xspector: #ddcd00;
892
892
  --function-active-hover-report-xspector-light-mode: #b1a400;
893
- --function-active-hover-skyller: #5182ef;
893
+ --function-active-hover-skyller: #1e4fbc;
894
894
  --function-active-hover-bg-xspector: rgba(221 205 0 / 0.08);
895
895
  --function-active-hover-bg-report-xspector-light-mode: rgba(221 205 0 / 0.08);
896
896
  --function-active-hover-bg-skyller: rgba(81 130 239 / 0.08);
897
897
  --function-active-stroke-xspector: rgba(177 164 0 / 0.48);
898
898
  --function-active-stroke-report-xspector-light-mode: rgba(177 164 0 / 0.48);
899
- --function-active-stroke-skyller: rgba(37 99 235 / 0.48);
899
+ --function-active-stroke-skyller: rgba(30 79 188 / 0.48);
900
900
  --function-active-icon-xspector: #212b36;
901
901
  --function-active-icon-report-xspector-light-mode: #ffffff;
902
902
  --function-active-icon-skyller: #ffffff;
@@ -1055,7 +1055,7 @@
1055
1055
  --bg-stroke5-skyller: #000000;
1056
1056
  --table-bg-main-xspector: #091a2a;
1057
1057
  --table-bg-main-report-xspector-light-mode: #e5e5e5;
1058
- --table-bg-main-skyller: #d4d4d6;
1058
+ --table-bg-main-skyller: #bfdbfd;
1059
1059
  --table-bg-line-xspector: #1c3955;
1060
1060
  --table-bg-line-report-xspector-light-mode: #d2d2d2;
1061
1061
  --table-bg-line-skyller: #ececec;
@@ -1064,13 +1064,13 @@
1064
1064
  --table-bg-a-skyller: #fdfdfd;
1065
1065
  --table-bg-b-xspector: #0f2f50;
1066
1066
  --table-bg-b-report-xspector-light-mode: #f3f3f3;
1067
- --table-bg-b-skyller: #f1f1f1;
1067
+ --table-bg-b-skyller: #eff6ff;
1068
1068
  --table-panel-hover-xspector: #343638;
1069
1069
  --table-panel-hover-report-xspector-light-mode: #d4d4d4;
1070
- --table-panel-hover-skyller: #eff6fe;
1070
+ --table-panel-hover-skyller: #dfedfe;
1071
1071
  --table-bg-hover-xspector: #103861;
1072
1072
  --table-bg-hover-report-xspector-light-mode: #ffffff;
1073
- --table-bg-hover-skyller: #eff6fe;
1073
+ --table-bg-hover-skyller: #cfe4fd;
1074
1074
  --table-panel-sub-line-xspector: #393b3f;
1075
1075
  --table-panel-sub-line-report-xspector-light-mode: #d4d4d4;
1076
1076
  --table-panel-sub-line-skyller: #ececec;
@@ -1079,7 +1079,7 @@
1079
1079
  --table-panel-main-line-skyller: #d4d4d4;
1080
1080
  --table-panel-selected-xspector: #6f6700;
1081
1081
  --table-panel-selected-report-xspector-light-mode: #d4d4d4;
1082
- --table-panel-selected-skyller: #bfdbfd;
1082
+ --table-panel-selected-skyller: #afd2fd;
1083
1083
  --modal-dropdown-surface-xspector: #252628;
1084
1084
  --modal-dropdown-surface-report-xspector-light-mode: #ffffff;
1085
1085
  --modal-dropdown-surface-skyller: #ffffff;