@koobiq/components 19.8.4 → 19.8.6
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.
- package/accordion/accordion-content.directive.d.ts +23 -3
- package/accordion/accordion-trigger.component.d.ts +1 -0
- package/accordion/accordion.component.scss +4 -1
- package/alert/alert-tokens.scss +4 -4
- package/autocomplete/autocomplete-trigger.directive.d.ts +10 -5
- package/breadcrumbs/breadcrumbs.d.ts +2 -0
- package/breadcrumbs/breadcrumbs.scss +4 -0
- package/button/button-group.scss +42 -2
- package/button-toggle/button-toggle-tokens.scss +16 -0
- package/button-toggle/button-toggle.component.d.ts +3 -1
- package/button-toggle/button-toggle.scss +105 -1
- package/checkbox/checkbox.scss +5 -4
- package/clamped-text/clamped-text.d.ts +4 -2
- package/core/form-field/field-sizing-content.d.ts +0 -1
- package/core/form-field/form-field-ref.d.ts +1 -0
- package/core/form-field/index.d.ts +1 -0
- package/core/form-field/text-field-selection.d.ts +18 -0
- package/core/form-field/text-ruler.d.ts +16 -0
- package/core/navbar/rectangle-item.d.ts +8 -0
- package/core/option/_action-container-mixins.scss +28 -0
- package/core/option/_option-theme.scss +8 -0
- package/core/option/action.d.ts +9 -0
- package/core/option/action.scss +7 -0
- package/core/option/option.d.ts +10 -6
- package/core/pop-up/pop-up-trigger.d.ts +6 -0
- package/core/select/constants.d.ts +8 -1
- package/core/services/measure-scrollbar.service.d.ts +1 -0
- package/core/styles/common/_animation.scss +35 -24
- package/core/styles/common/_select.scss +17 -2
- package/core/styles/theming/_scrollbar-theme.scss +4 -0
- package/core/styles/typography/_typography.scss +8 -0
- package/core/utils/dom.d.ts +12 -0
- package/datepicker/datepicker-input.directive.d.ts +20 -5
- package/datepicker/datepicker.component.d.ts +4 -1
- package/dl/dl.component.d.ts +1 -0
- package/dl/dl.scss +10 -0
- package/dropdown/dropdown-item.component.d.ts +10 -2
- package/dropdown/dropdown-item.scss +16 -0
- package/dropdown/dropdown-trigger.directive.d.ts +6 -1
- package/dropdown/dropdown.component.d.ts +6 -1
- package/dropdown/dropdown.module.d.ts +1 -1
- package/dropdown/dropdown.scss +18 -3
- package/ellipsis-center/ellipsis-center.directive.d.ts +35 -2
- package/fesm2022/koobiq-components-accordion.mjs +104 -16
- package/fesm2022/koobiq-components-accordion.mjs.map +1 -1
- package/fesm2022/koobiq-components-alert.mjs +2 -2
- package/fesm2022/koobiq-components-app-switcher.mjs +6 -6
- package/fesm2022/koobiq-components-app-switcher.mjs.map +1 -1
- package/fesm2022/koobiq-components-autocomplete.mjs +21 -9
- package/fesm2022/koobiq-components-autocomplete.mjs.map +1 -1
- package/fesm2022/koobiq-components-breadcrumbs.mjs +10 -5
- package/fesm2022/koobiq-components-breadcrumbs.mjs.map +1 -1
- package/fesm2022/koobiq-components-button-toggle.mjs +8 -5
- package/fesm2022/koobiq-components-button-toggle.mjs.map +1 -1
- package/fesm2022/koobiq-components-button.mjs +4 -4
- package/fesm2022/koobiq-components-button.mjs.map +1 -1
- package/fesm2022/koobiq-components-checkbox.mjs +2 -2
- package/fesm2022/koobiq-components-checkbox.mjs.map +1 -1
- package/fesm2022/koobiq-components-clamped-text.mjs +9 -0
- package/fesm2022/koobiq-components-clamped-text.mjs.map +1 -1
- package/fesm2022/koobiq-components-code-block.mjs +14 -5
- package/fesm2022/koobiq-components-code-block.mjs.map +1 -1
- package/fesm2022/koobiq-components-content-panel.mjs +5 -4
- package/fesm2022/koobiq-components-content-panel.mjs.map +1 -1
- package/fesm2022/koobiq-components-core.mjs +234 -64
- package/fesm2022/koobiq-components-core.mjs.map +1 -1
- package/fesm2022/koobiq-components-datepicker.mjs +73 -49
- package/fesm2022/koobiq-components-datepicker.mjs.map +1 -1
- package/fesm2022/koobiq-components-dl.mjs +5 -4
- package/fesm2022/koobiq-components-dl.mjs.map +1 -1
- package/fesm2022/koobiq-components-dropdown.mjs +65 -22
- package/fesm2022/koobiq-components-dropdown.mjs.map +1 -1
- package/fesm2022/koobiq-components-ellipsis-center.mjs +77 -22
- package/fesm2022/koobiq-components-ellipsis-center.mjs.map +1 -1
- package/fesm2022/koobiq-components-file-upload.mjs +12 -12
- package/fesm2022/koobiq-components-file-upload.mjs.map +1 -1
- package/fesm2022/koobiq-components-filter-bar.mjs +295 -46
- package/fesm2022/koobiq-components-filter-bar.mjs.map +1 -1
- package/fesm2022/koobiq-components-form-field.mjs +2 -2
- package/fesm2022/koobiq-components-form-field.mjs.map +1 -1
- package/fesm2022/koobiq-components-icon.mjs +1 -1
- package/fesm2022/koobiq-components-icon.mjs.map +1 -1
- package/fesm2022/koobiq-components-inline-edit.mjs +26 -5
- package/fesm2022/koobiq-components-inline-edit.mjs.map +1 -1
- package/fesm2022/koobiq-components-list.mjs +12 -22
- package/fesm2022/koobiq-components-list.mjs.map +1 -1
- package/fesm2022/koobiq-components-markdown.mjs +4 -1
- package/fesm2022/koobiq-components-markdown.mjs.map +1 -1
- package/fesm2022/koobiq-components-modal.mjs +53 -12
- package/fesm2022/koobiq-components-modal.mjs.map +1 -1
- package/fesm2022/koobiq-components-navbar.mjs +29 -13
- package/fesm2022/koobiq-components-navbar.mjs.map +1 -1
- package/fesm2022/koobiq-components-notification-center.mjs +45 -7
- package/fesm2022/koobiq-components-notification-center.mjs.map +1 -1
- package/fesm2022/koobiq-components-overflow-items.mjs +4 -0
- package/fesm2022/koobiq-components-overflow-items.mjs.map +1 -1
- package/fesm2022/koobiq-components-popover.mjs +35 -18
- package/fesm2022/koobiq-components-popover.mjs.map +1 -1
- package/fesm2022/koobiq-components-radio.mjs +3 -7
- package/fesm2022/koobiq-components-radio.mjs.map +1 -1
- package/fesm2022/koobiq-components-resizer.mjs +23 -4
- package/fesm2022/koobiq-components-resizer.mjs.map +1 -1
- package/fesm2022/koobiq-components-select.mjs +126 -29
- package/fesm2022/koobiq-components-select.mjs.map +1 -1
- package/fesm2022/koobiq-components-sidebar.mjs +10 -0
- package/fesm2022/koobiq-components-sidebar.mjs.map +1 -1
- package/fesm2022/koobiq-components-sidepanel.mjs +34 -10
- package/fesm2022/koobiq-components-sidepanel.mjs.map +1 -1
- package/fesm2022/koobiq-components-splitter.mjs +4 -0
- package/fesm2022/koobiq-components-splitter.mjs.map +1 -1
- package/fesm2022/koobiq-components-tabs.mjs +27 -7
- package/fesm2022/koobiq-components-tabs.mjs.map +1 -1
- package/fesm2022/koobiq-components-tags.mjs +4 -2
- package/fesm2022/koobiq-components-tags.mjs.map +1 -1
- package/fesm2022/koobiq-components-textarea.mjs +7 -14
- package/fesm2022/koobiq-components-textarea.mjs.map +1 -1
- package/fesm2022/koobiq-components-timepicker.mjs +44 -19
- package/fesm2022/koobiq-components-timepicker.mjs.map +1 -1
- package/fesm2022/koobiq-components-timezone.mjs +10 -4
- package/fesm2022/koobiq-components-timezone.mjs.map +1 -1
- package/fesm2022/koobiq-components-title.mjs +41 -3
- package/fesm2022/koobiq-components-title.mjs.map +1 -1
- package/fesm2022/koobiq-components-toast.mjs +31 -3
- package/fesm2022/koobiq-components-toast.mjs.map +1 -1
- package/fesm2022/koobiq-components-toggle.mjs +2 -2
- package/fesm2022/koobiq-components-toggle.mjs.map +1 -1
- package/fesm2022/koobiq-components-tooltip.mjs +4 -1
- package/fesm2022/koobiq-components-tooltip.mjs.map +1 -1
- package/fesm2022/koobiq-components-tree-select.mjs +36 -12
- package/fesm2022/koobiq-components-tree-select.mjs.map +1 -1
- package/fesm2022/koobiq-components-tree.mjs +41 -37
- package/fesm2022/koobiq-components-tree.mjs.map +1 -1
- package/fesm2022/koobiq-components-username.mjs +2 -2
- package/fesm2022/koobiq-components-username.mjs.map +1 -1
- package/file-upload/dropzone.d.ts +0 -1
- package/file-upload/file-upload.scss +11 -0
- package/file-upload/multiple-file-upload.component.scss +29 -3
- package/file-upload/primitives/file-picker.d.ts +1 -1
- package/file-upload/single-file-upload.component.scss +10 -2
- package/filter-bar/filter-bar.d.ts +1 -1
- package/filter-bar/filter-bar.types.d.ts +2 -0
- package/filter-bar/filters.scss +3 -2
- package/filter-bar/pipes/base-pipe.d.ts +31 -0
- package/filter-bar/pipes/base-pipe.scss +0 -13
- package/filter-bar/pipes/pipe-date.d.ts +1 -1
- package/filter-bar/pipes/pipe-datetime.d.ts +1 -1
- package/filter-bar/pipes/pipe-input.d.ts +42 -0
- package/filter-bar/pipes/pipe-input.scss +10 -0
- package/filter-bar/public-api.d.ts +1 -0
- package/form-field/fieldset.scss +10 -0
- package/inline-edit/inline-edit.d.ts +5 -0
- package/inline-edit/inline-edit.scss +7 -7
- package/link/_link-theme.scss +50 -15
- package/list/_list-theme.scss +12 -0
- package/list/list-selection.component.d.ts +1 -0
- package/list/list.scss +2 -9
- package/modal/modal-tokens.scss +1 -1
- package/modal/modal.component.d.ts +9 -1
- package/modal/modal.directive.d.ts +11 -0
- package/modal/modal.type.d.ts +7 -0
- package/navbar/_navbar-item_horizontal.scss +5 -0
- package/navbar/_navbar-item_vertical.scss +7 -5
- package/navbar/navbar-item.component.d.ts +15 -0
- package/navbar/navbar.component.d.ts +1 -0
- package/navbar/vertical-navbar.scss +6 -0
- package/notification-center/notification-center.d.ts +13 -1
- package/notification-center/notification-center.scss +12 -0
- package/notification-center/notification-item.scss +6 -0
- package/overflow-items/overflow-items.d.ts +1 -0
- package/package.json +4 -4
- package/prebuilt-themes/dark-theme.css +1 -1
- package/prebuilt-themes/light-theme.css +1 -1
- package/prebuilt-themes/theme.css +1 -1
- package/radio/radio.component.d.ts +1 -5
- package/radio/radio.scss +18 -4
- package/resizer/resizer.d.ts +12 -0
- package/schematics/ng-add/index.js +2 -2
- package/select/select-option.directive.d.ts +1 -0
- package/select/select.component.d.ts +29 -4
- package/sidebar/sidebar.component.d.ts +3 -0
- package/sidepanel/sidepanel-directives.d.ts +2 -0
- package/sidepanel/sidepanel.service.d.ts +8 -0
- package/splitter/splitter.component.d.ts +1 -0
- package/tabs/tab-body.component.d.ts +2 -0
- package/tabs/tab-header.component.d.ts +1 -0
- package/tabs/tab-header.scss +1 -0
- package/tabs/tab-nav-bar.d.ts +1 -0
- package/tabs/tabs-tokens.scss +1 -1
- package/textarea/textarea.component.d.ts +0 -1
- package/timepicker/timepicker.directive.d.ts +3 -0
- package/timezone/timezone-option.directive.d.ts +1 -0
- package/title/title.directive.d.ts +21 -0
- package/toast/toast-container.component.d.ts +25 -0
- package/tree/_tree-theme.scss +5 -11
- package/tree/toggle.scss +4 -0
- package/tree/tree-option.component.d.ts +3 -0
- package/tree/tree-option.scss +2 -12
- package/tree/tree-selection.component.d.ts +1 -0
- package/tree-select/tree-select.component.d.ts +9 -2
package/link/_link-theme.scss
CHANGED
|
@@ -1,7 +1,33 @@
|
|
|
1
|
+
@use 'sass:string';
|
|
2
|
+
|
|
1
3
|
@use '../core/styles/common/tokens' as *;
|
|
2
4
|
|
|
3
5
|
@use './link-tokens';
|
|
4
6
|
|
|
7
|
+
// Unquoted, so that the joiner reaches the CSS as an escape rather than as an invisible character
|
|
8
|
+
$_kbq-link-word-joiner: string.unquote('"\\2060"');
|
|
9
|
+
|
|
10
|
+
// The width of a 16px icon less half a pixel: Chromium lays out a line that ends in negative letter-spacing a
|
|
11
|
+
// fraction wider than the max-content size it reports, so the full width would push the last word to the next
|
|
12
|
+
// line in a shrink-to-fit container.
|
|
13
|
+
$_kbq-link-trailing-icon-reserve: 15.5px;
|
|
14
|
+
|
|
15
|
+
// The gap after the text. Before an icon it is part of the reserve instead of a margin: Firefox does not always
|
|
16
|
+
// keep a margin together with the last word, and the icon could wrap alone again.
|
|
17
|
+
@mixin _kbq-link-text-end-gap($gap) {
|
|
18
|
+
&:not(:last-child) {
|
|
19
|
+
margin-right: $gap;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
&:has(+ .kbq-icon) {
|
|
23
|
+
margin-right: 0;
|
|
24
|
+
|
|
25
|
+
&::after {
|
|
26
|
+
padding-inline-end: calc($gap + $_kbq-link-trailing-icon-reserve);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
5
31
|
@mixin kbq-link-geometry() {
|
|
6
32
|
display: inline;
|
|
7
33
|
|
|
@@ -38,6 +64,21 @@
|
|
|
38
64
|
line-height: 0;
|
|
39
65
|
}
|
|
40
66
|
}
|
|
67
|
+
|
|
68
|
+
// A line may break right before an icon, as before any inline-block, and neither a no-break character
|
|
69
|
+
// nor white-space stops that in every engine. So the text reserves room for the icon after its last
|
|
70
|
+
// word, glued to it by a word joiner kept out of the accessible name, and the icon moves back into that
|
|
71
|
+
// room: the last word and the icon fit on the line together or wrap together.
|
|
72
|
+
.kbq-link__text:has(+ .kbq-icon) {
|
|
73
|
+
&::after {
|
|
74
|
+
content: $_kbq-link-word-joiner;
|
|
75
|
+
content: $_kbq-link-word-joiner / '';
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
+ .kbq-icon {
|
|
79
|
+
margin-inline-start: -$_kbq-link-trailing-icon-reserve;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
41
82
|
}
|
|
42
83
|
|
|
43
84
|
&.kbq-text-with-icon .kbq-link__text {
|
|
@@ -45,9 +86,7 @@
|
|
|
45
86
|
margin-left: var(--kbq-link-size-normal-content-padding);
|
|
46
87
|
}
|
|
47
88
|
|
|
48
|
-
|
|
49
|
-
margin-right: var(--kbq-link-size-normal-content-padding);
|
|
50
|
-
}
|
|
89
|
+
@include _kbq-link-text-end-gap(var(--kbq-link-size-normal-content-padding));
|
|
51
90
|
}
|
|
52
91
|
|
|
53
92
|
&.kbq-link_compact {
|
|
@@ -65,9 +104,7 @@
|
|
|
65
104
|
margin-left: var(--kbq-link-size-compact-content-padding);
|
|
66
105
|
}
|
|
67
106
|
|
|
68
|
-
|
|
69
|
-
margin-right: var(--kbq-link-size-compact-content-padding);
|
|
70
|
-
}
|
|
107
|
+
@include _kbq-link-text-end-gap(var(--kbq-link-size-compact-content-padding));
|
|
71
108
|
}
|
|
72
109
|
}
|
|
73
110
|
}
|
|
@@ -78,20 +115,18 @@
|
|
|
78
115
|
margin-left: var(--kbq-link-size-big-content-padding);
|
|
79
116
|
}
|
|
80
117
|
|
|
81
|
-
|
|
82
|
-
margin-right: var(--kbq-link-size-big-content-padding);
|
|
83
|
-
}
|
|
118
|
+
@include _kbq-link-text-end-gap(var(--kbq-link-size-big-content-padding));
|
|
84
119
|
}
|
|
85
120
|
}
|
|
86
121
|
|
|
87
122
|
&.kbq-text-with-icon.kbq-link_external {
|
|
88
|
-
.kbq-link__text
|
|
89
|
-
|
|
123
|
+
.kbq-link__text {
|
|
124
|
+
@include _kbq-link-text-end-gap(1px);
|
|
90
125
|
}
|
|
91
126
|
|
|
92
127
|
&.kbq-link_compact {
|
|
93
|
-
.kbq-link__text
|
|
94
|
-
|
|
128
|
+
.kbq-link__text {
|
|
129
|
+
@include _kbq-link-text-end-gap(0px);
|
|
95
130
|
}
|
|
96
131
|
|
|
97
132
|
.kbq-icon {
|
|
@@ -100,8 +135,8 @@
|
|
|
100
135
|
}
|
|
101
136
|
|
|
102
137
|
&.kbq-link_big {
|
|
103
|
-
.kbq-link__text
|
|
104
|
-
|
|
138
|
+
.kbq-link__text {
|
|
139
|
+
@include _kbq-link-text-end-gap(2px);
|
|
105
140
|
}
|
|
106
141
|
}
|
|
107
142
|
}
|
package/list/_list-theme.scss
CHANGED
|
@@ -54,6 +54,12 @@
|
|
|
54
54
|
&.kbq-disabled {
|
|
55
55
|
@include _kbq-list-item(states-disabled);
|
|
56
56
|
}
|
|
57
|
+
|
|
58
|
+
&.kbq-selected.kbq-disabled {
|
|
59
|
+
--kbq-option-background: var(--kbq-list-states-selected-container-background);
|
|
60
|
+
|
|
61
|
+
background: var(--kbq-list-states-selected-container-background);
|
|
62
|
+
}
|
|
57
63
|
}
|
|
58
64
|
|
|
59
65
|
.kbq-list-option.kbq-list-option_multiple {
|
|
@@ -70,6 +76,12 @@
|
|
|
70
76
|
@include _kbq-list-item(multiple-states-selected-active);
|
|
71
77
|
}
|
|
72
78
|
}
|
|
79
|
+
|
|
80
|
+
&.kbq-selected.kbq-disabled {
|
|
81
|
+
--kbq-option-background: var(--kbq-list-multiple-states-selected-container-background);
|
|
82
|
+
|
|
83
|
+
background: var(--kbq-list-multiple-states-selected-container-background);
|
|
84
|
+
}
|
|
73
85
|
}
|
|
74
86
|
|
|
75
87
|
.kbq-list-selection.cdk-keyboard-focused {
|
|
@@ -75,6 +75,7 @@ export declare class KbqListSelection implements AfterContentInit, AfterViewInit
|
|
|
75
75
|
get optionBlurChanges(): Observable<KbqOptionEvent>;
|
|
76
76
|
_value: string[] | null;
|
|
77
77
|
private readonly destroyRef;
|
|
78
|
+
private readonly platform;
|
|
78
79
|
private optionFocusSubscription;
|
|
79
80
|
private optionBlurSubscription;
|
|
80
81
|
constructor(elementRef: ElementRef<HTMLElement>, changeDetectorRef: ChangeDetectorRef, multiple: MultipleMode, clipboard: Clipboard);
|
package/list/list.scss
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
@use '../core/option/action-container-mixins' as action-container;
|
|
1
2
|
@use '../core/styles/common/list';
|
|
2
3
|
@use '../core/styles/common/vendor-prefixes';
|
|
3
4
|
@use './list-theme' as theme;
|
|
@@ -29,18 +30,10 @@
|
|
|
29
30
|
@include vendor-prefixes.user-select(none);
|
|
30
31
|
@include list.kbq-list-item-base();
|
|
31
32
|
@include _kbq-list-item-border-radius();
|
|
33
|
+
@include action-container.kbq-option-action-visibility('.kbq-list-selection.cdk-keyboard-focused');
|
|
32
34
|
|
|
33
35
|
&:not(.kbq-disabled) {
|
|
34
36
|
cursor: pointer;
|
|
35
|
-
|
|
36
|
-
&.kbq-hovered,
|
|
37
|
-
&:hover,
|
|
38
|
-
&.kbq-focused,
|
|
39
|
-
&.kbq-action-button-focused {
|
|
40
|
-
& .kbq-action-container {
|
|
41
|
-
display: flex;
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
37
|
}
|
|
45
38
|
}
|
|
46
39
|
|
package/modal/modal-tokens.scss
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
--kbq-modal-size-small-width: 400px;
|
|
3
3
|
--kbq-modal-size-medium-width: 640px;
|
|
4
4
|
--kbq-modal-size-large-width: 960px;
|
|
5
|
-
--kbq-modal-size-border-radius: var(--kbq-size-
|
|
5
|
+
--kbq-modal-size-border-radius: var(--kbq-size-m);
|
|
6
6
|
--kbq-modal-size-header-padding-vertical: var(--kbq-size-l);
|
|
7
7
|
--kbq-modal-size-header-padding-left: var(--kbq-size-xxl);
|
|
8
8
|
--kbq-modal-size-header-padding-right: var(--kbq-size-6xl);
|
|
@@ -5,7 +5,7 @@ import { KbqComponentColors } from '@koobiq/components/core';
|
|
|
5
5
|
import { Observable } from 'rxjs';
|
|
6
6
|
import { KbqModalControlService } from './modal-control.service';
|
|
7
7
|
import { KbqModalRef } from './modal-ref.class';
|
|
8
|
-
import { IModalButtonOptions, ModalOptions, ModalSize, ModalType, OnClickCallback } from './modal.type';
|
|
8
|
+
import { IModalButtonOptions, KbqOverflowShadowState, ModalOptions, ModalSize, ModalType, OnClickCallback } from './modal.type';
|
|
9
9
|
import * as i0 from "@angular/core";
|
|
10
10
|
type AnimationState = 'enter' | 'leave' | null;
|
|
11
11
|
export declare class KbqModalComponent<T = any, R = any> extends KbqModalRef<T, R> implements OnInit, OnChanges, AfterViewInit, OnDestroy, ModalOptions {
|
|
@@ -18,6 +18,7 @@ export declare class KbqModalComponent<T = any, R = any> extends KbqModalRef<T,
|
|
|
18
18
|
private changeDetector;
|
|
19
19
|
private focusMonitor;
|
|
20
20
|
protected readonly document: Document;
|
|
21
|
+
private readonly destroyRef;
|
|
21
22
|
componentColors: typeof KbqComponentColors;
|
|
22
23
|
kbqModalType: ModalType;
|
|
23
24
|
kbqComponent: Type<T>;
|
|
@@ -68,6 +69,13 @@ export declare class KbqModalComponent<T = any, R = any> extends KbqModalRef<T,
|
|
|
68
69
|
modalBody: ElementRef;
|
|
69
70
|
isTopOverflow: boolean;
|
|
70
71
|
isBottomOverflow: boolean;
|
|
72
|
+
/**
|
|
73
|
+
* Scroll-shadow state published by `KbqModalBody` when the modal content is composed
|
|
74
|
+
* manually (`kbq-modal-title`/`kbq-modal-body`/`kbq-modal-footer`), so the header/footer
|
|
75
|
+
* can render matching shadows without a direct template reference between them.
|
|
76
|
+
* @docs-private
|
|
77
|
+
*/
|
|
78
|
+
readonly bodyOverflow: import("@angular/core").WritableSignal<KbqOverflowShadowState>;
|
|
71
79
|
maskAnimationClassMap: object | null;
|
|
72
80
|
modalAnimationClassMap: object | null;
|
|
73
81
|
transformOrigin: string;
|
|
@@ -6,11 +6,22 @@ export declare class KbqModalTitle {
|
|
|
6
6
|
static ɵfac: i0.ɵɵFactoryDeclaration<KbqModalTitle, never>;
|
|
7
7
|
static ɵcmp: i0.ɵɵComponentDeclaration<KbqModalTitle, "[kbq-modal-title], kbq-modal-title, [kbqModalTitle]", never, {}, {}, never, ["*"], true, never>;
|
|
8
8
|
}
|
|
9
|
+
/**
|
|
10
|
+
* Scrollable body of a manually composed modal (`kbqComponent`). Publishes its scroll-shadow
|
|
11
|
+
* state onto the modal instance so a sibling `KbqModalTitle`/`KbqModalFooter` can render the
|
|
12
|
+
* matching shadow, since they have no direct template reference to this element.
|
|
13
|
+
*/
|
|
9
14
|
export declare class KbqModalBody {
|
|
15
|
+
private readonly modal;
|
|
16
|
+
private readonly elementRef;
|
|
17
|
+
constructor();
|
|
18
|
+
/** @docs-private */
|
|
19
|
+
protected checkOverflow(): void;
|
|
10
20
|
static ɵfac: i0.ɵɵFactoryDeclaration<KbqModalBody, never>;
|
|
11
21
|
static ɵdir: i0.ɵɵDirectiveDeclaration<KbqModalBody, "[kbq-modal-body], kbq-modal-body, [kbqModalBody]", never, {}, {}, never, never, true, never>;
|
|
12
22
|
}
|
|
13
23
|
export declare class KbqModalFooter {
|
|
24
|
+
protected modal: KbqModalComponent<any, any>;
|
|
14
25
|
static ɵfac: i0.ɵɵFactoryDeclaration<KbqModalFooter, never>;
|
|
15
26
|
static ɵdir: i0.ɵɵDirectiveDeclaration<KbqModalFooter, "[kbq-modal-footer], kbq-modal-footer, [kbqModalFooter]", never, {}, {}, never, never, true, never>;
|
|
16
27
|
}
|
package/modal/modal.type.d.ts
CHANGED
|
@@ -3,6 +3,13 @@ import { EventEmitter, Injector, TemplateRef, Type } from '@angular/core';
|
|
|
3
3
|
export type OnClickCallback<T> = (instance: T) => (false | void | {}) | Promise<false | void | {}>;
|
|
4
4
|
export type ModalType = 'default' | 'confirm' | 'custom';
|
|
5
5
|
export type ConfirmType = 'confirm' | 'success' | 'warn';
|
|
6
|
+
/** Shadow visibility state — which of the two overflow shadows should be rendered. */
|
|
7
|
+
export interface KbqOverflowShadowState {
|
|
8
|
+
/** Whether the top (header) shadow should be visible — content is scrolled past the top. */
|
|
9
|
+
top: boolean;
|
|
10
|
+
/** Whether the bottom (footer) shadow should be visible — more content remains below the fold. */
|
|
11
|
+
bottom: boolean;
|
|
12
|
+
}
|
|
6
13
|
export declare enum ModalSize {
|
|
7
14
|
Small = "small",
|
|
8
15
|
Medium = "medium",
|
|
@@ -19,6 +19,11 @@
|
|
|
19
19
|
|
|
20
20
|
justify-content: center;
|
|
21
21
|
|
|
22
|
+
// Hit area over the margin this item is spaced with, so the highlight does not drop out between
|
|
23
|
+
// items (DS-2558) — the transparent pseudo-element is hit-tested as part of the item, so hover and
|
|
24
|
+
// click both reach it. `:after` below paints the highlight, at the item's own box. The same
|
|
25
|
+
// technique is written twice more: `select.item-active-area()` for a plain vertical list, and
|
|
26
|
+
// `--kbq-button-toggle-size-item-hit-area-*` for a group whose `gap` two neighbours have to tile.
|
|
22
27
|
&:before {
|
|
23
28
|
top: calc(-1 * #{var(--kbq-size-s)});
|
|
24
29
|
left: calc(-1 * #{var(--kbq-size-s)});
|
|
@@ -55,17 +55,19 @@
|
|
|
55
55
|
&.kbq-navbar-bento .kbq-navbar-item__title {
|
|
56
56
|
margin-left: -8px;
|
|
57
57
|
opacity: 0;
|
|
58
|
+
|
|
59
|
+
transition:
|
|
60
|
+
opacity 150ms ease-out,
|
|
61
|
+
margin-left 150ms ease-out;
|
|
58
62
|
}
|
|
59
63
|
|
|
60
64
|
&.kbq-navbar-bento:hover,
|
|
61
|
-
&.kbq-navbar-bento.cdk-keyboard-focused
|
|
65
|
+
&.kbq-navbar-bento.cdk-keyboard-focused,
|
|
66
|
+
&.kbq-navbar-bento.kbq-active,
|
|
67
|
+
&.kbq-navbar-bento.kbq-pressed {
|
|
62
68
|
& .kbq-navbar-item__title {
|
|
63
69
|
margin-left: 0;
|
|
64
70
|
opacity: 1;
|
|
65
|
-
|
|
66
|
-
transition:
|
|
67
|
-
opacity 150ms ease-out,
|
|
68
|
-
margin-left 150ms ease-out;
|
|
69
71
|
}
|
|
70
72
|
}
|
|
71
73
|
}
|
|
@@ -29,6 +29,12 @@ export declare class KbqNavbarTitle implements AfterViewInit {
|
|
|
29
29
|
isTextOverflown: boolean;
|
|
30
30
|
get text(): string;
|
|
31
31
|
get isOverflown(): boolean;
|
|
32
|
+
/**
|
|
33
|
+
* Outer width of the title: its border box plus horizontal margins.
|
|
34
|
+
*
|
|
35
|
+
* Measured with `getBoundingClientRect()` rather than `getComputedStyle().width`, which resolves
|
|
36
|
+
* to the used content-box width whatever `box-sizing` says and would drop the title's padding.
|
|
37
|
+
*/
|
|
32
38
|
getOuterElementWidth(): number;
|
|
33
39
|
checkTextOverflown(): void;
|
|
34
40
|
ngAfterViewInit(): void;
|
|
@@ -89,6 +95,15 @@ export declare class KbqNavbarRectangleElement {
|
|
|
89
95
|
set collapsed(value: boolean);
|
|
90
96
|
private _collapsed;
|
|
91
97
|
button: KbqButtonCssStyler;
|
|
98
|
+
/**
|
|
99
|
+
* Outer width of the item: its border box plus horizontal margins.
|
|
100
|
+
*
|
|
101
|
+
* Measured with `getBoundingClientRect()` rather than `getComputedStyle().width`, which resolves
|
|
102
|
+
* to the used content-box width whatever `box-sizing` says. `.kbq-navbar-item` is `border-box`
|
|
103
|
+
* with horizontal padding, so the computed value dropped that padding from every item, while
|
|
104
|
+
* `KbqNavbar.width` — the figure this sum is compared against — has always been a border box.
|
|
105
|
+
* The navbar therefore under-counted its own content and collapsed later than it should.
|
|
106
|
+
*/
|
|
92
107
|
getOuterElementWidth(): number;
|
|
93
108
|
static ɵfac: i0.ɵɵFactoryDeclaration<KbqNavbarRectangleElement, never>;
|
|
94
109
|
static ɵdir: i0.ɵɵDirectiveDeclaration<KbqNavbarRectangleElement, "kbq-navbar-item, [kbq-navbar-item], kbq-navbar-divider, kbq-navbar-brand, [kbq-navbar-brand]", never, {}, {}, ["button"], never, true, never>;
|
|
@@ -43,6 +43,7 @@ export declare class KbqNavbar extends KbqFocusableComponent implements AfterVie
|
|
|
43
43
|
protected readonly elementRef: ElementRef<HTMLElement>;
|
|
44
44
|
protected readonly changeDetectorRef: ChangeDetectorRef;
|
|
45
45
|
protected readonly focusMonitor: FocusMonitor;
|
|
46
|
+
private readonly platform;
|
|
46
47
|
readonly rectangleElements: import("@angular/core").Signal<readonly any[]>;
|
|
47
48
|
navbarItems: QueryList<KbqNavbarItem>;
|
|
48
49
|
readonly resizeStream: Subject<Event>;
|
|
@@ -26,6 +26,12 @@
|
|
|
26
26
|
}
|
|
27
27
|
|
|
28
28
|
& .kbq-vertical-navbar__container {
|
|
29
|
+
// The 1px `border-right` the theme adds belongs inside these widths, not beside them: the
|
|
30
|
+
// collapsed rail is `--kbq-size-6xl`, the same token this component's own `min-width` above
|
|
31
|
+
// is written in, so rendering it a pixel wider overshot that contract. Under `content-box`
|
|
32
|
+
// it measured 57px collapsed and 241px expanded.
|
|
33
|
+
box-sizing: border-box;
|
|
34
|
+
|
|
29
35
|
position: relative;
|
|
30
36
|
|
|
31
37
|
display: flex;
|
|
@@ -81,10 +81,22 @@ export declare class KbqNotificationCenterComponent extends KbqPopUp implements
|
|
|
81
81
|
* stall. Suppressed while a load is in flight, errored, or when there is nothing more to load.
|
|
82
82
|
*/
|
|
83
83
|
private subscribeToScrolledToBottom;
|
|
84
|
-
/** Whether the list is scrolled to within `scrolledToBottomOffset` pixels of the bottom.
|
|
84
|
+
/** Whether the list is scrolled to within `scrolledToBottomOffset` pixels of the bottom.
|
|
85
|
+
* Sub-pixel measurement error is absorbed by `SCROLLED_TO_BOTTOM_TOLERANCE`. */
|
|
85
86
|
private isScrolledToBottom;
|
|
86
87
|
/** Emits `onNextPage` unless a load is already in flight, errored, or there is nothing more to load. */
|
|
87
88
|
private requestNextPage;
|
|
89
|
+
/**
|
|
90
|
+
* Reveals the bottom "load more" spinner / error row when it first appears. Both rows are appended
|
|
91
|
+
* below the last item and can land outside the viewport (the next page is requested while the user
|
|
92
|
+
* is up to `scrolledToBottomOffset` px above the true bottom). Only a genuine false->true transition
|
|
93
|
+
* reveals the row: the BehaviorSubject's replayed current value is ignored (`pairwise` needs two
|
|
94
|
+
* emissions), so the panel always opens scrolled to the top — reopening it while a load-more error
|
|
95
|
+
* is still set never jumps to the bottom.
|
|
96
|
+
*/
|
|
97
|
+
private subscribeToRevealLoadMoreRow;
|
|
98
|
+
/** Scrolls the list container to its bottom so a freshly-appended bottom row becomes visible. */
|
|
99
|
+
private scrollToBottom;
|
|
88
100
|
private focusScrollContainer;
|
|
89
101
|
/** @docs-private */
|
|
90
102
|
updateClassMap(placement: string, customClass: string, size: KbqPopUpSizeValues): void;
|
|
@@ -94,6 +94,18 @@
|
|
|
94
94
|
|
|
95
95
|
padding-bottom: var(--kbq-size-xl);
|
|
96
96
|
|
|
97
|
+
// Smoothly reveal the just-appended "load more" spinner / error row. The row is scrolled into
|
|
98
|
+
// view via KbqScrollbar.scrollTo(), which calls a behavior-less scroll on the overlayscrollbars
|
|
99
|
+
// viewport — so `scroll-behavior` on the viewport controls the animation. Disabled for users who
|
|
100
|
+
// prefer reduced motion.
|
|
101
|
+
& [data-overlayscrollbars-viewport] {
|
|
102
|
+
scroll-behavior: smooth;
|
|
103
|
+
|
|
104
|
+
@media (prefers-reduced-motion: reduce) {
|
|
105
|
+
scroll-behavior: auto;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
97
109
|
& .kbq-loader-overlay_parent {
|
|
98
110
|
border-radius: inherit;
|
|
99
111
|
}
|
|
@@ -27,6 +27,12 @@
|
|
|
27
27
|
.kbq-notification-item__icon-container {
|
|
28
28
|
flex-shrink: 0;
|
|
29
29
|
|
|
30
|
+
// The size below is the icon itself and the padding only positions it, so the two must not share
|
|
31
|
+
// a box. Under a global `border-box` reset in a consuming application the padding would be
|
|
32
|
+
// subtracted from the icon instead of added around it, and `max-width`/`max-height` would clamp
|
|
33
|
+
// what is left — a 16px icon squeezed into 4px wide and 2px tall.
|
|
34
|
+
box-sizing: content-box;
|
|
35
|
+
|
|
30
36
|
width: var(--kbq-size-l);
|
|
31
37
|
max-width: var(--kbq-size-l);
|
|
32
38
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@koobiq/components",
|
|
3
|
-
"version": "19.8.
|
|
3
|
+
"version": "19.8.6",
|
|
4
4
|
"description": "koobiq",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -25,9 +25,9 @@
|
|
|
25
25
|
"@angular/cdk": ">=19.0.0",
|
|
26
26
|
"@angular/core": ">=19.0.0",
|
|
27
27
|
"@angular/forms": ">=19.0.0",
|
|
28
|
-
"@koobiq/cdk": "19.8.
|
|
29
|
-
"@koobiq/angular-moment-adapter": "19.8.
|
|
30
|
-
"@koobiq/angular-luxon-adapter": "19.8.
|
|
28
|
+
"@koobiq/cdk": "19.8.6",
|
|
29
|
+
"@koobiq/angular-moment-adapter": "19.8.6",
|
|
30
|
+
"@koobiq/angular-luxon-adapter": "19.8.6",
|
|
31
31
|
"@koobiq/date-formatter": "^3.2.3",
|
|
32
32
|
"@koobiq/icons": "^11.1.3",
|
|
33
33
|
"@koobiq/design-tokens": "^3.14.0"
|