@masmarino/gabarit 0.3.0 → 0.4.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@masmarino/gabarit",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "description": "Angular design system — UI components and dataviz for self-hosted applications.",
5
5
  "license": "MIT",
6
6
  "homepage": "https://github.com/Masmarino/Gabarit",
@@ -86,14 +86,26 @@
86
86
  }
87
87
 
88
88
  .gbt-app-shell__link {
89
+ position: relative;
89
90
  display: flex;
90
91
  align-items: center;
91
92
  gap: 0.625rem;
93
+ min-width: 0;
92
94
  padding: 0.5rem 0.75rem;
93
95
  border-radius: var(--site-border-radius-sm);
94
96
  color: var(--text-secondary);
95
97
  font-size: 0.875rem;
96
98
  text-decoration: none;
99
+ overflow: hidden;
100
+ white-space: nowrap;
101
+ text-overflow: ellipsis;
102
+
103
+ > span {
104
+ min-width: 0;
105
+ overflow: hidden;
106
+ white-space: nowrap;
107
+ text-overflow: ellipsis;
108
+ }
97
109
 
98
110
  &:hover {
99
111
  background: var(--bg-hover);
@@ -111,7 +123,46 @@
111
123
  }
112
124
  }
113
125
 
126
+ @media (min-width: 769px) {
127
+ .gbt-app-shell__nav--collapsed {
128
+ .gbt-app-shell__link {
129
+ > span {
130
+ display: inline-block;
131
+ width: 0;
132
+ overflow: hidden;
133
+ white-space: nowrap;
134
+ opacity: 0;
135
+ transition: opacity 0.15s ease, width 0.2s ease;
136
+ }
137
+
138
+ &:hover > span,
139
+ &:focus-visible > span {
140
+ position: absolute;
141
+ left: 100%;
142
+ top: 50%;
143
+ transform: translateY(-50%);
144
+ width: auto;
145
+ overflow: visible;
146
+ opacity: 1;
147
+ margin-left: 0.625rem;
148
+ padding: 0.375rem 0.625rem;
149
+ background: var(--bg-principal);
150
+ border: 1px solid var(--border-color);
151
+ border-radius: var(--site-border-radius-sm);
152
+ box-shadow: var(--site-shadow-md);
153
+ }
154
+
155
+ @media (prefers-reduced-motion: reduce) {
156
+ > span {
157
+ transition: none;
158
+ }
159
+ }
160
+ }
161
+ }
162
+ }
163
+
114
164
  .gbt-container {
165
+ box-sizing: border-box;
115
166
  width: 100%;
116
167
  max-width: 1200px;
117
168
  margin-inline: auto;
@@ -119,6 +170,7 @@
119
170
  }
120
171
 
121
172
  .gbt-menu__item {
173
+ box-sizing: border-box;
122
174
  display: flex;
123
175
  align-items: center;
124
176
  gap: 0.5rem;
@@ -143,3 +195,39 @@
143
195
  outline-offset: -2px;
144
196
  }
145
197
  }
198
+
199
+ .gbt-breadcrumb__list {
200
+ display: flex;
201
+ align-items: center;
202
+ flex-wrap: wrap;
203
+ gap: 0.375rem;
204
+ margin: 0;
205
+ padding: 0;
206
+ list-style: none;
207
+ font-size: 0.875rem;
208
+ }
209
+
210
+ .gbt-breadcrumb__list > li {
211
+ display: flex;
212
+ align-items: center;
213
+ gap: 0.375rem;
214
+ }
215
+
216
+ .gbt-breadcrumb__list > li:not(:last-child)::after {
217
+ content: '/';
218
+ color: var(--text-secondary);
219
+ }
220
+
221
+ .gbt-breadcrumb__item {
222
+ color: var(--text-secondary);
223
+ text-decoration: none;
224
+
225
+ &:hover {
226
+ text-decoration: underline;
227
+ }
228
+ }
229
+
230
+ .gbt-breadcrumb__current {
231
+ color: var(--text-primary);
232
+ font-weight: 600;
233
+ }
@@ -2,8 +2,9 @@ import * as _angular_platform_browser from '@angular/platform-browser';
2
2
  import * as _angular_core from '@angular/core';
3
3
  import { OnDestroy, TemplateRef, ElementRef, InjectionToken, Signal } from '@angular/core';
4
4
  import { ControlValueAccessor } from '@angular/forms';
5
+ import { Observable } from 'rxjs';
5
6
 
6
- declare const GABARIT_VERSION = "0.3.0";
7
+ declare const GABARIT_VERSION = "0.4.0";
7
8
 
