@crisp-ui-kit/crisp 0.37.0 → 0.39.0

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 (61) hide show
  1. package/dist/badge.css +5 -5
  2. package/dist/badge.layered.css +5 -5
  3. package/dist/cjs/components/badge/badge.recipe.js +11 -5
  4. package/dist/cjs/components/contextmenu/contextmenu.js +1 -1
  5. package/dist/cjs/components/contextmenu/contextmenu.recipe.js +22 -10
  6. package/dist/cjs/components/fileupload/fileupload.js +2 -2
  7. package/dist/cjs/components/menu/menu.js +1 -1
  8. package/dist/cjs/components/menu/menu.recipe.js +32 -20
  9. package/dist/cjs/components/multiselect/multiselect.js +4 -4
  10. package/dist/cjs/components/multiselect/multiselect.recipe.js +50 -24
  11. package/dist/cjs/components/popover/popover.js +1 -1
  12. package/dist/cjs/components/popover/popover.recipe.js +19 -4
  13. package/dist/cjs/components/select/select.js +3 -3
  14. package/dist/cjs/components/select/select.recipe.js +42 -16
  15. package/dist/cjs/core/floating-portal.js +55 -2
  16. package/dist/cjs/tokens/palette.js +23 -0
  17. package/dist/cjs/tokens/semantic.js +7 -0
  18. package/dist/contextmenu.css +11 -9
  19. package/dist/contextmenu.layered.css +11 -9
  20. package/dist/esm/components/badge/badge.recipe.js +11 -5
  21. package/dist/esm/components/contextmenu/contextmenu.js +1 -1
  22. package/dist/esm/components/contextmenu/contextmenu.recipe.js +22 -10
  23. package/dist/esm/components/fileupload/fileupload.js +2 -2
  24. package/dist/esm/components/menu/menu.js +1 -1
  25. package/dist/esm/components/menu/menu.recipe.js +32 -20
  26. package/dist/esm/components/multiselect/multiselect.js +4 -4
  27. package/dist/esm/components/multiselect/multiselect.recipe.js +50 -24
  28. package/dist/esm/components/popover/popover.js +1 -1
  29. package/dist/esm/components/popover/popover.recipe.js +19 -4
  30. package/dist/esm/components/select/select.js +3 -3
  31. package/dist/esm/components/select/select.recipe.js +42 -16
  32. package/dist/esm/core/floating-portal.js +22 -2
  33. package/dist/esm/tokens/palette.js +23 -0
  34. package/dist/esm/tokens/semantic.js +7 -0
  35. package/dist/menu.css +34 -19
  36. package/dist/menu.layered.css +34 -19
  37. package/dist/multiselect.css +40 -21
  38. package/dist/multiselect.d.ts +2 -2
  39. package/dist/multiselect.layered.css +40 -21
  40. package/dist/native/tokens.d.ts +1 -1
  41. package/dist/native/tokens.js +24 -4
  42. package/dist/popover.css +5 -3
  43. package/dist/popover.layered.css +5 -3
  44. package/dist/select.css +33 -14
  45. package/dist/select.d.ts +2 -1
  46. package/dist/select.layered.css +33 -14
  47. package/dist/styles.css +138 -71
  48. package/dist/styles.layered.css +138 -71
  49. package/dist/tokens.css +10 -0
  50. package/dist/tokens.json +24 -4
  51. package/dist/types/components/fileupload/fileupload.d.ts +1 -1
  52. package/dist/types/components/multiselect/multiselect.d.ts +3 -1
  53. package/dist/types/components/multiselect/multiselect.recipe.d.ts +18 -3
  54. package/dist/types/components/select/select.d.ts +4 -1
  55. package/dist/types/components/select/select.recipe.d.ts +12 -0
  56. package/dist/types/core/floating-portal.d.ts +17 -3
  57. package/dist/types/product/sidebar/index.d.ts +1 -1
  58. package/dist/types/tokens/contract.d.ts +5 -0
  59. package/dist/types/tokens/palette.d.ts +20 -0
  60. package/dist/types/tokens/semantic.d.ts +7 -0
  61. package/package.json +3 -3
package/dist/select.css CHANGED
@@ -1,3 +1,30 @@
1
+
2
+ .crisp-select-listbox {
3
+ font-family: var(--crisp-font-sans); -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale;
4
+ position: fixed; z-index: 70; box-sizing: border-box; display: flex; flex-direction: column; gap: var(--crisp-space-px);
5
+ max-height: 280px; overflow-y: auto; padding: var(--crisp-space-1);
6
+ border-radius: var(--crisp-radius-xl); background: var(--crisp-bg-popover);
7
+ box-shadow: inset 0 0 0 1px var(--crisp-ring-popover), 0 0 0 1px var(--crisp-shadow-popover1), 0 4px 8px -4px var(--crisp-shadow-popover2), 0 4px 12px -2px var(--crisp-shadow-popover3);
8
+ transform-origin: top left; opacity: 1; transform: none; transition: opacity .08s ease, transform .08s ease;
9
+ }
10
+ .crisp-select-listbox[data-up] { transform-origin: bottom; }
11
+ .crisp-select-listbox { @starting-style { opacity: 0; transform: scale(0.97) translateY(-1px); } }
12
+ .crisp-select-search { display: flex; align-items: center; gap: var(--crisp-space-2); height: 34px; flex-shrink: 0; margin: calc(-1 * var(--crisp-space-1)) calc(-1 * var(--crisp-space-1)) var(--crisp-space-1); padding: 0 var(--crisp-space-2-5); border-bottom: 1px solid var(--crisp-border-subtle); color: var(--crisp-fg-muted); }
13
+ .crisp-select-search svg { flex-shrink: 0; }
14
+ .crisp-select-search input { flex: 1; min-width: 0; border: none; outline: none; background: none; font-family: inherit; font-size: var(--crisp-text-lg); color: var(--crisp-fg-primary); }
15
+ .crisp-select-search input::placeholder { color: var(--crisp-fg-muted); }
16
+ .crisp-select-empty { padding: var(--crisp-space-3) var(--crisp-space-2); text-align: center; font-size: var(--crisp-text-md); color: var(--crisp-fg-muted); }
17
+ .crisp-select-option {
18
+ box-sizing: border-box; display: flex; align-items: center; gap: var(--crisp-space-2); height: var(--crisp-size-menuRow); flex-shrink: 0;
19
+ padding: 0 var(--crisp-space-2); margin: 0; border: none; background: none; border-radius: var(--crisp-radius-md);
20
+ font-family: inherit; font-size: var(--crisp-text-lg); color: var(--crisp-fg-primary); text-align: start; cursor: pointer; white-space: nowrap;
21
+ }
22
+ .crisp-select-option[data-highlighted] { background: var(--crisp-bg-raised); }
23
+ .crisp-select-option[data-disabled] { opacity: 0.5; cursor: not-allowed; }
24
+ .crisp-select-option-dot { flex-shrink: 0; width: 8px; height: 8px; border-radius: var(--crisp-radius-full); }
25
+ .crisp-select-option-label { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; }
26
+ .crisp-select-option-check { flex-shrink: 0; color: var(--crisp-bg-brand-solid); }
27
+
1
28
  .crisp-select {
2
29
  position: relative; display: inline-flex; font-family: var(--crisp-font-sans); -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale;
3
30
  & .crisp-select-trigger { box-sizing: border-box; display: inline-flex; align-items: center; gap: var(--crisp-space-1-5); height: var(--crisp-size-menuRow); width: 100%; min-width: 0; margin: 0; padding: 0 var(--crisp-space-1-5) 0 var(--crisp-space-2); border: none; border-radius: var(--crisp-radius-md); background: transparent; box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--crisp-fg-primary) 7%, transparent); font-family: inherit; font-size: var(--crisp-text-lg); color: var(--crisp-fg-primary); cursor: pointer; transition: background-color .12s ease, box-shadow .12s ease; }
