@kyndryl-design-system/shidoka-applications 2.62.2 → 2.64.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 (178) hide show
  1. package/common/helpers/swiper.js +1 -1
  2. package/common/scss/form-input.scss +2 -4
  3. package/common/scss/gradients.scss +124 -0
  4. package/common/scss/menu-item.scss +195 -218
  5. package/components/ai/aiLaunchButton/aiLaunchButton.js +67 -14
  6. package/components/ai/aiLaunchButton/aiLaunchButton.js.map +1 -1
  7. package/components/ai/sourcesFeedback/aiSourcesFeedback.d.ts.map +1 -1
  8. package/components/ai/sourcesFeedback/aiSourcesFeedback.js +11 -25
  9. package/components/ai/sourcesFeedback/aiSourcesFeedback.js.map +1 -1
  10. package/components/ai/sourcesFeedback/index.js +1 -1
  11. package/components/global/header/headerFlyout.js +1 -1
  12. package/components/global/header/headerFlyouts.js +1 -1
  13. package/components/global/header/headerLink.js +1 -1
  14. package/components/global/header/headerNav.js +1 -1
  15. package/components/global/header/index.js +1 -1
  16. package/components/global/localNav/index.js +1 -1
  17. package/components/global/localNav/localNav.js +1 -1
  18. package/components/global/localNav/localNavLink.js +1 -1
  19. package/components/reusable/accordion/accordionItem.js +1 -1
  20. package/components/reusable/accordion/index.js +1 -1
  21. package/components/reusable/badge/badge.js +1 -1
  22. package/components/reusable/badge/index.js +1 -1
  23. package/components/reusable/blockCodeView/blockCodeView.js +1 -1
  24. package/components/reusable/blockCodeView/index.js +1 -1
  25. package/components/reusable/button/button.js +119 -65
  26. package/components/reusable/button/button.js.map +1 -1
  27. package/components/reusable/button/defs.d.ts +1 -2
  28. package/components/reusable/button/defs.d.ts.map +1 -1
  29. package/components/reusable/button/defs.js +1 -1
  30. package/components/reusable/button/defs.js.map +1 -1
  31. package/components/reusable/buttonGroup/buttonGroup.js +1 -1
  32. package/components/reusable/buttonGroup/index.js +1 -1
  33. package/components/reusable/card/card.d.ts +25 -8
  34. package/components/reusable/card/card.d.ts.map +1 -1
  35. package/components/reusable/card/card.js +358 -46
  36. package/components/reusable/card/card.js.map +1 -1
  37. package/components/reusable/card/index.js +1 -1
  38. package/components/reusable/checkbox/checkboxGroup.js +3 -4
  39. package/components/reusable/checkbox/checkboxGroup.js.map +1 -1
  40. package/components/reusable/checkbox/index.js +1 -1
  41. package/components/reusable/colorInput/colorInput.js +5 -6
  42. package/components/reusable/colorInput/colorInput.js.map +1 -1
  43. package/components/reusable/colorInput/index.js +1 -1
  44. package/components/reusable/datePicker/datepicker.js +3 -4
  45. package/components/reusable/datePicker/datepicker.js.map +1 -1
  46. package/components/reusable/datePicker/index.js +1 -1
  47. package/components/reusable/daterangepicker/daterangepicker.js +3 -4
  48. package/components/reusable/daterangepicker/daterangepicker.js.map +1 -1
  49. package/components/reusable/daterangepicker/index.js +1 -1
  50. package/components/reusable/dropdown/dropdown.d.ts.map +1 -1
  51. package/components/reusable/dropdown/dropdown.js +57 -34
  52. package/components/reusable/dropdown/dropdown.js.map +1 -1
  53. package/components/reusable/dropdown/dropdownOption.js +173 -192
  54. package/components/reusable/dropdown/dropdownOption.js.map +1 -1
  55. package/components/reusable/dropdown/enhancedDropdownOption.js +170 -185
  56. package/components/reusable/dropdown/enhancedDropdownOption.js.map +1 -1
  57. package/components/reusable/dropdown/index.js +1 -1
  58. package/components/reusable/fileUploader/fileUploader.js +1 -1
  59. package/components/reusable/fileUploader/fileUploaderListContainer.js +3 -3
  60. package/components/reusable/fileUploader/index.js +1 -1
  61. package/components/reusable/inlineConfirm/index.js +1 -1
  62. package/components/reusable/inlineConfirm/inlineConfirm.d.ts.map +1 -1
  63. package/components/reusable/inlineConfirm/inlineConfirm.js +3 -3
  64. package/components/reusable/inlineConfirm/inlineConfirm.js.map +1 -1
  65. package/components/reusable/link/defs.d.ts +1 -2
  66. package/components/reusable/link/defs.d.ts.map +1 -1
  67. package/components/reusable/link/defs.js +1 -1
  68. package/components/reusable/link/defs.js.map +1 -1
  69. package/components/reusable/link/link.d.ts.map +1 -1
  70. package/components/reusable/link/link.js +3 -20
  71. package/components/reusable/link/link.js.map +1 -1
  72. package/components/reusable/loaders/aiLoader.d.ts +18 -0
  73. package/components/reusable/loaders/aiLoader.d.ts.map +1 -0
  74. package/components/reusable/loaders/aiLoader.js +9 -0
  75. package/components/reusable/loaders/aiLoader.js.map +1 -0
  76. package/components/reusable/loaders/index.js +1 -1
  77. package/components/reusable/loaders/inline.d.ts.map +1 -1
  78. package/components/reusable/loaders/inline.js +5 -118
  79. package/components/reusable/loaders/inline.js.map +1 -1
  80. package/components/reusable/loaders/skeleton.d.ts +5 -1
  81. package/components/reusable/loaders/skeleton.d.ts.map +1 -1
  82. package/components/reusable/loaders/skeleton.js +39 -38
  83. package/components/reusable/loaders/skeleton.js.map +1 -1
  84. package/components/reusable/loaders/spinner.d.ts +47 -0
  85. package/components/reusable/loaders/spinner.d.ts.map +1 -0
  86. package/components/reusable/loaders/spinner.js +143 -0
  87. package/components/reusable/loaders/spinner.js.map +1 -0
  88. package/components/reusable/modal/index.js +1 -1
  89. package/components/reusable/modal/modal.d.ts +2 -0
  90. package/components/reusable/modal/modal.d.ts.map +1 -1
  91. package/components/reusable/modal/modal.js +59 -14
  92. package/components/reusable/modal/modal.js.map +1 -1
  93. package/components/reusable/multiInputField/index.js +1 -1
  94. package/components/reusable/multiInputField/multiInputField.js +3 -4
  95. package/components/reusable/multiInputField/multiInputField.js.map +1 -1
  96. package/components/reusable/notification/index.js +1 -1
  97. package/components/reusable/notification/notification.d.ts +15 -4
  98. package/components/reusable/notification/notification.d.ts.map +1 -1
  99. package/components/reusable/notification/notification.js +75 -21
  100. package/components/reusable/notification/notification.js.map +1 -1
  101. package/components/reusable/notification/notificationContainer.js +3 -2
  102. package/components/reusable/notification/notificationContainer.js.map +1 -1
  103. package/components/reusable/numberInput/index.js +1 -1
  104. package/components/reusable/numberInput/numberInput.js +3 -4
  105. package/components/reusable/numberInput/numberInput.js.map +1 -1
  106. package/components/reusable/overflowMenu/index.js +1 -1
  107. package/components/reusable/overflowMenu/overflowMenu.js +4 -4
  108. package/components/reusable/overflowMenu/overflowMenuItem.js +167 -196
  109. package/components/reusable/overflowMenu/overflowMenuItem.js.map +1 -1
  110. package/components/reusable/pagetitle/pageTitle.js +20 -20
  111. package/components/reusable/pagination/Pagination.js +1 -1
  112. package/components/reusable/pagination/index.js +1 -1
  113. package/components/reusable/pagination/pagination-navigation-buttons.js +1 -1
  114. package/components/reusable/pagination/pagination-page-size-dropdown.js +1 -1
  115. package/components/reusable/popover/index.js +1 -1
  116. package/components/reusable/popover/popover.js +1 -1
  117. package/components/reusable/progressBar/index.js +1 -1
  118. package/components/reusable/progressBar/progressBar.js +3 -4
  119. package/components/reusable/progressBar/progressBar.js.map +1 -1
  120. package/components/reusable/radioButton/index.js +1 -1
  121. package/components/reusable/radioButton/radioButtonGroup.js +3 -4
  122. package/components/reusable/radioButton/radioButtonGroup.js.map +1 -1
  123. package/components/reusable/search/index.js +1 -1
  124. package/components/reusable/search/search.js +1 -1
  125. package/components/reusable/sideDrawer/index.js +1 -1
  126. package/components/reusable/sideDrawer/sideDrawer.d.ts +2 -0
  127. package/components/reusable/sideDrawer/sideDrawer.d.ts.map +1 -1
  128. package/components/reusable/sideDrawer/sideDrawer.js +75 -26
  129. package/components/reusable/sideDrawer/sideDrawer.js.map +1 -1
  130. package/components/reusable/sliderInput/index.js +1 -1
  131. package/components/reusable/sliderInput/sliderInput.js +3 -4
  132. package/components/reusable/sliderInput/sliderInput.js.map +1 -1
  133. package/components/reusable/splitButton/index.js +1 -1
  134. package/components/reusable/splitButton/splitButton.js +1 -1
  135. package/components/reusable/stepper/index.js +1 -1
  136. package/components/reusable/stepper/stepper.js +1 -1
  137. package/components/reusable/stepper/stepperItem.js +1 -1
  138. package/components/reusable/table/index.js +1 -1
  139. package/components/reusable/table/table-body.js +1 -1
  140. package/components/reusable/table/table-header-row.js +1 -1
  141. package/components/reusable/table/table-header.js +3 -3
  142. package/components/reusable/table/table-row.js +1 -1
  143. package/components/reusable/table/table.skeleton.js +1 -1
  144. package/components/reusable/tabs/tab.js +203 -25
  145. package/components/reusable/tabs/tab.js.map +1 -1
  146. package/components/reusable/tabs/tabs.js +19 -14
  147. package/components/reusable/tabs/tabs.js.map +1 -1
  148. package/components/reusable/tag/index.js +1 -1
  149. package/components/reusable/tag/tag.js +1 -1
  150. package/components/reusable/tag/tagGroup.js +1 -1
  151. package/components/reusable/textArea/index.js +1 -1
  152. package/components/reusable/textArea/textArea.js +69 -13
  153. package/components/reusable/textArea/textArea.js.map +1 -1
  154. package/components/reusable/textInput/index.js +1 -1
  155. package/components/reusable/textInput/textInput.js +4 -4
  156. package/components/reusable/timepicker/index.js +1 -1
  157. package/components/reusable/timepicker/timepicker.js +3 -4
  158. package/components/reusable/timepicker/timepicker.js.map +1 -1
  159. package/components/reusable/toggleButton/toggleButton.js +4 -5
  160. package/components/reusable/toggleButton/toggleButton.js.map +1 -1
  161. package/components/reusable/tooltip/index.js +1 -1
  162. package/components/reusable/tooltip/tooltip.js +1 -1
  163. package/components/reusable/widget/index.js +1 -1
  164. package/components/reusable/widget/widget.d.ts +5 -0
  165. package/components/reusable/widget/widget.d.ts.map +1 -1
  166. package/components/reusable/widget/widget.js +11 -4
  167. package/components/reusable/widget/widget.js.map +1 -1
  168. package/components/reusable/widget/widgetDragHandle.js +1 -1
  169. package/index.js +1 -1
  170. package/inline-CS33Oojd.js +107 -0
  171. package/inline-CS33Oojd.js.map +1 -0
  172. package/package.json +5 -5
  173. package/{shidoka-flatpickr-theme-NL6HWM6Q.js → shidoka-flatpickr-theme-DOQOMmsp.js} +3 -4
  174. package/{shidoka-flatpickr-theme-NL6HWM6Q.js.map → shidoka-flatpickr-theme-DOQOMmsp.js.map} +1 -1
  175. package/vendor/@kyndryl-design-system/shidoka-icons-DALQfz_R.js +2 -0
  176. package/vendor/@kyndryl-design-system/shidoka-icons-DALQfz_R.js.map +1 -0
  177. package/vendor/@kyndryl-design-system/shidoka-icons-IJ2y2-L_.js +0 -2
  178. package/vendor/@kyndryl-design-system/shidoka-icons-IJ2y2-L_.js.map +0 -1
