@koobiq/components 20.0.0 → 20.1.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 (192) hide show
  1. package/accordion/accordion-trigger.component.scss +0 -18
  2. package/accordion/accordion.component.scss +9 -2
  3. package/actions-panel/index.d.ts +1 -0
  4. package/alert/_alert-theme.scss +0 -4
  5. package/alert/alert-tokens.scss +4 -4
  6. package/app-switcher/app-switcher-dropdown-app.scss +2 -0
  7. package/breadcrumbs/breadcrumbs.scss +4 -0
  8. package/breadcrumbs/index.d.ts +2 -1
  9. package/button/button-group.scss +42 -2
  10. package/button-toggle/button-toggle.scss +23 -0
  11. package/button-toggle/index.d.ts +3 -1
  12. package/checkbox/checkbox.scss +5 -4
  13. package/clamped-text/index.d.ts +1 -0
  14. package/core/index.d.ts +402 -13
  15. package/core/styles/common/_animation.scss +4 -0
  16. package/core/styles/theming/_components-theming.scss +1 -1
  17. package/core/styles/theming/_scrollbar-theme.scss +4 -0
  18. package/datepicker/_datepicker-theme.scss +1 -1
  19. package/datepicker/datepicker-toggle.scss +3 -3
  20. package/dl/index.d.ts +1 -0
  21. package/dropdown/dropdown.scss +2 -2
  22. package/fesm2022/koobiq-components-accordion.mjs +4 -4
  23. package/fesm2022/koobiq-components-accordion.mjs.map +1 -1
  24. package/fesm2022/koobiq-components-actions-panel.mjs +14 -5
  25. package/fesm2022/koobiq-components-actions-panel.mjs.map +1 -1
  26. package/fesm2022/koobiq-components-alert.mjs +2 -2
  27. package/fesm2022/koobiq-components-alert.mjs.map +1 -1
  28. package/fesm2022/koobiq-components-app-switcher.mjs +6 -6
  29. package/fesm2022/koobiq-components-app-switcher.mjs.map +1 -1
  30. package/fesm2022/koobiq-components-breadcrumbs.mjs +6 -4
  31. package/fesm2022/koobiq-components-breadcrumbs.mjs.map +1 -1
  32. package/fesm2022/koobiq-components-button-toggle.mjs +9 -6
  33. package/fesm2022/koobiq-components-button-toggle.mjs.map +1 -1
  34. package/fesm2022/koobiq-components-button.mjs +4 -4
  35. package/fesm2022/koobiq-components-button.mjs.map +1 -1
  36. package/fesm2022/koobiq-components-checkbox.mjs +2 -2
  37. package/fesm2022/koobiq-components-checkbox.mjs.map +1 -1
  38. package/fesm2022/koobiq-components-clamped-text.mjs +4 -0
  39. package/fesm2022/koobiq-components-clamped-text.mjs.map +1 -1
  40. package/fesm2022/koobiq-components-code-block.mjs +4 -0
  41. package/fesm2022/koobiq-components-code-block.mjs.map +1 -1
  42. package/fesm2022/koobiq-components-core.mjs +449 -112
  43. package/fesm2022/koobiq-components-core.mjs.map +1 -1
  44. package/fesm2022/koobiq-components-datepicker.mjs +5 -5
  45. package/fesm2022/koobiq-components-datepicker.mjs.map +1 -1
  46. package/fesm2022/koobiq-components-dl.mjs +3 -2
  47. package/fesm2022/koobiq-components-dl.mjs.map +1 -1
  48. package/fesm2022/koobiq-components-dropdown.mjs +8 -13
  49. package/fesm2022/koobiq-components-dropdown.mjs.map +1 -1
  50. package/fesm2022/koobiq-components-file-upload.mjs +33 -22
  51. package/fesm2022/koobiq-components-file-upload.mjs.map +1 -1
  52. package/fesm2022/koobiq-components-filter-bar.mjs +974 -758
  53. package/fesm2022/koobiq-components-filter-bar.mjs.map +1 -1
  54. package/fesm2022/koobiq-components-flag.mjs +66 -0
  55. package/fesm2022/koobiq-components-flag.mjs.map +1 -0
  56. package/fesm2022/koobiq-components-form-field.mjs +2 -2
  57. package/fesm2022/koobiq-components-form-field.mjs.map +1 -1
  58. package/fesm2022/koobiq-components-icon.mjs +2 -2
  59. package/fesm2022/koobiq-components-icon.mjs.map +1 -1
  60. package/fesm2022/koobiq-components-inline-edit.mjs +27 -6
  61. package/fesm2022/koobiq-components-inline-edit.mjs.map +1 -1
  62. package/fesm2022/koobiq-components-list.mjs +39 -20
  63. package/fesm2022/koobiq-components-list.mjs.map +1 -1
  64. package/fesm2022/koobiq-components-loader-overlay.mjs +2 -2
  65. package/fesm2022/koobiq-components-loader-overlay.mjs.map +1 -1
  66. package/fesm2022/koobiq-components-modal.mjs +9 -5
  67. package/fesm2022/koobiq-components-modal.mjs.map +1 -1
  68. package/fesm2022/koobiq-components-navbar.mjs +10 -9
  69. package/fesm2022/koobiq-components-navbar.mjs.map +1 -1
  70. package/fesm2022/koobiq-components-notification-center.mjs +178 -19
  71. package/fesm2022/koobiq-components-notification-center.mjs.map +1 -1
  72. package/fesm2022/koobiq-components-overflow-items.mjs +12 -4
  73. package/fesm2022/koobiq-components-overflow-items.mjs.map +1 -1
  74. package/fesm2022/koobiq-components-popover.mjs +4 -4
  75. package/fesm2022/koobiq-components-popover.mjs.map +1 -1
  76. package/fesm2022/koobiq-components-progress-bar.mjs +2 -2
  77. package/fesm2022/koobiq-components-progress-bar.mjs.map +1 -1
  78. package/fesm2022/koobiq-components-progress-spinner.mjs +2 -2
  79. package/fesm2022/koobiq-components-progress-spinner.mjs.map +1 -1
  80. package/fesm2022/koobiq-components-radio.mjs +3 -7
  81. package/fesm2022/koobiq-components-radio.mjs.map +1 -1
  82. package/fesm2022/koobiq-components-select.mjs +38 -16
  83. package/fesm2022/koobiq-components-select.mjs.map +1 -1
  84. package/fesm2022/koobiq-components-sidebar.mjs +4 -0
  85. package/fesm2022/koobiq-components-sidebar.mjs.map +1 -1
  86. package/fesm2022/koobiq-components-sidepanel.mjs +3 -3
  87. package/fesm2022/koobiq-components-sidepanel.mjs.map +1 -1
  88. package/fesm2022/koobiq-components-skeleton.mjs +2 -2
  89. package/fesm2022/koobiq-components-skeleton.mjs.map +1 -1
  90. package/fesm2022/koobiq-components-split-button.mjs +2 -2
  91. package/fesm2022/koobiq-components-split-button.mjs.map +1 -1
  92. package/fesm2022/koobiq-components-splitter.mjs +6 -2
  93. package/fesm2022/koobiq-components-splitter.mjs.map +1 -1
  94. package/fesm2022/koobiq-components-table.mjs +8 -6
  95. package/fesm2022/koobiq-components-table.mjs.map +1 -1
  96. package/fesm2022/koobiq-components-tabs.mjs +19 -7
  97. package/fesm2022/koobiq-components-tabs.mjs.map +1 -1
  98. package/fesm2022/koobiq-components-tags.mjs +7 -0
  99. package/fesm2022/koobiq-components-tags.mjs.map +1 -1
  100. package/fesm2022/koobiq-components-textarea.mjs +7 -14
  101. package/fesm2022/koobiq-components-textarea.mjs.map +1 -1
  102. package/fesm2022/koobiq-components-time-range.mjs +4 -4
  103. package/fesm2022/koobiq-components-time-range.mjs.map +1 -1
  104. package/fesm2022/koobiq-components-timezone.mjs +6 -0
  105. package/fesm2022/koobiq-components-timezone.mjs.map +1 -1
  106. package/fesm2022/koobiq-components-title.mjs +132 -14
  107. package/fesm2022/koobiq-components-title.mjs.map +1 -1
  108. package/fesm2022/koobiq-components-toast.mjs +1 -1
  109. package/fesm2022/koobiq-components-toast.mjs.map +1 -1
  110. package/fesm2022/koobiq-components-toggle.mjs +2 -2
  111. package/fesm2022/koobiq-components-toggle.mjs.map +1 -1
  112. package/fesm2022/koobiq-components-tooltip.mjs +50 -2
  113. package/fesm2022/koobiq-components-tooltip.mjs.map +1 -1
  114. package/fesm2022/koobiq-components-tree-select.mjs +44 -11
  115. package/fesm2022/koobiq-components-tree-select.mjs.map +1 -1
  116. package/fesm2022/koobiq-components-tree.mjs +67 -41
  117. package/fesm2022/koobiq-components-tree.mjs.map +1 -1
  118. package/fesm2022/koobiq-components-username.mjs +16 -3
  119. package/fesm2022/koobiq-components-username.mjs.map +1 -1
  120. package/file-upload/file-upload-tokens.scss +1 -0
  121. package/file-upload/index.d.ts +10 -7
  122. package/filter-bar/_filter-bar-theme.scss +86 -0
  123. package/filter-bar/filter-bar-tokens.scss +6 -0
  124. package/filter-bar/filter-bar.scss +10 -4
  125. package/filter-bar/filter-refresher.scss +1 -1
  126. package/filter-bar/filters.scss +23 -19
  127. package/filter-bar/index.d.ts +707 -338
  128. package/filter-bar/pipes/base-pipe.scss +14 -35
  129. package/filter-bar/pipes/pipe-date.scss +20 -14
  130. package/filter-bar/pipes/pipe-multi-tree-select.scss +5 -3
  131. package/filter-bar/pipes/pipe-multiselect.scss +5 -3
  132. package/filter-bar/pipes/pipe-readonly.scss +4 -13
  133. package/filter-bar/pipes/pipe-select.scss +3 -1
  134. package/filter-bar/pipes/pipe-tree-select.scss +3 -1
  135. package/flag/flag.scss +53 -0
  136. package/flag/index.d.ts +44 -0
  137. package/icon/icon-item-tokens.scss +1 -1
  138. package/inline-edit/index.d.ts +5 -0
  139. package/inline-edit/inline-edit.scss +7 -7
  140. package/link/link-tokens.scss +2 -2
  141. package/list/index.d.ts +11 -2
  142. package/loader-overlay/loader-overlay-tokens.scss +1 -1
  143. package/modal/_modal-animation.scss +6 -6
  144. package/modal/_modal-theme.scss +5 -0
  145. package/modal/index.d.ts +3 -1
  146. package/modal/modal.scss +15 -0
  147. package/navbar/index.d.ts +1 -0
  148. package/navbar/navbar-item.scss +9 -0
  149. package/notification-center/_notification-center-theme.scss +2 -1
  150. package/notification-center/index.d.ts +88 -3
  151. package/notification-center/notification-center.scss +42 -4
  152. package/notification-center/notification-item.scss +3 -2
  153. package/overflow-items/index.d.ts +1 -0
  154. package/package.json +7 -3
  155. package/prebuilt-themes/dark-theme.css +1 -1
  156. package/prebuilt-themes/light-theme.css +1 -1
  157. package/prebuilt-themes/theme.css +1 -1
  158. package/progress-bar/progress-bar.scss +4 -0
  159. package/progress-spinner/progress-spinner.scss +5 -1
  160. package/radio/index.d.ts +1 -5
  161. package/radio/radio.scss +18 -4
  162. package/schematics/collection.json +5 -0
  163. package/schematics/migrations/filter-bar-signals/README.md +66 -0
  164. package/schematics/migrations/filter-bar-signals/data.js +72 -0
  165. package/schematics/migrations/filter-bar-signals/index.js +316 -0
  166. package/schematics/migrations/filter-bar-signals/schema.json +20 -0
  167. package/schematics/migrations.json +5 -0
  168. package/schematics/ng-add/index.js +1 -1
  169. package/select/index.d.ts +10 -2
  170. package/sidebar/index.d.ts +1 -0
  171. package/skeleton/skeleton.scss +4 -0
  172. package/split-button/_split-button-theme.scss +2 -2
  173. package/splitter/_splitter-theme.scss +2 -2
  174. package/splitter/index.d.ts +1 -0
  175. package/table/_table-theme.scss +4 -0
  176. package/table/index.d.ts +3 -2
  177. package/tabs/index.d.ts +2 -0
  178. package/tabs/tab-header.scss +1 -0
  179. package/tabs/tabs-tokens.scss +1 -1
  180. package/textarea/index.d.ts +0 -1
  181. package/time-range/time-range.scss +0 -8
  182. package/timepicker/timepicker.scss +2 -2
  183. package/timezone/index.d.ts +1 -0
  184. package/title/index.d.ts +92 -2
  185. package/tooltip/index.d.ts +51 -3
  186. package/tree/_tree-theme.scss +2 -7
  187. package/tree/index.d.ts +19 -4
  188. package/tree/toggle.scss +5 -0
  189. package/tree/tree-option.scss +0 -4
  190. package/tree-select/_tree-select-theme.scss +1 -1
  191. package/tree-select/index.d.ts +9 -2
  192. package/username/index.d.ts +20 -2
