@openkit-labs/ngx-kit-ui 0.0.40 → 0.0.41

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.
@@ -1989,6 +1989,394 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImpor
1989
1989
  }]
1990
1990
  }] });
1991
1991
 
1992
+ class KitTextHeadingComponent {
1993
+ color = '';
1994
+ align;
1995
+ weight;
1996
+ decoration;
1997
+ margin;
1998
+ wrap = true;
1999
+ ellipses = false;
2000
+ lines = 0;
2001
+ italic = false;
2002
+ get colorClass() {
2003
+ return this.color ? `kit-text-${this.color}` : '';
2004
+ }
2005
+ get textStyles() {
2006
+ const baseStyles = {
2007
+ 'margin': this.margin,
2008
+ 'text-align': this.align,
2009
+ 'font-weight': this.weight,
2010
+ 'text-decoration': this.decoration,
2011
+ 'font-style': this.italic ? 'italic' : 'normal'
2012
+ };
2013
+ if (this.ellipses) {
2014
+ if (this.wrap && this.lines > 0) {
2015
+ // Multi-line ellipsis
2016
+ baseStyles['display'] = '-webkit-box';
2017
+ baseStyles['-webkit-line-clamp'] = this.lines;
2018
+ baseStyles['-webkit-box-orient'] = 'vertical';
2019
+ baseStyles['overflow'] = 'hidden';
2020
+ }
2021
+ else {
2022
+ // Single-line ellipsis
2023
+ baseStyles['white-space'] = 'nowrap';
2024
+ baseStyles['overflow'] = 'hidden';
2025
+ baseStyles['text-overflow'] = 'ellipsis';
2026
+ }
2027
+ }
2028
+ else {
2029
+ // Wrapping control
2030
+ baseStyles['white-space'] = this.wrap ? 'normal' : 'nowrap';
2031
+ }
2032
+ return baseStyles;
2033
+ }
2034
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: KitTextHeadingComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2035
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.4", type: KitTextHeadingComponent, isStandalone: true, selector: "kit-text-heading", inputs: { color: "color", align: "align", weight: "weight", decoration: "decoration", margin: "margin", wrap: "wrap", ellipses: "ellipses", lines: "lines", italic: "italic" }, ngImport: i0, template: "<h1 [ngClass]=\"colorClass\" [ngStyle]=\"textStyles\">\n <ng-content></ng-content>\n</h1>", styles: ["h1{font-size:var(--kit-font-size-heading, 2rem);font-weight:var(--kit-font-weight-heading, 700);line-height:var(--kit-line-height-heading, 1.2);margin-bottom:1rem;color:var(--kit-text-color-primary, #212529)}.kit-text-primary{color:var(--kit-color-primary, #0066cc)}.kit-text-secondary{color:var(--kit-color-secondary, #6c757d)}.kit-text-success{color:var(--kit-color-success, #28a745)}.kit-text-warning{color:var(--kit-color-warning, #ffc107)}.kit-text-danger{color:var(--kit-color-danger, #dc3545)}.kit-text-muted{color:var(--kit-text-color-muted, #adb5bd)}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }] });
2036
+ }
2037
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: KitTextHeadingComponent, decorators: [{
2038
+ type: Component,
2039
+ args: [{ selector: 'kit-text-heading', standalone: true, imports: [NgClass, NgStyle], template: "<h1 [ngClass]=\"colorClass\" [ngStyle]=\"textStyles\">\n <ng-content></ng-content>\n</h1>", styles: ["h1{font-size:var(--kit-font-size-heading, 2rem);font-weight:var(--kit-font-weight-heading, 700);line-height:var(--kit-line-height-heading, 1.2);margin-bottom:1rem;color:var(--kit-text-color-primary, #212529)}.kit-text-primary{color:var(--kit-color-primary, #0066cc)}.kit-text-secondary{color:var(--kit-color-secondary, #6c757d)}.kit-text-success{color:var(--kit-color-success, #28a745)}.kit-text-warning{color:var(--kit-color-warning, #ffc107)}.kit-text-danger{color:var(--kit-color-danger, #dc3545)}.kit-text-muted{color:var(--kit-text-color-muted, #adb5bd)}\n"] }]
2040
+ }], propDecorators: { color: [{
2041
+ type: Input
2042
+ }], align: [{
2043
+ type: Input
2044
+ }], weight: [{
2045
+ type: Input
2046
+ }], decoration: [{
2047
+ type: Input
2048
+ }], margin: [{
2049
+ type: Input
2050
+ }], wrap: [{
2051
+ type: Input
2052
+ }], ellipses: [{
2053
+ type: Input
2054
+ }], lines: [{
2055
+ type: Input
2056
+ }], italic: [{
2057
+ type: Input
2058
+ }] } });
2059
+
2060
+ class KitTextSubheadingComponent {
2061
+ color = '';
2062
+ align;
2063
+ weight;
2064
+ decoration;
2065
+ margin;
2066
+ wrap = true;
2067
+ ellipses = false;
2068
+ lines = 0;
2069
+ italic = false;
2070
+ get colorClass() {
2071
+ return this.color ? `kit-text-${this.color}` : '';
2072
+ }
2073
+ get textStyles() {
2074
+ const baseStyles = {
2075
+ 'margin': this.margin,
2076
+ 'text-align': this.align,
2077
+ 'font-weight': this.weight,
2078
+ 'text-decoration': this.decoration,
2079
+ 'font-style': this.italic ? 'italic' : 'normal'
2080
+ };
2081
+ if (this.ellipses) {
2082
+ if (this.wrap && this.lines > 0) {
2083
+ // Multi-line ellipsis
2084
+ baseStyles['display'] = '-webkit-box';
2085
+ baseStyles['-webkit-line-clamp'] = this.lines;
2086
+ baseStyles['-webkit-box-orient'] = 'vertical';
2087
+ baseStyles['overflow'] = 'hidden';
2088
+ }
2089
+ else {
2090
+ // Single-line ellipsis
2091
+ baseStyles['white-space'] = 'nowrap';
2092
+ baseStyles['overflow'] = 'hidden';
2093
+ baseStyles['text-overflow'] = 'ellipsis';
2094
+ }
2095
+ }
2096
+ else {
2097
+ // Wrapping control
2098
+ baseStyles['white-space'] = this.wrap ? 'normal' : 'nowrap';
2099
+ }
2100
+ return baseStyles;
2101
+ }
2102
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: KitTextSubheadingComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2103
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.4", type: KitTextSubheadingComponent, isStandalone: true, selector: "kit-text-subheading", inputs: { color: "color", align: "align", weight: "weight", decoration: "decoration", margin: "margin", wrap: "wrap", ellipses: "ellipses", lines: "lines", italic: "italic" }, ngImport: i0, template: "<h2 [ngClass]=\"colorClass\" [ngStyle]=\"textStyles\">\n <ng-content></ng-content>\n</h2>", styles: ["h2{font-size:var(--kit-font-size-subheading, 1.5rem);font-weight:var(--kit-font-weight-subheading, 500);line-height:var(--kit-line-height-subheading, 1.2);margin-bottom:.75rem;color:var(--kit-text-color-primary, #212529)}.kit-text-primary{color:var(--kit-color-primary, #0066cc)}.kit-text-secondary{color:var(--kit-color-secondary, #6c757d)}.kit-text-success{color:var(--kit-color-success, #28a745)}.kit-text-warning{color:var(--kit-color-warning, #ffc107)}.kit-text-danger{color:var(--kit-color-danger, #dc3545)}.kit-text-muted{color:var(--kit-text-color-muted, #adb5bd)}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }] });
2104
+ }
2105
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: KitTextSubheadingComponent, decorators: [{
2106
+ type: Component,
2107
+ args: [{ selector: 'kit-text-subheading', standalone: true, imports: [NgClass, NgStyle], template: "<h2 [ngClass]=\"colorClass\" [ngStyle]=\"textStyles\">\n <ng-content></ng-content>\n</h2>", styles: ["h2{font-size:var(--kit-font-size-subheading, 1.5rem);font-weight:var(--kit-font-weight-subheading, 500);line-height:var(--kit-line-height-subheading, 1.2);margin-bottom:.75rem;color:var(--kit-text-color-primary, #212529)}.kit-text-primary{color:var(--kit-color-primary, #0066cc)}.kit-text-secondary{color:var(--kit-color-secondary, #6c757d)}.kit-text-success{color:var(--kit-color-success, #28a745)}.kit-text-warning{color:var(--kit-color-warning, #ffc107)}.kit-text-danger{color:var(--kit-color-danger, #dc3545)}.kit-text-muted{color:var(--kit-text-color-muted, #adb5bd)}\n"] }]
2108
+ }], propDecorators: { color: [{
2109
+ type: Input
2110
+ }], align: [{
2111
+ type: Input
2112
+ }], weight: [{
2113
+ type: Input
2114
+ }], decoration: [{
2115
+ type: Input
2116
+ }], margin: [{
2117
+ type: Input
2118
+ }], wrap: [{
2119
+ type: Input
2120
+ }], ellipses: [{
2121
+ type: Input
2122
+ }], lines: [{
2123
+ type: Input
2124
+ }], italic: [{
2125
+ type: Input
2126
+ }] } });
2127
+
2128
+ class KitTextDisplayComponent {
2129
+ color = '';
2130
+ align;
2131
+ weight;
2132
+ decoration;
2133
+ margin;
2134
+ wrap = true;
2135
+ ellipses = false;
2136
+ lines = 0;
2137
+ italic = false;
2138
+ get colorClass() {
2139
+ return this.color ? `kit-text-${this.color}` : '';
2140
+ }
2141
+ get textStyles() {
2142
+ const baseStyles = {
2143
+ 'margin': this.margin,
2144
+ 'text-align': this.align,
2145
+ 'font-weight': this.weight,
2146
+ 'text-decoration': this.decoration,
2147
+ 'font-style': this.italic ? 'italic' : 'normal'
2148
+ };
2149
+ if (this.ellipses) {
2150
+ if (this.wrap && this.lines > 0) {
2151
+ // Multi-line ellipsis
2152
+ baseStyles['display'] = '-webkit-box';
2153
+ baseStyles['-webkit-line-clamp'] = this.lines;
2154
+ baseStyles['-webkit-box-orient'] = 'vertical';
2155
+ baseStyles['overflow'] = 'hidden';
2156
+ }
2157
+ else {
2158
+ // Single-line ellipsis
2159
+ baseStyles['white-space'] = 'nowrap';
2160
+ baseStyles['overflow'] = 'hidden';
2161
+ baseStyles['text-overflow'] = 'ellipsis';
2162
+ }
2163
+ }
2164
+ else {
2165
+ // Wrapping control
2166
+ baseStyles['white-space'] = this.wrap ? 'normal' : 'nowrap';
2167
+ }
2168
+ return baseStyles;
2169
+ }
2170
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: KitTextDisplayComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2171
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.4", type: KitTextDisplayComponent, isStandalone: true, selector: "kit-text-display", inputs: { color: "color", align: "align", weight: "weight", decoration: "decoration", margin: "margin", wrap: "wrap", ellipses: "ellipses", lines: "lines", italic: "italic" }, ngImport: i0, template: "<h3 [ngClass]=\"colorClass\" [ngStyle]=\"textStyles\">\n <ng-content></ng-content>\n</h3>", styles: ["h3{font-size:var(--kit-font-size-display, 3rem);font-weight:var(--kit-font-weight-display, bold);line-height:var(--kit-line-height-display, 1.3);margin-bottom:.5rem;color:var(--kit-text-color-primary, #212529)}.kit-text-primary{color:var(--kit-color-primary, #0066cc)}.kit-text-secondary{color:var(--kit-color-secondary, #6c757d)}.kit-text-success{color:var(--kit-color-success, #28a745)}.kit-text-warning{color:var(--kit-color-warning, #ffc107)}.kit-text-danger{color:var(--kit-color-danger, #dc3545)}.kit-text-muted{color:var(--kit-text-color-muted, #adb5bd)}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }] });
2172
+ }
2173
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: KitTextDisplayComponent, decorators: [{
2174
+ type: Component,
2175
+ args: [{ selector: 'kit-text-display', standalone: true, imports: [NgClass, NgStyle], template: "<h3 [ngClass]=\"colorClass\" [ngStyle]=\"textStyles\">\n <ng-content></ng-content>\n</h3>", styles: ["h3{font-size:var(--kit-font-size-display, 3rem);font-weight:var(--kit-font-weight-display, bold);line-height:var(--kit-line-height-display, 1.3);margin-bottom:.5rem;color:var(--kit-text-color-primary, #212529)}.kit-text-primary{color:var(--kit-color-primary, #0066cc)}.kit-text-secondary{color:var(--kit-color-secondary, #6c757d)}.kit-text-success{color:var(--kit-color-success, #28a745)}.kit-text-warning{color:var(--kit-color-warning, #ffc107)}.kit-text-danger{color:var(--kit-color-danger, #dc3545)}.kit-text-muted{color:var(--kit-text-color-muted, #adb5bd)}\n"] }]
2176
+ }], propDecorators: { color: [{
2177
+ type: Input
2178
+ }], align: [{
2179
+ type: Input
2180
+ }], weight: [{
2181
+ type: Input
2182
+ }], decoration: [{
2183
+ type: Input
2184
+ }], margin: [{
2185
+ type: Input
2186
+ }], wrap: [{
2187
+ type: Input
2188
+ }], ellipses: [{
2189
+ type: Input
2190
+ }], lines: [{
2191
+ type: Input
2192
+ }], italic: [{
2193
+ type: Input
2194
+ }] } });
2195
+
2196
+ class KitTextBodyComponent {
2197
+ color = '';
2198
+ align;
2199
+ weight;
2200
+ decoration;
2201
+ margin;
2202
+ wrap = true;
2203
+ ellipses = false;
2204
+ lines = 0;
2205
+ italic = false;
2206
+ get colorClass() {
2207
+ return this.color ? `kit-text-${this.color}` : '';
2208
+ }
2209
+ get textStyles() {
2210
+ const baseStyles = {
2211
+ 'margin': this.margin,
2212
+ 'text-align': this.align,
2213
+ 'font-weight': this.weight,
2214
+ 'text-decoration': this.decoration,
2215
+ 'font-style': this.italic ? 'italic' : 'normal'
2216
+ };
2217
+ if (this.ellipses) {
2218
+ if (this.wrap && this.lines > 0) {
2219
+ // Multi-line ellipsis
2220
+ baseStyles['display'] = '-webkit-box';
2221
+ baseStyles['-webkit-line-clamp'] = this.lines;
2222
+ baseStyles['-webkit-box-orient'] = 'vertical';
2223
+ baseStyles['overflow'] = 'hidden';
2224
+ }
2225
+ else {
2226
+ // Single-line ellipsis
2227
+ baseStyles['white-space'] = 'nowrap';
2228
+ baseStyles['overflow'] = 'hidden';
2229
+ baseStyles['text-overflow'] = 'ellipsis';
2230
+ }
2231
+ }
2232
+ else {
2233
+ // Wrapping control
2234
+ baseStyles['white-space'] = this.wrap ? 'normal' : 'nowrap';
2235
+ }
2236
+ return baseStyles;
2237
+ }
2238
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: KitTextBodyComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2239
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.4", type: KitTextBodyComponent, isStandalone: true, selector: "kit-text-body", inputs: { color: "color", align: "align", weight: "weight", decoration: "decoration", margin: "margin", wrap: "wrap", ellipses: "ellipses", lines: "lines", italic: "italic" }, ngImport: i0, template: "<p [ngClass]=\"colorClass\" [ngStyle]=\"textStyles\">\n <ng-content></ng-content>\n</p>", styles: ["p{font-size:var(--kit-font-size-body, 1rem);font-weight:var(--kit-font-weight-body, 400);line-height:var(--kit-line-height-body, 1.5);margin-bottom:1rem;color:var(--kit-text-color-primary, #212529)}.kit-text-primary{color:var(--kit-color-primary, #0066cc)}.kit-text-secondary{color:var(--kit-color-secondary, #6c757d)}.kit-text-success{color:var(--kit-color-success, #28a745)}.kit-text-info{color:var(--kit-color-info, #17a2b8)}.kit-text-warning{color:var(--kit-color-warning, #ffc107)}.kit-text-danger{color:var(--kit-color-danger, #dc3545)}.kit-text-muted{color:var(--kit-text-color-muted, #adb5bd)}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }] });
2240
+ }
2241
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: KitTextBodyComponent, decorators: [{
2242
+ type: Component,
2243
+ args: [{ selector: 'kit-text-body', standalone: true, imports: [NgClass, NgStyle], template: "<p [ngClass]=\"colorClass\" [ngStyle]=\"textStyles\">\n <ng-content></ng-content>\n</p>", styles: ["p{font-size:var(--kit-font-size-body, 1rem);font-weight:var(--kit-font-weight-body, 400);line-height:var(--kit-line-height-body, 1.5);margin-bottom:1rem;color:var(--kit-text-color-primary, #212529)}.kit-text-primary{color:var(--kit-color-primary, #0066cc)}.kit-text-secondary{color:var(--kit-color-secondary, #6c757d)}.kit-text-success{color:var(--kit-color-success, #28a745)}.kit-text-info{color:var(--kit-color-info, #17a2b8)}.kit-text-warning{color:var(--kit-color-warning, #ffc107)}.kit-text-danger{color:var(--kit-color-danger, #dc3545)}.kit-text-muted{color:var(--kit-text-color-muted, #adb5bd)}\n"] }]
2244
+ }], propDecorators: { color: [{
2245
+ type: Input
2246
+ }], align: [{
2247
+ type: Input
2248
+ }], weight: [{
2249
+ type: Input
2250
+ }], decoration: [{
2251
+ type: Input
2252
+ }], margin: [{
2253
+ type: Input
2254
+ }], wrap: [{
2255
+ type: Input
2256
+ }], ellipses: [{
2257
+ type: Input
2258
+ }], lines: [{
2259
+ type: Input
2260
+ }], italic: [{
2261
+ type: Input
2262
+ }] } });
2263
+
2264
+ class KitTextLinkComponent {
2265
+ color = '';
2266
+ href = '#';
2267
+ target = '_self';
2268
+ align;
2269
+ weight;
2270
+ decoration;
2271
+ margin;
2272
+ wrap = true;
2273
+ ellipses = false;
2274
+ lines = 0;
2275
+ italic = false;
2276
+ get colorClass() {
2277
+ return this.color ? `kit-text-${this.color}` : '';
2278
+ }
2279
+ get textStyles() {
2280
+ const baseStyles = {
2281
+ 'margin': this.margin,
2282
+ 'text-align': this.align,
2283
+ 'font-weight': this.weight,
2284
+ 'text-decoration': this.decoration,
2285
+ 'font-style': this.italic ? 'italic' : 'normal'
2286
+ };
2287
+ if (this.ellipses) {
2288
+ if (this.wrap && this.lines > 0) {
2289
+ // Multi-line ellipsis
2290
+ baseStyles['display'] = '-webkit-box';
2291
+ baseStyles['-webkit-line-clamp'] = this.lines;
2292
+ baseStyles['-webkit-box-orient'] = 'vertical';
2293
+ baseStyles['overflow'] = 'hidden';
2294
+ }
2295
+ else {
2296
+ // Single-line ellipsis
2297
+ baseStyles['white-space'] = 'nowrap';
2298
+ baseStyles['overflow'] = 'hidden';
2299
+ baseStyles['text-overflow'] = 'ellipsis';
2300
+ }
2301
+ }
2302
+ else {
2303
+ // Wrapping control
2304
+ baseStyles['white-space'] = this.wrap ? 'normal' : 'nowrap';
2305
+ }
2306
+ return baseStyles;
2307
+ }
2308
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: KitTextLinkComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2309
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.4", type: KitTextLinkComponent, isStandalone: true, selector: "kit-text-link", inputs: { color: "color", href: "href", target: "target", align: "align", weight: "weight", decoration: "decoration", margin: "margin", wrap: "wrap", ellipses: "ellipses", lines: "lines", italic: "italic" }, ngImport: i0, template: "<a [ngClass]=\"colorClass\" [href]=\"href\" [target]=\"target\" [ngStyle]=\"textStyles\">\n <ng-content></ng-content>\n</a>", styles: ["a{font-size:var(--kit-font-size-link, 1rem);font-weight:var(--kit-font-weight-link, 400);line-height:var(--kit-line-height-link, 1.5);text-decoration:underline;cursor:pointer;color:var(--kit-color-primary, #0066cc)}a:hover{opacity:.85}.kit-text-primary{color:var(--kit-color-primary, #0066cc)}.kit-text-secondary{color:var(--kit-color-secondary, #6c757d)}.kit-text-success{color:var(--kit-color-success, #28a745)}.kit-text-warning{color:var(--kit-color-warning, #ffc107)}.kit-text-danger{color:var(--kit-color-danger, #dc3545)}.kit-text-muted{color:var(--kit-text-color-muted, #adb5bd)}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }] });
2310
+ }
2311
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: KitTextLinkComponent, decorators: [{
2312
+ type: Component,
2313
+ args: [{ selector: 'kit-text-link', standalone: true, imports: [NgClass, NgStyle], template: "<a [ngClass]=\"colorClass\" [href]=\"href\" [target]=\"target\" [ngStyle]=\"textStyles\">\n <ng-content></ng-content>\n</a>", styles: ["a{font-size:var(--kit-font-size-link, 1rem);font-weight:var(--kit-font-weight-link, 400);line-height:var(--kit-line-height-link, 1.5);text-decoration:underline;cursor:pointer;color:var(--kit-color-primary, #0066cc)}a:hover{opacity:.85}.kit-text-primary{color:var(--kit-color-primary, #0066cc)}.kit-text-secondary{color:var(--kit-color-secondary, #6c757d)}.kit-text-success{color:var(--kit-color-success, #28a745)}.kit-text-warning{color:var(--kit-color-warning, #ffc107)}.kit-text-danger{color:var(--kit-color-danger, #dc3545)}.kit-text-muted{color:var(--kit-text-color-muted, #adb5bd)}\n"] }]
2314
+ }], propDecorators: { color: [{
2315
+ type: Input
2316
+ }], href: [{
2317
+ type: Input
2318
+ }], target: [{
2319
+ type: Input
2320
+ }], align: [{
2321
+ type: Input
2322
+ }], weight: [{
2323
+ type: Input
2324
+ }], decoration: [{
2325
+ type: Input
2326
+ }], margin: [{
2327
+ type: Input
2328
+ }], wrap: [{
2329
+ type: Input
2330
+ }], ellipses: [{
2331
+ type: Input
2332
+ }], lines: [{
2333
+ type: Input
2334
+ }], italic: [{
2335
+ type: Input
2336
+ }] } });
2337
+
2338
+ class KitTextModule {
2339
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: KitTextModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
2340
+ static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.4", ngImport: i0, type: KitTextModule, imports: [KitTextHeadingComponent,
2341
+ KitTextSubheadingComponent,
2342
+ KitTextDisplayComponent,
2343
+ KitTextLabelComponent,
2344
+ KitTextBodyComponent,
2345
+ KitTextCaptionComponent,
2346
+ KitTextLinkComponent], exports: [KitTextHeadingComponent,
2347
+ KitTextSubheadingComponent,
2348
+ KitTextDisplayComponent,
2349
+ KitTextLabelComponent,
2350
+ KitTextBodyComponent,
2351
+ KitTextCaptionComponent,
2352
+ KitTextLinkComponent] });
2353
+ static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: KitTextModule });
2354
+ }
2355
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: KitTextModule, decorators: [{
2356
+ type: NgModule,
2357
+ args: [{
2358
+ declarations: [],
2359
+ imports: [
2360
+ KitTextHeadingComponent,
2361
+ KitTextSubheadingComponent,
2362
+ KitTextDisplayComponent,
2363
+ KitTextLabelComponent,
2364
+ KitTextBodyComponent,
2365
+ KitTextCaptionComponent,
2366
+ KitTextLinkComponent,
2367
+ ],
2368
+ exports: [
2369
+ KitTextHeadingComponent,
2370
+ KitTextSubheadingComponent,
2371
+ KitTextDisplayComponent,
2372
+ KitTextLabelComponent,
2373
+ KitTextBodyComponent,
2374
+ KitTextCaptionComponent,
2375
+ KitTextLinkComponent,
2376
+ ]
2377
+ }]
2378
+ }] });
2379
+
1992
2380
  class KitInputSelectComponent extends KitBaseInputComponent {
1993
2381
  screenService;
1994
2382
  /**
@@ -2228,11 +2616,11 @@ class KitInputSelectComponent extends KitBaseInputComponent {
2228
2616
  };
2229
2617
  }
2230
2618
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: KitInputSelectComponent, deps: [{ token: KitScreenService }, { token: i1.NgControl, optional: true, self: true }], target: i0.ɵɵFactoryTarget.Component });
2231
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.4", type: KitInputSelectComponent, isStandalone: true, selector: "kit-input-select", inputs: { required: "required", options: "options", matchField: "matchField", displayField: "displayField", dialogTitle: "dialogTitle", showSearchBox: "showSearchBox", searchField: "searchField", searchBoxPlaceholder: "searchBoxPlaceholder" }, queries: [{ propertyName: "activeTemplate", first: true, predicate: KitSelectItemActiveDirective, descendants: true, read: TemplateRef }, { propertyName: "inactiveTemplate", first: true, predicate: KitSelectItemDirective, descendants: true, read: TemplateRef }, { propertyName: "emptyTemplate", first: true, predicate: KitSelectEmptyDirective, descendants: true, read: TemplateRef }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "@if(title){\n<kit-input-field-title [for]=\"id\"\n [required]=\"required\"\n [disabled]=\"disabled\">\n {{ title }}\n</kit-input-field-title>\n}\n\n<!-- Custom select that opens the appropriate UI based on screen size -->\n<div class=\"kit-input-select-container\"\n [id]=\"id\"\n [attr.aria-label]=\"title\"\n [attr.aria-required]=\"required\"\n [attr.aria-invalid]=\"hasError || null\"\n [class.disabled]=\"disabled\"\n [class.error]=\"hasError\"\n tabindex=\"0\"\n (click)=\"!disabled && openSelect()\"\n (keydown)=\"!disabled && onKeyDown($event)\"\n (focus)=\"onFocus($event)\"\n (blur)=\"onBlur($event)\">\n\n <div class=\"kit-input-select\"\n [class.has-error]=\"hasError\"\n [class.disabled]=\"disabled\">\n {{ value ? getDisplayValue(value) : (placeholder || 'Select...') }}\n </div>\n\n</div>\n\n@if(helperText && !hasError){\n<kit-text-caption class=\"helper-text\">\n {{ helperText }}\n</kit-text-caption>\n}\n\n\n@if(hasError && effectiveErrorMessage){\n<kit-text-caption class=\"error-message\">\n {{ effectiveErrorMessage }}\n</kit-text-caption>\n}\n\n\n<!-- Dialog for larger screens -->\n<kit-dialog [(isOpen)]=\"isDialogOpen\">\n <div>\n <div>\n <kit-text-label margin=\"5px\">{{ dialogTitle || title }}</kit-text-label>\n </div>\n\n <!-- Search input -->\n @if(showSearchBox){\n <div class=\"kit-select-search-container\">\n <kit-input-text [(value)]=\"searchTerm\"\n (valueChange)=\"onSearchChange($event)\"\n [placeholder]=\"searchBoxPlaceholder\"></kit-input-text>\n </div>\n }\n\n <div class=\"kit-select-options\">\n @for(option of filteredOptions; track option){\n <!-- Custom template for selected option -->\n @if(isSelected(option) && hasCustomActiveTemplate()){\n <div class=\"kit-select-item-custom\"\n (click)=\"onOptionSelect(option)\">\n <ng-container *ngTemplateOutlet=\"activeTemplate; context: getOptionContext(option)\"></ng-container>\n </div>\n }\n\n <!-- Custom template for unselected option -->\n @if(!isSelected(option) && hasCustomInactiveTemplate()){\n <div class=\"kit-select-item-custom\"\n (click)=\"onOptionSelect(option)\">\n <ng-container *ngTemplateOutlet=\"inactiveTemplate; context: getOptionContext(option)\"></ng-container>\n </div>\n }\n\n\n <!-- Default template if no custom template for this state -->\n @if((!isSelected(option) && !hasCustomInactiveTemplate()) || (isSelected(option) &&\n !hasCustomActiveTemplate())){\n <div class=\"kit-select-item\"\n [class.selected]=\"isSelected(option)\"\n (click)=\"onOptionSelect(option)\">\n <span class=\"kit-select-item-text\">{{ getDisplayValue(option) }}</span>\n @if(isSelected(option)){\n <svg class=\"kit-select-item-check\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\">\n <path d=\"M20 6L9 17L4 12\"\n stroke=\"currentColor\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n }\n </div>\n }\n }\n\n @if(filteredOptions.length === 0){\n <div class=\"kit-select-options\">\n @if(hasCustomEmptyTemplate()){\n <ng-container *ngTemplateOutlet=\"emptyTemplate\"></ng-container>\n }\n @else{\n <ng-template #defaultEmptyDialog>\n <kit-text-caption>No options found</kit-text-caption>\n </ng-template>\n }\n </div>\n }\n\n </div>\n </div>\n</kit-dialog>\n\n<!-- Bottom sheet for small screens -->\n<kit-bottom-sheet [(isOpen)]=\"isBottomSheetOpen\">\n <div>\n <div>\n <kit-text-label margin=\"5px\">{{ dialogTitle || title }}</kit-text-label>\n </div>\n\n <!-- Search input -->\n @if(showSearchBox){\n <div class=\"kit-select-search-container\">\n <kit-input-text [(value)]=\"searchTerm\"\n (valueChange)=\"onSearchChange($event)\"\n [placeholder]=\"searchBoxPlaceholder\"></kit-input-text>\n </div>\n }\n\n <div class=\"kit-select-options\">\n @for(option of filteredOptions; track option){\n <!-- Custom template for selected option -->\n @if(isSelected(option) && hasCustomActiveTemplate()){\n <div class=\"kit-select-item-custom\"\n (click)=\"onOptionSelect(option)\">\n <ng-container *ngTemplateOutlet=\"activeTemplate; context: getOptionContext(option)\"></ng-container>\n </div>\n }\n\n\n <!-- Custom template for unselected option -->\n @if(!isSelected(option) && hasCustomInactiveTemplate()){\n <div class=\"kit-select-item-custom\"\n (click)=\"onOptionSelect(option)\">\n <ng-container *ngTemplateOutlet=\"inactiveTemplate; context: getOptionContext(option)\"></ng-container>\n </div>\n }\n\n <!-- Default template if no custom template for this state -->\n @if((!isSelected(option) && !hasCustomInactiveTemplate()) || (isSelected(option) &&\n !hasCustomActiveTemplate())){\n <div class=\"kit-select-item\"\n [class.selected]=\"isSelected(option)\"\n (click)=\"onOptionSelect(option)\">\n <span class=\"kit-select-item-text\">{{ getDisplayValue(option) }}</span>\n @if(isSelected(option)){\n <svg class=\"kit-select-item-check\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\">\n <path d=\"M20 6L9 17L4 12\"\n stroke=\"currentColor\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n }\n\n </div>\n }\n }\n\n @if(filteredOptions.length === 0){\n <div class=\"kit-select-options\">\n @if(hasCustomEmptyTemplate()){\n <ng-container *ngTemplateOutlet=\"emptyTemplate\"></ng-container>\n }\n @else{\n <ng-template #defaultEmptyBottomSheet>\n <kit-text-caption>No options found</kit-text-caption>\n </ng-template>\n }\n </div>\n\n }\n\n </div>\n </div>\n</kit-bottom-sheet>", styles: [":host{display:block;width:100%}.kit-input-select-container{position:relative;width:100%;display:flex;align-items:center}.kit-input-select{width:100%;box-sizing:border-box;padding:var(--kit-input-padding, 12px 16px);font-size:var(--kit-input-font-size, 1rem);line-height:var(--kit-input-line-height, 1.5);color:var(--kit-input-text-color, #212529);background-color:var(--kit-input-background-color, #e8e8e8);border:var(--kit-input-border-width, 2px) solid var(--kit-input-border-color, transparent);border-radius:var(--kit-input-border-radius, 16px);transition:border-color .2s ease-in-out;padding-right:40px}.kit-input-select::placeholder{color:var(--kit-input-placeholder-color, var(--kit-text-color-secondary, #6c757d));opacity:1}.kit-input-select:focus{outline:none;border-color:var(--kit-input-focus-border-color, var(--kit-color-primary, #0066cc))}.kit-input-select.has-error{border-color:var(--kit-input-error-border-color, var(--kit-color-danger, #dc3545));background-color:var(--kit-input-error-background-color, #fce8ea)}.kit-input-select:disabled,.kit-input-select.disabled{background-color:var(--kit-input-disabled-background-color, #f5f5f5);color:var(--kit-input-disabled-text-color, var(--kit-text-color-muted, #adb5bd));cursor:not-allowed}.kit-input-select:disabled::placeholder,.kit-input-select.disabled::placeholder{color:var(--kit-input-disabled-placeholder-color, var(--kit-text-color-muted, #adb5bd))}.kit-select-options{display:flex;flex-direction:column;gap:4px;padding:8px 0;overflow-y:auto;box-sizing:border-box}.kit-select-item{display:flex;align-items:center;justify-content:space-between;width:100%;box-sizing:border-box;padding:var(--kit-select-item-padding, 12px 16px);font-size:var(--kit-select-item-font-size, var(--kit-font-size-body, 1rem));color:var(--kit-select-item-text-color, var(--kit-text-color-primary, #212529));background-color:var(--kit-select-item-background-color, transparent);border-radius:var(--kit-select-item-border-radius, 14px);border:none;outline:none;flex-shrink:0}.kit-select-item:hover{background-color:var(--kit-select-item-hover-background-color, rgba(0, 102, 204, .1))}.kit-select-item.selected{background-color:var(--kit-select-item-selected-background-color, var(--kit-color-primary, #0066cc));color:var(--kit-select-item-selected-text-color, #ffffff);border-radius:var(--kit-select-item-selected-border-radius, 14px)}.kit-select-item-custom{display:block;width:100%;border:none;outline:none;box-sizing:border-box}.kit-select-item-text{flex:1;text-align:left;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.kit-select-item-check{color:var(--kit-select-item-check-color, #ffffff);font-weight:700;margin-left:8px;flex-shrink:0}.kit-select-search-container{padding-top:5px;padding-bottom:5px}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: KitInputFieldTitleComponent, selector: "kit-input-field-title", inputs: ["for", "required", "disabled"] }, { kind: "component", type: KitTextCaptionComponent, selector: "kit-text-caption", inputs: ["color", "align", "weight", "decoration", "margin", "wrap", "ellipses", "lines", "italic"] }, { kind: "ngmodule", type: KitOverlaysModule }, { kind: "component", type: KitBottomSheetComponent, selector: "kit-bottom-sheet", inputs: ["isOpen", "closeOnBackdropClick", "padding", "maxHeight"], outputs: ["isOpenChange"] }, { kind: "component", type: KitDialogComponent, selector: "kit-dialog", inputs: ["isOpen", "fullscreen", "closeOnBackdropClick", "padding"], outputs: ["isOpenChange"] }, { kind: "component", type: KitTextLabelComponent, selector: "kit-text-label", inputs: ["color", "align", "weight", "decoration", "margin", "wrap", "ellipses", "lines", "italic"] }, { kind: "component", type: KitInputTextComponent, selector: "kit-input-text", inputs: ["required"], outputs: ["paste"] }] });
2619
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.4", type: KitInputSelectComponent, isStandalone: true, selector: "kit-input-select", inputs: { required: "required", options: "options", matchField: "matchField", displayField: "displayField", dialogTitle: "dialogTitle", showSearchBox: "showSearchBox", searchField: "searchField", searchBoxPlaceholder: "searchBoxPlaceholder" }, queries: [{ propertyName: "activeTemplate", first: true, predicate: KitSelectItemActiveDirective, descendants: true, read: TemplateRef }, { propertyName: "inactiveTemplate", first: true, predicate: KitSelectItemDirective, descendants: true, read: TemplateRef }, { propertyName: "emptyTemplate", first: true, predicate: KitSelectEmptyDirective, descendants: true, read: TemplateRef }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "@if(title){\n<kit-input-field-title [for]=\"id\"\n [required]=\"required\"\n [disabled]=\"disabled\">\n {{ title }}\n</kit-input-field-title>\n}\n\n<!-- Custom select that opens the appropriate UI based on screen size -->\n<div class=\"kit-input-select-container\"\n [id]=\"id\"\n [attr.aria-label]=\"title\"\n [attr.aria-required]=\"required\"\n [attr.aria-invalid]=\"hasError || null\"\n [class.disabled]=\"disabled\"\n [class.error]=\"hasError\"\n tabindex=\"0\"\n (click)=\"!disabled && openSelect()\"\n (keydown)=\"!disabled && onKeyDown($event)\"\n (focus)=\"onFocus($event)\"\n (blur)=\"onBlur($event)\">\n\n <div class=\"kit-input-select\"\n [class.has-error]=\"hasError\"\n [class.disabled]=\"disabled\">\n {{ value ? getDisplayValue(value) : (placeholder || 'Select...') }}\n </div>\n\n</div>\n\n@if(helperText && !hasError){\n<kit-text-caption class=\"helper-text\">\n {{ helperText }}\n</kit-text-caption>\n}\n\n\n@if(hasError && effectiveErrorMessage){\n<kit-text-caption class=\"error-message\">\n {{ effectiveErrorMessage }}\n</kit-text-caption>\n}\n\n\n<!-- Dialog for larger screens -->\n<kit-dialog [(isOpen)]=\"isDialogOpen\">\n <div>\n <div>\n <kit-text-subheading margin=\"5px\"\n weight=\"bold\">{{ dialogTitle || title }}</kit-text-subheading>\n </div>\n\n <!-- Search input -->\n @if(showSearchBox){\n <div class=\"kit-select-search-container\">\n <kit-input-text [(value)]=\"searchTerm\"\n (valueChange)=\"onSearchChange($event)\"\n [placeholder]=\"searchBoxPlaceholder\"></kit-input-text>\n </div>\n }\n\n <div class=\"kit-select-options\">\n @for(option of filteredOptions; track option){\n <!-- Custom template for selected option -->\n @if(isSelected(option) && hasCustomActiveTemplate()){\n <div class=\"kit-select-item-custom\"\n (click)=\"onOptionSelect(option)\">\n <ng-container *ngTemplateOutlet=\"activeTemplate; context: getOptionContext(option)\"></ng-container>\n </div>\n }\n\n <!-- Custom template for unselected option -->\n @if(!isSelected(option) && hasCustomInactiveTemplate()){\n <div class=\"kit-select-item-custom\"\n (click)=\"onOptionSelect(option)\">\n <ng-container *ngTemplateOutlet=\"inactiveTemplate; context: getOptionContext(option)\"></ng-container>\n </div>\n }\n\n\n <!-- Default template if no custom template for this state -->\n @if((!isSelected(option) && !hasCustomInactiveTemplate()) || (isSelected(option) &&\n !hasCustomActiveTemplate())){\n <div class=\"kit-select-item\"\n [class.selected]=\"isSelected(option)\"\n (click)=\"onOptionSelect(option)\">\n <span class=\"kit-select-item-text\">{{ getDisplayValue(option) }}</span>\n @if(isSelected(option)){\n <svg class=\"kit-select-item-check\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\">\n <path d=\"M20 6L9 17L4 12\"\n stroke=\"currentColor\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n }\n </div>\n }\n }\n\n @if(filteredOptions.length === 0){\n <div class=\"kit-select-options\">\n @if(hasCustomEmptyTemplate()){\n <ng-container *ngTemplateOutlet=\"emptyTemplate\"></ng-container>\n }\n @else{\n <ng-template #defaultEmptyDialog>\n <kit-text-caption>No options found</kit-text-caption>\n </ng-template>\n }\n </div>\n }\n\n </div>\n </div>\n</kit-dialog>\n\n<!-- Bottom sheet for small screens -->\n<kit-bottom-sheet [(isOpen)]=\"isBottomSheetOpen\">\n <div>\n <div>\n <kit-text-subheading margin=\"5px\"\n weight=\"bold\">{{ dialogTitle || title }}</kit-text-subheading>\n </div>\n\n <!-- Search input -->\n @if(showSearchBox){\n <div class=\"kit-select-search-container\">\n <kit-input-text [(value)]=\"searchTerm\"\n (valueChange)=\"onSearchChange($event)\"\n [placeholder]=\"searchBoxPlaceholder\"></kit-input-text>\n </div>\n }\n\n <div class=\"kit-select-options\">\n @for(option of filteredOptions; track option){\n <!-- Custom template for selected option -->\n @if(isSelected(option) && hasCustomActiveTemplate()){\n <div class=\"kit-select-item-custom\"\n (click)=\"onOptionSelect(option)\">\n <ng-container *ngTemplateOutlet=\"activeTemplate; context: getOptionContext(option)\"></ng-container>\n </div>\n }\n\n\n <!-- Custom template for unselected option -->\n @if(!isSelected(option) && hasCustomInactiveTemplate()){\n <div class=\"kit-select-item-custom\"\n (click)=\"onOptionSelect(option)\">\n <ng-container *ngTemplateOutlet=\"inactiveTemplate; context: getOptionContext(option)\"></ng-container>\n </div>\n }\n\n <!-- Default template if no custom template for this state -->\n @if((!isSelected(option) && !hasCustomInactiveTemplate()) || (isSelected(option) &&\n !hasCustomActiveTemplate())){\n <div class=\"kit-select-item\"\n [class.selected]=\"isSelected(option)\"\n (click)=\"onOptionSelect(option)\">\n <span class=\"kit-select-item-text\">{{ getDisplayValue(option) }}</span>\n @if(isSelected(option)){\n <svg class=\"kit-select-item-check\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\">\n <path d=\"M20 6L9 17L4 12\"\n stroke=\"currentColor\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n }\n\n </div>\n }\n }\n\n @if(filteredOptions.length === 0){\n <div class=\"kit-select-options\">\n @if(hasCustomEmptyTemplate()){\n <ng-container *ngTemplateOutlet=\"emptyTemplate\"></ng-container>\n }\n @else{\n <ng-template #defaultEmptyBottomSheet>\n <kit-text-caption>No options found</kit-text-caption>\n </ng-template>\n }\n </div>\n\n }\n\n </div>\n </div>\n</kit-bottom-sheet>", styles: [":host{display:block;width:100%}.kit-input-select-container{position:relative;width:100%;display:flex;align-items:center}.kit-input-select{width:100%;box-sizing:border-box;padding:var(--kit-input-padding, 12px 16px);font-size:var(--kit-input-font-size, 1rem);line-height:var(--kit-input-line-height, 1.5);color:var(--kit-input-text-color, #212529);background-color:var(--kit-input-background-color, #e8e8e8);border:var(--kit-input-border-width, 2px) solid var(--kit-input-border-color, transparent);border-radius:var(--kit-input-border-radius, 16px);transition:border-color .2s ease-in-out;padding-right:40px}.kit-input-select::placeholder{color:var(--kit-input-placeholder-color, var(--kit-text-color-secondary, #6c757d));opacity:1}.kit-input-select:focus{outline:none;border-color:var(--kit-input-focus-border-color, var(--kit-color-primary, #0066cc))}.kit-input-select.has-error{border-color:var(--kit-input-error-border-color, var(--kit-color-danger, #dc3545));background-color:var(--kit-input-error-background-color, #fce8ea)}.kit-input-select:disabled,.kit-input-select.disabled{background-color:var(--kit-input-disabled-background-color, #f5f5f5);color:var(--kit-input-disabled-text-color, var(--kit-text-color-muted, #adb5bd));cursor:not-allowed}.kit-input-select:disabled::placeholder,.kit-input-select.disabled::placeholder{color:var(--kit-input-disabled-placeholder-color, var(--kit-text-color-muted, #adb5bd))}.kit-select-options{display:flex;flex-direction:column;gap:4px;padding:8px 0;overflow-y:auto;box-sizing:border-box}.kit-select-item{display:flex;align-items:center;justify-content:space-between;width:100%;box-sizing:border-box;padding:var(--kit-select-item-padding, 12px 16px);font-size:var(--kit-select-item-font-size, var(--kit-font-size-body, 1rem));color:var(--kit-select-item-text-color, var(--kit-text-color-primary, #212529));background-color:var(--kit-select-item-background-color, transparent);border-radius:var(--kit-select-item-border-radius, 14px);border:none;outline:none;flex-shrink:0}.kit-select-item:hover{background-color:var(--kit-select-item-hover-background-color, rgba(0, 102, 204, .1))}.kit-select-item.selected{background-color:var(--kit-select-item-selected-background-color, var(--kit-color-primary, #0066cc));color:var(--kit-select-item-selected-text-color, #ffffff);border-radius:var(--kit-select-item-selected-border-radius, 14px)}.kit-select-item-custom{display:block;width:100%;border:none;outline:none;box-sizing:border-box}.kit-select-item-text{flex:1;text-align:left;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.kit-select-item-check{color:var(--kit-select-item-check-color, #ffffff);font-weight:700;margin-left:8px;flex-shrink:0}.kit-select-search-container{padding-top:5px;padding-bottom:5px}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: KitInputFieldTitleComponent, selector: "kit-input-field-title", inputs: ["for", "required", "disabled"] }, { kind: "component", type: KitTextCaptionComponent, selector: "kit-text-caption", inputs: ["color", "align", "weight", "decoration", "margin", "wrap", "ellipses", "lines", "italic"] }, { kind: "ngmodule", type: KitOverlaysModule }, { kind: "component", type: KitBottomSheetComponent, selector: "kit-bottom-sheet", inputs: ["isOpen", "closeOnBackdropClick", "padding", "maxHeight"], outputs: ["isOpenChange"] }, { kind: "component", type: KitDialogComponent, selector: "kit-dialog", inputs: ["isOpen", "fullscreen", "closeOnBackdropClick", "padding"], outputs: ["isOpenChange"] }, { kind: "component", type: KitInputTextComponent, selector: "kit-input-text", inputs: ["required"], outputs: ["paste"] }, { kind: "ngmodule", type: KitTextModule }, { kind: "component", type: KitTextSubheadingComponent, selector: "kit-text-subheading", inputs: ["color", "align", "weight", "decoration", "margin", "wrap", "ellipses", "lines", "italic"] }] });
2232
2620
  }
2233
2621
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: KitInputSelectComponent, decorators: [{
2234
2622
  type: Component,
2235
- args: [{ selector: 'kit-input-select', standalone: true, imports: [NgTemplateOutlet, KitInputFieldTitleComponent, KitTextCaptionComponent, KitOverlaysModule, KitTextLabelComponent, KitInputTextComponent], template: "@if(title){\n<kit-input-field-title [for]=\"id\"\n [required]=\"required\"\n [disabled]=\"disabled\">\n {{ title }}\n</kit-input-field-title>\n}\n\n<!-- Custom select that opens the appropriate UI based on screen size -->\n<div class=\"kit-input-select-container\"\n [id]=\"id\"\n [attr.aria-label]=\"title\"\n [attr.aria-required]=\"required\"\n [attr.aria-invalid]=\"hasError || null\"\n [class.disabled]=\"disabled\"\n [class.error]=\"hasError\"\n tabindex=\"0\"\n (click)=\"!disabled && openSelect()\"\n (keydown)=\"!disabled && onKeyDown($event)\"\n (focus)=\"onFocus($event)\"\n (blur)=\"onBlur($event)\">\n\n <div class=\"kit-input-select\"\n [class.has-error]=\"hasError\"\n [class.disabled]=\"disabled\">\n {{ value ? getDisplayValue(value) : (placeholder || 'Select...') }}\n </div>\n\n</div>\n\n@if(helperText && !hasError){\n<kit-text-caption class=\"helper-text\">\n {{ helperText }}\n</kit-text-caption>\n}\n\n\n@if(hasError && effectiveErrorMessage){\n<kit-text-caption class=\"error-message\">\n {{ effectiveErrorMessage }}\n</kit-text-caption>\n}\n\n\n<!-- Dialog for larger screens -->\n<kit-dialog [(isOpen)]=\"isDialogOpen\">\n <div>\n <div>\n <kit-text-label margin=\"5px\">{{ dialogTitle || title }}</kit-text-label>\n </div>\n\n <!-- Search input -->\n @if(showSearchBox){\n <div class=\"kit-select-search-container\">\n <kit-input-text [(value)]=\"searchTerm\"\n (valueChange)=\"onSearchChange($event)\"\n [placeholder]=\"searchBoxPlaceholder\"></kit-input-text>\n </div>\n }\n\n <div class=\"kit-select-options\">\n @for(option of filteredOptions; track option){\n <!-- Custom template for selected option -->\n @if(isSelected(option) && hasCustomActiveTemplate()){\n <div class=\"kit-select-item-custom\"\n (click)=\"onOptionSelect(option)\">\n <ng-container *ngTemplateOutlet=\"activeTemplate; context: getOptionContext(option)\"></ng-container>\n </div>\n }\n\n <!-- Custom template for unselected option -->\n @if(!isSelected(option) && hasCustomInactiveTemplate()){\n <div class=\"kit-select-item-custom\"\n (click)=\"onOptionSelect(option)\">\n <ng-container *ngTemplateOutlet=\"inactiveTemplate; context: getOptionContext(option)\"></ng-container>\n </div>\n }\n\n\n <!-- Default template if no custom template for this state -->\n @if((!isSelected(option) && !hasCustomInactiveTemplate()) || (isSelected(option) &&\n !hasCustomActiveTemplate())){\n <div class=\"kit-select-item\"\n [class.selected]=\"isSelected(option)\"\n (click)=\"onOptionSelect(option)\">\n <span class=\"kit-select-item-text\">{{ getDisplayValue(option) }}</span>\n @if(isSelected(option)){\n <svg class=\"kit-select-item-check\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\">\n <path d=\"M20 6L9 17L4 12\"\n stroke=\"currentColor\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n }\n </div>\n }\n }\n\n @if(filteredOptions.length === 0){\n <div class=\"kit-select-options\">\n @if(hasCustomEmptyTemplate()){\n <ng-container *ngTemplateOutlet=\"emptyTemplate\"></ng-container>\n }\n @else{\n <ng-template #defaultEmptyDialog>\n <kit-text-caption>No options found</kit-text-caption>\n </ng-template>\n }\n </div>\n }\n\n </div>\n </div>\n</kit-dialog>\n\n<!-- Bottom sheet for small screens -->\n<kit-bottom-sheet [(isOpen)]=\"isBottomSheetOpen\">\n <div>\n <div>\n <kit-text-label margin=\"5px\">{{ dialogTitle || title }}</kit-text-label>\n </div>\n\n <!-- Search input -->\n @if(showSearchBox){\n <div class=\"kit-select-search-container\">\n <kit-input-text [(value)]=\"searchTerm\"\n (valueChange)=\"onSearchChange($event)\"\n [placeholder]=\"searchBoxPlaceholder\"></kit-input-text>\n </div>\n }\n\n <div class=\"kit-select-options\">\n @for(option of filteredOptions; track option){\n <!-- Custom template for selected option -->\n @if(isSelected(option) && hasCustomActiveTemplate()){\n <div class=\"kit-select-item-custom\"\n (click)=\"onOptionSelect(option)\">\n <ng-container *ngTemplateOutlet=\"activeTemplate; context: getOptionContext(option)\"></ng-container>\n </div>\n }\n\n\n <!-- Custom template for unselected option -->\n @if(!isSelected(option) && hasCustomInactiveTemplate()){\n <div class=\"kit-select-item-custom\"\n (click)=\"onOptionSelect(option)\">\n <ng-container *ngTemplateOutlet=\"inactiveTemplate; context: getOptionContext(option)\"></ng-container>\n </div>\n }\n\n <!-- Default template if no custom template for this state -->\n @if((!isSelected(option) && !hasCustomInactiveTemplate()) || (isSelected(option) &&\n !hasCustomActiveTemplate())){\n <div class=\"kit-select-item\"\n [class.selected]=\"isSelected(option)\"\n (click)=\"onOptionSelect(option)\">\n <span class=\"kit-select-item-text\">{{ getDisplayValue(option) }}</span>\n @if(isSelected(option)){\n <svg class=\"kit-select-item-check\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\">\n <path d=\"M20 6L9 17L4 12\"\n stroke=\"currentColor\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n }\n\n </div>\n }\n }\n\n @if(filteredOptions.length === 0){\n <div class=\"kit-select-options\">\n @if(hasCustomEmptyTemplate()){\n <ng-container *ngTemplateOutlet=\"emptyTemplate\"></ng-container>\n }\n @else{\n <ng-template #defaultEmptyBottomSheet>\n <kit-text-caption>No options found</kit-text-caption>\n </ng-template>\n }\n </div>\n\n }\n\n </div>\n </div>\n</kit-bottom-sheet>", styles: [":host{display:block;width:100%}.kit-input-select-container{position:relative;width:100%;display:flex;align-items:center}.kit-input-select{width:100%;box-sizing:border-box;padding:var(--kit-input-padding, 12px 16px);font-size:var(--kit-input-font-size, 1rem);line-height:var(--kit-input-line-height, 1.5);color:var(--kit-input-text-color, #212529);background-color:var(--kit-input-background-color, #e8e8e8);border:var(--kit-input-border-width, 2px) solid var(--kit-input-border-color, transparent);border-radius:var(--kit-input-border-radius, 16px);transition:border-color .2s ease-in-out;padding-right:40px}.kit-input-select::placeholder{color:var(--kit-input-placeholder-color, var(--kit-text-color-secondary, #6c757d));opacity:1}.kit-input-select:focus{outline:none;border-color:var(--kit-input-focus-border-color, var(--kit-color-primary, #0066cc))}.kit-input-select.has-error{border-color:var(--kit-input-error-border-color, var(--kit-color-danger, #dc3545));background-color:var(--kit-input-error-background-color, #fce8ea)}.kit-input-select:disabled,.kit-input-select.disabled{background-color:var(--kit-input-disabled-background-color, #f5f5f5);color:var(--kit-input-disabled-text-color, var(--kit-text-color-muted, #adb5bd));cursor:not-allowed}.kit-input-select:disabled::placeholder,.kit-input-select.disabled::placeholder{color:var(--kit-input-disabled-placeholder-color, var(--kit-text-color-muted, #adb5bd))}.kit-select-options{display:flex;flex-direction:column;gap:4px;padding:8px 0;overflow-y:auto;box-sizing:border-box}.kit-select-item{display:flex;align-items:center;justify-content:space-between;width:100%;box-sizing:border-box;padding:var(--kit-select-item-padding, 12px 16px);font-size:var(--kit-select-item-font-size, var(--kit-font-size-body, 1rem));color:var(--kit-select-item-text-color, var(--kit-text-color-primary, #212529));background-color:var(--kit-select-item-background-color, transparent);border-radius:var(--kit-select-item-border-radius, 14px);border:none;outline:none;flex-shrink:0}.kit-select-item:hover{background-color:var(--kit-select-item-hover-background-color, rgba(0, 102, 204, .1))}.kit-select-item.selected{background-color:var(--kit-select-item-selected-background-color, var(--kit-color-primary, #0066cc));color:var(--kit-select-item-selected-text-color, #ffffff);border-radius:var(--kit-select-item-selected-border-radius, 14px)}.kit-select-item-custom{display:block;width:100%;border:none;outline:none;box-sizing:border-box}.kit-select-item-text{flex:1;text-align:left;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.kit-select-item-check{color:var(--kit-select-item-check-color, #ffffff);font-weight:700;margin-left:8px;flex-shrink:0}.kit-select-search-container{padding-top:5px;padding-bottom:5px}\n"] }]
2623
+ args: [{ selector: 'kit-input-select', standalone: true, imports: [NgTemplateOutlet, KitInputFieldTitleComponent, KitTextCaptionComponent, KitOverlaysModule, KitTextLabelComponent, KitInputTextComponent, KitTextModule], template: "@if(title){\n<kit-input-field-title [for]=\"id\"\n [required]=\"required\"\n [disabled]=\"disabled\">\n {{ title }}\n</kit-input-field-title>\n}\n\n<!-- Custom select that opens the appropriate UI based on screen size -->\n<div class=\"kit-input-select-container\"\n [id]=\"id\"\n [attr.aria-label]=\"title\"\n [attr.aria-required]=\"required\"\n [attr.aria-invalid]=\"hasError || null\"\n [class.disabled]=\"disabled\"\n [class.error]=\"hasError\"\n tabindex=\"0\"\n (click)=\"!disabled && openSelect()\"\n (keydown)=\"!disabled && onKeyDown($event)\"\n (focus)=\"onFocus($event)\"\n (blur)=\"onBlur($event)\">\n\n <div class=\"kit-input-select\"\n [class.has-error]=\"hasError\"\n [class.disabled]=\"disabled\">\n {{ value ? getDisplayValue(value) : (placeholder || 'Select...') }}\n </div>\n\n</div>\n\n@if(helperText && !hasError){\n<kit-text-caption class=\"helper-text\">\n {{ helperText }}\n</kit-text-caption>\n}\n\n\n@if(hasError && effectiveErrorMessage){\n<kit-text-caption class=\"error-message\">\n {{ effectiveErrorMessage }}\n</kit-text-caption>\n}\n\n\n<!-- Dialog for larger screens -->\n<kit-dialog [(isOpen)]=\"isDialogOpen\">\n <div>\n <div>\n <kit-text-subheading margin=\"5px\"\n weight=\"bold\">{{ dialogTitle || title }}</kit-text-subheading>\n </div>\n\n <!-- Search input -->\n @if(showSearchBox){\n <div class=\"kit-select-search-container\">\n <kit-input-text [(value)]=\"searchTerm\"\n (valueChange)=\"onSearchChange($event)\"\n [placeholder]=\"searchBoxPlaceholder\"></kit-input-text>\n </div>\n }\n\n <div class=\"kit-select-options\">\n @for(option of filteredOptions; track option){\n <!-- Custom template for selected option -->\n @if(isSelected(option) && hasCustomActiveTemplate()){\n <div class=\"kit-select-item-custom\"\n (click)=\"onOptionSelect(option)\">\n <ng-container *ngTemplateOutlet=\"activeTemplate; context: getOptionContext(option)\"></ng-container>\n </div>\n }\n\n <!-- Custom template for unselected option -->\n @if(!isSelected(option) && hasCustomInactiveTemplate()){\n <div class=\"kit-select-item-custom\"\n (click)=\"onOptionSelect(option)\">\n <ng-container *ngTemplateOutlet=\"inactiveTemplate; context: getOptionContext(option)\"></ng-container>\n </div>\n }\n\n\n <!-- Default template if no custom template for this state -->\n @if((!isSelected(option) && !hasCustomInactiveTemplate()) || (isSelected(option) &&\n !hasCustomActiveTemplate())){\n <div class=\"kit-select-item\"\n [class.selected]=\"isSelected(option)\"\n (click)=\"onOptionSelect(option)\">\n <span class=\"kit-select-item-text\">{{ getDisplayValue(option) }}</span>\n @if(isSelected(option)){\n <svg class=\"kit-select-item-check\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\">\n <path d=\"M20 6L9 17L4 12\"\n stroke=\"currentColor\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n }\n </div>\n }\n }\n\n @if(filteredOptions.length === 0){\n <div class=\"kit-select-options\">\n @if(hasCustomEmptyTemplate()){\n <ng-container *ngTemplateOutlet=\"emptyTemplate\"></ng-container>\n }\n @else{\n <ng-template #defaultEmptyDialog>\n <kit-text-caption>No options found</kit-text-caption>\n </ng-template>\n }\n </div>\n }\n\n </div>\n </div>\n</kit-dialog>\n\n<!-- Bottom sheet for small screens -->\n<kit-bottom-sheet [(isOpen)]=\"isBottomSheetOpen\">\n <div>\n <div>\n <kit-text-subheading margin=\"5px\"\n weight=\"bold\">{{ dialogTitle || title }}</kit-text-subheading>\n </div>\n\n <!-- Search input -->\n @if(showSearchBox){\n <div class=\"kit-select-search-container\">\n <kit-input-text [(value)]=\"searchTerm\"\n (valueChange)=\"onSearchChange($event)\"\n [placeholder]=\"searchBoxPlaceholder\"></kit-input-text>\n </div>\n }\n\n <div class=\"kit-select-options\">\n @for(option of filteredOptions; track option){\n <!-- Custom template for selected option -->\n @if(isSelected(option) && hasCustomActiveTemplate()){\n <div class=\"kit-select-item-custom\"\n (click)=\"onOptionSelect(option)\">\n <ng-container *ngTemplateOutlet=\"activeTemplate; context: getOptionContext(option)\"></ng-container>\n </div>\n }\n\n\n <!-- Custom template for unselected option -->\n @if(!isSelected(option) && hasCustomInactiveTemplate()){\n <div class=\"kit-select-item-custom\"\n (click)=\"onOptionSelect(option)\">\n <ng-container *ngTemplateOutlet=\"inactiveTemplate; context: getOptionContext(option)\"></ng-container>\n </div>\n }\n\n <!-- Default template if no custom template for this state -->\n @if((!isSelected(option) && !hasCustomInactiveTemplate()) || (isSelected(option) &&\n !hasCustomActiveTemplate())){\n <div class=\"kit-select-item\"\n [class.selected]=\"isSelected(option)\"\n (click)=\"onOptionSelect(option)\">\n <span class=\"kit-select-item-text\">{{ getDisplayValue(option) }}</span>\n @if(isSelected(option)){\n <svg class=\"kit-select-item-check\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\">\n <path d=\"M20 6L9 17L4 12\"\n stroke=\"currentColor\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n }\n\n </div>\n }\n }\n\n @if(filteredOptions.length === 0){\n <div class=\"kit-select-options\">\n @if(hasCustomEmptyTemplate()){\n <ng-container *ngTemplateOutlet=\"emptyTemplate\"></ng-container>\n }\n @else{\n <ng-template #defaultEmptyBottomSheet>\n <kit-text-caption>No options found</kit-text-caption>\n </ng-template>\n }\n </div>\n\n }\n\n </div>\n </div>\n</kit-bottom-sheet>", styles: [":host{display:block;width:100%}.kit-input-select-container{position:relative;width:100%;display:flex;align-items:center}.kit-input-select{width:100%;box-sizing:border-box;padding:var(--kit-input-padding, 12px 16px);font-size:var(--kit-input-font-size, 1rem);line-height:var(--kit-input-line-height, 1.5);color:var(--kit-input-text-color, #212529);background-color:var(--kit-input-background-color, #e8e8e8);border:var(--kit-input-border-width, 2px) solid var(--kit-input-border-color, transparent);border-radius:var(--kit-input-border-radius, 16px);transition:border-color .2s ease-in-out;padding-right:40px}.kit-input-select::placeholder{color:var(--kit-input-placeholder-color, var(--kit-text-color-secondary, #6c757d));opacity:1}.kit-input-select:focus{outline:none;border-color:var(--kit-input-focus-border-color, var(--kit-color-primary, #0066cc))}.kit-input-select.has-error{border-color:var(--kit-input-error-border-color, var(--kit-color-danger, #dc3545));background-color:var(--kit-input-error-background-color, #fce8ea)}.kit-input-select:disabled,.kit-input-select.disabled{background-color:var(--kit-input-disabled-background-color, #f5f5f5);color:var(--kit-input-disabled-text-color, var(--kit-text-color-muted, #adb5bd));cursor:not-allowed}.kit-input-select:disabled::placeholder,.kit-input-select.disabled::placeholder{color:var(--kit-input-disabled-placeholder-color, var(--kit-text-color-muted, #adb5bd))}.kit-select-options{display:flex;flex-direction:column;gap:4px;padding:8px 0;overflow-y:auto;box-sizing:border-box}.kit-select-item{display:flex;align-items:center;justify-content:space-between;width:100%;box-sizing:border-box;padding:var(--kit-select-item-padding, 12px 16px);font-size:var(--kit-select-item-font-size, var(--kit-font-size-body, 1rem));color:var(--kit-select-item-text-color, var(--kit-text-color-primary, #212529));background-color:var(--kit-select-item-background-color, transparent);border-radius:var(--kit-select-item-border-radius, 14px);border:none;outline:none;flex-shrink:0}.kit-select-item:hover{background-color:var(--kit-select-item-hover-background-color, rgba(0, 102, 204, .1))}.kit-select-item.selected{background-color:var(--kit-select-item-selected-background-color, var(--kit-color-primary, #0066cc));color:var(--kit-select-item-selected-text-color, #ffffff);border-radius:var(--kit-select-item-selected-border-radius, 14px)}.kit-select-item-custom{display:block;width:100%;border:none;outline:none;box-sizing:border-box}.kit-select-item-text{flex:1;text-align:left;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.kit-select-item-check{color:var(--kit-select-item-check-color, #ffffff);font-weight:700;margin-left:8px;flex-shrink:0}.kit-select-search-container{padding-top:5px;padding-bottom:5px}\n"] }]
2236
2624
  }], ctorParameters: () => [{ type: KitScreenService }, { type: i1.NgControl, decorators: [{
2237
2625
  type: Optional
2238
2626
  }, {
@@ -2431,7 +2819,7 @@ class KitInputMultiSelectComponent extends KitBaseInputComponent {
2431
2819
  /**
2432
2820
  * Custom title text for the dialog/bottom sheet (default: 'Select an option')
2433
2821
  */
2434
- dialogTitle = 'Select an option';
2822
+ dialogTitle = 'Options';
2435
2823
  /**
2436
2824
  * Whether to show a search box at the top of the options list
2437
2825
  */
@@ -2663,11 +3051,11 @@ class KitInputMultiSelectComponent extends KitBaseInputComponent {
2663
3051
  };
2664
3052
  }