@@ -1,2 +1,2 @@
1
- import{a as e}from"../../vendor/@kyndryl-design-system/shidoka-icons-IJ2y2-L_.js";const n={slidesPerView:1.25,centeredSlides:!0,spaceBetween:16,breakpoints:{672:{slidesPerView:"auto",spaceBetween:24}},keyboard:{enabled:!0},mousewheel:{enabled:!0,forceToAxis:!0},navigation:{nextEl:".swiper-button-next",prevEl:".swiper-button-prev"},scrollbar:{el:".swiper-scrollbar",draggable:!0},pagination:{el:".swiper-pagination",clickable:!0,type:"fraction"},on:{init:function(n){n.navigation.prevEl.innerHTML=e,n.navigation.nextEl.innerHTML=e,t(n)},transitionEnd:function(e){t(e)},scrollbarDragEnd:function(e){t(e)}}},t=e=>{const n=e.el.getBoundingClientRect();e.slides.forEach((e=>{const t=e.getBoundingClientRect();t.left<n.left||t.right>n.width+n.left?(e.classList.add("off-screen"),e.setAttribute("aria-disabled","true")):(e.classList.remove("off-screen"),e.setAttribute("aria-disabled","false"))}))};export{n as SwiperConfig};
1
+ import{a as e}from"../../vendor/@kyndryl-design-system/shidoka-icons-DALQfz_R.js";const n={slidesPerView:1.25,centeredSlides:!0,spaceBetween:16,breakpoints:{672:{slidesPerView:"auto",spaceBetween:24}},keyboard:{enabled:!0},mousewheel:{enabled:!0,forceToAxis:!0},navigation:{nextEl:".swiper-button-next",prevEl:".swiper-button-prev"},scrollbar:{el:".swiper-scrollbar",draggable:!0},pagination:{el:".swiper-pagination",clickable:!0,type:"fraction"},on:{init:function(n){n.navigation.prevEl.innerHTML=e,n.navigation.nextEl.innerHTML=e,t(n)},transitionEnd:function(e){t(e)},scrollbarDragEnd:function(e){t(e)}}},t=e=>{const n=e.el.getBoundingClientRect();e.slides.forEach((e=>{const t=e.getBoundingClientRect();t.left<n.left||t.right>n.width+n.left?(e.classList.add("off-screen"),e.setAttribute("aria-disabled","true")):(e.classList.remove("off-screen"),e.setAttribute("aria-disabled","false"))}))};export{n as SwiperConfig};
2
2
  //# sourceMappingURL=swiper.js.map