@@ -12,15 +12,13 @@
12
12
  }
13
13
 
14
14
  .kbq-button-wrapper {
15
- max-width: 320px;
15
+ max-width: var(--kbq-filter-bar-pipe-max-width, 320px);
16
16
  }
17
17
 
18
18
  .kbq-pipe__name {
19
19
  @include common.kbq-truncate-line();
20
20
 
21
21
  flex: 1 1 auto;
22
-
23
- color: var(--kbq-foreground-contrast-secondary);
24
22
  }
25
23
 
26
24
  .kbq-pipe__value {
@@ -29,21 +27,19 @@
29
27
  flex: 1 1 auto;
30
28
 
31
29
  &:not(.kbq-pipe__value_empty) {
32
- margin-left: 4px;
30
+ margin-inline-start: 4px;
33
31
  }
34
32
  }
35
33
 
36
34
  .kbq-pipe__separator {
37
35
  z-index: 1;
38
36
 
39
- margin-left: -1px;
40
- margin-right: 0;
37
+ margin-inline-start: -1px;
38
+ margin-inline-end: 0;
41
39
 
42
40
  height: var(--kbq-size-l);
43
41
 
44
42
  align-self: center;
45
-
46
- color: var(--kbq-line-contrast-less);
47
43
  }
48
44
 
