@table-bro/angular-material 0.0.0-stage → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +174 -2
- package/THIRD_PARTY_NOTICES.md +69 -0
- package/dist/table-bro.material.min.css +1 -0
- package/fesm2022/table-bro-angular-material.mjs +2050 -0
- package/fesm2022/table-bro-angular-material.mjs.map +1 -0
- package/package.json +49 -3
- package/styles/_table-bro.api.scss +3 -0
- package/styles/_table-bro.material.api.scss +5 -0
- package/styles/mixins/_text-ellipsis.scss +5 -0
- package/styles/skin/angular-material/_themes.scss +29 -0
- package/styles/skin/angular-material/_variables.scss +81 -0
- package/styles/skin/angular-material/components/_shadows.scss +7 -0
- package/styles/skin/angular-material/table-bro/_filter-drawer.scss +111 -0
- package/styles/skin/angular-material/table-bro/_paginator.scss +12 -0
- package/styles/skin/angular-material/table-bro/_progress-bar.scss +7 -0
- package/styles/skin/angular-material/table-bro/_slide-toggle.scss +5 -0
- package/styles/skin/angular-material/table-bro/_sort-header.scss +12 -0
- package/styles/skin/angular-material/table-bro/_table.scss +68 -0
- package/styles/skin/angular-material/table-bro/_text-ellipsis.scss +8 -0
- package/styles/skin/angular-material/table-bro/_toolbar-search.scss +27 -0
- package/styles/skin/angular-material/table-bro/_toolbar.scss +14 -0
- package/styles/skin/shared/_variables.scss +94 -0
- package/styles/skin/shared/mixins/_custom-properties.scss +39 -0
- package/styles/skin/shared/mixins/_progress-bar.scss +27 -0
- package/styles/skin/shared/mixins/_shared.scss +87 -0
- package/styles/skin/shared/mixins/_skin-colors.scss +64 -0
- package/styles/skin/shared/mixins/_slide-toggle.scss +5 -0
- package/styles/skin/shared/mixins/_sort-header.scss +11 -0
- package/styles/skin/shared/mixins/_toolbar.scss +61 -0
- package/styles/skin/shared/table-bro/_details.scss +11 -0
- package/styles/skin/shared/table-bro/_filter-drawer.scss +62 -0
- package/styles/skin/shared/table-bro/_shadows.scss +19 -0
- package/styles/skin/shared/table-bro/_state.scss +38 -0
- package/styles/skin/shared/table-bro/_table.scss +70 -0
- package/styles/skin/shared/table-bro/_text-ellipsis.scss +14 -0
- package/styles/table-bro.material.scss +74 -0
- package/types/table-bro-angular-material.d.ts +482 -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 {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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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,52 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@table-bro/angular-material",
|
|
3
|
-
"version": "
|
|
4
|
-
"
|
|
5
|
-
"
|
|
3
|
+
"version": "1.1.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
|
+
],
|
|
15
|
+
"author": "table-bro",
|
|
16
|
+
"homepage": "https://table-bro.com",
|
|
17
|
+
"repository": {
|
|
18
|
+
"type": "git",
|
|
19
|
+
"url": "git+https://github.com/table-bro/table-bro.git",
|
|
20
|
+
"directory": "packages/skins/angular-material"
|
|
21
|
+
},
|
|
22
|
+
"bugs": {
|
|
23
|
+
"url": "https://github.com/table-bro/table-bro/issues"
|
|
24
|
+
},
|
|
25
|
+
"license": "MIT",
|
|
26
|
+
"exports": {
|
|
27
|
+
"./dist/*.css": "./dist/*.css",
|
|
28
|
+
"./styles/*": "./styles/*",
|
|
29
|
+
"./package.json": {
|
|
30
|
+
"default": "./package.json"
|
|
31
|
+
},
|
|
32
|
+
".": {
|
|
33
|
+
"types": "./types/table-bro-angular-material.d.ts",
|
|
34
|
+
"default": "./fesm2022/table-bro-angular-material.mjs"
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
"sideEffects": false,
|
|
38
|
+
"peerDependencies": {
|
|
39
|
+
"@angular/common": ">=20 <23",
|
|
40
|
+
"@angular/core": ">=20 <23",
|
|
41
|
+
"@angular/elements": ">=20 <23",
|
|
42
|
+
"@angular/material": ">=20 <23",
|
|
43
|
+
"@table-bro/core": "^1.1.0",
|
|
44
|
+
"@table-bro/angular": "^1.1.0"
|
|
45
|
+
},
|
|
46
|
+
"dependencies": {
|
|
47
|
+
"tslib": "^2.3.0"
|
|
48
|
+
},
|
|
49
|
+
"module": "fesm2022/table-bro-angular-material.mjs",
|
|
50
|
+
"typings": "types/table-bro-angular-material.d.ts",
|
|
51
|
+
"type": "module"
|
|
6
52
|
}
|
|
@@ -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,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,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,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
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
@use "../variables" as *;
|
|
2
|
+
@use "shared-selector-map" as *;
|
|
3
|
+
|
|
4
|
+
@mixin styles {
|
|
5
|
+
// The buttons and the field of the search lie in the toolbar itself, so it lays them out in a row as Material does,
|
|
6
|
+
// and the field takes the width between the buttons
|
|
7
|
+
#{$bro-table-toolbar_container} #{$mat-toolbar-selector}.bro-toolbar-search {
|
|
8
|
+
display: flex;
|
|
9
|
+
|
|
10
|
+
align-items: center;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
// The field has the title text of the toolbar, of the theme of the application
|
|
14
|
+
#{$mat-toolbar-selector} #{$bro-toolbar_content-search} {
|
|
15
|
+
line-height: inherit;
|
|
16
|
+
|
|
17
|
+
input {
|
|
18
|
+
font-weight: inherit;
|
|
19
|
+
font-size: inherit;
|
|
20
|
+
line-height: inherit;
|
|
21
|
+
|
|
22
|
+
&::placeholder {
|
|
23
|
+
color: $mat-text-secondary-color;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
@use "../variables" as *;
|
|
2
|
+
@use "shared-selector-map" as *;
|
|
3
|
+
@use "../../shared/mixins/toolbar" as *;
|
|
4
|
+
|
|
5
|
+
@mixin styles {
|
|
6
|
+
@include skin_toolbar($mat-toolbar-selector);
|
|
7
|
+
|
|
8
|
+
#{$bro-table-toolbar_container} {
|
|
9
|
+
#{$mat-toolbar-selector} {
|
|
10
|
+
border-bottom-width: 1px;
|
|
11
|
+
border-bottom-style: solid;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
}
|