@table-bro/angular-material 0.0.0-stage → 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.
Files changed (39) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +195 -2
  3. package/THIRD_PARTY_NOTICES.md +69 -0
  4. package/dist/table-bro.material.min.css +1 -0
  5. package/fesm2022/table-bro-angular-material.mjs +2142 -0
  6. package/fesm2022/table-bro-angular-material.mjs.map +1 -0
  7. package/package.json +65 -3
  8. package/styles/_table-bro.api.scss +3 -0
  9. package/styles/_table-bro.material.api.scss +5 -0
  10. package/styles/mixins/_text-ellipsis.scss +5 -0
  11. package/styles/mixins/_visually-hidden.scss +14 -0
  12. package/styles/skin/angular-material/_themes.scss +29 -0
  13. package/styles/skin/angular-material/_variables.scss +81 -0
  14. package/styles/skin/angular-material/components/_shadows.scss +7 -0
  15. package/styles/skin/angular-material/table-bro/_filter-drawer.scss +111 -0
  16. package/styles/skin/angular-material/table-bro/_paginator.scss +12 -0
  17. package/styles/skin/angular-material/table-bro/_progress-bar.scss +7 -0
  18. package/styles/skin/angular-material/table-bro/_slide-toggle.scss +5 -0
  19. package/styles/skin/angular-material/table-bro/_sort-header.scss +12 -0
  20. package/styles/skin/angular-material/table-bro/_table.scss +68 -0
  21. package/styles/skin/angular-material/table-bro/_text-ellipsis.scss +8 -0
  22. package/styles/skin/angular-material/table-bro/_toolbar-search.scss +27 -0
  23. package/styles/skin/angular-material/table-bro/_toolbar.scss +14 -0
  24. package/styles/skin/shared/_variables.scss +94 -0
  25. package/styles/skin/shared/mixins/_custom-properties.scss +39 -0
  26. package/styles/skin/shared/mixins/_progress-bar.scss +27 -0
  27. package/styles/skin/shared/mixins/_shared.scss +79 -0
  28. package/styles/skin/shared/mixins/_skin-colors.scss +64 -0
  29. package/styles/skin/shared/mixins/_slide-toggle.scss +5 -0
  30. package/styles/skin/shared/mixins/_sort-header.scss +11 -0
  31. package/styles/skin/shared/mixins/_toolbar.scss +61 -0
  32. package/styles/skin/shared/table-bro/_details.scss +11 -0
  33. package/styles/skin/shared/table-bro/_filter-drawer.scss +62 -0
  34. package/styles/skin/shared/table-bro/_shadows.scss +19 -0
  35. package/styles/skin/shared/table-bro/_state.scss +38 -0
  36. package/styles/skin/shared/table-bro/_table.scss +70 -0
  37. package/styles/skin/shared/table-bro/_text-ellipsis.scss +14 -0
  38. package/styles/table-bro.material.scss +80 -0
  39. package/types/table-bro-angular-material.d.ts +523 -0
