@schenkerjon/ng-govbr-tw 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/README.md +24 -0
  2. package/esm2022/lib/components/badge/br-badge.component.mjs +42 -0
  3. package/esm2022/lib/components/button/br-button.component.mjs +93 -0
  4. package/esm2022/lib/components/card/br-card.component.mjs +65 -0
  5. package/esm2022/lib/components/footer/br-footer.component.mjs +56 -0
  6. package/esm2022/lib/components/header/br-header.component.mjs +133 -0
  7. package/esm2022/lib/components/input/br-input.component.mjs +219 -0
  8. package/esm2022/lib/components/layout/br-layout.component.mjs +54 -0
  9. package/esm2022/lib/components/menu/br-menu-item.component.mjs +49 -0
  10. package/esm2022/lib/components/menu/br-menu.component.mjs +26 -0
  11. package/esm2022/lib/components/message/br-message.component.mjs +90 -0
  12. package/esm2022/lib/components/table/br-table.component.mjs +143 -0
  13. package/esm2022/public-api.mjs +16 -0
  14. package/esm2022/schenkerjon-ng-govbr-tw.mjs +5 -0
  15. package/fesm2022/schenkerjon-ng-govbr-tw.mjs +943 -0
  16. package/fesm2022/schenkerjon-ng-govbr-tw.mjs.map +1 -0
  17. package/index.d.ts +5 -0
  18. package/lib/components/badge/br-badge.component.d.ts +7 -0
  19. package/lib/components/button/br-button.component.d.ts +17 -0
  20. package/lib/components/card/br-card.component.d.ts +8 -0
  21. package/lib/components/footer/br-footer.component.d.ts +6 -0
  22. package/lib/components/header/br-header.component.d.ts +13 -0
  23. package/lib/components/input/br-input.component.d.ts +28 -0
  24. package/lib/components/layout/br-layout.component.d.ts +5 -0
  25. package/lib/components/menu/br-menu-item.component.d.ts +8 -0
  26. package/lib/components/menu/br-menu.component.d.ts +5 -0
  27. package/lib/components/message/br-message.component.d.ts +13 -0
  28. package/lib/components/table/br-table.component.d.ts +12 -0
  29. package/package.json +43 -0
  30. package/public-api.d.ts +11 -0
  31. package/src/lib/styles/govbr-tw.css +71 -0
  32. package/tailwind.preset.js +54 -0