@@ -8,20 +35,6 @@
8
35
  & .crisp-select-placeholder { color: var(--crisp-fg-muted); }
9
36
  & .crisp-select-chevron { flex-shrink: 0; color: var(--crisp-fg-muted); transition: transform .15s ease; }
10
37
  & .crisp-select-trigger[data-open] .crisp-select-chevron { transform: rotate(180deg); }
11
- & .crisp-select-listbox { position: fixed; z-index: 70; box-sizing: border-box; display: flex; flex-direction: column; gap: var(--crisp-space-px); max-height: 280px; overflow-y: auto; padding: var(--crisp-space-1); border-radius: var(--crisp-radius-xl); background: var(--crisp-bg-popover); box-shadow: inset 0 0 0 1px var(--crisp-ring-popover), 0 0 0 1px var(--crisp-shadow-popover1), 0 4px 8px -4px var(--crisp-shadow-popover2), 0 4px 12px -2px var(--crisp-shadow-popover3); transform-origin: top left; opacity: 1; transform: none; transition: opacity .08s ease, transform .08s ease; }
12
- & .crisp-select-listbox[data-up] { transform-origin: bottom; }
13
- & .crisp-select-listbox { @starting-style { opacity: 0; transform: scale(0.97) translateY(-1px); } }
14
- & .crisp-select-search { display: flex; align-items: center; gap: var(--crisp-space-2); height: 34px; flex-shrink: 0; margin: calc(-1 * var(--crisp-space-1)) calc(-1 * var(--crisp-space-1)) var(--crisp-space-1); padding: 0 var(--crisp-space-2-5); border-bottom: 1px solid var(--crisp-border-subtle); color: var(--crisp-fg-muted); }
15
- & .crisp-select-search svg { flex-shrink: 0; }
16
- & .crisp-select-search input { flex: 1; min-width: 0; border: none; outline: none; background: none; font-family: inherit; font-size: var(--crisp-text-lg); color: var(--crisp-fg-primary); }
17
- & .crisp-select-search input::placeholder { color: var(--crisp-fg-muted); }
18
- & .crisp-select-empty { padding: var(--crisp-space-3) var(--crisp-space-2); text-align: center; font-size: var(--crisp-text-md); color: var(--crisp-fg-muted); }
19
- & .crisp-select-option { box-sizing: border-box; display: flex; align-items: center; gap: var(--crisp-space-2); height: var(--crisp-size-menuRow); flex-shrink: 0; padding: 0 var(--crisp-space-2); margin: 0; border: none; background: none; border-radius: var(--crisp-radius-md); font-family: inherit; font-size: var(--crisp-text-lg); color: var(--crisp-fg-primary); text-align: start; cursor: pointer; white-space: nowrap; }
20
- & .crisp-select-option[data-highlighted] { background: var(--crisp-bg-raised); }
21
- & .crisp-select-option[data-disabled] { opacity: 0.5; cursor: not-allowed; }
22
- & .crisp-select-option-dot { flex-shrink: 0; width: 8px; height: 8px; border-radius: var(--crisp-radius-full); }
23
- & .crisp-select-option-label { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; }
24
- & .crisp-select-option-check { flex-shrink: 0; color: var(--crisp-bg-brand-solid); }
25
38
  }