49
45
  .kbq-select:not(:hover, .kbq-active),
@@ -52,67 +48,50 @@
52
48
  & + .kbq-pipe-button:not(:hover, .kbq-active)::after {
53
49
  content: '';
54
50
  position: absolute;
55
- left: 0;
51
+ inset-inline-start: 0;
56
52
  top: var(--kbq-size-s);
57
53
 
58
54
  width: 1px;
59
55
  height: var(--kbq-size-l);
60
-
61
- background: var(--kbq-line-contrast-less);
62
56
  }
63
57
  }
64
58
 
65
59
  .kbq-button.cdk-keyboard-focused {
66
60
  z-index: 1;
67
61
  }
68
-
69
- &.kbq-pipe_disabled {
70
- .kbq-pipe__name,
71
- .kbq-pipe__value {
72
- color: var(--kbq-states-foreground-disabled);
73
- }
74
- }
75
62
  }
76
63
 
77
64
  .kbq-pipe.kbq-pipe_removable,
78
65
  .kbq-pipe.kbq-pipe_cleanable:not(.kbq-pipe_empty) {
79
66
  .kbq-button {
80
- border-bottom-right-radius: unset;
81
- border-top-right-radius: unset;
82
- border-right: none;
67
+ border-end-end-radius: unset;
68
+ border-start-end-radius: unset;
69
+ border-inline-end: none;
83
70
 
84
71
  &.cdk-keyboard-focused::after {
85
72
  content: '';
86
73
  position: absolute;
87
- right: 0;
74
+ inset-inline-end: 0;
88
75
  top: 0;
89
76
  bottom: 0;
90
77
  width: 1px;
91
- background: var(--kbq-states-line-focus-theme);
92
78
  }
93
79
  }
94
80
 
95
81
  .kbq-button-icon {
96
- border-bottom-left-radius: unset;
97
- border-top-left-radius: unset;
98
- border-left: none;
82
+ border-end-start-radius: unset;
83
+ border-start-start-radius: unset;
84
+ border-inline-start: none;
99
85
 
100
86
  &.cdk-keyboard-focused::after {
101
87
  content: '';
102
88
  position: absolute;
103
- left: 0;
89
+ inset-inline-start: 0;
104
90
  top: 0;
105
91
  bottom: 0;
106
92
  width: 1px;
107
- background: var(--kbq-states-line-focus-theme);
108
93
  }
109
94
  }
110
95
  }
111
96
 
112
- .kbq-pipe-tooltip__name {
113
- color: var(--kbq-foreground-white-secondary);
114
- }
115
-
116
- .kbq-pipe-tooltip__value {
117
- color: var(--kbq-foreground-white);
118
- }
97
+ @include kbq-filter-bar-pipe-theme();
@@ -4,6 +4,10 @@
4
4
  @use '../../datepicker/datepicker-tokens' as *;
5
5
 