8
9
  declare class Icon {
9
10
  private readonly sanitizer;
@@ -28,6 +29,11 @@ declare class AppShell {
28
29
  skipLabel: _angular_core.InputSignal<string>;
29
30
  openMenuLabel: _angular_core.InputSignal<string>;
30
31
  closeMenuLabel: _angular_core.InputSignal<string>;
32
+ collapseLabel: _angular_core.InputSignal<string>;
33
+ expandLabel: _angular_core.InputSignal<string>;
34
+ collapsed: _angular_core.InputSignal<boolean>;
35
+ collapsible: _angular_core.InputSignal<boolean>;
36
+ collapsedChange: _angular_core.OutputEmitterRef<boolean>;
31
37
  private readonly id;
32
38
  protected readonly mainId: string;
33
39
  protected readonly navId: string;
@@ -37,10 +43,11 @@ declare class AppShell {
37
43
  private readonly nav;
38
44
  protected toggleMenu(): void;
39
45
  protected close(): void;
46
+ protected toggleCollapsed(): void;
40
47
  protected onEscape(): void;
41
48
  protected onNavKeydown(event: KeyboardEvent): void;
42
49
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AppShell, never>;
43
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AppShell, "gbt-app-shell", never, { "navLabel": { "alias": "navLabel"; "required": true; "isSignal": true; }; "skipLabel": { "alias": "skipLabel"; "required": true; "isSignal": true; }; "openMenuLabel": { "alias": "openMenuLabel"; "required": true; "isSignal": true; }; "closeMenuLabel": { "alias": "closeMenuLabel"; "required": true; "isSignal": true; }; }, {}, never, ["[shell-brand]", "[shell-nav]", "[shell-header]", "*"], true, never>;
50
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AppShell, "gbt-app-shell", never, { "navLabel": { "alias": "navLabel"; "required": true; "isSignal": true; }; "skipLabel": { "alias": "skipLabel"; "required": true; "isSignal": true; }; "openMenuLabel": { "alias": "openMenuLabel"; "required": true; "isSignal": true; }; "closeMenuLabel": { "alias": "closeMenuLabel"; "required": true; "isSignal": true; }; "collapseLabel": { "alias": "collapseLabel"; "required": false; "isSignal": true; }; "expandLabel": { "alias": "expandLabel"; "required": false; "isSignal": true; }; "collapsed": { "alias": "collapsed"; "required": false; "isSignal": true; }; "collapsible": { "alias": "collapsible"; "required": false; "isSignal": true; }; }, { "collapsedChange": "collapsedChange"; }, never, ["[shell-brand]", "[shell-nav]", "[shell-header]", "*"], true, never>;
44
51
  }
45
52
 
46
53
  declare class Button {
@@ -765,6 +772,8 @@ declare class Menu {
765
772
  private readonly injector;
766
773
  label: _angular_core.InputSignal<string>;
767
774
  align: _angular_core.InputSignal<"start" | "end">;
775
+ triggerIcon: _angular_core.InputSignal<string | null>;
776
+ opened: _angular_core.OutputEmitterRef<void>;
768
777
  protected readonly open: _angular_core.WritableSignal<boolean>;
769
778
  protected readonly position: _angular_core.WritableSignal<PopupPosition | null>;
770
779
  private readonly trigger;
@@ -781,7 +790,33 @@ declare class Menu {
781
790
  private focus;
782
791
  private focusAfterRender;
783
792
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<Menu, never>;
784
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<Menu, "gbt-menu", never, { "label": { "alias": "label"; "required": true; "isSignal": true; }; "align": { "alias": "align"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
793
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<Menu, "gbt-menu", never, { "label": { "alias": "label"; "required": true; "isSignal": true; }; "align": { "alias": "align"; "required": false; "isSignal": true; }; "triggerIcon": { "alias": "triggerIcon"; "required": false; "isSignal": true; }; }, { "opened": "opened"; }, never, ["*"], true, never>;
794
+ }
795
+
796
+ declare class Breadcrumb {
797
+ ariaLabel: _angular_core.InputSignal<string>;
798
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<Breadcrumb, never>;
799
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<Breadcrumb, "gbt-breadcrumb", never, { "ariaLabel": { "alias": "ariaLabel"; "required": true; "isSignal": true; }; }, {}, never, ["[breadcrumb-ancestor]", "*"], true, never>;
800
+ }
801
+
802
+ declare class ConfirmDangerModal {
803
+ isOpen: _angular_core.InputSignal<boolean>;
804
+ heading: _angular_core.InputSignal<string>;
805
+ message: _angular_core.InputSignal<string>;
806
+ confirmText: _angular_core.InputSignal<string>;
807
+ confirmInputLabel: _angular_core.InputSignal<string>;
808
+ confirmLabel: _angular_core.InputSignal<string>;
809
+ cancelLabel: _angular_core.InputSignal<string>;
810
+ closeLabel: _angular_core.InputSignal<string>;
811
+ confirmed: _angular_core.OutputEmitterRef<void>;
812
+ closed: _angular_core.OutputEmitterRef<void>;
813
+ protected readonly typed: _angular_core.WritableSignal<string>;
814
+ protected readonly canConfirm: _angular_core.Signal<boolean>;
815
+ constructor();
816
+ protected confirm(): void;
817
+ protected cancel(): void;
818
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ConfirmDangerModal, never>;
819
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ConfirmDangerModal, "gbt-confirm-danger-modal", never, { "isOpen": { "alias": "isOpen"; "required": true; "isSignal": true; }; "heading": { "alias": "heading"; "required": true; "isSignal": true; }; "message": { "alias": "message"; "required": true; "isSignal": true; }; "confirmText": { "alias": "confirmText"; "required": true; "isSignal": true; }; "confirmInputLabel": { "alias": "confirmInputLabel"; "required": false; "isSignal": true; }; "confirmLabel": { "alias": "confirmLabel"; "required": false; "isSignal": true; }; "cancelLabel": { "alias": "cancelLabel"; "required": false; "isSignal": true; }; "closeLabel": { "alias": "closeLabel"; "required": false; "isSignal": true; }; }, { "confirmed": "confirmed"; "closed": "closed"; }, never, never, true, never>;
785
820
  }
786
821
 
787
822
  type ToastVariant = 'success' | 'error' | 'warning' | 'info';
@@ -901,5 +936,62 @@ declare class Textarea implements ControlValueAccessor {
901
936
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<Textarea, "gbt-textarea", never, { "id": { "alias": "id"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "errorMessage": { "alias": "errorMessage"; "required": false; "isSignal": true; }; "rows": { "alias": "rows"; "required": false; "isSignal": true; }; }, { "committed": "committed"; }, never, never, true, never>;
902
937
  }
903
938
 
904
- export { AppShell, BarChart, BarSeries, Button, CHART_CONTEXT, Card, ChartAxis, ChartEmpty, ChartFrame, ChartLegend, ChartTable, ChartTooltip, Checkbox, DimensionCard, FunnelChart, GABARIT_VERSION, GaugeBar, GbtInput, Icon, IconRegistry, LineChart, LineSeries, Menu, Modal, RadioGroup, SearchBar, Select, Sparkline, Switch, Tab, Table, Tabs, Textarea, TimelineChart, TimelineSeries, Toaster, Tooltip, areaPath, bandScale, formatCompact, formatDuration, formatNumber, formatPercent, linePath, linearScale, nearestIndex, niceTicks, niceXDomain, niceYDomain, timeScale, timeTicks };
905
- export type { AxisSpec, BandScale, ChartBox, ChartInterval, ChartMargin, ChartPoint, ChartReader, ChartSeries, DimensionRow, FunnelStep, LegendEntry, LinearAxisSpec, Point, PointValue, RadioOption, Scale, SearchResultCategory, SelectOption, TableColumn, TimeTicks, TimeUnit, ToastItem, ToastVariant, ToasterPosition, TooltipPoint, TooltipPosition, TooltipRow };
939
+ type AutocompleteSearchFn<T> = (query: string) => Observable<T[]> | Promise<T[]>;
940
+ declare class Autocomplete<T = unknown> implements ControlValueAccessor, OnDestroy {
941
+ private readonly elementRef;
942
+ id: _angular_core.InputSignal<string>;
943
+ label: _angular_core.InputSignal<string>;
944
+ placeholder: _angular_core.InputSignal<string>;
945
+ disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
946
+ required: _angular_core.InputSignalWithTransform<boolean, unknown>;
947
+ errorMessage: _angular_core.InputSignal<string | null>;
948
+ search: _angular_core.InputSignal<AutocompleteSearchFn<T>>;
949
+ displayFn: _angular_core.InputSignal<(item: T) => string>;
950
+ itemTemplate: _angular_core.InputSignal<TemplateRef<unknown> | undefined>;
951
+ debounceMs: _angular_core.InputSignal<number>;
952
+ minLength: _angular_core.InputSignal<number>;
953
+ loadingMessage: _angular_core.InputSignal<string>;
954
+ noResultsMessage: _angular_core.InputSignal<string>;
955
+ searchErrorMessage: _angular_core.InputSignal<string>;
956
+ resultsAnnouncement: _angular_core.InputSignal<(count: number) => string>;
957
+ itemSelected: _angular_core.OutputEmitterRef<T>;
958
+ protected readonly query: _angular_core.WritableSignal<string>;
959
+ protected readonly open: _angular_core.WritableSignal<boolean>;
960
+ protected readonly results: _angular_core.WritableSignal<T[]>;
961
+ protected readonly loading: _angular_core.WritableSignal<boolean>;
962
+ protected readonly searchFailed: _angular_core.WritableSignal<boolean>;
963
+ protected readonly activeIndex: _angular_core.WritableSignal<number>;
964
+ protected readonly selectedItem: _angular_core.WritableSignal<T | null>;
965
+ protected readonly panelStyle: _angular_core.WritableSignal<{
966
+ top: string;
967
+ left: string;
968
+ width: string;
969
+ } | null>;
970
+ private readonly formDisabled;
971
+ protected readonly isDisabled: _angular_core.Signal<boolean>;
972
+ protected readonly hasNoResults: _angular_core.Signal<boolean>;
973
+ protected readonly activeOptionId: _angular_core.Signal<string | null>;
974
+ private onChange;
975
+ private onTouched;
976
+ private requestSeq;
977
+ private debounceHandle?;
978
+ private subscription?;
979
+ setDisabledState(isDisabled: boolean): void;
980
+ writeValue(value: T | null): void;
981
+ registerOnChange(fn: (value: T | null) => void): void;
982
+ registerOnTouched(fn: () => void): void;
983
+ protected onInput(event: Event): void;
984
+ protected onFocus(): void;
985
+ protected onBlur(): void;
986
+ private scheduleSearch;
987
+ private runSearch;
988
+ protected updatePanelPosition(): void;
989
+ protected selectOption(item: T): void;
990
+ protected onKeydown(event: KeyboardEvent): void;
991
+ ngOnDestroy(): void;
992
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<Autocomplete<any>, never>;
993
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<Autocomplete<any>, "gbt-autocomplete", never, { "id": { "alias": "id"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "errorMessage": { "alias": "errorMessage"; "required": false; "isSignal": true; }; "search": { "alias": "search"; "required": true; "isSignal": true; }; "displayFn": { "alias": "displayFn"; "required": false; "isSignal": true; }; "itemTemplate": { "alias": "itemTemplate"; "required": false; "isSignal": true; }; "debounceMs": { "alias": "debounceMs"; "required": false; "isSignal": true; }; "minLength": { "alias": "minLength"; "required": false; "isSignal": true; }; "loadingMessage": { "alias": "loadingMessage"; "required": false; "isSignal": true; }; "noResultsMessage": { "alias": "noResultsMessage"; "required": false; "isSignal": true; }; "searchErrorMessage": { "alias": "searchErrorMessage"; "required": false; "isSignal": true; }; "resultsAnnouncement": { "alias": "resultsAnnouncement"; "required": false; "isSignal": true; }; }, { "itemSelected": "itemSelected"; }, never, never, true, never>;
994
+ }
995
+
996
+ export { AppShell, Autocomplete, BarChart, BarSeries, Breadcrumb, Button, CHART_CONTEXT, Card, ChartAxis, ChartEmpty, ChartFrame, ChartLegend, ChartTable, ChartTooltip, Checkbox, ConfirmDangerModal, DimensionCard, FunnelChart, GABARIT_VERSION, GaugeBar, GbtInput, Icon, IconRegistry, LineChart, LineSeries, Menu, Modal, RadioGroup, SearchBar, Select, Sparkline, Switch, Tab, Table, Tabs, Textarea, TimelineChart, TimelineSeries, Toaster, Tooltip, areaPath, bandScale, formatCompact, formatDuration, formatNumber, formatPercent, linePath, linearScale, nearestIndex, niceTicks, niceXDomain, niceYDomain, timeScale, timeTicks };
997
+ export type { AutocompleteSearchFn, AxisSpec, BandScale, ChartBox, ChartInterval, ChartMargin, ChartPoint, ChartReader, ChartSeries, DimensionRow, FunnelStep, LegendEntry, LinearAxisSpec, Point, PointValue, RadioOption, Scale, SearchResultCategory, SelectOption, TableColumn, TimeTicks, TimeUnit, ToastItem, ToastVariant, ToasterPosition, TooltipPoint, TooltipPosition, TooltipRow };