2665
3053
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: KitInputMultiSelectComponent, deps: [{ token: KitScreenService }, { token: i1.NgControl, optional: true, self: true }], target: i0.ɵɵFactoryTarget.Component });
2666
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.4", type: KitInputMultiSelectComponent, isStandalone: true, selector: "kit-input-multi-select", inputs: { required: "required", options: "options", matchField: "matchField", displayField: "displayField", dialogTitle: "dialogTitle", showSearchBox: "showSearchBox", searchField: "searchField", searchBoxPlaceholder: "searchBoxPlaceholder" }, queries: [{ propertyName: "activeTemplate", first: true, predicate: KitSelectItemActiveDirective, descendants: true, read: TemplateRef }, { propertyName: "inactiveTemplate", first: true, predicate: KitSelectItemDirective, descendants: true, read: TemplateRef }, { propertyName: "emptyTemplate", first: true, predicate: KitSelectEmptyDirective, descendants: true, read: TemplateRef }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "@if(title){\n<kit-input-field-title [for]=\"id\"\n [required]=\"required\"\n [disabled]=\"disabled\">\n {{ title }}\n</kit-input-field-title>\n}\n\n<!-- Custom select that opens the appropriate UI based on screen size -->\n<div class=\"kit-input-select-container\"\n [id]=\"id\"\n [attr.aria-label]=\"title\"\n [attr.aria-required]=\"required\"\n [attr.aria-invalid]=\"hasError || null\"\n [class.disabled]=\"disabled\"\n [class.error]=\"hasError\"\n tabindex=\"0\"\n (click)=\"!disabled && openSelect()\"\n (keydown)=\"!disabled && onKeyDown($event)\"\n (focus)=\"onFocus($event)\"\n (blur)=\"onBlur($event)\">\n\n <div class=\"kit-input-select\"\n [class.has-error]=\"hasError\"\n [class.disabled]=\"disabled\">\n {{ getDisplayValue() || (placeholder || 'Select...') }}\n </div>\n\n</div>\n\n@if(helperText && !hasError){\n<kit-text-caption class=\"helper-text\">\n {{ helperText }}\n</kit-text-caption>\n}\n\n@if(hasError && effectiveErrorMessage){\n<kit-text-caption class=\"error-message\">\n {{ effectiveErrorMessage }}\n</kit-text-caption>\n}\n\n<!-- Dialog for larger screens -->\n<kit-dialog [(isOpen)]=\"isDialogOpen\">\n <div>\n <div class=\"kit-dialog-header\">\n <kit-text-label margin=\"5px\">{{ dialogTitle || title }}</kit-text-label>\n </div>\n\n <!-- Search input -->\n @if(showSearchBox){\n <div class=\"kit-select-search-container\">\n <kit-input-text [(value)]=\"searchTerm\"\n (valueChange)=\"onSearchChange($event)\"\n [placeholder]=\"searchBoxPlaceholder\"></kit-input-text>\n </div>\n }\n\n <div class=\"kit-select-options\">\n @for(option of filteredOptions; track option){\n <div class=\"kit-select-item\"\n [class.selected]=\"isSelected(option)\"\n (click)=\"onOptionSelect(option)\">\n <div class=\"kit-checkbox\">\n <svg class=\"kit-checkbox-check\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\">\n <path d=\"M20 6L9 17L4 12\"\n stroke=\"currentColor\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </div>\n <span class=\"kit-select-item-text\">{{ getOptionDisplay(option) }}</span>\n </div>\n }\n\n @if(filteredOptions.length === 0){\n <div class=\"kit-select-options\">\n <kit-text-caption>No options found</kit-text-caption>\n </div>\n }\n </div>\n </div>\n</kit-dialog>\n\n<!-- Bottom sheet for small screens -->\n<kit-bottom-sheet [(isOpen)]=\"isBottomSheetOpen\">\n <div>\n <div class=\"kit-bottom-sheet-header\">\n <kit-text-label margin=\"5px\">{{ dialogTitle || title }}</kit-text-label>\n </div>\n\n <!-- Search input -->\n @if(showSearchBox){\n <div class=\"kit-select-search-container\">\n <kit-input-text [(value)]=\"searchTerm\"\n (valueChange)=\"onSearchChange($event)\"\n [placeholder]=\"searchBoxPlaceholder\"></kit-input-text>\n </div>\n }\n\n <div class=\"kit-select-options\">\n @for(option of filteredOptions; track option){\n <div class=\"kit-select-item\"\n [class.selected]=\"isSelected(option)\"\n (click)=\"onOptionSelect(option)\">\n <div class=\"kit-checkbox\">\n <svg class=\"kit-checkbox-check\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\">\n <path d=\"M20 6L9 17L4 12\"\n stroke=\"currentColor\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </div>\n <span class=\"kit-select-item-text\">{{ getOptionDisplay(option) }}</span>\n </div>\n }\n\n @if(filteredOptions.length === 0){\n <div class=\"kit-select-options\">\n <kit-text-caption>No options found</kit-text-caption>\n </div>\n }\n </div>\n </div>\n</kit-bottom-sheet>", styles: [":host{display:block;width:100%}.kit-input-select-container{position:relative;width:100%;display:flex;align-items:center}.kit-input-select{width:100%;box-sizing:border-box;padding:var(--kit-input-padding, 12px 16px);font-size:var(--kit-input-font-size, 1rem);line-height:var(--kit-input-line-height, 1.5);color:var(--kit-input-text-color, #212529);background-color:var(--kit-input-background-color, #e8e8e8);border:var(--kit-input-border-width, 2px) solid var(--kit-input-border-color, transparent);border-radius:var(--kit-input-border-radius, 16px);transition:border-color .2s ease-in-out;padding-right:40px}.kit-input-select::placeholder{color:var(--kit-input-placeholder-color, var(--kit-text-color-secondary, #6c757d));opacity:1}.kit-input-select:focus{outline:none;border-color:var(--kit-input-focus-border-color, var(--kit-color-primary, #0066cc))}.kit-input-select.has-error{border-color:var(--kit-input-error-border-color, var(--kit-color-danger, #dc3545));background-color:var(--kit-input-error-background-color, #fce8ea)}.kit-input-select:disabled,.kit-input-select.disabled{background-color:var(--kit-input-disabled-background-color, #f5f5f5);color:var(--kit-input-disabled-text-color, var(--kit-text-color-muted, #adb5bd));cursor:not-allowed}.kit-input-select:disabled::placeholder,.kit-input-select.disabled::placeholder{color:var(--kit-input-disabled-placeholder-color, var(--kit-text-color-muted, #adb5bd))}.kit-dialog-header,.kit-bottom-sheet-header{display:flex;justify-content:space-between;align-items:center}.kit-dialog-close,.kit-bottom-sheet-close{background:none;border:none;cursor:pointer;padding:8px}.kit-select-options{display:flex;flex-direction:column;gap:4px;padding:8px 0;overflow-y:auto;box-sizing:border-box}.kit-select-item{display:flex;align-items:center;width:100%;box-sizing:border-box;padding:var(--kit-select-item-padding, 12px 16px);font-size:var(--kit-select-item-font-size, var(--kit-font-size-body, 1rem));color:var(--kit-select-item-text-color, var(--kit-text-color-primary, #212529));background-color:var(--kit-select-item-background-color, transparent);border-radius:var(--kit-select-item-border-radius, 14px);border:none;outline:none;flex-shrink:0}.kit-select-item:hover{background-color:var(--kit-select-item-hover-background-color, rgba(0, 102, 204, .1))}.kit-checkbox{width:20px;height:20px;border:2px solid var(--kit-input-border-color, #adb5bd);border-radius:4px;display:flex;align-items:center;justify-content:center;margin-right:12px;transition:background-color .2s,border-color .2s}.kit-checkbox-check{display:none;color:#fff}.kit-select-item.selected .kit-checkbox{background-color:var(--kit-color-primary, #0066cc);border-color:var(--kit-color-primary, #0066cc)}.kit-select-item.selected .kit-checkbox-check{display:block}.kit-select-item-custom{display:block;width:100%;border:none;outline:none;box-sizing:border-box}.kit-select-item-text{flex:1;text-align:left;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.kit-select-search-container{padding-top:5px;padding-bottom:5px}\n"], dependencies: [{ kind: "component", type: KitInputFieldTitleComponent, selector: "kit-input-field-title", inputs: ["for", "required", "disabled"] }, { kind: "component", type: KitTextCaptionComponent, selector: "kit-text-caption", inputs: ["color", "align", "weight", "decoration", "margin", "wrap", "ellipses", "lines", "italic"] }, { kind: "ngmodule", type: KitOverlaysModule }, { kind: "component", type: KitBottomSheetComponent, selector: "kit-bottom-sheet", inputs: ["isOpen", "closeOnBackdropClick", "padding", "maxHeight"], outputs: ["isOpenChange"] }, { kind: "component", type: KitDialogComponent, selector: "kit-dialog", inputs: ["isOpen", "fullscreen", "closeOnBackdropClick", "padding"], outputs: ["isOpenChange"] }, { kind: "component", type: KitTextLabelComponent, selector: "kit-text-label", inputs: ["color", "align", "weight", "decoration", "margin", "wrap", "ellipses", "lines", "italic"] }, { kind: "component", type: KitInputTextComponent, selector: "kit-input-text", inputs: ["required"], outputs: ["paste"] }] });
3054
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.4", type: KitInputMultiSelectComponent, isStandalone: true, selector: "kit-input-multi-select", inputs: { required: "required", options: "options", matchField: "matchField", displayField: "displayField", dialogTitle: "dialogTitle", showSearchBox: "showSearchBox", searchField: "searchField", searchBoxPlaceholder: "searchBoxPlaceholder" }, queries: [{ propertyName: "activeTemplate", first: true, predicate: KitSelectItemActiveDirective, descendants: true, read: TemplateRef }, { propertyName: "inactiveTemplate", first: true, predicate: KitSelectItemDirective, descendants: true, read: TemplateRef }, { propertyName: "emptyTemplate", first: true, predicate: KitSelectEmptyDirective, descendants: true, read: TemplateRef }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "@if(title){\n<kit-input-field-title [for]=\"id\"\n [required]=\"required\"\n [disabled]=\"disabled\">\n {{ title }}\n</kit-input-field-title>\n}\n\n<!-- Custom select that opens the appropriate UI based on screen size -->\n<div class=\"kit-input-select-container\"\n [id]=\"id\"\n [attr.aria-label]=\"title\"\n [attr.aria-required]=\"required\"\n [attr.aria-invalid]=\"hasError || null\"\n [class.disabled]=\"disabled\"\n [class.error]=\"hasError\"\n tabindex=\"0\"\n (click)=\"!disabled && openSelect()\"\n (keydown)=\"!disabled && onKeyDown($event)\"\n (focus)=\"onFocus($event)\"\n (blur)=\"onBlur($event)\">\n\n <div class=\"kit-input-select\"\n [class.has-error]=\"hasError\"\n [class.disabled]=\"disabled\">\n {{ getDisplayValue() || (placeholder || 'Select...') }}\n </div>\n\n</div>\n\n@if(helperText && !hasError){\n<kit-text-caption class=\"helper-text\">\n {{ helperText }}\n</kit-text-caption>\n}\n\n@if(hasError && effectiveErrorMessage){\n<kit-text-caption class=\"error-message\">\n {{ effectiveErrorMessage }}\n</kit-text-caption>\n}\n\n<!-- Dialog for larger screens -->\n<kit-dialog [(isOpen)]=\"isDialogOpen\">\n <div>\n <div class=\"kit-dialog-header\">\n <kit-text-subheading margin=\"5px\"\n weight=\"bold\">{{ dialogTitle || title }}</kit-text-subheading>\n </div>\n\n <!-- Search input -->\n @if(showSearchBox){\n <div class=\"kit-select-search-container\">\n <kit-input-text [(value)]=\"searchTerm\"\n (valueChange)=\"onSearchChange($event)\"\n [placeholder]=\"searchBoxPlaceholder\"></kit-input-text>\n </div>\n }\n\n <div class=\"kit-select-options\">\n @for(option of filteredOptions; track option){\n <!-- Custom template for selected option -->\n @if(isSelected(option) && hasCustomActiveTemplate()){\n <div class=\"kit-select-item-custom\"\n (click)=\"onOptionSelect(option)\">\n <ng-container *ngTemplateOutlet=\"activeTemplate; context: getOptionContext(option)\"></ng-container>\n </div>\n }\n\n <!-- Custom template for unselected option -->\n @if(!isSelected(option) && hasCustomInactiveTemplate()){\n <div class=\"kit-select-item-custom\"\n (click)=\"onOptionSelect(option)\">\n <ng-container *ngTemplateOutlet=\"inactiveTemplate; context: getOptionContext(option)\"></ng-container>\n </div>\n }\n\n <!-- Default template if no custom template for this state -->\n @if((!isSelected(option) && !hasCustomInactiveTemplate()) || (isSelected(option) && !hasCustomActiveTemplate())){\n <div class=\"kit-select-item\"\n [class.selected]=\"isSelected(option)\"\n (click)=\"onOptionSelect(option)\">\n <div class=\"kit-checkbox\">\n <svg class=\"kit-checkbox-check\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\">\n <path d=\"M20 6L9 17L4 12\"\n stroke=\"currentColor\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </div>\n <span class=\"kit-select-item-text\">{{ getOptionDisplay(option) }}</span>\n </div>\n }\n }\n\n @if(filteredOptions.length === 0){\n <div class=\"kit-select-options\">\n @if(hasCustomEmptyTemplate()){\n <ng-container *ngTemplateOutlet=\"emptyTemplate\"></ng-container>\n }\n @else{\n <kit-text-caption>No options found</kit-text-caption>\n }\n </div>\n }\n </div>\n </div>\n</kit-dialog>\n\n<!-- Bottom sheet for small screens -->\n<kit-bottom-sheet [(isOpen)]=\"isBottomSheetOpen\">\n <div>\n <div class=\"kit-bottom-sheet-header\">\n <kit-text-subheading margin=\"5px\"\n weight=\"bold\">{{ dialogTitle || title }}</kit-text-subheading>\n </div>\n\n <!-- Search input -->\n @if(showSearchBox){\n <div class=\"kit-select-search-container\">\n <kit-input-text [(value)]=\"searchTerm\"\n (valueChange)=\"onSearchChange($event)\"\n [placeholder]=\"searchBoxPlaceholder\"></kit-input-text>\n </div>\n }\n\n <div class=\"kit-select-options\">\n @for(option of filteredOptions; track option){\n <!-- Custom template for selected option -->\n @if(isSelected(option) && hasCustomActiveTemplate()){\n <div class=\"kit-select-item-custom\"\n (click)=\"onOptionSelect(option)\">\n <ng-container *ngTemplateOutlet=\"activeTemplate; context: getOptionContext(option)\"></ng-container>\n </div>\n }\n\n <!-- Custom template for unselected option -->\n @if(!isSelected(option) && hasCustomInactiveTemplate()){\n <div class=\"kit-select-item-custom\"\n (click)=\"onOptionSelect(option)\">\n <ng-container *ngTemplateOutlet=\"inactiveTemplate; context: getOptionContext(option)\"></ng-container>\n </div>\n }\n\n <!-- Default template if no custom template for this state -->\n @if((!isSelected(option) && !hasCustomInactiveTemplate()) || (isSelected(option) && !hasCustomActiveTemplate())){\n <div class=\"kit-select-item\"\n [class.selected]=\"isSelected(option)\"\n (click)=\"onOptionSelect(option)\">\n <div class=\"kit-checkbox\">\n <svg class=\"kit-checkbox-check\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\">\n <path d=\"M20 6L9 17L4 12\"\n stroke=\"currentColor\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </div>\n <span class=\"kit-select-item-text\">{{ getOptionDisplay(option) }}</span>\n </div>\n }\n }\n\n @if(filteredOptions.length === 0){\n <div class=\"kit-select-options\">\n @if(hasCustomEmptyTemplate()){\n <ng-container *ngTemplateOutlet=\"emptyTemplate\"></ng-container>\n }\n @else{\n <kit-text-caption>No options found</kit-text-caption>\n }\n </div>\n }\n </div>\n </div>\n</kit-bottom-sheet>", styles: [":host{display:block;width:100%}.kit-input-select-container{position:relative;width:100%;display:flex;align-items:center}.kit-input-select{width:100%;box-sizing:border-box;padding:var(--kit-input-padding, 12px 16px);font-size:var(--kit-input-font-size, 1rem);line-height:var(--kit-input-line-height, 1.5);color:var(--kit-input-text-color, #212529);background-color:var(--kit-input-background-color, #e8e8e8);border:var(--kit-input-border-width, 2px) solid var(--kit-input-border-color, transparent);border-radius:var(--kit-input-border-radius, 16px);transition:border-color .2s ease-in-out;padding-right:40px}.kit-input-select::placeholder{color:var(--kit-input-placeholder-color, var(--kit-text-color-secondary, #6c757d));opacity:1}.kit-input-select:focus{outline:none;border-color:var(--kit-input-focus-border-color, var(--kit-color-primary, #0066cc))}.kit-input-select.has-error{border-color:var(--kit-input-error-border-color, var(--kit-color-danger, #dc3545));background-color:var(--kit-input-error-background-color, #fce8ea)}.kit-input-select:disabled,.kit-input-select.disabled{background-color:var(--kit-input-disabled-background-color, #f5f5f5);color:var(--kit-input-disabled-text-color, var(--kit-text-color-muted, #adb5bd));cursor:not-allowed}.kit-input-select:disabled::placeholder,.kit-input-select.disabled::placeholder{color:var(--kit-input-disabled-placeholder-color, var(--kit-text-color-muted, #adb5bd))}.kit-dialog-header,.kit-bottom-sheet-header{display:flex;justify-content:space-between;align-items:center}.kit-dialog-close,.kit-bottom-sheet-close{background:none;border:none;cursor:pointer;padding:8px}.kit-select-options{display:flex;flex-direction:column;gap:4px;padding:8px 0;overflow-y:auto;box-sizing:border-box}.kit-select-item{display:flex;align-items:center;width:100%;box-sizing:border-box;padding:var(--kit-select-item-padding, 12px 16px);font-size:var(--kit-select-item-font-size, var(--kit-font-size-body, 1rem));color:var(--kit-select-item-text-color, var(--kit-text-color-primary, #212529));background-color:var(--kit-select-item-background-color, transparent);border-radius:var(--kit-select-item-border-radius, 14px);border:none;outline:none;flex-shrink:0}.kit-select-item:hover{background-color:var(--kit-select-item-hover-background-color, rgba(0, 102, 204, .1))}.kit-checkbox{width:20px;height:20px;border:2px solid var(--kit-input-border-color, #adb5bd);border-radius:4px;display:flex;align-items:center;justify-content:center;margin-right:12px;transition:background-color .2s,border-color .2s}.kit-checkbox-check{display:none;color:#fff}.kit-select-item.selected .kit-checkbox{background-color:var(--kit-color-primary, #0066cc);border-color:var(--kit-color-primary, #0066cc)}.kit-select-item.selected .kit-checkbox-check{display:block}.kit-select-item-custom{display:block;width:100%;border:none;outline:none;box-sizing:border-box}.kit-select-item-text{flex:1;text-align:left;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.kit-select-search-container{padding-top:5px;padding-bottom:5px}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: KitInputFieldTitleComponent, selector: "kit-input-field-title", inputs: ["for", "required", "disabled"] }, { kind: "component", type: KitTextCaptionComponent, selector: "kit-text-caption", inputs: ["color", "align", "weight", "decoration", "margin", "wrap", "ellipses", "lines", "italic"] }, { kind: "ngmodule", type: KitOverlaysModule }, { kind: "component", type: KitBottomSheetComponent, selector: "kit-bottom-sheet", inputs: ["isOpen", "closeOnBackdropClick", "padding", "maxHeight"], outputs: ["isOpenChange"] }, { kind: "component", type: KitDialogComponent, selector: "kit-dialog", inputs: ["isOpen", "fullscreen", "closeOnBackdropClick", "padding"], outputs: ["isOpenChange"] }, { kind: "component", type: KitInputTextComponent, selector: "kit-input-text", inputs: ["required"], outputs: ["paste"] }, { kind: "ngmodule", type: KitTextModule }, { kind: "component", type: KitTextSubheadingComponent, selector: "kit-text-subheading", inputs: ["color", "align", "weight", "decoration", "margin", "wrap", "ellipses", "lines", "italic"] }] });
2667
3055
  }
2668
3056
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: KitInputMultiSelectComponent, decorators: [{
2669
3057
  type: Component,
2670
- args: [{ selector: 'kit-input-multi-select', standalone: true, imports: [KitInputFieldTitleComponent, KitTextCaptionComponent, KitOverlaysModule, KitTextLabelComponent, KitInputTextComponent], template: "@if(title){\n<kit-input-field-title [for]=\"id\"\n [required]=\"required\"\n [disabled]=\"disabled\">\n {{ title }}\n</kit-input-field-title>\n}\n\n<!-- Custom select that opens the appropriate UI based on screen size -->\n<div class=\"kit-input-select-container\"\n [id]=\"id\"\n [attr.aria-label]=\"title\"\n [attr.aria-required]=\"required\"\n [attr.aria-invalid]=\"hasError || null\"\n [class.disabled]=\"disabled\"\n [class.error]=\"hasError\"\n tabindex=\"0\"\n (click)=\"!disabled && openSelect()\"\n (keydown)=\"!disabled && onKeyDown($event)\"\n (focus)=\"onFocus($event)\"\n (blur)=\"onBlur($event)\">\n\n <div class=\"kit-input-select\"\n [class.has-error]=\"hasError\"\n [class.disabled]=\"disabled\">\n {{ getDisplayValue() || (placeholder || 'Select...') }}\n </div>\n\n</div>\n\n@if(helperText && !hasError){\n<kit-text-caption class=\"helper-text\">\n {{ helperText }}\n</kit-text-caption>\n}\n\n@if(hasError && effectiveErrorMessage){\n<kit-text-caption class=\"error-message\">\n {{ effectiveErrorMessage }}\n</kit-text-caption>\n}\n\n<!-- Dialog for larger screens -->\n<kit-dialog [(isOpen)]=\"isDialogOpen\">\n <div>\n <div class=\"kit-dialog-header\">\n <kit-text-label margin=\"5px\">{{ dialogTitle || title }}</kit-text-label>\n </div>\n\n <!-- Search input -->\n @if(showSearchBox){\n <div class=\"kit-select-search-container\">\n <kit-input-text [(value)]=\"searchTerm\"\n (valueChange)=\"onSearchChange($event)\"\n [placeholder]=\"searchBoxPlaceholder\"></kit-input-text>\n </div>\n }\n\n <div class=\"kit-select-options\">\n @for(option of filteredOptions; track option){\n <div class=\"kit-select-item\"\n [class.selected]=\"isSelected(option)\"\n (click)=\"onOptionSelect(option)\">\n <div class=\"kit-checkbox\">\n <svg class=\"kit-checkbox-check\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\">\n <path d=\"M20 6L9 17L4 12\"\n stroke=\"currentColor\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </div>\n <span class=\"kit-select-item-text\">{{ getOptionDisplay(option) }}</span>\n </div>\n }\n\n @if(filteredOptions.length === 0){\n <div class=\"kit-select-options\">\n <kit-text-caption>No options found</kit-text-caption>\n </div>\n }\n </div>\n </div>\n</kit-dialog>\n\n<!-- Bottom sheet for small screens -->\n<kit-bottom-sheet [(isOpen)]=\"isBottomSheetOpen\">\n <div>\n <div class=\"kit-bottom-sheet-header\">\n <kit-text-label margin=\"5px\">{{ dialogTitle || title }}</kit-text-label>\n </div>\n\n <!-- Search input -->\n @if(showSearchBox){\n <div class=\"kit-select-search-container\">\n <kit-input-text [(value)]=\"searchTerm\"\n (valueChange)=\"onSearchChange($event)\"\n [placeholder]=\"searchBoxPlaceholder\"></kit-input-text>\n </div>\n }\n\n <div class=\"kit-select-options\">\n @for(option of filteredOptions; track option){\n <div class=\"kit-select-item\"\n [class.selected]=\"isSelected(option)\"\n (click)=\"onOptionSelect(option)\">\n <div class=\"kit-checkbox\">\n <svg class=\"kit-checkbox-check\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\">\n <path d=\"M20 6L9 17L4 12\"\n stroke=\"currentColor\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </div>\n <span class=\"kit-select-item-text\">{{ getOptionDisplay(option) }}</span>\n </div>\n }\n\n @if(filteredOptions.length === 0){\n <div class=\"kit-select-options\">\n <kit-text-caption>No options found</kit-text-caption>\n </div>\n }\n </div>\n </div>\n</kit-bottom-sheet>", styles: [":host{display:block;width:100%}.kit-input-select-container{position:relative;width:100%;display:flex;align-items:center}.kit-input-select{width:100%;box-sizing:border-box;padding:var(--kit-input-padding, 12px 16px);font-size:var(--kit-input-font-size, 1rem);line-height:var(--kit-input-line-height, 1.5);color:var(--kit-input-text-color, #212529);background-color:var(--kit-input-background-color, #e8e8e8);border:var(--kit-input-border-width, 2px) solid var(--kit-input-border-color, transparent);border-radius:var(--kit-input-border-radius, 16px);transition:border-color .2s ease-in-out;padding-right:40px}.kit-input-select::placeholder{color:var(--kit-input-placeholder-color, var(--kit-text-color-secondary, #6c757d));opacity:1}.kit-input-select:focus{outline:none;border-color:var(--kit-input-focus-border-color, var(--kit-color-primary, #0066cc))}.kit-input-select.has-error{border-color:var(--kit-input-error-border-color, var(--kit-color-danger, #dc3545));background-color:var(--kit-input-error-background-color, #fce8ea)}.kit-input-select:disabled,.kit-input-select.disabled{background-color:var(--kit-input-disabled-background-color, #f5f5f5);color:var(--kit-input-disabled-text-color, var(--kit-text-color-muted, #adb5bd));cursor:not-allowed}.kit-input-select:disabled::placeholder,.kit-input-select.disabled::placeholder{color:var(--kit-input-disabled-placeholder-color, var(--kit-text-color-muted, #adb5bd))}.kit-dialog-header,.kit-bottom-sheet-header{display:flex;justify-content:space-between;align-items:center}.kit-dialog-close,.kit-bottom-sheet-close{background:none;border:none;cursor:pointer;padding:8px}.kit-select-options{display:flex;flex-direction:column;gap:4px;padding:8px 0;overflow-y:auto;box-sizing:border-box}.kit-select-item{display:flex;align-items:center;width:100%;box-sizing:border-box;padding:var(--kit-select-item-padding, 12px 16px);font-size:var(--kit-select-item-font-size, var(--kit-font-size-body, 1rem));color:var(--kit-select-item-text-color, var(--kit-text-color-primary, #212529));background-color:var(--kit-select-item-background-color, transparent);border-radius:var(--kit-select-item-border-radius, 14px);border:none;outline:none;flex-shrink:0}.kit-select-item:hover{background-color:var(--kit-select-item-hover-background-color, rgba(0, 102, 204, .1))}.kit-checkbox{width:20px;height:20px;border:2px solid var(--kit-input-border-color, #adb5bd);border-radius:4px;display:flex;align-items:center;justify-content:center;margin-right:12px;transition:background-color .2s,border-color .2s}.kit-checkbox-check{display:none;color:#fff}.kit-select-item.selected .kit-checkbox{background-color:var(--kit-color-primary, #0066cc);border-color:var(--kit-color-primary, #0066cc)}.kit-select-item.selected .kit-checkbox-check{display:block}.kit-select-item-custom{display:block;width:100%;border:none;outline:none;box-sizing:border-box}.kit-select-item-text{flex:1;text-align:left;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.kit-select-search-container{padding-top:5px;padding-bottom:5px}\n"] }]
3058
+ args: [{ selector: 'kit-input-multi-select', standalone: true, imports: [NgTemplateOutlet, KitInputFieldTitleComponent, KitTextCaptionComponent, KitOverlaysModule, KitTextLabelComponent, KitInputTextComponent, KitTextModule], template: "@if(title){\n<kit-input-field-title [for]=\"id\"\n [required]=\"required\"\n [disabled]=\"disabled\">\n {{ title }}\n</kit-input-field-title>\n}\n\n<!-- Custom select that opens the appropriate UI based on screen size -->\n<div class=\"kit-input-select-container\"\n [id]=\"id\"\n [attr.aria-label]=\"title\"\n [attr.aria-required]=\"required\"\n [attr.aria-invalid]=\"hasError || null\"\n [class.disabled]=\"disabled\"\n [class.error]=\"hasError\"\n tabindex=\"0\"\n (click)=\"!disabled && openSelect()\"\n (keydown)=\"!disabled && onKeyDown($event)\"\n (focus)=\"onFocus($event)\"\n (blur)=\"onBlur($event)\">\n\n <div class=\"kit-input-select\"\n [class.has-error]=\"hasError\"\n [class.disabled]=\"disabled\">\n {{ getDisplayValue() || (placeholder || 'Select...') }}\n </div>\n\n</div>\n\n@if(helperText && !hasError){\n<kit-text-caption class=\"helper-text\">\n {{ helperText }}\n</kit-text-caption>\n}\n\n@if(hasError && effectiveErrorMessage){\n<kit-text-caption class=\"error-message\">\n {{ effectiveErrorMessage }}\n</kit-text-caption>\n}\n\n<!-- Dialog for larger screens -->\n<kit-dialog [(isOpen)]=\"isDialogOpen\">\n <div>\n <div class=\"kit-dialog-header\">\n <kit-text-subheading margin=\"5px\"\n weight=\"bold\">{{ dialogTitle || title }}</kit-text-subheading>\n </div>\n\n <!-- Search input -->\n @if(showSearchBox){\n <div class=\"kit-select-search-container\">\n <kit-input-text [(value)]=\"searchTerm\"\n (valueChange)=\"onSearchChange($event)\"\n [placeholder]=\"searchBoxPlaceholder\"></kit-input-text>\n </div>\n }\n\n <div class=\"kit-select-options\">\n @for(option of filteredOptions; track option){\n <!-- Custom template for selected option -->\n @if(isSelected(option) && hasCustomActiveTemplate()){\n <div class=\"kit-select-item-custom\"\n (click)=\"onOptionSelect(option)\">\n <ng-container *ngTemplateOutlet=\"activeTemplate; context: getOptionContext(option)\"></ng-container>\n </div>\n }\n\n <!-- Custom template for unselected option -->\n @if(!isSelected(option) && hasCustomInactiveTemplate()){\n <div class=\"kit-select-item-custom\"\n (click)=\"onOptionSelect(option)\">\n <ng-container *ngTemplateOutlet=\"inactiveTemplate; context: getOptionContext(option)\"></ng-container>\n </div>\n }\n\n <!-- Default template if no custom template for this state -->\n @if((!isSelected(option) && !hasCustomInactiveTemplate()) || (isSelected(option) && !hasCustomActiveTemplate())){\n <div class=\"kit-select-item\"\n [class.selected]=\"isSelected(option)\"\n (click)=\"onOptionSelect(option)\">\n <div class=\"kit-checkbox\">\n <svg class=\"kit-checkbox-check\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\">\n <path d=\"M20 6L9 17L4 12\"\n stroke=\"currentColor\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </div>\n <span class=\"kit-select-item-text\">{{ getOptionDisplay(option) }}</span>\n </div>\n }\n }\n\n @if(filteredOptions.length === 0){\n <div class=\"kit-select-options\">\n @if(hasCustomEmptyTemplate()){\n <ng-container *ngTemplateOutlet=\"emptyTemplate\"></ng-container>\n }\n @else{\n <kit-text-caption>No options found</kit-text-caption>\n }\n </div>\n }\n </div>\n </div>\n</kit-dialog>\n\n<!-- Bottom sheet for small screens -->\n<kit-bottom-sheet [(isOpen)]=\"isBottomSheetOpen\">\n <div>\n <div class=\"kit-bottom-sheet-header\">\n <kit-text-subheading margin=\"5px\"\n weight=\"bold\">{{ dialogTitle || title }}</kit-text-subheading>\n </div>\n\n <!-- Search input -->\n @if(showSearchBox){\n <div class=\"kit-select-search-container\">\n <kit-input-text [(value)]=\"searchTerm\"\n (valueChange)=\"onSearchChange($event)\"\n [placeholder]=\"searchBoxPlaceholder\"></kit-input-text>\n </div>\n }\n\n <div class=\"kit-select-options\">\n @for(option of filteredOptions; track option){\n <!-- Custom template for selected option -->\n @if(isSelected(option) && hasCustomActiveTemplate()){\n <div class=\"kit-select-item-custom\"\n (click)=\"onOptionSelect(option)\">\n <ng-container *ngTemplateOutlet=\"activeTemplate; context: getOptionContext(option)\"></ng-container>\n </div>\n }\n\n <!-- Custom template for unselected option -->\n @if(!isSelected(option) && hasCustomInactiveTemplate()){\n <div class=\"kit-select-item-custom\"\n (click)=\"onOptionSelect(option)\">\n <ng-container *ngTemplateOutlet=\"inactiveTemplate; context: getOptionContext(option)\"></ng-container>\n </div>\n }\n\n <!-- Default template if no custom template for this state -->\n @if((!isSelected(option) && !hasCustomInactiveTemplate()) || (isSelected(option) && !hasCustomActiveTemplate())){\n <div class=\"kit-select-item\"\n [class.selected]=\"isSelected(option)\"\n (click)=\"onOptionSelect(option)\">\n <div class=\"kit-checkbox\">\n <svg class=\"kit-checkbox-check\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\">\n <path d=\"M20 6L9 17L4 12\"\n stroke=\"currentColor\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </div>\n <span class=\"kit-select-item-text\">{{ getOptionDisplay(option) }}</span>\n </div>\n }\n }\n\n @if(filteredOptions.length === 0){\n <div class=\"kit-select-options\">\n @if(hasCustomEmptyTemplate()){\n <ng-container *ngTemplateOutlet=\"emptyTemplate\"></ng-container>\n }\n @else{\n <kit-text-caption>No options found</kit-text-caption>\n }\n </div>\n }\n </div>\n </div>\n</kit-bottom-sheet>", styles: [":host{display:block;width:100%}.kit-input-select-container{position:relative;width:100%;display:flex;align-items:center}.kit-input-select{width:100%;box-sizing:border-box;padding:var(--kit-input-padding, 12px 16px);font-size:var(--kit-input-font-size, 1rem);line-height:var(--kit-input-line-height, 1.5);color:var(--kit-input-text-color, #212529);background-color:var(--kit-input-background-color, #e8e8e8);border:var(--kit-input-border-width, 2px) solid var(--kit-input-border-color, transparent);border-radius:var(--kit-input-border-radius, 16px);transition:border-color .2s ease-in-out;padding-right:40px}.kit-input-select::placeholder{color:var(--kit-input-placeholder-color, var(--kit-text-color-secondary, #6c757d));opacity:1}.kit-input-select:focus{outline:none;border-color:var(--kit-input-focus-border-color, var(--kit-color-primary, #0066cc))}.kit-input-select.has-error{border-color:var(--kit-input-error-border-color, var(--kit-color-danger, #dc3545));background-color:var(--kit-input-error-background-color, #fce8ea)}.kit-input-select:disabled,.kit-input-select.disabled{background-color:var(--kit-input-disabled-background-color, #f5f5f5);color:var(--kit-input-disabled-text-color, var(--kit-text-color-muted, #adb5bd));cursor:not-allowed}.kit-input-select:disabled::placeholder,.kit-input-select.disabled::placeholder{color:var(--kit-input-disabled-placeholder-color, var(--kit-text-color-muted, #adb5bd))}.kit-dialog-header,.kit-bottom-sheet-header{display:flex;justify-content:space-between;align-items:center}.kit-dialog-close,.kit-bottom-sheet-close{background:none;border:none;cursor:pointer;padding:8px}.kit-select-options{display:flex;flex-direction:column;gap:4px;padding:8px 0;overflow-y:auto;box-sizing:border-box}.kit-select-item{display:flex;align-items:center;width:100%;box-sizing:border-box;padding:var(--kit-select-item-padding, 12px 16px);font-size:var(--kit-select-item-font-size, var(--kit-font-size-body, 1rem));color:var(--kit-select-item-text-color, var(--kit-text-color-primary, #212529));background-color:var(--kit-select-item-background-color, transparent);border-radius:var(--kit-select-item-border-radius, 14px);border:none;outline:none;flex-shrink:0}.kit-select-item:hover{background-color:var(--kit-select-item-hover-background-color, rgba(0, 102, 204, .1))}.kit-checkbox{width:20px;height:20px;border:2px solid var(--kit-input-border-color, #adb5bd);border-radius:4px;display:flex;align-items:center;justify-content:center;margin-right:12px;transition:background-color .2s,border-color .2s}.kit-checkbox-check{display:none;color:#fff}.kit-select-item.selected .kit-checkbox{background-color:var(--kit-color-primary, #0066cc);border-color:var(--kit-color-primary, #0066cc)}.kit-select-item.selected .kit-checkbox-check{display:block}.kit-select-item-custom{display:block;width:100%;border:none;outline:none;box-sizing:border-box}.kit-select-item-text{flex:1;text-align:left;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.kit-select-search-container{padding-top:5px;padding-bottom:5px}\n"] }]
2671
3059
  }], ctorParameters: () => [{ type: KitScreenService }, { type: i1.NgControl, decorators: [{
2672
3060
  type: Optional
2673
3061
  }, {
@@ -5018,592 +5406,204 @@ class KitTabViewComponent {
5018
5406
  }
5019
5407
  }
5020
5408
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: KitTabViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
5021
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.4", type: KitTabViewComponent, isStandalone: true, selector: "kit-tab-view", inputs: { tabs: "tabs" }, queries: [{ propertyName: "tabContents", predicate: KitTabContentComponent }], viewQueries: [{ propertyName: "tabHeaderElement", first: true, predicate: ["tabHeader"], descendants: true }], ngImport: i0, template: "<div class=\"kit-tab-view-container\">\n\n <div class=\"kit-tab-header\"\n #tabHeader>\n\n @for (tab of (tabs.length > 0 ? tabs : generatedTabs); track tab) {\n <div\n class=\"kit-tab-item\"\n [class.kit-tab-item--active]=\"tab.active\"\n (click)=\"selectTab(tab.index)\"\n role=\"tab\"\n [attr.aria-selected]=\"tab.active\">\n {{ tab.title }}\n </div>\n }\n\n </div>\n\n <div class=\"kit-tab-content\"\n role=\"tabpanel\">\n <ng-content></ng-content>\n </div>\n\n</div>", styles: [":host{display:block;width:100%;max-width:100%;overflow:hidden;box-sizing:border-box}.kit-tab-view-container{width:100%;max-width:100%;display:flex;flex-direction:column;overflow:hidden;box-sizing:border-box}.kit-tab-header{display:flex;flex-wrap:nowrap;margin-bottom:var(--kit-input-padding, 16px);overflow-x:auto;overflow-y:hidden;scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;width:100%;max-width:100%;box-sizing:border-box;position:relative;scroll-behavior:smooth}.kit-tab-header::-webkit-scrollbar{display:none}.kit-tab-item{padding:12px 16px;cursor:pointer;font-size:var(--kit-font-size-body, 1rem);font-weight:var(--kit-font-weight-body, 400);line-height:var(--kit-line-height-body, 1.5);color:var(--kit-text-color-secondary, #6c757d);background-color:transparent;border:none;border-bottom:2px solid transparent;transition:color .2s ease,background-color .2s ease;position:relative;-webkit-user-select:none;user-select:none;white-space:nowrap;flex-shrink:0}.kit-tab-item:hover{color:var(--kit-color-primary, #0066cc);background-color:#0066cc0d}.kit-tab-item:focus{outline:2px solid var(--kit-color-primary, #0066cc);outline-offset:-2px}.kit-tab-item:after{content:\"\";position:absolute;bottom:-2px;left:50%;width:0;height:2px;background-color:var(--kit-color-primary, #0066cc);transition:width .3s ease,left .3s ease;transform:translate(-50%)}.kit-tab-item--active{color:var(--kit-color-primary, #0066cc);font-weight:var(--kit-font-weight-label, 500);border-bottom-color:transparent}.kit-tab-item--active:after{width:100%}.kit-tab-item--active:hover{background-color:#0066cc1a}.kit-tab-content{flex:1;min-height:0;width:100%;max-width:100%;overflow-x:hidden;box-sizing:border-box}\n"] });
5022
- }
5023
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: KitTabViewComponent, decorators: [{
5024
- type: Component,
5025
- args: [{ selector: 'kit-tab-view', standalone: true, imports: [], template: "<div class=\"kit-tab-view-container\">\n\n <div class=\"kit-tab-header\"\n #tabHeader>\n\n @for (tab of (tabs.length > 0 ? tabs : generatedTabs); track tab) {\n <div\n class=\"kit-tab-item\"\n [class.kit-tab-item--active]=\"tab.active\"\n (click)=\"selectTab(tab.index)\"\n role=\"tab\"\n [attr.aria-selected]=\"tab.active\">\n {{ tab.title }}\n </div>\n }\n\n </div>\n\n <div class=\"kit-tab-content\"\n role=\"tabpanel\">\n <ng-content></ng-content>\n </div>\n\n</div>", styles: [":host{display:block;width:100%;max-width:100%;overflow:hidden;box-sizing:border-box}.kit-tab-view-container{width:100%;max-width:100%;display:flex;flex-direction:column;overflow:hidden;box-sizing:border-box}.kit-tab-header{display:flex;flex-wrap:nowrap;margin-bottom:var(--kit-input-padding, 16px);overflow-x:auto;overflow-y:hidden;scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;width:100%;max-width:100%;box-sizing:border-box;position:relative;scroll-behavior:smooth}.kit-tab-header::-webkit-scrollbar{display:none}.kit-tab-item{padding:12px 16px;cursor:pointer;font-size:var(--kit-font-size-body, 1rem);font-weight:var(--kit-font-weight-body, 400);line-height:var(--kit-line-height-body, 1.5);color:var(--kit-text-color-secondary, #6c757d);background-color:transparent;border:none;border-bottom:2px solid transparent;transition:color .2s ease,background-color .2s ease;position:relative;-webkit-user-select:none;user-select:none;white-space:nowrap;flex-shrink:0}.kit-tab-item:hover{color:var(--kit-color-primary, #0066cc);background-color:#0066cc0d}.kit-tab-item:focus{outline:2px solid var(--kit-color-primary, #0066cc);outline-offset:-2px}.kit-tab-item:after{content:\"\";position:absolute;bottom:-2px;left:50%;width:0;height:2px;background-color:var(--kit-color-primary, #0066cc);transition:width .3s ease,left .3s ease;transform:translate(-50%)}.kit-tab-item--active{color:var(--kit-color-primary, #0066cc);font-weight:var(--kit-font-weight-label, 500);border-bottom-color:transparent}.kit-tab-item--active:after{width:100%}.kit-tab-item--active:hover{background-color:#0066cc1a}.kit-tab-content{flex:1;min-height:0;width:100%;max-width:100%;overflow-x:hidden;box-sizing:border-box}\n"] }]
5026
- }], propDecorators: { tabContents: [{
5027
- type: ContentChildren,
5028
- args: [KitTabContentComponent]
5029
- }], tabHeaderElement: [{
5030
- type: ViewChild,
5031
- args: ['tabHeader']
5032
- }], tabs: [{
5033
- type: Input
5034
- }] } });
5035
-
5036
- class KitNavigationModule {
5037
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: KitNavigationModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
5038
- static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.4", ngImport: i0, type: KitNavigationModule, imports: [KitRouterOutletComponent,
5039
- KitTabViewComponent,
5040
- KitTabContentComponent], exports: [KitRouterOutletComponent,
5041
- KitTabViewComponent,
5042
- KitTabContentComponent] });
5043
- static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: KitNavigationModule });
5044
- }
5045
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: KitNavigationModule, decorators: [{
5046
- type: NgModule,
5047
- args: [{
5048
- imports: [
5049
- KitRouterOutletComponent,
5050
- KitTabViewComponent,
5051
- KitTabContentComponent
5052
- ],
5053
- exports: [
5054
- KitRouterOutletComponent,
5055
- KitTabViewComponent,
5056
- KitTabContentComponent
5057
- ]
5058
- }]
5059
- }] });
5060
-
5061
- /**
5062
- * A card component that displays content in an elevated, contained surface.
5063
- * Cards can be clickable and support different elevation levels.
5064
- */
5065
- class KitCardComponent {
5066
- /**
5067
- * The elevation level of the card (affects shadow depth)
5068
- */
5069
- elevation = 'low';
5070
- /**
5071
- * Whether the card is clickable
5072
- */
5073
- clickable = false;
5074
- /**
5075
- * Whether the card is disabled (only applies to clickable cards)
5076
- */
5077
- disabled = false;
5078
- /**
5079
- * Whether the card should take up the full width of its container
5080
- */
5081
- fullWidth = false;
5082
- /**
5083
- * Whether the card should take up the full height of its container
5084
- */
5085
- fullHeight = false;
5086
- /**
5087
- * Emitted when the card is clicked (only for clickable cards)
5088
- */
5089
- clicked = new EventEmitter();
5090
- /**
5091
- * Apply the clickable class to the host element when clickable is true
5092
- */
5093
- get isClickable() {
5094
- return this.clickable && !this.disabled;
5095
- }
5096
- /**
5097
- * Apply the full-width class to the host element when fullWidth is true
5098
- */
5099
- get isFullWidth() {
5100
- return this.fullWidth;
5101
- }
5102
- /**
5103
- * Apply the full-height class to the host element when fullHeight is true
5104
- */
5105
- get isFullHeight() {
5106
- return this.fullHeight;
5107
- }
5108
- /**
5109
- * Classes to apply to the card element
5110
- */
5111
- get cardClasses() {
5112
- const classes = ['kit-card'];
5113
- // Add elevation class
5114
- classes.push(`kit-card--${this.elevation}`);
5115
- // Add clickable class if needed
5116
- if (this.clickable) {
5117
- classes.push('kit-card--clickable');
5118
- }
5119
- // Add disabled class if needed
5120
- if (this.disabled && this.clickable) {
5121
- classes.push('kit-card--disabled');
5122
- }
5123
- // Add full width class if needed
5124
- if (this.fullWidth) {
5125
- classes.push('kit-card--full-width');
5126
- }
5127
- return classes;
5128
- }
5129
- /**
5130
- * Handle card click
5131
- */
5132
- handleClick(event) {
5133
- if (this.clickable && !this.disabled) {
5134
- this.clicked.emit(event);
5135
- }
5136
- }
5137
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: KitCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
5138
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.4", type: KitCardComponent, isStandalone: true, selector: "kit-card", inputs: { elevation: "elevation", clickable: "clickable", disabled: "disabled", fullWidth: "fullWidth", fullHeight: "fullHeight" }, outputs: { clicked: "clicked" }, host: { properties: { "class.clickable": "this.isClickable", "class.full-width": "this.isFullWidth", "class.full-height": "this.isFullHeight" } }, ngImport: i0, template: "<div [ngClass]=\"cardClasses\"\n [attr.role]=\"clickable ? 'button' : null\"\n [attr.tabindex]=\"clickable && !disabled ? '0' : null\"\n [attr.aria-disabled]=\"clickable && disabled ? 'true' : null\"\n (click)=\"handleClick($event)\">\n\n <div class=\"kit-card__content\">\n <ng-content></ng-content>\n </div>\n</div>", styles: [":host{display:inline-block;min-width:0}:host.full-width{display:block;width:100%}:host.full-width .kit-card{width:100%}:host.full-height{display:block;height:100%}:host.full-height .kit-card{height:100%}:host.full-height .kit-card .kit-card__content{display:flex;flex-direction:column;flex:1 1 auto;min-height:0}:host.clickable{cursor:pointer}.kit-card{position:relative;display:flex;flex-direction:column;background-color:var(--kit-card-background-color, #ffffff);border-radius:var(--kit-card-border-radius, 16px);transition:box-shadow .2s ease,transform .1s ease;overflow:hidden;box-sizing:border-box;border:var(--kit-card-border-width, 1px) solid var(--kit-card-border-color, transparent)}.kit-card .kit-card__content{display:flex;flex-direction:column;width:100%;min-width:0;padding:var(--kit-card-padding, 16px);box-sizing:border-box}.kit-card.kit-card--none{box-shadow:none}.kit-card.kit-card--low{box-shadow:var(--kit-card-shadow-low, 0 1px 3px rgba(0, 0, 0, .12), 0 1px 2px rgba(0, 0, 0, .24))}.kit-card.kit-card--medium{box-shadow:var(--kit-card-shadow-medium, 0 3px 6px rgba(0, 0, 0, .16), 0 3px 6px rgba(0, 0, 0, .23))}.kit-card.kit-card--high{box-shadow:var(--kit-card-shadow-high, 0 10px 20px rgba(0, 0, 0, .19), 0 6px 6px rgba(0, 0, 0, .23))}.kit-card.kit-card--clickable{cursor:pointer;-webkit-user-select:none;user-select:none}.kit-card.kit-card--clickable:hover:not(.kit-card--disabled){transform:var(--kit-card-hover-transform, translateY(-2px));box-shadow:var(--kit-card-hover-shadow, 0 4px 8px rgba(0, 0, 0, .16), 0 4px 8px rgba(0, 0, 0, .23))}.kit-card.kit-card--clickable:active:not(.kit-card--disabled){transform:var(--kit-card-active-transform, translateY(0));box-shadow:var(--kit-card-active-shadow, 0 2px 4px rgba(0, 0, 0, .12), 0 2px 4px rgba(0, 0, 0, .24))}.kit-card.kit-card--clickable:focus:not(.kit-card--disabled){outline:none;box-shadow:var(--kit-card-focus-shadow, 0 0 0 3px rgba(var(--kit-color-primary-rgb, 0, 102, 204), .2))}.kit-card.kit-card--disabled{cursor:not-allowed;opacity:var(--kit-card-disabled-opacity, .6);pointer-events:none}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
5139
- }
5140
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: KitCardComponent, decorators: [{
5141
- type: Component,
5142
- args: [{ selector: 'kit-card', standalone: true, imports: [NgClass], template: "<div [ngClass]=\"cardClasses\"\n [attr.role]=\"clickable ? 'button' : null\"\n [attr.tabindex]=\"clickable && !disabled ? '0' : null\"\n [attr.aria-disabled]=\"clickable && disabled ? 'true' : null\"\n (click)=\"handleClick($event)\">\n\n <div class=\"kit-card__content\">\n <ng-content></ng-content>\n </div>\n</div>", styles: [":host{display:inline-block;min-width:0}:host.full-width{display:block;width:100%}:host.full-width .kit-card{width:100%}:host.full-height{display:block;height:100%}:host.full-height .kit-card{height:100%}:host.full-height .kit-card .kit-card__content{display:flex;flex-direction:column;flex:1 1 auto;min-height:0}:host.clickable{cursor:pointer}.kit-card{position:relative;display:flex;flex-direction:column;background-color:var(--kit-card-background-color, #ffffff);border-radius:var(--kit-card-border-radius, 16px);transition:box-shadow .2s ease,transform .1s ease;overflow:hidden;box-sizing:border-box;border:var(--kit-card-border-width, 1px) solid var(--kit-card-border-color, transparent)}.kit-card .kit-card__content{display:flex;flex-direction:column;width:100%;min-width:0;padding:var(--kit-card-padding, 16px);box-sizing:border-box}.kit-card.kit-card--none{box-shadow:none}.kit-card.kit-card--low{box-shadow:var(--kit-card-shadow-low, 0 1px 3px rgba(0, 0, 0, .12), 0 1px 2px rgba(0, 0, 0, .24))}.kit-card.kit-card--medium{box-shadow:var(--kit-card-shadow-medium, 0 3px 6px rgba(0, 0, 0, .16), 0 3px 6px rgba(0, 0, 0, .23))}.kit-card.kit-card--high{box-shadow:var(--kit-card-shadow-high, 0 10px 20px rgba(0, 0, 0, .19), 0 6px 6px rgba(0, 0, 0, .23))}.kit-card.kit-card--clickable{cursor:pointer;-webkit-user-select:none;user-select:none}.kit-card.kit-card--clickable:hover:not(.kit-card--disabled){transform:var(--kit-card-hover-transform, translateY(-2px));box-shadow:var(--kit-card-hover-shadow, 0 4px 8px rgba(0, 0, 0, .16), 0 4px 8px rgba(0, 0, 0, .23))}.kit-card.kit-card--clickable:active:not(.kit-card--disabled){transform:var(--kit-card-active-transform, translateY(0));box-shadow:var(--kit-card-active-shadow, 0 2px 4px rgba(0, 0, 0, .12), 0 2px 4px rgba(0, 0, 0, .24))}.kit-card.kit-card--clickable:focus:not(.kit-card--disabled){outline:none;box-shadow:var(--kit-card-focus-shadow, 0 0 0 3px rgba(var(--kit-color-primary-rgb, 0, 102, 204), .2))}.kit-card.kit-card--disabled{cursor:not-allowed;opacity:var(--kit-card-disabled-opacity, .6);pointer-events:none}\n"] }]
5143
- }], propDecorators: { elevation: [{
5144
- type: Input
5145
- }], clickable: [{
5146
- type: Input
5147
- }], disabled: [{
5148
- type: Input
5149
- }], fullWidth: [{
5150
- type: Input
5151
- }], fullHeight: [{
5152
- type: Input
5153
- }], clicked: [{
5154
- type: Output
5155
- }], isClickable: [{
5156
- type: HostBinding,
5157
- args: ['class.clickable']
5158
- }], isFullWidth: [{
5159
- type: HostBinding,
5160
- args: ['class.full-width']
5161
- }], isFullHeight: [{
5162
- type: HostBinding,
5163
- args: ['class.full-height']
5164
- }] } });
5165
-
5166
- class KitBadgeComponent {
5167
- color = 'primary';
5168
- active = true;
5169
- fullWidth = false;
5170
- get isFullWidth() {
5171
- return this.fullWidth;
5172
- }
5173
- get badgeClasses() {
5174
- const classes = ['kit-badge'];
5175
- classes.push(`kit-badge--${this.color}`);
5176
- if (!this.active) {
5177
- classes.push('kit-badge--inactive');
5178
- }
5179
- if (this.fullWidth) {
5180
- classes.push('kit-badge--full-width');
5181
- }
5182
- return classes;
5183
- }
5184
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: KitBadgeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
5185
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.4", type: KitBadgeComponent, isStandalone: true, selector: "kit-badge", inputs: { color: "color", active: "active", fullWidth: "fullWidth" }, host: { properties: { "class.full-width": "this.isFullWidth" } }, ngImport: i0, template: "\n<div [ngClass]=\"badgeClasses\">\n <ng-content></ng-content>\n</div>\n", styles: [":host{display:inline-block}:host.full-width{width:100%}.kit-badge{display:inline-flex;align-items:center;justify-content:center;border-radius:var(--kit-badge-border-radius, 12px);font-weight:var(--kit-badge-font-weight, 700);padding:var(--kit-badge-padding, 6px 12px);font-size:var(--kit-badge-font-size, 12px);line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline}.kit-badge.kit-badge--full-width{width:100%}.kit-badge.kit-badge--primary{background-color:var(--kit-color-primary, #0066cc);color:#fff}.kit-badge.kit-badge--secondary{background-color:var(--kit-color-secondary, #6c757d);color:#fff}.kit-badge.kit-badge--success{background-color:var(--kit-color-success, #28a745);color:#fff}.kit-badge.kit-badge--info{background-color:var(--kit-color-info, #17a2b8);color:#fff}.kit-badge.kit-badge--warning{background-color:var(--kit-color-warning, #ffc107);color:#000}.kit-badge.kit-badge--danger{background-color:var(--kit-color-danger, #dc3545);color:#fff}.kit-badge.kit-badge--transparent{background-color:transparent;color:var(--kit-color-transparent-text, var(--kit-text-color-primary, #212529))}.kit-badge.kit-badge--inactive{background-color:transparent}.kit-badge.kit-badge--inactive.kit-badge--primary{background-color:rgba(var(--kit-color-primary-rgb, 0, 102, 204),.08);color:var(--kit-color-primary, #0066cc)}.kit-badge.kit-badge--inactive.kit-badge--secondary{background-color:rgba(var(--kit-color-secondary-rgb, 108, 117, 125),.08);color:var(--kit-color-secondary, #6c757d)}.kit-badge.kit-badge--inactive.kit-badge--success{background-color:rgba(var(--kit-color-success-rgb, 40, 167, 69),.08);color:var(--kit-color-success, #28a745)}.kit-badge.kit-badge--inactive.kit-badge--info{background-color:rgba(var(--kit-color-info-rgb, 23, 162, 184),.08);color:var(--kit-color-info, #17a2b8)}.kit-badge.kit-badge--inactive.kit-badge--warning{background-color:rgba(var(--kit-color-warning-rgb, 255, 193, 7),.08);color:var(--kit-color-warning, #ffc107)}.kit-badge.kit-badge--inactive.kit-badge--danger{background-color:rgba(var(--kit-color-danger-rgb, 220, 53, 69),.08);color:var(--kit-color-danger, #dc3545)}.kit-badge.kit-badge--inactive.kit-badge--transparent{background-color:rgba(var(--kit-color-transparent-text-rgb, 33, 37, 41),.04);color:var(--kit-color-transparent-text, var(--kit-text-color-primary, #212529))}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
5186
- }
5187
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: KitBadgeComponent, decorators: [{
5188
- type: Component,
5189
- args: [{ selector: 'kit-badge', standalone: true, imports: [NgClass], template: "\n<div [ngClass]=\"badgeClasses\">\n <ng-content></ng-content>\n</div>\n", styles: [":host{display:inline-block}:host.full-width{width:100%}.kit-badge{display:inline-flex;align-items:center;justify-content:center;border-radius:var(--kit-badge-border-radius, 12px);font-weight:var(--kit-badge-font-weight, 700);padding:var(--kit-badge-padding, 6px 12px);font-size:var(--kit-badge-font-size, 12px);line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline}.kit-badge.kit-badge--full-width{width:100%}.kit-badge.kit-badge--primary{background-color:var(--kit-color-primary, #0066cc);color:#fff}.kit-badge.kit-badge--secondary{background-color:var(--kit-color-secondary, #6c757d);color:#fff}.kit-badge.kit-badge--success{background-color:var(--kit-color-success, #28a745);color:#fff}.kit-badge.kit-badge--info{background-color:var(--kit-color-info, #17a2b8);color:#fff}.kit-badge.kit-badge--warning{background-color:var(--kit-color-warning, #ffc107);color:#000}.kit-badge.kit-badge--danger{background-color:var(--kit-color-danger, #dc3545);color:#fff}.kit-badge.kit-badge--transparent{background-color:transparent;color:var(--kit-color-transparent-text, var(--kit-text-color-primary, #212529))}.kit-badge.kit-badge--inactive{background-color:transparent}.kit-badge.kit-badge--inactive.kit-badge--primary{background-color:rgba(var(--kit-color-primary-rgb, 0, 102, 204),.08);color:var(--kit-color-primary, #0066cc)}.kit-badge.kit-badge--inactive.kit-badge--secondary{background-color:rgba(var(--kit-color-secondary-rgb, 108, 117, 125),.08);color:var(--kit-color-secondary, #6c757d)}.kit-badge.kit-badge--inactive.kit-badge--success{background-color:rgba(var(--kit-color-success-rgb, 40, 167, 69),.08);color:var(--kit-color-success, #28a745)}.kit-badge.kit-badge--inactive.kit-badge--info{background-color:rgba(var(--kit-color-info-rgb, 23, 162, 184),.08);color:var(--kit-color-info, #17a2b8)}.kit-badge.kit-badge--inactive.kit-badge--warning{background-color:rgba(var(--kit-color-warning-rgb, 255, 193, 7),.08);color:var(--kit-color-warning, #ffc107)}.kit-badge.kit-badge--inactive.kit-badge--danger{background-color:rgba(var(--kit-color-danger-rgb, 220, 53, 69),.08);color:var(--kit-color-danger, #dc3545)}.kit-badge.kit-badge--inactive.kit-badge--transparent{background-color:rgba(var(--kit-color-transparent-text-rgb, 33, 37, 41),.04);color:var(--kit-color-transparent-text, var(--kit-text-color-primary, #212529))}\n"] }]
5190
- }], propDecorators: { color: [{
5191
- type: Input
5192
- }], active: [{
5193
- type: Input
5194
- }], fullWidth: [{
5409
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.4", type: KitTabViewComponent, isStandalone: true, selector: "kit-tab-view", inputs: { tabs: "tabs" }, queries: [{ propertyName: "tabContents", predicate: KitTabContentComponent }], viewQueries: [{ propertyName: "tabHeaderElement", first: true, predicate: ["tabHeader"], descendants: true }], ngImport: i0, template: "<div class=\"kit-tab-view-container\">\n\n <div class=\"kit-tab-header\"\n #tabHeader>\n\n @for (tab of (tabs.length > 0 ? tabs : generatedTabs); track tab) {\n <div\n class=\"kit-tab-item\"\n [class.kit-tab-item--active]=\"tab.active\"\n (click)=\"selectTab(tab.index)\"\n role=\"tab\"\n [attr.aria-selected]=\"tab.active\">\n {{ tab.title }}\n </div>\n }\n\n </div>\n\n <div class=\"kit-tab-content\"\n role=\"tabpanel\">\n <ng-content></ng-content>\n </div>\n\n</div>", styles: [":host{display:block;width:100%;max-width:100%;overflow:hidden;box-sizing:border-box}.kit-tab-view-container{width:100%;max-width:100%;display:flex;flex-direction:column;overflow:hidden;box-sizing:border-box}.kit-tab-header{display:flex;flex-wrap:nowrap;margin-bottom:var(--kit-input-padding, 16px);overflow-x:auto;overflow-y:hidden;scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;width:100%;max-width:100%;box-sizing:border-box;position:relative;scroll-behavior:smooth}.kit-tab-header::-webkit-scrollbar{display:none}.kit-tab-item{padding:12px 16px;cursor:pointer;font-size:var(--kit-font-size-body, 1rem);font-weight:var(--kit-font-weight-body, 400);line-height:var(--kit-line-height-body, 1.5);color:var(--kit-text-color-secondary, #6c757d);background-color:transparent;border:none;border-bottom:2px solid transparent;transition:color .2s ease,background-color .2s ease;position:relative;-webkit-user-select:none;user-select:none;white-space:nowrap;flex-shrink:0}.kit-tab-item:hover{color:var(--kit-color-primary, #0066cc);background-color:#0066cc0d}.kit-tab-item:focus{outline:2px solid var(--kit-color-primary, #0066cc);outline-offset:-2px}.kit-tab-item:after{content:\"\";position:absolute;bottom:-2px;left:50%;width:0;height:2px;background-color:var(--kit-color-primary, #0066cc);transition:width .3s ease,left .3s ease;transform:translate(-50%)}.kit-tab-item--active{color:var(--kit-color-primary, #0066cc);font-weight:var(--kit-font-weight-label, 500);border-bottom-color:transparent}.kit-tab-item--active:after{width:100%}.kit-tab-item--active:hover{background-color:#0066cc1a}.kit-tab-content{flex:1;min-height:0;width:100%;max-width:100%;overflow-x:hidden;box-sizing:border-box}\n"] });
5410
+ }
5411
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: KitTabViewComponent, decorators: [{
5412
+ type: Component,
5413
+ args: [{ selector: 'kit-tab-view', standalone: true, imports: [], template: "<div class=\"kit-tab-view-container\">\n\n <div class=\"kit-tab-header\"\n #tabHeader>\n\n @for (tab of (tabs.length > 0 ? tabs : generatedTabs); track tab) {\n <div\n class=\"kit-tab-item\"\n [class.kit-tab-item--active]=\"tab.active\"\n (click)=\"selectTab(tab.index)\"\n role=\"tab\"\n [attr.aria-selected]=\"tab.active\">\n {{ tab.title }}\n </div>\n }\n\n </div>\n\n <div class=\"kit-tab-content\"\n role=\"tabpanel\">\n <ng-content></ng-content>\n </div>\n\n</div>", styles: [":host{display:block;width:100%;max-width:100%;overflow:hidden;box-sizing:border-box}.kit-tab-view-container{width:100%;max-width:100%;display:flex;flex-direction:column;overflow:hidden;box-sizing:border-box}.kit-tab-header{display:flex;flex-wrap:nowrap;margin-bottom:var(--kit-input-padding, 16px);overflow-x:auto;overflow-y:hidden;scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;width:100%;max-width:100%;box-sizing:border-box;position:relative;scroll-behavior:smooth}.kit-tab-header::-webkit-scrollbar{display:none}.kit-tab-item{padding:12px 16px;cursor:pointer;font-size:var(--kit-font-size-body, 1rem);font-weight:var(--kit-font-weight-body, 400);line-height:var(--kit-line-height-body, 1.5);color:var(--kit-text-color-secondary, #6c757d);background-color:transparent;border:none;border-bottom:2px solid transparent;transition:color .2s ease,background-color .2s ease;position:relative;-webkit-user-select:none;user-select:none;white-space:nowrap;flex-shrink:0}.kit-tab-item:hover{color:var(--kit-color-primary, #0066cc);background-color:#0066cc0d}.kit-tab-item:focus{outline:2px solid var(--kit-color-primary, #0066cc);outline-offset:-2px}.kit-tab-item:after{content:\"\";position:absolute;bottom:-2px;left:50%;width:0;height:2px;background-color:var(--kit-color-primary, #0066cc);transition:width .3s ease,left .3s ease;transform:translate(-50%)}.kit-tab-item--active{color:var(--kit-color-primary, #0066cc);font-weight:var(--kit-font-weight-label, 500);border-bottom-color:transparent}.kit-tab-item--active:after{width:100%}.kit-tab-item--active:hover{background-color:#0066cc1a}.kit-tab-content{flex:1;min-height:0;width:100%;max-width:100%;overflow-x:hidden;box-sizing:border-box}\n"] }]
5414
+ }], propDecorators: { tabContents: [{
5415
+ type: ContentChildren,
5416
+ args: [KitTabContentComponent]
5417
+ }], tabHeaderElement: [{
5418
+ type: ViewChild,
5419
+ args: ['tabHeader']
5420
+ }], tabs: [{
5195
5421
  type: Input
5196
- }], isFullWidth: [{
5197
- type: HostBinding,
5198
- args: ['class.full-width']
5199
5422
  }] } });