@@ -0,0 +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 {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,68 @@
1
1
  {
2
2
  "name": "@table-bro/angular-material",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
3
+ "version": "1.2.0",
4
+ "description": "Pixel-perfect Material data tables for Angular, and more. A Web Components table engine on top of existing UI components.",
5
+ "keywords": [
6
+ "angular",
7
+ "angular-material",
8
+ "material",
9
+ "material-design",
10
+ "table",
11
+ "data-table",
12
+ "datatable",
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"
29
+ ],
30
+ "author": "table-bro",
31
+ "homepage": "https://table-bro.com",
32
+ "repository": {
33
+ "type": "git",
34
+ "url": "git+https://github.com/table-bro/table-bro.git",
35
+ "directory": "packages/skins/angular-material"
36
+ },
37
+ "bugs": {
38
+ "url": "https://github.com/table-bro/table-bro/issues"
39
+ },
40
+ "license": "MIT",
41
+ "exports": {
42
+ "./dist/*.css": "./dist/*.css",
43
+ "./styles/*": "./styles/*",
44
+ "./package.json": {
45
+ "default": "./package.json"
46
+ },
47
+ ".": {
48
+ "types": "./types/table-bro-angular-material.d.ts",
49
+ "default": "./fesm2022/table-bro-angular-material.mjs"
50
+ }
51
+ },
52
+ "sideEffects": false,
53
+ "peerDependencies": {
54
+ "@angular/cdk": ">=20 <23",
55
+ "@angular/common": ">=20 <23",
56
+ "@angular/core": ">=20 <23",
57
+ "@angular/elements": ">=20 <23",
58
+ "@angular/material": ">=20 <23",
59
+ "@table-bro/core": "^1.2.0",
60
+ "@table-bro/angular": "^1.2.0"
61
+ },
62
+ "dependencies": {
63
+ "tslib": "^2.3.0"
64
+ },
65
+ "module": "fesm2022/table-bro-angular-material.mjs",
66
+ "typings": "types/table-bro-angular-material.d.ts",
67
+ "type": "module"
6
68
  }
@@ -0,0 +1,3 @@
1
+ // The SCSS API of the core without its CSS: the mixins for custom table styles, the same for every skin.
2
+ // A stylesheet that needs only them, such as the styles of a page or of a component, uses this module: @use "table-bro.api" as *.
3
+ @forward "./mixins/text-ellipsis" show bro-text-ellipsis-width;
@@ -0,0 +1,5 @@
1
+ // The SCSS API of the Angular Material skin without its CSS: the variables of the skin and the mixins of table-bro.api.
2
+ // A stylesheet that needs only them, such as the styles of a component, uses this module instead of table-bro.material,
3
+ // whose @use prints the CSS of the skin. It takes the same configuration: @use "table-bro.material.api" with (...).
4
+ @forward "./skin/angular-material/variables";
5
+ @forward "./table-bro.api";
@@ -0,0 +1,5 @@
1
+ @mixin bro-text-ellipsis-width($column-classname, $width) {
2
+ #{$column-classname} .bro-cell_component {
3
+ width: $width;
4
+ }
5
+ }
@@ -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
+ }
@@ -0,0 +1,29 @@
1
+ @use "variables" as *;
2
+ @use "../shared/mixins/skin-colors" as *;
3
+
4
+ // The skin takes the theme of the application, as every component of Angular Material does: the components of Material
5
+ // in the table read the tokens of that theme themselves, and the parts of the table read the tokens of mat-table
6
+ #{$bro-skin} {
7
+ @include bro-table-theme(
8
+ '.mat-table',
9
+ $mat-toolbar-selector,
10
+ $mat-bg,
11
+ $mat-border-color,
12
+ $mat-text-color,
13
+ $mat-text-secondary-color
14
+ );
15
+ }
16
+
17
+ // The dark theme is the dark scheme of the theme of the application: its tokens, written with light-dark(), give
18
+ // the dark colors under color-scheme: dark. The class is on the table host or on an ancestor of it
19
+ .bro-dark-theme {
20
+ #{$bro-skin},
21
+ &#{$bro-skin} {
22
+ color-scheme: dark;
23
+ }
24
+ }
25
+
26
+ // A table with its own light theme, the class bro-light-theme, takes the light scheme in a dark page too
27
+ #{$bro-skin}.bro-light-theme {
28
+ color-scheme: light;
29
+ }
@@ -0,0 +1,81 @@
1
+ $mat-paginator-selector: '.mat-mdc-paginator' !default;
2
+ $mat-progress-bar-selector: '.mat-mdc-progress-bar' !default;
3
+ $mat-toolbar-selector: '.mat-toolbar' !default;
4
+
5
+ // The originals of Material Design under their names: the skin takes them as the defaults of its $bro-* variables, which
6
+ // an application configures as in the other skins
7
+ $mat-table-header: 56px;
8
+ $mat-table-row: 52px;
9
+ $row-horizontal-padding: 24px;
10
+
11
+ $mat-elevation-z16-shadow-size: 42px;
12
+ $mat-elevation-z8-shadow-size: 14px;
13
+ $mat-elevation-z4-shadow-size: 10px;
14
+ $mat-table-shadow-size: $mat-elevation-z16-shadow-size;
15
+
16
+ $mat-toolbar-height: 64px;
17
+ $mat-paginator-height: 56px;
18
+
19
+ $mat-corner-radius: 12px; // the corner-medium of Material 3, as its cards
20
+ $mat-filter-drawer-corner-radius: 16px; // the corner-large of Material 3, as its side sheets
21
+
22
+ // The colors of the parts of the table: the tokens of mat-table, else the system tokens of the theme of the application,
23
+ // as mat-table reads them
24
+ $mat-bg: var(--mat-table-background-color, var(--mat-sys-surface)) !default;
25
+ $mat-border-color: var(--mat-table-row-item-outline-color, var(--mat-sys-outline)) !default;
26
+ $mat-text-color: var(--mat-table-row-item-label-text-color, var(--mat-sys-on-surface)) !default;
27
+ $mat-text-secondary-color: var(--mat-sys-on-surface-variant) !default;
28
+
29
+
30
+ // The values of the Angular Material skin for the variables every skin has (skin/shared/_variables.scss)
31
+ @forward "../shared/variables" with (
32
+ $bro-skin: '.mat',
33
+
34
+ $bro-table-width: 100% !default, // or px-value, or 100%;
35
+
36
+ $bro-table-header-height: $mat-table-header !default,
37
+ $bro-table-row-height: $mat-table-row !default,
38
+ $bro-row-horizontal-padding: $row-horizontal-padding !default,
39
+
40
+ $bro-table-shadow-size: $mat-table-shadow-size !default,
41
+
42
+ $bro-toolbar-height: $mat-toolbar-height !default,
43
+ $bro-paginator-height: $mat-paginator-height !default,
44
+ $bro-table-min-width: 541px !default,
45
+
46
+ $bro-corner-radius: $mat-corner-radius !default,
47
+
48
+ $bro-filter-drawer-width: 320px !default,
49
+ $bro-filter-drawer-corner-radius: $mat-filter-drawer-corner-radius !default,
50
+
51
+
52
+ $bro-global-progress: 3px !default,
53
+ $bro-details-progress: 2px !default,
54
+
55
+
56
+ // Layers
57
+ $bro-table-container-z-index: 2 !default,
58
+ $bro-shadow-z-index: -1 !default,
59
+
60
+
61
+ // Read by the table script (skin/shared/mixins/_custom-properties.scss)
62
+ $bro-refresh-overlay-opacity: .5 !default,
63
+ $bro-refresh-overlay-opacity-dark: .5 !default,
64
+ $bro-column-width-duration: 500ms !default, // read by the CSS alone
65
+ $bro-details-duration: 350ms !default,
66
+ $bro-details-easing: cubic-bezier(.37, 0, .63, 1) !default, // the curve of easeInOutSine
67
+ $bro-filter-drawer-duration: 400ms !default,
68
+ $bro-kinetic-time-constant: 280ms !default, // the time constant of the exponential decay, not its duration
69
+ $bro-state-icon-duration: 500ms !default,
70
+ $bro-state-message-duration: 750ms !default,
71
+
72
+
73
+ // State
74
+ $bro-state-icon-size: 40px !default,
75
+ $bro-state-icon-margin-right: 16px !default,
76
+ $bro-state-message-font-size: 28px !default,
77
+
78
+
79
+ // Table cells
80
+ $bro-cell-number-width: 45.5px !default
81
+ );
@@ -0,0 +1,7 @@
1
+ @use '@angular/material' as mat;
2
+
3
+ @mixin styles {
4
+ .mat-elevation-z16 {
5
+ @include mat.elevation(16);
6
+ }
7
+ }
@@ -0,0 +1,111 @@
1
+ @use "../variables" as *;
2
+
3
+ // The filter drawer of the mat skin: the container carries the class of the skin, as the drawer of the core does, so
4
+ // the drawer reads the custom properties of the skin and of the container. The drawer is transparent and holds a card that looks like the table: the background and the shadow of the skin,
5
+ // one island space after the visible table. The space belongs to the drawer, so Material narrows the content by it
6
+ // too
7
+ @mixin styles {
8
+ @at-root table-bro-filter-drawer-container-ng#{&} .mat-drawer {
9
+ --mat-sidenav-container-background-color: transparent;
10
+
11
+ // The host of a table ends two shadow sizes below the visible table
12
+ bottom: calc(var(--bro-shadow-size) * 2);
13
+
14
+ // The shadow of the card lies outside of the drawer
15
+ overflow: visible;
16
+
17
+ width: calc(var(--bro-filter-drawer-width) + var(--bro-island-space-size));
18
+ padding-left: var(--bro-island-space-size);
19
+
20
+ .mat-drawer-inner-container {
21
+ overflow: visible;
22
+ }
23
+
24
+ // A closed drawer keeps the card laid out, hidden by its visibility, so the card opens from the width of 0
25
+ // stylelint-disable-next-line selector-not-notation -- one :not() per class keeps the specificity above the rule of Material
26
+ &:not(.mat-drawer-opened):not(.mat-drawer-animating) .mat-drawer-inner-container {
27
+ display: block;
28
+ }
29
+ }
30
+
31
+ // The drawer stands in its place: a closed one has an identity transform instead of the shift of Material, so
32
+ // the transition of Material moves nothing, but it still gives Material its events to narrow the content. The opened
33
+ // one keeps the transform none of Material: the change between the two runs the transition, and its end lets Material
34
+ // finish the animation, which otherwise keeps the closed drawer visible over the table
35
+ @at-root table-bro-filter-drawer-container-ng#{&} .mat-drawer.mat-drawer-end {
36
+ border-left: 0;
37
+ }
38
+
39
+ @at-root table-bro-filter-drawer-container-ng#{&} .mat-drawer.mat-drawer-end:not(.mat-drawer-opened) {
40
+ transform: translate3d(0, 0, 0);
41
+ }
42
+
43
+ // With shadows the table lets them into its margins and ends at the edge of the container, as the card does.
44
+ // Without shadows the table leaves room for them around it: the card ends where the visible table ends
45
+ @at-root table-bro-filter-drawer-container-ng#{&} .mat-drawer.mat-drawer-end.bro-filter-drawer_no-shadow {
46
+ right: var(--bro-shadow-size);
47
+ }
48
+
49
+ // The card grows from its right edge, so the edge and the shadow never move. Its children keep their width from
50
+ // its left edge and slide in with it, as in the drawer of the core. The size comes from the layout alone:
51
+ // a transform of the compositor next to a width of the main thread would shake the edge.
52
+ // The content narrows by the opened part of the drawer with the space, so the card takes this part without
53
+ // the space: its left edge follows the table at the same space. Below 0, the card is empty
54
+ $opened-width: max(0px, calc(var(--bro-filter-drawer-opened) * 100% - (1 - var(--bro-filter-drawer-opened)) * var(--bro-island-space-size)));
55
+
56
+ @at-root table-bro-filter-drawer-container-ng#{&} .mat-drawer .bro-filter-drawer-card {
57
+ --bro-filter-drawer-opened: 0;
58
+ overflow: hidden auto;
59
+
60
+ box-sizing: border-box;
61
+ width: $opened-width;
62
+ height: 100%;
63
+ margin-left: calc(100% - #{$opened-width});
64
+
65
+ // The corners of the drawer: the overflow clips the header and the filters to them
66
+ border-radius: var(--bro-filter-drawer-corner-radius);
67
+
68
+ > * {
69
+ box-sizing: border-box;
70
+ width: var(--bro-filter-drawer-width);
71
+ }
72
+ }
73
+
74
+ // In the mode over the drawer lies at the right edge of the table and takes the corners of the table there, which
75
+ // would show around its own
76
+ @at-root table-bro-filter-drawer-container-ng#{&} .mat-drawer.mat-drawer-over .bro-filter-drawer-card {
77
+ border-top-right-radius: var(--bro-corner-radius);
78
+ border-bottom-right-radius: var(--bro-corner-radius);
79
+ }
80
+
81
+ // The page shows through the container of the drawer, as through the drawer itself
82
+ @at-root table-bro-filter-drawer-container-ng .mat-drawer-container {
83
+ --mat-sidenav-content-background-color: transparent;
84
+ }
85
+
86
+ // The scrim of Material over the table of the drawer in the mode over, with the corners of the table: the host of
87
+ // the table ends two shadow sizes below the visible table, and without shadows the table leaves room for them at its sides
88
+ @at-root table-bro-filter-drawer-container-ng .mat-drawer-backdrop {
89
+ bottom: calc(var(--bro-shadow-size) * 2);
90
+
91
+ border-radius: var(--bro-corner-radius);
92
+ }
93
+
94
+ @at-root table-bro-filter-drawer-container-ng .bro-filter-drawer_no-shadow > .mat-drawer-backdrop {
95
+ right: var(--bro-shadow-size);
96
+ left: var(--bro-shadow-size);
97
+ }
98
+
99
+ // The component moves it with the drawer (table-bro-filter-drawer-container-ng.ts)
100
+ @at-root table-bro-filter-drawer-container-ng#{&} .mat-drawer-opened .bro-filter-drawer-card {
101
+ --bro-filter-drawer-opened: 1;
102
+ }
103
+
104
+ // The toolbar of the header has the bottom border of the toolbar of the table
105
+ .bro-filter-drawer-header {
106
+ #{$mat-toolbar-selector} {
107
+ border-bottom-width: 1px;
108
+ border-bottom-style: solid;
109
+ }
110
+ }
111
+ }
@@ -0,0 +1,12 @@
1
+ @use "../variables" as *;
2
+ @use "shared-selector-map" as *;
3
+ @use "../../shared/mixins/toolbar" as *;
4
+
5
+ @mixin styles {
6
+ @include skin_paginator($mat-paginator-selector);
7
+
8
+ // The paginator has the background of the rows; the dark theme gives it the dark one too
9
+ #{$bro-paginator-container} #{$mat-paginator-selector} {
10
+ background-color: $mat-bg;
11
+ }
12
+ }
@@ -0,0 +1,7 @@
1
+ @use "../variables" as *;
2
+ @use "../../shared/mixins/progress-bar" as *;
3
+
4
+ @mixin styles {
5
+ @include table-header-progress-bar($mat-progress-bar-selector);
6
+ @include table-aux-progress-bar($mat-progress-bar-selector);
7
+ }
@@ -0,0 +1,5 @@
1
+ @use "../../shared/mixins/slide-toggle" as *;
2
+
3
+ @mixin styles {
4
+ @include slide-toggle('bro-mat-slide-toggle.bro-cell_component');
5
+ }
@@ -0,0 +1,12 @@
1
+ @use "../../shared/mixins/shared" as *;
2
+ @use "../../shared/mixins/sort-header" as *;
3
+
4
+ @mixin styles {
5
+ @at-root table-bro#{&} {
6
+ .mat-sort-header-content {
7
+ @include sort-header-content();
8
+
9
+ @include table-width-transition();
10
+ }
11
+ }
12
+ }
@@ -0,0 +1,68 @@
1
+ @use "../variables" as *;
2
+
3
+ @mixin styles {
4
+ table.mat-table {
5
+ border-spacing: 0;
6
+ }
7
+
8
+ tr.mat-header-row {
9
+ height: var(--bro-header-height);
10
+ }
11
+
12
+ tr.mat-row, tr.mat-footer-row {
13
+ height: var(--bro-row-height);
14
+ }
15
+
16
+ th.mat-header-cell, td.mat-cell, td.mat-footer-cell {
17
+ padding: 0;
18
+
19
+ border-color: $mat-border-color;
20
+ border-bottom-width: 1px;
21
+ border-bottom-style: solid;
22
+
23
+ // The text of the theme, as in mat-table: the body text in the cells, the title text in the header below
24
+ font-weight: var(--mat-table-row-item-label-text-weight, var(--mat-sys-body-medium-weight));
25
+ font-size: var(--mat-table-row-item-label-text-size, var(--mat-sys-body-medium-size));
26
+ line-height: var(--mat-table-row-item-label-text-line-height, var(--mat-sys-body-medium-line-height));
27
+ font-family: var(--mat-table-row-item-label-text-font, var(--mat-sys-body-medium-font));
28
+ letter-spacing: var(--mat-table-row-item-label-text-tracking, var(--mat-sys-body-medium-tracking));
29
+
30
+ color: $mat-text-color;
31
+
32
+ // Note: we use `first-of-type`/`last-of-type` here in order to prevent extra
33
+ // elements like ripples or badges from throwing off the layout (see #11165).
34
+ &:first-of-type {
35
+ padding-left: $bro-row-horizontal-padding;
36
+
37
+ [dir='rtl'] &:not(:only-of-type) {
38
+ padding-right: $bro-row-horizontal-padding;
39
+ padding-left: 0;
40
+ }
41
+ }
42
+
43
+ &:last-of-type {
44
+ padding-right: $bro-row-horizontal-padding;
45
+
46
+ [dir='rtl'] &:not(:only-of-type) {
47
+ padding-right: 0;
48
+ padding-left: $bro-row-horizontal-padding;
49
+ }
50
+ }
51
+ }
52
+
53
+ th.mat-header-cell {
54
+ font-weight: var(--mat-table-header-headline-weight, var(--mat-sys-title-small-weight));
55
+ font-size: var(--mat-table-header-headline-size, var(--mat-sys-title-small-size));
56
+ line-height: var(--mat-table-header-headline-line-height, var(--mat-sys-title-small-line-height));
57
+ font-family: var(--mat-table-header-headline-font, var(--mat-sys-title-small-font));
58
+ letter-spacing: var(--mat-table-header-headline-tracking, var(--mat-sys-title-small-tracking));
59
+
60
+ text-align: left;
61
+
62
+ color: var(--mat-table-header-headline-color, var(--mat-sys-on-surface));
63
+
64
+ [dir='rtl'] & {
65
+ text-align: right;
66
+ }
67
+ }
68
+ }
@@ -0,0 +1,8 @@
1
+ @mixin styles {
2
+ // The ellipsis after the chips that show takes the color of their text, in the light and the dark theme
3
+ bro-mat-tags .mdc-evolution-chip-set__chips > .bro-cell-items-ellipsis {
4
+ margin-left: 4px;
5
+
6
+ color: var(--mat-chip-label-text-color, var(--mat-sys-on-surface-variant));
7
+ }
8
+ }