26
39
  .crisp-select--variant_default {
27
40
 
@@ -37,6 +50,12 @@
37
50
  .crisp-select--width_auto {
38
51
  width: auto;
39
52
  }
53
+ .crisp-select--invalid_true {
54
+ & .crisp-select-trigger, & .crisp-select-trigger:hover, & .crisp-select-trigger[data-open], & .crisp-select-trigger:focus-visible { box-shadow: inset 0 0 0 1px var(--crisp-bg-danger); }
55
+ }
56
+ .crisp-select--invalid_false {
57
+
58
+ }
40
59
 
41
60
  @media (prefers-reduced-motion: reduce) {
42
61
  .crisp-select, .crisp-select * {
package/dist/select.d.ts CHANGED
@@ -3,6 +3,7 @@ import type { RecipeFn } from "../core/types";
3
3
  export interface SelectVariants {
4
4
  variant?: "default" | "ghost";
5
5
  width?: "full" | "auto";
6
+ invalid?: boolean;
6
7
  }
7
8
 
8
- export declare const selectRecipe: RecipeFn<{ variant: { default: string; ghost: string }; width: { full: string; auto: string } }>;
9
+ export declare const selectRecipe: RecipeFn<{ variant: { default: string; ghost: string }; width: { full: string; auto: string }; invalid: { true: string; false: string } }>;
@@ -1,4 +1,31 @@
1
1
  @layer crisp-components {
2
+
3
+ .crisp-select-listbox {
4
+ font-family: var(--crisp-font-sans); -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale;
5
+ position: fixed; z-index: 70; box-sizing: border-box; display: flex; flex-direction: column; gap: var(--crisp-space-px);
6
+ max-height: 280px; overflow-y: auto; padding: var(--crisp-space-1);
7
+ border-radius: var(--crisp-radius-xl); background: var(--crisp-bg-popover);
8
+ box-shadow: inset 0 0 0 1px var(--crisp-ring-popover), 0 0 0 1px var(--crisp-shadow-popover1), 0 4px 8px -4px var(--crisp-shadow-popover2), 0 4px 12px -2px var(--crisp-shadow-popover3);
9
+ transform-origin: top left; opacity: 1; transform: none; transition: opacity .08s ease, transform .08s ease;
10
+ }
11
+ .crisp-select-listbox[data-up] { transform-origin: bottom; }
12
+ .crisp-select-listbox { @starting-style { opacity: 0; transform: scale(0.97) translateY(-1px); } }
13
+ .crisp-select-search { display: flex; align-items: center; gap: var(--crisp-space-2); height: 34px; flex-shrink: 0; margin: calc(-1 * var(--crisp-space-1)) calc(-1 * var(--crisp-space-1)) var(--crisp-space-1); padding: 0 var(--crisp-space-2-5); border-bottom: 1px solid var(--crisp-border-subtle); color: var(--crisp-fg-muted); }
14
+ .crisp-select-search svg { flex-shrink: 0; }
15
+ .crisp-select-search input { flex: 1; min-width: 0; border: none; outline: none; background: none; font-family: inherit; font-size: var(--crisp-text-lg); color: var(--crisp-fg-primary); }
16
+ .crisp-select-search input::placeholder { color: var(--crisp-fg-muted); }
17
+ .crisp-select-empty { padding: var(--crisp-space-3) var(--crisp-space-2); text-align: center; font-size: var(--crisp-text-md); color: var(--crisp-fg-muted); }
18
+ .crisp-select-option {
19
+ box-sizing: border-box; display: flex; align-items: center; gap: var(--crisp-space-2); height: var(--crisp-size-menuRow); flex-shrink: 0;
20
+ padding: 0 var(--crisp-space-2); margin: 0; border: none; background: none; border-radius: var(--crisp-radius-md);
21
+ font-family: inherit; font-size: var(--crisp-text-lg); color: var(--crisp-fg-primary); text-align: start; cursor: pointer; white-space: nowrap;
22
+ }
23
+ .crisp-select-option[data-highlighted] { background: var(--crisp-bg-raised); }
24
+ .crisp-select-option[data-disabled] { opacity: 0.5; cursor: not-allowed; }
25
+ .crisp-select-option-dot { flex-shrink: 0; width: 8px; height: 8px; border-radius: var(--crisp-radius-full); }
26
+ .crisp-select-option-label { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; }
27
+ .crisp-select-option-check { flex-shrink: 0; color: var(--crisp-bg-brand-solid); }
28
+
2
29
  .crisp-select {
3
30
  position: relative; display: inline-flex; font-family: var(--crisp-font-sans); -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale;
4
31
  & .crisp-select-trigger { box-sizing: border-box; display: inline-flex; align-items: center; gap: var(--crisp-space-1-5); height: var(--crisp-size-menuRow); width: 100%; min-width: 0; margin: 0; padding: 0 var(--crisp-space-1-5) 0 var(--crisp-space-2); border: none; border-radius: var(--crisp-radius-md); background: transparent; box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--crisp-fg-primary) 7%, transparent); font-family: inherit; font-size: var(--crisp-text-lg); color: var(--crisp-fg-primary); cursor: pointer; transition: background-color .12s ease, box-shadow .12s ease; }
@@ -9,20 +36,6 @@
9
36
  & .crisp-select-placeholder { color: var(--crisp-fg-muted); }
10
37
  & .crisp-select-chevron { flex-shrink: 0; color: var(--crisp-fg-muted); transition: transform .15s ease; }
11
38
  & .crisp-select-trigger[data-open] .crisp-select-chevron { transform: rotate(180deg); }
12
- & .crisp-select-listbox { position: fixed; z-index: 70; box-sizing: border-box; display: flex; flex-direction: column; gap: var(--crisp-space-px); max-height: 280px; overflow-y: auto; padding: var(--crisp-space-1); border-radius: var(--crisp-radius-xl); background: var(--crisp-bg-popover); box-shadow: inset 0 0 0 1px var(--crisp-ring-popover), 0 0 0 1px var(--crisp-shadow-popover1), 0 4px 8px -4px var(--crisp-shadow-popover2), 0 4px 12px -2px var(--crisp-shadow-popover3); transform-origin: top left; opacity: 1; transform: none; transition: opacity .08s ease, transform .08s ease; }
13
- & .crisp-select-listbox[data-up] { transform-origin: bottom; }
14
- & .crisp-select-listbox { @starting-style { opacity: 0; transform: scale(0.97) translateY(-1px); } }
15
- & .crisp-select-search { display: flex; align-items: center; gap: var(--crisp-space-2); height: 34px; flex-shrink: 0; margin: calc(-1 * var(--crisp-space-1)) calc(-1 * var(--crisp-space-1)) var(--crisp-space-1); padding: 0 var(--crisp-space-2-5); border-bottom: 1px solid var(--crisp-border-subtle); color: var(--crisp-fg-muted); }
16
- & .crisp-select-search svg { flex-shrink: 0; }
17
- & .crisp-select-search input { flex: 1; min-width: 0; border: none; outline: none; background: none; font-family: inherit; font-size: var(--crisp-text-lg); color: var(--crisp-fg-primary); }
18
- & .crisp-select-search input::placeholder { color: var(--crisp-fg-muted); }
19
- & .crisp-select-empty { padding: var(--crisp-space-3) var(--crisp-space-2); text-align: center; font-size: var(--crisp-text-md); color: var(--crisp-fg-muted); }
20
- & .crisp-select-option { box-sizing: border-box; display: flex; align-items: center; gap: var(--crisp-space-2); height: var(--crisp-size-menuRow); flex-shrink: 0; padding: 0 var(--crisp-space-2); margin: 0; border: none; background: none; border-radius: var(--crisp-radius-md); font-family: inherit; font-size: var(--crisp-text-lg); color: var(--crisp-fg-primary); text-align: start; cursor: pointer; white-space: nowrap; }
21
- & .crisp-select-option[data-highlighted] { background: var(--crisp-bg-raised); }
22
- & .crisp-select-option[data-disabled] { opacity: 0.5; cursor: not-allowed; }
23
- & .crisp-select-option-dot { flex-shrink: 0; width: 8px; height: 8px; border-radius: var(--crisp-radius-full); }
24
- & .crisp-select-option-label { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; }
25
- & .crisp-select-option-check { flex-shrink: 0; color: var(--crisp-bg-brand-solid); }
26
39
  }
27
40
  .crisp-select--variant_default {
28
41
 
@@ -38,6 +51,12 @@
38
51
  .crisp-select--width_auto {
39
52
  width: auto;
40
53
  }
54
+ .crisp-select--invalid_true {
55
+ & .crisp-select-trigger, & .crisp-select-trigger:hover, & .crisp-select-trigger[data-open], & .crisp-select-trigger:focus-visible { box-shadow: inset 0 0 0 1px var(--crisp-bg-danger); }
56
+ }
57
+ .crisp-select--invalid_false {
58
+
59
+ }
41
60
 
42
61
  @media (prefers-reduced-motion: reduce) {
43
62
  .crisp-select, .crisp-select * {
package/dist/styles.css CHANGED
@@ -38,6 +38,11 @@
38
38
  --crisp-bg-purple: #9b69ff;
39
39
  --crisp-bg-sidebar: #fbfbfb;
40
40
  --crisp-bg-subtle: #fbfbfb;
41
+ --crisp-fg-brand-soft: #2057bd;
42
+ --crisp-fg-success-soft: #186b3d;
43
+ --crisp-fg-warning-soft: #80520d;
44
+ --crisp-fg-danger-soft: #a33539;
45
+ --crisp-fg-neutral-soft: #686870;
41
46
  }
42
47
 
43
48
  [data-theme="dark"] {
@@ -80,6 +85,11 @@
80
85
  --crisp-bg-purple: #9b69ff;
81
86
  --crisp-bg-sidebar: #0e0f10;
82
87
  --crisp-bg-subtle: #0e0f10;
88
+ --crisp-fg-brand-soft: #568df3;
89
+ --crisp-fg-success-soft: #2ea968;
90
+ --crisp-fg-warning-soft: #e0982a;
91
+ --crisp-fg-danger-soft: #ff5a5f;
92
+ --crisp-fg-neutral-soft: #9a9aa2;
83
93
  }
84
94
 
85
95
  :root {
@@ -196,19 +206,19 @@
196
206
  & .crisp-badge-dot { width: 6px; height: 6px; flex-shrink: 0; border-radius: var(--crisp-radius-full); background: currentColor; }
197
207
  }
198
208
  .crisp-badge--tone_neutral {
199
- background: var(--crisp-bg-raised); color: var(--crisp-fg-muted); box-shadow: inset 0 0 0 1px var(--crisp-border-default);
209
+ background: var(--crisp-bg-raised); color: var(--crisp-fg-neutral-soft); box-shadow: inset 0 0 0 1px var(--crisp-border-default);
200
210
  }
201
211
  .crisp-badge--tone_brand {
202
- background: color-mix(in srgb, var(--crisp-bg-brand-solid) 14%, transparent); color: var(--crisp-bg-brand-solid); box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--crisp-bg-brand-solid) 30%, transparent);
212
+ background: color-mix(in srgb, var(--crisp-bg-brand-solid) 14%, transparent); color: var(--crisp-fg-brand-soft); box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--crisp-bg-brand-solid) 30%, transparent);
203
213
  }