6
6
  .kbq-pipe-date__popover {
7
+ // Tokens are declared on the overlay panel itself so they resolve outside `.kbq-filter-bar`.
8
+ --kbq-filter-bar-date-period-width: 320px;
9
+ --kbq-filter-bar-date-field-width: 136px;
10
+
7
11
  & .kbq-popover__container {
8
12
  max-height: unset;
9
13
  }
@@ -16,8 +20,7 @@
16
20
  margin: var(--kbq-size-xxs) 0;
17
21
 
18
22
  & .kbq-list-option {
19
- margin-left: var(--kbq-size-xxs);
20
- margin-right: var(--kbq-size-xxs);
23
+ margin-inline: var(--kbq-size-xxs);
21
24
 
22
25
  & .kbq-list-text {
23
26
  display: flex;
@@ -25,7 +28,7 @@
25
28
  }
26
29
 
27
30
  & .kbq-icon {
28
- margin-left: var(--kbq-size-s);
31
+ margin-inline-start: var(--kbq-size-s);
29
32
  align-self: center;
30
33
 
31
34
  color: var(--kbq-icon-fade-contrast-color);
@@ -34,7 +37,7 @@
34
37
  }
35
38
 
36
39
  & .kbq-date-period {
37
- width: 320px;
40
+ width: var(--kbq-filter-bar-date-period-width);
38
41
 
39
42
  & .kbq-date-period__header {
40
43
  padding: var(--kbq-size-xs) var(--kbq-size-xxs) var(--kbq-size-s);
@@ -59,11 +62,11 @@
59
62
  gap: var(--kbq-size-s);
60
63
 
61
64
  & .kbq-form__label {
62
- padding-left: var(--kbq-size-l);
65
+ padding-inline-start: var(--kbq-size-l);
63
66
  }
64
67
 
65
68
  & .kbq-form__control {
66
- padding-right: var(--kbq-size-l);
69
+ padding-inline-end: var(--kbq-size-l);
67
70
  }
68
71
 
69
72
  & .kbq-date-period__date,
@@ -75,22 +78,26 @@
75
78
  display: flex;
76
79
 
77
80
  & .kbq-date-period__date {
78
- width: 136px;
81
+ width: var(--kbq-filter-bar-date-field-width);
79
82
 
80
83
  & .kbq-form-field__container {
81
- border-top-right-radius: unset;
82
- border-bottom-right-radius: unset;
84
+ // Square off the seam (inline-end) — logical so it follows the inline-start overlap
85
+ // below under RTL (was border-top/bottom-right-radius).
86
+ border-start-end-radius: unset;
87
+ border-end-end-radius: unset;
83
88
  }
84
89
  }
85
90
 
86
91
  & .kbq-date-period__time.kbq-form-field-type-timepicker {
87
92
  flex: 1;
88
- margin-left: -1px;
93
+ margin-inline-start: -1px;
89
94
  width: unset;
90
95
 
91
96
  & .kbq-form-field__container {
92
- border-top-left-radius: unset;
93
- border-bottom-left-radius: unset;
97
+ // Square off the seam (inline-start) — logical counterpart of the date field above
98
+ // (was border-top/bottom-left-radius).
99
+ border-start-start-radius: unset;
100
+ border-end-start-radius: unset;
94
101
  }
95
102
  }
96
103
  }
@@ -109,8 +116,7 @@
109
116
  & .kbq-hint {
110
117
  grid-column: 2 span;
111
118
 
112
- padding-left: var(--kbq-size-m);
113
- padding-right: var(--kbq-size-m);
119
+ padding-inline: var(--kbq-size-m);
114
120
  }
115
121
  }
116
122
 
@@ -1,12 +1,14 @@
1
+ @use '../filter-bar-theme' as *;
2
+
1
3
  .kbq-pipe__multi-tree-select {
2
4
  .kbq-pipe__value {
3
- margin-left: var(--kbq-size-xxs);
5
+ margin-inline-start: var(--kbq-size-xxs);
4
6
  }
5
7
 
6
8
  .kbq-badge {
7
9
  align-self: center;
8
10
 
9
- margin-left: var(--kbq-size-xs);
11
+ margin-inline-start: var(--kbq-size-xs);
10
12
  }
11
13
 
12
14
  & .kbq-tree-select .kbq-select__trigger {
@@ -15,5 +17,5 @@
15
17
  }
16
18
 
17
19
  .kbq-pipe-multi-tree-select__panel .kbq-select__content {
18
- max-height: 404px;
20
+ @include kbq-filter-bar-panel-content-max-height();
19
21
  }
@@ -1,15 +1,17 @@
1
+ @use '../filter-bar-theme' as *;
2
+
1
3
  .kbq-pipe__multiselect {
2
4
  .kbq-pipe__value {
3
- margin-left: var(--kbq-size-xxs);
5
+ margin-inline-start: var(--kbq-size-xxs);
4
6
  }
5
7
 
6
8
  .kbq-badge {
7
9
  align-self: center;
8
10
 
9
- margin-left: var(--kbq-size-xs);
11
+ margin-inline-start: var(--kbq-size-xs);
10
12
  }
11
13
  }
12
14
 
13
15
  .kbq-pipe-multiselect__panel .kbq-select__content {
14
- max-height: 404px;
16
+ @include kbq-filter-bar-panel-content-max-height();
15
17
  }
@@ -1,18 +1,9 @@
1
+ @use '../filter-bar-theme' as *;
2
+
1
3
  .kbq-pipe.kbq-pipe__readonly {
2
4
  & .kbq-button {
3
5
  cursor: default;
4
6
  }
5
-
6
- &:not(.kbq-pipe_cleanable) {
7
- & .kbq-button-icon.kbq-button_filled:not(:hover),
8
- & .kbq-button.kbq-button_filled,
9
- & .kbq-button.kbq-button_filled:hover {
10
- background: var(--kbq-states-background-disabled);
11
- }
12
-
13
- & .kbq-pipe__name,
14
- & .kbq-pipe__value {
15
- color: var(--kbq-states-foreground-disabled);
16
- }
17
- }
18
7
  }
8
+
9
+ @include kbq-filter-bar-readonly-theme();
@@ -1,3 +1,5 @@
1
+ @use '../filter-bar-theme' as *;
2
+
1
3
  .kbq-pipe-select__panel .kbq-select__content {
2
- max-height: 404px;
4
+ @include kbq-filter-bar-panel-content-max-height();
3
5
  }
@@ -1,5 +1,7 @@
1
+ @use '../filter-bar-theme' as *;
2
+
1
3
  .kbq-pipe-tree-select__panel .kbq-tree-select__content {
2
- max-height: 404px;
4
+ @include kbq-filter-bar-panel-content-max-height();
3
5
  }
4
6
 
5
7
  .kbq-pipe__tree-select {
package/flag/flag.scss ADDED
@@ -0,0 +1,53 @@
1
+ .kbq-flag {
2
+ // Theme tokens. The faded contrast line resolves to a dark hairline in the light theme and a
3
+ // light one in the dark theme, so the flag stays separated from the background in both.
4
+ --kbq-flag-shadow-color: var(--kbq-line-contrast-fade);
5
+ --kbq-flag-empty-background: var(--kbq-states-background-disabled);
6
+ --kbq-flag-border-radius: 0;
7
+ --kbq-flag-aspect-ratio: 3 / 2;
8
+
9
+ display: inline-block;
10
+ position: relative;
11
+ box-sizing: border-box;
12
+ // Sizing follows the surrounding text; 3:2 gives width = 1.5 × line height. Override via
13
+ // font-size / width / height to resize.
14
+ height: 1em;
15
+ aspect-ratio: var(--kbq-flag-aspect-ratio);
16
+ vertical-align: middle;
17
+ overflow: hidden;
18
+ border-radius: var(--kbq-flag-border-radius);
19
+
20
+ // Size the flag image whether it is projected directly or bound via [innerHTML]
21
+ // (the injected svg may sit inside a wrapper element).
22
+ svg,
23
+ img {
24
+ display: block;
25
+ width: 100%;
26
+ height: 100%;
27
+ object-fit: cover;
28
+ }
29
+
30
+ // Inset hairline drawn on top of the flag, gated by the shadow input.
31
+ &.kbq-flag_shadow-inset::after {
32
+ content: '';
33
+ position: absolute;
34
+ inset: 0;
35
+ border-radius: inherit;
36
+ box-shadow: inset 0 0 0 1px var(--kbq-flag-shadow-color);
37
+ pointer-events: none;
38
+ }
39
+
40
+ &.kbq-flag_square,
41
+ &.kbq-flag_circle {
42
+ --kbq-flag-aspect-ratio: 1 / 1;
43
+ }
44
+
45
+ &.kbq-flag_circle {
46
+ border-radius: 50%;
47
+ }
48
+
49
+ // Neutral placeholder when no flag is projected (unknown / invalid country code).
50
+ &.kbq-flag_empty {
51
+ background: var(--kbq-flag-empty-background);
52
+ }
53
+ }
@@ -0,0 +1,44 @@
1
+ import * as _angular_core from '@angular/core';
2
+
3
+ /** Shape of the flag. `rectangle` keeps the default 3:2 ratio, `square`/`circle` expect a 1:1 source. */
4
+ type KbqFlagShape = 'rectangle' | 'square' | 'circle';
5
+ /** Inset shadow (hairline) that separates the flag from the background. */
6
+ type KbqFlagShadow = 'inset' | 'none';
7
+
8
+ /**
9
+ * Presentational wrapper for a consumer-provided country flag (inline `<svg>` or `<img>`).
10
+ * Decorates it with shape and shadow and applies the accessibility contract.
11
+ *
12
+ * ```html
13
+ * <kbq-flag><img src="…/AL.svg" alt="" /></kbq-flag> Albania
14
+ * ```
15
+ */
16
+ declare class KbqFlag {
17
+ /**
18
+ * Shape of the flag. `square`/`circle` expect a 1:1 (square) flag source to be projected.
19
+ * @default rectangle
20
+ */
21
+ readonly shape: _angular_core.InputSignal<KbqFlagShape>;
22
+ /**
23
+ * Inset hairline that keeps the flag distinct from the background. Its color adapts to the theme.
24
+ * @default inset
25
+ */
26
+ readonly shadow: _angular_core.InputSignal<KbqFlagShadow>;
27
+ /** Renders a neutral placeholder — use when no flag can be shown (unknown / invalid country code). */
28
+ readonly empty: _angular_core.InputSignalWithTransform<boolean, unknown>;
29
+ /** Marks the flag as decorative — hidden from screen readers (use when adjacent text is present). */
30
+ readonly decorative: _angular_core.InputSignalWithTransform<boolean, unknown>;
31
+ /** Accessible name for the flag. Use when the flag carries meaning and has no adjacent text. */
32
+ readonly label: _angular_core.InputSignal<string | undefined>;
33
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<KbqFlag, never>;
34
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<KbqFlag, "kbq-flag", ["kbqFlag"], { "shape": { "alias": "shape"; "required": false; "isSignal": true; }; "shadow": { "alias": "shadow"; "required": false; "isSignal": true; }; "empty": { "alias": "empty"; "required": false; "isSignal": true; }; "decorative": { "alias": "decorative"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
35
+ }
36
+
37
+ declare class KbqFlagModule {
38
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<KbqFlagModule, never>;
39
+ static ɵmod: _angular_core.ɵɵNgModuleDeclaration<KbqFlagModule, never, [typeof KbqFlag], [typeof KbqFlag]>;
40
+ static ɵinj: _angular_core.ɵɵInjectorDeclaration<KbqFlagModule>;
41
+ }
42
+
43
+ export { KbqFlag, KbqFlagModule };
44
+ export type { KbqFlagShadow, KbqFlagShape };
@@ -10,7 +10,7 @@
10
10
  --kbq-icon-item-filled-fade-off-contrast-background: var(--kbq-background-contrast);
11
11
  --kbq-icon-item-filled-fade-off-error-color: var(--kbq-icon-white);
12
12
  --kbq-icon-item-filled-fade-off-error-background: var(--kbq-background-error);
13
- --kbq-icon-item-filled-fade-off-warning-color: var(--kbq-icon-white);
13
+ --kbq-icon-item-filled-fade-off-warning-color: var(--kbq-icon-contrast);
14
14
  --kbq-icon-item-filled-fade-off-warning-background: var(--kbq-background-warning);
15
15
  --kbq-icon-item-filled-fade-off-success-color: var(--kbq-icon-white);
16
16
  --kbq-icon-item-filled-fade-off-success-background: var(--kbq-background-success);
@@ -116,6 +116,10 @@ declare class KbqInlineEdit {
116
116
  /** @docs-private */
117
117
  protected readonly isEditMode: _angular_core.Signal<boolean>;
118
118
  /** @docs-private */
119
+ protected readonly hasInteractiveContent: _angular_core.WritableSignal<boolean>;
120
+ /** @docs-private */
121
+ protected readonly anchorFocused: _angular_core.WritableSignal<boolean>;
122
+ /** @docs-private */
119
123
  protected readonly tabIndex: _angular_core.Signal<0 | -1>;
120
124
  /** @docs-private */
121
125
  protected readonly placements: typeof PopUpPlacements;
@@ -141,6 +145,7 @@ declare class KbqInlineEdit {
141
145
  * @docs-private
142
146
  */
143
147
  protected onOverlayOutsideClick($event: Event): void;
148
+ private detectInteractiveContent;
144
149
  private isInteractiveElement;
145
150
  /**
146
151
  * Sets up Tab key listeners on region items.
@@ -46,7 +46,8 @@
46
46
  outline: none;
47
47
  }
48
48
 
49
- &.cdk-keyboard-focused {
49
+ &.cdk-keyboard-focused,
50
+ &.kbq-inline-edit_anchor-focused {
50
51
  box-shadow: inset 0 0 0.1px 1px var(--kbq-states-line-focus-theme);
51
52
  border-color: var(--kbq-states-line-focus-theme);
52
53
  }
@@ -125,7 +126,8 @@
125
126
  }
126
127
 
127
128
  &:hover,
128
- &.cdk-keyboard-focused {
129
+ &.cdk-keyboard-focused,
130
+ &.kbq-inline-edit_anchor-focused {
129
131
  .kbq-inline-edit__menu-mask {
130
132
  opacity: 1;
131
133
  }
@@ -176,10 +178,6 @@
176
178
  .kbq-inline-edit__panel {
177
179
  width: 100%;
178
180
 
179
- .kbq-inline-edit__control-container {
180
- border-radius: var(--kbq-size-border-radius);
181
- }
182
-
183
181
  .kbq-inline-edit__action-buttons {
184
182
  position: absolute;
185
183
  left: calc(-1 * var(--kbq-inline-edit-padding-horizontal));
@@ -190,7 +188,9 @@
190
188
  }
191
189
 
192
190
  .kbq-inline-edit__control-container,
193
- .kbq-inline-edit__action-buttons > .kbq-button-icon {
191
+ .kbq-inline-edit__action-button {
194
192
  box-shadow: var(--kbq-shadow-popup);
193
+ background-color: var(--kbq-background-bg);
194
+ border-radius: var(--kbq-size-border-radius);
195
195
  }
196
196
  }
@@ -13,9 +13,9 @@
13
13
  /* @TODO (#DS-3002) */
14
14
  --kbq-link-state-visited-border-bottom: var(--kbq-line-visited-fade, var(--kbq-line-visited));
15
15
  --kbq-link-state-visited-hover-text: var(--kbq-states-foreground-visited-hover);
16
- --kbq-link-state-visited-hover-border-bottomm: var(--kbq-line-visited-fade, var(--kbq-line-visited));
16
+ --kbq-link-state-visited-hover-border-bottom: var(--kbq-line-visited-fade, var(--kbq-line-visited));
17
17
  --kbq-link-state-visited-active-text: var(--kbq-states-foreground-visited-active);
18
- --kbq-link-state-visited-active-border-bottomm: var(--kbq-line-visited-fade, var(--kbq-line-visited));
18
+ --kbq-link-state-visited-active-border-bottom: var(--kbq-line-visited-fade, var(--kbq-line-visited));
19
19
  --kbq-link-state-hover-text: var(--kbq-states-foreground-theme-hover);
20
20
  --kbq-link-state-hover-border-bottom: var(--kbq-line-theme-fade);
21
21
  --kbq-link-state-active-text: var(--kbq-states-foreground-theme-active);
package/list/index.d.ts CHANGED
@@ -54,6 +54,8 @@ declare class KbqListSelection implements AfterContentInit, AfterViewInit, OnDes
54
54
  get noUnselectLast(): boolean;
55
55
  set noUnselectLast(value: boolean);
56
56
  private _noUnselectLast;
57
+ /** When `true`, a repeated Ctrl/Cmd+A deselects all options. Off by default (Ctrl+A only selects). */
58
+ readonly selectAllToggle: i0.InputSignalWithTransform<boolean, unknown>;
57
59
  multipleMode: MultipleMode | null;
58
60
  get multiple(): boolean;
59
61
  readonly horizontal: i0.InputSignalWithTransform<boolean, unknown>;
@@ -77,6 +79,7 @@ declare class KbqListSelection implements AfterContentInit, AfterViewInit, OnDes
77
79
  get optionBlurChanges(): Observable<KbqOptionEvent>;
78
80
  _value: string[] | null;
79
81
  private readonly destroyRef;
82
+ private readonly platform;
80
83
  private optionFocusSubscription;
81
84
  private optionBlurSubscription;
82
85
  constructor();
@@ -124,10 +127,16 @@ declare class KbqListSelection implements AfterContentInit, AfterViewInit, OnDes
124
127
  private isValidIndex;
125
128
  private getOptionIndex;
126
129
  private onChange;
127
- private selectAllOptions;
130
+ /**
131
+ * Function for handling the combination Ctrl + A (select all). By default, the internal handler is used,
132
+ * which toggles the selection of all non-disabled options.
133
+ */
134
+ get selectAllHandler(): (event: KeyboardEvent, list: KbqListSelection) => void;
135
+ set selectAllHandler(fn: (event: KeyboardEvent, list: KbqListSelection) => void);
136
+ private _selectAllHandler;
128
137
  private copyActiveOption;
129
138
  static ɵfac: i0.ɵɵFactoryDeclaration<KbqListSelection, never>;
130
- static ɵcmp: i0.ɵɵComponentDeclaration<KbqListSelection, "kbq-list-selection", ["kbqListSelection"], { "autoSelect": { "alias": "autoSelect"; "required": false; }; "noUnselectLast": { "alias": "noUnselectLast"; "required": false; }; "horizontal": { "alias": "horizontal"; "required": false; "isSignal": true; }; "tabIndex": { "alias": "tabIndex"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "compareWith": { "alias": "compareWith"; "required": false; "isSignal": true; }; }, { "onSelectAll": "onSelectAll"; "onCopy": "onCopy"; "selectionChange": "selectionChange"; }, ["options"], ["*"], true, never>;
139
+ static ɵcmp: i0.ɵɵComponentDeclaration<KbqListSelection, "kbq-list-selection", ["kbqListSelection"], { "autoSelect": { "alias": "autoSelect"; "required": false; }; "noUnselectLast": { "alias": "noUnselectLast"; "required": false; }; "selectAllToggle": { "alias": "selectAllToggle"; "required": false; "isSignal": true; }; "horizontal": { "alias": "horizontal"; "required": false; "isSignal": true; }; "tabIndex": { "alias": "tabIndex"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "compareWith": { "alias": "compareWith"; "required": false; "isSignal": true; }; "selectAllHandler": { "alias": "selectAllHandler"; "required": false; }; }, { "onSelectAll": "onSelectAll"; "onCopy": "onCopy"; "selectionChange": "selectionChange"; }, ["options"], ["*"], true, never>;
131
140
  static ngAcceptInputType_disabled: unknown;
132
141
  }
133
142
  declare class KbqListOptionCaption {
@@ -2,7 +2,7 @@
2
2
  --kbq-loader-overlay-size-big-overlay-padding-horizontal: var(--kbq-size-3xl);
3
3
  --kbq-loader-overlay-size-big-loader-margin-bottom: var(--kbq-size-xxl);
4
4
  --kbq-loader-overlay-size-big-content-content-gap-vertical: var(--kbq-size-l);
5
- --kbq-loader-overlay-size-normal-overlay-padding-horizontal: var(--kbq-sizeа-3xl);
5
+ --kbq-loader-overlay-size-normal-overlay-padding-horizontal: var(--kbq-size-3xl);
6
6
  --kbq-loader-overlay-size-normal-loader-margin-bottom: var(--kbq-size-xxl);
7
7
  --kbq-loader-overlay-size-normal-content-content-gap-vertical: var(--kbq-size-xxs);
8
8
  --kbq-loader-overlay-size-compact-overlay-padding-horizontal: var(--kbq-size-3xl);
@@ -40,13 +40,13 @@ $animation-duration-base: 0.3s;
40
40
  @mixin zoom-motion($className, $keyframeName, $duration: $animation-duration-base) {
41
41
  @include _make-motion($className, $keyframeName, $duration);
42
42
 
43
- .#{className}-enter,
44
- .#{className}-appear {
43
+ .#{$className}-enter,
44
+ .#{$className}-appear {
45
45
  transform: translate(0, -25%);
46
46
  animation-timing-function: $ease-out-circ;
47
47
  }
48
48
 
49
- .#{className}-leave {
49
+ .#{$className}-leave {
50
50
  transform: translate(0, 0);
51
51
  animation-timing-function: $ease-in-out-circ;
52
52
  }
@@ -55,13 +55,13 @@ $animation-duration-base: 0.3s;
55
55
  @mixin fade-motion($className, $keyframeName) {
56
56
  @include _make-motion($className, $keyframeName);
57
57
 
58
- .#{className}-enter,
59
- .#{className}-appear {
58
+ .#{$className}-enter,
59
+ .#{$className}-appear {
60
60
  opacity: 0;
61
61
  animation-timing-function: ease-out;
62
62
  }
63
63
 
64
- .#{className}-leave {
64
+ .#{$className}-leave {
65
65
  animation-timing-function: ease-out;
66
66
  }
67
67
  }
@@ -18,6 +18,10 @@
18
18
  .kbq-modal-content {
19
19
  color: var(--kbq-modal-content-text-color);
20
20
  }
21
+
22
+ .kbq-modal-caption {
23
+ color: var(--kbq-foreground-contrast-secondary);
24
+ }
21
25
  }
22
26
 
23
27
  .kbq-modal-mask {
@@ -30,6 +34,7 @@
30
34
  @include kbq-typography-level-to-styles-css-variables(typography, title);
31
35
  }
32
36
 
37
+ .kbq-modal-caption,
33
38
  .kbq-modal-body {
34
39
  @include kbq-typography-level-to-styles-css-variables(typography, text-normal);
35
40
  }
package/modal/index.d.ts CHANGED
@@ -32,6 +32,7 @@ interface ModalOptions<C = any, R = any> {
32
32
  kbqClassName?: string;
33
33
  kbqStyle?: object;
34
34
  kbqTitle?: string | TemplateRef<{}>;
35
+ kbqCaption?: string | TemplateRef<{}>;
35
36
  kbqContent?: string | TemplateRef<{}> | Type<C>;
36
37
  kbqComponent?: Type<C>;
37
38
  kbqClosable?: boolean;
@@ -105,6 +106,7 @@ declare class KbqModalComponent<T = any, R = any> extends KbqModalRef<T, R> impl
105
106
  kbqClassName: string;
106
107
  kbqStyle: object;
107
108
  kbqTitle: string | TemplateRef<{}>;
109
+ kbqCaption: string | TemplateRef<{}>;
108
110
  kbqCloseByESC: boolean;
109
111
  get kbqClosable(): boolean;
110
112
  set kbqClosable(value: boolean);
@@ -204,7 +206,7 @@ declare class KbqModalComponent<T = any, R = any> extends KbqModalRef<T, R> impl
204
206
  */
205
207
  private changeBodyOverflow;
206
208
  static ɵfac: i0.ɵɵFactoryDeclaration<KbqModalComponent<any, any>, never>;
207
- static ɵcmp: i0.ɵɵComponentDeclaration<KbqModalComponent<any, any>, "kbq-modal", never, { "kbqModalType": { "alias": "kbqModalType"; "required": false; }; "kbqComponent": { "alias": "kbqComponent"; "required": false; }; "kbqContent": { "alias": "kbqContent"; "required": false; }; "kbqFooter": { "alias": "kbqFooter"; "required": false; }; "kbqVisible": { "alias": "kbqVisible"; "required": false; }; "kbqWidth": { "alias": "kbqWidth"; "required": false; }; "kbqSize": { "alias": "kbqSize"; "required": false; }; "kbqWrapClassName": { "alias": "kbqWrapClassName"; "required": false; }; "kbqClassName": { "alias": "kbqClassName"; "required": false; }; "kbqStyle": { "alias": "kbqStyle"; "required": false; }; "kbqTitle": { "alias": "kbqTitle"; "required": false; }; "kbqCloseByESC": { "alias": "kbqCloseByESC"; "required": false; }; "kbqClosable": { "alias": "kbqClosable"; "required": false; }; "kbqMask": { "alias": "kbqMask"; "required": false; }; "kbqMaskClosable": { "alias": "kbqMaskClosable"; "required": false; }; "kbqMaskStyle": { "alias": "kbqMaskStyle"; "required": false; }; "kbqBodyStyle": { "alias": "kbqBodyStyle"; "required": false; }; "kbqOkText": { "alias": "kbqOkText"; "required": false; }; "kbqOkType": { "alias": "kbqOkType"; "required": false; }; "kbqRestoreFocus": { "alias": "kbqRestoreFocus"; "required": false; }; "kbqOkLoading": { "alias": "kbqOkLoading"; "required": false; }; "kbqOnOk": { "alias": "kbqOnOk"; "required": false; }; "kbqCancelText": { "alias": "kbqCancelText"; "required": false; }; "kbqCancelLoading": { "alias": "kbqCancelLoading"; "required": false; }; "kbqOnCancel": { "alias": "kbqOnCancel"; "required": false; }; "kbqGetContainer": { "alias": "kbqGetContainer"; "required": false; }; }, { "kbqVisibleChange": "kbqVisibleChange"; "kbqAfterOpen": "kbqAfterOpen"; "kbqAfterClose": "kbqAfterClose"; "kbqBeforeClose": "kbqBeforeClose"; "kbqOnOk": "kbqOnOk"; "kbqOnCancel": "kbqOnCancel"; }, never, ["*"], true, never>;
209
+ static ɵcmp: i0.ɵɵComponentDeclaration<KbqModalComponent<any, any>, "kbq-modal", never, { "kbqModalType": { "alias": "kbqModalType"; "required": false; }; "kbqComponent": { "alias": "kbqComponent"; "required": false; }; "kbqContent": { "alias": "kbqContent"; "required": false; }; "kbqFooter": { "alias": "kbqFooter"; "required": false; }; "kbqVisible": { "alias": "kbqVisible"; "required": false; }; "kbqWidth": { "alias": "kbqWidth"; "required": false; }; "kbqSize": { "alias": "kbqSize"; "required": false; }; "kbqWrapClassName": { "alias": "kbqWrapClassName"; "required": false; }; "kbqClassName": { "alias": "kbqClassName"; "required": false; }; "kbqStyle": { "alias": "kbqStyle"; "required": false; }; "kbqTitle": { "alias": "kbqTitle"; "required": false; }; "kbqCaption": { "alias": "kbqCaption"; "required": false; }; "kbqCloseByESC": { "alias": "kbqCloseByESC"; "required": false; }; "kbqClosable": { "alias": "kbqClosable"; "required": false; }; "kbqMask": { "alias": "kbqMask"; "required": false; }; "kbqMaskClosable": { "alias": "kbqMaskClosable"; "required": false; }; "kbqMaskStyle": { "alias": "kbqMaskStyle"; "required": false; }; "kbqBodyStyle": { "alias": "kbqBodyStyle"; "required": false; }; "kbqOkText": { "alias": "kbqOkText"; "required": false; }; "kbqOkType": { "alias": "kbqOkType"; "required": false; }; "kbqRestoreFocus": { "alias": "kbqRestoreFocus"; "required": false; }; "kbqOkLoading": { "alias": "kbqOkLoading"; "required": false; }; "kbqOnOk": { "alias": "kbqOnOk"; "required": false; }; "kbqCancelText": { "alias": "kbqCancelText"; "required": false; }; "kbqCancelLoading": { "alias": "kbqCancelLoading"; "required": false; }; "kbqOnCancel": { "alias": "kbqOnCancel"; "required": false; }; "kbqGetContainer": { "alias": "kbqGetContainer"; "required": false; }; }, { "kbqVisibleChange": "kbqVisibleChange"; "kbqAfterOpen": "kbqAfterOpen"; "kbqAfterClose": "kbqAfterClose"; "kbqBeforeClose": "kbqBeforeClose"; "kbqOnOk": "kbqOnOk"; "kbqOnCancel": "kbqOnCancel"; }, never, ["*"], true, never>;
208
210
  }
209
211
 
210
212
  /**
package/modal/modal.scss CHANGED
@@ -102,6 +102,21 @@
102
102
  padding-bottom: var(--kbq-size-3xs);
103
103
  }
104
104
 
105
+ .kbq-modal-header-content {
106
+ display: flex;
107
+ flex: 1;
108
+ flex-direction: column;
109
+ min-width: 0;
110
+ }
111
+
112
+ .kbq-modal-caption {
113
+ display: -webkit-box;
114
+ -webkit-box-orient: vertical;
115
+ -webkit-line-clamp: 2;
116
+ overflow: hidden;
117
+ text-overflow: ellipsis;
118
+ }
119
+
105
120
  .kbq-modal-body {
106
121
  display: block;
107
122
  overflow-y: auto;
package/navbar/index.d.ts CHANGED
@@ -210,6 +210,7 @@ declare class KbqNavbar extends KbqFocusableComponent implements AfterViewInit,
210
210
  protected readonly elementRef: ElementRef<HTMLElement>;
211
211
  protected readonly changeDetectorRef: ChangeDetectorRef;
212
212
  protected readonly focusMonitor: FocusMonitor;
213
+ private readonly platform;
213
214
  readonly rectangleElements: i0.Signal<readonly any[]>;
214
215
  readonly navbarItems: i0.Signal<readonly any[]>;
215
216
  readonly resizeStream: Subject<Event>;