5200
5423
 
5201
- class KitPanelModule {
5202
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: KitPanelModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
5203
- static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.4", ngImport: i0, type: KitPanelModule, imports: [KitCardComponent,
5204
- KitBadgeComponent], exports: [KitBadgeComponent,
5205
- KitCardComponent] });
5206
- static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: KitPanelModule });
5424
+ class KitNavigationModule {
5425
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: KitNavigationModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
5426
+ static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.4", ngImport: i0, type: KitNavigationModule, imports: [KitRouterOutletComponent,
5427
+ KitTabViewComponent,
5428
+ KitTabContentComponent], exports: [KitRouterOutletComponent,
5429
+ KitTabViewComponent,
5430
+ KitTabContentComponent] });
5431
+ static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: KitNavigationModule });
5207
5432
  }
5208
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: KitPanelModule, decorators: [{
5433
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: KitNavigationModule, decorators: [{
5209
5434
  type: NgModule,
5210
5435
  args: [{
5211
- declarations: [],
5212
5436
  imports: [
5213
- KitCardComponent,
5214
- KitBadgeComponent
5437
+ KitRouterOutletComponent,
5438
+ KitTabViewComponent,
5439
+ KitTabContentComponent
5215
5440
  ],
5216
5441
  exports: [
5217
- KitBadgeComponent,
5218
- KitCardComponent
5442
+ KitRouterOutletComponent,
5443
+ KitTabViewComponent,
5444
+ KitTabContentComponent
5219
5445
  ]
5220
5446
  }]
5221
5447
  }] });