204
214
  .crisp-badge--tone_success {
205
- background: color-mix(in srgb, var(--crisp-bg-success) 14%, transparent); color: var(--crisp-bg-success); box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--crisp-bg-success) 30%, transparent);
215
+ background: color-mix(in srgb, var(--crisp-bg-success) 14%, transparent); color: var(--crisp-fg-success-soft); box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--crisp-bg-success) 30%, transparent);
206
216
  }
207
217
  .crisp-badge--tone_warning {
208
- background: color-mix(in srgb, var(--crisp-bg-warning) 16%, transparent); color: var(--crisp-bg-warning); box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--crisp-bg-warning) 32%, transparent);
218
+ background: color-mix(in srgb, var(--crisp-bg-warning) 16%, transparent); color: var(--crisp-fg-warning-soft); box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--crisp-bg-warning) 32%, transparent);
209
219
  }
210
220
  .crisp-badge--tone_danger {
211
- background: color-mix(in srgb, var(--crisp-bg-danger) 14%, transparent); color: var(--crisp-bg-danger); box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--crisp-bg-danger) 30%, transparent);
221
+ background: color-mix(in srgb, var(--crisp-bg-danger) 14%, transparent); color: var(--crisp-fg-danger-soft); box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--crisp-bg-danger) 30%, transparent);
212
222
  }
213
223
  .crisp-badge--size_small {
214
224
  height: 16px; padding-inline: var(--crisp-space-1-5); font-size: var(--crisp-text-xs); border-radius: var(--crisp-radius-sm);
@@ -448,17 +458,19 @@
448
458
  }
449
459
  }
450
460
 
461
+
462
+ .crisp-contextmenu-content { font-family: var(--crisp-font-sans); position: fixed; z-index: 70; min-width: 200px; box-sizing: border-box; padding: var(--crisp-space-1); border-radius: var(--crisp-radius-xl); background: var(--crisp-bg-popover); box-shadow: inset 0 0 0 1px var(--crisp-ring-popover), 0 0 0 1px var(--crisp-shadow-popover1), 0 4px 8px -4px var(--crisp-shadow-popover2), 0 4px 12px -2px var(--crisp-shadow-popover3); opacity: 1; transform: none; transition: opacity .08s ease, transform .08s ease; transform-origin: top left; @starting-style { opacity: 0; transform: scale(0.97) translateY(-1px); } }
463
+ .crisp-contextmenu-item { display: flex; align-items: center; gap: var(--crisp-space-2); width: 100%; height: var(--crisp-size-menuRow); box-sizing: border-box; padding: 0 var(--crisp-space-2); margin: 0; border: none; border-radius: var(--crisp-radius-md); background: none; color: var(--crisp-fg-primary); font-family: inherit; font-size: var(--crisp-text-lg); text-align: start; white-space: nowrap; cursor: pointer; }
464
+ .crisp-contextmenu-item svg { flex-shrink: 0; color: var(--crisp-fg-muted); }
465
+ .crisp-contextmenu-item:hover { background: color-mix(in srgb, var(--crisp-fg-primary) 6%, transparent); }
466
+ .crisp-contextmenu-item--danger { color: var(--crisp-bg-danger); }
467
+ .crisp-contextmenu-item--danger svg { color: var(--crisp-bg-danger); }
468
+ .crisp-contextmenu-item--danger:hover { background: color-mix(in srgb, var(--crisp-bg-danger) 10%, transparent); }
469
+ .crisp-contextmenu-shortcut { margin-inline-start: auto; padding-inline-start: var(--crisp-space-3); color: var(--crisp-fg-muted); font-size: var(--crisp-text-sm); }
470
+ .crisp-contextmenu-sep { height: 1px; margin: var(--crisp-space-1) 0; border: none; background: var(--crisp-border-subtle); }
471
+
451
472
  .crisp-contextmenu {
452
473
  display: contents; font-family: var(--crisp-font-sans);
453
- & .crisp-contextmenu-content { position: fixed; z-index: 70; min-width: 200px; box-sizing: border-box; padding: var(--crisp-space-1); border-radius: var(--crisp-radius-xl); background: var(--crisp-bg-popover); box-shadow: inset 0 0 0 1px var(--crisp-ring-popover), 0 0 0 1px var(--crisp-shadow-popover1), 0 4px 8px -4px var(--crisp-shadow-popover2), 0 4px 12px -2px var(--crisp-shadow-popover3); opacity: 1; transform: none; transition: opacity .08s ease, transform .08s ease; transform-origin: top left; @starting-style { opacity: 0; transform: scale(0.97) translateY(-1px); } }
454
- & .crisp-contextmenu-item { display: flex; align-items: center; gap: var(--crisp-space-2); width: 100%; height: var(--crisp-size-menuRow); box-sizing: border-box; padding: 0 var(--crisp-space-2); margin: 0; border: none; border-radius: var(--crisp-radius-md); background: none; color: var(--crisp-fg-primary); font-family: inherit; font-size: var(--crisp-text-lg); text-align: start; white-space: nowrap; cursor: pointer; }
455
- & .crisp-contextmenu-item svg { flex-shrink: 0; color: var(--crisp-fg-muted); }
456
- & .crisp-contextmenu-item:hover { background: color-mix(in srgb, var(--crisp-fg-primary) 6%, transparent); }
457
- & .crisp-contextmenu-item--danger { color: var(--crisp-bg-danger); }
458
- & .crisp-contextmenu-item--danger svg { color: var(--crisp-bg-danger); }
459
- & .crisp-contextmenu-item--danger:hover { background: color-mix(in srgb, var(--crisp-bg-danger) 10%, transparent); }
460
- & .crisp-contextmenu-shortcut { margin-inline-start: auto; padding-inline-start: var(--crisp-space-3); color: var(--crisp-fg-muted); font-size: var(--crisp-text-sm); }
461
- & .crisp-contextmenu-sep { height: 1px; margin: var(--crisp-space-1) 0; border: none; background: var(--crisp-border-subtle); }
462
474
  }
463
475
 
464
476
  @media (prefers-reduced-motion: reduce) {
@@ -971,27 +983,42 @@
971
983
  & .crisp-linechart-axis-title { margin-top: var(--crisp-space-1); padding-inline-start: var(--crisp-linechart-yaxis-width); text-align: center; font-size: var(--crisp-text-sm); color: var(--crisp-fg-muted); }
972
984
  }
973
985
 
