@table-bro/angular-material 1.1.0 → 1.2.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/README.md CHANGED
@@ -1,11 +1,27 @@
1
1
  # @table-bro/angular-material
2
2
 
3
- The Angular Material skin of [Table, Bro](https://table-bro.com): pixel-perfect Material data tables built from the
3
+ The Angular Material skin of [Table, Bro](https://table-bro.com): pixel-perfect Material (M3) data tables built from the
4
4
  components of Angular Material, in the theme of the application. The skin is `mat`.
5
5
 
6
6
  The package holds the config of the skin, its elements (Angular components that the table creates as Custom Elements),
7
7
  its CSS and its filter drawer container. The table itself is `<table-bro-ng>` of `@table-bro/angular`.
8
8
 
9
+ ## With an AI coding agent
10
+
11
+ The skin `mat` is the look that the agent gives an Angular table by default: a pixel-perfect Material Design 3 (M3) data
12
+ table in the theme of the application. Tell your AI assistant to use Table, Bro, or add its MCP server to Claude Code,
13
+ Cursor or Codex: the agent installs the packages, generates the table, its setup and its cells from one request, and
14
+ checks the result.
15
+
16
+ ```sh
17
+ claude mcp add --scope project table-bro -- npx -y @table-bro/mcp@1.2.0
18
+ ```
19
+
20
+ The setup for Cursor, Codex and VS Code is in the README of
21
+ [`@table-bro/mcp`](https://github.com/table-bro/table-bro/tree/main/packages/mcp) and on [MCP
22
+ server](https://table-bro.com/docs/ai/mcp-server). Docs: [Getting started](https://table-bro.com/docs/getting-started),
23
+ [Docs](https://table-bro.com/docs), [Material Design](https://table-bro.com/docs/design/material-design).
24
+
9
25
  ## Install
10
26
 
11
27
  In a project with Angular Material (`ng add @angular/material` adds it):
@@ -52,6 +68,11 @@ provideTableBroMatSkin(withTags(), withSwitch(), withToolbarMenu())
52
68
 
53
69
  In the dev mode a table that uses an optional element without its function writes the function to add in the console.
54
70
 
71
+ A cell of tags without items shows No data: `withTags({texts: {empty: 'No tags'}})` gives the text of the
72
+ application, and the signal `empty` of the service `TableBroMatTagsTexts` changes it at any time, as when the language of
73
+ the page changes: `inject(TableBroMatTagsTexts).empty.set('No tags')`. Since 1.2.0; the deprecated `texts.noItems`
74
+ of a config still works below them.
75
+
55
76
  The skin shows the ligature icons of Material. Load the font in `index.html`:
56
77
 
57
78
  ```html
@@ -1 +1 @@
1
- .mat .bro-details_tr>td>:first-child>*>div{padding:calc(var(--bro-row-height)/2)}table-bro-filter-drawer-container.mat>.bro-filter-drawer-scrim{z-index:4}table-bro-filter-drawer-container.mat>.bro-filter-drawer-card{z-index:5}table-bro-filter-drawer-container.mat>.bro-filter-drawer-header,table-bro-filter-drawer-container.mat>[slot=filters]{z-index:6}table-bro-filter-drawer-container.mat[modal]>.bro-filter-drawer-scrim{z-index:8}table-bro-filter-drawer-container.mat[modal]>.bro-filter-drawer-card{z-index:9}table-bro-filter-drawer-container.mat[modal]>.bro-filter-drawer-header,table-bro-filter-drawer-container.mat[modal]>[slot=filters]{z-index:10}table-bro-filter-drawer-container.mat>[slot=filters]>*,.mat .bro-filter-drawer-card>.bro-filter-drawer-header~*{padding:24px}.mat .bro-filter-drawer-header .bro-toolbar{height:64px;display:block}.mat .bro-filter-drawer-header .bro-toolbar>nav{box-sizing:border-box;height:100%}.mat .bro-shadow{padding-right:var(--bro-shadow-size);padding-left:var(--bro-shadow-size)}.mat .bro-table-shadows{z-index:-1;width:calc(100% - var(--bro-shadow-size)*2)}.mat .bro-table-shadows .bro-row{height:var(--bro-row-height)}.mat .bro-state-container{padding-left:17px;padding-right:17px;font-size:28px;line-height:40px}.mat .bro-state-container .bro-state-icon{width:40px;height:40px;margin-right:16px;font-size:40px;line-height:40px;top:40px}.mat .bro-state-container .bro-state-icon>svg{vertical-align:top;width:40px;height:40px}.mat .bro-state-container lottie-player{height:120px}table-bro.mat{width:calc(100% - var(--bro-shadow-size)*2);min-width:var(--bro-table-min-width)}table-bro.mat table th.bro-header-cell,table-bro.mat table td.bro-cell{box-sizing:border-box;padding:0 0 0 24px}table-bro.mat table th.bro-header-cell:last-child,table-bro.mat table td.bro-cell:last-child{padding-right:24px}.mat .bro-table-header_container{width:100%}.mat .bro-table-header_container .bro-table-header_shadow{z-index:-1;left:var(--bro-shadow-size);height:var(--bro-header-height)}.mat .bro-table-header_container .bro-table-header{z-index:3;left:var(--bro-shadow-size);position:relative}.mat .bro-table-body_container{z-index:2;top:calc(var(--bro-shadow-size)*-1);clip-path:polygon(0 0, 100% 0, 100% 100%, calc(100% - var(--bro-shadow-size)) 100%, calc(100% - var(--bro-shadow-size)) calc(100% - max(0px, var(--bro-shadow-size) + var(--bro-corner-radius) - 56px)), var(--bro-shadow-size) calc(100% - max(0px, var(--bro-shadow-size) + var(--bro-corner-radius) - 56px)), var(--bro-shadow-size) 100%, 0 100%)}.mat .bro-table-body,.mat .bro-table-body>.bro-table{z-index:2}.mat .bro-table-body,.mat .bro-table-shadows{padding-top:var(--bro-shadow-size)}.mat .bro-table-aux{top:var(--bro-shadow-size)}.mat .bro-cell_text-ellipsis-container{line-height:1.5}table-bro.mat .bro-cell-number .bro-cell_component{width:45.5px}.mat bro-mat-tags .mdc-evolution-chip-set__chips{box-sizing:border-box;flex-wrap:nowrap;align-items:center;width:100%;min-width:0;display:flex;overflow:hidden}.mat bro-mat-tags .mdc-evolution-chip-set__chips>mat-chip{flex:none}.mat bro-mat-tags .mdc-evolution-chip-set__chips>mat-chip:first-child{flex-shrink:1;min-width:0}.mat bro-mat-tags .mdc-evolution-chip-set__chips>mat-chip:first-child *{min-width:0}.mat bro-mat-tags .mdc-evolution-chip-set__chips>mat-chip:first-child .mdc-evolution-chip__text-label{text-overflow:ellipsis;overflow:hidden}.mat bro-mat-tags .mdc-evolution-chip-set__chips>.bro-cell-items-ellipsis{flex:none}.mat bro-mat-tags .mdc-evolution-chip-set__chips>.bro-cell-item-hidden{white-space:nowrap;clip-path:inset(50%);width:1px;height:1px;position:absolute;overflow:hidden}.mat .mat-elevation-z16{box-shadow:0 8px 10px -5px #0003,0 16px 24px 2px #00000024,0 6px 30px 5px #0000001f}table-bro-filter-drawer-container-ng.mat .mat-drawer{--mat-sidenav-container-background-color:transparent;bottom:calc(var(--bro-shadow-size)*2);width:calc(var(--bro-filter-drawer-width) + var(--bro-island-space-size));padding-left:var(--bro-island-space-size);overflow:visible}table-bro-filter-drawer-container-ng.mat .mat-drawer .mat-drawer-inner-container{overflow:visible}table-bro-filter-drawer-container-ng.mat .mat-drawer:not(.mat-drawer-opened):not(.mat-drawer-animating) .mat-drawer-inner-container{display:block}table-bro-filter-drawer-container-ng.mat .mat-drawer.mat-drawer-end{border-left:0}table-bro-filter-drawer-container-ng.mat .mat-drawer.mat-drawer-end:not(.mat-drawer-opened){transform:translate(0,0)}table-bro-filter-drawer-container-ng.mat .mat-drawer.mat-drawer-end.bro-filter-drawer_no-shadow{right:var(--bro-shadow-size)}table-bro-filter-drawer-container-ng.mat .mat-drawer .bro-filter-drawer-card{--bro-filter-drawer-opened:0;box-sizing:border-box;width:max(0px,var(--bro-filter-drawer-opened)*100% - (1 - var(--bro-filter-drawer-opened))*var(--bro-island-space-size));height:100%;margin-left:calc(100% - max(0px, var(--bro-filter-drawer-opened) * 100% - (1 - var(--bro-filter-drawer-opened)) * var(--bro-island-space-size)));border-radius:var(--bro-filter-drawer-corner-radius);overflow:hidden auto}table-bro-filter-drawer-container-ng.mat .mat-drawer .bro-filter-drawer-card>*{box-sizing:border-box;width:var(--bro-filter-drawer-width)}table-bro-filter-drawer-container-ng.mat .mat-drawer.mat-drawer-over .bro-filter-drawer-card{border-top-right-radius:var(--bro-corner-radius);border-bottom-right-radius:var(--bro-corner-radius)}table-bro-filter-drawer-container-ng .mat-drawer-container{--mat-sidenav-content-background-color:transparent}table-bro-filter-drawer-container-ng .mat-drawer-backdrop{bottom:calc(var(--bro-shadow-size)*2);border-radius:var(--bro-corner-radius)}table-bro-filter-drawer-container-ng .bro-filter-drawer_no-shadow>.mat-drawer-backdrop{right:var(--bro-shadow-size);left:var(--bro-shadow-size)}table-bro-filter-drawer-container-ng.mat .mat-drawer-opened .bro-filter-drawer-card{--bro-filter-drawer-opened:1}.mat .bro-filter-drawer-header .mat-toolbar{border-bottom-style:solid;border-bottom-width:1px}.mat .bro-paginator-container{top:calc(var(--bro-shadow-size)*-2);width:100%}.mat .bro-paginator-container .bro-paginator-shadow{z-index:-1;left:var(--bro-shadow-size);border-radius:0 0 var(--bro-corner-radius) var(--bro-corner-radius);height:56px}.mat .bro-paginator-container .mat-mdc-paginator{z-index:3;left:var(--bro-shadow-size);border-radius:0 0 var(--bro-corner-radius) var(--bro-corner-radius);background-color:var(--mat-table-background-color,var(--mat-sys-surface));position:relative}.mat .bro-table-header .mat-mdc-progress-bar{top:calc(var(--bro-header-height) - 3px);width:100%;height:3px;position:absolute}.mat .bro-table-aux .mat-mdc-progress-bar{z-index:2;top:calc(var(--bro-row-height) - 2px);width:100%;height:2px;position:absolute}.mat bro-mat-slide-toggle.bro-cell_component{overflow:visible}table-bro.mat .mat-sort-header-content{text-overflow:ellipsis;white-space:nowrap;transition:width calc(var(--bro-column-width-duration)*var(--bro-duration-scale)) ease;display:block;overflow:hidden}.mat table.mat-table{border-spacing:0}.mat tr.mat-header-row{height:var(--bro-header-height)}.mat tr.mat-row,.mat tr.mat-footer-row{height:var(--bro-row-height)}.mat th.mat-header-cell,.mat td.mat-cell,.mat td.mat-footer-cell{border-color:var(--mat-table-row-item-outline-color,var(--mat-sys-outline));font-weight:var(--mat-table-row-item-label-text-weight,var(--mat-sys-body-medium-weight));font-size:var(--mat-table-row-item-label-text-size,var(--mat-sys-body-medium-size));line-height:var(--mat-table-row-item-label-text-line-height,var(--mat-sys-body-medium-line-height));font-family:var(--mat-table-row-item-label-text-font,var(--mat-sys-body-medium-font));letter-spacing:var(--mat-table-row-item-label-text-tracking,var(--mat-sys-body-medium-tracking));color:var(--mat-table-row-item-label-text-color,var(--mat-sys-on-surface));border-bottom-style:solid;border-bottom-width:1px;padding:0}.mat th.mat-header-cell:first-of-type,.mat td.mat-cell:first-of-type,.mat td.mat-footer-cell:first-of-type{padding-left:24px}[dir=rtl] .mat th.mat-header-cell:first-of-type:not(:only-of-type),[dir=rtl] .mat td.mat-cell:first-of-type:not(:only-of-type),[dir=rtl] .mat td.mat-footer-cell:first-of-type:not(:only-of-type){padding-left:0;padding-right:24px}.mat th.mat-header-cell:last-of-type,.mat td.mat-cell:last-of-type,.mat td.mat-footer-cell:last-of-type{padding-right:24px}[dir=rtl] .mat th.mat-header-cell:last-of-type:not(:only-of-type),[dir=rtl] .mat td.mat-cell:last-of-type:not(:only-of-type),[dir=rtl] .mat td.mat-footer-cell:last-of-type:not(:only-of-type){padding-left:24px;padding-right:0}.mat th.mat-header-cell{font-weight:var(--mat-table-header-headline-weight,var(--mat-sys-title-small-weight));font-size:var(--mat-table-header-headline-size,var(--mat-sys-title-small-size));line-height:var(--mat-table-header-headline-line-height,var(--mat-sys-title-small-line-height));font-family:var(--mat-table-header-headline-font,var(--mat-sys-title-small-font));letter-spacing:var(--mat-table-header-headline-tracking,var(--mat-sys-title-small-tracking));text-align:left;color:var(--mat-table-header-headline-color,var(--mat-sys-on-surface))}[dir=rtl] .mat th.mat-header-cell{text-align:right}.mat bro-mat-tags .mdc-evolution-chip-set__chips>.bro-cell-items-ellipsis{color:var(--mat-chip-label-text-color,var(--mat-sys-on-surface-variant));margin-left:4px}.mat .bro-table-toolbar_container{top:0}.mat .bro-table-toolbar_container .bro-toolbar{height:64px;display:block}.mat .bro-table-toolbar_container .bro-toolbar>nav{box-sizing:border-box;height:100%}.mat .bro-table-toolbar_container{width:100%}.mat .bro-table-toolbar_container .bro-table-toolbar_shadow{z-index:-1;left:var(--bro-shadow-size);border-radius:var(--bro-corner-radius) var(--bro-corner-radius) 0 0;height:64px}.mat .bro-table-toolbar_container .mat-toolbar{z-index:7;left:var(--bro-shadow-size);border-radius:var(--bro-corner-radius) var(--bro-corner-radius) 0 0;border-bottom-style:solid;border-bottom-width:1px;position:relative}.mat .bro-table-toolbar_container .mat-toolbar.bro-toolbar-search{align-items:center;display:flex}.mat .mat-toolbar .bro-toolbar_content-search{line-height:inherit}.mat .mat-toolbar .bro-toolbar_content-search input{font-weight:inherit;font-size:inherit;line-height:inherit}.mat .mat-toolbar .bro-toolbar_content-search input::placeholder{color:var(--mat-sys-on-surface-variant)}.mat .mat-table{background:0 0}.mat .bro-table-header_container>table{background:var(--mat-table-background-color,var(--mat-sys-surface))}.mat .bro-table-toolbar_container .mat-toolbar,.mat .bro-filter-drawer-header .mat-toolbar{border-bottom-color:var(--mat-table-row-item-outline-color,var(--mat-sys-outline));background:var(--mat-table-background-color,var(--mat-sys-surface))}table-bro-filter-drawer-container.mat>.bro-filter-drawer-header,table-bro-filter-drawer-container.mat>[slot=filters],.mat .bro-cell-items-ellipsis{color:var(--mat-table-row-item-label-text-color,var(--mat-sys-on-surface))}.mat .bro-filter-drawer-card{background:var(--mat-table-background-color,var(--mat-sys-surface));color:var(--mat-table-row-item-label-text-color,var(--mat-sys-on-surface))}.mat .bro-table tr.bro-row{background:var(--mat-table-background-color,var(--mat-sys-surface))}.mat .bro-table .bro-details_tr{background-color:var(--mat-table-background-color,var(--mat-sys-surface))}.mat .bro-toolbar_content-search input{background:var(--mat-table-background-color,var(--mat-sys-surface));color:var(--mat-table-row-item-label-text-color,var(--mat-sys-on-surface))}.mat .bro-toolbar_content-search input::placeholder{color:var(--mat-sys-on-surface-variant)}.mat .bro-paginator-outer-container{background-color:var(--mat-table-background-color,var(--mat-sys-surface))}.bro-dark-theme .mat,.bro-dark-theme.mat{--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}.mat.bro-light-theme{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light}.bro-table-shadow-container>table-bro.mat{margin-left:calc(var(--bro-shadow-size)*-1);width:100%}:where(.mat){--bro-row-height:52px;--bro-header-height:56px;--bro-shadow-size:42px;--bro-corner-radius:12px;--bro-island-space-size:21px;--bro-table-min-width:541px;--bro-filter-drawer-width:320px;--bro-filter-drawer-corner-radius:16px;--bro-table-body-container-z-index:2;--bro-refresh-overlay-opacity:.5;--bro-refresh-overlay-opacity-dark:.5;--bro-column-width-duration:.5s;--bro-details-duration:.35s;--bro-details-easing:cubic-bezier(.37, 0, .63, 1);--bro-filter-drawer-duration:.4s;--bro-kinetic-time-constant:.28s;--bro-state-icon-duration:.5s;--bro-state-message-duration:.75s;--bro-duration-scale:1}@media (prefers-reduced-motion:reduce){:where(.mat){--bro-duration-scale:0}}
1
+ .mat .bro-details_tr>td>:first-child>*>div{padding:calc(var(--bro-row-height)/2)}table-bro-filter-drawer-container.mat>.bro-filter-drawer-scrim{z-index:4}table-bro-filter-drawer-container.mat>.bro-filter-drawer-card{z-index:5}table-bro-filter-drawer-container.mat>.bro-filter-drawer-header,table-bro-filter-drawer-container.mat>[slot=filters]{z-index:6}table-bro-filter-drawer-container.mat[modal]>.bro-filter-drawer-scrim{z-index:8}table-bro-filter-drawer-container.mat[modal]>.bro-filter-drawer-card{z-index:9}table-bro-filter-drawer-container.mat[modal]>.bro-filter-drawer-header,table-bro-filter-drawer-container.mat[modal]>[slot=filters]{z-index:10}table-bro-filter-drawer-container.mat>[slot=filters]>*,.mat .bro-filter-drawer-card>.bro-filter-drawer-header~*{padding:24px}.mat .bro-filter-drawer-header .bro-toolbar{height:64px;display:block}.mat .bro-filter-drawer-header .bro-toolbar>nav{box-sizing:border-box;height:100%}.mat .bro-shadow{padding-right:var(--bro-shadow-size);padding-left:var(--bro-shadow-size)}.mat .bro-table-shadows{z-index:-1;width:calc(100% - var(--bro-shadow-size)*2)}.mat .bro-table-shadows .bro-row{height:var(--bro-row-height)}.mat .bro-state-container{padding-left:17px;padding-right:17px;font-size:28px;line-height:40px}.mat .bro-state-container .bro-state-icon{width:40px;height:40px;margin-right:16px;font-size:40px;line-height:40px;top:40px}.mat .bro-state-container .bro-state-icon>svg{vertical-align:top;width:40px;height:40px}.mat .bro-state-container lottie-player{height:120px}table-bro.mat{width:calc(100% - var(--bro-shadow-size)*2);min-width:var(--bro-table-min-width)}table-bro.mat table th.bro-header-cell,table-bro.mat table td.bro-cell{box-sizing:border-box;padding:0 0 0 24px}table-bro.mat table th.bro-header-cell:last-child,table-bro.mat table td.bro-cell:last-child{padding-right:24px}.mat .bro-table-header_container{width:100%}.mat .bro-table-header_container .bro-table-header_shadow{z-index:-1;left:var(--bro-shadow-size);height:var(--bro-header-height)}.mat .bro-table-header_container .bro-table-header{z-index:3;left:var(--bro-shadow-size);position:relative}.mat .bro-table-body_container{z-index:2;top:calc(var(--bro-shadow-size)*-1);clip-path:polygon(0 0, 100% 0, 100% 100%, calc(100% - var(--bro-shadow-size)) 100%, calc(100% - var(--bro-shadow-size)) calc(100% - max(0px, var(--bro-shadow-size) + var(--bro-corner-radius) - 56px)), var(--bro-shadow-size) calc(100% - max(0px, var(--bro-shadow-size) + var(--bro-corner-radius) - 56px)), var(--bro-shadow-size) 100%, 0 100%)}.mat .bro-table-body,.mat .bro-table-body>.bro-table{z-index:2}.mat .bro-table-body,.mat .bro-table-shadows{padding-top:var(--bro-shadow-size)}.mat .bro-table-aux{top:var(--bro-shadow-size)}.mat .bro-cell_text-ellipsis-container{line-height:1.5}table-bro.mat .bro-cell-number .bro-cell_component{width:45.5px}.mat bro-mat-tags .mdc-evolution-chip-set__chips{box-sizing:border-box;flex-wrap:nowrap;align-items:center;width:100%;min-width:0;display:flex;overflow:hidden}.mat bro-mat-tags .mdc-evolution-chip-set__chips>mat-chip{flex:none}.mat bro-mat-tags .mdc-evolution-chip-set__chips>mat-chip:first-child{flex-shrink:1;min-width:0}.mat bro-mat-tags .mdc-evolution-chip-set__chips>mat-chip:first-child *{min-width:0}.mat bro-mat-tags .mdc-evolution-chip-set__chips>mat-chip:first-child .mdc-evolution-chip__text-label{text-overflow:ellipsis;overflow:hidden}.mat bro-mat-tags .mdc-evolution-chip-set__chips>.bro-cell-items-ellipsis{flex:none}.mat bro-mat-tags .mdc-evolution-chip-set__chips>.bro-cell-item-hidden{white-space:nowrap;clip-path:inset(50%);width:1px;height:1px;position:absolute;overflow:hidden}.mat .mat-elevation-z16{box-shadow:0 8px 10px -5px #0003,0 16px 24px 2px #00000024,0 6px 30px 5px #0000001f}table-bro-filter-drawer-container-ng.mat .mat-drawer{--mat-sidenav-container-background-color:transparent;bottom:calc(var(--bro-shadow-size)*2);width:calc(var(--bro-filter-drawer-width) + var(--bro-island-space-size));padding-left:var(--bro-island-space-size);overflow:visible}table-bro-filter-drawer-container-ng.mat .mat-drawer .mat-drawer-inner-container{overflow:visible}table-bro-filter-drawer-container-ng.mat .mat-drawer:not(.mat-drawer-opened):not(.mat-drawer-animating) .mat-drawer-inner-container{display:block}table-bro-filter-drawer-container-ng.mat .mat-drawer.mat-drawer-end{border-left:0}table-bro-filter-drawer-container-ng.mat .mat-drawer.mat-drawer-end:not(.mat-drawer-opened){transform:translate(0,0)}table-bro-filter-drawer-container-ng.mat .mat-drawer.mat-drawer-end.bro-filter-drawer_no-shadow{right:var(--bro-shadow-size)}table-bro-filter-drawer-container-ng.mat .mat-drawer .bro-filter-drawer-card{--bro-filter-drawer-opened:0;box-sizing:border-box;width:max(0px,var(--bro-filter-drawer-opened)*100% - (1 - var(--bro-filter-drawer-opened))*var(--bro-island-space-size));height:100%;margin-left:calc(100% - max(0px, var(--bro-filter-drawer-opened) * 100% - (1 - var(--bro-filter-drawer-opened)) * var(--bro-island-space-size)));border-radius:var(--bro-filter-drawer-corner-radius);overflow:hidden auto}table-bro-filter-drawer-container-ng.mat .mat-drawer .bro-filter-drawer-card>*{box-sizing:border-box;width:var(--bro-filter-drawer-width)}table-bro-filter-drawer-container-ng.mat .mat-drawer.mat-drawer-over .bro-filter-drawer-card{border-top-right-radius:var(--bro-corner-radius);border-bottom-right-radius:var(--bro-corner-radius)}table-bro-filter-drawer-container-ng .mat-drawer-container{--mat-sidenav-content-background-color:transparent}table-bro-filter-drawer-container-ng .mat-drawer-backdrop{bottom:calc(var(--bro-shadow-size)*2);border-radius:var(--bro-corner-radius)}table-bro-filter-drawer-container-ng .bro-filter-drawer_no-shadow>.mat-drawer-backdrop{right:var(--bro-shadow-size);left:var(--bro-shadow-size)}table-bro-filter-drawer-container-ng.mat .mat-drawer-opened .bro-filter-drawer-card{--bro-filter-drawer-opened:1}.mat .bro-filter-drawer-header .mat-toolbar{border-bottom-style:solid;border-bottom-width:1px}.mat .bro-paginator-container{top:calc(var(--bro-shadow-size)*-2);width:100%}.mat .bro-paginator-container .bro-paginator-shadow{z-index:-1;left:var(--bro-shadow-size);border-radius:0 0 var(--bro-corner-radius) var(--bro-corner-radius);height:56px}.mat .bro-paginator-container .mat-mdc-paginator{z-index:3;left:var(--bro-shadow-size);border-radius:0 0 var(--bro-corner-radius) var(--bro-corner-radius);background-color:var(--mat-table-background-color,var(--mat-sys-surface));position:relative}.mat .bro-table-header .mat-mdc-progress-bar{top:calc(var(--bro-header-height) - 3px);width:100%;height:3px;position:absolute}.mat .bro-table-aux .mat-mdc-progress-bar{z-index:2;top:calc(var(--bro-row-height) - 2px);width:100%;height:2px;position:absolute}.mat bro-mat-slide-toggle.bro-cell_component{overflow:visible}table-bro.mat .mat-sort-header-content{text-overflow:ellipsis;white-space:nowrap;transition:width calc(var(--bro-column-width-duration)*var(--bro-duration-scale)) ease;display:block;overflow:hidden}.mat table.mat-table{border-spacing:0}.mat tr.mat-header-row{height:var(--bro-header-height)}.mat tr.mat-row,.mat tr.mat-footer-row{height:var(--bro-row-height)}.mat th.mat-header-cell,.mat td.mat-cell,.mat td.mat-footer-cell{border-color:var(--mat-table-row-item-outline-color,var(--mat-sys-outline));font-weight:var(--mat-table-row-item-label-text-weight,var(--mat-sys-body-medium-weight));font-size:var(--mat-table-row-item-label-text-size,var(--mat-sys-body-medium-size));line-height:var(--mat-table-row-item-label-text-line-height,var(--mat-sys-body-medium-line-height));font-family:var(--mat-table-row-item-label-text-font,var(--mat-sys-body-medium-font));letter-spacing:var(--mat-table-row-item-label-text-tracking,var(--mat-sys-body-medium-tracking));color:var(--mat-table-row-item-label-text-color,var(--mat-sys-on-surface));border-bottom-style:solid;border-bottom-width:1px;padding:0}.mat th.mat-header-cell:first-of-type,.mat td.mat-cell:first-of-type,.mat td.mat-footer-cell:first-of-type{padding-left:24px}[dir=rtl] .mat th.mat-header-cell:first-of-type:not(:only-of-type),[dir=rtl] .mat td.mat-cell:first-of-type:not(:only-of-type),[dir=rtl] .mat td.mat-footer-cell:first-of-type:not(:only-of-type){padding-left:0;padding-right:24px}.mat th.mat-header-cell:last-of-type,.mat td.mat-cell:last-of-type,.mat td.mat-footer-cell:last-of-type{padding-right:24px}[dir=rtl] .mat th.mat-header-cell:last-of-type:not(:only-of-type),[dir=rtl] .mat td.mat-cell:last-of-type:not(:only-of-type),[dir=rtl] .mat td.mat-footer-cell:last-of-type:not(:only-of-type){padding-left:24px;padding-right:0}.mat th.mat-header-cell{font-weight:var(--mat-table-header-headline-weight,var(--mat-sys-title-small-weight));font-size:var(--mat-table-header-headline-size,var(--mat-sys-title-small-size));line-height:var(--mat-table-header-headline-line-height,var(--mat-sys-title-small-line-height));font-family:var(--mat-table-header-headline-font,var(--mat-sys-title-small-font));letter-spacing:var(--mat-table-header-headline-tracking,var(--mat-sys-title-small-tracking));text-align:left;color:var(--mat-table-header-headline-color,var(--mat-sys-on-surface))}[dir=rtl] .mat th.mat-header-cell{text-align:right}.mat bro-mat-tags .mdc-evolution-chip-set__chips>.bro-cell-items-ellipsis{color:var(--mat-chip-label-text-color,var(--mat-sys-on-surface-variant));margin-left:4px}.mat .bro-table-toolbar_container{top:0}.mat .bro-table-toolbar_container .bro-toolbar{height:64px;display:block}.mat .bro-table-toolbar_container .bro-toolbar>nav{box-sizing:border-box;height:100%}.mat .bro-table-toolbar_container{width:100%}.mat .bro-table-toolbar_container .bro-table-toolbar_shadow{z-index:-1;left:var(--bro-shadow-size);border-radius:var(--bro-corner-radius) var(--bro-corner-radius) 0 0;height:64px}.mat .bro-table-toolbar_container .mat-toolbar{z-index:7;left:var(--bro-shadow-size);border-radius:var(--bro-corner-radius) var(--bro-corner-radius) 0 0;border-bottom-style:solid;border-bottom-width:1px;position:relative}.mat .bro-table-toolbar_container .mat-toolbar.bro-toolbar-search{align-items:center;display:flex}.mat .mat-toolbar .bro-toolbar_content-search{line-height:inherit}.mat .mat-toolbar .bro-toolbar_content-search input{font-weight:inherit;font-size:inherit;line-height:inherit}.mat .mat-toolbar .bro-toolbar_content-search input::placeholder{color:var(--mat-sys-on-surface-variant)}.mat .mat-table{background:0 0}.mat .bro-table-header_container>table{background:var(--mat-table-background-color,var(--mat-sys-surface))}.mat .bro-table-toolbar_container .mat-toolbar,.mat .bro-filter-drawer-header .mat-toolbar{border-bottom-color:var(--mat-table-row-item-outline-color,var(--mat-sys-outline));background:var(--mat-table-background-color,var(--mat-sys-surface))}table-bro-filter-drawer-container.mat>.bro-filter-drawer-header,table-bro-filter-drawer-container.mat>[slot=filters],.mat .bro-cell-items-ellipsis{color:var(--mat-table-row-item-label-text-color,var(--mat-sys-on-surface))}.mat .bro-filter-drawer-card{background:var(--mat-table-background-color,var(--mat-sys-surface));color:var(--mat-table-row-item-label-text-color,var(--mat-sys-on-surface))}.mat .bro-table tr.bro-row{background:var(--mat-table-background-color,var(--mat-sys-surface))}.mat .bro-table .bro-details_tr{background-color:var(--mat-table-background-color,var(--mat-sys-surface))}.mat .bro-toolbar_content-search input{background:var(--mat-table-background-color,var(--mat-sys-surface));color:var(--mat-table-row-item-label-text-color,var(--mat-sys-on-surface))}.mat .bro-toolbar_content-search input::placeholder{color:var(--mat-sys-on-surface-variant)}.mat .bro-paginator-outer-container{background-color:var(--mat-table-background-color,var(--mat-sys-surface))}.bro-dark-theme .mat,.bro-dark-theme.mat{--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}.mat.bro-light-theme{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light}.bro-table-shadow-container>table-bro.mat{margin-left:calc(var(--bro-shadow-size)*-1);width:100%}:where(.mat){--bro-row-height:52px;--bro-header-height:56px;--bro-shadow-size:42px;--bro-corner-radius:12px;--bro-island-space-size:21px;--bro-table-min-width:541px;--bro-filter-drawer-width:320px;--bro-filter-drawer-corner-radius:16px;--bro-table-body-container-z-index:2;--bro-refresh-overlay-opacity:.5;--bro-refresh-overlay-opacity-dark:.5;--bro-column-width-duration:.5s;--bro-details-duration:.35s;--bro-details-easing:cubic-bezier(.37, 0, .63, 1);--bro-filter-drawer-duration:.4s;--bro-kinetic-time-constant:.28s;--bro-state-icon-duration:.5s;--bro-state-message-duration:.75s;--bro-duration-scale:1}@media (prefers-reduced-motion:reduce){:where(.mat){--bro-duration-scale:0}}table-bro:where([data-bro-prerender].mat){--bro-row-height:52px;--bro-header-height:56px;--bro-shadow-size:42px;--bro-corner-radius:12px;--bro-island-space-size:21px;--bro-table-min-width:541px;--bro-filter-drawer-width:320px;--bro-filter-drawer-corner-radius:16px;--bro-table-body-container-z-index:2;--bro-refresh-overlay-opacity:.5;--bro-refresh-overlay-opacity-dark:.5;--bro-column-width-duration:.5s;--bro-details-duration:.35s;--bro-details-easing:cubic-bezier(.37, 0, .63, 1);--bro-filter-drawer-duration:.4s;--bro-kinetic-time-constant:.28s;--bro-state-icon-duration:.5s;--bro-state-message-duration:.75s;--bro-duration-scale:1}@media (prefers-reduced-motion:reduce){table-bro:where([data-bro-prerender].mat){--bro-duration-scale:0}}
@@ -1,18 +1,19 @@
1
1
  import * as i0 from "@angular/core";
2
- import { CUSTOM_ELEMENTS_SCHEMA, ChangeDetectionStrategy, Component, DestroyRef, ElementRef, EnvironmentInjector, PLATFORM_ID, afterNextRender, computed, effect, inject, input, model, output, provideAppInitializer, signal, viewChild } from "@angular/core";
2
+ import { CUSTOM_ELEMENTS_SCHEMA, ChangeDetectionStrategy, Component, DestroyRef, ElementRef, EnvironmentInjector, Injectable, PLATFORM_ID, afterNextRender, computed, effect, inject, input, makeEnvironmentProviders, model, output, provideAppInitializer, signal, viewChild } from "@angular/core";
3
3
  import { MatButton, MatIconButton } from "@angular/material/button";
4
4
  import { MatIcon } from "@angular/material/icon";
5
5
  import { MatSlideToggle } from "@angular/material/slide-toggle";
6
+ import { isPlatformBrowser } from "@angular/common";
6
7
  import { MatSort, MatSortHeader } from "@angular/material/sort";
7
8
  import { MatTooltip } from "@angular/material/tooltip";
8
- import { BroHTML, broCellSelectors, dispatchAction, events, fitCellItems, registerSkin, resolveTexts } from "@table-bro/core";
9
+ import { BroHTML, broCellSelectors, dispatchAction, events, fitCellItems, isPrerendered, registerFilterDrawerProperties, registerSkin, resolveTexts } from "@table-bro/core";
9
10
  import { MatChip, MatChipSet } from "@angular/material/chips";
11
+ import { FocusMonitor, InputModalityDetector } from "@angular/cdk/a11y";
10
12
  import { MatDrawer, MatDrawerContainer, MatDrawerContent } from "@angular/material/sidenav";
11
13
  import { MatToolbar } from "@angular/material/toolbar";
12
- import { TableBroNg } from "@table-bro/angular";
14
+ import { TABLE_BRO_ELEMENTS, TableBroNg } from "@table-bro/angular";
13
15
  import { MatDivider } from "@angular/material/divider";
14
16
  import { MatMenu, MatMenuItem, MatMenuTrigger } from "@angular/material/menu";
15
- import { isPlatformBrowser } from "@angular/common";
16
17
  import { createCustomElement } from "@angular/elements";
17
18
  import { MatPaginator } from "@angular/material/paginator";
18
19
  import { MatProgressBar } from "@angular/material/progress-bar";
@@ -453,9 +454,14 @@ var BroMaterialSortHeaderComponent = class BroMaterialSortHeaderComponent {
453
454
  this.matSortDirection.set("");
454
455
  }
455
456
  });
457
+ const browser = isPlatformBrowser(inject(PLATFORM_ID));
456
458
  effect((onCleanup) => {
457
459
  const header = this.sortHeader()?.nativeElement;
458
460
  if (!header) return;
461
+ if (!browser) {
462
+ header.removeAttribute("aria-sort");
463
+ return;
464
+ }
459
465
  const observer = new MutationObserver(() => header.removeAttribute("aria-sort"));
460
466
  header.removeAttribute("aria-sort");
461
467
  observer.observe(header, {
@@ -691,6 +697,40 @@ i0.ɵɵngDeclareClassMetadata({
691
697
  }]
692
698
  }
693
699
  });
700
+ var TableBroMatTagsTexts = class TableBroMatTagsTexts {
701
+ constructor() {
702
+ this.empty = signal(void 0, ...ngDevMode ? [{ debugName: "empty" }] : /* istanbul ignore next */ []);
703
+ }
704
+ static {
705
+ this.ɵfac = i0.ɵɵngDeclareFactory({
706
+ minVersion: "12.0.0",
707
+ version: "22.2.2",
708
+ ngImport: i0,
709
+ type: TableBroMatTagsTexts,
710
+ deps: [],
711
+ target: i0.ɵɵFactoryTarget.Injectable
712
+ });
713
+ }
714
+ static {
715
+ this.ɵprov = i0.ɵɵngDeclareInjectable({
716
+ minVersion: "12.0.0",
717
+ version: "22.2.2",
718
+ ngImport: i0,
719
+ type: TableBroMatTagsTexts,
720
+ providedIn: "root"
721
+ });
722
+ }
723
+ };
724
+ i0.ɵɵngDeclareClassMetadata({
725
+ minVersion: "12.0.0",
726
+ version: "22.2.2",
727
+ ngImport: i0,
728
+ type: TableBroMatTagsTexts,
729
+ decorators: [{
730
+ type: Injectable,
731
+ args: [{ providedIn: "root" }]
732
+ }]
733
+ });
694
734
  var BroMaterialTagsComponent = class BroMaterialTagsComponent {
695
735
  constructor() {
696
736
  this.col = input(...ngDevMode ? [void 0, { debugName: "col" }] : /* istanbul ignore next */ []);
@@ -699,9 +739,10 @@ var BroMaterialTagsComponent = class BroMaterialTagsComponent {
699
739
  this.chipList = computed(() => {
700
740
  const name = this.col()?.name;
701
741
  const items = name && this.row()?.[name];
702
- return Array.isArray(items) && items.length ? items : [this.config()?.texts.noItems ?? ""];
742
+ return Array.isArray(items) && items.length ? items : [this.texts.empty() ?? this.config()?.texts.noItems ?? "No data"];
703
743
  }, ...ngDevMode ? [{ debugName: "chipList" }] : /* istanbul ignore next */ []);
704
744
  this.elementRef = inject(ElementRef);
745
+ this.texts = inject(TableBroMatTagsTexts);
705
746
  this.fitting = new AbortController();
706
747
  afterNextRender(() => {
707
748
  const chips = this.elementRef.nativeElement.querySelector(".mdc-evolution-chip-set__chips");
@@ -992,7 +1033,9 @@ var TableBroFilterDrawerContainerNg = class TableBroFilterDrawerContainerNg {
992
1033
  this.texts = computed(() => resolveTexts(this.conf().texts), ...ngDevMode ? [{ debugName: "texts" }] : /* istanbul ignore next */ []);
993
1034
  this.dark = signal(false, ...ngDevMode ? [{ debugName: "dark" }] : /* istanbul ignore next */ []);
994
1035
  this.light = signal(false, ...ngDevMode ? [{ debugName: "light" }] : /* istanbul ignore next */ []);
1036
+ this.focusMonitor = inject(FocusMonitor);
995
1037
  this.host = inject(ElementRef);
1038
+ this.inputModality = inject(InputModalityDetector);
996
1039
  this.container = viewChild.required(MatDrawerContainer, ...ngDevMode ? [{ debugName: "container" }] : /* istanbul ignore next */ []);
997
1040
  this.content = viewChild.required(MatDrawerContent, {
998
1041
  ...ngDevMode ? { debugName: "content" } : /* istanbul ignore next */ {},
@@ -1003,10 +1046,20 @@ var TableBroFilterDrawerContainerNg = class TableBroFilterDrawerContainerNg {
1003
1046
  ...ngDevMode ? { debugName: "drawerElement" } : /* istanbul ignore next */ {},
1004
1047
  read: ElementRef
1005
1048
  });
1006
- const resizeObserver = new ResizeObserver(() => this.fitMode());
1049
+ this.lastClick = null;
1050
+ this.opener = null;
1007
1051
  const destroyRef = inject(DestroyRef);
1008
- resizeObserver.observe(this.host.nativeElement);
1009
- destroyRef.onDestroy(() => resizeObserver.disconnect());
1052
+ registerFilterDrawerProperties();
1053
+ afterNextRender(() => {
1054
+ const resizeObserver = new ResizeObserver(() => this.fitMode());
1055
+ resizeObserver.observe(this.host.nativeElement);
1056
+ destroyRef.onDestroy(() => resizeObserver.disconnect());
1057
+ });
1058
+ afterNextRender(() => {
1059
+ this.host.nativeElement.addEventListener("click", (event) => {
1060
+ this.lastClick = event;
1061
+ }, true);
1062
+ });
1010
1063
  afterNextRender(() => {
1011
1064
  const table = this.content().nativeElement.querySelector("table-bro");
1012
1065
  if (!table) return;
@@ -1027,7 +1080,12 @@ var TableBroFilterDrawerContainerNg = class TableBroFilterDrawerContainerNg {
1027
1080
  this.setOpened(!this.opened());
1028
1081
  }
1029
1082
  onTableAction(event) {
1030
- if (event.action === events.filtersToggleEvent) this.toggle();
1083
+ if (event.action === events.filtersToggleEvent) {
1084
+ const opener = (this.lastClick && this.lastClick.eventPhase !== Event.NONE ? this.lastClick.target.closest("a[href], button") : null) ?? this.host.nativeElement.ownerDocument.activeElement;
1085
+ this.opener = opener && this.content().nativeElement.contains(opener) ? opener : this.opener;
1086
+ this.toggle();
1087
+ if (this.opened()) this.restoreFocus(true);
1088
+ }
1031
1089
  this.action.emit(event);
1032
1090
  }
1033
1091
  setOpened(opened) {
@@ -1039,6 +1097,21 @@ var TableBroFilterDrawerContainerNg = class TableBroFilterDrawerContainerNg {
1039
1097
  this.opened.set(opened);
1040
1098
  this.drawer().toggle(opened);
1041
1099
  this.container().updateContentMargins();
1100
+ if (!opened) this.restoreFocus(true);
1101
+ }
1102
+ onBackdropClick() {
1103
+ queueMicrotask(() => this.restoreFocus(true));
1104
+ }
1105
+ restoreFocus(fromPage) {
1106
+ const focused = this.host.nativeElement.ownerDocument.activeElement;
1107
+ if (this.opener && (this.drawerElement().nativeElement.contains(focused) || fromPage && focused === this.host.nativeElement.ownerDocument.body)) {
1108
+ const origin = this.inputModality.mostRecentModality ?? "program";
1109
+ const options = origin === "mouse" || origin === "touch" ? {
1110
+ preventScroll: true,
1111
+ focusVisible: false
1112
+ } : { preventScroll: true };
1113
+ this.focusMonitor.focusVia(this.opener, origin, options);
1114
+ }
1042
1115
  }
1043
1116
  fitMode() {
1044
1117
  if (!this.opened() || this.mode() !== "side") return;
@@ -1221,7 +1294,7 @@ var TableBroFilterDrawerContainerNg = class TableBroFilterDrawerContainerNg {
1221
1294
  ],
1222
1295
  ngImport: i0,
1223
1296
  template: `
1224
- <mat-drawer-container [class.bro-filter-drawer_no-shadow]="!shadowsEnabled()">
1297
+ <mat-drawer-container [class.bro-filter-drawer_no-shadow]="!shadowsEnabled()" (backdropClick)="onBackdropClick()">
1225
1298
  <mat-drawer-content>
1226
1299
  <table-bro-ng [class.bro-table-shadow-container]="shadowsEnabled()"
1227
1300
  [tableId]="tableId()" [cols]="cols()" [rows]="rows()" [conf]="conf()"
@@ -1234,7 +1307,7 @@ var TableBroFilterDrawerContainerNg = class TableBroFilterDrawerContainerNg {
1234
1307
 
1235
1308
  <mat-drawer position="end"
1236
1309
  [class.bro-filter-drawer_no-shadow]="!shadowsEnabled()" [mode]="drawerMode()"
1237
- [opened]="opened()" (openedChange)="opened.set($event)">
1310
+ [opened]="opened()" (openedChange)="opened.set($event)" (closedStart)="restoreFocus(false)">
1238
1311
  <div class="bro-filter-drawer-card" [class]="shadowClassName()">
1239
1312
  <div class="bro-filter-drawer-header">
1240
1313
  <mat-toolbar>
@@ -1351,7 +1424,7 @@ i0.ɵɵngDeclareClassMetadata({
1351
1424
  args: [{
1352
1425
  selector: "table-bro-filter-drawer-container-ng",
1353
1426
  template: `
1354
- <mat-drawer-container [class.bro-filter-drawer_no-shadow]="!shadowsEnabled()">
1427
+ <mat-drawer-container [class.bro-filter-drawer_no-shadow]="!shadowsEnabled()" (backdropClick)="onBackdropClick()">
1355
1428
  <mat-drawer-content>
1356
1429
  <table-bro-ng [class.bro-table-shadow-container]="shadowsEnabled()"
1357
1430
  [tableId]="tableId()" [cols]="cols()" [rows]="rows()" [conf]="conf()"
@@ -1364,7 +1437,7 @@ i0.ɵɵngDeclareClassMetadata({
1364
1437
 
1365
1438
  <mat-drawer position="end"
1366
1439
  [class.bro-filter-drawer_no-shadow]="!shadowsEnabled()" [mode]="drawerMode()"
1367
- [opened]="opened()" (openedChange)="opened.set($event)">
1440
+ [opened]="opened()" (openedChange)="opened.set($event)" (closedStart)="restoreFocus(false)">
1368
1441
  <div class="bro-filter-drawer-card" [class]="shadowClassName()">
1369
1442
  <div class="bro-filter-drawer-header">
1370
1443
  <mat-toolbar>
@@ -1967,7 +2040,7 @@ i0.ɵɵngDeclareClassMetadata({
1967
2040
  }]
1968
2041
  }
1969
2042
  });
1970
- const elements = {
2043
+ const tableBroMatElements = {
1971
2044
  "ng-mat-paginator": MatPaginator,
1972
2045
  "ng-mat-progress-bar": MatProgressBar,
1973
2046
  "ng-mat-toolbar": MatToolbar,
@@ -1979,7 +2052,7 @@ const elements = {
1979
2052
  function defineTableBroMatElements(injector, features = {}) {
1980
2053
  if (!isPlatformBrowser(injector.get(PLATFORM_ID))) return;
1981
2054
  Object.entries({
1982
- ...elements,
2055
+ ...tableBroMatElements,
1983
2056
  ...features
1984
2057
  }).forEach(([name, component]) => {
1985
2058
  if (!customElements.get(name)) customElements.define(name, keepThroughMoves(createCustomElement(component, { injector })));
@@ -2017,6 +2090,7 @@ function keepThroughMoves(element) {
2017
2090
  this.moving = false;
2018
2091
  return;
2019
2092
  }
2093
+ if (isPrerendered(this)) return;
2020
2094
  super.connectedCallback();
2021
2095
  }
2022
2096
  disconnectedCallback() {
@@ -2031,13 +2105,31 @@ function keepThroughMoves(element) {
2031
2105
  };
2032
2106
  }
2033
2107
  function provideTableBroMatSkin(...features) {
2034
- return provideAppInitializer(() => {
2108
+ const elements = Object.assign({}, ...features.map((feature) => feature.elements));
2109
+ return makeEnvironmentProviders([provideAppInitializer(() => {
2035
2110
  registerSkin("mat", matSkinConfig);
2036
- defineTableBroMatElements(inject(EnvironmentInjector), Object.assign({}, ...features.map((feature) => feature.elements)));
2037
- });
2111
+ features.forEach((feature) => feature.init?.());
2112
+ defineTableBroMatElements(inject(EnvironmentInjector), elements);
2113
+ }), {
2114
+ provide: TABLE_BRO_ELEMENTS,
2115
+ useValue: {
2116
+ skin: "mat",
2117
+ elements: {
2118
+ ...tableBroMatElements,
2119
+ ...elements
2120
+ }
2121
+ },
2122
+ multi: true
2123
+ }]);
2038
2124
  }
2039
- function withTags() {
2040
- return { elements: { "bro-mat-tags": BroMaterialTagsComponent } };
2125
+ function withTags(options = {}) {
2126
+ const empty = options.texts?.empty;
2127
+ return {
2128
+ elements: { "bro-mat-tags": BroMaterialTagsComponent },
2129
+ init: () => {
2130
+ if (empty !== void 0) inject(TableBroMatTagsTexts).empty.set(empty);
2131
+ }
2132
+ };
2041
2133
  }
2042
2134
  function withSwitch() {
2043
2135
  return { elements: { "bro-mat-slide-toggle": BroMaterialSlideToggleComponent } };
@@ -2045,6 +2137,6 @@ function withSwitch() {
2045
2137
  function withToolbarMenu() {
2046
2138
  return { elements: { "bro-mat-toolbar-more": BroMaterialToolbarMoreComponent } };
2047
2139
  }
2048
- export { BroMaterialButtonComponent, BroMaterialSlideToggleComponent, BroMaterialSortHeaderComponent, BroMaterialTagsComponent, BroMaterialTextEllipsisComponent, BroMaterialToolbarMainComponent, BroMaterialToolbarMoreComponent, TableBroFilterDrawerContainerNg, matSkinConfig, provideTableBroMatSkin, withSwitch, withTags, withToolbarMenu };
2140
+ export { BroMaterialButtonComponent, BroMaterialSlideToggleComponent, BroMaterialSortHeaderComponent, BroMaterialTagsComponent, BroMaterialTextEllipsisComponent, BroMaterialToolbarMainComponent, BroMaterialToolbarMoreComponent, TableBroFilterDrawerContainerNg, TableBroMatTagsTexts, matSkinConfig, provideTableBroMatSkin, withSwitch, withTags, withToolbarMenu };
2049
2141
 
2050
2142
  //# sourceMappingURL=table-bro-angular-material.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"table-bro-angular-material.mjs","names":[],"sources":["../../../packages/skins/angular-material/src/lib/table-bro.angular-material.config.ts","../../../packages/skins/angular-material/src/lib/bro-button.material.component.ts","../../../packages/skins/angular-material/src/lib/bro-slide-toggle.material.component.ts","../../../packages/skins/angular-material/src/lib/bro-sort-header.material.component.ts","../../../packages/skins/angular-material/src/lib/bro-tags.material.component.ts","../../../packages/skins/angular-material/src/lib/bro-text-ellipsis.material.component.ts","../../../packages/skins/angular-material/src/lib/table-bro-filter-drawer-container-ng.ts","../../../packages/skins/angular-material/src/lib/toolbar/bro-toolbar-main.material.component.ts","../../../packages/skins/angular-material/src/lib/toolbar/bro-toolbar-more.material.component.ts","../../../packages/skins/angular-material/src/lib/define-table-bro-mat-elements.ts","../../../packages/skins/angular-material/src/lib/provide-table-bro-mat-skin.ts"],"sourcesContent":["import type {BroSkinConfig} from '@table-bro/core';\n\n// The constant keeps the type of its value: an application reads its buttons and its states without checks of undefined\nexport const matSkinConfig = {\n css: {\n table: {\n className: 'mat-table',\n\n thead: {\n tr: {\n className: 'mat-header-row bro-header-row',\n\n th: {\n className: 'mat-header-cell bro-header-cell'\n }\n }\n },\n\n tbody: {\n tr: {\n className: 'mat-row bro-row',\n\n td: {\n className: 'mat-cell bro-cell'\n }\n }\n }\n },\n\n shadow: {\n className: 'mat-elevation-z16'\n }\n },\n\n components: {\n button: {\n selector: 'bro-mat-button',\n\n iconSelector: '.mat-icon',\n\n beforeRender: (element: Element, value: string) => {\n element.setAttribute('button-title', value);\n element.setAttribute('icon', 'expand_more');\n }\n },\n // The drawer of the skin is TableBroFilterDrawerContainerNg, with its close button in its template\n filterDrawer: {},\n fontIcon: {\n // The name of a ligature icon is its text: the message of the state names the state instead\n html: (materialIcon: string) => `<span class=\"material-icons bro-state-icon\" aria-hidden=\"true\">${materialIcon}</span>`\n },\n paginator: {\n selector: 'ng-mat-paginator',\n inputsAsProperties: true,\n recreateOnReplaceRows: true\n },\n progressBar: {\n selector: 'ng-mat-progress-bar'\n },\n sortHeader: {\n selector: 'bro-mat-sort-header',\n titleAsContent: true,\n contentSelector: '.mat-sort-header-content'\n },\n state: {\n fontIcon: true,\n states: {\n loading: ['front_loader', 'Loading'],\n 'no-data': ['heart_broken', 'No data'],\n 'not-found': ['heart_broken', 'No records found'],\n fail: ['smart_toy', 'Failed']\n }\n },\n switch: {\n selector: 'bro-mat-slide-toggle'\n },\n textEllipsis: {\n selector: 'bro-mat-text-ellipsis'\n },\n toolbar: {\n selector: 'ng-mat-toolbar'\n },\n toolbarMain: {\n selector: 'bro-mat-toolbar-main'\n },\n toolbarSearch: {\n beforeRender: (backButton: Element, clearButton: Element) => {\n backButton.setAttribute('icon', 'arrow_back');\n\n clearButton.setAttribute('icon', 'close');\n }\n }\n }\n} satisfies BroSkinConfig;\n","import {ChangeDetectionStrategy, Component, input, output} from '@angular/core';\n\nimport {MatButton, MatIconButton} from '@angular/material/button';\nimport {MatIcon} from '@angular/material/icon';\n\n/** The button of the skin, the element bro-mat-button with the properties of BroButton. */\n@Component({\n template: `\n @if (buttonTitle()) {\n <button matButton\n type=\"button\" [class]=\"buttonClassName()\"\n [attr.aria-label]=\"label()\"\n (click)=\"onClickButton()\">\n @if (icon()) {\n <mat-icon>{{ icon() }}</mat-icon>\n }\n {{ buttonTitle() }}\n </button>\n } @else if (icon()) {\n <button matIconButton\n type=\"button\"\n [class]=\"buttonClassName()\"\n [attr.aria-label]=\"label()\"\n (click)=\"onClickButton()\">\n <mat-icon>{{ icon() }}</mat-icon>\n </button>\n }`,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n MatButton,\n MatIcon,\n MatIconButton\n ]\n})\nexport class BroMaterialButtonComponent {\n readonly buttonClassName = input<string | null>(undefined, {alias: 'button-class'});\n readonly buttonTitle = input<string>('', {alias: 'button-title'});\n readonly eventType = input<string>('', {alias: 'event-type'});\n readonly icon = input<string>();\n /** The name of a button without a title: the table gives it as the attribute label, not aria-label on the element. */\n readonly label = input<string>();\n\n readonly action = output<string>();\n\n onClickButton() {\n this.action.emit(this.eventType());\n }\n}\n","import {ChangeDetectionStrategy, Component, computed, input, output} from '@angular/core';\n\nimport {MatSlideToggle} from '@angular/material/slide-toggle';\nimport type {BroCol, BroRow} from '@table-bro/core';\n\n/**\n * A switch of a boolean of a cell. A change sends the action of the attribute name in the output action, which the\n * table turns into bro-action with the column and the row (event: 'action' of the column); the title of the column\n * names the switch for screen readers.\n */\n@Component({\n template: `\n <mat-slide-toggle [hideIcon]=\"true\" [checked]=\"checked()\" [aria-label]=\"col()?.title ?? null\" (change)=\"onChange()\"></mat-slide-toggle>`,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n MatSlideToggle\n ]\n})\nexport class BroMaterialSlideToggleComponent<T extends object = BroRow> {\n readonly col = input<BroCol<T>>();\n readonly row = input<T>();\n\n /** The action of a change. */\n readonly name = input<string>();\n\n readonly action = output<string>();\n\n /** The value of the field of the column in the row. */\n readonly checked = computed(() => {\n const name = this.col()?.name;\n\n return !!(name && this.row()?.[name]);\n });\n\n onChange() {\n const name = this.name();\n\n if (name) {\n this.action.emit(name);\n }\n }\n}\n","import {ChangeDetectionStrategy, Component, computed, effect, ElementRef, inject, input, signal, viewChild} from '@angular/core';\n\nimport {MatSort, MatSortHeader, type Sort, type SortDirection, type SortHeaderArrowPosition} from '@angular/material/sort';\nimport {MatTooltip} from '@angular/material/tooltip';\nimport {type BroColDataType, type BroColSort, type BroSortHeader, dispatchAction, events} from '@table-bro/core';\n\n/** The sort header of a column, the element bro-mat-sort-header with the properties of BroSortHeader. */\n@Component({\n template: `\n @if (headerTitle()) {\n <div matSort matSortStart=\"desc\"\n [matSortDirection]=\"matSortDirection()\"\n (matSortChange)=\"onSort($event)\">\n <div [mat-sort-header]=\"id()\" matTooltipPosition=\"right\"\n [arrowPosition]=\"arrowPosition()\" [matTooltip]=\"tooltip()\">\n <ng-content></ng-content>\n </div>\n </div>\n }`,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n MatSort,\n MatSortHeader,\n MatTooltip\n ]\n})\nexport class BroMaterialSortHeaderComponent {\n /** The active sort of the table: a sort of another column resets the arrow of this header. */\n readonly activeSort = input<BroColSort>();\n readonly arrowPosition = input<BroSortHeader['arrowPosition'] | SortHeaderArrowPosition>('after', {alias: 'arrow-position'});\n readonly dataType = input<BroColDataType>(undefined, {alias: 'data-type'});\n readonly headerTitle = input<string>('', {alias: 'header-title'});\n readonly sortId = input<string>('', {alias: 'sort-id'});\n readonly tooltip = input<string>('');\n\n /** The key of the column, or an own one of the header. */\n readonly id = computed(() => this.sortId() || `bro-${Math.random().toString(36).slice(2)}`);\n readonly matSortDirection = signal<SortDirection>('');\n\n private readonly elementRef: ElementRef<HTMLElement> = inject(ElementRef);\n private readonly sortHeader = viewChild(MatSortHeader, {read: ElementRef});\n private sortedDirection: SortDirection = '';\n\n constructor() {\n effect(() => {\n const sort = this.activeSort();\n\n if (this.sortedDirection !== '' && sort?.sortKey !== this.id()) {\n this.sortedDirection = '';\n this.matSortDirection.set('');\n }\n });\n\n // The header cell of the table tells the sort with aria-sort. Material puts aria-sort on its own host too, a div\n // inside the cell, where ARIA does not allow it: the div does not keep it\n effect(onCleanup => {\n const header: HTMLElement | undefined = this.sortHeader()?.nativeElement;\n\n if (!header) {\n return;\n }\n\n const observer = new MutationObserver(() => header.removeAttribute('aria-sort'));\n\n header.removeAttribute('aria-sort');\n observer.observe(header, {attributes: true, attributeFilter: ['aria-sort']});\n onCleanup(() => observer.disconnect());\n });\n }\n\n onSort(event: Sort): void {\n dispatchAction(this.elementRef.nativeElement, events.filtersSortEvent, {\n sortKey: event.active,\n sortDirection: event.direction || undefined\n });\n\n this.sortedDirection = event.direction;\n this.matSortDirection.set(event.direction);\n }\n}\n","import {afterNextRender, ChangeDetectionStrategy, Component, computed, DestroyRef, ElementRef, inject, input} from '@angular/core';\n\nimport {MatChip, MatChipSet} from '@angular/material/chips';\nimport {type BroCol, type BroResolvedConfig, type BroRow, fitCellItems} from '@table-bro/core';\n\n/** The tags of a cell: the items of the field of the column, as the chips of Material. */\n@Component({\n template: `\n <mat-chip-set>\n @for (chip of chipList(); track $index) {\n <mat-chip>{{ chip }}</mat-chip>\n }\n </mat-chip-set>`,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n MatChip,\n MatChipSet\n ]\n})\nexport class BroMaterialTagsComponent {\n readonly col = input<BroCol>();\n readonly row = input<BroRow>();\n /** The config of the table, which the table gives the elements of its cells: the text of a cell without items. */\n readonly config = input<BroResolvedConfig>();\n\n /** The items of the field of the column in the row. */\n readonly chipList = computed<string[]>(() => {\n const name = this.col()?.name;\n const items = name && this.row()?.[name];\n\n return Array.isArray(items) && items.length ? items : [this.config()?.texts.noItems ?? ''];\n });\n\n private readonly elementRef: ElementRef<HTMLElement> = inject(ElementRef);\n /** Stops fitting the chips into the line when the component goes. */\n private readonly fitting: AbortController = new AbortController();\n\n constructor() {\n // The chips that do not fit the line give way to an ellipsis\n afterNextRender(() => {\n const chips = this.elementRef.nativeElement.querySelector<HTMLElement>('.mdc-evolution-chip-set__chips');\n\n if (chips) {\n fitCellItems(chips, this.fitting.signal);\n }\n });\n\n inject(DestroyRef).onDestroy(() => this.fitting.abort());\n }\n}\n","import {ChangeDetectionStrategy, Component, computed, input} from '@angular/core';\n\nimport {MatTooltip} from '@angular/material/tooltip';\nimport {broCellSelectors, type BroCol, BroHTML} from '@table-bro/core';\n\n/** A value wider than its column, with the whole value in a tooltip: the element bro-mat-text-ellipsis of BroTextEllipsis. */\n@Component({\n template: `\n <span matTooltipPosition=\"above\"\n class=\"{{ tableCellTextEllipsisContainer }}{{ containerClassName() ? ' ' + containerClassName() : '' }}\"\n [matTooltip]=\"tooltip()\">\n @if (col()?.html) {\n <span class=\"{{ tableCellTextEllipsis }}\" [innerHTML]=\"value()\"></span>\n } @else {\n <span class=\"{{ tableCellTextEllipsis }}\">{{ value() }}</span>\n }\n </span>`,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n MatTooltip\n ]\n})\nexport class BroMaterialTextEllipsisComponent {\n /** The column of the cell: with html: true the value is markup. */\n readonly col = input<BroCol>();\n\n readonly containerClassName = input<string | null>(null, {alias: 'container-class'});\n readonly value = input<string>('');\n\n /** The text of the value: the text of the markup of an HTML value. */\n readonly tooltip = computed(() => this.col()?.html ? BroHTML.text(this.value()) : this.value());\n\n readonly tableCellTextEllipsisContainer = broCellSelectors.ellipsisContainer;\n readonly tableCellTextEllipsis = broCellSelectors.ellipsis;\n}\n","import {afterNextRender, ChangeDetectionStrategy, Component, computed, DestroyRef, ElementRef, inject, input, model, output, signal, viewChild} from '@angular/core';\n\nimport {MatIconButton} from '@angular/material/button';\nimport {MatIcon} from '@angular/material/icon';\nimport {MatDrawer, MatDrawerContainer, MatDrawerContent, type MatDrawerMode} from '@angular/material/sidenav';\nimport {MatToolbar} from '@angular/material/toolbar';\nimport {type BroServerFacade, TableBroNg} from '@table-bro/angular';\nimport {type BroActionDetail, type BroCol, type BroConfig, type BroEmptyState, type BroFilters, type BroQuery, type BroUserTheme, dispatchAction, events, resolveTexts} from '@table-bro/core';\n\nimport {matSkinConfig} from './table-bro.angular-material.config';\n\n/**\n * The table with the filter drawer of the mat skin: mat-drawer-container with <table-bro-ng> in its content and the filters\n * of the application, the content of this component, in mat-drawer. It takes the inputs and gives the outputs\n * of <table-bro-ng>. The Filters button of the table toolbar opens the drawer, any other button of the page calls toggle().\n * Material opens the drawer and narrows the table in the side mode; the card of the skin in the drawer grows\n * from its right edge. A table that would get narrower than its minimum width next to the drawer keeps its width:\n * the drawer lies over it in the mode over, with the scrim of Material, as the modal side sheet of Material 3.\n */\n@Component({\n selector: 'table-bro-filter-drawer-container-ng',\n template: `\n <mat-drawer-container [class.bro-filter-drawer_no-shadow]=\"!shadowsEnabled()\">\n <mat-drawer-content>\n <table-bro-ng [class.bro-table-shadow-container]=\"shadowsEnabled()\"\n [tableId]=\"tableId()\" [cols]=\"cols()\" [rows]=\"rows()\" [conf]=\"conf()\"\n [total]=\"total()\" [rowsToAppend]=\"rowsToAppend()\" [emptyState]=\"emptyState()\"\n [loading]=\"loading()\" [failed]=\"failed()\"\n [filter]=\"filter()\" [theme]=\"theme()\"\n (action)=\"onTableAction($event)\"\n (query)=\"query.emit($event)\"></table-bro-ng>\n </mat-drawer-content>\n\n <mat-drawer position=\"end\"\n [class.bro-filter-drawer_no-shadow]=\"!shadowsEnabled()\" [mode]=\"drawerMode()\"\n [opened]=\"opened()\" (openedChange)=\"opened.set($event)\">\n <div class=\"bro-filter-drawer-card\" [class]=\"shadowClassName()\">\n <div class=\"bro-filter-drawer-header\">\n <mat-toolbar>\n <span class=\"bro-filter-drawer-title\">{{ texts().filters }}</span>\n\n <button matIconButton class=\"bro-filter-drawer-close\" type=\"button\"\n [attr.aria-label]=\"texts().close\"\n (click)=\"setOpened(false)\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-toolbar>\n </div>\n\n <div>\n <ng-content></ng-content>\n </div>\n </div>\n </mat-drawer>\n </mat-drawer-container>`,\n styles: `\n :host {\n display: block;\n }\n\n /* The shadows of the table and of the card lie outside of them; the drawer stands in its place, nothing to clip */\n mat-drawer-container,\n mat-drawer-content {\n overflow: visible;\n }\n\n /*\n * One motion for the drawer, the content, and the width of the card. Material turns it on with mat-drawer-transition,\n * and not under prefers-reduced-motion. The standard curve of Material starts softer than the curve of mat-drawer.\n * The transform of the drawer is an identity (the skin), its transition only gives Material its events\n */\n .mat-drawer-transition mat-drawer,\n .mat-drawer-transition mat-drawer-content,\n .mat-drawer-transition .bro-filter-drawer-card {\n transition-duration: calc(var(--bro-filter-drawer-duration) * var(--bro-duration-scale));\n transition-timing-function: cubic-bezier(.4, 0, .2, 1);\n }\n\n .mat-drawer-transition .bro-filter-drawer-card {\n transition-property: --bro-filter-drawer-opened;\n }\n\n .bro-filter-drawer-header {\n position: sticky;\n top: 0;\n z-index: 1;\n }`,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mat',\n '[class.bro-dark-theme]': 'dark()',\n '[class.bro-light-theme]': 'light()'\n },\n imports: [\n MatDrawer,\n MatDrawerContainer,\n MatDrawerContent,\n MatIcon,\n MatIconButton,\n MatToolbar,\n TableBroNg\n ]\n})\nexport class TableBroFilterDrawerContainerNg<MODEL extends object> implements BroServerFacade<MODEL> {\n /* The inputs and the outputs of <table-bro-ng> */\n cols = input.required<BroCol<MODEL>[]>();\n rows = input.required<MODEL[] | undefined | null>();\n conf = input.required<BroConfig<MODEL>>();\n\n total = input<number>();\n rowsToAppend = input<MODEL[] | undefined>();\n loading = input<boolean>(false);\n failed = input<boolean>(false);\n\n filter = input<BroFilters<MODEL> | undefined>();\n emptyState = input<BroEmptyState>();\n tableId = input<string>();\n theme = input<BroUserTheme | null>();\n\n action = output<BroActionDetail<MODEL>>();\n query = output<BroQuery<MODEL>>();\n\n /* The drawer */\n /** Whether the drawer is opened; [(opened)] binds it both ways. */\n opened = model<boolean>(false);\n /**\n * The mode of mat-drawer: side, by default, narrows the content, and the drawer lies over a table that would get\n * narrower than its minimum width; over lies over the table always, with the scrim of Material; push as in Material.\n */\n mode = input<MatDrawerMode>('side');\n\n /** The drawer lies over a table that would not keep its minimum width next to it. */\n protected over = signal<boolean>(false);\n protected drawerMode = computed<MatDrawerMode>(() => this.over() ? 'over' : this.mode());\n\n /** With shadows the table lets them into its margins and takes the full width; the card has the shadow too. */\n protected shadowsEnabled = computed(() => this.conf().shadowsEnabled !== false);\n /** The class of the shadow of the skin config, as the card of the drawer of the core takes it. */\n protected shadowClassName = computed(() => this.shadowsEnabled() ? matSkinConfig.css.shadow.className : '');\n\n /** The texts of the config of the table: the title of the drawer and the name of its close button. */\n protected texts = computed(() => resolveTexts(this.conf().texts));\n\n /** The host of the table has the class of the dark theme: the container takes it too, as the drawer of the core does. */\n protected dark = signal<boolean>(false);\n /** The host of the table has the class of its own light theme: the container stays light under a dark ancestor too. */\n protected light = signal<boolean>(false);\n\n private host = inject(ElementRef);\n private container = viewChild.required(MatDrawerContainer);\n private content = viewChild.required(MatDrawerContent, {read: ElementRef});\n private drawer = viewChild.required(MatDrawer);\n private drawerElement = viewChild.required(MatDrawer, {read: ElementRef});\n\n constructor() {\n // A narrower or a wider page moves the opened drawer over the table or next to it\n const resizeObserver = new ResizeObserver(() => this.fitMode());\n\n const destroyRef = inject(DestroyRef);\n\n resizeObserver.observe(this.host.nativeElement);\n destroyRef.onDestroy(() => resizeObserver.disconnect());\n\n // The theme of the table is the class of its host, which the table changes with its theme\n afterNextRender(() => {\n const table: HTMLElement | null = this.content().nativeElement.querySelector('table-bro');\n\n if (!table) {\n return;\n }\n\n const readTheme = () => {\n this.dark.set(table.classList.contains('bro-dark-theme'));\n this.light.set(table.classList.contains('bro-light-theme'));\n };\n\n const themeObserver = new MutationObserver(readTheme);\n\n themeObserver.observe(table, {attributes: true, attributeFilter: ['class']});\n destroyRef.onDestroy(() => themeObserver.disconnect());\n\n readTheme();\n });\n }\n\n toggle(): void {\n this.setOpened(!this.opened());\n }\n\n /** The Filters button of the table toolbar opens the drawer; every action goes on to the page. */\n protected onTableAction(event: BroActionDetail<MODEL>): void {\n if (event.action === events.filtersToggleEvent) {\n this.toggle();\n }\n\n this.action.emit(event);\n }\n\n /**\n * Opens or closes the drawer and narrows the content in the same frame. Material narrows it on transitionrun\n * of the drawer, a frame later, so the space between the table and the card would change while they move.\n */\n protected setOpened(opened: boolean): void {\n if (opened && this.mode() === 'side') {\n this.over.set(!this.fitsNextToDrawer());\n\n // Material takes the mode at the toggle below, before the next check of the template\n this.drawer().mode = this.drawerMode();\n }\n\n this.fitTableColumns(opened);\n\n this.opened.set(opened);\n\n this.drawer().toggle(opened);\n this.container().updateContentMargins();\n }\n\n /**\n * Moves the opened drawer over the table when the table would get narrower than its minimum width next to it, and\n * back next to it when it fits again: the table takes its new width at once, and the scrim of Material comes or goes\n * by its transition; the drawer keeps its place at the right edge.\n */\n private fitMode(): void {\n if (!this.opened() || this.mode() !== 'side') {\n return;\n }\n\n const over = !this.fitsNextToDrawer();\n\n if (over === this.over()) {\n return;\n }\n\n this.over.set(over);\n this.drawer().mode = this.drawerMode();\n this.fitTableColumns(true);\n this.container().updateContentMargins();\n }\n\n /** The table keeps at least its minimum width next to the opened drawer: the width of the drawer holds its space. */\n private fitsNextToDrawer(): boolean {\n const content: HTMLElement = this.content().nativeElement;\n const table: HTMLElement | null = content.querySelector('table-bro');\n\n if (!table) {\n return true;\n }\n\n // The width comes from the content, without the room that a table leaves for its shadows when no shadow container\n // takes them\n const shadowRoom = this.shadowsEnabled() ? 0 : 2 * parseFloat(getComputedStyle(table).getPropertyValue('--bro-shadow-size'));\n const width = content.getBoundingClientRect().width + parseFloat(getComputedStyle(content).marginRight) - shadowRoom;\n\n return width - this.drawerElement().nativeElement.offsetWidth >= parseFloat(getComputedStyle(table).getPropertyValue('--bro-table-min-width'));\n }\n\n /**\n * Gives the table at once the width it has at the end of the transition: the drawer has a fixed width, so the columns\n * take their new widths right at the click and come with the table. In the side mode Material narrows the content\n * by the width of the drawer; during a transition the content counts from its margin at this moment.\n */\n private fitTableColumns(opened: boolean): void {\n const content: HTMLElement = this.content().nativeElement;\n const table: HTMLElement | null = content.querySelector('table-bro');\n\n if (!table) {\n return;\n }\n\n const margin = parseFloat(getComputedStyle(content).marginRight);\n const targetMargin: number = (opened && this.drawerMode() === 'side') ? this.drawerElement().nativeElement.offsetWidth : 0;\n // A table at its minimum width is wider than the content: the width comes from the content\n const shadowRoom = this.shadowsEnabled() ? 0 : 2 * parseFloat(getComputedStyle(table).getPropertyValue('--bro-shadow-size'));\n\n dispatchAction(table, events.columnsWidthEvent, content.getBoundingClientRect().width + margin - targetMargin - shadowRoom);\n }\n}\n","import {ChangeDetectionStrategy, Component, computed, CUSTOM_ELEMENTS_SCHEMA, input, output} from '@angular/core';\n\nimport {MatIconButton} from '@angular/material/button';\nimport {MatIcon} from '@angular/material/icon';\nimport {MatToolbar} from '@angular/material/toolbar';\nimport {MatTooltip} from '@angular/material/tooltip';\nimport {type BroButton, type BroDropdown, type BroResolvedConfig, events} from '@table-bro/core';\n\n/** The toolbar of a table: its title, its search and the buttons and the menu of the config. */\n@Component({\n template: `\n <mat-toolbar>\n <button matIconButton class=\"bro-toolbar-placeholder\"\n type=\"button\" aria-label=\"\">\n <mat-icon>menu</mat-icon>\n </button>\n\n <span>{{ title() }}</span>\n\n <span class=\"bro-toolbar-space\"></span>\n\n <button matIconButton\n class=\"bro-toolbar-button-search\"\n type=\"button\" [attr.aria-label]=\"config()?.texts?.search\"\n (click)=\"onClickSearch()\">\n <mat-icon>search</mat-icon>\n </button>\n\n @for (button of mainButtons(); track $index) {\n <button matIconButton type=\"button\" matTooltipPosition=\"above\"\n [matTooltip]=\"button.buttonTooltip ?? ''\"\n [attr.aria-label]=\"button.buttonTitle\"\n (click)=\"onClickButton(button.eventType)\">\n <mat-icon>{{ button.iconHTML }}</mat-icon>\n </button>\n }\n\n <!-- The menu is the element of withToolbarMenu(): a toolbar without a menu does not carry the menu of Material -->\n @if (dropdown(); as dropdown) {\n <bro-mat-toolbar-more matTooltipPosition=\"above\"\n [dropdown]=\"dropdown\" [matTooltip]=\"dropdown.buttonTooltip ?? ''\"\n (action)=\"onMenuAction($event)\"></bro-mat-toolbar-more>\n }\n </mat-toolbar>`,\n // Classes, not style attributes in the template, which a strict Content Security Policy blocks\n styles: `\n .bro-toolbar-placeholder {\n visibility: hidden;\n }\n\n .bro-toolbar-space {\n flex: 1 1 auto;\n }`,\n changeDetection: ChangeDetectionStrategy.OnPush,\n schemas: [CUSTOM_ELEMENTS_SCHEMA],\n imports: [\n MatIcon,\n MatIconButton,\n MatToolbar,\n MatTooltip\n ]\n})\nexport class BroMaterialToolbarMainComponent {\n /** The config of the table: the name of the search button. */\n readonly config = input<BroResolvedConfig>();\n\n // The table sets the buttons and the title before the element connects: the buttons as the JSON of the config\n readonly buttons = input<string>('[]');\n readonly title = input<string>('');\n\n readonly action = output<string>({alias: 'bro-toolbar'});\n\n /** The buttons and the one menu of the config. */\n private readonly toolbarButtons = computed<(BroButton | BroDropdown)[]>(() => JSON.parse(this.buttons()));\n\n readonly mainButtons = computed(() => <BroButton[]>this.toolbarButtons().filter(button => button.mode !== 'navbar-dropdown'));\n readonly dropdown = computed(() => <BroDropdown | undefined>this.toolbarButtons().find(button => button.mode === 'navbar-dropdown'));\n\n onClickSearch() {\n this.action.emit(events.toolbarSearchOpenEvent);\n }\n\n onClickButton(action: string) {\n this.action.emit(action);\n }\n\n /** The element of the menu sends the value of its item as the detail of its event action. */\n onMenuAction(event: Event) {\n this.action.emit((<CustomEvent<string>>event).detail);\n }\n}\n","import {ChangeDetectionStrategy, Component, input, output} from '@angular/core';\n\nimport {MatIconButton} from '@angular/material/button';\nimport {MatDivider} from '@angular/material/divider';\nimport {MatIcon} from '@angular/material/icon';\nimport {MatMenu, MatMenuItem, MatMenuTrigger} from '@angular/material/menu';\nimport type {BroDropdown} from '@table-bro/core';\n\n/**\n * The menu of the toolbar, the element bro-mat-toolbar-more of withToolbarMenu(): a button with the title of the menu as\n * its name, and the items that send their values.\n */\n@Component({\n template: `\n @if (dropdown(); as dropdown) {\n <button matIconButton\n [attr.aria-label]=\"dropdown.buttonTitle\"\n [matMenuTriggerFor]=\"menu\">\n <mat-icon>more_vert</mat-icon>\n </button>\n\n <mat-menu #menu=\"matMenu\">\n @for (option of dropdown.options; track $index) {\n @if (option.divider) {\n <mat-divider></mat-divider>\n } @else {\n <button mat-menu-item (click)=\"onClickButton(option.value)\">\n @if (option.iconHTML) {\n <mat-icon>{{ option.iconHTML }}</mat-icon>\n }\n <span>{{ option.title }}</span>\n </button>\n }\n }\n </mat-menu>\n }`,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n MatDivider,\n MatIcon,\n MatIconButton,\n MatMenu,\n MatMenuItem,\n MatMenuTrigger\n ]\n})\nexport class BroMaterialToolbarMoreComponent {\n // The toolbar binds its dropdown after the element connects\n readonly dropdown = input<BroDropdown>();\n\n readonly action = output<string>();\n\n onClickButton(action: string | undefined) {\n this.action.emit(<string>action);\n }\n}\n","import {isPlatformBrowser} from '@angular/common';\nimport {type EnvironmentInjector, PLATFORM_ID, type Type} from '@angular/core';\nimport {createCustomElement} from '@angular/elements';\n\nimport {MatPaginator} from '@angular/material/paginator';\nimport {MatProgressBar} from '@angular/material/progress-bar';\nimport {MatToolbar} from '@angular/material/toolbar';\nimport type {BroCellElement} from '@table-bro/core';\n\nimport {BroMaterialButtonComponent} from './bro-button.material.component';\nimport {BroMaterialSortHeaderComponent} from './bro-sort-header.material.component';\nimport {BroMaterialTextEllipsisComponent} from './bro-text-ellipsis.material.component';\nimport {BroMaterialToolbarMainComponent} from './toolbar/bro-toolbar-main.material.component';\n\n/**\n * The elements of the skin that every table may use: the components of Material that the table uses as they are, and\n * the ones of the skin. The optional elements come from the features of provideTableBroMatSkin().\n */\nconst elements: Record<string, Type<unknown>> = {\n 'ng-mat-paginator': MatPaginator,\n 'ng-mat-progress-bar': MatProgressBar,\n 'ng-mat-toolbar': MatToolbar,\n\n 'bro-mat-button': BroMaterialButtonComponent,\n 'bro-mat-sort-header': BroMaterialSortHeaderComponent,\n 'bro-mat-toolbar-main': BroMaterialToolbarMainComponent,\n 'bro-mat-text-ellipsis': BroMaterialTextEllipsisComponent\n};\n\n/**\n * Defines the elements of the skin in the browser, each one unless it is defined; the server render of Angular has no\n * custom elements. In the dev mode an optional element that no feature gives is defined as an element that reports\n * the missing feature.\n * @param injector - the injector of the application, for the Angular elements\n * @param features - the optional elements that the application asks for\n */\nexport function defineTableBroMatElements(injector: EnvironmentInjector, features: Record<string, Type<unknown>> = {}): void {\n if (!isPlatformBrowser(injector.get(PLATFORM_ID))) {\n return;\n }\n\n Object.entries({...elements, ...features}).forEach(([name, component]) => {\n if (!customElements.get(name)) {\n customElements.define(name, keepThroughMoves(createCustomElement(component, {injector})));\n }\n });\n\n // The production build drops the block: the dev mode only reports a missing feature\n if (typeof ngDevMode === 'undefined' || ngDevMode) {\n Object.entries({'bro-mat-tags': 'Tags', 'bro-mat-slide-toggle': 'Switch', 'bro-mat-toolbar-more': 'ToolbarMenu'}).forEach(([name, feature]) => {\n if (!customElements.get(name)) {\n customElements.define(name, missingFeature(feature));\n }\n });\n }\n}\n\n/**\n * An element in place of an optional element that the application did not ask for: on its connection it reports the\n * feature to add, once for each column and once for the toolbar.\n * @param feature - the name of the feature after with, as Tags of withTags()\n */\nfunction missingFeature(feature: string): CustomElementConstructor {\n const reported = new Set<string>();\n\n return class extends HTMLElement implements BroCellElement {\n declare col?: BroCellElement['col'];\n\n connectedCallback(): void {\n const user = this.col ? `the column \"${this.col.name}\"` : 'the toolbar';\n const element = feature.replace(/\\B[A-Z]/g, ' $&').toLowerCase();\n\n if (!reported.has(user)) {\n reported.add(user);\n console.error(`Table, Bro: ${user} uses the element ${element}: add with${feature}() to provideTableBroMatSkin()`);\n }\n }\n };\n}\n\n/**\n * A move in the DOM, as a sort moves the rows, disconnects an element and connects it again at once. An Angular element\n * runs both in the zone of Angular, whose end checks every view of the application, so a sort of n rows checked n views\n * n times. The element lets a disconnection pass that a connection follows before the microtasks run: it is a move.\n */\nfunction keepThroughMoves(element: CustomElementConstructor): CustomElementConstructor {\n const base = <new () => HTMLElement & {connectedCallback(): void; disconnectedCallback(): void}>element;\n\n return class extends base {\n private moving: boolean = false;\n\n override connectedCallback(): void {\n if (this.moving) {\n this.moving = false;\n\n return;\n }\n\n super.connectedCallback();\n }\n\n override disconnectedCallback(): void {\n this.moving = true;\n\n queueMicrotask(() => {\n if (this.moving) {\n this.moving = false;\n super.disconnectedCallback();\n }\n });\n }\n };\n}\n","import {EnvironmentInjector, type EnvironmentProviders, inject, provideAppInitializer, type Type} from '@angular/core';\n\nimport {registerSkin} from '@table-bro/core';\n\nimport {BroMaterialSlideToggleComponent} from './bro-slide-toggle.material.component';\nimport {BroMaterialTagsComponent} from './bro-tags.material.component';\nimport {defineTableBroMatElements} from './define-table-bro-mat-elements';\nimport {matSkinConfig} from './table-bro.angular-material.config';\nimport {BroMaterialToolbarMoreComponent} from './toolbar/bro-toolbar-more.material.component';\n\n/** An optional element of the skin mat for provideTableBroMatSkin(): its tag and its component. */\nexport interface TableBroMatSkinFeature {\n /** The tag of the element and its component. */\n readonly elements: Record<string, Type<unknown>>;\n}\n\n/**\n * Connects the skin mat: registers its config and defines its elements when the application starts. A feature adds\n * an optional element, which only a table with a certain config uses, so a table without it does not carry its code.\n * @param features - the optional elements: withTags(), withSwitch(), withToolbarMenu()\n */\nexport function provideTableBroMatSkin(...features: TableBroMatSkinFeature[]): EnvironmentProviders {\n return provideAppInitializer(() => {\n registerSkin('mat', matSkinConfig);\n defineTableBroMatElements(inject(EnvironmentInjector), Object.assign({}, ...features.map(feature => feature.elements)));\n });\n}\n\n/** The element bro-mat-tags: the items of a column as the chips of Material. */\nexport function withTags(): TableBroMatSkinFeature {\n return {elements: {'bro-mat-tags': BroMaterialTagsComponent}};\n}\n\n/** The element bro-mat-slide-toggle: a boolean of a column as a slide toggle. */\nexport function withSwitch(): TableBroMatSkinFeature {\n return {elements: {'bro-mat-slide-toggle': BroMaterialSlideToggleComponent}};\n}\n\n/** The menu of the toolbar: a button of toolbarMain.buttons with the mode navbar-dropdown. */\nexport function withToolbarMenu(): TableBroMatSkinFeature {\n return {elements: {'bro-mat-toolbar-more': BroMaterialToolbarMoreComponent}};\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"table-bro-angular-material.mjs","names":[],"sources":["../../../packages/skins/angular-material/src/lib/table-bro.angular-material.config.ts","../../../packages/skins/angular-material/src/lib/bro-button.material.component.ts","../../../packages/skins/angular-material/src/lib/bro-slide-toggle.material.component.ts","../../../packages/skins/angular-material/src/lib/bro-sort-header.material.component.ts","../../../packages/skins/angular-material/src/lib/bro-tags.material.component.ts","../../../packages/skins/angular-material/src/lib/bro-text-ellipsis.material.component.ts","../../../packages/skins/angular-material/src/lib/table-bro-filter-drawer-container-ng.ts","../../../packages/skins/angular-material/src/lib/toolbar/bro-toolbar-main.material.component.ts","../../../packages/skins/angular-material/src/lib/toolbar/bro-toolbar-more.material.component.ts","../../../packages/skins/angular-material/src/lib/define-table-bro-mat-elements.ts","../../../packages/skins/angular-material/src/lib/provide-table-bro-mat-skin.ts"],"sourcesContent":["import type {BroSkinConfig} from '@table-bro/core';\n\n// The constant keeps the type of its value: an application reads its buttons and its states without checks of undefined\nexport const matSkinConfig = {\n css: {\n table: {\n className: 'mat-table',\n\n thead: {\n tr: {\n className: 'mat-header-row bro-header-row',\n\n th: {\n className: 'mat-header-cell bro-header-cell'\n }\n }\n },\n\n tbody: {\n tr: {\n className: 'mat-row bro-row',\n\n td: {\n className: 'mat-cell bro-cell'\n }\n }\n }\n },\n\n shadow: {\n className: 'mat-elevation-z16'\n }\n },\n\n components: {\n button: {\n selector: 'bro-mat-button',\n\n iconSelector: '.mat-icon',\n\n beforeRender: (element: Element, value: string) => {\n element.setAttribute('button-title', value);\n element.setAttribute('icon', 'expand_more');\n }\n },\n // The drawer of the skin is TableBroFilterDrawerContainerNg, with its close button in its template\n filterDrawer: {},\n fontIcon: {\n // The name of a ligature icon is its text: the message of the state names the state instead\n html: (materialIcon: string) => `<span class=\"material-icons bro-state-icon\" aria-hidden=\"true\">${materialIcon}</span>`\n },\n paginator: {\n selector: 'ng-mat-paginator',\n inputsAsProperties: true,\n recreateOnReplaceRows: true\n },\n progressBar: {\n selector: 'ng-mat-progress-bar'\n },\n sortHeader: {\n selector: 'bro-mat-sort-header',\n titleAsContent: true,\n contentSelector: '.mat-sort-header-content'\n },\n state: {\n fontIcon: true,\n states: {\n loading: ['front_loader', 'Loading'],\n 'no-data': ['heart_broken', 'No data'],\n 'not-found': ['heart_broken', 'No records found'],\n fail: ['smart_toy', 'Failed']\n }\n },\n switch: {\n selector: 'bro-mat-slide-toggle'\n },\n textEllipsis: {\n selector: 'bro-mat-text-ellipsis'\n },\n toolbar: {\n selector: 'ng-mat-toolbar'\n },\n toolbarMain: {\n selector: 'bro-mat-toolbar-main'\n },\n toolbarSearch: {\n beforeRender: (backButton: Element, clearButton: Element) => {\n backButton.setAttribute('icon', 'arrow_back');\n\n clearButton.setAttribute('icon', 'close');\n }\n }\n }\n} satisfies BroSkinConfig;\n","import {ChangeDetectionStrategy, Component, input, output} from '@angular/core';\n\nimport {MatButton, MatIconButton} from '@angular/material/button';\nimport {MatIcon} from '@angular/material/icon';\n\n/** The button of the skin, the element bro-mat-button with the properties of BroButton. */\n@Component({\n template: `\n @if (buttonTitle()) {\n <button matButton\n type=\"button\" [class]=\"buttonClassName()\"\n [attr.aria-label]=\"label()\"\n (click)=\"onClickButton()\">\n @if (icon()) {\n <mat-icon>{{ icon() }}</mat-icon>\n }\n {{ buttonTitle() }}\n </button>\n } @else if (icon()) {\n <button matIconButton\n type=\"button\"\n [class]=\"buttonClassName()\"\n [attr.aria-label]=\"label()\"\n (click)=\"onClickButton()\">\n <mat-icon>{{ icon() }}</mat-icon>\n </button>\n }`,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n MatButton,\n MatIcon,\n MatIconButton\n ]\n})\nexport class BroMaterialButtonComponent {\n readonly buttonClassName = input<string | null>(undefined, {alias: 'button-class'});\n readonly buttonTitle = input<string>('', {alias: 'button-title'});\n readonly eventType = input<string>('', {alias: 'event-type'});\n readonly icon = input<string>();\n /** The name of a button without a title: the table gives it as the attribute label, not aria-label on the element. */\n readonly label = input<string>();\n\n readonly action = output<string>();\n\n onClickButton() {\n this.action.emit(this.eventType());\n }\n}\n","import {ChangeDetectionStrategy, Component, computed, input, output} from '@angular/core';\n\nimport {MatSlideToggle} from '@angular/material/slide-toggle';\nimport type {BroCol, BroRow} from '@table-bro/core';\n\n/**\n * A switch of a boolean of a cell. A change sends the action of the attribute name in the output action, which the\n * table turns into bro-action with the column and the row (event: 'action' of the column); the title of the column\n * names the switch for screen readers.\n */\n@Component({\n template: `\n <mat-slide-toggle [hideIcon]=\"true\" [checked]=\"checked()\" [aria-label]=\"col()?.title ?? null\" (change)=\"onChange()\"></mat-slide-toggle>`,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n MatSlideToggle\n ]\n})\nexport class BroMaterialSlideToggleComponent<T extends object = BroRow> {\n readonly col = input<BroCol<T>>();\n readonly row = input<T>();\n\n /** The action of a change. */\n readonly name = input<string>();\n\n readonly action = output<string>();\n\n /** The value of the field of the column in the row. */\n readonly checked = computed(() => {\n const name = this.col()?.name;\n\n return !!(name && this.row()?.[name]);\n });\n\n onChange() {\n const name = this.name();\n\n if (name) {\n this.action.emit(name);\n }\n }\n}\n","import {isPlatformBrowser} from '@angular/common';\nimport {ChangeDetectionStrategy, Component, computed, effect, ElementRef, inject, input, PLATFORM_ID, signal, viewChild} from '@angular/core';\n\nimport {MatSort, MatSortHeader, type Sort, type SortDirection, type SortHeaderArrowPosition} from '@angular/material/sort';\nimport {MatTooltip} from '@angular/material/tooltip';\nimport {type BroColDataType, type BroColSort, type BroSortHeader, dispatchAction, events} from '@table-bro/core';\n\n/** The sort header of a column, the element bro-mat-sort-header with the properties of BroSortHeader. */\n@Component({\n template: `\n @if (headerTitle()) {\n <div matSort matSortStart=\"desc\"\n [matSortDirection]=\"matSortDirection()\"\n (matSortChange)=\"onSort($event)\">\n <div [mat-sort-header]=\"id()\" matTooltipPosition=\"right\"\n [arrowPosition]=\"arrowPosition()\" [matTooltip]=\"tooltip()\">\n <ng-content></ng-content>\n </div>\n </div>\n }`,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n MatSort,\n MatSortHeader,\n MatTooltip\n ]\n})\nexport class BroMaterialSortHeaderComponent {\n /** The active sort of the table: a sort of another column resets the arrow of this header. */\n readonly activeSort = input<BroColSort>();\n readonly arrowPosition = input<BroSortHeader['arrowPosition'] | SortHeaderArrowPosition>('after', {alias: 'arrow-position'});\n readonly dataType = input<BroColDataType>(undefined, {alias: 'data-type'});\n readonly headerTitle = input<string>('', {alias: 'header-title'});\n readonly sortId = input<string>('', {alias: 'sort-id'});\n readonly tooltip = input<string>('');\n\n /** The key of the column, or an own one of the header. */\n readonly id = computed(() => this.sortId() || `bro-${Math.random().toString(36).slice(2)}`);\n readonly matSortDirection = signal<SortDirection>('');\n\n private readonly elementRef: ElementRef<HTMLElement> = inject(ElementRef);\n private readonly sortHeader = viewChild(MatSortHeader, {read: ElementRef});\n private sortedDirection: SortDirection = '';\n\n constructor() {\n effect(() => {\n const sort = this.activeSort();\n\n if (this.sortedDirection !== '' && sort?.sortKey !== this.id()) {\n this.sortedDirection = '';\n this.matSortDirection.set('');\n }\n });\n\n // The header cell of the table tells the sort with aria-sort. Material puts aria-sort on its own host too, a div\n // inside the cell, where ARIA does not allow it: the div does not keep it. The prerender sorts nothing, so its div\n // only loses the attribute\n const browser = isPlatformBrowser(inject(PLATFORM_ID));\n\n effect(onCleanup => {\n const header: HTMLElement | undefined = this.sortHeader()?.nativeElement;\n\n if (!header) {\n return;\n }\n\n if (!browser) {\n header.removeAttribute('aria-sort');\n\n return;\n }\n\n const observer = new MutationObserver(() => header.removeAttribute('aria-sort'));\n\n header.removeAttribute('aria-sort');\n observer.observe(header, {attributes: true, attributeFilter: ['aria-sort']});\n onCleanup(() => observer.disconnect());\n });\n }\n\n onSort(event: Sort): void {\n dispatchAction(this.elementRef.nativeElement, events.filtersSortEvent, {\n sortKey: event.active,\n sortDirection: event.direction || undefined\n });\n\n this.sortedDirection = event.direction;\n this.matSortDirection.set(event.direction);\n }\n}\n","import {afterNextRender, ChangeDetectionStrategy, Component, computed, DestroyRef, ElementRef, inject, Injectable, input, signal} from '@angular/core';\n\nimport {MatChip, MatChipSet} from '@angular/material/chips';\nimport {type BroCol, type BroResolvedConfig, type BroRow, fitCellItems} from '@table-bro/core';\n\n/**\n * The texts of the tags of the skin mat, which withTags({texts}) sets and the application changes at any time, as when\n * the language of the page changes: the chips in the DOM take them at once.\n */\n@Injectable({providedIn: 'root'})\nexport class TableBroMatTagsTexts {\n /** The text of a cell of tags without items; without it the tags take the deprecated texts.noItems of the table, or No data. */\n readonly empty = signal<string | undefined>(undefined);\n}\n\n/** The tags of a cell: the items of the field of the column, as the chips of Material. */\n@Component({\n template: `\n <mat-chip-set>\n @for (chip of chipList(); track $index) {\n <mat-chip>{{ chip }}</mat-chip>\n }\n </mat-chip-set>`,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n MatChip,\n MatChipSet\n ]\n})\nexport class BroMaterialTagsComponent {\n readonly col = input<BroCol>();\n readonly row = input<BroRow>();\n /** The config of the table, which the table gives the elements of its cells: the text of a cell without items. */\n readonly config = input<BroResolvedConfig>();\n\n /** The items of the field of the column in the row. */\n readonly chipList = computed<string[]>(() => {\n const name = this.col()?.name;\n const items = name && this.row()?.[name];\n\n return Array.isArray(items) && items.length ? items : [this.texts.empty() ?? this.config()?.texts.noItems ?? 'No data'];\n });\n\n private readonly elementRef: ElementRef<HTMLElement> = inject(ElementRef);\n private readonly texts: TableBroMatTagsTexts = inject(TableBroMatTagsTexts);\n\n /** Stops fitting the chips into the line when the component goes. */\n private readonly fitting: AbortController = new AbortController();\n\n constructor() {\n // The chips that do not fit the line give way to an ellipsis\n afterNextRender(() => {\n const chips = this.elementRef.nativeElement.querySelector<HTMLElement>('.mdc-evolution-chip-set__chips');\n\n if (chips) {\n fitCellItems(chips, this.fitting.signal);\n }\n });\n\n inject(DestroyRef).onDestroy(() => this.fitting.abort());\n }\n}\n","import {ChangeDetectionStrategy, Component, computed, input} from '@angular/core';\n\nimport {MatTooltip} from '@angular/material/tooltip';\nimport {broCellSelectors, type BroCol, BroHTML} from '@table-bro/core';\n\n/** A value wider than its column, with the whole value in a tooltip: the element bro-mat-text-ellipsis of BroTextEllipsis. */\n@Component({\n template: `\n <span matTooltipPosition=\"above\"\n class=\"{{ tableCellTextEllipsisContainer }}{{ containerClassName() ? ' ' + containerClassName() : '' }}\"\n [matTooltip]=\"tooltip()\">\n @if (col()?.html) {\n <span class=\"{{ tableCellTextEllipsis }}\" [innerHTML]=\"value()\"></span>\n } @else {\n <span class=\"{{ tableCellTextEllipsis }}\">{{ value() }}</span>\n }\n </span>`,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n MatTooltip\n ]\n})\nexport class BroMaterialTextEllipsisComponent {\n /** The column of the cell: with html: true the value is markup. */\n readonly col = input<BroCol>();\n\n readonly containerClassName = input<string | null>(null, {alias: 'container-class'});\n readonly value = input<string>('');\n\n /** The text of the value: the text of the markup of an HTML value. */\n readonly tooltip = computed(() => this.col()?.html ? BroHTML.text(this.value()) : this.value());\n\n readonly tableCellTextEllipsisContainer = broCellSelectors.ellipsisContainer;\n readonly tableCellTextEllipsis = broCellSelectors.ellipsis;\n}\n","import {afterNextRender, ChangeDetectionStrategy, Component, computed, DestroyRef, ElementRef, inject, input, model, output, signal, viewChild} from '@angular/core';\n\nimport {FocusMonitor, InputModalityDetector} from '@angular/cdk/a11y';\nimport {MatIconButton} from '@angular/material/button';\nimport {MatIcon} from '@angular/material/icon';\nimport {MatDrawer, MatDrawerContainer, MatDrawerContent, type MatDrawerMode} from '@angular/material/sidenav';\nimport {MatToolbar} from '@angular/material/toolbar';\nimport {type BroServerFacade, TableBroNg} from '@table-bro/angular';\nimport {type BroActionDetail, type BroCol, type BroConfig, type BroEmptyState, type BroFilters, type BroQuery, type BroUserTheme, dispatchAction, events, registerFilterDrawerProperties, resolveTexts} from '@table-bro/core';\n\nimport {matSkinConfig} from './table-bro.angular-material.config';\n\n/**\n * The table with the filter drawer of the mat skin: mat-drawer-container with <table-bro-ng> in its content and the filters\n * of the application, the content of this component, in mat-drawer. It takes the inputs and gives the outputs\n * of <table-bro-ng>. The Filters button of the table toolbar opens the drawer, any other button of the page calls toggle().\n * Material opens the drawer and narrows the table in the side mode; the card of the skin in the drawer grows\n * from its right edge. A table that would get narrower than its minimum width next to the drawer keeps its width:\n * the drawer lies over it in the mode over, with the scrim of Material, as the modal side sheet of Material 3.\n */\n@Component({\n selector: 'table-bro-filter-drawer-container-ng',\n template: `\n <mat-drawer-container [class.bro-filter-drawer_no-shadow]=\"!shadowsEnabled()\" (backdropClick)=\"onBackdropClick()\">\n <mat-drawer-content>\n <table-bro-ng [class.bro-table-shadow-container]=\"shadowsEnabled()\"\n [tableId]=\"tableId()\" [cols]=\"cols()\" [rows]=\"rows()\" [conf]=\"conf()\"\n [total]=\"total()\" [rowsToAppend]=\"rowsToAppend()\" [emptyState]=\"emptyState()\"\n [loading]=\"loading()\" [failed]=\"failed()\"\n [filter]=\"filter()\" [theme]=\"theme()\"\n (action)=\"onTableAction($event)\"\n (query)=\"query.emit($event)\"></table-bro-ng>\n </mat-drawer-content>\n\n <mat-drawer position=\"end\"\n [class.bro-filter-drawer_no-shadow]=\"!shadowsEnabled()\" [mode]=\"drawerMode()\"\n [opened]=\"opened()\" (openedChange)=\"opened.set($event)\" (closedStart)=\"restoreFocus(false)\">\n <div class=\"bro-filter-drawer-card\" [class]=\"shadowClassName()\">\n <div class=\"bro-filter-drawer-header\">\n <mat-toolbar>\n <span class=\"bro-filter-drawer-title\">{{ texts().filters }}</span>\n\n <button matIconButton class=\"bro-filter-drawer-close\" type=\"button\"\n [attr.aria-label]=\"texts().close\"\n (click)=\"setOpened(false)\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-toolbar>\n </div>\n\n <div>\n <ng-content></ng-content>\n </div>\n </div>\n </mat-drawer>\n </mat-drawer-container>`,\n styles: `\n :host {\n display: block;\n }\n\n /* The shadows of the table and of the card lie outside of them; the drawer stands in its place, nothing to clip */\n mat-drawer-container,\n mat-drawer-content {\n overflow: visible;\n }\n\n /*\n * One motion for the drawer, the content, and the width of the card. Material turns it on with mat-drawer-transition,\n * and not under prefers-reduced-motion. The standard curve of Material starts softer than the curve of mat-drawer.\n * The transform of the drawer is an identity (the skin), its transition only gives Material its events\n */\n .mat-drawer-transition mat-drawer,\n .mat-drawer-transition mat-drawer-content,\n .mat-drawer-transition .bro-filter-drawer-card {\n transition-duration: calc(var(--bro-filter-drawer-duration) * var(--bro-duration-scale));\n transition-timing-function: cubic-bezier(.4, 0, .2, 1);\n }\n\n .mat-drawer-transition .bro-filter-drawer-card {\n transition-property: --bro-filter-drawer-opened;\n }\n\n .bro-filter-drawer-header {\n position: sticky;\n top: 0;\n z-index: 1;\n }`,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mat',\n '[class.bro-dark-theme]': 'dark()',\n '[class.bro-light-theme]': 'light()'\n },\n imports: [\n MatDrawer,\n MatDrawerContainer,\n MatDrawerContent,\n MatIcon,\n MatIconButton,\n MatToolbar,\n TableBroNg\n ]\n})\nexport class TableBroFilterDrawerContainerNg<MODEL extends object> implements BroServerFacade<MODEL> {\n /* The inputs and the outputs of <table-bro-ng> */\n cols = input.required<BroCol<MODEL>[]>();\n rows = input.required<MODEL[] | undefined | null>();\n conf = input.required<BroConfig<MODEL>>();\n\n total = input<number>();\n rowsToAppend = input<MODEL[] | undefined>();\n loading = input<boolean>(false);\n failed = input<boolean>(false);\n\n filter = input<BroFilters<MODEL> | undefined>();\n emptyState = input<BroEmptyState>();\n tableId = input<string>();\n theme = input<BroUserTheme | null>();\n\n action = output<BroActionDetail<MODEL>>();\n query = output<BroQuery<MODEL>>();\n\n /* The drawer */\n /** Whether the drawer is opened; [(opened)] binds it both ways. */\n opened = model<boolean>(false);\n /**\n * The mode of mat-drawer: side, by default, narrows the content, and the drawer lies over a table that would get\n * narrower than its minimum width; over lies over the table always, with the scrim of Material; push as in Material.\n */\n mode = input<MatDrawerMode>('side');\n\n /** The drawer lies over a table that would not keep its minimum width next to it. */\n protected over = signal<boolean>(false);\n protected drawerMode = computed<MatDrawerMode>(() => this.over() ? 'over' : this.mode());\n\n /** With shadows the table lets them into its margins and takes the full width; the card has the shadow too. */\n protected shadowsEnabled = computed(() => this.conf().shadowsEnabled !== false);\n /** The class of the shadow of the skin config, as the card of the drawer of the core takes it. */\n protected shadowClassName = computed(() => this.shadowsEnabled() ? matSkinConfig.css.shadow.className : '');\n\n /** The texts of the config of the table: the title of the drawer and the name of its close button. */\n protected texts = computed(() => resolveTexts(this.conf().texts));\n\n /** The host of the table has the class of the dark theme: the container takes it too, as the drawer of the core does. */\n protected dark = signal<boolean>(false);\n /** The host of the table has the class of its own light theme: the container stays light under a dark ancestor too. */\n protected light = signal<boolean>(false);\n\n private focusMonitor = inject(FocusMonitor);\n private host = inject(ElementRef);\n private inputModality = inject(InputModalityDetector);\n\n private container = viewChild.required(MatDrawerContainer);\n private content = viewChild.required(MatDrawerContent, {read: ElementRef});\n private drawer = viewChild.required(MatDrawer);\n private drawerElement = viewChild.required(MatDrawer, {read: ElementRef});\n\n /** The last click in the component: while the page dispatches it, the control that it reached sends its action. */\n private lastClick: Event | null = null;\n /** The button that opened the drawer, as the Filters button of the table: the focus goes back to it. */\n private opener: HTMLElement | null = null;\n\n constructor() {\n const destroyRef = inject(DestroyRef);\n\n // The card moves by the transition of --bro-filter-drawer-opened, which the script registers\n registerFilterDrawerProperties();\n\n // A narrower or a wider page moves the opened drawer over the table or next to it. The observer exists in the\n // browser only: a server render of the app, as a prerender, creates the component without one\n afterNextRender(() => {\n const resizeObserver = new ResizeObserver(() => this.fitMode());\n\n resizeObserver.observe(this.host.nativeElement);\n destroyRef.onDestroy(() => resizeObserver.disconnect());\n });\n\n afterNextRender(() => {\n this.host.nativeElement.addEventListener('click', (event: Event) => {\n this.lastClick = event;\n }, true);\n });\n\n // The theme of the table is the class of its host, which the table changes with its theme\n afterNextRender(() => {\n const table: HTMLElement | null = this.content().nativeElement.querySelector('table-bro');\n\n if (!table) {\n return;\n }\n\n const readTheme = () => {\n this.dark.set(table.classList.contains('bro-dark-theme'));\n this.light.set(table.classList.contains('bro-light-theme'));\n };\n\n const themeObserver = new MutationObserver(readTheme);\n\n themeObserver.observe(table, {attributes: true, attributeFilter: ['class']});\n destroyRef.onDestroy(() => themeObserver.disconnect());\n\n readTheme();\n });\n }\n\n toggle(): void {\n this.setOpened(!this.opened());\n }\n\n /** The Filters button of the table toolbar opens the drawer; every action goes on to the page. */\n protected onTableAction(event: BroActionDetail<MODEL>): void {\n if (event.action === events.filtersToggleEvent) {\n // The toolbar sends the action: the button is the one that the click being dispatched reached, else the one that\n // has the focus. Safari gives the focus to no button by a click\n const clicked = (this.lastClick && this.lastClick.eventPhase !== Event.NONE) ? (<Element>this.lastClick.target).closest<HTMLElement>('a[href], button') : null;\n const opener = clicked ?? <HTMLElement | null>this.host.nativeElement.ownerDocument.activeElement;\n\n this.opener = (opener && this.content().nativeElement.contains(opener)) ? opener : this.opener;\n this.toggle();\n\n // Chrome focuses the button by the click that opens the drawer; Safari leaves the focus on the page, and the button\n // takes it as in Chrome. The drawer of the side mode does not take the focus, the one of the mode over takes it later\n if (this.opened()) {\n this.restoreFocus(true);\n }\n }\n\n this.action.emit(event);\n }\n\n /**\n * Opens or closes the drawer and narrows the content in the same frame. Material narrows it on transitionrun\n * of the drawer, a frame later, so the space between the table and the card would change while they move.\n */\n protected setOpened(opened: boolean): void {\n if (opened && this.mode() === 'side') {\n this.over.set(!this.fitsNextToDrawer());\n\n // Material takes the mode at the toggle below, before the next check of the template\n this.drawer().mode = this.drawerMode();\n }\n\n this.fitTableColumns(opened);\n\n this.opened.set(opened);\n\n this.drawer().toggle(opened);\n this.container().updateContentMargins();\n\n if (!opened) {\n this.restoreFocus(true);\n }\n }\n\n /**\n * A click on the scrim of the mode over: Material closes the drawer right after it tells it, and gives the focus to the\n * element that had it before the drawer opened, in Safari the page; then the focus goes back to the button.\n */\n protected onBackdropClick(): void {\n queueMicrotask(() => this.restoreFocus(true));\n }\n\n /**\n * The focus in the closing drawer goes back to the button that opened it, as from the drawer of the core: Material keeps\n * it in the drawer of the side mode. A click that closes the drawer gives back also the focus that Safari, which focuses\n * no button by a click, lost to the page; a later start of the closing leaves it to the page, which may have moved it\n * since. The Filters button that opens the drawer takes the focus from the page the same way. The focus comes by\n * the last input, as Material restores it: the button shows no focus after the pointer.\n * @param fromPage - the focus on the page, not in an element, goes back too\n */\n protected restoreFocus(fromPage: boolean): void {\n const focused = this.host.nativeElement.ownerDocument.activeElement;\n\n if (this.opener && (this.drawerElement().nativeElement.contains(focused) || (fromPage && focused === this.host.nativeElement.ownerDocument.body))) {\n const origin = this.inputModality.mostRecentModality ?? 'program';\n // The options of the DOM: the CDK gives them to focus() as they are, and its own type knows no focusVisible\n const options: FocusOptions = (origin === 'mouse' || origin === 'touch') ? {preventScroll: true, focusVisible: false} : {preventScroll: true};\n\n this.focusMonitor.focusVia(this.opener, origin, options);\n }\n }\n\n /**\n * Moves the opened drawer over the table when the table would get narrower than its minimum width next to it, and\n * back next to it when it fits again: the table takes its new width at once, and the scrim of Material comes or goes\n * by its transition; the drawer keeps its place at the right edge.\n */\n private fitMode(): void {\n if (!this.opened() || this.mode() !== 'side') {\n return;\n }\n\n const over = !this.fitsNextToDrawer();\n\n if (over === this.over()) {\n return;\n }\n\n this.over.set(over);\n this.drawer().mode = this.drawerMode();\n this.fitTableColumns(true);\n this.container().updateContentMargins();\n }\n\n /** The table keeps at least its minimum width next to the opened drawer: the width of the drawer holds its space. */\n private fitsNextToDrawer(): boolean {\n const content: HTMLElement = this.content().nativeElement;\n const table: HTMLElement | null = content.querySelector('table-bro');\n\n if (!table) {\n return true;\n }\n\n // The width comes from the content, without the room that a table leaves for its shadows when no shadow container\n // takes them\n const shadowRoom = this.shadowsEnabled() ? 0 : 2 * parseFloat(getComputedStyle(table).getPropertyValue('--bro-shadow-size'));\n const width = content.getBoundingClientRect().width + parseFloat(getComputedStyle(content).marginRight) - shadowRoom;\n\n return width - this.drawerElement().nativeElement.offsetWidth >= parseFloat(getComputedStyle(table).getPropertyValue('--bro-table-min-width'));\n }\n\n /**\n * Gives the table at once the width it has at the end of the transition: the drawer has a fixed width, so the columns\n * take their new widths right at the click and come with the table. In the side mode Material narrows the content\n * by the width of the drawer; during a transition the content counts from its margin at this moment.\n */\n private fitTableColumns(opened: boolean): void {\n const content: HTMLElement = this.content().nativeElement;\n const table: HTMLElement | null = content.querySelector('table-bro');\n\n if (!table) {\n return;\n }\n\n const margin = parseFloat(getComputedStyle(content).marginRight);\n const targetMargin: number = (opened && this.drawerMode() === 'side') ? this.drawerElement().nativeElement.offsetWidth : 0;\n // A table at its minimum width is wider than the content: the width comes from the content\n const shadowRoom = this.shadowsEnabled() ? 0 : 2 * parseFloat(getComputedStyle(table).getPropertyValue('--bro-shadow-size'));\n\n dispatchAction(table, events.columnsWidthEvent, content.getBoundingClientRect().width + margin - targetMargin - shadowRoom);\n }\n}\n","import {ChangeDetectionStrategy, Component, computed, CUSTOM_ELEMENTS_SCHEMA, input, output} from '@angular/core';\n\nimport {MatIconButton} from '@angular/material/button';\nimport {MatIcon} from '@angular/material/icon';\nimport {MatToolbar} from '@angular/material/toolbar';\nimport {MatTooltip} from '@angular/material/tooltip';\nimport {type BroButton, type BroDropdown, type BroResolvedConfig, events} from '@table-bro/core';\n\n/** The toolbar of a table: its title, its search and the buttons and the menu of the config. */\n@Component({\n template: `\n <mat-toolbar>\n <button matIconButton class=\"bro-toolbar-placeholder\"\n type=\"button\" aria-label=\"\">\n <mat-icon>menu</mat-icon>\n </button>\n\n <span>{{ title() }}</span>\n\n <span class=\"bro-toolbar-space\"></span>\n\n <button matIconButton\n class=\"bro-toolbar-button-search\"\n type=\"button\" [attr.aria-label]=\"config()?.texts?.search\"\n (click)=\"onClickSearch()\">\n <mat-icon>search</mat-icon>\n </button>\n\n @for (button of mainButtons(); track $index) {\n <button matIconButton type=\"button\" matTooltipPosition=\"above\"\n [matTooltip]=\"button.buttonTooltip ?? ''\"\n [attr.aria-label]=\"button.buttonTitle\"\n (click)=\"onClickButton(button.eventType)\">\n <mat-icon>{{ button.iconHTML }}</mat-icon>\n </button>\n }\n\n <!-- The menu is the element of withToolbarMenu(): a toolbar without a menu does not carry the menu of Material -->\n @if (dropdown(); as dropdown) {\n <bro-mat-toolbar-more matTooltipPosition=\"above\"\n [dropdown]=\"dropdown\" [matTooltip]=\"dropdown.buttonTooltip ?? ''\"\n (action)=\"onMenuAction($event)\"></bro-mat-toolbar-more>\n }\n </mat-toolbar>`,\n // Classes, not style attributes in the template, which a strict Content Security Policy blocks\n styles: `\n .bro-toolbar-placeholder {\n visibility: hidden;\n }\n\n .bro-toolbar-space {\n flex: 1 1 auto;\n }`,\n changeDetection: ChangeDetectionStrategy.OnPush,\n schemas: [CUSTOM_ELEMENTS_SCHEMA],\n imports: [\n MatIcon,\n MatIconButton,\n MatToolbar,\n MatTooltip\n ]\n})\nexport class BroMaterialToolbarMainComponent {\n /** The config of the table: the name of the search button. */\n readonly config = input<BroResolvedConfig>();\n\n // The table sets the buttons and the title before the element connects: the buttons as the JSON of the config\n readonly buttons = input<string>('[]');\n readonly title = input<string>('');\n\n readonly action = output<string>({alias: 'bro-toolbar'});\n\n /** The buttons and the one menu of the config. */\n private readonly toolbarButtons = computed<(BroButton | BroDropdown)[]>(() => JSON.parse(this.buttons()));\n\n readonly mainButtons = computed(() => <BroButton[]>this.toolbarButtons().filter(button => button.mode !== 'navbar-dropdown'));\n readonly dropdown = computed(() => <BroDropdown | undefined>this.toolbarButtons().find(button => button.mode === 'navbar-dropdown'));\n\n onClickSearch() {\n this.action.emit(events.toolbarSearchOpenEvent);\n }\n\n onClickButton(action: string) {\n this.action.emit(action);\n }\n\n /** The element of the menu sends the value of its item as the detail of its event action. */\n onMenuAction(event: Event) {\n this.action.emit((<CustomEvent<string>>event).detail);\n }\n}\n","import {ChangeDetectionStrategy, Component, input, output} from '@angular/core';\n\nimport {MatIconButton} from '@angular/material/button';\nimport {MatDivider} from '@angular/material/divider';\nimport {MatIcon} from '@angular/material/icon';\nimport {MatMenu, MatMenuItem, MatMenuTrigger} from '@angular/material/menu';\nimport type {BroDropdown} from '@table-bro/core';\n\n/**\n * The menu of the toolbar, the element bro-mat-toolbar-more of withToolbarMenu(): a button with the title of the menu as\n * its name, and the items that send their values.\n */\n@Component({\n template: `\n @if (dropdown(); as dropdown) {\n <button matIconButton\n [attr.aria-label]=\"dropdown.buttonTitle\"\n [matMenuTriggerFor]=\"menu\">\n <mat-icon>more_vert</mat-icon>\n </button>\n\n <mat-menu #menu=\"matMenu\">\n @for (option of dropdown.options; track $index) {\n @if (option.divider) {\n <mat-divider></mat-divider>\n } @else {\n <button mat-menu-item (click)=\"onClickButton(option.value)\">\n @if (option.iconHTML) {\n <mat-icon>{{ option.iconHTML }}</mat-icon>\n }\n <span>{{ option.title }}</span>\n </button>\n }\n }\n </mat-menu>\n }`,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n MatDivider,\n MatIcon,\n MatIconButton,\n MatMenu,\n MatMenuItem,\n MatMenuTrigger\n ]\n})\nexport class BroMaterialToolbarMoreComponent {\n // The toolbar binds its dropdown after the element connects\n readonly dropdown = input<BroDropdown>();\n\n readonly action = output<string>();\n\n onClickButton(action: string | undefined) {\n this.action.emit(<string>action);\n }\n}\n","import {isPlatformBrowser} from '@angular/common';\nimport {type EnvironmentInjector, PLATFORM_ID, type Type} from '@angular/core';\nimport {createCustomElement} from '@angular/elements';\n\nimport {MatPaginator} from '@angular/material/paginator';\nimport {MatProgressBar} from '@angular/material/progress-bar';\nimport {MatToolbar} from '@angular/material/toolbar';\nimport {type BroCellElement, isPrerendered} from '@table-bro/core';\n\nimport {BroMaterialButtonComponent} from './bro-button.material.component';\nimport {BroMaterialSortHeaderComponent} from './bro-sort-header.material.component';\nimport {BroMaterialTextEllipsisComponent} from './bro-text-ellipsis.material.component';\nimport {BroMaterialToolbarMainComponent} from './toolbar/bro-toolbar-main.material.component';\n\n/**\n * The elements of the skin that every table may use: the components of Material that the table uses as they are, and\n * the ones of the skin. The optional elements come from the features of provideTableBroMatSkin().\n */\nexport const tableBroMatElements: Record<string, Type<unknown>> = {\n 'ng-mat-paginator': MatPaginator,\n 'ng-mat-progress-bar': MatProgressBar,\n 'ng-mat-toolbar': MatToolbar,\n\n 'bro-mat-button': BroMaterialButtonComponent,\n 'bro-mat-sort-header': BroMaterialSortHeaderComponent,\n 'bro-mat-toolbar-main': BroMaterialToolbarMainComponent,\n 'bro-mat-text-ellipsis': BroMaterialTextEllipsisComponent\n};\n\n/**\n * Defines the elements of the skin in the browser, each one unless it is defined; the server render of Angular has no\n * custom elements. In the dev mode an optional element that no feature gives is defined as an element that reports\n * the missing feature.\n * @param injector - the injector of the application, for the Angular elements\n * @param features - the optional elements that the application asks for\n */\nexport function defineTableBroMatElements(injector: EnvironmentInjector, features: Record<string, Type<unknown>> = {}): void {\n if (!isPlatformBrowser(injector.get(PLATFORM_ID))) {\n return;\n }\n\n Object.entries({...tableBroMatElements, ...features}).forEach(([name, component]) => {\n if (!customElements.get(name)) {\n customElements.define(name, keepThroughMoves(createCustomElement(component, {injector})));\n }\n });\n\n // The production build drops the block: the dev mode only reports a missing feature\n if (typeof ngDevMode === 'undefined' || ngDevMode) {\n Object.entries({'bro-mat-tags': 'Tags', 'bro-mat-slide-toggle': 'Switch', 'bro-mat-toolbar-more': 'ToolbarMenu'}).forEach(([name, feature]) => {\n if (!customElements.get(name)) {\n customElements.define(name, missingFeature(feature));\n }\n });\n }\n}\n\n/**\n * An element in place of an optional element that the application did not ask for: on its connection it reports the\n * feature to add, once for each column and once for the toolbar.\n * @param feature - the name of the feature after with, as Tags of withTags()\n */\nfunction missingFeature(feature: string): CustomElementConstructor {\n const reported = new Set<string>();\n\n return class extends HTMLElement implements BroCellElement {\n declare col?: BroCellElement['col'];\n\n connectedCallback(): void {\n const user = this.col ? `the column \"${this.col.name}\"` : 'the toolbar';\n const element = feature.replace(/\\B[A-Z]/g, ' $&').toLowerCase();\n\n if (!reported.has(user)) {\n reported.add(user);\n console.error(`Table, Bro: ${user} uses the element ${element}: add with${feature}() to provideTableBroMatSkin()`);\n }\n }\n };\n}\n\n/**\n * A move in the DOM, as a sort moves the rows, disconnects an element and connects it again at once. An Angular element\n * runs both in the zone of Angular, whose end checks every view of the application, so a sort of n rows checked n views\n * n times. The element lets a disconnection pass that a connection follows before the microtasks run: it is a move.\n */\nfunction keepThroughMoves(element: CustomElementConstructor): CustomElementConstructor {\n const base = <new () => HTMLElement & {connectedCallback(): void; disconnectedCallback(): void}>element;\n\n return class extends base {\n private moving: boolean = false;\n\n override connectedCallback(): void {\n if (this.moving) {\n this.moving = false;\n\n return;\n }\n\n // An element of the prerender keeps its markup until the table renders its own elements in its place\n if (isPrerendered(this)) {\n return;\n }\n\n super.connectedCallback();\n }\n\n override disconnectedCallback(): void {\n this.moving = true;\n\n queueMicrotask(() => {\n if (this.moving) {\n this.moving = false;\n super.disconnectedCallback();\n }\n });\n }\n };\n}\n","import {EnvironmentInjector, type EnvironmentProviders, inject, makeEnvironmentProviders, provideAppInitializer, type Type} from '@angular/core';\n\nimport {TABLE_BRO_ELEMENTS} from '@table-bro/angular';\nimport {registerSkin} from '@table-bro/core';\n\nimport {BroMaterialSlideToggleComponent} from './bro-slide-toggle.material.component';\nimport {BroMaterialTagsComponent, TableBroMatTagsTexts} from './bro-tags.material.component';\nimport {defineTableBroMatElements, tableBroMatElements} from './define-table-bro-mat-elements';\nimport {matSkinConfig} from './table-bro.angular-material.config';\nimport {BroMaterialToolbarMoreComponent} from './toolbar/bro-toolbar-more.material.component';\n\n/** An optional element of the skin mat for provideTableBroMatSkin(): its tag and its component. */\nexport interface TableBroMatSkinFeature {\n /** The tag of the element and its component. */\n readonly elements: Record<string, Type<unknown>>;\n /** Sets up the element when the application starts, in the injection context of the application. */\n readonly init?: () => void;\n}\n\n/**\n * Connects the skin mat: registers its config and defines its elements when the application starts. A feature adds\n * an optional element, which only a table with a certain config uses, so a table without it does not carry its code.\n * @param features - the optional elements: withTags(), withSwitch(), withToolbarMenu()\n */\nexport function provideTableBroMatSkin(...features: TableBroMatSkinFeature[]): EnvironmentProviders {\n const elements = Object.assign({}, ...features.map(feature => feature.elements));\n\n // The prerender renders the elements of the skin with their components too (TABLE_BRO_ELEMENTS)\n return makeEnvironmentProviders([\n provideAppInitializer(() => {\n registerSkin('mat', matSkinConfig);\n features.forEach(feature => feature.init?.());\n defineTableBroMatElements(inject(EnvironmentInjector), elements);\n }),\n {provide: TABLE_BRO_ELEMENTS, useValue: {skin: 'mat', elements: {...tableBroMatElements, ...elements}}, multi: true}\n ]);\n}\n\n/**\n * The element bro-mat-tags: the items of a column as the chips of Material.\n * @param options - the texts of the tags, as {texts: {empty: 'No tags'}}; TableBroMatTagsTexts changes them later\n * @param options.texts - the texts of the tags\n */\nexport function withTags(options: {texts?: {empty?: string}} = {}): TableBroMatSkinFeature {\n const empty = options.texts?.empty;\n\n return {\n elements: {'bro-mat-tags': BroMaterialTagsComponent},\n init: () => {\n if (empty !== undefined) {\n inject(TableBroMatTagsTexts).empty.set(empty);\n }\n }\n };\n}\n\n/** The element bro-mat-slide-toggle: a boolean of a column as a slide toggle. */\nexport function withSwitch(): TableBroMatSkinFeature {\n return {elements: {'bro-mat-slide-toggle': BroMaterialSlideToggleComponent}};\n}\n\n/** The menu of the toolbar: a button of toolbarMain.buttons with the mode navbar-dropdown. */\nexport function withToolbarMenu(): TableBroMatSkinFeature {\n return {elements: {'bro-mat-toolbar-more': BroMaterialToolbarMoreComponent}};\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@table-bro/angular-material",
3
- "version": "1.1.0",
3
+ "version": "1.2.0",
4
4
  "description": "Pixel-perfect Material data tables for Angular, and more. A Web Components table engine on top of existing UI components.",
5
5
  "keywords": [
6
6
  "angular",
@@ -10,7 +10,22 @@
10
10
  "table",
11
11
  "data-table",
12
12
  "datatable",
13
- "data-grid"
13
+ "data-grid",
14
+ "mcp",
15
+ "ai-coding-agents",
16
+ "vibe-coding",
17
+ "claude-code",
18
+ "cursor",
19
+ "codex",
20
+ "github-copilot",
21
+ "windsurf",
22
+ "gemini-cli",
23
+ "grok",
24
+ "cline",
25
+ "zed",
26
+ "jetbrains-ai",
27
+ "angular-material-table",
28
+ "material-design-3"
14
29
  ],
15
30
  "author": "table-bro",
16
31
  "homepage": "https://table-bro.com",
@@ -36,12 +51,13 @@
36
51
  },
37
52
  "sideEffects": false,
38
53
  "peerDependencies": {
54
+ "@angular/cdk": ">=20 <23",
39
55
  "@angular/common": ">=20 <23",
40
56
  "@angular/core": ">=20 <23",
41
57
  "@angular/elements": ">=20 <23",
42
58
  "@angular/material": ">=20 <23",
43
- "@table-bro/core": "^1.1.0",
44
- "@table-bro/angular": "^1.1.0"
59
+ "@table-bro/core": "^1.2.0",
60
+ "@table-bro/angular": "^1.2.0"
45
61
  },
46
62
  "dependencies": {
47
63
  "tslib": "^2.3.0"
@@ -0,0 +1,14 @@
1
+ // Hides an element from the eye, not from screen readers. The one rule of the core and the skins: the class
2
+ // bro-visually-hidden of the core and the hidden items of a component cell of the skins (mixin bro-cell-items) take it
3
+ @mixin bro-visually-hidden() {
4
+ position: absolute;
5
+
6
+ overflow: hidden;
7
+
8
+ width: 1px;
9
+ height: 1px;
10
+
11
+ white-space: nowrap;
12
+
13
+ clip-path: inset(50%);
14
+ }
@@ -1,4 +1,5 @@
1
1
  @use "../variables" as *;
2
+ @use "../../../mixins/visually-hidden" as *;
2
3
 
3
4
  // The same mixin is in components/material-based/_table.scss of the core: the core and the skins are separate packages,
4
5
  // which share no Sass module but the maps of the selectors
@@ -58,16 +59,7 @@
58
59
 
59
60
  // An item that does not fit the line: hidden from the eye, not from screen readers (fitCellItems)
60
61
  > .bro-cell-item-hidden {
61
- position: absolute;
62
-
63
- overflow: hidden;
64
-
65
- width: 1px;
66
- height: 1px;
67
-
68
- white-space: nowrap;
69
-
70
- clip-path: inset(50%);
62
+ @include bro-visually-hidden;
71
63
  }
72
64
  }
73
65
  }
@@ -72,3 +72,9 @@
72
72
  :where(#{$bro-skin}) {
73
73
  @include bro-skin-custom-properties();
74
74
  }
75
+
76
+ /* A prerendered table (data-bro-prerender of prerenderTableBro) takes them in the critical CSS of its page too, as
77
+ Beasties writes it: it drops a selector of :where() alone, which nothing is left of without the pseudo-class */
78
+ table-bro:where([data-bro-prerender]#{$bro-skin}) {
79
+ @include bro-skin-custom-properties();
80
+ }
@@ -205,6 +205,16 @@ export declare class BroMaterialSortHeaderComponent {
205
205
  };
206
206
  }, {}, never, ["*"], true, never>;
207
207
  }
208
+ /**
209
+ * The texts of the tags of the skin mat, which withTags({texts}) sets and the application changes at any time, as when
210
+ * the language of the page changes: the chips in the DOM take them at once.
211
+ */
212
+ export declare class TableBroMatTagsTexts {
213
+ /** The text of a cell of tags without items; without it the tags take the deprecated texts.noItems of the table, or No data. */
214
+ readonly empty: import("@angular/core").WritableSignal<string | undefined>;
215
+ static ɵfac: i0.ɵɵFactoryDeclaration<TableBroMatTagsTexts, never>;
216
+ static ɵprov: i0.ɵɵInjectableDeclaration<any>;
217
+ }
208
218
  /** The tags of a cell: the items of the field of the column, as the chips of Material. */
209
219
  export declare class BroMaterialTagsComponent {
210
220
  readonly col: import("@angular/core").InputSignal<BroCol<BroRow> | undefined>;
@@ -214,6 +224,7 @@ export declare class BroMaterialTagsComponent {
214
224
  /** The items of the field of the column in the row. */
215
225
  readonly chipList: import("@angular/core").Signal<string[]>;
216
226
  private readonly elementRef;
227
+ private readonly texts;
217
228
  /** Stops fitting the chips into the line when the component goes. */
218
229
  private readonly fitting;
219
230
  constructor();
@@ -307,11 +318,17 @@ export declare class TableBroFilterDrawerContainerNg<MODEL extends object> imple
307
318
  protected dark: import("@angular/core").WritableSignal<boolean>;
308
319
  /** The host of the table has the class of its own light theme: the container stays light under a dark ancestor too. */
309
320
  protected light: import("@angular/core").WritableSignal<boolean>;
321
+ private focusMonitor;
310
322
  private host;
323
+ private inputModality;
311
324
  private container;
312
325
  private content;
313
326
  private drawer;
314
327
  private drawerElement;
328
+ /** The last click in the component: while the page dispatches it, the control that it reached sends its action. */
329
+ private lastClick;
330
+ /** The button that opened the drawer, as the Filters button of the table: the focus goes back to it. */
331
+ private opener;
315
332
  constructor();
316
333
  toggle(): void;
317
334
  /** The Filters button of the table toolbar opens the drawer; every action goes on to the page. */
@@ -321,6 +338,20 @@ export declare class TableBroFilterDrawerContainerNg<MODEL extends object> imple
321
338
  * of the drawer, a frame later, so the space between the table and the card would change while they move.
322
339
  */
323
340
  protected setOpened(opened: boolean): void;
341
+ /**
342
+ * A click on the scrim of the mode over: Material closes the drawer right after it tells it, and gives the focus to the
343
+ * element that had it before the drawer opened, in Safari the page; then the focus goes back to the button.
344
+ */
345
+ protected onBackdropClick(): void;
346
+ /**
347
+ * The focus in the closing drawer goes back to the button that opened it, as from the drawer of the core: Material keeps
348
+ * it in the drawer of the side mode. A click that closes the drawer gives back also the focus that Safari, which focuses
349
+ * no button by a click, lost to the page; a later start of the closing leaves it to the page, which may have moved it
350
+ * since. The Filters button that opens the drawer takes the focus from the page the same way. The focus comes by
351
+ * the last input, as Material restores it: the button shows no focus after the pointer.
352
+ * @param fromPage - the focus on the page, not in an element, goes back too
353
+ */
354
+ protected restoreFocus(fromPage: boolean): void;
324
355
  /**
325
356
  * Moves the opened drawer over the table when the table would get narrower than its minimum width next to it, and
326
357
  * back next to it when it fits again: the table takes its new width at once, and the scrim of Material comes or goes
@@ -467,6 +498,8 @@ export declare class BroMaterialToolbarMoreComponent {
467
498
  export interface TableBroMatSkinFeature {
468
499
  /** The tag of the element and its component. */
469
500
  readonly elements: Record<string, Type<unknown>>;
501
+ /** Sets up the element when the application starts, in the injection context of the application. */
502
+ readonly init?: () => void;
470
503
  }
471
504
  /**
472
505
  * Connects the skin mat: registers its config and defines its elements when the application starts. A feature adds
@@ -474,8 +507,16 @@ export interface TableBroMatSkinFeature {
474
507
  * @param features - the optional elements: withTags(), withSwitch(), withToolbarMenu()
475
508
  */
476
509
  export declare function provideTableBroMatSkin(...features: TableBroMatSkinFeature[]): EnvironmentProviders;
477
- /** The element bro-mat-tags: the items of a column as the chips of Material. */
478
- export declare function withTags(): TableBroMatSkinFeature;
510
+ /**
511
+ * The element bro-mat-tags: the items of a column as the chips of Material.
512
+ * @param options - the texts of the tags, as {texts: {empty: 'No tags'}}; TableBroMatTagsTexts changes them later
513
+ * @param options.texts - the texts of the tags
514
+ */
515
+ export declare function withTags(options?: {
516
+ texts?: {
517
+ empty?: string;
518
+ };
519
+ }): TableBroMatSkinFeature;
479
520
  /** The element bro-mat-slide-toggle: a boolean of a column as a slide toggle. */
480
521
  export declare function withSwitch(): TableBroMatSkinFeature;
481
522
  /** The menu of the toolbar: a button of toolbarMain.buttons with the mode navbar-dropdown. */