5222
5448
 
5223
- class KitTextBodyComponent {
5224
- color = '';
5225
- align;
5226
- weight;
5227
- decoration;
5228
- margin;
5229
- wrap = true;
5230
- ellipses = false;
5231
- lines = 0;
5232
- italic = false;
5233
- get colorClass() {
5234
- return this.color ? `kit-text-${this.color}` : '';
5235
- }
5236
- get textStyles() {
5237
- const baseStyles = {
5238
- 'margin': this.margin,
5239
- 'text-align': this.align,
5240
- 'font-weight': this.weight,
5241
- 'text-decoration': this.decoration,
5242
- 'font-style': this.italic ? 'italic' : 'normal'
5243
- };
5244
- if (this.ellipses) {
5245
- if (this.wrap && this.lines > 0) {
5246
- // Multi-line ellipsis
5247
- baseStyles['display'] = '-webkit-box';
5248
- baseStyles['-webkit-line-clamp'] = this.lines;
5249
- baseStyles['-webkit-box-orient'] = 'vertical';
5250
- baseStyles['overflow'] = 'hidden';
5251
- }
5252
- else {
5253
- // Single-line ellipsis
5254
- baseStyles['white-space'] = 'nowrap';
5255
- baseStyles['overflow'] = 'hidden';
5256
- baseStyles['text-overflow'] = 'ellipsis';
5257
- }
5258
- }
5259
- else {
5260
- // Wrapping control
5261
- baseStyles['white-space'] = this.wrap ? 'normal' : 'nowrap';
5262
- }
5263
- return baseStyles;
5264
- }
5265
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: KitTextBodyComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
5266
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.4", type: KitTextBodyComponent, isStandalone: true, selector: "kit-text-body", inputs: { color: "color", align: "align", weight: "weight", decoration: "decoration", margin: "margin", wrap: "wrap", ellipses: "ellipses", lines: "lines", italic: "italic" }, ngImport: i0, template: "<p [ngClass]=\"colorClass\" [ngStyle]=\"textStyles\">\n <ng-content></ng-content>\n</p>", styles: ["p{font-size:var(--kit-font-size-body, 1rem);font-weight:var(--kit-font-weight-body, 400);line-height:var(--kit-line-height-body, 1.5);margin-bottom:1rem;color:var(--kit-text-color-primary, #212529)}.kit-text-primary{color:var(--kit-color-primary, #0066cc)}.kit-text-secondary{color:var(--kit-color-secondary, #6c757d)}.kit-text-success{color:var(--kit-color-success, #28a745)}.kit-text-info{color:var(--kit-color-info, #17a2b8)}.kit-text-warning{color:var(--kit-color-warning, #ffc107)}.kit-text-danger{color:var(--kit-color-danger, #dc3545)}.kit-text-muted{color:var(--kit-text-color-muted, #adb5bd)}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }] });
5267
- }
5268
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: KitTextBodyComponent, decorators: [{
5269
- type: Component,
5270
- args: [{ selector: 'kit-text-body', standalone: true, imports: [NgClass, NgStyle], template: "<p [ngClass]=\"colorClass\" [ngStyle]=\"textStyles\">\n <ng-content></ng-content>\n</p>", styles: ["p{font-size:var(--kit-font-size-body, 1rem);font-weight:var(--kit-font-weight-body, 400);line-height:var(--kit-line-height-body, 1.5);margin-bottom:1rem;color:var(--kit-text-color-primary, #212529)}.kit-text-primary{color:var(--kit-color-primary, #0066cc)}.kit-text-secondary{color:var(--kit-color-secondary, #6c757d)}.kit-text-success{color:var(--kit-color-success, #28a745)}.kit-text-info{color:var(--kit-color-info, #17a2b8)}.kit-text-warning{color:var(--kit-color-warning, #ffc107)}.kit-text-danger{color:var(--kit-color-danger, #dc3545)}.kit-text-muted{color:var(--kit-text-color-muted, #adb5bd)}\n"] }]
5271
- }], propDecorators: { color: [{
5272
- type: Input
5273
- }], align: [{
5274
- type: Input
5275
- }], weight: [{
5276
- type: Input
5277
- }], decoration: [{
5278
- type: Input
5279
- }], margin: [{
5280
- type: Input
5281
- }], wrap: [{
5282
- type: Input
5283
- }], ellipses: [{
5284
- type: Input
5285
- }], lines: [{
5286
- type: Input
5287
- }], italic: [{
5288
- type: Input
5289
- }] } });
5290
-
5291
- class KitTextDisplayComponent {
5292
- color = '';
5293
- align;
5294
- weight;
5295
- decoration;
5296
- margin;
5297
- wrap = true;
5298
- ellipses = false;
5299
- lines = 0;
5300
- italic = false;
5301
- get colorClass() {
5302
- return this.color ? `kit-text-${this.color}` : '';
5449
+ /**
5450
+ * A card component that displays content in an elevated, contained surface.
5451
+ * Cards can be clickable and support different elevation levels.
5452
+ */
5453
+ class KitCardComponent {
5454
+ /**
5455
+ * The elevation level of the card (affects shadow depth)
5456
+ */
5457
+ elevation = 'low';
5458
+ /**
5459
+ * Whether the card is clickable
5460
+ */
5461
+ clickable = false;
5462
+ /**
5463
+ * Whether the card is disabled (only applies to clickable cards)
5464
+ */
5465
+ disabled = false;
5466
+ /**
5467
+ * Whether the card should take up the full width of its container
5468
+ */
5469
+ fullWidth = false;
5470
+ /**
5471
+ * Whether the card should take up the full height of its container
5472
+ */
5473
+ fullHeight = false;
5474
+ /**
5475
+ * Emitted when the card is clicked (only for clickable cards)
5476
+ */
5477
+ clicked = new EventEmitter();
5478
+ /**
5479
+ * Apply the clickable class to the host element when clickable is true
5480
+ */
5481
+ get isClickable() {
5482
+ return this.clickable && !this.disabled;
5303
5483
  }
5304
- get textStyles() {
5305
- const baseStyles = {
5306
- 'margin': this.margin,
5307
- 'text-align': this.align,
5308
- 'font-weight': this.weight,
5309
- 'text-decoration': this.decoration,
5310
- 'font-style': this.italic ? 'italic' : 'normal'
5311
- };
5312
- if (this.ellipses) {
5313
- if (this.wrap && this.lines > 0) {
5314
- // Multi-line ellipsis
5315
- baseStyles['display'] = '-webkit-box';
5316
- baseStyles['-webkit-line-clamp'] = this.lines;
5317
- baseStyles['-webkit-box-orient'] = 'vertical';
5318
- baseStyles['overflow'] = 'hidden';
5319
- }
5320
- else {
5321
- // Single-line ellipsis
5322
- baseStyles['white-space'] = 'nowrap';
5323
- baseStyles['overflow'] = 'hidden';
5324
- baseStyles['text-overflow'] = 'ellipsis';
5325
- }
5326
- }
5327
- else {
5328
- // Wrapping control
5329
- baseStyles['white-space'] = this.wrap ? 'normal' : 'nowrap';
5330
- }
5331
- return baseStyles;
5484
+ /**
5485
+ * Apply the full-width class to the host element when fullWidth is true
5486
+ */
5487
+ get isFullWidth() {
5488
+ return this.fullWidth;
5332
5489
  }
5333
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: KitTextDisplayComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
5334
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.4", type: KitTextDisplayComponent, isStandalone: true, selector: "kit-text-display", inputs: { color: "color", align: "align", weight: "weight", decoration: "decoration", margin: "margin", wrap: "wrap", ellipses: "ellipses", lines: "lines", italic: "italic" }, ngImport: i0, template: "<h3 [ngClass]=\"colorClass\" [ngStyle]=\"textStyles\">\n <ng-content></ng-content>\n</h3>", styles: ["h3{font-size:var(--kit-font-size-display, 3rem);font-weight:var(--kit-font-weight-display, bold);line-height:var(--kit-line-height-display, 1.3);margin-bottom:.5rem;color:var(--kit-text-color-primary, #212529)}.kit-text-primary{color:var(--kit-color-primary, #0066cc)}.kit-text-secondary{color:var(--kit-color-secondary, #6c757d)}.kit-text-success{color:var(--kit-color-success, #28a745)}.kit-text-warning{color:var(--kit-color-warning, #ffc107)}.kit-text-danger{color:var(--kit-color-danger, #dc3545)}.kit-text-muted{color:var(--kit-text-color-muted, #adb5bd)}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }] });
5335
- }
5336
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: KitTextDisplayComponent, decorators: [{
5337
- type: Component,
5338
- args: [{ selector: 'kit-text-display', standalone: true, imports: [NgClass, NgStyle], template: "<h3 [ngClass]=\"colorClass\" [ngStyle]=\"textStyles\">\n <ng-content></ng-content>\n</h3>", styles: ["h3{font-size:var(--kit-font-size-display, 3rem);font-weight:var(--kit-font-weight-display, bold);line-height:var(--kit-line-height-display, 1.3);margin-bottom:.5rem;color:var(--kit-text-color-primary, #212529)}.kit-text-primary{color:var(--kit-color-primary, #0066cc)}.kit-text-secondary{color:var(--kit-color-secondary, #6c757d)}.kit-text-success{color:var(--kit-color-success, #28a745)}.kit-text-warning{color:var(--kit-color-warning, #ffc107)}.kit-text-danger{color:var(--kit-color-danger, #dc3545)}.kit-text-muted{color:var(--kit-text-color-muted, #adb5bd)}\n"] }]
5339
- }], propDecorators: { color: [{
5340
- type: Input
5341
- }], align: [{
5342
- type: Input
5343
- }], weight: [{
5344
- type: Input
5345
- }], decoration: [{
5346
- type: Input
5347
- }], margin: [{
5348
- type: Input
5349
- }], wrap: [{
5350
- type: Input
5351
- }], ellipses: [{
5352
- type: Input
5353
- }], lines: [{
5354
- type: Input
5355
- }], italic: [{
5356
- type: Input
5357
- }] } });
5358
-
5359
- class KitTextHeadingComponent {
5360
- color = '';
5361
- align;
5362
- weight;
5363
- decoration;
5364
- margin;
5365
- wrap = true;
5366
- ellipses = false;
5367
- lines = 0;
5368
- italic = false;
5369
- get colorClass() {
5370
- return this.color ? `kit-text-${this.color}` : '';
5490
+ /**
5491
+ * Apply the full-height class to the host element when fullHeight is true
5492
+ */
5493
+ get isFullHeight() {
5494
+ return this.fullHeight;
5371
5495
  }
5372
- get textStyles() {
5373
- const baseStyles = {
5374
- 'margin': this.margin,
5375
- 'text-align': this.align,
5376
- 'font-weight': this.weight,
5377
- 'text-decoration': this.decoration,
5378
- 'font-style': this.italic ? 'italic' : 'normal'
5379
- };
5380
- if (this.ellipses) {
5381
- if (this.wrap && this.lines > 0) {
5382
- // Multi-line ellipsis
5383
- baseStyles['display'] = '-webkit-box';
5384
- baseStyles['-webkit-line-clamp'] = this.lines;
5385
- baseStyles['-webkit-box-orient'] = 'vertical';
5386
- baseStyles['overflow'] = 'hidden';
5387
- }
5388
- else {
5389
- // Single-line ellipsis
5390
- baseStyles['white-space'] = 'nowrap';
5391
- baseStyles['overflow'] = 'hidden';
5392
- baseStyles['text-overflow'] = 'ellipsis';
5393
- }
5496
+ /**
5497
+ * Classes to apply to the card element
5498
+ */
5499
+ get cardClasses() {
5500
+ const classes = ['kit-card'];
5501
+ // Add elevation class
5502
+ classes.push(`kit-card--${this.elevation}`);
5503
+ // Add clickable class if needed
5504
+ if (this.clickable) {
5505
+ classes.push('kit-card--clickable');
5394
5506
  }
5395
- else {
5396
- // Wrapping control
5397
- baseStyles['white-space'] = this.wrap ? 'normal' : 'nowrap';
5507
+ // Add disabled class if needed
5508
+ if (this.disabled && this.clickable) {
5509
+ classes.push('kit-card--disabled');
5398
5510
  }
5399
- return baseStyles;
5400
- }
5401
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: KitTextHeadingComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
5402
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.4", type: KitTextHeadingComponent, isStandalone: true, selector: "kit-text-heading", inputs: { color: "color", align: "align", weight: "weight", decoration: "decoration", margin: "margin", wrap: "wrap", ellipses: "ellipses", lines: "lines", italic: "italic" }, ngImport: i0, template: "<h1 [ngClass]=\"colorClass\" [ngStyle]=\"textStyles\">\n <ng-content></ng-content>\n</h1>", styles: ["h1{font-size:var(--kit-font-size-heading, 2rem);font-weight:var(--kit-font-weight-heading, 700);line-height:var(--kit-line-height-heading, 1.2);margin-bottom:1rem;color:var(--kit-text-color-primary, #212529)}.kit-text-primary{color:var(--kit-color-primary, #0066cc)}.kit-text-secondary{color:var(--kit-color-secondary, #6c757d)}.kit-text-success{color:var(--kit-color-success, #28a745)}.kit-text-warning{color:var(--kit-color-warning, #ffc107)}.kit-text-danger{color:var(--kit-color-danger, #dc3545)}.kit-text-muted{color:var(--kit-text-color-muted, #adb5bd)}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }] });
5403
- }
5404
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: KitTextHeadingComponent, decorators: [{
5405
- type: Component,
5406
- args: [{ selector: 'kit-text-heading', standalone: true, imports: [NgClass, NgStyle], template: "<h1 [ngClass]=\"colorClass\" [ngStyle]=\"textStyles\">\n <ng-content></ng-content>\n</h1>", styles: ["h1{font-size:var(--kit-font-size-heading, 2rem);font-weight:var(--kit-font-weight-heading, 700);line-height:var(--kit-line-height-heading, 1.2);margin-bottom:1rem;color:var(--kit-text-color-primary, #212529)}.kit-text-primary{color:var(--kit-color-primary, #0066cc)}.kit-text-secondary{color:var(--kit-color-secondary, #6c757d)}.kit-text-success{color:var(--kit-color-success, #28a745)}.kit-text-warning{color:var(--kit-color-warning, #ffc107)}.kit-text-danger{color:var(--kit-color-danger, #dc3545)}.kit-text-muted{color:var(--kit-text-color-muted, #adb5bd)}\n"] }]
5407
- }], propDecorators: { color: [{
5408
- type: Input
5409
- }], align: [{
5410
- type: Input
5411
- }], weight: [{
5412
- type: Input
5413
- }], decoration: [{
5414
- type: Input
5415
- }], margin: [{
5416
- type: Input
5417
- }], wrap: [{
5418
- type: Input
5419
- }], ellipses: [{
5420
- type: Input
5421
- }], lines: [{
5422
- type: Input
5423
- }], italic: [{
5424
- type: Input
5425
- }] } });
5426
-
5427
- class KitTextLinkComponent {
5428
- color = '';
5429
- href = '#';
5430
- target = '_self';
5431
- align;
5432
- weight;
5433
- decoration;
5434
- margin;
5435
- wrap = true;
5436
- ellipses = false;
5437
- lines = 0;
5438
- italic = false;
5439
- get colorClass() {
5440
- return this.color ? `kit-text-${this.color}` : '';
5441
- }
5442
- get textStyles() {
5443
- const baseStyles = {
5444
- 'margin': this.margin,
5445
- 'text-align': this.align,
5446
- 'font-weight': this.weight,
5447
- 'text-decoration': this.decoration,
5448
- 'font-style': this.italic ? 'italic' : 'normal'
5449
- };
5450
- if (this.ellipses) {
5451
- if (this.wrap && this.lines > 0) {
5452
- // Multi-line ellipsis
5453
- baseStyles['display'] = '-webkit-box';
5454
- baseStyles['-webkit-line-clamp'] = this.lines;
5455
- baseStyles['-webkit-box-orient'] = 'vertical';
5456
- baseStyles['overflow'] = 'hidden';
5457
- }
5458
- else {
5459
- // Single-line ellipsis
5460
- baseStyles['white-space'] = 'nowrap';
5461
- baseStyles['overflow'] = 'hidden';
5462
- baseStyles['text-overflow'] = 'ellipsis';
5463
- }
5511
+ // Add full width class if needed
5512
+ if (this.fullWidth) {
5513
+ classes.push('kit-card--full-width');
5464
5514
  }
5465
- else {
5466
- // Wrapping control
5467
- baseStyles['white-space'] = this.wrap ? 'normal' : 'nowrap';
5515
+ return classes;
5516
+ }
5517
+ /**
5518
+ * Handle card click
5519
+ */
5520
+ handleClick(event) {
5521
+ if (this.clickable && !this.disabled) {
5522
+ this.clicked.emit(event);
5468
5523
  }
5469
- return baseStyles;
5470
5524
  }
5471
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: KitTextLinkComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
5472
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.4", type: KitTextLinkComponent, isStandalone: true, selector: "kit-text-link", inputs: { color: "color", href: "href", target: "target", align: "align", weight: "weight", decoration: "decoration", margin: "margin", wrap: "wrap", ellipses: "ellipses", lines: "lines", italic: "italic" }, ngImport: i0, template: "<a [ngClass]=\"colorClass\" [href]=\"href\" [target]=\"target\" [ngStyle]=\"textStyles\">\n <ng-content></ng-content>\n</a>", styles: ["a{font-size:var(--kit-font-size-link, 1rem);font-weight:var(--kit-font-weight-link, 400);line-height:var(--kit-line-height-link, 1.5);text-decoration:underline;cursor:pointer;color:var(--kit-color-primary, #0066cc)}a:hover{opacity:.85}.kit-text-primary{color:var(--kit-color-primary, #0066cc)}.kit-text-secondary{color:var(--kit-color-secondary, #6c757d)}.kit-text-success{color:var(--kit-color-success, #28a745)}.kit-text-warning{color:var(--kit-color-warning, #ffc107)}.kit-text-danger{color:var(--kit-color-danger, #dc3545)}.kit-text-muted{color:var(--kit-text-color-muted, #adb5bd)}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }] });
5525
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: KitCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
5526
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.4", type: KitCardComponent, isStandalone: true, selector: "kit-card", inputs: { elevation: "elevation", clickable: "clickable", disabled: "disabled", fullWidth: "fullWidth", fullHeight: "fullHeight" }, outputs: { clicked: "clicked" }, host: { properties: { "class.clickable": "this.isClickable", "class.full-width": "this.isFullWidth", "class.full-height": "this.isFullHeight" } }, ngImport: i0, template: "<div [ngClass]=\"cardClasses\"\n [attr.role]=\"clickable ? 'button' : null\"\n [attr.tabindex]=\"clickable && !disabled ? '0' : null\"\n [attr.aria-disabled]=\"clickable && disabled ? 'true' : null\"\n (click)=\"handleClick($event)\">\n\n <div class=\"kit-card__content\">\n <ng-content></ng-content>\n </div>\n</div>", styles: [":host{display:inline-block;min-width:0}:host.full-width{display:block;width:100%}:host.full-width .kit-card{width:100%}:host.full-height{display:block;height:100%}:host.full-height .kit-card{height:100%}:host.full-height .kit-card .kit-card__content{display:flex;flex-direction:column;flex:1 1 auto;min-height:0}:host.clickable{cursor:pointer}.kit-card{position:relative;display:flex;flex-direction:column;background-color:var(--kit-card-background-color, #ffffff);border-radius:var(--kit-card-border-radius, 16px);transition:box-shadow .2s ease,transform .1s ease;overflow:hidden;box-sizing:border-box;border:var(--kit-card-border-width, 1px) solid var(--kit-card-border-color, transparent)}.kit-card .kit-card__content{display:flex;flex-direction:column;width:100%;min-width:0;padding:var(--kit-card-padding, 16px);box-sizing:border-box}.kit-card.kit-card--none{box-shadow:none}.kit-card.kit-card--low{box-shadow:var(--kit-card-shadow-low, 0 1px 3px rgba(0, 0, 0, .12), 0 1px 2px rgba(0, 0, 0, .24))}.kit-card.kit-card--medium{box-shadow:var(--kit-card-shadow-medium, 0 3px 6px rgba(0, 0, 0, .16), 0 3px 6px rgba(0, 0, 0, .23))}.kit-card.kit-card--high{box-shadow:var(--kit-card-shadow-high, 0 10px 20px rgba(0, 0, 0, .19), 0 6px 6px rgba(0, 0, 0, .23))}.kit-card.kit-card--clickable{cursor:pointer;-webkit-user-select:none;user-select:none}.kit-card.kit-card--clickable:hover:not(.kit-card--disabled){transform:var(--kit-card-hover-transform, translateY(-2px));box-shadow:var(--kit-card-hover-shadow, 0 4px 8px rgba(0, 0, 0, .16), 0 4px 8px rgba(0, 0, 0, .23))}.kit-card.kit-card--clickable:active:not(.kit-card--disabled){transform:var(--kit-card-active-transform, translateY(0));box-shadow:var(--kit-card-active-shadow, 0 2px 4px rgba(0, 0, 0, .12), 0 2px 4px rgba(0, 0, 0, .24))}.kit-card.kit-card--clickable:focus:not(.kit-card--disabled){outline:none;box-shadow:var(--kit-card-focus-shadow, 0 0 0 3px rgba(var(--kit-color-primary-rgb, 0, 102, 204), .2))}.kit-card.kit-card--disabled{cursor:not-allowed;opacity:var(--kit-card-disabled-opacity, .6);pointer-events:none}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
5473
5527
  }
5474
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: KitTextLinkComponent, decorators: [{
5528
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: KitCardComponent, decorators: [{
5475
5529
  type: Component,
5476
- args: [{ selector: 'kit-text-link', standalone: true, imports: [NgClass, NgStyle], template: "<a [ngClass]=\"colorClass\" [href]=\"href\" [target]=\"target\" [ngStyle]=\"textStyles\">\n <ng-content></ng-content>\n</a>", styles: ["a{font-size:var(--kit-font-size-link, 1rem);font-weight:var(--kit-font-weight-link, 400);line-height:var(--kit-line-height-link, 1.5);text-decoration:underline;cursor:pointer;color:var(--kit-color-primary, #0066cc)}a:hover{opacity:.85}.kit-text-primary{color:var(--kit-color-primary, #0066cc)}.kit-text-secondary{color:var(--kit-color-secondary, #6c757d)}.kit-text-success{color:var(--kit-color-success, #28a745)}.kit-text-warning{color:var(--kit-color-warning, #ffc107)}.kit-text-danger{color:var(--kit-color-danger, #dc3545)}.kit-text-muted{color:var(--kit-text-color-muted, #adb5bd)}\n"] }]
5477
- }], propDecorators: { color: [{
5478
- type: Input
5479
- }], href: [{
5480
- type: Input
5481
- }], target: [{
5482
- type: Input
5483
- }], align: [{
5484
- type: Input
5485
- }], weight: [{
5486
- type: Input
5487
- }], decoration: [{
5488
- type: Input
5489
- }], margin: [{
5530
+ args: [{ selector: 'kit-card', standalone: true, imports: [NgClass], template: "<div [ngClass]=\"cardClasses\"\n [attr.role]=\"clickable ? 'button' : null\"\n [attr.tabindex]=\"clickable && !disabled ? '0' : null\"\n [attr.aria-disabled]=\"clickable && disabled ? 'true' : null\"\n (click)=\"handleClick($event)\">\n\n <div class=\"kit-card__content\">\n <ng-content></ng-content>\n </div>\n</div>", styles: [":host{display:inline-block;min-width:0}:host.full-width{display:block;width:100%}:host.full-width .kit-card{width:100%}:host.full-height{display:block;height:100%}:host.full-height .kit-card{height:100%}:host.full-height .kit-card .kit-card__content{display:flex;flex-direction:column;flex:1 1 auto;min-height:0}:host.clickable{cursor:pointer}.kit-card{position:relative;display:flex;flex-direction:column;background-color:var(--kit-card-background-color, #ffffff);border-radius:var(--kit-card-border-radius, 16px);transition:box-shadow .2s ease,transform .1s ease;overflow:hidden;box-sizing:border-box;border:var(--kit-card-border-width, 1px) solid var(--kit-card-border-color, transparent)}.kit-card .kit-card__content{display:flex;flex-direction:column;width:100%;min-width:0;padding:var(--kit-card-padding, 16px);box-sizing:border-box}.kit-card.kit-card--none{box-shadow:none}.kit-card.kit-card--low{box-shadow:var(--kit-card-shadow-low, 0 1px 3px rgba(0, 0, 0, .12), 0 1px 2px rgba(0, 0, 0, .24))}.kit-card.kit-card--medium{box-shadow:var(--kit-card-shadow-medium, 0 3px 6px rgba(0, 0, 0, .16), 0 3px 6px rgba(0, 0, 0, .23))}.kit-card.kit-card--high{box-shadow:var(--kit-card-shadow-high, 0 10px 20px rgba(0, 0, 0, .19), 0 6px 6px rgba(0, 0, 0, .23))}.kit-card.kit-card--clickable{cursor:pointer;-webkit-user-select:none;user-select:none}.kit-card.kit-card--clickable:hover:not(.kit-card--disabled){transform:var(--kit-card-hover-transform, translateY(-2px));box-shadow:var(--kit-card-hover-shadow, 0 4px 8px rgba(0, 0, 0, .16), 0 4px 8px rgba(0, 0, 0, .23))}.kit-card.kit-card--clickable:active:not(.kit-card--disabled){transform:var(--kit-card-active-transform, translateY(0));box-shadow:var(--kit-card-active-shadow, 0 2px 4px rgba(0, 0, 0, .12), 0 2px 4px rgba(0, 0, 0, .24))}.kit-card.kit-card--clickable:focus:not(.kit-card--disabled){outline:none;box-shadow:var(--kit-card-focus-shadow, 0 0 0 3px rgba(var(--kit-color-primary-rgb, 0, 102, 204), .2))}.kit-card.kit-card--disabled{cursor:not-allowed;opacity:var(--kit-card-disabled-opacity, .6);pointer-events:none}\n"] }]
5531
+ }], propDecorators: { elevation: [{
5490
5532
  type: Input
5491
- }], wrap: [{
5533
+ }], clickable: [{
5492
5534
  type: Input
5493
- }], ellipses: [{
5535
+ }], disabled: [{
5494
5536
  type: Input
5495
- }], lines: [{
5537
+ }], fullWidth: [{
5496
5538
  type: Input
5497
- }], italic: [{
5539
+ }], fullHeight: [{
5498
5540
  type: Input
5541
+ }], clicked: [{
5542
+ type: Output
5543
+ }], isClickable: [{
5544
+ type: HostBinding,
5545
+ args: ['class.clickable']
5546
+ }], isFullWidth: [{
5547
+ type: HostBinding,
5548
+ args: ['class.full-width']
5549
+ }], isFullHeight: [{
5550
+ type: HostBinding,
5551
+ args: ['class.full-height']
5499
5552
  }] } });
5500
5553
 
5501
- class KitTextSubheadingComponent {
5502
- color = '';
5503
- align;
5504
- weight;
5505
- decoration;
5506
- margin;
5507
- wrap = true;
5508
- ellipses = false;
5509
- lines = 0;
5510
- italic = false;
5511
- get colorClass() {
5512
- return this.color ? `kit-text-${this.color}` : '';
5554
+ class KitBadgeComponent {
5555
+ color = 'primary';
5556
+ active = true;
5557
+ fullWidth = false;
5558
+ get isFullWidth() {
5559
+ return this.fullWidth;
5513
5560
  }
5514
- get textStyles() {
5515
- const baseStyles = {
5516
- 'margin': this.margin,
5517
- 'text-align': this.align,
5518
- 'font-weight': this.weight,
5519
- 'text-decoration': this.decoration,
5520
- 'font-style': this.italic ? 'italic' : 'normal'
5521
- };
5522
- if (this.ellipses) {
5523
- if (this.wrap && this.lines > 0) {
5524
- // Multi-line ellipsis
5525
- baseStyles['display'] = '-webkit-box';
5526
- baseStyles['-webkit-line-clamp'] = this.lines;
5527
- baseStyles['-webkit-box-orient'] = 'vertical';
5528
- baseStyles['overflow'] = 'hidden';
5529
- }
5530
- else {
5531
- // Single-line ellipsis
5532
- baseStyles['white-space'] = 'nowrap';
5533
- baseStyles['overflow'] = 'hidden';
5534
- baseStyles['text-overflow'] = 'ellipsis';
5535
- }
5561
+ get badgeClasses() {
5562
+ const classes = ['kit-badge'];
5563
+ classes.push(`kit-badge--${this.color}`);
5564
+ if (!this.active) {
5565
+ classes.push('kit-badge--inactive');
5536
5566
  }
5537
- else {
5538
- // Wrapping control
5539
- baseStyles['white-space'] = this.wrap ? 'normal' : 'nowrap';
5567
+ if (this.fullWidth) {
5568
+ classes.push('kit-badge--full-width');
5540
5569
  }
5541
- return baseStyles;
5570
+ return classes;
5542
5571
  }
5543
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: KitTextSubheadingComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
5544
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.4", type: KitTextSubheadingComponent, isStandalone: true, selector: "kit-text-subheading", inputs: { color: "color", align: "align", weight: "weight", decoration: "decoration", margin: "margin", wrap: "wrap", ellipses: "ellipses", lines: "lines", italic: "italic" }, ngImport: i0, template: "<h2 [ngClass]=\"colorClass\" [ngStyle]=\"textStyles\">\n <ng-content></ng-content>\n</h2>", styles: ["h2{font-size:var(--kit-font-size-subheading, 1.5rem);font-weight:var(--kit-font-weight-subheading, 500);line-height:var(--kit-line-height-subheading, 1.2);margin-bottom:.75rem;color:var(--kit-text-color-primary, #212529)}.kit-text-primary{color:var(--kit-color-primary, #0066cc)}.kit-text-secondary{color:var(--kit-color-secondary, #6c757d)}.kit-text-success{color:var(--kit-color-success, #28a745)}.kit-text-warning{color:var(--kit-color-warning, #ffc107)}.kit-text-danger{color:var(--kit-color-danger, #dc3545)}.kit-text-muted{color:var(--kit-text-color-muted, #adb5bd)}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }] });
5572
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: KitBadgeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
5573
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.4", type: KitBadgeComponent, isStandalone: true, selector: "kit-badge", inputs: { color: "color", active: "active", fullWidth: "fullWidth" }, host: { properties: { "class.full-width": "this.isFullWidth" } }, ngImport: i0, template: "\n<div [ngClass]=\"badgeClasses\">\n <ng-content></ng-content>\n</div>\n", styles: [":host{display:inline-block}:host.full-width{width:100%}.kit-badge{display:inline-flex;align-items:center;justify-content:center;border-radius:var(--kit-badge-border-radius, 12px);font-weight:var(--kit-badge-font-weight, 700);padding:var(--kit-badge-padding, 6px 12px);font-size:var(--kit-badge-font-size, 12px);line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline}.kit-badge.kit-badge--full-width{width:100%}.kit-badge.kit-badge--primary{background-color:var(--kit-color-primary, #0066cc);color:#fff}.kit-badge.kit-badge--secondary{background-color:var(--kit-color-secondary, #6c757d);color:#fff}.kit-badge.kit-badge--success{background-color:var(--kit-color-success, #28a745);color:#fff}.kit-badge.kit-badge--info{background-color:var(--kit-color-info, #17a2b8);color:#fff}.kit-badge.kit-badge--warning{background-color:var(--kit-color-warning, #ffc107);color:#000}.kit-badge.kit-badge--danger{background-color:var(--kit-color-danger, #dc3545);color:#fff}.kit-badge.kit-badge--transparent{background-color:transparent;color:var(--kit-color-transparent-text, var(--kit-text-color-primary, #212529))}.kit-badge.kit-badge--inactive{background-color:transparent}.kit-badge.kit-badge--inactive.kit-badge--primary{background-color:rgba(var(--kit-color-primary-rgb, 0, 102, 204),.08);color:var(--kit-color-primary, #0066cc)}.kit-badge.kit-badge--inactive.kit-badge--secondary{background-color:rgba(var(--kit-color-secondary-rgb, 108, 117, 125),.08);color:var(--kit-color-secondary, #6c757d)}.kit-badge.kit-badge--inactive.kit-badge--success{background-color:rgba(var(--kit-color-success-rgb, 40, 167, 69),.08);color:var(--kit-color-success, #28a745)}.kit-badge.kit-badge--inactive.kit-badge--info{background-color:rgba(var(--kit-color-info-rgb, 23, 162, 184),.08);color:var(--kit-color-info, #17a2b8)}.kit-badge.kit-badge--inactive.kit-badge--warning{background-color:rgba(var(--kit-color-warning-rgb, 255, 193, 7),.08);color:var(--kit-color-warning, #ffc107)}.kit-badge.kit-badge--inactive.kit-badge--danger{background-color:rgba(var(--kit-color-danger-rgb, 220, 53, 69),.08);color:var(--kit-color-danger, #dc3545)}.kit-badge.kit-badge--inactive.kit-badge--transparent{background-color:rgba(var(--kit-color-transparent-text-rgb, 33, 37, 41),.04);color:var(--kit-color-transparent-text, var(--kit-text-color-primary, #212529))}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
5545
5574
  }
5546
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: KitTextSubheadingComponent, decorators: [{
5575
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: KitBadgeComponent, decorators: [{
5547
5576
  type: Component,
5548
- args: [{ selector: 'kit-text-subheading', standalone: true, imports: [NgClass, NgStyle], template: "<h2 [ngClass]=\"colorClass\" [ngStyle]=\"textStyles\">\n <ng-content></ng-content>\n</h2>", styles: ["h2{font-size:var(--kit-font-size-subheading, 1.5rem);font-weight:var(--kit-font-weight-subheading, 500);line-height:var(--kit-line-height-subheading, 1.2);margin-bottom:.75rem;color:var(--kit-text-color-primary, #212529)}.kit-text-primary{color:var(--kit-color-primary, #0066cc)}.kit-text-secondary{color:var(--kit-color-secondary, #6c757d)}.kit-text-success{color:var(--kit-color-success, #28a745)}.kit-text-warning{color:var(--kit-color-warning, #ffc107)}.kit-text-danger{color:var(--kit-color-danger, #dc3545)}.kit-text-muted{color:var(--kit-text-color-muted, #adb5bd)}\n"] }]
5577
+ args: [{ selector: 'kit-badge', standalone: true, imports: [NgClass], template: "\n<div [ngClass]=\"badgeClasses\">\n <ng-content></ng-content>\n</div>\n", styles: [":host{display:inline-block}:host.full-width{width:100%}.kit-badge{display:inline-flex;align-items:center;justify-content:center;border-radius:var(--kit-badge-border-radius, 12px);font-weight:var(--kit-badge-font-weight, 700);padding:var(--kit-badge-padding, 6px 12px);font-size:var(--kit-badge-font-size, 12px);line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline}.kit-badge.kit-badge--full-width{width:100%}.kit-badge.kit-badge--primary{background-color:var(--kit-color-primary, #0066cc);color:#fff}.kit-badge.kit-badge--secondary{background-color:var(--kit-color-secondary, #6c757d);color:#fff}.kit-badge.kit-badge--success{background-color:var(--kit-color-success, #28a745);color:#fff}.kit-badge.kit-badge--info{background-color:var(--kit-color-info, #17a2b8);color:#fff}.kit-badge.kit-badge--warning{background-color:var(--kit-color-warning, #ffc107);color:#000}.kit-badge.kit-badge--danger{background-color:var(--kit-color-danger, #dc3545);color:#fff}.kit-badge.kit-badge--transparent{background-color:transparent;color:var(--kit-color-transparent-text, var(--kit-text-color-primary, #212529))}.kit-badge.kit-badge--inactive{background-color:transparent}.kit-badge.kit-badge--inactive.kit-badge--primary{background-color:rgba(var(--kit-color-primary-rgb, 0, 102, 204),.08);color:var(--kit-color-primary, #0066cc)}.kit-badge.kit-badge--inactive.kit-badge--secondary{background-color:rgba(var(--kit-color-secondary-rgb, 108, 117, 125),.08);color:var(--kit-color-secondary, #6c757d)}.kit-badge.kit-badge--inactive.kit-badge--success{background-color:rgba(var(--kit-color-success-rgb, 40, 167, 69),.08);color:var(--kit-color-success, #28a745)}.kit-badge.kit-badge--inactive.kit-badge--info{background-color:rgba(var(--kit-color-info-rgb, 23, 162, 184),.08);color:var(--kit-color-info, #17a2b8)}.kit-badge.kit-badge--inactive.kit-badge--warning{background-color:rgba(var(--kit-color-warning-rgb, 255, 193, 7),.08);color:var(--kit-color-warning, #ffc107)}.kit-badge.kit-badge--inactive.kit-badge--danger{background-color:rgba(var(--kit-color-danger-rgb, 220, 53, 69),.08);color:var(--kit-color-danger, #dc3545)}.kit-badge.kit-badge--inactive.kit-badge--transparent{background-color:rgba(var(--kit-color-transparent-text-rgb, 33, 37, 41),.04);color:var(--kit-color-transparent-text, var(--kit-text-color-primary, #212529))}\n"] }]
5549
5578
  }], propDecorators: { color: [{
5550
5579
  type: Input
5551
- }], align: [{
5552
- type: Input
5553
- }], weight: [{
5554
- type: Input
5555
- }], decoration: [{
5556
- type: Input
5557
- }], margin: [{
5558
- type: Input
5559
- }], wrap: [{
5560
- type: Input
5561
- }], ellipses: [{
5562
- type: Input
5563
- }], lines: [{
5580
+ }], active: [{
5564
5581
  type: Input
5565
- }], italic: [{
5582
+ }], fullWidth: [{
5566
5583
  type: Input
5584
+ }], isFullWidth: [{
5585
+ type: HostBinding,
5586
+ args: ['class.full-width']
5567
5587
  }] } });
5568
5588
 
5569
- class KitTextModule {
5570
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: KitTextModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
5571
- static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.4", ngImport: i0, type: KitTextModule, imports: [KitTextHeadingComponent,
5572
- KitTextSubheadingComponent,
5573
- KitTextDisplayComponent,
5574
- KitTextLabelComponent,
5575
- KitTextBodyComponent,
5576
- KitTextCaptionComponent,
5577
- KitTextLinkComponent], exports: [KitTextHeadingComponent,
5578
- KitTextSubheadingComponent,
5579
- KitTextDisplayComponent,
5580
- KitTextLabelComponent,
5581
- KitTextBodyComponent,
5582
- KitTextCaptionComponent,
5583
- KitTextLinkComponent] });
5584
- static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: KitTextModule });
5589
+ class KitPanelModule {
5590
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: KitPanelModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
5591
+ static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.4", ngImport: i0, type: KitPanelModule, imports: [KitCardComponent,
5592
+ KitBadgeComponent], exports: [KitBadgeComponent,
5593
+ KitCardComponent] });
5594
+ static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: KitPanelModule });
5585
5595
  }
5586
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: KitTextModule, decorators: [{
5596
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: KitPanelModule, decorators: [{
5587
5597
  type: NgModule,
5588
5598
  args: [{
5589
5599
  declarations: [],
5590
5600
  imports: [
5591
- KitTextHeadingComponent,
5592
- KitTextSubheadingComponent,
5593
- KitTextDisplayComponent,
5594
- KitTextLabelComponent,
5595
- KitTextBodyComponent,
5596
- KitTextCaptionComponent,
5597
- KitTextLinkComponent,
5601
+ KitCardComponent,
5602
+ KitBadgeComponent
5598
5603
  ],
5599
5604
  exports: [
5600
- KitTextHeadingComponent,
5601
- KitTextSubheadingComponent,
5602
- KitTextDisplayComponent,
5603
- KitTextLabelComponent,
5604
- KitTextBodyComponent,
5605
- KitTextCaptionComponent,
5606
- KitTextLinkComponent,
5605
+ KitBadgeComponent,
5606
+ KitCardComponent
5607
5607
  ]
5608
5608
  }]
5609
5609
  }] });