986
+
987
+ .crisp-menu-content {
988
+ font-family: var(--crisp-font-sans); -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale;
989
+ position: fixed; z-index: 70; box-sizing: border-box; display: flex; flex-direction: column; gap: var(--crisp-space-px);
990
+ min-width: 200px; max-height: 360px; overflow-y: auto; padding: var(--crisp-space-1);
991
+ border-radius: var(--crisp-radius-xl); background: var(--crisp-bg-popover);
992
+ box-shadow: inset 0 0 0 1px var(--crisp-ring-popover), 0 0 0 1px var(--crisp-shadow-popover1), 0 4px 8px -4px var(--crisp-shadow-popover2), 0 4px 12px -2px var(--crisp-shadow-popover3);
993
+ transform-origin: top left; opacity: 1; transform: none; transition: opacity .08s ease, transform .08s ease;
994
+ }
995
+ .crisp-menu-content[data-align="end"] { transform-origin: top right; }
996
+ .crisp-menu-content[data-up] { transform-origin: bottom left; }
997
+ .crisp-menu-content[data-up][data-align="end"] { transform-origin: bottom right; }
998
+ .crisp-menu-content { @starting-style { opacity: 0; transform: scale(0.97) translateY(-1px); } }
999
+
1000
+ .crisp-menu-item {
1001
+ box-sizing: border-box; display: flex; align-items: center; gap: var(--crisp-space-1-5); width: 100%; height: var(--crisp-size-menuRow); flex-shrink: 0;
1002
+ margin: 0; padding: 0 var(--crisp-space-2); border: none; background: none; border-radius: var(--crisp-radius-md);
1003
+ font-family: inherit; font-size: var(--crisp-text-lg); color: var(--crisp-fg-primary); text-align: start; cursor: pointer; white-space: nowrap;
1004
+ }
1005
+ .crisp-menu-item svg { flex-shrink: 0; color: var(--crisp-fg-muted); }
1006
+ .crisp-menu-item:focus { outline: none; }
1007
+ .crisp-menu-item:hover:not([data-disabled]), .crisp-menu-item:focus-visible:not([data-disabled]), .crisp-menu-item[data-highlighted]:not([data-disabled]) { background: var(--crisp-bg-raised); }
1008
+ .crisp-menu-item[data-disabled] { opacity: 0.5; cursor: not-allowed; }
1009
+ .crisp-menu-item--danger { color: var(--crisp-bg-danger); }
1010
+ .crisp-menu-item--danger svg { color: var(--crisp-bg-danger); }
1011
+ .crisp-menu-item--danger:hover, .crisp-menu-item--danger:focus-visible, .crisp-menu-item--danger[data-highlighted] { background: color-mix(in srgb, var(--crisp-bg-danger) 10%, transparent); }
1012
+ .crisp-menu-item-label { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; }
1013
+ .crisp-menu-item-shortcut { flex-shrink: 0; margin-inline-start: var(--crisp-space-3); font-size: var(--crisp-text-sm); color: var(--crisp-fg-muted); letter-spacing: 0.02em; }
1014
+ .crisp-menu-item-check { flex-shrink: 0; color: var(--crisp-bg-brand-solid); }
1015
+ .crisp-menu-item-check--placeholder { width: 15px; }
1016
+
1017
+ .crisp-menu-sep { height: 1px; flex-shrink: 0; border: none; margin: var(--crisp-space-1) calc(-1 * var(--crisp-space-1)); background: var(--crisp-border-subtle); }
1018
+ .crisp-menu-label { padding: var(--crisp-space-1-5) var(--crisp-space-2) var(--crisp-space-0-5); font-size: var(--crisp-text-sm); font-weight: var(--crisp-weight-medium); color: var(--crisp-fg-muted); }
1019
+
974
1020
  .crisp-menu {
975
1021
  position: relative; display: inline-flex; font-family: var(--crisp-font-sans); -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale;
976
- & .crisp-menu-content { position: fixed; z-index: 70; box-sizing: border-box; display: flex; flex-direction: column; gap: var(--crisp-space-px); min-width: 200px; max-height: 360px; overflow-y: auto; padding: var(--crisp-space-1); border-radius: var(--crisp-radius-xl); background: var(--crisp-bg-popover); box-shadow: inset 0 0 0 1px var(--crisp-ring-popover), 0 0 0 1px var(--crisp-shadow-popover1), 0 4px 8px -4px var(--crisp-shadow-popover2), 0 4px 12px -2px var(--crisp-shadow-popover3); transform-origin: top left; opacity: 1; transform: none; transition: opacity .08s ease, transform .08s ease; }
977
- & .crisp-menu-content[data-align="end"] { transform-origin: top right; }
978
- & .crisp-menu-content[data-up] { transform-origin: bottom left; }
979
- & .crisp-menu-content[data-up][data-align="end"] { transform-origin: bottom right; }
980
- & .crisp-menu-content { @starting-style { opacity: 0; transform: scale(0.97) translateY(-1px); } }
981
- & .crisp-menu-item { box-sizing: border-box; display: flex; align-items: center; gap: var(--crisp-space-1-5); width: 100%; height: var(--crisp-size-menuRow); flex-shrink: 0; margin: 0; padding: 0 var(--crisp-space-2); border: none; background: none; border-radius: var(--crisp-radius-md); font-family: inherit; font-size: var(--crisp-text-lg); color: var(--crisp-fg-primary); text-align: start; cursor: pointer; white-space: nowrap; }
982
- & .crisp-menu-item svg { flex-shrink: 0; color: var(--crisp-fg-muted); }
983
- & .crisp-menu-item:focus { outline: none; }
984
- & .crisp-menu-item:hover:not([data-disabled]), & .crisp-menu-item:focus-visible:not([data-disabled]), & .crisp-menu-item[data-highlighted]:not([data-disabled]) { background: var(--crisp-bg-raised); }
985
- & .crisp-menu-item[data-disabled] { opacity: 0.5; cursor: not-allowed; }
986
- & .crisp-menu-item--danger { color: var(--crisp-bg-danger); }
987
- & .crisp-menu-item--danger svg { color: var(--crisp-bg-danger); }
988
- & .crisp-menu-item--danger:hover, & .crisp-menu-item--danger:focus-visible, & .crisp-menu-item--danger[data-highlighted] { background: color-mix(in srgb, var(--crisp-bg-danger) 10%, transparent); }
989
- & .crisp-menu-item-label { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; }
990
- & .crisp-menu-item-shortcut { flex-shrink: 0; margin-inline-start: var(--crisp-space-3); font-size: var(--crisp-text-sm); color: var(--crisp-fg-muted); letter-spacing: 0.02em; }
991
- & .crisp-menu-item-check { flex-shrink: 0; color: var(--crisp-bg-brand-solid); }
992
- & .crisp-menu-item-check--placeholder { width: 15px; }
993
- & .crisp-menu-sep { height: 1px; flex-shrink: 0; border: none; margin: var(--crisp-space-1) calc(-1 * var(--crisp-space-1)); background: var(--crisp-border-subtle); }
994
- & .crisp-menu-label { padding: var(--crisp-space-1-5) var(--crisp-space-2) var(--crisp-space-0-5); font-size: var(--crisp-text-sm); font-weight: var(--crisp-weight-medium); color: var(--crisp-fg-muted); }
995
1022
  }
996
1023
 
997
1024
  @media (prefers-reduced-motion: reduce) {
@@ -1002,6 +1029,40 @@
1002
1029
  }
1003
1030
  }
1004
1031
 
