@zambon-dev/ui 1.0.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -23,6 +23,179 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
23
23
 
24
24
  ### ⚠ Breaking Changes / Migration
25
25
 
26
+ ## [1.1.0] - 2026-10-25
27
+
28
+ ### Added
29
+
30
+ - **A button component, `lib-button`.** One component with an `intent` -- `primary`, `secondary`,
31
+ `danger`, `ghost` -- in place of a class that named a colour. It carries the loading, success and
32
+ error states the old classes carried, and it blocks activation with the `disabled` attribute
33
+ rather than `pointer-events: none`, so the keyboard cannot fire an action the mouse cannot. There
34
+ is no click output: the element inside is a real `<button>`, so `(click)` on `<lib-button>`
35
+ receives the bubbled event and `type="submit"` works inside a form with no wiring. Every button is at
36
+ least 2.25rem tall -- the height of the user block in the top bar -- and one with no label is a
37
+ square of that size, because the padding that suits text would leave a lone glyph in a box wider
38
+ than it is tall.
39
+
40
+ - **At the root barrel the new button is `LibButtonComponent`.** Both layers now define a
41
+ `ButtonComponent` -- the library's `lib-button` and the framework's long-standing
42
+ `framework-button` -- so `@zambon-dev/ui` exports the framework one under the bare name it
43
+ already had and the library one under an alias. From the layer entry points
44
+ (`@zambon-dev/ui/library`, `@zambon-dev/ui/framework`) both are just `ButtonComponent`,
45
+ which is how they read in context and what the examples below use.
46
+
47
+ - **A semantic token core.** 59 tokens that name a role -- a surface, a piece of content, a line, a
48
+ state, a shape, a duration -- defined in `@zambon-dev/ui/styles/theme.css`. Each is also a
49
+ Tailwind utility: `bg-surface-glass`, `text-content-secondary`, `rounded-surface`. The
50
+ [design tokens guide](https://github.com/RicardoZambon/ZLibraries/blob/main/docs/guides/design-tokens.md)
51
+ lists them and explains what is safe to override.
52
+
53
+ - **A dark theme, and a switch for it in the top bar.** The slot reserved there since July is
54
+ filled. The switch steps light, dark, follow-the-system, and `ThemeService` exposes the same
55
+ thing to your code: `preference()` for what the user chose, `resolved()` for what is applied.
56
+ Your application opts in by adding one snippet to `index.html`; leave it out and every screen
57
+ stays light. The guide above has the snippet and explains why it cannot be an Angular service.
58
+
59
+ - **`AppConfig.loginLogoUrl` and `AppConfig.loginBackgroundUrl`.** The sign-in screen used to load
60
+ `/logo-login.png` and `/background.jpg` from fixed absolute paths that no application ships, so
61
+ in practice it rendered a broken image over no background. Both are optional: without a logo the
62
+ card simply has none, and without a background the app backdrop shows through.
63
+
64
+ - **`LoginLayoutComponent` projects content.** It rendered a `<router-outlet>` and nothing else,
65
+ so a sign-in screen placed inside the element was silently dropped. It now renders projected
66
+ content beside the outlet, which lets an application host a sign-in screen that is not reached
67
+ through the router.
68
+
69
+ - **The two login translation keys that were missing.** `Login-Title` and `Login-Copyright` were
70
+ used by the template and defined in neither language file, so the card's heading and its footer
71
+ rendered the raw key. Both now exist in English and Portuguese, and `Login-SelectLanguage` --
72
+ which had been sitting unused -- labels the language picker on that screen.
73
+
74
+ ### Changed
75
+
76
+ - **Every component now draws from the tokens**, so a theme moves them all at once. The data grid,
77
+ the group containers, the modal, the multi-select, the catalog select, the ribbon and the form
78
+ controls had their colours, radii, shadows and durations written into their stylesheets; they now
79
+ name a role instead. Expect small shifts where a literal and its nearest token were not identical
80
+ -- borders settle on one grey, selection on one blue.
81
+
82
+ - **`--sidebar-*` and `--tabs-*` derive from that core.** They are still the names you override and
83
+ they still compute the same values. They moved into `@layer tokens`, which means an override of
84
+ yours now wins whatever the import order -- previously it only won if your stylesheet came last.
85
+ Write the override without a layer.
86
+
87
+ - **Focus is shown on `:focus-visible` and is thinner.** Fields and buttons used `focus:ring-4` on
88
+ plain `:focus`, so a four-pixel halo appeared on every mouse click. The ring is now two pixels,
89
+ reads `--color-focus-ring`, and appears when focus is actually worth showing.
90
+
91
+ - **Form labels are no longer uppercase, bold and letter-spaced.** They are a quiet caption at the
92
+ same size. This is the single change that most alters how a dense form reads; labels also get
93
+ narrower, so field columns gain a little width.
94
+
95
+ - **Transitions read duration tokens**, which collapse to 1ms under `prefers-reduced-motion:
96
+ reduce`. There is nothing to configure.
97
+
98
+ - **The sign-in screen was rebuilt.** It had had no design decision since May 2025 and used the
99
+ brand colour nowhere: an amber frame around the logo, slate field icons, a generic blue border.
100
+ It is now the same glass card as the rest of the product. Concretely:
101
+
102
+ - The logo sits inside the card instead of hanging above it on a -160px margin over a fixed
103
+ 160px height, so a logo that is not square no longer skews everything around it.
104
+ - The card has a maximum width that shrinks. The previous `w-10/12 md:w-8/12 xl:w-5/12`
105
+ resolved against an absolutely positioned parent with no width of its own, so those
106
+ breakpoints never did what their names suggested.
107
+ - The page scrolls when the card does not fit. On a 768px-tall laptop it used to be cut off at
108
+ both ends with no way to reach what was missing.
109
+ - Both fields carry `autocomplete`, so password managers recognise them; the error block is a
110
+ live region, so it is announced; and the submit button is genuinely disabled while signing in
111
+ rather than only unclickable.
112
+
113
+ - **The application toolbar joined the glass language.** It was the one surface of the shell still
114
+ outside the token system -- opaque white, square, with a hairline under it, directly above a
115
+ rounded translucent panel. The hairline is gone: in this language surfaces are separated by
116
+ elevation.
117
+
118
+ - **The ribbon, the top bar, the notifications panel, the language picker and the audit history
119
+ views draw from the design tokens**, as does the environment badge -- it keeps its four hues, but
120
+ fill, text and ring are now derived from one of them, so the badge stays readable when the
121
+ surface behind it goes dark.
122
+
123
+ - **The top bar's controls on the right are one size, in two groups.** Notifications, language
124
+ and theme came out at three different heights with three different paddings -- the language
125
+ toggle wrapped the button in padding of its own, on top of the button's, which made the smallest
126
+ control the widest -- and all five sat 12px apart. They are now identical squares, shoulder to
127
+ shoulder, with the user and the way out as their own group beside them.
128
+
129
+ - **The confirmation buttons render `lib-button`.** Their own API is unchanged apart from
130
+ `ButtonConfirmComponent` below; what changed is that their modal footers no longer depend on the
131
+ global `.btn` classes.
132
+
133
+ ### Removed
134
+
135
+ - **The global `.btn` classes.** See the migration note below.
136
+
137
+ ### Fixed
138
+
139
+ - **The sidebar's collapse handle no longer disappears into the page.** It is a disc that
140
+ straddles the sidebar's edge, so most of it sits on the app backdrop, and two things hid it: its
141
+ outline was a hairline the weight of a divider, and hovering it swapped the solid fill for a 40%
142
+ tint -- which let the rail show through one half of the handle and the page through the other.
143
+ The outline is the stronger line colour now, and the hover wash sits over the fill rather than
144
+ replacing it.
145
+
146
+ - **Hovering a secondary button now shows something.** It went from a 40% tint of one grey to a 6%
147
+ wash of another, and those land on nearly the same colour, so on a white page nothing happened;
148
+ on any other surface the button faded instead. That wash also layers over the fill now.
149
+
150
+ ### ⚠ Breaking Changes / Migration
151
+
152
+ - **`.btn` and its 154 colour variants are gone.** They were generated by interpolating Tailwind
153
+ colour names in a loop, so a button's appearance was a palette decision rather than a statement
154
+ of what it was for, and none of them could follow a theme. Replace each one with `lib-button`
155
+ from `@zambon-dev/ui/library`:
156
+
157
+ ```html
158
+ <!-- before -->
159
+ <button type="button" class="btn blue-500" (click)="save()">Save</button>
160
+
161
+ <!-- after -->
162
+ <lib-button intent="primary" (click)="save()">Save</lib-button>
163
+ ```
164
+
165
+ | Class | Intent |
166
+ | ----------------------------------------------------- | ----------- |
167
+ | `blue-*`, `green-*`, any brand colour | `primary` |
168
+ | `red-*` | `danger` |
169
+ | `gray-*`, `slate-*`, `neutral-*`, `stone-*`, `zinc-*` | `secondary` |
170
+ | a bare `.btn` inside a toolbar | `ghost` |
171
+
172
+ The state classes move to inputs: `[class.loading]` becomes `[loading]`, `.success` becomes
173
+ `[success]`, `.error` becomes `[error]`. `[disabled]` is unchanged. `(click)` still works, since
174
+ the component renders a real button and the event bubbles.
175
+
176
+ - **`ButtonConfirmComponent.modalConfirmButtonColor` is now `modalConfirmButtonIntent`.** It took a
177
+ Tailwind palette name, which said nothing about what the button was for and could not follow a
178
+ theme. Replace the colour with the intent it stood for:
179
+
180
+ | Before | After |
181
+ | ------------------------------------- | -------------------------------------- |
182
+ | `modalConfirmButtonColor="red-500"` | `modalConfirmButtonIntent="danger"` |
183
+ | `modalConfirmButtonColor="blue-500"` | `modalConfirmButtonIntent="primary"` |
184
+ | `modalConfirmButtonColor="green-500"` | `modalConfirmButtonIntent="primary"` |
185
+ | any grey | `modalConfirmButtonIntent="secondary"` |
186
+
187
+ The input now has a default of `danger`, so a confirmation that deletes something needs nothing
188
+ at all.
189
+
190
+ - **`@zambon-dev/ui/styles/theme.css` is now required** in your global stylesheet. It already was
191
+ in practice for anything using the sidebar; it now carries every component's colours, and
192
+ without it they resolve to nothing and render transparent.
193
+
194
+ - **Component tokens moved into `@layer tokens`.** Not a break, but worth knowing: an override of
195
+ `--sidebar-bg` or `--tabs-*` now wins whatever the import order, where before it only won if your
196
+ stylesheet came after ours. Write overrides without a layer. A static override holds in both
197
+ themes; to vary one by theme, write it under `:root[data-theme='dark']`.
198
+
26
199
  ## [1.0.0] - 2026-10-24
27
200
 
28
201
  ### ⚠ Breaking Changes / Migration
@@ -2,7 +2,7 @@ import * as i0 from "@angular/core";
2
2
  import { ApplicationRef, Component, EventEmitter, Inject, Injectable, InjectionToken, Input, NgModule, Output, ViewChild, afterEveryRender, computed, effect, forwardRef, inject, input, model, output, signal, viewChild } from "@angular/core";
3
3
  import { toObservable, toSignal } from "@angular/core/rxjs-interop";
4
4
  import * as i2 from "@zambon-dev/ui/library";
5
- import { DataGridConfigsProvider, DataGridDataset, DataProviderService, DateValidators, DisplayControls, FormService, GroupContainerComponent, ModalComponent, MultiEditorComponent, MultiEditorDataset, MultiSelectComponent, MultiSelectResultDataset, RibbonButtonComponent, RibbonComponent, RibbonGroupChild, RibbonGroupComponent, RouterFormatter } from "@zambon-dev/ui/library";
5
+ import { ButtonComponent as ButtonComponent$1, DataGridConfigsProvider, DataGridDataset, DataProviderService, DateValidators, DisplayControls, FormService, GroupContainerComponent, ModalComponent, MultiEditorComponent, MultiEditorDataset, MultiSelectComponent, MultiSelectResultDataset, RibbonButtonComponent, RibbonComponent, RibbonGroupChild, RibbonGroupComponent, RouterFormatter } from "@zambon-dev/ui/library";
6
6
  import { ReplaySubject, Subject, filter, map, of, skip, startWith, switchMap, take, takeUntil, tap, throwError } from "rxjs";
7
7
  import { __decorate } from "tslib";
8
8
  import * as i1$1 from "@angular/common";
@@ -1291,7 +1291,7 @@ var ButtonConfirmComponent = class ButtonConfirmComponent extends BaseButton {
1291
1291
  color = input("text-primary-500", ...ngDevMode ? [{ debugName: "color" }] : /* istanbul ignore next */ []);
1292
1292
  icon = input("", ...ngDevMode ? [{ debugName: "icon" }] : /* istanbul ignore next */ []);
1293
1293
  label = input("", ...ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []);
1294
- modalConfirmButtonColor = input("", ...ngDevMode ? [{ debugName: "modalConfirmButtonColor" }] : /* istanbul ignore next */ []);
1294
+ modalConfirmButtonIntent = input("danger", ...ngDevMode ? [{ debugName: "modalConfirmButtonIntent" }] : /* istanbul ignore next */ []);
1295
1295
  modalConfirmButtonLabel = input("", ...ngDevMode ? [{ debugName: "modalConfirmButtonLabel" }] : /* istanbul ignore next */ []);
1296
1296
  modalMessage = input("", ...ngDevMode ? [{ debugName: "modalMessage" }] : /* istanbul ignore next */ []);
1297
1297
  modalMessageIcon = input("fa-solid fa-circle-question", ...ngDevMode ? [{ debugName: "modalMessageIcon" }] : /* istanbul ignore next */ []);
@@ -1363,9 +1363,9 @@ var ButtonConfirmComponent = class ButtonConfirmComponent extends BaseButton {
1363
1363
  isRequired: false,
1364
1364
  transformFunction: null
1365
1365
  },
1366
- modalConfirmButtonColor: {
1367
- classPropertyName: "modalConfirmButtonColor",
1368
- publicName: "modalConfirmButtonColor",
1366
+ modalConfirmButtonIntent: {
1367
+ classPropertyName: "modalConfirmButtonIntent",
1368
+ publicName: "modalConfirmButtonIntent",
1369
1369
  isSignal: true,
1370
1370
  isRequired: false,
1371
1371
  transformFunction: null
@@ -1419,8 +1419,23 @@ var ButtonConfirmComponent = class ButtonConfirmComponent extends BaseButton {
1419
1419
  }],
1420
1420
  usesInheritance: true,
1421
1421
  ngImport: i0,
1422
- template: "@if (isVisible()) {\n <lib-ribbon-button\n [color]=\"color()\"\n [disabled]=\"disabled()\"\n [icon]=\"icon()\"\n [label]=\"label()\"\n [loading]=\"loading()\"\n (action)=\"onButtonClicked()\"\n >\n </lib-ribbon-button>\n}\n\n<framework-confirm-modal\n #modal\n [message]=\"modalMessage()\"\n [messageIcon]=\"modalMessageIcon()\"\n [messageIconColor]=\"modalMessageIconColor()\"\n [title]=\"modalTitle()\"\n>\n <div footer>\n <button\n class=\"btn {{ modalConfirmButtonColor() }}\"\n type=\"button\"\n [class.loading]=\"modal.isLoading()\"\n (click)=\"onDelete()\"\n >\n {{ modalConfirmButtonLabel() | translate }}\n </button>\n </div>\n</framework-confirm-modal>\n",
1422
+ template: "@if (isVisible()) {\n <lib-ribbon-button\n [color]=\"color()\"\n [disabled]=\"disabled()\"\n [icon]=\"icon()\"\n [label]=\"label()\"\n [loading]=\"loading()\"\n (action)=\"onButtonClicked()\"\n >\n </lib-ribbon-button>\n}\n\n<framework-confirm-modal\n #modal\n [message]=\"modalMessage()\"\n [messageIcon]=\"modalMessageIcon()\"\n [messageIconColor]=\"modalMessageIconColor()\"\n [title]=\"modalTitle()\"\n>\n <div footer>\n <lib-button [intent]=\"modalConfirmButtonIntent()\" [loading]=\"modal.isLoading()\" (click)=\"onDelete()\">\n {{ modalConfirmButtonLabel() | translate }}\n </lib-button>\n </div>\n</framework-confirm-modal>\n",
1423
1423
  dependencies: [
1424
+ {
1425
+ kind: "component",
1426
+ type: ButtonComponent$1,
1427
+ selector: "lib-button",
1428
+ inputs: [
1429
+ "intent",
1430
+ "type",
1431
+ "disabled",
1432
+ "loading",
1433
+ "success",
1434
+ "error",
1435
+ "icon",
1436
+ "ariaLabel"
1437
+ ]
1438
+ },
1424
1439
  {
1425
1440
  kind: "component",
1426
1441
  type: ConfirmModalComponent,
@@ -1472,6 +1487,7 @@ i0.ɵɵngDeclareClassMetadata({
1472
1487
  args: [{
1473
1488
  selector: "framework-button-confirm",
1474
1489
  imports: [
1490
+ ButtonComponent$1,
1475
1491
  ConfirmModalComponent,
1476
1492
  RibbonButtonComponent,
1477
1493
  TranslatePipe
@@ -1480,7 +1496,7 @@ i0.ɵɵngDeclareClassMetadata({
1480
1496
  provide: RibbonGroupChild,
1481
1497
  useExisting: forwardRef(() => ButtonConfirmComponent)
1482
1498
  }],
1483
- template: "@if (isVisible()) {\n <lib-ribbon-button\n [color]=\"color()\"\n [disabled]=\"disabled()\"\n [icon]=\"icon()\"\n [label]=\"label()\"\n [loading]=\"loading()\"\n (action)=\"onButtonClicked()\"\n >\n </lib-ribbon-button>\n}\n\n<framework-confirm-modal\n #modal\n [message]=\"modalMessage()\"\n [messageIcon]=\"modalMessageIcon()\"\n [messageIconColor]=\"modalMessageIconColor()\"\n [title]=\"modalTitle()\"\n>\n <div footer>\n <button\n class=\"btn {{ modalConfirmButtonColor() }}\"\n type=\"button\"\n [class.loading]=\"modal.isLoading()\"\n (click)=\"onDelete()\"\n >\n {{ modalConfirmButtonLabel() | translate }}\n </button>\n </div>\n</framework-confirm-modal>\n"
1499
+ template: "@if (isVisible()) {\n <lib-ribbon-button\n [color]=\"color()\"\n [disabled]=\"disabled()\"\n [icon]=\"icon()\"\n [label]=\"label()\"\n [loading]=\"loading()\"\n (action)=\"onButtonClicked()\"\n >\n </lib-ribbon-button>\n}\n\n<framework-confirm-modal\n #modal\n [message]=\"modalMessage()\"\n [messageIcon]=\"modalMessageIcon()\"\n [messageIconColor]=\"modalMessageIconColor()\"\n [title]=\"modalTitle()\"\n>\n <div footer>\n <lib-button [intent]=\"modalConfirmButtonIntent()\" [loading]=\"modal.isLoading()\" (click)=\"onDelete()\">\n {{ modalConfirmButtonLabel() | translate }}\n </lib-button>\n </div>\n</framework-confirm-modal>\n"
1484
1500
  }]
1485
1501
  }],
1486
1502
  ctorParameters: () => [],
@@ -1521,11 +1537,11 @@ i0.ɵɵngDeclareClassMetadata({
1521
1537
  required: false
1522
1538
  }]
1523
1539
  }],
1524
- modalConfirmButtonColor: [{
1540
+ modalConfirmButtonIntent: [{
1525
1541
  type: i0.Input,
1526
1542
  args: [{
1527
1543
  isSignal: true,
1528
- alias: "modalConfirmButtonColor",
1544
+ alias: "modalConfirmButtonIntent",
1529
1545
  required: false
1530
1546
  }]
1531
1547
  }],
@@ -1665,8 +1681,23 @@ var ButtonDeleteComponent = class ButtonDeleteComponent extends BaseButton {
1665
1681
  }],
1666
1682
  usesInheritance: true,
1667
1683
  ngImport: i0,
1668
- template: "@if (isVisible()) {\n <lib-ribbon-button\n color=\"text-red-500\"\n icon=\"fa-trash-alt\"\n [disabled]=\"disabled()\"\n [label]=\"label()\"\n [loading]=\"loading()\"\n (action)=\"onButtonClicked()\"\n >\n </lib-ribbon-button>\n}\n\n<framework-confirm-modal\n #modal\n messageIcon=\"fa-solid fa-circle-exclamation\"\n messageIconColor=\"text-red-500\"\n [message]=\"modalMessage()\"\n [title]=\"modalTitle()\"\n>\n <div footer>\n <button class=\"btn red-500\" type=\"button\" [class.loading]=\"modal.isLoading()\" (click)=\"onDelete()\">\n {{ modalConfirmButtonLabel() | translate }}\n </button>\n </div>\n</framework-confirm-modal>\n",
1684
+ template: "@if (isVisible()) {\n <lib-ribbon-button\n color=\"text-red-500\"\n icon=\"fa-trash-alt\"\n [disabled]=\"disabled()\"\n [label]=\"label()\"\n [loading]=\"loading()\"\n (action)=\"onButtonClicked()\"\n >\n </lib-ribbon-button>\n}\n\n<framework-confirm-modal\n #modal\n messageIcon=\"fa-solid fa-circle-exclamation\"\n messageIconColor=\"text-red-500\"\n [message]=\"modalMessage()\"\n [title]=\"modalTitle()\"\n>\n <div footer>\n <lib-button intent=\"danger\" [loading]=\"modal.isLoading()\" (click)=\"onDelete()\">\n {{ modalConfirmButtonLabel() | translate }}\n </lib-button>\n </div>\n</framework-confirm-modal>\n",
1669
1685
  dependencies: [
1686
+ {
1687
+ kind: "component",
1688
+ type: ButtonComponent$1,
1689
+ selector: "lib-button",
1690
+ inputs: [
1691
+ "intent",
1692
+ "type",
1693
+ "disabled",
1694
+ "loading",
1695
+ "success",
1696
+ "error",
1697
+ "icon",
1698
+ "ariaLabel"
1699
+ ]
1700
+ },
1670
1701
  {
1671
1702
  kind: "component",
1672
1703
  type: ConfirmModalComponent,
@@ -1718,6 +1749,7 @@ i0.ɵɵngDeclareClassMetadata({
1718
1749
  args: [{
1719
1750
  selector: "framework-button-delete",
1720
1751
  imports: [
1752
+ ButtonComponent$1,
1721
1753
  ConfirmModalComponent,
1722
1754
  RibbonButtonComponent,
1723
1755
  TranslatePipe
@@ -1726,7 +1758,7 @@ i0.ɵɵngDeclareClassMetadata({
1726
1758
  provide: RibbonGroupChild,
1727
1759
  useExisting: forwardRef(() => ButtonDeleteComponent)
1728
1760
  }],
1729
- template: "@if (isVisible()) {\n <lib-ribbon-button\n color=\"text-red-500\"\n icon=\"fa-trash-alt\"\n [disabled]=\"disabled()\"\n [label]=\"label()\"\n [loading]=\"loading()\"\n (action)=\"onButtonClicked()\"\n >\n </lib-ribbon-button>\n}\n\n<framework-confirm-modal\n #modal\n messageIcon=\"fa-solid fa-circle-exclamation\"\n messageIconColor=\"text-red-500\"\n [message]=\"modalMessage()\"\n [title]=\"modalTitle()\"\n>\n <div footer>\n <button class=\"btn red-500\" type=\"button\" [class.loading]=\"modal.isLoading()\" (click)=\"onDelete()\">\n {{ modalConfirmButtonLabel() | translate }}\n </button>\n </div>\n</framework-confirm-modal>\n"
1761
+ template: "@if (isVisible()) {\n <lib-ribbon-button\n color=\"text-red-500\"\n icon=\"fa-trash-alt\"\n [disabled]=\"disabled()\"\n [label]=\"label()\"\n [loading]=\"loading()\"\n (action)=\"onButtonClicked()\"\n >\n </lib-ribbon-button>\n}\n\n<framework-confirm-modal\n #modal\n messageIcon=\"fa-solid fa-circle-exclamation\"\n messageIconColor=\"text-red-500\"\n [message]=\"modalMessage()\"\n [title]=\"modalTitle()\"\n>\n <div footer>\n <lib-button intent=\"danger\" [loading]=\"modal.isLoading()\" (click)=\"onDelete()\">\n {{ modalConfirmButtonLabel() | translate }}\n </lib-button>\n </div>\n</framework-confirm-modal>\n"
1730
1762
  }]
1731
1763
  }],
1732
1764
  ctorParameters: () => [],
@@ -2248,9 +2280,24 @@ var ButtonFiltersComponent = class ButtonFiltersComponent extends BaseButton {
2248
2280
  }],
2249
2281
  usesInheritance: true,
2250
2282
  ngImport: i0,
2251
- template: "<lib-ribbon-button\n [color]=\"hasFiltersApplied ? 'text-amber-500' : 'text-primary-500'\"\n [disabled]=\"disabled()\"\n [icon]=\"'fa-filter'\"\n [iconSize]=\"iconSize()\"\n [label]=\"'Button-Filters'\"\n [loading]=\"loading()\"\n (action)=\"onFiltersButtonClicked()\"\n>\n</lib-ribbon-button>\n\n@if (hasFiltersApplied) {\n <lib-ribbon-button\n [color]=\"'text-red-500'\"\n [disabled]=\"disabled()\"\n [icon]=\"'fa-broom'\"\n [iconSize]=\"iconSize()\"\n [label]=\"'Button-Filters-Clear'\"\n [loading]=\"loading()\"\n (action)=\"onResetButtonClicked()\"\n >\n </lib-ribbon-button>\n}\n\n<lib-modal\n position=\"top\"\n [size]=\"modalSize()\"\n [title]=\"modalTitle() | translate\"\n [closeButtonText]=\"'Button-Modal-Cancel' | translate\"\n>\n <ng-container body>\n <ng-content></ng-content>\n </ng-container>\n <div footer>\n <button type=\"submit\" class=\"btn blue-500\" (click)=\"onFiltersSubmitClicked()\">\n {{ 'Button-Filters-Modal-Confirm' | translate }}\n </button>\n </div>\n</lib-modal>\n",
2283
+ template: "<lib-ribbon-button\n [color]=\"hasFiltersApplied ? 'text-amber-500' : 'text-primary-500'\"\n [disabled]=\"disabled()\"\n [icon]=\"'fa-filter'\"\n [iconSize]=\"iconSize()\"\n [label]=\"'Button-Filters'\"\n [loading]=\"loading()\"\n (action)=\"onFiltersButtonClicked()\"\n>\n</lib-ribbon-button>\n\n@if (hasFiltersApplied) {\n <lib-ribbon-button\n [color]=\"'text-red-500'\"\n [disabled]=\"disabled()\"\n [icon]=\"'fa-broom'\"\n [iconSize]=\"iconSize()\"\n [label]=\"'Button-Filters-Clear'\"\n [loading]=\"loading()\"\n (action)=\"onResetButtonClicked()\"\n >\n </lib-ribbon-button>\n}\n\n<lib-modal\n position=\"top\"\n [size]=\"modalSize()\"\n [title]=\"modalTitle() | translate\"\n [closeButtonText]=\"'Button-Modal-Cancel' | translate\"\n>\n <ng-container body>\n <ng-content></ng-content>\n </ng-container>\n <div footer>\n <lib-button type=\"submit\" intent=\"primary\" (click)=\"onFiltersSubmitClicked()\">\n {{ 'Button-Filters-Modal-Confirm' | translate }}\n </lib-button>\n </div>\n</lib-modal>\n",
2252
2284
  styles: [":host{display:grid;grid-auto-columns:auto;grid-auto-flow:column}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"],
2253
2285
  dependencies: [
2286
+ {
2287
+ kind: "component",
2288
+ type: ButtonComponent$1,
2289
+ selector: "lib-button",
2290
+ inputs: [
2291
+ "intent",
2292
+ "type",
2293
+ "disabled",
2294
+ "loading",
2295
+ "success",
2296
+ "error",
2297
+ "icon",
2298
+ "ariaLabel"
2299
+ ]
2300
+ },
2254
2301
  {
2255
2302
  kind: "component",
2256
2303
  type: ModalComponent,
@@ -2304,6 +2351,7 @@ i0.ɵɵngDeclareClassMetadata({
2304
2351
  args: [{
2305
2352
  selector: "framework-button-filters",
2306
2353
  imports: [
2354
+ ButtonComponent$1,
2307
2355
  ModalComponent,
2308
2356
  RibbonButtonComponent,
2309
2357
  TranslatePipe
@@ -2312,7 +2360,7 @@ i0.ɵɵngDeclareClassMetadata({
2312
2360
  provide: RibbonGroupChild,
2313
2361
  useExisting: forwardRef(() => ButtonFiltersComponent)
2314
2362
  }],
2315
- template: "<lib-ribbon-button\n [color]=\"hasFiltersApplied ? 'text-amber-500' : 'text-primary-500'\"\n [disabled]=\"disabled()\"\n [icon]=\"'fa-filter'\"\n [iconSize]=\"iconSize()\"\n [label]=\"'Button-Filters'\"\n [loading]=\"loading()\"\n (action)=\"onFiltersButtonClicked()\"\n>\n</lib-ribbon-button>\n\n@if (hasFiltersApplied) {\n <lib-ribbon-button\n [color]=\"'text-red-500'\"\n [disabled]=\"disabled()\"\n [icon]=\"'fa-broom'\"\n [iconSize]=\"iconSize()\"\n [label]=\"'Button-Filters-Clear'\"\n [loading]=\"loading()\"\n (action)=\"onResetButtonClicked()\"\n >\n </lib-ribbon-button>\n}\n\n<lib-modal\n position=\"top\"\n [size]=\"modalSize()\"\n [title]=\"modalTitle() | translate\"\n [closeButtonText]=\"'Button-Modal-Cancel' | translate\"\n>\n <ng-container body>\n <ng-content></ng-content>\n </ng-container>\n <div footer>\n <button type=\"submit\" class=\"btn blue-500\" (click)=\"onFiltersSubmitClicked()\">\n {{ 'Button-Filters-Modal-Confirm' | translate }}\n </button>\n </div>\n</lib-modal>\n",
2363
+ template: "<lib-ribbon-button\n [color]=\"hasFiltersApplied ? 'text-amber-500' : 'text-primary-500'\"\n [disabled]=\"disabled()\"\n [icon]=\"'fa-filter'\"\n [iconSize]=\"iconSize()\"\n [label]=\"'Button-Filters'\"\n [loading]=\"loading()\"\n (action)=\"onFiltersButtonClicked()\"\n>\n</lib-ribbon-button>\n\n@if (hasFiltersApplied) {\n <lib-ribbon-button\n [color]=\"'text-red-500'\"\n [disabled]=\"disabled()\"\n [icon]=\"'fa-broom'\"\n [iconSize]=\"iconSize()\"\n [label]=\"'Button-Filters-Clear'\"\n [loading]=\"loading()\"\n (action)=\"onResetButtonClicked()\"\n >\n </lib-ribbon-button>\n}\n\n<lib-modal\n position=\"top\"\n [size]=\"modalSize()\"\n [title]=\"modalTitle() | translate\"\n [closeButtonText]=\"'Button-Modal-Cancel' | translate\"\n>\n <ng-container body>\n <ng-content></ng-content>\n </ng-container>\n <div footer>\n <lib-button type=\"submit\" intent=\"primary\" (click)=\"onFiltersSubmitClicked()\">\n {{ 'Button-Filters-Modal-Confirm' | translate }}\n </lib-button>\n </div>\n</lib-modal>\n",
2316
2364
  styles: [":host{display:grid;grid-auto-columns:auto;grid-auto-flow:column}\n/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n"]
2317
2365
  }]
2318
2366
  }],
@@ -4762,6 +4810,8 @@ var AppConfig = class {
4762
4810
  companyName;
4763
4811
  environment;
4764
4812
  logoUrl;
4813
+ loginBackgroundUrl;
4814
+ loginLogoUrl;
4765
4815
  notificationsEnabled;
4766
4816
  notificationsUrl;
4767
4817
  version;
@@ -4771,6 +4821,8 @@ var AppConfig = class {
4771
4821
  this.companyName = options?.companyName ?? "";
4772
4822
  this.environment = options?.environment ?? "";
4773
4823
  this.logoUrl = options?.logoUrl;
4824
+ this.loginBackgroundUrl = options?.loginBackgroundUrl;
4825
+ this.loginLogoUrl = options?.loginLogoUrl;
4774
4826
  this.notificationsEnabled = options?.notificationsEnabled ?? false;
4775
4827
  this.notificationsUrl = options?.notificationsUrl ?? "";
4776
4828
  this.version = options?.version ?? "";