@@ -0,0 +1,943 @@
1
+ import * as i0 from '@angular/core';
2
+ import { EventEmitter, Output, Input, ViewEncapsulation, Component, forwardRef, ContentChild } from '@angular/core';
3
+ import * as i1 from '@angular/common';
4
+ import { CommonModule } from '@angular/common';
5
+ import * as i2 from '@angular/forms';
6
+ import { FormsModule, NG_VALUE_ACCESSOR } from '@angular/forms';
7
+ import * as i2$1 from '@angular/router';
8
+ import { RouterModule } from '@angular/router';
9
+
10
+ class BrButtonComponent {
11
+ constructor() {
12
+ this.variant = 'primary';
13
+ this.size = 'medium';
14
+ this.type = 'button';
15
+ this.circle = false;
16
+ this.block = false;
17
+ this.loading = false;
18
+ this.disabled = false;
19
+ this.onClick = new EventEmitter();
20
+ }
21
+ get buttonClasses() {
22
+ const base = 'inline-flex items-center justify-center font-rawline font-semibold transition-colors duration-200 focus:outline-none focus:ring-2 focus:ring-offset-2';
23
+ const variants = {
24
+ primary: 'bg-govbr-primary text-white hover:bg-govbr-primary-dark focus:ring-govbr-primary',
25
+ secondary: 'bg-transparent text-govbr-primary border border-govbr-primary hover:bg-govbr-primary hover:text-white focus:ring-govbr-primary',
26
+ danger: 'bg-govbr-danger text-white hover:bg-red-700 focus:ring-govbr-danger',
27
+ };
28
+ const sizes = {
29
+ small: this.circle ? 'w-8 h-8 text-sm' : 'px-3 py-1.5 text-sm',
30
+ medium: this.circle ? 'w-10 h-10 text-base' : 'px-5 py-2 text-base',
31
+ large: this.circle ? 'w-12 h-12 text-lg' : 'px-7 py-3 text-lg',
32
+ };
33
+ const shape = this.circle ? 'rounded-full' : 'rounded-govbr-pill';
34
+ const width = this.block ? 'w-full' : '';
35
+ const disabledCls = this.disabled || this.loading ? 'opacity-50 cursor-not-allowed' : 'cursor-pointer';
36
+ return [base, variants[this.variant], sizes[this.size], shape, width, disabledCls]
37
+ .filter(Boolean)
38
+ .join(' ');
39
+ }
40
+ handleClick(event) {
41
+ if (!this.disabled && !this.loading) {
42
+ this.onClick.emit(event);
43
+ }
44
+ }
45
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BrButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
46
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: BrButtonComponent, isStandalone: true, selector: "br-button", inputs: { variant: "variant", size: "size", type: "type", circle: "circle", block: "block", icon: "icon", loading: "loading", disabled: "disabled" }, outputs: { onClick: "onClick" }, ngImport: i0, template: `
47
+ <button
48
+ [type]="type"
49
+ [disabled]="disabled || loading"
50
+ [class]="buttonClasses"
51
+ (click)="handleClick($event)"
52
+ >
53
+ <i *ngIf="loading" class="fa-solid fa-spinner fa-spin mr-2"></i>
54
+ <i *ngIf="icon && !loading" [class]="'fa-solid fa-' + icon + (circle ? '' : ' mr-2')"></i>
55
+ <span *ngIf="!circle"><ng-content></ng-content></span>
56
+ </button>
57
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], encapsulation: i0.ViewEncapsulation.None }); }
58
+ }
59
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BrButtonComponent, decorators: [{
60
+ type: Component,
61
+ args: [{
62
+ selector: 'br-button',
63
+ standalone: true,
64
+ imports: [CommonModule],
65
+ encapsulation: ViewEncapsulation.None,
66
+ template: `
67
+ <button
68
+ [type]="type"
69
+ [disabled]="disabled || loading"
70
+ [class]="buttonClasses"
71
+ (click)="handleClick($event)"
72
+ >
73
+ <i *ngIf="loading" class="fa-solid fa-spinner fa-spin mr-2"></i>
74
+ <i *ngIf="icon && !loading" [class]="'fa-solid fa-' + icon + (circle ? '' : ' mr-2')"></i>
75
+ <span *ngIf="!circle"><ng-content></ng-content></span>
76
+ </button>
77
+ `,
78
+ }]
79
+ }], propDecorators: { variant: [{
80
+ type: Input
81
+ }], size: [{
82
+ type: Input
83
+ }], type: [{
84
+ type: Input
85
+ }], circle: [{
86
+ type: Input
87
+ }], block: [{
88
+ type: Input
89
+ }], icon: [{
90
+ type: Input
91
+ }], loading: [{
92
+ type: Input
93
+ }], disabled: [{
94
+ type: Input
95
+ }], onClick: [{
96
+ type: Output
97
+ }] } });
98
+
99
+ class BrInputComponent {
100
+ constructor() {
101
+ this.type = 'text';
102
+ this.placeholder = '';
103
+ this.required = false;
104
+ this.fileSelected = new EventEmitter();
105
+ this.value = '';
106
+ this.isDisabled = false;
107
+ this.fileName = '';
108
+ this.inputId = `br-input-${BrInputComponent.nextId++}`;
109
+ this.onChange = () => { };
110
+ this.onTouched = () => { };
111
+ }
112
+ static { this.nextId = 0; }
113
+ get inputClasses() {
114
+ const base = 'w-full px-4 py-2 border rounded text-govbr-gray-80 bg-white font-rawline text-base transition-colors focus:outline-none focus:ring-2 focus:ring-govbr-primary focus:border-govbr-primary';
115
+ const errorCls = this.error
116
+ ? 'border-govbr-danger focus:ring-govbr-danger focus:border-govbr-danger'
117
+ : 'border-govbr-gray-10';
118
+ const disabledCls = this.isDisabled ? 'bg-govbr-gray-2 cursor-not-allowed' : '';
119
+ return [base, errorCls, disabledCls].filter(Boolean).join(' ');
120
+ }
121
+ writeValue(value) {
122
+ this.value = value ?? '';
123
+ }
124
+ registerOnChange(fn) {
125
+ this.onChange = fn;
126
+ }
127
+ registerOnTouched(fn) {
128
+ this.onTouched = fn;
129
+ }
130
+ setDisabledState(isDisabled) {
131
+ this.isDisabled = isDisabled;
132
+ }
133
+ onInputChange(event) {
134
+ const val = event.target.value;
135
+ this.value = val;
136
+ this.onChange(val);
137
+ }
138
+ onSelectChange(event) {
139
+ const val = event.target.value;
140
+ this.value = val;
141
+ this.onChange(val);
142
+ }
143
+ onFileChange(event) {
144
+ const input = event.target;
145
+ if (input.files && input.files.length > 0) {
146
+ const file = input.files[0];
147
+ this.fileName = file.name;
148
+ this.fileSelected.emit(file);
149
+ }
150
+ }
151
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BrInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
152
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: BrInputComponent, isStandalone: true, selector: "br-input", inputs: { label: "label", type: "type", placeholder: "placeholder", required: "required", error: "error" }, outputs: { fileSelected: "fileSelected" }, providers: [
153
+ {
154
+ provide: NG_VALUE_ACCESSOR,
155
+ useExisting: forwardRef(() => BrInputComponent),
156
+ multi: true,
157
+ },
158
+ ], ngImport: i0, template: `
159
+ <div class="mb-4 font-rawline">
160
+ <label
161
+ *ngIf="label"
162
+ [for]="inputId"
163
+ class="block text-sm font-semibold text-govbr-gray-80 mb-1"
164
+ >
165
+ {{ label }}
166
+ <span *ngIf="required" class="text-govbr-danger">*</span>
167
+ </label>
168
+
169
+ <!-- Select -->
170
+ <select
171
+ *ngIf="type === 'select'"
172
+ [id]="inputId"
173
+ [disabled]="isDisabled"
174
+ [class]="inputClasses"
175
+ [value]="value"
176
+ (change)="onSelectChange($event)"
177
+ (blur)="onTouched()"
178
+ >
179
+ <option value="" disabled [selected]="!value">{{ placeholder }}</option>
180
+ <ng-content></ng-content>
181
+ </select>
182
+
183
+ <!-- File -->
184
+ <div *ngIf="type === 'file'">
185
+ <label
186
+ [for]="inputId"
187
+ class="inline-flex items-center px-4 py-2 bg-govbr-primary text-white rounded-govbr-pill cursor-pointer hover:bg-govbr-primary-dark transition-colors text-sm font-semibold"
188
+ >
189
+ <i class="fa-solid fa-upload mr-2"></i>
190
+ {{ placeholder || 'Selecionar arquivo' }}
191
+ </label>
192
+ <input
193
+ [id]="inputId"
194
+ type="file"
195
+ class="hidden"
196
+ [disabled]="isDisabled"
197
+ (change)="onFileChange($event)"
198
+ />
199
+ <span *ngIf="fileName" class="ml-2 text-sm text-govbr-gray-60">{{ fileName }}</span>
200
+ </div>
201
+
202
+ <!-- Text / Email / Password -->
203
+ <input
204
+ *ngIf="type !== 'select' && type !== 'file'"
205
+ [id]="inputId"
206
+ [type]="type"
207
+ [placeholder]="placeholder"
208
+ [disabled]="isDisabled"
209
+ [class]="inputClasses"
210
+ [value]="value"
211
+ (input)="onInputChange($event)"
212
+ (blur)="onTouched()"
213
+ />
214
+
215
+ <span *ngIf="error" class="block mt-1 text-sm text-govbr-danger">
216
+ <i class="fa-solid fa-circle-exclamation mr-1"></i>{{ error }}
217
+ </span>
218
+ </div>
219
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }], encapsulation: i0.ViewEncapsulation.None }); }
220
+ }
221
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BrInputComponent, decorators: [{
222
+ type: Component,
223
+ args: [{
224
+ selector: 'br-input',
225
+ standalone: true,
226
+ imports: [CommonModule, FormsModule],
227
+ encapsulation: ViewEncapsulation.None,
228
+ providers: [
229
+ {
230
+ provide: NG_VALUE_ACCESSOR,
231
+ useExisting: forwardRef(() => BrInputComponent),
232
+ multi: true,
233
+ },
234
+ ],
235
+ template: `
236
+ <div class="mb-4 font-rawline">
237
+ <label
238
+ *ngIf="label"
239
+ [for]="inputId"
240
+ class="block text-sm font-semibold text-govbr-gray-80 mb-1"
241
+ >
242
+ {{ label }}
243
+ <span *ngIf="required" class="text-govbr-danger">*</span>
244
+ </label>
245
+
246
+ <!-- Select -->
247
+ <select
248
+ *ngIf="type === 'select'"
249
+ [id]="inputId"
250
+ [disabled]="isDisabled"
251
+ [class]="inputClasses"
252
+ [value]="value"
253
+ (change)="onSelectChange($event)"
254
+ (blur)="onTouched()"
255
+ >
256
+ <option value="" disabled [selected]="!value">{{ placeholder }}</option>
257
+ <ng-content></ng-content>
258
+ </select>
259
+
260
+ <!-- File -->
261
+ <div *ngIf="type === 'file'">
262
+ <label
263
+ [for]="inputId"
264
+ class="inline-flex items-center px-4 py-2 bg-govbr-primary text-white rounded-govbr-pill cursor-pointer hover:bg-govbr-primary-dark transition-colors text-sm font-semibold"
265
+ >
266
+ <i class="fa-solid fa-upload mr-2"></i>
267
+ {{ placeholder || 'Selecionar arquivo' }}
268
+ </label>
269
+ <input
270
+ [id]="inputId"
271
+ type="file"
272
+ class="hidden"
273
+ [disabled]="isDisabled"
274
+ (change)="onFileChange($event)"
275
+ />
276
+ <span *ngIf="fileName" class="ml-2 text-sm text-govbr-gray-60">{{ fileName }}</span>
277
+ </div>
278
+
279
+ <!-- Text / Email / Password -->
280
+ <input
281
+ *ngIf="type !== 'select' && type !== 'file'"
282
+ [id]="inputId"
283
+ [type]="type"
284
+ [placeholder]="placeholder"
285
+ [disabled]="isDisabled"
286
+ [class]="inputClasses"
287
+ [value]="value"
288
+ (input)="onInputChange($event)"
289
+ (blur)="onTouched()"
290
+ />
291
+
292
+ <span *ngIf="error" class="block mt-1 text-sm text-govbr-danger">
293
+ <i class="fa-solid fa-circle-exclamation mr-1"></i>{{ error }}
294
+ </span>
295
+ </div>
296
+ `,
297
+ }]
298
+ }], propDecorators: { label: [{
299
+ type: Input
300
+ }], type: [{
301
+ type: Input
302
+ }], placeholder: [{
303
+ type: Input
304
+ }], required: [{
305
+ type: Input
306
+ }], error: [{
307
+ type: Input
308
+ }], fileSelected: [{
309
+ type: Output
310
+ }] } });
311
+
312
+ class BrBadgeComponent {
313
+ constructor() {
314
+ this.variant = 'primary';
315
+ }
316
+ get badgeClasses() {
317
+ const base = 'inline-flex items-center px-2.5 py-0.5 rounded-govbr-pill text-xs font-semibold font-rawline';
318
+ const variants = {
319
+ primary: 'bg-govbr-primary text-white',
320
+ success: 'bg-govbr-success text-white',
321
+ danger: 'bg-govbr-danger text-white',
322
+ warning: 'bg-govbr-warning-bg text-govbr-gray-80',
323
+ neutral: 'bg-govbr-gray-5 text-govbr-gray-80',
324
+ };
325
+ return `${base} ${variants[this.variant]}`;
326
+ }
327
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BrBadgeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
328
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: BrBadgeComponent, isStandalone: true, selector: "br-badge", inputs: { variant: "variant" }, ngImport: i0, template: `
329
+ <span [class]="badgeClasses">
330
+ <ng-content></ng-content>
331
+ </span>
332
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }], encapsulation: i0.ViewEncapsulation.None }); }
333
+ }
334
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BrBadgeComponent, decorators: [{
335
+ type: Component,
336
+ args: [{
337
+ selector: 'br-badge',
338
+ standalone: true,
339
+ imports: [CommonModule],
340
+ encapsulation: ViewEncapsulation.None,
341
+ template: `
342
+ <span [class]="badgeClasses">
343
+ <ng-content></ng-content>
344
+ </span>
345
+ `,
346
+ }]
347
+ }], propDecorators: { variant: [{
348
+ type: Input
349
+ }] } });
350
+
351
+ class BrMessageComponent {
352
+ constructor() {
353
+ this.type = 'info';
354
+ this.dismissible = false;
355
+ this.dismissed = new EventEmitter();
356
+ this.visible = true;
357
+ }
358
+ get messageClasses() {
359
+ const base = 'p-4 rounded font-rawline border-l-4';
360
+ const styles = {
361
+ success: 'bg-green-50 border-govbr-success text-govbr-success',
362
+ danger: 'bg-red-50 border-govbr-danger text-govbr-danger',
363
+ warning: 'bg-govbr-warning-bg border-govbr-warning text-govbr-gray-80',
364
+ info: 'bg-govbr-info-bg border-govbr-info text-govbr-primary-dark',
365
+ };
366
+ return `${base} ${styles[this.type]}`;
367
+ }
368
+ get iconClass() {
369
+ const icons = {
370
+ success: 'fa-solid fa-circle-check',
371
+ danger: 'fa-solid fa-circle-xmark',
372
+ warning: 'fa-solid fa-triangle-exclamation',
373
+ info: 'fa-solid fa-circle-info',
374
+ };
375
+ return icons[this.type];
376
+ }
377
+ dismiss() {
378
+ this.visible = false;
379
+ this.dismissed.emit();
380
+ }
381
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BrMessageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
382
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: BrMessageComponent, isStandalone: true, selector: "br-message", inputs: { type: "type", dismissible: "dismissible" }, outputs: { dismissed: "dismissed" }, ngImport: i0, template: `
383
+ <div *ngIf="visible" [class]="messageClasses" role="alert">
384
+ <div class="flex items-start">
385
+ <i [class]="iconClass + ' mt-0.5 mr-3 text-lg'"></i>
386
+ <div class="flex-1 text-sm">
387
+ <ng-content></ng-content>
388
+ </div>
389
+ <button
390
+ *ngIf="dismissible"
391
+ type="button"
392
+ class="ml-3 text-current opacity-60 hover:opacity-100 transition-opacity"
393
+ (click)="dismiss()"
394
+ aria-label="Fechar"
395
+ >
396
+ <i class="fa-solid fa-xmark"></i>
397
+ </button>
398
+ </div>
399
+ </div>
400
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], encapsulation: i0.ViewEncapsulation.None }); }
401
+ }
402
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BrMessageComponent, decorators: [{
403
+ type: Component,
404
+ args: [{
405
+ selector: 'br-message',
406
+ standalone: true,
407
+ imports: [CommonModule],
408
+ encapsulation: ViewEncapsulation.None,
409
+ template: `
410
+ <div *ngIf="visible" [class]="messageClasses" role="alert">
411
+ <div class="flex items-start">
412
+ <i [class]="iconClass + ' mt-0.5 mr-3 text-lg'"></i>
413
+ <div class="flex-1 text-sm">
414
+ <ng-content></ng-content>
415
+ </div>
416
+ <button
417
+ *ngIf="dismissible"
418
+ type="button"
419
+ class="ml-3 text-current opacity-60 hover:opacity-100 transition-opacity"
420
+ (click)="dismiss()"
421
+ aria-label="Fechar"
422
+ >
423
+ <i class="fa-solid fa-xmark"></i>
424
+ </button>
425
+ </div>
426
+ </div>
427
+ `,
428
+ }]
429
+ }], propDecorators: { type: [{
430
+ type: Input
431
+ }], dismissible: [{
432
+ type: Input
433
+ }], dismissed: [{
434
+ type: Output
435
+ }] } });
436
+
437
+ class BrTableComponent {
438
+ constructor() {
439
+ this.headerVariant = 'blue';
440
+ this.page = 1;
441
+ this.totalPages = 1;
442
+ this.pageChange = new EventEmitter();
443
+ }
444
+ get visiblePages() {
445
+ const pages = [];
446
+ const start = Math.max(1, this.page - 2);
447
+ const end = Math.min(this.totalPages, this.page + 2);
448
+ for (let i = start; i <= end; i++) {
449
+ pages.push(i);
450
+ }
451
+ return pages;
452
+ }
453
+ goToPage(p) {
454
+ if (p >= 1 && p <= this.totalPages && p !== this.page) {
455
+ this.pageChange.emit(p);
456
+ }
457
+ }
458
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BrTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
459
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: BrTableComponent, isStandalone: true, selector: "br-table", inputs: { headerVariant: "headerVariant", page: "page", totalPages: "totalPages" }, outputs: { pageChange: "pageChange" }, ngImport: i0, template: `
460
+ <div class="overflow-x-auto font-rawline" [attr.data-header]="headerVariant">
461
+ <table class="w-full text-sm text-left text-govbr-gray-80">
462
+ <ng-content></ng-content>
463
+ </table>
464
+
465
+ <nav
466
+ *ngIf="totalPages > 1"
467
+ class="flex items-center justify-between px-4 py-3 border-t border-govbr-gray-5"
468
+ aria-label="Paginacao"
469
+ >
470
+ <span class="text-sm text-govbr-gray-40">
471
+ Pagina {{ page }} de {{ totalPages }}
472
+ </span>
473
+ <div class="flex gap-1">
474
+ <button
475
+ type="button"
476
+ [disabled]="page <= 1"
477
+ (click)="goToPage(page - 1)"
478
+ class="px-3 py-1.5 text-sm rounded border transition-colors"
479
+ [class]="page <= 1
480
+ ? 'border-govbr-gray-10 text-govbr-gray-20 cursor-not-allowed'
481
+ : 'border-govbr-gray-10 text-govbr-primary hover:bg-govbr-primary-lightest cursor-pointer'"
482
+ >
483
+ <i class="fa-solid fa-chevron-left"></i>
484
+ </button>
485
+ <button
486
+ *ngFor="let p of visiblePages"
487
+ type="button"
488
+ (click)="goToPage(p)"
489
+ class="px-3 py-1.5 text-sm rounded border transition-colors cursor-pointer"
490
+ [class]="p === page
491
+ ? 'bg-govbr-primary text-white border-govbr-primary'
492
+ : 'border-govbr-gray-10 text-govbr-primary hover:bg-govbr-primary-lightest'"
493
+ >
494
+ {{ p }}
495
+ </button>
496
+ <button
497
+ type="button"
498
+ [disabled]="page >= totalPages"
499
+ (click)="goToPage(page + 1)"
500
+ class="px-3 py-1.5 text-sm rounded border transition-colors"
501
+ [class]="page >= totalPages
502
+ ? 'border-govbr-gray-10 text-govbr-gray-20 cursor-not-allowed'
503
+ : 'border-govbr-gray-10 text-govbr-primary hover:bg-govbr-primary-lightest cursor-pointer'"
504
+ >
505
+ <i class="fa-solid fa-chevron-right"></i>
506
+ </button>
507
+ </div>
508
+ </nav>
509
+ </div>
510
+ `, isInline: true, styles: ["br-table table{border-collapse:collapse;border-spacing:0}br-table table thead th{background-color:var(--govbr-table-header-bg);color:var(--govbr-table-header-color);font-weight:var(--govbr-font-weight-semi-bold);font-size:var(--govbr-font-size-sm);line-height:var(--govbr-line-height-medium);padding:var(--govbr-spacing-4);text-align:left;border-bottom:var(--govbr-table-header-border)}br-table table thead th:first-child{border-radius:var(--govbr-table-header-radius) 0 0 0}br-table table thead th:last-child{border-radius:0 var(--govbr-table-header-radius) 0 0}br-table [data-header=light] table thead th{--govbr-table-header-bg: var(--govbr-bg);--govbr-table-header-color: var(--govbr-primary);--govbr-table-header-border: 2px solid var(--govbr-border-color);--govbr-table-header-radius: 0}br-table table tbody td{padding:var(--govbr-spacing-4);font-size:var(--govbr-font-size-sm);line-height:var(--govbr-line-height-medium);color:var(--govbr-table-cell-color);border-bottom:var(--govbr-table-cell-border);background-color:var(--govbr-table-row-bg)}br-table table tbody tr:nth-child(2n) td{background-color:var(--govbr-table-row-alt-bg)}br-table table tbody tr:hover td{background-color:var(--govbr-table-row-hover-bg)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], encapsulation: i0.ViewEncapsulation.None }); }
511
+ }
512
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BrTableComponent, decorators: [{
513
+ type: Component,
514
+ args: [{ selector: 'br-table', standalone: true, imports: [CommonModule], encapsulation: ViewEncapsulation.None, template: `
515
+ <div class="overflow-x-auto font-rawline" [attr.data-header]="headerVariant">
516
+ <table class="w-full text-sm text-left text-govbr-gray-80">
517
+ <ng-content></ng-content>
518
+ </table>
519
+
520
+ <nav
521
+ *ngIf="totalPages > 1"
522
+ class="flex items-center justify-between px-4 py-3 border-t border-govbr-gray-5"
523
+ aria-label="Paginacao"
524
+ >
525
+ <span class="text-sm text-govbr-gray-40">
526
+ Pagina {{ page }} de {{ totalPages }}
527
+ </span>
528
+ <div class="flex gap-1">
529
+ <button
530
+ type="button"
531
+ [disabled]="page <= 1"
532
+ (click)="goToPage(page - 1)"
533
+ class="px-3 py-1.5 text-sm rounded border transition-colors"
534
+ [class]="page <= 1
535
+ ? 'border-govbr-gray-10 text-govbr-gray-20 cursor-not-allowed'
536
+ : 'border-govbr-gray-10 text-govbr-primary hover:bg-govbr-primary-lightest cursor-pointer'"
537
+ >
538
+ <i class="fa-solid fa-chevron-left"></i>
539
+ </button>
540
+ <button
541
+ *ngFor="let p of visiblePages"
542
+ type="button"
543
+ (click)="goToPage(p)"
544
+ class="px-3 py-1.5 text-sm rounded border transition-colors cursor-pointer"
545
+ [class]="p === page
546
+ ? 'bg-govbr-primary text-white border-govbr-primary'
547
+ : 'border-govbr-gray-10 text-govbr-primary hover:bg-govbr-primary-lightest'"
548
+ >
549
+ {{ p }}
550
+ </button>
551
+ <button
552
+ type="button"
553
+ [disabled]="page >= totalPages"
554
+ (click)="goToPage(page + 1)"
555
+ class="px-3 py-1.5 text-sm rounded border transition-colors"
556
+ [class]="page >= totalPages
557
+ ? 'border-govbr-gray-10 text-govbr-gray-20 cursor-not-allowed'
558
+ : 'border-govbr-gray-10 text-govbr-primary hover:bg-govbr-primary-lightest cursor-pointer'"
559
+ >
560
+ <i class="fa-solid fa-chevron-right"></i>
561
+ </button>
562
+ </div>
563
+ </nav>
564
+ </div>
565
+ `, styles: ["br-table table{border-collapse:collapse;border-spacing:0}br-table table thead th{background-color:var(--govbr-table-header-bg);color:var(--govbr-table-header-color);font-weight:var(--govbr-font-weight-semi-bold);font-size:var(--govbr-font-size-sm);line-height:var(--govbr-line-height-medium);padding:var(--govbr-spacing-4);text-align:left;border-bottom:var(--govbr-table-header-border)}br-table table thead th:first-child{border-radius:var(--govbr-table-header-radius) 0 0 0}br-table table thead th:last-child{border-radius:0 var(--govbr-table-header-radius) 0 0}br-table [data-header=light] table thead th{--govbr-table-header-bg: var(--govbr-bg);--govbr-table-header-color: var(--govbr-primary);--govbr-table-header-border: 2px solid var(--govbr-border-color);--govbr-table-header-radius: 0}br-table table tbody td{padding:var(--govbr-spacing-4);font-size:var(--govbr-font-size-sm);line-height:var(--govbr-line-height-medium);color:var(--govbr-table-cell-color);border-bottom:var(--govbr-table-cell-border);background-color:var(--govbr-table-row-bg)}br-table table tbody tr:nth-child(2n) td{background-color:var(--govbr-table-row-alt-bg)}br-table table tbody tr:hover td{background-color:var(--govbr-table-row-hover-bg)}\n"] }]
566
+ }], propDecorators: { headerVariant: [{
567
+ type: Input
568
+ }], page: [{
569
+ type: Input
570
+ }], totalPages: [{
571
+ type: Input
572
+ }], pageChange: [{
573
+ type: Output
574
+ }] } });
575
+
576
+ class BrCardComponent {
577
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BrCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
578
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: BrCardComponent, isStandalone: true, selector: "br-card", inputs: { icon: "icon", linkText: "linkText", linkRoute: "linkRoute" }, ngImport: i0, template: `
579
+ <div class="bg-white rounded border border-govbr-gray-5 shadow-sm hover:shadow-md transition-shadow font-rawline overflow-hidden">
580
+ <div class="p-6">
581
+ <div *ngIf="icon" class="mb-3">
582
+ <i [class]="'fa-solid fa-' + icon + ' text-govbr-primary text-2xl'"></i>
583
+ </div>
584
+ <ng-content></ng-content>
585
+ </div>
586
+ <div *ngIf="linkText" class="px-6 pb-4">
587
+ <a
588
+ *ngIf="linkRoute"
589
+ [routerLink]="linkRoute"
590
+ class="text-govbr-primary text-sm font-semibold hover:underline inline-flex items-center"
591
+ >
592
+ {{ linkText }}
593
+ <i class="fa-solid fa-arrow-right ml-1 text-xs"></i>
594
+ </a>
595
+ </div>
596
+ </div>
597
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i2$1.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }], encapsulation: i0.ViewEncapsulation.None }); }
598
+ }
599
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BrCardComponent, decorators: [{
600
+ type: Component,
601
+ args: [{
602
+ selector: 'br-card',
603
+ standalone: true,
604
+ imports: [CommonModule, RouterModule],
605
+ encapsulation: ViewEncapsulation.None,
606
+ template: `
607
+ <div class="bg-white rounded border border-govbr-gray-5 shadow-sm hover:shadow-md transition-shadow font-rawline overflow-hidden">
608
+ <div class="p-6">
609
+ <div *ngIf="icon" class="mb-3">
610
+ <i [class]="'fa-solid fa-' + icon + ' text-govbr-primary text-2xl'"></i>
611
+ </div>
612
+ <ng-content></ng-content>
613
+ </div>
614
+ <div *ngIf="linkText" class="px-6 pb-4">
615
+ <a
616
+ *ngIf="linkRoute"
617
+ [routerLink]="linkRoute"
618
+ class="text-govbr-primary text-sm font-semibold hover:underline inline-flex items-center"
619
+ >
620
+ {{ linkText }}
621
+ <i class="fa-solid fa-arrow-right ml-1 text-xs"></i>
622
+ </a>
623
+ </div>
624
+ </div>
625
+ `,
626
+ }]
627
+ }], propDecorators: { icon: [{
628
+ type: Input
629
+ }], linkText: [{
630
+ type: Input
631
+ }], linkRoute: [{
632
+ type: Input
633
+ }] } });
634
+
635
+ class BrHeaderComponent {
636
+ constructor() {
637
+ this.systemTitle = '';
638
+ this.logoSrc = '';
639
+ this.logout = new EventEmitter();
640
+ }
641
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BrHeaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
642
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: BrHeaderComponent, isStandalone: true, selector: "br-header", inputs: { systemTitle: "systemTitle", systemSubtitle: "systemSubtitle", logoSrc: "logoSrc", userName: "userName", userRole: "userRole" }, outputs: { logout: "logout" }, queries: [{ propertyName: "quickAccessItems", first: true, predicate: ["quickAccessItems"], descendants: true }], ngImport: i0, template: `
643
+ <!-- Top bar -->
644
+ <div style="background-color:#071d41;color:#ffffff;font-size:12px;padding:4px 16px;font-family:'Rawline','Raleway',sans-serif;">
645
+ <div style="max-width:1280px;margin:0 auto;display:flex;align-items:center;justify-content:space-between;">
646
+ <ng-container *ngIf="quickAccessItems; else defaultQuickAccess">
647
+ <ng-container *ngTemplateOutlet="quickAccessItems"></ng-container>
648
+ </ng-container>
649
+ <ng-template #defaultQuickAccess>
650
+ <span></span>
651
+ </ng-template>
652
+ </div>
653
+ </div>
654
+
655
+ <!-- Main header -->
656
+ <header style="background-color:#1351b4;color:#ffffff;font-family:'Rawline','Raleway',sans-serif;box-shadow:0 4px 6px -1px rgba(0,0,0,0.1);">
657
+ <div style="max-width:1280px;margin:0 auto;display:flex;align-items:center;justify-content:space-between;padding:12px 16px;">
658
+ <!-- Logo + Title -->
659
+ <div style="display:flex;align-items:center;gap:16px;">
660
+ <img
661
+ *ngIf="logoSrc"
662
+ [src]="logoSrc"
663
+ [alt]="systemTitle"
664
+ style="height:40px;"
665
+ />
666
+ <div>
667
+ <h1 style="font-size:18px;font-weight:700;line-height:1.25;color:#ffffff;margin:0;">{{ systemTitle }}</h1>
668
+ <p *ngIf="systemSubtitle" style="font-size:12px;opacity:0.8;color:#ffffff;margin:0;">{{ systemSubtitle }}</p>
669
+ </div>
670
+ </div>
671
+
672
+ <!-- User area -->
673
+ <div *ngIf="userName" style="display:flex;align-items:center;gap:12px;">
674
+ <div style="text-align:right;">
675
+ <span style="display:block;font-size:14px;font-weight:600;color:#ffffff;">{{ userName }}</span>
676
+ <span *ngIf="userRole" style="display:block;font-size:12px;opacity:0.8;color:#ffffff;">{{ userRole }}</span>
677
+ </div>
678
+ <button
679
+ type="button"
680
+ style="margin-left:8px;padding:8px;border-radius:50%;border:none;background:transparent;color:#ffffff;cursor:pointer;"
681
+ (click)="logout.emit()"
682
+ title="Sair"
683
+ >
684
+ <i class="fa-solid fa-right-from-bracket"></i>
685
+ </button>
686
+ </div>
687
+ </div>
688
+ </header>
689
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], encapsulation: i0.ViewEncapsulation.None }); }
690
+ }
691
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BrHeaderComponent, decorators: [{
692
+ type: Component,
693
+ args: [{
694
+ selector: 'br-header',
695
+ standalone: true,
696
+ imports: [CommonModule],
697
+ encapsulation: ViewEncapsulation.None,
698
+ template: `
699
+ <!-- Top bar -->
700
+ <div style="background-color:#071d41;color:#ffffff;font-size:12px;padding:4px 16px;font-family:'Rawline','Raleway',sans-serif;">
701
+ <div style="max-width:1280px;margin:0 auto;display:flex;align-items:center;justify-content:space-between;">
702
+ <ng-container *ngIf="quickAccessItems; else defaultQuickAccess">
703
+ <ng-container *ngTemplateOutlet="quickAccessItems"></ng-container>
704
+ </ng-container>
705
+ <ng-template #defaultQuickAccess>
706
+ <span></span>
707
+ </ng-template>
708
+ </div>
709
+ </div>
710
+
711
+ <!-- Main header -->
712
+ <header style="background-color:#1351b4;color:#ffffff;font-family:'Rawline','Raleway',sans-serif;box-shadow:0 4px 6px -1px rgba(0,0,0,0.1);">
713
+ <div style="max-width:1280px;margin:0 auto;display:flex;align-items:center;justify-content:space-between;padding:12px 16px;">
714
+ <!-- Logo + Title -->
715
+ <div style="display:flex;align-items:center;gap:16px;">
716
+ <img
717
+ *ngIf="logoSrc"
718
+ [src]="logoSrc"
719
+ [alt]="systemTitle"
720
+ style="height:40px;"
721
+ />
722
+ <div>
723
+ <h1 style="font-size:18px;font-weight:700;line-height:1.25;color:#ffffff;margin:0;">{{ systemTitle }}</h1>
724
+ <p *ngIf="systemSubtitle" style="font-size:12px;opacity:0.8;color:#ffffff;margin:0;">{{ systemSubtitle }}</p>
725
+ </div>
726
+ </div>
727
+
728
+ <!-- User area -->
729
+ <div *ngIf="userName" style="display:flex;align-items:center;gap:12px;">
730
+ <div style="text-align:right;">
731
+ <span style="display:block;font-size:14px;font-weight:600;color:#ffffff;">{{ userName }}</span>
732
+ <span *ngIf="userRole" style="display:block;font-size:12px;opacity:0.8;color:#ffffff;">{{ userRole }}</span>
733
+ </div>
734
+ <button
735
+ type="button"
736
+ style="margin-left:8px;padding:8px;border-radius:50%;border:none;background:transparent;color:#ffffff;cursor:pointer;"
737
+ (click)="logout.emit()"
738
+ title="Sair"
739
+ >
740
+ <i class="fa-solid fa-right-from-bracket"></i>
741
+ </button>
742
+ </div>
743
+ </div>
744
+ </header>
745
+ `,
746
+ }]
747
+ }], propDecorators: { systemTitle: [{
748
+ type: Input
749
+ }], systemSubtitle: [{
750
+ type: Input
751
+ }], logoSrc: [{
752
+ type: Input
753
+ }], userName: [{
754
+ type: Input
755
+ }], userRole: [{
756
+ type: Input
757
+ }], logout: [{
758
+ type: Output
759
+ }], quickAccessItems: [{
760
+ type: ContentChild,
761
+ args: ['quickAccessItems']
762
+ }] } });
763
+
764
+ class BrFooterComponent {
765
+ constructor() {
766
+ this.logoSrc = '';
767
+ }
768
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BrFooterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
769
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: BrFooterComponent, isStandalone: true, selector: "br-footer", inputs: { logoSrc: "logoSrc" }, ngImport: i0, template: `
770
+ <footer class="bg-govbr-primary-darkest text-white font-rawline mt-auto">
771
+ <div class="max-w-screen-xl mx-auto px-4 py-6">
772
+ <div class="flex flex-col md:flex-row items-center justify-between gap-4">
773
+ <img
774
+ *ngIf="logoSrc"
775
+ [src]="logoSrc"
776
+ alt="Logo"
777
+ class="h-8 brightness-0 invert"
778
+ />
779
+ <div class="text-center md:text-right text-sm opacity-80">
780
+ <ng-content></ng-content>
781
+ </div>
782
+ </div>
783
+ </div>
784
+ </footer>
785
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], encapsulation: i0.ViewEncapsulation.None }); }
786
+ }
787
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BrFooterComponent, decorators: [{
788
+ type: Component,
789
+ args: [{
790
+ selector: 'br-footer',
791
+ standalone: true,
792
+ imports: [CommonModule],
793
+ encapsulation: ViewEncapsulation.None,
794
+ template: `
795
+ <footer class="bg-govbr-primary-darkest text-white font-rawline mt-auto">
796
+ <div class="max-w-screen-xl mx-auto px-4 py-6">
797
+ <div class="flex flex-col md:flex-row items-center justify-between gap-4">
798
+ <img
799
+ *ngIf="logoSrc"
800
+ [src]="logoSrc"
801
+ alt="Logo"
802
+ class="h-8 brightness-0 invert"
803
+ />
804
+ <div class="text-center md:text-right text-sm opacity-80">
805
+ <ng-content></ng-content>
806
+ </div>
807
+ </div>
808
+ </div>
809
+ </footer>
810
+ `,
811
+ }]
812
+ }], propDecorators: { logoSrc: [{
813
+ type: Input
814
+ }] } });
815
+
816
+ class BrMenuComponent {
817
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BrMenuComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
818
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: BrMenuComponent, isStandalone: true, selector: "br-menu", ngImport: i0, template: `
819
+ <nav class="bg-white border-r border-govbr-gray-5 font-rawline min-h-full w-64">
820
+ <ng-content></ng-content>
821
+ </nav>
822
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }], encapsulation: i0.ViewEncapsulation.None }); }
823
+ }
824
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BrMenuComponent, decorators: [{
825
+ type: Component,
826
+ args: [{
827
+ selector: 'br-menu',
828
+ standalone: true,
829
+ imports: [CommonModule],
830
+ encapsulation: ViewEncapsulation.None,
831
+ template: `
832
+ <nav class="bg-white border-r border-govbr-gray-5 font-rawline min-h-full w-64">
833
+ <ng-content></ng-content>
834
+ </nav>
835
+ `,
836
+ }]
837
+ }] });
838
+
839
+ class BrMenuItemComponent {
840
+ constructor() {
841
+ this.route = '/';
842
+ this.label = '';
843
+ }
844
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BrMenuItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
845
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: BrMenuItemComponent, isStandalone: true, selector: "br-menu-item", inputs: { route: "route", label: "label", icon: "icon" }, ngImport: i0, template: `
846
+ <a
847
+ [routerLink]="route"
848
+ routerLinkActive="bg-govbr-primary text-white"
849
+ class="flex items-center gap-3 px-4 py-3 text-sm text-govbr-gray-80 hover:bg-govbr-primary-lightest hover:text-govbr-primary transition-colors"
850
+ >
851
+ <i *ngIf="icon" [class]="'fa-solid fa-' + icon + ' w-5 text-center'"></i>
852
+ <span>{{ label }}</span>
853
+ </a>
854
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i2$1.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i2$1.RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }], encapsulation: i0.ViewEncapsulation.None }); }
855
+ }
856
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BrMenuItemComponent, decorators: [{
857
+ type: Component,
858
+ args: [{
859
+ selector: 'br-menu-item',
860
+ standalone: true,
861
+ imports: [CommonModule, RouterModule],
862
+ encapsulation: ViewEncapsulation.None,
863
+ template: `
864
+ <a
865
+ [routerLink]="route"
866
+ routerLinkActive="bg-govbr-primary text-white"
867
+ class="flex items-center gap-3 px-4 py-3 text-sm text-govbr-gray-80 hover:bg-govbr-primary-lightest hover:text-govbr-primary transition-colors"
868
+ >
869
+ <i *ngIf="icon" [class]="'fa-solid fa-' + icon + ' w-5 text-center'"></i>
870
+ <span>{{ label }}</span>
871
+ </a>
872
+ `,
873
+ }]
874
+ }], propDecorators: { route: [{
875
+ type: Input
876
+ }], label: [{
877
+ type: Input
878
+ }], icon: [{
879
+ type: Input
880
+ }] } });
881
+
882
+ class BrLayoutComponent {
883
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BrLayoutComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
884
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: BrLayoutComponent, isStandalone: true, selector: "br-layout", ngImport: i0, template: `
885
+ <div class="flex flex-col min-h-screen font-rawline">
886
+ <!-- Header slot -->
887
+ <ng-content select="br-header"></ng-content>
888
+
889
+ <div class="flex flex-1">
890
+ <!-- Menu slot -->
891
+ <ng-content select="br-menu"></ng-content>
892
+
893
+ <!-- Main content -->
894
+ <main class="flex-1 bg-govbr-gray-2 p-6">
895
+ <ng-content></ng-content>
896
+ </main>
897
+ </div>
898
+
899
+ <!-- Footer slot -->
900
+ <ng-content select="br-footer"></ng-content>
901
+ </div>
902
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }], encapsulation: i0.ViewEncapsulation.None }); }
903
+ }
904
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BrLayoutComponent, decorators: [{
905
+ type: Component,
906
+ args: [{
907
+ selector: 'br-layout',
908
+ standalone: true,
909
+ imports: [CommonModule],
910
+ encapsulation: ViewEncapsulation.None,
911
+ template: `
912
+ <div class="flex flex-col min-h-screen font-rawline">
913
+ <!-- Header slot -->
914
+ <ng-content select="br-header"></ng-content>
915
+
916
+ <div class="flex flex-1">
917
+ <!-- Menu slot -->
918
+ <ng-content select="br-menu"></ng-content>
919
+
920
+ <!-- Main content -->
921
+ <main class="flex-1 bg-govbr-gray-2 p-6">
922
+ <ng-content></ng-content>
923
+ </main>
924
+ </div>
925
+
926
+ <!-- Footer slot -->
927
+ <ng-content select="br-footer"></ng-content>
928
+ </div>
929
+ `,
930
+ }]
931
+ }] });
932
+
933
+ /*
934
+ * Public API Surface of @aspect-br/ng-govbr-tw
935
+ */
936
+ // Components
937
+
938
+ /**
939
+ * Generated bundle index. Do not edit.
940
+ */
941
+
942
+ export { BrBadgeComponent, BrButtonComponent, BrCardComponent, BrFooterComponent, BrHeaderComponent, BrInputComponent, BrLayoutComponent, BrMenuComponent, BrMenuItemComponent, BrMessageComponent, BrTableComponent };
943
+ //# sourceMappingURL=schenkerjon-ng-govbr-tw.mjs.map