1032
+
1033
+ .crisp-multiselect-listbox {
1034
+ font-family: var(--crisp-font-sans); -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale;
1035
+ position: fixed; z-index: 70; box-sizing: border-box; display: flex; flex-direction: column; gap: var(--crisp-space-px);
1036
+ max-height: 300px; overflow-y: auto; padding: var(--crisp-space-1);
1037
+ border-radius: var(--crisp-radius-xl); background: var(--crisp-bg-popover);
1038
+ box-shadow: inset 0 0 0 1px var(--crisp-ring-popover), 0 0 0 1px var(--crisp-shadow-popover1), 0 4px 8px -4px var(--crisp-shadow-popover2), 0 4px 12px -2px var(--crisp-shadow-popover3);
1039
+ transform-origin: top left; opacity: 1; transform: none; transition: opacity .08s ease, transform .08s ease;
1040
+ }
1041
+ .crisp-multiselect-listbox[data-up] { transform-origin: bottom left; }
1042
+ .crisp-multiselect-listbox { @starting-style { opacity: 0; transform: scale(0.97) translateY(-1px); } }
1043
+ .crisp-multiselect-search { display: flex; align-items: center; gap: var(--crisp-space-2); height: 34px; flex-shrink: 0; margin: calc(-1 * var(--crisp-space-1)) calc(-1 * var(--crisp-space-1)) var(--crisp-space-1); padding: 0 var(--crisp-space-2-5); border-bottom: 1px solid var(--crisp-border-subtle); color: var(--crisp-fg-muted); }
1044
+ .crisp-multiselect-search svg { flex-shrink: 0; }
1045
+ .crisp-multiselect-search input { flex: 1; min-width: 0; border: none; outline: none; background: none; font-family: inherit; font-size: var(--crisp-text-lg); color: var(--crisp-fg-primary); }
1046
+ .crisp-multiselect-search input::placeholder { color: var(--crisp-fg-muted); }
1047
+ .crisp-multiselect-option {
1048
+ box-sizing: border-box; display: flex; align-items: center; gap: var(--crisp-space-2); height: var(--crisp-size-menuRow); flex-shrink: 0;
1049
+ padding: 0 var(--crisp-space-2); margin: 0; border: none; background: none; border-radius: var(--crisp-radius-md); font-family: inherit; cursor: pointer; text-align: start;
1050
+ }
1051
+ .crisp-multiselect-option[data-highlighted] { background: var(--crisp-bg-raised); }
1052
+ .crisp-multiselect-option-chip { flex: 0 1 auto; min-width: 0; overflow: hidden; }
1053
+ .crisp-multiselect-check { flex-shrink: 0; margin-inline-start: auto; display: inline-flex; align-items: center; justify-content: center; width: 16px; height: 16px; border-radius: var(--crisp-radius-sm); box-shadow: inset 0 0 0 1.5px var(--crisp-border-default); color: transparent; }
1054
+ .crisp-multiselect-option[aria-selected="true"] .crisp-multiselect-check { background: var(--crisp-bg-brand-solid); box-shadow: none; color: #fff; }
1055
+ .crisp-multiselect-empty { padding: var(--crisp-space-3) var(--crisp-space-2); text-align: center; font-size: var(--crisp-text-md); color: var(--crisp-fg-muted); }
1056
+
1057
+ .crisp-recordstable-tag { display: inline-flex; align-items: center; height: var(--crisp-size-chip); padding: 0 var(--crisp-space-1); border-radius: var(--crisp-radius-chip); font-size: var(--crisp-text-lg); line-height: 20px; font-weight: var(--crisp-weight-medium); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; background: color-mix(in srgb, var(--crisp-fg-primary) 6%, transparent); color: color-mix(in srgb, var(--crisp-fg-primary) 82%, transparent); }
1058
+ .crisp-recordstable-tag[data-tone="brand"] { background: color-mix(in srgb, var(--crisp-bg-brand-solid) 14%, transparent); color: color-mix(in srgb, var(--crisp-bg-brand-solid) 82%, var(--crisp-fg-primary)); }
1059
+ .crisp-recordstable-tag[data-tone="success"] { background: color-mix(in srgb, var(--crisp-bg-success) 16%, transparent); color: color-mix(in srgb, var(--crisp-bg-success) 78%, var(--crisp-fg-primary)); }
1060
+ .crisp-recordstable-tag[data-tone="warning"] { background: color-mix(in srgb, var(--crisp-bg-warning) 18%, transparent); color: color-mix(in srgb, var(--crisp-bg-warning) 82%, var(--crisp-fg-primary)); }
1061
+ .crisp-recordstable-tag[data-tone="danger"] { background: color-mix(in srgb, var(--crisp-bg-danger) 15%, transparent); color: color-mix(in srgb, var(--crisp-bg-danger) 80%, var(--crisp-fg-primary)); }
1062
+ .crisp-recordstable-tag[data-tone="purple"] { background: color-mix(in srgb, var(--crisp-bg-purple) 16%, transparent); color: color-mix(in srgb, var(--crisp-bg-purple) 80%, var(--crisp-fg-primary)); }
1063
+ .crisp-recordstable-tag[data-tone="cyan"] { background: color-mix(in srgb, var(--crisp-bg-cyan) 18%, transparent); color: color-mix(in srgb, var(--crisp-bg-cyan) 82%, var(--crisp-fg-primary)); }
1064
+ .crisp-recordstable-tag[data-tone="orange"] { background: color-mix(in srgb, var(--crisp-bg-orange) 16%, transparent); color: color-mix(in srgb, var(--crisp-bg-orange) 82%, var(--crisp-fg-primary)); }
1065
+
1005
1066
  .crisp-multiselect {
1006
1067
  position: relative; display: inline-flex; width: 100%; font-family: var(--crisp-font-sans); -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale;
1007
1068
  & .crisp-multiselect-trigger { box-sizing: border-box; display: flex; align-items: center; gap: var(--crisp-space-1); width: 100%; min-width: 0; min-height: var(--crisp-size-menuRow); margin: 0; padding: var(--crisp-space-0-5) var(--crisp-space-1-5) var(--crisp-space-0-5) var(--crisp-space-2); border: none; border-radius: var(--crisp-radius-md); background: transparent; box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--crisp-fg-primary) 7%, transparent); font-family: inherit; font-size: var(--crisp-text-lg); color: var(--crisp-fg-primary); cursor: pointer; text-align: start; transition: background-color .12s ease, box-shadow .12s ease; }
@@ -1012,27 +1073,12 @@
1012
1073
  & .crisp-multiselect-placeholder { color: var(--crisp-fg-muted); }
1013
1074
  & .crisp-multiselect-chevron { flex-shrink: 0; color: var(--crisp-fg-muted); transition: transform .15s ease; }
1014
1075
  & .crisp-multiselect-trigger[data-open] .crisp-multiselect-chevron { transform: rotate(180deg); }