@@ -68,7 +68,6 @@ input,
68
68
  textarea {
69
69
  @include typography.type-body-02;
70
70
  pointer-events: auto;
71
-
72
71
  border-color: var(--kd-color-border-forms-default);
73
72
  color: var(--kd-color-text-forms-input-field-text);
74
73
  transition: background-color 150ms ease-out, border-color 150ms ease-out,
@@ -78,11 +77,10 @@ textarea {
78
77
  outline-offset: -2px;
79
78
 
80
79
  .ai-connected & {
81
- border-color: var(--kd-color-border-variants-ai);
82
- background: var(--kd-color-background-forms-ai-default);
80
+ background: var(--kd-color-background-forms-default);
83
81
 
84
82
  &:focus-visible {
85
- outline-color: var(--kd-color-border-variants-ai);
83
+ outline-color: var(--kd-color-border-variants-focus);
86
84
  }
87
85
  }
88
86
 
@@ -0,0 +1,124 @@
1
+ $ai-gradient-default: var(
2
+ --kd-gradient-border-ai-default,
3
+ linear-gradient(
4
+ to bottom,
5
+ var(--kd-color-border-ai-default-gradient-start),
6
+ var(--kd-color-border-ai-default-gradient-end)
7
+ )
8
+ );
9
+
10
+ @mixin border-gradient-ai(
11
+ $gradient,
12
+ $radius: 8px,
13
+ $width: 1px,
14
+ $surface: var(--kd-color-background-ui-hollow-default)
15
+ ) {
16
+ box-sizing: border-box;
17
+ border-radius: $radius;
18
+ border: $width solid transparent;
19
+
20
+ background: linear-gradient(#{$surface}, #{$surface}) padding-box,
21
+ #{$gradient} border-box;
22
+
23
+ background-clip: padding-box, border-box;
24
+ background-origin: border-box, border-box;
25
+
26
+ background-size: calc(100% + 2px) calc(100% + 2px), cover;
27
+ background-position: center, center;
28
+ background-repeat: no-repeat, no-repeat;
29
+ }
30
+
31
+ @mixin outline-gradient-ai(
32
+ $gradient,
33
+ $radius: 8px,
34
+ $width: 1px,
35
+ $surface: var(--kd-color-background-ui-hollow-default),
36
+ $outside: false
37
+ ) {
38
+ position: relative;
39
+
40
+ &::after {
41
+ content: '';
42
+ position: absolute;
43
+ inset: if($outside, -#{$width}, 0);
44
+ border-radius: $radius;
45
+ pointer-events: none;
46
+ z-index: 1;
47
+
48
+ background: #{$gradient};
49
+
50
+ padding: #{$width};
51
+ -webkit-mask: linear-gradient(#fff 0 0) content-box,
52
+ linear-gradient(#fff 0 0);
53
+ -webkit-mask-composite: xor;
54
+ mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
55
+ mask-composite: exclude;
56
+ }
57
+ }
58
+
59
+ @mixin gradient-ring($radius, $width, $bg, $g: $ai-gradient-default) {
60
+ &::before {
61
+ content: '';
62
+ position: absolute;
63
+ inset: 0;
64
+ border-radius: $radius;
65
+ padding: $width;
66
+ background: $g;
67
+ pointer-events: none;
68
+ mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
69
+ -webkit-mask: linear-gradient(#000 0 0) content-box,
70
+ linear-gradient(#000 0 0);
71
+ -webkit-mask-composite: xor;
72
+ mask-composite: exclude;
73
+ box-shadow: inset 0 0 0 999px #0000;
74
+ z-index: 1;
75
+ }
76
+ background: $bg;
77
+ }
78
+
79
+ .g-border-ai {
80
+ @include border-gradient-ai($gradient: $ai-gradient-default);
81
+ }
82
+
83
+ .g-outline-ai {
84
+ @include outline-gradient-ai($gradient: $ai-gradient-default);
85
+ }
86
+
87
+ /// Gradient Backgrounds for AI-connected components
88
+ :root {
89
+ --ai-radial-strength: 20%;
90
+ --ai-radial-outer: 75%;
91
+ --ai-right-strength: 15%;
92
+ --ai-right-spread: 55%;
93
+ }
94
+
95
+ dialog.ai-connected.gradient-bkg {
96
+ background-color: var(--kd-color-background-container-ai-default);
97
+
98
+ background-image: radial-gradient(
99
+ circle at 0% 0%,
100
+ color-mix(
101
+ in oklab,
102
+ var(--kd-color-border-ai-default-gradient-start)
103
+ var(--ai-radial-strength),
104
+ transparent
105
+ )
106
+ 0%,
107
+ transparent 35%
108
+ ),
109
+ radial-gradient(
110
+ circle at 100% 50%,
111
+ color-mix(
112
+ in oklab,
113
+ var(--kd-color-border-ai-default-gradient-end)
114
+ var(--ai-right-strength),
115
+ transparent
116
+ )
117
+ 0%,
118
+ transparent var(--ai-right-spread)
119
+ );
120
+
121
+ background-repeat: no-repeat, no-repeat;
122
+ background-position: 0 0, 100% 50%;
123
+ background-size: cover, cover;
124
+ }
@@ -1,7 +1,9 @@
1
- @use './global.scss';
1
+ @use '../scss/global.scss';
2
2
  @use '@kyndryl-design-system/shidoka-foundation/scss/mixins/elevation.scss';
3
3
  @use '@kyndryl-design-system/shidoka-foundation/scss/mixins/typography.scss';
4
+ @use '../../common/scss/gradients.scss' as gradient;
4
5
 
6
+ // ==== mixins ====
5
7
  @mixin state-colors($bg, $text, $icon: null) {
6
8
  background-color: $bg;
7
9
 
@@ -23,13 +25,13 @@
23
25
  color: var(--kd-color-text-level-disabled);
24
26
  }
25
27
 
26
- &:hover {
28
+ &,
29
+ & * {
27
30
  cursor: not-allowed;
28
- background-color: $bg-default;
29
31
  }
30
32
 
31
- kyn-checkbox:hover {
32
- cursor: not-allowed;
33
+ &:hover {
34
+ background-color: $bg-default;
33
35
  }
34
36
  }
35
37
 
@@ -37,22 +39,74 @@
37
39
  color: var(--kd-color-text-variant-destructive);
38
40
  border-top: 1px solid var(--kd-color-border-level-tertiary);
39
41
 
40
- &:hover:not([disabled]) {
42
+ .menu-item-inner-el {
43
+ color: var(--kd-color-text-variant-destructive);
44
+ }
45
+
46
+ &:hover {
41
47
  background-color: var(--kd-color-status-error-light);
42
48
  }
43
49
 
44
- .menu-item-inner-el {
45
- color: var(--kd-color-text-variant-destructive);
50
+ &:focus-visible {
51
+ outline: 2px solid var(--kd-color-border-button-primary-destructive-default);
52
+ background-color: var(--kd-color-status-error-light);
53
+
54
+ .menu-item-inner-el {
55
+ color: var(--kd-color-text-level-primary);
56
+ }
46
57
  }
47
58
  }
48
59
 
49
- .menu-item[highlighted] {
50
- outline: 1px solid var(--kd-color-border-variants-focus);
60
+ @mixin border-gradient-ai(
61
+ $gradient,
62
+ $radius: 4px,
63
+ $width: 1px,
64
+ $surface: transparent
65
+ ) {
66
+ box-sizing: border-box;
67
+ border: $width solid transparent;
68
+ border-radius: $radius;
69
+ background: linear-gradient(#{$surface}, #{$surface}) padding-box,
70
+ #{$gradient} border-box;
71
+ background-clip: padding-box, border-box;
51
72
  }
52
73
 
53
- .menu-item {
74
+ // Centralized pressed mixin to avoid drift between variants.
75
+ // $layered=true uses `background` (not `background-color`) to overwrite any gradient layers.
76
+ // $important=true adds `!important` to the background
77
+ @mixin pressed($bg, $text, $icon, $layered: true, $important: true) {
78
+ @if $layered {
79
+ @if $important {
80
+ background: $bg !important;
81
+ } @else {
82
+ background: $bg;
83
+ }
84
+ } @else {
85
+ @if $important {
86
+ background-color: $bg !important;
87
+ } @else {
88
+ background-color: $bg;
89
+ }
90
+ }
91
+
92
+ border: 1px solid transparent;
93
+
94
+ .menu-item-inner-el {
95
+ color: $text;
96
+ }
97
+
98
+ slot[name='icon']::slotted(span),
99
+ .check-icon {
100
+ color: $icon;
101
+ }
102
+ }
103
+
104
+ // ==== defaults ====
105
+ :host .menu-item {
54
106
  background-color: var(--kd-color-background-menu-state-default);
55
107
  transition: background-color 150ms ease-out;
108
+ outline: 2px solid transparent;
109
+ outline-offset: -2px;
56
110
 
57
111
  .menu-item-inner-el {
58
112
  color: var(--kd-color-text-level-primary);
@@ -63,258 +117,181 @@
63
117
  }
64
118
  }
65
119
 
66
- // hover
67
- &:hover:not([disabled]) {
68
- @include state-colors(
69
- var(--kd-color-background-menu-state-hover),
70
- var(--kd-color-text-level-light),
71
- var(--kd-color-icon-light)
72
- );
120
+ // 1) focus/open (general; disabled/readonly/destructive overrides below)
121
+ &:focus,
122
+ &:focus-within,
123
+ &:focus-visible {
124
+ outline-color: var(--kd-color-border-variants-focus);
125
+ background-color: var(--kd-color-background-menu-state-focused);
73
126
  }
74
127
 
75
- // readonly
76
- &[readonly] {
128
+ // 2) disabled
129
+ &[disabled] {
130
+ @include disabled-common(var(--kd-color-background-menu-state-default));
131
+ outline: none;
132
+ border: none;
133
+ }
134
+ // ensure disabled wins over general focus styles
135
+ &[disabled]:focus,
136
+ &[disabled]:focus-within,
137
+ &[disabled]:focus-visible {
138
+ outline: none;
77
139
  border: none;
140
+ }
141
+
142
+ // 3) readonly (non-disabled)
143
+ &[readonly] {
78
144
  cursor: default;
145
+
146
+ background-color: var(--kd-color-background-menu-state-default);
147
+ }
148
+ &[readonly]:hover,
149
+ &[readonly]:active,
150
+ &[readonly]:focus,
151
+ &[readonly]:focus-visible {
79
152
  background-color: var(--kd-color-background-menu-state-default);
80
153
 
81
- &:hover,
82
- &:active:not([disabled]),
83
- &:active,
84
- &:focus-visible {
85
- background-color: var(--kd-color-background-menu-state-default);
86
- border: none;
87
- outline: none;
88
-
89
- .menu-item-inner-el {
90
- color: var(--kd-color-text-level-primary);
91
- }
92
-
93
- &.check-icon {
94
- color: var(--kd-color-icon-primary);
95
- }
96
-
97
- slot[name='icon']::slotted(span) {
98
- color: var(--kd-color-icon-primary);
99
- }
154
+ .menu-item-inner-el {
155
+ color: var(--kd-color-text-level-primary);
100
156
  }
101
-
102
- // disabled + readonly
103
- &[disabled] {
104
- @include disabled-common(var(--kd-color-background-forms-default));
105
-
106
- &:hover {
107
- .menu-item-inner-el {
108
- color: var(--kd-color-text-level-disabled);
109
- }
110
-
111
- &.check-icon {
112
- color: var(--kd-color-icon-disabled);
113
- }
114
-
115
- slot[name='icon']::slotted(span) {
116
- color: var(--kd-color-icon-disabled);
117
- }
118
- }
157
+ & .check-icon {
158
+ color: var(--kd-color-icon-primary);
119
159
  }
120
-
121
- // selected + readonly
122
- &[selected]:not([disabled]) {
123
- background-color: var(--kd-color-background-forms-default);
124
-
125
- &:hover {
126
- background: var(--kd-color-background-forms-default);
127
- }
160
+ slot[name='icon']::slotted(span) {
161
+ color: var(--kd-color-icon-primary);
128
162
  }
163
+ }
129
164
 
130
- &[selected]:not([disabled]):hover,
131
- &[selected]:not([disabled]):active {
132
- background: var(--kd-color-background-forms-default);
133
-
134
- .menu-item-inner-el {
135
- color: var(--kd-color-text-level-primary);
136
- }
137
-
138
- &.check-icon {
139
- color: var(--kd-color-icon-primary);
140
- }
141
-
142
- slot[name='icon']::slotted(span) {
143
- color: var(--kd-color-icon-primary);
144
- }
145
- }
165
+ // selected + readonly
166
+ &[readonly][selected] {
167
+ background-color: var(--kd-color-background-forms-default);
168
+ }
169
+ &[readonly][selected]:hover,
170
+ &[readonly][selected]:active {
171
+ background-color: var(--kd-color-background-forms-default);
172
+ }
146
173
 
147
- &:is(:active, [highlighted]) {
148
- background: var(--kd-color-background-forms-default) !important;
149
- }
174
+ // highlighted/active guard
175
+ &[readonly]:active,
176
+ &[readonly][highlighted] {
177
+ background: var(--kd-color-background-forms-default) !important;
150
178
  }
151
179
 
152
- // focus / focus-within
153
- &:is(:focus, :focus-within, :focus-visible):not([disabled]) {
180
+ // 4) hover (non-AI)
181
+ &:hover {
154
182
  @include state-colors(
155
- var(--kd-color-background-menu-state-open),
156
- var(--kd-color-text-level-primary)
183
+ var(--kd-color-background-menu-state-hover),
184
+ var(--kd-color-text-level-light),
185
+ var(--kd-color-icon-light)
157
186
  );
158
- outline: 2px solid var(--kd-color-border-variants-focus);
159
- outline-offset: -2px;
160
187
  }
188
+ // cancel hover when readonly/disabled/ai-connected/destructive
189
+ // &[disabled]:hover,
190
+ // &[readonly]:hover,
191
+ // &.ai-connected:hover,
192
+ // &.destructive:hover {
161
193
 
162
- // selected
163
- &[selected]:not([disabled]) {
194
+ // }
195
+
196
+ // 5) selected (non-disabled)
197
+ &[selected] {
164
198
  @include state-colors(
165
199
  var(--kd-color-background-menu-state-open),
166
200
  var(--kd-color-text-level-primary)
167
201
  );
168
-
169
- &:hover {
170
- @include state-colors(
171
- var(--kd-color-background-menu-state-hover),
172
- var(--kd-color-text-level-light)
173
- );
174
- }
175
202
  }
176
-
177
- // highlighted
178
- &[highlighted]:not([disabled]),
179
- &[selected][highlighted]:not([disabled]),
180
- &[highlighted]:is(:focus, :focus-within, :focus-visible):not([disabled]) {
203
+ &[selected]:hover {
181
204
  @include state-colors(
182
205
  var(--kd-color-background-menu-state-hover),
183
206
  var(--kd-color-text-level-light)
184
207
  );
185
208
  }
186
209
 
187
- // active / pressed
188
- &:active:not([disabled]),
189
- &:has(:active):not([disabled]),
190
- &[selected]:active:not([disabled]),
191
- &[selected]:has(:active):not([disabled]),
192
- &[highlighted]:active:not([disabled]),
193
- &[highlighted]:has(:active):not([disabled]),
194
- &[selected][highlighted]:active:not([disabled]),
195
- &[selected][highlighted]:has(:active):not([disabled]) {
196
- @include state-colors(
197
- var(--kd-color-background-menu-state-pressed),
198
- var(--kd-color-text-level-light)
199
- );
200
- }
201
-
202
- // disabled
203
- &[disabled] {
204
- @include disabled-common(var(--kd-color-background-menu-state-default));
205
- }
206
-
210
+ // leave commented out for now as it causes issues with keyboard nav
211
+ // 6) highlighted (non-disabled)
212
+ // &[highlighted] {
213
+ // @include state-colors(
214
+ // var(--kd-color-background-menu-state-hover),
215
+ // var(--kd-color-text-level-light)
216
+ // );
217
+ // // default (non-AI) focus ring
218
+ // outline: 1px solid var(--kd-color-border-variants-focus);
219
+ // }
220
+
221
+ // ----- AI variant -----
207
222
  &.ai-connected {
208
223
  background-color: var(--kd-color-background-menu-state-ai-default);
224
+ color: var(--kd-color-text-level-primary);
209
225
  }
210
226
 
211
- // destructive
212
- &.destructive {
213
- @include destructive-common;
214
- }
227
+ // &.ai-connected:focus,
228
+ // &.ai-connected:focus-within,
229
+ // &.ai-connected:focus-visible {
230
+ // }
215
231
 
216
- // AI variant
217
- &.ai-connected:not(.option-is-readonly) {
218
- @include state-colors(
219
- var(--kd-color-background-menu-state-ai-pressed),
220
- var(--kd-color-text-level-light)
221
- );
232
+ &.ai-connected:hover {
233
+ background-color: var(--kd-color-background-menu-state-ai-hover);
222
234
 
223
- &:hover:not([disabled]) {
224
- @include state-colors(
225
- var(--kd-color-background-menu-state-ai-hover),
226
- var(--kd-color-text-level-light)
227
- );
235
+ .menu-item-inner-el {
236
+ color: var(--kd-color-text-level-primary);
228
237
  }
229
-
230
- &:is(:focus, :focus-within, :focus-visible):not([disabled]) {
231
- @include state-colors(
232
- var(--kd-color-background-menu-state-ai-open),
233
- var(--kd-color-text-level-primary)
234
- );
235
- outline: 2px solid var(--kd-color-border-button-ai-state-focused) !important;
236
- outline-offset: -2px !important;
237
- }
238
-
239
- &:active:not([disabled]) {
240
- @include state-colors(
241
- var(--kd-color-background-menu-state-ai-pressed),
242
- var(--kd-color-text-level-light)
243
- );
238
+ slot[name='icon']::slotted(span),
239
+ .check-icon {
240
+ color: var(--kd-color-icon-primary);
244
241
  }
242
+ }
245
243
 
246
- &[selected]:not([disabled]),
247
- &[highlighted]:not([disabled]) {
248
- @include state-colors(
249
- var(--kd-color-background-menu-state-ai-open),
250
- var(--kd-color-text-level-primary)
251
- );
252
-
253
- &:hover {
254
- @include state-colors(
255
- var(--kd-color-background-menu-state-ai-hover),
256
- var(--kd-color-text-level-light)
257
- );
258
- }
259
- }
244
+ &.ai-connected[highlighted] {
245
+ background-color: var(--kd-color-background-menu-state-ai-focused);
246
+ }
260
247
 
261
- &[disabled] {
262
- @include disabled-common(
263
- var(--kd-color-background-menu-state-ai-default)
264
- );
248
+ &.ai-connected[selected]:hover,
249
+ &.ai-connected[highlighted]:hover {
250
+ @include state-colors(
251
+ var(--kd-color-background-menu-state-ai-hover),
252
+ var(--kd-color-text-level-primary)
253
+ );
254
+ slot[name='icon']::slotted(span),
255
+ .check-icon {
256
+ color: var(--kd-color-icon-primary);
265
257
  }
258
+ }
266
259
 
267
- &.destructive {
268
- @include destructive-common;
269
- }
260
+ &.ai-connected:active,
261
+ &.ai-connected[data-pressed],
262
+ &.ai-connected:hover:active,
263
+ &.ai-connected:hover[data-pressed] {
264
+ @include pressed(
265
+ var(--kd-color-background-menu-state-ai-pressed),
266
+ var(--kd-color-text-level-primary),
267
+ var(--kd-color-icon-primary),
268
+ $layered: true,
269
+ $important: true
270
+ );
270
271
  }
271
- }
272
272
 
273
- // duplicate explicit selectors retained (for specificity)
274
- .menu-item[highlighted]:not([disabled]) {
275
- @include state-colors(
276
- var(--kd-color-background-menu-state-hover),
277
- var(--kd-color-text-level-light)
278
- );
279
- }
273
+ &.ai-connected[disabled] {
274
+ @include disabled-common(var(--kd-color-background-menu-state-ai-default));
275
+ }
280
276
 
281
- .menu-item:is(:focus, :focus-visible):not([disabled]) {
282
- @include state-colors(
283
- var(--kd-color-background-menu-state-open),
284
- var(--kd-color-text-level-primary)
285
- );
286
- outline: 2px solid var(--kd-color-border-variants-focus);
287
- outline-offset: -2px;
277
+ // Destructive variant
278
+ &.destructive {
279
+ @include destructive-common;
280
+ }
288
281
  }
289
282
 
290
- .menu-item:active:not([disabled]) {
291
- @include state-colors(
283
+ // ---- pressed states (non-AI) ----
284
+ :host .menu-item:active,
285
+ :host .menu-item[data-pressed],
286
+ :host .menu-item[selected]:active,
287
+ :host .menu-item[selected][data-pressed],
288
+ :host .menu-item[highlighted]:active,
289
+ :host .menu-item[highlighted][data-pressed] {
290
+ @include pressed(
292
291
  var(--kd-color-background-menu-state-pressed),
293
- var(--kd-color-text-level-light)
294
- );
295
- }
296
-
297
- .menu-item.ai-connected[highlighted]:not([disabled]) {
298
- @include state-colors(
299
- var(--kd-color-background-menu-state-ai-open),
300
- var(--kd-color-text-level-light)
301
- );
302
- }
303
-
304
- .menu-item.ai-connected:is(:focus, :focus-within, :focus-visible):not(
305
- [disabled]
306
- ) {
307
- @include state-colors(
308
- var(--kd-color-background-menu-state-ai-open),
309
- var(--kd-color-text-level-primary)
310
- );
311
- outline: 2px solid var(--kd-color-border-variants-focus);
312
- outline-offset: -2px;
313
- }
314
-
315
- .menu-item.ai-connected:active:not([disabled]) {
316
- @include state-colors(
317
- var(--kd-color-background-menu-state-ai-pressed),
318
- var(--kd-color-text-level-light)
292
+ var(--kd-color-text-level-light),
293
+ var(--kd-color-icon-light),
294
+ $layered: true,
295
+ $important: true
319
296
  );
320
297
  }