1015
- & .crisp-multiselect-listbox { position: fixed; z-index: 70; box-sizing: border-box; display: flex; flex-direction: column; gap: var(--crisp-space-px); max-height: 300px; overflow-y: auto; padding: var(--crisp-space-1); border-radius: var(--crisp-radius-xl); background: var(--crisp-bg-popover); box-shadow: inset 0 0 0 1px var(--crisp-ring-popover), 0 0 0 1px var(--crisp-shadow-popover1), 0 4px 8px -4px var(--crisp-shadow-popover2), 0 4px 12px -2px var(--crisp-shadow-popover3); transform-origin: top left; opacity: 1; transform: none; transition: opacity .08s ease, transform .08s ease; }
1016
- & .crisp-multiselect-listbox[data-up] { transform-origin: bottom left; }
1017
- & .crisp-multiselect-listbox { @starting-style { opacity: 0; transform: scale(0.97) translateY(-1px); } }
1018
- & .crisp-multiselect-search { display: flex; align-items: center; gap: var(--crisp-space-2); height: 34px; flex-shrink: 0; margin: calc(-1 * var(--crisp-space-1)) calc(-1 * var(--crisp-space-1)) var(--crisp-space-1); padding: 0 var(--crisp-space-2-5); border-bottom: 1px solid var(--crisp-border-subtle); color: var(--crisp-fg-muted); }
1019
- & .crisp-multiselect-search svg { flex-shrink: 0; }
1020
- & .crisp-multiselect-search input { flex: 1; min-width: 0; border: none; outline: none; background: none; font-family: inherit; font-size: var(--crisp-text-lg); color: var(--crisp-fg-primary); }
1021
- & .crisp-multiselect-search input::placeholder { color: var(--crisp-fg-muted); }
1022
- & .crisp-multiselect-option { box-sizing: border-box; display: flex; align-items: center; gap: var(--crisp-space-2); height: var(--crisp-size-menuRow); flex-shrink: 0; padding: 0 var(--crisp-space-2); margin: 0; border: none; background: none; border-radius: var(--crisp-radius-md); font-family: inherit; cursor: pointer; text-align: start; }
1023
- & .crisp-multiselect-option[data-highlighted] { background: var(--crisp-bg-raised); }
1024
- & .crisp-multiselect-option-chip { flex: 0 1 auto; min-width: 0; overflow: hidden; }
1025
- & .crisp-multiselect-check { flex-shrink: 0; margin-inline-start: auto; display: inline-flex; align-items: center; justify-content: center; width: 16px; height: 16px; border-radius: var(--crisp-radius-sm); box-shadow: inset 0 0 0 1.5px var(--crisp-border-default); color: transparent; }
1026
- & .crisp-multiselect-option[aria-selected="true"] .crisp-multiselect-check { background: var(--crisp-bg-brand-solid); box-shadow: none; color: #fff; }
1027
- & .crisp-multiselect-empty { padding: var(--crisp-space-3) var(--crisp-space-2); text-align: center; font-size: var(--crisp-text-md); color: var(--crisp-fg-muted); }
1028
- & .crisp-recordstable-tag { display: inline-flex; align-items: center; height: var(--crisp-size-chip); padding: 0 var(--crisp-space-1); border-radius: var(--crisp-radius-chip); font-size: var(--crisp-text-lg); line-height: 20px; font-weight: var(--crisp-weight-medium); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; background: color-mix(in srgb, var(--crisp-fg-primary) 6%, transparent); color: color-mix(in srgb, var(--crisp-fg-primary) 82%, transparent); }
1029
- & .crisp-recordstable-tag[data-tone="brand"] { background: color-mix(in srgb, var(--crisp-bg-brand-solid) 14%, transparent); color: color-mix(in srgb, var(--crisp-bg-brand-solid) 82%, var(--crisp-fg-primary)); }
1030
- & .crisp-recordstable-tag[data-tone="success"] { background: color-mix(in srgb, var(--crisp-bg-success) 16%, transparent); color: color-mix(in srgb, var(--crisp-bg-success) 78%, var(--crisp-fg-primary)); }
1031
- & .crisp-recordstable-tag[data-tone="warning"] { background: color-mix(in srgb, var(--crisp-bg-warning) 18%, transparent); color: color-mix(in srgb, var(--crisp-bg-warning) 82%, var(--crisp-fg-primary)); }
1032
- & .crisp-recordstable-tag[data-tone="danger"] { background: color-mix(in srgb, var(--crisp-bg-danger) 15%, transparent); color: color-mix(in srgb, var(--crisp-bg-danger) 80%, var(--crisp-fg-primary)); }
1033
- & .crisp-recordstable-tag[data-tone="purple"] { background: color-mix(in srgb, var(--crisp-bg-purple) 16%, transparent); color: color-mix(in srgb, var(--crisp-bg-purple) 80%, var(--crisp-fg-primary)); }
1034
- & .crisp-recordstable-tag[data-tone="cyan"] { background: color-mix(in srgb, var(--crisp-bg-cyan) 18%, transparent); color: color-mix(in srgb, var(--crisp-bg-cyan) 82%, var(--crisp-fg-primary)); }
1035
- & .crisp-recordstable-tag[data-tone="orange"] { background: color-mix(in srgb, var(--crisp-bg-orange) 16%, transparent); color: color-mix(in srgb, var(--crisp-bg-orange) 82%, var(--crisp-fg-primary)); }
1076
+ }
1077
+ .crisp-multiselect--invalid_true {
1078
+ & .crisp-multiselect-trigger, & .crisp-multiselect-trigger:hover, & .crisp-multiselect-trigger[data-open], & .crisp-multiselect-trigger:focus-visible { box-shadow: inset 0 0 0 1px var(--crisp-bg-danger); }
1079
+ }
1080
+ .crisp-multiselect--invalid_false {
1081
+
1036
1082
  }
1037
1083
 
1038
1084
  @media (prefers-reduced-motion: reduce) {
@@ -1043,11 +1089,13 @@
1043
1089
  }
1044
1090
  }
1045
1091
 
1092
+
1093
+ .crisp-popover-content { font-family: var(--crisp-font-sans); position: fixed; z-index: 70; box-sizing: border-box; min-width: 200px; max-width: min(360px, 92vw); padding: var(--crisp-space-1); border-radius: var(--crisp-radius-xl); background: var(--crisp-bg-popover); color: var(--crisp-fg-primary); box-shadow: inset 0 0 0 1px var(--crisp-ring-popover), 0 0 0 1px var(--crisp-shadow-popover1), 0 4px 8px -4px var(--crisp-shadow-popover2), 0 4px 12px -2px var(--crisp-shadow-popover3); opacity: 1; transform: none; transition: opacity 0.08s ease, transform 0.08s ease; transform-origin: top left; @starting-style { opacity: 0; transform: scale(0.97) translateY(-1px); } }
1094
+ .crisp-popover-content[data-align="end"] { transform-origin: top right; }
1095
+ .crisp-popover-content[data-up] { transform-origin: bottom left; }
1096
+
1046
1097
  .crisp-popover {
1047
1098
  display: contents; font-family: var(--crisp-font-sans);
1048
- & .crisp-popover-content { position: fixed; z-index: 70; box-sizing: border-box; min-width: 200px; max-width: min(360px, 92vw); padding: var(--crisp-space-1); border-radius: var(--crisp-radius-xl); background: var(--crisp-bg-popover); color: var(--crisp-fg-primary); box-shadow: inset 0 0 0 1px var(--crisp-ring-popover), 0 0 0 1px var(--crisp-shadow-popover1), 0 4px 8px -4px var(--crisp-shadow-popover2), 0 4px 12px -2px var(--crisp-shadow-popover3); opacity: 1; transform: none; transition: opacity 0.08s ease, transform 0.08s ease; transform-origin: top left; @starting-style { opacity: 0; transform: scale(0.97) translateY(-1px); } }
1049
- & .crisp-popover-content[data-align="end"] { transform-origin: top right; }
1050
- & .crisp-popover-content[data-up] { transform-origin: bottom left; }
1051
1099
  }
1052
1100
 
1053
1101
  @media (prefers-reduced-motion: reduce) {
@@ -1207,6 +1255,33 @@
1207
1255
  }
1208
1256
  }
1209
1257
 
1258
+
1259
+ .crisp-select-listbox {
1260
+ font-family: var(--crisp-font-sans); -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale;
1261
+ position: fixed; z-index: 70; box-sizing: border-box; display: flex; flex-direction: column; gap: var(--crisp-space-px);
1262
+ max-height: 280px; overflow-y: auto; padding: var(--crisp-space-1);
1263
+ border-radius: var(--crisp-radius-xl); background: var(--crisp-bg-popover);
1264
+ box-shadow: inset 0 0 0 1px var(--crisp-ring-popover), 0 0 0 1px var(--crisp-shadow-popover1), 0 4px 8px -4px var(--crisp-shadow-popover2), 0 4px 12px -2px var(--crisp-shadow-popover3);
1265
+ transform-origin: top left; opacity: 1; transform: none; transition: opacity .08s ease, transform .08s ease;
1266
+ }
1267
+ .crisp-select-listbox[data-up] { transform-origin: bottom; }
1268
+ .crisp-select-listbox { @starting-style { opacity: 0; transform: scale(0.97) translateY(-1px); } }
1269
+ .crisp-select-search { display: flex; align-items: center; gap: var(--crisp-space-2); height: 34px; flex-shrink: 0; margin: calc(-1 * var(--crisp-space-1)) calc(-1 * var(--crisp-space-1)) var(--crisp-space-1); padding: 0 var(--crisp-space-2-5); border-bottom: 1px solid var(--crisp-border-subtle); color: var(--crisp-fg-muted); }
1270
+ .crisp-select-search svg { flex-shrink: 0; }
1271
+ .crisp-select-search input { flex: 1; min-width: 0; border: none; outline: none; background: none; font-family: inherit; font-size: var(--crisp-text-lg); color: var(--crisp-fg-primary); }
1272
+ .crisp-select-search input::placeholder { color: var(--crisp-fg-muted); }
1273
+ .crisp-select-empty { padding: var(--crisp-space-3) var(--crisp-space-2); text-align: center; font-size: var(--crisp-text-md); color: var(--crisp-fg-muted); }
1274
+ .crisp-select-option {
1275
+ box-sizing: border-box; display: flex; align-items: center; gap: var(--crisp-space-2); height: var(--crisp-size-menuRow); flex-shrink: 0;
1276
+ padding: 0 var(--crisp-space-2); margin: 0; border: none; background: none; border-radius: var(--crisp-radius-md);
1277
+ font-family: inherit; font-size: var(--crisp-text-lg); color: var(--crisp-fg-primary); text-align: start; cursor: pointer; white-space: nowrap;
1278
+ }
1279
+ .crisp-select-option[data-highlighted] { background: var(--crisp-bg-raised); }
1280
+ .crisp-select-option[data-disabled] { opacity: 0.5; cursor: not-allowed; }
1281
+ .crisp-select-option-dot { flex-shrink: 0; width: 8px; height: 8px; border-radius: var(--crisp-radius-full); }
1282
+ .crisp-select-option-label { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; }
1283
+ .crisp-select-option-check { flex-shrink: 0; color: var(--crisp-bg-brand-solid); }
1284
+
1210
1285
  .crisp-select {
1211
1286
  position: relative; display: inline-flex; font-family: var(--crisp-font-sans); -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale;
1212
1287
  & .crisp-select-trigger { box-sizing: border-box; display: inline-flex; align-items: center; gap: var(--crisp-space-1-5); height: var(--crisp-size-menuRow); width: 100%; min-width: 0; margin: 0; padding: 0 var(--crisp-space-1-5) 0 var(--crisp-space-2); border: none; border-radius: var(--crisp-radius-md); background: transparent; box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--crisp-fg-primary) 7%, transparent); font-family: inherit; font-size: var(--crisp-text-lg); color: var(--crisp-fg-primary); cursor: pointer; transition: background-color .12s ease, box-shadow .12s ease; }
@@ -1217,20 +1292,6 @@
1217
1292
  & .crisp-select-placeholder { color: var(--crisp-fg-muted); }
1218
1293
  & .crisp-select-chevron { flex-shrink: 0; color: var(--crisp-fg-muted); transition: transform .15s ease; }
1219
1294
  & .crisp-select-trigger[data-open] .crisp-select-chevron { transform: rotate(180deg); }
1220
- & .crisp-select-listbox { position: fixed; z-index: 70; box-sizing: border-box; display: flex; flex-direction: column; gap: var(--crisp-space-px); max-height: 280px; overflow-y: auto; padding: var(--crisp-space-1); border-radius: var(--crisp-radius-xl); background: var(--crisp-bg-popover); box-shadow: inset 0 0 0 1px var(--crisp-ring-popover), 0 0 0 1px var(--crisp-shadow-popover1), 0 4px 8px -4px var(--crisp-shadow-popover2), 0 4px 12px -2px var(--crisp-shadow-popover3); transform-origin: top left; opacity: 1; transform: none; transition: opacity .08s ease, transform .08s ease; }
1221
- & .crisp-select-listbox[data-up] { transform-origin: bottom; }
1222
- & .crisp-select-listbox { @starting-style { opacity: 0; transform: scale(0.97) translateY(-1px); } }
1223
- & .crisp-select-search { display: flex; align-items: center; gap: var(--crisp-space-2); height: 34px; flex-shrink: 0; margin: calc(-1 * var(--crisp-space-1)) calc(-1 * var(--crisp-space-1)) var(--crisp-space-1); padding: 0 var(--crisp-space-2-5); border-bottom: 1px solid var(--crisp-border-subtle); color: var(--crisp-fg-muted); }
1224
- & .crisp-select-search svg { flex-shrink: 0; }
1225
- & .crisp-select-search input { flex: 1; min-width: 0; border: none; outline: none; background: none; font-family: inherit; font-size: var(--crisp-text-lg); color: var(--crisp-fg-primary); }
1226
- & .crisp-select-search input::placeholder { color: var(--crisp-fg-muted); }
1227
- & .crisp-select-empty { padding: var(--crisp-space-3) var(--crisp-space-2); text-align: center; font-size: var(--crisp-text-md); color: var(--crisp-fg-muted); }
1228
- & .crisp-select-option { box-sizing: border-box; display: flex; align-items: center; gap: var(--crisp-space-2); height: var(--crisp-size-menuRow); flex-shrink: 0; padding: 0 var(--crisp-space-2); margin: 0; border: none; background: none; border-radius: var(--crisp-radius-md); font-family: inherit; font-size: var(--crisp-text-lg); color: var(--crisp-fg-primary); text-align: start; cursor: pointer; white-space: nowrap; }
1229
- & .crisp-select-option[data-highlighted] { background: var(--crisp-bg-raised); }
1230
- & .crisp-select-option[data-disabled] { opacity: 0.5; cursor: not-allowed; }
1231
- & .crisp-select-option-dot { flex-shrink: 0; width: 8px; height: 8px; border-radius: var(--crisp-radius-full); }
1232
- & .crisp-select-option-label { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; }
1233
- & .crisp-select-option-check { flex-shrink: 0; color: var(--crisp-bg-brand-solid); }
1234
1295
  }
1235
1296
  .crisp-select--variant_default {
1236
1297
 
@@ -1246,6 +1307,12 @@
1246
1307
  .crisp-select--width_auto {
1247
1308
  width: auto;
1248
1309
  }
1310
+ .crisp-select--invalid_true {
1311
+ & .crisp-select-trigger, & .crisp-select-trigger:hover, & .crisp-select-trigger[data-open], & .crisp-select-trigger:focus-visible { box-shadow: inset 0 0 0 1px var(--crisp-bg-danger); }
1312
+ }
1313
+ .crisp-select--invalid_false {
1314
+
1315
+ }
1249
1316
 
1250
1317
  @media (prefers-reduced-motion: reduce) {
1251
1318
  .crisp-select, .crisp-select * {